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,213 @@
1
+ # Operation: CODEBREAKER v2
2
+
3
+ > Infiltrate any codebase. Extract actionable intelligence.
4
+
5
+ An interactive spy/hacker-themed code intelligence tool built with a **Claude-native approach**. Claude Code IS the intelligence - it uses its own tools (Glob, Grep, Read) to perform real code analysis, generating dynamic findings and recommendations.
6
+
7
+ ## Quick Start
8
+
9
+ From this directory, run Claude Code and use the slash command:
10
+
11
+ ```bash
12
+ cd examples/claude_code/codebreaker
13
+ claude
14
+ # Then type: /infiltrate
15
+ ```
16
+
17
+ Claude Code will orchestrate the full interactive experience using StreamWeaver panels.
18
+
19
+ ## Architecture: Claude-Native
20
+
21
+ **Key insight**: Claude Code IS the intelligence. Don't delegate to external scripts.
22
+
23
+ ### Only 4 External Commands
24
+
25
+ ```bash
26
+ streamweaver panel <session> # Open panel (1x at start)
27
+ streamweaver canvas-push <session> # Push DSL via heredoc
28
+ streamweaver canvas-wait <session> # Wait for user input
29
+ streamweaver canvas-close <session> # Cleanup (1x at end)
30
+ ```
31
+
32
+ ### Claude Does Everything Else
33
+
34
+ - **Generates DSL inline** as heredocs (no Ruby templates)
35
+ - **Analyzes code** using Glob, Grep, Read (no Bash scripts)
36
+ - **Interprets results** and generates findings (Claude's strength)
37
+ - **Creates recommendations** dynamically based on what it finds
38
+
39
+ ## Requirements
40
+
41
+ - StreamWeaver gem (`gem install stream_weaver`)
42
+ - iTerm2 (for panel mode) or any browser
43
+ - Claude Code CLI
44
+
45
+ ## Pre-configured Permissions
46
+
47
+ The `.claude/settings.local.json` pre-allows the 4 streamweaver commands so Claude can run without prompting:
48
+
49
+ ```json
50
+ {
51
+ "permissions": {
52
+ "allow": [
53
+ "Bash(streamweaver panel:*)",
54
+ "Bash(streamweaver canvas-push:*)",
55
+ "Bash(streamweaver canvas-wait:*)",
56
+ "Bash(streamweaver canvas-close:*)"
57
+ ]
58
+ }
59
+ }
60
+ ```
61
+
62
+ ## The Experience
63
+
64
+ ### Phase 1: Mission Briefing
65
+ Dark theme intro with target selection and analysis parameters.
66
+
67
+ ```
68
+ ┌──────────────────────────────────────────────┐
69
+ │ OPERATION: CODEBREAKER [CLASSIFIED] │
70
+ │──────────────────────────────────────────────│
71
+ │ ● SYSTEM ONLINE ○ AWAITING TARGET │
72
+ │──────────────────────────────────────────────│
73
+ │ TARGET SELECTION: [___________________] │
74
+ │ ANALYSIS: ○ Full ○ Security ○ Complexity │
75
+ │ │
76
+ │ [ ACCEPT MISSION ] │
77
+ └──────────────────────────────────────────────┘
78
+ ```
79
+
80
+ ### Phase 2: Reconnaissance
81
+ Claude uses Glob, Grep, and Read to scan the target codebase:
82
+
83
+ - **Structure**: Find all code files, count lines, identify large directories
84
+ - **Security**: Search for SQL injection, hardcoded secrets, eval, command injection
85
+ - **Complexity**: Find long methods, deep nesting, large files
86
+
87
+ ### Phase 3: Intelligence Report
88
+ Dashboard with REAL findings from Claude's analysis.
89
+
90
+ ```
91
+ ┌──────────────────────────────────────────────┐
92
+ │ INTELLIGENCE REPORT [8 FINDINGS] │
93
+ │──────────────────────────────────────────────│
94
+ │ CRITICAL: 2 WARNING: 3 INFO: 3 │
95
+ │──────────────────────────────────────────────│
96
+ │ ████████ Security (3) │
97
+ │ ██████ Complexity (3) │
98
+ │ ████ Structure (2) │
99
+ │──────────────────────────────────────────────│
100
+ │ [CRITICAL] SQL injection in auth.rb │
101
+ │ [CRITICAL] Hardcoded secret in config.rb │
102
+ │ [WARNING] Method too long in processor.rb │
103
+ └──────────────────────────────────────────────┘
104
+ ```
105
+
106
+ ### Phase 4: Deep Analysis
107
+ Code investigation with before/after fixes - Claude generates recommendations based on what it found.
108
+
109
+ ```
110
+ ┌──────────────────────────────────────────────┐
111
+ │ DEEP ANALYSIS [S001] [CRIT] │
112
+ │──────────────────────────────────────────────│
113
+ │ CURRENT CODE │ RECOMMENDED FIX │
114
+ │ [VULNERABLE] │ [SECURE] │
115
+ │ User.where( │ User.where( │
116
+ │ "name='#{x}'" │ name: x │
117
+ │ ) │ ) │
118
+ │──────────────────────────────────────────────│
119
+ │ Use Parameterized Queries │
120
+ │ Replace interpolation with safe bindings │
121
+ │──────────────────────────────────────────────│
122
+ │ [APPLY FIX] [SKIP] [INVESTIGATE MORE] │
123
+ └──────────────────────────────────────────────┘
124
+ ```
125
+
126
+ ### Phase 5: Extraction
127
+ Mission summary with action breakdown.
128
+
129
+ ```
130
+ ┌──────────────────────────────────────────────┐
131
+ │ MISSION COMPLETE [SECURE] │
132
+ │──────────────────────────────────────────────│
133
+ │ TOTAL: 8 FIXED: 5 SKIPPED: 2 ?: 1 │
134
+ │──────────────────────────────────────────────│
135
+ │ ┌───┐ │
136
+ │ │███│ Fixed (5) │
137
+ │ │░░░│ Skipped (2) │
138
+ │ │ │ Pending (1) │
139
+ │ └───┘ │
140
+ │──────────────────────────────────────────────│
141
+ │ [GENERATE REPORT] [NEW MISSION] [EXIT] │
142
+ └──────────────────────────────────────────────┘
143
+ ```
144
+
145
+ ## Analysis Capabilities
146
+
147
+ Claude performs real analysis using its native tools:
148
+
149
+ | Tool | What Claude Finds |
150
+ |------|-------------------|
151
+ | `Grep` | SQL injection, hardcoded secrets, eval, command injection patterns |
152
+ | `Glob` | File structure, file counts by type |
153
+ | `Read` | Long methods, deep nesting, actual code context |
154
+
155
+ No external analyzers needed - Claude IS the analyzer.
156
+
157
+ ## Directory Structure
158
+
159
+ ```
160
+ codebreaker/
161
+ ├── .claude/
162
+ │ ├── commands/
163
+ │ │ └── infiltrate.md # Slash command with full instructions
164
+ │ ├── settings.json # Committed permission template
165
+ │ └── settings.local.json # Local permissions (same as above)
166
+ └── README.md
167
+ ```
168
+
169
+ That's it. No templates/, no analyzers/, no generators/.
170
+
171
+ ## Benefits of Claude-Native Approach
172
+
173
+ | Old Approach | New Approach |
174
+ |--------------|--------------|
175
+ | Ruby templates (5 files) | Heredocs in command file |
176
+ | Bash analyzers (3 files) | Claude's Glob/Grep/Read |
177
+ | Many subprocesses | Just 4 streamweaver calls |
178
+ | Many permission prompts | Pre-allowed in settings |
179
+ | Scripted/mock findings | Claude's real analysis |
180
+ | Slow transitions | Fast (no subprocess spawn) |
181
+
182
+ ## Components Showcase
183
+
184
+ This demo uses these StreamWeaver components:
185
+
186
+ | Component | Where Used |
187
+ |-----------|------------|
188
+ | `header1-4` | All phases |
189
+ | `badge` | CLASSIFIED, severity indicators |
190
+ | `status_dot` | System status with pulse animation |
191
+ | `progress_bar` | Scanning animation |
192
+ | `stat_display` | Metrics dashboard |
193
+ | `bar_chart` | Findings by category |
194
+ | `pie_chart` | Action breakdown |
195
+ | `table` | Findings log |
196
+ | `collapsible` | Expandable sections |
197
+ | `columns` | Before/after code view |
198
+ | `card` | Content containers |
199
+ | `button` | Actions with callbacks |
200
+ | `radio_group` | Analysis type selection |
201
+ | `alert` | Recommendations |
202
+
203
+ ## Tips for Demos
204
+
205
+ 1. **Set the scene**: Let the CLASSIFIED badge and dark theme speak for themselves
206
+ 2. **Show real value**: Use it on a real codebase (StreamWeaver itself works great)
207
+ 3. **Claude's intelligence**: Point out that findings are from real code analysis
208
+ 4. **Interactive**: Let the audience pick which finding to investigate
209
+ 5. **The payoff**: The extraction summary with charts is satisfying
210
+
211
+ ## License
212
+
213
+ Part of the StreamWeaver examples. MIT License.
@@ -0,0 +1,453 @@
1
+ # StreamWeaver Canvas Tutorial
2
+
3
+ A freeform, conversational tutorial where users explore StreamWeaver at their own pace. No fixed order—they ask questions, you generate and render examples dynamically.
4
+
5
+ ## Quick Reference
6
+
7
+ **StreamWeaver Commands:**
8
+ ```bash
9
+ streamweaver panel <session> # Open panel (1x at start)
10
+ streamweaver canvas-push <session> # Push DSL via heredoc
11
+ streamweaver canvas-wait <session> # Wait for user input
12
+ streamweaver canvas-close <session> # Cleanup (1x at end)
13
+ ```
14
+
15
+ Use `learn` as the session name for all commands.
16
+
17
+ ## How This Tutorial Works
18
+
19
+ 1. **User asks naturally** - "Show me forms", "What charts are available?", "Make a dashboard"
20
+ 2. **You explain briefly** - 2-3 sentences in terminal
21
+ 3. **You render to canvas** - Show BOTH the DSL code AND the rendered output
22
+ 4. **User iterates** - "Make it red", "Add another field", "Try something else"
23
+
24
+ The canvas shows code + output so users learn the DSL by seeing real examples.
25
+
26
+ ---
27
+
28
+ ## Phase 1: Welcome
29
+
30
+ ### 1.1 Open Panel
31
+
32
+ ```bash
33
+ streamweaver panel learn --fresh
34
+ ```
35
+
36
+ ### 1.2 Push Welcome
37
+
38
+ ```bash
39
+ streamweaver canvas-push learn <<'DSL'
40
+ card do
41
+ header1 "StreamWeaver Tutorial"
42
+ md "Welcome! This is an interactive, freeform tutorial."
43
+ end
44
+
45
+ md "---"
46
+
47
+ card do
48
+ header2 "How This Works"
49
+ md <<-CONTENT
50
+ 1. **Ask anything** in the terminal - components, patterns, or "just show me something"
51
+ 2. **See code + output** here in the canvas
52
+ 3. **Iterate** - "make it blue", "add more fields", "try charts instead"
53
+ 4. **No fixed order** - explore what interests you
54
+ CONTENT
55
+ end
56
+
57
+ md "---"
58
+
59
+ card do
60
+ header3 "Topics You Can Explore"
61
+
62
+ hstack spacing: :md do
63
+ vstack do
64
+ badge "COMPONENTS", variant: :info
65
+ text "Forms, charts, tables, status indicators"
66
+ end
67
+ vstack do
68
+ badge "PATTERNS", variant: :success
69
+ text "Multi-step flows, dashboards, status pages"
70
+ end
71
+ vstack do
72
+ badge "EXAMPLES", variant: :warning
73
+ text "\"Show me a login form\", \"Make a dashboard\""
74
+ end
75
+ end
76
+ end
77
+
78
+ md "---"
79
+
80
+ text "Type your first question or request in the terminal..."
81
+ DSL
82
+ ```
83
+
84
+ ### 1.3 Tell User to Start
85
+
86
+ In terminal, say:
87
+ > The canvas is ready. What would you like to explore? Some ideas:
88
+ > - "Show me how text_field works"
89
+ > - "What chart options are there?"
90
+ > - "Make a dashboard with 3 stats"
91
+ > - Or describe anything you want to see
92
+
93
+ Wait for user input in the terminal conversation (not canvas-wait—this is conversational).
94
+
95
+ ---
96
+
97
+ ## Phase 2: Respond to Requests
98
+
99
+ When the user asks about something, follow this pattern:
100
+
101
+ ### 2.1 Brief Explanation (Terminal)
102
+
103
+ Give a 2-3 sentence explanation of the component or pattern.
104
+
105
+ ### 2.2 Generate & Push (Canvas)
106
+
107
+ Push DSL that shows BOTH the code AND the rendered output. Use this layout:
108
+
109
+ ```bash
110
+ streamweaver canvas-push learn <<'DSL'
111
+ card do
112
+ hstack justify: :between, align: :center do
113
+ header1 "Component: text_field"
114
+ badge "FORMS", variant: :info
115
+ end
116
+ end
117
+
118
+ md "---"
119
+
120
+ header2 "DSL Code"
121
+
122
+ md <<-CODE
123
+ ```ruby
124
+ text_field :email, placeholder: "you@example.com", label: "Email"
125
+ text_field :name, placeholder: "Your Name", label: "Name"
126
+ text_field :password, label: "Password"
127
+ ```
128
+ CODE
129
+
130
+ md "---"
131
+
132
+ header2 "Rendered Output"
133
+
134
+ card do
135
+ text_field :email, placeholder: "you@example.com", label: "Email"
136
+ text_field :name, placeholder: "Your Name", label: "Name"
137
+ text_field :password, label: "Password"
138
+ end
139
+
140
+ md "---"
141
+
142
+ text "Ask a follow-up, request modifications, or pick something else."
143
+ DSL
144
+ ```
145
+
146
+ ### 2.3 Offer Next Steps (Terminal)
147
+
148
+ Say something like:
149
+ > That's the basic text_field. You can ask:
150
+ > - "Add validation styling"
151
+ > - "Show me radio_group next"
152
+ > - "Make a complete login form"
153
+ > - Or anything else
154
+
155
+ ---
156
+
157
+ ## Component Examples
158
+
159
+ Use these as starting points. **Always show code + rendered output.**
160
+
161
+ ### Forms
162
+
163
+ **text_field:**
164
+ ```ruby
165
+ text_field :email, placeholder: "you@example.com", label: "Email"
166
+ ```
167
+
168
+ **radio_group:**
169
+ ```ruby
170
+ radio_group :plan, ["Free", "Pro", "Enterprise"], label: "Select Plan"
171
+ ```
172
+
173
+ **checkbox:**
174
+ ```ruby
175
+ checkbox :terms, "I agree to the terms"
176
+ ```
177
+
178
+ **select:**
179
+ ```ruby
180
+ select :country, ["United States", "Canada", "UK", "Other"], label: "Country"
181
+ ```
182
+
183
+ **button:**
184
+ ```ruby
185
+ button "Submit", id: "btn_submit", style: :primary
186
+ button "Cancel", id: "btn_cancel", style: :secondary
187
+ ```
188
+
189
+ ### Data Display
190
+
191
+ **table:**
192
+ ```ruby
193
+ table headers: ["Name", "Role", "Status"],
194
+ rows: [
195
+ ["Alice", "Engineer", "Active"],
196
+ ["Bob", "Designer", "Away"],
197
+ ["Carol", "PM", "Active"]
198
+ ],
199
+ striped: true, hoverable: true
200
+ ```
201
+
202
+ **bar_chart:**
203
+ ```ruby
204
+ bar_chart data: { "Jan": 120, "Feb": 150, "Mar": 180, "Apr": 210 }
205
+ ```
206
+
207
+ **pie_chart:**
208
+ ```ruby
209
+ pie_chart data: { "Desktop": 55, "Mobile": 35, "Tablet": 10 }
210
+ ```
211
+
212
+ **stat_display:**
213
+ ```ruby
214
+ hstack spacing: :lg do
215
+ stat_display value: 1234, label: "Users", color: :blue
216
+ stat_display value: 89, label: "Active", color: :green
217
+ stat_display value: 12, label: "Issues", color: :red
218
+ end
219
+ ```
220
+
221
+ ### Status Indicators
222
+
223
+ **status_dot:**
224
+ ```ruby
225
+ status_dot status: :green, pulse: true, label: "ONLINE"
226
+ status_dot status: :yellow, pulse: false, label: "WARNING"
227
+ status_dot status: :red, pulse: true, label: "ERROR"
228
+ ```
229
+
230
+ **progress_bar:**
231
+ ```ruby
232
+ progress_bar value: 65, max: 100
233
+ ```
234
+
235
+ **spinner:**
236
+ ```ruby
237
+ spinner size: :lg, label: "Loading..."
238
+ ```
239
+
240
+ **badge:**
241
+ ```ruby
242
+ hstack spacing: :sm do
243
+ badge "NEW", variant: :info
244
+ badge "BETA", variant: :warning
245
+ badge "DEPRECATED", variant: :danger
246
+ end
247
+ ```
248
+
249
+ **alert:**
250
+ ```ruby
251
+ alert variant: :success do
252
+ header4 "Success!"
253
+ text "Your changes have been saved."
254
+ end
255
+ ```
256
+
257
+ ### Layout
258
+
259
+ **card:**
260
+ ```ruby
261
+ card do
262
+ header2 "Card Title"
263
+ text "Card content goes here."
264
+ end
265
+ ```
266
+
267
+ **hstack/vstack:**
268
+ ```ruby
269
+ hstack spacing: :md, justify: :between do
270
+ text "Left"
271
+ text "Right"
272
+ end
273
+
274
+ vstack spacing: :sm do
275
+ text "Top"
276
+ text "Bottom"
277
+ end
278
+ ```
279
+
280
+ **columns:**
281
+ ```ruby
282
+ columns widths: ['50%', '50%'] do
283
+ column do
284
+ text "Left column"
285
+ end
286
+ column do
287
+ text "Right column"
288
+ end
289
+ end
290
+ ```
291
+
292
+ **collapsible:**
293
+ ```ruby
294
+ collapsible "Click to expand", expanded: false do
295
+ text "Hidden content here"
296
+ end
297
+ ```
298
+
299
+ ---
300
+
301
+ ## Pattern Examples
302
+
303
+ ### Login Form
304
+
305
+ ```ruby
306
+ card do
307
+ header1 "Sign In"
308
+ text_field :email, placeholder: "you@example.com", label: "Email"
309
+ text_field :password, label: "Password"
310
+ checkbox :remember, "Remember me"
311
+ button "Sign In", id: "btn_login", style: :primary
312
+ end
313
+ ```
314
+
315
+ ### Dashboard with Stats
316
+
317
+ ```ruby
318
+ header1 "Dashboard"
319
+
320
+ hstack spacing: :lg, justify: :around do
321
+ stat_display value: 1234, label: "Total Users", color: :blue
322
+ stat_display value: 89, label: "Active Now", color: :green
323
+ stat_display value: 12, label: "Issues", color: :red
324
+ end
325
+
326
+ md "---"
327
+
328
+ columns widths: ['60%', '40%'] do
329
+ column do
330
+ header3 "Traffic This Week"
331
+ bar_chart data: { "Mon": 120, "Tue": 150, "Wed": 180, "Thu": 140, "Fri": 200 }
332
+ end
333
+ column do
334
+ header3 "Device Distribution"
335
+ pie_chart data: { "Desktop": 55, "Mobile": 35, "Tablet": 10 }
336
+ end
337
+ end
338
+ ```
339
+
340
+ ### Status Page
341
+
342
+ ```ruby
343
+ card do
344
+ hstack justify: :between, align: :center do
345
+ header1 "System Status"
346
+ badge "OPERATIONAL", variant: :success
347
+ end
348
+ end
349
+
350
+ md "---"
351
+
352
+ vstack spacing: :md do
353
+ hstack justify: :between do
354
+ text "API Server"
355
+ status_dot status: :green, label: "Healthy"
356
+ end
357
+ hstack justify: :between do
358
+ text "Database"
359
+ status_dot status: :green, label: "Healthy"
360
+ end
361
+ hstack justify: :between do
362
+ text "Cache"
363
+ status_dot status: :yellow, label: "Degraded"
364
+ end
365
+ hstack justify: :between do
366
+ text "Search"
367
+ status_dot status: :green, label: "Healthy"
368
+ end
369
+ end
370
+ ```
371
+
372
+ ### Multi-Step Progress
373
+
374
+ ```ruby
375
+ card do
376
+ header1 "Setup Progress"
377
+ progress_bar value: 2, max: 4
378
+
379
+ hstack spacing: :lg, justify: :around do
380
+ vstack align: :center do
381
+ badge "1", variant: :success
382
+ text "Account"
383
+ end
384
+ vstack align: :center do
385
+ badge "2", variant: :success
386
+ text "Profile"
387
+ end
388
+ vstack align: :center do
389
+ badge "3", variant: :info
390
+ text "Settings"
391
+ end
392
+ vstack align: :center do
393
+ badge "4", variant: :default
394
+ text "Done"
395
+ end
396
+ end
397
+ end
398
+ ```
399
+
400
+ ---
401
+
402
+ ## Handling Modifications
403
+
404
+ When user asks to modify something ("make it blue", "add another field"):
405
+
406
+ 1. Acknowledge the request in terminal
407
+ 2. Regenerate the DSL with the changes
408
+ 3. Push updated canvas showing new code + output
409
+
410
+ Example:
411
+ > User: "Add a phone number field"
412
+ > You: "Adding phone number field to the form."
413
+ > [Push updated DSL with phone field added]
414
+
415
+ ---
416
+
417
+ ## Ending the Tutorial
418
+
419
+ When user says they're done, or asks to finish:
420
+
421
+ 1. Thank them in terminal
422
+ 2. Push a closing message to canvas
423
+ 3. Close the panel
424
+
425
+ ```bash
426
+ streamweaver canvas-push learn <<'DSL'
427
+ card do
428
+ header1 "Tutorial Complete"
429
+ md "Thanks for exploring StreamWeaver!"
430
+ md "**Next steps:**"
431
+ md "- Check out the [examples](https://github.com/...) for more patterns"
432
+ md "- Try building your own canvas workflow"
433
+ md "- Read the full DSL reference"
434
+ end
435
+ DSL
436
+ ```
437
+
438
+ Wait a moment, then close:
439
+
440
+ ```bash
441
+ streamweaver canvas-close learn
442
+ ```
443
+
444
+ ---
445
+
446
+ ## Key Principles
447
+
448
+ 1. **Conversational** - User talks naturally, you respond dynamically
449
+ 2. **Code + Output** - Always show both DSL and rendered result
450
+ 3. **Brief explanations** - Terminal text is concise; let canvas do the showing
451
+ 4. **No wrong questions** - Generate examples for whatever they ask
452
+ 5. **Iterative** - Encourage modifications and follow-ups
453
+ 6. **Real data** - Use realistic example data, not lorem ipsum