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,53 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
require_relative '../../lib/stream_weaver'
|
|
5
|
+
|
|
6
|
+
glossary = {
|
|
7
|
+
"bullish" => {
|
|
8
|
+
simple: "Expecting prices to go UP",
|
|
9
|
+
detailed: "A bullish outlook means expecting prices to increase. Investors who are bullish believe the market or a specific asset will rise in value. The term comes from how a bull attacks - thrusting its horns upward."
|
|
10
|
+
},
|
|
11
|
+
"bearish" => {
|
|
12
|
+
simple: "Expecting prices to go DOWN",
|
|
13
|
+
detailed: "A bearish outlook means expecting prices to decrease. Investors who are bearish believe the market or a specific asset will fall in value. The term comes from how a bear attacks - swiping its paws downward."
|
|
14
|
+
},
|
|
15
|
+
"Quad 4" => {
|
|
16
|
+
simple: "Economic regime: deflation",
|
|
17
|
+
detailed: "Quad 4 is one of four economic regimes in the Growth-Inflation-Policy (GIP) framework. It occurs when both growth AND inflation are falling - a deflationary environment where bonds typically outperform stocks and cash is king."
|
|
18
|
+
},
|
|
19
|
+
"rally" => {
|
|
20
|
+
simple: "Prices rising quickly",
|
|
21
|
+
detailed: "A rally is a period of sustained increases in asset prices. During a rally, buying pressure exceeds selling pressure, pushing prices higher. Rallies can last days, weeks, or months."
|
|
22
|
+
},
|
|
23
|
+
"duration" => {
|
|
24
|
+
simple: "How much bonds react to rate changes",
|
|
25
|
+
detailed: "Duration measures how sensitive a bond's price is to changes in interest rates. A bond with 5-year duration will lose ~5% if rates rise 1%. Longer duration = more sensitivity = more risk/reward."
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
App = app "Lesson Demo: Understanding Market Dynamics" do
|
|
30
|
+
header "Understanding Market Terms"
|
|
31
|
+
text "Hover over the highlighted terms to see their definitions. Click the tooltip for more detail."
|
|
32
|
+
|
|
33
|
+
# Block-based DSL approach
|
|
34
|
+
lesson_text glossary: glossary do
|
|
35
|
+
phrase "When analysts are "
|
|
36
|
+
term "bullish"
|
|
37
|
+
phrase " on stocks but "
|
|
38
|
+
term "bearish"
|
|
39
|
+
phrase " on bonds, it often indicates we're NOT in "
|
|
40
|
+
term "Quad 4"
|
|
41
|
+
phrase "."
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
header "Bond Market Dynamics"
|
|
45
|
+
|
|
46
|
+
# String-based approach with {term} markers
|
|
47
|
+
lesson_text "In {Quad 4}, bonds typically {rally} because interest rates fall. This benefits investors holding bonds with high {duration}.", glossary: glossary
|
|
48
|
+
|
|
49
|
+
header "Grade Level Selection (Coming Soon)"
|
|
50
|
+
text "Future versions will support switching between 5th, 8th, and 11th grade explanations."
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
App.run! if __FILE__ == $0
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Demo of GitHub Flavored Markdown support
|
|
5
|
+
# Shows the full power of the md component using Kramdown
|
|
6
|
+
|
|
7
|
+
require_relative '../../lib/stream_weaver'
|
|
8
|
+
|
|
9
|
+
app "GitHub Flavored Markdown Demo" do
|
|
10
|
+
header1 "GitHub Flavored Markdown in StreamWeaver"
|
|
11
|
+
|
|
12
|
+
text "The md component supports full GFM via Kramdown. The text component renders literally."
|
|
13
|
+
|
|
14
|
+
header "1. Text Formatting"
|
|
15
|
+
md <<~MD
|
|
16
|
+
**Bold text** and *italic text* and ***bold italic***
|
|
17
|
+
|
|
18
|
+
~~Strikethrough~~ text
|
|
19
|
+
|
|
20
|
+
`Inline code` for short snippets
|
|
21
|
+
MD
|
|
22
|
+
|
|
23
|
+
header "2. Links and Images"
|
|
24
|
+
md <<~MD
|
|
25
|
+
[Visit GitHub](https://github.com) - regular link
|
|
26
|
+
|
|
27
|
+
[Link with title](https://example.com "Example Site") - hover for title
|
|
28
|
+
|
|
29
|
+

|
|
30
|
+
MD
|
|
31
|
+
|
|
32
|
+
header "3. Lists"
|
|
33
|
+
md <<~MD
|
|
34
|
+
**Unordered list:**
|
|
35
|
+
- First item
|
|
36
|
+
- Second item
|
|
37
|
+
- Nested item
|
|
38
|
+
- Another nested
|
|
39
|
+
- Third item
|
|
40
|
+
|
|
41
|
+
**Ordered list:**
|
|
42
|
+
1. Step one
|
|
43
|
+
2. Step two
|
|
44
|
+
3. Step three
|
|
45
|
+
|
|
46
|
+
**Task list:**
|
|
47
|
+
- [x] Completed task
|
|
48
|
+
- [ ] Incomplete task
|
|
49
|
+
- [ ] Another todo
|
|
50
|
+
MD
|
|
51
|
+
|
|
52
|
+
header "4. Blockquotes"
|
|
53
|
+
md <<~MD
|
|
54
|
+
> This is a blockquote.
|
|
55
|
+
> It can span multiple lines.
|
|
56
|
+
>
|
|
57
|
+
> > Nested blockquotes work too!
|
|
58
|
+
MD
|
|
59
|
+
|
|
60
|
+
header "5. Code Blocks"
|
|
61
|
+
md <<~MD
|
|
62
|
+
```ruby
|
|
63
|
+
def hello(name)
|
|
64
|
+
puts "Hello, \#{name}!"
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
hello("World")
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
```javascript
|
|
71
|
+
const greet = (name) => {
|
|
72
|
+
console.log(`Hello, ${name}!`);
|
|
73
|
+
};
|
|
74
|
+
```
|
|
75
|
+
MD
|
|
76
|
+
|
|
77
|
+
header "6. Tables"
|
|
78
|
+
md <<~MD
|
|
79
|
+
| Feature | Supported | Notes |
|
|
80
|
+
|---------|:---------:|-------|
|
|
81
|
+
| Bold | ✅ | `**text**` |
|
|
82
|
+
| Italic | ✅ | `*text*` |
|
|
83
|
+
| Links | ✅ | `[text](url)` |
|
|
84
|
+
| Tables | ✅ | GFM style |
|
|
85
|
+
| Lists | ✅ | Ordered & unordered |
|
|
86
|
+
MD
|
|
87
|
+
|
|
88
|
+
header "7. Horizontal Rules"
|
|
89
|
+
md <<~MD
|
|
90
|
+
Content above the rule.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
Content below the rule.
|
|
95
|
+
MD
|
|
96
|
+
|
|
97
|
+
header "8. Headers in Markdown"
|
|
98
|
+
md <<~MD
|
|
99
|
+
## H2 Header
|
|
100
|
+
### H3 Header
|
|
101
|
+
#### H4 Header
|
|
102
|
+
MD
|
|
103
|
+
|
|
104
|
+
header "9. Dynamic Content"
|
|
105
|
+
text_field :name, placeholder: "Enter your name"
|
|
106
|
+
|
|
107
|
+
if state[:name] && !state[:name].empty?
|
|
108
|
+
md "Welcome, **#{state[:name]}**! You can use *markdown* in dynamic content too."
|
|
109
|
+
end
|
|
110
|
+
end.run!
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Demo of Mermaid diagram support
|
|
5
|
+
# Covers all options: basic, zoom/pan, compact in cards, ELK layout, theme_vars
|
|
6
|
+
|
|
7
|
+
require_relative '../../lib/stream_weaver'
|
|
8
|
+
|
|
9
|
+
app "Mermaid Diagram Demo" do
|
|
10
|
+
header1 "Mermaid Diagrams in StreamWeaver"
|
|
11
|
+
md "Mermaid.js is loaded lazily from CDN — only when a `mermaid` component is on the page."
|
|
12
|
+
|
|
13
|
+
# -----------------------------------------------------------------------
|
|
14
|
+
# 1. Basic usage
|
|
15
|
+
# -----------------------------------------------------------------------
|
|
16
|
+
header2 "1. Basic Usage"
|
|
17
|
+
md "Pass a string (or heredoc) — any valid Mermaid diagram type."
|
|
18
|
+
|
|
19
|
+
mermaid <<~MERMAID
|
|
20
|
+
graph LR
|
|
21
|
+
A[Start] --> B{Is it working?}
|
|
22
|
+
B -- Yes --> C[Ship it]
|
|
23
|
+
B -- No --> D[Debug]
|
|
24
|
+
D --> A
|
|
25
|
+
MERMAID
|
|
26
|
+
|
|
27
|
+
# -----------------------------------------------------------------------
|
|
28
|
+
# 2. zoom: true — interactive zoom/pan with controls
|
|
29
|
+
# -----------------------------------------------------------------------
|
|
30
|
+
header2 "2. Zoom / Pan (zoom: true)"
|
|
31
|
+
md "Adds +/−/reset buttons and Ctrl+scroll zoom. Useful for large diagrams."
|
|
32
|
+
|
|
33
|
+
mermaid <<~MERMAID, zoom: true
|
|
34
|
+
graph TD
|
|
35
|
+
Client["Browser / Mobile"]
|
|
36
|
+
GW["API Gateway"]
|
|
37
|
+
Auth["Auth Service"]
|
|
38
|
+
UserDB[("Users DB")]
|
|
39
|
+
Redis["Token Blacklist (Redis)"]
|
|
40
|
+
App["Application"]
|
|
41
|
+
|
|
42
|
+
Client -->|"POST /auth/login"| GW
|
|
43
|
+
GW --> Auth
|
|
44
|
+
Auth -->|"verify"| UserDB
|
|
45
|
+
Auth -->|"issue JWT"| GW
|
|
46
|
+
GW -->|"HttpOnly cookie"| Client
|
|
47
|
+
|
|
48
|
+
Client -->|"GET /api/data (Bearer)"| GW
|
|
49
|
+
GW -->|"check blacklist"| Redis
|
|
50
|
+
GW -->|"forward valid"| App
|
|
51
|
+
App --> Client
|
|
52
|
+
|
|
53
|
+
style Client fill:#dbeafe,stroke:#3b82f6,color:#1e3a5f
|
|
54
|
+
style Auth fill:#dcfce7,stroke:#22c55e,color:#166534
|
|
55
|
+
style Redis fill:#fef3c7,stroke:#f59e0b,color:#92400e
|
|
56
|
+
style UserDB fill:#f3e8ff,stroke:#a855f7,color:#6b21a8
|
|
57
|
+
MERMAID
|
|
58
|
+
|
|
59
|
+
# -----------------------------------------------------------------------
|
|
60
|
+
# 3. compact: true — reduced padding for embedding inside cards
|
|
61
|
+
# -----------------------------------------------------------------------
|
|
62
|
+
header2 "3. Compact Mode (compact: true)"
|
|
63
|
+
md "Reduces diagram padding so it fits naturally inside a `card`. Shown side-by-side here."
|
|
64
|
+
|
|
65
|
+
columns widths: ['50%', '50%'] do
|
|
66
|
+
column do
|
|
67
|
+
card do
|
|
68
|
+
header3 "Request Flow"
|
|
69
|
+
mermaid <<~MERMAID, compact: true
|
|
70
|
+
sequenceDiagram
|
|
71
|
+
Client->>+Server: GET /data
|
|
72
|
+
Server->>+DB: SELECT ...
|
|
73
|
+
DB-->>-Server: rows
|
|
74
|
+
Server-->>-Client: 200 JSON
|
|
75
|
+
MERMAID
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
column do
|
|
79
|
+
card do
|
|
80
|
+
header3 "Deploy Pipeline"
|
|
81
|
+
mermaid <<~MERMAID, compact: true
|
|
82
|
+
graph LR
|
|
83
|
+
PR[Pull Request] --> CI[CI Tests]
|
|
84
|
+
CI --> Review[Code Review]
|
|
85
|
+
Review --> Merge[Merge]
|
|
86
|
+
Merge --> Deploy[Deploy]
|
|
87
|
+
Deploy --> Monitor[Monitor]
|
|
88
|
+
MERMAID
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# -----------------------------------------------------------------------
|
|
94
|
+
# 4. layout: :elk — ELK layout engine (better for complex graphs)
|
|
95
|
+
# -----------------------------------------------------------------------
|
|
96
|
+
header2 "4. ELK Layout Engine (layout: :elk)"
|
|
97
|
+
md "The ELK layout engine handles dense, complex graphs better than the default Dagre engine. Loaded from CDN only when needed."
|
|
98
|
+
|
|
99
|
+
mermaid <<~MERMAID, layout: :elk
|
|
100
|
+
graph TD
|
|
101
|
+
Ingress --> ServiceA
|
|
102
|
+
Ingress --> ServiceB
|
|
103
|
+
Ingress --> ServiceC
|
|
104
|
+
ServiceA --> Cache
|
|
105
|
+
ServiceA --> DB
|
|
106
|
+
ServiceB --> Queue
|
|
107
|
+
ServiceB --> DB
|
|
108
|
+
ServiceC --> Cache
|
|
109
|
+
ServiceC --> Storage
|
|
110
|
+
Queue --> Worker1
|
|
111
|
+
Queue --> Worker2
|
|
112
|
+
Worker1 --> DB
|
|
113
|
+
Worker2 --> Storage
|
|
114
|
+
MERMAID
|
|
115
|
+
|
|
116
|
+
# -----------------------------------------------------------------------
|
|
117
|
+
# 5. theme_vars — per-diagram color overrides
|
|
118
|
+
# -----------------------------------------------------------------------
|
|
119
|
+
header2 "5. Theme Variables (theme_vars:)"
|
|
120
|
+
md "Override Mermaid's `themeVariables` per diagram — useful for brand colors or callout diagrams."
|
|
121
|
+
|
|
122
|
+
indigo_theme = {
|
|
123
|
+
primaryColor: "#6366f1",
|
|
124
|
+
primaryTextColor: "#ffffff",
|
|
125
|
+
primaryBorderColor: "#4f46e5",
|
|
126
|
+
lineColor: "#6366f1",
|
|
127
|
+
secondaryColor: "#e0e7ff",
|
|
128
|
+
tertiaryColor: "#f0fdf4"
|
|
129
|
+
}
|
|
130
|
+
mermaid <<~MERMAID, theme_vars: indigo_theme
|
|
131
|
+
graph LR
|
|
132
|
+
User --> App
|
|
133
|
+
App --> API
|
|
134
|
+
API --> DB
|
|
135
|
+
API --> Cache
|
|
136
|
+
MERMAID
|
|
137
|
+
|
|
138
|
+
# -----------------------------------------------------------------------
|
|
139
|
+
# 6. Other diagram types
|
|
140
|
+
# -----------------------------------------------------------------------
|
|
141
|
+
header2 "6. Other Diagram Types"
|
|
142
|
+
md "Any Mermaid diagram type works: sequence, pie, gantt, gitgraph, etc."
|
|
143
|
+
|
|
144
|
+
columns widths: ['50%', '50%'] do
|
|
145
|
+
column do
|
|
146
|
+
header3 "Pie Chart"
|
|
147
|
+
mermaid <<~MERMAID
|
|
148
|
+
pie title Test Coverage
|
|
149
|
+
"Unit" : 65
|
|
150
|
+
"Integration" : 25
|
|
151
|
+
"E2E" : 10
|
|
152
|
+
MERMAID
|
|
153
|
+
end
|
|
154
|
+
column do
|
|
155
|
+
header3 "Sequence Diagram"
|
|
156
|
+
mermaid <<~MERMAID
|
|
157
|
+
sequenceDiagram
|
|
158
|
+
autonumber
|
|
159
|
+
Alice->>Bob: Hello!
|
|
160
|
+
Bob-->>Alice: Hi there
|
|
161
|
+
Alice->>Bob: How are you?
|
|
162
|
+
Bob-->>Alice: All good, thanks
|
|
163
|
+
MERMAID
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
end.run!
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# Demonstrates the six FAC-P2.2 pareto components together: date_field,
|
|
5
|
+
# accordion/section, chip_group, board/lane/board_card, text tones +
|
|
6
|
+
# callout banners, and columns equal-split/auto-distribution.
|
|
7
|
+
# Run: ruby examples/components/pareto_set.rb
|
|
8
|
+
|
|
9
|
+
require_relative '../../lib/stream_weaver'
|
|
10
|
+
|
|
11
|
+
TASKS = {
|
|
12
|
+
todo: ["Write proposal", "Review PR #42"],
|
|
13
|
+
doing: ["Ship pareto components"],
|
|
14
|
+
done: ["Set up CI", "Draft gap catalog"]
|
|
15
|
+
}.freeze
|
|
16
|
+
|
|
17
|
+
ROLES = %w[Engineer Designer PM Writer Analyst].freeze
|
|
18
|
+
|
|
19
|
+
App = app "Pareto Components" do
|
|
20
|
+
header1 "Pareto Component Set (FAC-P2.2)"
|
|
21
|
+
|
|
22
|
+
header "1. date_field"
|
|
23
|
+
date_field :deadline, label: "Deadline", min: "2026-01-01", max: "2027-12-31"
|
|
24
|
+
if (parsed = StreamWeaver::Components::DateField.to_date(state[:deadline]))
|
|
25
|
+
text "Parsed as a Date: #{parsed.iso8601}", tone: :muted
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
header "2. accordion / section"
|
|
29
|
+
accordion do
|
|
30
|
+
section("What is this?", open: true) do
|
|
31
|
+
text "Native <details>/<summary> disclosure -- zero JS."
|
|
32
|
+
end
|
|
33
|
+
section("Why not expandable_card?") do
|
|
34
|
+
text "expandable_card needs a state key; this doesn't."
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
header "3. chip_group"
|
|
39
|
+
chip_group :tags, %w[Ruby Rails Sinatra Hanami], multi: true
|
|
40
|
+
text "Selected: #{Array(state[:tags]).join(', ')}", tone: :caption
|
|
41
|
+
|
|
42
|
+
header "4. board / lane / board_card"
|
|
43
|
+
board do
|
|
44
|
+
TASKS.each do |lane_key, items|
|
|
45
|
+
lane(lane_key.to_s.capitalize) do
|
|
46
|
+
items.each { |item| board_card { text item } }
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
header "5. text tones + callout"
|
|
52
|
+
text "Muted helper text.", tone: :muted
|
|
53
|
+
text "Something went wrong.", tone: :error
|
|
54
|
+
text "Operation succeeded.", tone: :success
|
|
55
|
+
callout("Saved successfully.", tone: :success)
|
|
56
|
+
callout(variant: :warning, title: "Heads up") do
|
|
57
|
+
text "The block form still works exactly as before."
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
header "6. columns equal-split"
|
|
61
|
+
columns(3, items: ROLES) { |role| card { text role } }
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
App.run! if __FILE__ == $0
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
# PRD document pattern demo — replicates the "Calendar-Driven Travel State" PRD artifact.
|
|
5
|
+
# Loads prd_dsl.rb as its body so standalone and canvas-push stay in content sync.
|
|
6
|
+
# Demonstrates: doc_header, doc_section_header, sidebar_toc, callout, mermaid,
|
|
7
|
+
# comparison (scope grid), table, code_block, card.
|
|
8
|
+
#
|
|
9
|
+
# Run: ruby examples/components/prd_demo.rb
|
|
10
|
+
# Or for canvas push: streamweaver canvas-push <session> < examples/components/prd_dsl.rb
|
|
11
|
+
|
|
12
|
+
require_relative "../../lib/stream_weaver"
|
|
13
|
+
|
|
14
|
+
PRD_DSL_PATH = File.join(__dir__, "prd_dsl.rb")
|
|
15
|
+
|
|
16
|
+
PrdDemo = app "PRD: Calendar-Driven Travel State", theme: :doc do
|
|
17
|
+
theme_toggle mode: :light
|
|
18
|
+
instance_eval(File.read(PRD_DSL_PATH), PRD_DSL_PATH)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
PrdDemo.run! if __FILE__ == $0
|