lazycodex-ai 5.0.0-beta.34 → 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.
Files changed (187) hide show
  1. package/README.ja.md +1 -1
  2. package/README.ko.md +1 -1
  3. package/README.md +1 -1
  4. package/README.ru.md +1 -1
  5. package/README.zh-cn.md +1 -1
  6. package/dist/cli/index.js +48342 -48539
  7. package/dist/cli-node/index.js +49017 -49214
  8. package/package.json +2 -4
  9. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -3
  10. package/packages/omo-codex/plugin/.mcp.json +0 -6
  11. package/packages/omo-codex/plugin/AGENTS.md +5 -5
  12. package/packages/omo-codex/plugin/README.md +1 -1
  13. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1 -15
  14. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  15. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  16. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  17. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  18. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  19. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
  23. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  24. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  25. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  27. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +1 -1
  31. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +2 -2
  34. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +0 -1
  37. package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
  38. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
  39. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -1
  41. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +2 -2
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
  43. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
  44. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +1 -0
  45. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -0
  46. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +10 -3
  47. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +35 -38
  48. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +278 -193
  49. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +5 -0
  50. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +7 -51
  51. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +39 -22
  52. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
  53. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +64 -8
  54. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +37 -18
  56. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  57. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  58. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -1
  59. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
  60. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +6 -0
  61. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +10 -3
  62. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +32 -63
  63. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +7 -53
  64. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +50 -31
  65. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +67 -14
  66. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
  67. package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +36 -17
  68. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +26 -0
  69. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +47 -2
  70. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
  71. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
  72. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
  73. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
  74. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  89. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  90. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
  91. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  92. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  93. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  94. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  95. package/packages/omo-codex/plugin/package-lock.json +12 -146
  96. package/packages/omo-codex/plugin/package.json +1 -2
  97. package/packages/omo-codex/plugin/scripts/AGENTS.md +0 -1
  98. package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +0 -1
  99. package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
  100. package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
  101. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  102. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  103. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  104. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
  105. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  106. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -2
  107. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -1
  108. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +0 -1
  109. package/packages/omo-codex/plugin/test/AGENTS.md +2 -2
  110. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +2 -21
  111. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -2
  112. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  113. package/packages/omo-codex/plugin/test/auto-update.test.mjs +0 -25
  114. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  115. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +0 -50
  116. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +0 -1
  117. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  118. package/packages/omo-codex/scripts/install-dist/install-local.mjs +227 -435
  119. package/packages/prompts-core/prompts/ultrawork/codex.md +2 -2
  120. package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
  121. package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -1
  122. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  123. package/packages/omo-codex/plugin/components/codegraph/LICENSE +0 -21
  124. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  125. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  126. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12326
  127. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9908
  128. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  129. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  130. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  131. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  132. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  133. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  134. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  135. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -310
  136. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -92
  137. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  138. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  139. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  140. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  141. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  142. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -22
  143. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  144. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  145. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  146. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  147. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  148. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  149. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  150. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  151. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  152. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  153. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  154. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  155. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  156. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  157. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  158. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  159. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  160. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  161. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  162. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  163. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  164. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  165. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  166. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +0 -47
  167. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  168. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  169. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  170. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  171. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  172. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  173. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  174. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  175. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  176. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  177. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  178. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  179. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate.test.ts +0 -101
  180. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  181. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  182. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  183. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  184. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  185. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  186. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  187. 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
- }
@@ -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
- });