@cyber-dash-tech/revela 0.19.1 → 0.19.2

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.
package/README.md CHANGED
@@ -39,7 +39,7 @@ npm_config_cache=/tmp/revela-npm-cache bun run smoke:mcp-pack
39
39
  Install Revela through the Codex Git marketplace:
40
40
 
41
41
  ```bash
42
- codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.1
42
+ codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.2
43
43
  codex plugin add revela@revela
44
44
  ```
45
45
 
@@ -92,7 +92,7 @@ Revela includes built-in deck designs. Design previews are generated from the bu
92
92
  <p align="center">
93
93
  <img src="assets/img/summit-01.jpg" alt="Summit design cover preview" width="32%" />
94
94
  <img src="assets/img/summit-02.jpg" alt="Summit design agenda preview" width="32%" />
95
- <img src="assets/img/summit-03.jpg" alt="Summit design vertical timeline-roadmap preview" width="32%" />
95
+ <img src="assets/img/summit-03.jpg" alt="Summit design vertical timeline preview" width="32%" />
96
96
  </p>
97
97
 
98
98
  ### monet
@@ -116,12 +116,12 @@ Revela includes built-in deck designs. Design previews are generated from the bu
116
116
  <p align="center">
117
117
  <img src="assets/img/lucent-dark-01.jpg" alt="Lucent Dark design cover preview" width="32%" />
118
118
  <img src="assets/img/lucent-dark-02.jpg" alt="Lucent Dark design agenda preview" width="32%" />
119
- <img src="assets/img/lucent-dark-03.jpg" alt="Lucent Dark design horizontal timeline-roadmap preview" width="32%" />
119
+ <img src="assets/img/lucent-dark-03.jpg" alt="Lucent Dark design horizontal milestone preview" width="32%" />
120
120
  </p>
121
121
 
122
122
  To switch designs in Codex, ask:
123
123
 
124
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), use summit as the design.
124
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), use summit as the design.
125
125
 
126
126
  In Codex, ask Revela to list or switch designs; the plugin uses the active design when making decks.
127
127
 
@@ -129,7 +129,7 @@ In Codex, ask Revela to list or switch designs; the plugin uses the active desig
129
129
 
130
130
  Domains add topic-specific communication guidance, such as consulting, product, or investor communication. Use them when you want Revela to adapt deck framing to a specific context.
131
131
 
132
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), list available domains.
132
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), list available domains.
133
133
 
134
134
  In Codex, ask Revela to list or switch domains; the active domain guides deck framing during init, research, and planning.
135
135
 
@@ -139,35 +139,35 @@ Use these prompts in Codex from the workspace that contains your source material
139
139
 
140
140
  1. Choose the narrative domain before authoring so Revela frames the audience, decision, risks, and objections for your context.
141
141
 
142
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), use consulting as the domain.
142
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), use consulting as the domain.
143
143
 
144
144
  2. Choose the deck design before rendering so generated artifacts use the intended visual language.
145
145
 
146
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), use summit as the design.
146
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), use summit as the design.
147
147
 
148
148
  3. Create a custom design when you want a different visual direction.
149
149
 
150
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), create a new design named neon-finance with a crisp financial-dashboard style: dark surfaces, precise grids, and bright green accents.
150
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), create a new design named neon-finance with a crisp financial-dashboard style: dark surfaces, precise grids, and bright green accents.
151
151
 
152
152
  Revela may ask for references or constraints, then creates a workspace draft with `DESIGN.md`, `design.css`, and any local `assets/**`. It generates a preview from the built-in page-template fixture plus that CSS so you can review cover, agenda, timelines, charts, tables, cards, and visual slots before installing. When it is ready, switch to it:
153
153
 
154
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), use neon-finance as the design.
154
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), use neon-finance as the design.
155
155
 
156
156
  4. Initialize local material intake. Init scans, extracts, and reviews workspace sources; it does not create a Narrative Vault.
157
157
 
158
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), help me init this workspace from the local materials.
158
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), help me init this workspace from the local materials.
159
159
 
160
160
  5. Research source-linked deck inputs and save findings.
161
161
 
162
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), research the public evidence and examples needed for this deck.
162
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), research the public evidence and examples needed for this deck.
163
163
 
164
164
  6. Create or update the deck plan before generating HTML so slide order, chapter structure, source links, unresolved inputs, source limitations, and visual intent are explicit.
165
165
 
166
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), create or update the deck plan before generating HTML.
166
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), create or update the deck plan before generating HTML.
167
167
 
168
168
  7. Make an HTML deck from the current deck plan.
169
169
 
170
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), make the deck from the current deck plan.
170
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), make the deck from the current deck plan.
171
171
 
172
172
  8. Review and annotate the generated deck from the localhost website card after make-deck completes.
173
173
 
@@ -175,15 +175,15 @@ Revela serves the deck from `http://127.0.0.1:<port>/decks/<file>.html` so you c
175
175
 
176
176
  9. Export a PDF after deck QA passes.
177
177
 
178
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), export the deck to PDF.
178
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), export the deck to PDF.
179
179
 
180
180
  10. Export an editable PPTX after deck QA passes.
181
181
 
182
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), export the deck to PPTX.
182
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), export the deck to PPTX.
183
183
 
184
184
  11. Export per-slide PNG files after deck QA passes.
185
185
 
186
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md), export the deck to PNG.
186
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md), export the deck to PNG.
187
187
 
