lazycodex-ai 5.1.38 → 5.1.40

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 (64) hide show
  1. package/dist/cli/index.js +206 -187
  2. package/dist/cli-node/index.js +206 -187
  3. package/package.json +1 -1
  4. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  5. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +8 -2
  6. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  7. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  8. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  9. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  10. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  11. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  12. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  13. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  14. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  15. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  16. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  17. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  18. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  19. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  20. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  21. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +157 -151
  22. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +157 -151
  23. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  24. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  25. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/SKILL.md +1 -1
  28. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +5 -4
  29. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  30. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  32. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  33. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  34. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  35. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  36. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  37. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  38. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  39. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  40. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  41. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  42. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  43. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  44. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  45. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  46. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  47. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  48. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  49. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  50. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  54. package/packages/omo-codex/plugin/package-lock.json +12 -12
  55. package/packages/omo-codex/plugin/package.json +1 -1
  56. package/packages/omo-codex/plugin/skills/browser/runtime/omowright/manifest.json +1 -1
  57. package/packages/omo-codex/plugin/skills/git-master/SKILL.md +1 -1
  58. package/packages/omo-codex/plugin/skills/ulw-plan/SKILL.md +1 -1
  59. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +5 -4
  60. package/packages/omo-codex/scripts/install-dist/install-local.mjs +179 -168
  61. package/packages/shared-skills/skills/browser/runtime/omowright/manifest.json +1 -1
  62. package/packages/shared-skills/skills/git-master/SKILL.md +1 -1
  63. package/packages/shared-skills/skills/ulw-plan/SKILL.md +1 -1
  64. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +5 -4
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Checking Ulw-Loop Resume",
10
+ "statusMessage": "(OmO 5.1.40) Checking Ulw-Loop Resume",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook stop"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/lazycodex-executor-verify/dist/cli.js\" hook subagent-stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Verifying LazyCodex Executor Evidence",
10
+ "statusMessage": "(OmO 5.1.40) Verifying LazyCodex Executor Evidence",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\lazycodex-executor-verify\\dist\\cli.js\" hook subagent-stop"
12
12
  }
13
13
  ],
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ultrawork/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.1.38) Checking Ultrawork Trigger",
10
+ "statusMessage": "(OmO 5.1.40) Checking Ultrawork Trigger",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ultrawork\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-loop/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Checking Ulw-Loop Steering",
10
+ "statusMessage": "(OmO 5.1.40) Checking Ulw-Loop Steering",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\ulw-loop\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/rules/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.1.38) Loading Project Rules",
10
+ "statusMessage": "(OmO 5.1.40) Loading Project Rules",
11
11
  "commandWindows": "powershell -NoProfile -ExecutionPolicy Bypass -File \"${PLUGIN_ROOT}\\components\\bootstrap\\scripts\\node-dispatch.ps1\" \"${PLUGIN_ROOT}\\components\\rules\\dist\\cli.js\" hook user-prompt-submit"
12
12
  }
13
13
  ]
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@sisyphuslabs/omo-codex-plugin",
9
- "version": "5.1.38",
9
+ "version": "5.1.40",
10
10
  "workspaces": [
11
11
  "components/comment-checker",
12
12
  "components/git-bash",
@@ -95,7 +95,7 @@
95
95
  },
