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,447 @@
1
+ #!/bin/bash
2
+ # Demo: Multi-step workflow showing StreamWeaver's "wow factor"
3
+ #
4
+ # This demonstrates a 4-step code analysis workflow:
5
+ # 1. Issue Selection - Cards, checkboxes, radio groups
6
+ # 2. Diff Preview - Side-by-side code with syntax highlighting
7
+ # 3. Progress - Animated progress bars, pulsing status dots
8
+ # 4. Results Summary - Charts, stats, sortable tables
9
+ #
10
+ # TUI Comparison:
11
+ # - TUI can't do: syntax highlighting, side-by-side columns, animated progress,
12
+ # pulsing indicators, charts, clickable links, expandable cards
13
+ # - StreamWeaver makes all of this trivial
14
+
15
+ set -e
16
+
17
+ SESSION="panel-demo-$$"
18
+
19
+ echo "=== StreamWeaver Panel Demo: Multi-Step Workflow ==="
20
+ echo ""
21
+ echo "This demo showcases visual capabilities impossible in TUI:"
22
+ echo " - Syntax-highlighted code diffs"
23
+ echo " - Animated progress indicators"
24
+ echo " - Interactive charts and tables"
25
+ echo " - Collapsible sections and status dots"
26
+ echo ""
27
+
28
+ # Start the panel
29
+ echo "Starting panel..."
30
+ streamweaver panel "$SESSION" 2>/dev/null
31
+
32
+ sleep 1
33
+
34
+ # ============================================================================
35
+ # STEP 1: Issue Selection
36
+ # ============================================================================
37
+ step1_selection() {
38
+ echo ""
39
+ echo "Step 1: Issue Selection"
40
+ echo " Features: cards, badges, checkboxes, radio_group, columns, hstack"
41
+ echo ""
42
+ streamweaver canvas-push "$SESSION" <<'RUBY'
43
+ header1 "Code Quality Analysis"
44
+ md "Found **7 issues** across 4 files. Select which issues to address:"
45
+
46
+ # Critical issues - grouped in a card
47
+ card do
48
+ hstack spacing: :sm, align: :center do
49
+ badge "2", variant: :danger
50
+ header3 "Critical Issues"
51
+ end
52
+ checkbox :issue_n1, "**N+1 Query** in `app/models/user.rb:47` - 23 extra DB calls per request"
53
+ checkbox :issue_sql, "**SQL Injection Risk** in `app/controllers/search_controller.rb:23`"
54
+ end
55
+
56
+ card do
57
+ hstack spacing: :sm, align: :center do
58
+ badge "3", variant: :warning
59
+ header3 "Warnings"
60
+ end
61
+ checkbox :issue_unused, "**Unused Variable** `temp_data` in `lib/processor.rb:156`"
62
+ checkbox :issue_long, "**Long Method** `calculate_totals` (87 lines) in `app/services/billing.rb:34`"
63
+ checkbox :issue_index, "**Missing Index** on `orders.user_id` - queries may be slow"
64
+ end
65
+
66
+ card do
67
+ hstack spacing: :sm, align: :center do
68
+ badge "2", variant: :info
69
+ header3 "Suggestions"
70
+ end
71
+ checkbox :issue_deprecated, "**Deprecated Method** - use ActiveRecord query interface"
72
+ checkbox :issue_magic, "**Magic Number** `86400` should be `1.day.to_i`"
73
+ end
74
+
75
+ md "---"
76
+
77
+ # Fix options in two columns
78
+ header3 "Fix Options"
79
+ columns widths: ['50%', '50%'] do
80
+ column do
81
+ radio_group :approach, ["Fix in place", "Create separate PR per issue", "Generate TODO comments only"]
82
+ end
83
+ column do
84
+ checkbox :run_tests, "Run tests after each fix"
85
+ checkbox :auto_commit, "Auto-commit each fix"
86
+ end
87
+ end
88
+
89
+ md "---"
90
+
91
+ hstack spacing: :md do
92
+ button "Cancel", id: "btn_cancel", style: :secondary
93
+ button "Preview Changes", id: "btn_preview", variant: "primary"
94
+ end
95
+
96
+ canvas_continue message: "Loading preview..."
97
+ RUBY
98
+
99
+ result=$(streamweaver canvas-wait "$SESSION" 2>/dev/null)
100
+ echo "Selection result: $result"
101
+
102
+ # Check which button was clicked
103
+ button_id=$(echo "$result" | python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('button', d.get('_button', '')))" 2>/dev/null || echo "")
104
+
105
+ if [[ "$button_id" == *"cancel"* ]]; then
106
+ echo "User cancelled."
107
+ streamweaver canvas-close "$SESSION" 2>/dev/null
108
+ exit 0
109
+ fi
110
+
111
+ # Store selection for later steps
112
+ SELECTION="$result"
113
+ }
114
+
115
+ # ============================================================================
116
+ # STEP 2: Diff Preview
117
+ # ============================================================================
118
+ step2_diff_preview() {
119
+ echo ""
120
+ echo "Step 2: Diff Preview"
121
+ echo " Features: cards, columns, syntax-highlighted code blocks, badges"
122
+ echo ""
123
+ streamweaver canvas-push "$SESSION" <<'RUBY'
124
+ header1 "Review Changes"
125
+ md "Preview the fixes before applying:"
126
+
127
+ # N+1 Query Fix - with syntax highlighted code
128
+ card do
129
+ hstack spacing: :sm, align: :center do
130
+ badge "Performance", variant: :info
131
+ header3 "user.rb - N+1 Query Fix"
132
+ end
133
+ columns widths: ['50%', '50%'] do
134
+ column do
135
+ md "**Before** (N+1 problem)"
136
+ md <<~CODE
137
+ ```ruby
138
+ # Each iteration triggers a DB query!
139
+ users.each do |user|
140
+ puts user.posts.count
141
+ puts user.comments.count
142
+ end
143
+ ```
144
+ CODE
145
+ end
146
+ column do
147
+ md "**After** (Eager loaded)"
148
+ md <<~CODE
149
+ ```ruby
150
+ # Single query loads all data
151
+ users.includes(:posts, :comments).each do |user|
152
+ puts user.posts.count
153
+ puts user.comments.count
154
+ end
155
+ ```
156
+ CODE
157
+ end
158
+ end
159
+ md "**Impact:** Reduces queries from **24** to **2**"
160
+ end
161
+
162
+ # SQL Injection Fix - with syntax highlighted code
163
+ card do
164
+ hstack spacing: :sm, align: :center do
165
+ badge "Security", variant: :danger
166
+ header3 "search_controller.rb - SQL Injection Fix"
167
+ end
168
+ columns widths: ['50%', '50%'] do
169
+ column do
170
+ md "**Before** (Vulnerable)"
171
+ md <<~CODE
172
+ ```ruby
173
+ # User input directly in SQL!
174
+ def search
175
+ query = params[:q]
176
+ User.where("name LIKE '%' + query + '%'")
177
+ end
178
+ ```
179
+ CODE
180
+ end
181
+ column do
182
+ md "**After** (Parameterized)"
183
+ md <<~CODE
184
+ ```ruby
185
+ # Safe parameterized query
186
+ def search
187
+ query = params[:q]
188
+ User.where("name LIKE ?", "%" + query + "%")
189
+ end
190
+ ```
191
+ CODE
192
+ end
193
+ end
194
+ md "**Impact:** Prevents SQL injection attacks"
195
+ end
196
+
197
+ md "---"
198
+
199
+ hstack spacing: :md do
200
+ button "Go Back", id: "btn_back", style: :secondary
201
+ button "Apply Fixes", id: "btn_apply", variant: "primary"
202
+ end
203
+
204
+ canvas_continue message: "Applying fixes..."
205
+ RUBY
206
+
207
+ result=$(streamweaver canvas-wait "$SESSION" 2>/dev/null)
208
+ echo "Preview result: $result"
209
+
210
+ button_id=$(echo "$result" | python3 -c "import sys, json; d=json.load(sys.stdin); print(d.get('button', d.get('_button', '')))" 2>/dev/null || echo "")
211
+
212
+ if [[ "$button_id" == *"back"* ]]; then
213
+ # Go back to step 1
214
+ step1_selection
215
+ step2_diff_preview
216
+ return
217
+ fi
218
+ }
219
+
220
+ # ============================================================================
221
+ # STEP 3: Progress Animation
222
+ # ============================================================================
223
+ step3_progress() {
224
+ echo ""
225
+ echo "Step 3: Progress Animation"
226
+ echo " Features: spinner, progress_bar (animated), status_dot (with pulse), activity_item"
227
+ echo ""
228
+
229
+ # Show progress for each "fix" being applied
230
+ local fixes=("user.rb" "search_controller.rb" "billing.rb" "processor.rb" "constants.rb")
231
+ local fix_names=("N+1 Query" "SQL Injection" "Long Method" "Unused Variable" "Magic Numbers")
232
+ local total=${#fixes[@]}
233
+
234
+ for i in "${!fixes[@]}"; do
235
+ local completed=$((i))
236
+ local current=$((i + 1))
237
+ local current_file="${fixes[$i]}"
238
+ local current_name="${fix_names[$i]}"
239
+ local progress=$((current * 100 / total))
240
+
241
+ # Generate status based on index
242
+ local s0_status="gray" s0_pulse=""
243
+ local s1_status="gray" s1_pulse=""
244
+ local s2_status="gray" s2_pulse=""
245
+ local s3_status="gray" s3_pulse=""
246
+ local s4_status="gray" s4_pulse=""
247
+
248
+ # Set completed items to green, current to pulsing green
249
+ [[ $i -ge 1 ]] && s0_status="green"
250
+ [[ $i -ge 2 ]] && s1_status="green"
251
+ [[ $i -ge 3 ]] && s2_status="green"
252
+ [[ $i -ge 4 ]] && s3_status="green"
253
+ [[ $i -ge 5 ]] && s4_status="green"
254
+
255
+ # Set current item to pulse
256
+ case $i in
257
+ 0) s0_status="green"; s0_pulse=", pulse: true" ;;
258
+ 1) s1_status="green"; s1_pulse=", pulse: true" ;;
259
+ 2) s2_status="green"; s2_pulse=", pulse: true" ;;
260
+ 3) s3_status="green"; s3_pulse=", pulse: true" ;;
261
+ 4) s4_status="green"; s4_pulse=", pulse: true" ;;
262
+ esac
263
+
264
+ streamweaver canvas-push "$SESSION" <<RUBY
265
+ header1 "Applying Fixes"
266
+
267
+ # Show spinner with current task
268
+ hstack spacing: :md, align: :center do
269
+ spinner size: :md
270
+ md "**Processing:** ${current_file} - ${current_name}"
271
+ end
272
+
273
+ progress_bar value: ${progress}, show_label: true, animated: true, variant: :success
274
+
275
+ md "---"
276
+
277
+ header3 "File Status"
278
+ hstack spacing: :lg, align: :center do
279
+ status_dot status: :${s0_status}${s0_pulse}, label: "user.rb"
280
+ status_dot status: :${s1_status}${s1_pulse}, label: "search.rb"
281
+ status_dot status: :${s2_status}${s2_pulse}, label: "billing.rb"
282
+ status_dot status: :${s3_status}${s3_pulse}, label: "processor.rb"
283
+ status_dot status: :${s4_status}${s4_pulse}, label: "constants.rb"
284
+ end
285
+
286
+ md "---"
287
+
288
+ card do
289
+ header3 "Activity Log"
290
+ vstack spacing: :none do
291
+ $(
292
+ # Generate activity items dynamically
293
+ for j in $(seq 0 $i); do
294
+ if [[ $j -lt $i ]]; then
295
+ echo " activity_item time: \"0:0$((j*2+2))\", title: \"Fixed ${fixes[$j]} - ${fix_names[$j]}\", type: :task"
296
+ else
297
+ echo " activity_item time: \"now\", title: \"Processing ${fixes[$j]} - ${fix_names[$j]}...\", type: :research"
298
+ fi
299
+ done
300
+ )
301
+ end
302
+ end
303
+ RUBY
304
+
305
+ sleep 0.3 # Quick visual update
306
+ done
307
+ }
308
+
309
+ # ============================================================================
310
+ # STEP 4: Results Summary
311
+ # ============================================================================
312
+ step4_results() {
313
+ echo ""
314
+ echo "Step 4: Results Summary"
315
+ echo " Features: cards, badges, charts, sortable table, collapsible with code"
316
+ echo ""
317
+ streamweaver canvas-push "$SESSION" <<'RUBY'
318
+ header1 "Fixes Applied Successfully"
319
+
320
+ # Summary cards with badges
321
+ hstack spacing: :lg do
322
+ card do
323
+ hstack spacing: :sm, align: :center do
324
+ badge "5", variant: :success
325
+ md "**Issues Fixed**"
326
+ end
327
+ end
328
+ card do
329
+ hstack spacing: :sm, align: :center do
330
+ badge "2", variant: :warning
331
+ md "**Issues Skipped**"
332
+ end
333
+ end
334
+ card do
335
+ hstack spacing: :sm, align: :center do
336
+ badge "40", variant: :success
337
+ md "**Tests Passing**"
338
+ end
339
+ end
340
+ end
341
+
342
+ md "---"
343
+
344
+ # Charts showing impact
345
+ columns widths: ['50%', '50%'] do
346
+ column do
347
+ bar_chart data: {
348
+ "N+1 Query" => 22,
349
+ "SQL Injection" => 18,
350
+ "Long Method" => 15,
351
+ "Unused Var" => 3,
352
+ "Magic Numbers" => 2
353
+ }, title: "DB Queries Saved Per Fix", height: "180px"
354
+ end
355
+ column do
356
+ bar_chart data: {
357
+ "Before" => 2400,
358
+ "After" => 180
359
+ }, title: "Response Time (ms)", height: "180px"
360
+ end
361
+ end
362
+
363
+ md "---"
364
+
365
+ # Detailed results table
366
+ header3 "Fix Details"
367
+ table [
368
+ { file: "user.rb", issue: "N+1 Query", status: "Fixed", tests: "12 passed", impact: "High" },
369
+ { file: "search_controller.rb", issue: "SQL Injection", status: "Fixed", tests: "8 passed", impact: "Critical" },
370
+ { file: "billing.rb", issue: "Long Method", status: "Fixed", tests: "15 passed", impact: "Medium" },
371
+ { file: "processor.rb", issue: "Unused Variable", status: "Fixed", tests: "3 passed", impact: "Low" },
372
+ { file: "constants.rb", issue: "Magic Numbers", status: "Fixed", tests: "2 passed", impact: "Low" },
373
+ { file: "api_client.rb", issue: "Deprecated Method", status: "Skipped", tests: "-", impact: "Low" },
374
+ { file: "config.rb", issue: "Missing Index", status: "Skipped", tests: "-", impact: "Medium" }
375
+ ], striped: true, sortable: true
376
+
377
+ md "---"
378
+
379
+ # Expandable details with syntax-highlighted code
380
+ header3 "Change Details"
381
+ collapsible "user.rb - N+1 Query Fix" do
382
+ md <<~CODE
383
+ ```ruby
384
+ # Before: N+1 queries
385
+ users.each { |u| puts u.posts.count }
386
+
387
+ # After: Single query with eager loading
388
+ users.includes(:posts).each { |u| puts u.posts.count }
389
+ ```
390
+ CODE
391
+ md "**Impact:** Reduces database queries from 24 to 2"
392
+ end
393
+
394
+ collapsible "search_controller.rb - SQL Injection Fix" do
395
+ md <<~CODE
396
+ ```ruby
397
+ # Before: Vulnerable to injection
398
+ User.where("name LIKE '%" + query + "%'")
399
+
400
+ # After: Safe parameterized query
401
+ User.where("name LIKE ?", "%" + query + "%")
402
+ ```
403
+ CODE
404
+ md "**Impact:** Prevents SQL injection attacks"
405
+ end
406
+
407
+ md "---"
408
+
409
+ button "Done", id: "btn_done", variant: "primary"
410
+ RUBY
411
+
412
+ result=$(streamweaver canvas-wait "$SESSION" 2>/dev/null)
413
+ echo "Final result: $result"
414
+ }
415
+
416
+ # ============================================================================
417
+ # Main Execution
418
+ # ============================================================================
419
+
420
+ step1_selection
421
+ step2_diff_preview
422
+ step3_progress
423
+ step4_results
424
+
425
+ # Cleanup
426
+ streamweaver canvas-close "$SESSION" 2>/dev/null
427
+
428
+ echo ""
429
+ echo "=============================================="
430
+ echo "Demo complete!"
431
+ echo ""
432
+ echo "This demo showcased StreamWeaver features that"
433
+ echo "are impossible or painful in traditional TUI:"
434
+ echo ""
435
+ echo " Component TUI Equivalent Browser Advantage"
436
+ echo " ------------------ -------------------- ------------------"
437
+ echo " Syntax highlighting Plain text Color-coded keywords"
438
+ echo " Bar charts None practical Visual data comparison"
439
+ echo " Side-by-side columns ASCII pipes Precise alignment"
440
+ echo " Collapsible sections None Smooth expand/collapse"
441
+ echo " Progress bar [====> ] Smooth animation"
442
+ echo " Pulsing status dots * spinner Color + animation"
443
+ echo " Activity feed Timestamped lines Rich formatting"
444
+ echo " Badges & alerts Plain text Color-coded visual cues"
445
+ echo " Sortable tables ASCII table Click to sort"
446
+ echo " Cards with layout Box drawing chars Clean visual hierarchy"
447
+ echo ""
@@ -0,0 +1,86 @@
1
+ /* Tyrion War Room -- design-parity slice CSS (stream_weaver-8mj rebuild)
2
+ *
3
+ * This slice now emits tyrion's OWN class names (wr-board, wr-card,
4
+ * topbar, sidebar, story-row, as-parchment, ...) directly, and consumes
5
+ * the real public/shared.css at runtime via SW_PARITY_CSS (never copied
6
+ * into this repo -- see the script header for the env var contract).
7
+ * That means almost none of the CSS that used to live in this file is
8
+ * needed any more: the real stylesheet governs every element with a real
9
+ * class. What's left here is strictly the seam between StreamWeaver's own
10
+ * chrome and tyrion's -- documented per rule, see
11
+ * gsd/analysis/08-design-parity-fights.md for the full writeup.
12
+ *
13
+ * Loaded via `stylesheets:` *after* the real shared.css (when
14
+ * SW_PARITY_CSS is set), so these rules only need to beat StreamWeaver's
15
+ * own base chrome -- never the real CSS.
16
+ */
17
+
18
+ /* Real tyrion's `html, body { height: 100%; overflow: hidden; }` --
19
+ * .shell being a `height: 100vh` grid depends on it; without it the page
20
+ * scrolls as a whole instead of just its internal panes. */
21
+ html, body {
22
+ height: 100%;
23
+ overflow: hidden;
24
+ }
25
+
26
+ /* chrome: false gives every StreamWeaver body.sw-chromeless page a
27
+ * var(--sw-spacing-lg) padding baseline -- a reasonable default in
28
+ * general, wrong here since .shell is meant to fill the viewport
29
+ * edge-to-edge. Formerly needed an `html` specificity-bump prefix because
30
+ * this equal-specificity rule still lost to master_theme_css's own
31
+ * body.sw-chromeless on document order (views.rb's <style> block renders
32
+ * after `stylesheets:`); now unnecessary -- master_theme_css lives in
33
+ * @layer stream-weaver (stream_weaver-oeo), so this unlayered rule always
34
+ * wins regardless of specificity or order. */
35
+ body.sw-chromeless {
36
+ padding: 0;
37
+ }
38
+
39
+ /* `.shell` is `display:grid; height:100vh` in the real CSS -- correct on
40
+ * its own, but StreamWeaver's #app-container (always present, even under
41
+ * chrome:false -- see main_content_region in views.rb) is a plain block
42
+ * box around it. Constrain it to the viewport height too so .shell's own
43
+ * 100vh doesn't overflow its parent. */
44
+ #app-container {
45
+ height: 100vh;
46
+ overflow: hidden;
47
+ }
48
+
49
+ /* Real background photos (topbar strategy map, war-table map) are baked
50
+ * into shared.css as *relative* url("assets/...") references. StreamWeaver
51
+ * only serves individually-registered files at content-hashed
52
+ * /sw-asset/<key>/<name> paths, not a whole directory tree, so those
53
+ * relative urls 404 silently and the browser just keeps the gradient
54
+ * layer underneath -- no override needed for that (graceful) case. When
55
+ * SW_PARITY_ASSETS *is* set, the slice script injects a small
56
+ * data:-URI stylesheet (see PARITY_BG_CSS in the script) with the real
57
+ * resolved asset URL, appended after this file so it wins ties here too.
58
+ */
59
+
60
+ /* master_theme_css is one big always-injected bundle, unscoped and
61
+ * un-namespaced, that happens to declare `.sidebar-section` ("Monica-style
62
+ * sidebar sections", demoed in examples/advanced/all_components.rb -- a
63
+ * real, documented utility class, not dead code) and `.status-badge`
64
+ * ("Status Badge"), both of which collide with tyrion's own real class
65
+ * names by pure coincidence (stream_weaver-lyb). This rewrite deliberately
66
+ * calls none of Board/Lane/Sidebar, so the collision comes purely from
67
+ * these generic framework selectors, not from using a StreamWeaver
68
+ * component. Formerly needed a `body .shell` specificity-bump prefix
69
+ * (values copied from shared.css) to win the tie; now unnecessary --
70
+ * master_theme_css lives in @layer stream-weaver (stream_weaver-oeo), so
71
+ * these unlayered plain-class rules always win regardless of specificity.
72
+ */
73
+ .sidebar-section {
74
+ background: transparent;
75
+ border: none;
76
+ border-radius: 0;
77
+ padding: 12px 14px 4px;
78
+ }
79
+
80
+ .status-badge {
81
+ gap: 6px;
82
+ padding: 3px 10px;
83
+ border-radius: 3px;
84
+ font-size: 11px;
85
+ margin: 0;
86
+ }