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