oh-my-opencode 4.18.2 → 4.19.0
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/README.ja.md +2 -2
- package/README.ko.md +2 -2
- package/README.md +4 -4
- package/README.ru.md +2 -2
- package/README.zh-cn.md +2 -2
- package/dist/agents/atlas/agent.d.ts +6 -5
- package/dist/agents/sisyphus/index.d.ts +5 -0
- package/dist/agents/sisyphus/kimi-k3.d.ts +19 -0
- package/dist/agents/sisyphus-agent-factory.d.ts +1 -1
- package/dist/agents/sisyphus-junior/agent.d.ts +8 -4
- package/dist/agents/sisyphus-junior/index.d.ts +2 -0
- package/dist/agents/sisyphus-junior/kimi-k3.d.ts +12 -0
- package/dist/agents/types.d.ts +2 -2
- package/dist/cli/index.js +648 -136
- package/dist/cli-node/index.js +648 -136
- package/dist/config/index.d.ts +1 -1
- package/dist/config/schema/browser-automation.d.ts +1 -0
- package/dist/config/schema/commands.d.ts +1 -3
- package/dist/config/schema/default-mode.d.ts +1 -1
- package/dist/config/schema/goal.d.ts +7 -0
- package/dist/config/schema/hooks.d.ts +1 -1
- package/dist/config/schema/oh-my-opencode-config.d.ts +6 -10
- package/dist/config/schema/ralph-loop.d.ts +1 -1
- package/dist/config/schema.d.ts +1 -1
- package/dist/create-hooks.d.ts +1 -1
- package/dist/features/builtin-commands/templates/goal.d.ts +1 -0
- package/dist/features/builtin-commands/templates/stop-continuation.d.ts +1 -1
- package/dist/features/builtin-commands/types.d.ts +1 -1
- package/dist/hooks/auto-slash-command/executor.d.ts +1 -0
- package/dist/hooks/goal/command-arguments.d.ts +13 -0
- package/dist/hooks/goal/controller.d.ts +26 -0
- package/dist/hooks/goal/index.d.ts +23 -0
- package/dist/hooks/goal/prompt.d.ts +3 -0
- package/dist/hooks/goal/store.d.ts +8 -0
- package/dist/hooks/goal/tools.d.ts +10 -0
- package/dist/hooks/goal/types.d.ts +93 -0
- package/dist/hooks/goal/validation.d.ts +4 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/keyword-detector/hook.d.ts +1 -2
- package/dist/hooks/ralph-loop/types.d.ts +1 -1
- package/dist/index.js +3515 -4365
- package/dist/oh-my-opencode.schema.json +23 -19
- package/dist/plugin/chat-message/loop-commands.d.ts +1 -1
- package/dist/plugin/chat-message/types.d.ts +23 -10
- package/dist/plugin/hooks/create-core-hooks.d.ts +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +3 -2
- package/dist/plugin/hooks/create-transform-hooks.d.ts +0 -2
- package/dist/plugin/stop-continuation.d.ts +2 -2
- package/dist/shared/system-directive.d.ts +0 -1
- package/dist/skills/ulw-plan/SKILL.md +11 -7
- package/dist/skills/ulw-plan/references/full-workflow.md +117 -6
- package/dist/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/dist/skills/ulw-research/SKILL.md +3 -3
- package/dist/tools/delegate-task/types.d.ts +0 -1
- package/dist/tui.js +73 -25
- package/package.json +14 -14
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +352 -17
- 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/codegraph/AGENTS.md +7 -6
- package/packages/omo-codex/plugin/components/codegraph/dist/cli.js +97 -30
- package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
- package/packages/omo-codex/plugin/components/codegraph/test/hook-exclusion.test.ts +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/lsp/AGENTS.md +1 -0
- 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/start-work-continuation/AGENTS.md +8 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/dist/cli.js +147 -60
- package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
- package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/start-work-continuation/src/boulder-reader.ts +3 -71
- package/packages/omo-codex/plugin/components/start-work-continuation/src/plan-checklist.ts +171 -0
- package/packages/omo-codex/plugin/components/start-work-continuation/test/boulder-reader.test.ts +198 -23
- package/packages/omo-codex/plugin/components/start-work-continuation/test/cli.test.ts +4 -3
- package/packages/omo-codex/plugin/components/start-work-continuation/test/codex-hook.test.ts +6 -5
- package/packages/omo-codex/plugin/components/start-work-continuation/test/fixtures/plan-scaffold.md +15 -0
- 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/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- package/packages/omo-codex/plugin/components/ultrawork/AGENTS.md +10 -10
- package/packages/omo-codex/plugin/components/ultrawork/agents/momus.toml +3 -3
- 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 +11 -7
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- 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/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-codegraph-init-guidance.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-checking-codegraph-bootstrap.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-start-work-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-start-work-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 +13 -13
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/multi-agent-v2-guard.mjs +32 -28
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/subagent-limit-guard.mjs +17 -45
- package/packages/omo-codex/plugin/scripts/migrate-codex-config/toml-section-editor.mjs +455 -0
- package/packages/omo-codex/plugin/scripts/sync-skills.mjs +3 -18
- package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +11 -7
- package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/omo-codex/plugin/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/omo-codex/plugin/test/aggregate-agents.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/lcx-bug-skills.test.mjs +2 -2
- package/packages/omo-codex/plugin/test/migrate-codex-config.test.mjs +6 -6
- package/packages/omo-codex/plugin/test/multi-agent-v2-regression.test.mjs +3 -3
- package/packages/omo-codex/plugin/test/scaffold-plan.test.mjs +62 -0
- package/packages/omo-codex/plugin/test/subagent-limit-migration.test.mjs +271 -14
- package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +3 -18
- package/packages/omo-codex/plugin/test/sync-skills.test.mjs +0 -5
- package/packages/omo-codex/plugin/test/ulw-plan-review-state-contract.test.mjs +293 -0
- package/packages/omo-codex/scripts/install-config.test.mjs +10 -10
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +353 -18
- package/packages/omo-codex/scripts/install-generated-bundle.test.mjs +39 -2
- package/packages/shared-skills/skills/ulw-plan/SKILL.md +11 -7
- package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +117 -6
- package/packages/shared-skills/skills/ulw-plan/scripts/scaffold-plan.mjs +46 -10
- package/packages/shared-skills/skills/ulw-research/SKILL.md +3 -3
- package/dist/features/builtin-commands/templates/ralph-loop.d.ts +0 -3
- package/dist/skills/ultraresearch/SKILL.md +0 -10
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/SKILL.md +0 -273
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -12
- package/packages/shared-skills/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -107
- package/packages/shared-skills/skills/lcx-doctor/SKILL.md +0 -128
- package/packages/shared-skills/skills/lcx-doctor/agents/openai.yaml +0 -11
- package/packages/shared-skills/skills/lcx-report-bug/SKILL.md +0 -268
- package/packages/shared-skills/skills/lcx-report-bug/agents/openai.yaml +0 -11
- package/packages/shared-skills/skills/ultraresearch/SKILL.md +0 -10
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/agents/openai.yaml +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-contribute-bug-fix/scripts/create-pr-body.mjs +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-doctor/agents/openai.yaml +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/SKILL.md +0 -0
- /package/{dist → packages/omo-codex/plugin/components/lcx}/skills/lcx-report-bug/agents/openai.yaml +0 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
// components/codegraph/src/cli.ts
|
|
4
4
|
import { realpathSync as realpathSync6 } from "node:fs";
|
|
5
|
-
import { basename as basename5, resolve as
|
|
5
|
+
import { basename as basename5, resolve as resolve7 } from "node:path";
|
|
6
6
|
import { stderr as processStderr4 } from "node:process";
|
|
7
7
|
import { fileURLToPath as fileURLToPath4 } from "node:url";
|
|
8
8
|
|
|
@@ -98,8 +98,9 @@ function buildCodegraphChildEnv(options = {}) {
|
|
|
98
98
|
import { homedir as homedir5 } from "node:os";
|
|
99
99
|
|
|
100
100
|
// ../../utils/src/codegraph/workspace.ts
|
|
101
|
+
import { execFileSync } from "node:child_process";
|
|
101
102
|
import { appendFileSync, existsSync as existsSync2, lstatSync as lstatSync2, mkdirSync, realpathSync as realpathSync3, readFileSync as readFileSync2, statSync, symlinkSync } from "node:fs";
|
|
102
|
-
import { join as join5 } from "node:path";
|
|
103
|
+
import { dirname, join as join5, resolve as resolve3 } from "node:path";
|
|
103
104
|
|
|
104
105
|
// ../../utils/src/codegraph/paths.ts
|
|
105
106
|
import { createHash } from "node:crypto";
|
|
@@ -305,12 +306,52 @@ function prepareCodegraphWorkspace(workspace, options = {}) {
|
|
|
305
306
|
}
|
|
306
307
|
}
|
|
307
308
|
function ensureCodegraphGitignored(workspace) {
|
|
308
|
-
const
|
|
309
|
-
if (!existsSync2(
|
|
309
|
+
const gitMarkerPath = join5(workspace, ".git");
|
|
310
|
+
if (!existsSync2(gitMarkerPath))
|
|
310
311
|
return false;
|
|
311
|
-
const excludePath = join5(gitDir, "info", "exclude");
|
|
312
312
|
try {
|
|
313
|
-
|
|
313
|
+
const isWorktree = execFileSync("git", ["rev-parse", "--is-inside-work-tree"], {
|
|
314
|
+
cwd: workspace,
|
|
315
|
+
encoding: "utf8",
|
|
316
|
+
shell: false,
|
|
317
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
318
|
+
timeout: 5000,
|
|
319
|
+
windowsHide: true
|
|
320
|
+
}).trim();
|
|
321
|
+
if (isWorktree !== "true")
|
|
322
|
+
return false;
|
|
323
|
+
const gitTopLevel = execFileSync("git", ["rev-parse", "--show-toplevel"], {
|
|
324
|
+
cwd: workspace,
|
|
325
|
+
encoding: "utf8",
|
|
326
|
+
shell: false,
|
|
327
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
328
|
+
timeout: 5000,
|
|
329
|
+
windowsHide: true
|
|
330
|
+
}).trim();
|
|
331
|
+
if (gitTopLevel.length === 0 || realpathSync3.native(gitTopLevel) !== realpathSync3.native(workspace))
|
|
332
|
+
return false;
|
|
333
|
+
const gitDir = execFileSync("git", ["rev-parse", "--absolute-git-dir"], {
|
|
334
|
+
cwd: workspace,
|
|
335
|
+
encoding: "utf8",
|
|
336
|
+
shell: false,
|
|
337
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
338
|
+
timeout: 5000,
|
|
339
|
+
windowsHide: true
|
|
340
|
+
}).trim();
|
|
341
|
+
if (gitDir.length === 0 || !gitMarkerOwnsGitDir(gitMarkerPath, workspace, gitDir))
|
|
342
|
+
return false;
|
|
343
|
+
const gitExcludePath = execFileSync("git", ["rev-parse", "--git-path", "info/exclude"], {
|
|
344
|
+
cwd: workspace,
|
|
345
|
+
encoding: "utf8",
|
|
346
|
+
shell: false,
|
|
347
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
348
|
+
timeout: 5000,
|
|
349
|
+
windowsHide: true
|
|
350
|
+
}).trim();
|
|
351
|
+
if (gitExcludePath.length === 0)
|
|
352
|
+
return false;
|
|
353
|
+
const excludePath = resolve3(workspace, gitExcludePath);
|
|
354
|
+
mkdirSync(dirname(excludePath), { recursive: true });
|
|
314
355
|
const existing = existsSync2(excludePath) ? readFileSync2(excludePath, "utf8") : "";
|
|
315
356
|
if (existing.split(/\r?\n/).includes(".codegraph"))
|
|
316
357
|
return true;
|
|
@@ -319,12 +360,38 @@ function ensureCodegraphGitignored(workspace) {
|
|
|
319
360
|
`}.codegraph
|
|
320
361
|
`);
|
|
321
362
|
return true;
|
|
322
|
-
} catch
|
|
323
|
-
|
|
324
|
-
return false;
|
|
325
|
-
throw error;
|
|
363
|
+
} catch {
|
|
364
|
+
return false;
|
|
326
365
|
}
|
|
327
366
|
}
|
|
367
|
+
function gitMarkerOwnsGitDir(gitMarkerPath, workspace, gitDir) {
|
|
368
|
+
const markerStat = lstatSync2(gitMarkerPath);
|
|
369
|
+
if (markerStat.isSymbolicLink())
|
|
370
|
+
return false;
|
|
371
|
+
const resolvedGitDir = realpathSync3.native(gitDir);
|
|
372
|
+
if (markerStat.isDirectory())
|
|
373
|
+
return realpathSync3.native(gitMarkerPath) === resolvedGitDir;
|
|
374
|
+
if (!markerStat.isFile())
|
|
375
|
+
return false;
|
|
376
|
+
const markerMatch = /^gitdir:\s*(.+)\s*$/i.exec(readFileSync2(gitMarkerPath, "utf8").trim());
|
|
377
|
+
if (markerMatch?.[1] === undefined)
|
|
378
|
+
return false;
|
|
379
|
+
if (realpathSync3.native(resolve3(workspace, markerMatch[1])) !== resolvedGitDir)
|
|
380
|
+
return false;
|
|
381
|
+
const backlinkPath = join5(resolvedGitDir, "gitdir");
|
|
382
|
+
if (existsSync2(backlinkPath)) {
|
|
383
|
+
const backlink = readFileSync2(backlinkPath, "utf8").trim();
|
|
384
|
+
return backlink.length > 0 && realpathSync3.native(resolve3(resolvedGitDir, backlink)) === realpathSync3.native(gitMarkerPath);
|
|
385
|
+
}
|
|
386
|
+
const coreWorktree = execFileSync("git", ["config", "--file", join5(resolvedGitDir, "config"), "--get", "core.worktree"], {
|
|
387
|
+
encoding: "utf8",
|
|
388
|
+
shell: false,
|
|
389
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
390
|
+
timeout: 5000,
|
|
391
|
+
windowsHide: true
|
|
392
|
+
}).trim();
|
|
393
|
+
return coreWorktree.length > 0 && realpathSync3.native(resolve3(resolvedGitDir, coreWorktree)) === realpathSync3.native(workspace);
|
|
394
|
+
}
|
|
328
395
|
|
|
329
396
|
// ../../utils/src/codegraph/guidance.ts
|
|
330
397
|
var CODEGRAPH_UNINITIALIZED_PATTERN = /CodeGraph not initialized in ([\s\S]*?)\.\s*Run ['`]codegraph init['`] in that project first\./i;
|
|
@@ -416,7 +483,7 @@ function isRecord(value) {
|
|
|
416
483
|
import { existsSync as existsSync3 } from "node:fs";
|
|
417
484
|
import { homedir as homedir6 } from "node:os";
|
|
418
485
|
import { spawnSync } from "node:child_process";
|
|
419
|
-
import { basename as basename2, dirname, join as join7 } from "node:path";
|
|
486
|
+
import { basename as basename2, dirname as dirname2, join as join7 } from "node:path";
|
|
420
487
|
import { createRequire } from "node:module";
|
|
421
488
|
|
|
422
489
|
// ../../utils/src/runtime/which.ts
|
|
@@ -603,7 +670,7 @@ function defaultProvisionedBin(homeDir, fileExists) {
|
|
|
603
670
|
function resolveBundledShim(requireResolve, fileExists) {
|
|
604
671
|
try {
|
|
605
672
|
const packageJson = requireResolve(`${CODEGRAPH_PACKAGE}/package.json`);
|
|
606
|
-
const packageRoot =
|
|
673
|
+
const packageRoot = dirname2(packageJson);
|
|
607
674
|
const candidates = [join7(packageRoot, "bin", "codegraph.js"), join7(packageRoot, "npm-shim.js")];
|
|
608
675
|
return candidates.find((candidate) => fileExists(candidate)) ?? null;
|
|
609
676
|
} catch (error) {
|
|
@@ -1819,14 +1886,14 @@ function buildEnvOverrides(harness, env, warnings, merge) {
|
|
|
1819
1886
|
|
|
1820
1887
|
// ../../utils/src/omo-config/resolve.ts
|
|
1821
1888
|
import { existsSync as existsSync4 } from "node:fs";
|
|
1822
|
-
import { dirname as
|
|
1889
|
+
import { dirname as dirname3, isAbsolute as isAbsolute2, join as join8, relative, resolve as resolve4 } from "node:path";
|
|
1823
1890
|
function containsPath(parent, child) {
|
|
1824
1891
|
const pathToChild = relative(parent, child);
|
|
1825
1892
|
return pathToChild === "" || !pathToChild.startsWith("..") && !isAbsolute2(pathToChild);
|
|
1826
1893
|
}
|
|
1827
1894
|
function findProjectConfigPathsNearestFirst(cwd, homeDir) {
|
|
1828
|
-
const startDir =
|
|
1829
|
-
const stopBeforeDir = containsPath(
|
|
1895
|
+
const startDir = resolve4(cwd);
|
|
1896
|
+
const stopBeforeDir = containsPath(resolve4(homeDir), startDir) ? resolve4(homeDir) : null;
|
|
1830
1897
|
const paths = [];
|
|
1831
1898
|
let currentDir = startDir;
|
|
1832
1899
|
while (true) {
|
|
@@ -1836,7 +1903,7 @@ function findProjectConfigPathsNearestFirst(cwd, homeDir) {
|
|
|
1836
1903
|
if (existsSync4(configPath)) {
|
|
1837
1904
|
paths.push(configPath);
|
|
1838
1905
|
}
|
|
1839
|
-
const parentDir =
|
|
1906
|
+
const parentDir = dirname3(currentDir);
|
|
1840
1907
|
if (parentDir === currentDir)
|
|
1841
1908
|
break;
|
|
1842
1909
|
currentDir = parentDir;
|
|
@@ -1844,7 +1911,7 @@ function findProjectConfigPathsNearestFirst(cwd, homeDir) {
|
|
|
1844
1911
|
return paths;
|
|
1845
1912
|
}
|
|
1846
1913
|
function resolveOmoConfigPaths(options) {
|
|
1847
|
-
const globalPath = join8(
|
|
1914
|
+
const globalPath = join8(resolve4(options.homeDir), ".omo", "config.jsonc");
|
|
1848
1915
|
const projectPathsFarthestFirst = findProjectConfigPathsNearestFirst(options.cwd, options.homeDir).reverse();
|
|
1849
1916
|
return [
|
|
1850
1917
|
{ path: globalPath, scope: "global" },
|
|
@@ -1943,7 +2010,7 @@ import { fileURLToPath } from "node:url";
|
|
|
1943
2010
|
// ../../utils/src/codegraph/process-sweeper.ts
|
|
1944
2011
|
import { existsSync as existsSync7, mkdirSync as mkdirSync2, statSync as statSync2, utimesSync, writeFileSync as writeFileSync2 } from "node:fs";
|
|
1945
2012
|
import { homedir as homedir10 } from "node:os";
|
|
1946
|
-
import { dirname as
|
|
2013
|
+
import { dirname as dirname4, join as join10 } from "node:path";
|
|
1947
2014
|
|
|
1948
2015
|
// ../../utils/src/codegraph/process-exec.ts
|
|
1949
2016
|
import { execFile } from "node:child_process";
|
|
@@ -2188,7 +2255,7 @@ function processKillErrorMeansAlive(error) {
|
|
|
2188
2255
|
// ../../utils/src/codegraph/process-roots.ts
|
|
2189
2256
|
import { existsSync as existsSync6, readdirSync as readdirSync2, realpathSync as realpathSync4 } from "node:fs";
|
|
2190
2257
|
import { homedir as homedir9 } from "node:os";
|
|
2191
|
-
import { join as join9, resolve as
|
|
2258
|
+
import { join as join9, resolve as resolve5 } from "node:path";
|
|
2192
2259
|
function discoverCodegraphOwnedRoots(options = {}) {
|
|
2193
2260
|
const env = options.env ?? process.env;
|
|
2194
2261
|
const homeDir = options.homeDir ?? env["HOME"] ?? env["USERPROFILE"] ?? homedir9();
|
|
@@ -2222,7 +2289,7 @@ function readCodexPluginCacheRoots(codexHome) {
|
|
|
2222
2289
|
function addRoot(roots, root) {
|
|
2223
2290
|
if (root === undefined || root.trim().length === 0)
|
|
2224
2291
|
return;
|
|
2225
|
-
const resolved =
|
|
2292
|
+
const resolved = resolve5(root);
|
|
2226
2293
|
roots.add(resolved);
|
|
2227
2294
|
roots.add(realpathIfPossible2(resolved));
|
|
2228
2295
|
}
|
|
@@ -2240,7 +2307,7 @@ function realpathIfPossible2(path) {
|
|
|
2240
2307
|
return realpathSync4(path);
|
|
2241
2308
|
} catch (error) {
|
|
2242
2309
|
if (error instanceof Error)
|
|
2243
|
-
return
|
|
2310
|
+
return resolve5(path);
|
|
2244
2311
|
throw error;
|
|
2245
2312
|
}
|
|
2246
2313
|
}
|
|
@@ -2325,7 +2392,7 @@ function isSweepThrottled(stampFile, nowMs, throttleMs) {
|
|
|
2325
2392
|
return nowMs - statSync2(stampFile).mtimeMs < throttleMs;
|
|
2326
2393
|
}
|
|
2327
2394
|
function writeSweepStamp(stampFile, nowMs) {
|
|
2328
|
-
mkdirSync2(
|
|
2395
|
+
mkdirSync2(dirname4(stampFile), { recursive: true });
|
|
2329
2396
|
writeFileSync2(stampFile, `${new Date(nowMs).toISOString()}
|
|
2330
2397
|
`);
|
|
2331
2398
|
const stampDate = new Date(nowMs);
|
|
@@ -2442,7 +2509,7 @@ async function removeEmptyDirectory(path) {
|
|
|
2442
2509
|
}
|
|
2443
2510
|
}
|
|
2444
2511
|
function sleep(ms) {
|
|
2445
|
-
return new Promise((
|
|
2512
|
+
return new Promise((resolve6) => setTimeout(resolve6, ms));
|
|
2446
2513
|
}
|
|
2447
2514
|
async function defaultDownloader(asset, timeoutMs = DEFAULT_DOWNLOAD_TIMEOUT_MS) {
|
|
2448
2515
|
const response = await fetch(asset.url, { signal: AbortSignal.timeout(timeoutMs) });
|
|
@@ -2962,7 +3029,7 @@ function defaultWorkerCliPath() {
|
|
|
2962
3029
|
// components/codegraph/src/serve.ts
|
|
2963
3030
|
import { existsSync as existsSync10, realpathSync as realpathSync5 } from "node:fs";
|
|
2964
3031
|
import { homedir as homedir14 } from "node:os";
|
|
2965
|
-
import { basename as basename4, join as join14, resolve as
|
|
3032
|
+
import { basename as basename4, join as join14, resolve as resolve6 } from "node:path";
|
|
2966
3033
|
import {
|
|
2967
3034
|
cwd as processCwd3,
|
|
2968
3035
|
env as processEnv3,
|
|
@@ -3023,7 +3090,7 @@ ${body}` : `${body}
|
|
|
3023
3090
|
await writeChunk(output, payload);
|
|
3024
3091
|
}
|
|
3025
3092
|
function writeChunk(output, chunk) {
|
|
3026
|
-
return new Promise((
|
|
3093
|
+
return new Promise((resolve6, reject) => {
|
|
3027
3094
|
let settled = false;
|
|
3028
3095
|
const onError = (error) => {
|
|
3029
3096
|
if (settled)
|
|
@@ -3043,7 +3110,7 @@ function writeChunk(output, chunk) {
|
|
|
3043
3110
|
return;
|
|
3044
3111
|
}
|
|
3045
3112
|
output.removeListener("error", onError);
|
|
3046
|
-
|
|
3113
|
+
resolve6();
|
|
3047
3114
|
});
|
|
3048
3115
|
} catch (error) {
|
|
3049
3116
|
output.removeListener("error", onError);
|
|
@@ -3624,11 +3691,11 @@ function resolveProjectCwd(env, fallback) {
|
|
|
3624
3691
|
const candidate = env[key]?.trim();
|
|
3625
3692
|
if (candidate === undefined || candidate.length === 0)
|
|
3626
3693
|
continue;
|
|
3627
|
-
const resolved =
|
|
3694
|
+
const resolved = resolve6(candidate);
|
|
3628
3695
|
if (existsSync10(resolved))
|
|
3629
3696
|
return resolved;
|
|
3630
3697
|
}
|
|
3631
|
-
return
|
|
3698
|
+
return resolve6(fallback);
|
|
3632
3699
|
}
|
|
3633
3700
|
function provisionedBinFromInstallDir3(installDir) {
|
|
3634
3701
|
if (installDir === undefined)
|
|
@@ -3653,7 +3720,7 @@ function isDirectInvocation(argvPath) {
|
|
|
3653
3720
|
const moduleName = basename4(modulePath);
|
|
3654
3721
|
if (moduleName !== "serve.js" && moduleName !== "serve.ts")
|
|
3655
3722
|
return false;
|
|
3656
|
-
return realpathSync5(
|
|
3723
|
+
return realpathSync5(resolve6(argvPath)) === realpathSync5(modulePath);
|
|
3657
3724
|
}
|
|
3658
3725
|
|
|
3659
3726
|
// components/codegraph/src/sweep-cli.ts
|
|
@@ -3763,7 +3830,7 @@ function isDirectInvocation2(argvPath) {
|
|
|
3763
3830
|
const moduleName = basename5(modulePath);
|
|
3764
3831
|
if (moduleName !== "cli.js" && moduleName !== "cli.ts")
|
|
3765
3832
|
return false;
|
|
3766
|
-
return realpathSync6(
|
|
3833
|
+
return realpathSync6(resolve7(argvPath)) === realpathSync6(modulePath);
|
|
3767
3834
|
}
|
|
3768
3835
|
export {
|
|
3769
3836
|
runCodegraphCli
|
|
@@ -21,7 +21,7 @@ describe("CodeGraph SessionStart exclusion policy", () => {
|
|
|
21
21
|
const stdout: string[] = [];
|
|
22
22
|
const spawned: WorkerSpawnInvocation[] = [];
|
|
23
23
|
const stateRoot = createAllowedWorkspace("codegraph-omo-state");
|
|
24
|
-
const workspace = join(stateRoot, ".omo", "
|
|
24
|
+
const workspace = join(stateRoot, ".omo", "ulw-research", "run", "clones", "repo");
|
|
25
25
|
mkdirSync(workspace, { recursive: true });
|
|
26
26
|
|
|
27
27
|
try {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook pre-tool-use",
|
|
10
10
|
"timeout": 5,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.19.0) Recommending Git Bash MCP"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"type": "command",
|
|
21
21
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
22
22
|
"timeout": 5,
|
|
23
|
-
"statusMessage": "(OmO 4.
|
|
23
|
+
"statusMessage": "(OmO 4.19.0) Resetting Git Bash MCP Reminder"
|
|
24
24
|
}
|
|
25
25
|
]
|
|
26
26
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
|
|
10
10
|
"timeout": 10,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.19.0) Verifying LazyCodex Executor Evidence"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -22,4 +22,5 @@ Conventions for humans and agents working on this repository.
|
|
|
22
22
|
- LSP server processes are owned by `LspManager`.
|
|
23
23
|
- Tool execution acquires clients through `withLspClient(...)` unless it only reports static status.
|
|
24
24
|
- `lsp.rename` mutates files by applying workspace edits; keep it sequential at the MCP caller level.
|
|
25
|
+
- `.mcp.json` sets `lsp` MCP server `startup_timeout_sec: 10` to bound startup; preserve the bound on edits.
|
|
25
26
|
- Do not add pi-coding-agent or omo source dependencies. This package is standalone.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "4.
|
|
4
|
-
"inputDigest": "sha256:
|
|
3
|
+
"version": "4.19.0",
|
|
4
|
+
"inputDigest": "sha256:1c26ab90eb222f050b468e7088ee9e655d0db850605ab425e8636c089a910f79",
|
|
5
5
|
"outputs": [
|
|
6
6
|
{
|
|
7
7
|
"path": "cli.d.ts",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"type": "command",
|
|
9
9
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
10
10
|
"timeout": 60,
|
|
11
|
-
"statusMessage": "(OmO 4.
|
|
11
|
+
"statusMessage": "(OmO 4.19.0) Checking LSP Diagnostics"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"type": "command",
|
|
22
22
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
23
23
|
"timeout": 5,
|
|
24
|
-
"statusMessage": "(OmO 4.
|
|
24
|
+
"statusMessage": "(OmO 4.19.0) Resetting LSP Diagnostics Cache"
|
|
25
25
|
}
|
|
26
26
|
]
|
|
27
27
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 4.
|
|
10
|
+
"statusMessage": "(OmO 4.19.0) Loading Project Rules"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"type": "command",
|
|
20
20
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
|
|
21
21
|
"timeout": 10,
|
|
22
|
-
"statusMessage": "(OmO 4.
|
|
22
|
+
"statusMessage": "(OmO 4.19.0) Loading Project Rules"
|
|
23
23
|
}
|
|
24
24
|
]
|
|
25
25
|
}
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"type": "command",
|
|
33
33
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
|
|
34
34
|
"timeout": 10,
|
|
35
|
-
"statusMessage": "(OmO 4.
|
|
35
|
+
"statusMessage": "(OmO 4.19.0) Matching Project Rules"
|
|
36
36
|
}
|
|
37
37
|
]
|
|
38
38
|
}
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"type": "command",
|
|
46
46
|
"command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-compact",
|
|
47
47
|
"timeout": 10,
|
|
48
|
-
"statusMessage": "(OmO 4.
|
|
48
|
+
"statusMessage": "(OmO 4.19.0) Resetting Project Rule Cache"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
}
|
|
@@ -29,6 +29,13 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
29
29
|
- Never use Arrange-Act-Assert comments.
|
|
30
30
|
- Keep fixtures in `test/fixtures/`.
|
|
31
31
|
|
|
32
|
+
## Layout
|
|
33
|
+
|
|
34
|
+
- `src/boulder-reader.ts`: reads `.omo/boulder.json`, resolves the active work for the session, re-exports `getPlanChecklist`/`PlanChecklist` from `plan-checklist.ts`. `readContinuationState` returns null only when the plan has no readable top-level checklist (`total === 0`).
|
|
35
|
+
- `src/plan-checklist.ts`: `PlanChecklist` (`completed`/`remaining`/`total`/`nextTaskLabel`) and `getPlanChecklist`/`parsePlanChecklist`. Counts structured `## TODOs` rows (`N. <title>`) and `## Final Verification Wave` rows (`F<number>. <title>`); falls back to simple top-level `- [ ]`/`- [x]` checkboxes. Skips fenced blocks and respects `#`/`##` section boundaries.
|
|
36
|
+
- `src/codex-hook.ts`: Stop/SubagentStop hook; fills `REMAINING_COUNT`/`TOTAL_COUNT`/`NEXT_TASK_LABEL` from the checklist into `directive.md`.
|
|
37
|
+
- `directive.md`: directive template with placeholders, applied per invocation.
|
|
38
|
+
|
|
32
39
|
## Build and Hooks
|
|
33
40
|
|
|
34
41
|
- Build output goes to `dist/`.
|
|
@@ -41,3 +48,4 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
41
48
|
- Never make a network call from the hook.
|
|
42
49
|
- Keep the directive in `directive.md`. Do not inline it into TypeScript files.
|
|
43
50
|
- The hook only continues sessions listed in `.omo/boulder.json` as `codex:<session_id>`.
|
|
51
|
+
- The hook continues while the plan has a readable top-level checklist (`total > 0`). A fully-checked plan still blocks Stop until the final gate runs and the Boulder work is marked completed; an unreadable or empty checklist yields no output.
|