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,247 @@
|
|
|
1
|
+
# Canvas IPC Design
|
|
2
|
+
|
|
3
|
+
Two-way interaction between Claude Code and StreamWeaver UI, inspired by [claude-canvas](https://github.com/BEARLY-HODLING/claude-canvas).
|
|
4
|
+
|
|
5
|
+
## Goal
|
|
6
|
+
|
|
7
|
+
A single browser window that Claude Code can:
|
|
8
|
+
- Push UI content to (forms, displays, etc.)
|
|
9
|
+
- Receive user interactions from (button clicks, form submissions)
|
|
10
|
+
- All in real-time via IPC, not HTTP polling
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌─────────────────────┐ ┌──────────────────────┐
|
|
14
|
+
│ Claude Code │◄───►│ Single UI Window │
|
|
15
|
+
│ (Terminal) │ │ (Browser) │
|
|
16
|
+
└─────────────────────┘ └──────────────────────┘
|
|
17
|
+
│ │
|
|
18
|
+
└── Unix Socket ─────────────┘
|
|
19
|
+
+ WebSocket
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Architecture
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
┌─────────────┐ ┌─────────────────────────────────┐ ┌─────────────┐
|
|
26
|
+
│ Claude Code │◄─Unix Socket────►│ Canvas Bridge │◄───WebSocket────►│ Browser │
|
|
27
|
+
│ │ │ │ │ │
|
|
28
|
+
│ streamweaver│ ~/.streamweaver │ - Sinatra + WebSocket │ ws://...:4568 │ StreamWeaver│
|
|
29
|
+
│ canvas ... │ /canvas.sock │ - Session management │ │ UI │
|
|
30
|
+
└─────────────┘ │ - DSL → HTML rendering │ └─────────────┘
|
|
31
|
+
│ - Event routing │
|
|
32
|
+
└─────────────────────────────────┘
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Why This Architecture
|
|
36
|
+
|
|
37
|
+
- Browser can't use Unix sockets directly
|
|
38
|
+
- Unix socket for Claude ↔ Bridge (fast, local IPC)
|
|
39
|
+
- WebSocket for Bridge ↔ Browser (real-time, bidirectional)
|
|
40
|
+
- Bridge process auto-starts on first use, reuses thereafter (like existing Service)
|
|
41
|
+
|
|
42
|
+
## Process Lifecycle
|
|
43
|
+
|
|
44
|
+
**Files:**
|
|
45
|
+
```
|
|
46
|
+
~/.streamweaver/
|
|
47
|
+
├── server.pid # Existing HTTP service
|
|
48
|
+
├── canvas.pid # Canvas bridge process
|
|
49
|
+
├── canvas.sock # Unix socket for IPC
|
|
50
|
+
└── server.log
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**First invocation:**
|
|
54
|
+
1. Check if `canvas.pid` exists and process is alive
|
|
55
|
+
2. If not running → spawn bridge, write PID, create socket
|
|
56
|
+
3. Connect to socket, send "create session" message
|
|
57
|
+
4. Bridge opens browser to `http://localhost:4568/canvas/<name>`
|
|
58
|
+
5. Returns socket connection to Claude Code
|
|
59
|
+
|
|
60
|
+
**Subsequent invocations:** Reuse existing bridge, create new sessions as needed.
|
|
61
|
+
|
|
62
|
+
## IPC Protocol
|
|
63
|
+
|
|
64
|
+
Line-delimited JSON over Unix socket.
|
|
65
|
+
|
|
66
|
+
### Claude Code → Bridge
|
|
67
|
+
|
|
68
|
+
| Message | Purpose | Example |
|
|
69
|
+
|---------|---------|---------|
|
|
70
|
+
| `create` | Create session | `{"type":"create","name":"survey"}` |
|
|
71
|
+
| `push` | Push UI content | `{"type":"push","name":"survey","dsl":"header1 'Pick One'"}` |
|
|
72
|
+
| `close` | Close session | `{"type":"close","name":"survey"}` |
|
|
73
|
+
| `get_state` | Get current state | `{"type":"get_state","name":"survey"}` |
|
|
74
|
+
|
|
75
|
+
### Bridge → Claude Code
|
|
76
|
+
|
|
77
|
+
| Message | Purpose | Example |
|
|
78
|
+
|---------|---------|---------|
|
|
79
|
+
| `ready` | Session created | `{"type":"ready","name":"survey","url":"http://..."}` |
|
|
80
|
+
| `event` | User interaction | `{"type":"event","name":"survey","event":"submit","data":{...}}` |
|
|
81
|
+
| `state` | Response to get_state | `{"type":"state","name":"survey","data":{...}}` |
|
|
82
|
+
| `closed` | Session closed | `{"type":"closed","name":"survey"}` |
|
|
83
|
+
|
|
84
|
+
### Event Types
|
|
85
|
+
|
|
86
|
+
- `submit` - User clicked submit button
|
|
87
|
+
- `action` - User clicked a named button
|
|
88
|
+
- `change` - Field value changed (optional)
|
|
89
|
+
- `cancel` - User cancelled/closed
|
|
90
|
+
|
|
91
|
+
## Adapter Mode
|
|
92
|
+
|
|
93
|
+
Modify `Adapter::AlpineJS` to support WebSocket mode:
|
|
94
|
+
|
|
95
|
+
| Mode | Component Output | Backend |
|
|
96
|
+
|------|-----------------|---------|
|
|
97
|
+
| `http` (current) | HTMX `hx-post`, `hx-target` | Sinatra routes |
|
|
98
|
+
| `websocket` (canvas) | Alpine `@click` → WebSocket | Bridge process |
|
|
99
|
+
|
|
100
|
+
**Button example in WebSocket mode:**
|
|
101
|
+
```ruby
|
|
102
|
+
def button_attributes(button)
|
|
103
|
+
if mode == :websocket
|
|
104
|
+
{ '@click' => "sendEvent('action', {button: '#{button.id}', state: formState()})" }
|
|
105
|
+
else
|
|
106
|
+
{ 'hx-post' => "#{url_prefix}/action/#{button.id}", ... }
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## CLI Interface
|
|
112
|
+
|
|
113
|
+
### Low-level (on-the-fly)
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Create/connect to session
|
|
117
|
+
streamweaver canvas <name>
|
|
118
|
+
|
|
119
|
+
# Push DSL (from stdin)
|
|
120
|
+
streamweaver canvas-push <name> <<'RUBY'
|
|
121
|
+
header1 "Pick an option"
|
|
122
|
+
radio_group :choice, ["A", "B", "C"]
|
|
123
|
+
button "Submit"
|
|
124
|
+
RUBY
|
|
125
|
+
|
|
126
|
+
# Wait for event (blocks)
|
|
127
|
+
streamweaver canvas-wait <name>
|
|
128
|
+
# => {"event":"submit","data":{"choice":"B"}}
|
|
129
|
+
|
|
130
|
+
# Close session
|
|
131
|
+
streamweaver canvas-close <name>
|
|
132
|
+
|
|
133
|
+
# Management
|
|
134
|
+
streamweaver canvas-list
|
|
135
|
+
streamweaver canvas-stop
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### High-level helpers
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# One-liners for common patterns
|
|
142
|
+
streamweaver pick "Pick approach" "Refactor" "Adapter" "Patch"
|
|
143
|
+
# => {"choice":"Adapter"}
|
|
144
|
+
|
|
145
|
+
streamweaver confirm "Delete 47 files?"
|
|
146
|
+
# => {"confirmed":true}
|
|
147
|
+
|
|
148
|
+
streamweaver form "Quick Survey" \
|
|
149
|
+
--text "name:Your name" \
|
|
150
|
+
--radio "priority:Low,Medium,High"
|
|
151
|
+
# => {"name":"Alice","priority":"High"}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Ruby API
|
|
155
|
+
|
|
156
|
+
### High-level helpers
|
|
157
|
+
|
|
158
|
+
```ruby
|
|
159
|
+
require 'stream_weaver/canvas'
|
|
160
|
+
|
|
161
|
+
choice = StreamWeaver::Canvas.pick("Pick approach", ["Refactor", "Adapter", "Patch"])
|
|
162
|
+
# => "Adapter"
|
|
163
|
+
|
|
164
|
+
confirmed = StreamWeaver::Canvas.confirm("Delete 47 files?")
|
|
165
|
+
# => true
|
|
166
|
+
|
|
167
|
+
data = StreamWeaver::Canvas.form("Quick Survey") do
|
|
168
|
+
text_field :name, placeholder: "Your name"
|
|
169
|
+
radio_group :priority, ["Low", "Medium", "High"]
|
|
170
|
+
end
|
|
171
|
+
# => { name: "Alice", priority: "High" }
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Low-level session API
|
|
175
|
+
|
|
176
|
+
```ruby
|
|
177
|
+
session = StreamWeaver::Canvas.session("wizard")
|
|
178
|
+
|
|
179
|
+
session.push do
|
|
180
|
+
header1 "Step 1"
|
|
181
|
+
text_field :email
|
|
182
|
+
button "Next"
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
result = session.wait # => { event: "submit", data: { email: "..." } }
|
|
186
|
+
|
|
187
|
+
session.push do
|
|
188
|
+
header1 "Step 2"
|
|
189
|
+
# ... based on result
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
session.close
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Project-specific reusable canvases
|
|
196
|
+
|
|
197
|
+
```ruby
|
|
198
|
+
module MyProject::Canvases
|
|
199
|
+
def self.code_review_picker(files)
|
|
200
|
+
StreamWeaver::Canvas.form("Select files to review") do
|
|
201
|
+
checkbox_group :files, select_all: "All" do
|
|
202
|
+
files.each { |f| item f, f }
|
|
203
|
+
end
|
|
204
|
+
radio_group :depth, ["Quick scan", "Detailed review"]
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Implementation Structure
|
|
211
|
+
|
|
212
|
+
### New files
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
lib/stream_weaver/
|
|
216
|
+
├── canvas/
|
|
217
|
+
│ ├── bridge.rb # Bridge process (Unix socket + WebSocket)
|
|
218
|
+
│ ├── session.rb # Session management
|
|
219
|
+
│ ├── helpers.rb # High-level helpers (pick, confirm, form)
|
|
220
|
+
│ └── protocol.rb # Message types and serialization
|
|
221
|
+
├── adapter/
|
|
222
|
+
│ └── alpinejs.rb # MODIFY: Add websocket mode
|
|
223
|
+
└── cli.rb # MODIFY: Add canvas commands
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Dependencies
|
|
227
|
+
|
|
228
|
+
```ruby
|
|
229
|
+
gem 'faye-websocket' # WebSocket support
|
|
230
|
+
gem 'eventmachine' # Required by faye-websocket
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Implementation phases
|
|
234
|
+
|
|
235
|
+
| Phase | What | Why |
|
|
236
|
+
|-------|------|-----|
|
|
237
|
+
| 1 | Protocol + Bridge skeleton | Core IPC working |
|
|
238
|
+
| 2 | CLI commands (canvas, push, wait) | Can test manually |
|
|
239
|
+
| 3 | WebSocket adapter mode | Browser ↔ Bridge communication |
|
|
240
|
+
| 4 | Session management | Multi-session support |
|
|
241
|
+
| 5 | High-level helpers | Ergonomic API |
|
|
242
|
+
| 6 | Terminal pane spawning (optional) | iTerm2/tmux split panes |
|
|
243
|
+
|
|
244
|
+
## References
|
|
245
|
+
|
|
246
|
+
- [claude-canvas](https://github.com/BEARLY-HODLING/claude-canvas) - Inspiration for IPC pattern
|
|
247
|
+
- Existing StreamWeaver live sessions (HTTP polling approach)
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
# Dashboard Components Plan
|
|
2
|
+
|
|
3
|
+
**Date:** 2026-01-19
|
|
4
|
+
**Status:** PHASE 2 COMPLETE
|
|
5
|
+
**Goal:** Add dashboard-style components and styling to StreamWeaver for operations dashboards
|
|
6
|
+
|
|
7
|
+
## Missing Components
|
|
8
|
+
|
|
9
|
+
### Priority 1: Core Components
|
|
10
|
+
|
|
11
|
+
| Component | Purpose | Props |
|
|
12
|
+
|-----------|---------|-------|
|
|
13
|
+
| `StatusDot` | Colored indicator dots with optional glow | `status:` (red/yellow/green/gray), `pulse:` (bool), `size:` (sm/md/lg) |
|
|
14
|
+
| `Badge` | Small count/label badges | `text:`, `variant:` (default/danger/warning/success), `size:` |
|
|
15
|
+
| `StatDisplay` | Large number + small label | `value:`, `label:`, `color:` |
|
|
16
|
+
| `TypeTag` | Colored type pills | `type:`, `text:` (RESEARCH, TASK, ESCALATION, etc.) |
|
|
17
|
+
|
|
18
|
+
### Priority 2: Layout Components
|
|
19
|
+
|
|
20
|
+
| Component | Purpose | Props |
|
|
21
|
+
|-----------|---------|-------|
|
|
22
|
+
| `AppShell` | Two-column layout with sidebar | `sidebar_width:`, `&block` for main + sidebar |
|
|
23
|
+
| `Sidebar` | Fixed sidebar container | `position:` (left/right), `width:` |
|
|
24
|
+
|
|
25
|
+
### Priority 3: Interactive Components
|
|
26
|
+
|
|
27
|
+
| Component | Purpose | Props |
|
|
28
|
+
|-----------|---------|-------|
|
|
29
|
+
| `ExpandableCard` | Card that expands on click | `expanded:`, `on_toggle:`, `&block` |
|
|
30
|
+
| `ActivityItem` | Time + title + summary + type badge | `time:`, `title:`, `summary:`, `type:` |
|
|
31
|
+
| `PriorityItem` | Item with priority-colored left border | `priority:` (critical/urgent/high/normal), `title:`, `description:` |
|
|
32
|
+
|
|
33
|
+
### Priority 4: Animation Components
|
|
34
|
+
|
|
35
|
+
| Component | Purpose | Props |
|
|
36
|
+
|-----------|---------|-------|
|
|
37
|
+
| `PulseIndicator` | Animated pulsing dot for live status | `color:`, `label:` |
|
|
38
|
+
|
|
39
|
+
## Missing CSS/Styling
|
|
40
|
+
|
|
41
|
+
### Dark Theme Variables
|
|
42
|
+
```css
|
|
43
|
+
:root[data-theme="dark"] {
|
|
44
|
+
--sw-bg-deep: #0a0e14;
|
|
45
|
+
--sw-bg-surface: #131820;
|
|
46
|
+
--sw-bg-elevated: #1a2029;
|
|
47
|
+
--sw-bg-hover: #242d3a;
|
|
48
|
+
--sw-border: #2a3544;
|
|
49
|
+
--sw-text-primary: #e6edf3;
|
|
50
|
+
--sw-text-secondary: #8b949e;
|
|
51
|
+
--sw-text-muted: #565d66;
|
|
52
|
+
--sw-accent-blue: #58a6ff;
|
|
53
|
+
--sw-accent-purple: #a371f7;
|
|
54
|
+
--sw-status-red: #f85149;
|
|
55
|
+
--sw-status-yellow: #d29922;
|
|
56
|
+
--sw-status-green: #3fb950;
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Effects
|
|
61
|
+
- Glow effects for status indicators (`box-shadow` with color alpha)
|
|
62
|
+
- Gradient text for summary numbers
|
|
63
|
+
- Hover lift for cards (`transform: translateY(-2px)`)
|
|
64
|
+
- Hover slide for items (`transform: translateX(4px)`)
|
|
65
|
+
- Grid background overlay pattern
|
|
66
|
+
|
|
67
|
+
### Fonts
|
|
68
|
+
- JetBrains Mono for stats/timestamps (monospace)
|
|
69
|
+
- Outfit for UI text (already have Source Sans 3)
|
|
70
|
+
|
|
71
|
+
## Implementation Order
|
|
72
|
+
|
|
73
|
+
1. **StatusDot** - Most fundamental, used everywhere
|
|
74
|
+
2. **Badge** - Simple, high reuse
|
|
75
|
+
3. **StatDisplay** - Used in cards
|
|
76
|
+
4. **TypeTag** - Used in activity items
|
|
77
|
+
5. **Dark theme CSS** - Enable the aesthetic
|
|
78
|
+
6. **PulseIndicator** - Header status
|
|
79
|
+
7. **AppShell/Sidebar** - Layout structure
|
|
80
|
+
8. **ExpandableCard** - Interactive cards
|
|
81
|
+
9. **ActivityItem** - Compound component
|
|
82
|
+
10. **PriorityItem** - Escalation items
|
|
83
|
+
|
|
84
|
+
## Files to Modify
|
|
85
|
+
|
|
86
|
+
- `lib/stream_weaver/components.rb` - Add new component classes
|
|
87
|
+
- `lib/stream_weaver/views.rb` - Add dark theme CSS variables
|
|
88
|
+
- `lib/stream_weaver/css.rb` - Add animation/glow CSS
|
|
89
|
+
- `lib/stream_weaver/adapter/alpinejs.rb` - Add render methods
|
|
90
|
+
|
|
91
|
+
## Testing
|
|
92
|
+
|
|
93
|
+
Each component should be testable via:
|
|
94
|
+
```bash
|
|
95
|
+
./exe/streamweaver push test --dsl 'status_dot status: :red, pulse: true'
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
## Success Criteria
|
|
99
|
+
|
|
100
|
+
Can build a operations dashboard-like dashboard using only StreamWeaver DSL:
|
|
101
|
+
```ruby
|
|
102
|
+
app_shell sidebar_width: 320 do
|
|
103
|
+
main do
|
|
104
|
+
header do
|
|
105
|
+
pulse_indicator color: :green, label: "System Active"
|
|
106
|
+
end
|
|
107
|
+
grid cols: 2 do
|
|
108
|
+
card do
|
|
109
|
+
status_dot status: :red
|
|
110
|
+
stat_display value: 5, label: "ACTIVITIES"
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
sidebar do
|
|
115
|
+
badge text: "5", variant: :danger
|
|
116
|
+
priority_item priority: :critical, title: "Needs attention"
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## Phase 1 Implementation (COMPLETE)
|
|
124
|
+
|
|
125
|
+
### Components Implemented
|
|
126
|
+
|
|
127
|
+
| Component | File | DSL Method |
|
|
128
|
+
|-----------|------|------------|
|
|
129
|
+
| `StatusDot` | components.rb:19-42 | `status_dot status: :green, pulse: true` |
|
|
130
|
+
| `Badge` | components.rb:44-66 | `badge "5", variant: :danger` |
|
|
131
|
+
| `StatDisplay` | components.rb:68-91 | `stat_display value: 42, label: "TASKS"` |
|
|
132
|
+
| `TypeTag` | components.rb:93-118 | `type_tag :research` |
|
|
133
|
+
| `PulseIndicator` | components.rb:120-138 | `pulse_indicator color: :green, label: "Active"` |
|
|
134
|
+
| `PriorityItem` | components.rb:140-170 | `priority_item priority: :critical, title: "..."` |
|
|
135
|
+
| `ActivityItem` | components.rb:172-192 | `activity_item time: "15:00", title: "..."` |
|
|
136
|
+
|
|
137
|
+
### CSS Added
|
|
138
|
+
- Dashboard component styles (StatusDot, Badge, StatDisplay, TypeTag, PulseIndicator, PriorityItem, ActivityItem)
|
|
139
|
+
- Dark theme (`sw-theme-dark`) with full color palette
|
|
140
|
+
- Glow effects for status indicators
|
|
141
|
+
- Pulse animation keyframes
|
|
142
|
+
- Hover effects (lift, slide)
|
|
143
|
+
|
|
144
|
+
### Theme Registration
|
|
145
|
+
- Added `:dark` to `BUILT_IN_THEMES` in app.rb
|
|
146
|
+
|
|
147
|
+
### Example App
|
|
148
|
+
- `examples/dashboard_components.rb` - Demonstrates all new components
|
|
149
|
+
|
|
150
|
+
## Phase 2 Implementation (COMPLETE)
|
|
151
|
+
|
|
152
|
+
### Components Implemented
|
|
153
|
+
|
|
154
|
+
| Component | File | DSL Method |
|
|
155
|
+
|-----------|------|------------|
|
|
156
|
+
| `AppShell` | components.rb | `app_shell sidebar_width: "320px" do ... end` |
|
|
157
|
+
| `Sidebar` | components.rb | `sidebar header: "Title" do ... end` |
|
|
158
|
+
| `MainContent` | components.rb | `main do ... end` |
|
|
159
|
+
| `ExpandableCard` | components.rb | `expandable_card key: :x, title: "..." do ... end` |
|
|
160
|
+
|
|
161
|
+
### CSS Added
|
|
162
|
+
- App shell grid layout with sidebar
|
|
163
|
+
- Sidebar with sticky positioning
|
|
164
|
+
- Expandable card with hover/transition effects
|
|
165
|
+
- Alpine.js transitions for expand/collapse
|
|
166
|
+
- Responsive breakpoint (stacks on mobile)
|
|
167
|
+
- Dark theme overrides for layout components
|
|
168
|
+
|
|
169
|
+
### Example App
|
|
170
|
+
- `examples/cabinet_control_demo.rb` - Full operations dashboard-style dashboard
|
|
171
|
+
|
|
172
|
+
## Phase 3 (Future)
|
|
173
|
+
|
|
174
|
+
- Grid background overlay pattern
|
|
175
|
+
- Gradient text for large numbers
|
|
176
|
+
- Grid/List view toggle
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# StreamWeaver Gem Release & Panel Feature Plan
|
|
2
|
+
|
|
3
|
+
## Context
|
|
4
|
+
|
|
5
|
+
Preparing StreamWeaver for initial gem release to RubyGems, and implementing iTerm2 panel feature for Claude Code integration.
|
|
6
|
+
|
|
7
|
+
## What's Done
|
|
8
|
+
|
|
9
|
+
### 1. Documentation Updates ✅
|
|
10
|
+
- **CHANGELOG.md** - Updated with all features since 0.1.0:
|
|
11
|
+
- Canvas Mode (IPC for external apps)
|
|
12
|
+
- Templates (wizard, choices, confirm, info, table, code, diff)
|
|
13
|
+
- Dashboard Components
|
|
14
|
+
- Table enhancements
|
|
15
|
+
- Dark theme
|
|
16
|
+
- default: option for text inputs
|
|
17
|
+
|
|
18
|
+
- **README.md** - Completely rewritten:
|
|
19
|
+
- "Express intention, get interface" tagline
|
|
20
|
+
- Joy of Ruby philosophy section
|
|
21
|
+
- Four modes table (Standalone, Agentic, Canvas, Service)
|
|
22
|
+
- `ruby app.rb` vs `streamweaver app.rb` distinction
|
|
23
|
+
- Token efficiency emphasis (5-10x fewer tokens)
|
|
24
|
+
- iTerm2 built-in browser tip
|
|
25
|
+
- Condensed components reference
|
|
26
|
+
|
|
27
|
+
### 2. Panel Feature (Partially Done)
|
|
28
|
+
**Commits pushed:**
|
|
29
|
+
- `062a295` - feat: Add panel command for iTerm2 split + canvas workflow
|
|
30
|
+
|
|
31
|
+
**Files created/modified:**
|
|
32
|
+
- `lib/stream_weaver/iterm.rb` - NEW - iTerm2 AppleScript integration
|
|
33
|
+
- `lib/stream_weaver/cli.rb` - Added `panel` and `install-skill` commands
|
|
34
|
+
- `lib/stream_weaver/canvas/bridge_server.rb` - Enhanced waiting screen
|
|
35
|
+
- `lib/stream_weaver.rb` - Added require for iterm.rb
|
|
36
|
+
|
|
37
|
+
**What works:**
|
|
38
|
+
- `streamweaver panel [name]` - Creates canvas, splits iTerm2 pane
|
|
39
|
+
- `streamweaver install-skill [--global]` - Installs Claude Code skill
|
|
40
|
+
- AppleScript escaping fixed (using Open3.capture2 with stdin)
|
|
41
|
+
- Split returns `:external` (uses system browser since iTerm2 browser profile not set up)
|
|
42
|
+
|
|
43
|
+
**Known issues to investigate:**
|
|
44
|
+
- "✓ Submitted - You can close this window" message appears on canvas submit
|
|
45
|
+
- User reported this is wrong for live canvas mode
|
|
46
|
+
- Need to verify if this was existing behavior or regression
|
|
47
|
+
|
|
48
|
+
## What's Left
|
|
49
|
+
|
|
50
|
+
### 1. Test Panel Feature
|
|
51
|
+
```bash
|
|
52
|
+
# Test the panel command
|
|
53
|
+
./exe/streamweaver panel test-session
|
|
54
|
+
|
|
55
|
+
# Should:
|
|
56
|
+
# - Split iTerm2 vertically
|
|
57
|
+
# - Create canvas session
|
|
58
|
+
# - Open browser (external or in iTerm2 if browser profile exists)
|
|
59
|
+
|
|
60
|
+
# Push content
|
|
61
|
+
./exe/streamweaver canvas-push test-session <<'RUBY'
|
|
62
|
+
header1 "Test"
|
|
63
|
+
button "Click me"
|
|
64
|
+
RUBY
|
|
65
|
+
|
|
66
|
+
# Clean up
|
|
67
|
+
./exe/streamweaver canvas-close test-session
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. Investigate Submit Message
|
|
71
|
+
- Check if "close this window" message on submit was existing behavior
|
|
72
|
+
- Canvas/live mode may need different submit handling than agentic mode
|
|
73
|
+
- Don't change without understanding full context
|
|
74
|
+
|
|
75
|
+
### 3. Gem Release Prep
|
|
76
|
+
- Version bump: 0.1.0 → 0.2.0 (in `lib/stream_weaver/version.rb`)
|
|
77
|
+
- Clean up old files:
|
|
78
|
+
- `IMPLEMENTATION_SUMMARY_v0.1.0.md` - move to docs/archive?
|
|
79
|
+
- `blog_post_streamweaver_vs_react.md` - remove from gem?
|
|
80
|
+
- Build and test gem locally: `gem build stream_weaver.gemspec`
|
|
81
|
+
- Push to RubyGems: `gem push stream_weaver-0.2.0.gem`
|
|
82
|
+
|
|
83
|
+
### 4. iTerm2 Browser Profile (Optional Enhancement)
|
|
84
|
+
For true embedded browser in iTerm2 split pane:
|
|
85
|
+
1. User needs to set up browser profile in iTerm2 Preferences
|
|
86
|
+
2. Could add `streamweaver setup-iterm` command to guide this
|
|
87
|
+
3. See: https://iterm2.com/documentation-web.html
|
|
88
|
+
|
|
89
|
+
## Key Files
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
lib/stream_weaver/
|
|
93
|
+
├── iterm.rb # iTerm2 AppleScript (NEW)
|
|
94
|
+
├── cli.rb # panel, install-skill commands
|
|
95
|
+
├── canvas/
|
|
96
|
+
│ └── bridge_server.rb # Enhanced waiting screen
|
|
97
|
+
└── version.rb # Bump to 0.2.0
|
|
98
|
+
|
|
99
|
+
docs/
|
|
100
|
+
├── canvas-roadmap.md # Canvas documentation
|
|
101
|
+
├── templates.md # Templates documentation
|
|
102
|
+
└── SERVICE_MODE.md # Service mode docs
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Commands Reference
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
# Panel workflow
|
|
109
|
+
streamweaver panel [name] # Split iTerm2, open canvas
|
|
110
|
+
streamweaver canvas-push <name> # Push DSL content
|
|
111
|
+
streamweaver canvas-wait <name> # Wait for user interaction
|
|
112
|
+
streamweaver canvas-close <name> # Close session
|
|
113
|
+
|
|
114
|
+
# Skill installation
|
|
115
|
+
streamweaver install-skill # Project scope (.claude/skills/)
|
|
116
|
+
streamweaver install-skill --global # Global scope (~/.claude/skills/)
|
|
117
|
+
|
|
118
|
+
# Gem build
|
|
119
|
+
gem build stream_weaver.gemspec
|
|
120
|
+
gem push stream_weaver-0.2.0.gem
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Resume Prompt
|
|
124
|
+
|
|
125
|
+
To continue this work, use this prompt:
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
Continue StreamWeaver gem release preparation.
|
|
130
|
+
|
|
131
|
+
Current state:
|
|
132
|
+
- README and CHANGELOG updated and committed
|
|
133
|
+
- Panel feature implemented but needs testing
|
|
134
|
+
- Need to: test panel, investigate submit message behavior, bump version, release gem
|
|
135
|
+
|
|
136
|
+
Read the plan at `docs/plans/2026-01-26-gem-release-and-panel.md` for full context.
|
|
137
|
+
|
|
138
|
+
Start by testing the panel command to verify the iTerm2 split works correctly.
|
|
139
|
+
|
|
140
|
+
---
|