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,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
- });