oh-my-opencode 4.17.0 → 4.17.1

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 (117) hide show
  1. package/.agents/command/publish.md +31 -58
  2. package/.agents/skills/pre-publish-review/SKILL.md +1 -1
  3. package/.agents/skills/publish/SKILL.md +32 -59
  4. package/.opencode/command/publish.md +31 -58
  5. package/.opencode/skills/pre-publish-review/SKILL.md +1 -1
  6. package/dist/cli/index.js +30 -27
  7. package/dist/cli-node/index.js +30 -27
  8. package/dist/index.js +202 -254
  9. package/dist/skills/review-work/SKILL.md +10 -2
  10. package/dist/skills/start-work/SKILL.md +1 -1
  11. package/dist/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
  12. package/dist/skills/ultimate-browsing/engine/templates/package.json +1 -1
  13. package/dist/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  14. package/dist/skills/ulw-plan/SKILL.md +2 -1
  15. package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
  16. package/dist/skills/ulw-plan/references/intent-unclear.md +4 -4
  17. package/dist/skills/visual-qa/SKILL.md +9 -5
  18. package/dist/tui.js +8 -3
  19. package/package.json +13 -13
  20. package/packages/lsp-daemon/dist/cli.js +7 -13
  21. package/packages/lsp-daemon/dist/daemon-client.js +3 -5
  22. package/packages/lsp-daemon/dist/index.js +12 -18
  23. package/packages/lsp-daemon/dist/request-routing.js +6 -8
  24. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  25. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +398 -400
  26. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  27. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  28. package/packages/omo-codex/plugin/components/codegraph/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  32. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/lsp/dist/cli.js +14 -14
  36. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  37. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.5.md +2 -2
  39. package/packages/omo-codex/plugin/components/rules/bundled-rules/hephaestus/gpt-5.6.md +2 -2
  40. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  41. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  42. package/packages/omo-codex/plugin/components/start-work-continuation/hooks/hooks.json +2 -2
  43. package/packages/omo-codex/plugin/components/start-work-continuation/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/teammode/AGENTS.md +2 -2
  45. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  46. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  47. package/packages/omo-codex/plugin/components/teammode/skills/teammode/SKILL.md +33 -16
  48. package/packages/omo-codex/plugin/components/teammode/skills/teammode/scripts/team.mjs +2 -1
  49. package/packages/omo-codex/plugin/components/teammode/test/v2-spawn-schema.test.ts +69 -0
  50. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  51. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  52. package/packages/omo-codex/plugin/components/ultrawork/agents/plan.toml +3 -3
  53. package/packages/omo-codex/plugin/components/ultrawork/directive.md +29 -17
  54. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  55. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  56. package/packages/omo-codex/plugin/components/ultrawork/skills/ultrawork/SKILL.md +29 -17
  57. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +2 -1
  58. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  59. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/intent-unclear.md +4 -4
  60. package/packages/omo-codex/plugin/components/ultrawork/test/codex-hook.test.ts +9 -6
  61. package/packages/omo-codex/plugin/components/ulw-loop/directive.md +29 -17
  62. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +4 -4
  63. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  64. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/SKILL.md +1 -1
  65. package/packages/omo-codex/plugin/components/ulw-loop/skills/ulw-loop/references/full-workflow.md +2 -2
  66. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-codegraph-init-guidance.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/session-start-checking-codegraph-bootstrap.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  82. package/packages/omo-codex/plugin/hooks/stop-checking-start-work-continuation.json +1 -1
  83. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  84. package/packages/omo-codex/plugin/hooks/subagent-stop-checking-start-work-continuation.json +1 -1
  85. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  86. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  87. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  88. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  89. package/packages/omo-codex/plugin/package-lock.json +13 -13
  90. package/packages/omo-codex/plugin/package.json +1 -1
  91. package/packages/omo-codex/plugin/skills/review-work/SKILL.md +10 -2
  92. package/packages/omo-codex/plugin/skills/start-work/SKILL.md +1 -1
  93. package/packages/omo-codex/plugin/skills/teammode/SKILL.md +33 -16
  94. package/packages/omo-codex/plugin/skills/teammode/scripts/team.mjs +2 -1
  95. package/packages/omo-codex/plugin/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
  96. package/packages/omo-codex/plugin/skills/ultimate-browsing/engine/templates/package.json +1 -1
  97. package/packages/omo-codex/plugin/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  98. package/packages/omo-codex/plugin/skills/ultrawork/SKILL.md +29 -17
  99. package/packages/omo-codex/plugin/skills/ulw-loop/SKILL.md +1 -1
  100. package/packages/omo-codex/plugin/skills/ulw-loop/references/full-workflow.md +2 -2
  101. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +2 -1
  102. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  103. package/packages/omo-codex/plugin/skills/ulw-plan/references/intent-unclear.md +4 -4
  104. package/packages/omo-codex/plugin/skills/visual-qa/SKILL.md +9 -5
  105. package/packages/omo-codex/plugin/test/sync-skills.test.mjs +1 -1
  106. package/packages/omo-codex/plugin/test/teammode-transport.test.mjs +25 -0
  107. package/packages/omo-codex/plugin/test/ulw-plan-scope-contract.test.mjs +24 -0
  108. package/packages/omo-codex/scripts/install-dist/install-local.mjs +9 -11
  109. package/packages/shared-skills/skills/review-work/SKILL.md +10 -2
  110. package/packages/shared-skills/skills/start-work/SKILL.md +1 -1
  111. package/packages/shared-skills/skills/ultimate-browsing/ATTRIBUTION.md +2 -2
  112. package/packages/shared-skills/skills/ultimate-browsing/engine/templates/package.json +1 -1
  113. package/packages/shared-skills/skills/ultimate-browsing/references/chrome-stealth.md +11 -11
  114. package/packages/shared-skills/skills/ulw-plan/SKILL.md +2 -1
  115. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  116. package/packages/shared-skills/skills/ulw-plan/references/intent-unclear.md +4 -4
  117. package/packages/shared-skills/skills/visual-qa/SKILL.md +9 -5
