oh-my-opencode 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 (217) 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 +48342 -48539
  11. package/dist/cli-node/index.js +49017 -49214
  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 -13715
  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 -44883
  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/hook-status-message.mjs +0 -1
  122. package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
  123. package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
  124. package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
  125. package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
  126. package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
  127. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -2
  128. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -1
  129. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +0 -1
  130. package/packages/omo-codex/plugin/test/AGENTS.md +2 -2
  131. package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +2 -21
  132. package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -2
  133. package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
  134. package/packages/omo-codex/plugin/test/auto-update.test.mjs +0 -25
  135. package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
  136. package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +0 -50
  137. package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +0 -1
  138. package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
  139. package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
  140. package/packages/omo-codex/scripts/install-dist/install-local.mjs +227 -435
  141. package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
  142. package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
  143. package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
  144. package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -1
  145. package/dist/config/schema/codegraph.d.ts +0 -12
  146. package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
  147. package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
  148. package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
  149. package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
  150. package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
  151. package/dist/mcp/codegraph.d.ts +0 -16
  152. package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
  153. package/packages/omo-codex/plugin/components/codegraph/LICENSE +0 -21
  154. package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
  155. package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
  156. package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12326
  157. package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9908
  158. package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
  159. package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
  160. package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
  161. package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
  162. package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
  163. package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
  164. package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
  165. package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -310
  166. package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -92
  167. package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
  168. package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
  169. package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
  170. package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
  171. package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
  172. package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -22
  173. package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
  174. package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
  175. package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
  176. package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
  177. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
  178. package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
  179. package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
  180. package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
  181. package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
  182. package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
  183. package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
  184. package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
  185. package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
  186. package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
  187. package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
  188. package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
  189. package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
  190. package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
  191. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
  192. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
  193. package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
  194. package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
  195. package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
  196. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +0 -47
  197. package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
  198. package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
  199. package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
  200. package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
  201. package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
  202. package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
  203. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
  204. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
  205. package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
  206. package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
  207. package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
  208. package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
  209. package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate.test.ts +0 -101
  210. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
  211. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
  212. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
  213. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
  214. package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
  215. package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
  216. package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
  217. package/packages/omo-codex/plugin/test/migrate-omo-sot.test.mjs +0 -179
