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,632 @@
1
+ # Operation: CODEBREAKER
2
+
3
+ You are running an interactive code analysis mission with spy/hacker aesthetic. This is a Claude-native implementation - YOU do the analysis using your own tools (Glob, Grep, Read), not external scripts.
4
+
5
+ ## Quick Reference
6
+
7
+ **StreamWeaver Commands:**
8
+ ```bash
9
+ streamweaver canvas-reset <session> # Clear state for fresh start (safe if no session)
10
+ streamweaver panel <session> # Open panel (1x at start)
11
+ streamweaver canvas-push <session> # Push DSL via heredoc
12
+ streamweaver canvas-wait <session> # Wait for user input
13
+ streamweaver canvas-toast <session> <msg> # Show toast overlay (doesn't replace content)
14
+ streamweaver canvas-close <session> # Cleanup (1x at end)
15
+ ```
16
+
17
+ **Toast for permission prompts:** When you need to use tools that require permission (Glob, Grep, Read on new paths), show a toast first so the user knows to check the terminal:
18
+ ```bash
19
+ streamweaver canvas-toast codebreaker "Check terminal for authorization" --variant warning
20
+ ```
21
+
22
+ ## How This Works
23
+
24
+ 1. **Bash heredocs** (`<<'DSL' ... DSL`) pass the DSL string to streamweaver
25
+ 2. **Ruby heredocs within DSL** (`<<-MARKDOWN ... MARKDOWN`) handle multi-line content inside the DSL
26
+ 3. **YOU generate the DSL dynamically** - the examples are templates, fill in real values from your analysis
27
+ 4. **State flows linearly** but user button clicks can jump between phases
28
+
29
+ **Note on Heredocs:** The DSL is pushed via Bash heredoc (`<<'DSL'`). Within the DSL, you can use Ruby heredocs (`<<-CONTENT`) for multi-line strings like markdown blocks. The outer heredoc is Bash, the inner heredocs are Ruby DSL syntax.
30
+
31
+ ## CRITICAL: canvas_continue vs canvas-wait
32
+
33
+ **These are mutually exclusive patterns:**
34
+
35
+ ### Pattern A: Showing progress while YOU work
36
+ ```
37
+ canvas-push with canvas_continue message: "Working..." → shows spinner
38
+ DO YOUR WORK with Glob/Grep/Read tools
39
+ canvas-push with results (NO canvas_continue) → shows final UI
40
+ canvas-wait → wait for user
41
+ ```
42
+
43
+ ### Pattern B: Presenting UI for user interaction
44
+ ```
45
+ canvas-push with buttons/forms (NO canvas_continue) → shows interactive UI
46
+ canvas-wait → wait for user click
47
+ ```
48
+
49
+ **NEVER combine `canvas_continue` with `canvas-wait`** - that's contradictory:
50
+ - `canvas_continue` says "I'm working, here's a spinner"
51
+ - `canvas-wait` says "I'm done, waiting for you to click"
52
+
53
+ If you push a spinner then immediately wait, the user sees a loading spinner but nothing is happening.
54
+
55
+ ---
56
+
57
+ ## PHASE 1: Session Setup & Mission Briefing
58
+
59
+ ### 1.1 Reset & Open Panel
60
+
61
+ ```bash
62
+ # Clear any previous state (safe to run even if session doesn't exist)
63
+ streamweaver canvas-reset codebreaker 2>/dev/null || true
64
+ # Open the panel (reuses browser if already open)
65
+ streamweaver panel codebreaker
66
+ ```
67
+
68
+ Use `codebreaker` as the session name for all commands. The `canvas-reset` ensures a fresh start each time you run `/infiltrate`.
69
+
70
+ ### 1.2 Push Mission Briefing
71
+
72
+ First, detect potential targets in the current directory using Glob to find directories and code files.
73
+
74
+ Then push this DSL (customize the badge targets based on what you found):
75
+
76
+ ```bash
77
+ # NO canvas_continue here - we're showing a form and waiting for user input
78
+ streamweaver canvas-push codebreaker <<'DSL'
79
+ card do
80
+ hstack justify: :between, align: :center do
81
+ header1 "OPERATION: CODEBREAKER"
82
+ badge "CLASSIFIED", variant: :danger
83
+ end
84
+ end
85
+
86
+ md "---"
87
+
88
+ card do
89
+ hstack spacing: :lg do
90
+ vstack do
91
+ status_dot status: :green, pulse: true, label: "SYSTEM ONLINE"
92
+ end
93
+ vstack do
94
+ status_dot status: :yellow, pulse: false, label: "AWAITING TARGET"
95
+ end
96
+ vstack do
97
+ status_dot status: :gray, pulse: false, label: "ANALYSIS PENDING"
98
+ end
99
+ end
100
+ end
101
+
102
+ md "---"
103
+
104
+ header2 "MISSION BRIEFING"
105
+
106
+ md <<-BRIEFING
107
+ Agent, your mission is to **infiltrate** the target codebase and extract
108
+ actionable intelligence. You will analyze code patterns, identify vulnerabilities,
109
+ and report findings for tactical response.
110
+
111
+ **Objectives:**
112
+ - Scan target filesystem
113
+ - Identify security vulnerabilities
114
+ - Assess code complexity
115
+ - Generate intelligence report
116
+ BRIEFING
117
+
118
+ md "---"
119
+
120
+ header3 "TARGET SELECTION"
121
+
122
+ text_field :target, placeholder: "Enter path to target directory or file...", value: ""
123
+
124
+ md ""
125
+ text "Quick targets detected:"
126
+
127
+ hstack spacing: :sm do
128
+ badge ".", variant: :info
129
+ badge "lib", variant: :info
130
+ badge "app", variant: :info
131
+ badge "src", variant: :info
132
+ end
133
+
134
+ md "---"
135
+
136
+ header3 "ANALYSIS PARAMETERS"
137
+
138
+ radio_group :analysis_type, ["Full Infiltration (all)", "Complexity Intel", "Security Scan", "Structure Map"]
139
+
140
+ md "---"
141
+
142
+ hstack justify: :center, spacing: :lg do
143
+ button "ACCEPT MISSION", id: "btn_accept", style: :primary
144
+ button "ABORT", id: "btn_abort", style: :secondary
145
+ end
146
+
147
+ md ""
148
+ text "Secure channel established. Awaiting orders."
149
+ DSL
150
+ ```
151
+
152
+ ### 1.3 Wait for User Response
153
+
154
+ ```bash
155
+ streamweaver canvas-wait codebreaker --timeout 300
156
+ ```
157
+
158
+ Parse the JSON response. Extract:
159
+ - `target`: The path to analyze
160
+ - `analysis_type`: What kind of analysis to run
161
+ - Check `buttons_clicked` for "btn_abort" to exit early
162
+
163
+ ---
164
+
165
+ ## PHASE 2: Reconnaissance (Claude Does the Analysis)
166
+
167
+ ### 2.1 Push Scanning Animation (with canvas_continue)
168
+
169
+ ```bash
170
+ # USE canvas_continue here - we're showing progress while Claude works
171
+ # DO NOT call canvas-wait after this - instead, do the actual work!
172
+ streamweaver canvas-push codebreaker <<'DSL'
173
+ canvas_continue message: "Scanning target..."
174
+
175
+ card do
176
+ hstack justify: :between, align: :center do
177
+ header1 "RECONNAISSANCE"
178
+ badge "IN PROGRESS", variant: :warning
179
+ end
180
+ end
181
+
182
+ md "---"
183
+
184
+ card do
185
+ hstack spacing: :lg, justify: :center do
186
+ status_dot status: :green, pulse: true, label: "SCANNING"
187
+ status_dot status: :yellow, pulse: true, label: "ANALYZING"
188
+ status_dot status: :gray, pulse: false, label: "REPORTING"
189
+ end
190
+ end
191
+
192
+ md "---"
193
+
194
+ hstack justify: :center do
195
+ spinner size: :lg, label: "Analyzing codebase..."
196
+ end
197
+
198
+ md ""
199
+
200
+ progress_bar value: 25, max: 100
201
+
202
+ md ""
203
+ text "Infiltrating target filesystem..."
204
+ text "Stand by for intelligence extraction..."
205
+ DSL
206
+ ```
207
+
208
+ **IMMEDIATELY after pushing this, do the actual work with your tools (Glob, Grep, Read).
209
+ Do NOT call canvas-wait here - the spinner indicates YOU are working.**
210
+
211
+ ### 2.2 Perform Analysis Using YOUR Tools
212
+
213
+ **This is the key difference from v1 - YOU analyze the code directly.**
214
+
215
+ Use these tools on the TARGET path:
216
+
217
+ 1. **Structure Analysis (Glob)**:
218
+ - `Glob("TARGET/**/*.rb")` - Find all Ruby files
219
+ - `Glob("TARGET/**/*.py")` - Find all Python files
220
+ - `Glob("TARGET/**/*.js")` - Find all JavaScript files
221
+ - Count files, identify large directories
222
+
223
+ 2. **Security Analysis (Grep)**:
224
+ - `Grep(pattern: 'eval\s*\(', path: TARGET)` - Unsafe eval
225
+ - `Grep(pattern: '\.where\(.*#\{', path: TARGET)` - SQL injection
226
+ - `Grep(pattern: 'api_key|secret|password|token.*=.*["\']', path: TARGET, '-i': true)` - Hardcoded secrets
227
+ - `Grep(pattern: 'system\(|exec\(|`.*#\{', path: TARGET)` - Command injection
228
+
229
+ 3. **Complexity Analysis (Read + Analysis)**:
230
+ - Read files and count lines
231
+ - Look for methods over 50 lines
232
+ - Look for deep nesting (4+ levels)
233
+ - Identify files over 500 lines
234
+
235
+ ### 2.3 Build Findings List
236
+
237
+ As you analyze, build a list of findings. Each finding should have:
238
+ - `id`: Unique identifier (F001, F002, etc.)
239
+ - `type`: "security", "complexity", or "structure"
240
+ - `severity`: "critical", "warning", or "info"
241
+ - `file`: File path
242
+ - `line`: Line number
243
+ - `message`: Description of the issue
244
+ - `code`: Snippet of problematic code
245
+
246
+ ---
247
+
248
+ ## PHASE 3: Intelligence Report
249
+
250
+ ### 3.1 Generate Report DSL
251
+
252
+ Build the DSL dynamically based on YOUR findings. Here's the template structure:
253
+
254
+ ```bash
255
+ # NO canvas_continue - this has buttons, we'll wait for user to click
256
+ streamweaver canvas-push codebreaker <<'DSL'
257
+ card do
258
+ hstack justify: :between, align: :center do
259
+ header1 "INTELLIGENCE REPORT"
260
+ badge "N FINDINGS", variant: :info
261
+ end
262
+ end
263
+
264
+ md "---"
265
+
266
+ header3 "THREAT ASSESSMENT"
267
+
268
+ hstack spacing: :lg do
269
+ stat_display value: X, label: "CRITICAL", color: :red
270
+ stat_display value: Y, label: "WARNING", color: :yellow
271
+ stat_display value: Z, label: "INFO", color: :blue
272
+ end
273
+
274
+ md "---"
275
+
276
+ header3 "FINDINGS BY CATEGORY"
277
+
278
+ bar_chart data: { "Security": A, "Complexity": B, "Structure": C }
279
+
280
+ md "---"
281
+
282
+ header3 "PRIORITY FINDINGS"
283
+
284
+ vstack spacing: :md do
285
+ # For each finding, generate a card like this:
286
+ card do
287
+ hstack justify: :between, align: :start do
288
+ vstack do
289
+ hstack spacing: :sm do
290
+ badge "CRITICAL", variant: :danger
291
+ badge "SECURITY", variant: :default
292
+ end
293
+ header4 "F001: Potential SQL injection vulnerability"
294
+ text "app/models/user.rb:42"
295
+ end
296
+ button "INVESTIGATE", id: "investigate_F001"
297
+ end
298
+ end
299
+ # ... more finding cards
300
+ end
301
+
302
+ md "---"
303
+
304
+ header3 "FULL FINDINGS TABLE"
305
+
306
+ collapsible "Show All N Findings", expanded: false do
307
+ table headers: ["ID", "Type", "Severity", "File", "Line", "Message"], rows: [
308
+ ["F001", "security", "critical", "app/auth.rb", "42", "SQL injection..."],
309
+ # ... more rows
310
+ ], striped: true, hoverable: true
311
+ end
312
+
313
+ md "---"
314
+
315
+ hstack justify: :center, spacing: :lg do
316
+ button "EXTRACT REPORT", id: "btn_extract", style: :primary
317
+ button "NEW TARGET", id: "btn_new_target", style: :secondary
318
+ end
319
+ DSL
320
+ ```
321
+
322
+ **Important:** Fill in the actual values from your analysis!
323
+
324
+ **If no findings were discovered (clean code!):**
325
+
326
+ ```bash
327
+ # NO canvas_continue - has buttons for user interaction
328
+ streamweaver canvas-push codebreaker <<'DSL'
329
+ card do
330
+ hstack justify: :center do
331
+ header1 "ALL CLEAR"
332
+ badge "SECURE", variant: :success
333
+ end
334
+ end
335
+
336
+ md "---"
337
+
338
+ alert variant: :success do
339
+ header3 "No vulnerabilities detected"
340
+ text "The target codebase passed all reconnaissance checks. Well maintained code!"
341
+ end
342
+
343
+ md "---"
344
+
345
+ hstack justify: :center, spacing: :lg do
346
+ button "NEW TARGET", id: "btn_new_target", style: :primary
347
+ button "EXIT", id: "btn_exit", style: :secondary
348
+ end
349
+ DSL
350
+ ```
351
+
352
+ ### 3.2 Wait for User Selection
353
+
354
+ ```bash
355
+ streamweaver canvas-wait codebreaker --timeout 300
356
+ ```
357
+
358
+ Check response for:
359
+ - `buttons_clicked` containing "investigate_FXXX" → Go to Phase 4 with that finding
360
+ - `buttons_clicked` containing "btn_extract" → Go to Phase 5
361
+ - `buttons_clicked` containing "btn_new_target" → Go back to Phase 1
362
+
363
+ ---
364
+
365
+ ## PHASE 4: Deep Analysis
366
+
367
+ When user clicks "INVESTIGATE" on a finding, show detailed analysis.
368
+
369
+ ### 4.1 Read the Actual File
370
+
371
+ Use the Read tool to get the actual code around the finding's line number.
372
+
373
+ ### 4.2 Generate Recommendation
374
+
375
+ Based on the finding type, generate an appropriate fix recommendation:
376
+
377
+ **For SQL Injection:**
378
+ - Before: `User.where("name = '#{params[:name]}'")`
379
+ - After: `User.where(name: params[:name])`
380
+
381
+ **For Hardcoded Secrets:**
382
+ - Before: `API_KEY = 'sk-1234567890'`
383
+ - After: `API_KEY = ENV.fetch('API_KEY')`
384
+
385
+ **For Long Methods:**
386
+ - Recommend extracting into smaller methods
387
+
388
+ **For Deep Nesting:**
389
+ - Recommend guard clauses and early returns
390
+
391
+ ### 4.3 Push Deep Analysis View
392
+
393
+ ```bash
394
+ # NO canvas_continue - has buttons for user interaction
395
+ streamweaver canvas-push codebreaker <<'DSL'
396
+ card do
397
+ hstack justify: :between, align: :center do
398
+ header1 "DEEP ANALYSIS"
399
+ hstack spacing: :sm do
400
+ badge "F001", variant: :default
401
+ badge "CRITICAL", variant: :danger
402
+ end
403
+ end
404
+ end
405
+
406
+ md "---"
407
+
408
+ header3 "Potential SQL injection vulnerability"
409
+
410
+ card do
411
+ hstack spacing: :md do
412
+ vstack do
413
+ text "**File:**"
414
+ text "app/models/user.rb"
415
+ end
416
+ vstack do
417
+ text "**Line:**"
418
+ text "42"
419
+ end
420
+ vstack do
421
+ text "**Type:**"
422
+ text "Security"
423
+ end
424
+ end
425
+ end
426
+
427
+ md "---"
428
+
429
+ header3 "CODE ANALYSIS"
430
+
431
+ columns widths: ['50%', '50%'] do
432
+ column do
433
+ card do
434
+ header4 "CURRENT CODE"
435
+ badge "VULNERABLE", variant: :danger
436
+
437
+ md <<-CODE
438
+ ```ruby
439
+ User.where("name = '\#{params[:name]}'")
440
+ ```
441
+ CODE
442
+ end
443
+ end
444
+
445
+ column do
446
+ card do
447
+ header4 "RECOMMENDED FIX"
448
+ badge "SECURE", variant: :success
449
+
450
+ md <<-CODE
451
+ ```ruby
452
+ User.where(name: params[:name])
453
+ ```
454
+ CODE
455
+ end
456
+ end
457
+ end
458
+
459
+ md "---"
460
+
461
+ header3 "RECOMMENDATION"
462
+
463
+ alert variant: :info do
464
+ header4 "Use Parameterized Queries"
465
+ text "Replace string interpolation with parameterized queries to prevent SQL injection attacks."
466
+ end
467
+
468
+ md "---"
469
+
470
+ header3 "ACTION"
471
+
472
+ hstack justify: :center, spacing: :lg do
473
+ button "APPLY FIX", id: "btn_fix", style: :primary
474
+ button "SKIP", id: "btn_skip", style: :secondary
475
+ button "INVESTIGATE MORE", id: "btn_more"
476
+ end
477
+
478
+ md ""
479
+
480
+ hstack justify: :center do
481
+ button "BACK TO REPORT", id: "btn_back", style: :secondary
482
+ end
483
+ DSL
484
+ ```
485
+
486
+ ### 4.4 Handle User Action
487
+
488
+ ```bash
489
+ streamweaver canvas-wait codebreaker --timeout 300
490
+ ```
491
+
492
+ - "btn_fix" → Record action, return to report
493
+ - "btn_skip" → Record skip, return to report
494
+ - "btn_more" → Use your tools to investigate further, explain more
495
+ - "btn_back" → Return to Phase 3
496
+
497
+ ---
498
+
499
+ ## PHASE 5: Extraction (Mission Complete)
500
+
501
+ ### 5.1 Generate Summary
502
+
503
+ Calculate totals from your session:
504
+ - Total findings discovered
505
+ - Actions taken (fixed/skipped/pending)
506
+ - Overall mission rating
507
+
508
+ ### 5.2 Push Extraction View
509
+
510
+ ```bash
511
+ # NO canvas_continue - has buttons for user interaction
512
+ streamweaver canvas-push codebreaker <<'DSL'
513
+ card do
514
+ hstack justify: :between, align: :center do
515
+ header1 "MISSION COMPLETE"
516
+ badge "SECURE", variant: :success
517
+ end
518
+ end
519
+
520
+ md "---"
521
+
522
+ header2 "EXTRACTION SUMMARY"
523
+
524
+ card do
525
+ hstack spacing: :xl, justify: :around do
526
+ stat_display value: 5, label: "TOTAL FINDINGS", color: :blue
527
+ stat_display value: 2, label: "FIXED", color: :purple
528
+ stat_display value: 1, label: "SKIPPED", color: :default
529
+ stat_display value: 2, label: "PENDING", color: :red
530
+ end
531
+ end
532
+
533
+ md "---"
534
+
535
+ header3 "ACTION BREAKDOWN"
536
+
537
+ columns widths: ['50%', '50%'] do
538
+ column do
539
+ pie_chart data: { "Fixed": 2, "Skipped": 1, "Pending": 2 }
540
+ end
541
+
542
+ column do
543
+ card do
544
+ header4 "SEVERITY BREAKDOWN"
545
+ vstack spacing: :sm do
546
+ hstack do
547
+ badge "CRITICAL", variant: :danger
548
+ text "1 finding"
549
+ end
550
+ hstack do
551
+ badge "WARNING", variant: :warning
552
+ text "2 findings"
553
+ end
554
+ hstack do
555
+ badge "INFO", variant: :info
556
+ text "2 findings"
557
+ end
558
+ end
559
+ end
560
+ end
561
+ end
562
+
563
+ md "---"
564
+
565
+ header3 "MISSION DEBRIEF"
566
+
567
+ card do
568
+ md <<-DEBRIEF
569
+ **Operation Summary:**
570
+
571
+ The infiltration of the target codebase has been completed. A total of **5 intelligence items**
572
+ were extracted during reconnaissance.
573
+
574
+ **Key Observations:**
575
+ - 1 critical vulnerability requires immediate attention
576
+ - 2 warnings indicate areas for improvement
577
+ - 2 informational items noted for future reference
578
+
579
+ **Recommendation:** Further action recommended to secure the target.
580
+ DEBRIEF
581
+ end
582
+
583
+ md "---"
584
+
585
+ hstack justify: :center, spacing: :lg do
586
+ button "NEW MISSION", id: "btn_new_mission", style: :primary
587
+ button "EXIT", id: "btn_exit", style: :secondary
588
+ end
589
+
590
+ md ""
591
+
592
+ text "Secure channel will close upon exit. All intelligence has been logged."
593
+ DSL
594
+ ```
595
+
596
+ ### 5.3 Handle Final Action
597
+
598
+ ```bash
599
+ streamweaver canvas-wait codebreaker --timeout 300
600
+ ```
601
+
602
+ - "btn_new_mission" → Go back to Phase 1
603
+ - "btn_exit" → Close panel and end
604
+
605
+ ---
606
+
607
+ ## PHASE 6: Cleanup
608
+
609
+ When the mission is complete:
610
+
611
+ ```bash
612
+ streamweaver canvas-close codebreaker
613
+ ```
614
+
615
+ ---
616
+
617
+ ## Key Principles
618
+
619
+ 1. **YOU are the intelligence** - Use Glob, Grep, Read to analyze code directly
620
+ 2. **Dynamic DSL generation** - Build DSL with real data from your analysis
621
+ 3. **Smooth flow** - Only 4 streamweaver commands, all pre-approved
622
+ 4. **Real findings** - Show actual issues from the codebase, not mock data
623
+ 5. **Helpful recommendations** - Provide genuine fix suggestions based on what you find
624
+ 6. **canvas_continue = Claude working** - Use with spinner, then DO work, NO canvas-wait after
625
+ 7. **canvas-wait = waiting for user** - Push buttons/forms WITHOUT canvas_continue, then wait
626
+
627
+ ## Error Handling
628
+
629
+ - If target path doesn't exist, ask user to provide a valid path
630
+ - If no findings are discovered, congratulate user on clean code
631
+ - If user aborts, close panel gracefully
632
+ - Keep track of session state to handle navigation correctly
@@ -0,0 +1,11 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(streamweaver panel:*)",
5
+ "Bash(streamweaver canvas-push:*)",
6
+ "Bash(streamweaver canvas-wait:*)",
7
+ "Bash(streamweaver canvas-toast:*)",
8
+ "Bash(streamweaver canvas-close:*)"
9
+ ]
10
+ }
11
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(streamweaver panel:*)",
5
+ "Bash(streamweaver canvas-push:*)",
6
+ "Bash(streamweaver canvas-wait:*)",
7
+ "Bash(streamweaver canvas-toast:*)",
8
+ "Bash(streamweaver canvas-close:*)",
9
+ "Bash(streamweaver canvas-reset:*)",
10
+ "Bash(echo:*)",
11
+ "Bash(find:*)",
12
+ "Bash(wc:*)"
13
+ ],
14
+ "deny": [],
15
+ "ask": []
16
+ }
17
+ }