markdown_composer 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +23 -0
  3. data/LICENSE.txt +21 -0
  4. data/README.md +278 -0
  5. data/ROADMAP.md +80 -0
  6. data/docs/_md_composer_architecture.md +50 -0
  7. data/docs/_md_composer_cheatsheet.md +72 -0
  8. data/docs/_md_composer_concepts.md +64 -0
  9. data/docs/_md_composer_dev_guide.md +55 -0
  10. data/docs/_md_composer_getting_started.md +114 -0
  11. data/docs/_md_composer_readme.md +93 -0
  12. data/docs/_md_composer_user_guide.md +65 -0
  13. data/docs/ai/md_composer_ai_audit.md +35 -0
  14. data/docs/ai/md_composer_ai_canonical_docs.md +44 -0
  15. data/docs/ai/md_composer_ai_source_map.md +39 -0
  16. data/docs/compose/md_composer_compose_actions.md +338 -0
  17. data/docs/compose/md_composer_compose_anatomy.md +156 -0
  18. data/docs/compose/md_composer_compose_buffer.md +81 -0
  19. data/docs/compose/md_composer_compose_examples.md +31 -0
  20. data/docs/compose/md_composer_compose_include.md +136 -0
  21. data/docs/compose/md_composer_compose_select.md +198 -0
  22. data/docs/compose/md_composer_compose_sources.md +161 -0
  23. data/docs/compose/md_composer_compose_targets.md +194 -0
  24. data/docs/examples/md_composer_example_basic_compose.md +57 -0
  25. data/docs/examples/md_composer_example_buffer_target_actions.md +83 -0
  26. data/docs/examples/md_composer_example_fixtures.md +62 -0
  27. data/docs/examples/md_composer_example_html_output.md +50 -0
  28. data/docs/examples/md_composer_example_modify.md +77 -0
  29. data/docs/examples/md_composer_example_multi_row_compose.md +67 -0
  30. data/docs/examples/md_composer_example_ruby_plans.md +62 -0
  31. data/docs/examples/md_composer_example_structured_data.md +68 -0
  32. data/docs/examples/md_composer_example_transforms.md +68 -0
  33. data/docs/examples/md_composer_example_yaml_json_rows.md +56 -0
  34. data/docs/examples/md_composer_examples_readme.md +45 -0
  35. data/docs/examples/md_composer_runnable_examples.md +374 -0
  36. data/docs/examples/md_composer_source_ruby_dsl.md +88 -0
  37. data/docs/reference/md_composer_nested.md +170 -0
  38. data/docs/reference/md_composer_reference_api.md +71 -0
  39. data/docs/reference/md_composer_reference_capabilities.md +63 -0
  40. data/docs/reference/md_composer_reference_diagnostics.md +54 -0
  41. data/docs/reference/md_composer_reference_plan_schema.md +75 -0
  42. data/docs/reference/md_composer_reference_registries.md +63 -0
  43. data/docs/reference/md_composer_take.md +221 -0
  44. data/docs/reference/md_composer_unit_tokens.md +228 -0
  45. data/docs/reference/md_composer_where.md +227 -0
  46. data/docs/transform/md_composer_transform_anatomy.md +112 -0
  47. data/docs/transform/md_composer_transform_examples.md +30 -0
  48. data/docs/transform/md_composer_transform_modes.md +83 -0
  49. data/docs/transform/md_composer_transform_options.md +142 -0
  50. data/docs/transform/md_composer_transform_scope.md +97 -0
  51. data/docs/transform/md_composer_transform_transforms.md +99 -0
  52. data/examples/README.md +20 -0
  53. data/examples/advanced_composer.rb +207 -0
  54. data/examples/basic_compose.rb +24 -0
  55. data/examples/complex_composer.rb +235 -0
  56. data/examples/example_support.rb +18 -0
  57. data/examples/fixtures/current.md +179 -0
  58. data/examples/fixtures/faq.md +58 -0
  59. data/examples/fixtures/guide.md +62 -0
  60. data/examples/fixtures/site_intro.md +29 -0
  61. data/examples/fixtures/source.html +22 -0
  62. data/examples/html_input.rb +26 -0
  63. data/examples/output/advanced_composer.md +76 -0
  64. data/examples/output/basic_compose.md +25 -0
  65. data/examples/output/complex_composer.md +85 -0
  66. data/examples/output/html_input.md +4 -0
  67. data/examples/output/source_list_dsl.md +126 -0
  68. data/examples/output/standard_composer.md +46 -0
  69. data/examples/output/standard_sources_buffer.md +31 -0
  70. data/examples/output/yaml_plan.md +43 -0
  71. data/examples/plans/basic.yml +20 -0
  72. data/examples/source_list_dsl.rb +41 -0
  73. data/examples/standard_composer.rb +42 -0
  74. data/examples/standard_sources_buffer.rb +62 -0
  75. data/examples/yaml_plan.rb +17 -0
  76. data/lib/markdown_composer/capabilities.rb +223 -0
  77. data/lib/markdown_composer/composition_buffer.rb +378 -0
  78. data/lib/markdown_composer/data_path.rb +313 -0
  79. data/lib/markdown_composer/diagnostics.rb +63 -0
  80. data/lib/markdown_composer/document_index/html_parser.rb +84 -0
  81. data/lib/markdown_composer/document_index/markdown_parser.rb +338 -0
  82. data/lib/markdown_composer/document_index.rb +94 -0
  83. data/lib/markdown_composer/executor.rb +284 -0
  84. data/lib/markdown_composer/markdown_renderer.rb +105 -0
  85. data/lib/markdown_composer/plan.rb +436 -0
  86. data/lib/markdown_composer/plan_builder.rb +111 -0
  87. data/lib/markdown_composer/registries/action_entries.rb +26 -0
  88. data/lib/markdown_composer/registries/condition_entries.rb +58 -0
  89. data/lib/markdown_composer/registries/registry.rb +69 -0
  90. data/lib/markdown_composer/registries/source_entries.rb +18 -0
  91. data/lib/markdown_composer/registries/support_values.rb +23 -0
  92. data/lib/markdown_composer/registries/take_entries.rb +31 -0
  93. data/lib/markdown_composer/registries/take_registry.rb +18 -0
  94. data/lib/markdown_composer/registries/target_entries.rb +40 -0
  95. data/lib/markdown_composer/registries/unit_token_entries.rb +62 -0
  96. data/lib/markdown_composer/registries/where_registry.rb +84 -0
  97. data/lib/markdown_composer/registries.rb +46 -0
  98. data/lib/markdown_composer/result.rb +34 -0
  99. data/lib/markdown_composer/selection_resolver.rb +181 -0
  100. data/lib/markdown_composer/source.rb +57 -0
  101. data/lib/markdown_composer/source_list_builder.rb +47 -0
  102. data/lib/markdown_composer/take.rb +129 -0
  103. data/lib/markdown_composer/transform_options.rb +66 -0
  104. data/lib/markdown_composer/transform_runner/content_placement.rb +63 -0
  105. data/lib/markdown_composer/transform_runner/field_interpolator.rb +213 -0
  106. data/lib/markdown_composer/transform_runner/heading_numbering.rb +106 -0
  107. data/lib/markdown_composer/transform_runner/scope_resolver.rb +87 -0
  108. data/lib/markdown_composer/transform_runner.rb +264 -0
  109. data/lib/markdown_composer/transforms/default_entries.rb +31 -0
  110. data/lib/markdown_composer/transforms/registry.rb +11 -0
  111. data/lib/markdown_composer/validator.rb +378 -0
  112. data/lib/markdown_composer/value_object.rb +15 -0
  113. data/lib/markdown_composer/version.rb +5 -0
  114. data/lib/markdown_composer/where.rb +313 -0
  115. data/lib/markdown_composer.rb +114 -0
  116. metadata +260 -0
