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,275 @@
1
+ # StreamWeaver Canvas Roadmap
2
+
3
+ ## What is Canvas?
4
+
5
+ **The Problem:** Agentic AI CLIs like Claude Code are powerful but constrained to text-based terminal interaction. Complex choices, data visualization, code review, and multi-step workflows become walls of text that are hard to parse and interact with.
6
+
7
+ **The Solution:** A persistent browser canvas that AI agents can push rich HTML/CSS/JS UI to, enabling:
8
+ - Visual data display (tables, charts, diffs)
9
+ - Interactive forms and wizards
10
+ - Clickable choices instead of typing responses
11
+ - Real-time progress visualization
12
+
13
+ **Why Ruby/Phlex?** Token efficiency. Instead of generating verbose HTML, the AI generates concise Ruby DSL:
14
+ ```ruby
15
+ # 45 tokens of Ruby
16
+ table headers: ["File", "Size"], rows: data, striped: true
17
+ button "Apply Changes", variant: :primary
18
+
19
+ # vs 200+ tokens of equivalent HTML/CSS
20
+ ```
21
+
22
+ ### Primary Use Case
23
+
24
+ **Claude Code Companion** - Side-by-side experience:
25
+ - Terminal on left: Claude Code CLI running
26
+ - Canvas on right: Rich UI for interaction
27
+
28
+ When Claude needs user input, instead of:
29
+ ```
30
+ Please choose:
31
+ 1. PostgreSQL
32
+ 2. SQLite
33
+ 3. MySQL
34
+ Enter number:
35
+ ```
36
+
37
+ It pushes a visual choice UI, user clicks, Claude receives JSON response.
38
+
39
+ ### StreamWeaver Modes: When to Use What
40
+
41
+ StreamWeaver has multiple modes. Canvas (live sessions) is one of them:
42
+
43
+ | Mode | Command | Use When |
44
+ |------|---------|----------|
45
+ | **Standalone** | `streamweaver run app.rb` | Building a complete web app with predefined UI |
46
+ | **Server** | `streamweaver serve` | Hosting multiple apps, production deployment |
47
+ | **Agentic** | `streamweaver llm` | AI generates UI on-the-fly during conversation |
48
+ | **Canvas** | `streamweaver live SESSION` | AI pushes UI during external workflow (e.g., Claude Code) |
49
+
50
+ **Standalone** - You write the app, user interacts with fixed UI
51
+ ```ruby
52
+ # my_app.rb - predefined screens and flow
53
+ text_field :name
54
+ button "Submit" do |state|
55
+ # handle submission
56
+ end
57
+ ```
58
+
59
+ **Agentic** - AI writes the app dynamically based on conversation
60
+ ```bash
61
+ streamweaver llm # AI generates UI based on chat
62
+ ```
63
+
64
+ **Canvas** - External AI agent pushes UI as needed during its workflow
65
+ ```bash
66
+ # Claude Code (or other agent) runs separately
67
+ # Pushes to canvas when it needs rich interaction
68
+ ./exe/streamweaver template wizard mysession '{"steps":[...]}'
69
+ ```
70
+
71
+ ### When to Use Canvas vs Other Modes
72
+
73
+ | Scenario | Best Mode | Why |
74
+ |----------|-----------|-----|
75
+ | Building a dashboard app | Standalone | Fixed UI, known requirements |
76
+ | Deploying apps for team | Server | Multi-app hosting, production-ready |
77
+ | Chatbot builds custom UI | Agentic | AI controls the whole experience |
78
+ | Claude Code needs user input | **Canvas** | AI is running elsewhere, pushes when needed |
79
+ | CI/CD wants to show results | **Canvas** | External process pushes status |
80
+ | Debug session visualization | **Canvas** | Debugger pushes state as it runs |
81
+
82
+ ### Canvas-Specific Use Cases
83
+
84
+ | Use Case | Description |
85
+ |----------|-------------|
86
+ | **Any agentic CLI** | Not Claude-specific - any AI agent can push to canvas |
87
+ | **Build dashboards** | Show test results, coverage, build status visually |
88
+ | **Code review UI** | Rich diff display with inline comments |
89
+ | **Onboarding wizards** | Guide users through project setup |
90
+ | **Debug visualizers** | Display data structures, call stacks graphically |
91
+ | **Documentation preview** | Live preview of generated docs |
92
+ | **Database explorers** | Query results in proper tables |
93
+ | **Log viewers** | Filterable, searchable log display |
94
+ | **Deployment dashboards** | Multi-environment status at a glance |
95
+ | **LLM prompt builders** | Visual prompt construction with previews |
96
+
97
+ ### Design Principles
98
+
99
+ 1. **Token efficient** - Ruby DSL, not verbose HTML
100
+ 2. **Bidirectional** - Push UI, receive user actions as JSON
101
+ 3. **Stateless templates** - Each interaction is self-contained
102
+ 4. **Progressive enhancement** - Works with polling, can upgrade to WebSocket
103
+ 5. **Browser-native** - No Electron needed, any browser works
104
+
105
+ ## Current State (January 2025)
106
+
107
+ ### Working
108
+ - Live sessions with 300ms polling
109
+ - 7 templates: wizard, choices, confirm, info, table, code, diff
110
+ - Native Phlex table component with styling options
111
+ - Smooth CSS transitions between content updates
112
+ - Theme support (dashboard, minimal, dark)
113
+ - Form submission capture and retrieval
114
+
115
+ **Key Files:**
116
+ | File | Purpose |
117
+ |------|---------|
118
+ | `lib/stream_weaver/templates/*.rb` | 7 template classes (wizard, choices, confirm, info, table, code, diff) |
119
+ | `lib/stream_weaver/cli.rb` | `template` command dispatch |
120
+ | `lib/stream_weaver/service.rb` | Live session endpoints (`/live/:session`, `/push`, `/submissions`) |
121
+ | `lib/stream_weaver/components.rb` | Native Table component |
122
+ | `lib/stream_weaver/adapter/alpinejs.rb` | `render_table` and component rendering |
123
+ | `lib/stream_weaver/css.rb` | Animations and table CSS classes |
124
+
125
+ ### Limitations
126
+ - No real-time streaming (polling only)
127
+ - No terminal embedding yet
128
+ - Templates require user to have browser open
129
+ - No progress updates during long-running Claude tasks
130
+
131
+ ## Future Directions
132
+
133
+ ### 1. Terminal Integration
134
+
135
+ **Goal:** Side-by-side terminal + canvas experience
136
+
137
+ **Options explored:**
138
+ | Approach | Pros | Cons |
139
+ |----------|------|------|
140
+ | xterm.js | Full terminal emulator | Complex PTY setup, WebSocket needed |
141
+ | tmux capture | Simple, read pane buffer | Polling delay, not true integration |
142
+ | ttyd/gotty | Existing tools | External dependency, iframe embed |
143
+
144
+ **Recommendation:** Start with tmux capture for simplicity, evolve to xterm.js if needed.
145
+
146
+ ### 2. Real-time Progress Updates
147
+
148
+ **Problem:** Claude can't push updates during thinking/tool execution.
149
+
150
+ **Explored solutions:**
151
+ | Approach | How | Status |
152
+ |----------|-----|--------|
153
+ | Incremental pushes | Claude pushes between steps | Works, but adds tool calls |
154
+ | Status file | Claude writes file, canvas polls | Not implemented |
155
+ | Hooks | Claude Code hooks for output events | Unknown feasibility |
156
+
157
+ **Recommendation:** For now, use incremental pushes. Status file approach is cleaner but requires infrastructure.
158
+
159
+ ### 3. New Templates
160
+
161
+ **High value:**
162
+ - `progress` - Progress bar with status messages (for multi-step tasks)
163
+ - `log` - Scrolling log viewer (for build output, test results)
164
+ - `file-tree` - Interactive file browser
165
+ - `form` - Generic form builder (more flexible than wizard)
166
+
167
+ **Nice to have:**
168
+ - `chart` - Simple charts (bar, line)
169
+ - `timeline` - Event timeline display
170
+ - `kanban` - Task board view
171
+
172
+ ### 4. WebSocket Support
173
+
174
+ **Current:** 300ms polling works but isn't true real-time.
175
+
176
+ **Trade-off:** WebSocket adds complexity (Sinatra needs extra gems like Faye or switching to a different server).
177
+
178
+ **Recommendation:** Polling is sufficient for current use cases. Revisit if latency becomes an issue.
179
+
180
+ ### 5. Electron/Desktop App
181
+
182
+ **Idea:** Native app with terminal + canvas side-by-side.
183
+
184
+ **Benefits:**
185
+ - True terminal integration
186
+ - No browser tab needed
187
+ - Could hook into Claude Code process directly
188
+
189
+ **Complexity:** High - separate app to maintain.
190
+
191
+ **Recommendation:** Defer until web-based approach hits limitations.
192
+
193
+ ### 6. VS Code Extension
194
+
195
+ **Idea:** Webview panel in VS Code alongside terminal.
196
+
197
+ **Benefits:**
198
+ - Developers already in VS Code
199
+ - Native integration with editor
200
+ - Could leverage VS Code's terminal API
201
+
202
+ **Complexity:** Medium - VS Code extension API learning curve.
203
+
204
+ ### 7. Better Code Display
205
+
206
+ **Current:** Basic dark theme code block.
207
+
208
+ **Improvements:**
209
+ - Syntax highlighting (via Prism.js or highlight.js)
210
+ - Line number linking
211
+ - Diff with inline comments
212
+ - Copy button
213
+ - Expand/collapse for long code
214
+
215
+ ### 8. Session Persistence
216
+
217
+ **Current:** Sessions are in-memory, lost on restart.
218
+
219
+ **Improvement:** Store session state to disk for:
220
+ - Resume after service restart
221
+ - History of interactions
222
+ - Audit trail
223
+
224
+ ### 9. Multi-canvas Support
225
+
226
+ **Idea:** Multiple named canvases for different purposes:
227
+ - `main` - Primary interaction
228
+ - `logs` - Continuous log output
229
+ - `status` - Persistent status bar
230
+
231
+ **Implementation:** Already supported via session names, just needs patterns/conventions.
232
+
233
+ ## Architecture Notes
234
+
235
+ ### Why Polling vs WebSocket
236
+
237
+ Polling at 300ms provides:
238
+ - Simpler implementation (plain HTTP)
239
+ - Works through proxies/firewalls
240
+ - No connection management
241
+ - Good enough latency for human interaction
242
+
243
+ WebSocket would provide:
244
+ - True real-time updates
245
+ - Lower server load for many clients
246
+ - Better for streaming output
247
+
248
+ ### Why Phlex
249
+
250
+ - Ruby-native templating
251
+ - Type-safe HTML generation
252
+ - Composable components
253
+ - No separate template files
254
+
255
+ ### Template Design Principles
256
+
257
+ 1. **Single command** - Full interaction in one bash call
258
+ 2. **JSON in, JSON out** - Easy to parse programmatically
259
+ 3. **Clear state** - Each run starts fresh
260
+ 4. **Timeout** - Don't hang forever
261
+ 5. **Sensible defaults** - Work out of the box
262
+
263
+ ## Next Steps (Prioritized)
264
+
265
+ 1. **Dogfood** - Use templates in real agentic workflows
266
+ 2. **Progress template** - Most requested for long tasks
267
+ 3. **Syntax highlighting** - Improve code/diff display
268
+ 4. **Documentation** - More examples, best practices
269
+
270
+ ## Non-Goals (For Now)
271
+
272
+ - Full IDE replacement
273
+ - Complex state management
274
+ - Multi-user collaboration
275
+ - Mobile support
@@ -0,0 +1,147 @@
1
+ # Case study: the Org + canvas-read document shelf (DiDX proposal session)
2
+
3
+ Date: 2026-09-03. Environment: **Codex (ChatGPT desktop app) on macOS** — notably *not* the
4
+ designed-for environment (Claude Code + iTerm2). The workflow held up anyway, which is the
5
+ headline: the Org-source + canvas-read loop is agent-agnostic.
6
+
7
+ **The winning loop:**
8
+
9
+ ```text
10
+ Discuss → save a small Org document → reload canvas-read → compare versions → revise → export when ready
11
+ ```
12
+
13
+ > Agent-friendly source, human-friendly reading, version-friendly files, and very low
14
+ > friction between writing and reviewing.
15
+
16
+ Three proposal documents (a neutral showcase, a personal version with several rounds of copy
17
+ revision, and a technical starter) lived as 12-16KB Org files sharing one image directory,
18
+ read side-by-side in canvas-read's shelf (left rail, per-doc TOC, Previous/Next). Preserving
19
+ alternative versions felt cheap rather than burdensome — that is the feature.
20
+
21
+ What follows is the session's own context write-up, verbatim.
22
+
23
+ ---
24
+
25
+ ## What happened
26
+
27
+ In one Codex session, we developed a visual DiDX proposal through several rounds of discussion.
28
+
29
+ Codex created and saved three StreamWeaver Org documents:
30
+
31
+ 1. `didx_whats_possible.org` — a neutral visual showcase.
32
+ 2. `didx_let_me_expand_the_picture.org` — a more personal version written from me to the recipient, with several rounds of copy revision.
33
+ 3. `didx_blueprint_theme_model_starter.org` — a local implementation starter for the component, blueprint, theme, color scheme, page, and preset hierarchy.
34
+
35
+ The Org files remained small, around 12 to 16 KB each. The visual weight lived in shared image assets rather than bloated document source.
36
+
37
+ ## Why canvas-read felt so good
38
+
39
+ `canvas-read` turned the files into a small local document shelf. The left rail showed all three documents. I could:
40
+
41
+ - Move between versions immediately.
42
+ - Compare the neutral and personal versions without opening separate tools.
43
+ - Keep the technical starter beside the presentation documents.
44
+ - Use the generated table of contents inside each document.
45
+ - See images, callouts, tables, diagrams, and polished formatting.
46
+ - Reload after an edit and immediately review the result.
47
+ - Keep the canonical source as Org while getting a much better reading experience.
48
+
49
+ The important experience was that these stopped feeling like loose files. They felt like a small, navigable local knowledge collection.
50
+
51
+ This was especially useful while revising the message. We could preserve the previous version, create another version with a different voice, and compare them from the same shelf.
52
+
53
+ ## Actual command used
54
+
55
+ The executable was not on `PATH`, so the working command was run from the repository:
56
+
57
+ ```bash
58
+ SW_NO_OPEN=1 bundle exec ruby -Ilib exe/streamweaver canvas-read \
59
+ /path/to/didx_whats_possible.org \
60
+ /path/to/didx_let_me_expand_the_picture.org \
61
+ /path/to/didx_blueprint_theme_model_starter.org \
62
+ --theme=doc
63
+ ```
64
+
65
+ `canvas-read` selected an available port and printed the URL:
66
+
67
+ ```text
68
+ canvas-read 3 file(s) → http://127.0.0.1:4800/?file=0
69
+ ```
70
+
71
+ Earlier runs used port 4801. Documentation should explicitly say not to assume a fixed port.
72
+
73
+ Passing the files explicitly produced the controlled comparison shelf we wanted.
74
+
75
+ ## Org format used
76
+
77
+ Each source begins with:
78
+
79
+ ```org
80
+ #+STREAMWEAVER_DSL: 1
81
+ #+TITLE: Document Title
82
+ ```
83
+
84
+ Numbered headings with `CUSTOM_ID` properties become document sections and generate the sidebar table of contents. Normal prose, lists, tables, quotes, and source blocks remain readable as Org.
85
+
86
+ Components not represented natively in the Org dialect can use the existing passthrough:
87
+
88
+ ```org
89
+ #+begin_src ruby :streamweaver-raw t
90
+ image_block File.join(__dir__, "assets/example.png"), base64: true,
91
+ alt: "Description"
92
+ #+end_src
93
+ ```
94
+
95
+ This let the document remain primarily Org while still using StreamWeaver image components and limited custom styling.
96
+
97
+ ## Images and shared assets
98
+
99
+ The documents referenced one shared image directory; generated images were not duplicated per document. `image_block` with `base64: true` made the images work in `canvas-read`, where ordinary relative image paths do not have a backing asset route.
100
+
101
+ ```text
102
+ Small Org source + shared high-quality images = rich canvas-read document
103
+ ```
104
+
105
+ ## Standalone delivery
106
+
107
+ We also produced standalone HTML and an email-ready ZIP (~11 MB):
108
+
109
+ ```text
110
+ Proposal/
111
+ ├── Proposal.html
112
+ └── images/ (11 PNG files)
113
+ ```
114
+
115
+ Recipient instructions: unzip, keep the HTML and `images` together, double-click the HTML.
116
+
117
+ ## Important export gap
118
+
119
+ `canvas-read` handled the StreamWeaver Org files correctly. The normal `streamweaver export file.org` command did not — it attempted to evaluate the raw Org text as Ruby and failed. The session worked around it by reading the Org, converting through `StreamWeaver::Org::Reader.to_dsl`, evaluating in a `StreamWeaver::App`, and passing that to `StreamWeaver::Export::HtmlExporter`. This is a current gap; a first-class Org export path would remove the custom step.
120
+
121
+ ## Another known gap: links between documents
122
+
123
+ Same-document Org anchors work. Native relative links from one Org document to another are not rewritten into `canvas-read` navigation URLs. The shelf made cross-document links unnecessary here, but a connected corpus will eventually want that. MarkyMark has prior art: it rewrites relative Markdown/Org links into internal reader routes preserving fragments and searches.
124
+
125
+ ## What was actually tested
126
+
127
+ Directly tested: macOS; Codex Desktop and its in-app browser; local StreamWeaver source; Ruby and Bundler already installed; canvas-read with explicit Org file arguments; the `:doc` theme; multiple documents in one shelf; desktop and phone-width rendering; Org-to-DSL conversion; shared image assets; standalone HTML generation; ZIP packaging with relative images.
128
+
129
+ Not tested: Linux; WSL; native Windows Ruby; browsers outside the Codex in-app browser for canvas-read; a packaged StreamWeaver executable; a clean machine without the development repository; `streamweaver panel` without iTerm.
130
+
131
+ ## Platform boundaries to document clearly
132
+
133
+ `streamweaver panel` is the iTerm-specific convenience path — macOS + iTerm functionality. `canvas-read` is a local web server and far less platform-specific; the degraded path is: start without auto-open, print the URL, open it in any browser. That should be viable on macOS without iTerm, Linux, WSL, and possibly Windows, subject to Ruby/browser-launch testing. The Chrome plugin and `gh` CLI are workflow enhancers, not requirements for reading a local shelf.
134
+
135
+ Documentation should distinguish: tested and supported / expected to work but not tested / known degraded path / future platform support.
136
+
137
+ ## Suggested degraded demo
138
+
139
+ ```bash
140
+ SW_NO_OPEN=1 streamweaver canvas-read docs/
141
+ ```
142
+
143
+ Expected: URL printed; user opens it; shelf lists Org and Ruby documents; navigation, TOC, images, diagrams, reading mode all work; no iTerm required. Test independently on macOS-plain-terminal, Linux, WSL, Windows.
144
+
145
+ ## Suggested documentation structure
146
+
147
+ 1. What canvas-read is. 2. The tested macOS happy path. 3. Saving or authoring StreamWeaver Org documents. 4. Opening one document. 5. Opening a shelf. 6. Comparing versions with the left rail and Previous/Next. 7. Working with images. 8. Exporting or packaging. 9. Platform support matrix. 10. No-iTerm degraded path. 11. Known gaps. 12. This case study.