lazycodex-ai 5.0.0-beta.82 → 5.0.0-beta.83

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 (104) hide show
  1. package/README.ja.md +2 -2
  2. package/README.ko.md +2 -2
  3. package/README.md +4 -4
  4. package/README.ru.md +2 -2
  5. package/README.zh-cn.md +2 -2
  6. package/dist/cli/index.js +392 -112
  7. package/dist/cli/install-native/index.d.ts +4 -0
  8. package/dist/cli/install-native/plan.d.ts +11 -0
  9. package/dist/cli/install-native/run-native-install.d.ts +23 -0
  10. package/dist/cli/install-native-dev/index.d.ts +4 -0
  11. package/dist/cli/native-dev-platform-flag.d.ts +5 -0
  12. package/dist/cli/native-edition-hint.d.ts +10 -0
  13. package/dist/cli/types.d.ts +3 -2
  14. package/dist/cli-node/index.js +392 -112
  15. package/package.json +1 -1
  16. package/packages/omo-codex/plugin/.codex-plugin/plugin.json +1 -1
  17. package/packages/omo-codex/plugin/components/bootstrap/dist/cli.js +84 -11
  18. package/packages/omo-codex/plugin/components/bootstrap/hooks/hooks.json +1 -1
  19. package/packages/omo-codex/plugin/components/bootstrap/package.json +1 -1
  20. package/packages/omo-codex/plugin/components/comment-checker/hooks/hooks.json +1 -1
  21. package/packages/omo-codex/plugin/components/comment-checker/package.json +1 -1
  22. package/packages/omo-codex/plugin/components/git-bash/hooks/hooks.json +2 -2
  23. package/packages/omo-codex/plugin/components/git-bash/package.json +1 -1
  24. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/hooks/hooks.json +1 -1
  25. package/packages/omo-codex/plugin/components/lazycodex-executor-verify/package.json +1 -1
  26. package/packages/omo-codex/plugin/components/lsp/dist/.omo-runtime-manifest.json +2 -2
  27. package/packages/omo-codex/plugin/components/lsp/hooks/hooks.json +2 -2
  28. package/packages/omo-codex/plugin/components/lsp/package.json +1 -1
  29. package/packages/omo-codex/plugin/components/rules/hooks/hooks.json +4 -4
  30. package/packages/omo-codex/plugin/components/rules/package.json +1 -1
  31. package/packages/omo-codex/plugin/components/teammode/hooks/hooks.json +1 -1
  32. package/packages/omo-codex/plugin/components/teammode/package.json +1 -1
  33. package/packages/omo-codex/plugin/components/telemetry/hooks/hooks.json +1 -1
  34. package/packages/omo-codex/plugin/components/telemetry/package.json +1 -1
  35. package/packages/omo-codex/plugin/components/ultrawork/hooks/hooks.json +1 -1
  36. package/packages/omo-codex/plugin/components/ultrawork/package.json +1 -1
  37. package/packages/omo-codex/plugin/components/ulw-execute-continuation/hooks/hooks.json +1 -1
  38. package/packages/omo-codex/plugin/components/ulw-execute-continuation/package.json +1 -1
  39. package/packages/omo-codex/plugin/components/ulw-loop/dist/cli.js +24 -10
  40. package/packages/omo-codex/plugin/components/ulw-loop/dist/spawn-guard.js +8 -6
  41. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.d.ts +2 -0
  42. package/packages/omo-codex/plugin/components/ulw-loop/dist/surface.js +21 -4
  43. package/packages/omo-codex/plugin/components/ulw-loop/hooks/hooks.json +5 -5
  44. package/packages/omo-codex/plugin/components/ulw-loop/package.json +1 -1
  45. package/packages/omo-codex/plugin/components/ulw-loop/src/spawn-guard.ts +10 -5
  46. package/packages/omo-codex/plugin/components/ulw-loop/src/surface.ts +24 -6
  47. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard-native-reviewer.test.ts +207 -0
  48. package/packages/omo-codex/plugin/components/ulw-loop/test/spawn-guard.test.ts +6 -4
  49. package/packages/omo-codex/plugin/components/ulw-loop/test/surface.test.ts +43 -4
  50. package/packages/omo-codex/plugin/hooks/post-compact-resetting-git-bash-mcp-reminder.json +1 -1
  51. package/packages/omo-codex/plugin/hooks/post-compact-resetting-lsp-diagnostics-cache.json +1 -1
  52. package/packages/omo-codex/plugin/hooks/post-compact-resetting-project-rule-cache.json +1 -1
  53. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-comments.json +1 -1
  54. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-lsp-diagnostics.json +1 -1
  55. package/packages/omo-codex/plugin/hooks/post-tool-use-checking-thread-title-hygiene.json +1 -1
  56. package/packages/omo-codex/plugin/hooks/post-tool-use-matching-project-rules.json +1 -1
  57. package/packages/omo-codex/plugin/hooks/post-tool-use-recording-spawn-admission.json +1 -1
  58. package/packages/omo-codex/plugin/hooks/pre-tool-use-enforcing-unlimited-goal-budget.json +1 -1
  59. package/packages/omo-codex/plugin/hooks/pre-tool-use-guarding-ulw-loop-spawns.json +1 -1
  60. package/packages/omo-codex/plugin/hooks/pre-tool-use-recommending-git-bash-mcp.json +1 -1
  61. package/packages/omo-codex/plugin/hooks/session-start-checking-auto-update.json +1 -1
  62. package/packages/omo-codex/plugin/hooks/session-start-checking-bootstrap-provisioning.json +1 -1
  63. package/packages/omo-codex/plugin/hooks/session-start-loading-project-rules.json +1 -1
  64. package/packages/omo-codex/plugin/hooks/session-start-recording-session-telemetry.json +1 -1
  65. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-execute-continuation.json +1 -1
  66. package/packages/omo-codex/plugin/hooks/stop-checking-ulw-loop-resume.json +1 -1
  67. package/packages/omo-codex/plugin/hooks/subagent-stop-verifying-lazycodex-executor-evidence.json +1 -1
  68. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ultrawork-trigger.json +1 -1
  69. package/packages/omo-codex/plugin/hooks/user-prompt-submit-checking-ulw-loop-steering.json +1 -1
  70. package/packages/omo-codex/plugin/hooks/user-prompt-submit-loading-project-rules.json +1 -1
  71. package/packages/omo-codex/plugin/package-lock.json +12 -12
  72. package/packages/omo-codex/plugin/package.json +1 -1
  73. package/packages/omo-codex/plugin/skills/browser/ATTRIBUTION.md +25 -0
  74. package/packages/omo-codex/plugin/skills/browser/SKILL.md +89 -0
  75. package/packages/omo-codex/plugin/skills/browser/agents/openai.yaml +2 -0
  76. package/packages/omo-codex/plugin/skills/browser/references/commands.md +90 -0
  77. package/packages/omo-codex/plugin/skills/browser/references/install.md +71 -0
  78. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/README.md +42 -0
  79. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/frames-and-humans.md +39 -0
  80. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/ladder.md +59 -0
  81. package/packages/omo-codex/plugin/skills/browser/references/owned-engine/network.md +42 -0
  82. package/packages/omo-codex/plugin/skills/browser/references/recipes/1password.md +59 -0
  83. package/packages/omo-codex/plugin/skills/browser/references/remote.md +24 -0
  84. package/packages/omo-codex/plugin/skills/browser/scripts/browser-doctor.mjs +41 -0
  85. package/packages/omo-codex/plugin/skills/browser/scripts/browser-env.mjs +41 -0
  86. package/packages/omo-codex/plugin/skills/browser/scripts/browser-install.mjs +51 -0
  87. package/packages/omo-codex/plugin/test/sync-skills-test-support.mjs +1 -0
  88. package/packages/omo-codex/scripts/install-dist/install-local.mjs +90 -17
  89. package/packages/shared-skills/skills/browser/ATTRIBUTION.md +25 -0
  90. package/packages/shared-skills/skills/browser/SKILL.md +89 -0
  91. package/packages/shared-skills/skills/browser/references/commands.md +90 -0
  92. package/packages/shared-skills/skills/browser/references/install.md +71 -0
  93. package/packages/shared-skills/skills/browser/references/owned-engine/README.md +42 -0
  94. package/packages/shared-skills/skills/browser/references/owned-engine/frames-and-humans.md +39 -0
  95. package/packages/shared-skills/skills/browser/references/owned-engine/ladder.md +59 -0
  96. package/packages/shared-skills/skills/browser/references/owned-engine/network.md +42 -0
  97. package/packages/shared-skills/skills/browser/references/recipes/1password.md +59 -0
  98. package/packages/shared-skills/skills/browser/references/remote.md +24 -0
  99. package/packages/shared-skills/skills/browser/scripts/browser-doctor.mjs +41 -0
  100. package/packages/shared-skills/skills/browser/scripts/browser-env.mjs +41 -0
  101. package/packages/shared-skills/skills/browser/scripts/browser-install.mjs +51 -0
  102. package/dist/cli/install-senpi/index.d.ts +0 -1
  103. package/dist/cli/senpi-edition-hint.d.ts +0 -10
  104. package/dist/cli/senpi-platform-flag.d.ts +0 -4
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lazycodex-ai",
3
- "version": "5.0.0-beta.82",
3
+ "version": "5.0.0-beta.83",
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",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "omo",
3
- "version": "5.0.0-beta.82",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "One Codex plugin namespace for Yeongyu's local Codex components.",
5
5
  "author": {
6
6
  "name": "Yeongyu Kim",
@@ -7072,8 +7072,10 @@ var OmoGitMasterSettingsSchema = OmoGitMasterSettingsLayerSchema.extend({
7072
7072
 
7073
7073
  // ../../omo-config-core/src/schema/harness.ts
7074
7074
  var HARNESS_IDS = ["codex", "opencode", "omo"];
7075
- var OMO_CONFIG_HARNESS_IDS = ["opencode", "senpi", "codex"];
7075
+ var OMO_CONFIG_HARNESS_IDS = ["opencode", "native", "codex"];
7076
7076
  var OmoHarnessIdSchema = _enum(OMO_CONFIG_HARNESS_IDS);
7077
+ var OMO_CONFIG_LEGACY_HARNESS_ALIASES = { senpi: "native" };
7078
+ var OMO_CONFIG_LEGACY_HARNESS_IDS = Object.keys(OMO_CONFIG_LEGACY_HARNESS_ALIASES);
7077
7079
 
7078
7080
  // ../../omo-config-core/src/schema/memory.ts
7079
7081
  var OmoMemoryReflectionTriggerSchema = object({
@@ -7532,6 +7534,7 @@ var OmoConfigProfileSchema = object({
7532
7534
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
7533
7535
  disabled_skills: OmoDisabledSkillsSchema.optional(),
7534
7536
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
7537
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
7535
7538
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
7536
7539
  "[codex]": OmoTypedHarnessConfigSchema.optional()
7537
7540
  }).strict();
@@ -7550,6 +7553,7 @@ var OmoConfigSchema = object({
7550
7553
  telemetry: OmoTelemetrySettingsSchema.optional(),
7551
7554
  disabled_skills: OmoDisabledSkillsSchema.optional(),
7552
7555
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
7556
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
7553
7557
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
7554
7558
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
7555
7559
  profiles: record(string2(), OmoConfigProfileSchema).default({}),
@@ -7571,6 +7575,7 @@ var OmoConfigLayerSchema = object({
7571
7575
  telemetry: OmoTelemetrySettingsLayerSchema.optional(),
7572
7576
  disabled_skills: OmoDisabledSkillsSchema.optional(),
7573
7577
  "[opencode]": OmoOpenCodeHarnessConfigSchema.optional(),
7578
+ "[native]": OmoTypedHarnessConfigSchema.optional(),
7574
7579
  "[senpi]": OmoTypedHarnessConfigSchema.optional(),
7575
7580
  "[codex]": OmoTypedHarnessConfigSchema.optional(),
7576
7581
  profiles: record(string2(), OmoConfigProfileSchema).optional(),
@@ -7634,6 +7639,54 @@ function canonicalizeLegacyCategoryNames(document) {
7634
7639
  return { document: canonicalized, renames };
7635
7640
  }
7636
7641
 
7642
+ // ../../omo-config-core/src/schema/legacy-harness-names.ts
7643
+ function canonicalHarnessName(name) {
7644
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, name) ? OMO_CONFIG_LEGACY_HARNESS_ALIASES[name] : name;
7645
+ }
7646
+ function harnessBlockKey(harness) {
7647
+ return `[${harness}]`;
7648
+ }
7649
+ function legacyHarnessOfBlockKey(key) {
7650
+ if (!key.startsWith("[") || !key.endsWith("]"))
7651
+ return;
7652
+ const harness = key.slice(1, -1);
7653
+ return Object.hasOwn(OMO_CONFIG_LEGACY_HARNESS_ALIASES, harness) ? harness : undefined;
7654
+ }
7655
+ function isRecord8(value) {
7656
+ return typeof value === "object" && value !== null && !Array.isArray(value);
7657
+ }
7658
+ function canonicalizeBlocksIn(container, path, renames) {
7659
+ const result = {};
7660
+ for (const [key, value] of Object.entries(container)) {
7661
+ const legacyHarness = legacyHarnessOfBlockKey(key);
7662
+ if (legacyHarness === undefined) {
7663
+ result[key] = value;
7664
+ continue;
7665
+ }
7666
+ const canonical = harnessBlockKey(canonicalHarnessName(legacyHarness));
7667
+ const dropped = Object.hasOwn(container, canonical);
7668
+ renames.push({ canonical, dropped, legacy: key, path: [...path, key].join(".") });
7669
+ if (!dropped)
7670
+ result[canonical] = value;
7671
+ }
7672
+ return result;
7673
+ }
7674
+ function canonicalizeLegacyHarnessBlocks(document) {
7675
+ if (!isRecord8(document))
7676
+ return { document: {}, renames: [] };
7677
+ const renames = [];
7678
+ const canonicalized = canonicalizeBlocksIn(document, [], renames);
7679
+ const profiles = canonicalized["profiles"];
7680
+ if (isRecord8(profiles)) {
7681
+ const canonicalProfiles = {};
7682
+ for (const [name, profile] of Object.entries(profiles)) {
7683
+ canonicalProfiles[name] = isRecord8(profile) ? canonicalizeBlocksIn(profile, ["profiles", name], renames) : profile;
7684
+ }
7685
+ canonicalized["profiles"] = canonicalProfiles;
7686
+ }
7687
+ return { document: canonicalized, renames };
7688
+ }
7689
+
7637
7690
  // ../../../node_modules/.bun/jsonc-parser@3.3.1/node_modules/jsonc-parser/lib/esm/impl/scanner.js
7638
7691
  function createScanner(text, ignoreTrivia = false) {
7639
7692
  const len = text.length;
@@ -8609,7 +8662,7 @@ function resolveOmoConfigPaths(options) {
8609
8662
  }
8610
8663
 
8611
8664
  // ../../omo-config-core/src/loader/resolution.ts
8612
- var HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS])].map((harness) => `[${harness}]`);
8665
+ var HARNESS_KEYS = [...new Set([...HARNESS_IDS, ...OMO_CONFIG_HARNESS_IDS, ...OMO_CONFIG_LEGACY_HARNESS_IDS])].map((harness) => harnessBlockKey(harness));
8613
8666
  function profileName(value) {
8614
8667
  return value === "" ? undefined : value;
8615
8668
  }
@@ -8638,7 +8691,13 @@ function withoutControlKeys(config) {
8638
8691
  function harnessLayer(config, harness) {
8639
8692
  if (harness === undefined)
8640
8693
  return {};
8641
- return toRecord(config[`[${harness}]`]) ?? {};
8694
+ const canonical = canonicalHarnessName(harness);
8695
+ const legacyKeys = Object.entries(OMO_CONFIG_LEGACY_HARNESS_ALIASES).filter(([, target]) => target === canonical).map(([legacy]) => harnessBlockKey(legacy));
8696
+ let layer = {};
8697
+ for (const key of [...legacyKeys, harnessBlockKey(canonical)]) {
8698
+ layer = mergeOmoConfigRecords(layer, toRecord(config[key]) ?? {});
8699
+ }
8700
+ return layer;
8642
8701
  }
8643
8702
  function resolveOmoConfigView(options) {
8644
8703
  const profiles = toRecord(options.config["profiles"]);
@@ -8689,6 +8748,7 @@ var DEFAULT_RAW_CONFIG = {
8689
8748
  function stripResolutionControlKeys(config) {
8690
8749
  const {
8691
8750
  "[codex]": _codex,
8751
+ "[native]": _native,
8692
8752
  "[opencode]": _opencode,
8693
8753
  "[senpi]": _senpi,
8694
8754
  profiles: _profiles,
@@ -8714,21 +8774,21 @@ function hasUnsafeUnrecognizedKey(issues) {
8714
8774
  function hasTamperedPrototype(value) {
8715
8775
  if (Array.isArray(value))
8716
8776
  return value.some((entry) => hasTamperedPrototype(entry));
8717
- if (!isRecord8(value))
8777
+ if (!isRecord9(value))
8718
8778
  return false;
8719
8779
  const prototype = Object.getPrototypeOf(value);
8720
8780
  if (prototype !== Object.prototype && prototype !== null)
8721
8781
  return true;
8722
8782
  return Object.values(value).some((entry) => hasTamperedPrototype(entry));
8723
8783
  }
8724
- function isRecord8(value) {
8784
+ function isRecord9(value) {
8725
8785
  return typeof value === "object" && value !== null && !Array.isArray(value);
8726
8786
  }
8727
8787
  function containerAt(record, path) {
8728
8788
  let container = record;
8729
8789
  for (const segment of path) {
8730
8790
  const next = container[segment];
8731
- if (!isRecord8(next))
8791
+ if (!isRecord9(next))
8732
8792
  return null;
8733
8793
  container = next;
8734
8794
  }
@@ -8839,6 +8899,15 @@ function legacyCategoryDiagnostic(path, renames) {
8839
8899
  issuePaths: renames.map((rename) => rename.path)
8840
8900
  };
8841
8901
  }
8902
+ function legacyHarnessDiagnostic(path, renames) {
8903
+ const detail = renames.map((rename) => rename.dropped ? `${rename.path} ignored because ${rename.canonical} is also configured` : `${rename.path} renamed to ${rename.canonical}`).join(", ");
8904
+ return {
8905
+ kind: "deprecated-keys",
8906
+ message: `Deprecated harness block in ${path}: ${detail}. Rename it; the alias is removed in a future release.`,
8907
+ path,
8908
+ issuePaths: renames.map((rename) => rename.path)
8909
+ };
8910
+ }
8842
8911
  function loadOmoConfig(options = {}) {
8843
8912
  const fileSystem = options.fileSystem ?? DEFAULT_READ_FILE_SYSTEM;
8844
8913
  const cwd = options.cwd ?? process.cwd();
@@ -8861,8 +8930,12 @@ function loadOmoConfig(options = {}) {
8861
8930
  if (canonicalized.renames.length > 0) {
8862
8931
  diagnostics.push(legacyCategoryDiagnostic(candidate.path, canonicalized.renames));
8863
8932
  }
8864
- layers.push({ config: canonicalized.document, source: loaded.source });
8865
- merged = mergeOmoConfigRecords(merged, canonicalized.document);
8933
+ const harnessCanonicalized = canonicalizeLegacyHarnessBlocks(canonicalized.document);
8934
+ if (harnessCanonicalized.renames.length > 0) {
8935
+ diagnostics.push(legacyHarnessDiagnostic(candidate.path, harnessCanonicalized.renames));
8936
+ }
8937
+ layers.push({ config: harnessCanonicalized.document, source: loaded.source });
8938
+ merged = mergeOmoConfigRecords(merged, harnessCanonicalized.document);
8866
8939
  }
8867
8940
  }
8868
8941
  const requestedProfile = resolveOmoProfileName({
@@ -11266,10 +11339,10 @@ function readCatalogMultiAgentVersion(model, cachePath) {
11266
11339
  } catch {
11267
11340
  return null;
11268
11341
  }
11269
- if (!isRecord9(cache) || !Array.isArray(cache.models))
11342
+ if (!isRecord10(cache) || !Array.isArray(cache.models))
11270
11343
  return null;
11271
11344
  for (const entry of cache.models) {
11272
- if (!isRecord9(entry))
11345
+ if (!isRecord10(entry))
11273
11346
  continue;
11274
11347
  if (entry.slug !== model && entry.id !== model)
11275
11348
  continue;
@@ -11294,7 +11367,7 @@ function readRootModelCatalogPath(config) {
11294
11367
  const single = config.match(/^\s*model_catalog_json\s*=\s*'([^']+)'/m);
11295
11368
  return single?.[1] ?? null;
11296
11369
  }
11297
- function isRecord9(value) {
11370
+ function isRecord10(value) {
11298
11371
  return typeof value === "object" && value !== null && !Array.isArray(value);
11299
11372
  }
11300
11373
  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.82) Checking Bootstrap Provisioning"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
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.82) Checking Comments"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
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.82) Recommending Git Bash MCP"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82) Resetting Git Bash MCP Reminder"
23
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
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.82) Verifying LazyCodex Executor Evidence"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
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.82",
4
- "inputDigest": "sha256:f84253a3ef9adbbb38854e910085ce47367ce00417a9e7b404c6c08c4b07ec63",
3
+ "version": "5.0.0-beta.83",
4
+ "inputDigest": "sha256:c2a4d0a5733ce0a84a7b045a3c294a3b1b17f06e421e60a6f19ce486a03aaa2f",
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.82) Checking LSP Diagnostics"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82) Resetting LSP Diagnostics Cache"
24
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
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.82) Loading Project Rules"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82) Loading Project Rules"
22
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82) Matching Project Rules"
35
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82) Resetting Project Rule Cache"
48
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
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.82) Checking Thread Title Hygiene"
11
+ "statusMessage": "(OmO 5.0.0-beta.83) 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.82",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex team-mode hook component that keeps background thread titles descriptive after create_thread.",
5
5
  "type": "module",
6
6
  "private": true,
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook session-start",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.82) Recording Session Telemetry"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Recording Session Telemetry"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-telemetry",
3
- "version": "5.0.0-beta.82",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin component that emits omo-codex anonymous daily-active telemetry on SessionStart.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/dist/cli.js\" hook user-prompt-submit",
9
9
  "timeout": 5,
10
- "statusMessage": "(OmO 5.0.0-beta.82) Checking Ultrawork Trigger"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Ultrawork Trigger"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ultrawork",
3
- "version": "5.0.0-beta.82",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex plugin that injects the ultrawork orchestration directive and ships LazyCodex planning, review, QA, and gate agent roles.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -7,7 +7,7 @@
7
7
  "type": "command",
8
8
  "command": "node \"${PLUGIN_ROOT}/components/ulw-execute-continuation/dist/cli.js\" hook stop",
9
9
  "timeout": 10,
10
- "statusMessage": "(OmO 5.0.0-beta.82) Checking Ulw-Execute Continuation"
10
+ "statusMessage": "(OmO 5.0.0-beta.83) Checking Ulw-Execute Continuation"
11
11
  }
12
12
  ]
13
13
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/codex-ulw-execute-continuation",
3
- "version": "5.0.0-beta.82",
3
+ "version": "5.0.0-beta.83",
4
4
  "description": "Codex Stop hook continuation injector for omo-codex ulw-execute plans.",
5
5
  "type": "module",
6
6
  "packageManager": "npm@11.12.1",
@@ -1362,12 +1362,24 @@ var REVIEWER_ROLES_BY_SURFACE = {
1362
1362
  gateReview: "lazycodex-gate-reviewer"
1363
1363
  },
1364
1364
  "omo-senpi": {
1365
- codeReview: "omo-senpi-code-reviewer",
1366
- manualQa: "omo-senpi-qa-executor",
1367
- gateReview: "omo-senpi-gate-reviewer"
1365
+ codeReview: "omo-native-code-reviewer",
1366
+ manualQa: "omo-native-qa-executor",
1367
+ gateReview: "omo-native-gate-reviewer"
1368
1368
  }
1369
1369
  };
1370
- var GATE_REVIEWER_AGENT_NAMES = new Set(Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview));
1370
+ var LEGACY_REVIEWER_AGENT_ALIASES = {
1371
+ "omo-senpi-code-reviewer": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].codeReview,
1372
+ "omo-senpi-qa-executor": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].manualQa,
1373
+ "omo-senpi-gate-reviewer": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].gateReview
1374
+ };
1375
+ function canonicalReviewerAgentName(reviewer) {
1376
+ return LEGACY_REVIEWER_AGENT_ALIASES[reviewer] ?? reviewer;
1377
+ }
1378
+ var CANONICAL_GATE_REVIEW_NAMES = Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview);
1379
+ var GATE_REVIEWER_AGENT_NAMES = new Set([
1380
+ ...CANONICAL_GATE_REVIEW_NAMES,
1381
+ ...Object.entries(LEGACY_REVIEWER_AGENT_ALIASES).filter(([, canonical]) => CANONICAL_GATE_REVIEW_NAMES.includes(canonical)).map(([legacy]) => legacy)
1382
+ ]);
1371
1383
  var REQUIRED_GATE_SECTIONS_BY_SURFACE = {
1372
1384
  lazycodex: ["manualQa", "gateReview", "iteration", "criteriaCoverage"],
1373
1385
  "omo-senpi": ["manualQa", "gateReview", "iteration", "criteriaCoverage"]
@@ -4437,11 +4449,12 @@ var SPAWN_TOOL_TOKENS = new Set([
4437
4449
  ]);
4438
4450
  var DEFAULT_FANOUT_LIMIT = 24;
4439
4451
  var DEFAULT_REVIEW_SPAWN_LIMIT = 3;
4440
- var GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
4452
+ var GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-native-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
4441
4453
  var REVIEW_AGENT_TYPES = [
4442
4454
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview),
4443
4455
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.codeReview),
4444
- ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa)
4456
+ ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa),
4457
+ ...Object.keys(LEGACY_REVIEWER_AGENT_ALIASES)
4445
4458
  ];
