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,702 @@
|
|
|
1
|
+
# Visual Skills Implementation Tasks
|
|
2
|
+
|
|
3
|
+
*GSD Ralph-Loop Task Breakdown*
|
|
4
|
+
*Created: 2026-03-12*
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## Task Index
|
|
9
|
+
|
|
10
|
+
| ID | Title | Phase | Deps | Est. Context |
|
|
11
|
+
|----|-------|-------|------|-------------|
|
|
12
|
+
| T1 | Generate-More Spike | 3 (spike) | none | ~40% |
|
|
13
|
+
| T2 | Theme Enhancement + CSS Foundation | 1 | none | ~35% |
|
|
14
|
+
| T3 | Mermaid Component | 1 | T2 | ~30% |
|
|
15
|
+
| T4 | CodeBlock + ImageBlock Components | 1 | T2 | ~30% |
|
|
16
|
+
| T5 | KeyboardShortcuts + SlideContainer | 1 | T2 | ~40% |
|
|
17
|
+
| T6 | Card Depth + Table Enhancement | 1 | T2 | ~30% |
|
|
18
|
+
| T7 | Design Deck Shell (DesignDeck + DeckSlide + DeckOption) | 2a | T5, T6 | ~45% |
|
|
19
|
+
| T8 | Deck Selection State + File-Backed State | 2b | T7 | ~40% |
|
|
20
|
+
| T9 | DeckSummary + ProgressBar Enhancement | 2c | T8 | ~35% |
|
|
21
|
+
| T10 | Generate-More Full Implementation | 3 | T1, T8 | ~45% |
|
|
22
|
+
| T11 | Explainer Components: SidebarToc + Callout + Comparison | 4 | T2, T6 | ~35% |
|
|
23
|
+
| T12 | Explainer Components: Pipeline + KpiDashboard + Chart | 4 | T2, T6 | ~35% |
|
|
24
|
+
| T13 | CSS-Only Helpers + HtmlExporter | 5 | T2 | ~30% |
|
|
25
|
+
| T14 | Deck Polish: ModelSelector + ConfirmationBar + CloseOverlay | 5 | T10 | ~35% |
|
|
26
|
+
| T15 | Theme Presets + Typography + Animations | 5 | T2 | ~30% |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## T1: Generate-More Spike
|
|
31
|
+
|
|
32
|
+
**Phase:** 3 (spike first -- highest risk)
|
|
33
|
+
**Dependencies:** None (standalone spike)
|
|
34
|
+
**Estimated context:** ~40%
|
|
35
|
+
|
|
36
|
+
### Goal
|
|
37
|
+
Discover the generate-more state machine through implementation. This is the riskiest feature (agent-browser-agent loop with SSE push, polling, timeouts). Build the minimum viable version to learn what states and edge cases actually matter.
|
|
38
|
+
|
|
39
|
+
### Scope
|
|
40
|
+
Create a standalone spike app (not in the gem yet) that demonstrates:
|
|
41
|
+
1. Browser shows a "Generate More" button with prompt input
|
|
42
|
+
2. Clicking sends a request to the server (queues a generate request)
|
|
43
|
+
3. Server-side polling detects the request (simulating agent detection)
|
|
44
|
+
4. Skeleton placeholders appear while "generating"
|
|
45
|
+
5. New content pushes to state (push-to-state, not push-to-DOM)
|
|
46
|
+
6. Page re-renders with new content replacing skeletons
|
|
47
|
+
7. Timeout/cancellation path
|
|
48
|
+
|
|
49
|
+
### Input Files (subagent reads these)
|
|
50
|
+
- `docs/visual-skills/design/architecture.md` (sections 7-8 on generate-more)
|
|
51
|
+
- `docs/visual-skills/design/review-synthesis.md` (push-to-state decision)
|
|
52
|
+
- `docs/visual-skills/design/gemini-review.md` (push-to-state rationale)
|
|
53
|
+
- `docs/visual-skills/analysis/components.md` (section 2.5-2.6)
|
|
54
|
+
- `lib/stream_weaver/pushable.rb` (existing SSE infrastructure)
|
|
55
|
+
- `lib/stream_weaver/app.rb` (how apps work)
|
|
56
|
+
- `lib/stream_weaver/server.rb` (Sinatra routes)
|
|
57
|
+
|
|
58
|
+
### Output Files
|
|
59
|
+
- `examples/generate_more_spike/app.rb` -- standalone spike app
|
|
60
|
+
- `examples/generate_more_spike/README.md` -- findings document
|
|
61
|
+
- `docs/visual-skills/implementation/spike-findings.md` -- state machine discovered, edge cases found, decisions made
|
|
62
|
+
|
|
63
|
+
### Acceptance Criteria
|
|
64
|
+
- [ ] Can click "Generate More" and see skeleton placeholders
|
|
65
|
+
- [ ] Simulated agent responds within 5s, skeletons replaced with content
|
|
66
|
+
- [ ] Timeout after 15s shows error toast
|
|
67
|
+
- [ ] Cancel button aborts pending generation
|
|
68
|
+
- [ ] State machine documented with actual states found (not predicted)
|
|
69
|
+
- [ ] Push-to-state pattern validated (not push-to-DOM)
|
|
70
|
+
- [ ] Findings doc written for T10 to consume
|
|
71
|
+
|
|
72
|
+
### Notes
|
|
73
|
+
- Use `StreamWeaver::App` and `Pushable` as-is -- do not modify the gem
|
|
74
|
+
- Simulate agent behavior with a Thread.new that sleeps then pushes
|
|
75
|
+
- The spike is throwaway code -- T10 will do the real implementation
|
|
76
|
+
- Key question to answer: does `Pushable` SSE work for this, or do we need modifications?
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## T2: Theme Enhancement + CSS Foundation
|
|
81
|
+
|
|
82
|
+
**Phase:** 1 (shared foundation)
|
|
83
|
+
**Dependencies:** None
|
|
84
|
+
**Estimated context:** ~35%
|
|
85
|
+
|
|
86
|
+
### Goal
|
|
87
|
+
Establish the CSS custom property vocabulary and `sw-` prefix convention that all subsequent components depend on. Enhance the Theme module with auto-mode and the variable set needed by visual skills components.
|
|
88
|
+
|
|
89
|
+
### Scope
|
|
90
|
+
- Extend existing Theme module with CSS custom properties: `--sw-bg`, `--sw-surface`, `--sw-surface-elevated`, `--sw-border`, `--sw-text`, `--sw-text-dim`, `--sw-accent`, semantic node colors (`--sw-node-a/b/c`), status colors
|
|
91
|
+
- Add auto-mode (follows OS `prefers-color-scheme`)
|
|
92
|
+
- Add `data-theme` attribute management on `<html>`
|
|
93
|
+
- Add `<meta name="theme-color">` management
|
|
94
|
+
- Add localStorage persistence for theme override
|
|
95
|
+
- Establish `sw-` CSS prefix convention in a shared stylesheet
|
|
96
|
+
- CDN helper for loading Google Fonts
|
|
97
|
+
|
|
98
|
+
### Input Files
|
|
99
|
+
- `docs/visual-skills/analysis/components.md` (section 4.11 -- Theme enhancement)
|
|
100
|
+
- `docs/visual-skills/design/architecture.md` (section on theme)
|
|
101
|
+
- `lib/stream_weaver/theme.rb` (existing theme module)
|
|
102
|
+
- `lib/stream_weaver/adapter/alpinejs.rb` (how CDN scripts are loaded)
|
|
103
|
+
|
|
104
|
+
### Output Files
|
|
105
|
+
- `lib/stream_weaver/theme.rb` -- enhanced
|
|
106
|
+
- `lib/stream_weaver/assets/css/sw-foundation.css` -- CSS custom properties, `sw-` prefixed base styles
|
|
107
|
+
- `lib/stream_weaver/assets/js/sw-theme.js` -- auto-mode, toggle, localStorage
|
|
108
|
+
- `spec/theme_spec.rb` -- tests for theme enhancements
|
|
109
|
+
|
|
110
|
+
### Acceptance Criteria
|
|
111
|
+
- [ ] `--sw-*` custom properties defined for dark and light modes
|
|
112
|
+
- [ ] Auto-mode follows OS preference via `prefers-color-scheme`
|
|
113
|
+
- [ ] `data-theme` toggleable via JS function
|
|
114
|
+
- [ ] Theme persists in localStorage across page reloads
|
|
115
|
+
- [ ] `sw-` CSS prefix convention documented in code comments
|
|
116
|
+
- [ ] Existing StreamWeaver apps still work unchanged (backward compat)
|
|
117
|
+
- [ ] Tests pass
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## T3: Mermaid Component
|
|
122
|
+
|
|
123
|
+
**Phase:** 1 (shared foundation)
|
|
124
|
+
**Dependencies:** T2 (needs CSS custom properties for theming)
|
|
125
|
+
**Estimated context:** ~30%
|
|
126
|
+
|
|
127
|
+
### Goal
|
|
128
|
+
Implement the `mermaid` DSL method and component class. Both pi-design-deck and visual-explainer need Mermaid diagrams as a core building block.
|
|
129
|
+
|
|
130
|
+
### Scope
|
|
131
|
+
- `Components::Mermaid` class in `components/mermaid.rb`
|
|
132
|
+
- DSL method `mermaid(code, **options)` in `DisplayDSL`
|
|
133
|
+
- Adapter rendering in `AlpineJS` adapter
|
|
134
|
+
- CDN loading for Mermaid.js (ESM, mermaid@11)
|
|
135
|
+
- Zoom/pan support when `zoom: true`
|
|
136
|
+
- Compact mode for embedding in cards
|
|
137
|
+
- Theme-aware: reads `data-theme` for Mermaid themeVariables
|
|
138
|
+
- ELK layout support via CDN module
|
|
139
|
+
|
|
140
|
+
### Input Files
|
|
141
|
+
- `docs/visual-skills/analysis/components.md` (section 1.1)
|
|
142
|
+
- `docs/visual-skills/design/architecture.md` (component pattern)
|
|
143
|
+
- `lib/stream_weaver/components.rb` (existing component pattern)
|
|
144
|
+
- `lib/stream_weaver/display_dsl.rb` (existing DSL pattern)
|
|
145
|
+
- `lib/stream_weaver/adapter/alpinejs.rb` (adapter rendering pattern)
|
|
146
|
+
|
|
147
|
+
### Output Files
|
|
148
|
+
- `lib/stream_weaver/components/mermaid.rb`
|
|
149
|
+
- `lib/stream_weaver/assets/js/sw-mermaid-zoom.js` (~200 lines)
|
|
150
|
+
- Updates to `lib/stream_weaver/display_dsl.rb`
|
|
151
|
+
- Updates to `lib/stream_weaver/adapter/alpinejs.rb`
|
|
152
|
+
- `spec/components/mermaid_spec.rb`
|
|
153
|
+
|
|
154
|
+
### Acceptance Criteria
|
|
155
|
+
- [ ] `mermaid("graph LR; A-->B")` renders a Mermaid diagram
|
|
156
|
+
- [ ] `zoom: true` enables click-drag pan and Ctrl+scroll zoom
|
|
157
|
+
- [ ] `compact: true` renders minimal container for card embedding
|
|
158
|
+
- [ ] Dark/light theme switch updates Mermaid theme
|
|
159
|
+
- [ ] CDN loads lazily (only when mermaid component is used)
|
|
160
|
+
- [ ] Tests pass
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## T4: CodeBlock + ImageBlock Components
|
|
165
|
+
|
|
166
|
+
**Phase:** 1 (shared foundation)
|
|
167
|
+
**Dependencies:** T2 (needs CSS custom properties)
|
|
168
|
+
**Estimated context:** ~30%
|
|
169
|
+
|
|
170
|
+
### Goal
|
|
171
|
+
Implement syntax-highlighted code blocks and image display with captions. Both are used heavily by deck and explainer.
|
|
172
|
+
|
|
173
|
+
### Scope
|
|
174
|
+
- `Components::CodeBlock` class with Prism.js highlighting
|
|
175
|
+
- `Components::ImageBlock` class with caption and base64 export support
|
|
176
|
+
- DSL methods: `code_block(code, **options)`, `image_block(src, **options)`
|
|
177
|
+
- CDN loading for Prism.js with autoloader
|
|
178
|
+
- File header display for code blocks
|
|
179
|
+
- Truncation mode for thumbnail previews
|
|
180
|
+
|
|
181
|
+
### Input Files
|
|
182
|
+
- `docs/visual-skills/analysis/components.md` (sections 1.2, 1.9)
|
|
183
|
+
- `lib/stream_weaver/components.rb` (patterns)
|
|
184
|
+
- `lib/stream_weaver/display_dsl.rb` (DSL patterns)
|
|
185
|
+
- `lib/stream_weaver/adapter/alpinejs.rb` (adapter patterns)
|
|
186
|
+
|
|
187
|
+
### Output Files
|
|
188
|
+
- `lib/stream_weaver/components/code_block.rb`
|
|
189
|
+
- `lib/stream_weaver/components/image_block.rb`
|
|
190
|
+
- Updates to `lib/stream_weaver/display_dsl.rb`
|
|
191
|
+
- Updates to `lib/stream_weaver/adapter/alpinejs.rb`
|
|
192
|
+
- `spec/components/code_block_spec.rb`
|
|
193
|
+
- `spec/components/image_block_spec.rb`
|
|
194
|
+
|
|
195
|
+
### Acceptance Criteria
|
|
196
|
+
- [ ] `code_block("puts 'hi'", lang: "ruby")` renders highlighted code
|
|
197
|
+
- [ ] `code_block(code, file: "src/app.rb")` shows file path header
|
|
198
|
+
- [ ] `code_block(code, truncate: 10)` truncates to 10 lines
|
|
199
|
+
- [ ] `image_block("photo.png", caption: "Figure 1")` renders image with caption
|
|
200
|
+
- [ ] Prism.js CDN loads lazily
|
|
201
|
+
- [ ] Tests pass
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## T5: KeyboardShortcuts + SlideContainer
|
|
206
|
+
|
|
207
|
+
**Phase:** 1 (shared foundation)
|
|
208
|
+
**Dependencies:** T2 (needs theme foundation)
|
|
209
|
+
**Estimated context:** ~40%
|
|
210
|
+
|
|
211
|
+
### Goal
|
|
212
|
+
Implement the keyboard shortcut registry and slide container (both swap and scroll-snap modes). These are core navigation infrastructure for both deck and explainer.
|
|
213
|
+
|
|
214
|
+
### Scope
|
|
215
|
+
- `Components::KeyboardShortcuts` -- centralized shortcut registry
|
|
216
|
+
- `Components::SlideContainer` -- container with `:swap` and `:scroll_snap` modes
|
|
217
|
+
- JS for keyboard handling with context awareness (suppress in inputs)
|
|
218
|
+
- JS for slide navigation (swap DOM, progress tracking)
|
|
219
|
+
- Arrow key / Space navigation
|
|
220
|
+
- Progress bar integration (fixed-position variant)
|
|
221
|
+
|
|
222
|
+
### Input Files
|
|
223
|
+
- `docs/visual-skills/analysis/components.md` (sections 1.4, 1.6, 4.7)
|
|
224
|
+
- `docs/visual-skills/design/architecture.md`
|
|
225
|
+
- `lib/stream_weaver/components.rb`
|
|
226
|
+
- `lib/stream_weaver/display_dsl.rb`
|
|
227
|
+
- `lib/stream_weaver/adapter/alpinejs.rb`
|
|
228
|
+
|
|
229
|
+
### Output Files
|
|
230
|
+
- `lib/stream_weaver/components/keyboard_shortcuts.rb`
|
|
231
|
+
- `lib/stream_weaver/components/slide_container.rb`
|
|
232
|
+
- `lib/stream_weaver/assets/js/sw-keyboard.js`
|
|
233
|
+
- `lib/stream_weaver/assets/js/sw-slide-nav.js`
|
|
234
|
+
- Updates to `lib/stream_weaver/display_dsl.rb`
|
|
235
|
+
- Updates to `lib/stream_weaver/adapter/alpinejs.rb`
|
|
236
|
+
- `spec/components/keyboard_shortcuts_spec.rb`
|
|
237
|
+
- `spec/components/slide_container_spec.rb`
|
|
238
|
+
|
|
239
|
+
### Acceptance Criteria
|
|
240
|
+
- [ ] Keyboard shortcuts register and fire callbacks
|
|
241
|
+
- [ ] "mod" maps to Cmd on Mac, Ctrl elsewhere
|
|
242
|
+
- [ ] Shortcuts suppressed when focus is in text inputs
|
|
243
|
+
- [ ] SlideContainer `:swap` mode shows one slide at a time with Back/Next
|
|
244
|
+
- [ ] Arrow keys navigate between slides
|
|
245
|
+
- [ ] Fixed-position progress bar updates on navigation
|
|
246
|
+
- [ ] Tests pass
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## T6: Card Depth + Table Enhancement
|
|
251
|
+
|
|
252
|
+
**Phase:** 1 (shared foundation)
|
|
253
|
+
**Dependencies:** T2 (needs CSS custom properties)
|
|
254
|
+
**Estimated context:** ~30%
|
|
255
|
+
|
|
256
|
+
### Goal
|
|
257
|
+
Enhance existing `Card` and `Table` components with the features needed by visual skills. This avoids creating duplicate components (VeCard, DataTable) per the review decision.
|
|
258
|
+
|
|
259
|
+
### Scope
|
|
260
|
+
- Add `depth:` option to `Card` (:hero, :elevated, :default, :recessed, :glass)
|
|
261
|
+
- Add `accent:` option to `Card` for colored left border
|
|
262
|
+
- Add `sticky_header:`, `alternating:`, `scrollable:`, `hover:` options to `Table`
|
|
263
|
+
- CSS for depth tiers (shadows, backgrounds, blur)
|
|
264
|
+
- CSS for table enhancements
|
|
265
|
+
|
|
266
|
+
### Input Files
|
|
267
|
+
- `docs/visual-skills/analysis/components.md` (sections 4.1, 4.2)
|
|
268
|
+
- `docs/visual-skills/design/review-synthesis.md` (VeCard -> Card merge)
|
|
269
|
+
- `lib/stream_weaver/components.rb` (existing Card, Table classes)
|
|
270
|
+
- `lib/stream_weaver/adapter/alpinejs.rb`
|
|
271
|
+
|
|
272
|
+
### Output Files
|
|
273
|
+
- Updates to `lib/stream_weaver/components.rb` (Card, Table classes)
|
|
274
|
+
- Updates to `lib/stream_weaver/assets/css/sw-foundation.css` (depth + table CSS)
|
|
275
|
+
- Updates to `lib/stream_weaver/adapter/alpinejs.rb` (if rendering changes needed)
|
|
276
|
+
- `spec/components/card_depth_spec.rb`
|
|
277
|
+
- `spec/components/table_enhanced_spec.rb`
|
|
278
|
+
|
|
279
|
+
### Acceptance Criteria
|
|
280
|
+
- [ ] `card(depth: :hero)` renders hero-depth styling
|
|
281
|
+
- [ ] `card(depth: :glass)` renders glass morphism effect
|
|
282
|
+
- [ ] `card(accent: :a)` renders colored left border
|
|
283
|
+
- [ ] `table(headers: h, rows: r, sticky_header: true)` has sticky header
|
|
284
|
+
- [ ] `table(..., alternating: true)` has alternating row backgrounds
|
|
285
|
+
- [ ] `table(..., scrollable: true)` wraps in scrollable container
|
|
286
|
+
- [ ] Existing card/table usage unchanged (backward compat)
|
|
287
|
+
- [ ] Tests pass
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## T7: Design Deck Shell (DesignDeck + DeckSlide + DeckOption)
|
|
292
|
+
|
|
293
|
+
**Phase:** 2a (slide navigation)
|
|
294
|
+
**Dependencies:** T5 (SlideContainer), T6 (Card depth)
|
|
295
|
+
**Estimated context:** ~45%
|
|
296
|
+
|
|
297
|
+
### Goal
|
|
298
|
+
Build the core deck structure: a `design_deck` that contains `deck_slide`s, each with `deck_option` cards. No selection state yet -- just the visual shell with navigation.
|
|
299
|
+
|
|
300
|
+
### Scope
|
|
301
|
+
- `Components::Deck::DesignDeck` -- orchestrator component
|
|
302
|
+
- `Components::Deck::DeckSlide` -- slide with option grid
|
|
303
|
+
- `Components::Deck::DeckOption` -- option card with preview content
|
|
304
|
+
- DSL methods: `design_deck`, `deck_slide`, `deck_option`
|
|
305
|
+
- Auto-detect grid columns from option count
|
|
306
|
+
- Integration with SlideContainer for navigation
|
|
307
|
+
- Notes textarea on each option (display only, no persistence yet)
|
|
308
|
+
|
|
309
|
+
### Input Files
|
|
310
|
+
- `docs/visual-skills/analysis/components.md` (sections 2.1-2.3)
|
|
311
|
+
- `docs/visual-skills/design/architecture.md` (deck section)
|
|
312
|
+
- Output from T5 (SlideContainer)
|
|
313
|
+
- Output from T6 (Card depth)
|
|
314
|
+
- `lib/stream_weaver/components.rb`
|
|
315
|
+
- `lib/stream_weaver/display_dsl.rb`
|
|
316
|
+
|
|
317
|
+
### Output Files
|
|
318
|
+
- `lib/stream_weaver/components/deck/design_deck.rb`
|
|
319
|
+
- `lib/stream_weaver/components/deck/deck_slide.rb`
|
|
320
|
+
- `lib/stream_weaver/components/deck/deck_option.rb`
|
|
321
|
+
- `lib/stream_weaver/assets/css/sw-deck.css`
|
|
322
|
+
- `lib/stream_weaver/assets/js/sw-deck-selection.js`
|
|
323
|
+
- Updates to `lib/stream_weaver/display_dsl.rb` (or `app.rb` for interactive DSL)
|
|
324
|
+
- `spec/components/deck/design_deck_spec.rb`
|
|
325
|
+
|
|
326
|
+
### Acceptance Criteria
|
|
327
|
+
- [ ] `design_deck("Title") { deck_slide("s1", "Slide") { deck_option("A") { text "..." } } }` renders
|
|
328
|
+
- [ ] Multiple slides navigable via Back/Next buttons
|
|
329
|
+
- [ ] Option cards display in auto-detected grid (2 options -> 2 cols, 3+ -> 3 cols)
|
|
330
|
+
- [ ] Option cards show preview content from block
|
|
331
|
+
- [ ] Notes textarea renders on each option
|
|
332
|
+
- [ ] Tests pass
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## T8: Deck Selection State + File-Backed State
|
|
337
|
+
|
|
338
|
+
**Phase:** 2b (selection + persistence)
|
|
339
|
+
**Dependencies:** T7 (deck shell)
|
|
340
|
+
**Estimated context:** ~40%
|
|
341
|
+
|
|
342
|
+
### Goal
|
|
343
|
+
Add selection behavior to deck options and persist state to files. This is the core interactivity: users click options, write notes, and the state survives page reloads.
|
|
344
|
+
|
|
345
|
+
### Scope
|
|
346
|
+
- Click-to-select behavior on `DeckOption` (radio semantics per slide)
|
|
347
|
+
- Visual selection indicators (accent border, checkmark badge)
|
|
348
|
+
- ARIA: `role="radiogroup"`, `role="radio"`, `aria-checked`
|
|
349
|
+
- Number key quick-select (1-9)
|
|
350
|
+
- File-backed state storage (`DeckState` class)
|
|
351
|
+
- JSON file per session in tmp directory
|
|
352
|
+
- Notes persistence (textarea content saved to state file)
|
|
353
|
+
- Session ID generation and cookie tracking
|
|
354
|
+
|
|
355
|
+
### Input Files
|
|
356
|
+
- `docs/visual-skills/design/review-synthesis.md` (file-backed state decision)
|
|
357
|
+
- `docs/visual-skills/analysis/components.md` (sections 2.3, 4.8)
|
|
358
|
+
- `docs/visual-skills/design/architecture.md` (state management section)
|
|
359
|
+
- Output from T7 (deck components)
|
|
360
|
+
- `lib/stream_weaver/server.rb` (route patterns)
|
|
361
|
+
|
|
362
|
+
### Output Files
|
|
363
|
+
- `lib/stream_weaver/components/deck/deck_state.rb`
|
|
364
|
+
- Updates to `lib/stream_weaver/components/deck/deck_option.rb` (selection behavior)
|
|
365
|
+
- Updates to `lib/stream_weaver/assets/js/sw-deck-selection.js`
|
|
366
|
+
- Updates to `lib/stream_weaver/server.rb` (state persistence routes)
|
|
367
|
+
- `spec/components/deck/deck_state_spec.rb`
|
|
368
|
+
- `spec/components/deck/deck_selection_spec.rb`
|
|
369
|
+
|
|
370
|
+
### Acceptance Criteria
|
|
371
|
+
- [ ] Clicking an option selects it (accent border, checkmark)
|
|
372
|
+
- [ ] Only one option selected per slide (radio semantics)
|
|
373
|
+
- [ ] Number keys 1-9 select options
|
|
374
|
+
- [ ] Selection state persists in JSON file
|
|
375
|
+
- [ ] Notes text persists in JSON file
|
|
376
|
+
- [ ] State survives page reload
|
|
377
|
+
- [ ] ARIA attributes correct (`aria-checked`, roles)
|
|
378
|
+
- [ ] Tests pass
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## T9: DeckSummary + ProgressBar Enhancement
|
|
383
|
+
|
|
384
|
+
**Phase:** 2c (summary)
|
|
385
|
+
**Dependencies:** T8 (selection state)
|
|
386
|
+
**Estimated context:** ~35%
|
|
387
|
+
|
|
388
|
+
### Goal
|
|
389
|
+
Build the auto-generated summary slide and enhance the progress bar for deck navigation.
|
|
390
|
+
|
|
391
|
+
### Scope
|
|
392
|
+
- `Components::Deck::DeckSummary` -- auto-generated final slide
|
|
393
|
+
- Summary cards showing: selected option, preview thumbnail, notes
|
|
394
|
+
- Submit button gated on all selections complete
|
|
395
|
+
- "Still need: X, Y" message when incomplete
|
|
396
|
+
- Submit state (locks deck after submission)
|
|
397
|
+
- Enhanced `ProgressBar` with `position: :fixed` variant
|
|
398
|
+
|
|
399
|
+
### Input Files
|
|
400
|
+
- `docs/visual-skills/analysis/components.md` (sections 2.4, 4.7)
|
|
401
|
+
- Output from T8 (DeckState)
|
|
402
|
+
- Output from T7 (deck shell)
|
|
403
|
+
|
|
404
|
+
### Output Files
|
|
405
|
+
- `lib/stream_weaver/components/deck/deck_summary.rb`
|
|
406
|
+
- Updates to `lib/stream_weaver/components.rb` (ProgressBar enhancement)
|
|
407
|
+
- `spec/components/deck/deck_summary_spec.rb`
|
|
408
|
+
|
|
409
|
+
### Acceptance Criteria
|
|
410
|
+
- [ ] Summary slide auto-generated as last slide
|
|
411
|
+
- [ ] Shows selected option per slide with label and truncated preview
|
|
412
|
+
- [ ] Shows user notes per slide
|
|
413
|
+
- [ ] Submit button disabled when selections incomplete
|
|
414
|
+
- [ ] "Still need: Slide X, Slide Y" shown when incomplete
|
|
415
|
+
- [ ] Submit locks the deck into submitted state
|
|
416
|
+
- [ ] Fixed-position progress bar tracks slide position
|
|
417
|
+
- [ ] Tests pass
|
|
418
|
+
|
|
419
|
+
---
|
|
420
|
+
|
|
421
|
+
## T10: Generate-More Full Implementation
|
|
422
|
+
|
|
423
|
+
**Phase:** 3 (full implementation)
|
|
424
|
+
**Dependencies:** T1 (spike findings), T8 (deck state)
|
|
425
|
+
**Estimated context:** ~45%
|
|
426
|
+
|
|
427
|
+
### Goal
|
|
428
|
+
Implement generate-more as a production-quality gem feature, using the state machine and edge cases discovered in the T1 spike.
|
|
429
|
+
|
|
430
|
+
### Scope
|
|
431
|
+
- `Components::Deck::GenerateMoreControls` -- prompt, count, generate button
|
|
432
|
+
- `Components::Deck::SkeletonPlaceholder` -- shimmer loading cards
|
|
433
|
+
- Push-to-state pattern (Gemini's insight): new options written to DeckState, re-render
|
|
434
|
+
- Polling endpoint for agent to detect generate requests
|
|
435
|
+
- Timeout handling (15s default)
|
|
436
|
+
- Server routes for generate request queue
|
|
437
|
+
- Integration with `Pushable` SSE for push notifications
|
|
438
|
+
|
|
439
|
+
### Input Files
|
|
440
|
+
- `docs/visual-skills/implementation/spike-findings.md` (T1 output -- critical)
|
|
441
|
+
- `docs/visual-skills/analysis/components.md` (sections 2.5, 2.6)
|
|
442
|
+
- `docs/visual-skills/design/review-synthesis.md` (push-to-state decision)
|
|
443
|
+
- Output from T8 (DeckState, file-backed state)
|
|
444
|
+
- `lib/stream_weaver/pushable.rb`
|
|
445
|
+
- `lib/stream_weaver/server.rb`
|
|
446
|
+
|
|
447
|
+
### Output Files
|
|
448
|
+
- `lib/stream_weaver/components/deck/generate_more_controls.rb`
|
|
449
|
+
- `lib/stream_weaver/components/deck/skeleton_placeholder.rb`
|
|
450
|
+
- Updates to `lib/stream_weaver/components/deck/deck_state.rb` (generate queue)
|
|
451
|
+
- Updates to `lib/stream_weaver/server.rb` (generate routes)
|
|
452
|
+
- `lib/stream_weaver/assets/js/sw-generate-more.js`
|
|
453
|
+
- `spec/components/deck/generate_more_spec.rb`
|
|
454
|
+
|
|
455
|
+
### Acceptance Criteria
|
|
456
|
+
- [ ] Generate button sends request with prompt and count
|
|
457
|
+
- [ ] Skeleton placeholders appear during generation
|
|
458
|
+
- [ ] New options arrive via push-to-state and render correctly
|
|
459
|
+
- [ ] Timeout after configured duration shows error
|
|
460
|
+
- [ ] Cancel button aborts pending generation
|
|
461
|
+
- [ ] Polling endpoint returns pending generate requests
|
|
462
|
+
- [ ] Agent can poll, "generate," and push results
|
|
463
|
+
- [ ] Edge cases from spike findings are handled
|
|
464
|
+
- [ ] Tests pass
|
|
465
|
+
|
|
466
|
+
---
|
|
467
|
+
|
|
468
|
+
## T11: Explainer Components: SidebarToc + Callout + Comparison
|
|
469
|
+
|
|
470
|
+
**Phase:** 4 (visual explainer)
|
|
471
|
+
**Dependencies:** T2 (theme), T6 (card depth)
|
|
472
|
+
**Estimated context:** ~35%
|
|
473
|
+
|
|
474
|
+
### Goal
|
|
475
|
+
Build the first batch of visual-explainer-specific components.
|
|
476
|
+
|
|
477
|
+
### Scope
|
|
478
|
+
- `Components::SidebarToc` -- sticky sidebar with scroll spy (IntersectionObserver)
|
|
479
|
+
- `Components::Callout` -- bordered info/warning/tip box (not dismissible, unlike Alert)
|
|
480
|
+
- `Components::Comparison` -- side-by-side diff panels (before/after)
|
|
481
|
+
- Mobile responsive: SidebarToc collapses to horizontal bar, Comparison stacks
|
|
482
|
+
|
|
483
|
+
### Input Files
|
|
484
|
+
- `docs/visual-skills/analysis/components.md` (sections 3.6, 3.8, 3.5)
|
|
485
|
+
- `lib/stream_weaver/components.rb`
|
|
486
|
+
- `lib/stream_weaver/display_dsl.rb`
|
|
487
|
+
- `lib/stream_weaver/adapter/alpinejs.rb`
|
|
488
|
+
|
|
489
|
+
### Output Files
|
|
490
|
+
- `lib/stream_weaver/components/sidebar_toc.rb`
|
|
491
|
+
- `lib/stream_weaver/components/callout.rb`
|
|
492
|
+
- `lib/stream_weaver/components/comparison.rb`
|
|
493
|
+
- `lib/stream_weaver/assets/js/sw-scroll-spy.js`
|
|
494
|
+
- Updates to `lib/stream_weaver/display_dsl.rb`
|
|
495
|
+
- `spec/components/sidebar_toc_spec.rb`
|
|
496
|
+
- `spec/components/callout_spec.rb`
|
|
497
|
+
- `spec/components/comparison_spec.rb`
|
|
498
|
+
|
|
499
|
+
### Acceptance Criteria
|
|
500
|
+
- [ ] `sidebar_toc(sections: [...])` renders sticky sidebar with links
|
|
501
|
+
- [ ] Scroll spy highlights active section
|
|
502
|
+
- [ ] `callout(variant: :warning) { text "..." }` renders bordered box
|
|
503
|
+
- [ ] `comparison(before_label: "Old", after_label: "New") { ... }` renders side-by-side
|
|
504
|
+
- [ ] Comparison stacks vertically on narrow viewports
|
|
505
|
+
- [ ] Tests pass
|
|
506
|
+
|
|
507
|
+
---
|
|
508
|
+
|
|
509
|
+
## T12: Explainer Components: Pipeline + KpiDashboard + Chart
|
|
510
|
+
|
|
511
|
+
**Phase:** 4 (visual explainer)
|
|
512
|
+
**Dependencies:** T2 (theme), T6 (card depth)
|
|
513
|
+
**Estimated context:** ~35%
|
|
514
|
+
|
|
515
|
+
### Goal
|
|
516
|
+
Build the remaining visual-explainer-specific components.
|
|
517
|
+
|
|
518
|
+
### Scope
|
|
519
|
+
- `Components::Pipeline` -- horizontal step flow with arrow connectors
|
|
520
|
+
- `Components::KpiDashboard` -- auto-fit grid of stat cards with animation
|
|
521
|
+
- `Components::Chart` -- Chart.js wrapper (bar, line, pie, doughnut, radar)
|
|
522
|
+
- CDN loading for Chart.js
|
|
523
|
+
- Dark mode awareness for chart colors
|
|
524
|
+
|
|
525
|
+
### Input Files
|
|
526
|
+
- `docs/visual-skills/analysis/components.md` (sections 3.4, 3.2, 3.7)
|
|
527
|
+
- `lib/stream_weaver/components.rb` (StatDisplay for KpiDashboard)
|
|
528
|
+
- `lib/stream_weaver/display_dsl.rb`
|
|
529
|
+
- `lib/stream_weaver/adapter/alpinejs.rb`
|
|
530
|
+
|
|
531
|
+
### Output Files
|
|
532
|
+
- `lib/stream_weaver/components/pipeline.rb`
|
|
533
|
+
- `lib/stream_weaver/components/kpi_dashboard.rb`
|
|
534
|
+
- `lib/stream_weaver/components/chart.rb`
|
|
535
|
+
- Updates to `lib/stream_weaver/display_dsl.rb`
|
|
536
|
+
- `spec/components/pipeline_spec.rb`
|
|
537
|
+
- `spec/components/kpi_dashboard_spec.rb`
|
|
538
|
+
- `spec/components/chart_spec.rb`
|
|
539
|
+
|
|
540
|
+
### Acceptance Criteria
|
|
541
|
+
- [ ] `pipeline(steps: [...])` renders horizontal flow with arrows
|
|
542
|
+
- [ ] Pipeline collapses to vertical on mobile
|
|
543
|
+
- [ ] `kpi_dashboard(metrics: [...])` renders auto-fit grid of stat cards
|
|
544
|
+
- [ ] KPI cards animate on appearance (fadeScale)
|
|
545
|
+
- [ ] `chart(type: :bar, data: {...})` renders Chart.js chart
|
|
546
|
+
- [ ] Charts respect dark/light theme
|
|
547
|
+
- [ ] Chart.js CDN loads lazily
|
|
548
|
+
- [ ] Tests pass
|
|
549
|
+
|
|
550
|
+
---
|
|
551
|
+
|
|
552
|
+
## T13: CSS-Only Helpers + HtmlExporter
|
|
553
|
+
|
|
554
|
+
**Phase:** 5 (polish)
|
|
555
|
+
**Dependencies:** T2 (CSS foundation)
|
|
556
|
+
**Estimated context:** ~30%
|
|
557
|
+
|
|
558
|
+
### Goal
|
|
559
|
+
Implement the CSS-only DSL helpers (no component classes, just `div` wrappers) and the HTML export pipeline.
|
|
560
|
+
|
|
561
|
+
### Scope
|
|
562
|
+
- DSL helpers: `hero`, `prose`, `pullquote`, `dir_tree`, `legend`, `flow_arrow`, `layout_toggle`
|
|
563
|
+
- Each is a thin DSL method that wraps content in a `div` with CSS classes
|
|
564
|
+
- `HtmlExporter` -- serializes StreamWeaver page to self-contained HTML
|
|
565
|
+
- Inlines CSS, preserves CDN links, optional base64 images
|
|
566
|
+
|
|
567
|
+
### Input Files
|
|
568
|
+
- `docs/visual-skills/analysis/components.md` (sections 3.12-3.15, 3.10-3.11, 1.5)
|
|
569
|
+
- `lib/stream_weaver/display_dsl.rb`
|
|
570
|
+
|
|
571
|
+
### Output Files
|
|
572
|
+
- Updates to `lib/stream_weaver/display_dsl.rb` (helper methods)
|
|
573
|
+
- `lib/stream_weaver/assets/css/sw-helpers.css`
|
|
574
|
+
- `lib/stream_weaver/export/html_exporter.rb`
|
|
575
|
+
- `spec/export/html_exporter_spec.rb`
|
|
576
|
+
- `spec/css_helpers_spec.rb`
|
|
577
|
+
|
|
578
|
+
### Acceptance Criteria
|
|
579
|
+
- [ ] `hero { header1 "Title" }` wraps in hero-styled div
|
|
580
|
+
- [ ] `prose { md "Long form text..." }` wraps in reading-optimized container
|
|
581
|
+
- [ ] `pullquote("Quote text", attribution: "Author")` renders styled quote
|
|
582
|
+
- [ ] `dir_tree("src/\n app.rb")` renders monospace file tree
|
|
583
|
+
- [ ] HtmlExporter produces valid self-contained HTML file
|
|
584
|
+
- [ ] Exported HTML opens correctly in browser without server
|
|
585
|
+
- [ ] Tests pass
|
|
586
|
+
|
|
587
|
+
---
|
|
588
|
+
|
|
589
|
+
## T14: Deck Polish: ModelSelector + ConfirmationBar + CloseOverlay
|
|
590
|
+
|
|
591
|
+
**Phase:** 5 (polish)
|
|
592
|
+
**Dependencies:** T10 (generate-more)
|
|
593
|
+
**Estimated context:** ~35%
|
|
594
|
+
|
|
595
|
+
### Goal
|
|
596
|
+
Complete the deck's secondary UI components.
|
|
597
|
+
|
|
598
|
+
### Scope
|
|
599
|
+
- `Components::Deck::ModelSelector` -- model picker with provider filter pills
|
|
600
|
+
- `Components::Deck::ConfirmationBar` -- fixed top bar with confirm/cancel
|
|
601
|
+
- `Components::Deck::CloseOverlay` -- full-screen status overlay
|
|
602
|
+
- Auto-close tab behavior
|
|
603
|
+
|
|
604
|
+
### Input Files
|
|
605
|
+
- `docs/visual-skills/analysis/components.md` (sections 2.7-2.9)
|
|
606
|
+
- Output from T10 (GenerateMoreControls)
|
|
607
|
+
|
|
608
|
+
### Output Files
|
|
609
|
+
- `lib/stream_weaver/components/deck/model_selector.rb`
|
|
610
|
+
- `lib/stream_weaver/components/deck/confirmation_bar.rb`
|
|
611
|
+
- `lib/stream_weaver/components/deck/close_overlay.rb`
|
|
612
|
+
- `spec/components/deck/model_selector_spec.rb`
|
|
613
|
+
- `spec/components/deck/confirmation_bar_spec.rb`
|
|
614
|
+
- `spec/components/deck/close_overlay_spec.rb`
|
|
615
|
+
|
|
616
|
+
### Acceptance Criteria
|
|
617
|
+
- [ ] ModelSelector shows provider pills and model list
|
|
618
|
+
- [ ] ModelSelector hidden when fewer than 2 models
|
|
619
|
+
- [ ] ConfirmationBar slides down with confirm/cancel buttons
|
|
620
|
+
- [ ] ConfirmationBar auto-hides after timeout
|
|
621
|
+
- [ ] CloseOverlay shows full-screen status with backdrop blur
|
|
622
|
+
- [ ] CloseOverlay auto-closes tab after 800ms
|
|
623
|
+
- [ ] Tests pass
|
|
624
|
+
|
|
625
|
+
---
|
|
626
|
+
|
|
627
|
+
## T15: Theme Presets + Typography + Animations
|
|
628
|
+
|
|
629
|
+
**Phase:** 5 (polish)
|
|
630
|
+
**Dependencies:** T2 (theme foundation)
|
|
631
|
+
**Estimated context:** ~30%
|
|
632
|
+
|
|
633
|
+
### Goal
|
|
634
|
+
Add the curated theme presets and animation choreography.
|
|
635
|
+
|
|
636
|
+
### Scope
|
|
637
|
+
- 2 theme presets: `:editorial` (Instrument Serif + Terracotta), `:technical` (DM Sans + Teal)
|
|
638
|
+
- `theme_preset(name:)` DSL method
|
|
639
|
+
- Google Fonts CDN loading per preset
|
|
640
|
+
- Animation utilities: fadeScale, stagger reveals, shimmer
|
|
641
|
+
- CSS transitions for slide swaps
|
|
642
|
+
|
|
643
|
+
### Input Files
|
|
644
|
+
- `docs/visual-skills/analysis/components.md` (section 3.19)
|
|
645
|
+
- Output from T2 (theme foundation)
|
|
646
|
+
|
|
647
|
+
### Output Files
|
|
648
|
+
- `lib/stream_weaver/theme/presets.rb`
|
|
649
|
+
- `lib/stream_weaver/assets/css/sw-presets.css`
|
|
650
|
+
- `lib/stream_weaver/assets/css/sw-animations.css`
|
|
651
|
+
- Updates to `lib/stream_weaver/display_dsl.rb`
|
|
652
|
+
- `spec/theme/presets_spec.rb`
|
|
653
|
+
|
|
654
|
+
### Acceptance Criteria
|
|
655
|
+
- [ ] `theme_preset(:editorial)` loads Instrument Serif + JetBrains Mono fonts
|
|
656
|
+
- [ ] `theme_preset(:technical)` loads DM Sans + Fira Code fonts
|
|
657
|
+
- [ ] Preset applies CSS custom properties for colors and typography
|
|
658
|
+
- [ ] fadeScale animation utility available via CSS class
|
|
659
|
+
- [ ] Stagger animation for KPI cards and grid items
|
|
660
|
+
- [ ] Tests pass
|
|
661
|
+
|
|
662
|
+
---
|
|
663
|
+
|
|
664
|
+
## Dependency Graph
|
|
665
|
+
|
|
666
|
+
```
|
|
667
|
+
T1 (spike) ─────────────────────────────────┐
|
|
668
|
+
│
|
|
669
|
+
T2 (theme) ──┬── T3 (mermaid) │
|
|
670
|
+
├── T4 (codeblock+image) │
|
|
671
|
+
├── T5 (keyboard+slides) ──┐ │
|
|
672
|
+
├── T6 (card+table) ──────┤ │
|
|
673
|
+
├── T11 (explainer batch1) │ │
|
|
674
|
+
├── T12 (explainer batch2) │ │
|
|
675
|
+
├── T13 (css helpers) │ │
|
|
676
|
+
└── T15 (presets) │ │
|
|
677
|
+
│ │
|
|
678
|
+
T7 (deck shell) ────┘ │
|
|
679
|
+
│ │
|
|
680
|
+
T8 (selection+state) ────┤
|
|
681
|
+
│ │
|
|
682
|
+
T9 (summary) ────────┐ │
|
|
683
|
+
│ │
|
|
684
|
+
T10 (generate-more) ──┘───┘
|
|
685
|
+
│
|
|
686
|
+
T14 (deck polish)
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
## Parallelization Opportunities
|
|
690
|
+
|
|
691
|
+
These tasks can run in parallel if multiple subagents are available:
|
|
692
|
+
|
|
693
|
+
- **Parallel group A** (after T2): T3, T4, T6, T11, T12, T13, T15
|
|
694
|
+
- **Parallel group B** (after T5+T6): T7 can start
|
|
695
|
+
- **T1 runs independently** from the start, in parallel with everything
|
|
696
|
+
|
|
697
|
+
## Total Estimated Effort
|
|
698
|
+
|
|
699
|
+
- 15 tasks
|
|
700
|
+
- ~525% cumulative context (across all tasks)
|
|
701
|
+
- ~32 component classes + ~7 CSS helpers
|
|
702
|
+
- Critical path: T2 -> T5 -> T7 -> T8 -> T10 (with T1 in parallel)
|