@event4u/agent-config 14.14.0 → 14.14.1

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 (66) hide show
  1. package/.augment-plugin/marketplace.json +3 -3
  2. package/.augment-plugin/plugin.json +1 -1
  3. package/.claude-plugin/marketplace.json +1 -1
  4. package/CHANGELOG.md +33 -0
  5. package/README.md +1 -1
  6. package/dist/agent-src/commands/pr/create.md +16 -1
  7. package/dist/agent-src/contexts/execution/terminal-states.md +25 -4
  8. package/dist/agent-src/rules/missing-skill-recovery.md +2 -2
  9. package/dist/agent-src/rules/token-budget-discipline.md +2 -2
  10. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
  11. package/dist/cli/registry.js +1 -0
  12. package/dist/cli-delegate/{chunk-ILMUPLGW.js → chunk-7RXIKF62.js} +159 -86
  13. package/dist/cli-delegate/cmd_conformance.js +1 -1
  14. package/dist/cli-delegate/cmd_doctor.js +1 -1
  15. package/dist/discovery/deprecation-report.md +1 -1
  16. package/dist/discovery/discovery-manifest.json +5 -5
  17. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  18. package/dist/discovery/discovery-manifest.summary.md +1 -1
  19. package/dist/discovery/dormancy-report.md +1 -1
  20. package/dist/discovery/orphan-report.md +1 -1
  21. package/dist/discovery/packs.json +2 -2
  22. package/dist/discovery/trust-report.md +1 -1
  23. package/dist/discovery/workspaces.json +2 -2
  24. package/dist/hooks/dispatch.js +528 -371
  25. package/dist/mcp/registry-manifest.json +2 -2
  26. package/dist/mcp/server.json +2 -2
  27. package/dist/mcp/server.mjs +185 -98
  28. package/package.json +1 -1
  29. package/src/config/assurance-capability-registry.json +1 -1
  30. package/src/config/evaluator-budgets.json +4 -4
  31. package/src/config/gate-coverage.yml +62 -2
  32. package/src/config/gate-reachability-exemptions.json +1 -0
  33. package/src/config/gate-violation-baselines.json +4 -3
  34. package/src/config/web-launch-readiness.json +4 -2
  35. package/src/scripts/_cli/_doctor_emit.ts +71 -0
  36. package/src/scripts/_cli/_doctor_strict.ts +163 -0
  37. package/src/scripts/_cli/cmd_doctor.ts +16 -37
  38. package/src/scripts/_dispatch.bash +11 -0
  39. package/src/scripts/_lib/branch_convergence.ts +186 -0
  40. package/src/scripts/_lib/context_observation.ts +132 -0
  41. package/src/scripts/_lib/continuation_ladder.ts +188 -0
  42. package/src/scripts/_lib/experiment_binding.ts +95 -0
  43. package/src/scripts/_lib/ignored_blocker.ts +8 -1
  44. package/src/scripts/_lib/outcome_envelope.ts +6 -1
  45. package/src/scripts/_lib/outcome_vocabularies.ts +135 -5
  46. package/src/scripts/_lib/release_highlights.ts +12 -3
  47. package/src/scripts/_lib/repeated_failure.ts +19 -2
  48. package/src/scripts/_lib/runtime_journal.ts +11 -4
  49. package/src/scripts/check_agent_artifact_location.ts +337 -0
  50. package/src/scripts/check_artefact_count_messaging.ts +74 -8
  51. package/src/scripts/check_enforcement_coverage.ts +40 -1
  52. package/src/scripts/check_release_highlights.ts +17 -1
  53. package/src/scripts/check_web_launch_readiness.ts +310 -20
  54. package/src/scripts/evolution_lab.ts +53 -1
  55. package/src/scripts/generate_capability_matrix.ts +16 -9
  56. package/src/scripts/grade_target_readiness.ts +221 -2
  57. package/src/scripts/hook_effect_doctor.ts +47 -4
  58. package/src/scripts/hooks/run_continuation_hook.ts +78 -88
  59. package/src/scripts/hooks/session_eol_hook.ts +12 -1
  60. package/src/scripts/install-hooks.sh +18 -0
  61. package/src/scripts/lint_code_comments.ts +106 -1
  62. package/src/scripts/release_drill.ts +57 -1
  63. package/src/scripts/release_publication.ts +58 -0
  64. package/src/scripts/roadmap_context.ts +15 -0
  65. package/src/scripts/skill_scout.ts +633 -0
  66. package/src/scripts/sync_pr_branch.ts +521 -42
@@ -3,13 +3,13 @@
3
3
  "artefact_count": 623,
4
4
  "scanner_version": "de0a22b4ac4c"
5
5
  },
