stream_weaver 0.3.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 (381) hide show
  1. checksums.yaml +7 -0
  2. data/.beads/.gitignore +77 -0
  3. data/.beads/README.md +81 -0
  4. data/.beads/config.yaml +54 -0
  5. data/.beads/metadata.json +7 -0
  6. data/.rspec +3 -0
  7. data/AGENTS.md +91 -0
  8. data/CHANGELOG.md +294 -0
  9. data/CLAUDE.md +67 -0
  10. data/LICENSE.txt +21 -0
  11. data/README.md +565 -0
  12. data/Rakefile +13 -0
  13. data/assets/streamweaver-hero.jpg +0 -0
  14. data/bench/baselines/ledger.rb +58 -0
  15. data/bench/baselines/warroom.rb +51 -0
  16. data/bench/fixtures/ledger.rb +76 -0
  17. data/bench/fixtures/warroom.rb +60 -0
  18. data/bench/results/6daf8b8.md +102 -0
  19. data/bench/results/c8d749b.md +102 -0
  20. data/bench/results/eb06ab9.md +102 -0
  21. data/bench/run.rb +151 -0
  22. data/bench/support.rb +84 -0
  23. data/copy_this/dto_run_sample_run_7631.html +220 -0
  24. data/docs/SERVICE_MODE.md +302 -0
  25. data/docs/architecture/how_streamweaver_works.md +772 -0
  26. data/docs/blog/2026-01-16-streamweaver-introduction.md +515 -0
  27. data/docs/bug-2026-08-31-canvas-bridge-socket-collision.md +83 -0
  28. data/docs/canvas-ipc-session-summary.md +127 -0
  29. data/docs/canvas-panel-workflow.md +172 -0
  30. data/docs/canvas-read.md +147 -0
  31. data/docs/canvas-roadmap.md +275 -0
  32. data/docs/case-studies/2026-09-03-didx-canvas-read-shelf.md +147 -0
  33. data/docs/claude-code-companion-skill-spec.md +567 -0
  34. data/docs/components_reference.md +1223 -0
  35. data/docs/crud-patterns.md +265 -0
  36. data/docs/endpoints.md +122 -0
  37. data/docs/for_llms.md +1 -0
  38. data/docs/form-patterns.md +165 -0
  39. data/docs/frontend-only.md +169 -0
  40. data/docs/html-artifact-audit.md +238 -0
  41. data/docs/ideas/2025-01-01-as-a-service.md +203 -0
  42. data/docs/ideas/2026-01-16-charm-tui-exploration.md +542 -0
  43. data/docs/ideas/2026-08-27-static-doc-shelf-export.md +153 -0
  44. data/docs/ideas/dhh-review-future-refactors.md +142 -0
  45. data/docs/opal-jamstack.md +47 -0
  46. data/docs/opal-npm-direction.md +184 -0
  47. data/docs/opal-spike-findings.md +194 -0
  48. data/docs/plans/2025-12-16-form-blocks-design.md +124 -0
  49. data/docs/plans/2025-12-30-examples-browser-design.md +152 -0
  50. data/docs/plans/2026-01-02-charts-design.md +288 -0
  51. data/docs/plans/2026-01-10-canvas-ipc-design.md +247 -0
  52. data/docs/plans/2026-01-19-cabinet-control-components.md +176 -0
  53. data/docs/plans/2026-01-26-gem-release-and-panel.md +140 -0
  54. data/docs/plans/canvas-claude-project-design.md +238 -0
  55. data/docs/plans/canvas-doc-location-and-discovery.md +32 -0
  56. data/docs/plans/org-doc-preview-surfaces.md +293 -0
  57. data/docs/plans/shadcn-polish-plan.md +417 -0
  58. data/docs/porting-artifacts.md +252 -0
  59. data/docs/reference/agent-skills-comparison.md +369 -0
  60. data/docs/reference/travel-state-prd.artifact.html +780 -0
  61. data/docs/research/2026-08-17-hotwire-alike-landscape.md +268 -0
  62. data/docs/research/2026-08-17-hotwire-concept-map.md +404 -0
  63. data/docs/research/2026-08-22-lazy-fragments-trigger-decision.md +246 -0
  64. data/docs/research/2026-08-22-learnhotwire-syllabus-coverage.md +239 -0
  65. data/docs/research/frontend-only-matrix.md +278 -0
  66. data/docs/research/streamweaver-way-spike-findings.md +529 -0
  67. data/docs/resource-dsl.md +342 -0
  68. data/docs/routing.md +302 -0
  69. data/docs/ruby-ui-comparison.md +319 -0
  70. data/docs/shared-dsl-fragments.md +356 -0
  71. data/docs/streamweaver-for-ai-agents.md +401 -0
  72. data/docs/streamweaver-frontend-vision.md +123 -0
  73. data/docs/streamweaver_canvas/glimmer_initial_final_layer.rb +77 -0
  74. data/docs/streamweaver_canvas/save_example.rb +9 -0
  75. data/docs/templates.md +213 -0
  76. data/docs/testing.md +155 -0
  77. data/docs/theming-hooks.md +281 -0
  78. data/docs/tutorials/the-streamweaver-way.md +882 -0
  79. data/docs/university/capability-inventory.md +137 -0
  80. data/docs/university/dependency-survey.md +114 -0
  81. data/docs/university/design-spec.md +217 -0
  82. data/docs/university/mockups/code-block-doc-theme-dark.png +0 -0
  83. data/docs/university/mockups/code-block-doc-theme-light.png +0 -0
  84. data/docs/university/mockups/course-list-dark.png +0 -0
  85. data/docs/university/mockups/course-list-light.png +0 -0
  86. data/docs/university/mockups/course_canvas_mockup.rb +741 -0
  87. data/docs/university/mockups/step-screen-dark.png +0 -0
  88. data/docs/university/mockups/step-screen-light.png +0 -0
  89. data/docs/university/roadmap.md +72 -0
  90. data/docs/university/send-to-coworker.md +77 -0
  91. data/docs/university/worker-session-mining.md +109 -0
  92. data/docs/visual/browser-rendering-spike.md +173 -0
  93. data/docs/visual/builder-visual-plan-analysis.md +378 -0
  94. data/docs/visual/sw-plan-format-exploration.md +511 -0
  95. data/docs/visual/sw-plan-rendering-deep-dive.md +453 -0
  96. data/docs/visual-skills/PROGRESS.md +60 -0
  97. data/docs/visual-skills/SESSION-CONTEXT.md +207 -0
  98. data/docs/visual-skills/analysis/components.md +317 -0
  99. data/docs/visual-skills/analysis/overlap.md +360 -0
  100. data/docs/visual-skills/analysis/pi-design-deck.md +1102 -0
  101. data/docs/visual-skills/analysis/streamweaver-inventory.md +93 -0
  102. data/docs/visual-skills/analysis/unified-specs.feature +1003 -0
  103. data/docs/visual-skills/analysis/visual-explainer.md +964 -0
  104. data/docs/visual-skills/blog/blog-series-outline.md +39 -0
  105. data/docs/visual-skills/blog/token-efficiency.md +73 -0
  106. data/docs/visual-skills/design/architecture.md +1725 -0
  107. data/docs/visual-skills/design/codex-review.md +340 -0
  108. data/docs/visual-skills/design/dhh-review.md +209 -0
  109. data/docs/visual-skills/design/evolution.md +100 -0
  110. data/docs/visual-skills/design/gemini-review.md +55 -0
  111. data/docs/visual-skills/design/review-synthesis.md +149 -0
  112. data/docs/visual-skills/implementation/STATE.md +22 -0
  113. data/docs/visual-skills/implementation/plan.md +347 -0
  114. data/docs/visual-skills/implementation/spike-findings.md +237 -0
  115. data/docs/visual-skills/implementation/tasks.md +702 -0
  116. data/docs/visual-skills/lessons-learned/process.md +145 -0
  117. data/examples/README.md +96 -0
  118. data/examples/advanced/all_components.rb +177 -0
  119. data/examples/advanced/examples_browser.rb +394 -0
  120. data/examples/advanced/teachables_browser.rb +261 -0
  121. data/examples/advanced/theme_tweaker.rb +366 -0
  122. data/examples/advanced/tutorial.rb +1528 -0
  123. data/examples/agentic/agentic_form.rb +30 -0
  124. data/examples/agentic/agentic_form_autoclose.rb +30 -0
  125. data/examples/agentic/cultivation_tracker.rb +69 -0
  126. data/examples/basic/hello_world.rb +22 -0
  127. data/examples/basic/opal_tabs_table.rb +44 -0
  128. data/examples/basic/todo_list.rb +39 -0
  129. data/examples/button_loading_test.rb +36 -0
  130. data/examples/canvas/mermaid_canvas_demo.sh +151 -0
  131. data/examples/charts/bar_chart_demo.rb +57 -0
  132. data/examples/charts/line_chart_demo.rb +73 -0
  133. data/examples/charts/pie_area_demo.rb +87 -0
  134. data/examples/charts/stacked_bar_chart_demo.rb +69 -0
  135. data/examples/claude_code/README.md +85 -0
  136. data/examples/claude_code/codebreaker/.claude/commands/infiltrate.md +632 -0
  137. data/examples/claude_code/codebreaker/.claude/settings.json +11 -0
  138. data/examples/claude_code/codebreaker/.claude/settings.local.json +17 -0
  139. data/examples/claude_code/codebreaker/.claude/skills/infiltrate.md +0 -0
  140. data/examples/claude_code/codebreaker/README.md +213 -0
  141. data/examples/claude_code/tutorial/.claude/commands/learn.md +453 -0
  142. data/examples/claude_code/tutorial/README.md +102 -0
  143. data/examples/claude_code/verification_flow/.claude/commands/verify.md +171 -0
  144. data/examples/claude_code/verification_flow/README.md +126 -0
  145. data/examples/components/annotated_code_demo.rb +54 -0
  146. data/examples/components/callout_demo.rb +33 -0
  147. data/examples/components/checkbox_group_demo.rb +46 -0
  148. data/examples/components/design_review.css +468 -0
  149. data/examples/components/design_review_demo.rb +44 -0
  150. data/examples/components/design_review_dsl.rb +300 -0
  151. data/examples/components/diff_block_demo.rb +112 -0
  152. data/examples/components/events_demo.rb +184 -0
  153. data/examples/components/form_demo.rb +62 -0
  154. data/examples/components/lesson_demo.rb +53 -0
  155. data/examples/components/markdown_demo.rb +110 -0
  156. data/examples/components/mermaid_demo.rb +166 -0
  157. data/examples/components/pareto_set.rb +64 -0
  158. data/examples/components/prd_demo.rb +21 -0
  159. data/examples/components/prd_dsl.rb +385 -0
  160. data/examples/components/quiz_demo.rb +47 -0
  161. data/examples/components/run_viewer_demo.rb +100 -0
  162. data/examples/components/score_and_collapsible_demo.rb +82 -0
  163. data/examples/components/select_stale_value_smoke_test.rb +39 -0
  164. data/examples/components/table_demo.rb +247 -0
  165. data/examples/components/timer_with_state_demo.rb +58 -0
  166. data/examples/components/todo_due_dates.rb +63 -0
  167. data/examples/components/uat_gaps_demo.rb +112 -0
  168. data/examples/dashboard/feed_simulator.rb +60 -0
  169. data/examples/dashboard/live_dashboard.rb +80 -0
  170. data/examples/dashboard_components.rb +108 -0
  171. data/examples/deferred_fragments_demo.rb +62 -0
  172. data/examples/generate_more_spike/README.md +63 -0
  173. data/examples/generate_more_spike/app.rb +441 -0
  174. data/examples/git_health.sh +401 -0
  175. data/examples/layout/layout_components_demo.rb +174 -0
  176. data/examples/layout/modal_demo.rb +215 -0
  177. data/examples/layout/navigation_demo.rb +227 -0
  178. data/examples/layout/route_tabs_demo.rb +52 -0
  179. data/examples/layout/routing_demo.rb +52 -0
  180. data/examples/layout/scroll_box_demo.rb +154 -0
  181. data/examples/lazy_fragments_demo.rb +151 -0
  182. data/examples/my_todos/README.md +29 -0
  183. data/examples/my_todos/my_todos.rb +312 -0
  184. data/examples/my_todos/store.rb +86 -0
  185. data/examples/opal/reactive_demo.rb +62 -0
  186. data/examples/opal/scenarios/s1_counter.rb +15 -0
  187. data/examples/opal/scenarios/s2_search_filter.rb +17 -0
  188. data/examples/opal/scenarios/s3_sibling_tabs.rb +25 -0
  189. data/examples/opal/scenarios/s4_shopping_cart.rb +34 -0
  190. data/examples/opal/scenarios/s5_watch.rb +39 -0
  191. data/examples/opal/scenarios/s6_on_start.rb +20 -0
  192. data/examples/opal/scenarios/s7_wizard.rb +33 -0
  193. data/examples/opal/scenarios/s8_loan_calculator.rb +21 -0
  194. data/examples/opal/scenarios/s9_dashboard.rb +27 -0
  195. data/examples/operations_dashboard_demo.rb +167 -0
  196. data/examples/panel_demo.sh +447 -0
  197. data/examples/parity/assets/tyrion_slice.css +86 -0
  198. data/examples/parity/rivet_people_slice.rb +182 -0
  199. data/examples/parity/tyrion_components.css +777 -0
  200. data/examples/parity/tyrion_warroom_components.rb +414 -0
  201. data/examples/parity/tyrion_warroom_slice.rb +549 -0
  202. data/examples/puma_dev/README.md +124 -0
  203. data/examples/puma_dev/config.ru +34 -0
  204. data/examples/puma_dev/standalone_app.rb +34 -0
  205. data/examples/scaffolding/blog.rb +49 -0
  206. data/examples/scaffolding/utf_lite.rb +105 -0
  207. data/examples/styling/feedback_demo.rb +229 -0
  208. data/examples/styling/style_showcase.rb +172 -0
  209. data/examples/styling/theme_demo.rb +508 -0
  210. data/examples/timer_health_checker.rb +111 -0
  211. data/examples/timer_showcase.rb +131 -0
  212. data/examples/tutorials/render_markdown.rb +112 -0
  213. data/examples/tutorials/streamweaver_way_tutorial.rb +44 -0
  214. data/examples/tutorials/tutorial_content.rb +1082 -0
  215. data/examples/visual_skills/design_deck_demo.rb +314 -0
  216. data/examples/visual_skills/explainer_demo.rb +499 -0
  217. data/exe/streamweaver +9 -0
  218. data/gsd/ROADMAP-1.0.md +167 -0
  219. data/gsd/STATE.md +13 -0
  220. data/gsd/research/market-positioning-research.md +139 -0
  221. data/gsd/research/production-patterns-research.md +270 -0
  222. data/gsd/research/repo-audit-1.0.md +274 -0
  223. data/lib/stream_weaver/action_token.rb +58 -0
  224. data/lib/stream_weaver/adapter/alpinejs.rb +8249 -0
  225. data/lib/stream_weaver/adapter/base.rb +591 -0
  226. data/lib/stream_weaver/adapter/opal.rb +334 -0
  227. data/lib/stream_weaver/adapter/static.rb +1118 -0
  228. data/lib/stream_weaver/admin.rb +176 -0
  229. data/lib/stream_weaver/app.rb +1821 -0
  230. data/lib/stream_weaver/assets/js/sw-copy.js +50 -0
  231. data/lib/stream_weaver/assets/js/sw-heredoc-rewrite.js +68 -0
  232. data/lib/stream_weaver/assets/js/sw-keyboard.js +165 -0
  233. data/lib/stream_weaver/assets/js/sw-mermaid-zoom.js +621 -0
  234. data/lib/stream_weaver/assets/js/sw-route-tabs.js +53 -0
  235. data/lib/stream_weaver/assets/js/sw-sidebar-toc.js +116 -0
  236. data/lib/stream_weaver/assets/js/sw-slide-nav.js +103 -0
  237. data/lib/stream_weaver/canvas/bridge.rb +239 -0
  238. data/lib/stream_weaver/canvas/bridge_server.rb +646 -0
  239. data/lib/stream_weaver/canvas/client.rb +298 -0
  240. data/lib/stream_weaver/canvas/doc_roots.rb +233 -0
  241. data/lib/stream_weaver/canvas/doc_store.rb +252 -0
  242. data/lib/stream_weaver/canvas/gist_publisher.rb +264 -0
  243. data/lib/stream_weaver/canvas/gist_save_handler.rb +89 -0
  244. data/lib/stream_weaver/canvas/gist_store.rb +135 -0
  245. data/lib/stream_weaver/canvas/helpers.rb +109 -0
  246. data/lib/stream_weaver/canvas/history.rb +90 -0
  247. data/lib/stream_weaver/canvas/protocol.rb +86 -0
  248. data/lib/stream_weaver/canvas/reader.rb +853 -0
  249. data/lib/stream_weaver/canvas/save_doc_widget.rb +457 -0
  250. data/lib/stream_weaver/canvas/scroll_top_hint.rb +21 -0
  251. data/lib/stream_weaver/canvas/session.rb +132 -0
  252. data/lib/stream_weaver/cli.rb +3235 -0
  253. data/lib/stream_weaver/component_assets.rb +70 -0
  254. data/lib/stream_weaver/component_registry.rb +67 -0
  255. data/lib/stream_weaver/component_renderer.rb +48 -0
  256. data/lib/stream_weaver/components/annotated_code.rb +53 -0
  257. data/lib/stream_weaver/components/api_endpoint.rb +42 -0
  258. data/lib/stream_weaver/components/callout.rb +59 -0
  259. data/lib/stream_weaver/components/chart.rb +84 -0
  260. data/lib/stream_weaver/components/code_block.rb +77 -0
  261. data/lib/stream_weaver/components/comparison.rb +39 -0
  262. data/lib/stream_weaver/components/decision.rb +38 -0
  263. data/lib/stream_weaver/components/deck/close_overlay.rb +84 -0
  264. data/lib/stream_weaver/components/deck/confirmation_bar.rb +60 -0
  265. data/lib/stream_weaver/components/deck/deck_option.rb +61 -0
  266. data/lib/stream_weaver/components/deck/deck_slide.rb +77 -0
  267. data/lib/stream_weaver/components/deck/deck_state.rb +469 -0
  268. data/lib/stream_weaver/components/deck/deck_summary.rb +73 -0
  269. data/lib/stream_weaver/components/deck/design_deck.rb +60 -0
  270. data/lib/stream_weaver/components/deck/generate_more_controls.rb +84 -0
  271. data/lib/stream_weaver/components/deck/model_selector.rb +84 -0
  272. data/lib/stream_weaver/components/deck/skeleton_placeholder.rb +36 -0
  273. data/lib/stream_weaver/components/diff_block.rb +125 -0
  274. data/lib/stream_weaver/components/doc_header.rb +57 -0
  275. data/lib/stream_weaver/components/image_block.rb +70 -0
  276. data/lib/stream_weaver/components/implementation_map.rb +33 -0
  277. data/lib/stream_weaver/components/keyboard_shortcuts.rb +94 -0
  278. data/lib/stream_weaver/components/kpi_dashboard.rb +78 -0
  279. data/lib/stream_weaver/components/mermaid.rb +79 -0
  280. data/lib/stream_weaver/components/pipeline.rb +63 -0
  281. data/lib/stream_weaver/components/sidebar_toc.rb +46 -0
  282. data/lib/stream_weaver/components/slide_container.rb +141 -0
  283. data/lib/stream_weaver/components/timeline_event.rb +58 -0
  284. data/lib/stream_weaver/components/wireframe.rb +29 -0
  285. data/lib/stream_weaver/components/wireframe_block.rb +34 -0
  286. data/lib/stream_weaver/components.rb +2711 -0
  287. data/lib/stream_weaver/css.rb +230 -0
  288. data/lib/stream_weaver/dev_fallback_overlay.rb +61 -0
  289. data/lib/stream_weaver/display_dsl.rb +1004 -0
  290. data/lib/stream_weaver/export/html_exporter.rb +478 -0
  291. data/lib/stream_weaver/feed.rb +34 -0
  292. data/lib/stream_weaver/feed_builder.rb +31 -0
  293. data/lib/stream_weaver/fonts.rb +33 -0
  294. data/lib/stream_weaver/interaction_runner.rb +487 -0
  295. data/lib/stream_weaver/iterm.rb +460 -0
  296. data/lib/stream_weaver/layout_registry.rb +92 -0
  297. data/lib/stream_weaver/opal/bridge.rb +52 -0
  298. data/lib/stream_weaver/opal/builder.rb +193 -0
  299. data/lib/stream_weaver/opal/env.rb +29 -0
  300. data/lib/stream_weaver/opal/reactive_state.rb +75 -0
  301. data/lib/stream_weaver/opal/regexp_anchor_patch.rb +62 -0
  302. data/lib/stream_weaver/opal/renderer.rb +77 -0
  303. data/lib/stream_weaver/opal/runtime.rb +250 -0
  304. data/lib/stream_weaver/opal/shell.rb +145 -0
  305. data/lib/stream_weaver/opal/string_bridge.rb +50 -0
  306. data/lib/stream_weaver/opal/stubs/diff.min.js +1 -0
  307. data/lib/stream_weaver/opal/stubs/digest.rb +15 -0
  308. data/lib/stream_weaver/opal/stubs/marked.umd.js +79 -0
  309. data/lib/stream_weaver/opal/stubs/md5.rb +3 -0
  310. data/lib/stream_weaver/opal/stubs/morphdom.min.js +775 -0
  311. data/lib/stream_weaver/opal/stubs/prism-tomorrow.min.css +1 -0
  312. data/lib/stream_weaver/opal/stubs/prism.min.js +1967 -0
  313. data/lib/stream_weaver/opal_entry.rb +136 -0
  314. data/lib/stream_weaver/org/inline.rb +95 -0
  315. data/lib/stream_weaver/org/reader.rb +561 -0
  316. data/lib/stream_weaver/org/recording_context.rb +86 -0
  317. data/lib/stream_weaver/org/source_splitter.rb +63 -0
  318. data/lib/stream_weaver/org/writer.rb +300 -0
  319. data/lib/stream_weaver/page_shell.rb +530 -0
  320. data/lib/stream_weaver/portfile.rb +79 -0
  321. data/lib/stream_weaver/pushable.rb +42 -0
  322. data/lib/stream_weaver/resource/default_views.rb +111 -0
  323. data/lib/stream_weaver/resource/field_input.rb +25 -0
  324. data/lib/stream_weaver/resource/state_keys.rb +16 -0
  325. data/lib/stream_weaver/resource/store.rb +18 -0
  326. data/lib/stream_weaver/resource.rb +104 -0
  327. data/lib/stream_weaver/server.rb +1471 -0
  328. data/lib/stream_weaver/service.rb +1240 -0
  329. data/lib/stream_weaver/service_client.rb +104 -0
  330. data/lib/stream_weaver/session_store.rb +186 -0
  331. data/lib/stream_weaver/skills/streamweaver-canvas-safe/SKILL.md +66 -0
  332. data/lib/stream_weaver/skills/streamweaver-canvas-safe/examples/canvas-safe-showcase.rb +98 -0
  333. data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/actions-and-buttons.md +47 -0
  334. data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/charts-and-diagrams.md +38 -0
  335. data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/deck.md +32 -0
  336. data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/inputs-and-forms.md +65 -0
  337. data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/tabs-and-navigation.md +53 -0
  338. data/lib/stream_weaver/skills/streamweaver-doc-builder/SKILL.md +298 -0
  339. data/lib/stream_weaver/skills/streamweaver-visual-companion/SKILL.md +130 -0
  340. data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example.css +468 -0
  341. data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example.rb +39 -0
  342. data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example_dsl.rb +300 -0
  343. data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/doc-parity-example.rb +24 -0
  344. data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/doc-parity-example_dsl.rb +385 -0
  345. data/lib/stream_weaver/skills/streamweaver-visual-companion/references/checkpoints-and-forms.md +28 -0
  346. data/lib/stream_weaver/skills/streamweaver-visual-companion/references/cleanup-and-panel.md +44 -0
  347. data/lib/stream_weaver/skills/streamweaver-visual-companion/references/example-gallery.md +8 -0
  348. data/lib/stream_weaver/skills/streamweaver-visual-companion/references/persistence.md +58 -0
  349. data/lib/stream_weaver/skills/streamweaver-way/SKILL.md +396 -0
  350. data/lib/stream_weaver/skills/visual-plan/SKILL.md +201 -0
  351. data/lib/stream_weaver/skills/visual-recap/SKILL.md +244 -0
  352. data/lib/stream_weaver/streamer.rb +63 -0
  353. data/lib/stream_weaver/templates/choices.rb +149 -0
  354. data/lib/stream_weaver/templates/code.rb +157 -0
  355. data/lib/stream_weaver/templates/confirm.rb +110 -0
  356. data/lib/stream_weaver/templates/diff.rb +195 -0
  357. data/lib/stream_weaver/templates/info.rb +142 -0
  358. data/lib/stream_weaver/templates/table.rb +169 -0
  359. data/lib/stream_weaver/templates/wizard.rb +271 -0
  360. data/lib/stream_weaver/theme/auto_mode.rb +116 -0
  361. data/lib/stream_weaver/theme/presets.rb +555 -0
  362. data/lib/stream_weaver/theme.rb +639 -0
  363. data/lib/stream_weaver/university/canvas.rb +924 -0
  364. data/lib/stream_weaver/university/course.rb +699 -0
  365. data/lib/stream_weaver/university/demos/counter.rb +33 -0
  366. data/lib/stream_weaver/university/demos/dashboard.rb +147 -0
  367. data/lib/stream_weaver/university/demos/decision_form.rb +143 -0
  368. data/lib/stream_weaver/university/demos.rb +50 -0
  369. data/lib/stream_weaver/university/listener.rb +467 -0
  370. data/lib/stream_weaver/university/progress.rb +201 -0
  371. data/lib/stream_weaver/university/runner.rb +138 -0
  372. data/lib/stream_weaver/university/scripts/growing_doc.rb +609 -0
  373. data/lib/stream_weaver/university/scripts/growing_doc_state.rb +91 -0
  374. data/lib/stream_weaver/utils.rb +31 -0
  375. data/lib/stream_weaver/version.rb +5 -0
  376. data/lib/stream_weaver/views/canvas/reader_layout.erb +800 -0
  377. data/lib/stream_weaver/views.rb +3940 -0
  378. data/lib/stream_weaver.rb +122 -0
  379. data/llms.txt +1269 -0
  380. data/sig/stream_weaver.rbs +4 -0
  381. metadata +598 -0