@@ -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 4.17.0) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 4.17.1) Checking Bootstrap Provisioning"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-bootstrap",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
4
4
  "description": "Codex SessionStart bootstrap component that provisions LazyCodex runtime dependencies from a detached worker.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-codegraph",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
4
4
  "description": "Codex plugin MCP wrapper for CodeGraph.",
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 4.17.0) Checking Comments"
11
+ "statusMessage": "(OmO 4.17.1) Checking Comments"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-comment-checker",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
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 4.17.0) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 4.17.1) 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.17.0) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 4.17.1) 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": "4.17.0",
3
+ "version": "4.17.1",
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 4.17.0) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 4.17.1) 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": "4.17.0",
3
+ "version": "4.17.1",
4
4
  "description": "Codex SubagentStop evidence verifier for LazyCodex executor completions.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1423,6 +1423,9 @@ async function disposeDefaultLspManager() {
1423
1423
  await m.stopAll();
1424
1424
  }
1425
1425
  }
1426
+ function isPlainRecord(value) {
1427
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1428
+ }
1426
1429
  function isProcessAlive(pid) {
1427
1430
  if (!Number.isInteger(pid) || pid <= 0)
1428
1431
  return false;
@@ -3313,10 +3316,10 @@ function sendToolCall(socketPath, name, args, timeoutMs) {
3313
3316
  });
3314
3317
  }