6
- "generated_at": "2026-09-02",
6
+ "generated_at": "2026-09-03",
7
7
  "package": {
8
8
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) \u2014 every claim machine-checked, including the counts in these badges.",
9
9
  "homepage": "https://event4u-app.github.io/agent-config",
10
10
  "name": "@event4u/agent-config",
11
11
  "repository": "https://github.com/event4u-app/agent-config",
12
- "version": "14.14.0"
12
+ "version": "14.14.1"
13
13
  },
14
14
  "registries": [
15
15
  {
@@ -9,12 +9,12 @@
9
9
  "transport": {
10
10
  "type": "stdio"
11
11
  },
12
- "version": "14.14.0"
12
+ "version": "14.14.1"
13
13
  }
14
14
  ],
15
15
  "repository": {
16
16
  "source": "github",
17
17
  "url": "https://github.com/event4u-app/agent-config"
18
18
  },
19
- "version": "14.14.0"
19
+ "version": "14.14.1"
20
20
  }
@@ -33747,6 +33747,115 @@ var init_rule_scope = __esm({
33747
33747
  }
33748
33748
  });
33749
33749
 
33750
+ // src/scripts/_cli/_doctor_strict.ts
33751
+ function eprint(msg) {
33752
+ process.stderr.write(`${msg}
33753
+ `);
33754
+ }
33755
+ function strictTripping(level) {
33756
+ return level === "warn" ? /* @__PURE__ */ new Set(["fail", "warn"]) : /* @__PURE__ */ new Set(["fail"]);
33757
+ }
33758
+ function canProceed(driftPresent, checks) {
33759
+ return !driftPresent && !checks.some((c) => c["status"] === "fail");
33760
+ }
33761
+ function validateStrictLevel(level) {
33762
+ if (!STRICT_LEVELS.has(level)) {
33763
+ throw new StrictLevelError(
33764
+ `argument --strict-level: invalid choice: '${level}' (choose from 'fail', 'warn')`
33765
+ );
33766
+ }
33767
+ }
33768
+ function strictExit(opts, checks, driftPresent) {
33769
+ if (!opts.strict) {
33770
+ return null;
33771
+ }
33772
+ const tripping = strictTripping(opts.strict_level);
33773
+ const tripped = checks.filter((c) => tripping.has(c["status"]));
33774
+ if (!driftPresent && tripped.length === 0) {
33775
+ return 0;
33776
+ }
33777
+ if (process.env[STRICT_KILL_SWITCH] === "1") {
33778
+ eprint(
33779
+ `\u26A0\uFE0F doctor --strict: ${String(tripped.length)} finding(s) at or above '${opts.strict_level}'` + (driftPresent ? " plus manifest drift" : "") + `, but ${STRICT_KILL_SWITCH}=1 suppressed the failing exit. The findings above still stand; unset it to restore the gate.`
33780
+ );
33781
+ return 0;
33782
+ }
33783
+ return 1;
33784
+ }
33785
+ function attachProceedFields(payload, driftPresent, checks) {
33786
+ const proceed = canProceed(driftPresent, checks);
33787
+ payload["can_proceed"] = proceed;
33788
+ payload["status"] = proceed ? checks.some((c) => c["status"] === "warn") ? "warn" : "ok" : "fail";
33789
+ }
33790
+ function validateStrictLevelOr(level, onError) {
33791
+ try {
33792
+ validateStrictLevel(level);
33793
+ } catch (e) {
33794
+ if (e instanceof StrictLevelError) onError(e.message);
33795
+ throw e;
33796
+ }
33797
+ }
33798
+ var StrictLevelError, STRICT_DEFAULT_LEVEL, STRICT_LEVELS, STRICT_KILL_SWITCH, STRICT_STORE_TRUE, STRICT_VALUE_FLAGS, STRICT_DEFAULTS, STRICT_USAGE;
33799
+ var init_doctor_strict = __esm({
33800
+ "src/scripts/_cli/_doctor_strict.ts"() {
33801
+ "use strict";
33802
+ StrictLevelError = class extends Error {
33803
+ };
33804
+ STRICT_DEFAULT_LEVEL = "fail";
33805
+ STRICT_LEVELS = /* @__PURE__ */ new Set(["fail", "warn"]);
33806
+ STRICT_KILL_SWITCH = "AGENT_CONFIG_DOCTOR_NO_FAIL";
33807
+ STRICT_STORE_TRUE = { "--strict": "strict" };
33808
+ STRICT_VALUE_FLAGS = { "--strict-level": "strict_level" };
33809
+ STRICT_DEFAULTS = { strict: false, strict_level: STRICT_DEFAULT_LEVEL };
33810
+ STRICT_USAGE = " [--strict] [--strict-level {fail,warn}]\n";
33811
+ }
33812
+ });
33813
+
33814
+ // src/scripts/_cli/_doctor_emit.ts
33815
+ function print(line = "") {
33816
+ process.stdout.write(`${line}
33817
+ `);
33818
+ }
33819
+ function _emit_text(project_root, missing, modified, foreign, tag_drift) {
33820
+ const total = missing.length + modified.length + foreign.length + tag_drift.length;
33821
+ if (total === 0) {
33822
+ print(`\u2705 doctor: manifest matches filesystem under ${project_root}`);
33823
+ return;
33824
+ }
33825
+ print(`\u26A0\uFE0F doctor: ${total} drift item(s) under ${project_root}`);
33826
+ const groups = [
33827
+ ["missing", missing],
33828
+ ["modified", modified],
33829
+ ["foreign", foreign],
33830
+ ["tag-drift", tag_drift]
33831
+ ];
33832
+ for (const [label, items] of groups) {
33833
+ if (items.length === 0) {
33834
+ continue;
33835
+ }
33836
+ print(`
33837
+ ${label} (${items.length}):`);
33838
+ for (const it of items) {
33839
+ const tool = it["tool"] || "?";
33840
+ print(` \xB7 [${tool}] ${it["path"]}`);
33841
+ if (label === "tag-drift") {
33842
+ const found = it["found"] || "(missing)";
33843
+ const expected = "expected" in it ? it["expected"] : PACKAGE_TAG_ID;
33844
+ print(` expected: ${expected}`);
33845
+ print(` found: ${found}`);
33846
+ }
33847
+ print(` fix: ${it["fix"]}`);
33848
+ }
33849
+ }
33850
+ }
33851
+ var PACKAGE_TAG_ID;
33852
+ var init_doctor_emit = __esm({
33853
+ "src/scripts/_cli/_doctor_emit.ts"() {
33854
+ "use strict";
33855
+ PACKAGE_TAG_ID = "event4u/agent-config";
33856
+ }
33857
+ });
33858
+
33750
33859
  // src/scripts/_cli/cmd_doctor.ts
