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,378 @@
|
|
|
1
|
+
# BuilderIO visual-plan vs StreamWeaver — Analysis & Steal Plan
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-06-17
|
|
4
|
+
**Source:** https://github.com/BuilderIO/skills/tree/main/skills/visual-plan
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. What Builder's visual-plan Is
|
|
9
|
+
|
|
10
|
+
An MCP-connected Claude Code skill that turns text plans into rich, hosted MDX
|
|
11
|
+
documents with structured blocks — file maps, decisions, annotated code,
|
|
12
|
+
wireframes, diagrams, and open question forms. Published to a hosted Plan viewer
|
|
13
|
+
at plan.agent-native.com. Two slash commands:
|
|
14
|
+
|
|
15
|
+
- `/visual-plan` — prospective: generate a plan *before* coding starts
|
|
16
|
+
- `/visual-recap` — retrospective: generate a visual summary *after* code is
|
|
17
|
+
committed (diff → annotated document)
|
|
18
|
+
|
|
19
|
+
The key workflow: Claude Code calls `get-plan-blocks` (live block registry),
|
|
20
|
+
then calls `create-visual-plan` / `create-visual-recap` with a structured
|
|
21
|
+
`PlanContent` object (version 2), receives a deep-link URL back, and shares that
|
|
22
|
+
URL. The plan is a static artifact — one-shot publish.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## 2. The Fundamental Difference
|
|
27
|
+
|
|
28
|
+
| Dimension | Builder visual-plan | StreamWeaver Canvas |
|
|
29
|
+
|---|---|---|
|
|
30
|
+
| **Delivery model** | One-shot static publish | Live push over Unix socket |
|
|
31
|
+
| **When it runs** | Before or after coding | *During* coding, incrementally |
|
|
32
|
+
| **Interactivity** | Comment/review in browser | Button callbacks, form state, `canvas-wait` |
|
|
33
|
+
| **Agent loop** | Publish → URL → done | Push → wait → user acts → push again |
|
|
34
|
+
| **Document format** | MDX with JSX components | Ruby DSL (block-based) |
|
|
35
|
+
| **Rendering** | Hosted React app | Local Sinatra + Alpine.js |
|
|
36
|
+
| **Planning components** | Rich (ImplementationMap, Decision, AnnotatedCode) | Sparse |
|
|
37
|
+
| **Data/chart components** | Sparse | Rich (Chart.js suite, KPI dashboard, pipeline) |
|
|
38
|
+
|
|
39
|
+
**StreamWeaver's irreplaceable moat:** liveness. Claude Code pushes while it
|
|
40
|
+
*thinks*. The canvas evolves in real time. Users can interrupt. That's
|
|
41
|
+
fundamentally more powerful for an active coding session.
|
|
42
|
+
|
|
43
|
+
**Builder's edge:** the planning-phase component vocabulary. `ImplementationMap`,
|
|
44
|
+
`Decision`, `AnnotatedCode`, `Wireframe` with device frames, and `Diff` blocks
|
|
45
|
+
are things StreamWeaver simply doesn't have.
|
|
46
|
+
|
|
47
|
+
The smart play: steal Builder's planning components and bring them into the live
|
|
48
|
+
canvas model. Best of both worlds — rich planning artifacts that *also* update
|
|
49
|
+
in real time as Claude Code works.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 3. Builder's Full Component Inventory
|
|
54
|
+
|
|
55
|
+
### Document blocks (`plan.mdx`)
|
|
56
|
+
|
|
57
|
+
| Component | What it does |
|
|
58
|
+
|---|---|
|
|
59
|
+
| `<RichText>` | Markdown prose with headings |
|
|
60
|
+
| `<Callout>` | Callout box — tones: `info`, `decision`, `risk`, `warning`, `success` |
|
|
61
|
+
| `<Checklist>` | Checkbox list |
|
|
62
|
+
| `<Table>` | Data table |
|
|
63
|
+
| `<Code>` | Syntax-highlighted code |
|
|
64
|
+
| `<CodeTabs>` | Tabbed code snippets |
|
|
65
|
+
| `<ImplementationMap>` | File path → note map |
|
|
66
|
+
| `<Wireframe>` | UI wireframe (html + css + surface) |
|
|
67
|
+
| `<Diagram>` | Architecture/flow diagram |
|
|
68
|
+
| `<Image>` | Image block |
|
|
69
|
+
| `<Tabs>` | Tabbed panel grouping |
|
|
70
|
+
| `<Columns>` | Column layout |
|
|
71
|
+
| `<CustomHtml>` | Raw HTML passthrough |
|
|
72
|
+
| `<QuestionForm>` | Open-ended review questions |
|
|
73
|
+
| `<VisualQuestions>` | Visual decision questionnaire |
|
|
74
|
+
| `<Decision>` | Structured options + `recommended` flag |
|
|
75
|
+
| `<Mermaid>` | Mermaid diagram |
|
|
76
|
+
| `<ApiEndpoint>` | Single API endpoint spec |
|
|
77
|
+
| `<OpenApiSpec>` | Full OpenAPI spec |
|
|
78
|
+
| `<DataModel>` | Entity relationship visualization |
|
|
79
|
+
| `<Diff>` | Code diff (split view) |
|
|
80
|
+
| `<FileTree>` | File tree navigator |
|
|
81
|
+
| `<JsonExplorer>` | Interactive JSON drill-down |
|
|
82
|
+
| `<AnnotatedCode>` | Code with line-number-pinned annotation bubbles |
|
|
83
|
+
|
|
84
|
+
### Canvas blocks (`canvas.mdx`)
|
|
85
|
+
|
|
86
|
+
| Component | What it does |
|
|
87
|
+
|---|---|
|
|
88
|
+
| `<DesignBoard>` | Root canvas wrapper |
|
|
89
|
+
| `<Section>` | Groups artboards by flow |
|
|
90
|
+
| `<Artboard>` | Individual screen/state |
|
|
91
|
+
| `<Screen>` | Wireframe HTML container with device chrome |
|
|
92
|
+
| `<Annotation>` | Callout bubble pinned to artboard edge |
|
|
93
|
+
|
|
94
|
+
Device surfaces: `browser`, `phone`, `tablet`, `desktop`, `popover`, `card`,
|
|
95
|
+
`widget`, `sheet`
|
|
96
|
+
|
|
97
|
+
Sketch aesthetic: rough.js overlay + Excalifont on all text = "this is a
|
|
98
|
+
planning sketch, not production UI"
|
|
99
|
+
|
|
100
|
+
Prototype navigation: `data-goto="artboard-id"` on buttons links screens
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 4. What `/visual-recap` Does (and Whether StreamWeaver Covers It)
|
|
105
|
+
|
|
106
|
+
**visual-recap** is the post-hoc counterpart. After Claude Code finishes a
|
|
107
|
+
coding task, `/visual-recap` takes the git diff and produces a visual document
|
|
108
|
+
summarizing:
|
|
109
|
+
- What files changed and why (`ImplementationMap`)
|
|
110
|
+
- Before/after code (`Diff` blocks, `AnnotatedCode`)
|
|
111
|
+
- Architecture changes (`Diagram`)
|
|
112
|
+
- Any decisions made during implementation
|
|
113
|
+
|
|
114
|
+
**Does StreamWeaver cover this?** Partially but not intentionally:
|
|
115
|
+
- `comparison` block handles before/after visually
|
|
116
|
+
- `code_block` shows code, `mermaid` handles architecture
|
|
117
|
+
- `dir_tree` with `[new]`/`[modified]`/`[deleted]` markers covers file changes
|
|
118
|
+
|
|
119
|
+
**What's missing:** there is no first-class "recap session" pattern. Nothing
|
|
120
|
+
that says "Claude Code just finished — here's what it did." Builder's
|
|
121
|
+
`create-visual-recap` is a *dedicated action* specifically designed to consume a
|
|
122
|
+
diff and output a structured recap document. StreamWeaver would need:
|
|
123
|
+
|
|
124
|
+
1. A `diff` block (split-view code diff, not just comparison panels)
|
|
125
|
+
2. A `recap_session` CLI command pattern: `streamweaver canvas-recap <session>`
|
|
126
|
+
3. Automatic session capture so Claude Code can call it at end-of-task
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 5. StreamWeaver's Existing Component Inventory (for reference)
|
|
131
|
+
|
|
132
|
+
### Layout
|
|
133
|
+
`div`, `card`/`card_header`/`card_body`/`card_footer`, `vstack`/`hstack`,
|
|
134
|
+
`grid`/`grid_area`, `columns`/`column`, `scroll_box`, `sticky`,
|
|
135
|
+
`overlay`/`fullbleed`, `collapsible`, `alert`, `hero`, `prose`, `app_header`
|
|
136
|
+
|
|
137
|
+
### Text / Display
|
|
138
|
+
`text`, `md`/`markdown`, `phrase`, `header1`–`header6`, `badge`, `status_dot`,
|
|
139
|
+
`type_tag`, `pulse_indicator`, `stat_display`, `score_table`, `status_badge`,
|
|
140
|
+
`pullquote`, `link_to`, `external_link_button`, `activity_item`,
|
|
141
|
+
`timeline_event`, `priority_item`
|
|
142
|
+
|
|
143
|
+
### Data Visualization
|
|
144
|
+
`bar_chart`, `hbar_chart`, `line_chart`, `sparkline`, `area_chart`, `pie_chart`,
|
|
145
|
+
`doughnut_chart`, `stacked_bar_chart`, `chart`, `kpi_dashboard`, `table`,
|
|
146
|
+
`mermaid`, `pipeline`, `image_block`, `code_block`
|
|
147
|
+
|
|
148
|
+
### Form / Input
|
|
149
|
+
`text_field`, `text_area`, `code_editor`, `checkbox`, `checkbox_group`,
|
|
150
|
+
`select`, `radio_group`, `tag_buttons`, `form`
|
|
151
|
+
|
|
152
|
+
### Navigation
|
|
153
|
+
`tabs`, `breadcrumbs`, `navbar`, `dropdown`, `sidebar_toc`
|
|
154
|
+
|
|
155
|
+
### Interactive / Overlays
|
|
156
|
+
`button`, `expandable_card`, `modal`, `show_toast`
|
|
157
|
+
|
|
158
|
+
### Visual / Presentation
|
|
159
|
+
`slide_container`, `comparison`, `callout`, `dir_tree`, `legend`, `flow_arrow`,
|
|
160
|
+
`layout_toggle`, `progress_bar`, `spinner`, `theme_preset`, `theme_toggle`,
|
|
161
|
+
`keyboard_shortcuts`
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 6. Gap Analysis — What Builder Has That StreamWeaver Doesn't
|
|
166
|
+
|
|
167
|
+
### Missing planning-phase components
|
|
168
|
+
|
|
169
|
+
| Builder Component | StreamWeaver Equivalent | Gap |
|
|
170
|
+
|---|---|---|
|
|
171
|
+
| `<ImplementationMap>` | None | **Full gap** — no file-to-rationale mapping |
|
|
172
|
+
| `<Decision>` | `button` (interactive) | Partial — no static decision-capture block |
|
|
173
|
+
| `<AnnotatedCode>` | `code_block` | Partial — no line-pinned annotation bubbles |
|
|
174
|
+
| `<Wireframe>` + device frames | None | **Full gap** — no device-framed mockups |
|
|
175
|
+
| `<Diagram>` sketch mode | `mermaid` (code-based) | Partial — no sketch/rough aesthetic |
|
|
176
|
+
| `<ApiEndpoint>` | None | Full gap |
|
|
177
|
+
| `<DataModel>` | `mermaid` ER | Partial |
|
|
178
|
+
| `<Diff>` | `comparison` | Partial — comparison is panel-level, not code-diff |
|
|
179
|
+
| `<FileTree>` | `dir_tree` | Mostly covered |
|
|
180
|
+
| `<JsonExplorer>` | None | Full gap (niche) |
|
|
181
|
+
| `<Callout tone="decision">` | `callout(:info/:warning/etc)` | Missing `decision` and `risk` tones |
|
|
182
|
+
| `<QuestionForm>` | None | Full gap (async review workflow) |
|
|
183
|
+
|
|
184
|
+
### Missing canvas/artboard model
|
|
185
|
+
|
|
186
|
+
StreamWeaver has no spatial artboard canvas — no `DesignBoard`, `Section`,
|
|
187
|
+
`Artboard`, device chrome, `Annotation` pins. The canvas is a single scrolling
|
|
188
|
+
panel, not a multi-screen design board.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 7. Steal List — Prioritized
|
|
193
|
+
|
|
194
|
+
### P0 — High value, relatively contained
|
|
195
|
+
|
|
196
|
+
**`implementation_map`**
|
|
197
|
+
```ruby
|
|
198
|
+
implementation_map files: [
|
|
199
|
+
{ path: "lib/auth/session.rb", note: "Add guest token issuer" },
|
|
200
|
+
{ path: "app/routes/checkout.rb", note: "Branch on guest vs auth user" },
|
|
201
|
+
{ path: "db/schema.rb", note: "Add guest_sessions table" }
|
|
202
|
+
]
|
|
203
|
+
```
|
|
204
|
+
Perfect for Claude Code pre-flight: show what's about to be touched and why.
|
|
205
|
+
Renders as a styled file-tree with inline rationale. Extremely low novelty risk
|
|
206
|
+
(it's just a structured list), high value for planning sessions.
|
|
207
|
+
|
|
208
|
+
**`decision` block**
|
|
209
|
+
```ruby
|
|
210
|
+
decision question: "How should guest sessions be stored?" do
|
|
211
|
+
option id: "jwt", label: "JWT in cookie", detail: "Stateless, no DB lookup"
|
|
212
|
+
option id: "opaque", label: "Opaque token in DB",
|
|
213
|
+
detail: "Revocable, enables account merge later", recommended: true
|
|
214
|
+
end
|
|
215
|
+
```
|
|
216
|
+
Planning is full of architecture forks. Capture them explicitly with a visual
|
|
217
|
+
treatment and a recommended path. Currently you'd approximate this with `callout`
|
|
218
|
+
+ `button`, but that's interactive not declarative/static.
|
|
219
|
+
|
|
220
|
+
### P1 — High value, moderate implementation
|
|
221
|
+
|
|
222
|
+
**`annotated_code`**
|
|
223
|
+
```ruby
|
|
224
|
+
annotated_code language: :ruby, annotations: [
|
|
225
|
+
{ line: 3, note: "Guest tokens use 'guest' role to restrict API scopes" },
|
|
226
|
+
{ line: 7, note: "24h TTL matches cleanup job cadence" }
|
|
227
|
+
] do
|
|
228
|
+
<<~RUBY
|
|
229
|
+
def issue_guest_token(email)
|
|
230
|
+
# ...
|
|
231
|
+
JWT.encode({ sub: email, role: 'guest' }, SECRET, exp: 24.hours.from_now)
|
|
232
|
+
end
|
|
233
|
+
RUBY
|
|
234
|
+
end
|
|
235
|
+
```
|
|
236
|
+
Code walkthroughs are a primary Claude Code output. Line-anchored annotations
|
|
237
|
+
are strictly better than prose-above-code-block for explaining what's happening
|
|
238
|
+
and why.
|
|
239
|
+
|
|
240
|
+
**`wireframe` with device frames**
|
|
241
|
+
```ruby
|
|
242
|
+
wireframe surface: :browser do
|
|
243
|
+
<<~HTML
|
|
244
|
+
<div class="page">
|
|
245
|
+
<header class="topbar">MyApp</header>
|
|
246
|
+
<main>
|
|
247
|
+
<h2>Continue as guest?</h2>
|
|
248
|
+
<button data-goto="b">Continue as Guest</button>
|
|
249
|
+
</main>
|
|
250
|
+
</div>
|
|
251
|
+
HTML
|
|
252
|
+
end
|
|
253
|
+
```
|
|
254
|
+
Browser/phone/tablet chrome wrapping HTML mockups. The `data-goto` prototype
|
|
255
|
+
navigation is a bonus. Closes the gap for product/design work entirely.
|
|
256
|
+
|
|
257
|
+
**`diff` block**
|
|
258
|
+
```ruby
|
|
259
|
+
diff language: :ruby do
|
|
260
|
+
before { "def old_method\n session.fetch(:user)\nend" }
|
|
261
|
+
after { "def current_user\n JWT.decode(token)\nend" }
|
|
262
|
+
end
|
|
263
|
+
```
|
|
264
|
+
The `comparison` block is panel-level. A `diff` block is line-level code diff
|
|
265
|
+
with +/- syntax and line numbers — distinct need, especially for the recap
|
|
266
|
+
use case.
|
|
267
|
+
|
|
268
|
+
### P2 — Lower effort additions
|
|
269
|
+
|
|
270
|
+
**Callout tones: `decision` and `risk`**
|
|
271
|
+
```ruby
|
|
272
|
+
callout :decision do
|
|
273
|
+
"Choose between JWT and opaque tokens before implementing — hard to reverse."
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
callout :risk do
|
|
277
|
+
"Guest sessions must expire. Proposed TTL: 24h. Missing this causes unbounded DB growth."
|
|
278
|
+
end
|
|
279
|
+
```
|
|
280
|
+
Two new tone values alongside existing `info/warning/success/error`. Semantic
|
|
281
|
+
precision matters in planning documents.
|
|
282
|
+
|
|
283
|
+
**`api_endpoint`**
|
|
284
|
+
```ruby
|
|
285
|
+
api_endpoint method: :post, path: "/api/v1/guest-sessions",
|
|
286
|
+
description: "Issue a guest session token",
|
|
287
|
+
params: [{ name: "email", type: "string", required: true }],
|
|
288
|
+
response: { token: "string", expires_at: "iso8601" }
|
|
289
|
+
```
|
|
290
|
+
Ruby shops need API planning surfaces. Mermaid sequence diagrams are clunky for
|
|
291
|
+
simple endpoint specs.
|
|
292
|
+
|
|
293
|
+
**Sketch/rough aesthetic mode**
|
|
294
|
+
A `:sketch` theme preset that adds a hand-drawn quality (grainy backgrounds,
|
|
295
|
+
rough borders, Excalifont or similar). Visually distinguishes "planning canvas"
|
|
296
|
+
from "production dashboard" — psychologically important for stakeholders.
|
|
297
|
+
|
|
298
|
+
### P3 — Consider later
|
|
299
|
+
|
|
300
|
+
- **`json_explorer`** — niche but useful for API response exploration
|
|
301
|
+
- **`data_model`** — mermaid ER covers most cases
|
|
302
|
+
- **`QuestionForm`** — async review workflow; `canvas-wait` is better for live sessions
|
|
303
|
+
- **Artboard/DesignBoard model** — full spatial canvas is a major architectural
|
|
304
|
+
undertaking; scope separately
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## 8. The visual-recap Gap
|
|
309
|
+
|
|
310
|
+
Builder's `/visual-recap` is a dedicated post-coding artifact:
|
|
311
|
+
|
|
312
|
+
> After Claude Code finishes a task, consume the git diff → produce a visual
|
|
313
|
+
> document with ImplementationMap, AnnotatedCode, Diff blocks, and Diagram
|
|
314
|
+
> showing what changed, how, and why.
|
|
315
|
+
|
|
316
|
+
StreamWeaver has no equivalent pattern. To close this gap:
|
|
317
|
+
|
|
318
|
+
1. **Add `diff` block** (prerequisite) — line-level split diff rendering
|
|
319
|
+
2. **Add `recap_panel` CLI command** — `streamweaver recap <session_name>` that:
|
|
320
|
+
- Runs `git diff HEAD~1` or takes a diff file
|
|
321
|
+
- Pushes a structured canvas: `implementation_map` + `annotated_code` + `diff`
|
|
322
|
+
+ `mermaid` architecture summary
|
|
323
|
+
- Optionally auto-saves as a doc: `docs/streamweaver_canvas/recap-<date>.rb`
|
|
324
|
+
3. **Companion Claude Code skill instruction**: at end of task, call
|
|
325
|
+
`streamweaver recap <session>` with the diff
|
|
326
|
+
|
|
327
|
+
This is a natural complement to the existing canvas-panel workflow and
|
|
328
|
+
would give StreamWeaver a distinct capability Builder doesn't have: the
|
|
329
|
+
recap is *live*, can show work-in-progress before the task is complete,
|
|
330
|
+
and can be updated incrementally.
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 9. Implementation Sequence
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
Phase 1 — Planning blocks (2-3 sessions)
|
|
338
|
+
├── implementation_map component + DSL method
|
|
339
|
+
├── decision block component + DSL method
|
|
340
|
+
└── callout :decision and :risk tones
|
|
341
|
+
|
|
342
|
+
Phase 2 — Code display (1-2 sessions)
|
|
343
|
+
├── annotated_code component (code + line-pinned annotation bubbles)
|
|
344
|
+
└── diff block (split-view line diff)
|
|
345
|
+
|
|
346
|
+
Phase 3 — Visual mockups (2-3 sessions)
|
|
347
|
+
├── wireframe component with surface presets (browser/phone/tablet/card)
|
|
348
|
+
├── data-goto prototype navigation
|
|
349
|
+
└── :sketch theme preset (rough aesthetic)
|
|
350
|
+
|
|
351
|
+
Phase 4 — API surface (1 session)
|
|
352
|
+
└── api_endpoint component
|
|
353
|
+
|
|
354
|
+
Phase 5 — Recap workflow (1-2 sessions)
|
|
355
|
+
├── streamweaver recap CLI command
|
|
356
|
+
└── Claude Code companion skill for end-of-task recap
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 10. What StreamWeaver Keeps as Moat
|
|
362
|
+
|
|
363
|
+
None of the above steals touch what makes StreamWeaver actually different:
|
|
364
|
+
|
|
365
|
+
- **Live socket push** — canvas updates as Claude Code thinks, not after
|
|
366
|
+
- **`canvas-wait`** — pause agent loop, wait for human interaction, resume
|
|
367
|
+
- **Full interactivity** — Alpine.js state, button callbacks, form submissions
|
|
368
|
+
- **Chart suite** — Chart.js charts, kpi_dashboard, pipeline, sparkline
|
|
369
|
+
- **Theme system** — editorial/technical/dark/warm presets
|
|
370
|
+
- **`slide_container`** — presentations inside the live canvas
|
|
371
|
+
|
|
372
|
+
Builder can't replicate liveness without rebuilding their whole architecture.
|
|
373
|
+
That's the real differentiator to protect and deepen.
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
*Analysis by Selene — June 2026*
|
|
378
|
+
*Reference: https://github.com/BuilderIO/skills/tree/main/skills/visual-plan*
|