@hiai-gg/hiai-opencode 0.2.0 → 0.2.2
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.
- package/.env.example +4 -0
- package/AGENTS.md +40 -44
- package/ARCHITECTURE.md +4 -3
- package/LICENSE.md +14 -0
- package/README.md +61 -30
- package/assets/cli/hiai-opencode.mjs +4 -4
- package/config/hiai-opencode.schema.json +11 -13
- package/dist/agents/{bob.d.ts → bob/claude.d.ts} +6 -2
- package/dist/agents/bob/core.d.ts +6 -0
- package/dist/agents/bob/gpt.d.ts +11 -0
- package/dist/agents/bob/index.d.ts +3 -0
- package/dist/agents/coder/core.d.ts +4 -0
- package/dist/agents/coder/gpt.d.ts +1 -4
- package/dist/agents/coder/index.d.ts +1 -0
- package/dist/agents/manager/agent.d.ts +1 -1
- package/dist/agents/manager/default-prompt-sections.d.ts +4 -4
- package/dist/agents/manager/guard-integration.d.ts +1 -0
- package/dist/agents/prompt-library/index.d.ts +0 -1
- package/dist/agents/prompt-library/shared-execution.d.ts +9 -0
- package/dist/agents/strategist/behavioral-summary.d.ts +1 -1
- package/dist/agents/strategist/identity-constraints.d.ts +1 -1
- package/dist/agents/strategist/plan-generation.d.ts +1 -1
- package/dist/agents/types.d.ts +2 -1
- package/dist/config/defaults.d.ts +1 -0
- package/dist/config/platform-schema.d.ts +26 -26
- package/dist/config/schema/agent-names.d.ts +6 -6
- package/dist/config/schema/agent-overrides.d.ts +0 -128
- package/dist/config/schema/hiai-opencode-config.d.ts +0 -128
- package/dist/config/types.d.ts +2 -2
- package/dist/features/background-agent/error-classifier.d.ts +1 -0
- package/dist/features/background-agent/manager-notifier.d.ts +46 -0
- package/dist/features/background-agent/manager-types.d.ts +40 -0
- package/dist/features/background-agent/manager.d.ts +3 -19
- package/dist/features/background-agent/polling-manager.d.ts +51 -0
- package/dist/features/boulder-state/constants.d.ts +3 -0
- package/dist/features/boulder-state/storage.d.ts +95 -0
- package/dist/features/boulder-state/types.d.ts +17 -0
- package/dist/features/builtin-commands/templates/doctor.d.ts +1 -1
- package/dist/features/builtin-commands/templates/loop.d.ts +2 -0
- package/dist/features/builtin-commands/templates/start-work.d.ts +1 -1
- package/dist/features/builtin-skills/skills/interview-me.d.ts +2 -0
- package/dist/features/builtin-skills/skills/planning-and-task-breakdown.d.ts +2 -0
- package/dist/hooks/manager/resolve-active-boulder-session.d.ts +5 -0
- package/dist/hooks/manager/system-reminder-templates.d.ts +2 -2
- package/dist/hooks/reasoning-content-cache/hook.d.ts +11 -0
- package/dist/hooks/reasoning-content-cache/index.d.ts +1 -0
- package/dist/hooks/session-recovery/checkpoint.d.ts +48 -0
- package/dist/hooks/session-recovery/enhanced-hook.d.ts +30 -0
- package/dist/hooks/session-recovery/state-backup.d.ts +76 -0
- package/dist/hooks/shared/compaction-in-progress.d.ts +4 -0
- package/dist/hooks/start-work/context-info-builder.d.ts +2 -0
- package/dist/hooks/start-work/git-operations.d.ts +47 -0
- package/dist/hooks/start-work/worktree-block.d.ts +2 -1
- package/dist/hooks/start-work/worktree-detector.d.ts +45 -0
- package/dist/hooks/strategist-md-only/agent-resolution.d.ts +1 -1
- package/dist/hooks/strategist-md-only/constants.d.ts +6 -0
- package/dist/hooks/token-budget.d.ts +30 -0
- package/dist/index.js +1275 -1132
- package/dist/mcp/rate-limiter.d.ts +68 -0
- package/dist/plugin/chat-message.d.ts +8 -0
- package/dist/plugin/command-execute-before.d.ts +1 -1
- package/dist/plugin/event-handlers/message-updated.d.ts +2 -0
- package/dist/plugin/event-handlers/session-error.d.ts +2 -0
- package/dist/plugin/event-handlers/session-status.d.ts +2 -0
- package/dist/plugin/event-handlers/types.d.ts +62 -0
- package/dist/plugin/event-handlers/utils.d.ts +11 -0
- package/dist/plugin/event.d.ts +1 -1
- package/dist/shared/data-path.d.ts +1 -1
- package/dist/shared/errors.d.ts +70 -0
- package/dist/shared/extract-session-id.d.ts +8 -0
- package/dist/shared/git-worktree/get-git-state-summary.d.ts +14 -0
- package/dist/shared/index.d.ts +67 -68
- package/dist/shared/internal-initiator-marker.d.ts +1 -1
- package/dist/shared/logger.d.ts +5 -1
- package/dist/shared/reasoning-content-cache.d.ts +68 -0
- package/dist/shared/safe-create-hook.d.ts +4 -4
- package/dist/tools/call-hiai-agent/constants.d.ts +2 -2
- package/dist/tools/delegate-task/sub-agent.d.ts +1 -1
- package/dist/tools/look-at/constants.d.ts +1 -1
- package/docs/architecture/bob-manager-architecture.md +244 -0
- package/docs/hiai-opencode/adr/ADR-001-agent-identity-section-injection.md +66 -0
- package/docs/hiai-opencode/adr/ADR-002-anti-loop-guard-priority.md +63 -0
- package/docs/hiai-opencode/adr/ADR-003-compaction-mechanism.md +71 -0
- package/docs/hiai-opencode/adr/ADR-004-session-recovery.md +76 -0
- package/docs/hiai-opencode/api.md +305 -0
- package/docs/hiai-opencode/hooks-architecture.md +225 -0
- package/docs/hiai-opencode/migration.md +209 -0
- package/docs/quickstart.md +1 -1
- package/docs/skill-discovery.md +288 -0
- package/package.json +2 -2
- package/skills/agent-browser/SKILL.md +193 -0
- package/skills/apple-hig/SKILL.md +43 -0
- package/skills/article-magazine/SKILL.md +46 -0
- package/skills/article-magazine/example.html +81 -0
- package/skills/article-magazine/example.md +38 -0
- package/skills/canvas-design/SKILL.md +45 -0
- package/skills/design-templates/audio-jingle/SKILL.md +132 -0
- package/skills/design-templates/audio-jingle/example.html +128 -0
- package/skills/design-templates/blog-post/SKILL.md +80 -0
- package/skills/design-templates/blog-post/example.html +80 -0
- package/skills/design-templates/clinical-case-report/SKILL.md +209 -0
- package/skills/design-templates/clinical-case-report/example.html +698 -0
- package/skills/design-templates/clinical-case-report/examples/example-stemi.html +698 -0
- package/skills/design-templates/clinical-case-report/references/case-formats.md +94 -0
- package/skills/design-templates/clinical-case-report/references/checklist.md +41 -0
- package/skills/design-templates/critique/SKILL.md +258 -0
- package/skills/design-templates/critique/example.html +671 -0
- package/skills/design-templates/dashboard/SKILL.md +76 -0
- package/skills/design-templates/dashboard/example.html +118 -0
- package/skills/design-templates/dating-web/SKILL.md +92 -0
- package/skills/design-templates/dating-web/example.html +265 -0
- package/skills/design-templates/dcf-valuation/SKILL.md +140 -0
- package/skills/design-templates/dcf-valuation/references/sector-wacc.md +42 -0
- package/skills/design-templates/digital-eguide/SKILL.md +94 -0
- package/skills/design-templates/digital-eguide/example.html +204 -0
- package/skills/design-templates/docs-page/SKILL.md +80 -0
- package/skills/design-templates/docs-page/example.html +122 -0
- package/skills/design-templates/email-marketing/SKILL.md +84 -0
- package/skills/design-templates/email-marketing/example.html +159 -0
- package/skills/design-templates/eng-runbook/SKILL.md +51 -0
- package/skills/design-templates/eng-runbook/example.html +250 -0
- package/skills/design-templates/finance-report/SKILL.md +61 -0
- package/skills/design-templates/finance-report/example.html +242 -0
- package/skills/design-templates/flowai-live-dashboard-template/SKILL.md +87 -0
- package/skills/design-templates/flowai-live-dashboard-template/assets/template.html +387 -0
- package/skills/design-templates/flowai-live-dashboard-template/example.html +13 -0
- package/skills/design-templates/flowai-live-dashboard-template/references/checklist.md +35 -0
- package/skills/design-templates/gamified-app/SKILL.md +108 -0
- package/skills/design-templates/gamified-app/example.html +292 -0
- package/skills/design-templates/github-dashboard/SKILL.md +130 -0
- package/skills/design-templates/github-dashboard/example.html +473 -0
- package/skills/design-templates/github-dashboard/references/README.md +10 -0
- package/skills/design-templates/github-dashboard/references/artifact-example.json +15 -0
- package/skills/design-templates/github-dashboard/references/example-data.json +138 -0
- package/skills/design-templates/github-dashboard/references/provenance-example.json +92 -0
- package/skills/design-templates/github-dashboard/references/template.html +473 -0
- package/skills/design-templates/guizang-ppt/LICENSE +21 -0
- package/skills/design-templates/guizang-ppt/README.en.md +119 -0
- package/skills/design-templates/guizang-ppt/README.md +120 -0
- package/skills/design-templates/guizang-ppt/README.pt-BR.md +121 -0
- package/skills/design-templates/guizang-ppt/SKILL.md +313 -0
- package/skills/design-templates/guizang-ppt/assets/example-slides.html +318 -0
- package/skills/design-templates/guizang-ppt/assets/template.html +647 -0
- package/skills/design-templates/guizang-ppt/references/checklist.md +265 -0
- package/skills/design-templates/guizang-ppt/references/components.md +363 -0
- package/skills/design-templates/guizang-ppt/references/layouts.md +630 -0
- package/skills/design-templates/guizang-ppt/references/styles.md +195 -0
- package/skills/design-templates/guizang-ppt/references/themes.md +122 -0
- package/skills/design-templates/hr-onboarding/SKILL.md +52 -0
- package/skills/design-templates/hr-onboarding/example.html +219 -0
- package/skills/design-templates/html-ppt/.clawscan-allow +12 -0
- package/skills/design-templates/html-ppt/LICENSE +21 -0
- package/skills/design-templates/html-ppt/README.md +234 -0
- package/skills/design-templates/html-ppt/README.pt-BR.md +239 -0
- package/skills/design-templates/html-ppt/README.zh-CN.md +238 -0
- package/skills/design-templates/html-ppt/SKILL.md +250 -0
- package/skills/design-templates/html-ppt/assets/animations/animations.css +138 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/_util.js +63 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/chain-react.js +41 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/confetti-cannon.js +49 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/constellation.js +44 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/counter-explosion.js +58 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/data-stream.js +45 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/firework.js +51 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/galaxy-swirl.js +33 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/gradient-blob.js +39 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/knowledge-graph.js +69 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/letter-explode.js +50 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/magnetic-field.js +40 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/matrix-rain.js +33 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/neural-net.js +75 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/orbit-ring.js +38 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/particle-burst.js +42 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/shockwave.js +39 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/sparkle-trail.js +62 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/starfield.js +30 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/typewriter-multi.js +51 -0
- package/skills/design-templates/html-ppt/assets/animations/fx/word-cascade.js +47 -0
- package/skills/design-templates/html-ppt/assets/animations/fx-runtime.js +99 -0
- package/skills/design-templates/html-ppt/assets/base.css +150 -0
- package/skills/design-templates/html-ppt/assets/fonts.css +9 -0
- package/skills/design-templates/html-ppt/assets/runtime.js +960 -0
- package/skills/design-templates/html-ppt/assets/themes/academic-paper.css +23 -0
- package/skills/design-templates/html-ppt/assets/themes/arctic-cool.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/aurora.css +20 -0
- package/skills/design-templates/html-ppt/assets/themes/bauhaus.css +16 -0
- package/skills/design-templates/html-ppt/assets/themes/blueprint.css +19 -0
- package/skills/design-templates/html-ppt/assets/themes/catppuccin-latte.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/catppuccin-mocha.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/corporate-clean.css +19 -0
- package/skills/design-templates/html-ppt/assets/themes/cyberpunk-neon.css +23 -0
- package/skills/design-templates/html-ppt/assets/themes/dracula.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/editorial-serif.css +18 -0
- package/skills/design-templates/html-ppt/assets/themes/engineering-whiteprint.css +26 -0
- package/skills/design-templates/html-ppt/assets/themes/glassmorphism.css +21 -0
- package/skills/design-templates/html-ppt/assets/themes/gruvbox-dark.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/japanese-minimal.css +21 -0
- package/skills/design-templates/html-ppt/assets/themes/magazine-bold.css +21 -0
- package/skills/design-templates/html-ppt/assets/themes/memphis-pop.css +20 -0
- package/skills/design-templates/html-ppt/assets/themes/midcentury.css +19 -0
- package/skills/design-templates/html-ppt/assets/themes/minimal-white.css +16 -0
- package/skills/design-templates/html-ppt/assets/themes/neo-brutalism.css +17 -0
- package/skills/design-templates/html-ppt/assets/themes/news-broadcast.css +20 -0
- package/skills/design-templates/html-ppt/assets/themes/nord.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/pitch-deck-vc.css +21 -0
- package/skills/design-templates/html-ppt/assets/themes/rainbow-gradient.css +16 -0
- package/skills/design-templates/html-ppt/assets/themes/retro-tv.css +22 -0
- package/skills/design-templates/html-ppt/assets/themes/rose-pine.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/sharp-mono.css +17 -0
- package/skills/design-templates/html-ppt/assets/themes/soft-pastel.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/solarized-light.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/sunset-warm.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/swiss-grid.css +17 -0
- package/skills/design-templates/html-ppt/assets/themes/terminal-green.css +18 -0
- package/skills/design-templates/html-ppt/assets/themes/tokyo-night.css +14 -0
- package/skills/design-templates/html-ppt/assets/themes/vaporwave.css +21 -0
- package/skills/design-templates/html-ppt/assets/themes/xiaohongshu-white.css +16 -0
- package/skills/design-templates/html-ppt/assets/themes/y2k-chrome.css +20 -0
- package/skills/design-templates/html-ppt/docs/readme/_theme-cell.html +56 -0
- package/skills/design-templates/html-ppt/docs/readme/animations.png +0 -0
- package/skills/design-templates/html-ppt/docs/readme/hero.gif +0 -0
- package/skills/design-templates/html-ppt/docs/readme/layouts-live.gif +0 -0
- package/skills/design-templates/html-ppt/docs/readme/layouts.png +0 -0
- package/skills/design-templates/html-ppt/docs/readme/montage-animations.html +61 -0
- package/skills/design-templates/html-ppt/docs/readme/montage-layouts.html +72 -0
- package/skills/design-templates/html-ppt/docs/readme/montage-templates.html +72 -0
- package/skills/design-templates/html-ppt/docs/readme/montage-themes.html +38 -0
- package/skills/design-templates/html-ppt/docs/readme/presenter-mode.png +0 -0
- package/skills/design-templates/html-ppt/docs/readme/templates.png +0 -0
- package/skills/design-templates/html-ppt/docs/readme/themes.png +0 -0
- package/skills/design-templates/html-ppt/examples/demo-deck/index.html +161 -0
- package/skills/design-templates/html-ppt/references/animations.md +147 -0
- package/skills/design-templates/html-ppt/references/authoring-guide.md +141 -0
- package/skills/design-templates/html-ppt/references/full-decks.md +98 -0
- package/skills/design-templates/html-ppt/references/layouts.md +103 -0
- package/skills/design-templates/html-ppt/references/presenter-mode.md +240 -0
- package/skills/design-templates/html-ppt/references/themes.md +107 -0
- package/skills/design-templates/html-ppt/scripts/new-deck.sh +46 -0
- package/skills/design-templates/html-ppt/scripts/render.sh +71 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_01.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_02.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_03.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_04.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_05.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_06.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_07.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_08.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_09.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_10.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_11.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_12.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_13.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_14.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_15.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_16.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_17.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_18.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_19.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/animation-showcase/animation-showcase_20.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_01.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_02.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_03.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_04.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_05.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_06.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_07.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_08.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_09.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_10.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_11.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_12.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_13.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_14.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_15.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_16.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_17.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_18.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_19.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_20.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_21.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_22.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_23.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_24.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_25.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_26.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_27.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_28.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_29.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_30.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_31.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_32.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_33.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_34.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_35.png +0 -0
- package/skills/design-templates/html-ppt/scripts/verify-output/theme-showcase/theme-showcase_36.png +0 -0
- package/skills/design-templates/html-ppt/templates/animation-showcase.html +172 -0
- package/skills/design-templates/html-ppt/templates/deck.html +69 -0
- package/skills/design-templates/html-ppt/templates/full-decks/course-module/README.md +8 -0
- package/skills/design-templates/html-ppt/templates/full-decks/course-module/index.html +189 -0
- package/skills/design-templates/html-ppt/templates/full-decks/course-module/style.css +46 -0
- package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/index.html +138 -0
- package/skills/design-templates/html-ppt/templates/full-decks/dir-key-nav-minimal/style.css +60 -0
- package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/index.html +180 -0
- package/skills/design-templates/html-ppt/templates/full-decks/graphify-dark-graph/style.css +54 -0
- package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/index.html +199 -0
- package/skills/design-templates/html-ppt/templates/full-decks/hermes-cyber-terminal/style.css +55 -0
- package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/index.html +190 -0
- package/skills/design-templates/html-ppt/templates/full-decks/knowledge-arch-blueprint/style.css +49 -0
- package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/index.html +144 -0
- package/skills/design-templates/html-ppt/templates/full-decks/obsidian-claude-gradient/style.css +59 -0
- package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/README.md +9 -0
- package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/index.html +148 -0
- package/skills/design-templates/html-ppt/templates/full-decks/pitch-deck/style.css +40 -0
- package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/README.md +102 -0
- package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/index.html +187 -0
- package/skills/design-templates/html-ppt/templates/full-decks/presenter-mode-reveal/style.css +216 -0
- package/skills/design-templates/html-ppt/templates/full-decks/product-launch/README.md +8 -0
- package/skills/design-templates/html-ppt/templates/full-decks/product-launch/index.html +121 -0
- package/skills/design-templates/html-ppt/templates/full-decks/product-launch/style.css +39 -0
- package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/README.md +8 -0
- package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/index.html +156 -0
- package/skills/design-templates/html-ppt/templates/full-decks/tech-sharing/style.css +49 -0
- package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/index.html +183 -0
- package/skills/design-templates/html-ppt/templates/full-decks/testing-safety-alert/style.css +62 -0
- package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/README.md +8 -0
- package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/index.html +127 -0
- package/skills/design-templates/html-ppt/templates/full-decks/weekly-report/style.css +55 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/index.html +147 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-pastel-card/style.css +66 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/README.md +9 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/index.html +133 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-post/style.css +47 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/README.md +11 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/index.html +187 -0
- package/skills/design-templates/html-ppt/templates/full-decks/xhs-white-editorial/style.css +63 -0
- package/skills/design-templates/html-ppt/templates/full-decks-index.html +82 -0
- package/skills/design-templates/html-ppt/templates/layout-showcase.html +47 -0
- package/skills/design-templates/html-ppt/templates/single-page/arch-diagram.html +46 -0
- package/skills/design-templates/html-ppt/templates/single-page/big-quote.html +18 -0
- package/skills/design-templates/html-ppt/templates/single-page/bullets.html +19 -0
- package/skills/design-templates/html-ppt/templates/single-page/chart-bar.html +30 -0
- package/skills/design-templates/html-ppt/templates/single-page/chart-line.html +35 -0
- package/skills/design-templates/html-ppt/templates/single-page/chart-pie.html +36 -0
- package/skills/design-templates/html-ppt/templates/single-page/chart-radar.html +31 -0
- package/skills/design-templates/html-ppt/templates/single-page/code.html +33 -0
- package/skills/design-templates/html-ppt/templates/single-page/comparison.html +47 -0
- package/skills/design-templates/html-ppt/templates/single-page/cover.html +32 -0
- package/skills/design-templates/html-ppt/templates/single-page/cta.html +27 -0
- package/skills/design-templates/html-ppt/templates/single-page/diff.html +35 -0
- package/skills/design-templates/html-ppt/templates/single-page/flow-diagram.html +33 -0
- package/skills/design-templates/html-ppt/templates/single-page/gantt.html +29 -0
- package/skills/design-templates/html-ppt/templates/single-page/image-grid.html +34 -0
- package/skills/design-templates/html-ppt/templates/single-page/image-hero.html +33 -0
- package/skills/design-templates/html-ppt/templates/single-page/kpi-grid.html +19 -0
- package/skills/design-templates/html-ppt/templates/single-page/mindmap.html +38 -0
- package/skills/design-templates/html-ppt/templates/single-page/process-steps.html +27 -0
- package/skills/design-templates/html-ppt/templates/single-page/pros-cons.html +31 -0
- package/skills/design-templates/html-ppt/templates/single-page/roadmap.html +46 -0
- package/skills/design-templates/html-ppt/templates/single-page/section-divider.html +17 -0
- package/skills/design-templates/html-ppt/templates/single-page/stat-highlight.html +17 -0
- package/skills/design-templates/html-ppt/templates/single-page/table.html +33 -0
- package/skills/design-templates/html-ppt/templates/single-page/terminal.html +35 -0
- package/skills/design-templates/html-ppt/templates/single-page/thanks.html +21 -0
- package/skills/design-templates/html-ppt/templates/single-page/three-column.html +18 -0
- package/skills/design-templates/html-ppt/templates/single-page/timeline.html +32 -0
- package/skills/design-templates/html-ppt/templates/single-page/toc.html +26 -0
- package/skills/design-templates/html-ppt/templates/single-page/todo-checklist.html +33 -0
- package/skills/design-templates/html-ppt/templates/single-page/two-column.html +39 -0
- package/skills/design-templates/html-ppt/templates/theme-showcase.html +151 -0
- package/skills/design-templates/html-ppt-course-module/SKILL.md +78 -0
- package/skills/design-templates/html-ppt-course-module/example.html +542 -0
- package/skills/design-templates/html-ppt-dir-key-nav-minimal/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-dir-key-nav-minimal/example.html +366 -0
- package/skills/design-templates/html-ppt-graphify-dark-graph/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-graphify-dark-graph/example.html +402 -0
- package/skills/design-templates/html-ppt-hermes-cyber-terminal/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-hermes-cyber-terminal/example.html +422 -0
- package/skills/design-templates/html-ppt-knowledge-arch-blueprint/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-knowledge-arch-blueprint/example.html +407 -0
- package/skills/design-templates/html-ppt-obsidian-claude-gradient/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-obsidian-claude-gradient/example.html +371 -0
- package/skills/design-templates/html-ppt-pitch-deck/SKILL.md +78 -0
- package/skills/design-templates/html-ppt-pitch-deck/example.html +495 -0
- package/skills/design-templates/html-ppt-presenter-mode-reveal/SKILL.md +78 -0
- package/skills/design-templates/html-ppt-presenter-mode-reveal/example.html +725 -0
- package/skills/design-templates/html-ppt-product-launch/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-product-launch/example.html +467 -0
- package/skills/design-templates/html-ppt-taste-brutalist/SKILL.md +70 -0
- package/skills/design-templates/html-ppt-taste-brutalist/example.html +774 -0
- package/skills/design-templates/html-ppt-taste-editorial/SKILL.md +62 -0
- package/skills/design-templates/html-ppt-taste-editorial/example.html +689 -0
- package/skills/design-templates/html-ppt-tech-sharing/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-tech-sharing/example.html +512 -0
- package/skills/design-templates/html-ppt-testing-safety-alert/SKILL.md +78 -0
- package/skills/design-templates/html-ppt-testing-safety-alert/example.html +413 -0
- package/skills/design-templates/html-ppt-weekly-report/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-weekly-report/example.html +489 -0
- package/skills/design-templates/html-ppt-xhs-pastel-card/SKILL.md +78 -0
- package/skills/design-templates/html-ppt-xhs-pastel-card/example.html +381 -0
- package/skills/design-templates/html-ppt-xhs-post/SKILL.md +78 -0
- package/skills/design-templates/html-ppt-xhs-post/example.html +487 -0
- package/skills/design-templates/html-ppt-xhs-white-editorial/SKILL.md +77 -0
- package/skills/design-templates/html-ppt-xhs-white-editorial/example.html +418 -0
- package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/example.html +1640 -0
- package/skills/design-templates/html-ppt-zhangzara-8-bit-orbit/template.json +48 -0
- package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/example.html +833 -0
- package/skills/design-templates/html-ppt-zhangzara-biennale-yellow/template.json +49 -0
- package/skills/design-templates/html-ppt-zhangzara-block-frame/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-block-frame/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-block-frame/example.html +1453 -0
- package/skills/design-templates/html-ppt-zhangzara-block-frame/template.json +47 -0
- package/skills/design-templates/html-ppt-zhangzara-blue-professional/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-blue-professional/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-blue-professional/example.html +1423 -0
- package/skills/design-templates/html-ppt-zhangzara-blue-professional/template.json +44 -0
- package/skills/design-templates/html-ppt-zhangzara-bold-poster/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-bold-poster/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-bold-poster/example.html +876 -0
- package/skills/design-templates/html-ppt-zhangzara-bold-poster/template.json +45 -0
- package/skills/design-templates/html-ppt-zhangzara-broadside/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-broadside/SKILL.md +92 -0
- package/skills/design-templates/html-ppt-zhangzara-broadside/example.html +2144 -0
- package/skills/design-templates/html-ppt-zhangzara-broadside/template.json +49 -0
- package/skills/design-templates/html-ppt-zhangzara-capsule/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-capsule/SKILL.md +92 -0
- package/skills/design-templates/html-ppt-zhangzara-capsule/example.html +1413 -0
- package/skills/design-templates/html-ppt-zhangzara-capsule/template.json +51 -0
- package/skills/design-templates/html-ppt-zhangzara-cartesian/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-cartesian/SKILL.md +92 -0
- package/skills/design-templates/html-ppt-zhangzara-cartesian/example.html +1136 -0
- package/skills/design-templates/html-ppt-zhangzara-cartesian/template.json +47 -0
- package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/example.html +1205 -0
- package/skills/design-templates/html-ppt-zhangzara-cobalt-grid/template.json +49 -0
- package/skills/design-templates/html-ppt-zhangzara-coral/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-coral/SKILL.md +92 -0
- package/skills/design-templates/html-ppt-zhangzara-coral/example.html +1487 -0
- package/skills/design-templates/html-ppt-zhangzara-coral/template.json +45 -0
- package/skills/design-templates/html-ppt-zhangzara-creative-mode/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-creative-mode/SKILL.md +99 -0
- package/skills/design-templates/html-ppt-zhangzara-creative-mode/assets/deck-stage.js +619 -0
- package/skills/design-templates/html-ppt-zhangzara-creative-mode/example.html +636 -0
- package/skills/design-templates/html-ppt-zhangzara-creative-mode/template.json +47 -0
- package/skills/design-templates/html-ppt-zhangzara-daisy-days/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-daisy-days/SKILL.md +93 -0
- package/skills/design-templates/html-ppt-zhangzara-daisy-days/example.html +469 -0
- package/skills/design-templates/html-ppt-zhangzara-daisy-days/template.json +54 -0
- package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/SKILL.md +98 -0
- package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/assets/deck-stage.js +619 -0
- package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/example.html +737 -0
- package/skills/design-templates/html-ppt-zhangzara-editorial-tri-tone/template.json +44 -0
- package/skills/design-templates/html-ppt-zhangzara-grove/LICENSE +21 -0
- package/skills/design-templates/html-ppt-zhangzara-grove/SKILL.md +92 -0
- package/skills/design-templates/html-ppt-zhangzara-grove/example.html +1676 -0
- package/skills/design-templates/html-ppt-zhangzara-grove/template.json +51 -0
- package/skills/figma-code-connect-components/SKILL.md +42 -0
- package/skills/figma-create-design-system-rules/SKILL.md +42 -0
- package/skills/figma-create-new-file/SKILL.md +41 -0
- package/skills/figma-generate-design/SKILL.md +42 -0
- package/skills/figma-generate-library/SKILL.md +42 -0
- package/skills/figma-implement-design/SKILL.md +42 -0
- package/skills/figma-use/SKILL.md +42 -0
- package/skills/full-page-screenshot/SKILL.md +42 -0
- package/skills/interview-me/SKILL.md +64 -0
- package/skills/planning-and-task-breakdown/SKILL.md +52 -0
- package/skills/sora/SKILL.md +43 -0
- package/skills/theme-factory/SKILL.md +43 -0
- package/skills/web-design-guidelines/SKILL.md +42 -0
- package/dist/agents/prompt-library/orchestration.d.ts +0 -4
- package/skills/brainstorming/SKILL.md +0 -164
- package/skills/brainstorming/scripts/frame-template.html +0 -214
- package/skills/brainstorming/scripts/helper.js +0 -88
- package/skills/brainstorming/scripts/server.cjs +0 -354
- package/skills/brainstorming/scripts/start-server.sh +0 -148
- package/skills/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
- package/skills/brainstorming/visual-companion.md +0 -287
|
@@ -1,354 +0,0 @@
|
|
|
1
|
-
const crypto = require('crypto');
|
|
2
|
-
const http = require('http');
|
|
3
|
-
const fs = require('fs');
|
|
4
|
-
const path = require('path');
|
|
5
|
-
|
|
6
|
-
// ========== WebSocket Protocol (RFC 6455) ==========
|
|
7
|
-
|
|
8
|
-
const OPCODES = { TEXT: 0x01, CLOSE: 0x08, PING: 0x09, PONG: 0x0A };
|
|
9
|
-
const WS_MAGIC = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
|
|
10
|
-
|
|
11
|
-
function computeAcceptKey(clientKey) {
|
|
12
|
-
return crypto.createHash('sha1').update(clientKey + WS_MAGIC).digest('base64');
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function encodeFrame(opcode, payload) {
|
|
16
|
-
const fin = 0x80;
|
|
17
|
-
const len = payload.length;
|
|
18
|
-
let header;
|
|
19
|
-
|
|
20
|
-
if (len < 126) {
|
|
21
|
-
header = Buffer.alloc(2);
|
|
22
|
-
header[0] = fin | opcode;
|
|
23
|
-
header[1] = len;
|
|
24
|
-
} else if (len < 65536) {
|
|
25
|
-
header = Buffer.alloc(4);
|
|
26
|
-
header[0] = fin | opcode;
|
|
27
|
-
header[1] = 126;
|
|
28
|
-
header.writeUInt16BE(len, 2);
|
|
29
|
-
} else {
|
|
30
|
-
header = Buffer.alloc(10);
|
|
31
|
-
header[0] = fin | opcode;
|
|
32
|
-
header[1] = 127;
|
|
33
|
-
header.writeBigUInt64BE(BigInt(len), 2);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return Buffer.concat([header, payload]);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function decodeFrame(buffer) {
|
|
40
|
-
if (buffer.length < 2) return null;
|
|
41
|
-
|
|
42
|
-
const secondByte = buffer[1];
|
|
43
|
-
const opcode = buffer[0] & 0x0F;
|
|
44
|
-
const masked = (secondByte & 0x80) !== 0;
|
|
45
|
-
let payloadLen = secondByte & 0x7F;
|
|
46
|
-
let offset = 2;
|
|
47
|
-
|
|
48
|
-
if (!masked) throw new Error('Client frames must be masked');
|
|
49
|
-
|
|
50
|
-
if (payloadLen === 126) {
|
|
51
|
-
if (buffer.length < 4) return null;
|
|
52
|
-
payloadLen = buffer.readUInt16BE(2);
|
|
53
|
-
offset = 4;
|
|
54
|
-
} else if (payloadLen === 127) {
|
|
55
|
-
if (buffer.length < 10) return null;
|
|
56
|
-
payloadLen = Number(buffer.readBigUInt64BE(2));
|
|
57
|
-
offset = 10;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const maskOffset = offset;
|
|
61
|
-
const dataOffset = offset + 4;
|
|
62
|
-
const totalLen = dataOffset + payloadLen;
|
|
63
|
-
if (buffer.length < totalLen) return null;
|
|
64
|
-
|
|
65
|
-
const mask = buffer.slice(maskOffset, dataOffset);
|
|
66
|
-
const data = Buffer.alloc(payloadLen);
|
|
67
|
-
for (let i = 0; i < payloadLen; i++) {
|
|
68
|
-
data[i] = buffer[dataOffset + i] ^ mask[i % 4];
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
return { opcode, payload: data, bytesConsumed: totalLen };
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// ========== Configuration ==========
|
|
75
|
-
|
|
76
|
-
const PORT = process.env.BRAINSTORM_PORT || (49152 + Math.floor(Math.random() * 16383));
|
|
77
|
-
const HOST = process.env.BRAINSTORM_HOST || '127.0.0.1';
|
|
78
|
-
const URL_HOST = process.env.BRAINSTORM_URL_HOST || (HOST === '127.0.0.1' ? 'localhost' : HOST);
|
|
79
|
-
const SESSION_DIR = process.env.BRAINSTORM_DIR || '/tmp/brainstorm';
|
|
80
|
-
const CONTENT_DIR = path.join(SESSION_DIR, 'content');
|
|
81
|
-
const STATE_DIR = path.join(SESSION_DIR, 'state');
|
|
82
|
-
let ownerPid = process.env.BRAINSTORM_OWNER_PID ? Number(process.env.BRAINSTORM_OWNER_PID) : null;
|
|
83
|
-
|
|
84
|
-
const MIME_TYPES = {
|
|
85
|
-
'.html': 'text/html', '.css': 'text/css', '.js': 'application/javascript',
|
|
86
|
-
'.json': 'application/json', '.png': 'image/png', '.jpg': 'image/jpeg',
|
|
87
|
-
'.jpeg': 'image/jpeg', '.gif': 'image/gif', '.svg': 'image/svg+xml'
|
|
88
|
-
};
|
|
89
|
-
|
|
90
|
-
// ========== Templates and Constants ==========
|
|
91
|
-
|
|
92
|
-
const WAITING_PAGE = `<!DOCTYPE html>
|
|
93
|
-
<html>
|
|
94
|
-
<head><meta charset="utf-8"><title>Brainstorm Companion</title>
|
|
95
|
-
<style>body { font-family: system-ui, sans-serif; padding: 2rem; max-width: 800px; margin: 0 auto; }
|
|
96
|
-
h1 { color: #333; } p { color: #666; }</style>
|
|
97
|
-
</head>
|
|
98
|
-
<body><h1>Brainstorm Companion</h1>
|
|
99
|
-
<p>Waiting for the agent to push a screen...</p></body></html>`;
|
|
100
|
-
|
|
101
|
-
const frameTemplate = fs.readFileSync(path.join(__dirname, 'frame-template.html'), 'utf-8');
|
|
102
|
-
const helperScript = fs.readFileSync(path.join(__dirname, 'helper.js'), 'utf-8');
|
|
103
|
-
const helperInjection = '<script>\n' + helperScript + '\n</script>';
|
|
104
|
-
|
|
105
|
-
// ========== Helper Functions ==========
|
|
106
|
-
|
|
107
|
-
function isFullDocument(html) {
|
|
108
|
-
const trimmed = html.trimStart().toLowerCase();
|
|
109
|
-
return trimmed.startsWith('<!doctype') || trimmed.startsWith('<html');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
function wrapInFrame(content) {
|
|
113
|
-
return frameTemplate.replace('<!-- CONTENT -->', content);
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
function getNewestScreen() {
|
|
117
|
-
const files = fs.readdirSync(CONTENT_DIR)
|
|
118
|
-
.filter(f => f.endsWith('.html'))
|
|
119
|
-
.map(f => {
|
|
120
|
-
const fp = path.join(CONTENT_DIR, f);
|
|
121
|
-
return { path: fp, mtime: fs.statSync(fp).mtime.getTime() };
|
|
122
|
-
})
|
|
123
|
-
.sort((a, b) => b.mtime - a.mtime);
|
|
124
|
-
return files.length > 0 ? files[0].path : null;
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
// ========== HTTP Request Handler ==========
|
|
128
|
-
|
|
129
|
-
function handleRequest(req, res) {
|
|
130
|
-
touchActivity();
|
|
131
|
-
if (req.method === 'GET' && req.url === '/') {
|
|
132
|
-
const screenFile = getNewestScreen();
|
|
133
|
-
let html = screenFile
|
|
134
|
-
? (raw => isFullDocument(raw) ? raw : wrapInFrame(raw))(fs.readFileSync(screenFile, 'utf-8'))
|
|
135
|
-
: WAITING_PAGE;
|
|
136
|
-
|
|
137
|
-
if (html.includes('</body>')) {
|
|
138
|
-
html = html.replace('</body>', helperInjection + '\n</body>');
|
|
139
|
-
} else {
|
|
140
|
-
html += helperInjection;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
144
|
-
res.end(html);
|
|
145
|
-
} else if (req.method === 'GET' && req.url.startsWith('/files/')) {
|
|
146
|
-
const fileName = req.url.slice(7);
|
|
147
|
-
const filePath = path.join(CONTENT_DIR, path.basename(fileName));
|
|
148
|
-
if (!fs.existsSync(filePath)) {
|
|
149
|
-
res.writeHead(404);
|
|
150
|
-
res.end('Not found');
|
|
151
|
-
return;
|
|
152
|
-
}
|
|
153
|
-
const ext = path.extname(filePath).toLowerCase();
|
|
154
|
-
const contentType = MIME_TYPES[ext] || 'application/octet-stream';
|
|
155
|
-
res.writeHead(200, { 'Content-Type': contentType });
|
|
156
|
-
res.end(fs.readFileSync(filePath));
|
|
157
|
-
} else {
|
|
158
|
-
res.writeHead(404);
|
|
159
|
-
res.end('Not found');
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// ========== WebSocket Connection Handling ==========
|
|
164
|
-
|
|
165
|
-
const clients = new Set();
|
|
166
|
-
|
|
167
|
-
function handleUpgrade(req, socket) {
|
|
168
|
-
const key = req.headers['sec-websocket-key'];
|
|
169
|
-
if (!key) { socket.destroy(); return; }
|
|
170
|
-
|
|
171
|
-
const accept = computeAcceptKey(key);
|
|
172
|
-
socket.write(
|
|
173
|
-
'HTTP/1.1 101 Switching Protocols\r\n' +
|
|
174
|
-
'Upgrade: websocket\r\n' +
|
|
175
|
-
'Connection: Upgrade\r\n' +
|
|
176
|
-
'Sec-WebSocket-Accept: ' + accept + '\r\n\r\n'
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
let buffer = Buffer.alloc(0);
|
|
180
|
-
clients.add(socket);
|
|
181
|
-
|
|
182
|
-
socket.on('data', (chunk) => {
|
|
183
|
-
buffer = Buffer.concat([buffer, chunk]);
|
|
184
|
-
while (buffer.length > 0) {
|
|
185
|
-
let result;
|
|
186
|
-
try {
|
|
187
|
-
result = decodeFrame(buffer);
|
|
188
|
-
} catch (e) {
|
|
189
|
-
socket.end(encodeFrame(OPCODES.CLOSE, Buffer.alloc(0)));
|
|
190
|
-
clients.delete(socket);
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
if (!result) break;
|
|
194
|
-
buffer = buffer.slice(result.bytesConsumed);
|
|
195
|
-
|
|
196
|
-
switch (result.opcode) {
|
|
197
|
-
case OPCODES.TEXT:
|
|
198
|
-
handleMessage(result.payload.toString());
|
|
199
|
-
break;
|
|
200
|
-
case OPCODES.CLOSE:
|
|
201
|
-
socket.end(encodeFrame(OPCODES.CLOSE, Buffer.alloc(0)));
|
|
202
|
-
clients.delete(socket);
|
|
203
|
-
return;
|
|
204
|
-
case OPCODES.PING:
|
|
205
|
-
socket.write(encodeFrame(OPCODES.PONG, result.payload));
|
|
206
|
-
break;
|
|
207
|
-
case OPCODES.PONG:
|
|
208
|
-
break;
|
|
209
|
-
default: {
|
|
210
|
-
const closeBuf = Buffer.alloc(2);
|
|
211
|
-
closeBuf.writeUInt16BE(1003);
|
|
212
|
-
socket.end(encodeFrame(OPCODES.CLOSE, closeBuf));
|
|
213
|
-
clients.delete(socket);
|
|
214
|
-
return;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
|
|
220
|
-
socket.on('close', () => clients.delete(socket));
|
|
221
|
-
socket.on('error', () => clients.delete(socket));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
function handleMessage(text) {
|
|
225
|
-
let event;
|
|
226
|
-
try {
|
|
227
|
-
event = JSON.parse(text);
|
|
228
|
-
} catch (e) {
|
|
229
|
-
console.error('Failed to parse WebSocket message:', e.message);
|
|
230
|
-
return;
|
|
231
|
-
}
|
|
232
|
-
touchActivity();
|
|
233
|
-
console.log(JSON.stringify({ source: 'user-event', ...event }));
|
|
234
|
-
if (event.choice) {
|
|
235
|
-
const eventsFile = path.join(STATE_DIR, 'events');
|
|
236
|
-
fs.appendFileSync(eventsFile, JSON.stringify(event) + '\n');
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
function broadcast(msg) {
|
|
241
|
-
const frame = encodeFrame(OPCODES.TEXT, Buffer.from(JSON.stringify(msg)));
|
|
242
|
-
for (const socket of clients) {
|
|
243
|
-
try { socket.write(frame); } catch (e) { clients.delete(socket); }
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
// ========== Activity Tracking ==========
|
|
248
|
-
|
|
249
|
-
const IDLE_TIMEOUT_MS = 30 * 60 * 1000; // 30 minutes
|
|
250
|
-
let lastActivity = Date.now();
|
|
251
|
-
|
|
252
|
-
function touchActivity() {
|
|
253
|
-
lastActivity = Date.now();
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
// ========== File Watching ==========
|
|
257
|
-
|
|
258
|
-
const debounceTimers = new Map();
|
|
259
|
-
|
|
260
|
-
// ========== Server Startup ==========
|
|
261
|
-
|
|
262
|
-
function startServer() {
|
|
263
|
-
if (!fs.existsSync(CONTENT_DIR)) fs.mkdirSync(CONTENT_DIR, { recursive: true });
|
|
264
|
-
if (!fs.existsSync(STATE_DIR)) fs.mkdirSync(STATE_DIR, { recursive: true });
|
|
265
|
-
|
|
266
|
-
// Track known files to distinguish new screens from updates.
|
|
267
|
-
// macOS fs.watch reports 'rename' for both new files and overwrites,
|
|
268
|
-
// so we can't rely on eventType alone.
|
|
269
|
-
const knownFiles = new Set(
|
|
270
|
-
fs.readdirSync(CONTENT_DIR).filter(f => f.endsWith('.html'))
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
const server = http.createServer(handleRequest);
|
|
274
|
-
server.on('upgrade', handleUpgrade);
|
|
275
|
-
|
|
276
|
-
const watcher = fs.watch(CONTENT_DIR, (eventType, filename) => {
|
|
277
|
-
if (!filename || !filename.endsWith('.html')) return;
|
|
278
|
-
|
|
279
|
-
if (debounceTimers.has(filename)) clearTimeout(debounceTimers.get(filename));
|
|
280
|
-
debounceTimers.set(filename, setTimeout(() => {
|
|
281
|
-
debounceTimers.delete(filename);
|
|
282
|
-
const filePath = path.join(CONTENT_DIR, filename);
|
|
283
|
-
|
|
284
|
-
if (!fs.existsSync(filePath)) return; // file was deleted
|
|
285
|
-
touchActivity();
|
|
286
|
-
|
|
287
|
-
if (!knownFiles.has(filename)) {
|
|
288
|
-
knownFiles.add(filename);
|
|
289
|
-
const eventsFile = path.join(STATE_DIR, 'events');
|
|
290
|
-
if (fs.existsSync(eventsFile)) fs.unlinkSync(eventsFile);
|
|
291
|
-
console.log(JSON.stringify({ type: 'screen-added', file: filePath }));
|
|
292
|
-
} else {
|
|
293
|
-
console.log(JSON.stringify({ type: 'screen-updated', file: filePath }));
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
broadcast({ type: 'reload' });
|
|
297
|
-
}, 100));
|
|
298
|
-
});
|
|
299
|
-
watcher.on('error', (err) => console.error('fs.watch error:', err.message));
|
|
300
|
-
|
|
301
|
-
function shutdown(reason) {
|
|
302
|
-
console.log(JSON.stringify({ type: 'server-stopped', reason }));
|
|
303
|
-
const infoFile = path.join(STATE_DIR, 'server-info');
|
|
304
|
-
if (fs.existsSync(infoFile)) fs.unlinkSync(infoFile);
|
|
305
|
-
fs.writeFileSync(
|
|
306
|
-
path.join(STATE_DIR, 'server-stopped'),
|
|
307
|
-
JSON.stringify({ reason, timestamp: Date.now() }) + '\n'
|
|
308
|
-
);
|
|
309
|
-
watcher.close();
|
|
310
|
-
clearInterval(lifecycleCheck);
|
|
311
|
-
server.close(() => process.exit(0));
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
function ownerAlive() {
|
|
315
|
-
if (!ownerPid) return true;
|
|
316
|
-
try { process.kill(ownerPid, 0); return true; } catch (e) { return e.code === 'EPERM'; }
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Check every 60s: exit if owner process died or idle for 30 minutes
|
|
320
|
-
const lifecycleCheck = setInterval(() => {
|
|
321
|
-
if (!ownerAlive()) shutdown('owner process exited');
|
|
322
|
-
else if (Date.now() - lastActivity > IDLE_TIMEOUT_MS) shutdown('idle timeout');
|
|
323
|
-
}, 60 * 1000);
|
|
324
|
-
lifecycleCheck.unref();
|
|
325
|
-
|
|
326
|
-
// Validate owner PID at startup. If it's already dead, the PID resolution
|
|
327
|
-
// was wrong (common on WSL, Tailscale SSH, and cross-user scenarios).
|
|
328
|
-
// Disable monitoring and rely on the idle timeout instead.
|
|
329
|
-
if (ownerPid) {
|
|
330
|
-
try { process.kill(ownerPid, 0); }
|
|
331
|
-
catch (e) {
|
|
332
|
-
if (e.code !== 'EPERM') {
|
|
333
|
-
console.log(JSON.stringify({ type: 'owner-pid-invalid', pid: ownerPid, reason: 'dead at startup' }));
|
|
334
|
-
ownerPid = null;
|
|
335
|
-
}
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
|
|
339
|
-
server.listen(PORT, HOST, () => {
|
|
340
|
-
const info = JSON.stringify({
|
|
341
|
-
type: 'server-started', port: Number(PORT), host: HOST,
|
|
342
|
-
url_host: URL_HOST, url: 'http://' + URL_HOST + ':' + PORT,
|
|
343
|
-
screen_dir: CONTENT_DIR, state_dir: STATE_DIR
|
|
344
|
-
});
|
|
345
|
-
console.log(info);
|
|
346
|
-
fs.writeFileSync(path.join(STATE_DIR, 'server-info'), info + '\n');
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
|
|
350
|
-
if (require.main === module) {
|
|
351
|
-
startServer();
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
module.exports = { computeAcceptKey, encodeFrame, decodeFrame, OPCODES };
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Start the brainstorm server and output connection info
|
|
3
|
-
# Usage: start-server.sh [--project-dir <path>] [--host <bind-host>] [--url-host <display-host>] [--foreground] [--background]
|
|
4
|
-
#
|
|
5
|
-
# Starts server on a random high port, outputs JSON with URL.
|
|
6
|
-
# Each session gets its own directory to avoid conflicts.
|
|
7
|
-
#
|
|
8
|
-
# Options:
|
|
9
|
-
# --project-dir <path> Store session files under <path>/.superpowers/brainstorm/
|
|
10
|
-
# instead of /tmp. Files persist after server stops.
|
|
11
|
-
# --host <bind-host> Host/interface to bind (default: 127.0.0.1).
|
|
12
|
-
# Use 0.0.0.0 in remote/containerized environments.
|
|
13
|
-
# --url-host <host> Hostname shown in returned URL JSON.
|
|
14
|
-
# --foreground Run server in the current terminal (no backgrounding).
|
|
15
|
-
# --background Force background mode (overrides Codex auto-foreground).
|
|
16
|
-
|
|
17
|
-
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
18
|
-
|
|
19
|
-
# Parse arguments
|
|
20
|
-
PROJECT_DIR=""
|
|
21
|
-
FOREGROUND="false"
|
|
22
|
-
FORCE_BACKGROUND="false"
|
|
23
|
-
BIND_HOST="127.0.0.1"
|
|
24
|
-
URL_HOST=""
|
|
25
|
-
while [[ $# -gt 0 ]]; do
|
|
26
|
-
case "$1" in
|
|
27
|
-
--project-dir)
|
|
28
|
-
PROJECT_DIR="$2"
|
|
29
|
-
shift 2
|
|
30
|
-
;;
|
|
31
|
-
--host)
|
|
32
|
-
BIND_HOST="$2"
|
|
33
|
-
shift 2
|
|
34
|
-
;;
|
|
35
|
-
--url-host)
|
|
36
|
-
URL_HOST="$2"
|
|
37
|
-
shift 2
|
|
38
|
-
;;
|
|
39
|
-
--foreground|--no-daemon)
|
|
40
|
-
FOREGROUND="true"
|
|
41
|
-
shift
|
|
42
|
-
;;
|
|
43
|
-
--background|--daemon)
|
|
44
|
-
FORCE_BACKGROUND="true"
|
|
45
|
-
shift
|
|
46
|
-
;;
|
|
47
|
-
*)
|
|
48
|
-
echo "{\"error\": \"Unknown argument: $1\"}"
|
|
49
|
-
exit 1
|
|
50
|
-
;;
|
|
51
|
-
esac
|
|
52
|
-
done
|
|
53
|
-
|
|
54
|
-
if [[ -z "$URL_HOST" ]]; then
|
|
55
|
-
if [[ "$BIND_HOST" == "127.0.0.1" || "$BIND_HOST" == "localhost" ]]; then
|
|
56
|
-
URL_HOST="localhost"
|
|
57
|
-
else
|
|
58
|
-
URL_HOST="$BIND_HOST"
|
|
59
|
-
fi
|
|
60
|
-
fi
|
|
61
|
-
|
|
62
|
-
# Some environments reap detached/background processes. Auto-foreground when detected.
|
|
63
|
-
if [[ -n "${CODEX_CI:-}" && "$FOREGROUND" != "true" && "$FORCE_BACKGROUND" != "true" ]]; then
|
|
64
|
-
FOREGROUND="true"
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
# Windows/Git Bash reaps nohup background processes. Auto-foreground when detected.
|
|
68
|
-
if [[ "$FOREGROUND" != "true" && "$FORCE_BACKGROUND" != "true" ]]; then
|
|
69
|
-
case "${OSTYPE:-}" in
|
|
70
|
-
msys*|cygwin*|mingw*) FOREGROUND="true" ;;
|
|
71
|
-
esac
|
|
72
|
-
if [[ -n "${MSYSTEM:-}" ]]; then
|
|
73
|
-
FOREGROUND="true"
|
|
74
|
-
fi
|
|
75
|
-
fi
|
|
76
|
-
|
|
77
|
-
# Generate unique session directory
|
|
78
|
-
SESSION_ID="$$-$(date +%s)"
|
|
79
|
-
|
|
80
|
-
if [[ -n "$PROJECT_DIR" ]]; then
|
|
81
|
-
SESSION_DIR="${PROJECT_DIR}/.superpowers/brainstorm/${SESSION_ID}"
|
|
82
|
-
else
|
|
83
|
-
SESSION_DIR="/tmp/brainstorm-${SESSION_ID}"
|
|
84
|
-
fi
|
|
85
|
-
|
|
86
|
-
STATE_DIR="${SESSION_DIR}/state"
|
|
87
|
-
PID_FILE="${STATE_DIR}/server.pid"
|
|
88
|
-
LOG_FILE="${STATE_DIR}/server.log"
|
|
89
|
-
|
|
90
|
-
# Create fresh session directory with content and state peers
|
|
91
|
-
mkdir -p "${SESSION_DIR}/content" "$STATE_DIR"
|
|
92
|
-
|
|
93
|
-
# Kill any existing server
|
|
94
|
-
if [[ -f "$PID_FILE" ]]; then
|
|
95
|
-
old_pid=$(cat "$PID_FILE")
|
|
96
|
-
kill "$old_pid" 2>/dev/null
|
|
97
|
-
rm -f "$PID_FILE"
|
|
98
|
-
fi
|
|
99
|
-
|
|
100
|
-
cd "$SCRIPT_DIR"
|
|
101
|
-
|
|
102
|
-
# Resolve the harness PID (grandparent of this script).
|
|
103
|
-
# $PPID is the ephemeral shell the harness spawned to run us — it dies
|
|
104
|
-
# when this script exits. The harness itself is $PPID's parent.
|
|
105
|
-
OWNER_PID="$(ps -o ppid= -p "$PPID" 2>/dev/null | tr -d ' ')"
|
|
106
|
-
if [[ -z "$OWNER_PID" || "$OWNER_PID" == "1" ]]; then
|
|
107
|
-
OWNER_PID="$PPID"
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
# Foreground mode for environments that reap detached/background processes.
|
|
111
|
-
if [[ "$FOREGROUND" == "true" ]]; then
|
|
112
|
-
echo "$$" > "$PID_FILE"
|
|
113
|
-
env BRAINSTORM_DIR="$SESSION_DIR" BRAINSTORM_HOST="$BIND_HOST" BRAINSTORM_URL_HOST="$URL_HOST" BRAINSTORM_OWNER_PID="$OWNER_PID" node server.cjs
|
|
114
|
-
exit $?
|
|
115
|
-
fi
|
|
116
|
-
|
|
117
|
-
# Start server, capturing output to log file
|
|
118
|
-
# Use nohup to survive shell exit; disown to remove from job table
|
|
119
|
-
nohup env BRAINSTORM_DIR="$SESSION_DIR" BRAINSTORM_HOST="$BIND_HOST" BRAINSTORM_URL_HOST="$URL_HOST" BRAINSTORM_OWNER_PID="$OWNER_PID" node server.cjs > "$LOG_FILE" 2>&1 &
|
|
120
|
-
SERVER_PID=$!
|
|
121
|
-
disown "$SERVER_PID" 2>/dev/null
|
|
122
|
-
echo "$SERVER_PID" > "$PID_FILE"
|
|
123
|
-
|
|
124
|
-
# Wait for server-started message (check log file)
|
|
125
|
-
for i in {1..50}; do
|
|
126
|
-
if grep -q "server-started" "$LOG_FILE" 2>/dev/null; then
|
|
127
|
-
# Verify server is still alive after a short window (catches process reapers)
|
|
128
|
-
alive="true"
|
|
129
|
-
for _ in {1..20}; do
|
|
130
|
-
if ! kill -0 "$SERVER_PID" 2>/dev/null; then
|
|
131
|
-
alive="false"
|
|
132
|
-
break
|
|
133
|
-
fi
|
|
134
|
-
sleep 0.1
|
|
135
|
-
done
|
|
136
|
-
if [[ "$alive" != "true" ]]; then
|
|
137
|
-
echo "{\"error\": \"Server started but was killed. Retry in a persistent terminal with: $SCRIPT_DIR/start-server.sh${PROJECT_DIR:+ --project-dir $PROJECT_DIR} --host $BIND_HOST --url-host $URL_HOST --foreground\"}"
|
|
138
|
-
exit 1
|
|
139
|
-
fi
|
|
140
|
-
grep "server-started" "$LOG_FILE" | head -1
|
|
141
|
-
exit 0
|
|
142
|
-
fi
|
|
143
|
-
sleep 0.1
|
|
144
|
-
done
|
|
145
|
-
|
|
146
|
-
# Timeout - server didn't start
|
|
147
|
-
echo '{"error": "Server failed to start within 5 seconds"}'
|
|
148
|
-
exit 1
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
# Stop the brainstorm server and clean up
|
|
3
|
-
# Usage: stop-server.sh <session_dir>
|
|
4
|
-
#
|
|
5
|
-
# Kills the server process. Only deletes session directory if it's
|
|
6
|
-
# under /tmp (ephemeral). Persistent directories (.superpowers/) are
|
|
7
|
-
# kept so mockups can be reviewed later.
|
|
8
|
-
|
|
9
|
-
SESSION_DIR="$1"
|
|
10
|
-
|
|
11
|
-
if [[ -z "$SESSION_DIR" ]]; then
|
|
12
|
-
echo '{"error": "Usage: stop-server.sh <session_dir>"}'
|
|
13
|
-
exit 1
|
|
14
|
-
fi
|
|
15
|
-
|
|
16
|
-
STATE_DIR="${SESSION_DIR}/state"
|
|
17
|
-
PID_FILE="${STATE_DIR}/server.pid"
|
|
18
|
-
|
|
19
|
-
if [[ -f "$PID_FILE" ]]; then
|
|
20
|
-
pid=$(cat "$PID_FILE")
|
|
21
|
-
|
|
22
|
-
# Try to stop gracefully, fallback to force if still alive
|
|
23
|
-
kill "$pid" 2>/dev/null || true
|
|
24
|
-
|
|
25
|
-
# Wait for graceful shutdown (up to ~2s)
|
|
26
|
-
for i in {1..20}; do
|
|
27
|
-
if ! kill -0 "$pid" 2>/dev/null; then
|
|
28
|
-
break
|
|
29
|
-
fi
|
|
30
|
-
sleep 0.1
|
|
31
|
-
done
|
|
32
|
-
|
|
33
|
-
# If still running, escalate to SIGKILL
|
|
34
|
-
if kill -0 "$pid" 2>/dev/null; then
|
|
35
|
-
kill -9 "$pid" 2>/dev/null || true
|
|
36
|
-
|
|
37
|
-
# Give SIGKILL a moment to take effect
|
|
38
|
-
sleep 0.1
|
|
39
|
-
fi
|
|
40
|
-
|
|
41
|
-
if kill -0 "$pid" 2>/dev/null; then
|
|
42
|
-
echo '{"status": "failed", "error": "process still running"}'
|
|
43
|
-
exit 1
|
|
44
|
-
fi
|
|
45
|
-
|
|
46
|
-
rm -f "$PID_FILE" "${STATE_DIR}/server.log"
|
|
47
|
-
|
|
48
|
-
# Only delete ephemeral /tmp directories
|
|
49
|
-
if [[ "$SESSION_DIR" == /tmp/* ]]; then
|
|
50
|
-
rm -rf "$SESSION_DIR"
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
echo '{"status": "stopped"}'
|
|
54
|
-
else
|
|
55
|
-
echo '{"status": "not_running"}'
|
|
56
|
-
fi
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
# Spec Document Reviewer Prompt Template
|
|
2
|
-
|
|
3
|
-
Use this template when dispatching a spec document reviewer subagent.
|
|
4
|
-
|
|
5
|
-
**Purpose:** Verify the spec is complete, consistent, and ready for implementation planning.
|
|
6
|
-
|
|
7
|
-
**Dispatch after:** Spec document is written to docs/superpowers/specs/
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
Task tool (general-purpose):
|
|
11
|
-
description: "Review spec document"
|
|
12
|
-
prompt: |
|
|
13
|
-
You are a spec document reviewer. Verify this spec is complete and ready for planning.
|
|
14
|
-
|
|
15
|
-
**Spec to review:** [SPEC_FILE_PATH]
|
|
16
|
-
|
|
17
|
-
## What to Check
|
|
18
|
-
|
|
19
|
-
| Category | What to Look For |
|
|
20
|
-
|----------|------------------|
|
|
21
|
-
| Completeness | TODOs, placeholders, "TBD", incomplete sections |
|
|
22
|
-
| Consistency | Internal contradictions, conflicting requirements |
|
|
23
|
-
| Clarity | Requirements ambiguous enough to cause someone to build the wrong thing |
|
|
24
|
-
| Scope | Focused enough for a single plan — not covering multiple independent subsystems |
|
|
25
|
-
| YAGNI | Unrequested features, over-engineering |
|
|
26
|
-
|
|
27
|
-
## Calibration
|
|
28
|
-
|
|
29
|
-
**Only flag issues that would cause real problems during implementation planning.**
|
|
30
|
-
A missing section, a contradiction, or a requirement so ambiguous it could be
|
|
31
|
-
interpreted two different ways — those are issues. Minor wording improvements,
|
|
32
|
-
stylistic preferences, and "sections less detailed than others" are not.
|
|
33
|
-
|
|
34
|
-
Approve unless there are serious gaps that would lead to a flawed plan.
|
|
35
|
-
|
|
36
|
-
## Output Format
|
|
37
|
-
|
|
38
|
-
## Spec Review
|
|
39
|
-
|
|
40
|
-
**Status:** Approved | Issues Found
|
|
41
|
-
|
|
42
|
-
**Issues (if any):**
|
|
43
|
-
- [Section X]: [specific issue] - [why it matters for planning]
|
|
44
|
-
|
|
45
|
-
**Recommendations (advisory, do not block approval):**
|
|
46
|
-
- [suggestions for improvement]
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
**Reviewer returns:** Status, Issues (if any), Recommendations
|