@@ -0,0 +1,702 @@
1
+ # Visual Skills Implementation Tasks
2
+
3
+ *GSD Ralph-Loop Task Breakdown*
4
+ *Created: 2026-03-12*
5
+
6
+ ---
7
+
8
+ ## Task Index
9
+
10
+ | ID | Title | Phase | Deps | Est. Context |
11
+ |----|-------|-------|------|-------------|
12
+ | T1 | Generate-More Spike | 3 (spike) | none | ~40% |
13
+ | T2 | Theme Enhancement + CSS Foundation | 1 | none | ~35% |
14
+ | T3 | Mermaid Component | 1 | T2 | ~30% |
15
+ | T4 | CodeBlock + ImageBlock Components | 1 | T2 | ~30% |
16
+ | T5 | KeyboardShortcuts + SlideContainer | 1 | T2 | ~40% |
17
+ | T6 | Card Depth + Table Enhancement | 1 | T2 | ~30% |
18
+ | T7 | Design Deck Shell (DesignDeck + DeckSlide + DeckOption) | 2a | T5, T6 | ~45% |
19
+ | T8 | Deck Selection State + File-Backed State | 2b | T7 | ~40% |
20
+ | T9 | DeckSummary + ProgressBar Enhancement | 2c | T8 | ~35% |
21
+ | T10 | Generate-More Full Implementation | 3 | T1, T8 | ~45% |
22
+ | T11 | Explainer Components: SidebarToc + Callout + Comparison | 4 | T2, T6 | ~35% |
23
+ | T12 | Explainer Components: Pipeline + KpiDashboard + Chart | 4 | T2, T6 | ~35% |
24
+ | T13 | CSS-Only Helpers + HtmlExporter | 5 | T2 | ~30% |
25
+ | T14 | Deck Polish: ModelSelector + ConfirmationBar + CloseOverlay | 5 | T10 | ~35% |
26
+ | T15 | Theme Presets + Typography + Animations | 5 | T2 | ~30% |
27
+
28
+ ---
29
+
30
+ ## T1: Generate-More Spike
31
+
32
+ **Phase:** 3 (spike first -- highest risk)
33
+ **Dependencies:** None (standalone spike)
34
+ **Estimated context:** ~40%
35
+
36
+ ### Goal
37
+ Discover the generate-more state machine through implementation. This is the riskiest feature (agent-browser-agent loop with SSE push, polling, timeouts). Build the minimum viable version to learn what states and edge cases actually matter.
38
+
39
+ ### Scope
40
+ Create a standalone spike app (not in the gem yet) that demonstrates:
41
+ 1. Browser shows a "Generate More" button with prompt input
42
+ 2. Clicking sends a request to the server (queues a generate request)
43
+ 3. Server-side polling detects the request (simulating agent detection)
44
+ 4. Skeleton placeholders appear while "generating"
45
+ 5. New content pushes to state (push-to-state, not push-to-DOM)
46
+ 6. Page re-renders with new content replacing skeletons
47
+ 7. Timeout/cancellation path
48
+
49
+ ### Input Files (subagent reads these)
50
+ - `docs/visual-skills/design/architecture.md` (sections 7-8 on generate-more)
51
+ - `docs/visual-skills/design/review-synthesis.md` (push-to-state decision)
52
+ - `docs/visual-skills/design/gemini-review.md` (push-to-state rationale)
53
+ - `docs/visual-skills/analysis/components.md` (section 2.5-2.6)
54
+ - `lib/stream_weaver/pushable.rb` (existing SSE infrastructure)
55
+ - `lib/stream_weaver/app.rb` (how apps work)
56
+ - `lib/stream_weaver/server.rb` (Sinatra routes)
57
+
58
+ ### Output Files
59
+ - `examples/generate_more_spike/app.rb` -- standalone spike app
60
+ - `examples/generate_more_spike/README.md` -- findings document
61
+ - `docs/visual-skills/implementation/spike-findings.md` -- state machine discovered, edge cases found, decisions made
62
+
63
+ ### Acceptance Criteria
64
+ - [ ] Can click "Generate More" and see skeleton placeholders
65
+ - [ ] Simulated agent responds within 5s, skeletons replaced with content
66
+ - [ ] Timeout after 15s shows error toast
67
+ - [ ] Cancel button aborts pending generation
68
+ - [ ] State machine documented with actual states found (not predicted)
69
+ - [ ] Push-to-state pattern validated (not push-to-DOM)
70
+ - [ ] Findings doc written for T10 to consume
71
+
72
+ ### Notes
73
+ - Use `StreamWeaver::App` and `Pushable` as-is -- do not modify the gem
74
+ - Simulate agent behavior with a Thread.new that sleeps then pushes
75
+ - The spike is throwaway code -- T10 will do the real implementation
76
+ - Key question to answer: does `Pushable` SSE work for this, or do we need modifications?
77
+
78
+ ---
79
+
80
+ ## T2: Theme Enhancement + CSS Foundation
81
+
82
+ **Phase:** 1 (shared foundation)
83
+ **Dependencies:** None
84
+ **Estimated context:** ~35%
85
+
86
+ ### Goal
87
+ Establish the CSS custom property vocabulary and `sw-` prefix convention that all subsequent components depend on. Enhance the Theme module with auto-mode and the variable set needed by visual skills components.
88
+
89
+ ### Scope
90
+ - Extend existing Theme module with CSS custom properties: `--sw-bg`, `--sw-surface`, `--sw-surface-elevated`, `--sw-border`, `--sw-text`, `--sw-text-dim`, `--sw-accent`, semantic node colors (`--sw-node-a/b/c`), status colors
91
+ - Add auto-mode (follows OS `prefers-color-scheme`)
92
+ - Add `data-theme` attribute management on `<html>`
93
+ - Add `<meta name="theme-color">` management
94
+ - Add localStorage persistence for theme override
95
+ - Establish `sw-` CSS prefix convention in a shared stylesheet
96
+ - CDN helper for loading Google Fonts
97
+
98
+ ### Input Files
99
+ - `docs/visual-skills/analysis/components.md` (section 4.11 -- Theme enhancement)
100
+ - `docs/visual-skills/design/architecture.md` (section on theme)
101
+ - `lib/stream_weaver/theme.rb` (existing theme module)
102
+ - `lib/stream_weaver/adapter/alpinejs.rb` (how CDN scripts are loaded)
103
+
104
+ ### Output Files
105
+ - `lib/stream_weaver/theme.rb` -- enhanced
106
+ - `lib/stream_weaver/assets/css/sw-foundation.css` -- CSS custom properties, `sw-` prefixed base styles
107
+ - `lib/stream_weaver/assets/js/sw-theme.js` -- auto-mode, toggle, localStorage
108
+ - `spec/theme_spec.rb` -- tests for theme enhancements
109
+
110
+ ### Acceptance Criteria
111
+ - [ ] `--sw-*` custom properties defined for dark and light modes
112
+ - [ ] Auto-mode follows OS preference via `prefers-color-scheme`
113
+ - [ ] `data-theme` toggleable via JS function
114
+ - [ ] Theme persists in localStorage across page reloads
115
+ - [ ] `sw-` CSS prefix convention documented in code comments
116
+ - [ ] Existing StreamWeaver apps still work unchanged (backward compat)
117
+ - [ ] Tests pass
118
+
119
+ ---
120
+
121
+ ## T3: Mermaid Component
122
+
123
+ **Phase:** 1 (shared foundation)
124
+ **Dependencies:** T2 (needs CSS custom properties for theming)
125
+ **Estimated context:** ~30%
126
+
127
+ ### Goal
128
+ Implement the `mermaid` DSL method and component class. Both pi-design-deck and visual-explainer need Mermaid diagrams as a core building block.
129
+
130
+ ### Scope
131
+ - `Components::Mermaid` class in `components/mermaid.rb`
132
+ - DSL method `mermaid(code, **options)` in `DisplayDSL`
133
+ - Adapter rendering in `AlpineJS` adapter
134
+ - CDN loading for Mermaid.js (ESM, mermaid@11)
135
+ - Zoom/pan support when `zoom: true`
136
+ - Compact mode for embedding in cards
137
+ - Theme-aware: reads `data-theme` for Mermaid themeVariables
138
+ - ELK layout support via CDN module
139
+
140
+ ### Input Files
141
+ - `docs/visual-skills/analysis/components.md` (section 1.1)
142
+ - `docs/visual-skills/design/architecture.md` (component pattern)
143
+ - `lib/stream_weaver/components.rb` (existing component pattern)
144
+ - `lib/stream_weaver/display_dsl.rb` (existing DSL pattern)
145
+ - `lib/stream_weaver/adapter/alpinejs.rb` (adapter rendering pattern)
146
+
147
+ ### Output Files
148
+ - `lib/stream_weaver/components/mermaid.rb`
149
+ - `lib/stream_weaver/assets/js/sw-mermaid-zoom.js` (~200 lines)
150
+ - Updates to `lib/stream_weaver/display_dsl.rb`
151
+ - Updates to `lib/stream_weaver/adapter/alpinejs.rb`
152
+ - `spec/components/mermaid_spec.rb`
153
+
154
+ ### Acceptance Criteria
155
+ - [ ] `mermaid("graph LR; A-->B")` renders a Mermaid diagram
156
+ - [ ] `zoom: true` enables click-drag pan and Ctrl+scroll zoom
157
+ - [ ] `compact: true` renders minimal container for card embedding
158
+ - [ ] Dark/light theme switch updates Mermaid theme
159
+ - [ ] CDN loads lazily (only when mermaid component is used)
160
+ - [ ] Tests pass
161
+
162
+ ---
163
+
164
+ ## T4: CodeBlock + ImageBlock Components
165
+
166
+ **Phase:** 1 (shared foundation)
167
+ **Dependencies:** T2 (needs CSS custom properties)
168
+ **Estimated context:** ~30%
169
+
170
+ ### Goal
171
+ Implement syntax-highlighted code blocks and image display with captions. Both are used heavily by deck and explainer.
172
+
173
+ ### Scope
174
+ - `Components::CodeBlock` class with Prism.js highlighting
175
+ - `Components::ImageBlock` class with caption and base64 export support
176
+ - DSL methods: `code_block(code, **options)`, `image_block(src, **options)`
177
+ - CDN loading for Prism.js with autoloader
178
+ - File header display for code blocks
179
+ - Truncation mode for thumbnail previews
180
+
181
+ ### Input Files
182
+ - `docs/visual-skills/analysis/components.md` (sections 1.2, 1.9)
183
+ - `lib/stream_weaver/components.rb` (patterns)
184
+ - `lib/stream_weaver/display_dsl.rb` (DSL patterns)
185
+ - `lib/stream_weaver/adapter/alpinejs.rb` (adapter patterns)
186
+
187
+ ### Output Files
188
+ - `lib/stream_weaver/components/code_block.rb`
189
+ - `lib/stream_weaver/components/image_block.rb`
190
+ - Updates to `lib/stream_weaver/display_dsl.rb`
191
+ - Updates to `lib/stream_weaver/adapter/alpinejs.rb`
192
+ - `spec/components/code_block_spec.rb`
193
+ - `spec/components/image_block_spec.rb`
194
+
195
+ ### Acceptance Criteria
196
+ - [ ] `code_block("puts 'hi'", lang: "ruby")` renders highlighted code
197
+ - [ ] `code_block(code, file: "src/app.rb")` shows file path header
198
+ - [ ] `code_block(code, truncate: 10)` truncates to 10 lines
199
+ - [ ] `image_block("photo.png", caption: "Figure 1")` renders image with caption
200
+ - [ ] Prism.js CDN loads lazily
201
+ - [ ] Tests pass
202
+
203
+ ---
204
+
205
+ ## T5: KeyboardShortcuts + SlideContainer
206
+
207
+ **Phase:** 1 (shared foundation)
208
+ **Dependencies:** T2 (needs theme foundation)
209
+ **Estimated context:** ~40%
210
+
211
+ ### Goal
212
+ Implement the keyboard shortcut registry and slide container (both swap and scroll-snap modes). These are core navigation infrastructure for both deck and explainer.
213
+
214
+ ### Scope
215
+ - `Components::KeyboardShortcuts` -- centralized shortcut registry
216
+ - `Components::SlideContainer` -- container with `:swap` and `:scroll_snap` modes
217
+ - JS for keyboard handling with context awareness (suppress in inputs)
218
+ - JS for slide navigation (swap DOM, progress tracking)
219
+ - Arrow key / Space navigation
220
+ - Progress bar integration (fixed-position variant)
221
+
222
+ ### Input Files
223
+ - `docs/visual-skills/analysis/components.md` (sections 1.4, 1.6, 4.7)
224
+ - `docs/visual-skills/design/architecture.md`
225
+ - `lib/stream_weaver/components.rb`
226
+ - `lib/stream_weaver/display_dsl.rb`
227
+ - `lib/stream_weaver/adapter/alpinejs.rb`
228
+
229
+ ### Output Files
230
+ - `lib/stream_weaver/components/keyboard_shortcuts.rb`
231
+ - `lib/stream_weaver/components/slide_container.rb`
232
+ - `lib/stream_weaver/assets/js/sw-keyboard.js`
233
+ - `lib/stream_weaver/assets/js/sw-slide-nav.js`
234
+ - Updates to `lib/stream_weaver/display_dsl.rb`
235
+ - Updates to `lib/stream_weaver/adapter/alpinejs.rb`
236
+ - `spec/components/keyboard_shortcuts_spec.rb`
237
+ - `spec/components/slide_container_spec.rb`
238
+
239
+ ### Acceptance Criteria
240
+ - [ ] Keyboard shortcuts register and fire callbacks
241
+ - [ ] "mod" maps to Cmd on Mac, Ctrl elsewhere
242
+ - [ ] Shortcuts suppressed when focus is in text inputs
243
+ - [ ] SlideContainer `:swap` mode shows one slide at a time with Back/Next
244
+ - [ ] Arrow keys navigate between slides
245
+ - [ ] Fixed-position progress bar updates on navigation
246
+ - [ ] Tests pass
247
+
248
+ ---
249
+
250
+ ## T6: Card Depth + Table Enhancement
251
+
252
+ **Phase:** 1 (shared foundation)
253
+ **Dependencies:** T2 (needs CSS custom properties)
254
+ **Estimated context:** ~30%
255
+
256
+ ### Goal
257
+ Enhance existing `Card` and `Table` components with the features needed by visual skills. This avoids creating duplicate components (VeCard, DataTable) per the review decision.
258
+
259
+ ### Scope
260
+ - Add `depth:` option to `Card` (:hero, :elevated, :default, :recessed, :glass)
261
+ - Add `accent:` option to `Card` for colored left border
262
+ - Add `sticky_header:`, `alternating:`, `scrollable:`, `hover:` options to `Table`
263
+ - CSS for depth tiers (shadows, backgrounds, blur)
264
+ - CSS for table enhancements
265
+
266
+ ### Input Files
267
+ - `docs/visual-skills/analysis/components.md` (sections 4.1, 4.2)
268
+ - `docs/visual-skills/design/review-synthesis.md` (VeCard -> Card merge)
269
+ - `lib/stream_weaver/components.rb` (existing Card, Table classes)
270
+ - `lib/stream_weaver/adapter/alpinejs.rb`
271
+
272
+ ### Output Files
273
+ - Updates to `lib/stream_weaver/components.rb` (Card, Table classes)
274
+ - Updates to `lib/stream_weaver/assets/css/sw-foundation.css` (depth + table CSS)
275
+ - Updates to `lib/stream_weaver/adapter/alpinejs.rb` (if rendering changes needed)
276
+ - `spec/components/card_depth_spec.rb`
277
+ - `spec/components/table_enhanced_spec.rb`
278
+
279
+ ### Acceptance Criteria
280
+ - [ ] `card(depth: :hero)` renders hero-depth styling
281
+ - [ ] `card(depth: :glass)` renders glass morphism effect
282
+ - [ ] `card(accent: :a)` renders colored left border
283
+ - [ ] `table(headers: h, rows: r, sticky_header: true)` has sticky header
284
+ - [ ] `table(..., alternating: true)` has alternating row backgrounds
285
+ - [ ] `table(..., scrollable: true)` wraps in scrollable container
286
+ - [ ] Existing card/table usage unchanged (backward compat)
287
+ - [ ] Tests pass
288
+
289
+ ---
290
+
291
+ ## T7: Design Deck Shell (DesignDeck + DeckSlide + DeckOption)
292
+
293
+ **Phase:** 2a (slide navigation)
294
+ **Dependencies:** T5 (SlideContainer), T6 (Card depth)
295
+ **Estimated context:** ~45%
296
+
297
+ ### Goal
298
+ Build the core deck structure: a `design_deck` that contains `deck_slide`s, each with `deck_option` cards. No selection state yet -- just the visual shell with navigation.
299
+
300
+ ### Scope
301
+ - `Components::Deck::DesignDeck` -- orchestrator component
302
+ - `Components::Deck::DeckSlide` -- slide with option grid
303
+ - `Components::Deck::DeckOption` -- option card with preview content
304
+ - DSL methods: `design_deck`, `deck_slide`, `deck_option`
305
+ - Auto-detect grid columns from option count
306
+ - Integration with SlideContainer for navigation
307
+ - Notes textarea on each option (display only, no persistence yet)
308
+
309
+ ### Input Files
310
+ - `docs/visual-skills/analysis/components.md` (sections 2.1-2.3)
311
+ - `docs/visual-skills/design/architecture.md` (deck section)
312
+ - Output from T5 (SlideContainer)
313
+ - Output from T6 (Card depth)
314
+ - `lib/stream_weaver/components.rb`
315
+ - `lib/stream_weaver/display_dsl.rb`
316
+
317
+ ### Output Files
318
+ - `lib/stream_weaver/components/deck/design_deck.rb`
319
+ - `lib/stream_weaver/components/deck/deck_slide.rb`
320
+ - `lib/stream_weaver/components/deck/deck_option.rb`
321
+ - `lib/stream_weaver/assets/css/sw-deck.css`
322
+ - `lib/stream_weaver/assets/js/sw-deck-selection.js`
323
+ - Updates to `lib/stream_weaver/display_dsl.rb` (or `app.rb` for interactive DSL)
324
+ - `spec/components/deck/design_deck_spec.rb`
325
+
326
+ ### Acceptance Criteria
327
+ - [ ] `design_deck("Title") { deck_slide("s1", "Slide") { deck_option("A") { text "..." } } }` renders
328
+ - [ ] Multiple slides navigable via Back/Next buttons
329
+ - [ ] Option cards display in auto-detected grid (2 options -> 2 cols, 3+ -> 3 cols)
330
+ - [ ] Option cards show preview content from block
331
+ - [ ] Notes textarea renders on each option
332
+ - [ ] Tests pass
333
+
334
+ ---
335
+
336
+ ## T8: Deck Selection State + File-Backed State
337
+
338
+ **Phase:** 2b (selection + persistence)
339
+ **Dependencies:** T7 (deck shell)
340
+ **Estimated context:** ~40%
341
+
342
+ ### Goal
343
+ Add selection behavior to deck options and persist state to files. This is the core interactivity: users click options, write notes, and the state survives page reloads.
344
+
345
+ ### Scope
346
+ - Click-to-select behavior on `DeckOption` (radio semantics per slide)
347
+ - Visual selection indicators (accent border, checkmark badge)
348
+ - ARIA: `role="radiogroup"`, `role="radio"`, `aria-checked`
349
+ - Number key quick-select (1-9)
350
+ - File-backed state storage (`DeckState` class)
351
+ - JSON file per session in tmp directory
352
+ - Notes persistence (textarea content saved to state file)
353
+ - Session ID generation and cookie tracking
354
+
355
+ ### Input Files
356
+ - `docs/visual-skills/design/review-synthesis.md` (file-backed state decision)
357
+ - `docs/visual-skills/analysis/components.md` (sections 2.3, 4.8)
358
+ - `docs/visual-skills/design/architecture.md` (state management section)
359
+ - Output from T7 (deck components)
360
+ - `lib/stream_weaver/server.rb` (route patterns)
361
+
362
+ ### Output Files
363
+ - `lib/stream_weaver/components/deck/deck_state.rb`
364
+ - Updates to `lib/stream_weaver/components/deck/deck_option.rb` (selection behavior)
365
+ - Updates to `lib/stream_weaver/assets/js/sw-deck-selection.js`
366
+ - Updates to `lib/stream_weaver/server.rb` (state persistence routes)
367
+ - `spec/components/deck/deck_state_spec.rb`
368
+ - `spec/components/deck/deck_selection_spec.rb`
369
+
370
+ ### Acceptance Criteria
371
+ - [ ] Clicking an option selects it (accent border, checkmark)
372
+ - [ ] Only one option selected per slide (radio semantics)
373
+ - [ ] Number keys 1-9 select options
374
+ - [ ] Selection state persists in JSON file
375
+ - [ ] Notes text persists in JSON file
376
+ - [ ] State survives page reload
377
+ - [ ] ARIA attributes correct (`aria-checked`, roles)
378
+ - [ ] Tests pass
379
+
380
+ ---
381
+
382
+ ## T9: DeckSummary + ProgressBar Enhancement
383
+
384
+ **Phase:** 2c (summary)
385
+ **Dependencies:** T8 (selection state)
386
+ **Estimated context:** ~35%
387
+
388
+ ### Goal
389
+ Build the auto-generated summary slide and enhance the progress bar for deck navigation.
390
+
391
+ ### Scope
392
+ - `Components::Deck::DeckSummary` -- auto-generated final slide
393
+ - Summary cards showing: selected option, preview thumbnail, notes
394
+ - Submit button gated on all selections complete
395
+ - "Still need: X, Y" message when incomplete
396
+ - Submit state (locks deck after submission)
397
+ - Enhanced `ProgressBar` with `position: :fixed` variant
398
+
399
+ ### Input Files
400
+ - `docs/visual-skills/analysis/components.md` (sections 2.4, 4.7)
401
+ - Output from T8 (DeckState)
402
+ - Output from T7 (deck shell)
403
+
404
+ ### Output Files
405
+ - `lib/stream_weaver/components/deck/deck_summary.rb`
406
+ - Updates to `lib/stream_weaver/components.rb` (ProgressBar enhancement)
407
+ - `spec/components/deck/deck_summary_spec.rb`
408
+
409
+ ### Acceptance Criteria
410
+ - [ ] Summary slide auto-generated as last slide
411
+ - [ ] Shows selected option per slide with label and truncated preview
412
+ - [ ] Shows user notes per slide
413
+ - [ ] Submit button disabled when selections incomplete
414
+ - [ ] "Still need: Slide X, Slide Y" shown when incomplete
415
+ - [ ] Submit locks the deck into submitted state
416
+ - [ ] Fixed-position progress bar tracks slide position
417
+ - [ ] Tests pass
418
+
419
+ ---
420
+
421
+ ## T10: Generate-More Full Implementation
422
+
423
+ **Phase:** 3 (full implementation)
424
+ **Dependencies:** T1 (spike findings), T8 (deck state)
425
+ **Estimated context:** ~45%
426
+
427
+ ### Goal
428
+ Implement generate-more as a production-quality gem feature, using the state machine and edge cases discovered in the T1 spike.
429
+
430
+ ### Scope
431
+ - `Components::Deck::GenerateMoreControls` -- prompt, count, generate button
432
+ - `Components::Deck::SkeletonPlaceholder` -- shimmer loading cards
433
+ - Push-to-state pattern (Gemini's insight): new options written to DeckState, re-render
434
+ - Polling endpoint for agent to detect generate requests
435
+ - Timeout handling (15s default)
436
+ - Server routes for generate request queue
437
+ - Integration with `Pushable` SSE for push notifications
438
+
439
+ ### Input Files
440
+ - `docs/visual-skills/implementation/spike-findings.md` (T1 output -- critical)
441
+ - `docs/visual-skills/analysis/components.md` (sections 2.5, 2.6)
442
+ - `docs/visual-skills/design/review-synthesis.md` (push-to-state decision)
443
+ - Output from T8 (DeckState, file-backed state)
444
+ - `lib/stream_weaver/pushable.rb`
445
+ - `lib/stream_weaver/server.rb`
446
+
447
+ ### Output Files
448
+ - `lib/stream_weaver/components/deck/generate_more_controls.rb`
449
+ - `lib/stream_weaver/components/deck/skeleton_placeholder.rb`
450
+ - Updates to `lib/stream_weaver/components/deck/deck_state.rb` (generate queue)
451
+ - Updates to `lib/stream_weaver/server.rb` (generate routes)
452
+ - `lib/stream_weaver/assets/js/sw-generate-more.js`
453
+ - `spec/components/deck/generate_more_spec.rb`
454
+
455
+ ### Acceptance Criteria
456
+ - [ ] Generate button sends request with prompt and count
457
+ - [ ] Skeleton placeholders appear during generation
458
+ - [ ] New options arrive via push-to-state and render correctly
459
+ - [ ] Timeout after configured duration shows error
460
+ - [ ] Cancel button aborts pending generation
461
+ - [ ] Polling endpoint returns pending generate requests
462
+ - [ ] Agent can poll, "generate," and push results
463
+ - [ ] Edge cases from spike findings are handled
464
+ - [ ] Tests pass
465
+
466
+ ---
467
+
468
+ ## T11: Explainer Components: SidebarToc + Callout + Comparison
469
+
470
+ **Phase:** 4 (visual explainer)
471
+ **Dependencies:** T2 (theme), T6 (card depth)
472
+ **Estimated context:** ~35%
473
+
474
+ ### Goal
475
+ Build the first batch of visual-explainer-specific components.
476
+
477
+ ### Scope
478
+ - `Components::SidebarToc` -- sticky sidebar with scroll spy (IntersectionObserver)
479
+ - `Components::Callout` -- bordered info/warning/tip box (not dismissible, unlike Alert)
480
+ - `Components::Comparison` -- side-by-side diff panels (before/after)
481
+ - Mobile responsive: SidebarToc collapses to horizontal bar, Comparison stacks
482
+
483
+ ### Input Files
484
+ - `docs/visual-skills/analysis/components.md` (sections 3.6, 3.8, 3.5)
485
+ - `lib/stream_weaver/components.rb`
486
+ - `lib/stream_weaver/display_dsl.rb`
487
+ - `lib/stream_weaver/adapter/alpinejs.rb`
488
+
489
+ ### Output Files
490
+ - `lib/stream_weaver/components/sidebar_toc.rb`
491
+ - `lib/stream_weaver/components/callout.rb`
492
+ - `lib/stream_weaver/components/comparison.rb`
493
+ - `lib/stream_weaver/assets/js/sw-scroll-spy.js`
494
+ - Updates to `lib/stream_weaver/display_dsl.rb`
495
+ - `spec/components/sidebar_toc_spec.rb`
496
+ - `spec/components/callout_spec.rb`
497
+ - `spec/components/comparison_spec.rb`
498
+
499
+ ### Acceptance Criteria
500
+ - [ ] `sidebar_toc(sections: [...])` renders sticky sidebar with links
501
+ - [ ] Scroll spy highlights active section
502
+ - [ ] `callout(variant: :warning) { text "..." }` renders bordered box
503
+ - [ ] `comparison(before_label: "Old", after_label: "New") { ... }` renders side-by-side
504
+ - [ ] Comparison stacks vertically on narrow viewports
505
+ - [ ] Tests pass
506
+
507
+ ---
508
+
509
+ ## T12: Explainer Components: Pipeline + KpiDashboard + Chart
510
+
511
+ **Phase:** 4 (visual explainer)
512
+ **Dependencies:** T2 (theme), T6 (card depth)
513
+ **Estimated context:** ~35%
514
+
515
+ ### Goal
516
+ Build the remaining visual-explainer-specific components.
517
+
518
+ ### Scope
519
+ - `Components::Pipeline` -- horizontal step flow with arrow connectors
520
+ - `Components::KpiDashboard` -- auto-fit grid of stat cards with animation
521
+ - `Components::Chart` -- Chart.js wrapper (bar, line, pie, doughnut, radar)
522
+ - CDN loading for Chart.js
523
+ - Dark mode awareness for chart colors
524
+
525
+ ### Input Files
526
+ - `docs/visual-skills/analysis/components.md` (sections 3.4, 3.2, 3.7)
527
+ - `lib/stream_weaver/components.rb` (StatDisplay for KpiDashboard)
528
+ - `lib/stream_weaver/display_dsl.rb`
529
+ - `lib/stream_weaver/adapter/alpinejs.rb`
530
+
531
+ ### Output Files
532
+ - `lib/stream_weaver/components/pipeline.rb`
533
+ - `lib/stream_weaver/components/kpi_dashboard.rb`
534
+ - `lib/stream_weaver/components/chart.rb`
535
+ - Updates to `lib/stream_weaver/display_dsl.rb`
536
+ - `spec/components/pipeline_spec.rb`
537
+ - `spec/components/kpi_dashboard_spec.rb`
538
+ - `spec/components/chart_spec.rb`
539
+
540
+ ### Acceptance Criteria
541
+ - [ ] `pipeline(steps: [...])` renders horizontal flow with arrows
542
+ - [ ] Pipeline collapses to vertical on mobile
543
+ - [ ] `kpi_dashboard(metrics: [...])` renders auto-fit grid of stat cards
544
+ - [ ] KPI cards animate on appearance (fadeScale)
545
+ - [ ] `chart(type: :bar, data: {...})` renders Chart.js chart
546
+ - [ ] Charts respect dark/light theme
547
+ - [ ] Chart.js CDN loads lazily
548
+ - [ ] Tests pass
549
+
550
+ ---
551
+
552
+ ## T13: CSS-Only Helpers + HtmlExporter
553
+
554
+ **Phase:** 5 (polish)
555
+ **Dependencies:** T2 (CSS foundation)
556
+ **Estimated context:** ~30%
557
+
558
+ ### Goal
559
+ Implement the CSS-only DSL helpers (no component classes, just `div` wrappers) and the HTML export pipeline.
560
+
561
+ ### Scope
562
+ - DSL helpers: `hero`, `prose`, `pullquote`, `dir_tree`, `legend`, `flow_arrow`, `layout_toggle`
563
+ - Each is a thin DSL method that wraps content in a `div` with CSS classes
564
+ - `HtmlExporter` -- serializes StreamWeaver page to self-contained HTML
565
+ - Inlines CSS, preserves CDN links, optional base64 images
566
+
567
+ ### Input Files
568
+ - `docs/visual-skills/analysis/components.md` (sections 3.12-3.15, 3.10-3.11, 1.5)
569
+ - `lib/stream_weaver/display_dsl.rb`
570
+
571
+ ### Output Files
572
+ - Updates to `lib/stream_weaver/display_dsl.rb` (helper methods)
573
+ - `lib/stream_weaver/assets/css/sw-helpers.css`
574
+ - `lib/stream_weaver/export/html_exporter.rb`
575
+ - `spec/export/html_exporter_spec.rb`
576
+ - `spec/css_helpers_spec.rb`
577
+
578
+ ### Acceptance Criteria
579
+ - [ ] `hero { header1 "Title" }` wraps in hero-styled div
580
+ - [ ] `prose { md "Long form text..." }` wraps in reading-optimized container
581
+ - [ ] `pullquote("Quote text", attribution: "Author")` renders styled quote
582
+ - [ ] `dir_tree("src/\n app.rb")` renders monospace file tree
583
+ - [ ] HtmlExporter produces valid self-contained HTML file
584
+ - [ ] Exported HTML opens correctly in browser without server
585
+ - [ ] Tests pass
586
+
587
+ ---
588
+
589
+ ## T14: Deck Polish: ModelSelector + ConfirmationBar + CloseOverlay
590
+
591
+ **Phase:** 5 (polish)
592
+ **Dependencies:** T10 (generate-more)
593
+ **Estimated context:** ~35%
594
+
595
+ ### Goal
596
+ Complete the deck's secondary UI components.
597
+
598
+ ### Scope
599
+ - `Components::Deck::ModelSelector` -- model picker with provider filter pills
600
+ - `Components::Deck::ConfirmationBar` -- fixed top bar with confirm/cancel
601
+ - `Components::Deck::CloseOverlay` -- full-screen status overlay
602
+ - Auto-close tab behavior
603
+
604
+ ### Input Files
605
+ - `docs/visual-skills/analysis/components.md` (sections 2.7-2.9)
606
+ - Output from T10 (GenerateMoreControls)
607
+
608
+ ### Output Files
609
+ - `lib/stream_weaver/components/deck/model_selector.rb`
610
+ - `lib/stream_weaver/components/deck/confirmation_bar.rb`
611
+ - `lib/stream_weaver/components/deck/close_overlay.rb`
612
+ - `spec/components/deck/model_selector_spec.rb`
613
+ - `spec/components/deck/confirmation_bar_spec.rb`
614
+ - `spec/components/deck/close_overlay_spec.rb`
615
+
616
+ ### Acceptance Criteria
617
+ - [ ] ModelSelector shows provider pills and model list
618
+ - [ ] ModelSelector hidden when fewer than 2 models
619
+ - [ ] ConfirmationBar slides down with confirm/cancel buttons
620
+ - [ ] ConfirmationBar auto-hides after timeout
621
+ - [ ] CloseOverlay shows full-screen status with backdrop blur
622
+ - [ ] CloseOverlay auto-closes tab after 800ms
623
+ - [ ] Tests pass
624
+
625
+ ---
626
+
627
+ ## T15: Theme Presets + Typography + Animations
628
+
629
+ **Phase:** 5 (polish)
630
+ **Dependencies:** T2 (theme foundation)
631
+ **Estimated context:** ~30%
632
+
633
+ ### Goal
634
+ Add the curated theme presets and animation choreography.
635
+
636
+ ### Scope
637
+ - 2 theme presets: `:editorial` (Instrument Serif + Terracotta), `:technical` (DM Sans + Teal)
638
+ - `theme_preset(name:)` DSL method
639
+ - Google Fonts CDN loading per preset
640
+ - Animation utilities: fadeScale, stagger reveals, shimmer
641
+ - CSS transitions for slide swaps
642
+
643
+ ### Input Files
644
+ - `docs/visual-skills/analysis/components.md` (section 3.19)
645
+ - Output from T2 (theme foundation)
646
+
647
+ ### Output Files
648
+ - `lib/stream_weaver/theme/presets.rb`
649
+ - `lib/stream_weaver/assets/css/sw-presets.css`
650
+ - `lib/stream_weaver/assets/css/sw-animations.css`
651
+ - Updates to `lib/stream_weaver/display_dsl.rb`
652
+ - `spec/theme/presets_spec.rb`
653
+
654
+ ### Acceptance Criteria
655
+ - [ ] `theme_preset(:editorial)` loads Instrument Serif + JetBrains Mono fonts
656
+ - [ ] `theme_preset(:technical)` loads DM Sans + Fira Code fonts
657
+ - [ ] Preset applies CSS custom properties for colors and typography
658
+ - [ ] fadeScale animation utility available via CSS class
659
+ - [ ] Stagger animation for KPI cards and grid items
660
+ - [ ] Tests pass
661
+
662
+ ---
663
+
664
+ ## Dependency Graph
665
+
666
+ ```
667
+ T1 (spike) ─────────────────────────────────┐
668
+
669
+ T2 (theme) ──┬── T3 (mermaid) │
670
+ ├── T4 (codeblock+image) │
671
+ ├── T5 (keyboard+slides) ──┐ │
672
+ ├── T6 (card+table) ──────┤ │
673
+ ├── T11 (explainer batch1) │ │
674
+ ├── T12 (explainer batch2) │ │
675
+ ├── T13 (css helpers) │ │
676
+ └── T15 (presets) │ │
677
+ │ │
678
+ T7 (deck shell) ────┘ │
679
+ │ │
680
+ T8 (selection+state) ────┤
681
+ │ │
682
+ T9 (summary) ────────┐ │
683
+ │ │
684
+ T10 (generate-more) ──┘───┘
685
+
686
+ T14 (deck polish)
687
+ ```
688
+
689
+ ## Parallelization Opportunities
690
+
691
+ These tasks can run in parallel if multiple subagents are available:
692
+
693
+ - **Parallel group A** (after T2): T3, T4, T6, T11, T12, T13, T15
694
+ - **Parallel group B** (after T5+T6): T7 can start
695
+ - **T1 runs independently** from the start, in parallel with everything
696
+
697
+ ## Total Estimated Effort
698
+
699
+ - 15 tasks
700
+ - ~525% cumulative context (across all tasks)
701
+ - ~32 component classes + ~7 CSS helpers
702
+ - Critical path: T2 -> T5 -> T7 -> T8 -> T10 (with T1 in parallel)