3315
3318
  function toToolResult(message) {
3316
- if (!isRecord6(message) || message["id"] !== REQUEST_ID)
3319
+ if (!isPlainRecord(message) || message["id"] !== REQUEST_ID)
3317
3320
  return null;
3318
3321
  const result = message["result"];
3319
- if (!isRecord6(result) || !Array.isArray(result["content"]))
3322
+ if (!isPlainRecord(result) || !Array.isArray(result["content"]))
3320
3323
  return null;
3321
3324
  return {
3322
3325
  content: result["content"],
@@ -3324,9 +3327,6 @@ function toToolResult(message) {
3324
3327
  details: result["details"]
3325
3328
  };
3326
3329
  }
3327
- function isRecord6(value) {
3328
- return typeof value === "object" && value !== null && !Array.isArray(value);
3329
- }
3330
3330
  function errorText(error) {
3331
3331
  return error instanceof Error ? error.message : String(error);
3332
3332
  }
@@ -3450,7 +3450,7 @@ function readSessionState(path) {
3450
3450
  return parsed;
3451
3451
  return emptyState();
3452
3452
  } catch (error) {
3453
- if (error instanceof SyntaxError || isRecord7(error) && error["code"] === "ENOENT")
3453
+ if (error instanceof SyntaxError || isRecord6(error) && error["code"] === "ENOENT")
3454
3454
  return emptyState();
3455
3455
  throw error;
3456
3456
  }
@@ -3471,12 +3471,12 @@ function safePathSegment(value) {
3471
3471
  return value.replace(/[^A-Za-z0-9._-]/g, "_").slice(0, 120) || "unknown-session";
3472
3472
  }
3473
3473
  function isLspSessionState(value) {
3474
- if (!isRecord7(value) || !Array.isArray(value["unavailableExtensions"]))
3474
+ if (!isRecord6(value) || !Array.isArray(value["unavailableExtensions"]))
3475
3475
  return false;
3476
3476
  const postCompactProbePending = value["postCompactProbePending"];
3477
3477
  return value["unavailableExtensions"].every((item) => typeof item === "string") && (postCompactProbePending === undefined || typeof postCompactProbePending === "boolean");
3478
3478
  }
3479
- function isRecord7(value) {
3479
+ function isRecord6(value) {
3480
3480
  return typeof value === "object" && value !== null && !Array.isArray(value);
3481
3481
  }
3482
3482
 
@@ -3487,7 +3487,7 @@ function extractMutatedFilePaths(input) {
3487
3487
  return [];
3488
3488
  if (isFailedToolResponse(input.tool_response))
3489
3489
  return [];
3490
- const toolInput = isRecord9(input.tool_input) ? input.tool_input : {};
3490
+ const toolInput = isRecord7(input.tool_input) ? input.tool_input : {};
3491
3491
  const paths = new Set;
3492
3492
  addStringValue(paths, toolInput["path"]);
3493
3493
  addStringValue(paths, toolInput["filePath"]);
@@ -3506,7 +3506,7 @@ function isMutationTool(value) {
3506
3506
  return MUTATION_TOOL_NAMES.has(value.toLowerCase());
3507
3507
  }
3508
3508
  function isFailedToolResponse(value) {
3509
- if (!isRecord9(value))
3509
+ if (!isRecord7(value))
3510
3510
  return false;
3511
3511
  return value["isError"] === true || value["is_error"] === true || value["error"] === true || value["status"] === "error";
3512
3512
  }
@@ -3549,7 +3549,7 @@ function addPatchFiles(paths, value) {
3549
3549
  if (!Array.isArray(value))
3550
3550
  return;
3551
3551
  for (const item of value) {
3552
- if (!isRecord9(item))
3552
+ if (!isRecord7(item))
3553
3553
  continue;
3554
3554
  addStringValue(paths, item["path"]);
3555
3555
  addStringValue(paths, item["filePath"]);
@@ -3558,7 +3558,7 @@ function addPatchFiles(paths, value) {
3558
3558
  addStringValue(paths, item["move_path"]);
3559
3559
  }
3560
3560
  }
3561
- function isRecord9(value) {
3561
+ function isRecord7(value) {
3562
3562
  return typeof value === "object" && value !== null && !Array.isArray(value);
3563
3563
  }
3564
3564
 
@@ -3742,7 +3742,7 @@ function limitHookText(text2, maxChars) {
3742
3742
  function isCleanDiagnostics(diagnostics) {
3743
3743
  return diagnostics.length === 0 || diagnostics === CLEAN_DIAGNOSTICS_TEXT || diagnostics.startsWith(UNSUPPORTED_EXTENSION_TEXT);
3744
3744
  }
3745
- function isRecord10(value) {
3745
+ function isRecord8(value) {
3746
3746
  return typeof value === "object" && value !== null && !Array.isArray(value);
3747
3747
  }
3748
3748
 
@@ -3759,7 +3759,7 @@ async function runHookCli(runHook, stdin) {
3759
3759
  if (!raw.trim())
3760
3760
  return;
3761
3761
  const parsed = JSON.parse(raw);
3762
- const input = isRecord10(parsed) ? parsed : {};
3762
+ const input = isRecord8(parsed) ? parsed : {};
3763
3763
  const output = await runHook(input);
3764
3764
  if (output)
3765
3765
  process.stdout.write(output);
@@ -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.17.0) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 4.17.1) 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.17.0) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 4.17.1) 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": "4.17.0",
3
+ "version": "4.17.1",
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",
@@ -45,7 +45,7 @@ Read-only Codex subagent roles live in `CODEX_HOME/agents/`. Spawn: `multi_agent
45
45
 
46
46
  - `explorer` - codebase search
47
47
  - `librarian` - external docs, OSS code, API contracts
48
- - `plan` - planning for ambiguous, multi-module work
48
+ - `plan` - planning when design is still open after discovery; never for a known checklist or for work being delegated onward
49
49
  - `lazycodex-gate-reviewer` - final verification of a finished change
50
50
 
51
51
  Spawn subagents in parallel for independent investigations; do non-overlapping prep while they run, integrate on return. Never duplicate a running search or poll without a completion signal. While children run, post brief status updates (active subagent count, latest `WORKING:` phase).
@@ -74,7 +74,7 @@ Diagnostics catch type errors, not logic bugs; tests cover only what their autho
74
74
 
75
75
  # Global Review and Debugging Gate
76
76
 
77
- Before declaring significant work or a PR handoff complete, run `review-work` plus a `debugging` runtime audit; record three debugging hypotheses with runtime evidence each. Timeout, missing deliverable, ack-only, `BLOCKED:`, or inconclusive lanes fail the gate. Redact secrets, tokens, and PII from ledgers, PR bodies, and handoffs.
77
+ Run `review-work` plus a `debugging` runtime audit only before a PR handoff or when the user asks for a review; lane pass/fail semantics live in those skills. For everything else, the gate above is the whole gate: once you have personally observed the artifact working, report your evidence. Redact secrets, tokens, and PII from ledgers, PR bodies, and handoffs.
78
78
 
79
79
  # Failure Recovery
80
80
 
@@ -33,7 +33,7 @@ Read-only Codex subagent roles live in `CODEX_HOME/agents/`. Spawn: `multi_agent
33
33
 
34
34
  - `explorer` - codebase search
35
35
  - `librarian` - external docs, OSS code, API contracts
36
- - `plan` - planning for ambiguous, multi-module work
36
+ - `plan` - planning when design is still open after discovery; never for a known checklist or for work being delegated onward
37
37
  - `lazycodex-gate-reviewer` - final verification of a finished change
38
38
 
39
39
  Spawn in parallel for independent investigations; do non-overlapping prep while they run, integrate on return. Never duplicate a running search or poll without a completion signal; post brief status updates while children run (active subagent count, latest `WORKING:` phase).
@@ -50,7 +50,7 @@ Diagnostics catch type errors, not logic bugs; tests cover only what their autho
50
50
 
51
51
  "This should work" from reading source does not pass. A defect found in usage is yours to fix this turn.
52
52
 
53
- Before declaring significant work or a PR handoff complete, run `review-work` plus a `debugging` runtime audit; record three debugging hypotheses with runtime evidence each. Timeout, missing deliverable, ack-only, `BLOCKED:`, or inconclusive lanes fail the gate. Redact secrets, tokens, and PII from ledgers, PR bodies, and handoffs.
53
+ Run `review-work` plus a `debugging` runtime audit only before a PR handoff or when the user asks for a review; lane pass/fail semantics live in those skills. For everything else, the gate above is the whole gate: once you have personally observed the artifact working, report your evidence. Redact secrets, tokens, and PII from ledgers, PR bodies, and handoffs.
54
54
 
55
55
  # Failure Recovery
56
56
 
@@ -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.17.0) Loading Project Rules"
10
+ "statusMessage": "(OmO 4.17.1) 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.17.0) Loading Project Rules"
22
+ "statusMessage": "(OmO 4.17.1) 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.17.0) Matching Project Rules"
35
+ "statusMessage": "(OmO 4.17.1) 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.17.0) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 4.17.1) 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": "4.17.0",
3
+ "version": "4.17.1",
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",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 4.17.0) Checking Start-Work Continuation"
10
+ "statusMessage": "(OmO 4.17.1) Checking Start-Work Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -19,7 +19,7 @@
19
19
  "type": "command",
20
20
  "command": "node \"${PLUGIN_ROOT}/components/start-work-continuation/dist/cli.js\" hook subagent-stop",
21
21
  "timeout": 10,
22
- "statusMessage": "(OmO 4.17.0) Checking Start-Work Continuation"
22
+ "statusMessage": "(OmO 4.17.1) Checking Start-Work Continuation"
23
23
  }
24
24
  ]
25
25
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-start-work-continuation",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex start-work plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,14 +7,14 @@
7
7
  Codex team-mode component. Two deliverables in one dir:
8
8
 
9
9
  - **PostToolUse hook** (`@sisyphuslabs/codex-teammode`): fires after `create_thread` / `codex_app.create_thread`, injects `additionalContext` telling Codex to call `codex_app.set_thread_title` NOW with the real task/role. If the response carries only `pendingWorktreeId`, it instead warns: do NOT `bind-thread` or send the member bootstrap until a real thread id exists.
10
- - **`teammode` skill**: script-driven orchestration of a named team of Codex workers on ONE immutable transport chosen at init: `multi_agent_v2` (preferred; members are native flat `spawn_agent` agents addressed by `task_name` / `/root/<task_name>` agent path, messaged with `send_message`/`followup_task`) or `codex_app` (fallback; members are app threads addressed by thread id). The leader inspects the active tool list and announces the selected transport to the user BEFORE `init`. Main session is ALWAYS the leader (orchestrates, verifies, integrates - never writes product code); members defined by a concrete part, ownership area, or perspective (`lens`), never job titles. Durable state under `.omo/teams/{session_id}/`: `team.json` + auto-generated `guide.md` member field manual + `artifacts/` exchange dir.
10
+ - **`teammode` skill**: script-driven orchestration of a named team of Codex workers on ONE immutable transport chosen at init: `multi_agent_v2` (preferred; members are native flat `spawn_agent` agents addressed by `task_name` / `/root/<task_name>` agent path, messaged with `send_message`/`followup_task`) or `codex_app` (fallback; members are app threads addressed by thread id). The leader inspects the active tool list (checking `tool_search` for deferred tools when neither set is visible), announces the selected route to the user BEFORE `init`, and when neither set exists announces teammode unavailable and splits the work across plain subagents without creating team state. Main session is ALWAYS the leader (orchestrates, verifies, integrates - never writes product code); members defined by a concrete part, ownership area, or perspective (`lens`), never job titles. Durable state under `.omo/teams/{session_id}/`: `team.json` + auto-generated `guide.md` member field manual + `artifacts/` exchange dir.
11
11
 
12
12
  ## KEY FILES
13
13
 
14
14
  - `src/codex-hook.ts` - payload parse, thread/pendingWorktree extraction from object OR JSON-string tool_response, reminder text (ids whitespace-normalized, truncated at 200 chars).
15
15
  - `src/cli.ts` - argv dispatch; only `hook post-tool-use`.
16
16
  - `hooks/hooks.json` - matcher `^(create_thread|codex_app\.create_thread)$`, runs `node ${PLUGIN_ROOT}/dist/cli.js hook post-tool-use`, timeout 10.
17
- - `skills/teammode/SKILL.md` - leader protocol: transport selection + pre-init user announcement, team-vs-subagent decision matrix, per-transport create/communicate/worktree/archive flows, ulw-plan parallel-wave mapping, "Let members work - do not rush them" (4-reason message gate; quiet between heartbeats = working, not stalled), archive/delete/stop rules.
17
+ - `skills/teammode/SKILL.md` - leader protocol: transport selection (V2 -> codex_app -> `tool_search` check -> plain-subagent fallback) + pre-init user announcement, V2 spawn schema (`task_name`, `message`, `fork_turns`) with role/tier guidance carried in the bootstrap message, team-vs-subagent decision matrix, per-transport create/communicate/worktree/archive flows, ulw-plan parallel-wave mapping, "Let members work - do not rush them" (4-reason message gate; quiet between heartbeats = working, not stalled), archive/delete/stop rules.
18
18
  - `skills/teammode/scripts/team.mjs` - controller CLI: init / add-member / bind-agent / bind-thread / member-prompt / set-status / worktree-add / worktree-remove / integrate / archive / delete / status / guide. Zero npm deps, node builtins only, runs under node or bun on all 3 OSes.
19
19
  - `skills/teammode/scripts/team-transport.mjs` - transport identity: `TEAM_TRANSPORTS`, task-name validation (`[a-z0-9_]+`, never `root`), `/root/<task_name>` agent-path derivation, per-operation transport guards.
20
20
  - `skills/teammode/scripts/team-state.mjs` - state model + persistence: per-team `.team.lock` dir lock (`owner.json`; `OMO_TEAMMODE_LOCK_TIMEOUT_MS` / `OMO_TEAMMODE_LOCK_RETRY_MS`), atomic tmp+rename writes, symlink- and escape-guarded team dirs, schemaVersion 3 (legacy 2 migrates in memory to `codex_app` and persists on the next mutation), `MIN_MEMBERS = 2`, unique focus/name invariants plus per-transport identity invariants (taskName/agentPath on V2, threadTitle on codex_app).
@@ -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 4.17.0) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 4.17.1) Checking Thread Title Hygiene"
12
12
  }