188
188
  ## Annotate A Deck
189
189
 
package/README.zh-CN.md CHANGED
@@ -39,7 +39,7 @@ npm_config_cache=/tmp/revela-npm-cache bun run smoke:mcp-pack
39
39
  通过 Codex Git marketplace 安装 Revela:
40
40
 
41
41
  ```bash
42
- codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.1
42
+ codex plugin marketplace add https://github.com/cyber-dash-tech/revela --ref v0.19.2
43
43
  codex plugin add revela@revela
44
44
  ```
45
45
 
@@ -92,7 +92,7 @@ Revela 内置多个 deck design。Design preview 由内置 page-template preview
92
92
  <p align="center">
93
93
  <img src="assets/img/summit-01.jpg" alt="Summit design cover preview" width="32%" />
94
94
  <img src="assets/img/summit-02.jpg" alt="Summit design agenda preview" width="32%" />
95
- <img src="assets/img/summit-03.jpg" alt="Summit design vertical timeline-roadmap preview" width="32%" />
95
+ <img src="assets/img/summit-03.jpg" alt="Summit design vertical timeline preview" width="32%" />
96
96
  </p>
97
97
 
98
98
  ### monet
@@ -116,12 +116,12 @@ Revela 内置多个 deck design。Design preview 由内置 page-template preview
116
116
  <p align="center">
117
117
  <img src="assets/img/lucent-dark-01.jpg" alt="Lucent Dark design cover preview" width="32%" />
118
118
  <img src="assets/img/lucent-dark-02.jpg" alt="Lucent Dark design agenda preview" width="32%" />
119
- <img src="assets/img/lucent-dark-03.jpg" alt="Lucent Dark design horizontal timeline-roadmap preview" width="32%" />
119
+ <img src="assets/img/lucent-dark-03.jpg" alt="Lucent Dark design horizontal milestone preview" width="32%" />
120
120
  </p>
121
121
 
122
122
  在 Codex 中切换 design,可以这样问:
123
123
 
124
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),use summit as design.
124
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),use summit as design.
125
125
 
126
126
  在 Codex 中,可以直接让 Revela 列出或切换 design;生成 deck 时会使用 active design。
127
127
 
@@ -129,7 +129,7 @@ Revela 内置多个 deck design。Design preview 由内置 page-template preview
129
129
 
130
130
  Domain 提供特定场景的沟通 guidance,例如 consulting、product 或 investor communication。需要让 Revela 按具体沟通场景调整 deck framing 时使用。
131
131
 
132
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),列出 available domains。
132
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),列出 available domains。
133
133
 
134
134
  在 Codex 中,可以直接让 Revela 列出或切换 domain;active domain 会用于 init、research 和 deck planning 阶段的 framing。
135
135
 
@@ -139,35 +139,35 @@ Domain 提供特定场景的沟通 guidance,例如 consulting、product 或 in
139
139
 
140
140
  1. 先选择 domain,让 Revela 按你的沟通场景 framing 受众、决策、风险和潜在质疑。
141
141
 
142
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),use consulting as domain.
142
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),use consulting as domain.
143
143
 
144
144
  2. 再选择 design,让后续生成的 deck 使用指定视觉风格。
145
145
 
146
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),use summit as design.
146
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),use summit as design.
147
147
 
148
148
  3. 如果需要不同的视觉方向,可以创建一个自定义 design。
149
149
 
150
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),创建一个名为 neon-finance 的新 design:金融仪表盘风格,深色界面、精密网格、亮绿色重点色。
150
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),创建一个名为 neon-finance 的新 design:金融仪表盘风格,深色界面、精密网格、亮绿色重点色。
151
151
 
152
152
  Revela 可能会继续询问参考图、风格约束或禁忌项,然后在 workspace draft 中创建 `DESIGN.md`、`design.css` 和需要的本地 `assets/**`。它会用内置 page-template fixture 加上这份 CSS 生成 preview,让你在 install 前先检查 cover、agenda、timeline、chart、table、card 和 visual slot。创建完成后再切换使用:
153
153
 
154
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),使用 neon-finance 作为 design。
154
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),使用 neon-finance 作为 design。
155
155
 
156
156
  4. 初始化本地 material intake。Init 会扫描、抽取并审阅 workspace source;它不会创建 Narrative Vault。
157
157
 
158
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),帮我 init 这个 workspace,先读本地材料。
158
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),帮我 init 这个 workspace,先读本地材料。
159
159
 
160
160
  5. 针对 deck 所需输入做 research,并保存带来源的 findings。
161
161
 
162
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),research 这个 deck 需要的公开证据、案例和 source。
162
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),research 这个 deck 需要的公开证据、案例和 source。
163
163
 
164
164
  6. 先创建或更新 deck plan,明确 slide 顺序、章节结构、source links、unresolved inputs、source limitations 和 visual intent,再生成 HTML。
165
165
 
166
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),生成 HTML 前先 create or update deck plan。
166
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),生成 HTML 前先 create or update deck plan。
167
167
 
168
168
  7. 基于当前 deck plan 生成 HTML deck。
169
169
 
170
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),基于当前 deck plan make deck。
170
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),基于当前 deck plan make deck。
171
171
 
172
172
  8. make-deck 完成后,从 localhost website card 打开生成的 deck,并在 Codex Browser 中做 annotation 和定向修改。
