lazycodex-ai 5.0.1 → 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.
Files changed (79) hide show
  1. package/README.ja.md +2 -1
  2. package/README.ko.md +2 -1
  3. package/README.md +2 -1
  4. package/README.ru.md +2 -1
  5. package/README.zh-cn.md +2 -1
  6. package/dist/cli/index.js +241 -144
  7. package/dist/cli-node/index.js +241 -144
  8. package/package.json +6 -1
  9. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  10. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +26 -3
  11. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  12. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  13. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  14. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  15. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  18. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  20. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  21. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  23. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  29. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/AGENTS.md +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-execute-continuation/dist/cli.js +42 -32
  32. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  33. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  34. package/packages/omo-codex/plugin/components/ulw-execute-continuation/src/plan-checklist.ts +55 -29
  35. package/packages/omo-codex/plugin/components/ulw-execute-continuation/test/boulder-reader.test.ts +51 -0
  36. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  37. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  59. package/packages/omo-codex/plugin/package-lock.json +12 -12
  60. package/packages/omo-codex/plugin/package.json +1 -1
  61. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  62. package/packages/omo-codex/plugin/skills/coding-agent-sessions/SKILL.md +1 -1
  63. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  64. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  65. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  66. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  67. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  68. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  69. package/packages/omo-codex/plugin/skills/coding-agent-sessions/scripts/find-agent-sessions.py +4 -0
  70. package/packages/omo-codex/scripts/install-dist/install-local.mjs +37 -14
  71. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  72. package/packages/shared-skills/skills/coding-agent-sessions/SKILL.md +1 -1
  73. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/aside_scanner.py +3 -0
  74. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/cli.py +4 -0
  75. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/file_scanners.py +6 -2
  76. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/scanners.py +7 -1
  77. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/transcript.py +3 -1
  78. package/packages/shared-skills/skills/coding-agent-sessions/scripts/agent_sessions/types.py +3 -1
  79. 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.0.1",
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
  ],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -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 = 16;
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(8),
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"] ?? Math.min(DEFAULT_RESIDENCY_MAX_CHILDREN, Math.max(8, resolveParallelism() * 2)),
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.0.1) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.1.0) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 30,
11
- "statusMessage": "(OmO 5.0.1) Checking Comments"
11
+ "statusMessage": "(OmO 5.1.0) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex plugin that runs comment-checker after edit-like PostToolUse hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -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.0.1) Recommending Git Bash MCP"
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.0.1) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.1.0) Resetting Git Bash MCP Reminder"
24
24
  }
25
25
  ]
26
26
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-git-bash-hook",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex hook component that reminds Windows sessions to prefer the OMO git_bash MCP.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -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.0.1) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.1.0) Verifying LazyCodex Executor Evidence"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "5.0.1",
4
- "inputDigest": "sha256:88aa873d30cdfeb3fd564cb466008d972119d6c7c72176021c38a615b8069998",
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.0.1) Checking LSP Diagnostics"
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.0.1) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.1.0) Resetting LSP Diagnostics Cache"
25
25
  }
26
26
  ]
27
27
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-lsp",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex plugin that exposes Language Server Protocol tools and post-edit diagnostics.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -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.0.1) Loading Project Rules"
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.0.1) Loading Project Rules"
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.0.1) Matching Project Rules"
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.0.1) Resetting Project Rule Cache"
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-rules",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex plugin that injects project rule files into model context through lifecycle hooks.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -8,7 +8,7 @@
8
8
  "type": "command",
9
9
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook post-tool-use",
10
10
  "timeout": 10,
11
- "statusMessage": "(OmO 5.0.1) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.1.0) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.1) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.1.0) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.1) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.1.0) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.1",
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`. 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.
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 TODO_CHECKBOX_PATTERN = /^- \[([ xX])\] ([1-9]\d*\. .+)$/;
19
- var FINAL_WAVE_CHECKBOX_PATTERN = /^- \[([ xX])\] (F[1-9]\d*\. .+)$/i;
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
- let completed = 0;
36
- let remaining = 0;
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
- let completed = 0;
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 === null)
105
- continue;
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 { completed, remaining, total: completed + remaining, nextTaskLabel };
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 pattern = section === "todo" ? TODO_CHECKBOX_PATTERN : FINAL_WAVE_CHECKBOX_PATTERN;
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
- return { checked: marker.toLowerCase() === "x", label };
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 { checked: marker.toLowerCase() === "x", label };
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.0.1) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.1.0) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",