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.
- package/.agents/skills/codex-qa/scripts/lsp-e2e.sh +1 -3
- package/.agents/skills/opencode-qa/scripts/lsp-e2e.sh +1 -1
- package/.agents/skills/tech-debt-audit/SKILL.md +6 -76
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.ru.md +1 -1
- package/README.zh-cn.md +1 -1
- package/THIRD-PARTY-NOTICES.md +27 -99
- package/dist/cli/index.js +48350 -48559
- package/dist/cli-node/index.js +48480 -48689
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/hooks.d.ts +0 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +0 -10
- package/dist/config/schema.d.ts +0 -1
- package/dist/create-hooks.d.ts +0 -1
- package/dist/hooks/index.d.ts +0 -1
- package/dist/index.js +11675 -13742
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/types.d.ts +0 -1
- package/dist/oh-my-opencode.schema.json +1 -45
- package/dist/plugin/hooks/create-core-hooks.d.ts +0 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +1 -2
- package/dist/shared/omo-process-sweep.d.ts +2 -4
- package/dist/skills/init-deep/SKILL.md +13 -13
- package/dist/skills/ulw-plan/SKILL.md +0 -1
- package/dist/tui.js +44809 -44910
- package/package.json +16 -18
- package/packages/omo-codex/THIRD-PARTY-NOTICES.md +0 -17
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -3
- package/packages/omo-codex/plugin/.mcp.json +0 -6
- package/packages/omo-codex/plugin/AGENTS.md +5 -5
- package/packages/omo-codex/plugin/README.md +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +1 -15
- package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
- package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
- package/packages/omo-codex/plugin/components/lcx/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
- package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/rules/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
- package/packages/omo-codex/plugin/components/teammode/test/thread-title-hook.test.ts +1 -1
- package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/dist/cli.js +2 -2
- package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +0 -1
- package/packages/omo-codex/plugin/components/ultrawork/src/directive-content.ts +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/README.md +11 -1
- package/packages/omo-codex/plugin/components/ulw-loop/directive.md +2 -2
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.d.ts +12 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-codex-validation.js +45 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.d.ts +1 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-reconciliation.js +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint.js +35 -38
- package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +278 -193
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.d.ts +5 -0
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-aggregate.js +7 -51
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-artifacts.js +39 -22
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.d.ts +13 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-fields.js +64 -8
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate-verdicts.js +5 -1
- package/packages/omo-codex/plugin/components/ulw-loop/dist/quality-gate.js +37 -18
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
- package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-codex-validation.ts +81 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-reconciliation.ts +6 -0
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +10 -3
- package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint.ts +32 -63
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-aggregate.ts +7 -53
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-artifacts.ts +50 -31
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-fields.ts +67 -14
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate-verdicts.ts +6 -1
- package/packages/omo-codex/plugin/components/ulw-loop/src/quality-gate.ts +36 -17
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-final.test.ts +26 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +47 -2
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate-basics.test.ts +258 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-cap-and-dedupe.test.ts +22 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-poisoning-cascades.test.ts +97 -0
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-single-report.test.ts +241 -0
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
- package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
- package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-checking-ulw-execute-continuation.json +1 -1
- package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
- package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
- package/packages/omo-codex/plugin/package-lock.json +12 -146
- package/packages/omo-codex/plugin/package.json +1 -2
- package/packages/omo-codex/plugin/scripts/AGENTS.md +0 -1
- package/packages/omo-codex/plugin/scripts/auto-update-plan.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/auto-update.mjs +0 -9
- package/packages/omo-codex/plugin/scripts/canonical-ultrawork-directive.mjs +17 -0
- package/packages/omo-codex/plugin/scripts/hook-status-message.mjs +0 -1
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +2 -8
- package/packages/omo-codex/plugin/shared/src/config-loader.ts +2 -102
- package/packages/omo-codex/plugin/shared/src/config-migration.ts +0 -1
- package/packages/omo-codex/plugin/shared/test/config-loader.test.ts +41 -130
- package/packages/omo-codex/plugin/skills/init-deep/SKILL.md +13 -13
- package/packages/omo-codex/plugin/skills/lcx-doctor/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +2 -2
- package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -1
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +0 -1
- package/packages/omo-codex/plugin/test/AGENTS.md +2 -2
- package/packages/omo-codex/plugin/test/aggregate-hooks.test.mjs +2 -21
- package/packages/omo-codex/plugin/test/aggregate-manifest.test.mjs +1 -2
- package/packages/omo-codex/plugin/test/aggregate-mcp.test.mjs +2 -7
- package/packages/omo-codex/plugin/test/auto-update.test.mjs +0 -25
- package/packages/omo-codex/plugin/test/bootstrap-setup.test.mjs +0 -31
- package/packages/omo-codex/plugin/test/canonical-ultrawork-directive.test.mjs +53 -0
- package/packages/omo-codex/plugin/test/component-bundled-cli.test.mjs +0 -50
- package/packages/omo-codex/plugin/test/hook-status-message.test.mjs +0 -1
- package/packages/omo-codex/plugin/test/mcp-research-servers.test.mjs +1 -3
- package/packages/omo-codex/scripts/install-cache-copy.test.mjs +27 -1
- package/packages/omo-codex/scripts/install-config-git-bash.test.mjs +0 -23
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +238 -431
- package/packages/omo-codex/scripts/install-git-bash-mcp-env.test.mjs +1 -25
- package/packages/omo-codex/scripts/install-mcp-runtime.test.mjs +0 -36
- package/packages/shared-skills/skills/init-deep/SKILL.md +13 -13
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +0 -1
- package/dist/config/schema/codegraph.d.ts +0 -12
- package/dist/hooks/codegraph-bootstrap/command-runner.d.ts +0 -17
- package/dist/hooks/codegraph-bootstrap/hook.d.ts +0 -35
- package/dist/hooks/codegraph-bootstrap/index.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/project-root.d.ts +0 -1
- package/dist/hooks/codegraph-bootstrap/status.d.ts +0 -11
- package/dist/mcp/codegraph.d.ts +0 -16
- package/packages/omo-codex/plugin/components/codegraph/AGENTS.md +0 -58
- package/packages/omo-codex/plugin/components/codegraph/LICENSE +0 -21
- package/packages/omo-codex/plugin/components/codegraph/NODE-RUNTIME-LICENSES.md +0 -2951
- package/packages/omo-codex/plugin/components/codegraph/NOTICE +0 -16
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +0 -12326
- package/packages/omo-codex/plugin/components/codegraph/dist/serve.js +0 -9908
- package/packages/omo-codex/plugin/components/codegraph/package.json +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/cache-gc.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/cli.ts +0 -79
- package/packages/omo-codex/plugin/components/codegraph/src/hook-input.ts +0 -33
- package/packages/omo-codex/plugin/components/codegraph/src/hook-sweep.ts +0 -25
- package/packages/omo-codex/plugin/components/codegraph/src/hook-types.ts +0 -131
- package/packages/omo-codex/plugin/components/codegraph/src/hook.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-bridge.ts +0 -310
- package/packages/omo-codex/plugin/components/codegraph/src/mcp-unavailable.ts +0 -92
- package/packages/omo-codex/plugin/components/codegraph/src/post-tool-use-hook.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/src/serve-invocation.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/src/serve.ts +0 -263
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-command.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-cooldown.ts +0 -145
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-hook-runtime.ts +0 -22
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-lock.ts +0 -139
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-outcome.ts +0 -15
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-paths.ts +0 -32
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-project.ts +0 -109
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker-result.ts +0 -148
- package/packages/omo-codex/plugin/components/codegraph/src/session-start-worker.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/src/sweep-cli.ts +0 -81
- package/packages/omo-codex/plugin/components/codegraph/test/cache-gc.test.ts +0 -34
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +0 -112
- package/packages/omo-codex/plugin/components/codegraph/test/hook-registration.test.ts +0 -26
- package/packages/omo-codex/plugin/components/codegraph/test/hook-session-start-guard.test.ts +0 -160
- package/packages/omo-codex/plugin/components/codegraph/test/hook-store-upgrade.test.ts +0 -50
- package/packages/omo-codex/plugin/components/codegraph/test/hook-sweep.test.ts +0 -29
- package/packages/omo-codex/plugin/components/codegraph/test/hook.test.ts +0 -320
- package/packages/omo-codex/plugin/components/codegraph/test/mcp-bridge-fixtures.ts +0 -172
- package/packages/omo-codex/plugin/components/codegraph/test/package-runtime.test.ts +0 -91
- package/packages/omo-codex/plugin/components/codegraph/test/provisioned-node-guard.test.ts +0 -100
- package/packages/omo-codex/plugin/components/codegraph/test/serve-built-wrapper.test.ts +0 -76
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge-lifecycle.test.ts +0 -133
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-bridge.test.ts +0 -245
- package/packages/omo-codex/plugin/components/codegraph/test/serve-mcp-facade.test.ts +0 -69
- package/packages/omo-codex/plugin/components/codegraph/test/serve-node-support.test.ts +0 -43
- package/packages/omo-codex/plugin/components/codegraph/test/serve-provision.test.ts +0 -147
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable-idle.test.ts +0 -47
- package/packages/omo-codex/plugin/components/codegraph/test/serve-unavailable.test.ts +0 -175
- package/packages/omo-codex/plugin/components/codegraph/test/serve.test.ts +0 -385
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-node-support.test.ts +0 -206
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-project.test.ts +0 -58
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-state.test.ts +0 -104
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-trust-boundary.test.ts +0 -65
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-availability.test.ts +0 -106
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-cooldown.test.ts +0 -116
- package/packages/omo-codex/plugin/components/codegraph/test/session-start-worker-flow.test.ts +0 -258
- package/packages/omo-codex/plugin/components/codegraph/test/sweep-cli.test.ts +0 -56
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.build.json +0 -13
- package/packages/omo-codex/plugin/components/codegraph/tsconfig.json +0 -25
- package/packages/omo-codex/plugin/components/ulw-loop/test/quality-gate-aggregate.test.ts +0 -101
- package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +0 -18
- package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +0 -17
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/editor.mjs +0 -125
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/jsonc.mjs +0 -43
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot/scaffold.mjs +0 -29
- package/packages/omo-codex/plugin/scripts/migrate-omo-sot.mjs +0 -121
- package/packages/omo-codex/plugin/test/component-codegraph-mcp-smoke.test.mjs +0 -76
- 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
|
-
});
|