173
173
 
@@ -175,15 +175,15 @@ Revela 会通过 `http://127.0.0.1:<port>/decks/<file>.html` 服务 deck,你
175
175
 
176
176
  9. QA 通过后导出 PDF。
177
177
 
178
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),把 deck export 成 PDF。
178
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),把 deck export 成 PDF。
179
179
 
180
180
  10. QA 通过后导出可编辑 PPTX。
181
181
 
182
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),把 deck export 成 PPTX。
182
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),把 deck export 成 PPTX。
183
183
 
184
184
  11. QA 通过后导出每页 PNG。
185
185
 
186
- > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.1/skills/revela/SKILL.md),把 deck export 成 PNG。
186
+ > [$revela:revela](/Users/mengdigao/.codex/plugins/cache/revela/revela/0.19.2/skills/revela/SKILL.md),把 deck export 成 PNG。
187
187
 
188
188
  ## Annotate Deck
189
189
 
@@ -260,7 +260,8 @@ Lucent skins Revela built-in page templates without owning their semantic struct
260
260
  - `cover`, `section-divider`, `closing`: use full-bleed hero treatment with Lucent package assets.
261
261
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use report-story/card-grid language with quiet surfaces.
262
262
  - `metric-highlight`, `chart-takeaways`, `table-comparison`: use data-forward Lucent panels with explicit interpretation regions.
263
- - `timeline-roadmap`: map to the roadmap visual system. Dots remain milestone anchors inside each timeline item; do not absolutely position detached decorative dots.
263
+ - `milestone`: map to the horizontal roadmap visual system. Dots remain milestone anchors inside each milestone item; do not absolutely position detached decorative dots.
264
+ - `timeline`: map to the vertical timeline visual system. Dots remain event anchors inside each timeline item; do not absolutely position detached decorative dots.
264
265
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use recommendation and steps surfaces with no nested card-in-card framing.
265
266
 
266
267
  <!-- @design:page-templates:end -->
@@ -260,7 +260,8 @@ Lucent skins Revela built-in page templates without owning their semantic struct
260
260
  - `cover`, `section-divider`, `closing`: use full-bleed hero treatment with Lucent package assets.
261
261
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use report-story/card-grid language with quiet surfaces.
262
262
  - `metric-highlight`, `chart-takeaways`, `table-comparison`: use data-forward Lucent panels with explicit interpretation regions.
263
- - `timeline-roadmap`: map to the roadmap visual system. Dots remain milestone anchors inside each timeline item; do not absolutely position detached decorative dots.
263
+ - `milestone`: map to the horizontal roadmap visual system. Dots remain milestone anchors inside each milestone item; do not absolutely position detached decorative dots.
264
+ - `timeline`: map to the vertical timeline visual system. Dots remain event anchors inside each timeline item; do not absolutely position detached decorative dots.
264
265
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use recommendation and steps surfaces with no nested card-in-card framing.
265
266
 
266
267
  <!-- @design:page-templates:end -->
@@ -2887,7 +2887,8 @@ Monet skins Revela built-in page templates with soft editorial rhythm, painterly
2887
2887
  - `cover`, `section-divider`, `closing`: use expressive title-led structural pages.
2888
2888
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use soft narrative regions with no heavy outer box.
2889
2889
  - `metric-highlight`, `chart-takeaways`, `table-comparison`: use calm data surfaces and readable interpretation zones.
2890
- - `timeline-roadmap`: dots remain milestone anchors inside each timeline item; do not position detached decorative markers.
2890
+ - `milestone`: dots remain milestone anchors inside each horizontal milestone item; do not position detached decorative markers.
2891
+ - `timeline`: dots remain event anchors inside each vertical timeline item; do not position detached decorative markers.
2891
2892
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use quiet action and tradeoff panels.
2892
2893
 
2893
2894
  <!-- @design:page-templates:end -->
@@ -911,7 +911,8 @@ Starter skins Revela built-in page templates as a neutral authoring system. The
911
911
  - `cover`, `section-divider`, `closing`: use clear title-first structural pages.
912
912
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use plain narrative and card-grid surfaces.
913
913
  - `metric-highlight`, `chart-takeaways`, `table-comparison`: use direct data panels with minimal decoration.
914
- - `timeline-roadmap`: dots remain milestone anchors inside each timeline item; do not position detached decorative markers.
914
+ - `milestone`: dots remain milestone anchors inside each horizontal milestone item; do not position detached decorative markers.
915
+ - `timeline`: dots remain event anchors inside each vertical timeline item; do not position detached decorative markers.
915
916
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use simple step and decision panels.
916
917
 
917
918
  <!-- @design:page-templates:end -->
@@ -2671,7 +2671,8 @@ Summit skins Revela built-in page templates with editorial hierarchy, broad whit
2671
2671
  - `cover`, `section-divider`, `closing`: use strong editorial title pages.
2672
2672
  - `agenda`, `executive-summary`, `problem-context`, `key-message-evidence`, `claim-supporting-visual`: use borderless narrative groupings with clear hierarchy.
2673
2673
  - `metric-highlight`, `chart-takeaways`, `table-comparison`: use evidence-first data regions without outer container borders.