13
13
  ]
14
14
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/codex-teammode",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
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,
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: teammode
3
- description: "Codex-only team orchestration: run a named team of cooperating Codex workers with durable, script-managed state. MUST USE when the user asks Codex to create, run, coordinate, inspect, archive, or delete a team of agents/threads/sessions, or to work on something as a team in parallel. FIRST inspects the active tool surface and tells the user which transport it selected: native MultiAgentV2 agents (flat spawn_agent with task_name) when available, Codex App threads as the fallback. The main session is always the leader; members are defined by a concrete part, ownership area, or perspective - never a vague job role; a bundled cross-platform script writes the .omo/teams state plus an auto-generated member field manual. Use a team when the work is not perfectly isolated but parallelizing helps; use plain subagents when scope is perfectly isolated or the goal is ambiguous. Triggers: team mode, teammode, make a team, run as a team, team of agents, coordinate threads, parallel Codex threads, archive the team."
3
+ description: "Codex-only team orchestration: run a named team of cooperating Codex workers with durable, script-managed state. MUST USE when the user asks Codex to create, run, coordinate, inspect, archive, or delete a team of agents/threads/sessions, or to work on something as a team in parallel. FIRST inspects the active tool surface (checking tool_search for deferred tools) and tells the user the route: native MultiAgentV2 agents (flat spawn_agent with task_name) when available, Codex App threads as the fallback, or a plain-subagent split when neither set exists. The main session is always the leader; members are defined by a concrete part, ownership area, or perspective - never a vague job role; a bundled cross-platform script writes the .omo/teams state plus an auto-generated member field manual. Use a team when the work is not perfectly isolated but parallelizing helps; use plain subagents when scope is perfectly isolated or the goal is ambiguous. Triggers: team mode, teammode, make a team, run as a team, team of agents, coordinate threads, parallel Codex threads, archive the team."
4
4
  ---