4446
4459
  var REVIEW_AGENT_TYPE_SET = new Set(REVIEW_AGENT_TYPES);
4447
4460
  function applySpawnGuards(payload, options = {}) {
@@ -4623,16 +4636,17 @@ function reviewAgentType(toolInput) {
4623
4636
  return GATE_MESSAGE_PATTERN.test(message) ? reviewerRolesFor(resolveToolkitSurface()).gateReview : null;
4624
4637
  }
4625
4638
  function activeSurfaceReviewerAlias(reviewer) {
4639
+ const canonical = canonicalReviewerAgentName(reviewer);
4626
4640
  const activeRoles = reviewerRolesFor(resolveToolkitSurface());
4627
4641
  for (const roles of Object.values(REVIEWER_ROLES_BY_SURFACE)) {
4628
- if (reviewer === roles.codeReview)
4642
+ if (canonical === roles.codeReview)
4629
4643
  return activeRoles.codeReview;
4630
- if (reviewer === roles.manualQa)
4644
+ if (canonical === roles.manualQa)
4631
4645
  return activeRoles.manualQa;
4632
- if (reviewer === roles.gateReview)
4646
+ if (canonical === roles.gateReview)
4633
4647
  return activeRoles.gateReview;
4634
4648
  }
4635
- return reviewer;
4649
+ return canonical;
4636
4650
  }
4637
4651
  function deny(reason) {
4638
4652
  return `${JSON.stringify({
@@ -7,7 +7,7 @@ import { readUlwLoopPlanSync } from "./plan-io.js";
7
7
  import { atomicWriteJson, isNonEmptyFile, readAdmissionBreaker, readCount, readCounts } from "./spawn-budget-io.js";
8
8
  import { spawnRoleDenial } from "./spawn-role-guard.js";
9
9
  import { isStateLockTimeout, withStateLockSync } from "./state-lock.js";
10
- import { GATE_REVIEWER_AGENT_NAMES, REVIEWER_ROLES_BY_SURFACE, resolveToolkitSurface, reviewerRolesFor, } from "./surface.js";
10
+ import { canonicalReviewerAgentName, GATE_REVIEWER_AGENT_NAMES, LEGACY_REVIEWER_AGENT_ALIASES, REVIEWER_ROLES_BY_SURFACE, resolveToolkitSurface, reviewerRolesFor, } from "./surface.js";
11
11
  // spawn_agent = v1; collaborationspawn_agent = the delimiter-free flattened v2
12
12
  // hook token from codex-rs hook_names.rs; collaboration.spawn_agent = the
13
13
  // dotted token observed live in the task-1 probe (hook-tool-tokens.txt).
@@ -19,11 +19,12 @@ const SPAWN_TOOL_TOKENS = new Set([
19
19
  ]);
20
20
  export const DEFAULT_FANOUT_LIMIT = 24;
21
21
  const DEFAULT_REVIEW_SPAWN_LIMIT = 3;
22
- const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
22
+ const GATE_MESSAGE_PATTERN = /lazycodex-gate-reviewer|omo-native-gate-reviewer|omo-senpi-gate-reviewer|final gate review/i;
23
23
  const REVIEW_AGENT_TYPES = [
24
24
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview),
25
25
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.codeReview),
26
26
  ...Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.manualQa),
27
+ ...Object.keys(LEGACY_REVIEWER_AGENT_ALIASES),
27
28
  ];
28
29
  const REVIEW_AGENT_TYPE_SET = new Set(REVIEW_AGENT_TYPES);
29
30
  export function applySpawnGuards(payload, options = {}) {
@@ -230,16 +231,17 @@ function reviewAgentType(toolInput) {
230
231
  return GATE_MESSAGE_PATTERN.test(message) ? reviewerRolesFor(resolveToolkitSurface()).gateReview : null;
231
232
  }
232
233
  function activeSurfaceReviewerAlias(reviewer) {
234
+ const canonical = canonicalReviewerAgentName(reviewer);
233
235
  const activeRoles = reviewerRolesFor(resolveToolkitSurface());
234
236
  for (const roles of Object.values(REVIEWER_ROLES_BY_SURFACE)) {
235
- if (reviewer === roles.codeReview)
237
+ if (canonical === roles.codeReview)
236
238
  return activeRoles.codeReview;
237
- if (reviewer === roles.manualQa)
239
+ if (canonical === roles.manualQa)
238
240
  return activeRoles.manualQa;
239
- if (reviewer === roles.gateReview)
241
+ if (canonical === roles.gateReview)
240
242
  return activeRoles.gateReview;
241
243
  }
242
- return reviewer;
244
+ return canonical;
243
245
  }
244
246
  function deny(reason) {
245
247
  return `${JSON.stringify({
@@ -5,6 +5,8 @@ export interface UlwLoopReviewerRoles {
5
5
  readonly gateReview: string;
6
6
  }
7
7
  export declare const REVIEWER_ROLES_BY_SURFACE: Readonly<Record<UlwLoopToolkitSurface, UlwLoopReviewerRoles>>;
8
+ export declare const LEGACY_REVIEWER_AGENT_ALIASES: Readonly<Record<string, string>>;
9
+ export declare function canonicalReviewerAgentName(reviewer: string): string;
8
10
  export declare const GATE_REVIEWER_AGENT_NAMES: ReadonlySet<string>;
9
11
  export type UlwLoopGateSection = "codeReview" | "manualQa" | "gateReview" | "iteration" | "criteriaCoverage";
10
12
  export declare const REQUIRED_GATE_SECTIONS_BY_SURFACE: Readonly<Record<UlwLoopToolkitSurface, readonly UlwLoopGateSection[]>>;
@@ -8,12 +8,29 @@ export const REVIEWER_ROLES_BY_SURFACE = {
8
8
  gateReview: "lazycodex-gate-reviewer",
9
9
  },
10
10
  "omo-senpi": {
11
- codeReview: "omo-senpi-code-reviewer",
12
- manualQa: "omo-senpi-qa-executor",
13
- gateReview: "omo-senpi-gate-reviewer",
11
+ codeReview: "omo-native-code-reviewer",
12
+ manualQa: "omo-native-qa-executor",
13
+ gateReview: "omo-native-gate-reviewer",
14
14
  },
15
15
  };
16
- export const GATE_REVIEWER_AGENT_NAMES = new Set(Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview));
16
+ // The reviewer agents were renamed omo-senpi-* -> omo-native-*. The retired spellings stay
17
+ // resolvable for one release line so a caller that still names one is recognized rather than
18
+ // silently treated as a non-review spawn.
19
+ export const LEGACY_REVIEWER_AGENT_ALIASES = {
20
+ "omo-senpi-code-reviewer": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].codeReview,
21
+ "omo-senpi-qa-executor": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].manualQa,
22
+ "omo-senpi-gate-reviewer": REVIEWER_ROLES_BY_SURFACE["omo-senpi"].gateReview,
23
+ };
24
+ export function canonicalReviewerAgentName(reviewer) {
25
+ return LEGACY_REVIEWER_AGENT_ALIASES[reviewer] ?? reviewer;
26
+ }
27
+ const CANONICAL_GATE_REVIEW_NAMES = Object.values(REVIEWER_ROLES_BY_SURFACE).map((roles) => roles.gateReview);
28
+ export const GATE_REVIEWER_AGENT_NAMES = new Set([
29
+ ...CANONICAL_GATE_REVIEW_NAMES,
30
+ ...Object.entries(LEGACY_REVIEWER_AGENT_ALIASES)
31
+ .filter(([, canonical]) => CANONICAL_GATE_REVIEW_NAMES.includes(canonical))
32
+ .map(([legacy]) => legacy),
33
+ ]);
17
34
  export const REQUIRED_GATE_SECTIONS_BY_SURFACE = {
18
35
  lazycodex: ["manualQa", "gateReview", "iteration", "criteriaCoverage"],
19
36
  "omo-senpi": ["manualQa", "gateReview", "iteration", "criteriaCoverage"],