oh-my-opencode 4.13.0 → 4.14.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.
- package/.agents/skills/codex-qa/SKILL.md +15 -0
- package/.agents/skills/codex-qa/references/logging-debug.md +12 -0
- package/.agents/skills/opencode-qa/SKILL.md +17 -0
- package/.agents/skills/opencode-qa/references/tui-tmux.md +17 -0
- package/.agents/skills/work-with-pr/SKILL.md +18 -10
- package/.opencode/skills/work-with-pr/SKILL.md +18 -10
- package/README.md +2 -2
- package/dist/cli/doctor/checks/telemetry.d.ts +2 -0
- package/dist/cli/doctor/framework/constants.d.ts +1 -0
- package/dist/cli/doctor/framework/doctor-target.d.ts +1 -1
- package/dist/cli/index.js +24651 -16452
- package/dist/cli-node/index.js +24651 -16452
- package/dist/config/schema/oh-my-opencode-config.d.ts +1 -0
- package/dist/features/team-mode/test-support/async-test-helpers.d.ts +19 -0
- package/dist/hooks/atlas/final-wave-approval-gate.d.ts +1 -0
- package/dist/hooks/atlas/subagent-completion-reminder.d.ts +30 -0
- package/dist/hooks/atlas/types.d.ts +2 -0
- package/dist/hooks/atlas/verification-reminders.d.ts +3 -0
- package/dist/hooks/team-session-events/team-idle-wake-hint.d.ts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +33232 -19559
- package/dist/mcp/context7.d.ts +9 -8
- package/dist/oh-my-opencode.schema.json +4 -0
- package/dist/shared/posthog.d.ts +17 -10
- package/dist/shared/telemetry-product-identity.d.ts +2 -0
- package/dist/skills/coding-agent-sessions/SKILL.md +128 -0
- package/dist/skills/coding-agent-sessions/agents/openai.yaml +4 -0
- package/dist/skills/coding-agent-sessions/references/all-platforms.md +71 -0
- package/dist/skills/coding-agent-sessions/references/claude.md +32 -0
- package/dist/skills/coding-agent-sessions/references/codex.md +30 -0
- package/dist/skills/coding-agent-sessions/references/opencode.md +43 -0
- package/dist/skills/coding-agent-sessions/references/senpi.md +17 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
- package/dist/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
- package/dist/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
- package/dist/skills/frontend/ATTRIBUTION.md +52 -8
- package/dist/skills/frontend/SKILL.md +29 -8
- package/dist/skills/frontend/references/design/README.md +29 -12
- package/dist/skills/frontend/references/design/_INDEX.md +3 -3
- package/dist/skills/frontend/references/design/design-system-architecture.md +22 -19
- package/dist/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
- package/dist/skills/frontend/references/designpowers/README.md +48 -0
- package/dist/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
- package/dist/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
- package/dist/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
- package/dist/skills/frontend/references/designpowers/lane-c-review.md +65 -0
- package/dist/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
- package/dist/skills/frontend/references/designpowers/orchestration.md +80 -0
- package/dist/skills/frontend/references/designpowers/routing.md +79 -0
- package/dist/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/dist/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
- package/dist/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
- package/dist/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
- package/dist/skills/git-master/SKILL.md +4 -0
- package/dist/skills/review-work/SKILL.md +3 -3
- package/dist/skills/start-work/SKILL.md +7 -5
- package/dist/skills/ultraresearch/SKILL.md +4 -252
- package/dist/skills/ulw-plan/SKILL.md +8 -6
- package/dist/skills/ulw-plan/references/full-workflow.md +11 -6
- package/dist/skills/ulw-plan/references/intent-clear.md +3 -3
- package/dist/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/dist/skills/{ultraresearch → ulw-research}/ATTRIBUTION.md +1 -1
- package/dist/skills/ulw-research/SKILL.md +260 -0
- package/dist/skills/visual-qa/SKILL.md +105 -14
- package/dist/skills/visual-qa/scripts/skill-prompt-contract.test.ts +120 -1
- package/dist/testing/create-plugin-module.d.ts +2 -0
- package/dist/tui.js +23917 -16117
- package/docs/reference/github-attachment-upload.md +51 -0
- package/docs/reference/web-terminal-visual-qa.md +81 -0
- package/package.json +20 -14
- package/packages/lsp-core/src/lsp/process.ts +4 -1
- package/packages/lsp-core/src/mcp.ts +1 -0
- package/packages/lsp-daemon/dist/cli.js +5 -1
- package/packages/lsp-daemon/dist/index.js +5 -1
- package/packages/lsp-daemon/dist/proxy.js +1 -0
- package/packages/lsp-tools-mcp/dist/cli.js +5 -1
- package/packages/lsp-tools-mcp/dist/lsp/manager.js +4 -1
- package/packages/lsp-tools-mcp/dist/mcp.js +5 -1
- package/packages/lsp-tools-mcp/dist/tools.js +4 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +323 -62
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/scripts/bootstrap.ps1 +37 -68
- package/packages/omo-codex/plugin/components/bootstrap/scripts/node-dispatch.ps1 +75 -0
- package/packages/omo-codex/plugin/components/bootstrap/src/cli.ts +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/src/setup.ts +2 -18
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +575 -334
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +204 -39
- package/packages/omo-codex/plugin/components/codegraph/package.json +2 -2
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +7 -1
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +103 -3
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +114 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +29 -0
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +31 -57
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +7 -4
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +43 -9
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +146 -0
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +12 -7
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +71 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/cli.js +4 -1
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/src/sparkshell-awareness.ts +2 -2
- package/packages/omo-codex/plugin/components/rules/test/sparkshell-awareness.test.ts +11 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/directive.md +6 -6
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +23 -0
- package/packages/omo-codex/plugin/components/teammode/dist/cli.js +22 -4
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +40 -2
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team-guide.mjs +32 -5
- package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +7 -3
- package/packages/omo-codex/plugin/components/teammode/src/codex-hook.ts +19 -4
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +32 -2
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/README.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/explorer.toml +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/directive.md +23 -7
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +6 -4
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +11 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-clear.md +3 -3
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/codex-hook.ts +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook-trigger-policy.test.ts +24 -0
- package/packages/omo-codex/plugin/components/ultrawork/test/package-smoke.test.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +25 -21
- package/packages/omo-codex/plugin/components/ulw-loop/biome.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +381 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli-steering.js +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +145 -14
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.d.ts +6 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-hook.js +16 -6
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/ultrawork-directive.js +104 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +19 -11
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli-steering.ts +14 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/cli.ts +4 -2
- package/packages/omo-codex/plugin/components/ulw-loop/src/codex-hook.ts +28 -6
- package/packages/omo-codex/plugin/components/ulw-loop/src/ultrawork-directive.ts +113 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-entrypoint.test.ts +33 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/cli-steering-kind-guidance.test.ts +31 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/codex-hook.test.ts +13 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/package-smoke.test.ts +36 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/skill-contract.test.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/ultrawork-directive.test.ts +64 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +2 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +2 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +2 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +2 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +2 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +2 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +2 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +2 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +2 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +2 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +2 -1
- package/packages/omo-codex/plugin/package-lock.json +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +9 -5
- package/packages/omo-codex/plugin/scripts/materialize-shared-upstreams.mjs +1 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/context7-placeholder-guard.mjs +131 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-mode-guard.mjs +60 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +3 -10
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/root-settings.mjs +31 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +73 -0
- package/packages/omo-codex/plugin/scripts/migrate-codex-config.mjs +20 -3
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +30 -8
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +128 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/agents/openai.yaml +4 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/all-platforms.md +71 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/claude.md +32 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/codex.md +30 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/opencode.md +43 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/references/senpi.md +17 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
- package/packages/omo-codex/plugin/skills/frontend/ATTRIBUTION.md +52 -8
- package/packages/omo-codex/plugin/skills/frontend/SKILL.md +29 -8
- package/packages/omo-codex/plugin/skills/frontend/references/design/README.md +29 -12
- package/packages/omo-codex/plugin/skills/frontend/references/design/_INDEX.md +3 -3
- package/packages/omo-codex/plugin/skills/frontend/references/design/design-system-architecture.md +22 -19
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/README.md +48 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-c-review.md +65 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/orchestration.md +80 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/routing.md +79 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
- package/packages/omo-codex/plugin/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
- package/packages/omo-codex/plugin/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
- package/packages/omo-codex/plugin/skills/git-master/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/refactor/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -0
- package/packages/omo-codex/plugin/skills/review-work/SKILL.md +12 -4
- package/packages/omo-codex/plugin/skills/start-work/SKILL.md +14 -8
- package/packages/omo-codex/plugin/skills/teammode/SKILL.md +40 -2
- package/packages/omo-codex/plugin/skills/teammode/scripts/team-guide.mjs +32 -5
- package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +7 -3
- package/packages/omo-codex/plugin/skills/ultraresearch/SKILL.md +4 -250
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +19 -11
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +6 -4
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +11 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-clear.md +3 -3
- package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/packages/{shared-skills/skills/ultraresearch → omo-codex/plugin/skills/ulw-research}/ATTRIBUTION.md +1 -1
- package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +262 -0
- package/packages/omo-codex/plugin/skills/ulw-research/agents/openai.yaml +2 -0
- package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +109 -14
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +23 -0
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/auto-update-release-notes.test.mjs +1 -0
- package/packages/omo-codex/plugin/test/auto-update-restart-notice.test.mjs +24 -1
- package/packages/omo-codex/plugin/test/bootstrap-binlinks.test.mjs +23 -5
- package/packages/omo-codex/plugin/test/bootstrap-hooks.test.mjs +38 -0
- package/packages/omo-codex/plugin/test/bootstrap-ps-guard.test.mjs +25 -0
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +1 -7
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +206 -6
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +44 -0
- package/packages/omo-codex/plugin/test/sync-skills-orchestration.test.mjs +50 -1
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +10 -7
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +28 -2
- package/packages/omo-codex/plugin/test/teammode-communication.test.mjs +20 -0
- package/packages/omo-codex/plugin/test/teammode-thread-links.test.mjs +117 -0
- package/packages/omo-codex/plugin/test/teammode-worktree.test.mjs +5 -2
- package/packages/omo-codex/plugin/test/ulw-research-skill-contract.test.mjs +285 -0
- package/packages/omo-codex/scripts/install-bin-links.test.mjs +6 -1
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +51 -0
- package/packages/omo-codex/scripts/install-config.test.mjs +198 -17
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +701 -282
- package/packages/omo-codex/scripts/install-local-git-bash-preflight.test.mjs +24 -15
- package/packages/omo-codex/scripts/install-local.test.mjs +5 -1
- package/packages/omo-codex/scripts/install-mcp-context7-runtime.test.mjs +84 -0
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +128 -0
- package/packages/shared-skills/skills/coding-agent-sessions/agents/openai.yaml +4 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/all-platforms.md +71 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/claude.md +32 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/codex.md +30 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/opencode.md +43 -0
- package/packages/shared-skills/skills/coding-agent-sessions/references/senpi.md +17 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/__init__.py +1 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/claude.py +66 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +283 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/codex.py +105 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +275 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/jsonio.py +55 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/kiro_scanner.py +91 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/opencode.py +289 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +92 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_optional_scanners.py +203 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/sqlite_scanners.py +177 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/timeparse.py +51 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +149 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +57 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +19 -0
- package/packages/shared-skills/skills/frontend/ATTRIBUTION.md +52 -8
- package/packages/shared-skills/skills/frontend/SKILL.md +29 -8
- package/packages/shared-skills/skills/frontend/references/design/README.md +29 -12
- package/packages/shared-skills/skills/frontend/references/design/_INDEX.md +3 -3
- package/packages/shared-skills/skills/frontend/references/design/design-system-architecture.md +22 -19
- package/packages/shared-skills/skills/frontend/references/designpowers/EVIDENCE.md +89 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/README.md +48 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/UPSTREAM.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-a-direction.md +64 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-b-execution.md +65 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-c-review.md +65 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/lane-d-memory.md +83 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/orchestration.md +80 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/routing.md +79 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/LICENSE +21 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/accessibility-reviewer.md +83 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/content-writer.md +132 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-builder.md +109 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-critic.md +89 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-lead.md +113 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-scout.md +78 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/design-strategist.md +121 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/heuristic-evaluator.md +268 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/inspiration-scout.md +107 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/agents/motion-designer.md +120 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/accessible-content/SKILL.md +101 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/adaptive-interfaces/SKILL.md +109 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/cognitive-accessibility/SKILL.md +107 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debate/SKILL.md +199 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-debt-tracker/SKILL.md +174 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-handoff/SKILL.md +125 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-md/SKILL.md +106 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-retrospective/SKILL.md +266 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-review/SKILL.md +123 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/design-system-alignment/SKILL.md +120 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/designpowers-critique/SKILL.md +164 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/heuristic-evaluation/SKILL.md +85 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inclusive-personas/SKILL.md +98 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/inspiration-scouting/SKILL.md +165 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/interaction-design/SKILL.md +122 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/motion-choreography/SKILL.md +81 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/research-planning/SKILL.md +96 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/responsive-patterns/SKILL.md +77 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/synthetic-user-testing/SKILL.md +192 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-feedback/SKILL.md +165 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/taste-report/SKILL.md +78 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/token-architecture/SKILL.md +75 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/ui-composition/SKILL.md +117 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/usability-testing/SKILL.md +78 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/verification-before-shipping/SKILL.md +125 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/voice-and-tone/SKILL.md +79 -0
- package/packages/shared-skills/skills/frontend/references/designpowers/vendor/skills/writing-design-plans/SKILL.md +119 -0
- package/packages/shared-skills/skills/frontend/references/ui-ux-db/scripts/core.py +0 -0
- package/packages/shared-skills/skills/git-master/SKILL.md +4 -0
- package/packages/shared-skills/skills/review-work/SKILL.md +3 -3
- package/packages/shared-skills/skills/start-work/SKILL.md +7 -5
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +4 -252
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +8 -6
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +11 -6
- package/packages/shared-skills/skills/ulw-plan/references/intent-clear.md +3 -3
- package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +1 -1
- package/packages/{omo-codex/plugin/skills/ultraresearch → shared-skills/skills/ulw-research}/ATTRIBUTION.md +1 -1
- package/packages/shared-skills/skills/ulw-research/SKILL.md +260 -0
- package/packages/shared-skills/skills/visual-qa/SKILL.md +105 -14
- package/packages/shared-skills/skills/visual-qa/scripts/skill-prompt-contract.test.ts +120 -1
- package/script/qa/web-terminal-redaction.d.mts +13 -0
- package/script/qa/web-terminal-redaction.mjs +43 -0
- package/script/qa/web-terminal-renderer.mjs +218 -0
- package/script/qa/web-terminal-visual-qa.mjs +264 -0
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_cookie_domain_filter.py +0 -110
- package/packages/omo-codex/plugin/skills/ultimate-browsing/scripts/tests/test_extract_cookies.py +0 -245
- package/packages/omo-codex/plugin/test/ultraresearch-skill-contract.test.mjs +0 -204
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/serve.ts
|
|
4
|
-
import { spawn } from "node:child_process";
|
|
5
4
|
import { existsSync as existsSync5, realpathSync } from "node:fs";
|
|
6
5
|
import { homedir as homedir6 } from "node:os";
|
|
7
|
-
import { basename as basename3,
|
|
6
|
+
import { basename as basename3, join as join6, resolve as resolve2 } from "node:path";
|
|
8
7
|
import {
|
|
9
8
|
cwd as processCwd,
|
|
10
9
|
env as processEnv,
|
|
11
|
-
execPath as processExecPath,
|
|
12
10
|
stdin as processStdin,
|
|
13
11
|
stderr as processStderr,
|
|
14
12
|
stdout as processStdout
|
|
@@ -22,6 +20,41 @@ var CODEGRAPH_INSTALL_DIR_ENV = "CODEGRAPH_INSTALL_DIR";
|
|
|
22
20
|
var CODEGRAPH_NO_DOWNLOAD_ENV = "CODEGRAPH_NO_DOWNLOAD";
|
|
23
21
|
var CODEGRAPH_TELEMETRY_ENV = "CODEGRAPH_TELEMETRY";
|
|
24
22
|
var DO_NOT_TRACK_ENV = "DO_NOT_TRACK";
|
|
23
|
+
var SAFE_AMBIENT_ENV_KEYS = new Set([
|
|
24
|
+
"APPDATA",
|
|
25
|
+
"CI",
|
|
26
|
+
"CODEX_HOME",
|
|
27
|
+
"ComSpec",
|
|
28
|
+
"HOME",
|
|
29
|
+
"HOMEDRIVE",
|
|
30
|
+
"HOMEPATH",
|
|
31
|
+
"LANG",
|
|
32
|
+
"LC_ALL",
|
|
33
|
+
"LC_CTYPE",
|
|
34
|
+
"LOCALAPPDATA",
|
|
35
|
+
"PATH",
|
|
36
|
+
"PATHEXT",
|
|
37
|
+
"Path",
|
|
38
|
+
"SystemRoot",
|
|
39
|
+
"TEMP",
|
|
40
|
+
"TMP",
|
|
41
|
+
"TMPDIR",
|
|
42
|
+
"USERPROFILE",
|
|
43
|
+
"WINDIR",
|
|
44
|
+
"XDG_CACHE_HOME",
|
|
45
|
+
"XDG_CONFIG_HOME",
|
|
46
|
+
"XDG_DATA_HOME",
|
|
47
|
+
"XDG_STATE_HOME"
|
|
48
|
+
]);
|
|
49
|
+
var SAFE_CODEGRAPH_RUNTIME_ENV_KEYS = new Set([
|
|
50
|
+
"CODEGRAPH_ALLOW_UNSAFE_NODE",
|
|
51
|
+
"CODEGRAPH_BIN",
|
|
52
|
+
"CODEGRAPH_FAKE_LOG",
|
|
53
|
+
"CODEGRAPH_NODE_BIN",
|
|
54
|
+
"OMO_CODEGRAPH_BIN",
|
|
55
|
+
"OMO_CODEGRAPH_PROJECT_CWD",
|
|
56
|
+
"OMO_CODEGRAPH_SESSION_START_CWD"
|
|
57
|
+
]);
|
|
25
58
|
function buildCodegraphEnv(options = {}) {
|
|
26
59
|
const homeDir = options.homeDir ?? homedir();
|
|
27
60
|
return {
|
|
@@ -31,6 +64,26 @@ function buildCodegraphEnv(options = {}) {
|
|
|
31
64
|
[DO_NOT_TRACK_ENV]: "1"
|
|
32
65
|
};
|
|
33
66
|
}
|
|
67
|
+
function copyDefinedEnvKeys(output, input, allowedKeys) {
|
|
68
|
+
for (const key of allowedKeys) {
|
|
69
|
+
const value = input[key];
|
|
70
|
+
if (value !== undefined)
|
|
71
|
+
output[key] = value;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function copyDefinedEnv(output, input) {
|
|
75
|
+
for (const [key, value] of Object.entries(input)) {
|
|
76
|
+
if (value !== undefined)
|
|
77
|
+
output[key] = value;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function buildCodegraphChildEnv(options = {}) {
|
|
81
|
+
const env = {};
|
|
82
|
+
copyDefinedEnvKeys(env, options.ambientEnv ?? {}, SAFE_AMBIENT_ENV_KEYS);
|
|
83
|
+
copyDefinedEnvKeys(env, options.runtimeEnv ?? {}, SAFE_CODEGRAPH_RUNTIME_ENV_KEYS);
|
|
84
|
+
copyDefinedEnv(env, options.codegraphEnv ?? {});
|
|
85
|
+
return env;
|
|
86
|
+
}
|
|
34
87
|
|
|
35
88
|
// ../../../../utils/src/codegraph/node-support.ts
|
|
36
89
|
var CODEGRAPH_MIN_NODE_MAJOR = 20;
|
|
@@ -360,6 +413,14 @@ var CODEGRAPH_PACKAGE = "@colbymchenry/codegraph";
|
|
|
360
413
|
var CODEGRAPH_ENV_BIN = "OMO_CODEGRAPH_BIN";
|
|
361
414
|
var CODEGRAPH_LEGACY_ENV_BIN = "CODEGRAPH_BIN";
|
|
362
415
|
var CODEGRAPH_NODE_CANDIDATES = ["node24", "node22", "node20", "node"];
|
|
416
|
+
var CODEGRAPH_NODE_PATH_CANDIDATES = [
|
|
417
|
+
"/opt/homebrew/opt/node@24/bin/node",
|
|
418
|
+
"/opt/homebrew/opt/node@22/bin/node",
|
|
419
|
+
"/opt/homebrew/opt/node@20/bin/node",
|
|
420
|
+
"/usr/local/opt/node@24/bin/node",
|
|
421
|
+
"/usr/local/opt/node@22/bin/node",
|
|
422
|
+
"/usr/local/opt/node@20/bin/node"
|
|
423
|
+
];
|
|
363
424
|
var requireFromHere = createRequire(import.meta.url);
|
|
364
425
|
function defaultRequireResolve(specifier) {
|
|
365
426
|
return requireFromHere.resolve(specifier);
|
|
@@ -410,7 +471,8 @@ function defaultNodeRuntime(env, fileExists, which, nodeVersion) {
|
|
|
410
471
|
}
|
|
411
472
|
const candidates = [
|
|
412
473
|
...isNodeExecutableName(process.execPath) ? [process.execPath] : [],
|
|
413
|
-
...CODEGRAPH_NODE_CANDIDATES.map((commandName) => which(commandName)).filter((candidate) => candidate !== null)
|
|
474
|
+
...CODEGRAPH_NODE_CANDIDATES.map((commandName) => which(commandName)).filter((candidate) => candidate !== null),
|
|
475
|
+
...CODEGRAPH_NODE_PATH_CANDIDATES.filter((candidate) => fileExists(candidate))
|
|
414
476
|
];
|
|
415
477
|
const seen = new Set;
|
|
416
478
|
for (const candidate of candidates) {
|
|
@@ -1730,6 +1792,9 @@ function resolveHomeDir(options) {
|
|
|
1730
1792
|
return options.homeDir ?? env["HOME"] ?? env["USERPROFILE"] ?? homedir5();
|
|
1731
1793
|
}
|
|
1732
1794
|
|
|
1795
|
+
// src/mcp-bridge.ts
|
|
1796
|
+
import { spawn } from "node:child_process";
|
|
1797
|
+
|
|
1733
1798
|
// ../../../../mcp-stdio-core/src/record.ts
|
|
1734
1799
|
function isPlainRecord(value) {
|
|
1735
1800
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -1930,6 +1995,114 @@ function createIdleTimer(idleTimeoutMs, log, onIdleTimeout) {
|
|
|
1930
1995
|
closed: () => isClosed
|
|
1931
1996
|
};
|
|
1932
1997
|
}
|
|
1998
|
+
// src/serve-invocation.ts
|
|
1999
|
+
import { extname } from "node:path";
|
|
2000
|
+
import { execPath as processExecPath } from "node:process";
|
|
2001
|
+
var WINDOWS_CMD_EXTENSIONS = new Set([".bat", ".cmd"]);
|
|
2002
|
+
var WINDOWS_NODE_SCRIPT_EXTENSIONS = new Set([".cjs", ".js", ".mjs"]);
|
|
2003
|
+
function resolveServeProcessInvocation(command, args, platform = process.platform) {
|
|
2004
|
+
if (platform !== "win32")
|
|
2005
|
+
return { args: [...args], command };
|
|
2006
|
+
const extension = extname(command).toLowerCase();
|
|
2007
|
+
if (WINDOWS_NODE_SCRIPT_EXTENSIONS.has(extension)) {
|
|
2008
|
+
return { args: [command, ...args], command: processExecPath };
|
|
2009
|
+
}
|
|
2010
|
+
if (WINDOWS_CMD_EXTENSIONS.has(extension)) {
|
|
2011
|
+
return { args: ["/d", "/s", "/c", command, ...args], command: "cmd.exe" };
|
|
2012
|
+
}
|
|
2013
|
+
return { args: [...args], command };
|
|
2014
|
+
}
|
|
2015
|
+
|
|
2016
|
+
// src/mcp-bridge.ts
|
|
2017
|
+
class CodegraphBridgeStdioError extends Error {
|
|
2018
|
+
streamName;
|
|
2019
|
+
name = "CodegraphBridgeStdioError";
|
|
2020
|
+
constructor(streamName) {
|
|
2021
|
+
super(`CodeGraph MCP bridge missing child ${streamName}`);
|
|
2022
|
+
this.streamName = streamName;
|
|
2023
|
+
}
|
|
2024
|
+
}
|
|
2025
|
+
async function runBridgedCodegraphProcess(command, args, options) {
|
|
2026
|
+
const invocation = resolveServeProcessInvocation(command, args);
|
|
2027
|
+
const child = spawn(invocation.command, invocation.args, {
|
|
2028
|
+
cwd: options.cwd,
|
|
2029
|
+
env: options.env,
|
|
2030
|
+
stdio: ["pipe", "pipe", "inherit"]
|
|
2031
|
+
});
|
|
2032
|
+
const childInput = child.stdin;
|
|
2033
|
+
const childOutput = child.stdout;
|
|
2034
|
+
if (childInput === null)
|
|
2035
|
+
throw new CodegraphBridgeStdioError("stdin");
|
|
2036
|
+
if (childOutput === null)
|
|
2037
|
+
throw new CodegraphBridgeStdioError("stdout");
|
|
2038
|
+
const responseModes = new Map;
|
|
2039
|
+
let defaultResponseMode = "framed";
|
|
2040
|
+
const childExit = new Promise((resolveExit, reject) => {
|
|
2041
|
+
child.once("error", reject);
|
|
2042
|
+
child.once("exit", (code, signal) => {
|
|
2043
|
+
if (code !== null) {
|
|
2044
|
+
resolveExit(code);
|
|
2045
|
+
return;
|
|
2046
|
+
}
|
|
2047
|
+
resolveExit(signal === null ? 0 : 1);
|
|
2048
|
+
});
|
|
2049
|
+
});
|
|
2050
|
+
const bridgeDone = Promise.all([
|
|
2051
|
+
forwardClientToCodegraph(options.input, childInput, responseModes, (mode) => {
|
|
2052
|
+
defaultResponseMode = mode;
|
|
2053
|
+
}),
|
|
2054
|
+
forwardCodegraphToClient(childOutput, options.output, responseModes, () => defaultResponseMode)
|
|
2055
|
+
]);
|
|
2056
|
+
const destroyChildPipes = () => {
|
|
2057
|
+
childInput.destroy();
|
|
2058
|
+
childOutput.destroy();
|
|
2059
|
+
};
|
|
2060
|
+
childExit.then(destroyChildPipes, destroyChildPipes);
|
|
2061
|
+
return Promise.race([childExit, bridgeDone.then(() => childExit)]);
|
|
2062
|
+
}
|
|
2063
|
+
async function forwardClientToCodegraph(input, childInput, responseModes, setDefaultResponseMode) {
|
|
2064
|
+
for await (const message of readStdioJsonRpcMessages(input)) {
|
|
2065
|
+
if (message.kind === "parse_error") {
|
|
2066
|
+
continue;
|
|
2067
|
+
}
|
|
2068
|
+
const responseMode = message.responseMode;
|
|
2069
|
+
setDefaultResponseMode(responseMode);
|
|
2070
|
+
const key = responseModeKey(message.payload);
|
|
2071
|
+
if (key !== null)
|
|
2072
|
+
responseModes.set(key, responseMode);
|
|
2073
|
+
await writeLine(childInput, JSON.stringify(message.payload));
|
|
2074
|
+
}
|
|
2075
|
+
childInput.end();
|
|
2076
|
+
}
|
|
2077
|
+
async function forwardCodegraphToClient(childOutput, output, responseModes, defaultResponseMode) {
|
|
2078
|
+
for await (const message of readStdioJsonRpcMessages(childOutput)) {
|
|
2079
|
+
if (message.kind === "parse_error") {
|
|
2080
|
+
writeStdioJsonRpcResponse(output, errorResponse(null, -32700, "Parse error", message.message), defaultResponseMode());
|
|
2081
|
+
continue;
|
|
2082
|
+
}
|
|
2083
|
+
const key = responseModeKey(message.payload);
|
|
2084
|
+
const responseMode = key === null ? defaultResponseMode() : responseModes.get(key) ?? defaultResponseMode();
|
|
2085
|
+
if (key !== null)
|
|
2086
|
+
responseModes.delete(key);
|
|
2087
|
+
writeStdioJsonRpcResponse(output, message.payload, responseMode);
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
function responseModeKey(payload) {
|
|
2091
|
+
if (!isPlainRecord(payload) || !("id" in payload))
|
|
2092
|
+
return null;
|
|
2093
|
+
const id = jsonRpcId(payload["id"]);
|
|
2094
|
+
return `${typeof id}:${String(id)}`;
|
|
2095
|
+
}
|
|
2096
|
+
async function writeLine(output, line) {
|
|
2097
|
+
if (output.write(`${line}
|
|
2098
|
+
`))
|
|
2099
|
+
return;
|
|
2100
|
+
await new Promise((resolveDrain, reject) => {
|
|
2101
|
+
output.once("drain", resolveDrain);
|
|
2102
|
+
output.once("error", reject);
|
|
2103
|
+
});
|
|
2104
|
+
}
|
|
2105
|
+
|
|
1933
2106
|
// src/mcp-unavailable.ts
|
|
1934
2107
|
async function runUnavailableCodegraphMcpServer(options) {
|
|
1935
2108
|
await runJsonRpcStdioServer({
|
|
@@ -1976,18 +2149,24 @@ function requestedProtocolVersion(params) {
|
|
|
1976
2149
|
return params["protocolVersion"];
|
|
1977
2150
|
}
|
|
1978
2151
|
|
|
2152
|
+
// src/session-start-worker.ts
|
|
2153
|
+
var SESSION_START_CWD_ENV = "OMO_CODEGRAPH_SESSION_START_CWD";
|
|
2154
|
+
var WINDOWS_CMD_EXTENSIONS2 = new Set([".bat", ".cmd"]);
|
|
2155
|
+
var WINDOWS_NODE_SCRIPT_EXTENSIONS2 = new Set([".cjs", ".js", ".mjs"]);
|
|
2156
|
+
|
|
1979
2157
|
// src/serve.ts
|
|
1980
2158
|
var CODEGRAPH_SKIP_HINT = `CodeGraph MCP skipped: codegraph binary not found. Install CodeGraph or set OMO_CODEGRAPH_BIN.
|
|
1981
2159
|
`;
|
|
1982
2160
|
var CODEGRAPH_DISABLED_HINT = `CodeGraph MCP skipped: disabled by OMO SOT config. Set [codex].codegraph.enabled=true to enable it.
|
|
1983
2161
|
`;
|
|
1984
2162
|
var CODEGRAPH_VERSION = "1.0.1";
|
|
1985
|
-
var
|
|
1986
|
-
var WINDOWS_NODE_SCRIPT_EXTENSIONS = new Set([".cjs", ".js", ".mjs"]);
|
|
2163
|
+
var PROJECT_CWD_ENV_KEYS = ["OMO_CODEGRAPH_PROJECT_CWD", SESSION_START_CWD_ENV, "PWD"];
|
|
1987
2164
|
async function runCodegraphServe(options = {}) {
|
|
1988
2165
|
const env = options.env ?? processEnv;
|
|
1989
2166
|
const homeDir = options.homeDir ?? homedir6();
|
|
1990
|
-
const
|
|
2167
|
+
const wrapperCwd = options.cwd ?? processCwd();
|
|
2168
|
+
const projectCwd = resolveProjectCwd(env, wrapperCwd);
|
|
2169
|
+
const config = options.config ?? getCodexOmoConfig({ cwd: projectCwd, env, homeDir });
|
|
1991
2170
|
const codegraphConfig = config.codegraph ?? {};
|
|
1992
2171
|
if (codegraphConfig.enabled === false) {
|
|
1993
2172
|
return runUnavailableMcp(CODEGRAPH_DISABLED_HINT, options);
|
|
@@ -2019,15 +2198,16 @@ async function runCodegraphServe(options = {}) {
|
|
|
2019
2198
|
if (codegraphCommandRequiresSupportedLocalNode(resolution) && !nodeSupport.supported) {
|
|
2020
2199
|
return runUnavailableMcp(buildCodegraphNodeSkipHint(nodeSupport), options);
|
|
2021
2200
|
}
|
|
2022
|
-
const runProcess = options.runProcess ??
|
|
2201
|
+
const runProcess = options.runProcess ?? runBridgedCodegraphProcess;
|
|
2023
2202
|
const codegraphEnv = codegraphEnvForConfig(trustedInstallDir, homeDir, options.buildEnv);
|
|
2024
|
-
const mergedEnv = {
|
|
2025
|
-
...env,
|
|
2026
|
-
...codegraphEnv
|
|
2027
|
-
};
|
|
2203
|
+
const mergedEnv = buildCodegraphChildEnv({ ambientEnv: env, codegraphEnv, runtimeEnv: env });
|
|
2028
2204
|
return runProcess(resolution.command, [...resolution.argsPrefix, "serve", "--mcp"], {
|
|
2205
|
+
cwd: projectCwd,
|
|
2029
2206
|
env: mergedEnv,
|
|
2030
|
-
|
|
2207
|
+
input: options.stdin ?? processStdin,
|
|
2208
|
+
output: options.stdout ?? processStdout,
|
|
2209
|
+
stderr: options.stderr ?? processStderr,
|
|
2210
|
+
stdio: "pipe"
|
|
2031
2211
|
});
|
|
2032
2212
|
}
|
|
2033
2213
|
async function runUnavailableMcp(reason, options) {
|
|
@@ -2069,6 +2249,17 @@ function codegraphEnvForConfig(trustedInstallDir, homeDir, buildEnv) {
|
|
|
2069
2249
|
const env = buildEnv?.({ homeDir }) ?? buildCodegraphEnv({ homeDir });
|
|
2070
2250
|
return trustedInstallDir === undefined ? env : { ...env, CODEGRAPH_INSTALL_DIR: trustedInstallDir };
|
|
2071
2251
|
}
|
|
2252
|
+
function resolveProjectCwd(env, fallback) {
|
|
2253
|
+
for (const key of PROJECT_CWD_ENV_KEYS) {
|
|
2254
|
+
const candidate = env[key]?.trim();
|
|
2255
|
+
if (candidate === undefined || candidate.length === 0)
|
|
2256
|
+
continue;
|
|
2257
|
+
const resolved = resolve2(candidate);
|
|
2258
|
+
if (existsSync5(resolved))
|
|
2259
|
+
return resolved;
|
|
2260
|
+
}
|
|
2261
|
+
return resolve2(fallback);
|
|
2262
|
+
}
|
|
2072
2263
|
function provisionedBinFromInstallDir(installDir) {
|
|
2073
2264
|
if (installDir === undefined)
|
|
2074
2265
|
return null;
|
|
@@ -2078,32 +2269,6 @@ function provisionedBinFromInstallDir(installDir) {
|
|
|
2078
2269
|
async function runCodegraphServeCli() {
|
|
2079
2270
|
process.exitCode = await runCodegraphServe();
|
|
2080
2271
|
}
|
|
2081
|
-
async function runChildProcess(command, args, options) {
|
|
2082
|
-
const invocation = resolveServeProcessInvocation(command, args);
|
|
2083
|
-
const child = spawn(invocation.command, invocation.args, { env: options.env, stdio: options.stdio });
|
|
2084
|
-
return new Promise((resolve3, reject) => {
|
|
2085
|
-
child.once("error", reject);
|
|
2086
|
-
child.once("exit", (code, signal) => {
|
|
2087
|
-
if (code !== null) {
|
|
2088
|
-
resolve3(code);
|
|
2089
|
-
return;
|
|
2090
|
-
}
|
|
2091
|
-
resolve3(signal === null ? 0 : 1);
|
|
2092
|
-
});
|
|
2093
|
-
});
|
|
2094
|
-
}
|
|
2095
|
-
function resolveServeProcessInvocation(command, args, platform = process.platform) {
|
|
2096
|
-
if (platform !== "win32")
|
|
2097
|
-
return { args: [...args], command };
|
|
2098
|
-
const extension = extname(command).toLowerCase();
|
|
2099
|
-
if (WINDOWS_NODE_SCRIPT_EXTENSIONS.has(extension)) {
|
|
2100
|
-
return { args: [command, ...args], command: processExecPath };
|
|
2101
|
-
}
|
|
2102
|
-
if (WINDOWS_CMD_EXTENSIONS.has(extension)) {
|
|
2103
|
-
return { args: ["/d", "/s", "/c", command, ...args], command: "cmd.exe" };
|
|
2104
|
-
}
|
|
2105
|
-
return { args: [...args], command };
|
|
2106
|
-
}
|
|
2107
2272
|
if (isDirectInvocation(process.argv[1])) {
|
|
2108
2273
|
runCodegraphServeCli().catch((error) => {
|
|
2109
2274
|
processStderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sisyphuslabs/codex-codegraph",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.14.0",
|
|
4
4
|
"description": "Codex plugin MCP wrapper for CodeGraph.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": true,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
],
|
|
16
16
|
"scripts": {
|
|
17
17
|
"build": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\" && bun build src/serve.ts --target node --format esm --outfile dist/serve.js && bun build src/cli.ts --target node --format esm --outfile dist/cli.js",
|
|
18
|
-
"test": "bun test test
|
|
18
|
+
"test": "bun test ./test",
|
|
19
19
|
"typecheck": "tsc --noEmit"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
@@ -9,7 +9,7 @@ import type {
|
|
|
9
9
|
import type { CodegraphWorkspacePreparation as SharedCodegraphWorkspacePreparation } from "../../../../../utils/src/codegraph/workspace.ts";
|
|
10
10
|
import type { CodegraphConfig as SharedCodegraphConfig } from "../../../../../utils/src/omo-config.ts";
|
|
11
11
|
|
|
12
|
-
export type SessionStartAction = "skipped-disabled" | "spawned";
|
|
12
|
+
export type SessionStartAction = "skipped-disabled" | "skipped-initialized" | "spawned";
|
|
13
13
|
export type PostToolUseAction = "emitted-guidance" | "skipped";
|
|
14
14
|
export type WorkerAction = "failed" | "initialized" | "skipped-disabled" | "skipped-status" | "skipped-unavailable" | "skipped-unsupported-node" | "synced";
|
|
15
15
|
|
|
@@ -74,6 +74,12 @@ export interface SessionStartHookOptions {
|
|
|
74
74
|
readonly cwd?: string;
|
|
75
75
|
readonly env?: Record<string, string | undefined>;
|
|
76
76
|
readonly spawnWorker?: (invocation: WorkerSpawnInvocation) => void;
|
|
77
|
+
readonly statusProbe?: (options: {
|
|
78
|
+
readonly env: Record<string, string | undefined>;
|
|
79
|
+
readonly homeDir: string;
|
|
80
|
+
readonly projectRoot: string;
|
|
81
|
+
readonly trustedCodegraphInstallDir?: string;
|
|
82
|
+
}) => Promise<boolean>;
|
|
77
83
|
readonly stdin?: Readable & { readonly isTTY?: boolean };
|
|
78
84
|
readonly stdout?: HookStdout;
|
|
79
85
|
readonly workerCliPath?: string;
|
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import { spawn } from "node:child_process";
|
|
1
|
+
import { execFile, spawn } from "node:child_process";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
3
4
|
import { cwd as processCwd, env as processEnv, stdin as processStdin, stdout as processStdout } from "node:process";
|
|
4
5
|
import type { Readable } from "node:stream";
|
|
5
6
|
import { fileURLToPath } from "node:url";
|
|
6
7
|
|
|
8
|
+
import { buildCodegraphChildEnv, buildCodegraphEnv } from "../../../../../utils/src/codegraph/env.ts";
|
|
7
9
|
import { buildCodegraphInitGuidanceForToolResult } from "../../../../../utils/src/codegraph/guidance.ts";
|
|
10
|
+
import { resolveCodegraphCommand } from "../../../../../utils/src/codegraph/resolve.ts";
|
|
8
11
|
import { getCodexOmoConfig } from "../../../shared/src/config-loader.ts";
|
|
9
|
-
import { SESSION_START_CWD_ENV } from "./session-start-worker.js";
|
|
12
|
+
import { resolveCodegraphCommandInvocation, SESSION_START_CWD_ENV } from "./session-start-worker.js";
|
|
10
13
|
import type {
|
|
11
14
|
HookStdout,
|
|
12
15
|
PostToolUseHookOptions,
|
|
@@ -38,6 +41,7 @@ export type {
|
|
|
38
41
|
export { resolveCodegraphCommandInvocation, runCodegraphSessionStartWorker } from "./session-start-worker.js";
|
|
39
42
|
|
|
40
43
|
export const CODEGRAPH_SESSION_START_NOTICE = "LazyCodex CodeGraph bootstrap scheduled in background";
|
|
44
|
+
const STATUS_PROBE_TIMEOUT_MS = 2_000;
|
|
41
45
|
|
|
42
46
|
export async function runCodegraphSessionStartHook(options: SessionStartHookOptions = {}): Promise<number> {
|
|
43
47
|
return (await executeCodegraphSessionStartHook(options)).exitCode;
|
|
@@ -58,15 +62,102 @@ export async function executeCodegraphSessionStartHook(options: SessionStartHook
|
|
|
58
62
|
return { action: "skipped-disabled", exitCode: 0 };
|
|
59
63
|
}
|
|
60
64
|
|
|
65
|
+
const isInitialized = await (options.statusProbe ?? isCodegraphProjectInitialized)({
|
|
66
|
+
env,
|
|
67
|
+
homeDir,
|
|
68
|
+
projectRoot,
|
|
69
|
+
...(config.trustedCodegraphInstallDir === undefined ? {} : { trustedCodegraphInstallDir: config.trustedCodegraphInstallDir }),
|
|
70
|
+
});
|
|
71
|
+
if (isInitialized) {
|
|
72
|
+
return { action: "skipped-initialized", exitCode: 0 };
|
|
73
|
+
}
|
|
74
|
+
|
|
61
75
|
(options.spawnWorker ?? spawnDetachedWorker)({
|
|
62
76
|
args: [options.workerCliPath ?? defaultWorkerCliPath(), "hook", "session-start-worker"],
|
|
63
77
|
command: process.execPath,
|
|
64
|
-
env: {
|
|
78
|
+
env: buildCodegraphChildEnv({
|
|
79
|
+
ambientEnv: env,
|
|
80
|
+
codegraphEnv: { [SESSION_START_CWD_ENV]: projectRoot },
|
|
81
|
+
runtimeEnv: env,
|
|
82
|
+
}),
|
|
65
83
|
});
|
|
66
84
|
writeHookJson(options.stdout ?? processStdout);
|
|
67
85
|
return { action: "spawned", exitCode: 0 };
|
|
68
86
|
}
|
|
69
87
|
|
|
88
|
+
async function isCodegraphProjectInitialized(options: {
|
|
89
|
+
readonly env: Record<string, string | undefined>;
|
|
90
|
+
readonly homeDir: string;
|
|
91
|
+
readonly projectRoot: string;
|
|
92
|
+
readonly trustedCodegraphInstallDir?: string;
|
|
93
|
+
}): Promise<boolean> {
|
|
94
|
+
const resolved = resolveCodegraphCommand({
|
|
95
|
+
env: options.env,
|
|
96
|
+
homeDir: options.homeDir,
|
|
97
|
+
provisioned: () => provisionedBinFromInstallDir(options.trustedCodegraphInstallDir),
|
|
98
|
+
});
|
|
99
|
+
if (!resolved.exists) return false;
|
|
100
|
+
|
|
101
|
+
const invocation = resolveCodegraphCommandInvocation(resolved.command, [...resolved.argsPrefix, "status", "--json"]);
|
|
102
|
+
const codegraphEnv = {
|
|
103
|
+
...buildCodegraphEnv({ homeDir: options.homeDir }),
|
|
104
|
+
...(options.trustedCodegraphInstallDir === undefined ? {} : { CODEGRAPH_INSTALL_DIR: options.trustedCodegraphInstallDir }),
|
|
105
|
+
};
|
|
106
|
+
const status = await runStatusProbe(
|
|
107
|
+
options.projectRoot,
|
|
108
|
+
invocation.command,
|
|
109
|
+
invocation.args,
|
|
110
|
+
buildCodegraphChildEnv({ ambientEnv: options.env, codegraphEnv, runtimeEnv: options.env }),
|
|
111
|
+
);
|
|
112
|
+
if (status.exitCode !== 0 || status.timedOut) return false;
|
|
113
|
+
return codegraphStatusSaysInitialized(status.stdout);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function runStatusProbe(
|
|
117
|
+
projectRoot: string,
|
|
118
|
+
command: string,
|
|
119
|
+
args: readonly string[],
|
|
120
|
+
env: Record<string, string>,
|
|
121
|
+
): Promise<{ readonly exitCode: number; readonly stdout: string; readonly timedOut: boolean }> {
|
|
122
|
+
return new Promise((resolveProbe) => {
|
|
123
|
+
execFile(
|
|
124
|
+
command,
|
|
125
|
+
[...args],
|
|
126
|
+
{
|
|
127
|
+
cwd: projectRoot,
|
|
128
|
+
encoding: "utf8",
|
|
129
|
+
env,
|
|
130
|
+
maxBuffer: 1024 * 1024,
|
|
131
|
+
timeout: STATUS_PROBE_TIMEOUT_MS,
|
|
132
|
+
windowsHide: true,
|
|
133
|
+
},
|
|
134
|
+
(error, stdout) => {
|
|
135
|
+
if (error === null) {
|
|
136
|
+
resolveProbe({ exitCode: 0, stdout: toOutputText(stdout), timedOut: false });
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
resolveProbe({ exitCode: resolveExitCode(error), stdout: toOutputText(stdout), timedOut: error.killed === true });
|
|
140
|
+
},
|
|
141
|
+
);
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function codegraphStatusSaysInitialized(stdout: string): boolean {
|
|
146
|
+
const parsed = parseJson(stdout);
|
|
147
|
+
if (!isRecord(parsed)) return false;
|
|
148
|
+
const initialized = parsed["initialized"] ?? parsed["isInitialized"] ?? parsed["ready"];
|
|
149
|
+
if (typeof initialized === "boolean") return initialized;
|
|
150
|
+
const status = parsed["status"];
|
|
151
|
+
if (typeof status !== "string") return false;
|
|
152
|
+
const normalized = status.toLowerCase();
|
|
153
|
+
return (normalized.includes("initialized") || normalized.includes("ready")) && !normalized.includes("not initialized") && !normalized.includes("uninitialized");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function provisionedBinFromInstallDir(installDir: string | undefined): string | null {
|
|
157
|
+
if (installDir === undefined) return null;
|
|
158
|
+
return join(installDir, "bin", process.platform === "win32" ? "codegraph.cmd" : "codegraph");
|
|
159
|
+
}
|
|
160
|
+
|
|
70
161
|
export async function executeCodegraphPostToolUseHook(options: PostToolUseHookOptions = {}): Promise<PostToolUseHookResult> {
|
|
71
162
|
const env = options.env ?? processEnv;
|
|
72
163
|
const input = await readHookInput(options.stdin ?? processStdin);
|
|
@@ -111,6 +202,15 @@ function resolveHomeDir(env: Record<string, string | undefined>): string {
|
|
|
111
202
|
return env["HOME"] ?? env["USERPROFILE"] ?? homedir();
|
|
112
203
|
}
|
|
113
204
|
|
|
205
|
+
function resolveExitCode(error: Error): number {
|
|
206
|
+
if ("code" in error && typeof error.code === "number") return error.code;
|
|
207
|
+
return 1;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function toOutputText(value: string | Buffer): string {
|
|
211
|
+
return Buffer.isBuffer(value) ? value.toString("utf8") : value;
|
|
212
|
+
}
|
|
213
|
+
|
|
114
214
|
function resolveProjectRoot(input: unknown, fallback: string): string {
|
|
115
215
|
if (!isRecord(input)) return fallback;
|
|
116
216
|
const cwd = input["cwd"];
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import type { Readable, Writable } from "node:stream";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
errorResponse,
|
|
6
|
+
isPlainRecord,
|
|
7
|
+
jsonRpcId,
|
|
8
|
+
readStdioJsonRpcMessages,
|
|
9
|
+
writeStdioJsonRpcResponse,
|
|
10
|
+
type StdioJsonRpcResponseMode,
|
|
11
|
+
} from "../../../../../mcp-stdio-core/src/index.ts";
|
|
12
|
+
import type { CodegraphServeProcessOptions } from "./serve.js";
|
|
13
|
+
import { resolveServeProcessInvocation } from "./serve-invocation.js";
|
|
14
|
+
|
|
15
|
+
class CodegraphBridgeStdioError extends Error {
|
|
16
|
+
override readonly name = "CodegraphBridgeStdioError";
|
|
17
|
+
|
|
18
|
+
constructor(readonly streamName: string) {
|
|
19
|
+
super(`CodeGraph MCP bridge missing child ${streamName}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export async function runBridgedCodegraphProcess(
|
|
24
|
+
command: string,
|
|
25
|
+
args: readonly string[],
|
|
26
|
+
options: CodegraphServeProcessOptions,
|
|
27
|
+
): Promise<number> {
|
|
28
|
+
const invocation = resolveServeProcessInvocation(command, args);
|
|
29
|
+
const child = spawn(invocation.command, invocation.args, {
|
|
30
|
+
cwd: options.cwd,
|
|
31
|
+
env: options.env,
|
|
32
|
+
stdio: ["pipe", "pipe", "inherit"],
|
|
33
|
+
});
|
|
34
|
+
const childInput = child.stdin;
|
|
35
|
+
const childOutput = child.stdout;
|
|
36
|
+
if (childInput === null) throw new CodegraphBridgeStdioError("stdin");
|
|
37
|
+
if (childOutput === null) throw new CodegraphBridgeStdioError("stdout");
|
|
38
|
+
|
|
39
|
+
const responseModes = new Map<string, StdioJsonRpcResponseMode>();
|
|
40
|
+
let defaultResponseMode: StdioJsonRpcResponseMode = "framed";
|
|
41
|
+
const childExit = new Promise<number>((resolveExit, reject) => {
|
|
42
|
+
child.once("error", reject);
|
|
43
|
+
child.once("exit", (code, signal) => {
|
|
44
|
+
if (code !== null) {
|
|
45
|
+
resolveExit(code);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
resolveExit(signal === null ? 0 : 1);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
const bridgeDone = Promise.all([
|
|
52
|
+
forwardClientToCodegraph(options.input, childInput, responseModes, (mode) => {
|
|
53
|
+
defaultResponseMode = mode;
|
|
54
|
+
}),
|
|
55
|
+
forwardCodegraphToClient(childOutput, options.output, responseModes, () => defaultResponseMode),
|
|
56
|
+
]);
|
|
57
|
+
const destroyChildPipes = (): void => {
|
|
58
|
+
childInput.destroy();
|
|
59
|
+
childOutput.destroy();
|
|
60
|
+
};
|
|
61
|
+
void childExit.then(destroyChildPipes, destroyChildPipes);
|
|
62
|
+
return Promise.race([childExit, bridgeDone.then(() => childExit)]);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async function forwardClientToCodegraph(
|
|
66
|
+
input: Readable,
|
|
67
|
+
childInput: Writable,
|
|
68
|
+
responseModes: Map<string, StdioJsonRpcResponseMode>,
|
|
69
|
+
setDefaultResponseMode: (mode: StdioJsonRpcResponseMode) => void,
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
for await (const message of readStdioJsonRpcMessages(input)) {
|
|
72
|
+
if (message.kind === "parse_error") {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
const responseMode = message.responseMode;
|
|
76
|
+
setDefaultResponseMode(responseMode);
|
|
77
|
+
const key = responseModeKey(message.payload);
|
|
78
|
+
if (key !== null) responseModes.set(key, responseMode);
|
|
79
|
+
await writeLine(childInput, JSON.stringify(message.payload));
|
|
80
|
+
}
|
|
81
|
+
childInput.end();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
async function forwardCodegraphToClient(
|
|
85
|
+
childOutput: Readable,
|
|
86
|
+
output: Writable,
|
|
87
|
+
responseModes: Map<string, StdioJsonRpcResponseMode>,
|
|
88
|
+
defaultResponseMode: () => StdioJsonRpcResponseMode,
|
|
89
|
+
): Promise<void> {
|
|
90
|
+
for await (const message of readStdioJsonRpcMessages(childOutput)) {
|
|
91
|
+
if (message.kind === "parse_error") {
|
|
92
|
+
writeStdioJsonRpcResponse(output, errorResponse(null, -32700, "Parse error", message.message), defaultResponseMode());
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
const key = responseModeKey(message.payload);
|
|
96
|
+
const responseMode = key === null ? defaultResponseMode() : (responseModes.get(key) ?? defaultResponseMode());
|
|
97
|
+
if (key !== null) responseModes.delete(key);
|
|
98
|
+
writeStdioJsonRpcResponse(output, message.payload, responseMode);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function responseModeKey(payload: unknown): string | null {
|
|
103
|
+
if (!isPlainRecord(payload) || !("id" in payload)) return null;
|
|
104
|
+
const id = jsonRpcId(payload["id"]);
|
|
105
|
+
return `${typeof id}:${String(id)}`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async function writeLine(output: Writable, line: string): Promise<void> {
|
|
109
|
+
if (output.write(`${line}\n`)) return;
|
|
110
|
+
await new Promise<void>((resolveDrain, reject) => {
|
|
111
|
+
output.once("drain", resolveDrain);
|
|
112
|
+
output.once("error", reject);
|
|
113
|
+
});
|
|
114
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { extname } from "node:path";
|
|
2
|
+
import { execPath as processExecPath } from "node:process";
|
|
3
|
+
|
|
4
|
+
export interface ServeProcessInvocation {
|
|
5
|
+
readonly args: readonly string[];
|
|
6
|
+
readonly command: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const WINDOWS_CMD_EXTENSIONS = new Set([".bat", ".cmd"]);
|
|
10
|
+
const WINDOWS_NODE_SCRIPT_EXTENSIONS = new Set([".cjs", ".js", ".mjs"]);
|
|
11
|
+
|
|
12
|
+
export function resolveServeProcessInvocation(
|
|
13
|
+
command: string,
|
|
14
|
+
args: readonly string[],
|
|
15
|
+
platform: NodeJS.Platform = process.platform,
|
|
16
|
+
): ServeProcessInvocation {
|
|
17
|
+
if (platform !== "win32") return { args: [...args], command };
|
|
18
|
+
|
|
19
|
+
const extension = extname(command).toLowerCase();
|
|
20
|
+
if (WINDOWS_NODE_SCRIPT_EXTENSIONS.has(extension)) {
|
|
21
|
+
return { args: [command, ...args], command: processExecPath };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (WINDOWS_CMD_EXTENSIONS.has(extension)) {
|
|
25
|
+
return { args: ["/d", "/s", "/c", command, ...args], command: "cmd.exe" };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return { args: [...args], command };
|
|
29
|
+
}
|