5
5
 
6
6
  # Teammode
@@ -40,17 +40,31 @@ Inspect your active tool list and select:
40
40
  2. **Codex App threads (fallback)** - select when flat V2 is not available but the
41
41
  `codex_app.*` thread tools are (`create_thread`, `read_thread`, `send_message_to_thread`,
42
42
  `set_thread_title`, `set_thread_archived`).
43
- 3. **Neither complete set available** - STOP before `init`. Tell the user which tools are
44
- missing; do not fake a team with partial tooling.
45
-
46
- Then, BEFORE running `init`, tell the user in one line which transport you selected and why,
47
- e.g. `Teammode transport: MultiAgentV2 (flat spawn_agent with task_name).` or
48
- `Teammode transport: Codex App threads (flat V2 tools not present in this session).`
49
-
50
- Pass that choice to `init` as `--transport multi_agent_v2` or `--transport codex_app`. The
43
+ 3. **Neither set visible** - if a `tool_search` tool is active, search for the missing sets
44
+ (e.g. `spawn_agent`, `codex_app`) before concluding: some environments defer tools behind
45
+ tool search. A hit is only a lead: revalidate that the visible result is the COMPLETE,
46
+ mutually compatible transport set from case 1 or 2 before selecting it. Do not combine
47
+ partial hits from different transports.
48
+ 4. **Neither set exists** - teammode cannot run here. Do NOT run `init` or fake a team with
49
+ partial tooling. If another visible plain-subagent mechanism can independently spawn,
50
+ communicate with, and observe plain workers, announce that exact mechanism and use it for
51
+ non-overlapping scopes. Otherwise continue serially and report the capability limitation;
52
+ never promise or imply plain subagents that this session cannot create.
53
+
54
+ Then, BEFORE running `init` (or instead of it in case 4), tell the user in one line what this
55
+ environment provides and which route you picked:
56
+ - `Teammode transport: MultiAgentV2 (flat spawn_agent with task_name).`
57
+ - `Teammode transport: Codex App threads (flat V2 tools not present in this session).`
58
+ - `Teammode unavailable: neither MultiAgentV2 nor codex_app tools exist in this session -
59
+ using <visible plain-subagent mechanism> for independent scopes.`
60
+ - `Teammode unavailable: neither MultiAgentV2 nor codex_app tools exist in this session, and
61
+ no compatible plain-subagent mechanism is available - continuing serially.`
62
+
63
+ Pass the choice to `init` as `--transport multi_agent_v2` or `--transport codex_app`. The
51
64
  transport is recorded in `team.json` and is IMMUTABLE for the team's lifetime: a V2 spawn
