oh-my-opencode 5.0.0-beta.79 → 5.0.0-beta.80

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 (96) hide show
  1. package/.agents/command/remove-deadcode.md +1 -1
  2. package/.agents/skills/hyperplan/SKILL.md +5 -5
  3. package/.agents/skills/remove-deadcode/SKILL.md +1 -1
  4. package/.agents/skills/security-research/SKILL.md +4 -4
  5. package/dist/cli/index.js +499 -336
  6. package/dist/cli-node/index.js +499 -336
  7. package/dist/config-migration/category-deep-split.d.ts +3 -0
  8. package/dist/config-migration/migration-plans.d.ts +1 -0
  9. package/dist/features/builtin-commands/templates/hyperplan.d.ts +1 -1
  10. package/dist/features/builtin-commands/templates/refactor-sections/team-mode-addendum.d.ts +1 -1
  11. package/dist/features/builtin-commands/templates/remove-ai-slops.d.ts +1 -1
  12. package/dist/index.js +282 -123
  13. package/dist/plugin-config/omo-config-chain.d.ts +1 -0
  14. package/dist/skills/debugging/references/methodology/02-investigate.md +5 -5
  15. package/dist/skills/refactor/SKILL.md +2 -2
  16. package/dist/skills/remove-ai-slops/SKILL.md +4 -4
  17. package/dist/skills/ulw-execute/SKILL.md +3 -2
  18. package/dist/skills/ulw-plan/references/full-workflow.md +1 -1
  19. package/dist/skills/ulw-research/SKILL.md +2 -2
  20. package/dist/tools/delegate-task/openai-categories.d.ts +6 -4
  21. package/dist/tui.js +146 -71
  22. package/package.json +14 -14
  23. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  24. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +77 -8
  25. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  26. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  27. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  28. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  30. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  34. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  35. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  36. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  37. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  38. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  39. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  40. package/packages/omo-codex/plugin/components/telemetry/dist/cli.js +63 -17
  41. package/packages/omo-codex/plugin/components/telemetry/dist/posthog.js +63 -17
  42. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  43. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  44. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  45. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  46. package/packages/omo-codex/plugin/components/ultrawork/skills/ulw-plan/references/full-workflow.md +1 -1
  47. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  48. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  49. package/packages/omo-codex/plugin/components/ulw-loop/dist/checkpoint-template.js +3 -3
  50. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +14 -6
  51. package/packages/omo-codex/plugin/components/ulw-loop/dist/codex-goal-instruction.js +2 -2
  52. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +9 -1
  53. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  54. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  55. package/packages/omo-codex/plugin/components/ulw-loop/src/checkpoint-template.ts +3 -3
  56. package/packages/omo-codex/plugin/components/ulw-loop/src/codex-goal-instruction.ts +2 -2
  57. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +9 -1
  58. package/packages/omo-codex/plugin/components/ulw-loop/test/checkpoint-template.test.ts +1 -1
  59. package/packages/omo-codex/plugin/components/ulw-loop/test/codex-goal-instruction.test.ts +1 -1
  60. package/packages/omo-codex/plugin/components/ulw-loop/test/sdk-contract.test.ts +1 -1
  61. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  71. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  72. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  73. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  74. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  75. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  76. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  77. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  78. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  79. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  80. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  81. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  82. package/packages/omo-codex/plugin/package-lock.json +12 -12
  83. package/packages/omo-codex/plugin/package.json +1 -1
  84. package/packages/omo-codex/plugin/skills/debugging/references/methodology/02-investigate.md +5 -5
  85. package/packages/omo-codex/plugin/skills/refactor/SKILL.md +2 -2
  86. package/packages/omo-codex/plugin/skills/remove-ai-slops/SKILL.md +4 -4
  87. package/packages/omo-codex/plugin/skills/ulw-execute/SKILL.md +3 -2
  88. package/packages/omo-codex/plugin/skills/ulw-plan/references/full-workflow.md +1 -1
  89. package/packages/omo-codex/plugin/skills/ulw-research/SKILL.md +2 -2
  90. package/packages/omo-codex/scripts/install-dist/install-local.mjs +167 -51
  91. package/packages/shared-skills/skills/debugging/references/methodology/02-investigate.md +5 -5
  92. package/packages/shared-skills/skills/refactor/SKILL.md +2 -2
  93. package/packages/shared-skills/skills/remove-ai-slops/SKILL.md +4 -4
  94. package/packages/shared-skills/skills/ulw-execute/SKILL.md +3 -2
  95. package/packages/shared-skills/skills/ulw-plan/references/full-workflow.md +1 -1
  96. package/packages/shared-skills/skills/ulw-research/SKILL.md +2 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oh-my-opencode",