2674
- - `timeline-roadmap`: dots remain milestone anchors inside each timeline item; do not position detached decorative markers.
2674
+ - `milestone`: dots remain milestone anchors inside each horizontal milestone item; do not position detached decorative markers.
2675
+ - `timeline`: dots remain event anchors inside each vertical timeline item; do not position detached decorative markers.
2675
2676
  - `process-steps`, `recommendation-decision`, `risks-tradeoffs`: use decisive action panels with minimal framing.
2676
2677
 
2677
2678
  <!-- @design:page-templates:end -->
@@ -162,12 +162,12 @@
162
162
  <div class="template-page-number">11</div>
163
163
  </div>
164
164
  </section>
165
- <section class="slide template-slide" slide-qa="true" data-slide-index="12" data-design="built-in-preview" data-template="timeline-roadmap">
165
+ <section class="slide template-slide" slide-qa="true" data-slide-index="12" data-design="built-in-preview" data-template="milestone">
166
166
  <div class="slide-canvas">
167
167
  <div class="template-frame">
168
168
  <header>
169
169
  <p class="template-eyebrow">Template 12 / 16</p>
170
- <h1 class="template-title">timeline-roadmap</h1>
170
+ <h1 class="template-title">milestone</h1>
171
171
  </header><div class="template-body"><div class="template-timeline template-timeline--horizontal" data-template-slot="timeline" style="--timeline-count:5"><article class="template-timeline-item">
172
172
  <div class="template-timeline-copy template-card">
173
173
  <i class="template-insight-icon" data-lucide="scan-search" aria-hidden="true"></i>
@@ -214,12 +214,12 @@
214
214
  <div class="template-page-number">12</div>
215
215
  </div>
216
216
  </section>
217
- <section class="slide template-slide" slide-qa="true" data-slide-index="13" data-design="built-in-preview" data-template="timeline-roadmap">
217
+ <section class="slide template-slide" slide-qa="true" data-slide-index="13" data-design="built-in-preview" data-template="timeline">
218
218
  <div class="slide-canvas">
219
219
  <div class="template-frame">
220
220
  <header>
221
221
  <p class="template-eyebrow">Template 13 / 16</p>
222
- <h1 class="template-title">timeline-roadmap-vertical</h1>
222
+ <h1 class="template-title">timeline</h1>
223
223
  </header><div class="template-body"><div class="template-timeline-layout template-timeline-layout--left"><div class="template-side-panel template-text-panel" data-template-slot="insight"><h2 class="template-side-panel-title template-text-panel-title">Reading the journey</h2><p class="template-side-panel-body template-text-panel-body">The timeline should show sequence and decision rhythm, while the side panel explains why the milestones matter.</p></div><div class="template-timeline template-timeline--vertical" data-template-slot="timeline" style="--timeline-count:4"><article class="template-timeline-item">
224
224
  <span class="template-timeline-dot" aria-hidden="true"></span>
225
225
  <div class="template-timeline-copy">
@@ -150,10 +150,13 @@ const templates: PageTemplateDefinition[] = [
150
150
  field("insightBody", "string", "Interpretation, reading note, or caveat below the table."),
151
151
  field("insightIcon", "string", "Lucide icon name for the insight title."),
152
152
  ], ["Keep rows scannable.", "Do not use a table for pure prose."], ["Table has headers and body rows."]),
