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,55 @@
|
|
|
1
|
+
# Gemini Review Assessment
|
|
2
|
+
|
|
3
|
+
*Date: 2026-03-12*
|
|
4
|
+
*Gemini CLI run from stream_weaver root with full file access*
|
|
5
|
+
|
|
6
|
+
## Gemini's Points and Our Assessment
|
|
7
|
+
|
|
8
|
+
### Point 1: Three-Party "Hanging" Problem — RIGHT
|
|
9
|
+
Tab-close leaves `run_once!` hanging. "Shimmering death" (skeletons that never resolve) is real.
|
|
10
|
+
Stale request scoping to session ID is a good catch neither prior reviewer raised.
|
|
11
|
+
**Action:** Design cancellation path. `run_once!` needs timeout/heartbeat abort. Session-scope requests.
|
|
12
|
+
|
|
13
|
+
### Point 2: DSL Rigidity "Visual Wall" — HALF-RIGHT
|
|
14
|
+
Agents will occasionally need precise layout control. But escape hatch already exists:
|
|
15
|
+
`div(style: "position: relative; top: 20px") { mermaid "..." }`.
|
|
16
|
+
**Action:** Document `div(style:)` as the explicit escape hatch. No new component needed.
|
|
17
|
+
|
|
18
|
+
### Point 3: Token Efficiency "Context Bloat" — WRONG
|
|
19
|
+
Gemini's math is off. Current: agent reads ~30K tokens of reference material. With DSL: ~2-3K tokens of
|
|
20
|
+
DSL reference. Net savings of 25K+ input tokens. Retry costs (~500 tokens) are dwarfed by savings.
|
|
21
|
+
Structured DSL is MORE debuggable than raw HTML, not less.
|
|
22
|
+
**No action needed.** 80-85% claim holds.
|
|
23
|
+
|
|
24
|
+
### Point 4: "Phantom Option" Race Condition — GOOD CATCH
|
|
25
|
+
User requests options for Slide A, navigates to Slide B, options arrive for Slide A.
|
|
26
|
+
Neither prior reviewer caught this specific race condition.
|
|
27
|
+
**Action:** Address in generate-more spike. Push to state, re-render on navigate-back.
|
|
28
|
+
|
|
29
|
+
### Point 5: Push-to-State Not Push-to-DOM — BEST INSIGHT
|
|
30
|
+
Instead of SSE pushing HTML snippets to DOM targets, push new options to server-side state
|
|
31
|
+
and let StreamWeaver's reactive re-render handle display. This:
|
|
32
|
+
- Eliminates phantom option problem
|
|
33
|
+
- Keeps summary slide in sync automatically
|
|
34
|
+
- Aligns with StreamWeaver's existing reactive model
|
|
35
|
+
- Is simpler than SSE-to-DOM approach
|
|
36
|
+
**Action:** Revise generate-more architecture to push-to-state. Significant improvement.
|
|
37
|
+
|
|
38
|
+
Disagree with "JSON-over-HTTP as primary protocol" — DSL is right for Ruby-capable agents.
|
|
39
|
+
JSON API is the secondary protocol (already planned for Phase 5 per Codex review).
|
|
40
|
+
|
|
41
|
+
### Point 6: Component Rot — MOSTLY WRONG
|
|
42
|
+
StreamWeaver is a bounded DSL for agent-to-browser communication, not a general-purpose UI framework.
|
|
43
|
+
"Interactive maps" and "multi-step forms" are out of scope. CSS changes don't require DSL changes.
|
|
44
|
+
Theme presets can be added without touching components.
|
|
45
|
+
**No action needed** beyond keeping component set focused.
|
|
46
|
+
|
|
47
|
+
## Changes to Incorporate
|
|
48
|
+
|
|
49
|
+
| Point | Action | Priority |
|
|
50
|
+
|---|---|---|
|
|
51
|
+
| Tab-close cancellation | Design heartbeat + abort for `run_once!` | High (spike) |
|
|
52
|
+
| Session-scoped requests | Scope generate queue to session ID | High (spike) |
|
|
53
|
+
| Escape hatch docs | Document `div(style:)` pattern | Medium (Phase 1) |
|
|
54
|
+
| Phantom option race | Address in spike | High (spike) |
|
|
55
|
+
| Push-to-state | Revise generate-more to push state not DOM | High (architecture change) |
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Review Synthesis: DHH + Codex Second Opinion
|
|
2
|
+
|
|
3
|
+
## Verdict
|
|
4
|
+
Both reviewers approve the architecture. "Fundamentally sound" (DHH). "Solid" (Codex).
|
|
5
|
+
The DSL design is the strongest element — both reviewers independently praised it.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Where Both Reviewers Agree
|
|
10
|
+
|
|
11
|
+
### 1. Merge redundant components
|
|
12
|
+
- **VeCard → Card** with `depth:` option
|
|
13
|
+
- **DataTable → Table** with `sticky_header:`, `alternating:`, `scrollable:` options
|
|
14
|
+
- **ProgressIndicator → progress_bar** with `position: :fixed` variant
|
|
15
|
+
**Action:** Reduce component count from ~50 to ~35. Collapse CSS-only wrappers.
|
|
16
|
+
|
|
17
|
+
### 2. DSL reads beautifully
|
|
18
|
+
Both independently called out Section 10 examples as excellent. "Reads like prose" (DHH).
|
|
19
|
+
"DSL-first approach is well-reasoned" (Codex). No changes needed here.
|
|
20
|
+
|
|
21
|
+
### 3. Flat namespace is correct
|
|
22
|
+
Both approve. Shared components alongside existing ones. Deck subsystem namespaced.
|
|
23
|
+
|
|
24
|
+
### 4. Design deck as DSL methods, not subclass
|
|
25
|
+
Both approve. `design_deck` is like `tabs` or `modal`.
|
|
26
|
+
|
|
27
|
+
### 5. All 9 open questions mostly well-answered
|
|
28
|
+
DHH: "All nine recommendations are sound."
|
|
29
|
+
Codex: "Agree on 7 of 9" (disagrees on Q1 and partially on Q9).
|
|
30
|
+
|
|
31
|
+
### 6. Phase 1 (shared foundation) is correctly prioritized
|
|
32
|
+
Both agree: Mermaid, CodeBlock, theme enhancements first.
|
|
33
|
+
|
|
34
|
+
### 7. Polling for generate-more is acceptable
|
|
35
|
+
Both agree polling is fine for an operation that takes 5-15 seconds.
|
|
36
|
+
Codex suggests long-polling as documented future optimization.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Where They Differ
|
|
41
|
+
|
|
42
|
+
### State Management (Q1)
|
|
43
|
+
- **DHH:** "Start with server session (A). Do not prematurely optimize."
|
|
44
|
+
- **Codex:** "Start with file-backed state (B) from day one. Cookie overflow is when-not-if."
|
|
45
|
+
- **Resolution:** Codex is right here. User-generated notes make cookie overflow likely with 5+ slides. File-backed state is trivially harder to implement but avoids a painful mid-stream migration. **Go with (B).**
|
|
46
|
+
|
|
47
|
+
### Generate-More Complexity
|
|
48
|
+
- **DHH:** "Kill the state machine. Queue, poll, push. Three steps."
|
|
49
|
+
- **Codex:** "The state machine is too simple — missing CANCELLED, ERROR, PARTIAL states."
|
|
50
|
+
- **Resolution:** Both are right from different angles. DHH says don't over-plan it; Codex says don't under-plan it. **Compromise: spike it first** (Codex's recommendation). The spike will reveal which edge cases matter. Don't design the state machine on paper — discover it through implementation.
|
|
51
|
+
|
|
52
|
+
### Component Count
|
|
53
|
+
- **DHH:** "Cut by 40%. A div with a CSS class is still a div."
|
|
54
|
+
- **Codex:** "Slightly high but defensible. 50 is manageable."
|
|
55
|
+
- **Resolution:** **DHH is right.** Merge the CSS-only wrappers. The bar for a new component class should be "does it have behavior or state?" not "does it have styling?" Target ~30-35 components.
|
|
56
|
+
|
|
57
|
+
### Skill Entry Points (Section 6.5)
|
|
58
|
+
- **DHH:** "Kill them. The DSL is the API."
|
|
59
|
+
- **Codex:** "Start with Claude Code custom commands (option C)."
|
|
60
|
+
- **Resolution:** **DHH is right for the gem itself** — no Skill classes in StreamWeaver. **Codex is right for the agent integration** — custom commands are the right glue layer, living outside the gem.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## New Issues Raised (Codex Only)
|
|
65
|
+
|
|
66
|
+
### Must Address Before Implementation
|
|
67
|
+
1. **`beforeunload` / tab-close cancellation** — if user closes tab, `run_once!` hangs forever. Need a cancellation path. Critical.
|
|
68
|
+
2. **State ownership table** — document what state lives where (server/client/localStorage) and how it syncs. Essential for implementation clarity.
|
|
69
|
+
3. **Agent process lifecycle** — heartbeat, crash recovery, clean shutdown of polling thread when `run_once!` resolves.
|
|
70
|
+
4. **CSS naming convention** — enforce `sw-` prefix, define specificity rules before 35 components ship.
|
|
71
|
+
|
|
72
|
+
### Should Address (Medium Priority)
|
|
73
|
+
5. **Accessibility requirements** — `aria-live`, `aria-current`, `aria-busy` for key components.
|
|
74
|
+
6. **Scalability section** — soft limits (10 slides, 50 files) and hard limits (20 slides, 200 files).
|
|
75
|
+
7. **Phase 2 splitting** — 2a (slide nav), 2b (deck+selection), 2c (summary). Incremental validation.
|
|
76
|
+
8. **Integration test checkpoints** between phases.
|
|
77
|
+
9. **Double-submit prevention.**
|
|
78
|
+
|
|
79
|
+
### Can Defer (Low Priority)
|
|
80
|
+
10. **JSON-over-HTTP API** — secondary protocol for non-Ruby agents. Phase 5.
|
|
81
|
+
11. **Long-polling optimization** — document as future path.
|
|
82
|
+
12. **CDN fallback / offline degradation.**
|
|
83
|
+
13. **Touch/swipe navigation.**
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Revised Architecture Changes
|
|
88
|
+
|
|
89
|
+
Based on both reviews, the architecture should be updated:
|
|
90
|
+
|
|
91
|
+
### Component Changes
|
|
92
|
+
| Original | Revised | Rationale |
|
|
93
|
+
|----------|---------|-----------|
|
|
94
|
+
| VeCard | Card with `depth:` option | DHH + Codex agree |
|
|
95
|
+
| DataTable | Table with `sticky_header:` etc. | DHH + Codex agree |
|
|
96
|
+
| ProgressIndicator | progress_bar with `position: :fixed` | DHH |
|
|
97
|
+
| HeroSection | div with CSS class via `hero` DSL helper | DHH |
|
|
98
|
+
| Prose | div with CSS class | DHH |
|
|
99
|
+
| Pullquote | div with CSS class | DHH |
|
|
100
|
+
| FlowArrow | CSS-only, no component class | DHH |
|
|
101
|
+
| Legend | CSS-only, no component class | DHH |
|
|
102
|
+
| DesignDeckSkill | Removed (DSL is API) | DHH |
|
|
103
|
+
| VisualExplainerSkill | Removed (DSL is API) | DHH |
|
|
104
|
+
|
|
105
|
+
### State Management Change
|
|
106
|
+
- Cookie session → File-backed state (write JSON to temp file per session)
|
|
107
|
+
- Implement `DeckState` object abstracting storage backend (Codex)
|
|
108
|
+
|
|
109
|
+
### Generate-More Change
|
|
110
|
+
- Spike before designing state machine
|
|
111
|
+
- Phase 3 becomes "spike + implement based on findings"
|
|
112
|
+
|
|
113
|
+
### New Documentation Sections
|
|
114
|
+
- State ownership table
|
|
115
|
+
- CSS naming convention (`sw-` prefix)
|
|
116
|
+
- Accessibility requirements
|
|
117
|
+
- Scalability limits
|
|
118
|
+
- Agent lifecycle (heartbeat, crash, shutdown)
|
|
119
|
+
|
|
120
|
+
### Phase Refinement
|
|
121
|
+
- Phase 2 → 2a/2b/2c (incremental validation)
|
|
122
|
+
- Phase 5 → 5a/5b (utility components vs workflow features)
|
|
123
|
+
- Add integration test checkpoints
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## Revised Component Count: ~32
|
|
128
|
+
|
|
129
|
+
### Shared (8, down from 9)
|
|
130
|
+
Mermaid, CodeBlock, ImageBlock, SlideContainer, KeyboardShortcuts,
|
|
131
|
+
Toast, HtmlExporter, Chart
|
|
132
|
+
|
|
133
|
+
### Deck (9, down from 10)
|
|
134
|
+
DesignDeck, DeckSlide, DeckOption, DeckSummary,
|
|
135
|
+
GenerateMoreControls, SkeletonPlaceholder, ModelSelector,
|
|
136
|
+
ConfirmationBar, CloseOverlay
|
|
137
|
+
|
|
138
|
+
### Explainer-specific (5, down from 19)
|
|
139
|
+
SidebarToc, Comparison, Pipeline, Callout, KpiDashboard
|
|
140
|
+
|
|
141
|
+
### Enhanced existing (10, down from 12)
|
|
142
|
+
Card (+depth), Table (+sticky/alternating/scrollable),
|
|
143
|
+
Grid, Alert, StatDisplay, Collapsible, ProgressBar (+fixed),
|
|
144
|
+
RadioGroup, Theme (+presets/auto), AlpineJS adapter
|
|
145
|
+
|
|
146
|
+
### CSS-only helpers (no component class, just DSL methods wrapping div)
|
|
147
|
+
hero, prose, pullquote, dir_tree, legend, flow_arrow, layout_toggle
|
|
148
|
+
|
|
149
|
+
**Total: ~32 component classes + ~7 CSS helpers = ~39 DSL methods**
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Implementation State
|
|
2
|
+
|
|
3
|
+
## Current Wave: COMPLETE
|
|
4
|
+
## Status: ALL 15 TASKS DONE — 1427 tests, 0 failures
|
|
5
|
+
|
|
6
|
+
| Task | Status | Commit | Notes |
|
|
7
|
+
|------|--------|--------|-------|
|
|
8
|
+
| T1 | DONE | -- | Generate-more spike - push-to-state validated |
|
|
9
|
+
| T2 | DONE | -- | Theme + CSS foundation |
|
|
10
|
+
| T3 | DONE | -- | Mermaid component with zoom/pan, compact, ELK, theme-aware |
|
|
11
|
+
| T4 | DONE | -- | CodeBlock (Prism.js CDN, file header, truncation) + ImageBlock (caption, base64 export) |
|
|
12
|
+
| T5 | DONE | -- | KeyboardShortcuts (mod mapping, context suppression) + SlideContainer (swap/scroll_snap, progress bar, nav dots, counter, arrow key nav) |
|
|
13
|
+
| T6 | DONE | -- | Card depth/accent/label + Table alternating/scrollable/hover enhancements |
|
|
14
|
+
| T7 | DONE | -- | DesignDeck + DeckSlide + DeckOption shell with SlideContainer swap, auto-columns, ARIA, notes textarea |
|
|
15
|
+
| T8 | DONE | -- | DeckState file-backed store, selection + notes persistence, ARIA, number-key quick-select, selection JS/CSS |
|
|
16
|
+
| T9 | DONE | -- | DeckSummary auto-appended, selection/notes display, submit gating, final notes, submit sets _result for run_once!, fixed progress bar, sw- CSS |
|
|
17
|
+
| T10 | DONE | -- | Generate-more full implementation: GenerateMoreControls + SkeletonPlaceholder components, DeckState generate queue, 4-state machine (idle/generating/timed_out/cancelled), request versioning, server routes (generate/pending/add_option/cancel), push-to-state with SSE re-render, 56 tests |
|
|
18
|
+
| T11 | DONE | -- | SidebarToc (sticky sidebar, scroll spy, mobile horizontal bar) + Callout (5 variants, icon, colored border) + Comparison (side-by-side panels, responsive stacking) |
|
|
19
|
+
| T12 | DONE | -- | Pipeline (horizontal flow, arrow connectors, responsive vertical, status colors) + KpiDashboard (auto-fit grid, fadeIn animation, trend arrows, color accents) + Chart (Chart.js 4 CDN lazy load, bar/line/pie/doughnut/radar, dark mode aware) |
|
|
20
|
+
| T13 | DONE | -- | 7 CSS-only helpers (hero, prose, pullquote, dir_tree, legend, flow_arrow, layout_toggle) + HtmlExporter (self-contained HTML export, CDN collection, inline CSS, base64 images), 80 tests |
|
|
21
|
+
| T14 | DONE | -- | ModelSelector (provider filter pills, model list, DeckState persistence, visibility gating), ConfirmationBar (fixed top bar, slide-down animation, auto-hide timer, confirm/cancel buttons), CloseOverlay (full-screen blur backdrop, submitted/cancelled status, auto-close tab, countdown), server route /deck/set_model, sw- CSS prefix, 46 tests |
|
|
22
|
+
| T15 | DONE | -- | 5 theme presets (editorial/technical/warm/minimal/terminal), theme_preset DSL, Google Fonts injection, CSS animations (fadeIn/slideUp/fadeScale/shimmer/slideDown), stagger delays, slide transitions, prefers-reduced-motion, 104 tests |
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# Visual Skills Implementation Plan
|
|
2
|
+
|
|
3
|
+
*GSD Ralph-Loop Orchestration*
|
|
4
|
+
*Created: 2026-03-12*
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
This plan describes how to execute the 15 tasks in `tasks.md` using the GSD ralph-loop pattern: each task gets a fresh subagent with its own 200K context window, reads specs from files, produces independently committable output, and tracks progress via file-based state.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 1. State Tracking Files
|
|
15
|
+
|
|
16
|
+
### PLAN.md (this file)
|
|
17
|
+
- Describes the orchestration process
|
|
18
|
+
- Does not change during execution
|
|
19
|
+
|
|
20
|
+
### STATE.md
|
|
21
|
+
Create at: `docs/visual-skills/implementation/STATE.md`
|
|
22
|
+
|
|
23
|
+
Tracks live execution state. Format:
|
|
24
|
+
|
|
25
|
+
```markdown
|
|
26
|
+
# Implementation State
|
|
27
|
+
|
|
28
|
+
## Current Task: T2
|
|
29
|
+
## Last Completed: T1
|
|
30
|
+
## Status: IN_PROGRESS
|
|
31
|
+
|
|
32
|
+
| Task | Status | Commit | Notes |
|
|
33
|
+
|------|--------|--------|-------|
|
|
34
|
+
| T1 | DONE | abc1234 | Spike complete. See spike-findings.md |
|
|
35
|
+
| T2 | IN_PROGRESS | -- | Started theme enhancement |
|
|
36
|
+
| T3 | BLOCKED | -- | Waiting on T2 |
|
|
37
|
+
| T4 | NOT_STARTED | -- | |
|
|
38
|
+
| ... | | | |
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Status values: `NOT_STARTED`, `IN_PROGRESS`, `DONE`, `FAILED`, `BLOCKED`
|
|
42
|
+
|
|
43
|
+
### spike-findings.md
|
|
44
|
+
Created by T1 at: `docs/visual-skills/implementation/spike-findings.md`
|
|
45
|
+
Consumed by T10. Contains the discovered state machine, edge cases, and architectural decisions from the generate-more spike.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 2. Execution Order
|
|
50
|
+
|
|
51
|
+
### Wave 1: Spike + Foundation (parallel)
|
|
52
|
+
|
|
53
|
+
**T1 (Generate-More Spike)** and **T2 (Theme + CSS Foundation)** run first, in parallel. T1 has no dependencies. T2 is the foundation for everything else.
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
Subagent A: T1 (spike) -- standalone, ~40% context
|
|
57
|
+
Subagent B: T2 (theme) -- standalone, ~35% context
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Wave 2: Shared Components (parallel after T2)
|
|
61
|
+
|
|
62
|
+
Once T2 is done, T3, T4, T5, T6 can all run in parallel.
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
Subagent C: T3 (mermaid) -- needs T2
|
|
66
|
+
Subagent D: T4 (codeblock) -- needs T2
|
|
67
|
+
Subagent E: T5 (keyboard+slides) -- needs T2
|
|
68
|
+
Subagent F: T6 (card+table) -- needs T2
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Wave 3: Deck Core (sequential)
|
|
72
|
+
|
|
73
|
+
T7, T8, T9 are sequential (each builds on the previous).
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
Subagent G: T7 (deck shell) -- needs T5, T6
|
|
77
|
+
Subagent G: T8 (selection) -- needs T7
|
|
78
|
+
Subagent G: T9 (summary) -- needs T8
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### Wave 4: Generate-More + Explainer (parallel)
|
|
82
|
+
|
|
83
|
+
T10 needs both T1 and T8. T11, T12 need T2 and T6.
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
Subagent H: T10 (generate-more) -- needs T1, T8
|
|
87
|
+
Subagent I: T11 (explainer 1) -- needs T2, T6
|
|
88
|
+
Subagent J: T12 (explainer 2) -- needs T2, T6
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Wave 5: Polish (parallel)
|
|
92
|
+
|
|
93
|
+
T13, T14, T15 are independent of each other.
|
|
94
|
+
|
|
95
|
+
```
|
|
96
|
+
Subagent K: T13 (css helpers) -- needs T2
|
|
97
|
+
Subagent L: T14 (deck polish) -- needs T10
|
|
98
|
+
Subagent M: T15 (presets) -- needs T2
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Optimal Timeline (with parallelization)
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
Wave 1: T1 ───────── T2 ────────
|
|
105
|
+
Wave 2: T3 T4 T5 T6
|
|
106
|
+
Wave 3: T7 ── T8 ── T9
|
|
107
|
+
Wave 4: T10 T11 T12
|
|
108
|
+
Wave 5: T13 T14 T15
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
With maximum parallelization, critical path is: **T2 -> T5 -> T7 -> T8 -> T10 -> T14** (6 sequential steps).
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 3. Subagent Invocation Protocol
|
|
116
|
+
|
|
117
|
+
### Starting a Task
|
|
118
|
+
|
|
119
|
+
Each subagent receives a prompt like this:
|
|
120
|
+
|
|
121
|
+
```
|
|
122
|
+
You are implementing task T{N} of the StreamWeaver visual skills project.
|
|
123
|
+
|
|
124
|
+
Read these files first:
|
|
125
|
+
1. docs/visual-skills/implementation/tasks.md -- find task T{N}, read its full specification
|
|
126
|
+
2. docs/visual-skills/implementation/STATE.md -- verify dependencies are DONE
|
|
127
|
+
3. {each file listed in the task's "Input Files" section}
|
|
128
|
+
|
|
129
|
+
Your job:
|
|
130
|
+
- Create/modify ONLY the files listed in "Output Files"
|
|
131
|
+
- Meet ALL acceptance criteria
|
|
132
|
+
- Run tests: `bundle exec rspec {spec files}`
|
|
133
|
+
- Commit with message: "feat(visual-skills): T{N} - {task title}"
|
|
134
|
+
|
|
135
|
+
When done:
|
|
136
|
+
- Update STATE.md: set T{N} to DONE, record commit hash
|
|
137
|
+
- Unblock any tasks that depend on T{N}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Context Budget
|
|
141
|
+
|
|
142
|
+
Each task is designed to fit within ~50% of the 200K context window:
|
|
143
|
+
- Task spec reading: ~5%
|
|
144
|
+
- Input file reading: ~15-25%
|
|
145
|
+
- Implementation: ~15-20%
|
|
146
|
+
- Test output / iteration: ~5-10%
|
|
147
|
+
- Total: ~40-55%
|
|
148
|
+
|
|
149
|
+
This leaves ~50% headroom for debugging, retries, and exploratory reading.
|
|
150
|
+
|
|
151
|
+
### Commit Convention
|
|
152
|
+
|
|
153
|
+
Each task produces exactly one commit:
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
feat(visual-skills): T{N} - {task title}
|
|
157
|
+
|
|
158
|
+
- {bullet 1: what was created}
|
|
159
|
+
- {bullet 2: what was modified}
|
|
160
|
+
- {bullet 3: key decisions made}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
Example:
|
|
164
|
+
```
|
|
165
|
+
feat(visual-skills): T3 - Mermaid component
|
|
166
|
+
|
|
167
|
+
- Add Components::Mermaid with zoom/pan support
|
|
168
|
+
- Add mermaid() DSL method to DisplayDSL
|
|
169
|
+
- CDN loads Mermaid.js lazily via ESM import
|
|
170
|
+
- Theme-aware: reads data-theme for Mermaid themeVariables
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 4. Failure Recovery
|
|
176
|
+
|
|
177
|
+
### Task Fails Tests
|
|
178
|
+
|
|
179
|
+
1. Subagent fixes and retries within same context window
|
|
180
|
+
2. If context is exhausted, mark task as `FAILED` in STATE.md with notes
|
|
181
|
+
3. Next subagent reads STATE.md, sees failure notes, picks up where previous left off
|
|
182
|
+
|
|
183
|
+
### Task Produces Wrong Output
|
|
184
|
+
|
|
185
|
+
1. `git revert {commit}` the bad commit
|
|
186
|
+
2. Update STATE.md to `NOT_STARTED` with notes on what went wrong
|
|
187
|
+
3. Re-run with additional guidance in the prompt
|
|
188
|
+
|
|
189
|
+
### Dependency Not Ready
|
|
190
|
+
|
|
191
|
+
1. Subagent reads STATE.md, sees dependency is not `DONE`
|
|
192
|
+
2. Subagent reports `BLOCKED` and exits
|
|
193
|
+
3. Orchestrator retries after dependency completes
|
|
194
|
+
|
|
195
|
+
### Context Exhaustion
|
|
196
|
+
|
|
197
|
+
If a task is too large for one context window:
|
|
198
|
+
1. Split into T{N}a and T{N}b
|
|
199
|
+
2. First subagent commits partial work, updates STATE.md
|
|
200
|
+
3. Second subagent continues from committed state
|
|
201
|
+
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## 5. Integration Checkpoints
|
|
205
|
+
|
|
206
|
+
After each wave, run full test suite and verify integration:
|
|
207
|
+
|
|
208
|
+
### After Wave 2 (shared components)
|
|
209
|
+
```bash
|
|
210
|
+
bundle exec rspec spec/components/mermaid_spec.rb \
|
|
211
|
+
spec/components/code_block_spec.rb \
|
|
212
|
+
spec/components/image_block_spec.rb \
|
|
213
|
+
spec/components/keyboard_shortcuts_spec.rb \
|
|
214
|
+
spec/components/slide_container_spec.rb \
|
|
215
|
+
spec/components/card_depth_spec.rb \
|
|
216
|
+
spec/components/table_enhanced_spec.rb
|
|
217
|
+
```
|
|
218
|
+
Verify: existing tests still pass (`bundle exec rspec` -- full suite).
|
|
219
|
+
|
|
220
|
+
### After Wave 3 (deck core)
|
|
221
|
+
```bash
|
|
222
|
+
bundle exec rspec spec/components/deck/
|
|
223
|
+
```
|
|
224
|
+
Manual verification: run example deck app, navigate slides, select options, verify state persistence.
|
|
225
|
+
|
|
226
|
+
### After Wave 4 (generate-more + explainer)
|
|
227
|
+
```bash
|
|
228
|
+
bundle exec rspec spec/components/deck/generate_more_spec.rb \
|
|
229
|
+
spec/components/sidebar_toc_spec.rb \
|
|
230
|
+
spec/components/callout_spec.rb \
|
|
231
|
+
spec/components/comparison_spec.rb \
|
|
232
|
+
spec/components/pipeline_spec.rb \
|
|
233
|
+
spec/components/kpi_dashboard_spec.rb \
|
|
234
|
+
spec/components/chart_spec.rb
|
|
235
|
+
```
|
|
236
|
+
Manual verification: generate-more flow end-to-end with simulated agent.
|
|
237
|
+
|
|
238
|
+
### After Wave 5 (polish)
|
|
239
|
+
Full suite: `bundle exec rspec`
|
|
240
|
+
Manual verification: theme presets, HTML export, all deck workflows.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## 6. Running the Orchestrator
|
|
245
|
+
|
|
246
|
+
### Manual Orchestration (recommended to start)
|
|
247
|
+
|
|
248
|
+
The orchestrator is you (the human or the main Claude Code session). Steps:
|
|
249
|
+
|
|
250
|
+
1. **Initialize STATE.md:**
|
|
251
|
+
```bash
|
|
252
|
+
cat > docs/visual-skills/implementation/STATE.md << 'EOF'
|
|
253
|
+
# Implementation State
|
|
254
|
+
|
|
255
|
+
## Current Task: T1, T2
|
|
256
|
+
## Last Completed: --
|
|
257
|
+
## Status: IN_PROGRESS
|
|
258
|
+
|
|
259
|
+
| Task | Status | Commit | Notes |
|
|
260
|
+
|------|--------|--------|-------|
|
|
261
|
+
| T1 | NOT_STARTED | -- | |
|
|
262
|
+
| T2 | NOT_STARTED | -- | |
|
|
263
|
+
| T3 | BLOCKED | -- | Needs T2 |
|
|
264
|
+
| T4 | BLOCKED | -- | Needs T2 |
|
|
265
|
+
| T5 | BLOCKED | -- | Needs T2 |
|
|
266
|
+
| T6 | BLOCKED | -- | Needs T2 |
|
|
267
|
+
| T7 | BLOCKED | -- | Needs T5, T6 |
|
|
268
|
+
| T8 | BLOCKED | -- | Needs T7 |
|
|
269
|
+
| T9 | BLOCKED | -- | Needs T8 |
|
|
270
|
+
| T10 | BLOCKED | -- | Needs T1, T8 |
|
|
271
|
+
| T11 | BLOCKED | -- | Needs T2, T6 |
|
|
272
|
+
| T12 | BLOCKED | -- | Needs T2, T6 |
|
|
273
|
+
| T13 | BLOCKED | -- | Needs T2 |
|
|
274
|
+
| T14 | BLOCKED | -- | Needs T10 |
|
|
275
|
+
| T15 | BLOCKED | -- | Needs T2 |
|
|
276
|
+
EOF
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
2. **Launch Wave 1:** Start two subagent sessions (or one at a time):
|
|
280
|
+
- Session 1: "Implement task T1 per docs/visual-skills/implementation/tasks.md"
|
|
281
|
+
- Session 2: "Implement task T2 per docs/visual-skills/implementation/tasks.md"
|
|
282
|
+
|
|
283
|
+
3. **After each task completes:** Verify the commit, check STATE.md was updated, unblock dependent tasks.
|
|
284
|
+
|
|
285
|
+
4. **Launch next wave** when all dependencies are met.
|
|
286
|
+
|
|
287
|
+
### Automated Orchestration (future)
|
|
288
|
+
|
|
289
|
+
A script could automate the loop:
|
|
290
|
+
|
|
291
|
+
```ruby
|
|
292
|
+
#!/usr/bin/env ruby
|
|
293
|
+
# bin/ralph-loop.rb -- automated task orchestration
|
|
294
|
+
#
|
|
295
|
+
# Reads STATE.md, finds next runnable task (NOT_STARTED with all deps DONE),
|
|
296
|
+
# launches subagent, waits for completion, updates state.
|
|
297
|
+
#
|
|
298
|
+
# Not implemented yet -- manual orchestration is fine for 15 tasks.
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
---
|
|
302
|
+
|
|
303
|
+
## 7. Verification Checklist (End-to-End)
|
|
304
|
+
|
|
305
|
+
When all 15 tasks are complete:
|
|
306
|
+
|
|
307
|
+
- [ ] `bundle exec rspec` -- all tests pass (existing + new)
|
|
308
|
+
- [ ] Example design deck app renders and navigates
|
|
309
|
+
- [ ] Option selection persists across page reloads
|
|
310
|
+
- [ ] Generate-more flow works with simulated agent
|
|
311
|
+
- [ ] Summary slide shows all selections
|
|
312
|
+
- [ ] Theme toggle works (dark/light/auto)
|
|
313
|
+
- [ ] Theme presets apply correctly
|
|
314
|
+
- [ ] Explainer components render in isolation
|
|
315
|
+
- [ ] SidebarToc scroll spy works
|
|
316
|
+
- [ ] HTML export produces valid self-contained file
|
|
317
|
+
- [ ] CSS uses `sw-` prefix consistently
|
|
318
|
+
- [ ] No regressions in existing StreamWeaver functionality
|
|
319
|
+
- [ ] All components have ARIA attributes where applicable
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## 8. Key Risks and Mitigations
|
|
324
|
+
|
|
325
|
+
| Risk | Likelihood | Mitigation |
|
|
326
|
+
|------|-----------|------------|
|
|
327
|
+
| Generate-more state machine more complex than expected | High | T1 spike discovers reality before T10 commits to design |
|
|
328
|
+
| Pushable SSE insufficient for generate-more | Medium | Spike (T1) validates this early; fallback is WebSocket |
|
|
329
|
+
| Card/Table backward compat broken by enhancements | Low | T6 tests verify existing usage unchanged |
|
|
330
|
+
| Context window too small for T7 (deck shell) | Medium | Deck shell is the largest task at ~45%; can split into T7a/T7b if needed |
|
|
331
|
+
| AlpineJS adapter doesn't support new component patterns | Low | New components follow existing adapter pattern; adapter is well-understood |
|
|
332
|
+
| CDN loading conflicts (Mermaid + Prism + Chart.js) | Low | Each loads lazily only when component is used; no global conflicts expected |
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## 9. File Summary
|
|
337
|
+
|
|
338
|
+
| File | Purpose |
|
|
339
|
+
|------|---------|
|
|
340
|
+
| `docs/visual-skills/implementation/plan.md` | This file -- how to run the ralph-loop |
|
|
341
|
+
| `docs/visual-skills/implementation/tasks.md` | All 15 tasks with specs |
|
|
342
|
+
| `docs/visual-skills/implementation/STATE.md` | Live execution state (create at start) |
|
|
343
|
+
| `docs/visual-skills/implementation/spike-findings.md` | T1 output, consumed by T10 |
|
|
344
|
+
| `docs/visual-skills/SESSION-CONTEXT.md` | Overall project context |
|
|
345
|
+
| `docs/visual-skills/design/architecture.md` | Architecture reference |
|
|
346
|
+
| `docs/visual-skills/design/review-synthesis.md` | Post-review decisions |
|
|
347
|
+
| `docs/visual-skills/analysis/components.md` | Component inventory |
|