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,55 @@
1
+ # Gemini Review Assessment
2
+
3
+ *Date: 2026-03-12*
4
+ *Gemini CLI run from stream_weaver root with full file access*
5
+
6
+ ## Gemini's Points and Our Assessment
7
+
8
+ ### Point 1: Three-Party "Hanging" Problem — RIGHT
9
+ Tab-close leaves `run_once!` hanging. "Shimmering death" (skeletons that never resolve) is real.
10
+ Stale request scoping to session ID is a good catch neither prior reviewer raised.
11
+ **Action:** Design cancellation path. `run_once!` needs timeout/heartbeat abort. Session-scope requests.
12
+
13
+ ### Point 2: DSL Rigidity "Visual Wall" — HALF-RIGHT
14
+ Agents will occasionally need precise layout control. But escape hatch already exists:
15
+ `div(style: "position: relative; top: 20px") { mermaid "..." }`.
16
+ **Action:** Document `div(style:)` as the explicit escape hatch. No new component needed.
17
+
18
+ ### Point 3: Token Efficiency "Context Bloat" — WRONG
19
+ Gemini's math is off. Current: agent reads ~30K tokens of reference material. With DSL: ~2-3K tokens of
20
+ DSL reference. Net savings of 25K+ input tokens. Retry costs (~500 tokens) are dwarfed by savings.
21
+ Structured DSL is MORE debuggable than raw HTML, not less.
22
+ **No action needed.** 80-85% claim holds.
23
+
24
+ ### Point 4: "Phantom Option" Race Condition — GOOD CATCH
25
+ User requests options for Slide A, navigates to Slide B, options arrive for Slide A.
26
+ Neither prior reviewer caught this specific race condition.
27
+ **Action:** Address in generate-more spike. Push to state, re-render on navigate-back.
28
+
29
+ ### Point 5: Push-to-State Not Push-to-DOM — BEST INSIGHT
30
+ Instead of SSE pushing HTML snippets to DOM targets, push new options to server-side state
31
+ and let StreamWeaver's reactive re-render handle display. This:
32
+ - Eliminates phantom option problem
33
+ - Keeps summary slide in sync automatically
34
+ - Aligns with StreamWeaver's existing reactive model
35
+ - Is simpler than SSE-to-DOM approach
36
+ **Action:** Revise generate-more architecture to push-to-state. Significant improvement.
37
+
38
+ Disagree with "JSON-over-HTTP as primary protocol" — DSL is right for Ruby-capable agents.
39
+ JSON API is the secondary protocol (already planned for Phase 5 per Codex review).
40
+
41
+ ### Point 6: Component Rot — MOSTLY WRONG
42
+ StreamWeaver is a bounded DSL for agent-to-browser communication, not a general-purpose UI framework.
43
+ "Interactive maps" and "multi-step forms" are out of scope. CSS changes don't require DSL changes.
44
+ Theme presets can be added without touching components.
45
+ **No action needed** beyond keeping component set focused.
46
+
47
+ ## Changes to Incorporate
48
+
49
+ | Point | Action | Priority |
50
+ |---|---|---|
51
+ | Tab-close cancellation | Design heartbeat + abort for `run_once!` | High (spike) |
52
+ | Session-scoped requests | Scope generate queue to session ID | High (spike) |
53
+ | Escape hatch docs | Document `div(style:)` pattern | Medium (Phase 1) |
54
+ | Phantom option race | Address in spike | High (spike) |
55
+ | Push-to-state | Revise generate-more to push state not DOM | High (architecture change) |
@@ -0,0 +1,149 @@
1
+ # Review Synthesis: DHH + Codex Second Opinion
2
+
3
+ ## Verdict
4
+ Both reviewers approve the architecture. "Fundamentally sound" (DHH). "Solid" (Codex).
5
+ The DSL design is the strongest element — both reviewers independently praised it.
6
+
7
+ ---
8
+
9
+ ## Where Both Reviewers Agree
10
+
11
+ ### 1. Merge redundant components
12
+ - **VeCard → Card** with `depth:` option
13
+ - **DataTable → Table** with `sticky_header:`, `alternating:`, `scrollable:` options
14
+ - **ProgressIndicator → progress_bar** with `position: :fixed` variant
15
+ **Action:** Reduce component count from ~50 to ~35. Collapse CSS-only wrappers.
16
+
17
+ ### 2. DSL reads beautifully
18
+ Both independently called out Section 10 examples as excellent. "Reads like prose" (DHH).
19
+ "DSL-first approach is well-reasoned" (Codex). No changes needed here.
20
+
21
+ ### 3. Flat namespace is correct
22
+ Both approve. Shared components alongside existing ones. Deck subsystem namespaced.
23
+
24
+ ### 4. Design deck as DSL methods, not subclass
25
+ Both approve. `design_deck` is like `tabs` or `modal`.
26
+
27
+ ### 5. All 9 open questions mostly well-answered
28
+ DHH: "All nine recommendations are sound."
29
+ Codex: "Agree on 7 of 9" (disagrees on Q1 and partially on Q9).
30
+
31
+ ### 6. Phase 1 (shared foundation) is correctly prioritized
32
+ Both agree: Mermaid, CodeBlock, theme enhancements first.
33
+
34
+ ### 7. Polling for generate-more is acceptable
35
+ Both agree polling is fine for an operation that takes 5-15 seconds.
36
+ Codex suggests long-polling as documented future optimization.
37
+
38
+ ---
39
+
40
+ ## Where They Differ
41
+
42
+ ### State Management (Q1)
43
+ - **DHH:** "Start with server session (A). Do not prematurely optimize."
44
+ - **Codex:** "Start with file-backed state (B) from day one. Cookie overflow is when-not-if."
45
+ - **Resolution:** Codex is right here. User-generated notes make cookie overflow likely with 5+ slides. File-backed state is trivially harder to implement but avoids a painful mid-stream migration. **Go with (B).**
46
+
47
+ ### Generate-More Complexity
48
+ - **DHH:** "Kill the state machine. Queue, poll, push. Three steps."
49
+ - **Codex:** "The state machine is too simple — missing CANCELLED, ERROR, PARTIAL states."
50
+ - **Resolution:** Both are right from different angles. DHH says don't over-plan it; Codex says don't under-plan it. **Compromise: spike it first** (Codex's recommendation). The spike will reveal which edge cases matter. Don't design the state machine on paper — discover it through implementation.
51
+
52
+ ### Component Count
53
+ - **DHH:** "Cut by 40%. A div with a CSS class is still a div."
54
+ - **Codex:** "Slightly high but defensible. 50 is manageable."
55
+ - **Resolution:** **DHH is right.** Merge the CSS-only wrappers. The bar for a new component class should be "does it have behavior or state?" not "does it have styling?" Target ~30-35 components.
56
+
57
+ ### Skill Entry Points (Section 6.5)
58
+ - **DHH:** "Kill them. The DSL is the API."
59
+ - **Codex:** "Start with Claude Code custom commands (option C)."
60
+ - **Resolution:** **DHH is right for the gem itself** — no Skill classes in StreamWeaver. **Codex is right for the agent integration** — custom commands are the right glue layer, living outside the gem.
61
+
62
+ ---
63
+
64
+ ## New Issues Raised (Codex Only)
65
+
66
+ ### Must Address Before Implementation
67
+ 1. **`beforeunload` / tab-close cancellation** — if user closes tab, `run_once!` hangs forever. Need a cancellation path. Critical.
68
+ 2. **State ownership table** — document what state lives where (server/client/localStorage) and how it syncs. Essential for implementation clarity.
69
+ 3. **Agent process lifecycle** — heartbeat, crash recovery, clean shutdown of polling thread when `run_once!` resolves.
70
+ 4. **CSS naming convention** — enforce `sw-` prefix, define specificity rules before 35 components ship.
71
+
72
+ ### Should Address (Medium Priority)
73
+ 5. **Accessibility requirements** — `aria-live`, `aria-current`, `aria-busy` for key components.
74
+ 6. **Scalability section** — soft limits (10 slides, 50 files) and hard limits (20 slides, 200 files).
75
+ 7. **Phase 2 splitting** — 2a (slide nav), 2b (deck+selection), 2c (summary). Incremental validation.
76
+ 8. **Integration test checkpoints** between phases.
77
+ 9. **Double-submit prevention.**
78
+
79
+ ### Can Defer (Low Priority)
80
+ 10. **JSON-over-HTTP API** — secondary protocol for non-Ruby agents. Phase 5.
81
+ 11. **Long-polling optimization** — document as future path.
82
+ 12. **CDN fallback / offline degradation.**
83
+ 13. **Touch/swipe navigation.**
84
+
85
+ ---
86
+
87
+ ## Revised Architecture Changes
88
+
89
+ Based on both reviews, the architecture should be updated:
90
+
91
+ ### Component Changes
92
+ | Original | Revised | Rationale |
93
+ |----------|---------|-----------|
94
+ | VeCard | Card with `depth:` option | DHH + Codex agree |
95
+ | DataTable | Table with `sticky_header:` etc. | DHH + Codex agree |
96
+ | ProgressIndicator | progress_bar with `position: :fixed` | DHH |
97
+ | HeroSection | div with CSS class via `hero` DSL helper | DHH |
98
+ | Prose | div with CSS class | DHH |
99
+ | Pullquote | div with CSS class | DHH |
100
+ | FlowArrow | CSS-only, no component class | DHH |
101
+ | Legend | CSS-only, no component class | DHH |
102
+ | DesignDeckSkill | Removed (DSL is API) | DHH |
103
+ | VisualExplainerSkill | Removed (DSL is API) | DHH |
104
+
105
+ ### State Management Change
106
+ - Cookie session → File-backed state (write JSON to temp file per session)
107
+ - Implement `DeckState` object abstracting storage backend (Codex)
108
+
109
+ ### Generate-More Change
110
+ - Spike before designing state machine
111
+ - Phase 3 becomes "spike + implement based on findings"
112
+
113
+ ### New Documentation Sections
114
+ - State ownership table
115
+ - CSS naming convention (`sw-` prefix)
116
+ - Accessibility requirements
117
+ - Scalability limits
118
+ - Agent lifecycle (heartbeat, crash, shutdown)
119
+
120
+ ### Phase Refinement
121
+ - Phase 2 → 2a/2b/2c (incremental validation)
122
+ - Phase 5 → 5a/5b (utility components vs workflow features)
123
+ - Add integration test checkpoints
124
+
125
+ ---
126
+
127
+ ## Revised Component Count: ~32
128
+
129
+ ### Shared (8, down from 9)
130
+ Mermaid, CodeBlock, ImageBlock, SlideContainer, KeyboardShortcuts,
131
+ Toast, HtmlExporter, Chart
132
+
133
+ ### Deck (9, down from 10)
134
+ DesignDeck, DeckSlide, DeckOption, DeckSummary,
135
+ GenerateMoreControls, SkeletonPlaceholder, ModelSelector,
136
+ ConfirmationBar, CloseOverlay
137
+
138
+ ### Explainer-specific (5, down from 19)
139
+ SidebarToc, Comparison, Pipeline, Callout, KpiDashboard
140
+
141
+ ### Enhanced existing (10, down from 12)
142
+ Card (+depth), Table (+sticky/alternating/scrollable),
143
+ Grid, Alert, StatDisplay, Collapsible, ProgressBar (+fixed),
144
+ RadioGroup, Theme (+presets/auto), AlpineJS adapter
145
+
146
+ ### CSS-only helpers (no component class, just DSL methods wrapping div)
147
+ hero, prose, pullquote, dir_tree, legend, flow_arrow, layout_toggle
148
+
149
+ **Total: ~32 component classes + ~7 CSS helpers = ~39 DSL methods**
@@ -0,0 +1,22 @@
1
+ # Implementation State
2
+
3
+ ## Current Wave: COMPLETE
4
+ ## Status: ALL 15 TASKS DONE — 1427 tests, 0 failures
5
+
6
+ | Task | Status | Commit | Notes |
7
+ |------|--------|--------|-------|
8
+ | T1 | DONE | -- | Generate-more spike - push-to-state validated |
9
+ | T2 | DONE | -- | Theme + CSS foundation |
10
+ | T3 | DONE | -- | Mermaid component with zoom/pan, compact, ELK, theme-aware |
11
+ | T4 | DONE | -- | CodeBlock (Prism.js CDN, file header, truncation) + ImageBlock (caption, base64 export) |
12
+ | T5 | DONE | -- | KeyboardShortcuts (mod mapping, context suppression) + SlideContainer (swap/scroll_snap, progress bar, nav dots, counter, arrow key nav) |
13
+ | T6 | DONE | -- | Card depth/accent/label + Table alternating/scrollable/hover enhancements |
14
+ | T7 | DONE | -- | DesignDeck + DeckSlide + DeckOption shell with SlideContainer swap, auto-columns, ARIA, notes textarea |
15
+ | T8 | DONE | -- | DeckState file-backed store, selection + notes persistence, ARIA, number-key quick-select, selection JS/CSS |
16
+ | T9 | DONE | -- | DeckSummary auto-appended, selection/notes display, submit gating, final notes, submit sets _result for run_once!, fixed progress bar, sw- CSS |
17
+ | T10 | DONE | -- | Generate-more full implementation: GenerateMoreControls + SkeletonPlaceholder components, DeckState generate queue, 4-state machine (idle/generating/timed_out/cancelled), request versioning, server routes (generate/pending/add_option/cancel), push-to-state with SSE re-render, 56 tests |
18
+ | T11 | DONE | -- | SidebarToc (sticky sidebar, scroll spy, mobile horizontal bar) + Callout (5 variants, icon, colored border) + Comparison (side-by-side panels, responsive stacking) |
19
+ | T12 | DONE | -- | Pipeline (horizontal flow, arrow connectors, responsive vertical, status colors) + KpiDashboard (auto-fit grid, fadeIn animation, trend arrows, color accents) + Chart (Chart.js 4 CDN lazy load, bar/line/pie/doughnut/radar, dark mode aware) |
20
+ | T13 | DONE | -- | 7 CSS-only helpers (hero, prose, pullquote, dir_tree, legend, flow_arrow, layout_toggle) + HtmlExporter (self-contained HTML export, CDN collection, inline CSS, base64 images), 80 tests |
21
+ | T14 | DONE | -- | ModelSelector (provider filter pills, model list, DeckState persistence, visibility gating), ConfirmationBar (fixed top bar, slide-down animation, auto-hide timer, confirm/cancel buttons), CloseOverlay (full-screen blur backdrop, submitted/cancelled status, auto-close tab, countdown), server route /deck/set_model, sw- CSS prefix, 46 tests |
22
+ | T15 | DONE | -- | 5 theme presets (editorial/technical/warm/minimal/terminal), theme_preset DSL, Google Fonts injection, CSS animations (fadeIn/slideUp/fadeScale/shimmer/slideDown), stagger delays, slide transitions, prefers-reduced-motion, 104 tests |
@@ -0,0 +1,347 @@
1
+ # Visual Skills Implementation Plan
2
+
3
+ *GSD Ralph-Loop Orchestration*
4
+ *Created: 2026-03-12*
5
+
6
+ ---
7
+
8
+ ## Overview
9
+
10
+ This plan describes how to execute the 15 tasks in `tasks.md` using the GSD ralph-loop pattern: each task gets a fresh subagent with its own 200K context window, reads specs from files, produces independently committable output, and tracks progress via file-based state.
11
+
12
+ ---
13
+
14
+ ## 1. State Tracking Files
15
+
16
+ ### PLAN.md (this file)
17
+ - Describes the orchestration process
18
+ - Does not change during execution
19
+
20
+ ### STATE.md
21
+ Create at: `docs/visual-skills/implementation/STATE.md`
22
+
23
+ Tracks live execution state. Format:
24
+
25
+ ```markdown
26
+ # Implementation State
27
+
28
+ ## Current Task: T2
29
+ ## Last Completed: T1
30
+ ## Status: IN_PROGRESS
31
+
32
+ | Task | Status | Commit | Notes |
33
+ |------|--------|--------|-------|
34
+ | T1 | DONE | abc1234 | Spike complete. See spike-findings.md |
35
+ | T2 | IN_PROGRESS | -- | Started theme enhancement |
36
+ | T3 | BLOCKED | -- | Waiting on T2 |
37
+ | T4 | NOT_STARTED | -- | |
38
+ | ... | | | |
39
+ ```
40
+
41
+ Status values: `NOT_STARTED`, `IN_PROGRESS`, `DONE`, `FAILED`, `BLOCKED`
42
+
43
+ ### spike-findings.md
44
+ Created by T1 at: `docs/visual-skills/implementation/spike-findings.md`
45
+ Consumed by T10. Contains the discovered state machine, edge cases, and architectural decisions from the generate-more spike.
46
+
47
+ ---
48
+
49
+ ## 2. Execution Order
50
+
51
+ ### Wave 1: Spike + Foundation (parallel)
52
+
53
+ **T1 (Generate-More Spike)** and **T2 (Theme + CSS Foundation)** run first, in parallel. T1 has no dependencies. T2 is the foundation for everything else.
54
+
55
+ ```
56
+ Subagent A: T1 (spike) -- standalone, ~40% context
57
+ Subagent B: T2 (theme) -- standalone, ~35% context
58
+ ```
59
+
60
+ ### Wave 2: Shared Components (parallel after T2)
61
+
62
+ Once T2 is done, T3, T4, T5, T6 can all run in parallel.
63
+
64
+ ```
65
+ Subagent C: T3 (mermaid) -- needs T2
66
+ Subagent D: T4 (codeblock) -- needs T2
67
+ Subagent E: T5 (keyboard+slides) -- needs T2
68
+ Subagent F: T6 (card+table) -- needs T2
69
+ ```
70
+
71
+ ### Wave 3: Deck Core (sequential)
72
+
73
+ T7, T8, T9 are sequential (each builds on the previous).
74
+
75
+ ```
76
+ Subagent G: T7 (deck shell) -- needs T5, T6
77
+ Subagent G: T8 (selection) -- needs T7
78
+ Subagent G: T9 (summary) -- needs T8
79
+ ```
80
+
81
+ ### Wave 4: Generate-More + Explainer (parallel)
82
+
83
+ T10 needs both T1 and T8. T11, T12 need T2 and T6.
84
+
85
+ ```
86
+ Subagent H: T10 (generate-more) -- needs T1, T8
87
+ Subagent I: T11 (explainer 1) -- needs T2, T6
88
+ Subagent J: T12 (explainer 2) -- needs T2, T6
89
+ ```
90
+
91
+ ### Wave 5: Polish (parallel)
92
+
93
+ T13, T14, T15 are independent of each other.
94
+
95
+ ```
96
+ Subagent K: T13 (css helpers) -- needs T2
97
+ Subagent L: T14 (deck polish) -- needs T10
98
+ Subagent M: T15 (presets) -- needs T2
99
+ ```
100
+
101
+ ### Optimal Timeline (with parallelization)
102
+
103
+ ```
104
+ Wave 1: T1 ───────── T2 ────────
105
+ Wave 2: T3 T4 T5 T6
106
+ Wave 3: T7 ── T8 ── T9
107
+ Wave 4: T10 T11 T12
108
+ Wave 5: T13 T14 T15
109
+ ```
110
+
111
+ With maximum parallelization, critical path is: **T2 -> T5 -> T7 -> T8 -> T10 -> T14** (6 sequential steps).
112
+
113
+ ---
114
+
115
+ ## 3. Subagent Invocation Protocol
116
+
117
+ ### Starting a Task
118
+
119
+ Each subagent receives a prompt like this:
120
+
121
+ ```
122
+ You are implementing task T{N} of the StreamWeaver visual skills project.
123
+
124
+ Read these files first:
125
+ 1. docs/visual-skills/implementation/tasks.md -- find task T{N}, read its full specification
126
+ 2. docs/visual-skills/implementation/STATE.md -- verify dependencies are DONE
127
+ 3. {each file listed in the task's "Input Files" section}
128
+
129
+ Your job:
130
+ - Create/modify ONLY the files listed in "Output Files"
131
+ - Meet ALL acceptance criteria
132
+ - Run tests: `bundle exec rspec {spec files}`
133
+ - Commit with message: "feat(visual-skills): T{N} - {task title}"
134
+
135
+ When done:
136
+ - Update STATE.md: set T{N} to DONE, record commit hash
137
+ - Unblock any tasks that depend on T{N}
138
+ ```
139
+
140
+ ### Context Budget
141
+
142
+ Each task is designed to fit within ~50% of the 200K context window:
143
+ - Task spec reading: ~5%
144
+ - Input file reading: ~15-25%
145
+ - Implementation: ~15-20%
146
+ - Test output / iteration: ~5-10%
147
+ - Total: ~40-55%
148
+
149
+ This leaves ~50% headroom for debugging, retries, and exploratory reading.
150
+
151
+ ### Commit Convention
152
+
153
+ Each task produces exactly one commit:
154
+
155
+ ```
156
+ feat(visual-skills): T{N} - {task title}
157
+
158
+ - {bullet 1: what was created}
159
+ - {bullet 2: what was modified}
160
+ - {bullet 3: key decisions made}
161
+ ```
162
+
163
+ Example:
164
+ ```
165
+ feat(visual-skills): T3 - Mermaid component
166
+
167
+ - Add Components::Mermaid with zoom/pan support
168
+ - Add mermaid() DSL method to DisplayDSL
169
+ - CDN loads Mermaid.js lazily via ESM import
170
+ - Theme-aware: reads data-theme for Mermaid themeVariables
171
+ ```
172
+
173
+ ---
174
+
175
+ ## 4. Failure Recovery
176
+
177
+ ### Task Fails Tests
178
+
179
+ 1. Subagent fixes and retries within same context window
180
+ 2. If context is exhausted, mark task as `FAILED` in STATE.md with notes
181
+ 3. Next subagent reads STATE.md, sees failure notes, picks up where previous left off
182
+
183
+ ### Task Produces Wrong Output
184
+
185
+ 1. `git revert {commit}` the bad commit
186
+ 2. Update STATE.md to `NOT_STARTED` with notes on what went wrong
187
+ 3. Re-run with additional guidance in the prompt
188
+
189
+ ### Dependency Not Ready
190
+
191
+ 1. Subagent reads STATE.md, sees dependency is not `DONE`
192
+ 2. Subagent reports `BLOCKED` and exits
193
+ 3. Orchestrator retries after dependency completes
194
+
195
+ ### Context Exhaustion
196
+
197
+ If a task is too large for one context window:
198
+ 1. Split into T{N}a and T{N}b
199
+ 2. First subagent commits partial work, updates STATE.md
200
+ 3. Second subagent continues from committed state
201
+
202
+ ---
203
+
204
+ ## 5. Integration Checkpoints
205
+
206
+ After each wave, run full test suite and verify integration:
207
+
208
+ ### After Wave 2 (shared components)
209
+ ```bash
210
+ bundle exec rspec spec/components/mermaid_spec.rb \
211
+ spec/components/code_block_spec.rb \
212
+ spec/components/image_block_spec.rb \
213
+ spec/components/keyboard_shortcuts_spec.rb \
214
+ spec/components/slide_container_spec.rb \
215
+ spec/components/card_depth_spec.rb \
216
+ spec/components/table_enhanced_spec.rb
217
+ ```
218
+ Verify: existing tests still pass (`bundle exec rspec` -- full suite).
219
+
220
+ ### After Wave 3 (deck core)
221
+ ```bash
222
+ bundle exec rspec spec/components/deck/
223
+ ```
224
+ Manual verification: run example deck app, navigate slides, select options, verify state persistence.
225
+
226
+ ### After Wave 4 (generate-more + explainer)
227
+ ```bash
228
+ bundle exec rspec spec/components/deck/generate_more_spec.rb \
229
+ spec/components/sidebar_toc_spec.rb \
230
+ spec/components/callout_spec.rb \
231
+ spec/components/comparison_spec.rb \
232
+ spec/components/pipeline_spec.rb \
233
+ spec/components/kpi_dashboard_spec.rb \
234
+ spec/components/chart_spec.rb
235
+ ```
236
+ Manual verification: generate-more flow end-to-end with simulated agent.
237
+
238
+ ### After Wave 5 (polish)
239
+ Full suite: `bundle exec rspec`
240
+ Manual verification: theme presets, HTML export, all deck workflows.
241
+
242
+ ---
243
+
244
+ ## 6. Running the Orchestrator
245
+
246
+ ### Manual Orchestration (recommended to start)
247
+
248
+ The orchestrator is you (the human or the main Claude Code session). Steps:
249
+
250
+ 1. **Initialize STATE.md:**
251
+ ```bash
252
+ cat > docs/visual-skills/implementation/STATE.md << 'EOF'
253
+ # Implementation State
254
+
255
+ ## Current Task: T1, T2
256
+ ## Last Completed: --
257
+ ## Status: IN_PROGRESS
258
+
259
+ | Task | Status | Commit | Notes |
260
+ |------|--------|--------|-------|
261
+ | T1 | NOT_STARTED | -- | |
262
+ | T2 | NOT_STARTED | -- | |
263
+ | T3 | BLOCKED | -- | Needs T2 |
264
+ | T4 | BLOCKED | -- | Needs T2 |
265
+ | T5 | BLOCKED | -- | Needs T2 |
266
+ | T6 | BLOCKED | -- | Needs T2 |
267
+ | T7 | BLOCKED | -- | Needs T5, T6 |
268
+ | T8 | BLOCKED | -- | Needs T7 |
269
+ | T9 | BLOCKED | -- | Needs T8 |
270
+ | T10 | BLOCKED | -- | Needs T1, T8 |
271
+ | T11 | BLOCKED | -- | Needs T2, T6 |
272
+ | T12 | BLOCKED | -- | Needs T2, T6 |
273
+ | T13 | BLOCKED | -- | Needs T2 |
274
+ | T14 | BLOCKED | -- | Needs T10 |
275
+ | T15 | BLOCKED | -- | Needs T2 |
276
+ EOF
277
+ ```
278
+
279
+ 2. **Launch Wave 1:** Start two subagent sessions (or one at a time):
280
+ - Session 1: "Implement task T1 per docs/visual-skills/implementation/tasks.md"
281
+ - Session 2: "Implement task T2 per docs/visual-skills/implementation/tasks.md"
282
+
283
+ 3. **After each task completes:** Verify the commit, check STATE.md was updated, unblock dependent tasks.
284
+
285
+ 4. **Launch next wave** when all dependencies are met.
286
+
287
+ ### Automated Orchestration (future)
288
+
289
+ A script could automate the loop:
290
+
291
+ ```ruby
292
+ #!/usr/bin/env ruby
293
+ # bin/ralph-loop.rb -- automated task orchestration
294
+ #
295
+ # Reads STATE.md, finds next runnable task (NOT_STARTED with all deps DONE),
296
+ # launches subagent, waits for completion, updates state.
297
+ #
298
+ # Not implemented yet -- manual orchestration is fine for 15 tasks.
299
+ ```
300
+
301
+ ---
302
+
303
+ ## 7. Verification Checklist (End-to-End)
304
+
305
+ When all 15 tasks are complete:
306
+
307
+ - [ ] `bundle exec rspec` -- all tests pass (existing + new)
308
+ - [ ] Example design deck app renders and navigates
309
+ - [ ] Option selection persists across page reloads
310
+ - [ ] Generate-more flow works with simulated agent
311
+ - [ ] Summary slide shows all selections
312
+ - [ ] Theme toggle works (dark/light/auto)
313
+ - [ ] Theme presets apply correctly
314
+ - [ ] Explainer components render in isolation
315
+ - [ ] SidebarToc scroll spy works
316
+ - [ ] HTML export produces valid self-contained file
317
+ - [ ] CSS uses `sw-` prefix consistently
318
+ - [ ] No regressions in existing StreamWeaver functionality
319
+ - [ ] All components have ARIA attributes where applicable
320
+
321
+ ---
322
+
323
+ ## 8. Key Risks and Mitigations
324
+
325
+ | Risk | Likelihood | Mitigation |
326
+ |------|-----------|------------|
327
+ | Generate-more state machine more complex than expected | High | T1 spike discovers reality before T10 commits to design |
328
+ | Pushable SSE insufficient for generate-more | Medium | Spike (T1) validates this early; fallback is WebSocket |
329
+ | Card/Table backward compat broken by enhancements | Low | T6 tests verify existing usage unchanged |
330
+ | Context window too small for T7 (deck shell) | Medium | Deck shell is the largest task at ~45%; can split into T7a/T7b if needed |
331
+ | AlpineJS adapter doesn't support new component patterns | Low | New components follow existing adapter pattern; adapter is well-understood |
332
+ | CDN loading conflicts (Mermaid + Prism + Chart.js) | Low | Each loads lazily only when component is used; no global conflicts expected |
333
+
334
+ ---
335
+
336
+ ## 9. File Summary
337
+
338
+ | File | Purpose |
339
+ |------|---------|
340
+ | `docs/visual-skills/implementation/plan.md` | This file -- how to run the ralph-loop |
341
+ | `docs/visual-skills/implementation/tasks.md` | All 15 tasks with specs |
342
+ | `docs/visual-skills/implementation/STATE.md` | Live execution state (create at start) |
343
+ | `docs/visual-skills/implementation/spike-findings.md` | T1 output, consumed by T10 |
344
+ | `docs/visual-skills/SESSION-CONTEXT.md` | Overall project context |
345
+ | `docs/visual-skills/design/architecture.md` | Architecture reference |
346
+ | `docs/visual-skills/design/review-synthesis.md` | Post-review decisions |
347
+ | `docs/visual-skills/analysis/components.md` | Component inventory |