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.
- checksums.yaml +7 -0
- data/.beads/.gitignore +77 -0
- data/.beads/README.md +81 -0
- data/.beads/config.yaml +54 -0
- data/.beads/metadata.json +7 -0
- data/.rspec +3 -0
- data/AGENTS.md +91 -0
- data/CHANGELOG.md +294 -0
- data/CLAUDE.md +67 -0
- data/LICENSE.txt +21 -0
- data/README.md +565 -0
- data/Rakefile +13 -0
- data/assets/streamweaver-hero.jpg +0 -0
- data/bench/baselines/ledger.rb +58 -0
- data/bench/baselines/warroom.rb +51 -0
- data/bench/fixtures/ledger.rb +76 -0
- data/bench/fixtures/warroom.rb +60 -0
- data/bench/results/6daf8b8.md +102 -0
- data/bench/results/c8d749b.md +102 -0
- data/bench/results/eb06ab9.md +102 -0
- data/bench/run.rb +151 -0
- data/bench/support.rb +84 -0
- data/copy_this/dto_run_sample_run_7631.html +220 -0
- data/docs/SERVICE_MODE.md +302 -0
- data/docs/architecture/how_streamweaver_works.md +772 -0
- data/docs/blog/2026-01-16-streamweaver-introduction.md +515 -0
- data/docs/bug-2026-08-31-canvas-bridge-socket-collision.md +83 -0
- data/docs/canvas-ipc-session-summary.md +127 -0
- data/docs/canvas-panel-workflow.md +172 -0
- data/docs/canvas-read.md +147 -0
- data/docs/canvas-roadmap.md +275 -0
- data/docs/case-studies/2026-09-03-didx-canvas-read-shelf.md +147 -0
- data/docs/claude-code-companion-skill-spec.md +567 -0
- data/docs/components_reference.md +1223 -0
- data/docs/crud-patterns.md +265 -0
- data/docs/endpoints.md +122 -0
- data/docs/for_llms.md +1 -0
- data/docs/form-patterns.md +165 -0
- data/docs/frontend-only.md +169 -0
- data/docs/html-artifact-audit.md +238 -0
- data/docs/ideas/2025-01-01-as-a-service.md +203 -0
- data/docs/ideas/2026-01-16-charm-tui-exploration.md +542 -0
- data/docs/ideas/2026-08-27-static-doc-shelf-export.md +153 -0
- data/docs/ideas/dhh-review-future-refactors.md +142 -0
- data/docs/opal-jamstack.md +47 -0
- data/docs/opal-npm-direction.md +184 -0
- data/docs/opal-spike-findings.md +194 -0
- data/docs/plans/2025-12-16-form-blocks-design.md +124 -0
- data/docs/plans/2025-12-30-examples-browser-design.md +152 -0
- data/docs/plans/2026-01-02-charts-design.md +288 -0
- data/docs/plans/2026-01-10-canvas-ipc-design.md +247 -0
- data/docs/plans/2026-01-19-cabinet-control-components.md +176 -0
- data/docs/plans/2026-01-26-gem-release-and-panel.md +140 -0
- data/docs/plans/canvas-claude-project-design.md +238 -0
- data/docs/plans/canvas-doc-location-and-discovery.md +32 -0
- data/docs/plans/org-doc-preview-surfaces.md +293 -0
- data/docs/plans/shadcn-polish-plan.md +417 -0
- data/docs/porting-artifacts.md +252 -0
- data/docs/reference/agent-skills-comparison.md +369 -0
- data/docs/reference/travel-state-prd.artifact.html +780 -0
- data/docs/research/2026-08-17-hotwire-alike-landscape.md +268 -0
- data/docs/research/2026-08-17-hotwire-concept-map.md +404 -0
- data/docs/research/2026-08-22-lazy-fragments-trigger-decision.md +246 -0
- data/docs/research/2026-08-22-learnhotwire-syllabus-coverage.md +239 -0
- data/docs/research/frontend-only-matrix.md +278 -0
- data/docs/research/streamweaver-way-spike-findings.md +529 -0
- data/docs/resource-dsl.md +342 -0
- data/docs/routing.md +302 -0
- data/docs/ruby-ui-comparison.md +319 -0
- data/docs/shared-dsl-fragments.md +356 -0
- data/docs/streamweaver-for-ai-agents.md +401 -0
- data/docs/streamweaver-frontend-vision.md +123 -0
- data/docs/streamweaver_canvas/glimmer_initial_final_layer.rb +77 -0
- data/docs/streamweaver_canvas/save_example.rb +9 -0
- data/docs/templates.md +213 -0
- data/docs/testing.md +155 -0
- data/docs/theming-hooks.md +281 -0
- data/docs/tutorials/the-streamweaver-way.md +882 -0
- data/docs/university/capability-inventory.md +137 -0
- data/docs/university/dependency-survey.md +114 -0
- data/docs/university/design-spec.md +217 -0
- data/docs/university/mockups/code-block-doc-theme-dark.png +0 -0
- data/docs/university/mockups/code-block-doc-theme-light.png +0 -0
- data/docs/university/mockups/course-list-dark.png +0 -0
- data/docs/university/mockups/course-list-light.png +0 -0
- data/docs/university/mockups/course_canvas_mockup.rb +741 -0
- data/docs/university/mockups/step-screen-dark.png +0 -0
- data/docs/university/mockups/step-screen-light.png +0 -0
- data/docs/university/roadmap.md +72 -0
- data/docs/university/send-to-coworker.md +77 -0
- data/docs/university/worker-session-mining.md +109 -0
- data/docs/visual/browser-rendering-spike.md +173 -0
- data/docs/visual/builder-visual-plan-analysis.md +378 -0
- data/docs/visual/sw-plan-format-exploration.md +511 -0
- data/docs/visual/sw-plan-rendering-deep-dive.md +453 -0
- data/docs/visual-skills/PROGRESS.md +60 -0
- data/docs/visual-skills/SESSION-CONTEXT.md +207 -0
- data/docs/visual-skills/analysis/components.md +317 -0
- data/docs/visual-skills/analysis/overlap.md +360 -0
- data/docs/visual-skills/analysis/pi-design-deck.md +1102 -0
- data/docs/visual-skills/analysis/streamweaver-inventory.md +93 -0
- data/docs/visual-skills/analysis/unified-specs.feature +1003 -0
- data/docs/visual-skills/analysis/visual-explainer.md +964 -0
- data/docs/visual-skills/blog/blog-series-outline.md +39 -0
- data/docs/visual-skills/blog/token-efficiency.md +73 -0
- data/docs/visual-skills/design/architecture.md +1725 -0
- data/docs/visual-skills/design/codex-review.md +340 -0
- data/docs/visual-skills/design/dhh-review.md +209 -0
- data/docs/visual-skills/design/evolution.md +100 -0
- data/docs/visual-skills/design/gemini-review.md +55 -0
- data/docs/visual-skills/design/review-synthesis.md +149 -0
- data/docs/visual-skills/implementation/STATE.md +22 -0
- data/docs/visual-skills/implementation/plan.md +347 -0
- data/docs/visual-skills/implementation/spike-findings.md +237 -0
- data/docs/visual-skills/implementation/tasks.md +702 -0
- data/docs/visual-skills/lessons-learned/process.md +145 -0
- data/examples/README.md +96 -0
- data/examples/advanced/all_components.rb +177 -0
- data/examples/advanced/examples_browser.rb +394 -0
- data/examples/advanced/teachables_browser.rb +261 -0
- data/examples/advanced/theme_tweaker.rb +366 -0
- data/examples/advanced/tutorial.rb +1528 -0
- data/examples/agentic/agentic_form.rb +30 -0
- data/examples/agentic/agentic_form_autoclose.rb +30 -0
- data/examples/agentic/cultivation_tracker.rb +69 -0
- data/examples/basic/hello_world.rb +22 -0
- data/examples/basic/opal_tabs_table.rb +44 -0
- data/examples/basic/todo_list.rb +39 -0
- data/examples/button_loading_test.rb +36 -0
- data/examples/canvas/mermaid_canvas_demo.sh +151 -0
- data/examples/charts/bar_chart_demo.rb +57 -0
- data/examples/charts/line_chart_demo.rb +73 -0
- data/examples/charts/pie_area_demo.rb +87 -0
- data/examples/charts/stacked_bar_chart_demo.rb +69 -0
- data/examples/claude_code/README.md +85 -0
- data/examples/claude_code/codebreaker/.claude/commands/infiltrate.md +632 -0
- data/examples/claude_code/codebreaker/.claude/settings.json +11 -0
- data/examples/claude_code/codebreaker/.claude/settings.local.json +17 -0
- data/examples/claude_code/codebreaker/.claude/skills/infiltrate.md +0 -0
- data/examples/claude_code/codebreaker/README.md +213 -0
- data/examples/claude_code/tutorial/.claude/commands/learn.md +453 -0
- data/examples/claude_code/tutorial/README.md +102 -0
- data/examples/claude_code/verification_flow/.claude/commands/verify.md +171 -0
- data/examples/claude_code/verification_flow/README.md +126 -0
- data/examples/components/annotated_code_demo.rb +54 -0
- data/examples/components/callout_demo.rb +33 -0
- data/examples/components/checkbox_group_demo.rb +46 -0
- data/examples/components/design_review.css +468 -0
- data/examples/components/design_review_demo.rb +44 -0
- data/examples/components/design_review_dsl.rb +300 -0
- data/examples/components/diff_block_demo.rb +112 -0
- data/examples/components/events_demo.rb +184 -0
- data/examples/components/form_demo.rb +62 -0
- data/examples/components/lesson_demo.rb +53 -0
- data/examples/components/markdown_demo.rb +110 -0
- data/examples/components/mermaid_demo.rb +166 -0
- data/examples/components/pareto_set.rb +64 -0
- data/examples/components/prd_demo.rb +21 -0
- data/examples/components/prd_dsl.rb +385 -0
- data/examples/components/quiz_demo.rb +47 -0
- data/examples/components/run_viewer_demo.rb +100 -0
- data/examples/components/score_and_collapsible_demo.rb +82 -0
- data/examples/components/select_stale_value_smoke_test.rb +39 -0
- data/examples/components/table_demo.rb +247 -0
- data/examples/components/timer_with_state_demo.rb +58 -0
- data/examples/components/todo_due_dates.rb +63 -0
- data/examples/components/uat_gaps_demo.rb +112 -0
- data/examples/dashboard/feed_simulator.rb +60 -0
- data/examples/dashboard/live_dashboard.rb +80 -0
- data/examples/dashboard_components.rb +108 -0
- data/examples/deferred_fragments_demo.rb +62 -0
- data/examples/generate_more_spike/README.md +63 -0
- data/examples/generate_more_spike/app.rb +441 -0
- data/examples/git_health.sh +401 -0
- data/examples/layout/layout_components_demo.rb +174 -0
- data/examples/layout/modal_demo.rb +215 -0
- data/examples/layout/navigation_demo.rb +227 -0
- data/examples/layout/route_tabs_demo.rb +52 -0
- data/examples/layout/routing_demo.rb +52 -0
- data/examples/layout/scroll_box_demo.rb +154 -0
- data/examples/lazy_fragments_demo.rb +151 -0
- data/examples/my_todos/README.md +29 -0
- data/examples/my_todos/my_todos.rb +312 -0
- data/examples/my_todos/store.rb +86 -0
- data/examples/opal/reactive_demo.rb +62 -0
- data/examples/opal/scenarios/s1_counter.rb +15 -0
- data/examples/opal/scenarios/s2_search_filter.rb +17 -0
- data/examples/opal/scenarios/s3_sibling_tabs.rb +25 -0
- data/examples/opal/scenarios/s4_shopping_cart.rb +34 -0
- data/examples/opal/scenarios/s5_watch.rb +39 -0
- data/examples/opal/scenarios/s6_on_start.rb +20 -0
- data/examples/opal/scenarios/s7_wizard.rb +33 -0
- data/examples/opal/scenarios/s8_loan_calculator.rb +21 -0
- data/examples/opal/scenarios/s9_dashboard.rb +27 -0
- data/examples/operations_dashboard_demo.rb +167 -0
- data/examples/panel_demo.sh +447 -0
- data/examples/parity/assets/tyrion_slice.css +86 -0
- data/examples/parity/rivet_people_slice.rb +182 -0
- data/examples/parity/tyrion_components.css +777 -0
- data/examples/parity/tyrion_warroom_components.rb +414 -0
- data/examples/parity/tyrion_warroom_slice.rb +549 -0
- data/examples/puma_dev/README.md +124 -0
- data/examples/puma_dev/config.ru +34 -0
- data/examples/puma_dev/standalone_app.rb +34 -0
- data/examples/scaffolding/blog.rb +49 -0
- data/examples/scaffolding/utf_lite.rb +105 -0
- data/examples/styling/feedback_demo.rb +229 -0
- data/examples/styling/style_showcase.rb +172 -0
- data/examples/styling/theme_demo.rb +508 -0
- data/examples/timer_health_checker.rb +111 -0
- data/examples/timer_showcase.rb +131 -0
- data/examples/tutorials/render_markdown.rb +112 -0
- data/examples/tutorials/streamweaver_way_tutorial.rb +44 -0
- data/examples/tutorials/tutorial_content.rb +1082 -0
- data/examples/visual_skills/design_deck_demo.rb +314 -0
- data/examples/visual_skills/explainer_demo.rb +499 -0
- data/exe/streamweaver +9 -0
- data/gsd/ROADMAP-1.0.md +167 -0
- data/gsd/STATE.md +13 -0
- data/gsd/research/market-positioning-research.md +139 -0
- data/gsd/research/production-patterns-research.md +270 -0
- data/gsd/research/repo-audit-1.0.md +274 -0
- data/lib/stream_weaver/action_token.rb +58 -0
- data/lib/stream_weaver/adapter/alpinejs.rb +8249 -0
- data/lib/stream_weaver/adapter/base.rb +591 -0
- data/lib/stream_weaver/adapter/opal.rb +334 -0
- data/lib/stream_weaver/adapter/static.rb +1118 -0
- data/lib/stream_weaver/admin.rb +176 -0
- data/lib/stream_weaver/app.rb +1821 -0
- data/lib/stream_weaver/assets/js/sw-copy.js +50 -0
- data/lib/stream_weaver/assets/js/sw-heredoc-rewrite.js +68 -0
- data/lib/stream_weaver/assets/js/sw-keyboard.js +165 -0
- data/lib/stream_weaver/assets/js/sw-mermaid-zoom.js +621 -0
- data/lib/stream_weaver/assets/js/sw-route-tabs.js +53 -0
- data/lib/stream_weaver/assets/js/sw-sidebar-toc.js +116 -0
- data/lib/stream_weaver/assets/js/sw-slide-nav.js +103 -0
- data/lib/stream_weaver/canvas/bridge.rb +239 -0
- data/lib/stream_weaver/canvas/bridge_server.rb +646 -0
- data/lib/stream_weaver/canvas/client.rb +298 -0
- data/lib/stream_weaver/canvas/doc_roots.rb +233 -0
- data/lib/stream_weaver/canvas/doc_store.rb +252 -0
- data/lib/stream_weaver/canvas/gist_publisher.rb +264 -0
- data/lib/stream_weaver/canvas/gist_save_handler.rb +89 -0
- data/lib/stream_weaver/canvas/gist_store.rb +135 -0
- data/lib/stream_weaver/canvas/helpers.rb +109 -0
- data/lib/stream_weaver/canvas/history.rb +90 -0
- data/lib/stream_weaver/canvas/protocol.rb +86 -0
- data/lib/stream_weaver/canvas/reader.rb +853 -0
- data/lib/stream_weaver/canvas/save_doc_widget.rb +457 -0
- data/lib/stream_weaver/canvas/scroll_top_hint.rb +21 -0
- data/lib/stream_weaver/canvas/session.rb +132 -0
- data/lib/stream_weaver/cli.rb +3235 -0
- data/lib/stream_weaver/component_assets.rb +70 -0
- data/lib/stream_weaver/component_registry.rb +67 -0
- data/lib/stream_weaver/component_renderer.rb +48 -0
- data/lib/stream_weaver/components/annotated_code.rb +53 -0
- data/lib/stream_weaver/components/api_endpoint.rb +42 -0
- data/lib/stream_weaver/components/callout.rb +59 -0
- data/lib/stream_weaver/components/chart.rb +84 -0
- data/lib/stream_weaver/components/code_block.rb +77 -0
- data/lib/stream_weaver/components/comparison.rb +39 -0
- data/lib/stream_weaver/components/decision.rb +38 -0
- data/lib/stream_weaver/components/deck/close_overlay.rb +84 -0
- data/lib/stream_weaver/components/deck/confirmation_bar.rb +60 -0
- data/lib/stream_weaver/components/deck/deck_option.rb +61 -0
- data/lib/stream_weaver/components/deck/deck_slide.rb +77 -0
- data/lib/stream_weaver/components/deck/deck_state.rb +469 -0
- data/lib/stream_weaver/components/deck/deck_summary.rb +73 -0
- data/lib/stream_weaver/components/deck/design_deck.rb +60 -0
- data/lib/stream_weaver/components/deck/generate_more_controls.rb +84 -0
- data/lib/stream_weaver/components/deck/model_selector.rb +84 -0
- data/lib/stream_weaver/components/deck/skeleton_placeholder.rb +36 -0
- data/lib/stream_weaver/components/diff_block.rb +125 -0
- data/lib/stream_weaver/components/doc_header.rb +57 -0
- data/lib/stream_weaver/components/image_block.rb +70 -0
- data/lib/stream_weaver/components/implementation_map.rb +33 -0
- data/lib/stream_weaver/components/keyboard_shortcuts.rb +94 -0
- data/lib/stream_weaver/components/kpi_dashboard.rb +78 -0
- data/lib/stream_weaver/components/mermaid.rb +79 -0
- data/lib/stream_weaver/components/pipeline.rb +63 -0
- data/lib/stream_weaver/components/sidebar_toc.rb +46 -0
- data/lib/stream_weaver/components/slide_container.rb +141 -0
- data/lib/stream_weaver/components/timeline_event.rb +58 -0
- data/lib/stream_weaver/components/wireframe.rb +29 -0
- data/lib/stream_weaver/components/wireframe_block.rb +34 -0
- data/lib/stream_weaver/components.rb +2711 -0
- data/lib/stream_weaver/css.rb +230 -0
- data/lib/stream_weaver/dev_fallback_overlay.rb +61 -0
- data/lib/stream_weaver/display_dsl.rb +1004 -0
- data/lib/stream_weaver/export/html_exporter.rb +478 -0
- data/lib/stream_weaver/feed.rb +34 -0
- data/lib/stream_weaver/feed_builder.rb +31 -0
- data/lib/stream_weaver/fonts.rb +33 -0
- data/lib/stream_weaver/interaction_runner.rb +487 -0
- data/lib/stream_weaver/iterm.rb +460 -0
- data/lib/stream_weaver/layout_registry.rb +92 -0
- data/lib/stream_weaver/opal/bridge.rb +52 -0
- data/lib/stream_weaver/opal/builder.rb +193 -0
- data/lib/stream_weaver/opal/env.rb +29 -0
- data/lib/stream_weaver/opal/reactive_state.rb +75 -0
- data/lib/stream_weaver/opal/regexp_anchor_patch.rb +62 -0
- data/lib/stream_weaver/opal/renderer.rb +77 -0
- data/lib/stream_weaver/opal/runtime.rb +250 -0
- data/lib/stream_weaver/opal/shell.rb +145 -0
- data/lib/stream_weaver/opal/string_bridge.rb +50 -0
- data/lib/stream_weaver/opal/stubs/diff.min.js +1 -0
- data/lib/stream_weaver/opal/stubs/digest.rb +15 -0
- data/lib/stream_weaver/opal/stubs/marked.umd.js +79 -0
- data/lib/stream_weaver/opal/stubs/md5.rb +3 -0
- data/lib/stream_weaver/opal/stubs/morphdom.min.js +775 -0
- data/lib/stream_weaver/opal/stubs/prism-tomorrow.min.css +1 -0
- data/lib/stream_weaver/opal/stubs/prism.min.js +1967 -0
- data/lib/stream_weaver/opal_entry.rb +136 -0
- data/lib/stream_weaver/org/inline.rb +95 -0
- data/lib/stream_weaver/org/reader.rb +561 -0
- data/lib/stream_weaver/org/recording_context.rb +86 -0
- data/lib/stream_weaver/org/source_splitter.rb +63 -0
- data/lib/stream_weaver/org/writer.rb +300 -0
- data/lib/stream_weaver/page_shell.rb +530 -0
- data/lib/stream_weaver/portfile.rb +79 -0
- data/lib/stream_weaver/pushable.rb +42 -0
- data/lib/stream_weaver/resource/default_views.rb +111 -0
- data/lib/stream_weaver/resource/field_input.rb +25 -0
- data/lib/stream_weaver/resource/state_keys.rb +16 -0
- data/lib/stream_weaver/resource/store.rb +18 -0
- data/lib/stream_weaver/resource.rb +104 -0
- data/lib/stream_weaver/server.rb +1471 -0
- data/lib/stream_weaver/service.rb +1240 -0
- data/lib/stream_weaver/service_client.rb +104 -0
- data/lib/stream_weaver/session_store.rb +186 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/SKILL.md +66 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/examples/canvas-safe-showcase.rb +98 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/actions-and-buttons.md +47 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/charts-and-diagrams.md +38 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/deck.md +32 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/inputs-and-forms.md +65 -0
- data/lib/stream_weaver/skills/streamweaver-canvas-safe/references/tabs-and-navigation.md +53 -0
- data/lib/stream_weaver/skills/streamweaver-doc-builder/SKILL.md +298 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/SKILL.md +130 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example.css +468 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example.rb +39 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/design-review-example_dsl.rb +300 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/doc-parity-example.rb +24 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/examples/doc-parity-example_dsl.rb +385 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/checkpoints-and-forms.md +28 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/cleanup-and-panel.md +44 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/example-gallery.md +8 -0
- data/lib/stream_weaver/skills/streamweaver-visual-companion/references/persistence.md +58 -0
- data/lib/stream_weaver/skills/streamweaver-way/SKILL.md +396 -0
- data/lib/stream_weaver/skills/visual-plan/SKILL.md +201 -0
- data/lib/stream_weaver/skills/visual-recap/SKILL.md +244 -0
- data/lib/stream_weaver/streamer.rb +63 -0
- data/lib/stream_weaver/templates/choices.rb +149 -0
- data/lib/stream_weaver/templates/code.rb +157 -0
- data/lib/stream_weaver/templates/confirm.rb +110 -0
- data/lib/stream_weaver/templates/diff.rb +195 -0
- data/lib/stream_weaver/templates/info.rb +142 -0
- data/lib/stream_weaver/templates/table.rb +169 -0
- data/lib/stream_weaver/templates/wizard.rb +271 -0
- data/lib/stream_weaver/theme/auto_mode.rb +116 -0
- data/lib/stream_weaver/theme/presets.rb +555 -0
- data/lib/stream_weaver/theme.rb +639 -0
- data/lib/stream_weaver/university/canvas.rb +924 -0
- data/lib/stream_weaver/university/course.rb +699 -0
- data/lib/stream_weaver/university/demos/counter.rb +33 -0
- data/lib/stream_weaver/university/demos/dashboard.rb +147 -0
- data/lib/stream_weaver/university/demos/decision_form.rb +143 -0
- data/lib/stream_weaver/university/demos.rb +50 -0
- data/lib/stream_weaver/university/listener.rb +467 -0
- data/lib/stream_weaver/university/progress.rb +201 -0
- data/lib/stream_weaver/university/runner.rb +138 -0
- data/lib/stream_weaver/university/scripts/growing_doc.rb +609 -0
- data/lib/stream_weaver/university/scripts/growing_doc_state.rb +91 -0
- data/lib/stream_weaver/utils.rb +31 -0
- data/lib/stream_weaver/version.rb +5 -0
- data/lib/stream_weaver/views/canvas/reader_layout.erb +800 -0
- data/lib/stream_weaver/views.rb +3940 -0
- data/lib/stream_weaver.rb +122 -0
- data/llms.txt +1269 -0
- data/sig/stream_weaver.rbs +4 -0
- 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,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
|
+
}
|
|
File without changes
|