33751
33860
  var cmd_doctor_exports = {};
33752
33861
  __export(cmd_doctor_exports, {
@@ -33758,7 +33867,7 @@ __export(cmd_doctor_exports, {
33758
33867
  MCP_BETA_GATES: () => MCP_BETA_GATES,
33759
33868
  MIN_PYTHON: () => MIN_PYTHON,
33760
33869
  NO_FRONTMATTER: () => NO_FRONTMATTER,
33761
- PACKAGE_TAG_ID: () => PACKAGE_TAG_ID,
33870
+ PACKAGE_TAG_ID: () => PACKAGE_TAG_ID2,
33762
33871
  REPAIR_IDS: () => REPAIR_IDS,
33763
33872
  STATUS_SYMBOLS: () => STATUS_SYMBOLS,
33764
33873
  _check_bridge_drift: () => _check_bridge_drift,
@@ -33956,10 +34065,10 @@ function yamlSafeLoad2(text) {
33956
34065
  return void 0;
33957
34066
  }
33958
34067
  }
33959
- function print(line = "") {
34068
+ function print2(line = "") {
33960
34069
  process16.stdout.write(line + "\n");
33961
34070
  }
33962
- function eprint(line = "") {
34071
+ function eprint2(line = "") {
33963
34072
  process16.stderr.write(line + "\n");
33964
34073
  }
33965
34074
  function _resolve_project_root(arg) {
@@ -34011,22 +34120,22 @@ function _detect_wrapper(project_root) {
34011
34120
  };
34012
34121
  }
34013
34122
  function _emit_trace_text(root, anchor, trace, origin) {
34014
- print(` \u{1F4CD} start: ${process16.cwd()}`);
34015
- print(` \u{1F4CD} origin: ${origin}`);
34123
+ print2(` \u{1F4CD} start: ${process16.cwd()}`);
34124
+ print2(` \u{1F4CD} origin: ${origin}`);
34016
34125
  if (trace.length > 0) {
34017
- print(" trace:");
34126
+ print2(" trace:");
34018
34127
  for (const record of trace) {
34019
34128
  const hit = record.hit;
34020
34129
  const symbol = hit ? "\u2705" : "\xB7";
34021
34130
  const tag = `[${record.pass}]`;
34022
34131
  const anchor_str = hit ? ` \u2192 ${hit}` : "";
34023
- print(` ${symbol} ${tag} ${record.ancestor}${anchor_str} (${record.reason})`);
34132
+ print2(` ${symbol} ${tag} ${record.ancestor}${anchor_str} (${record.reason})`);
34024
34133
  }
34025
34134
  }
34026
34135
  if (root !== null) {
34027
- print(` \u{1F4CD} resolved root: ${root} (anchor: ${anchor || "n/a"})`);
34136
+ print2(` \u{1F4CD} resolved root: ${root} (anchor: ${anchor || "n/a"})`);
34028
34137
  } else {
34029
- print(" \u26A0\uFE0F no anchor found in chain");
34138
+ print2(" \u26A0\uFE0F no anchor found in chain");
34030
34139
  }
34031
34140
  }
34032
34141
  function _emit_trace_json(root, anchor, trace, origin) {
@@ -34037,32 +34146,32 @@ function _emit_trace_json(root, anchor, trace, origin) {
34037
34146
  anchor,
34038
34147
  trace
34039
34148
  };
34040
- print(_jsonDumpsIndentAscii(payload, 2));
34149
+ print2(_jsonDumpsIndentAscii(payload, 2));
34041
34150
  }
34042
34151
  function _emit_context_text(ctx) {
34043
- print(` \u{1F4CD} project_root: ${ctx["project_root"]} (origin: ${ctx["origin"]})`);
34044
- print(` \u{1F4E6} install_mode: ${ctx["install_mode"]} (source: ${ctx["install_mode_source"]})`);
34152
+ print2(` \u{1F4CD} project_root: ${ctx["project_root"]} (origin: ${ctx["origin"]})`);
34153
+ print2(` \u{1F4E6} install_mode: ${ctx["install_mode"]} (source: ${ctx["install_mode_source"]})`);
34045
34154
  const env_pin = ctx["env_pin"];
34046
34155
  if (env_pin) {
34047
34156
  const marker = ctx["root_override"] ? " (--root override)" : "";
34048
- print(` \u{1F512} env_pin: ${env_pin}${marker}`);
34157
+ print2(` \u{1F512} env_pin: ${env_pin}${marker}`);
34049
34158
  } else {
34050
- print(" \u{1F512} env_pin: (unset)");
34159
+ print2(" \u{1F512} env_pin: (unset)");
34051
34160
  }
34052
34161
  const layers = ctx["settings_layers"] || [];
34053
34162
  if (layers.length > 0) {
34054
- print(` \u{1F4D1} settings layers (${layers.length}):`);
34163
+ print2(` \u{1F4D1} settings layers (${layers.length}):`);
34055
34164
  for (const layer of layers) {
34056
- print(` - ${layer}`);
34165
+ print2(` - ${layer}`);
34057
34166
  }
34058
34167
  } else {
34059
- print(" \u{1F4D1} settings layers: (none)");
34168
+ print2(" \u{1F4D1} settings layers: (none)");
34060
34169
  }
34061
34170
  const wrapper = ctx["wrapper"] || {};
34062
34171
  if (wrapper["exists"]) {
34063
- print(` \u{1F9E9} wrapper: ${wrapper["path"]} (embedded root: ${wrapper["embedded_root"]})`);
34172
+ print2(` \u{1F9E9} wrapper: ${wrapper["path"]} (embedded root: ${wrapper["embedded_root"]})`);
34064
34173
  } else {
34065
- print(` \u{1F9E9} wrapper: (not present at ${wrapper["path"]})`);
34174
+ print2(` \u{1F9E9} wrapper: (not present at ${wrapper["path"]})`);
34066
34175
  }
34067
34176
  }
34068
34177
  function _resolve_path(project_root, raw) {
@@ -34245,12 +34354,12 @@ function _classify2(records) {
34245
34354
  continue;
34246
34355
  }
34247
34356
  const tag = _read_inline_package_tag(target);
34248
- if (!(tag instanceof _Sentinel) && tag !== PACKAGE_TAG_ID) {
34357
+ if (!(tag instanceof _Sentinel) && tag !== PACKAGE_TAG_ID2) {
34249
34358
  tag_drift.push({
34250
34359
  tool: tool_id,
34251
34360
  path: String(target),
34252
34361
  kind,
34253
- expected: PACKAGE_TAG_ID,
34362
+ expected: PACKAGE_TAG_ID2,
34254
34363
  found: tag === null ? "" : tag,
34255
34364
  fix: _fix_hint("tag-drift", kind)
34256
34365
  });
@@ -34857,7 +34966,7 @@ function _check_stale_orphans() {
34857
34966
  continue;
34858
34967
  }
34859
34968
  const tag = _read_inline_package_tag(md);
34860
- if (tag instanceof _Sentinel || tag !== PACKAGE_TAG_ID) {
34969
+ if (tag instanceof _Sentinel || tag !== PACKAGE_TAG_ID2) {
34861
34970
  continue;
34862
34971
  }
34863
34972
  orphan_count += 1;
@@ -35885,17 +35994,17 @@ function _run_no_manifest(opts, project_root, origin, bridge_present) {
35885
35994
  if (opts.json) {
35886
35995
  _emit_json(project_root, [], [], [], [], checks, origin);
35887
35996
  } else if (opts.check === null) {
35888
- print(` \u{1F4CD} project_root: ${project_root} (origin: ${origin})`);
35997
+ print2(` \u{1F4CD} project_root: ${project_root} (origin: ${origin})`);
35889
35998
  if (bridge_present) {
35890
- print(
35999
+ print2(
35891
36000
  " \u2139\uFE0F global-only consumer: install marker present, no project lockfile (expected under ADR-020)"
35892
36001
  );
35893
- print(
36002
+ print2(
35894
36003
  " project-manifest checks are skipped \u2014 they apply only to project-local distributed tools"
35895
36004
  );
35896
36005
  } else {
35897
- eprint(` \u26A0\uFE0F no project lockfile and no consumer install marker at ${project_root}`);
35898
- eprint(
36006
+ eprint2(` \u26A0\uFE0F no project lockfile and no consumer install marker at ${project_root}`);
36007
+ eprint2(
35899
36008
  " run `agent-config init` (project install) or `agent-config refresh --project` (global-only consumer)"
35900
36009
  );
35901
36010
  }
@@ -35911,6 +36020,8 @@ function _run_no_manifest(opts, project_root, origin, bridge_present) {
35911
36020
  }
35912
36021
  return fail_check ? 1 : 0;
35913
36022
  }
36023
+ const sx = strictExit(opts, checks, false);
36024
+ if (sx !== null) return bridge_present ? sx : 2;
35914
36025
  if (opts.ci && bridge_present) {
35915
36026
  return fail_check ? 1 : 0;
35916
36027
  }
@@ -35929,66 +36040,36 @@ function _emit_json(project_root, missing, modified, foreign, tag_drift, checks
35929
36040
  }
35930
36041
  if (checks !== null) {
35931
36042
  payload["checks"] = checks;
36043
+ const drift = missing.length + modified.length + foreign.length + tag_drift.length;
36044
+ attachProceedFields(payload, drift > 0, checks);
35932
36045
  if (checks.some((c) => c["id"] === "detection")) {
35933
36046
  payload["detection"] = detectionJson(_detection_report(project_root));
35934
36047
  }
35935
36048
  }
35936
- print(_jsonDumpsIndentAscii(payload, 2));
36049
+ print2(_jsonDumpsIndentAscii(payload, 2));
35937
36050
  }
35938
36051
  function _emit_checks_text(checks) {
35939
36052
  if (checks.length === 0) {
35940
36053
  return;
35941
36054
  }
35942
- print("checks:");
36055
+ print2("checks:");
35943
36056
  for (const c of checks) {
35944
36057
  const sym = STATUS_SYMBOLS[c["status"]] ?? "?";
35945
- print(` ${sym} ${c["id"]}: ${c["message"]}`);
36058
+ print2(` ${sym} ${c["id"]}: ${c["message"]}`);
35946
36059
  if (c["status"] !== "ok" && c["remedy"]) {
35947
- print(` fix: ${c["remedy"]}`);
36060
+ print2(` fix: ${c["remedy"]}`);
35948
36061
  }
35949
36062
  }
35950
- print("");
36063
+ print2("");
35951
36064
  }
35952
36065
  function _emit_detection_text(project_root, checks) {
35953
36066
  if (!checks.some((c) => c["id"] === "detection")) {
35954
36067
  return;
35955
36068
  }
35956
36069
  for (const line of renderDetectionLines(_detection_report(project_root))) {
35957
- print(line);
35958
- }
35959
- print("");
35960
- }
35961
- function _emit_text(project_root, missing, modified, foreign, tag_drift) {
35962
- const total = missing.length + modified.length + foreign.length + tag_drift.length;
35963
- if (total === 0) {
35964
- print(`\u2705 doctor: manifest matches filesystem under ${project_root}`);
35965
- return;
35966
- }
35967
- print(`\u26A0\uFE0F doctor: ${total} drift item(s) under ${project_root}`);
35968
- const groups = [
35969
- ["missing", missing],
35970
- ["modified", modified],
35971
- ["foreign", foreign],
35972
- ["tag-drift", tag_drift]
35973
- ];
35974
- for (const [label, items] of groups) {
35975
- if (items.length === 0) {
35976
- continue;
35977
- }
35978
- print(`
35979
- ${label} (${items.length}):`);
35980
- for (const it of items) {
35981
- const tool = it["tool"] || "?";
35982
- print(` \xB7 [${tool}] ${it["path"]}`);
35983
- if (label === "tag-drift") {
35984
- const found = it["found"] || "(missing)";
35985
- const expected = "expected" in it ? it["expected"] : PACKAGE_TAG_ID;
35986
- print(` expected: ${expected}`);
35987
- print(` found: ${found}`);
35988
- }
35989
- print(` fix: ${it["fix"]}`);
35990
- }
36070
+ print2(line);
35991
36071
  }
36072
+ print2("");
35992
36073
  }
35993
36074
  function _argError9(msg) {
35994
36075
  process16.stderr.write(USAGE2);
@@ -36001,6 +36082,7 @@ function _parse3(argv) {
36001
36082
  project: null,
36002
36083
  json: false,
36003
36084
  ci: false,
36085
+ ...STRICT_DEFAULTS,
36004
36086
  check: null,
36005
36087
  trace_root: false,
36006
36088
  context: false,
@@ -36098,7 +36180,7 @@ function _run_context(opts) {
36098
36180
  [project_root, origin] = _resolve_project_root(opts.project);
36099
36181
  } catch (exc) {
36100
36182
  if (exc instanceof ProjectRootError) {
36101
- eprint(`\u274C doctor: ${exc.message}`);
36183
+ eprint2(`\u274C doctor: ${exc.message}`);
36102
36184
  return 2;
36103
36185
  }
36104
36186
  throw exc;
@@ -36115,7 +36197,7 @@ function _run_context(opts) {
36115
36197
  wrapper: _detect_wrapper(project_root)
36116
36198
  };
36117
36199
  if (opts.json) {
36118
- print(_jsonDumpsIndentAscii(ctx, 2));
36200
+ print2(_jsonDumpsIndentAscii(ctx, 2));
36119
36201
  } else {
36120
36202
  _emit_context_text(ctx);
36121
36203
  }
@@ -36137,7 +36219,7 @@ function _run_anatomy(opts) {
36137
36219
  economyError = err instanceof Error ? err.message : String(err);
36138
36220
  }
36139
36221
  if (opts.json) {
36140
- print(
36222
+ print2(
36141
36223
  _jsonDumpsIndentAscii(
36142
36224
  {
36143
36225
  preamble_byte_census: byteCensus,
@@ -36149,10 +36231,10 @@ function _run_anatomy(opts) {
36149
36231
  );
36150
36232
  return 0;
36151
36233
  }
36152
- print("\u2500\u2500 injection anatomy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
36153
- print(census.renderText(byteCensus));
36154
- print("");
36155
- print(
36234
+ print2("\u2500\u2500 injection anatomy \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500");
36235
+ print2(census.renderText(byteCensus));
36236
+ print2("");
36237
+ print2(
36156
36238
  economyReport !== null ? economy.renderText(economyReport) : `dispatch-economy report unavailable: ${economyError}`
36157
36239
  );
36158
36240
  return 0;
@@ -36174,29 +36256,30 @@ function _run_repair(opts) {
36174
36256
  payload["action"] = "error";
36175
36257
  payload["error"] = osErrorStr2(exc);
36176
36258
  if (opts.json) {
36177
- print(_jsonDumpsIndentAscii(payload, 2));
36259
+ print2(_jsonDumpsIndentAscii(payload, 2));
36178
36260
  } else {
36179
- eprint(`\u274C doctor: could not remove ${state_pth}: ${osErrorStr2(exc)}`);
36261
+ eprint2(`\u274C doctor: could not remove ${state_pth}: ${osErrorStr2(exc)}`);
36180
36262
  }
36181
36263
  return 2;
36182
36264
  }
36183
36265
  }
36184
36266
  if (opts.json) {
36185
- print(_jsonDumpsIndentAscii(payload, 2));
36267
+ print2(_jsonDumpsIndentAscii(payload, 2));
36186
36268
  } else {
36187
36269
  if (payload["action"] === "remove") {
36188
- print(`\u2705 doctor: reset wizard-state (${state_pth})`);
36270
+ print2(`\u2705 doctor: reset wizard-state (${state_pth})`);
36189
36271
  } else {
36190
- print(`\u2705 doctor: nothing to repair (no wizard-state at ${state_pth})`);
36272
+ print2(`\u2705 doctor: nothing to repair (no wizard-state at ${state_pth})`);
36191
36273
  }
36192
36274
  }
36193
36275
  return 0;
36194
36276
  }
36195
- eprint(`\u274C doctor: unknown repair target ${pyRepr2(target)}`);
36277
+ eprint2(`\u274C doctor: unknown repair target ${pyRepr2(target)}`);
36196
36278
  return 2;
36197
36279
  }
36198
36280
  function main21(argv = null) {
36199
36281
  const opts = _parse3(argv !== null ? Array.from(argv) : process16.argv.slice(2));
36282
+ validateStrictLevelOr(opts.strict_level, _argError9);
36200
36283
  if (opts.ci) {
36201
36284
  opts.json = true;
36202
36285
  }
@@ -36218,7 +36301,7 @@ function main21(argv = null) {
36218
36301
  [project_root, origin] = _resolve_project_root(opts.project);
36219
36302
  } catch (exc) {
36220
36303
  if (exc instanceof ProjectRootError) {
36221
- eprint(`\u274C doctor: ${exc.message}`);
36304
+ eprint2(`\u274C doctor: ${exc.message}`);
36222
36305
  return 2;
36223
36306
  }
36224
36307
  throw exc;
@@ -36244,7 +36327,7 @@ function main21(argv = null) {
36244
36327
  _emit_json(project_root, missing, modified, foreign, tag_drift, checks, origin);
36245
36328
  } else {
36246
36329
  if (opts.check === null) {
36247
- print(` \u{1F4CD} project_root: ${project_root} (origin: ${origin})`);
36330
+ print2(` \u{1F4CD} project_root: ${project_root} (origin: ${origin})`);
36248
36331
  }
36249
36332
  _emit_checks_text(checks);
36250
36333
  _emit_detection_text(project_root, checks);
@@ -36261,6 +36344,8 @@ function main21(argv = null) {
36261
36344
  if (opts.ci) {
36262
36345
  return drift_present || fail_check ? 1 : 0;
36263
36346
  }
36347
+ const strict = strictExit(opts, checks, drift_present);
36348
+ if (strict !== null) return strict;
36264
36349
  return drift_present ? 1 : 0;
36265
36350
  }
36266
36351
  function _isCliEntry17() {
@@ -36289,7 +36374,7 @@ function _isCliEntry17() {
36289
36374
  return false;
36290
36375
  }
36291
36376
  }
36292
- var YAML6, _HERE18, ArgparseExit4, _Sentinel, NO_FRONTMATTER, _INSTALL_MODE_MARKER_REL, PACKAGE_TAG_ID, _FRONTMATTER_PACKAGE_RE, CHECK_IDS, GLOBAL_CHECK_IDS, MANIFEST_REQUIRED_CHECK_IDS, REPAIR_IDS, MCP_BETA_GATES, STATUS_SYMBOLS, MIN_PYTHON, _PLACEHOLDER_EMAIL_RE, _PLACEHOLDER_NAME_RE, _RULE_PROJECTION_DIRS, _check_python_runtime, _check_humanizer_runtime, _CLI_PROVIDER_META, _detection_memo, PROG4, USAGE2, _STORE_TRUE_FLAGS, _VALUE_FLAGS;
36377
+ var YAML6, _HERE18, ArgparseExit4, _Sentinel, NO_FRONTMATTER, _INSTALL_MODE_MARKER_REL, PACKAGE_TAG_ID2, _FRONTMATTER_PACKAGE_RE, CHECK_IDS, GLOBAL_CHECK_IDS, MANIFEST_REQUIRED_CHECK_IDS, REPAIR_IDS, MCP_BETA_GATES, STATUS_SYMBOLS, MIN_PYTHON, _PLACEHOLDER_EMAIL_RE, _PLACEHOLDER_NAME_RE, _RULE_PROJECTION_DIRS, _check_python_runtime, _check_humanizer_runtime, _CLI_PROVIDER_META, _detection_memo, PROG4, USAGE2, _STORE_TRUE_FLAGS, _VALUE_FLAGS;
36293
36378
  var init_cmd_doctor = __esm({
36294
36379
  "src/scripts/_cli/cmd_doctor.ts"() {
36295
36380
  "use strict";
@@ -36320,6 +36405,8 @@ var init_cmd_doctor = __esm({
36320
36405
  init_review_gate();
36321
36406
  init_package_root();
36322
36407
  init_rule_scope();
36408
+ init_doctor_strict();
36409
+ init_doctor_emit();
36323
36410
  _HERE18 = fileURLToPath31(import.meta.url);
36324
36411
  ArgparseExit4 = class extends Error {
36325
36412
  constructor(code) {
@@ -36332,7 +36419,7 @@ var init_cmd_doctor = __esm({
36332
36419
  };
36333
36420
  NO_FRONTMATTER = new _Sentinel();
36334
36421
  _INSTALL_MODE_MARKER_REL = "agents/.agent-state/install-mode.txt";
36335
- PACKAGE_TAG_ID = "event4u/agent-config";
36422
+ PACKAGE_TAG_ID2 = "event4u/agent-config";
36336
36423
  _FRONTMATTER_PACKAGE_RE = /^package:\s*(.+?)\s*$/m;
36337
36424
  CHECK_IDS = [
36338
36425
  "scope",
@@ -36427,17 +36514,17 @@ var init_cmd_doctor = __esm({
36427
36514
  _detection_memo = null;
36428
36515
  PROG4 = "agent-config doctor";
36429
36516
  USAGE2 = `usage: ${PROG4} [-h] [--project PROJECT] [--json] [--ci] [--check ID]
36430
- [--trace-root] [--context] [--anatomy]
36431
- [--repair ID]
36432
- `;
36517
+ ` + STRICT_USAGE + " [--trace-root] [--context] [--anatomy]\n [--repair ID]\n";
36433
36518
  _STORE_TRUE_FLAGS = {
36434
36519
  "--json": "json",
36435
36520
  "--ci": "ci",
36521
+ ...STRICT_STORE_TRUE,
36436
36522
  "--trace-root": "trace_root",
36437
36523
  "--context": "context",
36438
36524
  "--anatomy": "anatomy"
36439
36525
  };
36440
36526
  _VALUE_FLAGS = {
36527
+ ...STRICT_VALUE_FLAGS,
36441
36528
  "--project": "project",
36442
36529
  "--check": "check",
36443
36530
  "--repair": "repair"
@@ -42161,11 +42248,11 @@ import * as path80 from "node:path";
42161
42248
  import process21 from "node:process";
42162
42249
  import { spawnSync as spawnSync12 } from "node:child_process";
42163
42250
  import { fileURLToPath as fileURLToPath46, pathToFileURL as pathToFileURL36 } from "node:url";
42164
- function print2(s = "") {
42251
+ function print3(s = "") {
42165
42252
  process21.stdout.write(`${s}
42166
42253
  `);
42167
42254
  }
42168
- function eprint2(s = "") {
42255
+ function eprint3(s = "") {
42169
42256
  process21.stderr.write(`${s}
42170
42257
  `);
42171
42258
  }
@@ -42549,14 +42636,14 @@ function _parse4(argv) {
42549
42636
  function main36(argv = null) {
42550
42637
  const opts = _parse4(argv !== null ? Array.from(argv) : process21.argv.slice(2));
42551
42638
  if (opts.funnel) {
42552
- print2(render6(buildFunnel()));
42639
+ print3(render6(buildFunnel()));
42553
42640
  return 0;
42554
42641
  }
42555
42642
  let project_root;
42556
42643
  try {
42557
42644
  [project_root] = _resolve_project_root(opts.project);
42558
42645
  } catch (exc) {
42559
- eprint2(`\u274C conformance: ${exc.message}`);
42646
+ eprint3(`\u274C conformance: ${exc.message}`);
42560
42647
  return 2;
42561
42648
  }
42562
42649
  const manifest_pth = manifest_path(project_root);
@@ -42585,7 +42672,7 @@ function main36(argv = null) {
42585
42672
  const failed = allChecks.some((c) => c["status"] === "fail") || driftCount > 0;
42586
42673
  appendConformanceReport(conformanceChecks, project_root);
42587
42674
  if (opts.json) {
42588
- print2(
42675
+ print3(
42589
42676
  _jsonDumpsIndentAscii(
42590
42677
  {
42591
42678
  project_root,
@@ -42598,20 +42685,20 @@ function main36(argv = null) {
42598
42685
  )
42599
42686
  );
42600
42687
  } else {
42601
- print2(` \u{1F4CD} project_root: ${project_root}`);
42602
- print2("conformance:");
42688
+ print3(` \u{1F4CD} project_root: ${project_root}`);
42689
+ print3("conformance:");
42603
42690
  for (const c of allChecks) {
42604
42691
  const sym = STATUS_SYMBOLS[c["status"]] ?? "?";
42605
- print2(` ${sym} ${c["id"]}: ${c["message"]}`);
42692
+ print3(` ${sym} ${c["id"]}: ${c["message"]}`);
42606
42693
  if (c["status"] !== "ok" && c["remedy"]) {
42607
- print2(` fix: ${c["remedy"]}`);
42694
+ print3(` fix: ${c["remedy"]}`);
42608
42695
  }
42609
42696
  }
42610
42697
  if (driftCount > 0) {
42611
- print2(` \u274C drift: ${driftCount} drifted file(s) \u2014 run \`agent-config doctor\` for detail`);
42698
+ print3(` \u274C drift: ${driftCount} drifted file(s) \u2014 run \`agent-config doctor\` for detail`);
42612
42699
  }
42613
- print2("");
42614
- print2(
42700
+ print3("");
42701
+ print3(
42615
42702
  failed ? "\u274C conformance: red \u2014 the OS is not fully installed/firing here" : "\u2705 conformance: green \u2014 installed and firing"
42616
42703
  );
42617
42704
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@event4u/agent-config",
3
3
  "mcpName": "io.github.event4u-app/agent-config",
4
- "version": "14.14.0",
4
+ "version": "14.14.1",
5
5
  "description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) — every claim machine-checked, including the counts in these badges.",
6
6
  "license": "MIT",
7
7
  "private": false,
@@ -6,7 +6,7 @@
6
6
  "registered_at": "2026-08-23",
7
7
  "grader": {
8
8
  "path": "src/scripts/grade_target_readiness.ts",
9
- "dimensions": 10,
9
+ "dimensions": 13,
10
10
  "knockouts": [
11
11
  "test-presence",
12
12
  "static-analysis",