oh-my-opencode 5.0.0-beta.33 → 5.0.0-beta.35
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/scripts/lsp-e2e.sh +1 -3
- package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
- package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/README.zh-cn.md +1 -1
- package/THIRD-PARTY-NOTICES.md +27 -99
- package/dist/cli/index.js +48350 -48559
- package/dist/cli-node/index.js +48480 -48689
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/hooks.d.ts +0 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +0 -10
- package/dist/config/schema.d.ts +0 -1
- package/dist/create-hooks.d.ts +0 -1
- package/dist/hooks/index.d.ts +0 -1
- package/dist/index.js +11675 -13742
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/types.d.ts +0 -1
- package/dist/oh-my-opencode.schema.json +1 -45
- package/dist/plugin/hooks/create-core-hooks.d.ts +0 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +1 -2
- package/dist/shared/omo-process-sweep.d.ts +2 -4
- package/dist/skills/init-deep/SKILL.md +13 -13
- package/dist/skills/ulw-plan/SKILL.md +0 -1
- package/dist/tui.js +44809 -44910
- package/package.json +16 -18
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +0 -17
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -3
- package/packages/omo-codex/plugin/.mcp.json +0 -6
- package/packages/omo-codex/plugin/AGENTS.md +5 -5
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1 -15
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +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 +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +35 -38
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +278 -193
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +7 -51
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +39 -22
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +64 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +37 -18
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +32 -63
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +7 -53
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +50 -31
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +67 -14
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +36 -17
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +26 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +47 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -146
- package/packages/omo-codex/plugin/package.json +1 -2
- package/packages/omo-codex/plugin/scripts/AGENTS.md +0 -1
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
- package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -8
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
- package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +0 -1
- package/packages/omo-codex/plugin/test/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +2 -21
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -2
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +0 -25
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
- package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +0 -50
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +0 -1
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
- package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +238 -431
- package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
- package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
- package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -1
- package/dist/config/schema/codegraph.d.ts +0 -12
- package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
- package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
- package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
- package/dist/mcp/codegraph.d.ts +0 -16
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/LICENSE +0 -21
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12326
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9908
- package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
- package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -310
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -92
- package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -22
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
- package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +0 -47
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate.test.ts +0 -101
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
- package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
|
@@ -1,385 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { dirname, join, resolve } from "node:path";
|
|
5
|
-
import { Readable, Writable } from "node:stream";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
|
|
8
|
-
import { CODEGRAPH_PINNED_VERSION } from "../../../../../utils/src/codegraph/manifest.ts";
|
|
9
|
-
import { resolveServeProcessInvocation, runCodegraphServe } from "../src/serve.ts";
|
|
10
|
-
|
|
11
|
-
const componentRoot = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
12
|
-
|
|
13
|
-
describe("runCodegraphServe", () => {
|
|
14
|
-
it("#given CodeGraph resolves #when serving MCP #then execs codegraph serve --mcp with bridged stdio and telemetry disabled", async () => {
|
|
15
|
-
// given
|
|
16
|
-
const runCwd = componentRoot;
|
|
17
|
-
const calls: Array<{
|
|
18
|
-
readonly args: readonly string[];
|
|
19
|
-
readonly command: string;
|
|
20
|
-
readonly cwd: string;
|
|
21
|
-
readonly env: Record<string, string | undefined>;
|
|
22
|
-
readonly stdio: "pipe";
|
|
23
|
-
}> = [];
|
|
24
|
-
|
|
25
|
-
// when
|
|
26
|
-
const exitCode = await runCodegraphServe({
|
|
27
|
-
cwd: runCwd,
|
|
28
|
-
env: { CUSTOM: "drop", HOME: "/tmp/home", OPENAI_API_KEY: "sk-test-secret" },
|
|
29
|
-
nodeVersion: "22.14.0",
|
|
30
|
-
homeDir: "/tmp/home",
|
|
31
|
-
resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
|
|
32
|
-
runProcess: (
|
|
33
|
-
command: string,
|
|
34
|
-
args: readonly string[],
|
|
35
|
-
options: { readonly cwd: string; readonly env: Record<string, string | undefined>; readonly stdio: "pipe" },
|
|
36
|
-
) => {
|
|
37
|
-
calls.push({ args, command, cwd: options.cwd, env: options.env, stdio: options.stdio });
|
|
38
|
-
return Promise.resolve(7);
|
|
39
|
-
},
|
|
40
|
-
stderr: { write: () => undefined },
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
// then
|
|
44
|
-
expect(exitCode).toBe(7);
|
|
45
|
-
expect(calls).toEqual([
|
|
46
|
-
{
|
|
47
|
-
args: ["shim.js", "serve", "--mcp"],
|
|
48
|
-
command: "node",
|
|
49
|
-
cwd: resolve(runCwd),
|
|
50
|
-
env: {
|
|
51
|
-
CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
|
|
52
|
-
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
53
|
-
CODEGRAPH_TELEMETRY: "0",
|
|
54
|
-
DO_NOT_TRACK: "1",
|
|
55
|
-
HOME: "/tmp/home",
|
|
56
|
-
},
|
|
57
|
-
stdio: "pipe",
|
|
58
|
-
},
|
|
59
|
-
]);
|
|
60
|
-
expect(calls[0]?.env["CUSTOM"]).toBeUndefined();
|
|
61
|
-
expect(calls[0]?.env["OPENAI_API_KEY"]).toBeUndefined();
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
it("#given codegraph.daemon=false #when serving MCP #then CODEGRAPH_NO_DAEMON pins daemon-off", async () => {
|
|
65
|
-
// given
|
|
66
|
-
const runCwd = componentRoot;
|
|
67
|
-
const calls: Array<{
|
|
68
|
-
readonly args: readonly string[];
|
|
69
|
-
readonly command: string;
|
|
70
|
-
readonly cwd: string;
|
|
71
|
-
readonly env: Record<string, string | undefined>;
|
|
72
|
-
readonly stdio: "pipe";
|
|
73
|
-
}> = [];
|
|
74
|
-
|
|
75
|
-
// when
|
|
76
|
-
const exitCode = await runCodegraphServe({
|
|
77
|
-
config: { codegraph: { daemon: false, enabled: true }, sources: [], warnings: [] },
|
|
78
|
-
cwd: runCwd,
|
|
79
|
-
env: { CUSTOM: "drop", HOME: "/tmp/home", OPENAI_API_KEY: "sk-test-secret" },
|
|
80
|
-
nodeVersion: "22.14.0",
|
|
81
|
-
homeDir: "/tmp/home",
|
|
82
|
-
resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
|
|
83
|
-
runProcess: (
|
|
84
|
-
command: string,
|
|
85
|
-
args: readonly string[],
|
|
86
|
-
options: { readonly cwd: string; readonly env: Record<string, string | undefined>; readonly stdio: "pipe" },
|
|
87
|
-
) => {
|
|
88
|
-
calls.push({ args, command, cwd: options.cwd, env: options.env, stdio: options.stdio });
|
|
89
|
-
return Promise.resolve(7);
|
|
90
|
-
},
|
|
91
|
-
stderr: { write: () => undefined },
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
// then
|
|
95
|
-
expect(exitCode).toBe(7);
|
|
96
|
-
expect(calls).toEqual([
|
|
97
|
-
{
|
|
98
|
-
args: ["shim.js", "serve", "--mcp"],
|
|
99
|
-
command: "node",
|
|
100
|
-
cwd: resolve(runCwd),
|
|
101
|
-
env: {
|
|
102
|
-
CODEGRAPH_INSTALL_DIR: join("/tmp/home", ".omo", "codegraph"),
|
|
103
|
-
CODEGRAPH_NO_DAEMON: "1",
|
|
104
|
-
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
105
|
-
CODEGRAPH_TELEMETRY: "0",
|
|
106
|
-
DO_NOT_TRACK: "1",
|
|
107
|
-
HOME: "/tmp/home",
|
|
108
|
-
},
|
|
109
|
-
stdio: "pipe",
|
|
110
|
-
},
|
|
111
|
-
]);
|
|
112
|
-
expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBe("1");
|
|
113
|
-
expect(calls[0]?.env["CUSTOM"]).toBeUndefined();
|
|
114
|
-
expect(calls[0]?.env["OPENAI_API_KEY"]).toBeUndefined();
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it("#given an unsupported local Node but the unsafe override is set #when serving MCP #then it still spawns codegraph", async () => {
|
|
118
|
-
// given
|
|
119
|
-
const spawned: string[] = [];
|
|
120
|
-
|
|
121
|
-
// when
|
|
122
|
-
const exitCode = await runCodegraphServe({
|
|
123
|
-
env: { CODEGRAPH_ALLOW_UNSAFE_NODE: "1" },
|
|
124
|
-
nodeVersion: "26.3.0",
|
|
125
|
-
buildEnv: () => ({}),
|
|
126
|
-
resolve: () => ({ argsPrefix: ["shim.js"], command: "node", exists: true, source: "bundled" }),
|
|
127
|
-
runProcess: (command: string) => {
|
|
128
|
-
spawned.push(command);
|
|
129
|
-
return Promise.resolve(0);
|
|
130
|
-
},
|
|
131
|
-
stderr: { write: () => undefined },
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
// then
|
|
135
|
-
expect(exitCode).toBe(0);
|
|
136
|
-
expect(spawned).toEqual(["node"]);
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it("#given an unsupported local Node but CODEGRAPH_NODE_BIN resolves a bundled shim with Node 22 #when serving MCP #then it spawns the compatible runtime", async () => {
|
|
140
|
-
// given
|
|
141
|
-
const spawned: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
|
|
142
|
-
const nodeBin = "/opt/node22/bin/node";
|
|
143
|
-
|
|
144
|
-
// when
|
|
145
|
-
const exitCode = await runCodegraphServe({
|
|
146
|
-
env: { CODEGRAPH_NODE_BIN: nodeBin },
|
|
147
|
-
nodeVersion: "26.3.0",
|
|
148
|
-
buildEnv: () => ({}),
|
|
149
|
-
resolve: () => ({ argsPrefix: ["codegraph.js"], command: nodeBin, exists: true, source: "bundled" }),
|
|
150
|
-
runProcess: (command: string, args: readonly string[]) => {
|
|
151
|
-
spawned.push({ args, command });
|
|
152
|
-
return Promise.resolve(0);
|
|
153
|
-
},
|
|
154
|
-
stderr: { write: () => undefined },
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
// then
|
|
158
|
-
expect(exitCode).toBe(0);
|
|
159
|
-
expect(spawned).toEqual([{ args: ["codegraph.js", "serve", "--mcp"], command: nodeBin }]);
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it("#given OMO_CODEGRAPH_BIN points at an explicit command #when local Node is unsupported #then serve trusts the configured command", async () => {
|
|
163
|
-
// given
|
|
164
|
-
const commandPath = "/opt/codegraph-node22/bin/codegraph";
|
|
165
|
-
const spawned: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
|
|
166
|
-
|
|
167
|
-
// when
|
|
168
|
-
const exitCode = await runCodegraphServe({
|
|
169
|
-
env: { OMO_CODEGRAPH_BIN: commandPath },
|
|
170
|
-
nodeVersion: "26.3.0",
|
|
171
|
-
buildEnv: () => ({}),
|
|
172
|
-
commandExists: (candidate) => candidate === commandPath,
|
|
173
|
-
resolve: () => ({ argsPrefix: [], command: commandPath, exists: true, source: "env" }),
|
|
174
|
-
runProcess: (command: string, args: readonly string[]) => {
|
|
175
|
-
spawned.push({ args, command });
|
|
176
|
-
return Promise.resolve(0);
|
|
177
|
-
},
|
|
178
|
-
stderr: { write: () => undefined },
|
|
179
|
-
});
|
|
180
|
-
|
|
181
|
-
// then
|
|
182
|
-
expect(exitCode).toBe(0);
|
|
183
|
-
expect(spawned).toEqual([{ args: ["serve", "--mcp"], command: commandPath }]);
|
|
184
|
-
});
|
|
185
|
-
|
|
186
|
-
it("#given Codex SOT install_dir has the pinned launcher and daemon is omitted #when serving MCP #then it defaults daemon-on", async () => {
|
|
187
|
-
await withProcessPlatform(process.platform, async () => {
|
|
188
|
-
// given
|
|
189
|
-
const tempRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-install-dir-"));
|
|
190
|
-
const installDir = join(tempRoot, "custom-codegraph");
|
|
191
|
-
const binPath = join(installDir, "bin", process.platform === "win32" ? "codegraph.cmd" : "codegraph");
|
|
192
|
-
const calls: Array<{
|
|
193
|
-
readonly args: readonly string[];
|
|
194
|
-
readonly command: string;
|
|
195
|
-
readonly env: Record<string, string | undefined>;
|
|
196
|
-
}> = [];
|
|
197
|
-
|
|
198
|
-
try {
|
|
199
|
-
mkdirSync(join(installDir, "bin"), { recursive: true });
|
|
200
|
-
mkdirSync(join(installDir, ".provisioned"), { recursive: true });
|
|
201
|
-
writeFileSync(binPath, "");
|
|
202
|
-
writeFileSync(
|
|
203
|
-
join(installDir, ".provisioned", `codegraph-${CODEGRAPH_PINNED_VERSION}.json`),
|
|
204
|
-
`${JSON.stringify({ binPath, version: CODEGRAPH_PINNED_VERSION })}\n`,
|
|
205
|
-
);
|
|
206
|
-
|
|
207
|
-
// when
|
|
208
|
-
const exitCode = await runCodegraphServe({
|
|
209
|
-
config: { codegraph: { enabled: true, install_dir: installDir }, sources: [], trustedCodegraphInstallDir: installDir, warnings: [] },
|
|
210
|
-
env: { HOME: "/tmp/home" },
|
|
211
|
-
nodeVersion: "22.14.0",
|
|
212
|
-
homeDir: "/tmp/home",
|
|
213
|
-
resolve: (options) => {
|
|
214
|
-
const provisioned = options.provisioned?.();
|
|
215
|
-
return { argsPrefix: [], command: provisioned ?? "missing", exists: provisioned !== null && provisioned !== undefined, source: "provisioned" };
|
|
216
|
-
},
|
|
217
|
-
runProcess: (command, args, options) => {
|
|
218
|
-
calls.push({ args, command, env: options.env });
|
|
219
|
-
return Promise.resolve(0);
|
|
220
|
-
},
|
|
221
|
-
stderr: { write: () => undefined },
|
|
222
|
-
});
|
|
223
|
-
|
|
224
|
-
// then
|
|
225
|
-
expect(exitCode).toBe(0);
|
|
226
|
-
expect(calls).toEqual([
|
|
227
|
-
{
|
|
228
|
-
args: ["serve", "--mcp"],
|
|
229
|
-
command: binPath,
|
|
230
|
-
env: {
|
|
231
|
-
CODEGRAPH_INSTALL_DIR: installDir,
|
|
232
|
-
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
233
|
-
CODEGRAPH_TELEMETRY: "0",
|
|
234
|
-
DO_NOT_TRACK: "1",
|
|
235
|
-
HOME: "/tmp/home",
|
|
236
|
-
},
|
|
237
|
-
},
|
|
238
|
-
]);
|
|
239
|
-
} finally {
|
|
240
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
241
|
-
}
|
|
242
|
-
});
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
it("#given Codex SOT install_dir with codegraph.daemon=false #when serving MCP #then CODEGRAPH_NO_DAEMON pins daemon-off", async () => {
|
|
246
|
-
await withProcessPlatform(process.platform, async () => {
|
|
247
|
-
// given
|
|
248
|
-
const tempRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-serve-install-dir-daemon-"));
|
|
249
|
-
const installDir = join(tempRoot, "custom-codegraph");
|
|
250
|
-
const binPath = join(installDir, "bin", process.platform === "win32" ? "codegraph.cmd" : "codegraph");
|
|
251
|
-
const calls: Array<{
|
|
252
|
-
readonly args: readonly string[];
|
|
253
|
-
readonly command: string;
|
|
254
|
-
readonly env: Record<string, string | undefined>;
|
|
255
|
-
}> = [];
|
|
256
|
-
|
|
257
|
-
try {
|
|
258
|
-
mkdirSync(join(installDir, "bin"), { recursive: true });
|
|
259
|
-
mkdirSync(join(installDir, ".provisioned"), { recursive: true });
|
|
260
|
-
writeFileSync(binPath, "");
|
|
261
|
-
writeFileSync(
|
|
262
|
-
join(installDir, ".provisioned", `codegraph-${CODEGRAPH_PINNED_VERSION}.json`),
|
|
263
|
-
`${JSON.stringify({ binPath, version: CODEGRAPH_PINNED_VERSION })}\n`,
|
|
264
|
-
);
|
|
265
|
-
|
|
266
|
-
// when
|
|
267
|
-
const exitCode = await runCodegraphServe({
|
|
268
|
-
config: { codegraph: { daemon: false, enabled: true, install_dir: installDir }, sources: [], trustedCodegraphInstallDir: installDir, warnings: [] },
|
|
269
|
-
env: { HOME: "/tmp/home" },
|
|
270
|
-
nodeVersion: "22.14.0",
|
|
271
|
-
homeDir: "/tmp/home",
|
|
272
|
-
resolve: (options) => {
|
|
273
|
-
const provisioned = options.provisioned?.();
|
|
274
|
-
return { argsPrefix: [], command: provisioned ?? "missing", exists: provisioned !== null && provisioned !== undefined, source: "provisioned" };
|
|
275
|
-
},
|
|
276
|
-
runProcess: (command, args, options) => {
|
|
277
|
-
calls.push({ args, command, env: options.env });
|
|
278
|
-
return Promise.resolve(0);
|
|
279
|
-
},
|
|
280
|
-
stderr: { write: () => undefined },
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
// then
|
|
284
|
-
expect(exitCode).toBe(0);
|
|
285
|
-
expect(calls).toEqual([
|
|
286
|
-
{
|
|
287
|
-
args: ["serve", "--mcp"],
|
|
288
|
-
command: binPath,
|
|
289
|
-
env: {
|
|
290
|
-
CODEGRAPH_INSTALL_DIR: installDir,
|
|
291
|
-
CODEGRAPH_NO_DAEMON: "1",
|
|
292
|
-
CODEGRAPH_NO_DOWNLOAD: "1",
|
|
293
|
-
CODEGRAPH_TELEMETRY: "0",
|
|
294
|
-
DO_NOT_TRACK: "1",
|
|
295
|
-
HOME: "/tmp/home",
|
|
296
|
-
},
|
|
297
|
-
},
|
|
298
|
-
]);
|
|
299
|
-
expect(calls[0]?.env["CODEGRAPH_NO_DAEMON"]).toBe("1");
|
|
300
|
-
} finally {
|
|
301
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it("#given project cwd is under a configured excluded root #when serving MCP #then it exposes an unavailable stub without spawning CodeGraph", async () => {
|
|
307
|
-
// given
|
|
308
|
-
const excludedRoot = mkdtempSync(join(componentRoot, ".tmp-codegraph-excluded-"));
|
|
309
|
-
const projectRoot = join(excludedRoot, "repo");
|
|
310
|
-
const stderr: string[] = [];
|
|
311
|
-
const stdout: string[] = [];
|
|
312
|
-
const calls: string[] = [];
|
|
313
|
-
mkdirSync(projectRoot, { recursive: true });
|
|
314
|
-
|
|
315
|
-
try {
|
|
316
|
-
// when
|
|
317
|
-
const exitCode = await runCodegraphServe({
|
|
318
|
-
config: { codegraph: { enabled: true, excluded_roots: [excludedRoot] }, sources: [], warnings: [] },
|
|
319
|
-
cwd: projectRoot,
|
|
320
|
-
env: { HOME: "/tmp/home" },
|
|
321
|
-
homeDir: "/tmp/home",
|
|
322
|
-
nodeVersion: "22.14.0",
|
|
323
|
-
resolve: () => ({ argsPrefix: [], command: "/tmp/codegraph", exists: true, source: "path" }),
|
|
324
|
-
runProcess: () => {
|
|
325
|
-
calls.push("spawned");
|
|
326
|
-
return Promise.resolve(0);
|
|
327
|
-
},
|
|
328
|
-
stderr: { write: (chunk) => stderr.push(chunk) },
|
|
329
|
-
stdin: Readable.from([]),
|
|
330
|
-
stdout: new Writable({
|
|
331
|
-
write: (chunk, _encoding, callback) => {
|
|
332
|
-
stdout.push(String(chunk));
|
|
333
|
-
callback();
|
|
334
|
-
},
|
|
335
|
-
}),
|
|
336
|
-
});
|
|
337
|
-
|
|
338
|
-
// then
|
|
339
|
-
expect(exitCode).toBe(0);
|
|
340
|
-
expect(calls).toEqual([]);
|
|
341
|
-
expect(stderr.join("")).toContain("CodeGraph MCP skipped: project excluded");
|
|
342
|
-
} finally {
|
|
343
|
-
rmSync(excludedRoot, { recursive: true, force: true });
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
|
|
347
|
-
it("#given Windows OMO_CODEGRAPH_BIN is a Node script #when resolving serve invocation #then Node executes the script path", () => {
|
|
348
|
-
// given
|
|
349
|
-
const scriptPath = "C:\\Users\\runner\\codegraph-fake.cjs";
|
|
350
|
-
|
|
351
|
-
// when
|
|
352
|
-
const invocation = resolveServeProcessInvocation(scriptPath, ["serve", "--mcp"], "win32");
|
|
353
|
-
|
|
354
|
-
// then
|
|
355
|
-
expect(invocation).toEqual({
|
|
356
|
-
args: [scriptPath, "serve", "--mcp"],
|
|
357
|
-
command: process.execPath,
|
|
358
|
-
});
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
it("#given Windows CodeGraph resolves to a cmd shim #when resolving serve invocation #then cmd.exe executes the shim", () => {
|
|
362
|
-
// given
|
|
363
|
-
const shimPath = "C:\\Users\\runner\\.omo\\codegraph\\bin\\codegraph.cmd";
|
|
364
|
-
|
|
365
|
-
// when
|
|
366
|
-
const invocation = resolveServeProcessInvocation(shimPath, ["serve", "--mcp"], "win32");
|
|
367
|
-
|
|
368
|
-
// then
|
|
369
|
-
expect(invocation).toEqual({
|
|
370
|
-
args: ["/d", "/s", "/c", shimPath, "serve", "--mcp"],
|
|
371
|
-
command: "cmd.exe",
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
});
|
|
376
|
-
|
|
377
|
-
async function withProcessPlatform(platform: NodeJS.Platform, run: () => Promise<void>): Promise<void> {
|
|
378
|
-
const descriptor = Object.getOwnPropertyDescriptor(process, "platform");
|
|
379
|
-
Object.defineProperty(process, "platform", { configurable: true, enumerable: true, value: platform });
|
|
380
|
-
try {
|
|
381
|
-
await run();
|
|
382
|
-
} finally {
|
|
383
|
-
if (descriptor !== undefined) Object.defineProperty(process, "platform", descriptor);
|
|
384
|
-
}
|
|
385
|
-
}
|
package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts
DELETED
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
|
|
6
|
-
import { runCodegraphSessionStartWorker } from "../src/hook.ts";
|
|
7
|
-
|
|
8
|
-
function writeProjectDatabase(workspace: string): void {
|
|
9
|
-
mkdirSync(join(workspace, ".codegraph"), { recursive: true });
|
|
10
|
-
writeFileSync(join(workspace, ".codegraph", "codegraph.db"), "fixture");
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
describe("CodeGraph SessionStart worker Node support", () => {
|
|
14
|
-
it("#given an unsupported local Node and a PATH CodeGraph command with auto provisioning disabled #when worker runs #then it skips without touching the workspace", async () => {
|
|
15
|
-
// given
|
|
16
|
-
const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-"));
|
|
17
|
-
const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-home-"));
|
|
18
|
-
const outcomes: unknown[] = [];
|
|
19
|
-
|
|
20
|
-
try {
|
|
21
|
-
// when
|
|
22
|
-
const result = await runCodegraphSessionStartWorker({
|
|
23
|
-
config: { codegraph: { auto_provision: false, enabled: true }, sources: [], warnings: [] },
|
|
24
|
-
cwd: workspace,
|
|
25
|
-
env: { HOME: homeDir },
|
|
26
|
-
nodeVersion: "26.3.0",
|
|
27
|
-
logOutcome: (outcome) => outcomes.push(outcome),
|
|
28
|
-
deps: {
|
|
29
|
-
resolveCommand: () => {
|
|
30
|
-
return { argsPrefix: [], command: "/usr/local/bin/codegraph", exists: true, source: "path" };
|
|
31
|
-
},
|
|
32
|
-
ensureProvisioned: () => {
|
|
33
|
-
throw new Error("ensureProvisioned should not run on unsupported Node");
|
|
34
|
-
},
|
|
35
|
-
prepareWorkspace: () => {
|
|
36
|
-
throw new Error("prepareWorkspace should not run on unsupported Node");
|
|
37
|
-
},
|
|
38
|
-
runCommand: () => {
|
|
39
|
-
throw new Error("runCommand should not run on unsupported Node");
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// then
|
|
45
|
-
expect(result).toEqual({ action: "skipped-unsupported-node" });
|
|
46
|
-
expect(existsSync(join(workspace, ".codegraph"))).toBe(false);
|
|
47
|
-
expect(outcomes).toEqual([{ action: "skipped-unsupported-node", projectRoot: workspace }]);
|
|
48
|
-
} finally {
|
|
49
|
-
rmSync(workspace, { recursive: true, force: true });
|
|
50
|
-
rmSync(homeDir, { recursive: true, force: true });
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it("#given an unsupported local Node and a PATH CodeGraph command #when auto provisioning succeeds #then it bootstraps with the provisioned binary", async () => {
|
|
55
|
-
// given
|
|
56
|
-
const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-provision-"));
|
|
57
|
-
const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-node-provision-home-"));
|
|
58
|
-
const binPath = join(homeDir, ".omo", "codegraph", "bin", "codegraph");
|
|
59
|
-
const calls: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
|
|
60
|
-
const provisionCalls: Array<{ readonly installDir?: string; readonly lockDir: string; readonly version: "1.5.0" }> = [];
|
|
61
|
-
const outcomes: unknown[] = [];
|
|
62
|
-
|
|
63
|
-
try {
|
|
64
|
-
// when
|
|
65
|
-
const result = await runCodegraphSessionStartWorker({
|
|
66
|
-
cwd: workspace,
|
|
67
|
-
env: { HOME: homeDir },
|
|
68
|
-
nodeVersion: "26.3.0",
|
|
69
|
-
logOutcome: (outcome) => outcomes.push(outcome),
|
|
70
|
-
deps: {
|
|
71
|
-
ensureGitignored: () => true,
|
|
72
|
-
ensureProvisioned: (options) => {
|
|
73
|
-
provisionCalls.push(options);
|
|
74
|
-
return Promise.resolve({ binPath, provisioned: true });
|
|
75
|
-
},
|
|
76
|
-
prepareWorkspace: () => ({
|
|
77
|
-
dataDir: join(homeDir, ".omo/codegraph/projects/test"),
|
|
78
|
-
dataRoot: join(homeDir, ".omo/codegraph"),
|
|
79
|
-
linked: true,
|
|
80
|
-
mode: "global-linked",
|
|
81
|
-
projectLink: join(workspace, ".codegraph"),
|
|
82
|
-
}),
|
|
83
|
-
resolveCommand: () => ({ argsPrefix: [], command: "/usr/local/bin/codegraph", exists: true, source: "path" }),
|
|
84
|
-
runCommand: (_projectRoot, command, args) => {
|
|
85
|
-
calls.push({ args, command });
|
|
86
|
-
writeProjectDatabase(workspace);
|
|
87
|
-
return Promise.resolve({ exitCode: 0, stdout: "", timedOut: false });
|
|
88
|
-
},
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
// then
|
|
93
|
-
expect(result).toEqual({ action: "initialized" });
|
|
94
|
-
expect(calls).toEqual([{ args: ["init"], command: binPath }]);
|
|
95
|
-
expect(provisionCalls).toEqual([
|
|
96
|
-
{ installDir: join(homeDir, ".omo", "codegraph"), lockDir: join(homeDir, ".omo", "codegraph", ".locks"), version: "1.5.0" },
|
|
97
|
-
]);
|
|
98
|
-
expect(outcomes).toEqual([{ action: "initialized", exitCode: 0, projectRoot: workspace, source: "provisioned", timedOut: false }]);
|
|
99
|
-
} finally {
|
|
100
|
-
rmSync(workspace, { recursive: true, force: true });
|
|
101
|
-
rmSync(homeDir, { recursive: true, force: true });
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it("#given bundled CodeGraph and a stale managed install #when the worker runs #then it upgrades and uses the managed runtime", async () => {
|
|
106
|
-
// given
|
|
107
|
-
const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-managed-upgrade-"));
|
|
108
|
-
const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-managed-upgrade-home-"));
|
|
109
|
-
const installDir = join(homeDir, ".omo", "codegraph");
|
|
110
|
-
const binPath = join(installDir, "bin", "codegraph");
|
|
111
|
-
mkdirSync(join(installDir, "bin"), { recursive: true });
|
|
112
|
-
mkdirSync(join(installDir, ".provisioned"), { recursive: true });
|
|
113
|
-
writeFileSync(binPath, "stale codegraph\n");
|
|
114
|
-
writeFileSync(
|
|
115
|
-
join(installDir, ".provisioned", "codegraph-1.4.1.json"),
|
|
116
|
-
`${JSON.stringify({ binPath, version: "1.4.1" })}\n`,
|
|
117
|
-
);
|
|
118
|
-
const provisionCalls: unknown[] = [];
|
|
119
|
-
const commandCalls: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
// when
|
|
123
|
-
const result = await runCodegraphSessionStartWorker({
|
|
124
|
-
cwd: workspace,
|
|
125
|
-
env: { HOME: homeDir },
|
|
126
|
-
nodeVersion: "22.14.0",
|
|
127
|
-
deps: {
|
|
128
|
-
ensureGitignored: () => true,
|
|
129
|
-
ensureProvisioned: (options) => {
|
|
130
|
-
provisionCalls.push(options);
|
|
131
|
-
return Promise.resolve({ binPath, provisioned: true });
|
|
132
|
-
},
|
|
133
|
-
managedInstallExists: () => true,
|
|
134
|
-
prepareWorkspace: () => ({
|
|
135
|
-
dataDir: join(homeDir, ".omo/codegraph/projects/test"),
|
|
136
|
-
dataRoot: join(homeDir, ".omo/codegraph"),
|
|
137
|
-
linked: true,
|
|
138
|
-
mode: "global-linked",
|
|
139
|
-
projectLink: join(workspace, ".codegraph"),
|
|
140
|
-
}),
|
|
141
|
-
resolveCommand: () => ({ argsPrefix: ["codegraph.js"], command: "/opt/node22/bin/node", exists: true, source: "bundled" }),
|
|
142
|
-
resolveManagedBin: () => null,
|
|
143
|
-
runCommand: (_projectRoot, command, args) => {
|
|
144
|
-
commandCalls.push({ args, command });
|
|
145
|
-
writeProjectDatabase(workspace);
|
|
146
|
-
return Promise.resolve({ exitCode: 0, stdout: "", timedOut: false });
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
});
|
|
150
|
-
|
|
151
|
-
// then
|
|
152
|
-
expect(result).toEqual({ action: "initialized" });
|
|
153
|
-
expect(provisionCalls).toEqual([{ installDir, lockDir: join(installDir, ".locks"), version: "1.5.0" }]);
|
|
154
|
-
expect(commandCalls).toEqual([{ args: ["init"], command: binPath }]);
|
|
155
|
-
} finally {
|
|
156
|
-
rmSync(workspace, { recursive: true, force: true });
|
|
157
|
-
rmSync(homeDir, { recursive: true, force: true });
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("#given an unsupported local Node but bundled CodeGraph resolves through CODEGRAPH_NODE_BIN #when worker runs #then it bootstraps with the compatible runtime", async () => {
|
|
162
|
-
// given
|
|
163
|
-
const workspace = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-compatible-node-"));
|
|
164
|
-
const homeDir = mkdtempSync(join(tmpdir(), "omo-codegraph-worker-compatible-node-home-"));
|
|
165
|
-
const nodeBin = "/opt/node22/bin/node";
|
|
166
|
-
const calls: Array<{ readonly args: readonly string[]; readonly command: string }> = [];
|
|
167
|
-
const outcomes: unknown[] = [];
|
|
168
|
-
|
|
169
|
-
try {
|
|
170
|
-
// when
|
|
171
|
-
const result = await runCodegraphSessionStartWorker({
|
|
172
|
-
cwd: workspace,
|
|
173
|
-
env: { CODEGRAPH_NODE_BIN: nodeBin, HOME: homeDir },
|
|
174
|
-
nodeVersion: "26.3.0",
|
|
175
|
-
logOutcome: (outcome) => outcomes.push(outcome),
|
|
176
|
-
deps: {
|
|
177
|
-
ensureGitignored: () => true,
|
|
178
|
-
ensureProvisioned: () => {
|
|
179
|
-
throw new Error("provisioning should not run when bundled CodeGraph resolved");
|
|
180
|
-
},
|
|
181
|
-
prepareWorkspace: () => ({
|
|
182
|
-
dataDir: join(homeDir, ".omo/codegraph/projects/test"),
|
|
183
|
-
dataRoot: join(homeDir, ".omo/codegraph"),
|
|
184
|
-
linked: true,
|
|
185
|
-
mode: "global-linked",
|
|
186
|
-
projectLink: join(workspace, ".codegraph"),
|
|
187
|
-
}),
|
|
188
|
-
resolveCommand: () => ({ argsPrefix: ["codegraph.js"], command: nodeBin, exists: true, source: "bundled" }),
|
|
189
|
-
runCommand: (_projectRoot, command, args) => {
|
|
190
|
-
calls.push({ args, command });
|
|
191
|
-
writeProjectDatabase(workspace);
|
|
192
|
-
return Promise.resolve({ exitCode: 0, stdout: "", timedOut: false });
|
|
193
|
-
},
|
|
194
|
-
},
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
// then
|
|
198
|
-
expect(result).toEqual({ action: "initialized" });
|
|
199
|
-
expect(calls).toEqual([{ args: ["codegraph.js", "init"], command: nodeBin }]);
|
|
200
|
-
expect(outcomes).toEqual([{ action: "initialized", exitCode: 0, projectRoot: workspace, source: "bundled", timedOut: false }]);
|
|
201
|
-
} finally {
|
|
202
|
-
rmSync(workspace, { recursive: true, force: true });
|
|
203
|
-
rmSync(homeDir, { recursive: true, force: true });
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
});
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { mkdirSync, mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { tmpdir } from "node:os";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
|
|
6
|
-
import { probeCodegraphProject } from "../src/session-start-project.ts";
|
|
7
|
-
|
|
8
|
-
describe("CodeGraph SessionStart project probe", () => {
|
|
9
|
-
it("#given the exact project directory has a CodeGraph database #when probing #then it is initialized", () => {
|
|
10
|
-
// given
|
|
11
|
-
const projectRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-probe-exact-"));
|
|
12
|
-
try {
|
|
13
|
-
mkdirSync(join(projectRoot, ".codegraph"), { recursive: true });
|
|
14
|
-
writeFileSync(join(projectRoot, ".codegraph", "codegraph.db"), "fixture");
|
|
15
|
-
|
|
16
|
-
// when
|
|
17
|
-
const result = probeCodegraphProject(projectRoot);
|
|
18
|
-
|
|
19
|
-
// then
|
|
20
|
-
expect(result).toEqual({ kind: "initialized" });
|
|
21
|
-
} finally {
|
|
22
|
-
rmSync(projectRoot, { recursive: true, force: true });
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
it("#given an ancestor directory has a CodeGraph database #when probing a nested project #then the ancestor covers it", () => {
|
|
27
|
-
// given
|
|
28
|
-
const ancestorRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-probe-ancestor-"));
|
|
29
|
-
const projectRoot = join(ancestorRoot, "apps", "server");
|
|
30
|
-
try {
|
|
31
|
-
mkdirSync(join(ancestorRoot, ".codegraph"), { recursive: true });
|
|
32
|
-
mkdirSync(projectRoot, { recursive: true });
|
|
33
|
-
writeFileSync(join(ancestorRoot, ".codegraph", "codegraph.db"), "fixture");
|
|
34
|
-
|
|
35
|
-
// when
|
|
36
|
-
const result = probeCodegraphProject(projectRoot);
|
|
37
|
-
|
|
38
|
-
// then
|
|
39
|
-
expect(result).toEqual({ ancestorRoot: realpathSync(ancestorRoot), kind: "nested-root" });
|
|
40
|
-
} finally {
|
|
41
|
-
rmSync(ancestorRoot, { recursive: true, force: true });
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it("#given neither the project nor its ancestors have a CodeGraph database #when probing #then it is definitively uninitialized", () => {
|
|
46
|
-
// given
|
|
47
|
-
const projectRoot = mkdtempSync(join(tmpdir(), "omo-codegraph-probe-missing-"));
|
|
48
|
-
try {
|
|
49
|
-
// when
|
|
50
|
-
const result = probeCodegraphProject(projectRoot);
|
|
51
|
-
|
|
52
|
-
// then
|
|
53
|
-
expect(result).toEqual({ kind: "uninitialized" });
|
|
54
|
-
} finally {
|
|
55
|
-
rmSync(projectRoot, { recursive: true, force: true });
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
});
|