Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Fixed
- FootnoteId changed to numeric type for correct sorting (WI-2026-02-27-001)
[0.1.0] - 2026-02-23
Added
- Draft RFC defining create-vs-update decision and idempotency semantics (WI-2026-02-11-014)
- Specify conflict/retry behavior and status persistence requirements for republish (WI-2026-02-11-014)
- CopyPasteAdapter with CopyFormat enum and KNOWN_PROFILES table (WI-2026-02-11-021)
- 10 initial platform profiles (5 StyledHtml + 5 Markdown) (WI-2026-02-11-021)
- type=manual custom platform support in registry (WI-2026-02-11-021)
- profiles.toml with all 10 built-in copy-paste profiles (WI-2026-02-11-022)
- build.rs generates BUILTIN_PROFILES static array from profiles.toml (WI-2026-02-11-022)
- Add commented # enabled = false example in config.template.toml (WI-2026-02-11-023)
- 14 new copypaste profiles (5 html + 9 markdown) (WI-2026-02-12-002)
- HashNode adapter module with GraphQL API integration (WI-2026-02-12-003)
- HashNode registered in AdapterRegistry with capability entry (WI-2026-02-12-003)
- StorageConfig accessible via PublishContext per RFC-0004:C-STORAGE-CONFIG (WI-2026-02-12-005)
- materialize_payload uploads External assets to S3 per RFC-0004:C-PIPELINE-INTEGRATION (WI-2026-02-12-005)
- Asset references replaced with remote URLs in payload (WI-2026-02-12-005)
- RFC-0002 v0.3.0 defines 9-stage AST-centric pipeline (WI-2026-02-12-006)
- RFC-0004 v0.3.0 updates C-PIPELINE-INTEGRATION for AST modification (WI-2026-02-12-006)
- AdapterPayload carries AST (
Vec<HtmlElement>) not strings (WI-2026-02-12-006) - Materialize stage modifies AST nodes (
ImageMarker→Image) (WI-2026-02-12-006) - Serialize trait method added to PlatformAdapter (WI-2026-02-12-006)
- Shared resolve_asset_urls() modifies AST in Materialize (WI-2026-02-12-007)
- Hashnode/Devto implement serialize_payload (AST→Markdown) (WI-2026-02-12-007)
- WordPress implements serialize_payload (AST→HTML) (WI-2026-02-12-007)
- Notion implements serialize_payload (AST→blocks) (WI-2026-02-12-007)
- Confluence implements serialize_payload (AST→storage format) (WI-2026-02-12-007)
- Attrs type alias and attrs field on all HtmlElement variants for HTML attribute preservation (WI-2026-02-12-008)
- Helper constructors (paragraph_text, heading_text, etc.) for simplified element creation (WI-2026-02-12-008)
- Add subst crate dependency with toml feature (WI-2026-02-12-013)
- PlatformConfig::get_str() expands ${VAR} syntax (WI-2026-02-12-013)
- StorageConfig fields support ${VAR} expansion (WI-2026-02-12-013)
- Ghost adapter module with client, types, and tests (WI-2026-02-12-015)
- Support Admin API for post CRUD (WI-2026-02-12-015)
- Support tags and internal links (WI-2026-02-12-015)
- publishAs field in GraphQL mutations (WI-2026-02-12-017)
- DraftSupport enum and extend AdapterCapability (WI-2026-02-12-018)
- published field to Config, PlatformConfig, ContentMeta, PostPlatformConfig (WI-2026-02-12-018)
- resolve_published() with 5-level fallback chain (WI-2026-02-12-018)
- data integrity guard for remote_status (WI-2026-02-12-018)
- determine_lifecycle_action() implementing decision table (WI-2026-02-12-018)
- Hashnode adapter lifecycle support with publishDraft mutation (WI-2026-02-12-018)
- Dev.to, Ghost, WordPress, Confluence adapter lifecycle support (WI-2026-02-12-018)
- Refactor status command to use comfy-table tabular view (WI-2026-02-12-020)
- TUI module with ratatui (feature-gated) (WI-2026-02-12-020)
- Post list view with navigation (WI-2026-02-12-020)
- Post detail view with platform statuses (WI-2026-02-12-020)
- Inline HTML preview using html2text (WI-2026-02-12-020)
- Publish action with progress display (WI-2026-02-12-020)
- Watch command auto-opens preview when platform specified (WI-2026-02-12-022)
- Extract SVG elements from Typst HTML output (WI-2026-02-12-026)
- Upload math SVG as Confluence attachments with content-hash naming (WI-2026-02-12-026)
- Replace inline SVG with ac:image references in Confluence format (WI-2026-02-12-026)
- Cache uploaded SVGs in asset_uploads table to avoid duplicates (WI-2026-02-12-026)
- Support inline vs block math styling (WI-2026-02-12-026)
- Notion math formula support via equation blocks (WI-2026-02-12-027)
- Create preview_single_platform function as pipeline assembler (WI-2026-02-12-029)
- Add prepare_preview_elements and build_preview to PlatformAdapter trait (WI-2026-02-12-029)
- Validate assets are within project root (WI-2026-02-12-030)
- 4 new theme CSS files (wechat-green, dark, notion, github) (WI-2026-02-13-001)
- 5-level theme resolution chain (WI-2026-02-13-001)
- default_theme field in profiles.toml (WI-2026-02-13-001)
- Themes embedded at compile time via build.rs with user override support (WI-2026-02-13-001)
- internal_link_target field in ContentMeta, PostPlatformConfig, Config, PlatformConfig (WI-2026-02-13-002)
- resolve_href_for_copypaste and resolve_internal_link_target functions in internal_links.rs (WI-2026-02-13-002)
- get_first_published_url in StatusTracker for alphabetical platform selection (WI-2026-02-13-002)
- Unit tests for copypaste internal link resolution (WI-2026-02-13-002)
- ResolvedConfig struct with all resolvable fields (WI-2026-02-13-003)
- ResolvedConfig::resolve() implements 4-level chain for all fields (WI-2026-02-13-003)
- Unit tests for ResolvedConfig resolution (WI-2026-02-13-003)
- TransformRule enum with enumset for declarative AST transforms (WI-2026-02-13-006)
- SerializeOptions with li_span_wrap flag in serialize.rs (WI-2026-02-13-006)
- CopyPaste adapter supports AssetStrategy::External (WI-2026-02-13-007)
- External assets replaced with storage URLs in output (WI-2026-02-13-007)
- i18n module with Locale enum and t() function (WI-2026-02-13-008)
- Locale detection from LANG/LC_ALL environment variable (WI-2026-02-13-008)
- Chinese and English translations for preview UI strings (WI-2026-02-13-008)
- Sorting module with SortField/SortOrder enums and sort function (WI-2026-02-13-009)
- PostFilter struct with platform/status/tag/title_regex predicates (WI-2026-02-13-009)
- TUI interactive sort with s/S keys (WI-2026-02-13-009)
- Command aliases: ls for list, pub for publish, b for build, w for watch, pre for preview (WI-2026-02-13-009)
- Short flags for list options (-s sort, -p platform, -t tag, -T title, -P published, -u pending) (WI-2026-02-13-009)
- Short flag -d for publish –dry-run (WI-2026-02-13-009)
- long_about and after_help with examples for list and publish commands (WI-2026-02-13-009)
- Main CLI after_help with common workflows (WI-2026-02-13-009)
- Adaptive compact platform display with short codes when table exceeds terminal width (WI-2026-02-13-009)
- Platform short codes for known platforms (gh, wp, nt, etc.) with numbered fallback (p1, p2) for custom (WI-2026-02-13-009)
- Legend printed after table in compact mode (WI-2026-02-13-009)
- Create adapters.toml with 8 API adapters including short_code and local_output fields (WI-2026-02-13-010)
- Add short_code field to all profiles in profiles.toml (WI-2026-02-13-010)
- Update build.rs to generate builtin_adapters.rs from adapters.toml (WI-2026-02-13-010)
- Create docs/guide/platforms/ directory structure (WI-2026-02-13-013)
- Ghost platform guide with API key instructions (WI-2026-02-13-013)
- Dev.to platform guide with API key instructions (WI-2026-02-13-013)
- Notion platform guide with API key instructions (WI-2026-02-13-013)
- WeChat platform guide (Chinese) (WI-2026-02-13-013)
- Zhihu platform guide (Chinese) (WI-2026-02-13-013)
- CSDN platform guide (Chinese) (WI-2026-02-13-013)
- ADR-0001 accepted: dual storage + code_highlight capability (WI-2026-02-13-015)
- code_highlight field in adapters.toml and profiles.toml (WI-2026-02-13-015)
- CodeBlock stores both plain text and highlighted HTML (WI-2026-02-13-015)
- Tests for inline and block math in Markdown (WI-2026-02-13-017)
- Create typub-core subcrate with 6 capability enums and ThemeId newtype (WI-2026-02-13-018)
- Create typub-html subcrate with html_utils modules (WI-2026-02-13-019)
- workspace.package with common metadata (WI-2026-02-13-020)
- MIT LICENSE file (WI-2026-02-13-020)
- release.toml configuration (WI-2026-02-13-020)
- Ghost image upload via /images/upload endpoint (WI-2026-02-13-023)
- Ghost materialize_payload handles Upload strategy (WI-2026-02-13-023)
- default_asset_strategy field to profiles.toml with fallback to embed (WI-2026-02-13-024)
- Wire field through build.rs and BuiltinProfile struct (WI-2026-02-13-024)
- MathRendering::Png variant in typub-core (WI-2026-02-13-026)
- svg_to_png() function using resvg (WI-2026-02-13-026)
- HTML serialization outputs PNG img tags (WI-2026-02-13-026)
- ModelScope profile uses math_rendering=png (WI-2026-02-13-026)
- RFC drafted with normative clauses for AdapterRegistrar API (WI-2026-02-14-003)
- RFC specifies capability registration and lookup order (WI-2026-02-14-003)
- RFC specifies backward compatibility constraints (WI-2026-02-14-003)
- RFC drafted with crate boundary specifications (WI-2026-02-14-004)
- RFC specifies shared adapter types crate (WI-2026-02-14-004)
- RFC specifies migration path from current layout (WI-2026-02-14-004)
- typub-adapters-core crate exists in crates/ (WI-2026-02-14-005)
- typub-config crate exists in crates/ (WI-2026-02-14-005)
- typub-storage crate exists in crates/ (WI-2026-02-14-005)
- PlatformAdapter trait defined in typub-adapters-core (WI-2026-02-14-005)
- AdapterRegistrar implemented per RFC-0006 (WI-2026-02-14-005)
- typub-adapter-ghost crate extracted (WI-2026-02-14-006)
- typub-adapter-notion crate extracted (WI-2026-02-14-006)
- all 9 adapter crates extracted with register() functions (WI-2026-02-14-006)
- feature gates configured per RFC-0007:C-FEATURE-GATES (WI-2026-02-14-006)
- Create typub-log crate with tracing foundation (WI-2026-02-14-009)
- Implement CliLayer for CLI-formatted output (WI-2026-02-14-009)
- Define ProgressReporter trait in typub-log (WI-2026-02-14-009)
- Unit tests and mock tests for Notion adapter core behaviors (WI-2026-02-14-012)
- Unit tests and mock tests for Ghost adapter core behaviors (WI-2026-02-15-001)
- Preview integration coverage maintained for Ghost adapter (WI-2026-02-15-001)
- Add register() function in config.rs per RFC-0006 (WI-2026-02-15-002)
- Unit tests for registration, asset strategy, render config, config validation, trait methods (WI-2026-02-15-002)
- Preview snapshot integration test for WordPress adapter (WI-2026-02-15-002)
- PNG math images upload for Upload/External strategies (WI-2026-02-17-001)
- Confluence adapter uploads PNG math as attachments (WI-2026-02-17-001)
- CopyPaste adapter with External strategy uploads PNG math (WI-2026-02-17-001)
- math_rendering and math_delimiters fields in PlatformConfig (WI-2026-02-17-002)
- supported_math_renderings in AdapterCapability (WI-2026-02-17-002)
- resolve_math_rendering_from_config helper with validation (WI-2026-02-17-002)
- ImageMarker display attribute for inline/block distinction (WI-2026-02-17-002)
- Confluence PNG math support for inline and block (WI-2026-02-17-002)
- InlineFragment::ImageMarker variant (WI-2026-02-17-003)
- Astro adapter outputs Markdown with front-matter (WI-2026-02-17-004)
- New static adapter generates standalone HTML (WI-2026-02-17-004)
- –assets flag added to status command (WI-2026-02-17-005)
- asset uploads displayed in table format when flag is set (WI-2026-02-17-005)
- Add requires_config field to AdapterCapability (WI-2026-02-18-001)
- Update all adapters with requires_config value (WI-2026-02-18-001)
- Modify AdapterRegistry to auto-register platforms without config requirement (WI-2026-02-18-001)
- Add helper methods default_xxx() for slices (WI-2026-02-18-002)
- Strikethrough node type supported in content model (WI-2026-02-18-003)
- Markdown renderer outputs
textfor strikethrough (WI-2026-02-18-003) - ListItem struct with recursive children field for nested list support (WI-2026-02-18-004)
- TaskItem struct with checked field for task list support (WI-2026-02-18-004)
- DefinitionItem struct for definition list (dl/dt/dd) support (WI-2026-02-18-004)
- TableCell struct with colspan, rowspan, and align fields (WI-2026-02-18-004)
- New inline fragments (Underline, Mark, Superscript, Subscript, Kbd, LineBreak) (WI-2026-02-18-004)
- HTML parser handles nested ul/ol within li elements (WI-2026-02-18-004)
- HTML parser handles task lists and definition lists (WI-2026-02-18-004)
- Markdown renderer outputs correct nested list indentation (WI-2026-02-18-004)
- All adapters updated with fallback handling for new types (WI-2026-02-18-004)
- Parse block SVG as Paragraph with Svg fragment (WI-2026-02-19-002)
- Add is_svg_block helper in adapters-core (WI-2026-02-19-002)
- Create TextStyle enum and unify styled variants into InlineFragment::Styled (WI-2026-02-19-004)
- Add convenience constructors (bold, italic, etc.) to InlineFragment (WI-2026-02-19-004)
- Implement –debug-stage CLI option (WI-2026-02-19-005)
- Support all pipeline stages: resolve, render, parse, transform, specialize, provision, materialize, serialize, publish, persist (WI-2026-02-19-005)
- Dry-run mode copies assets to temp dir instead of skipping upload (WI-2026-02-19-006)
InlineFragment::Imagehaslocal_path: Option<PathBuf>field (WI-2026-02-20-001)- resolve_preview_image_paths() function in typub-html/transform.rs (WI-2026-02-20-001)
- dev server serves
/__asset__/*paths for preview images (WI-2026-02-20-001) - Add Details element to HtmlElement enum with summary and children (WI-2026-02-21-001)
- Parse HTML details/summary elements (WI-2026-02-21-001)
- Serialize Details to HTML (WI-2026-02-21-001)
- Render Details in Markdown renderer (WI-2026-02-21-001)
- Define and adopt AST v2 schema with typed attrs plus passthrough (WI-2026-02-21-004)
- Remove ImageMarker/local_path execution semantics from core AST (WI-2026-02-21-004)
- Introduce v2 core IR types in typub-html and make them the single source of truth for conformance serialization (WI-2026-02-21-004)
- Support user-defined Typst preamble with layered resolution (WI-2026-02-22-001)
- Preserve adapter defaults while allowing user preamble override/append behavior (WI-2026-02-22-001)
Changed
- Clarify strict pipeline stage semantics in RFC-0002 (WI-2026-02-11-001)
- Tighten status correctness and reconciliation wording (WI-2026-02-11-001)
- Existing adapters implement stage-4 finalization and stage-5 publish hooks (WI-2026-02-11-002)
- Pipeline execution no longer relies on legacy adapter fallback path (WI-2026-02-11-002)
- Devto and WordPress split stage-4 payload finalization from stage-5 publish calls (WI-2026-02-11-003)
- Notion and Confluence remove monolithic publish wrappers in favor of staged hooks (WI-2026-02-11-003)
- PlatformAdapter trait removes monolithic publish method (WI-2026-02-11-004)
- All adapters publish only via finalize_payload and publish_payload (WI-2026-02-11-004)
- Stage-3 shared transforms execute in pipeline module (WI-2026-02-11-005)
- Devto/WordPress remove duplicate adapter-local internal-link rewrite (WI-2026-02-11-005)
- PublishResult URL is optional and status persistence handles absent URL (WI-2026-02-11-006)
- Notion opts into shared stage-3 link rewrite and removes duplicate adapter-local rewrite (WI-2026-02-11-006)
- Astro finalize_payload performs stage-4 shaping (assets+themed body) (WI-2026-02-11-007)
- WeChat and Xiaohongshu finalize_payload are non-empty and carry publish-ready payload (WI-2026-02-11-007)
- Remove default empty finalize_payload so every adapter must implement stage-4 (WI-2026-02-11-008)
- Adapter capability matrix includes per-gap behavior semantics (warn+degrade vs hard error) (WI-2026-02-11-008)
- CLI taxonomy compatibility warnings derive from capability gap policy (WI-2026-02-11-008)
- Stage-3 runtime enforces internal-link unsupported behavior from capability policy (WI-2026-02-11-009)
- Internal-link detection utility provides machine-checkable target discovery from rendered HTML (WI-2026-02-11-009)
- Remove trait-level process_assets hook and keep stage-4 asset handling inside finalize_payload (WI-2026-02-11-010)
- WordPress taxonomy remote-id shaping is moved into stage-4 finalize payload (WI-2026-02-11-010)
- Remove dead internal-link fallback branches in Notion/Confluence when shared rewrite is enabled (WI-2026-02-11-010)
- RFC-0002 pipeline stages define optional remote asset materialization stage between finalize and publish (WI-2026-02-11-011)
- pipeline implementation comments align stage numbering with updated RFC contract (WI-2026-02-11-011)
- RFC-0002:C-PIPELINE-STAGES lists short names for all seven stages (WI-2026-02-11-012)
- RFC-0002:C-PIPELINE-STAGES uses one-word stage names suitable for code identifiers (WI-2026-02-11-013)
- src/pipeline.rs stage comments use same one-word names as RFC (WI-2026-02-11-013)
- RFC-0003 decision order prioritizes remote-id then deterministic platform key; cached URL is hint-only (WI-2026-02-11-015)
- RFC-0003 mandates duplicate-create rejection as conflict (WI-2026-02-11-015)
- Adapters prefer status remote-id as update target before deterministic lookup fallback (WI-2026-02-11-016)
- Create path runs only after duplicate-safe precheck per adapter (WI-2026-02-11-016)
- Extract RenderedOutput::html() helper to eliminate 12x duplicate error check (WI-2026-02-11-018)
- Extract downcast_payload helper to eliminate 7x duplicate downcast boilerplate (WI-2026-02-11-018)
- Extract Notion create_page_with_blocks helper to eliminate 3x block-split copy-paste (WI-2026-02-11-018)
- Remove Notion elements_to_blocks duplication of Paragraph/ParagraphRich handling (WI-2026-02-11-018)
- Remove dead Confluence elements_to_confluence_html indirection (WI-2026-02-11-018)
- Use shared mime_type_from_path in Notion and Confluence instead of hand-rolled maps (WI-2026-02-11-018)
- Extract CapabilitySupport::gap_behavior method to replace 3x copy-paste (WI-2026-02-11-018)
- Replace module-level allow(dead_code) with targeted annotations (WI-2026-02-11-018)
- add materialize_payload to PlatformAdapter trait with default pass-through (RFC-0002 Stage 5) (WI-2026-02-11-019)
- wire Stage 5 materialize call in pipeline.rs between finalize and publish (WI-2026-02-11-019)
- WordPress finalize_payload no longer makes remote API calls; tag/category resolution and asset upload moved to materialize_payload (C1) (WI-2026-02-11-019)
- WordPress create_post and update_post merged into upsert_post (N3) (WI-2026-02-11-019)
- WordPress auth-check pattern extracted to http_utils::ensure_success_with_auth_hint (N4) (WI-2026-02-11-019)
- Dev.to adds title-based lookup fallback per RFC-0003 (C2) (WI-2026-02-11-019)
- WeChat regex compilation uses LazyLock statics (N5) (WI-2026-02-11-019)
- preview boilerplate extracted to shared helpers (C5) (WI-2026-02-11-019)
- AdapterRegistry only constructs enabled adapters (C6) (WI-2026-02-11-019)
- WordPress slug resolution extracted to helper (L1) (WI-2026-02-11-020)
- Xiaohongshu preview uses write_preview_file (L5) (WI-2026-02-11-020)
- AdapterRegistry error message clarified (L6) (WI-2026-02-11-020)
- WeChat adapter migrated to CopyPasteProfile entry (WI-2026-02-11-021)
- copypaste.rs uses generated code instead of hand-written KNOWN_PROFILES (WI-2026-02-11-022)
- Rename enabled_platforms() to default_platforms() with updated semantics (WI-2026-02-11-023)
- Specialize stages collect metadata only, no string serialization (WI-2026-02-12-007)
- All HtmlElement text-bearing variants use
Vec<InlineFragment>directly (removed plain/Rich split) (WI-2026-02-12-008) - InlineFragment::Link uses fragments Vec instead of text String for nested inline support (WI-2026-02-12-008)
- HTML/Markdown/Notion/Confluence serializers updated for unified variants (WI-2026-02-12-008)
- WordPress adapter split into wordpress/{mod,types,client,tests}.rs (WI-2026-02-12-012)
- Hashnode adapter split into hashnode/{mod,types,client,tests}.rs (WI-2026-02-12-012)
- DevTo adapter split into devto/{mod,types,client,tests}.rs (WI-2026-02-12-012)
- Stage 7/8 adapter payload typing failures fail fast instead of defaulting to empty values (WI-2026-02-12-014)
- Unify InlineSvg and Svg into single Svg type with inline attr (WI-2026-02-12-027)
- Deduplicate HTML parsing logic in html_utils (WI-2026-02-12-027)
- Notion API upgraded to 2025-09-03 (WI-2026-02-12-028)
- Add PipelineMode enum to distinguish preview/publish contexts (WI-2026-02-12-029)
- Extract shared pipeline stages into reusable functions (WI-2026-02-12-029)
- Update all adapters to implement new trait methods (WI-2026-02-12-029)
- Update cmd_preview to use preview_single_platform (WI-2026-02-12-029)
- Rename config.toml to typub.toml in CLI default (WI-2026-02-12-030)
- Update all source references from config.toml to typub.toml (WI-2026-02-12-030)
- Store asset paths as relative to project root in status.db (WI-2026-02-12-030)
- Extract inline CSS from adapters to
_preview-*.cssfiles (WI-2026-02-13-001) - UI/UX refinement of existing themes (WI-2026-02-13-001)
- CopyPaste adapter enables shared link rewrite (supports_shared_link_rewrite -> true) (WI-2026-02-13-002)
- Pipeline uses copypaste-specific resolution for copypaste platforms (WI-2026-02-13-002)
- Config structure flattened - removed [general] section, content_dir/output_dir at root (WI-2026-02-13-002)
- Remove standalone
resolve_*functions, useResolvedConfig(WI-2026-02-13-003) - Pipeline and adapters use ResolvedConfig instead of ad-hoc resolution (WI-2026-02-13-003)
- compat_fn signature takes AST elements instead of HTML string (WI-2026-02-13-006)
- Update all compat functions to operate on HtmlElement (WI-2026-02-13-006)
- copypaste.rs and xiaohongshu.rs use i18n::t() for UI strings (WI-2026-02-13-008)
- list command shows compact table with sort/filter/limit flags (WI-2026-02-13-009)
- status command requires path and shows detailed single-post info (WI-2026-02-13-009)
- crossterm moved to unconditional dependency for terminal width detection (WI-2026-02-13-009)
- Update AdapterCapability and BuiltinProfile structs with short_code (WI-2026-02-13-010)
- platform_short_code() uses generated data instead of hardcoded match (WI-2026-02-13-010)
- is_local_output_platform() uses local_output field from adapters.toml (WI-2026-02-13-010)
- build-book.sh for dynamic SUMMARY.md generation (WI-2026-02-13-013)
- Convert root Cargo.toml to workspace with typub-core as member (WI-2026-02-13-018)
- build.rs uses typed enums from typub-core instead of String fields (WI-2026-02-13-018)
- Main crate re-exports enums from typub-core, preserving existing import paths (WI-2026-02-13-018)
- Replace raw String theme fields with ThemeId newtype (WI-2026-02-13-018)
- Add workspace.dependencies for unified version management (WI-2026-02-13-019)
- All crates use workspace = true for shared dependencies (WI-2026-02-13-019)
- Main crate re-exports typub_html as html_utils for path compatibility (WI-2026-02-13-019)
- internal crates use version in workspace.dependencies (WI-2026-02-13-020)
- all crates inherit workspace metadata (WI-2026-02-13-020)
- Remove copy strategy from devto and wordpress adapters.toml (WI-2026-02-13-023)
- Update CopyPasteAdapter to use per-profile default (WI-2026-02-13-024)
- Ghost adapter reorganized into adapter/config/model modules following Notion exemplar (WI-2026-02-15-001)
- WordPress adapter reorganized into adapter/config/model modules following Notion exemplar (WI-2026-02-15-002)
- Centralize asset strategy resolution in main crate to a single path (WI-2026-02-15-004)
- Eliminate duplicate internal_link_target resolution by routing through ResolvedConfig (WI-2026-02-15-004)
- Use config-based project root for renderer instead of cwd (WI-2026-02-15-005)
- Split pipeline module into stage-focused submodules without behavior changes (WI-2026-02-15-005)
- Eliminate any remaining duplicate resolution logic in main crate (WI-2026-02-15-005)
- Remove pure re-export config module and update imports (WI-2026-02-15-006)
- Remove main-crate re-export-only aliases where unused (WI-2026-02-15-006)
- TUI is enabled by default; typub-tui remains a standalone crate; typub-ui owns i18n (WI-2026-02-15-007)
- Core build pipeline moved into typub-engine crate (WI-2026-02-15-007)
- Update engine/tui/cli usages to new crate/module layout (WI-2026-02-15-008)
- Remove display field from HtmlElement::ImageMarker (WI-2026-02-17-003)
- convert_svg_to_png_markers generates correct marker types (WI-2026-02-17-003)
- Recursive traversal in build_pending_asset_list_from_elements (WI-2026-02-17-003)
- Recursive resolution in resolve_asset_urls (WI-2026-02-17-003)
- Change BuiltinProfile asset_strategy to asset_strategies slice (WI-2026-02-18-002)
- Change BuiltinProfile math_rendering to math_renderings slice (WI-2026-02-18-002)
- Change BuiltinProfile math_delimiters to math_delimiters slice (WI-2026-02-18-002)
- Standalone
parses as Paragraph with single InlineImage (WI-2026-02-19-001)
- Inline SvgInfo fields into InlineFragment::Svg variant (WI-2026-02-19-003)
- Update all pattern matching to use unified Styled variant (WI-2026-02-19-004)
- Update RFC-0008 to reflect unified styling approach (WI-2026-02-19-004)
- convert_svg_to_png_markers uses relative paths instead of absolute (WI-2026-02-20-001)
- preview_single_platform calls resolve_preview_image_paths after Specialize (WI-2026-02-20-001)
- TransformRule renamed to SerializeRule in typub-html (WI-2026-02-21-002)
- transform_rules renamed to serialize_rules in profiles.toml (WI-2026-02-21-002)
- code_highlight derived from format instead of stored as field (WI-2026-02-21-002)
- Pipeline transform/materialize/serialize stages run on v2 IR only with no legacy compatibility adapter layer (WI-2026-02-21-004)
- Parser emits v2 Document directly; legacy HtmlElement/InlineFragment/ImageMarker constructors are removed from parse path (WI-2026-02-21-004)
- typub-adapters-core and all first-party adapters compile and publish from v2 IR types (WI-2026-02-21-004)
Removed
- Unused SVG hash/upload code from Confluence adapter (WI-2026-02-12-027)
- Hashnode Copy strategy code path (not in supported list) (WI-2026-02-13-025)
- Hashnode Embed strategy code path (not in supported list) (WI-2026-02-13-025)
- Remove HtmlElement::Image and HtmlElement::ImageMarker variants (WI-2026-02-19-001)
- Remove HtmlElement::Svg variant (WI-2026-02-19-002)
- HTML file:// URL rewriting code from dev_server (WI-2026-02-20-001)
- Remove legacy AST definitions and fallback conversion utilities after adapter migration completes (WI-2026-02-21-004)
Fixed
- WeChat wechat_compat produces valid HTML for unstyled strong/em tags (WI-2026-02-11-018)
- Notion find_existing_page propagates errors instead of swallowing them (WI-2026-02-11-018)
- Notion and Confluence
_ctxparameter renamed toctxwhere used (N1) (WI-2026-02-11-019) - Notion check_status no longer mutates database schema (N2) (WI-2026-02-11-019)
- Confluence check_status implemented using find_page_by_title (C3) (WI-2026-02-11-019)
- Dev.to rejects asset_strategy=upload at config time (C4) (WI-2026-02-11-019)
- Dev.to publish_payload uses title lookup when no cached ID (M1, RFC-0003) (WI-2026-02-11-020)
- WeChat preview uses extract_preview_body for image rewriting (M2) (WI-2026-02-11-020)
- Xiaohongshu preview logs warning on copy failure (M3) (WI-2026-02-11-020)
- Dev.to find_article_by_title uses api_url helper (L2) (WI-2026-02-11-020)
- http_utils ensure_success_with_auth_hint propagates body read errors (L3) (WI-2026-02-11-020)
- WeChat outdated comment corrected (L4) (WI-2026-02-11-020)
- watch command respects –platform flag and falls back to default platforms (WI-2026-02-11-025)
- watch rebuilds for each target platform, not just astro (WI-2026-02-11-025)
- Confluence materialize rewrites ImageMarker to Image in AST before serialize (WI-2026-02-12-009)
- Notion upload materialize rewrites ImageMarker to Image in AST and blocks serialize reads resolved nodes (WI-2026-02-12-009)
- Confluence and Notion materialize fail fast on asset upload errors and stop before serialize (WI-2026-02-12-009)
- Deferred pending assets are built from AST ImageMarker references for deferred strategies (WI-2026-02-12-009)
- Confluence serialize removes AST-HTML-AST round trip and remains AST-centric (WI-2026-02-12-011)
- Shared adapter helper enforces unresolved ImageMarker guard before deferred serialize (WI-2026-02-12-011)
- Adapter code organization aligns around pure formatter modules and stage-oriented payload flow (WI-2026-02-12-011)
- Hashnode slug lookup propagates non-not-found errors instead of silently creating duplicates (WI-2026-02-12-014)
- Confluence attachment materialization uses server-returned attachment title for rendered references (WI-2026-02-12-014)
- External strategy triggers image_as_marker (WI-2026-02-12-016)
- Local-output platforms show dash instead of pending (WI-2026-02-12-021)
- TUI preview uses selected platform (WI-2026-02-12-021)
- Output directory uses platform ID as subdirectory (WI-2026-02-12-022)
- Math equations render as SVG in HTML output (WI-2026-02-12-023)
- Markdown TeX math renders as SVG in HTML output (WI-2026-02-12-024)
- Confluence republish updates existing attachments (WI-2026-02-12-025)
- StorageConfig correctly merges global and per-platform config (WI-2026-02-13-003)
- Remove .content wrapper from theme CSS and themes.rs (WI-2026-02-13-006)
- WeChat preview output has no unsupported div/section tags (WI-2026-02-13-006)
- Inline math renders inline in wechat preview (WI-2026-02-13-011)
- External asset strategy resolves images correctly for zhihu (WI-2026-02-13-012)
- Copy-paste HTML platforms preserve syntax highlighting (WI-2026-02-13-015)
- LaTeX backslashes not double-escaped in Markdown output (WI-2026-02-13-017)
- packages/math-to-string.typ created during init (WI-2026-02-13-021)
- renderer ensures math-to-string.typ exists before compile (WI-2026-02-13-021)
- Extra blank lines between list items removed (WI-2026-02-13-022)
- Verify zero behavioral change for existing profiles (WI-2026-02-13-024)
- Pipeline uses lifecycle action to determine correct remote_status (WI-2026-02-13-025)
- build_preview default uses pipeline elements (WI-2026-02-14-002)
- preview() method removed from trait (WI-2026-02-14-002)
- src/adapters/{adapter}/ directories removed (WI-2026-02-14-007)
- hardcoded factory array removed from AdapterRegistry::new() (WI-2026-02-14-007)
- Adapter enum uses only External variant (WI-2026-02-14-007)
- typub-storage uses typub-log instead of typub-ui (WI-2026-02-14-009)
- typub-adapters-core no longer re-exports typub-ui (WI-2026-02-14-011)
- All adapters use tracing macros (WI-2026-02-14-011)
- Harmonize asset strategy resolution and error handling across adapters/core (WI-2026-02-15-003)
- Normalize render_config defaults and marker behavior (WI-2026-02-15-003)
- Standardize adapter test scaffolding (new_for_test) (WI-2026-02-15-003)
- Fix Markdown clipboard handling for copypaste adapters (WI-2026-02-17-006)
- Adapters detect single-image paragraph for block-level rendering (WI-2026-02-19-001)
- Change Admonition.fragments to Admonition.children:
Vec<HtmlElement>(WI-2026-02-20-003) - Update parse_admonition to use recursive block parsing (WI-2026-02-20-003)
- Update Notion adapter to render children blocks inside callouts (WI-2026-02-20-003)
- Update HTML/theme adapters for block-level admonition content (WI-2026-02-20-003)
- Update adapters (Notion, Confluence, Ghost) for Details (WI-2026-02-21-001)
- Remove extra
<p>wrapper in Confluence admonition rendering (WI-2026-02-21-003) - Validation enforces heading range 1..=6, math source minimum validity, and resolvable asset references under v2 IR (WI-2026-02-21-004)
- Deterministic serialization test coverage includes passthrough maps and style-set canonical order (WI-2026-02-21-004)