oh-my-opencode 5.0.0-beta.34 → 5.0.0-beta.36

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