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,247 @@
1
+ # Canvas IPC Design
2
+
3
+ Two-way interaction between Claude Code and StreamWeaver UI, inspired by [claude-canvas](https://github.com/BEARLY-HODLING/claude-canvas).
4
+
5
+ ## Goal
6
+
7
+ A single browser window that Claude Code can:
8
+ - Push UI content to (forms, displays, etc.)
9
+ - Receive user interactions from (button clicks, form submissions)
10
+ - All in real-time via IPC, not HTTP polling
11
+
12
+ ```
13
+ ┌─────────────────────┐ ┌──────────────────────┐
14
+ │ Claude Code │◄───►│ Single UI Window │
15
+ │ (Terminal) │ │ (Browser) │
16
+ └─────────────────────┘ └──────────────────────┘
17
+ │ │
18
+ └── Unix Socket ─────────────┘
19
+ + WebSocket
20
+ ```
21
+
22
+ ## Architecture
23
+
24
+ ```
25
+ ┌─────────────┐ ┌─────────────────────────────────┐ ┌─────────────┐
26
+ │ Claude Code │◄─Unix Socket────►│ Canvas Bridge │◄───WebSocket────►│ Browser │
27
+ │ │ │ │ │ │
28
+ │ streamweaver│ ~/.streamweaver │ - Sinatra + WebSocket │ ws://...:4568 │ StreamWeaver│
29
+ │ canvas ... │ /canvas.sock │ - Session management │ │ UI │
30
+ └─────────────┘ │ - DSL → HTML rendering │ └─────────────┘
31
+ │ - Event routing │
32
+ └─────────────────────────────────┘
33
+ ```
34
+
35
+ ### Why This Architecture
36
+
37
+ - Browser can't use Unix sockets directly
38
+ - Unix socket for Claude ↔ Bridge (fast, local IPC)
39
+ - WebSocket for Bridge ↔ Browser (real-time, bidirectional)
40
+ - Bridge process auto-starts on first use, reuses thereafter (like existing Service)
41
+
42
+ ## Process Lifecycle
43
+
44
+ **Files:**
45
+ ```
46
+ ~/.streamweaver/
47
+ ├── server.pid # Existing HTTP service
48
+ ├── canvas.pid # Canvas bridge process
49
+ ├── canvas.sock # Unix socket for IPC
50
+ └── server.log
51
+ ```
52
+
53
+ **First invocation:**
54
+ 1. Check if `canvas.pid` exists and process is alive
55
+ 2. If not running → spawn bridge, write PID, create socket
56
+ 3. Connect to socket, send "create session" message
57
+ 4. Bridge opens browser to `http://localhost:4568/canvas/<name>`
58
+ 5. Returns socket connection to Claude Code
59
+
60
+ **Subsequent invocations:** Reuse existing bridge, create new sessions as needed.
61
+
62
+ ## IPC Protocol
63
+
64
+ Line-delimited JSON over Unix socket.
65
+
66
+ ### Claude Code → Bridge
67
+
68
+ | Message | Purpose | Example |
69
+ |---------|---------|---------|
70
+ | `create` | Create session | `{"type":"create","name":"survey"}` |
71
+ | `push` | Push UI content | `{"type":"push","name":"survey","dsl":"header1 'Pick One'"}` |
72
+ | `close` | Close session | `{"type":"close","name":"survey"}` |
73
+ | `get_state` | Get current state | `{"type":"get_state","name":"survey"}` |
74
+
75
+ ### Bridge → Claude Code
76
+
77
+ | Message | Purpose | Example |
78
+ |---------|---------|---------|
79
+ | `ready` | Session created | `{"type":"ready","name":"survey","url":"http://..."}` |
80
+ | `event` | User interaction | `{"type":"event","name":"survey","event":"submit","data":{...}}` |
81
+ | `state` | Response to get_state | `{"type":"state","name":"survey","data":{...}}` |
82
+ | `closed` | Session closed | `{"type":"closed","name":"survey"}` |
83
+
84
+ ### Event Types
85
+
86
+ - `submit` - User clicked submit button
87
+ - `action` - User clicked a named button
88
+ - `change` - Field value changed (optional)
89
+ - `cancel` - User cancelled/closed
90
+
91
+ ## Adapter Mode
92
+
93
+ Modify `Adapter::AlpineJS` to support WebSocket mode:
94
+
95
+ | Mode | Component Output | Backend |
96
+ |------|-----------------|---------|
97
+ | `http` (current) | HTMX `hx-post`, `hx-target` | Sinatra routes |
98
+ | `websocket` (canvas) | Alpine `@click` → WebSocket | Bridge process |
99
+
100
+ **Button example in WebSocket mode:**
101
+ ```ruby
102
+ def button_attributes(button)
103
+ if mode == :websocket
104
+ { '@click' => "sendEvent('action', {button: '#{button.id}', state: formState()})" }
105
+ else
106
+ { 'hx-post' => "#{url_prefix}/action/#{button.id}", ... }
107
+ end
108
+ end
109
+ ```
110
+
111
+ ## CLI Interface
112
+
113
+ ### Low-level (on-the-fly)
114
+
115
+ ```bash
116
+ # Create/connect to session
117
+ streamweaver canvas <name>
118
+
119
+ # Push DSL (from stdin)
120
+ streamweaver canvas-push <name> <<'RUBY'
121
+ header1 "Pick an option"
122
+ radio_group :choice, ["A", "B", "C"]
123
+ button "Submit"
124
+ RUBY
125
+
126
+ # Wait for event (blocks)
127
+ streamweaver canvas-wait <name>
128
+ # => {"event":"submit","data":{"choice":"B"}}
129
+
130
+ # Close session
131
+ streamweaver canvas-close <name>
132
+
133
+ # Management
134
+ streamweaver canvas-list
135
+ streamweaver canvas-stop
136
+ ```
137
+
138
+ ### High-level helpers
139
+
140
+ ```bash
141
+ # One-liners for common patterns
142
+ streamweaver pick "Pick approach" "Refactor" "Adapter" "Patch"
143
+ # => {"choice":"Adapter"}
144
+
145
+ streamweaver confirm "Delete 47 files?"
146
+ # => {"confirmed":true}
147
+
148
+ streamweaver form "Quick Survey" \
149
+ --text "name:Your name" \
150
+ --radio "priority:Low,Medium,High"
151
+ # => {"name":"Alice","priority":"High"}
152
+ ```
153
+
154
+ ## Ruby API
155
+
156
+ ### High-level helpers
157
+
158
+ ```ruby
159
+ require 'stream_weaver/canvas'
160
+
161
+ choice = StreamWeaver::Canvas.pick("Pick approach", ["Refactor", "Adapter", "Patch"])
162
+ # => "Adapter"
163
+
164
+ confirmed = StreamWeaver::Canvas.confirm("Delete 47 files?")
165
+ # => true
166
+
167
+ data = StreamWeaver::Canvas.form("Quick Survey") do
168
+ text_field :name, placeholder: "Your name"
169
+ radio_group :priority, ["Low", "Medium", "High"]
170
+ end
171
+ # => { name: "Alice", priority: "High" }
172
+ ```
173
+
174
+ ### Low-level session API
175
+
176
+ ```ruby
177
+ session = StreamWeaver::Canvas.session("wizard")
178
+
179
+ session.push do
180
+ header1 "Step 1"
181
+ text_field :email
182
+ button "Next"
183
+ end
184
+
185
+ result = session.wait # => { event: "submit", data: { email: "..." } }
186
+
187
+ session.push do
188
+ header1 "Step 2"
189
+ # ... based on result
190
+ end
191
+
192
+ session.close
193
+ ```
194
+
195
+ ### Project-specific reusable canvases
196
+
197
+ ```ruby
198
+ module MyProject::Canvases
199
+ def self.code_review_picker(files)
200
+ StreamWeaver::Canvas.form("Select files to review") do
201
+ checkbox_group :files, select_all: "All" do
202
+ files.each { |f| item f, f }
203
+ end
204
+ radio_group :depth, ["Quick scan", "Detailed review"]
205
+ end
206
+ end
207
+ end
208
+ ```
209
+
210
+ ## Implementation Structure
211
+
212
+ ### New files
213
+
214
+ ```
215
+ lib/stream_weaver/
216
+ ├── canvas/
217
+ │ ├── bridge.rb # Bridge process (Unix socket + WebSocket)
218
+ │ ├── session.rb # Session management
219
+ │ ├── helpers.rb # High-level helpers (pick, confirm, form)
220
+ │ └── protocol.rb # Message types and serialization
221
+ ├── adapter/
222
+ │ └── alpinejs.rb # MODIFY: Add websocket mode
223
+ └── cli.rb # MODIFY: Add canvas commands
224
+ ```
225
+
226
+ ### Dependencies
227
+
228
+ ```ruby
229
+ gem 'faye-websocket' # WebSocket support
230
+ gem 'eventmachine' # Required by faye-websocket
231
+ ```
232
+
233
+ ### Implementation phases
234
+
235
+ | Phase | What | Why |
236
+ |-------|------|-----|
237
+ | 1 | Protocol + Bridge skeleton | Core IPC working |
238
+ | 2 | CLI commands (canvas, push, wait) | Can test manually |
239
+ | 3 | WebSocket adapter mode | Browser ↔ Bridge communication |
240
+ | 4 | Session management | Multi-session support |
241
+ | 5 | High-level helpers | Ergonomic API |
242
+ | 6 | Terminal pane spawning (optional) | iTerm2/tmux split panes |
243
+
244
+ ## References
245
+
246
+ - [claude-canvas](https://github.com/BEARLY-HODLING/claude-canvas) - Inspiration for IPC pattern
247
+ - Existing StreamWeaver live sessions (HTTP polling approach)
@@ -0,0 +1,176 @@
1
+ # Dashboard Components Plan
2
+
3
+ **Date:** 2026-01-19
4
+ **Status:** PHASE 2 COMPLETE
5
+ **Goal:** Add dashboard-style components and styling to StreamWeaver for operations dashboards
6
+
7
+ ## Missing Components
8
+
9
+ ### Priority 1: Core Components
10
+
11
+ | Component | Purpose | Props |
12
+ |-----------|---------|-------|
13
+ | `StatusDot` | Colored indicator dots with optional glow | `status:` (red/yellow/green/gray), `pulse:` (bool), `size:` (sm/md/lg) |
14
+ | `Badge` | Small count/label badges | `text:`, `variant:` (default/danger/warning/success), `size:` |
15
+ | `StatDisplay` | Large number + small label | `value:`, `label:`, `color:` |
16
+ | `TypeTag` | Colored type pills | `type:`, `text:` (RESEARCH, TASK, ESCALATION, etc.) |
17
+
18
+ ### Priority 2: Layout Components
19
+
20
+ | Component | Purpose | Props |
21
+ |-----------|---------|-------|
22
+ | `AppShell` | Two-column layout with sidebar | `sidebar_width:`, `&block` for main + sidebar |
23
+ | `Sidebar` | Fixed sidebar container | `position:` (left/right), `width:` |
24
+
25
+ ### Priority 3: Interactive Components
26
+
27
+ | Component | Purpose | Props |
28
+ |-----------|---------|-------|
29
+ | `ExpandableCard` | Card that expands on click | `expanded:`, `on_toggle:`, `&block` |
30
+ | `ActivityItem` | Time + title + summary + type badge | `time:`, `title:`, `summary:`, `type:` |
31
+ | `PriorityItem` | Item with priority-colored left border | `priority:` (critical/urgent/high/normal), `title:`, `description:` |
32
+
33
+ ### Priority 4: Animation Components
34
+
35
+ | Component | Purpose | Props |
36
+ |-----------|---------|-------|
37
+ | `PulseIndicator` | Animated pulsing dot for live status | `color:`, `label:` |
38
+
39
+ ## Missing CSS/Styling
40
+
41
+ ### Dark Theme Variables
42
+ ```css
43
+ :root[data-theme="dark"] {
44
+ --sw-bg-deep: #0a0e14;
45
+ --sw-bg-surface: #131820;
46
+ --sw-bg-elevated: #1a2029;
47
+ --sw-bg-hover: #242d3a;
48
+ --sw-border: #2a3544;
49
+ --sw-text-primary: #e6edf3;
50
+ --sw-text-secondary: #8b949e;
51
+ --sw-text-muted: #565d66;
52
+ --sw-accent-blue: #58a6ff;
53
+ --sw-accent-purple: #a371f7;
54
+ --sw-status-red: #f85149;
55
+ --sw-status-yellow: #d29922;
56
+ --sw-status-green: #3fb950;
57
+ }
58
+ ```
59
+
60
+ ### Effects
61
+ - Glow effects for status indicators (`box-shadow` with color alpha)
62
+ - Gradient text for summary numbers
63
+ - Hover lift for cards (`transform: translateY(-2px)`)
64
+ - Hover slide for items (`transform: translateX(4px)`)
65
+ - Grid background overlay pattern
66
+
67
+ ### Fonts
68
+ - JetBrains Mono for stats/timestamps (monospace)
69
+ - Outfit for UI text (already have Source Sans 3)
70
+
71
+ ## Implementation Order
72
+
73
+ 1. **StatusDot** - Most fundamental, used everywhere
74
+ 2. **Badge** - Simple, high reuse
75
+ 3. **StatDisplay** - Used in cards
76
+ 4. **TypeTag** - Used in activity items
77
+ 5. **Dark theme CSS** - Enable the aesthetic
78
+ 6. **PulseIndicator** - Header status
79
+ 7. **AppShell/Sidebar** - Layout structure
80
+ 8. **ExpandableCard** - Interactive cards
81
+ 9. **ActivityItem** - Compound component
82
+ 10. **PriorityItem** - Escalation items
83
+
84
+ ## Files to Modify
85
+
86
+ - `lib/stream_weaver/components.rb` - Add new component classes
87
+ - `lib/stream_weaver/views.rb` - Add dark theme CSS variables
88
+ - `lib/stream_weaver/css.rb` - Add animation/glow CSS
89
+ - `lib/stream_weaver/adapter/alpinejs.rb` - Add render methods
90
+
91
+ ## Testing
92
+
93
+ Each component should be testable via:
94
+ ```bash
95
+ ./exe/streamweaver push test --dsl 'status_dot status: :red, pulse: true'
96
+ ```
97
+
98
+ ## Success Criteria
99
+
100
+ Can build a operations dashboard-like dashboard using only StreamWeaver DSL:
101
+ ```ruby
102
+ app_shell sidebar_width: 320 do
103
+ main do
104
+ header do
105
+ pulse_indicator color: :green, label: "System Active"
106
+ end
107
+ grid cols: 2 do
108
+ card do
109
+ status_dot status: :red
110
+ stat_display value: 5, label: "ACTIVITIES"
111
+ end
112
+ end
113
+ end
114
+ sidebar do
115
+ badge text: "5", variant: :danger
116
+ priority_item priority: :critical, title: "Needs attention"
117
+ end
118
+ end
119
+ ```
120
+
121
+ ---
122
+
123
+ ## Phase 1 Implementation (COMPLETE)
124
+
125
+ ### Components Implemented
126
+
127
+ | Component | File | DSL Method |
128
+ |-----------|------|------------|
129
+ | `StatusDot` | components.rb:19-42 | `status_dot status: :green, pulse: true` |
130
+ | `Badge` | components.rb:44-66 | `badge "5", variant: :danger` |
131
+ | `StatDisplay` | components.rb:68-91 | `stat_display value: 42, label: "TASKS"` |
132
+ | `TypeTag` | components.rb:93-118 | `type_tag :research` |
133
+ | `PulseIndicator` | components.rb:120-138 | `pulse_indicator color: :green, label: "Active"` |
134
+ | `PriorityItem` | components.rb:140-170 | `priority_item priority: :critical, title: "..."` |
135
+ | `ActivityItem` | components.rb:172-192 | `activity_item time: "15:00", title: "..."` |
136
+
137
+ ### CSS Added
138
+ - Dashboard component styles (StatusDot, Badge, StatDisplay, TypeTag, PulseIndicator, PriorityItem, ActivityItem)
139
+ - Dark theme (`sw-theme-dark`) with full color palette
140
+ - Glow effects for status indicators
141
+ - Pulse animation keyframes
142
+ - Hover effects (lift, slide)
143
+
144
+ ### Theme Registration
145
+ - Added `:dark` to `BUILT_IN_THEMES` in app.rb
146
+
147
+ ### Example App
148
+ - `examples/dashboard_components.rb` - Demonstrates all new components
149
+
150
+ ## Phase 2 Implementation (COMPLETE)
151
+
152
+ ### Components Implemented
153
+
154
+ | Component | File | DSL Method |
155
+ |-----------|------|------------|
156
+ | `AppShell` | components.rb | `app_shell sidebar_width: "320px" do ... end` |
157
+ | `Sidebar` | components.rb | `sidebar header: "Title" do ... end` |
158
+ | `MainContent` | components.rb | `main do ... end` |
159
+ | `ExpandableCard` | components.rb | `expandable_card key: :x, title: "..." do ... end` |
160
+
161
+ ### CSS Added
162
+ - App shell grid layout with sidebar
163
+ - Sidebar with sticky positioning
164
+ - Expandable card with hover/transition effects
165
+ - Alpine.js transitions for expand/collapse
166
+ - Responsive breakpoint (stacks on mobile)
167
+ - Dark theme overrides for layout components
168
+
169
+ ### Example App
170
+ - `examples/cabinet_control_demo.rb` - Full operations dashboard-style dashboard
171
+
172
+ ## Phase 3 (Future)
173
+
174
+ - Grid background overlay pattern
175
+ - Gradient text for large numbers
176
+ - Grid/List view toggle
@@ -0,0 +1,140 @@
1
+ # StreamWeaver Gem Release & Panel Feature Plan
2
+
3
+ ## Context
4
+
5
+ Preparing StreamWeaver for initial gem release to RubyGems, and implementing iTerm2 panel feature for Claude Code integration.
6
+
7
+ ## What's Done
8
+
9
+ ### 1. Documentation Updates ✅
10
+ - **CHANGELOG.md** - Updated with all features since 0.1.0:
11
+ - Canvas Mode (IPC for external apps)
12
+ - Templates (wizard, choices, confirm, info, table, code, diff)
13
+ - Dashboard Components
14
+ - Table enhancements
15
+ - Dark theme
16
+ - default: option for text inputs
17
+
18
+ - **README.md** - Completely rewritten:
19
+ - "Express intention, get interface" tagline
20
+ - Joy of Ruby philosophy section
21
+ - Four modes table (Standalone, Agentic, Canvas, Service)
22
+ - `ruby app.rb` vs `streamweaver app.rb` distinction
23
+ - Token efficiency emphasis (5-10x fewer tokens)
24
+ - iTerm2 built-in browser tip
25
+ - Condensed components reference
26
+
27
+ ### 2. Panel Feature (Partially Done)
28
+ **Commits pushed:**
29
+ - `062a295` - feat: Add panel command for iTerm2 split + canvas workflow
30
+
31
+ **Files created/modified:**
32
+ - `lib/stream_weaver/iterm.rb` - NEW - iTerm2 AppleScript integration
33
+ - `lib/stream_weaver/cli.rb` - Added `panel` and `install-skill` commands
34
+ - `lib/stream_weaver/canvas/bridge_server.rb` - Enhanced waiting screen
35
+ - `lib/stream_weaver.rb` - Added require for iterm.rb
36
+
37
+ **What works:**
38
+ - `streamweaver panel [name]` - Creates canvas, splits iTerm2 pane
39
+ - `streamweaver install-skill [--global]` - Installs Claude Code skill
40
+ - AppleScript escaping fixed (using Open3.capture2 with stdin)
41
+ - Split returns `:external` (uses system browser since iTerm2 browser profile not set up)
42
+
43
+ **Known issues to investigate:**
44
+ - "✓ Submitted - You can close this window" message appears on canvas submit
45
+ - User reported this is wrong for live canvas mode
46
+ - Need to verify if this was existing behavior or regression
47
+
48
+ ## What's Left
49
+
50
+ ### 1. Test Panel Feature
51
+ ```bash
52
+ # Test the panel command
53
+ ./exe/streamweaver panel test-session
54
+
55
+ # Should:
56
+ # - Split iTerm2 vertically
57
+ # - Create canvas session
58
+ # - Open browser (external or in iTerm2 if browser profile exists)
59
+
60
+ # Push content
61
+ ./exe/streamweaver canvas-push test-session <<'RUBY'
62
+ header1 "Test"
63
+ button "Click me"
64
+ RUBY
65
+
66
+ # Clean up
67
+ ./exe/streamweaver canvas-close test-session
68
+ ```
69
+
70
+ ### 2. Investigate Submit Message
71
+ - Check if "close this window" message on submit was existing behavior
72
+ - Canvas/live mode may need different submit handling than agentic mode
73
+ - Don't change without understanding full context
74
+
75
+ ### 3. Gem Release Prep
76
+ - Version bump: 0.1.0 → 0.2.0 (in `lib/stream_weaver/version.rb`)
77
+ - Clean up old files:
78
+ - `IMPLEMENTATION_SUMMARY_v0.1.0.md` - move to docs/archive?
79
+ - `blog_post_streamweaver_vs_react.md` - remove from gem?
80
+ - Build and test gem locally: `gem build stream_weaver.gemspec`
81
+ - Push to RubyGems: `gem push stream_weaver-0.2.0.gem`
82
+
83
+ ### 4. iTerm2 Browser Profile (Optional Enhancement)
84
+ For true embedded browser in iTerm2 split pane:
85
+ 1. User needs to set up browser profile in iTerm2 Preferences
86
+ 2. Could add `streamweaver setup-iterm` command to guide this
87
+ 3. See: https://iterm2.com/documentation-web.html
88
+
89
+ ## Key Files
90
+
91
+ ```
92
+ lib/stream_weaver/
93
+ ├── iterm.rb # iTerm2 AppleScript (NEW)
94
+ ├── cli.rb # panel, install-skill commands
95
+ ├── canvas/
96
+ │ └── bridge_server.rb # Enhanced waiting screen
97
+ └── version.rb # Bump to 0.2.0
98
+
99
+ docs/
100
+ ├── canvas-roadmap.md # Canvas documentation
101
+ ├── templates.md # Templates documentation
102
+ └── SERVICE_MODE.md # Service mode docs
103
+ ```
104
+
105
+ ## Commands Reference
106
+
107
+ ```bash
108
+ # Panel workflow
109
+ streamweaver panel [name] # Split iTerm2, open canvas
110
+ streamweaver canvas-push <name> # Push DSL content
111
+ streamweaver canvas-wait <name> # Wait for user interaction
112
+ streamweaver canvas-close <name> # Close session
113
+
114
+ # Skill installation
115
+ streamweaver install-skill # Project scope (.claude/skills/)
116
+ streamweaver install-skill --global # Global scope (~/.claude/skills/)
117
+
118
+ # Gem build
119
+ gem build stream_weaver.gemspec
120
+ gem push stream_weaver-0.2.0.gem
121
+ ```
122
+
123
+ ## Resume Prompt
124
+
125
+ To continue this work, use this prompt:
126
+
127
+ ---
128
+
129
+ Continue StreamWeaver gem release preparation.
130
+
131
+ Current state:
132
+ - README and CHANGELOG updated and committed
133
+ - Panel feature implemented but needs testing
134
+ - Need to: test panel, investigate submit message behavior, bump version, release gem
135
+
136
+ Read the plan at `docs/plans/2026-01-26-gem-release-and-panel.md` for full context.
137
+
138
+ Start by testing the panel command to verify the iTerm2 split works correctly.
139
+
140
+ ---