52
65
  failure is a V2 blocker to report, never permission to mix Codex App threads into the same
53
- team. Never probe by trial-calling tools; read your tool list.
66
+ team. Never probe by trial-calling tools; read your tool list, and search it with
67
+ `tool_search` only when a needed set is not visible.
54
68
 
55
69
  ## You are the leader - orchestrate, do not implement
56
70
 
@@ -126,10 +140,13 @@ teams, and a refused command never changes `team.json`.
126
140
  **MultiAgentV2 teams:**
127
141
  1. If a member needs an isolated worktree, run `worktree-add` BEFORE spawning it - flat
128
142
  `spawn_agent` has no cwd argument, so the path must ride in the bootstrap message.
129
- 2. Spawn each member with flat `spawn_agent`: `task_name` is that member's `--task-name`,
130
- `message` is the bootstrap printed by `add-member` / `member-prompt`, and
131
- `fork_turns: "none"` (members read `guide.md` for context; full parent history is not
132
- their context model). Do not set `agent_type`, `model`, or `reasoning_effort`.
143
+ 2. Spawn each member with flat `spawn_agent` using only the V2 schema fields:
144
+ `task_name` is that member's `--task-name`, `message` is the bootstrap printed by
145
+ `add-member` / `member-prompt`, and `fork_turns` is `"none"` (members read
146
+ `guide.md` for context; full parent history is not their context model). Put any
147
+ role, priority, or task-specific routing instruction in `message`; V2 does not accept
148
+ `agent_type`, `model`, `reasoning_effort`, or `service_tier`, so members inherit the
149
+ session model.
133
150
  3. `bind-agent --agent-path` with the canonical task name the spawn returned (normally
134
151
  `/root/<task_name>`); binding confirms the runtime identity matches the roster and records