@@ -0,0 +1,114 @@
1
+ ---
2
+ title: Markdown Composer Getting Started
3
+ type: guide
4
+ status: current
5
+ updated: 2026-06-01
6
+ description: First practical steps for composing Markdown with Markdown Composer.
7
+ ---
8
+
9
+ # Markdown Composer Getting Started
10
+
11
+ ### References
12
+
13
+ | What | Where |
14
+ |------|-------|
15
+ | Readme | [./_md_composer_readme.md](./_md_composer_readme.md) |
16
+ | Compose anatomy | [./compose/md_composer_compose_anatomy.md](./compose/md_composer_compose_anatomy.md) |
17
+ | Transform anatomy | [./transform/md_composer_transform_anatomy.md](./transform/md_composer_transform_anatomy.md) |
18
+ | Basic compose example | [./examples/md_composer_example_basic_compose.md](./examples/md_composer_example_basic_compose.md) |
19
+
20
+ ---
21
+
22
+ ## 1. Install And Require
23
+
24
+ ```ruby
25
+ require "markdown_composer"
26
+ ```
27
+
28
+ The gem is headless. You provide sources and a plan; it returns Markdown, optional HTML, diagnostics, and errors.
29
+
30
+ ## 2. Create A Source
31
+
32
+ A source is a hash with content and a source identity.
33
+
34
+ ```ruby
35
+ sources = [
36
+ {
37
+ "key" => "guide",
38
+ "type" => "current",
39
+ "markdown" => "# Guide\n\n## Intro\n\nWelcome.\n\n## API\n\nUse it.\n"
40
+ }
41
+ ]
42
+ ```
43
+
44
+ Use `current` for the main source. Use explicit keys when a plan needs more than one source.
45
+
46
+ ## 3. Write A Compose Row
47
+
48
+ A compose row reads like this:
49
+
50
+ ```text
51
+ From this Source, Select these units, Include these parts, then perform this Action at this Target.
52
+ ```
53
+
54
+ Minimal config:
55
+
56
+ ```ruby
57
+ config = {
58
+ "compose" => [
59
+ {
60
+ "source" => "current",
61
+ "select" => "heading_2_section[first:1]",
62
+ "include" => "all",
63
+ "action" => "set"
64
+ }
65
+ ]
66
+ }
67
+ ```
68
+
69
+ Expected output:
70
+
71
+ ```markdown
72
+ ## Intro
73
+
74
+ Welcome.
75
+ ```
76
+
77
+ ## 4. Validate Before Saving
78
+
79
+ ```ruby
80
+ validation = MarkdownComposer.validate(config: config, sources: sources)
81
+ abort validation[:errors].inspect unless validation[:valid]
82
+ ```
83
+
84
+ Validation catches unknown tokens, bad targets, missing transform options, YAML/JSON errors, and policy-gated features.
85
+
86
+ ## 5. Add A Transform
87
+
88
+ Top-level transforms run after all compose rows have built the buffer.
89
+
90
+ ```ruby
91
+ config = {
92
+ "compose" => [
93
+ { "select" => "heading_2_section", "action" => "set" }
94
+ ],
95
+ "transform" => [
96
+ {
97
+ "scope" => "output",
98
+ "transform" => "replace_text",
99
+ "mode" => "literal",
100
+ "options" => { "from" => "Welcome", "to" => "Hello" }
101
+ }
102
+ ]
103
+ }
104
+ ```
105
+
106
+ ## 6. Next Steps
107
+
108
+ | Need | Read |
109
+ |------|------|
110
+ | Learn row anatomy | [Compose anatomy](./compose/md_composer_compose_anatomy.md) |
111
+ | Learn transforms | [Transform anatomy](./transform/md_composer_transform_anatomy.md) |
112
+ | See complete examples | [Examples](./examples/md_composer_examples_readme.md) |
113
+ | Use Ruby DSL plans | [Ruby plans example](./examples/md_composer_example_ruby_plans.md) |
114
+
@@ -0,0 +1,93 @@
1
+ ---
2
+ title: Markdown Composer Readme
3
+ type: readme
4
+ status: current
5
+ updated: 2026-06-01
6
+ description: Public overview for the Markdown Composer gem documentation.
7
+ ---
8
+
9
+ # Markdown Composer Readme
10
+
11
+ ### References
12
+
13
+ | What | Where |
14
+ |------|-------|
15
+ | Getting started | [./_md_composer_getting_started.md](./_md_composer_getting_started.md) |
16
+ | Compose anatomy | [./compose/md_composer_compose_anatomy.md](./compose/md_composer_compose_anatomy.md) |
17
+ | Transform anatomy | [./transform/md_composer_transform_anatomy.md](./transform/md_composer_transform_anatomy.md) |
18
+ | Examples | [./examples/md_composer_examples_readme.md](./examples/md_composer_examples_readme.md) |
19
+ | API reference | [./reference/md_composer_reference_api.md](./reference/md_composer_reference_api.md) |
20
+ | Unit tokens | [./reference/md_composer_unit_tokens.md](./reference/md_composer_unit_tokens.md) |
21
+ | Take modifiers | [./reference/md_composer_take.md](./reference/md_composer_take.md) |
22
+ | Where conditions | [./reference/md_composer_where.md](./reference/md_composer_where.md) |
23
+
24
+ ---
25
+
26
+ ## 1. What Markdown Composer Does
27
+
28
+ Markdown Composer is a headless Ruby gem for selecting, composing, modifying, and transforming Markdown or best-effort HTML content. It is useful when an application needs to build a new Markdown document from one or more sources without hand-writing string slicing logic.
29
+
30
+ The core model has two row types:
31
+
32
+ ```text
33
+ Compose: Source -> Select -> Include -> Action -> Target
34
+ Transform: Scope -> Transform -> Mode -> Options
35
+ ```
36
+
37
+ Compose rows build a temporary output buffer. Transform rows reshape that buffer after composition.
38
+
39
+ ## 2. Sixty-Second Example
40
+
41
+ ```ruby
42
+ require "markdown_composer"
43
+
44
+ sources = [
45
+ {
46
+ "key" => "current",
47
+ "type" => "current",
48
+ "markdown" => "# Guide\n\n## Intro\n\nKeep this.\n\n## Draft\n\nSkip this.\n"
49
+ }
50
+ ]
51
+
52
+ config = {
53
+ "compose" => [
54
+ {
55
+ "source" => "current",
56
+ "select" => "heading_2_section where title:equals(\"Intro\")",
57
+ "include" => "all",
58
+ "action" => "set"
59
+ }
60
+ ],
61
+ "output" => "markdown"
62
+ }
63
+
64
+ result = MarkdownComposer.compose(sources: sources, config: config)
65
+ puts result.markdown
66
+ ```
67
+
68
+ Expected output:
69
+
70
+ ```markdown
71
+ ## Intro
72
+
73
+ Keep this.
74
+ ```
75
+
76
+ ## 3. Where To Start
77
+
78
+ | If you want to... | Read |
79
+ |-------------------|------|
80
+ | Compose your first document | [Getting started](./_md_composer_getting_started.md) |
81
+ | Understand compose rows | [Compose anatomy](./compose/md_composer_compose_anatomy.md) |
82
+ | Learn each compose field | [Sources](./compose/md_composer_compose_sources.md), [Select](./compose/md_composer_compose_select.md), [Include](./compose/md_composer_compose_include.md), [Actions](./compose/md_composer_compose_actions.md), [Targets](./compose/md_composer_compose_targets.md) |
83
+ | Find every unit token | [Unit tokens](./reference/md_composer_unit_tokens.md) |
84
+ | Choose first, last, ranges, or positions | [Take modifiers](./reference/md_composer_take.md) |
85
+ | Filter selections, includes, targets, or scopes | [Where conditions](./reference/md_composer_where.md) |
86
+ | Transform composed output | [Transform anatomy](./transform/md_composer_transform_anatomy.md) |
87
+ | Use `modify` | [Modify examples](./examples/md_composer_example_modify.md) |
88
+ | Build a GUI | [Capabilities reference](./reference/md_composer_reference_capabilities.md) |
89
+ | Validate or debug configs | [Diagnostics reference](./reference/md_composer_reference_diagnostics.md) |
90
+
91
+ ## 4. Public Documentation Shape
92
+
93
+ This `docs/` tree is the human-facing documentation set for GitHub and RubyGems readers. The `docs/ai/` directory is not the main reader path; it maps these public docs back to canonical audited source material.
@@ -0,0 +1,65 @@
1
+ ---
2
+ title: Markdown Composer User Guide
3
+ type: user_guide
4
+ status: current
5
+ updated: 2026-06-01
6
+ description: Public user guide for learning Markdown Composer by task.
7
+ ---
8
+
9
+ # Markdown Composer User Guide
10
+
11
+ ### References
12
+
13
+ | What | Where |
14
+ |------|-------|
15
+ | Getting started | [./_md_composer_getting_started.md](./_md_composer_getting_started.md) |
16
+ | Compose docs | [./compose/md_composer_compose_anatomy.md](./compose/md_composer_compose_anatomy.md) |
17
+ | Transform docs | [./transform/md_composer_transform_anatomy.md](./transform/md_composer_transform_anatomy.md) |
18
+ | Unit tokens | [./reference/md_composer_unit_tokens.md](./reference/md_composer_unit_tokens.md) |
19
+ | Take modifiers | [./reference/md_composer_take.md](./reference/md_composer_take.md) |
20
+ | Where conditions | [./reference/md_composer_where.md](./reference/md_composer_where.md) |
21
+ | Examples | [./examples/md_composer_examples_readme.md](./examples/md_composer_examples_readme.md) |
22
+
23
+ ---
24
+
25
+ ## 1. Learning Path
26
+
27
+ 1. Start with [Getting started](./_md_composer_getting_started.md).
28
+ 2. Learn [compose anatomy](./compose/md_composer_compose_anatomy.md).
29
+ 3. Learn [selection](./compose/md_composer_compose_select.md), then the shared [unit tokens](./reference/md_composer_unit_tokens.md), [take modifiers](./reference/md_composer_take.md), and [where conditions](./reference/md_composer_where.md).
30
+ 4. Learn [actions](./compose/md_composer_compose_actions.md) and [targets](./compose/md_composer_compose_targets.md).
31
+ 5. Learn [transform anatomy](./transform/md_composer_transform_anatomy.md) and [options](./transform/md_composer_transform_options.md).
32
+ 6. Copy a task from [examples](./examples/md_composer_examples_readme.md).
33
+
34
+ ## 2. Common Tasks
35
+
36
+ | Task | Read |
37
+ |------|------|
38
+ | Pull one section from a document | [Basic compose](./examples/md_composer_example_basic_compose.md) |
39
+ | Build output from several rows | [Multi-row compose](./examples/md_composer_example_multi_row_compose.md) |
40
+ | Rewrite selected content while composing | [Modify](./examples/md_composer_example_modify.md) |
41
+ | Remove or transform content already in the buffer | [Buffer target actions](./examples/md_composer_example_buffer_target_actions.md) |
42
+ | Extract YAML/JSON values | [Structured data](./examples/md_composer_example_structured_data.md) |
43
+ | Use Ruby plans | [Ruby plans](./examples/md_composer_example_ruby_plans.md) |
44
+
45
+ ## 3. Rules Of Thumb
46
+
47
+ | Rule | Why it helps |
48
+ |------|--------------|
49
+ | Build the buffer first, then transform it. | This keeps compose and transform concerns separate. |
50
+ | Prefer `heading_2_section` over `heading_2` when you want a heading and its body. | Heading tokens select only the heading node. Section tokens select the heading and content until the next same-or-higher heading. |
51
+ | Use `include` to narrow selected content. | `select` chooses units; `include` chooses what to keep from those units. |
52
+ | Use `modify` for selected-source transformations. | It is a compose action that transforms a temporary fragment before placing it. |
53
+ | Use `transform_buffer_target` for existing buffer content. | It transforms content already in the buffer by target. |
54
+
55
+ ## 4. When You Get Stuck
56
+
57
+ Run validation and inspect diagnostics before guessing:
58
+
59
+ ```ruby
60
+ validation = MarkdownComposer.validate(config: config, sources: sources)
61
+ pp validation[:errors]
62
+ pp validation[:diagnostics]
63
+ ```
64
+
65
+ Most authoring mistakes are field-specific: unknown selector, invalid target, missing transform option, or policy-gated feature.
@@ -0,0 +1,35 @@
1
+ ---
2
+ title: Markdown Composer AI Audit Notes
3
+ type: reference
4
+ status: current
5
+ updated: 2026-06-01
6
+ description: Maintainer and AI audit notes for caveats in public Markdown Composer docs.
7
+ ---
8
+
9
+ # Markdown Composer AI Audit Notes
10
+
11
+ ### References
12
+
13
+ | What | Where |
14
+ |------|-------|
15
+ | Source map | [./md_composer_ai_source_map.md](./md_composer_ai_source_map.md) |
16
+ | Capabilities reference | [../reference/md_composer_reference_capabilities.md](../reference/md_composer_reference_capabilities.md) |
17
+
18
+ ---
19
+
20
+ ## 1. Required Public Caveats
21
+
22
+ | Caveat | Public docs that must mention it |
23
+ |--------|----------------------------------|
24
+ | `data_record` and `data_value` are transient `data_path(...)` result node types in standalone Markdown output. | Targets, include, structured data, registries, architecture |
25
+ | `set`, `append`, and `prepend` ignore supplied custom targets. | Actions |
26
+ | `remove_buffer_target` and `transform_buffer_target` use target as the meaningful address. | Actions, buffer, buffer examples |
27
+ | `modify target: in_place` requires original `source: "buffer"`. | Actions, targets, modify example |
28
+ | Semicolon option strings are first-class, not fallback-only. | Transform options |
29
+ | HTML link attribute modes are top-level HTML-output post-processing. | Transform modes, HTML output example |
30
+ | Some optional transform metadata is ahead of standalone runner behavior. | Transform anatomy, options, capabilities |
31
+
32
+ ## 2. Code Accuracy Rule
33
+
34
+ Before publishing changed examples, run focused Ruby probes and the full gem test suite.
35
+
@@ -0,0 +1,44 @@
1
+ ---
2
+ title: Markdown Composer AI Canonical Docs
3
+ type: reference
4
+ status: current
5
+ updated: 2026-06-01
6
+ description: Maintainer and AI map of canonical Markdown Composer docs used as source material.
7
+ ---
8
+
9
+ # Markdown Composer AI Canonical Docs
10
+
11
+ ### References
12
+
13
+ | What | Where |
14
+ |------|-------|
15
+ | Source map | [./md_composer_ai_source_map.md](./md_composer_ai_source_map.md) |
16
+ | Public readme | [../_md_composer_readme.md](../_md_composer_readme.md) |
17
+
18
+ ---
19
+
20
+ ## 1. Canonical Source Location
21
+
22
+ The canonical project docs live outside this gem directory:
23
+
24
+ ```text
25
+ _docs/gems/markdown_composer/
26
+ ```
27
+
28
+ This public `docs/` tree is the gem distribution docs set. It should be clear, task-based, and human-facing.
29
+
30
+ ## 2. Canonical Files Used
31
+
32
+ | Topic | Canonical files |
33
+ |-------|-----------------|
34
+ | Overview | `_markdown_composer_readme.md`, `_markdown_composer_user_guide.md`, `_markdown_composer_cheatsheet.md` |
35
+ | Architecture | `_markdown_composer_architecture.md`, `reference/markdown_composer_capabilities.md`, `reference/markdown_composer_registries.md` |
36
+ | Compose | `reference/markdown_composer_compose.md`, sources, selection, include, actions, targets, take, where |
37
+ | Transform | `reference/markdown_composer_transforms.md`, capabilities, actions |
38
+ | Examples | `markdown_composer_examples.md` |
39
+ | Release | `release/markdown_composer_release_checklist.md` |
40
+
41
+ ## 3. Do Not Publish This As The Main Entry
42
+
43
+ Link readers to [../_md_composer_readme.md](../_md_composer_readme.md), not to this file.
44
+
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Markdown Composer AI Source Map
3
+ type: reference
4
+ status: current
5
+ updated: 2026-06-01
6
+ description: Maintainer and AI source map for public Markdown Composer docs.
7
+ ---
8
+
9
+ # Markdown Composer AI Source Map
10
+
11
+ ### References
12
+
13
+ | What | Where |
14
+ |------|-------|
15
+ | AI audit | [./md_composer_ai_audit.md](./md_composer_ai_audit.md) |
16
+ | Canonical docs map | [./md_composer_ai_canonical_docs.md](./md_composer_ai_canonical_docs.md) |
17
+ | Public readme | [../_md_composer_readme.md](../_md_composer_readme.md) |
18
+
19
+ ---
20
+
21
+ ## 1. Purpose
22
+
23
+ This directory is for maintainers and AI agents. It is not the main public reader path.
24
+
25
+ Use it to trace public docs back to canonical audited source material under `_docs/gems/markdown_composer/` and gem code/tests.
26
+
27
+ ## 2. Public-To-Canonical Map
28
+
29
+ | Public doc area | Canonical source material |
30
+ |-----------------|---------------------------|
31
+ | Root overview docs | `_docs/gems/markdown_composer/_markdown_composer_readme.md`, user guide, cheatsheet, architecture, dev guide |
32
+ | `compose/` | canonical compose, sources, selection, include, actions, targets, take, where docs |
33
+ | `transform/` | canonical transforms, capabilities, actions, targets docs |
34
+ | `examples/` | canonical examples plus focused tests |
35
+ | `reference/` | canonical API, plan schema, diagnostics, capabilities, registries, unit-token, take, and where-condition docs |
36
+
37
+ ## 3. Update Rule
38
+
39
+ When code changes, update canonical source material and these public docs together. Do not let `docs/ai/` become a second public docs set.