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,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
|