135
152
  the member's cwd. Members are durable: they persist as subagent threads, survive idling,
@@ -272,5 +289,5 @@ is never disbanded is a leak.
272
289
  - Member communication stays English unless the user explicitly requests otherwise; user-facing
273
290
  replies follow the user's language.
274
291
  - Stop if the selected transport's tools (V2 spawn/message/wait/list/interrupt, or Codex App
275
- create/read/send/title/archive) are unavailable or stop working; say so instead of faking it
276
- or silently switching transports.
292
+ create/read/send/title/archive) stop working mid-run; say so instead of faking it or silently
293
+ switching transports. Pre-init absence is not a stop - it routes to the plain-subagent split.
@@ -44,6 +44,7 @@ import {
44
44
  import { isMultiAgentV2, parseTeamTransport } from "./team-transport.mjs";
45
45
  import { addMemberWorktree, integrateMemberBranch, removeMemberWorktree } from "./team-worktree.mjs";
46
46
 
47
+
47
48
  function parseFlags(args) {
48
49
  const flags = { _: [] };
49
50
  for (let i = 0; i < args.length; i++) {
@@ -149,7 +150,7 @@ const handlers = {
149
150
  return { team, member: team.members.find((m) => m.id === memberId) };
150
151
  });
151
152
  const delivery = isMultiAgentV2(team)
152
- ? `Send this as spawn_agent message (task_name "${member.taskName}", fork_turns "none"), then bind-agent --agent-path "${member.agentPath}"`
153
+ ? `Send this with spawn_agent using only task_name "${member.taskName}", message <bootstrap>, and fork_turns "none"; then bind-agent --agent-path "${member.agentPath}"`
153
154
  : `Send this as the new thread's first message (title the thread "${member.threadTitle}")`;
154
155
  process.stdout.write(`added member ${memberId} to team ${sessionId}.\n\n${delivery}:\n---\n${buildMemberPrompt(team, memberId)}\n---\n`);
155
156
  },
@@ -0,0 +1,69 @@
1
+ import { describe, expect, it } from "bun:test";
2
+ import { mkdtemp, rm } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+
7
+ const teamScriptPath = fileURLToPath(new URL("../skills/teammode/scripts/team.mjs", import.meta.url));
8
+
9
+ describe("MultiAgentV2 spawn schema", () => {
10
+ it("#given a team member #when preparing its native spawn #then emits only exposed V2 fields", async () => {
11
+ // given
12
+ const root = await mkdtemp(join(tmpdir(), "omo-teammode-v2-schema-"));
13
+ try {
14
+ const init = Bun.spawnSync({
15
+ cmd: [
16
+ process.execPath,
17
+ teamScriptPath,
18
+ "init",
19
+ "--name",
20
+ "Schema",
21
+ "--session-name",
22
+ "schema",
23
+ "--session",
24
+ "schema",
25
+ "--transport",
26
+ "multi_agent_v2",
27
+ ],
28
+ cwd: root,
29
+ stdout: "pipe",
30
+ stderr: "pipe",
31
+ });
32
+ expect(init.exitCode).toBe(0);
33
+
34
+ // when
35
+ const added = Bun.spawnSync({
36
+ cmd: [
37
+ process.execPath,
38
+ teamScriptPath,
39
+ "add-member",
40
+ "--team",
41
+ "schema",
42
+ "--id",
43
+ "A",
44
+ "--name",
45
+ "schema-member",
46
+ "--task-name",
47
+ "schema_member",
48
+ "--focus",
49
+ "spawn schema",
50
+ "--lens",
51
+ "area",
52
+ "--deliverable",
53
+ "schema contract",
54
+ ],
55
+ cwd: root,
56
+ stdout: "pipe",
57
+ stderr: "pipe",
58
+ });
59
+ const delivery = new TextDecoder().decode(added.stdout);
60
+
61
+ // then
62
+ expect(added.exitCode).toBe(0);
63
+ expect(delivery).toContain('using only task_name "schema_member", message <bootstrap>, and fork_turns "none"');
64
+ expect(delivery).not.toMatch(/agent_type|model|reasoning_effort|service_tier/);
65
+ } finally {
66
+ await rm(root, { force: true, recursive: true });
67
+ }
68
+ });
69
+ });
@@ -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 4.17.0) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 4.17.1) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "4.17.0",
3
+ "version": "4.17.1",
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",
@@ -1,17 +1,17 @@
1
1
  name = "plan"