@@ -1,15 +0,0 @@
1
- import { appendFileSync, mkdirSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
-
4
- import { codegraphDataRoot } from "../../../../../utils/src/codegraph/paths.ts";
5
- import type { CodegraphSessionStartOutcome } from "./hook-types.js";
6
-
7
- export function appendSessionStartOutcome(
8
- homeDir: string,
9
- outcome: CodegraphSessionStartOutcome,
10
- nowMs: number = Date.now(),
11
- ): void {
12
- const path = join(codegraphDataRoot(homeDir), "session-start.jsonl");
13
- mkdirSync(dirname(path), { recursive: true });
14
- appendFileSync(path, `${JSON.stringify({ ...outcome, timestamp: new Date(nowMs).toISOString() })}\n`);
15
- }
@@ -1,32 +0,0 @@
1
- import { basename, dirname, join } from "node:path";
2
-
3
- import {
4
- canonicalizeCodegraphPath,
5
- resolveCodegraphWorkspacePaths,
6
- } from "../../../../../utils/src/codegraph/paths.ts";
7
-
8
- export interface SessionStartStatePaths {
9
- readonly canonicalProjectRoot: string;
10
- readonly cooldownPath: string;
11
- readonly lockPath: string;
12
- readonly outcomePath: string;
13
- readonly stateDirectory: string;
14
- }
15
-
16
- export function resolveSessionStartStatePaths(homeDir: string, projectRoot: string): SessionStartStatePaths {
17
- const canonicalProjectRoot = canonicalizeCodegraphPath(projectRoot);
18
- const workspacePaths = resolveCodegraphWorkspacePaths(canonicalProjectRoot, { homeDir });
19
- const projectKey = basename(workspacePaths.dataDir);
20
- const stateDirectory = join(workspacePaths.dataRoot, "session-start");
21
- return {
22
- canonicalProjectRoot,
23
- cooldownPath: join(stateDirectory, "cooldowns", `${projectKey}.json`),
24
- lockPath: join(stateDirectory, "locks", `${projectKey}.lock`),
25
- outcomePath: join(workspacePaths.dataRoot, "session-start.jsonl"),
26
- stateDirectory,
27
- };
28
- }
29
-
30
- export function stateParent(path: string): string {
31
- return dirname(path);
32
- }
@@ -1,109 +0,0 @@
1
- import { realpathSync, statSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
-
4
- export type CodegraphProjectState =
5
- | { readonly kind: "inconclusive"; readonly reason: string }
6
- | { readonly kind: "initialized" }
7
- | { readonly ancestorRoot: string; readonly kind: "nested-root" }
8
- | { readonly kind: "uninitialized" };
9
-
10
- export type CodegraphAncestorState = Exclude<CodegraphProjectState, { readonly kind: "initialized" }>;
11
- export type CodegraphExactProjectState = Extract<
12
- CodegraphProjectState,
13
- { readonly kind: "inconclusive" | "initialized" | "uninitialized" }
14
- >;
15
-
16
- type DatabaseState =
17
- | { readonly kind: "inconclusive"; readonly reason: string }
18
- | { readonly kind: "missing" }
19
- | { readonly kind: "present" };
20
-
21
- export interface CodegraphProjectProbeOptions {
22
- readonly probeDatabase?: (directory: string) => DatabaseState;
23
- }
24
-
25
- export function probeCodegraphProject(
26
- projectRoot: string,
27
- options: CodegraphProjectProbeOptions = {},
28
- ): CodegraphProjectState {
29
- const resolved = resolveProjectRoot(projectRoot);
30
- if (resolved.kind === "inconclusive") return resolved;
31
-
32
- const probeDatabase = options.probeDatabase ?? probeDatabaseAt;
33
- const exact = probeResolvedExactProject(resolved.projectRoot, probeDatabase);
34
- if (exact.kind !== "uninitialized") return exact;
35
- return probeResolvedAncestors(resolved.projectRoot, probeDatabase);
36
- }
37
-
38
- export function probeExactCodegraphProject(
39
- projectRoot: string,
40
- options: CodegraphProjectProbeOptions = {},
41
- ): CodegraphExactProjectState {
42
- const resolved = resolveProjectRoot(projectRoot);
43
- if (resolved.kind === "inconclusive") return resolved;
44
- return probeResolvedExactProject(resolved.projectRoot, options.probeDatabase ?? probeDatabaseAt);
45
- }
46
-
47
- export function probeCodegraphAncestors(
48
- projectRoot: string,
49
- options: CodegraphProjectProbeOptions = {},
50
- ): CodegraphAncestorState {
51
- const resolved = resolveProjectRoot(projectRoot);
52
- if (resolved.kind === "inconclusive") return resolved;
53
- return probeResolvedAncestors(resolved.projectRoot, options.probeDatabase ?? probeDatabaseAt);
54
- }
55
-
56
- function probeResolvedExactProject(
57
- projectRoot: string,
58
- probeDatabase: (directory: string) => DatabaseState,
59
- ): CodegraphExactProjectState {
60
- const exact = probeDatabase(projectRoot);
61
- if (exact.kind === "present") return { kind: "initialized" };
62
- if (exact.kind === "inconclusive") return exact;
63
- return { kind: "uninitialized" };
64
- }
65
-
66
- function probeResolvedAncestors(
67
- projectRoot: string,
68
- probeDatabase: (directory: string) => DatabaseState,
69
- ): CodegraphAncestorState {
70
- let ancestorRoot = dirname(projectRoot);
71
- while (ancestorRoot !== projectRoot) {
72
- const database = probeDatabase(ancestorRoot);
73
- if (database.kind === "present") return { ancestorRoot, kind: "nested-root" };
74
- if (database.kind === "inconclusive") return database;
75
- const parent = dirname(ancestorRoot);
76
- if (parent === ancestorRoot) break;
77
- ancestorRoot = parent;
78
- }
79
- return { kind: "uninitialized" };
80
- }
81
-
82
- function resolveProjectRoot(projectRoot: string):
83
- | { readonly kind: "inconclusive"; readonly reason: string }
84
- | { readonly kind: "resolved"; readonly projectRoot: string } {
85
- try {
86
- return { kind: "resolved", projectRoot: realpathSync(projectRoot) };
87
- } catch (error) {
88
- if (error instanceof Error) return { kind: "inconclusive", reason: error.message };
89
- throw error;
90
- }
91
- }
92
-
93
- function probeDatabaseAt(directory: string): DatabaseState {
94
- try {
95
- statSync(join(directory, ".codegraph", "codegraph.db"));
96
- return { kind: "present" };
97
- } catch (error) {
98
- if (!(error instanceof Error)) throw error;
99
- const code = errorCode(error);
100
- if (code === "ENOENT" || code === "ENOTDIR") return { kind: "missing" };
101
- return { kind: "inconclusive", reason: error.message };
102
- }
103
- }
104
-
105
- function errorCode(error: unknown): string | undefined {
106
- if (typeof error !== "object" || error === null) return undefined;
107
- const code = Reflect.get(error, "code");
108
- return typeof code === "string" ? code : undefined;
109
- }
@@ -1,148 +0,0 @@
1
- import { env as processEnv, stderr as processStderr } from "node:process";
2
-
3
- import type { CodegraphCommandResolution } from "../../../../../utils/src/codegraph/resolve.ts";
4
- import type { CodegraphSessionStartOutcome, WorkerAction } from "./hook-types.js";
5
- import {
6
- clearSessionStartCooldown,
7
- recordSessionStartFailure,
8
- type SessionStartFailureAction,
9
- } from "./session-start-cooldown.js";
10
- import type { CodegraphProjectState } from "./session-start-project.js";
11
-
12
- export type WorkerResultContext = {
13
- readonly baseCooldownMs: number;
14
- readonly homeDir: string;
15
- readonly logOutcome: (outcome: CodegraphSessionStartOutcome) => void;
16
- readonly nowMs: () => number;
17
- readonly projectRoot: string;
18
- };
19
-
20
- export type WorkerRunResult = {
21
- readonly action: WorkerAction;
22
- readonly releaseLock: boolean;
23
- };
24
-
25
- export function finishWorkerProjectState(
26
- state: CodegraphProjectState,
27
- context: WorkerResultContext,
28
- ): WorkerRunResult | null {
29
- switch (state.kind) {
30
- case "inconclusive":
31
- return finishWorkerFailure("skipped-probe-error", "skipped-probe-error", {
32
- error: state.reason,
33
- projectRoot: context.projectRoot,
34
- }, context);
35
- case "initialized":
36
- return finishWorkerSuccess("skipped-initialized", { projectRoot: context.projectRoot }, context);
37
- case "nested-root":
38
- return finishWorkerSuccess("skipped-nested-root", {
39
- ancestorRoot: state.ancestorRoot,
40
- projectRoot: context.projectRoot,
41
- }, context);
42
- case "uninitialized":
43
- return null;
44
- }
45
- }
46
-
47
- export function finishWorkerInitialization(
48
- state: CodegraphProjectState,
49
- detail: {
50
- readonly exitCode: number;
51
- readonly source: CodegraphCommandResolution["source"];
52
- },
53
- context: WorkerResultContext,
54
- ): WorkerRunResult {
55
- switch (state.kind) {
56
- case "inconclusive":
57
- return finishWorkerFailure("skipped-probe-error", "skipped-probe-error", {
58
- error: state.reason,
59
- ...detail,
60
- projectRoot: context.projectRoot,
61
- timedOut: false,
62
- }, context);
63
- case "initialized":
64
- return finishWorkerSuccess("initialized", {
65
- ...detail,
66
- projectRoot: context.projectRoot,
67
- timedOut: false,
68
- }, context);
69
- case "nested-root":
70
- return finishWorkerFailure("failed", "failed", {
71
- ...detail,
72
- error: `codegraph init resolved to ancestor database at ${state.ancestorRoot}`,
73
- projectRoot: context.projectRoot,
74
- timedOut: false,
75
- }, context);
76
- case "uninitialized":
77
- return finishWorkerFailure("failed", "failed", {
78
- ...detail,
79
- error: "codegraph init completed without creating an exact project database",
80
- projectRoot: context.projectRoot,
81
- timedOut: false,
82
- }, context);
83
- }
84
- }
85
-
86
- export function finishWorkerFailure(
87
- action: WorkerAction,
88
- failureAction: SessionStartFailureAction,
89
- detail: Omit<CodegraphSessionStartOutcome, "action">,
90
- context: WorkerResultContext,
91
- ): WorkerRunResult {
92
- let releaseLock = true;
93
- try {
94
- recordSessionStartFailure({
95
- action: failureAction,
96
- baseCooldownMs: context.baseCooldownMs,
97
- homeDir: context.homeDir,
98
- nowMs: context.nowMs(),
99
- projectRoot: context.projectRoot,
100
- });
101
- } catch (error) {
102
- if (error instanceof Error) releaseLock = false;
103
- else throw error;
104
- }
105
- safeLogWorkerOutcome(context.logOutcome, { ...detail, action });
106
- return { action, releaseLock };
107
- }
108
-
109
- export function finishWorkerSuccess(
110
- action: WorkerAction,
111
- detail: Omit<CodegraphSessionStartOutcome, "action">,
112
- context: WorkerResultContext,
113
- ): WorkerRunResult {
114
- try {
115
- clearSessionStartCooldown({ homeDir: context.homeDir, projectRoot: context.projectRoot });
116
- } catch (error) {
117
- if (error instanceof Error) writeDebugLog(`failed to clear SessionStart cooldown: ${error.message}`);
118
- else throw error;
119
- }
120
- safeLogWorkerOutcome(context.logOutcome, { ...detail, action });
121
- return { action, releaseLock: true };
122
- }
123
-
124
- export function finishWorkerNeutral(
125
- action: WorkerAction,
126
- detail: Omit<CodegraphSessionStartOutcome, "action">,
127
- context: WorkerResultContext,
128
- ): WorkerRunResult {
129
- safeLogWorkerOutcome(context.logOutcome, { ...detail, action });
130
- return { action, releaseLock: true };
131
- }
132
-
133
- export function safeLogWorkerOutcome(
134
- logOutcome: (outcome: CodegraphSessionStartOutcome) => void,
135
- outcome: CodegraphSessionStartOutcome,
136
- ): void {
137
- try {
138
- logOutcome(outcome);
139
- } catch (error) {
140
- if (error instanceof Error) processStderr.write(`[codegraph-session-start] failed to write outcome: ${error.message}\n`);
141
- else throw error;
142
- }
143
- }
144
-
145
- function writeDebugLog(message: string): void {
146
- if (processEnv["OMO_CODEGRAPH_DEBUG"] !== "1") return;
147
- processStderr.write(`[codegraph-session-start] ${message}\n`);
148
- }
@@ -1,175 +0,0 @@
1
- import { homedir } from "node:os";
2
- import { cwd as processCwd, env as processEnv } from "node:process";
3
-
4
- import { getCodexOmoConfig } from "../../../shared/src/config-loader.ts";
5
- import { hasCodegraphManagedInstall, resolvePinnedCodegraphBin } from "../../../../../utils/src/codegraph/managed-runtime.ts";
6
- import { evaluateCodegraphNodeSupport, type CodegraphNodeSupport } from "../../../../../utils/src/codegraph/node-support.ts";
7
- import { ensureCodegraphProvisioned } from "../../../../../utils/src/codegraph/provision.ts";
8
- import { resolveCodegraphCommand } from "../../../../../utils/src/codegraph/resolve.ts";
9
- import { ensureCodegraphGitignored, prepareCodegraphWorkspace } from "../../../../../utils/src/codegraph/workspace.ts";
10
- import type {
11
- CodegraphSessionStartDeps,
12
- CodegraphSessionStartOutcome,
13
- SessionStartWorkerOptions,
14
- WorkerAction,
15
- } from "./hook-types.js";
16
- import {
17
- resolveSessionStartCommand,
18
- runSessionStartCodegraphCommand,
19
- SESSION_START_COMMAND_TIMEOUT_MS,
20
- sessionStartCodegraphEnv,
21
- type CodegraphBootstrapConfig,
22
- } from "./session-start-command.js";
23
- import { DEFAULT_SESSION_START_COOLDOWN_MS } from "./session-start-cooldown.js";
24
- import { releaseSessionStartLock, sessionStartLockIsOwned, type SessionStartLock } from "./session-start-lock.js";
25
- import { appendSessionStartOutcome } from "./session-start-outcome.js";
26
- import { resolveSessionStartStatePaths } from "./session-start-paths.js";
27
- import { probeCodegraphProject, type CodegraphProjectState } from "./session-start-project.js";
28
- import {
29
- finishWorkerFailure,
30
- finishWorkerInitialization,
31
- finishWorkerNeutral,
32
- finishWorkerProjectState,
33
- safeLogWorkerOutcome,
34
- type WorkerResultContext,
35
- type WorkerRunResult,
36
- } from "./session-start-worker-result.js";
37
-
38
- export const SESSION_START_CWD_ENV = "OMO_CODEGRAPH_SESSION_START_CWD";
39
- export const SESSION_START_LOCK_TOKEN_ENV = "OMO_CODEGRAPH_SESSION_START_LOCK_TOKEN";
40
-
41
- type WorkerContext = WorkerResultContext & {
42
- readonly config: CodegraphBootstrapConfig;
43
- readonly deps: CodegraphSessionStartDeps;
44
- readonly env: Record<string, string | undefined>;
45
- readonly probeProject: (projectRoot: string) => CodegraphProjectState;
46
- };
47
-
48
- const defaultDeps: CodegraphSessionStartDeps = {
49
- ensureGitignored: ensureCodegraphGitignored,
50
- ensureProvisioned: ensureCodegraphProvisioned,
51
- managedInstallExists: hasCodegraphManagedInstall,
52
- prepareWorkspace: prepareCodegraphWorkspace,
53
- resolveCommand: resolveCodegraphCommand,
54
- resolveManagedBin: resolvePinnedCodegraphBin,
55
- runCommand: runSessionStartCodegraphCommand,
56
- };
57
-
58
- export async function runCodegraphSessionStartWorker(options: SessionStartWorkerOptions = {}): Promise<{ readonly action: WorkerAction }> {
59
- const env = options.env ?? processEnv;
60
- const homeDir = resolveHomeDir(env);
61
- const projectRoot = options.cwd ?? env[SESSION_START_CWD_ENV] ?? processCwd();
62
- const config = options.config ?? getCodexOmoConfig({ cwd: projectRoot, env, homeDir });
63
- const lock = resolveWorkerLock(homeDir, projectRoot, env[SESSION_START_LOCK_TOKEN_ENV]);
64
- if (lock !== null && !sessionStartLockIsOwned(lock)) {
65
- const outcome = { action: "skipped-locked", projectRoot } satisfies CodegraphSessionStartOutcome;
66
- safeLogWorkerOutcome(options.logOutcome ?? ((value) => appendSessionStartOutcome(homeDir, value)), outcome);
67
- return { action: "skipped-locked" };
68
- }
69
-
70
- const customResolutionDeps = options.deps?.resolveCommand === undefined
71
- ? {}
72
- : {
73
- managedInstallExists: options.deps.managedInstallExists ?? (() => false),
74
- resolveManagedBin: options.deps.resolveManagedBin ?? (() => null),
75
- };
76
- const context: WorkerContext = {
77
- baseCooldownMs: config.codegraph?.session_start_cooldown_ms ?? DEFAULT_SESSION_START_COOLDOWN_MS,
78
- config: {
79
- ...(config.codegraph ?? {}),
80
- ...(config.trustedCodegraphInstallDir === undefined ? {} : { trustedCodegraphInstallDir: config.trustedCodegraphInstallDir }),
81
- },
82
- deps: { ...defaultDeps, ...customResolutionDeps, ...options.deps },
83
- env,
84
- homeDir,
85
- logOutcome: options.logOutcome ?? ((outcome) => appendSessionStartOutcome(homeDir, outcome)),
86
- nowMs: () => options.nowMs ?? Date.now(),
87
- probeProject: options.projectProbe ?? probeCodegraphProject,
88
- projectRoot,
89
- };
90
-
91
- let result: WorkerRunResult;
92
- if (config.codegraph?.enabled === false) {
93
- result = finishWorkerNeutral("skipped-disabled", { projectRoot }, context);
94
- } else {
95
- const nodeSupport = evaluateCodegraphNodeSupport({ env, nodeVersion: options.nodeVersion });
96
- result = await runBootstrap(context, nodeSupport);
97
- }
98
- if (lock !== null && result.releaseLock) releaseSessionStartLock(lock);
99
- return { action: result.action };
100
- }
101
-
102
- async function runBootstrap(context: WorkerContext, nodeSupport: CodegraphNodeSupport): Promise<WorkerRunResult> {
103
- try {
104
- const projectState = context.probeProject(context.projectRoot);
105
- const projectDecision = finishWorkerProjectState(projectState, context);
106
- if (projectDecision !== null) return projectDecision;
107
-
108
- const command = await resolveSessionStartCommand({
109
- config: context.config,
110
- deps: context.deps,
111
- env: context.env,
112
- homeDir: context.homeDir,
113
- nodeSupport,
114
- });
115
- if (command.kind === "unavailable") {
116
- return finishWorkerFailure("skipped-unavailable", "skipped-unavailable", {
117
- error: command.error,
118
- projectRoot: context.projectRoot,
119
- source: command.source,
120
- }, context);
121
- }
122
- if (command.kind === "unsupported-node") {
123
- return finishWorkerFailure("skipped-unsupported-node", "skipped-unsupported-node", { projectRoot: context.projectRoot }, context);
124
- }
125
-
126
- context.deps.prepareWorkspace(context.projectRoot, { homeDir: context.homeDir });
127
- context.deps.ensureGitignored(context.projectRoot);
128
- const preparedState = context.probeProject(context.projectRoot);
129
- const preparedDecision = finishWorkerProjectState(preparedState, context);
130
- if (preparedDecision !== null) return preparedDecision;
131
-
132
- const action = await context.deps.runCommand(
133
- context.projectRoot,
134
- command.resolution.command,
135
- [...command.resolution.argsPrefix, "init"],
136
- { env: sessionStartCodegraphEnv(context.config, context.homeDir), timeoutMs: SESSION_START_COMMAND_TIMEOUT_MS },
137
- );
138
- if (action.timedOut) {
139
- return finishWorkerFailure("failed", "timeout", {
140
- error: "codegraph init timed out",
141
- exitCode: action.exitCode,
142
- projectRoot: context.projectRoot,
143
- source: command.resolution.source,
144
- timedOut: true,
145
- }, context);
146
- }
147
- if (action.exitCode !== 0) {
148
- return finishWorkerFailure("failed", "failed", {
149
- error: `codegraph init exited ${action.exitCode}`,
150
- exitCode: action.exitCode,
151
- projectRoot: context.projectRoot,
152
- source: command.resolution.source,
153
- timedOut: false,
154
- }, context);
155
- }
156
- return finishWorkerInitialization(context.probeProject(context.projectRoot), {
157
- exitCode: action.exitCode,
158
- source: command.resolution.source,
159
- }, context);
160
- } catch (error) {
161
- return finishWorkerFailure("failed", "failed", {
162
- error: error instanceof Error ? error.message : String(error),
163
- projectRoot: context.projectRoot,
164
- }, context);
165
- }
166
- }
167
-
168
- function resolveWorkerLock(homeDir: string, projectRoot: string, token: string | undefined): SessionStartLock | null {
169
- if (token === undefined || token.length === 0) return null;
170
- return { path: resolveSessionStartStatePaths(homeDir, projectRoot).lockPath, token };
171
- }
172
-
173
- function resolveHomeDir(env: Record<string, string | undefined>): string {
174
- return env["HOME"] ?? env["USERPROFILE"] ?? homedir();
175
- }
@@ -1,81 +0,0 @@
1
- import type { HookStdout } from "./hook-types.js";
2
- import {
3
- sweepCodegraphZombies,
4
- type CodegraphZombieProcess,
5
- type SweepCodegraphZombiesOptions,
6
- type SweepCodegraphZombiesResult,
7
- } from "../../../../../utils/src/codegraph/process-sweep.ts";
8
-
9
- export interface RunCodegraphSweepCliOptions extends SweepCodegraphZombiesOptions {
10
- readonly argv?: readonly string[];
11
- readonly stdout?: HookStdout;
12
- }
13
-
14
- interface SweepCliArgs {
15
- readonly dryRun: boolean;
16
- readonly force: boolean;
17
- readonly roots: readonly string[];
18
- }
19
-
20
- export async function runCodegraphSweepCli(options: RunCodegraphSweepCliOptions = {}): Promise<number> {
21
- const args = parseSweepCliArgs(options.argv ?? process.argv);
22
- const result = await sweepCodegraphZombies({
23
- ...options,
24
- dryRun: args.dryRun,
25
- extraRoots: args.roots,
26
- force: args.force,
27
- ...(args.roots.length > 0 ? { ownedRoots: args.roots } : {}),
28
- });
29
- writeSweepReport(options.stdout ?? process.stdout, result);
30
- return result.action === "failed" ? 1 : 0;
31
- }
32
-
33
- function parseSweepCliArgs(argv: readonly string[]): SweepCliArgs {
34
- const roots: string[] = [];
35
- let dryRun = false;
36
- let force = false;
37
- for (let index = 3; index < argv.length; index += 1) {
38
- const arg = argv[index];
39
- if (arg === "--dry-run") {
40
- dryRun = true;
41
- continue;
42
- }
43
- if (arg === "--force") {
44
- force = true;
45
- continue;
46
- }
47
- if (arg === "--root") {
48
- const value = argv[index + 1];
49
- if (value !== undefined && value.trim().length > 0) roots.push(value);
50
- index += 1;
51
- }
52
- }
53
- return { dryRun, force, roots };
54
- }
55
-
56
- function writeSweepReport(stdout: HookStdout, result: SweepCodegraphZombiesResult): void {
57
- stdout.write(`${JSON.stringify({
58
- action: result.action,
59
- candidates: result.candidates.map(formatProcess),
60
- dryRun: result.dryRun,
61
- failed: result.failed,
62
- killed: result.killed.map(formatProcess),
63
- ownedRoots: result.ownedRoots,
64
- spared: result.spared.map(formatProcess),
65
- stampFile: result.stampFile,
66
- })}\n`);
67
- }
68
-
69
- function formatProcess(processInfo: CodegraphZombieProcess): {
70
- readonly matchKind: string;
71
- readonly matchedRoot: string;
72
- readonly pid: number;
73
- readonly ppid: number;
74
- } {
75
- return {
76
- matchKind: processInfo.matchKind,
77
- matchedRoot: processInfo.matchedRoot,
78
- pid: processInfo.pid,
79
- ppid: processInfo.ppid,
80
- };
81
- }
@@ -1,34 +0,0 @@
1
- import { describe, expect, it } from "bun:test";
2
-
3
- import { pruneCodegraphProjectStoresBestEffort } from "../src/cache-gc.ts";
4
-
5
- describe("CodeGraph cache GC wrapper", () => {
6
- it("#given cache GC hits an expected filesystem race #when best-effort wrapper runs #then it logs and continues", () => {
7
- const logs: string[] = [];
8
- const error = Object.assign(new Error("project cache vanished"), { code: "ENOENT" });
9
-
10
- pruneCodegraphProjectStoresBestEffort("/home/test", {
11
- debugLog: (message) => logs.push(message),
12
- prune: () => {
13
- throw error;
14
- },
15
- });
16
-
17
- expect(logs).toEqual(["CodeGraph cache GC skipped: project cache vanished"]);
18
- });
19
-
20
- it("#given cache GC hits an unknown code bug #when best-effort wrapper runs #then it rethrows", () => {
21
- const logs: string[] = [];
22
- const error = new Error("metadata invariant broken");
23
-
24
- expect(() =>
25
- pruneCodegraphProjectStoresBestEffort("/home/test", {
26
- debugLog: (message) => logs.push(message),
27
- prune: () => {
28
- throw error;
29
- },
30
- }),
31
- ).toThrow("metadata invariant broken");
32
- expect(logs).toEqual([]);
33
- });
34
- });