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,275 @@
|
|
|
1
|
+
# StreamWeaver Canvas Roadmap
|
|
2
|
+
|
|
3
|
+
## What is Canvas?
|
|
4
|
+
|
|
5
|
+
**The Problem:** Agentic AI CLIs like Claude Code are powerful but constrained to text-based terminal interaction. Complex choices, data visualization, code review, and multi-step workflows become walls of text that are hard to parse and interact with.
|
|
6
|
+
|
|
7
|
+
**The Solution:** A persistent browser canvas that AI agents can push rich HTML/CSS/JS UI to, enabling:
|
|
8
|
+
- Visual data display (tables, charts, diffs)
|
|
9
|
+
- Interactive forms and wizards
|
|
10
|
+
- Clickable choices instead of typing responses
|
|
11
|
+
- Real-time progress visualization
|
|
12
|
+
|
|
13
|
+
**Why Ruby/Phlex?** Token efficiency. Instead of generating verbose HTML, the AI generates concise Ruby DSL:
|
|
14
|
+
```ruby
|
|
15
|
+
# 45 tokens of Ruby
|
|
16
|
+
table headers: ["File", "Size"], rows: data, striped: true
|
|
17
|
+
button "Apply Changes", variant: :primary
|
|
18
|
+
|
|
19
|
+
# vs 200+ tokens of equivalent HTML/CSS
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### Primary Use Case
|
|
23
|
+
|
|
24
|
+
**Claude Code Companion** - Side-by-side experience:
|
|
25
|
+
- Terminal on left: Claude Code CLI running
|
|
26
|
+
- Canvas on right: Rich UI for interaction
|
|
27
|
+
|
|
28
|
+
When Claude needs user input, instead of:
|
|
29
|
+
```
|
|
30
|
+
Please choose:
|
|
31
|
+
1. PostgreSQL
|
|
32
|
+
2. SQLite
|
|
33
|
+
3. MySQL
|
|
34
|
+
Enter number:
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
It pushes a visual choice UI, user clicks, Claude receives JSON response.
|
|
38
|
+
|
|
39
|
+
### StreamWeaver Modes: When to Use What
|
|
40
|
+
|
|
41
|
+
StreamWeaver has multiple modes. Canvas (live sessions) is one of them:
|
|
42
|
+
|
|
43
|
+
| Mode | Command | Use When |
|
|
44
|
+
|------|---------|----------|
|
|
45
|
+
| **Standalone** | `streamweaver run app.rb` | Building a complete web app with predefined UI |
|
|
46
|
+
| **Server** | `streamweaver serve` | Hosting multiple apps, production deployment |
|
|
47
|
+
| **Agentic** | `streamweaver llm` | AI generates UI on-the-fly during conversation |
|
|
48
|
+
| **Canvas** | `streamweaver live SESSION` | AI pushes UI during external workflow (e.g., Claude Code) |
|
|
49
|
+
|
|
50
|
+
**Standalone** - You write the app, user interacts with fixed UI
|
|
51
|
+
```ruby
|
|
52
|
+
# my_app.rb - predefined screens and flow
|
|
53
|
+
text_field :name
|
|
54
|
+
button "Submit" do |state|
|
|
55
|
+
# handle submission
|
|
56
|
+
end
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Agentic** - AI writes the app dynamically based on conversation
|
|
60
|
+
```bash
|
|
61
|
+
streamweaver llm # AI generates UI based on chat
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**Canvas** - External AI agent pushes UI as needed during its workflow
|
|
65
|
+
```bash
|
|
66
|
+
# Claude Code (or other agent) runs separately
|
|
67
|
+
# Pushes to canvas when it needs rich interaction
|
|
68
|
+
./exe/streamweaver template wizard mysession '{"steps":[...]}'
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### When to Use Canvas vs Other Modes
|
|
72
|
+
|
|
73
|
+
| Scenario | Best Mode | Why |
|
|
74
|
+
|----------|-----------|-----|
|
|
75
|
+
| Building a dashboard app | Standalone | Fixed UI, known requirements |
|
|
76
|
+
| Deploying apps for team | Server | Multi-app hosting, production-ready |
|
|
77
|
+
| Chatbot builds custom UI | Agentic | AI controls the whole experience |
|
|
78
|
+
| Claude Code needs user input | **Canvas** | AI is running elsewhere, pushes when needed |
|
|
79
|
+
| CI/CD wants to show results | **Canvas** | External process pushes status |
|
|
80
|
+
| Debug session visualization | **Canvas** | Debugger pushes state as it runs |
|
|
81
|
+
|
|
82
|
+
### Canvas-Specific Use Cases
|
|
83
|
+
|
|
84
|
+
| Use Case | Description |
|
|
85
|
+
|----------|-------------|
|
|
86
|
+
| **Any agentic CLI** | Not Claude-specific - any AI agent can push to canvas |
|
|
87
|
+
| **Build dashboards** | Show test results, coverage, build status visually |
|
|
88
|
+
| **Code review UI** | Rich diff display with inline comments |
|
|
89
|
+
| **Onboarding wizards** | Guide users through project setup |
|
|
90
|
+
| **Debug visualizers** | Display data structures, call stacks graphically |
|
|
91
|
+
| **Documentation preview** | Live preview of generated docs |
|
|
92
|
+
| **Database explorers** | Query results in proper tables |
|
|
93
|
+
| **Log viewers** | Filterable, searchable log display |
|
|
94
|
+
| **Deployment dashboards** | Multi-environment status at a glance |
|
|
95
|
+
| **LLM prompt builders** | Visual prompt construction with previews |
|
|
96
|
+
|
|
97
|
+
### Design Principles
|
|
98
|
+
|
|
99
|
+
1. **Token efficient** - Ruby DSL, not verbose HTML
|
|
100
|
+
2. **Bidirectional** - Push UI, receive user actions as JSON
|
|
101
|
+
3. **Stateless templates** - Each interaction is self-contained
|
|
102
|
+
4. **Progressive enhancement** - Works with polling, can upgrade to WebSocket
|
|
103
|
+
5. **Browser-native** - No Electron needed, any browser works
|
|
104
|
+
|
|
105
|
+
## Current State (January 2025)
|
|
106
|
+
|
|
107
|
+
### Working
|
|
108
|
+
- Live sessions with 300ms polling
|
|
109
|
+
- 7 templates: wizard, choices, confirm, info, table, code, diff
|
|
110
|
+
- Native Phlex table component with styling options
|
|
111
|
+
- Smooth CSS transitions between content updates
|
|
112
|
+
- Theme support (dashboard, minimal, dark)
|
|
113
|
+
- Form submission capture and retrieval
|
|
114
|
+
|
|
115
|
+
**Key Files:**
|
|
116
|
+
| File | Purpose |
|
|
117
|
+
|------|---------|
|
|
118
|
+
| `lib/stream_weaver/templates/*.rb` | 7 template classes (wizard, choices, confirm, info, table, code, diff) |
|
|
119
|
+
| `lib/stream_weaver/cli.rb` | `template` command dispatch |
|
|
120
|
+
| `lib/stream_weaver/service.rb` | Live session endpoints (`/live/:session`, `/push`, `/submissions`) |
|
|
121
|
+
| `lib/stream_weaver/components.rb` | Native Table component |
|
|
122
|
+
| `lib/stream_weaver/adapter/alpinejs.rb` | `render_table` and component rendering |
|
|
123
|
+
| `lib/stream_weaver/css.rb` | Animations and table CSS classes |
|
|
124
|
+
|
|
125
|
+
### Limitations
|
|
126
|
+
- No real-time streaming (polling only)
|
|
127
|
+
- No terminal embedding yet
|
|
128
|
+
- Templates require user to have browser open
|
|
129
|
+
- No progress updates during long-running Claude tasks
|
|
130
|
+
|
|
131
|
+
## Future Directions
|
|
132
|
+
|
|
133
|
+
### 1. Terminal Integration
|
|
134
|
+
|
|
135
|
+
**Goal:** Side-by-side terminal + canvas experience
|
|
136
|
+
|
|
137
|
+
**Options explored:**
|
|
138
|
+
| Approach | Pros | Cons |
|
|
139
|
+
|----------|------|------|
|
|
140
|
+
| xterm.js | Full terminal emulator | Complex PTY setup, WebSocket needed |
|
|
141
|
+
| tmux capture | Simple, read pane buffer | Polling delay, not true integration |
|
|
142
|
+
| ttyd/gotty | Existing tools | External dependency, iframe embed |
|
|
143
|
+
|
|
144
|
+
**Recommendation:** Start with tmux capture for simplicity, evolve to xterm.js if needed.
|
|
145
|
+
|
|
146
|
+
### 2. Real-time Progress Updates
|
|
147
|
+
|
|
148
|
+
**Problem:** Claude can't push updates during thinking/tool execution.
|
|
149
|
+
|
|
150
|
+
**Explored solutions:**
|
|
151
|
+
| Approach | How | Status |
|
|
152
|
+
|----------|-----|--------|
|
|
153
|
+
| Incremental pushes | Claude pushes between steps | Works, but adds tool calls |
|
|
154
|
+
| Status file | Claude writes file, canvas polls | Not implemented |
|
|
155
|
+
| Hooks | Claude Code hooks for output events | Unknown feasibility |
|
|
156
|
+
|
|
157
|
+
**Recommendation:** For now, use incremental pushes. Status file approach is cleaner but requires infrastructure.
|
|
158
|
+
|
|
159
|
+
### 3. New Templates
|
|
160
|
+
|
|
161
|
+
**High value:**
|
|
162
|
+
- `progress` - Progress bar with status messages (for multi-step tasks)
|
|
163
|
+
- `log` - Scrolling log viewer (for build output, test results)
|
|
164
|
+
- `file-tree` - Interactive file browser
|
|
165
|
+
- `form` - Generic form builder (more flexible than wizard)
|
|
166
|
+
|
|
167
|
+
**Nice to have:**
|
|
168
|
+
- `chart` - Simple charts (bar, line)
|
|
169
|
+
- `timeline` - Event timeline display
|
|
170
|
+
- `kanban` - Task board view
|
|
171
|
+
|
|
172
|
+
### 4. WebSocket Support
|
|
173
|
+
|
|
174
|
+
**Current:** 300ms polling works but isn't true real-time.
|
|
175
|
+
|
|
176
|
+
**Trade-off:** WebSocket adds complexity (Sinatra needs extra gems like Faye or switching to a different server).
|
|
177
|
+
|
|
178
|
+
**Recommendation:** Polling is sufficient for current use cases. Revisit if latency becomes an issue.
|
|
179
|
+
|
|
180
|
+
### 5. Electron/Desktop App
|
|
181
|
+
|
|
182
|
+
**Idea:** Native app with terminal + canvas side-by-side.
|
|
183
|
+
|
|
184
|
+
**Benefits:**
|
|
185
|
+
- True terminal integration
|
|
186
|
+
- No browser tab needed
|
|
187
|
+
- Could hook into Claude Code process directly
|
|
188
|
+
|
|
189
|
+
**Complexity:** High - separate app to maintain.
|
|
190
|
+
|
|
191
|
+
**Recommendation:** Defer until web-based approach hits limitations.
|
|
192
|
+
|
|
193
|
+
### 6. VS Code Extension
|
|
194
|
+
|
|
195
|
+
**Idea:** Webview panel in VS Code alongside terminal.
|
|
196
|
+
|
|
197
|
+
**Benefits:**
|
|
198
|
+
- Developers already in VS Code
|
|
199
|
+
- Native integration with editor
|
|
200
|
+
- Could leverage VS Code's terminal API
|
|
201
|
+
|
|
202
|
+
**Complexity:** Medium - VS Code extension API learning curve.
|
|
203
|
+
|
|
204
|
+
### 7. Better Code Display
|
|
205
|
+
|
|
206
|
+
**Current:** Basic dark theme code block.
|
|
207
|
+
|
|
208
|
+
**Improvements:**
|
|
209
|
+
- Syntax highlighting (via Prism.js or highlight.js)
|
|
210
|
+
- Line number linking
|
|
211
|
+
- Diff with inline comments
|
|
212
|
+
- Copy button
|
|
213
|
+
- Expand/collapse for long code
|
|
214
|
+
|
|
215
|
+
### 8. Session Persistence
|
|
216
|
+
|
|
217
|
+
**Current:** Sessions are in-memory, lost on restart.
|
|
218
|
+
|
|
219
|
+
**Improvement:** Store session state to disk for:
|
|
220
|
+
- Resume after service restart
|
|
221
|
+
- History of interactions
|
|
222
|
+
- Audit trail
|
|
223
|
+
|
|
224
|
+
### 9. Multi-canvas Support
|
|
225
|
+
|
|
226
|
+
**Idea:** Multiple named canvases for different purposes:
|
|
227
|
+
- `main` - Primary interaction
|
|
228
|
+
- `logs` - Continuous log output
|
|
229
|
+
- `status` - Persistent status bar
|
|
230
|
+
|
|
231
|
+
**Implementation:** Already supported via session names, just needs patterns/conventions.
|
|
232
|
+
|
|
233
|
+
## Architecture Notes
|
|
234
|
+
|
|
235
|
+
### Why Polling vs WebSocket
|
|
236
|
+
|
|
237
|
+
Polling at 300ms provides:
|
|
238
|
+
- Simpler implementation (plain HTTP)
|
|
239
|
+
- Works through proxies/firewalls
|
|
240
|
+
- No connection management
|
|
241
|
+
- Good enough latency for human interaction
|
|
242
|
+
|
|
243
|
+
WebSocket would provide:
|
|
244
|
+
- True real-time updates
|
|
245
|
+
- Lower server load for many clients
|
|
246
|
+
- Better for streaming output
|
|
247
|
+
|
|
248
|
+
### Why Phlex
|
|
249
|
+
|
|
250
|
+
- Ruby-native templating
|
|
251
|
+
- Type-safe HTML generation
|
|
252
|
+
- Composable components
|
|
253
|
+
- No separate template files
|
|
254
|
+
|
|
255
|
+
### Template Design Principles
|
|
256
|
+
|
|
257
|
+
1. **Single command** - Full interaction in one bash call
|
|
258
|
+
2. **JSON in, JSON out** - Easy to parse programmatically
|
|
259
|
+
3. **Clear state** - Each run starts fresh
|
|
260
|
+
4. **Timeout** - Don't hang forever
|
|
261
|
+
5. **Sensible defaults** - Work out of the box
|
|
262
|
+
|
|
263
|
+
## Next Steps (Prioritized)
|
|
264
|
+
|
|
265
|
+
1. **Dogfood** - Use templates in real agentic workflows
|
|
266
|
+
2. **Progress template** - Most requested for long tasks
|
|
267
|
+
3. **Syntax highlighting** - Improve code/diff display
|
|
268
|
+
4. **Documentation** - More examples, best practices
|
|
269
|
+
|
|
270
|
+
## Non-Goals (For Now)
|
|
271
|
+
|
|
272
|
+
- Full IDE replacement
|
|
273
|
+
- Complex state management
|
|
274
|
+
- Multi-user collaboration
|
|
275
|
+
- Mobile support
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Case study: the Org + canvas-read document shelf (DiDX proposal session)
|
|
2
|
+
|
|
3
|
+
Date: 2026-09-03. Environment: **Codex (ChatGPT desktop app) on macOS** — notably *not* the
|
|
4
|
+
designed-for environment (Claude Code + iTerm2). The workflow held up anyway, which is the
|
|
5
|
+
headline: the Org-source + canvas-read loop is agent-agnostic.
|
|
6
|
+
|
|
7
|
+
**The winning loop:**
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
Discuss → save a small Org document → reload canvas-read → compare versions → revise → export when ready
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
> Agent-friendly source, human-friendly reading, version-friendly files, and very low
|
|
14
|
+
> friction between writing and reviewing.
|
|
15
|
+
|
|
16
|
+
Three proposal documents (a neutral showcase, a personal version with several rounds of copy
|
|
17
|
+
revision, and a technical starter) lived as 12-16KB Org files sharing one image directory,
|
|
18
|
+
read side-by-side in canvas-read's shelf (left rail, per-doc TOC, Previous/Next). Preserving
|
|
19
|
+
alternative versions felt cheap rather than burdensome — that is the feature.
|
|
20
|
+
|
|
21
|
+
What follows is the session's own context write-up, verbatim.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## What happened
|
|
26
|
+
|
|
27
|
+
In one Codex session, we developed a visual DiDX proposal through several rounds of discussion.
|
|
28
|
+
|
|
29
|
+
Codex created and saved three StreamWeaver Org documents:
|
|
30
|
+
|
|
31
|
+
1. `didx_whats_possible.org` — a neutral visual showcase.
|
|
32
|
+
2. `didx_let_me_expand_the_picture.org` — a more personal version written from me to the recipient, with several rounds of copy revision.
|
|
33
|
+
3. `didx_blueprint_theme_model_starter.org` — a local implementation starter for the component, blueprint, theme, color scheme, page, and preset hierarchy.
|
|
34
|
+
|
|
35
|
+
The Org files remained small, around 12 to 16 KB each. The visual weight lived in shared image assets rather than bloated document source.
|
|
36
|
+
|
|
37
|
+
## Why canvas-read felt so good
|
|
38
|
+
|
|
39
|
+
`canvas-read` turned the files into a small local document shelf. The left rail showed all three documents. I could:
|
|
40
|
+
|
|
41
|
+
- Move between versions immediately.
|
|
42
|
+
- Compare the neutral and personal versions without opening separate tools.
|
|
43
|
+
- Keep the technical starter beside the presentation documents.
|
|
44
|
+
- Use the generated table of contents inside each document.
|
|
45
|
+
- See images, callouts, tables, diagrams, and polished formatting.
|
|
46
|
+
- Reload after an edit and immediately review the result.
|
|
47
|
+
- Keep the canonical source as Org while getting a much better reading experience.
|
|
48
|
+
|
|
49
|
+
The important experience was that these stopped feeling like loose files. They felt like a small, navigable local knowledge collection.
|
|
50
|
+
|
|
51
|
+
This was especially useful while revising the message. We could preserve the previous version, create another version with a different voice, and compare them from the same shelf.
|
|
52
|
+
|
|
53
|
+
## Actual command used
|
|
54
|
+
|
|
55
|
+
The executable was not on `PATH`, so the working command was run from the repository:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
SW_NO_OPEN=1 bundle exec ruby -Ilib exe/streamweaver canvas-read \
|
|
59
|
+
/path/to/didx_whats_possible.org \
|
|
60
|
+
/path/to/didx_let_me_expand_the_picture.org \
|
|
61
|
+
/path/to/didx_blueprint_theme_model_starter.org \
|
|
62
|
+
--theme=doc
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
`canvas-read` selected an available port and printed the URL:
|
|
66
|
+
|
|
67
|
+
```text
|
|
68
|
+
canvas-read 3 file(s) → http://127.0.0.1:4800/?file=0
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Earlier runs used port 4801. Documentation should explicitly say not to assume a fixed port.
|
|
72
|
+
|
|
73
|
+
Passing the files explicitly produced the controlled comparison shelf we wanted.
|
|
74
|
+
|
|
75
|
+
## Org format used
|
|
76
|
+
|
|
77
|
+
Each source begins with:
|
|
78
|
+
|
|
79
|
+
```org
|
|
80
|
+
#+STREAMWEAVER_DSL: 1
|
|
81
|
+
#+TITLE: Document Title
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Numbered headings with `CUSTOM_ID` properties become document sections and generate the sidebar table of contents. Normal prose, lists, tables, quotes, and source blocks remain readable as Org.
|
|
85
|
+
|
|
86
|
+
Components not represented natively in the Org dialect can use the existing passthrough:
|
|
87
|
+
|
|
88
|
+
```org
|
|
89
|
+
#+begin_src ruby :streamweaver-raw t
|
|
90
|
+
image_block File.join(__dir__, "assets/example.png"), base64: true,
|
|
91
|
+
alt: "Description"
|
|
92
|
+
#+end_src
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
This let the document remain primarily Org while still using StreamWeaver image components and limited custom styling.
|
|
96
|
+
|
|
97
|
+
## Images and shared assets
|
|
98
|
+
|
|
99
|
+
The documents referenced one shared image directory; generated images were not duplicated per document. `image_block` with `base64: true` made the images work in `canvas-read`, where ordinary relative image paths do not have a backing asset route.
|
|
100
|
+
|
|
101
|
+
```text
|
|
102
|
+
Small Org source + shared high-quality images = rich canvas-read document
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Standalone delivery
|
|
106
|
+
|
|
107
|
+
We also produced standalone HTML and an email-ready ZIP (~11 MB):
|
|
108
|
+
|
|
109
|
+
```text
|
|
110
|
+
Proposal/
|
|
111
|
+
├── Proposal.html
|
|
112
|
+
└── images/ (11 PNG files)
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
Recipient instructions: unzip, keep the HTML and `images` together, double-click the HTML.
|
|
116
|
+
|
|
117
|
+
## Important export gap
|
|
118
|
+
|
|
119
|
+
`canvas-read` handled the StreamWeaver Org files correctly. The normal `streamweaver export file.org` command did not — it attempted to evaluate the raw Org text as Ruby and failed. The session worked around it by reading the Org, converting through `StreamWeaver::Org::Reader.to_dsl`, evaluating in a `StreamWeaver::App`, and passing that to `StreamWeaver::Export::HtmlExporter`. This is a current gap; a first-class Org export path would remove the custom step.
|
|
120
|
+
|
|
121
|
+
## Another known gap: links between documents
|
|
122
|
+
|
|
123
|
+
Same-document Org anchors work. Native relative links from one Org document to another are not rewritten into `canvas-read` navigation URLs. The shelf made cross-document links unnecessary here, but a connected corpus will eventually want that. MarkyMark has prior art: it rewrites relative Markdown/Org links into internal reader routes preserving fragments and searches.
|
|
124
|
+
|
|
125
|
+
## What was actually tested
|
|
126
|
+
|
|
127
|
+
Directly tested: macOS; Codex Desktop and its in-app browser; local StreamWeaver source; Ruby and Bundler already installed; canvas-read with explicit Org file arguments; the `:doc` theme; multiple documents in one shelf; desktop and phone-width rendering; Org-to-DSL conversion; shared image assets; standalone HTML generation; ZIP packaging with relative images.
|
|
128
|
+
|
|
129
|
+
Not tested: Linux; WSL; native Windows Ruby; browsers outside the Codex in-app browser for canvas-read; a packaged StreamWeaver executable; a clean machine without the development repository; `streamweaver panel` without iTerm.
|
|
130
|
+
|
|
131
|
+
## Platform boundaries to document clearly
|
|
132
|
+
|
|
133
|
+
`streamweaver panel` is the iTerm-specific convenience path — macOS + iTerm functionality. `canvas-read` is a local web server and far less platform-specific; the degraded path is: start without auto-open, print the URL, open it in any browser. That should be viable on macOS without iTerm, Linux, WSL, and possibly Windows, subject to Ruby/browser-launch testing. The Chrome plugin and `gh` CLI are workflow enhancers, not requirements for reading a local shelf.
|
|
134
|
+
|
|
135
|
+
Documentation should distinguish: tested and supported / expected to work but not tested / known degraded path / future platform support.
|
|
136
|
+
|
|
137
|
+
## Suggested degraded demo
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
SW_NO_OPEN=1 streamweaver canvas-read docs/
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Expected: URL printed; user opens it; shelf lists Org and Ruby documents; navigation, TOC, images, diagrams, reading mode all work; no iTerm required. Test independently on macOS-plain-terminal, Linux, WSL, Windows.
|
|
144
|
+
|
|
145
|
+
## Suggested documentation structure
|
|
146
|
+
|
|
147
|
+
1. What canvas-read is. 2. The tested macOS happy path. 3. Saving or authoring StreamWeaver Org documents. 4. Opening one document. 5. Opening a shelf. 6. Comparing versions with the left rail and Previous/Next. 7. Working with images. 8. Exporting or packaging. 9. Platform support matrix. 10. No-iTerm degraded path. 11. Known gaps. 12. This case study.
|