3
- "version": "5.0.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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",
@@ -182,7 +182,7 @@
182
182
  "zod": "^4.4.3"
183
183
  },
184
184
  "devDependencies": {
185
- "@code-yeongyu/senpi": "2026.9.19-2",
185
+ "@code-yeongyu/senpi": "2026.9.20",
186
186
  "@oh-my-opencode/agents-md-core": "workspace:*",
187
187
  "@oh-my-opencode/ast-grep-mcp": "workspace:*",
188
188
  "@oh-my-opencode/boulder-state": "workspace:*",
@@ -221,18 +221,18 @@
221
221
  "typescript": "^7.0.2"
222
222
  },
223
223
  "optionalDependencies": {
224
- "oh-my-opencode-darwin-arm64": "5.0.0-beta.79",
225
- "oh-my-opencode-darwin-x64": "5.0.0-beta.79",
226
- "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.79",
227
- "oh-my-opencode-linux-arm64": "5.0.0-beta.79",
228
- "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.79",
229
- "oh-my-opencode-linux-x64": "5.0.0-beta.79",
230
- "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.79",
231
- "oh-my-opencode-linux-x64-musl": "5.0.0-beta.79",
232
- "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.79",
233
- "oh-my-opencode-windows-arm64": "5.0.0-beta.79",
234
- "oh-my-opencode-windows-x64": "5.0.0-beta.79",
235
- "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.79"
224
+ "oh-my-opencode-darwin-arm64": "5.0.0-beta.80",
225
+ "oh-my-opencode-darwin-x64": "5.0.0-beta.80",
226
+ "oh-my-opencode-darwin-x64-baseline": "5.0.0-beta.80",
227
+ "oh-my-opencode-linux-arm64": "5.0.0-beta.80",
228
+ "oh-my-opencode-linux-arm64-musl": "5.0.0-beta.80",
229
+ "oh-my-opencode-linux-x64": "5.0.0-beta.80",
230
+ "oh-my-opencode-linux-x64-baseline": "5.0.0-beta.80",
231
+ "oh-my-opencode-linux-x64-musl": "5.0.0-beta.80",
232
+ "oh-my-opencode-linux-x64-musl-baseline": "5.0.0-beta.80",
233
+ "oh-my-opencode-windows-arm64": "5.0.0-beta.80",
234
+ "oh-my-opencode-windows-x64": "5.0.0-beta.80",
235
+ "oh-my-opencode-windows-x64-baseline": "5.0.0-beta.80"
236
236
  },