2
- description = "Strategic planning consultant. Produces a single executable work plan from a vague or large request. Planner only - never implements. Writes the plan to .omo/plans/<slug>.md."
2
+ description = "Strategic planning consultant for work with unresolved design uncertainty after discovery. Produces one executable plan; never implements. Writes the plan to .omo/plans/<slug>.md."
3
3
  nickname_candidates = ["Planner"]
4
4
  model = "gpt-5.6-sol"
5
5
  model_reasoning_effort = "max"
6
6
 
7
7
  developer_instructions = """
8
- Role: strategic planning consultant. You produce a single, bulletproof, executable work plan from a vague or large request.
8
+ Role: strategic planning consultant. You produce a single, bulletproof, executable work plan only when discovery leaves unresolved design uncertainty.
9
9
 
10
10
  # Identity constraint (NON-NEGOTIABLE)
11
11
  You ARE the planner. You ARE NOT an implementer. You read, search, run read-only analysis, and write exactly ONE plan file - never source code, never product builds, never the actual feature. When the caller says "do X / fix X / build X", interpret it as "create a work plan for X". If the caller explicitly demands implementation, REFUSE and answer: "I'm a planner. I produce the work plan. Spawn a worker agent or execute the plan yourself to implement."
12
12
 
13
13
  # Goal
14
- Deliver ONE executable plan that a downstream executor can follow with no further interview. Every task is atomic, with explicit references, agent-executable acceptance criteria, QA scenarios, and a commit instruction. (I fit work with 5+ interdependent steps, ambiguous scope, or multiple modules/surfaces. I am the wrong tool for a single-file edit with an obvious pattern, or when the caller already has a plan and just wants execution - say so instead of planning.)
14
+ Deliver ONE executable plan that a downstream executor can follow with no further interview. Every task is atomic, with explicit references, agent-executable acceptance criteria, QA scenarios, and a commit instruction. I fit work whose design remains open after discovery: ambiguous scope, competing decompositions, unclear boundaries, or uncertain dependency ordering. I am the wrong tool for a known checklist however many steps it has, for work the caller is delegating to another session, for a single-file edit with an obvious pattern, or when the caller already has a plan and just wants execution - say so instead of planning.
15
15
 
16
16
  # Phase 1 - Context gathering (MANDATORY - never plan blind)
17
17
  Fire parallel research BEFORE drafting: