lazycodex-ai 5.0.0 → 5.1.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 +41 -376
- package/README.ko.md +45 -376
- package/README.md +39 -376
- package/README.ru.md +50 -368
- package/README.zh-cn.md +50 -371
- package/dist/cli/index.js +242 -150
- package/dist/cli-node/index.js +242 -150
- package/package.json +6 -1
- package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
- package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +26 -3
- 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/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/telemetry/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
- 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/ulw-execute-continuation/AGENTS.md +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +42 -32
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/src/plan-checklist.ts +55 -29
- package/packages/omo-codex/plugin/components/ulw-execute-continuation/test/boulder-reader.test.ts +51 -0
- package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
- 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-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/post-tool-use-recording-spawn-admission.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-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 -12
- package/packages/omo-codex/plugin/package.json +1 -1
- package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
- package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
- package/packages/omo-codex/plugin/test/node-install-surface.test.mjs +0 -1
- package/packages/omo-codex/scripts/install-dist/install-local.mjs +37 -14
- package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
- package/packages/shared-skills/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lazycodex-ai",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "The Best AI Agent Harness - Batteries-Included OpenCode Plugin with Multi-Model Orchestration, Parallel Background Agents, and Crafted LSP/AST Tools",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -33,6 +33,11 @@
|
|
|
33
33
|
"packages/omo-codex",
|
|
34
34
|
"packages/omo-senpi",
|
|
35
35
|
"packages/senpi-task",
|
|
36
|
+
"packages/senpi-desktop-protocol",
|
|
37
|
+
"packages/senpi-desktop-engine",
|
|
38
|
+
"packages/senpi-desktop-prelude",
|
|
39
|
+
"packages/senpi-desktop-service",
|
|
40
|
+
"packages/senpi-desktop-tool",
|
|
36
41
|
"packages/omo-opencode",
|
|
37
42
|
"packages/omo-native"
|
|
38
43
|
],
|
|
@@ -7059,6 +7059,25 @@ var OmoCategoryConfigObjectSchema = object({
|
|
|
7059
7059
|
var OmoCategoryConfigSchema = preprocess((value) => isRecord4(value) ? normalizeLegacyModelFields(value) : value, OmoCategoryConfigObjectSchema);
|
|
7060
7060
|
var OmoCategoriesConfigSchema = record(string2(), OmoCategoryConfigSchema);
|
|
7061
7061
|
|
|
7062
|
+
// ../../omo-config-core/src/schema/computer.ts
|
|
7063
|
+
var positiveInteger = number2().int().positive();
|
|
7064
|
+
var nonNegativeInteger = number2().int().nonnegative();
|
|
7065
|
+
var OmoComputerSettingsLayerSchema = object({
|
|
7066
|
+
enabled: boolean2().describe("Experimental: register the computer tool in OmO Native sessions (default: on where the host is supported; false leaves it unregistered)"),
|
|
7067
|
+
display: string2().min(1),
|
|
7068
|
+
max_width: positiveInteger,
|
|
7069
|
+
max_height: positiveInteger,
|
|
7070
|
+
screenshot_max_bytes: positiveInteger,
|
|
7071
|
+
stop_hotkey: string2().min(1),
|
|
7072
|
+
allow_host_relay_only_stop: boolean2(),
|
|
7073
|
+
macos_canary: _enum(["session", "off"]),
|
|
7074
|
+
audit_log: object({ enabled: boolean2() }).partial().strict(),
|
|
7075
|
+
screenshot_gc: object({ enabled: boolean2(), stale_ms: nonNegativeInteger, scan_interval_ms: nonNegativeInteger }).partial().strict(),
|
|
7076
|
+
engine_path: string2().min(1),
|
|
7077
|
+
cua_adapter: boolean2()
|
|
7078
|
+
}).partial().strict().describe("Experimental computer use in OmO Native: screenshots, windows, accessibility trees and native mouse and keyboard input. Every key is optional; defaults depend on the host.");
|
|
7079
|
+
var OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
|
|
7080
|
+
|
|
7062
7081
|
// ../../omo-config-core/src/schema/git-master.ts
|
|
7063
7082
|
var OmoGitMasterSettingsShape = {
|
|
7064
7083
|
commit_footer: union([boolean2(), string2()]),
|
|
@@ -7304,7 +7323,7 @@ var OmoModelProfilesLayerSchema = record(string2(), OmoModelProfileLayerSchema);
|
|
|
7304
7323
|
|
|
7305
7324
|
// ../../omo-config-core/src/schema/task.ts
|
|
7306
7325
|
import { availableParallelism } from "node:os";
|
|
7307
|
-
var DEFAULT_RESIDENCY_MAX_CHILDREN =
|
|
7326
|
+
var DEFAULT_RESIDENCY_MAX_CHILDREN = "unlimited";
|
|
7308
7327
|
var ResidencyMaxChildrenInputSchema = union([number2().int().nonnegative(), literal("unlimited")]);
|
|
7309
7328
|
var OmoTaskWaitSchema = object({
|
|
7310
7329
|
min_ms: number2().int().positive().default(5000),
|
|
@@ -7365,7 +7384,7 @@ var OmoTaskSettingsSchema = object({
|
|
|
7365
7384
|
provider_concurrency: record(string2(), number2().int().nonnegative()).optional(),
|
|
7366
7385
|
model_concurrency: record(string2(), number2().int().nonnegative()).optional(),
|
|
7367
7386
|
max_depth: number2().int().nonnegative().default(1),
|
|
7368
|
-
residency_max_children: ResidencyMaxChildrenInputSchema.default(
|
|
7387
|
+
residency_max_children: ResidencyMaxChildrenInputSchema.default(DEFAULT_RESIDENCY_MAX_CHILDREN),
|
|
7369
7388
|
resident_idle_timeout_ms: number2().int().positive().max(Number.MAX_SAFE_INTEGER).default(900000),
|
|
7370
7389
|
ttl_ms: number2().int().positive().default(86400000),
|
|
7371
7390
|
state_dir: string2().optional(),
|
|
@@ -7429,7 +7448,7 @@ function resolveOmoTaskSettings(input, resolveParallelism = availableParallelism
|
|
|
7429
7448
|
const record2 = record(string2(), unknown()).parse(input);
|
|
7430
7449
|
return OmoTaskSettingsSchema.parse({
|
|
7431
7450
|
...record2,
|
|
7432
|
-
residency_max_children: record2["residency_max_children"] ??
|
|
7451
|
+
residency_max_children: record2["residency_max_children"] ?? DEFAULT_RESIDENCY_MAX_CHILDREN,
|
|
7433
7452
|
global_concurrency: record2["global_concurrency"] ?? Math.max(8, resolveParallelism() * 2)
|
|
7434
7453
|
});
|
|
7435
7454
|
}
|
|
@@ -7520,6 +7539,7 @@ var OmoTypedHarnessConfigSchema = object({
|
|
|
7520
7539
|
model_profile: string2().optional(),
|
|
7521
7540
|
memory: OmoMemorySettingsLayerSchema.optional(),
|
|
7522
7541
|
telemetry: OmoTelemetrySettingsLayerSchema.optional(),
|
|
7542
|
+
computer: OmoComputerSettingsLayerSchema.optional(),
|
|
7523
7543
|
disabled_skills: OmoDisabledSkillsSchema.optional()
|
|
7524
7544
|
}).strict();
|
|
7525
7545
|
var OmoConfigProfileSchema = object({
|
|
@@ -7534,6 +7554,7 @@ var OmoConfigProfileSchema = object({
|
|
|
7534
7554
|
model_profile: string2().optional(),
|
|
7535
7555
|
memory: OmoMemorySettingsLayerSchema.optional(),
|
|
7536
7556
|
telemetry: OmoTelemetrySettingsLayerSchema.optional(),
|
|
7557
|
+
computer: OmoComputerSettingsLayerSchema.optional(),
|
|
7537
7558
|
disabled_skills: OmoDisabledSkillsSchema.optional(),
|
|
7538
7559
|
"[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
|
|
7539
7560
|
"[native]": OmoTypedHarnessConfigSchema.optional(),
|
|
@@ -7553,6 +7574,7 @@ var OmoConfigSchema = object({
|
|
|
7553
7574
|
model_profile: string2().optional(),
|
|
7554
7575
|
memory: OmoMemorySettingsSchema.optional(),
|
|
7555
7576
|
telemetry: OmoTelemetrySettingsSchema.optional(),
|
|
7577
|
+
computer: OmoComputerSettingsSchema.optional(),
|
|
7556
7578
|
disabled_skills: OmoDisabledSkillsSchema.optional(),
|
|
7557
7579
|
"[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
|
|
7558
7580
|
"[native]": OmoTypedHarnessConfigSchema.optional(),
|
|
@@ -7575,6 +7597,7 @@ var OmoConfigLayerSchema = object({
|
|
|
7575
7597
|
model_profile: string2().optional(),
|
|
7576
7598
|
memory: OmoMemorySettingsLayerSchema.optional(),
|
|
7577
7599
|
telemetry: OmoTelemetrySettingsLayerSchema.optional(),
|
|
7600
|
+
computer: OmoComputerSettingsLayerSchema.optional(),
|
|
7578
7601
|
disabled_skills: OmoDisabledSkillsSchema.optional(),
|
|
7579
7602
|
"[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
|
|
7580
7603
|
"[native]": OmoTypedHarnessConfigSchema.optional(),
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/components/bootstrap/dist/cli.js\" hook session-start",
|
|
9
9
|
"commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\bootstrap.ps1\"",
|
|
10
10
|
"timeout": 30,
|
|
11
|
-
"statusMessage": "(OmO 5.
|
|
11
|
+
"statusMessage": "(OmO 5.1.0) Checking Bootstrap Provisioning"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -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 5.
|
|
11
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
23
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
11
|
+
"statusMessage": "(OmO 5.1.0) Verifying LazyCodex Executor Evidence"
|
|
12
12
|
}
|
|
13
13
|
]
|
|
14
14
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
|
-
"version": "5.
|
|
4
|
-
"inputDigest": "sha256:
|
|
3
|
+
"version": "5.1.0",
|
|
4
|
+
"inputDigest": "sha256:402aa7e2b95ae6db7704d08ed85f10a6b069ec83aaef7afa7a383c073c29a003",
|
|
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 5.
|
|
11
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
24
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
10
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
22
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
35
|
+
"statusMessage": "(OmO 5.1.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 5.
|
|
48
|
+
"statusMessage": "(OmO 5.1.0) Resetting Project Rule Cache"
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/codex-ultrawork",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.0",
|
|
4
4
|
"description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"packageManager": "npm@11.12.1",
|
|
@@ -32,7 +32,7 @@ Conventions for human contributors and AI agents working on this repository.
|
|
|
32
32
|
## Layout
|
|
33
33
|
|
|
34
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 in four cases: `boulder.json` is missing or unparseable, no work matches the session, the work status is not continuable (only `active` and `paused` continue - `completed`/`abandoned` stop), or `checklist.total === 0`.
|
|
35
|
-
- `src/plan-checklist.ts`: `PlanChecklist` (`completed`/`remaining`/`total`/`nextTaskLabel`) and `getPlanChecklist`/`parsePlanChecklist`.
|
|
35
|
+
- `src/plan-checklist.ts`: `PlanChecklist` (`completed`/`remaining`/`total`/`nextTaskLabel`) and `getPlanChecklist`/`parsePlanChecklist`. Mirrors `@oh-my-opencode/boulder-state`'s grammar: counts structured `## TODOs` rows (`N` / `T<n>[.<n>[a]]`) and `## Final Verification Wave` rows (`F<n>` / `H<n>`), each followed by `.`, space, `-` or em-dash; falls back to simple top-level checkboxes when there are no structured sections, or when they count nothing while checkboxes sit under another heading. `[~]` (blocked) counts toward `total` only, never `completed` or `remaining`. Skips fenced blocks and respects `#`/`##` section boundaries.
|
|
36
36
|
- `src/codex-hook.ts`: Stop hook; fills nine placeholders into `directive.md` - `PLAN_NAME`, `PLAN_PATH`, `BOULDER_PATH`, `REMAINING_COUNT`, `TOTAL_COUNT`, `NEXT_TASK_LABEL`, `WORKTREE_BLOCK`, `LEDGER_PATH`, `SESSION_ID`. `WORKTREE_BLOCK` renders empty when the work has no worktree. When `remaining === 0`, `nextTaskLabel` is null and renders as "none (final gate pending)". SubagentStop is intentionally accepted by the CLI as a no-op for compatibility, but never injects a root plan.
|
|
37
37
|
- **Context-pressure suppression:** the hook reads `input.transcript_path` through the injected `ReadonlyFileSystem` and returns `""` (no continuation) when the transcript carries any context-pressure marker (`context compacted`, `context_length_exceeded`, `context_too_large`, `codex ran out of room in the model's context window`, and related phrasings). This is the safety valve against an infinite continuation loop once the context window is exhausted; it is pinned by a `#given context-window pressure` test.
|
|
38
38
|
- `directive.md`: directive template with placeholders, applied per invocation.
|
|
@@ -14,9 +14,10 @@ var TODO_HEADING_PATTERN = /^##[ \t]+TODOs(?:[ \t]+#+)?[ \t]*$/i;
|
|
|
14
14
|
var FINAL_VERIFICATION_HEADING_PATTERN = /^##[ \t]+Final Verification Wave(?:[ \t]+#+)?[ \t]*$/i;
|
|
15
15
|
var SECTION_BOUNDARY_HEADING_PATTERN = /^#{1,2}(?:[ \t]+|$)/;
|
|
16
16
|
var FENCE_PATTERN = /^[ \t]{0,3}(`{3,}|~{3,})(.*)$/;
|
|
17
|
-
var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX]?)[ \t]*\][ \t]+(.+)$/;
|
|
18
|
-
var
|
|
19
|
-
var
|
|
17
|
+
var SIMPLE_CHECKBOX_PATTERN = /^[-*][ \t]*\[[ \t]*([xX~]?)[ \t]*\][ \t]+(.+)$/;
|
|
18
|
+
var STRUCTURED_CHECKBOX_PATTERN = /^- \[([ xX~])\] (.+)$/;
|
|
19
|
+
var TODO_TASK_LABEL_PATTERN = /^([1-9]\d*|T[1-9]\d*(?:\.[1-9]\d*[a-z]?)?)(?:\.[ \t]+|[ \t]+(?:[-\u2014][ \t]+)?)(.+)$/i;
|
|
20
|
+
var FINAL_WAVE_TASK_LABEL_PATTERN = /^([FH][1-9]\d*(?:\.[1-9]\d*[a-z]?)?)(?:\.[ \t]+|[ \t]+(?:[-\u2014][ \t]+)?)(.+)$/i;
|
|
20
21
|
function getPlanChecklist(planPath) {
|
|
21
22
|
if (!existsSync(planPath))
|
|
22
23
|
return emptyChecklist();
|
|
@@ -32,9 +33,8 @@ function parsePlanChecklist(markdown) {
|
|
|
32
33
|
const lines = markdown.split(/\r?\n/);
|
|
33
34
|
if (!hasStructuredSection(lines))
|
|
34
35
|
return parseSimpleChecklist(lines);
|
|
35
|
-
|
|
36
|
-
let
|
|
37
|
-
let nextTaskLabel = null;
|
|
36
|
+
const counter = emptyCounter();
|
|
37
|
+
let hasUntrackedTopLevelCheckbox = false;
|
|
38
38
|
let section = "other";
|
|
39
39
|
let fence = null;
|
|
40
40
|
for (const line of lines) {
|
|
@@ -52,19 +52,30 @@ function parsePlanChecklist(markdown) {
|
|
|
52
52
|
section = parseStructuredSectionHeading(line);
|
|
53
53
|
continue;
|
|
54
54
|
}
|
|
55
|
-
if (section === "other")
|
|
55
|
+
if (section === "other") {
|
|
56
|
+
if (parseSimpleTopLevelCheckbox(line) !== null)
|
|
57
|
+
hasUntrackedTopLevelCheckbox = true;
|
|
56
58
|
continue;
|
|
57
|
-
const checkbox = parseStructuredCheckbox(line, section);
|
|
58
|
-
if (checkbox === null)
|
|
59
|
-
continue;
|
|
60
|
-
if (checkbox.checked)
|
|
61
|
-
completed += 1;
|
|
62
|
-
else {
|
|
63
|
-
remaining += 1;
|
|
64
|
-
nextTaskLabel = nextTaskLabel ?? checkbox.label;
|
|
65
59
|
}
|
|
60
|
+
const checkbox = parseStructuredCheckbox(line, section);
|
|
61
|
+
if (checkbox !== null)
|
|
62
|
+
countCheckbox(counter, checkbox);
|
|
63
|
+
}
|
|
64
|
+
if (counter.total === 0 && hasUntrackedTopLevelCheckbox)
|
|
65
|
+
return parseSimpleChecklist(lines);
|
|
66
|
+
return { ...counter };
|
|
67
|
+
}
|
|
68
|
+
function emptyCounter() {
|
|
69
|
+
return { completed: 0, remaining: 0, total: 0, nextTaskLabel: null };
|
|
70
|
+
}
|
|
71
|
+
function countCheckbox(counter, checkbox) {
|
|
72
|
+
counter.total += 1;
|
|
73
|
+
if (checkbox.status === "done")
|
|
74
|
+
counter.completed += 1;
|
|
75
|
+
else if (checkbox.status === "open") {
|
|
76
|
+
counter.remaining += 1;
|
|
77
|
+
counter.nextTaskLabel = counter.nextTaskLabel ?? checkbox.label;
|
|
66
78
|
}
|
|
67
|
-
return { completed, remaining, total: completed + remaining, nextTaskLabel };
|
|
68
79
|
}
|
|
69
80
|
function hasStructuredSection(lines) {
|
|
70
81
|
let fence = null;
|
|
@@ -85,9 +96,7 @@ function hasStructuredSection(lines) {
|
|
|
85
96
|
return false;
|
|
86
97
|
}
|
|
87
98
|
function parseSimpleChecklist(lines) {
|
|
88
|
-
|
|
89
|
-
let remaining = 0;
|
|
90
|
-
let nextTaskLabel = null;
|
|
99
|
+
const counter = emptyCounter();
|
|
91
100
|
let fence = null;
|
|
92
101
|
for (const line of lines) {
|
|
93
102
|
if (fence !== null) {
|
|
@@ -101,16 +110,10 @@ function parseSimpleChecklist(lines) {
|
|
|
101
110
|
continue;
|
|
102
111
|
}
|
|
103
112
|
const checkbox = parseSimpleTopLevelCheckbox(line);
|
|
104
|
-
if (checkbox
|
|
105
|
-
|
|
106
|
-
if (checkbox.checked)
|
|
107
|
-
completed += 1;
|
|
108
|
-
else {
|
|
109
|
-
remaining += 1;
|
|
110
|
-
nextTaskLabel = nextTaskLabel ?? checkbox.label;
|
|
111
|
-
}
|
|
113
|
+
if (checkbox !== null)
|
|
114
|
+
countCheckbox(counter, checkbox);
|
|
112
115
|
}
|
|
113
|
-
return {
|
|
116
|
+
return { ...counter };
|
|
114
117
|
}
|
|
115
118
|
function parseStructuredSectionHeading(line) {
|
|
116
119
|
if (TODO_HEADING_PATTERN.test(line))
|
|
@@ -120,13 +123,15 @@ function parseStructuredSectionHeading(line) {
|
|
|
120
123
|
return "other";
|
|
121
124
|
}
|
|
122
125
|
function parseStructuredCheckbox(line, section) {
|
|
123
|
-
const
|
|
124
|
-
const match = line.match(pattern);
|
|
126
|
+
const match = line.match(STRUCTURED_CHECKBOX_PATTERN);
|
|
125
127
|
const marker = match?.[1];
|
|
126
128
|
const label = match?.[2];
|
|
127
129
|
if (marker === undefined || label === undefined)
|
|
128
130
|
return null;
|
|
129
|
-
|
|
131
|
+
const labelPattern = section === "todo" ? TODO_TASK_LABEL_PATTERN : FINAL_WAVE_TASK_LABEL_PATTERN;
|
|
132
|
+
if (!labelPattern.test(label))
|
|
133
|
+
return null;
|
|
134
|
+
return { status: parseCheckboxStatus(marker), label };
|
|
130
135
|
}
|
|
131
136
|
function parseSimpleTopLevelCheckbox(line) {
|
|
132
137
|
const match = line.match(SIMPLE_CHECKBOX_PATTERN);
|
|
@@ -134,7 +139,12 @@ function parseSimpleTopLevelCheckbox(line) {
|
|
|
134
139
|
const label = match?.[2];
|
|
135
140
|
if (marker === undefined || label === undefined)
|
|
136
141
|
return null;
|
|
137
|
-
return {
|
|
142
|
+
return { status: parseCheckboxStatus(marker), label };
|
|
143
|
+
}
|
|
144
|
+
function parseCheckboxStatus(marker) {
|
|
145
|
+
if (marker.toLowerCase() === "x")
|
|
146
|
+
return "done";
|
|
147
|
+
return marker === "~" ? "in-progress" : "open";
|
|
138
148
|
}
|
|
139
149
|
function parseOpeningFence(line) {
|
|
140
150
|
const match = line.match(FENCE_PATTERN);
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"type": "command",
|
|
8
8
|
"command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
|
|
9
9
|
"timeout": 10,
|
|
10
|
-
"statusMessage": "(OmO 5.
|
|
10
|
+
"statusMessage": "(OmO 5.1.0) Checking Ulw-Execute Continuation"
|
|
11
11
|
}
|
|
12
12
|
]
|
|
13
13
|
}
|