96
96
  "components/comment-checker": {
97
97
  "name": "@code-yeongyu/codex-comment-checker",
98
- "version": "5.1.38",
98
+ "version": "5.1.40",
99
99
  "license": "MIT",
100
100
  "bin": {
101
101
  "omo-comment-checker": "dist/cli.js"
@@ -117,7 +117,7 @@
117
117
  },
118
118
  "components/git-bash": {
119
119
  "name": "@sisyphuslabs/codex-git-bash-hook",
120
- "version": "5.1.38",
120
+ "version": "5.1.40",
121
121
  "bin": {
122
122
  "omo-git-bash-hook": "dist/cli.js"
123
123
  },
@@ -131,7 +131,7 @@
131
131
  },
132
132
  "components/lazycodex-executor-verify": {
133
133
  "name": "@code-yeongyu/codex-lazycodex-executor-verify",
134
- "version": "5.1.38",
134
+ "version": "5.1.40",
135
135
  "license": "MIT",
136
136
  "bin": {
137
137
  "lazycodex-executor-verify": "dist/cli.js"
@@ -149,7 +149,7 @@
149
149
  },
150
150
  "components/lsp": {
151
151
  "name": "@code-yeongyu/codex-lsp",
152
- "version": "5.1.38",
152
+ "version": "5.1.40",
153
153
  "license": "MIT",
154
154
  "dependencies": {
155
155
  "@code-yeongyu/lsp-daemon": "file:../../../../lsp-daemon",
@@ -171,7 +171,7 @@
171
171
  },
172
172
  "components/rules": {
173
173
  "name": "@code-yeongyu/codex-rules",
174
- "version": "5.1.38",
174
+ "version": "5.1.40",
175
175
  "license": "MIT",
176
176
  "dependencies": {
177
177
  "picomatch": "^4.0.7"
@@ -194,7 +194,7 @@
194
194
  },
195
195
  "components/teammode": {
196
196
  "name": "@sisyphuslabs/codex-teammode",
197
- "version": "5.1.38",
197
+ "version": "5.1.40",
198
198
  "devDependencies": {
199
199
  "@types/node": "^26.6.2",
200
200
  "@vitest/coverage-v8": "5.0.1",
@@ -208,7 +208,7 @@
208
208
  },
209
209
  "components/telemetry": {
210
210
  "name": "@code-yeongyu/codex-telemetry",
211
- "version": "5.1.38",
211
+ "version": "5.1.40",
212
212
  "license": "MIT",
213
213
  "bin": {
214
214
  "omo-telemetry": "dist/cli.js"
@@ -227,7 +227,7 @@
227
227
  },
228
228
  "components/ultrawork": {
229
229
  "name": "@code-yeongyu/codex-ultrawork",
230
- "version": "5.1.38",
230
+ "version": "5.1.40",
231
231
  "license": "MIT",
232
232
  "bin": {
233
233
  "omo-ultrawork": "dist/cli.js"
@@ -246,7 +246,7 @@
246
246
  },
247
247
  "components/ulw-execute-continuation": {
248
248
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
249
- "version": "5.1.38",
249
+ "version": "5.1.40",
250
250
  "license": "MIT",
251
251
  "bin": {
252
252
  "omo-ulw-execute-continuation": "dist/cli.js"
@@ -264,7 +264,7 @@
264
264
  },
265
265
  "components/ulw-loop": {
266
266
  "name": "@code-yeongyu/codex-ulw-loop",
267
- "version": "5.1.38",
267
+ "version": "5.1.40",
268
268
  "license": "MIT",
269
269
  "bin": {
270
270
  "omo-ulw-loop": "dist/cli.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sisyphuslabs/omo-codex-plugin",
3
- "version": "5.1.38",
3
+ "version": "5.1.40",
4
4
  "description": "Aggregate Codex plugin root for OMO components.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -5,5 +5,5 @@
5
5
  "index.js": "d67d3a847fe0bbc43e824feded48b280890d31879538309e671cd5f671133995",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-19T10:08:12.859Z"
8
+ "stagedAtUtc": "2026-10-20T14:11:05.519Z"
9
9
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-master
3
- description: "Handles git work: atomic commits, rebase, squash, blame, bisect, reflog, and history questions. Use whenever a task needs a commit or a git-history investigation; skip for ordinary code edits."
3
+ description: "MUST USE for ANY git operations: atomic commits, rebase/squash/fixup, and history search (blame, bisect, log -S, reflog). Load it before running git yourself, or pass load_skills=['git-master'] to the task that commits. Triggers: 'commit', 'rebase', 'squash', 'who wrote', 'when was X added', 'find the commit that'."
4
4
  ---
5
5
 
6
6
  # Git Master
@@ -34,7 +34,7 @@ Example opening (adapt the wording, keep every commitment):
34
34
 
35
35
  ## INTENT ROUTING - pick ONE intent reference
36
36
 
37
- **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Codex CLI review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: a 5-round cap (unlimited only on explicit user request), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
37
+ **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Codex CLI review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: convergence-bounded rounds (another round only while the previous one raised a new blocker-eligible finding or closed a ledger blocker; a round with neither that still does not approve stops the review), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
38
38
 
39
39
  After grounding, make ONE judgment, record `intent: clear|unclear` plus `review_required`, **ANNOUNCE both to the user in one line**, then load ONE intent reference (you ALSO read `references/full-workflow.md` for the shared mechanics - see below). The test keys on whether the desired **OUTCOME** is clear, NOT on request length. This verdict line and the opening announcement above are the two mandatory user-visible signals of a planning session - it tells the user whether they will be interviewed and whether high-accuracy review is already requested; never skip either.
40
40
 
@@ -213,14 +213,15 @@ Every reviewer prompt must carry this intake contract with all angle-bracket val
213
213
  The first action must open the literal workspace root as a directory descriptor, then traverse `.omo`, `plans`, and the final target with descriptor-relative no-follow opens, `fstat` each ancestor as a directory and the final descriptor as a regular file, and hash all bytes read from that same final descriptor. If the platform cannot guarantee this chain, or any path/runtime/launch/receipt/digest check drifts, return `INCONCLUSIVE` before reviewing. Echo the literal workspace, runtime home, target, digest, round, and launch ID; the parent separately matches the completion envelope to the persisted session/process receipt. Never search or use another artifact.
214
214
 
215
215
  ### Bounded convergence (the review must terminate)
216
- Review rounds are capped at 5 (unlimited only on explicit user request), and an approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
216
+ Review continues until unconditional approval, but a further round runs only while the previous round made progress: it raised at least one NEW blocker-eligible finding (one not already in the ledger and not a restatement of a closed blocker), or it confirmed at least one ledger blocker closed. A round that does neither and still does not approve ends the review: stop, report the outstanding blockers, and ask the user. This is the non-convergence guard, so there is no fixed round count; it terminates because the ledger is frozen after round 1, so every closure shrinks it. An approval whose only remaining items are notes counts as approval. A finding may BLOCK only when it names at least one `blocker_eligibility` category below with its concrete evidence - an IS row no todo closes, no QA scenario proves, or the approach cannot reach for the named user is such a category; every other finding - speculative durability, replay/crash-recovery, schema, CLI-parsing, state-machine, or hardening concerns the accepted scope never required - is recorded as a non-blocking note and becomes implementation/test work, never plan expansion. After round 1 the blocker ledger FREEZES: later rounds verify accepted ledger blockers, regressions introduced by fixes, and new findings that pass eligibility - they never rediscover the plan from scratch. Fixes apply the smallest edit that resolves the cited blocker; neither reviews nor fixes grow the plan's scope. Every reviewer prompt carries this convergence contract alongside the intake contract. On cap exhaustion without approval: STOP, report outstanding blockers, ask the user - continue / accept / adjust.
217
217
 
218
218
  <!-- ulw-plan-review-convergence-contract -->
219
219
  ```json
220
220
  {
221
- "max_rounds": 5,
222
- "max_rounds_override": "explicit_user_request_only",
223
- "on_cap_reached": "stop_report_outstanding_blockers_ask_user",
221
+ "max_rounds": null,
222
+ "continue_while": "previous_round_raised_new_blocker_eligible_finding_or_closed_ledger_blocker",
223
+ "stop_on": "round_without_new_blocker_eligible_finding_or_ledger_blocker_closure",
224
+ "on_stop_without_approval": "stop_report_outstanding_blockers_ask_user",
224
225
  "blocker_eligibility": [
225
226
  "explicit_requirement_or_accepted_decision",
226
227
  "existing_failing_regression",
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // omo-codex-install:1114cd8babb0b331a4c4ecbb51fff40c3001cdca8b08ff761c3cbc6a946cbfd4:db0540bf73f6ea181a271aca2f26ec8c9cdc244ce660e52c9f2655c4b63ac4eb
2
+ // omo-codex-install:b408b576ee9f2c827cd2733d966cd724fd27f029332824185037c443d3f8dd57:45ee374af9a88da9712fc3e3f8e220dbdc302cebb6f4025884612f07180b8a02
3
3
  var __esm = (fn, res, err) => () => {
4
4
  if (fn)
5
5
  try {
@@ -450,6 +450,163 @@ var init_event_id = __esm(() => {
450
450
  fallbackEventId = createUuidV7Generator();
451
451
  });
452
452
 
453
+ // packages/telemetry-core/src/machine-id.ts
454
+ import { createHash as createHash4 } from "node:crypto";
455
+ import os2 from "node:os";
456
+ function getDefaultTelemetryOsProvider() {
457
+ return os2;
458
+ }
459
+ function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
460
+ return createHash4("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
461
+ }
462
+ var init_machine_id = () => {};
463
+
464
+ // packages/telemetry-core/src/injected-client.ts
465
+ function isTelemetryClientEnabled(input) {
466
+ const env = input.env ?? process.env;
467
+ return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
468
+ }
469
+ function createTelemetryClient(input) {
470
+ if (!isTelemetryClientEnabled(input)) {
471
+ return NO_OP_CLIENT;
472
+ }
473
+ const transport = createTransport(input);
474
+ if (transport === null) {
475
+ return NO_OP_CLIENT;
476
+ }
477
+ const sharedProperties = getSharedProperties(input);
478
+ return {
479
+ enabled: true,
480
+ trackActive: ({ dayUTC, distinctId, reason }) => {
481
+ try {
482
+ transport.capture({
483
+ distinctId,
484
+ event: input.product.eventName,
485
+ properties: {
486
+ ...sharedProperties,
487
+ $process_person_profile: false,
488
+ day_utc: dayUTC,
489
+ reason
490
+ }
491
+ });
492
+ } catch (error) {
493
+ input.diagnostics?.({
494
+ event: "telemetry_capture_failed",
495
+ source: input.source,
496
+ error,
497
+ errorKind: error instanceof Error ? "error" : "non_error"
498
+ });
499
+ }
500
+ },
501
+ flush: async () => {
502
+ if (transport.flush === undefined) {
503
+ return;
504
+ }
505
+ await transport.flush();
506
+ },
507
+ shutdown: async () => {
508
+ try {
509
+ await transport.shutdown();
510
+ } catch (error) {
511
+ input.diagnostics?.({
512
+ event: "telemetry_shutdown_failed",
513
+ source: input.source,
514
+ error,
515
+ errorKind: error instanceof Error ? "error" : "non_error"
516
+ });
517
+ }
518
+ }
519
+ };
520
+ }
521
+ function createTransport(input) {
522
+ const env = input.env ?? process.env;
523
+ const factory = input.transportFactory;
524
+ try {
525
+ return factory(getTelemetryApiKey(env, input.product.defaultApiKey), {
526
+ enableExceptionAutocapture: false,
527
+ enableLocalEvaluation: false,
528
+ strictLocalEvaluation: true,
529
+ disableRemoteConfig: true,
530
+ flushAt: 1,
531
+ flushInterval: 0,
532
+ host: getTelemetryHost(env, input.product.defaultHost),
533
+ disableGeoip: input.product.disableGeoip ?? false,
534
+ ...input.product.transportOptions
535
+ });
536
+ } catch (error) {
537
+ input.diagnostics?.({
538
+ event: "telemetry_posthog_init_failed",
539
+ source: input.source,
540
+ error,
541
+ errorKind: error instanceof Error ? "error" : "non_error"
542
+ });
543
+ return null;
544
+ }
545
+ }
546
+ function getSharedProperties(input) {
547
+ const osProvider = input.osProvider ?? getDefaultTelemetryOsProvider();
548
+ const cpuInfo = getSafeCpuInfo(osProvider, input);
549
+ return {
550
+ platform: input.product.platform,
551
+ product_name: input.product.productName,
552
+ package_name: input.product.packageName,
553
+ package_version: input.product.packageVersion,
554
+ runtime: "bun",
555
+ runtime_version: process.versions.bun ?? process.version,
556
+ source: input.source,
557
+ $os: osProvider.platform(),
558
+ $os_version: osProvider.release(),
559
+ os_arch: osProvider.arch(),
560
+ os_type: osProvider.type(),
561
+ cpu_count: cpuInfo.count,
562
+ cpu_model: cpuInfo.model,
563
+ total_memory_gb: Math.round(osProvider.totalmem() / 1024 / 1024 / 1024),
564
+ locale: Intl.DateTimeFormat().resolvedOptions().locale,
565
+ timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
566
+ shell: process.env.SHELL,
567
+ ci: Boolean(process.env.CI),
568
+ terminal: process.env.TERM_PROGRAM,
569
+ ...input.product.additionalProperties
570
+ };
571
+ }
572
+ function getSafeCpuInfo(osProvider, input) {
573
+ try {
574
+ const cpuInfo = osProvider.cpus();
575
+ return {
576
+ count: cpuInfo.length,
577
+ model: cpuInfo[0]?.model
578
+ };
579
+ } catch (error) {
580
+ input.diagnostics?.({
581
+ event: "telemetry_cpu_info_unavailable",
582
+ source: "shared",
583
+ error,
584
+ errorKind: error instanceof Error ? "error" : "non_error"
585
+ });
586
+ return {
587
+ count: 0,
588
+ model: undefined
589
+ };
590
+ }
591
+ }
592
+ var NO_OP_CLIENT;
593
+ var init_injected_client = __esm(() => {
594
+ init_env();
595
+ init_machine_id();
596
+ NO_OP_CLIENT = {
597
+ enabled: false,
598
+ trackActive: () => {
599
+ return;
600
+ },
601
+ flush: async () => {
602
+ return;
603
+ },
604
+ shutdown: async () => {
605
+ return;
606
+ }
607
+ };
608
+ });
609
+
453
610
  // node_modules/.bun/posthog-node@5.52.4/node_modules/posthog-node/dist/extensions/error-tracking/modifiers/module.node.mjs
454
611
  import { dirname as dirname11, posix as posix3, sep as sep7 } from "node:path";
455
612
  function createModulerModifier() {
@@ -9823,18 +9980,7 @@ var init_index_node = __esm(() => {
9823
9980
  };
9824
9981
  });
9825
9982
 
9826
- // packages/telemetry-core/src/machine-id.ts
9827
- import { createHash as createHash4 } from "node:crypto";
9828
- import os2 from "node:os";
9829
- function getDefaultTelemetryOsProvider() {
9830
- return os2;
9831
- }
9832
- function getTelemetryDistinctId(machineIdPrefix, osProvider = getDefaultTelemetryOsProvider()) {
9833
- return createHash4("sha256").update(`${machineIdPrefix}${osProvider.hostname()}`).digest("hex");
9834
- }
9835
- var init_machine_id = () => {};
9836
-
9837
- // packages/telemetry-core/src/posthog-client.ts
9983
+ // packages/telemetry-core/src/posthog-transport.ts
9838
9984
  class PostHogTelemetryTransport {
9839
9985
  #client;
9840
9986
  constructor(apiKey, options) {
@@ -9853,161 +9999,20 @@ class PostHogTelemetryTransport {
9853
9999
  function createDefaultPostHogTransport(apiKey, options) {
9854
10000
  return new PostHogTelemetryTransport(apiKey, options);
9855
10001
  }
9856
- function isTelemetryClientEnabled(input) {
9857
- const env = input.env ?? process.env;
9858
- return !shouldDisableTelemetry({ env, productEnvPrefix: input.product.productEnvPrefix }) && hasTelemetryApiKey(env, input.product.defaultApiKey);
9859
- }
9860
- function createTelemetryClient(input) {
9861
- if (!isTelemetryClientEnabled(input)) {
9862
- return NO_OP_CLIENT;
9863
- }
9864
- const transport = createTransport(input);
9865
- if (transport === null) {
9866
- return NO_OP_CLIENT;
9867
- }
9868
- const sharedProperties = getSharedProperties(input);
9869
- return {
9870
- enabled: true,
9871
- trackActive: ({ dayUTC, distinctId, reason }) => {
9872
- try {
9873
- transport.capture({
9874
- distinctId,
9875
- event: input.product.eventName,
9876
- properties: {
9877
- ...sharedProperties,
9878
- $process_person_profile: false,
9879
- day_utc: dayUTC,
9880
- reason
9881
- }
9882
- });
9883
- } catch (error) {
9884
- input.diagnostics?.({
9885
- event: "telemetry_capture_failed",
9886
- source: input.source,
9887
- error,
9888
- errorKind: error instanceof Error ? "error" : "non_error"
9889
- });
9890
- }
9891
- },
9892
- flush: async () => {
9893
- if (transport.flush === undefined) {
9894
- return;
9895
- }
9896
- await transport.flush();
9897
- },
9898
- shutdown: async () => {
9899
- try {
9900
- await transport.shutdown();
9901
- } catch (error) {
9902
- input.diagnostics?.({
9903
- event: "telemetry_shutdown_failed",
9904
- source: input.source,
9905
- error,
9906
- errorKind: error instanceof Error ? "error" : "non_error"
9907
- });
9908
- }
9909
- }
9910
- };
9911
- }
9912
- function createTransport(input) {
9913
- const env = input.env ?? process.env;
9914
- const factory = input.transportFactory ?? createDefaultPostHogTransport;
9915
- try {
9916
- return factory(getTelemetryApiKey(env, input.product.defaultApiKey), {
9917
- enableExceptionAutocapture: false,
9918
- enableLocalEvaluation: false,
9919
- strictLocalEvaluation: true,
9920
- disableRemoteConfig: true,
9921
- flushAt: 1,
9922
- flushInterval: 0,
9923
- host: getTelemetryHost(env, input.product.defaultHost),
9924
- disableGeoip: input.product.disableGeoip ?? false,
9925
- ...input.product.transportOptions
9926
- });
9927
- } catch (error) {
9928
- input.diagnostics?.({
9929
- event: "telemetry_posthog_init_failed",
9930
- source: input.source,
9931
- error,
9932
- errorKind: error instanceof Error ? "error" : "non_error"
9933
- });
9934
- return null;
9935
- }
9936
- }
9937
- function getSharedProperties(input) {
9938
- const osProvider = input.osProvider ?? getDefaultTelemetryOsProvider();
9939
- const cpuInfo = getSafeCpuInfo(osProvider, input);
9940
- return {
9941
- platform: input.product.platform,
9942
- product_name: input.product.productName,
9943
- package_name: input.product.packageName,
9944
- package_version: input.product.packageVersion,
9945
- runtime: "bun",
9946
- runtime_version: process.versions.bun ?? process.version,
9947
- source: input.source,
9948
- $os: osProvider.platform(),
9949
- $os_version: osProvider.release(),
9950
- os_arch: osProvider.arch(),
9951
- os_type: osProvider.type(),
9952
- cpu_count: cpuInfo.count,
9953
- cpu_model: cpuInfo.model,
9954
- total_memory_gb: Math.round(osProvider.totalmem() / 1024 / 1024 / 1024),
9955
- locale: Intl.DateTimeFormat().resolvedOptions().locale,
9956
- timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
9957
- shell: process.env.SHELL,
9958
- ci: Boolean(process.env.CI),
9959
- terminal: process.env.TERM_PROGRAM,
9960
- ...input.product.additionalProperties
9961
- };
9962
- }
9963
- function getSafeCpuInfo(osProvider, input) {
9964
- try {
9965
- const cpuInfo = osProvider.cpus();
9966
- return {
9967
- count: cpuInfo.length,
9968
- model: cpuInfo[0]?.model
9969
- };
9970
- } catch (error) {
9971
- input.diagnostics?.({
9972
- event: "telemetry_cpu_info_unavailable",
9973
- source: "shared",
9974
- error,
9975
- errorKind: error instanceof Error ? "error" : "non_error"
9976
- });
9977
- return {
9978
- count: 0,
9979
- model: undefined
9980
- };
9981
- }
9982
- }
9983
- var NO_OP_CLIENT;
9984
- var init_posthog_client = __esm(() => {
10002
+ var init_posthog_transport = __esm(() => {
9985
10003
  init_index_node();
9986
- init_env();
9987
- init_machine_id();
9988
- NO_OP_CLIENT = {
9989
- enabled: false,
9990
- trackActive: () => {
9991
- return;
9992
- },
9993
- flush: async () => {
9994
- return;
9995
- },
9996
- shutdown: async () => {
9997
- return;
9998
- }
9999
- };
10000
10004
  });
10001
10005
 
10002
10006
  // packages/telemetry-core/src/events.ts
10003
- var ALLOWED_DOLLAR_KEYS;
10004
- var init_events = __esm(() => {
10005
- ALLOWED_DOLLAR_KEYS = new Set([
10006
- "$os",
10007
- "$os_version",
10008
- "$process_person_profile",
10009
- "$session_id"
10010
- ]);
10007
+ var init_events = () => {};
10008
+
10009
+ // packages/telemetry-core/src/posthog-client.ts
10010
+ function createTelemetryClient2(input) {
10011
+ return createTelemetryClient({ ...input, transportFactory: input.transportFactory ?? createDefaultPostHogTransport });
10012
+ }
10013
+ var init_posthog_client = __esm(() => {
10014
+ init_injected_client();
10015
+ init_posthog_transport();
10011
10016
  });
10012
10017
 
10013
10018
  // packages/telemetry-core/src/record-daily-active.ts
@@ -10031,7 +10036,7 @@ var package_default;
10031
10036
  var init_package = __esm(() => {
10032
10037
  package_default = {
10033
10038
  name: "@oh-my-opencode/omo-codex",
10034
- version: "5.1.38",
10039
+ version: "5.1.40",
10035
10040
  type: "module",
10036
10041
  private: true,
10037
10042
  description: "Codex harness adapter for oh-my-openagent. Vendored Codex plugin namespace (omo) + TypeScript installer + telemetry.",
@@ -10161,7 +10166,7 @@ function resolveActivityStateProvider(options) {
10161
10166
  return () => getPostHogActivityCaptureState(options.now ?? new Date);
10162
10167
  }
10163
10168
  function createPostHogClient(source, options = {}) {
10164
- const client = createTelemetryClient({
10169
+ const client = createTelemetryClient2({
10165
10170
  diagnostics: writeTelemetryDiagnostic2,
10166
10171
  env: options.env ?? process.env,
10167
10172
  osProvider: options.osProvider ?? resolveOsProvider(),
@@ -19458,14 +19463,20 @@ var OmoComputerSettingsLayerSchema = object({
19458
19463
  var OmoComputerSettingsSchema = OmoComputerSettingsLayerSchema;
19459
19464
 
19460
19465
  // packages/omo-config-core/src/schema/git-master.ts
19466
+ var GIT_ENV_ASSIGNMENT_PATTERN = /^(?:[A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)(?: [A-Za-z_][A-Za-z0-9_]*=[A-Za-z0-9_-]*)*$/;
19467
+ var GitEnvPrefixSchema = string2().refine((value) => value === "" || GIT_ENV_ASSIGNMENT_PATTERN.test(value), {
19468
+ message: 'git_env_prefix must be empty or use shell-safe env assignments like "GIT_MASTER=1"'
19469
+ });
19461
19470
  var OmoGitMasterSettingsShape = {
19462
19471
  commit_footer: union([boolean2(), string2()]),
19463
- include_co_authored_by: boolean2()
19472
+ include_co_authored_by: boolean2(),
19473
+ git_env_prefix: GitEnvPrefixSchema
19464
19474
  };
19465
19475
  var OmoGitMasterSettingsLayerSchema = object(OmoGitMasterSettingsShape).partial().strict();
19466
19476
  var OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
19467
19477
  commit_footer: union([boolean2(), string2()]).default(false),
19468
- include_co_authored_by: boolean2().default(false)
19478
+ include_co_authored_by: boolean2().default(false),
19479
+ git_env_prefix: GitEnvPrefixSchema.default("GIT_MASTER=1")
19469
19480
  }).strict();
19470
19481
 
19471
19482
  // packages/omo-config-core/src/schema/harness.ts
@@ -5,5 +5,5 @@
5
5
  "index.js": "d67d3a847fe0bbc43e824feded48b280890d31879538309e671cd5f671133995",
6
6
  "page-bundle.js": "bfd51e8383cf47200d57387bbbed258bce5a3a3d00c38fc108034d2888e23f0c"
7
7
  },
8
- "stagedAtUtc": "2026-10-19T10:08:12.859Z"
8
+ "stagedAtUtc": "2026-10-20T14:11:05.519Z"
9
9
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: git-master
3
- description: "Handles git work: atomic commits, rebase, squash, blame, bisect, reflog, and history questions. Use whenever a task needs a commit or a git-history investigation; skip for ordinary code edits."
3
+ description: "MUST USE for ANY git operations: atomic commits, rebase/squash/fixup, and history search (blame, bisect, log -S, reflog). Load it before running git yourself, or pass load_skills=['git-master'] to the task that commits. Triggers: 'commit', 'rebase', 'squash', 'who wrote', 'when was X added', 'find the commit that'."
4
4
  ---
5
5
 
6
6
  # Git Master
@@ -34,7 +34,7 @@ Example opening (adapt the wording, keep every commitment):
34
34
 
35
35
  ## INTENT ROUTING - pick ONE intent reference
36
36
 
37
- **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Oracle review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: a 5-round cap (unlimited only on explicit user request), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
37
+ **Review modifiers are a gate trigger, not a style cue.** If the user says "high accuracy", "ultra high accuracy", "고정밀", "deep review", or equivalent - in ANY turn, even appended to a follow-up question and even after the plan already exists - set `review_required: true` in the draft: the dual high-accuracy review (native `momus` + the independent Oracle review) is now REQUIRED before handoff, and if the plan already exists you run it this same turn. The review runs under the bounded convergence contract in `full-workflow.md`: convergence-bounded rounds (another round only while the previous one raised a new blocker-eligible finding or closed a ledger blocker; a round with neither that still does not approve stops the review), evidence-backed blocker eligibility, and approval-with-notes counting as approval. Answering the current question more carefully does NOT satisfy it. This does NOT choose CLEAR/UNCLEAR and does NOT suppress interview.
38
38
 
39
39
  After grounding, make ONE judgment, record `intent: clear|unclear` plus `review_required`, **ANNOUNCE both to the user in one line**, then load ONE intent reference (you ALSO read `references/full-workflow.md` for the shared mechanics - see below). The test keys on whether the desired **OUTCOME** is clear, NOT on request length. This verdict line and the opening announcement above are the two mandatory user-visible signals of a planning session - it tells the user whether they will be interviewed and whether high-accuracy review is already requested; never skip either.
40
40