@orchid-labs/pluxx 0.1.16 → 0.1.17

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.
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAuE,KAAK,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AA8B3I,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAElE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,gBAAgB,CAAC,EAAE,2BAA2B,CAAA;CAC/C;AAuCD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAupED,wBAAsB,cAAc,CAClC,OAAO,GAAE,MAAsB,EAC/B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,YAAY,CAAC,CAkEvB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkF1F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAyB5D"}
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/cli/doctor.ts"],"names":[],"mappings":"AAUA,OAAO,EAAuE,KAAK,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AA+B3I,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAAA;AAElE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,gBAAgB,CAAC,EAAE,2BAA2B,CAAA;CAC/C;AAuCD,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AA4qED,wBAAsB,cAAc,CAClC,OAAO,GAAE,MAAsB,EAC/B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,YAAY,CAAC,CAkEvB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,MAAsB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkF1F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAyB5D"}
package/dist/cli/index.js CHANGED
@@ -6077,7 +6077,7 @@ function getEnabledRuntimeReadinessBindings(capability, plan) {
6077
6077
  });
6078
6078
  }
6079
6079
  var NAMED_PROMPT_TARGET_NOTE = "Named `skills` / `commands` readiness targets currently translate through prompt-entry gating with best-effort matching because the core four do not share one exact per-skill or per-command runtime interception surface.";
6080
- var CODEX_EXTERNAL_NOTE = "Codex readiness now bundles translated hooks in the plugin, and Pluxx still emits `.codex/readiness.generated.json` plus `.codex/hooks.generated.json` as debugging companions because some Codex runtimes still gate hook activation behind a `[features]` flag. Current Codex config surfaces still accept both `hooks = true` and `codex_hooks = true`, but maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 timing out without a project-local hook side effect under either flag while emitting a deprecation warning for `codex_hooks` that points users to `hooks`.";
6080
+ var CODEX_EXTERNAL_NOTE = "Codex readiness now bundles translated hooks in the plugin, and Pluxx still emits `.codex/readiness.generated.json` plus `.codex/hooks.generated.json` as debugging companions because plugin-bundled hook activation still depends on `[features].plugin_hooks = true`. The general `hooks = true` flag covers non-plugin hook config and defaults on, while `codex_hooks` is deprecated and should not be treated as a plugin-bundled hook fallback.";
6081
6081
  function getRuntimeReadinessNamedPromptTargetNote() {
6082
6082
  return NAMED_PROMPT_TARGET_NOTE;
6083
6083
  }