153
- define("timeline-roadmap", "Timeline / Roadmap", "Show dated phases, milestones, or journey steps.", [
153
+ define("milestone", "Milestone", "Show dated phases or milestones on a horizontal roadmap axis.", [
154
154
  field("title", "string", "Slide title.", true),
155
- field("orientation", "string", "horizontal or vertical."),
156
- field("milestones", "milestones[]", "Timeline milestones.", true),
155
+ field("milestones", "milestones[]", "Horizontal milestones.", true),
156
+ ], ["Use 3-6 milestones.", "Milestone cards sit above the axis and date labels sit below it.", "Each dot belongs to the same DOM item as its copy."], ["Timeline root exists.", "Every milestone has dot and copy.", "Dot and copy are sibling anchors inside one timeline item."]),
157
+ define("timeline", "Timeline", "Show dated events, journey steps, or sequence as a vertical timeline.", [
158
+ field("title", "string", "Slide title.", true),
159
+ field("milestones", "milestones[]", "Timeline events.", true),
157
160
  field("insightTitle", "string", "Side panel title."),
158
161
  field("insightBody", "string", "Timeline interpretation, so-what, or caveat."),
159
162
  field("insightSide", "string", "left or right side panel placement."),
@@ -188,19 +191,21 @@ export function listPageTemplates(): { ok: true; templates: PageTemplateDefiniti
188
191
  }
189
192
 
190
193
  export function renderTemplateSlide(input: RenderTemplateSlideInput): RenderTemplateSlideResult {
191
- const template = getPageTemplate(input.templateId)
194
+ const requestedTemplateId = normalizeTemplateId(input.templateId)
195
+ const template = getPageTemplate(requestedTemplateId)
192
196
  const slideIndex = positiveIndex(input.slideIndex)
193
197
  const content = input.content ?? {}
194
198
  const designName = input.designName || "lucent"
195
199
  const warnings = validateRequiredFields(template, content)
200
+ const outputTemplate = requestedTemplateId === "timeline-roadmap" ? { ...template, id: "timeline-roadmap", title: "Timeline / Roadmap" } : template
196
201
  const html = renderSlideShell({
197
- template,
202
+ template: outputTemplate,
198
203
  slideIndex,
199
204
  designName,
200
205
  title: stringValue(content.title) || template.title,
201
- body: renderBody(template.id, content),
206
+ body: renderBody(requestedTemplateId, content),
202
207
  })
203
- return { ok: true, templateId: template.id, slideIndex, designName, html, warnings }
208
+ return { ok: true, templateId: outputTemplate.id, slideIndex, designName, html, warnings }
204
209
  }
205
210
 
206
211
  export function builtInPreviewFixtures(): BuiltInPreviewFixture[] {
@@ -284,9 +289,8 @@ export function builtInPreviewFixtures(): BuiltInPreviewFixture[] {
284
289
  insightIcon: "lightbulb",
285
290
  insightBody: "The template layer owns structure, while the design layer owns visual treatment. This keeps agent edits bounded without freezing the final look.",
286
291
  }),
287
- fixture("timeline-roadmap", {
288
- title: "timeline-roadmap",
289
- orientation: "horizontal",
292
+ fixture("milestone", {
293
+ title: "milestone",
290
294
  milestones: [
291
295
  { date: "2022", label: "Signal", description: "Map the baseline." },
292
296
  { date: "2023", label: "Proof", description: "Validate the evidence threshold." },
@@ -295,9 +299,8 @@ export function builtInPreviewFixtures(): BuiltInPreviewFixture[] {
295
299
  { date: "2026", label: "Decision", description: "Commit to the next path." },
296
300
  ],
297
301
  }),
298
- fixture("timeline-roadmap", {
299
- title: "timeline-roadmap-vertical",
300
- orientation: "vertical",
302
+ fixture("timeline", {
303
+ title: "timeline",
301
304
  insightTitle: "Reading the journey",
302
305
  insightBody: "The timeline should show sequence and decision rhythm, while the side panel explains why the milestones matter.",
303
306
  milestones: [
@@ -785,7 +788,7 @@ export function validatePageTemplateContracts(filePath: string): PageTemplateCon
785
788
  const body = section[2]
786
789
  const slideIndex = Number(/data-slide-index=["'](\d+)["']/i.exec(section[0])?.[1])
787
790
  issues.push(...validateVocabularyContract(templateId, body, Number.isInteger(slideIndex) ? slideIndex : undefined))
788
- if (templateId === "timeline-roadmap") issues.push(...validateTimelineContract(body, Number.isInteger(slideIndex) ? slideIndex : undefined))
791
+ if (isTimelineTemplateId(templateId)) issues.push(...validateTimelineContract(templateId, body, Number.isInteger(slideIndex) ? slideIndex : undefined))
789
792
  }
790
793
  return { ok: !issues.some((issue) => issue.severity === "error"), issues }
791
794
  }
@@ -815,7 +818,7 @@ export function validateBoundedTemplateEdit(input: BoundedTemplateEditInput): Pa
815
818
  } else {
816
819
  const templateId = /data-template=["']([^"']+)["']/i.exec(target)?.[1] || "unknown"
817
820
  issues.push(...validateVocabularyContract(templateId, target, slideIndex))
818
- if (templateId === "timeline-roadmap") issues.push(...validateTimelineContract(target, slideIndex))
821
+ if (isTimelineTemplateId(templateId)) issues.push(...validateTimelineContract(templateId, target, slideIndex))
819
822
  }
820
823
  return { ok: !issues.some((issue) => issue.severity === "error"), issues }
821
824
  }
@@ -824,23 +827,23 @@ function define(id: string, title: string, purpose: string, fields: PageTemplate
824
827
  return { id, title, purpose, status: "renderable", fields, contentRules, qaRules }
825
828
  }
826
829
 
827
- function validateTimelineContract(html: string, slideIndex?: number): PageTemplateContractIssue[] {
830
+ function validateTimelineContract(templateId: string, html: string, slideIndex?: number): PageTemplateContractIssue[] {
828
831
  const issues: PageTemplateContractIssue[] = []
829
832
  const root = /class=["'][^"']*\btemplate-timeline\b[^"']*["']/i.test(html)
830
833
  if (!root) {
831
- issues.push({ severity: "error", templateId: "timeline-roadmap", slideIndex, message: "Missing .template-timeline root." })
834
+ issues.push({ severity: "error", templateId, slideIndex, message: "Missing .template-timeline root." })
832
835
  return issues
833
836
  }
834
837
  const itemMatches = [...html.matchAll(/<article\b[^>]*class=["'][^"']*\btemplate-timeline-item\b[^"']*["'][^>]*>([\s\S]*?)<\/article>/gi)]
835
- if (itemMatches.length < 3) issues.push({ severity: "warning", templateId: "timeline-roadmap", slideIndex, message: "Timeline should usually contain at least three milestones." })
838
+ if (itemMatches.length < 3) issues.push({ severity: "warning", templateId, slideIndex, message: "Timeline should usually contain at least three milestones." })
836
839
  for (let index = 0; index < itemMatches.length; index++) {
837
840
  const item = itemMatches[index][1]
838
- if (!/class=["'][^"']*\btemplate-timeline-dot\b[^"']*["']/i.test(item)) issues.push({ severity: "error", templateId: "timeline-roadmap", slideIndex, message: `Milestone ${index + 1} is missing .template-timeline-dot inside its item.` })
839
- if (!/class=["'][^"']*\btemplate-timeline-copy\b[^"']*["']/i.test(item)) issues.push({ severity: "error", templateId: "timeline-roadmap", slideIndex, message: `Milestone ${index + 1} is missing .template-timeline-copy inside its item.` })
841
+ if (!/class=["'][^"']*\btemplate-timeline-dot\b[^"']*["']/i.test(item)) issues.push({ severity: "error", templateId, slideIndex, message: `Milestone ${index + 1} is missing .template-timeline-dot inside its item.` })
842
+ if (!/class=["'][^"']*\btemplate-timeline-copy\b[^"']*["']/i.test(item)) issues.push({ severity: "error", templateId, slideIndex, message: `Milestone ${index + 1} is missing .template-timeline-copy inside its item.` })
840
843
  }
841
844
  const dotCount = (html.match(/\btemplate-timeline-dot\b/g) ?? []).length
842
845
  const copyCount = (html.match(/\btemplate-timeline-copy\b/g) ?? []).length
843
- if (dotCount !== copyCount) issues.push({ severity: "error", templateId: "timeline-roadmap", slideIndex, message: `Timeline dot count (${dotCount}) must match copy count (${copyCount}).` })
846
+ if (dotCount !== copyCount) issues.push({ severity: "error", templateId, slideIndex, message: `Timeline dot count (${dotCount}) must match copy count (${copyCount}).` })
844
847
  return issues
845
848
  }
846
849
 
@@ -889,12 +892,26 @@ function field(name: string, type: PageTemplateField["type"], description: strin
889
892
  }
890
893
 
891
894
  function getPageTemplate(templateId: string): PageTemplateDefinition {
892
- const id = String(templateId || "").trim()
895
+ const id = canonicalTemplateId(templateId)
893
896
  const template = templates.find((item) => item.id === id)
894
897
  if (!template) throw new Error(`Unknown page template: ${templateId}`)
895
898
  return template
896
899
  }
897
900
 
901
+ function normalizeTemplateId(templateId: string): string {
902
+ return String(templateId || "").trim()
903
+ }
904
+
905
+ function canonicalTemplateId(templateId: string): string {
906
+ const id = normalizeTemplateId(templateId)
907
+ if (id === "timeline-roadmap") return "milestone"
908
+ return id
909
+ }
910
+
911
+ function isTimelineTemplateId(templateId: string): boolean {
912
+ return ["milestone", "timeline", "timeline-roadmap"].includes(templateId)
913
+ }
914
+
898
915
  function renderSlideShell(input: { template: PageTemplateDefinition; slideIndex: number; designName: string; title: string; body: string; catalog?: any }): string {
899
916
  const hero = ["cover", "section-divider", "closing"].includes(input.template.id)
900
917
  const slideQa = hero ? "false" : "true"
@@ -946,6 +963,8 @@ function renderBody(templateId: string, content: Record<string, any>): string {
946
963
  if (templateId === "metric-highlight") return `${renderHeader(content, "Metric Highlight")}<div class="template-body">${metricHighlight(content)}</div>`
947
964
  if (templateId === "chart-takeaways") return `${renderHeader(content, "Chart + Takeaways")}<div class="template-body template-grid template-chart-layout">${visualSlotPanel()}${chartTakeawayPanel(content)}</div>`
948
965
  if (templateId === "table-comparison") return `${renderHeader(content, "Table / Comparison")}<div class="template-body" data-template-slot="table">${table(content)}</div>`
966
+ if (templateId === "milestone") return `${renderHeader(content, "Milestone")}<div class="template-body">${timeline({ ...content, orientation: "horizontal" })}</div>`
967
+ if (templateId === "timeline") return `${renderHeader(content, "Timeline")}<div class="template-body">${timeline({ ...content, orientation: "vertical" })}</div>`
949
968
  if (templateId === "timeline-roadmap") return `${renderHeader(content, "Timeline / Roadmap")}<div class="template-body">${timeline(content)}</div>`
950
969
  if (templateId === "process-steps") return `${renderHeader(content, "Process / Steps")}<div class="template-body"><div class="template-steps" data-template-slot="steps">${steps(content.steps)}</div></div>`
951
970
  if (templateId === "recommendation-decision") return `${renderHeader(content, "Recommendation / Decision")}<div class="template-body template-grid cols-3"><div class="template-card" data-template-slot="recommendation"><h2>Recommendation</h2><p>${escapeHtml(stringValue(content.recommendation))}</p>${imageCard(content)}</div><div data-template-slot="rationale">${cards(items(content).slice(0, 1), "h3")}</div><div class="template-card" data-template-slot="next-steps"><h2>Next steps</h2>${orderedSteps(content.steps)}</div></div>`
@@ -1132,7 +1151,8 @@ function scaffoldSeed(templateId: string, seed: Record<string, any>): Record<str
1132
1151
  if (templateId === "metric-highlight") return { metrics: [{ value: "67%", label: "Metric", description: "Replace with interpretation." }, { value: "3x", label: "Comparison", description: "Replace with reading note." }, { value: "14d", label: "Window", description: "Replace with time context." }], insightTitle: "Read the signal", insightBody: "Replace with the decision implication, caveat, or next reading step.", ...base }
1133
1152
  if (templateId === "chart-takeaways") return { takeawaysTitle: "What to read", items: defaultItems(["Trend", "Driver", "Decision use"]), ...base }
1134
1153
  if (templateId === "table-comparison") return { columns: ["Dimension", "Current", "Target"], rows: [["Replace", "Current state", "Target state"], ["Caveat", "Known limit", "Next proof"]], insightTitle: "Insight", insightBody: "Replace with the table reading note or caveat.", ...base }
1135
- if (templateId === "timeline-roadmap") return { orientation: "horizontal", milestones: [{ date: "2022", label: "Signal", description: "Name the starting condition." }, { date: "2023", label: "Proof", description: "Show the evidence threshold." }, { date: "2024", label: "Inflection", description: "Use the pivotal moment to frame the shift." }, { date: "2025", label: "Scale", description: "Use a taller card for the highlighted milestone.", highlight: true }, { date: "2026", label: "Decision", description: "State what changes next." }], ...base }
1154
+ if (templateId === "milestone" || templateId === "timeline-roadmap") return { orientation: "horizontal", milestones: [{ date: "2022", label: "Signal", description: "Name the starting condition." }, { date: "2023", label: "Proof", description: "Show the evidence threshold." }, { date: "2024", label: "Inflection", description: "Use the pivotal moment to frame the shift." }, { date: "2025", label: "Scale", description: "Use a taller card for the highlighted milestone.", highlight: true }, { date: "2026", label: "Decision", description: "State what changes next." }], ...base }
1155
+ if (templateId === "timeline") return { orientation: "vertical", insightTitle: "Reading the journey", insightBody: "Replace with the timeline interpretation or caveat.", milestones: [{ date: "Mar 2019", label: "Launch", description: "Name the starting event." }, { date: "Nov 2019", label: "Audit", description: "Show the evidence threshold." }, { date: "May 2020", label: "Scale", description: "Explain the operating cadence." }, { date: "Feb 2021", label: "Review", description: "State what changes next." }], ...base }
1136
1156
  if (templateId === "process-steps") return { steps: defaultItems(["Step 1", "Step 2", "Step 3"]), ...base }
1137
1157
  if (templateId === "recommendation-decision") return { recommendation: "Replace with the recommended decision.", items: defaultItems(["Rationale"]), steps: defaultItems(["Pilot", "Validate", "Ship"]), ...base }
1138
1158
  if (templateId === "risks-tradeoffs") return { items: defaultItems(["Risk", "Tradeoff", "Mitigation"]), ...base }
@@ -10,10 +10,12 @@ export * from "./cover"
10
10
  export * from "./executive-summary"
11
11
  export * from "./key-message-evidence"
12
12
  export * from "./metric-highlight"
13
+ export * from "./milestone"
13
14
  export * from "./problem-context"
14
15
  export * from "./process-steps"
15
16
  export * from "./recommendation-decision"
16
17
  export * from "./risks-tradeoffs"
17
18
  export * from "./section-divider"
18
19
  export * from "./table-comparison"
20
+ export * from "./timeline"
19
21
  export * from "./timeline-roadmap"
@@ -0,0 +1,3 @@
1
+ import { templateModule } from "./shared"
2
+
3
+ export const milestoneTemplate = templateModule("milestone")
@@ -0,0 +1,3 @@
1
+ import { templateModule } from "./shared"
2
+
3
+ export const timelineTemplate = templateModule("timeline")
@@ -57,7 +57,8 @@ export const PAGE_TEMPLATE_VOCABULARY: PageTemplateVocabulary[] = [
57
57
  vocab("metric-highlight", ["template-stat-grid"], ["metrics"], ["metrics", "insight"], ["Metric values should remain visible outside prose."]),
58
58
  vocab("chart-takeaways", ["template-chart-panel", "template-chart-takeaway-panel"], ["visual", "takeaways"], ["visual", "takeaways"], ["Chart/image slot and takeaway text panel must both remain present."]),
59
59
  vocab("table-comparison", ["template-table-wrap", "template-table"], ["table"], ["table", "insight"], ["Table headers and body should remain structured, not prose-only."]),
60
- vocab("timeline-roadmap", ["template-timeline", "template-timeline-item", "template-timeline-dot", "template-timeline-copy", "template-insight-icon"], ["timeline"], ["timeline", "insight"], ["Each timeline item must keep dot and copy as sibling anchors inside one item.", "Horizontal timeline cards reuse .template-card; highlight uses the item modifier."]),
60
+ vocab("milestone", ["template-timeline", "template-timeline-item", "template-timeline-dot", "template-timeline-copy", "template-insight-icon"], ["timeline"], ["timeline"], ["Each milestone item must keep dot and copy as sibling anchors inside one item.", "Milestone cards reuse .template-card; highlight uses the item modifier."]),
61
+ vocab("timeline", ["template-timeline", "template-timeline-item", "template-timeline-dot", "template-timeline-copy"], ["timeline"], ["timeline", "insight"], ["Each timeline item must keep dot and copy as sibling anchors inside one item.", "The optional insight slot explains the sequence without replacing event copy."]),
61
62
  vocab("process-steps", ["template-steps", "template-step-number"], ["steps"], ["steps"], ["Steps should remain ordered in DOM order."]),
62
63
  vocab("recommendation-decision", ["template-card"], ["recommendation", "rationale", "next-steps"], ["recommendation", "rationale", "next-steps"], ["Keep recommendation, rationale, and next steps separate."]),
63
64
  vocab("risks-tradeoffs", ["template-card"], ["risks"], ["risks"], ["Risk/tradeoff cards should name uncertainty explicitly."]),
@@ -132,9 +133,10 @@ export function listPageTemplateVocabulary(): PageTemplateVocabulary[] {
132
133
  }
133
134
 
134
135
  export function getPageTemplateVocabulary(templateId: string): PageTemplateVocabulary {
135
- const vocabulary = PAGE_TEMPLATE_VOCABULARY.find((item) => item.templateId === templateId)
136
+ const id = templateId === "timeline-roadmap" ? "milestone" : templateId
137
+ const vocabulary = PAGE_TEMPLATE_VOCABULARY.find((item) => item.templateId === id)
136
138
  if (!vocabulary) throw new Error(`Unknown page template vocabulary: ${templateId}`)
137
- return vocabulary
139
+ return templateId === "timeline-roadmap" ? { ...vocabulary, templateId } : vocabulary
138
140
  }
139
141
 
140
142
  function vocab(templateId: string, requiredClasses: string[], slotNames: string[], replaceableSlots: string[], contractNotes: string[]): PageTemplateVocabulary {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyber-dash-tech/revela",
3
- "version": "0.19.1",
3
+ "version": "0.19.2",
4
4
  "description": "Codex-first CLI/MCP workspace for trusted narrative artifacts from local sources, research, and evidence",
5
5
  "type": "module",
6
6
  "main": "./index.ts",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "revela",
3
- "version": "0.19.0",
3
+ "version": "0.19.2",
4
4
  "description": "Use Revela in Codex to specify, research, plan, make, and export trusted narrative decision artifacts.",
5
5
  "author": {
6
6
  "name": "cyber-dash-tech",
@@ -113,7 +113,7 @@ const tools = [
113
113
  inputSchema: objectSchema({
114
114
  workspaceRoot: stringProp("Optional workspace root."),
115
115
  designName: stringProp("Optional design name. Defaults to the active design."),
116
- templateId: requiredStringProp("Built-in template id, such as timeline-roadmap."),
116
+ templateId: requiredStringProp("Built-in template id, such as milestone or timeline."),
117
117
  slideIndex: requiredNumberProp("Positive 1-based slide index."),
118
118
  content: objectProp("Template content fields. The built-in template renderer owns the HTML skeleton."),
119
119
  }, ["templateId", "slideIndex", "content"]),
@@ -122,14 +122,14 @@ const tools = [
122
122
  name: "revela_page_template_foundation",
123
123
  description: "Read the built-in template foundation for custom design authoring: scaffold HTML, CSS hooks, slots, and contract notes.",
124
124
  inputSchema: objectSchema({
125
- templateId: requiredStringProp("Built-in template id, such as timeline-roadmap."),
125
+ templateId: requiredStringProp("Built-in template id, such as milestone or timeline."),
126
126
  }, ["templateId"]),
127
127
  },
128
128
  {
129
129
  name: "revela_page_template_vocabulary",
130
130
  description: "Read machine-readable classes, slots, editable regions, replaceable regions, and contract notes for one page template.",
131
131
  inputSchema: objectSchema({
132
- templateId: requiredStringProp("Built-in template id, such as timeline-roadmap."),
132
+ templateId: requiredStringProp("Built-in template id, such as milestone or timeline."),
133
133
  }, ["templateId"]),
134
134
  },
135
135
  {
@@ -138,7 +138,7 @@ const tools = [
138
138
  inputSchema: objectSchema({
139
139
  workspaceRoot: stringProp("Optional workspace root."),
140
140
  designName: stringProp("Optional design name. Defaults to the active design."),
141
- templateId: requiredStringProp("Built-in template id, such as timeline-roadmap."),
141
+ templateId: requiredStringProp("Built-in template id, such as milestone or timeline."),
142
142
  slideIndex: requiredNumberProp("Positive 1-based slide index."),
143
143
  seed: objectProp("Optional scaffold seed fields. This is not the final authoring interface."),
144
144
  }, ["templateId", "slideIndex"]),
@@ -150,7 +150,7 @@ const tools = [
150
150
  workspaceRoot: stringProp("Optional workspace root."),
151
151
  outputPath: requiredStringProp("Workspace-relative HTML deck path."),
152
152
  designName: stringProp("Optional design name. Defaults to the active design."),
153
- templateId: requiredStringProp("Built-in template id, such as timeline-roadmap."),
153
+ templateId: requiredStringProp("Built-in template id, such as milestone or timeline."),
154
154
  slideIndex: requiredNumberProp("Positive 1-based slide index."),
155
155
  seed: objectProp("Optional scaffold seed fields. LLM should bounded-edit the inserted slide after scaffold creation."),
156
156
  }, ["outputPath", "templateId", "slideIndex"]),
@@ -162,7 +162,7 @@ const tools = [
162
162
  workspaceRoot: stringProp("Optional workspace root."),
163
163
  outputPath: requiredStringProp("Workspace-relative HTML deck path."),
164
164
  designName: stringProp("Optional design name. Defaults to the active design."),
165
- templateId: requiredStringProp("Built-in template id, such as timeline-roadmap."),
165
+ templateId: requiredStringProp("Built-in template id, such as milestone or timeline."),
166
166
  slideIndex: requiredNumberProp("Positive 1-based slide index."),
167
167
  content: objectProp("Template content fields. Prefer scaffold-first flow for new deck creation."),
168
168
  }, ["outputPath", "templateId", "slideIndex", "content"]),