237
237
  "overrides": {
238
238
  "@earendil-works/pi-agent-core": "0.84.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.79",
3
+ "version": "5.0.0-beta.80",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -6324,6 +6324,62 @@ var OmoConfigLayerSchema = object({
6324
6324
  legacy_migrations: record(string2(), unknown()).optional()
6325
6325
  }).strict();
6326
6326
 
6327
+ // ../../omo-config-core/src/schema/legacy-category-names.ts
6328
+ var LEGACY_CATEGORY_NAME_ALIASES = { deep: "deep-low" };
6329
+ function canonicalCategoryName(name) {
6330
+ return Object.hasOwn(LEGACY_CATEGORY_NAME_ALIASES, name) ? LEGACY_CATEGORY_NAME_ALIASES[name] : name;
6331
+ }
6332
+ function isRecord7(value) {
6333
+ return typeof value === "object" && value !== null && !Array.isArray(value);
6334
+ }
6335
+ function joinPath(path, segment) {
6336
+ return [...path, segment].join(".");
6337
+ }
6338
+ function canonicalizeCategoriesRecord(categories, path, renames) {
6339
+ const result = {};
6340
+ for (const [name, definition] of Object.entries(categories)) {
6341
+ const canonical = canonicalCategoryName(name);
6342
+ if (canonical === name) {
6343
+ result[name] = definition;
6344
+ continue;
6345
+ }
6346
+ const dropped = Object.hasOwn(categories, canonical);
6347
+ renames.push({ canonical, dropped, legacy: name, path: joinPath(path, name) });
6348
+ if (!dropped)
6349
+ result[canonical] = definition;
6350
+ }
6351
+ return result;
6352
+ }
6353
+ function canonicalizeValue(value, path, renames) {
6354
+ if (Array.isArray(value)) {
6355
+ return value.map((entry, index) => canonicalizeValue(entry, [...path, String(index)], renames));
6356
+ }
6357
+ if (!isRecord7(value))
6358
+ return value;
6359
+ const result = {};
6360
+ for (const [key, entry] of Object.entries(value)) {
6361
+ if (key === "categories" && isRecord7(entry)) {
6362
+ result[key] = canonicalizeCategoriesRecord(entry, [...path, key], renames);
6363
+ continue;
6364
+ }
6365
+ if (key === "category" && typeof entry === "string") {
6366
+ const canonical = canonicalCategoryName(entry);
6367
+ if (canonical !== entry) {
6368
+ renames.push({ canonical, dropped: false, legacy: entry, path: joinPath(path, key) });
6369
+ }
6370
+ result[key] = canonical;
6371
+ continue;
6372
+ }
6373
+ result[key] = canonicalizeValue(entry, [...path, key], renames);
6374
+ }
6375
+ return result;
6376
+ }
6377
+ function canonicalizeLegacyCategoryNames(document) {
6378
+ const renames = [];
6379
+ const canonicalized = isRecord7(document) ? canonicalizeValue(document, [], renames) : {};
6380
+ return { document: canonicalized, renames };
6381
+ }
6382
+
6327
6383
  // ../../../node_modules/.bun/jsonc-parser@3.3.1/node_modules/jsonc-parser/lib/esm/impl/scanner.js
6328
6384
  function createScanner(text, ignoreTrivia = false) {
6329
6385
  const len = text.length;
@@ -7404,21 +7460,21 @@ function hasUnsafeUnrecognizedKey(issues) {
7404
7460
  function hasTamperedPrototype(value) {
7405
7461
  if (Array.isArray(value))
7406
7462
  return value.some((entry) => hasTamperedPrototype(entry));
7407
- if (!isRecord7(value))
7463
+ if (!isRecord8(value))
7408
7464
  return false;
7409
7465
  const prototype = Object.getPrototypeOf(value);
7410
7466
  if (prototype !== Object.prototype && prototype !== null)
7411
7467
  return true;
7412
7468
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
7413
7469
  }
7414
- function isRecord7(value) {
7470
+ function isRecord8(value) {
7415
7471
  return typeof value === "object" && value !== null && !Array.isArray(value);
7416
7472
  }
7417
7473
  function containerAt(record, path) {
7418
7474
  let container = record;
7419
7475
  for (const segment of path) {
7420
7476
  const next = container[segment];
7421
- if (!isRecord7(next))
7477
+ if (!isRecord8(next))
7422
7478
  return null;
7423
7479
  container = next;
7424
7480
  }
@@ -7520,6 +7576,15 @@ function readConfigSource(path, scope, fileSystem) {
7520
7576
  value: parsedRecord
7521
7577
  };
7522
7578
  }
7579
+ function legacyCategoryDiagnostic(path, renames) {
7580
+ const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
7581
+ return {
7582
+ kind: "deprecated-keys",
7583
+ message: `Deprecated category name in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
7584
+ path,
7585
+ issuePaths: renames.map((rename) => rename.path)
7586
+ };
7587
+ }
7523
7588
  function loadOmoConfig(options = {}) {
7524
7589
  const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
7525
7590
  const cwd = options.cwd ?? process.cwd();
@@ -7538,8 +7603,12 @@ function loadOmoConfig(options = {}) {
7538
7603
  if (loaded.diagnostic !== undefined)
7539
7604
  diagnostics.push(loaded.diagnostic);
7540
7605
  if (loaded.value !== undefined) {
7541
- layers.push({ config: loaded.value, source: loaded.source });
7542
- merged = mergeOmoConfigRecords(merged, loaded.value);
7606
+ const canonicalized = canonicalizeLegacyCategoryNames(loaded.value);
7607
+ if (canonicalized.renames.length > 0) {
7608
+ diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
7609
+ }
7610
+ layers.push({ config: canonicalized.document, source: loaded.source });
7611
+ merged = mergeOmoConfigRecords(merged, canonicalized.document);
7543
7612
  }
7544
7613
  }
7545
7614
  const requestedProfile = resolveOmoProfileName({
@@ -9943,10 +10012,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
9943
10012
  } catch {
9944
10013
  return null;
9945
10014
  }
9946
- if (!isRecord8(cache) || !Array.isArray(cache.models))
10015
+ if (!isRecord9(cache) || !Array.isArray(cache.models))
9947
10016
  return null;
9948
10017
  for (const entry of cache.models) {
9949
- if (!isRecord8(entry))
10018
+ if (!isRecord9(entry))
9950
10019
  continue;
9951
10020
  if (entry.slug !== model && entry.id !== model)
9952
10021
  continue;
@@ -9971,7 +10040,7 @@ function readRootModelCatalogPath(config) {
9971
10040
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
9972
10041
  return single?.[1] ?? null;
9973
10042
  }
9974
- function isRecord8(value) {
10043
+ function isRecord9(value) {
9975
10044
  return typeof value === "object" && value !== null && !Array.isArray(value);
9976
10045
  }
9977
10046
  function removeFeatureFlagSetting(config, featureName) {
@@ -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.0-beta.79) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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.0-beta.79) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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.0-beta.79) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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.0-beta.79) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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.0-beta.79",
4
- "inputDigest": "sha256:c10bd7c4d3913d06bae405da9f17c403a05149395ed411cda87414740e5fef38",
3
+ "version": "5.0.0-beta.80",
4
+ "inputDigest": "sha256:4c3ae4939cef82bfbc66b27a58b66f2585d1ca4520dd51f0b3e42540270af7ae",
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.0-beta.79) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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.0-beta.79) Loading Project Rules"
10
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79) Loading Project Rules"
22
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79) Matching Project Rules"
35
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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.0-beta.79) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.0.0-beta.80) 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.0-beta.79",
3
+ "version": "5.0.0-beta.80",
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,
@@ -4,8 +4,8 @@
4
4
  import { stdin as processStdin, stdout as processStdout } from "node:process";
5
5
 
6
6
  // ../../telemetry-core/src/activity-state.ts
7
- import { existsSync, mkdirSync as mkdirSync2, readFileSync } from "node:fs";
8
- import { basename, join } from "node:path";
7
+ import { existsSync, mkdirSync as mkdirSync3, readFileSync } from "node:fs";
8
+ import { basename, join as join2 } from "node:path";
9
9
 
10
10
  // ../../utils/src/atomic-write.ts
11
11
  import {
@@ -97,36 +97,82 @@ function resolveWritableDirectory(preferredDir, fallbackSuffix, osProvider) {
97
97
  }
98
98
  }
99
99
 
100
+ // ../../telemetry-core/src/day-claim.ts
101
+ import { closeSync as closeSync2, mkdirSync as mkdirSync2, openSync as openSync2, readdirSync, rmSync as rmSync2 } from "node:fs";
102
+ import { join } from "node:path";
103
+ var CLAIM_PREFIX = "daily-active.";
104
+ var CLAIM_SUFFIX = ".claim";
105
+ function getTelemetryDayClaimFilePath(stateDir, dayUTC) {
106
+ return join(stateDir, `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`);
107
+ }
108
+ function claimUtcDay(stateDir, dayUTC) {
109
+ try {
110
+ mkdirSync2(stateDir, { recursive: true });
111
+ closeSync2(openSync2(getTelemetryDayClaimFilePath(stateDir, dayUTC), "wx"));
112
+ } catch (error) {
113
+ return error.code === "EEXIST" ? "already-claimed" : "unavailable";
114
+ }
115
+ pruneSupersededClaims(stateDir, dayUTC);
116
+ return "claimed";
117
+ }
118
+ function pruneSupersededClaims(stateDir, dayUTC) {
119
+ const currentClaim = `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`;
120
+ let entries;
121
+ try {
122
+ entries = readdirSync(stateDir);
123
+ } catch {
124
+ return;
125
+ }
126
+ for (const entry of entries) {
127
+ if (entry === currentClaim)
128
+ continue;
129
+ if (!entry.startsWith(CLAIM_PREFIX) || !entry.endsWith(CLAIM_SUFFIX))
130
+ continue;
131
+ try {
132
+ rmSync2(join(stateDir, entry), { force: true });
133
+ } catch {}
134
+ }
135
+ }
136
+
100
137
  // ../../telemetry-core/src/activity-state.ts
101
138
  var POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json";
139
+ var capturedDaysByStateDir = new Map;
102
140
  function resolveTelemetryStateDir(product, options = {}) {
103
141
  const dataDir = resolveXdgDataDir(product.cacheDirName, {
104
142
  env: options.env,
105
143
  osProvider: options.osProvider
106
144
  });
107
- const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join(options.env.XDG_DATA_HOME, product.cacheDirName);
145
+ const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join2(options.env.XDG_DATA_HOME, product.cacheDirName);
108
146
  if (dataDir === xdgStateDir || xdgStateDir === undefined && basename(dataDir) === product.cacheDirName) {
109
147
  return dataDir;
110
148
  }
111
- return join(dataDir, product.cacheDirName);
149
+ return join2(dataDir, product.cacheDirName);
112
150
  }
113
151
  function getTelemetryActivityStateFilePath(stateDir) {
114
- return join(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
152
+ return join2(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
115
153
  }
116
154
  function getDailyActiveCaptureState(input) {
117
- const state = readPostHogActivityState(input.stateDir, input.diagnostics);
118
155
  const dayUTC = getUtcDayString(input.now ?? new Date);
119
- const captureDaily = state.lastActiveDayUTC !== dayUTC;
120
- if (captureDaily) {
156
+ if (capturedDaysByStateDir.get(input.stateDir) === dayUTC) {
157
+ return { dayUTC, captureDaily: false };
158
+ }
159
+ const state = readPostHogActivityState(input.stateDir, input.diagnostics);
160
+ if (state.lastActiveDayUTC === dayUTC) {
161
+ capturedDaysByStateDir.set(input.stateDir, dayUTC);
162
+ return { dayUTC, captureDaily: false };
163
+ }
164
+ const claim = claimUtcDay(input.stateDir, dayUTC);
165
+ capturedDaysByStateDir.set(input.stateDir, dayUTC);
166
+ if (claim === "already-claimed") {
167
+ return { dayUTC, captureDaily: false };
168
+ }
169
+ if (claim === "claimed") {
121
170
  writePostHogActivityState(input.stateDir, {
122
171
  ...state,
123
172
  lastActiveDayUTC: dayUTC
124
173
  }, input.diagnostics);
125
174
  }
126
- return {
127
- dayUTC,
128
- captureDaily
129
- };
175
+ return { dayUTC, captureDaily: true };
130
176
  }
131
177
  function getUtcDayString(date) {
132
178
  return date.toISOString().slice(0, 10);
@@ -159,7 +205,7 @@ function readPostHogActivityState(stateDir, diagnostics) {
159
205
  function writePostHogActivityState(stateDir, nextState, diagnostics) {
160
206
  const stateFilePath = getTelemetryActivityStateFilePath(stateDir);
161
207
  try {
162
- mkdirSync2(stateDir, { recursive: true });
208
+ mkdirSync3(stateDir, { recursive: true });
163
209
  writeFileAtomically(stateFilePath, `${JSON.stringify(nextState, null, 2)}
164
210
  `);
165
211
  } catch (error) {
@@ -178,19 +224,19 @@ var DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74"
178
224
  var UNCONFIGURED_POSTHOG_API_KEY = "phc_REPLACE_ME_OMO_NATIVE";
179
225
 
180
226
  // ../../telemetry-core/src/diagnostics.ts
181
- import { appendFileSync, existsSync as existsSync2, mkdirSync as mkdirSync3, readFileSync as readFileSync2 } from "node:fs";
182
- import { join as join2 } from "node:path";
227
+ import { appendFileSync, existsSync as existsSync2, mkdirSync as mkdirSync4, readFileSync as readFileSync2 } from "node:fs";
228
+ import { join as join3 } from "node:path";
183
229
  var DIAGNOSTICS_FILE_NAME = "telemetry-diagnostics.jsonl";
184
230
  var DIAGNOSTICS_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
185
231
  var DIAGNOSTICS_MAX_BYTES = 256 * 1024;
186
232
  function getTelemetryDiagnosticsFilePath(diagnosticsDir) {
187
- return join2(diagnosticsDir, DIAGNOSTICS_FILE_NAME);
233
+ return join3(diagnosticsDir, DIAGNOSTICS_FILE_NAME);
188
234
  }
189
235
  function writeTelemetryDiagnostic(input, options) {
190
236
  const now = options.now ?? new Date;
191
237
  try {
192
238
  cleanupTelemetryDiagnostics({ diagnosticsDir: options.diagnosticsDir, now });
193
- mkdirSync3(options.diagnosticsDir, { recursive: true });
239
+ mkdirSync4(options.diagnosticsDir, { recursive: true });
194
240
  appendFileSync(getTelemetryDiagnosticsFilePath(options.diagnosticsDir), `${JSON.stringify(toDiagnosticRecord(input, now))}
195
241
  `, "utf-8");
196
242
  } catch (error) {
@@ -1,6 +1,6 @@
1
1
  // ../../../../telemetry-core/src/activity-state.ts
2
- import { existsSync, mkdirSync as mkdirSync2, readFileSync } from "node:fs";
3
- import { basename, join } from "node:path";
2
+ import { existsSync, mkdirSync as mkdirSync3, readFileSync } from "node:fs";
3
+ import { basename, join as join2 } from "node:path";
4
4
 
5
5
  // ../../../../utils/src/atomic-write.ts
6
6
  import {
@@ -92,36 +92,82 @@ function resolveWritableDirectory(preferredDir, fallbackSuffix, osProvider) {
92
92
  }
93
93
  }
94
94
 
95
+ // ../../../../telemetry-core/src/day-claim.ts
96
+ import { closeSync as closeSync2, mkdirSync as mkdirSync2, openSync as openSync2, readdirSync, rmSync as rmSync2 } from "node:fs";
97
+ import { join } from "node:path";
98
+ var CLAIM_PREFIX = "daily-active.";
99
+ var CLAIM_SUFFIX = ".claim";
100
+ function getTelemetryDayClaimFilePath(stateDir, dayUTC) {
101
+ return join(stateDir, `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`);
102
+ }
103
+ function claimUtcDay(stateDir, dayUTC) {
104
+ try {
105
+ mkdirSync2(stateDir, { recursive: true });
106
+ closeSync2(openSync2(getTelemetryDayClaimFilePath(stateDir, dayUTC), "wx"));
107
+ } catch (error) {
108
+ return error.code === "EEXIST" ? "already-claimed" : "unavailable";
109
+ }
110
+ pruneSupersededClaims(stateDir, dayUTC);
111
+ return "claimed";
112
+ }
113
+ function pruneSupersededClaims(stateDir, dayUTC) {
114
+ const currentClaim = `${CLAIM_PREFIX}${dayUTC}${CLAIM_SUFFIX}`;
115
+ let entries;
116
+ try {
117
+ entries = readdirSync(stateDir);
118
+ } catch {
119
+ return;
120
+ }
121
+ for (const entry of entries) {
122
+ if (entry === currentClaim)
123
+ continue;
124
+ if (!entry.startsWith(CLAIM_PREFIX) || !entry.endsWith(CLAIM_SUFFIX))
125
+ continue;
126
+ try {
127
+ rmSync2(join(stateDir, entry), { force: true });
128
+ } catch {}
129
+ }
130
+ }
131
+
95
132
  // ../../../../telemetry-core/src/activity-state.ts
96
133
  var POSTHOG_ACTIVITY_STATE_FILE = "posthog-activity.json";
134
+ var capturedDaysByStateDir = new Map;
97
135
  function resolveTelemetryStateDir(product, options = {}) {
98
136
  const dataDir = resolveXdgDataDir(product.cacheDirName, {
99
137
  env: options.env,
100
138
  osProvider: options.osProvider
101
139
  });
102
- const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join(options.env.XDG_DATA_HOME, product.cacheDirName);
140
+ const xdgStateDir = options.env?.XDG_DATA_HOME === undefined ? undefined : join2(options.env.XDG_DATA_HOME, product.cacheDirName);
103
141
  if (dataDir === xdgStateDir || xdgStateDir === undefined && basename(dataDir) === product.cacheDirName) {
104
142
  return dataDir;
105
143
  }
106
- return join(dataDir, product.cacheDirName);
144
+ return join2(dataDir, product.cacheDirName);
107
145
  }
108
146
  function getTelemetryActivityStateFilePath(stateDir) {
109
- return join(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
147
+ return join2(stateDir, POSTHOG_ACTIVITY_STATE_FILE);
110
148
  }
111
149
  function getDailyActiveCaptureState(input) {
112
- const state = readPostHogActivityState(input.stateDir, input.diagnostics);
113
150
  const dayUTC = getUtcDayString(input.now ?? new Date);
114
- const captureDaily = state.lastActiveDayUTC !== dayUTC;
115
- if (captureDaily) {
151
+ if (capturedDaysByStateDir.get(input.stateDir) === dayUTC) {
152
+ return { dayUTC, captureDaily: false };
153
+ }
154
+ const state = readPostHogActivityState(input.stateDir, input.diagnostics);
155
+ if (state.lastActiveDayUTC === dayUTC) {
156
+ capturedDaysByStateDir.set(input.stateDir, dayUTC);
157
+ return { dayUTC, captureDaily: false };
158
+ }
159
+ const claim = claimUtcDay(input.stateDir, dayUTC);
160
+ capturedDaysByStateDir.set(input.stateDir, dayUTC);
161
+ if (claim === "already-claimed") {
162
+ return { dayUTC, captureDaily: false };
163
+ }
164
+ if (claim === "claimed") {
116
165
  writePostHogActivityState(input.stateDir, {
117
166
  ...state,
118
167
  lastActiveDayUTC: dayUTC
119
168
  }, input.diagnostics);
120
169
  }
121
- return {
122
- dayUTC,
123
- captureDaily
124
- };
170
+ return { dayUTC, captureDaily: true };
125
171
  }
126
172
  function getUtcDayString(date) {
127
173
  return date.toISOString().slice(0, 10);
@@ -154,7 +200,7 @@ function readPostHogActivityState(stateDir, diagnostics) {
154
200
  function writePostHogActivityState(stateDir, nextState, diagnostics) {
155
201
  const stateFilePath = getTelemetryActivityStateFilePath(stateDir);
156
202
  try {
157
- mkdirSync2(stateDir, { recursive: true });
203
+ mkdirSync3(stateDir, { recursive: true });
158
204
  writeFileAtomically(stateFilePath, `${JSON.stringify(nextState, null, 2)}
159
205
  `);
160
206
  } catch (error) {
@@ -173,19 +219,19 @@ var DEFAULT_POSTHOG_API_KEY = "phc_CFJhj5HyvA62QPhvyaUCtaq23aUfznnijg5VaaGkNk74"
173
219
  var UNCONFIGURED_POSTHOG_API_KEY = "phc_REPLACE_ME_OMO_NATIVE";
174
220
 
175
221
  // ../../../../telemetry-core/src/diagnostics.ts
176
- import { appendFileSync, existsSync as existsSync2, mkdirSync as mkdirSync3, readFileSync as readFileSync2 } from "node:fs";
177
- import { join as join2 } from "node:path";
222
+ import { appendFileSync, existsSync as existsSync2, mkdirSync as mkdirSync4, readFileSync as readFileSync2 } from "node:fs";
223
+ import { join as join3 } from "node:path";
178
224
  var DIAGNOSTICS_FILE_NAME = "telemetry-diagnostics.jsonl";
179
225
  var DIAGNOSTICS_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
180
226
  var DIAGNOSTICS_MAX_BYTES = 256 * 1024;
181
227
  function getTelemetryDiagnosticsFilePath(diagnosticsDir) {
182
- return join2(diagnosticsDir, DIAGNOSTICS_FILE_NAME);
228
+ return join3(diagnosticsDir, DIAGNOSTICS_FILE_NAME);
183
229
  }
184
230
  function writeTelemetryDiagnostic(input, options) {
185
231
  const now = options.now ?? new Date;
186
232
  try {
187
233
  cleanupTelemetryDiagnostics({ diagnosticsDir: options.diagnosticsDir, now });
188
- mkdirSync3(options.diagnosticsDir, { recursive: true });
234
+ mkdirSync4(options.diagnosticsDir, { recursive: true });
189
235
  appendFileSync(getTelemetryDiagnosticsFilePath(options.diagnosticsDir), `${JSON.stringify(toDiagnosticRecord(input, now))}
190
236
  `, "utf-8");
191
237
  } catch (error) {