@@ -9870,18 +9870,25 @@ function toQuotedTomlKey(value) {
9870
9870
  // src/codex-hooks-feature.ts
9871
9871
  var RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG = "hooks";
9872
9872
  var ALTERNATE_CODEX_HOOKS_FEATURE_FLAG = "codex_hooks";
9873
+ var PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG = "plugin_hooks";
9873
9874
  function getCodexHooksFeatureState(features) {
9874
9875
  if (!features) {
9875
9876
  return {
9877
+ pluginBundled: false,
9876
9878
  recommended: false,
9877
9879
  alternate: false
9878
9880
  };
9879
9881
  }
9880
9882
  return {
9883
+ pluginBundled: features[PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG] === true,
9881
9884
  recommended: features[RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG] === true,
9882
9885
  alternate: features[ALTERNATE_CODEX_HOOKS_FEATURE_FLAG] === true
9883
9886
  };
9884
9887
  }
9888
+ function isCodexPluginHooksFeatureEnabled(features) {
9889
+ const state = getCodexHooksFeatureState(features);
9890
+ return state.pluginBundled;
9891
+ }
9885
9892
  function isCodexHooksFeatureEnabled(features) {
9886
9893
  const state = getCodexHooksFeatureState(features);
9887
9894
  return state.recommended || state.alternate;
@@ -10210,9 +10217,10 @@ var CodexGenerator = class extends Generator {
10210
10217
  await this.writeJson(".codex/hooks.generated.json", {
10211
10218
  model: "pluxx.codex-hooks.v1",
10212
10219
  enforcedByPluginBundle: true,
10213
- featureFlag: RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG,
10214
- alternateFeatureFlag: ALTERNATE_CODEX_HOOKS_FEATURE_FLAG,
10215
- note: "Codex hook configuration is bundled at hooks/hooks.json in the plugin. This companion mirror preserves the translated native event names, matcher groups, and command handlers while highlighting any dropped events or fields. Current Codex config surfaces still accept both hooks and codex_hooks under [features], but maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 timing out without a project-local hook side effect under either flag while emitting a deprecation warning for codex_hooks that points users to hooks.",
10220
+ pluginBundleFeatureFlag: PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG,
10221
+ generalFeatureFlag: RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG,
10222
+ deprecatedGeneralFeatureFlag: ALTERNATE_CODEX_HOOKS_FEATURE_FLAG,
10223
+ note: "Codex plugin-bundled hook configuration is bundled at hooks/hooks.json in the plugin and currently requires `[features].plugin_hooks = true`. The general `[features].hooks` flag covers non-plugin hook config and defaults on, while `codex_hooks` is deprecated and should not be treated as a plugin-bundled hook fallback. This companion mirror preserves the translated native event names, matcher groups, and command handlers while highlighting any dropped events or fields.",
10216
10224
  hooks,
10217
10225
  ...unsupported.length > 0 ? { unsupported } : {}
10218
10226
  });
@@ -11634,7 +11642,7 @@ var PLATFORM_VALIDATION_RULES = {
11634
11642
  supported: true,
11635
11643
  files: ["hooks/hooks.json", ".codex/hooks.json", "~/.codex/hooks.json"],
11636
11644
  eventNames: ["SessionStart", "PreToolUse", "PermissionRequest", "PostToolUse", "UserPromptSubmit", "Stop"],
11637
- notes: "Codex documents hooks in project and user config, and the current config schema still accepts both `[features].hooks = true` and `[features].codex_hooks = true`. Maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 timing out without a project-local `.codex/hooks.json` side effect or `/hooks` review gate under either flag; the `codex_hooks` variant also emitted a deprecation message that points users to `hooks`, while the official docs still show `codex_hooks`. The official hooks docs also cover plugin-bundled hooks, which Pluxx now emits at `hooks/hooks.json`."
11645
+ notes: "Codex documents both project or user hook config and plugin-bundled hooks. Plugin-bundled hooks live at `hooks/hooks.json` in the plugin and require `[features].plugin_hooks = true`; the general `[features].hooks = true` flag covers non-plugin hook config and defaults on. `codex_hooks` is deprecated and should not be treated as a plugin-bundled hook fallback."
11638
11646
  },
11639
11647
  instructions: {
11640
11648
  files: ["AGENTS.md", "AGENTS.override.md"],
@@ -13343,12 +13351,12 @@ function lintCodexHooksExternalConfig(config, issues) {
13343
13351
  if (Object.keys(config.hooks).length === 0) return;
13344
13352
  const codexOverrides = asRecord3(config.platforms?.codex);
13345
13353
  const features = codexOverrides ? asRecord3(codexOverrides.features) : null;
13346
- const hasPluxxCodexHooksFlag = isCodexHooksFeatureEnabled(features);
13347
- if (!hasPluxxCodexHooksFlag) {
13354
+ const hasPluxxCodexPluginHooksFlag = isCodexPluginHooksFeatureEnabled(features);
13355
+ if (!hasPluxxCodexPluginHooksFlag) {
13348
13356
  pushIssue(issues, {
13349
13357
  level: "warning",
13350
13358
  code: "codex-hooks-external-config",
13351
- message: `Pluxx now bundles Codex hooks at \`hooks/hooks.json\`, but Codex hook loading may still be guarded by a \`[features]\` flag in the host runtime. Current Codex config surfaces still accept both \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` and \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\`; maintained probes on May 13, 2026 showed local Codex CLI 0.130.0 still failing to execute the project-local hook under either config flag and under the current CLI feature path \`--enable hooks\`, while \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` emitted a deprecation warning that points users to \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\`. If bundled hooks do not activate, enable \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` first, reload Codex, and retest in a trusted interactive session, but do not treat the flag by itself as proof that hooks will execute.`,
13359
+ message: `Pluxx now bundles Codex hooks at \`hooks/hooks.json\`, and Codex plugin-bundled hook loading requires \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\`. The general \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\` flag covers non-plugin hook config and defaults on; \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` is deprecated and should not be treated as a plugin-bundled hook fallback. If bundled hooks do not activate, enable \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\`, reload Codex, and retest in a trusted interactive session.`,
13352
13360
  file: "pluxx.config.ts",
13353
13361
  platform: "Codex"
13354
13362
  });
@@ -13357,7 +13365,16 @@ function lintCodexHooksExternalConfig(config, issues) {
13357
13365
  pushIssue(issues, {
13358
13366
  level: "warning",
13359
13367
  code: "codex-hooks-legacy-feature-flag",
13360
- message: `Current local Codex CLI 0.130.0 interactive probes on May 13, 2026 emitted a deprecation warning for \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` that points users to \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\`. Keep \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` only as a compatibility fallback and prefer \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\`.`,
13368
+ message: `\`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` is deprecated for general Codex hook config and should not be treated as a plugin-bundled hook fallback. Keep it only as a compatibility fallback for non-plugin hook wiring, prefer \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` there, and use \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` for plugin-bundled hooks.`,
13369
+ file: "pluxx.config.ts",
13370
+ platform: "Codex"
13371
+ });
13372
+ }
13373
+ if (!hasPluxxCodexPluginHooksFlag && isCodexHooksFeatureEnabled(features)) {
13374
+ pushIssue(issues, {
13375
+ level: "warning",
13376
+ code: "codex-hooks-general-feature-flag-only",
13377
+ message: `This Codex config enables only general hook flags. Plugin-bundled hooks at \`hooks/hooks.json\` still need \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\`; \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\` and \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` alone are not sufficient.`,
13361
13378
  file: "pluxx.config.ts",
13362
13379
  platform: "Codex"
13363
13380
  });
@@ -19720,11 +19737,13 @@ function listCodexConfigCandidates(projectRoot) {
19720
19737
  function readCodexHooksFeatureFlag(filePath) {
19721
19738
  let inFeaturesTable = false;
19722
19739
  const lines = readFileSync14(filePath, "utf-8").split(/\r?\n/);
19740
+ let pluginBundled;
19723
19741
  let recommended;
19724
19742
  let alternate;
19725
19743
  const assignFeatureFlag = (key, rawValue) => {
19726
19744
  const parsed = parseTomlValue(rawValue.trim());
19727
19745
  if (typeof parsed !== "boolean") return;
19746
+ if (key === PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG) pluginBundled = parsed;
19728
19747
  if (key === RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG) recommended = parsed;
19729
19748
  if (key === ALTERNATE_CODEX_HOOKS_FEATURE_FLAG) alternate = parsed;
19730
19749
  };
@@ -19736,7 +19755,7 @@ function readCodexHooksFeatureFlag(filePath) {
19736
19755
  inFeaturesTable = sectionMatch[1].trim() === "features";
19737
19756
  continue;
19738
19757
  }
19739
- const dottedFeatureMatch = line.match(/^features\.(hooks|codex_hooks)\s*=\s*(.+)$/);
19758
+ const dottedFeatureMatch = line.match(/^features\.(plugin_hooks|hooks|codex_hooks)\s*=\s*(.+)$/);
19740
19759
  if (dottedFeatureMatch) {
19741
19760
  assignFeatureFlag(dottedFeatureMatch[1], dottedFeatureMatch[2]);
19742
19761
  continue;
@@ -19746,18 +19765,20 @@ function readCodexHooksFeatureFlag(filePath) {
19746
19765
  const parsed = parseTomlValue(inlineFeaturesMatch[1].trim());
19747
19766
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
19748
19767
  const featureState = getCodexHooksFeatureState(parsed);
19768
+ pluginBundled = featureState.pluginBundled;
19749
19769
  recommended = featureState.recommended;
19750
19770
  alternate = featureState.alternate;
19751
19771
  }
19752
19772
  continue;
19753
19773
  }
19754
19774
  if (!inFeaturesTable) continue;
19755
- const featureMatch = line.match(/^(hooks|codex_hooks)\s*=\s*(.+)$/);
19775
+ const featureMatch = line.match(/^(plugin_hooks|hooks|codex_hooks)\s*=\s*(.+)$/);
19756
19776
  if (!featureMatch) continue;
19757
19777
  assignFeatureFlag(featureMatch[1], featureMatch[2]);
19758
19778
  }
19759
- if (recommended === void 0 && alternate === void 0) return void 0;
19779
+ if (pluginBundled === void 0 && recommended === void 0 && alternate === void 0) return void 0;
19760
19780
  return {
19781
+ pluginBundled: pluginBundled === true,
19761
19782
  recommended: recommended === true,
19762
19783
  alternate: alternate === true
19763
19784
  };
@@ -19769,6 +19790,7 @@ function probeCodexHooksFeatureFlags(projectRoot) {
19769
19790
  ...candidate,
19770
19791
  exists: false,
19771
19792
  enabled: false,
19793
+ pluginBundledEnabled: false,
19772
19794
  recommendedEnabled: false,
19773
19795
  alternateEnabled: false
19774
19796
  };
@@ -19778,7 +19800,8 @@ function probeCodexHooksFeatureFlags(projectRoot) {
19778
19800
  return {
19779
19801
  ...candidate,
19780
19802
  exists: true,
19781
- enabled: featureState?.recommended === true || featureState?.alternate === true,
19803
+ enabled: featureState?.pluginBundled === true,
19804
+ pluginBundledEnabled: featureState?.pluginBundled === true,
19782
19805
  recommendedEnabled: featureState?.recommended === true,
19783
19806
  alternateEnabled: featureState?.alternate === true
19784
19807
  };
@@ -19787,6 +19810,7 @@ function probeCodexHooksFeatureFlags(projectRoot) {
19787
19810
  ...candidate,
19788
19811
  exists: true,
19789
19812
  enabled: false,
19813
+ pluginBundledEnabled: false,
19790
19814
  recommendedEnabled: false,
19791
19815
  alternateEnabled: false,
19792
19816
  parseError: error instanceof Error ? error.message : String(error)
@@ -20365,27 +20389,39 @@ function checkInstalledCodexHooksFeatureFlag(checks, rootDir, layout, options) {
20365
20389
  const checkedPaths = probes.map((probe) => `${probe.scope} ${probe.exists ? "config" : "path"}: ${probe.path}${probe.exists ? "" : " (missing)"}`).join("; ");
20366
20390
  const describeEnabledFlags = (probe) => {
20367
20391
  const enabledFlags = [];
20392
+ if (probe.pluginBundledEnabled) enabledFlags.push(PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG);
20368
20393
  if (probe.recommendedEnabled) enabledFlags.push(RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG);
20369
20394
  if (probe.alternateEnabled) enabledFlags.push(ALTERNATE_CODEX_HOOKS_FEATURE_FLAG);
20370
20395
  return enabledFlags.join(" + ");
20371
20396
  };
20397
+ const generalOnlyProbes = probes.filter((probe) => !probe.pluginBundledEnabled && (probe.recommendedEnabled || probe.alternateEnabled));
20398
+ if (generalOnlyProbes.length > 0) {
20399
+ addCheck2(checks, {
20400
+ level: "warning",
20401
+ code: "consumer-codex-plugin-hooks-feature-flag-general-only",
20402
+ title: "Codex config enables only general hook flags, not the plugin-bundled hook gate",
20403
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, but ${generalOnlyProbes.map((probe) => `${probe.scope} config ${probe.path}`).join(" and ")} enables only general hook flags (${generalOnlyProbes.map((probe) => describeEnabledFlags(probe)).join(" and ")}). Those general flags do not activate plugin-bundled hooks by themselves.`,
20404
+ fix: `Enable \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the active Codex config, reload Codex, and rerun pluxx verify-install.`,
20405
+ path: generalOnlyProbes[0].path
20406
+ });
20407
+ }
20408
+ const legacyOnlyProbes = probes.filter((probe) => probe.alternateEnabled && !probe.recommendedEnabled);
20409
+ if (legacyOnlyProbes.length > 0) {
20410
+ addCheck2(checks, {
20411
+ level: "warning",
20412
+ code: "consumer-codex-hooks-feature-flag-legacy-only",
20413
+ title: "Codex config still uses the deprecated general hook compatibility flag",
20414
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, and the checked Codex config enables only the deprecated general hook flag \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\` in ${legacyOnlyProbes.map((probe) => `${probe.scope} config ${probe.path}`).join(" and ")}. That flag is not the plugin-bundled hook gate.`,
20415
+ fix: `Prefer \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` only for non-plugin hook config if needed, and use \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` for plugin-bundled hooks. Reload Codex and rerun pluxx verify-install after updating the active config.`,
20416
+ path: legacyOnlyProbes[0].path
20417
+ });
20418
+ }
20372
20419
  if (enabledProbes.length > 0) {
20373
- const legacyOnlyProbes = enabledProbes.filter((probe) => probe.alternateEnabled && !probe.recommendedEnabled);
20374
- if (legacyOnlyProbes.length > 0) {
20375
- addCheck2(checks, {
20376
- level: "warning",
20377
- code: "consumer-codex-hooks-feature-flag-legacy-only",
20378
- title: "Codex hooks are enabled only through the legacy compatibility flag",
20379
- detail: `This installed Codex bundle declares hooks at ${hooksReference}, and the checked Codex config enables only \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\` in ${legacyOnlyProbes.map((probe) => `${probe.scope} config ${probe.path}`).join(" and ")}. Maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 emitting a deprecation warning for \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` that points users to \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\`.`,
20380
- fix: `Prefer \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the active Codex config, keep \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` only as a compatibility fallback if needed, reload Codex, and rerun pluxx verify-install.`,
20381
- path: legacyOnlyProbes[0].path
20382
- });
20383
- }
20384
20420
  addCheck2(checks, {
20385
20421
  level: "success",
20386
20422
  code: "consumer-codex-hooks-feature-flag-enabled",
20387
- title: "Codex hook feature flag found for this install",
20388
- detail: `This installed Codex bundle declares hooks at ${hooksReference}, and a Codex hook feature flag was found in ${enabledProbes.map((probe) => `${probe.scope} config ${probe.path} (${describeEnabledFlags(probe)})`).join(" and ")}. Treat that as a prerequisite, not proof of live hook execution: maintained local probes on May 13, 2026 showed local Codex CLI 0.130.0 still failing to execute the project-local hook under \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\`, \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\`, and the current CLI feature path \`--enable hooks\`.`,
20423
+ title: "Codex plugin-bundled hook feature flag found for this install",
20424
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, and the plugin hook gate was found in ${enabledProbes.map((probe) => `${probe.scope} config ${probe.path} (${describeEnabledFlags(probe)})`).join(" and ")}. Treat that as a prerequisite, not proof of live hook execution.`,
20389
20425
  fix: "No action needed.",
20390
20426
  path: enabledProbes[0].path
20391
20427
  });
@@ -20395,9 +20431,9 @@ function checkInstalledCodexHooksFeatureFlag(checks, rootDir, layout, options) {
20395
20431
  addCheck2(checks, {
20396
20432
  level: "warning",
20397
20433
  code: "consumer-codex-hooks-feature-flag-missing",
20398
- title: "Codex hook activation is missing its known feature-gate prerequisite",
20399
- detail: `This installed Codex bundle declares hooks at ${hooksReference}, but neither \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` nor \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\` was found in the checked Codex config layers. Current Codex config surfaces still accept both keys under \`[features]\`, but maintained probes on May 13, 2026 showed local Codex CLI 0.130.0 still failing to execute the project-local hook under \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\`, \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\`, and the current CLI feature path \`--enable hooks\`, while also emitting a deprecation warning for \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` that points users to \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\`. Checked ${checkedPaths}.${parseErrors.length > 0 ? ` Unparseable config: ${parseErrors.join("; ")}.` : ""}`,
20400
- fix: `Enable \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the relevant project or user Codex config, reload Codex, and rerun pluxx verify-install. Keep \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` only as a compatibility fallback if your Codex runtime still needs it, and treat any enabled flag as best-effort activation rather than proof that hooks will execute.`,
20434
+ title: "Codex plugin-bundled hook activation is missing its known feature-gate prerequisite",
20435
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, but \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` was not found in the checked Codex config layers. The general \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\` flag covers non-plugin hook config and defaults on, while \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` is deprecated and should not be treated as a plugin-bundled hook fallback. Checked ${checkedPaths}.${parseErrors.length > 0 ? ` Unparseable config: ${parseErrors.join("; ")}.` : ""}`,
20436
+ fix: `Enable \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the relevant project or user Codex config, reload Codex, and rerun pluxx verify-install.`,
20401
20437
  path: probes.find((probe) => probe.exists)?.path ?? hooksReference
20402
20438
  });
20403
20439
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuH,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AAwBpK,OAAO,EAAuE,KAAK,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AAsD3I,KAAK,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAEpC,UAAU,SAAS;IACjB,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,gBAAgB,CAAC,EAAE,2BAA2B,CAAA;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAA;CAC3B;AAqmDD,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAoHrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAE,MAAsB,GAAG,IAAI,CA0BrF;AAED,wBAAsB,OAAO,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1E"}
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/cli/lint.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuH,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AA0BpK,OAAO,EAAuE,KAAK,2BAA2B,EAAE,MAAM,qBAAqB,CAAA;AAsD3I,KAAK,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAEpC,UAAU,SAAS;IACjB,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAMD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,SAAS,EAAE,CAAA;IACnB,gBAAgB,CAAC,EAAE,2BAA2B,CAAA;CAC/C;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,cAAc,EAAE,CAAA;CAC3B;AA+mDD,wBAAsB,WAAW,CAC/B,GAAG,GAAE,MAAsB,EAC3B,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAoHrB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAE,MAAsB,GAAG,IAAI,CA0BrF;AAED,wBAAsB,OAAO,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAI1E"}
@@ -1,10 +1,13 @@
1
1
  export declare const RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG = "hooks";
2
2
  export declare const ALTERNATE_CODEX_HOOKS_FEATURE_FLAG = "codex_hooks";
3
+ export declare const PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG = "plugin_hooks";
3
4
  export interface CodexHooksFeatureState {
5
+ pluginBundled: boolean;
4
6
  recommended: boolean;
5
7
  alternate: boolean;
6
8
  }
7
9
  export declare function getCodexHooksFeatureState(features: Record<string, unknown> | null | undefined): CodexHooksFeatureState;
10
+ export declare function isCodexPluginHooksFeatureEnabled(features: Record<string, unknown> | null | undefined): boolean;
8
11
  export declare function isCodexHooksFeatureEnabled(features: Record<string, unknown> | null | undefined): boolean;
9
12
  export declare function usesAlternateCodexHooksFeatureFlagOnly(features: Record<string, unknown> | null | undefined): boolean;
10
13
  //# sourceMappingURL=codex-hooks-feature.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex-hooks-feature.d.ts","sourceRoot":"","sources":["../src/codex-hooks-feature.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC,UAAU,CAAA;AAC3D,eAAO,MAAM,kCAAkC,gBAAgB,CAAA;AAE/D,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,sBAAsB,CAYtH;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxG;AAED,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGpH"}
1
+ {"version":3,"file":"codex-hooks-feature.d.ts","sourceRoot":"","sources":["../src/codex-hooks-feature.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oCAAoC,UAAU,CAAA;AAC3D,eAAO,MAAM,kCAAkC,gBAAgB,CAAA;AAC/D,eAAO,MAAM,uCAAuC,iBAAiB,CAAA;AAErE,MAAM,WAAW,sBAAsB;IACrC,aAAa,EAAE,OAAO,CAAA;IACtB,WAAW,EAAE,OAAO,CAAA;IACpB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,sBAAsB,CActH;AAED,wBAAgB,gCAAgC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG9G;AAED,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGxG;AAED,wBAAgB,sCAAsC,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAGpH"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/codex/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AA+ClD,qBAAa,cAAe,SAAQ,SAAS;IAC3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAU;IAErC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YA0DjB,gBAAgB;YAoEhB,iBAAiB;YAOjB,4BAA4B;YAyB5B,gBAAgB;YAiBhB,oBAAoB;YAuDpB,sBAAsB;YAqGtB,0BAA0B;IAkCxC,OAAO,CAAC,0BAA0B;YAkBpB,yBAAyB;YAiCzB,uBAAuB;IAqCrC,OAAO,CAAC,+BAA+B;CAiBxC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/codex/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAgDlD,qBAAa,cAAe,SAAQ,SAAS;IAC3C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAU;IAErC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YA0DjB,gBAAgB;YAoEhB,iBAAiB;YAOjB,4BAA4B;YAyB5B,gBAAgB;YAiBhB,oBAAoB;YAuDpB,sBAAsB;YAsGtB,0BAA0B;IAkCxC,OAAO,CAAC,0BAA0B;YAkBpB,yBAAyB;YAiCzB,uBAAuB;IAqCrC,OAAO,CAAC,+BAA+B;CAiBxC"}
package/dist/index.js CHANGED
@@ -7855,7 +7855,7 @@ function getEnabledRuntimeReadinessBindings(capability, plan) {
7855
7855
  });
7856
7856
  }
7857
7857
  var NAMED_PROMPT_TARGET_NOTE = "Named `skills` / `commands` readiness targets currently translate through prompt-entry gating with best-effort matching because the core four do not share one exact per-skill or per-command runtime interception surface.";
7858
- var CODEX_EXTERNAL_NOTE = "Codex readiness now bundles translated hooks in the plugin, and Pluxx still emits `.codex/readiness.generated.json` plus `.codex/hooks.generated.json` as debugging companions because some Codex runtimes still gate hook activation behind a `[features]` flag. Current Codex config surfaces still accept both `hooks = true` and `codex_hooks = true`, but maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 timing out without a project-local hook side effect under either flag while emitting a deprecation warning for `codex_hooks` that points users to `hooks`.";
7858
+ var CODEX_EXTERNAL_NOTE = "Codex readiness now bundles translated hooks in the plugin, and Pluxx still emits `.codex/readiness.generated.json` plus `.codex/hooks.generated.json` as debugging companions because plugin-bundled hook activation still depends on `[features].plugin_hooks = true`. The general `hooks = true` flag covers non-plugin hook config and defaults on, while `codex_hooks` is deprecated and should not be treated as a plugin-bundled hook fallback.";
7859
7859
  function getRuntimeReadinessNamedPromptTargetNote() {
7860
7860
  return NAMED_PROMPT_TARGET_NOTE;
7861
7861
  }
@@ -8304,7 +8304,7 @@ var PLATFORM_VALIDATION_RULES = {
8304
8304
  supported: true,
8305
8305
  files: ["hooks/hooks.json", ".codex/hooks.json", "~/.codex/hooks.json"],
8306
8306
  eventNames: ["SessionStart", "PreToolUse", "PermissionRequest", "PostToolUse", "UserPromptSubmit", "Stop"],
8307
- notes: "Codex documents hooks in project and user config, and the current config schema still accepts both `[features].hooks = true` and `[features].codex_hooks = true`. Maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 timing out without a project-local `.codex/hooks.json` side effect or `/hooks` review gate under either flag; the `codex_hooks` variant also emitted a deprecation message that points users to `hooks`, while the official docs still show `codex_hooks`. The official hooks docs also cover plugin-bundled hooks, which Pluxx now emits at `hooks/hooks.json`."
8307
+ notes: "Codex documents both project or user hook config and plugin-bundled hooks. Plugin-bundled hooks live at `hooks/hooks.json` in the plugin and require `[features].plugin_hooks = true`; the general `[features].hooks = true` flag covers non-plugin hook config and defaults on. `codex_hooks` is deprecated and should not be treated as a plugin-bundled hook fallback."
8308
8308
  },
8309
8309
  instructions: {
8310
8310
  files: ["AGENTS.md", "AGENTS.override.md"],
@@ -10794,14 +10794,17 @@ var MUTATING_PREFIX_PATTERN = new RegExp(`^(${MUTATING_PREFIXES.join("|")})\\b`,
10794
10794
  // src/codex-hooks-feature.ts
10795
10795
  var RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG = "hooks";
10796
10796
  var ALTERNATE_CODEX_HOOKS_FEATURE_FLAG = "codex_hooks";
10797
+ var PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG = "plugin_hooks";
10797
10798
  function getCodexHooksFeatureState(features) {
10798
10799
  if (!features) {
10799
10800
  return {
10801
+ pluginBundled: false,
10800
10802
  recommended: false,
10801
10803
  alternate: false
10802
10804
  };
10803
10805
  }
10804
10806
  return {
10807
+ pluginBundled: features[PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG] === true,
10805
10808
  recommended: features[RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG] === true,
10806
10809
  alternate: features[ALTERNATE_CODEX_HOOKS_FEATURE_FLAG] === true
10807
10810
  };
@@ -11091,11 +11094,13 @@ function listCodexConfigCandidates(projectRoot) {
11091
11094
  function readCodexHooksFeatureFlag(filePath) {
11092
11095
  let inFeaturesTable = false;
11093
11096
  const lines = readFileSync4(filePath, "utf-8").split(/\r?\n/);
11097
+ let pluginBundled;
11094
11098
  let recommended;
11095
11099
  let alternate;
11096
11100
  const assignFeatureFlag = (key, rawValue) => {
11097
11101
  const parsed = parseTomlValue(rawValue.trim());
11098
11102
  if (typeof parsed !== "boolean") return;
11103
+ if (key === PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG) pluginBundled = parsed;
11099
11104
  if (key === RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG) recommended = parsed;
11100
11105
  if (key === ALTERNATE_CODEX_HOOKS_FEATURE_FLAG) alternate = parsed;
11101
11106
  };
@@ -11107,7 +11112,7 @@ function readCodexHooksFeatureFlag(filePath) {
11107
11112
  inFeaturesTable = sectionMatch[1].trim() === "features";
11108
11113
  continue;
11109
11114
  }
11110
- const dottedFeatureMatch = line.match(/^features\.(hooks|codex_hooks)\s*=\s*(.+)$/);
11115
+ const dottedFeatureMatch = line.match(/^features\.(plugin_hooks|hooks|codex_hooks)\s*=\s*(.+)$/);
11111
11116
  if (dottedFeatureMatch) {
11112
11117
  assignFeatureFlag(dottedFeatureMatch[1], dottedFeatureMatch[2]);
11113
11118
  continue;
@@ -11117,18 +11122,20 @@ function readCodexHooksFeatureFlag(filePath) {
11117
11122
  const parsed = parseTomlValue(inlineFeaturesMatch[1].trim());
11118
11123
  if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
11119
11124
  const featureState = getCodexHooksFeatureState(parsed);
11125
+ pluginBundled = featureState.pluginBundled;
11120
11126
  recommended = featureState.recommended;
11121
11127
  alternate = featureState.alternate;
11122
11128
  }
11123
11129
  continue;
11124
11130
  }
11125
11131
  if (!inFeaturesTable) continue;
11126
- const featureMatch = line.match(/^(hooks|codex_hooks)\s*=\s*(.+)$/);
11132
+ const featureMatch = line.match(/^(plugin_hooks|hooks|codex_hooks)\s*=\s*(.+)$/);
11127
11133
  if (!featureMatch) continue;
11128
11134
  assignFeatureFlag(featureMatch[1], featureMatch[2]);
11129
11135
  }
11130
- if (recommended === void 0 && alternate === void 0) return void 0;
11136
+ if (pluginBundled === void 0 && recommended === void 0 && alternate === void 0) return void 0;
11131
11137
  return {
11138
+ pluginBundled: pluginBundled === true,
11132
11139
  recommended: recommended === true,
11133
11140
  alternate: alternate === true
11134
11141
  };
@@ -11140,6 +11147,7 @@ function probeCodexHooksFeatureFlags(projectRoot) {
11140
11147
  ...candidate,
11141
11148
  exists: false,
11142
11149
  enabled: false,
11150
+ pluginBundledEnabled: false,
11143
11151
  recommendedEnabled: false,
11144
11152
  alternateEnabled: false
11145
11153
  };
@@ -11149,7 +11157,8 @@ function probeCodexHooksFeatureFlags(projectRoot) {
11149
11157
  return {
11150
11158
  ...candidate,
11151
11159
  exists: true,
11152
- enabled: featureState?.recommended === true || featureState?.alternate === true,
11160
+ enabled: featureState?.pluginBundled === true,
11161
+ pluginBundledEnabled: featureState?.pluginBundled === true,
11153
11162
  recommendedEnabled: featureState?.recommended === true,
11154
11163
  alternateEnabled: featureState?.alternate === true
11155
11164
  };
@@ -11158,6 +11167,7 @@ function probeCodexHooksFeatureFlags(projectRoot) {
11158
11167
  ...candidate,
11159
11168
  exists: true,
11160
11169
  enabled: false,
11170
+ pluginBundledEnabled: false,
11161
11171
  recommendedEnabled: false,
11162
11172
  alternateEnabled: false,
11163
11173
  parseError: error instanceof Error ? error.message : String(error)
@@ -11736,27 +11746,39 @@ function checkInstalledCodexHooksFeatureFlag(checks, rootDir, layout, options) {
11736
11746
  const checkedPaths = probes.map((probe) => `${probe.scope} ${probe.exists ? "config" : "path"}: ${probe.path}${probe.exists ? "" : " (missing)"}`).join("; ");
11737
11747
  const describeEnabledFlags = (probe) => {
11738
11748
  const enabledFlags = [];
11749
+ if (probe.pluginBundledEnabled) enabledFlags.push(PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG);
11739
11750
  if (probe.recommendedEnabled) enabledFlags.push(RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG);
11740
11751
  if (probe.alternateEnabled) enabledFlags.push(ALTERNATE_CODEX_HOOKS_FEATURE_FLAG);
11741
11752
  return enabledFlags.join(" + ");
11742
11753
  };
11754
+ const generalOnlyProbes = probes.filter((probe) => !probe.pluginBundledEnabled && (probe.recommendedEnabled || probe.alternateEnabled));
11755
+ if (generalOnlyProbes.length > 0) {
11756
+ addCheck(checks, {
11757
+ level: "warning",
11758
+ code: "consumer-codex-plugin-hooks-feature-flag-general-only",
11759
+ title: "Codex config enables only general hook flags, not the plugin-bundled hook gate",
11760
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, but ${generalOnlyProbes.map((probe) => `${probe.scope} config ${probe.path}`).join(" and ")} enables only general hook flags (${generalOnlyProbes.map((probe) => describeEnabledFlags(probe)).join(" and ")}). Those general flags do not activate plugin-bundled hooks by themselves.`,
11761
+ fix: `Enable \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the active Codex config, reload Codex, and rerun pluxx verify-install.`,
11762
+ path: generalOnlyProbes[0].path
11763
+ });
11764
+ }
11765
+ const legacyOnlyProbes = probes.filter((probe) => probe.alternateEnabled && !probe.recommendedEnabled);
11766
+ if (legacyOnlyProbes.length > 0) {
11767
+ addCheck(checks, {
11768
+ level: "warning",
11769
+ code: "consumer-codex-hooks-feature-flag-legacy-only",
11770
+ title: "Codex config still uses the deprecated general hook compatibility flag",
11771
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, and the checked Codex config enables only the deprecated general hook flag \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\` in ${legacyOnlyProbes.map((probe) => `${probe.scope} config ${probe.path}`).join(" and ")}. That flag is not the plugin-bundled hook gate.`,
11772
+ fix: `Prefer \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` only for non-plugin hook config if needed, and use \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` for plugin-bundled hooks. Reload Codex and rerun pluxx verify-install after updating the active config.`,
11773
+ path: legacyOnlyProbes[0].path
11774
+ });
11775
+ }
11743
11776
  if (enabledProbes.length > 0) {
11744
- const legacyOnlyProbes = enabledProbes.filter((probe) => probe.alternateEnabled && !probe.recommendedEnabled);
11745
- if (legacyOnlyProbes.length > 0) {
11746
- addCheck(checks, {
11747
- level: "warning",
11748
- code: "consumer-codex-hooks-feature-flag-legacy-only",
11749
- title: "Codex hooks are enabled only through the legacy compatibility flag",
11750
- detail: `This installed Codex bundle declares hooks at ${hooksReference}, and the checked Codex config enables only \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\` in ${legacyOnlyProbes.map((probe) => `${probe.scope} config ${probe.path}`).join(" and ")}. Maintained interactive probes on May 13, 2026 showed local Codex CLI 0.130.0 emitting a deprecation warning for \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` that points users to \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\`.`,
11751
- fix: `Prefer \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the active Codex config, keep \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` only as a compatibility fallback if needed, reload Codex, and rerun pluxx verify-install.`,
11752
- path: legacyOnlyProbes[0].path
11753
- });
11754
- }
11755
11777
  addCheck(checks, {
11756
11778
  level: "success",
11757
11779
  code: "consumer-codex-hooks-feature-flag-enabled",
11758
- title: "Codex hook feature flag found for this install",
11759
- detail: `This installed Codex bundle declares hooks at ${hooksReference}, and a Codex hook feature flag was found in ${enabledProbes.map((probe) => `${probe.scope} config ${probe.path} (${describeEnabledFlags(probe)})`).join(" and ")}. Treat that as a prerequisite, not proof of live hook execution: maintained local probes on May 13, 2026 showed local Codex CLI 0.130.0 still failing to execute the project-local hook under \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\`, \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\`, and the current CLI feature path \`--enable hooks\`.`,
11780
+ title: "Codex plugin-bundled hook feature flag found for this install",
11781
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, and the plugin hook gate was found in ${enabledProbes.map((probe) => `${probe.scope} config ${probe.path} (${describeEnabledFlags(probe)})`).join(" and ")}. Treat that as a prerequisite, not proof of live hook execution.`,
11760
11782
  fix: "No action needed.",
11761
11783
  path: enabledProbes[0].path
11762
11784
  });
@@ -11766,9 +11788,9 @@ function checkInstalledCodexHooksFeatureFlag(checks, rootDir, layout, options) {
11766
11788
  addCheck(checks, {
11767
11789
  level: "warning",
11768
11790
  code: "consumer-codex-hooks-feature-flag-missing",
11769
- title: "Codex hook activation is missing its known feature-gate prerequisite",
11770
- detail: `This installed Codex bundle declares hooks at ${hooksReference}, but neither \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` nor \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\` was found in the checked Codex config layers. Current Codex config surfaces still accept both keys under \`[features]\`, but maintained probes on May 13, 2026 showed local Codex CLI 0.130.0 still failing to execute the project-local hook under \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\`, \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG} = true\`, and the current CLI feature path \`--enable hooks\`, while also emitting a deprecation warning for \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` that points users to \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\`. Checked ${checkedPaths}.${parseErrors.length > 0 ? ` Unparseable config: ${parseErrors.join("; ")}.` : ""}`,
11771
- fix: `Enable \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the relevant project or user Codex config, reload Codex, and rerun pluxx verify-install. Keep \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` only as a compatibility fallback if your Codex runtime still needs it, and treat any enabled flag as best-effort activation rather than proof that hooks will execute.`,
11791
+ title: "Codex plugin-bundled hook activation is missing its known feature-gate prerequisite",
11792
+ detail: `This installed Codex bundle declares plugin-bundled hooks at ${hooksReference}, but \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` was not found in the checked Codex config layers. The general \`${RECOMMENDED_CODEX_HOOKS_FEATURE_FLAG}\` flag covers non-plugin hook config and defaults on, while \`${ALTERNATE_CODEX_HOOKS_FEATURE_FLAG}\` is deprecated and should not be treated as a plugin-bundled hook fallback. Checked ${checkedPaths}.${parseErrors.length > 0 ? ` Unparseable config: ${parseErrors.join("; ")}.` : ""}`,
11793
+ fix: `Enable \`${PLUGIN_BUNDLED_CODEX_HOOKS_FEATURE_FLAG} = true\` under \`[features]\` in the relevant project or user Codex config, reload Codex, and rerun pluxx verify-install.`,
11772
11794
  path: probes.find((probe) => probe.exists)?.path ?? hooksReference
11773
11795
  });
11774
11796
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orchid-labs/pluxx",
3
- "version": "0.1.16",
3
+ "version": "0.1.17",
4
4
  "description": "Build AI agent plugins once. Prime-time on Claude Code, Cursor, Codex, and OpenCode, with beta generators for additional hosts.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",