@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.
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/index.js +65 -29
- package/dist/cli/lint.d.ts.map +1 -1
- package/dist/codex-hooks-feature.d.ts +3 -0
- package/dist/codex-hooks-feature.d.ts.map +1 -1
- package/dist/generators/codex/index.d.ts.map +1 -1
- package/dist/index.js +44 -22
- package/package.json +1 -1
package/dist/cli/doctor.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
|
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
|
-
|
|
10214
|
-
|
|
10215
|
-
|
|
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
|
|
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
|
|
13347
|
-
if (!
|
|
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\`,
|
|
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:
|
|
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?.
|
|
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
|
|
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
|
|
20400
|
-
fix: `Enable \`${
|
|
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
|
}
|
package/dist/cli/lint.d.ts.map
CHANGED
|
@@ -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;
|
|
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;
|
|
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;
|
|
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
|
|
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
|
|
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?.
|
|
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
|
|
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
|
|
11771
|
-
fix: `Enable \`${
|
|
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.
|
|
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",
|