@event4u/agent-config 10.1.0 → 10.3.0

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 (158) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +110 -167
  3. package/README.md +1 -1
  4. package/dist/agent-src/commands/analyze/reference-repo.md +62 -0
  5. package/dist/agent-src/commands/roadmap/create.md +4 -1
  6. package/dist/agent-src/commands/roadmap/next.md +38 -0
  7. package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +22 -1
  8. package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
  9. package/dist/agent-src/personas/advisors/first-principles.md +6 -0
  10. package/dist/agent-src/rules/active-remediation.md +53 -2
  11. package/dist/agent-src/rules/code-provenance.md +66 -4
  12. package/dist/agent-src/rules/content-quoting-floor.md +6 -0
  13. package/dist/agent-src/rules/context-hygiene.md +39 -0
  14. package/dist/agent-src/rules/design-fidelity.md +49 -3
  15. package/dist/agent-src/rules/token-budget-discipline.md +3 -2
  16. package/dist/agent-src/rules/token-efficiency.md +22 -0
  17. package/dist/agent-src/skills/ai-council/SKILL.md +28 -6
  18. package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
  19. package/dist/agent-src/skills/design-review/references/verification-automation.md +23 -1
  20. package/dist/agent-src/skills/fe-design/SKILL.md +27 -3
  21. package/dist/agent-src/skills/judge-synthesis/SKILL.md +30 -0
  22. package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +11 -0
  23. package/dist/agent-src/skills/roadmap-writing/SKILL.md +9 -9
  24. package/dist/agent-src/skills/skill-writing/SKILL.md +4 -0
  25. package/dist/agent-src/skills/token-optimizer/SKILL.md +5 -1
  26. package/dist/agent-src/templates/agent-settings.md +12 -28
  27. package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
  28. package/dist/agent-src/templates/persona.md +26 -0
  29. package/dist/agent-src/templates/roadmaps.md +27 -7
  30. package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
  31. package/dist/agent-src/templates/skill.md +35 -1
  32. package/dist/cli/commands/commands.candidates.test.js +257 -0
  33. package/dist/cli/commands/commands.candidates.test.js.map +1 -0
  34. package/dist/cli/commands/commands.js +199 -0
  35. package/dist/cli/commands/commands.js.map +1 -1
  36. package/dist/cli/main.js +1 -0
  37. package/dist/cli/main.js.map +1 -1
  38. package/dist/cli/registry.js +2 -2
  39. package/dist/cli/registry.js.map +1 -1
  40. package/dist/cli-delegate/{chunk-3JUTT26I.js → chunk-6ENSXSBW.js} +1 -1
  41. package/dist/cli-delegate/{chunk-TVGXH7VA.js → chunk-6LOPHJLD.js} +1 -1
  42. package/dist/cli-delegate/{chunk-XT2YTJCZ.js → chunk-AYKQGIBG.js} +4 -0
  43. package/dist/cli-delegate/{chunk-HJSKTMIF.js → chunk-BV3WR67D.js} +3 -19
  44. package/dist/cli-delegate/{chunk-HTIU3W56.js → chunk-BWMXLD4B.js} +6 -2
  45. package/dist/cli-delegate/{chunk-2H5SE7DU.js → chunk-FV34EGEX.js} +166 -39
  46. package/dist/cli-delegate/{chunk-XTC5ARB6.js → chunk-IR3IVRVC.js} +7 -2
  47. package/dist/cli-delegate/{chunk-LRXJK6GN.js → chunk-JMQZ7MM5.js} +1 -1
  48. package/dist/cli-delegate/{chunk-NX5AXSLD.js → chunk-X3VOARZD.js} +3 -3
  49. package/dist/cli-delegate/cmd_analyze_session.js +1 -1
  50. package/dist/cli-delegate/cmd_brand_status.js +1 -1
  51. package/dist/cli-delegate/cmd_conformance.js +881 -204
  52. package/dist/cli-delegate/cmd_doctor.js +3 -3
  53. package/dist/cli-delegate/cmd_explain.js +2 -2
  54. package/dist/cli-delegate/cmd_export.js +4 -4
  55. package/dist/cli-delegate/cmd_handoff.js +6 -5
  56. package/dist/cli-delegate/cmd_mcp_available.js +1 -1
  57. package/dist/cli-delegate/cmd_migrate.js +2 -2
  58. package/dist/cli-delegate/cmd_packs_active.js +2 -2
  59. package/dist/cli-delegate/cmd_prune.js +4 -4
  60. package/dist/cli-delegate/cmd_route_audit.js +2 -2
  61. package/dist/cli-delegate/cmd_route_explain.js +1 -1
  62. package/dist/cli-delegate/cmd_session_recycle.js +44 -9
  63. package/dist/cli-delegate/cmd_settings_get.js +2 -2
  64. package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
  65. package/dist/cli-delegate/cmd_settings_set.js +2 -2
  66. package/dist/cli-delegate/cmd_sync.js +4 -4
  67. package/dist/cli-delegate/cmd_uninstall.js +4 -4
  68. package/dist/cli-delegate/cmd_update.js +1 -1
  69. package/dist/cli-delegate/cmd_upgrade.js +1 -1
  70. package/dist/cli-delegate/cmd_validate.js +4 -4
  71. package/dist/cli-delegate/cmd_versions.js +1 -1
  72. package/dist/discovery/deprecation-report.md +1 -1
  73. package/dist/discovery/discovery-manifest.json +21 -21
  74. package/dist/discovery/discovery-manifest.json.sha256 +1 -1
  75. package/dist/discovery/discovery-manifest.summary.md +1 -1
  76. package/dist/discovery/dormancy-report.md +1 -1
  77. package/dist/discovery/orphan-report.md +1 -1
  78. package/dist/discovery/packs.json +2 -2
  79. package/dist/discovery/trust-report.md +1 -1
  80. package/dist/discovery/workspaces.json +2 -2
  81. package/dist/hooks/dispatch.js +204 -44
  82. package/dist/install/install.mjs +9 -21
  83. package/dist/mcp/registry-manifest.json +2 -2
  84. package/dist/mcp/server.json +2 -2
  85. package/dist/mcp/server.mjs +1337 -490
  86. package/dist/router.json +1 -1
  87. package/dist/scripts/_lib/agent_settings.js +25 -2
  88. package/dist/scripts/_lib/agent_settings.js.map +1 -1
  89. package/dist/scripts/_lib/compile_time_toggles.js +4 -3
  90. package/dist/scripts/_lib/compile_time_toggles.js.map +1 -1
  91. package/dist/server/io/yamlIO.js +0 -2
  92. package/dist/server/io/yamlIO.js.map +1 -1
  93. package/dist/server/schemas/settings.js +3 -9
  94. package/dist/server/schemas/settings.js.map +1 -1
  95. package/dist/shared/settingsClasses.js +64 -2
  96. package/dist/shared/settingsClasses.js.map +1 -1
  97. package/dist/ui/assets/{index-B5qGYOJo.js → index-5fXOHoVh.js} +2 -2
  98. package/dist/ui/assets/index-5fXOHoVh.js.map +1 -0
  99. package/dist/ui/index.html +1 -1
  100. package/docs/contracts/settings-classes.md +307 -145
  101. package/docs/guidelines/agent-infra/active-remediation-mechanics.md +54 -0
  102. package/docs/guidelines/agent-infra/layered-settings.md +1 -2
  103. package/docs/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
  104. package/docs/guidelines/design-antipatterns.md +79 -10
  105. package/docs/guidelines/design-fidelity-mechanics.md +120 -2
  106. package/package.json +1 -1
  107. package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
  108. package/src/config/agent-settings.template.yml +12 -30
  109. package/src/config/gate-coverage.yml +42 -8
  110. package/src/config/gate-violation-baselines.json +15 -3
  111. package/src/config/profiles/balanced.ini +0 -2
  112. package/src/config/profiles/full.ini +1 -3
  113. package/src/config/profiles/minimal.ini +0 -2
  114. package/src/config/review-prompt-binding-baseline.json +19 -0
  115. package/src/config/rule-enforcement-baseline.json +0 -1
  116. package/src/scripts/_cli/cmd_session_recycle.ts +66 -9
  117. package/src/scripts/_cli/handoff_sessions.ts +3 -2
  118. package/src/scripts/_dispatch.bash +1 -0
  119. package/src/scripts/_lib/agent_settings.ts +25 -2
  120. package/src/scripts/_lib/bench_telegraph.ts +1 -1
  121. package/src/scripts/_lib/cc_transcript.ts +25 -0
  122. package/src/scripts/_lib/compile_time_toggles.ts +4 -3
  123. package/src/scripts/ai_council/clients.ts +243 -34
  124. package/src/scripts/cache_realization_report.ts +3 -2
  125. package/src/scripts/check_ci_local_parity.ts +60 -6
  126. package/src/scripts/check_review_prompt_binding.ts +553 -0
  127. package/src/scripts/check_rule_projection_integrity.ts +3 -1
  128. package/src/scripts/check_suppression_hygiene.ts +19 -3
  129. package/src/scripts/conformance_scan.ts +282 -9
  130. package/src/scripts/cost/track.mjs +10 -4
  131. package/src/scripts/council_cli.ts +33 -3
  132. package/src/scripts/design_slop_rules.test.ts +37 -6
  133. package/src/scripts/design_slop_rules.ts +150 -22
  134. package/src/scripts/dispatch_r2_reviewer.ts +15 -1
  135. package/src/scripts/external_sources_denylist.json +3 -1
  136. package/src/scripts/hook_manifest.yaml +17 -6
  137. package/src/scripts/hooks/block_unauthorized_git.ts +54 -8
  138. package/src/scripts/hooks/delegation_nudge_hook.ts +33 -8
  139. package/src/scripts/hooks/evidence_independence.ts +61 -9
  140. package/src/scripts/hooks/session_eol_hook.ts +123 -3
  141. package/src/scripts/hooks/turn_end_gate_hook.ts +31 -0
  142. package/src/scripts/hooks/ui_route_nudge_hook.ts +55 -2
  143. package/src/scripts/lint_design_antipattern_parity.ts +201 -0
  144. package/src/scripts/lint_harvest_provenance.ts +483 -0
  145. package/src/scripts/lint_settings_classes.ts +273 -11
  146. package/src/scripts/lint_skill_router_head.ts +254 -0
  147. package/src/scripts/lint_symptom_intake.ts +241 -0
  148. package/src/scripts/report_consultation_rate.ts +128 -2
  149. package/src/scripts/report_skill_activation.ts +6 -4
  150. package/src/scripts/report_skill_obligation_violations.ts +2 -1
  151. package/src/scripts/run_skill_evals.ts +10 -5
  152. package/src/scripts/schemas/persona.schema.json +8 -0
  153. package/src/scripts/schemas/provenance-harvest.schema.json +39 -0
  154. package/src/scripts/sweep_dead_scan_roots.ts +51 -0
  155. package/src/server/io/yamlIO.ts +0 -2
  156. package/src/server/schemas/settings.ts +3 -19
  157. package/src/shared/settingsClasses.ts +93 -2
  158. package/dist/ui/assets/index-B5qGYOJo.js.map +0 -1
@@ -1,6 +1,6 @@
1
1
  # Discovery — Orphan Report
2
2
 
3
- - Generated: `2026-08-12T12:21:21Z`
3
+ - Generated: `2026-08-13T06:03:54Z`
4
4
  - Orphan artefacts: **0**
5
5
 
6
6
  > An orphan is an artefact whose declared pack has no other members.
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:651edc81da3293762d2d404f360755f4ae48db41416cf431e4e3d725880ab473",
3
- "generated_at": "2026-08-12T12:21:21Z",
2
+ "checksum": "sha256:80669a1f5e725ff7c28914cf550d50c890591d1329a51a65f08666a61377d6d3",
3
+ "generated_at": "2026-08-13T06:03:54Z",
4
4
  "packs": [
5
5
  {
6
6
  "always_on": false,
@@ -1,6 +1,6 @@
1
1
  # Discovery — Trust Report
2
2
 
3
- - Generated: `2026-08-12T12:21:21Z`
3
+ - Generated: `2026-08-13T06:03:54Z`
4
4
  - Workspaces tracked: **10**
5
5
  - Human-review-required artefacts: **3**
6
6
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "checksum": "sha256:651edc81da3293762d2d404f360755f4ae48db41416cf431e4e3d725880ab473",
3
- "generated_at": "2026-08-12T12:21:21Z",
2
+ "checksum": "sha256:80669a1f5e725ff7c28914cf550d50c890591d1329a51a65f08666a61377d6d3",
3
+ "generated_at": "2026-08-13T06:03:54Z",
4
4
  "scanner_version": "1eaf68b6e9c9",
5
5
  "workspaces": [
6
6
  {
@@ -11635,7 +11635,6 @@ var MERGEABLE_KEYS = [
11635
11635
  "personal.bot_icon",
11636
11636
  "personal.pr_comment_bot_icon",
11637
11637
  "personal.autonomy",
11638
- "telegraph.speak_scope",
11639
11638
  // Knowledge-card global cross-project sharing is a USER-GLOBAL setting
11640
11639
  // (ADR-100 / road-to-structure-grounding-v2). Whitelisted so the
11641
11640
  // ~/.event4u/agent-config/agent-settings.yml values are honoured.
@@ -11861,7 +11860,12 @@ var REMOVED_KEYS = /* @__PURE__ */ new Map([
11861
11860
  ["hooks.turn_end_gate.enabled", "the turn-end gate is always armed"],
11862
11861
  ["hooks.turn_end_gate.promissory", "the turn-end gate is always armed"],
11863
11862
  ["hooks.turn_end_gate.language", "the turn-end gate is always armed"],
11864
- ["hooks.turn_end_gate.verification", "the turn-end gate is always armed"]
11863
+ ["hooks.turn_end_gate.verification", "the turn-end gate is always armed"],
11864
+ ["telegraph.speak_scope", "the rule body states its own scope; compile_router gates on telegraph.speak alone"],
11865
+ ["chat_history.max_size_kb", "the rotate command takes --max-kb from argv; session-count pruning bounds the file"],
11866
+ ["chat_history.on_overflow", "the overflow mode comes from the rotate command --mode argv"],
11867
+ ["quality.wait_for_remote_ci", "whether to poll follows from the push plus a detectable remote pipeline"],
11868
+ ["legal_review_prep.consented_at", "the provenance sidecar settings:set writes and consentVerdict reads"]
11865
11869
  ]);
11866
11870
  var _warnedRemovedKeys = /* @__PURE__ */ new Set();
11867
11871
  function _readDottedSettingsPath(root, dotted) {
@@ -21297,21 +21301,37 @@ var WARN_OPS = /* @__PURE__ */ new Set([
21297
21301
  "branch"
21298
21302
  ]);
21299
21303
  var G = "(?:-[A-Za-z-]+(?:=\\S+)?(?:\\s+\\S+)?\\s+)*";
21304
+ var P = "^(?:\\S*\\/)?";
21305
+ function ghApiWrite(pathRe) {
21306
+ return new RegExp(
21307
+ `${P}gh\\s+api\\b(?=[^\\n]*${pathRe})(?=[^\\n]*(?:-X|--method)\\s+(?:POST|PATCH|PUT|DELETE)\\b)`,
21308
+ "i"
21309
+ );
21310
+ }
21300
21311
  var COMMAND_OPS = [
21301
- { op: "publish", re: new RegExp(`\\b(npm|pnpm|yarn)\\s+${G}publish\\b`, "i") },
21302
- { op: "release", re: /\bgh\s+release\s+create\b|\bgh\s+api\b[^\n]*\/releases\b/i },
21312
+ { op: "publish", re: new RegExp(`${P}(npm|pnpm|yarn)\\s+${G}publish\\b`, "i") },
21313
+ {
21314
+ op: "release",
21315
+ re: new RegExp(`${P}gh\\s+release\\s+create\\b|${ghApiWrite("\\/releases\\b").source}`, "i")
21316
+ },
21303
21317
  {
21304
21318
  op: "tag",
21319
+ re: new RegExp(`${P}git\\s+${G}push\\b[^\\n;|&]*(--tags|--follow-tags|refs\\/tags\\/)`, "i")
21320
+ },
21321
+ {
21322
+ op: "pr-merge",
21305
21323
  re: new RegExp(
21306
- `\\bgit\\s+${G}push\\b[^\\n;|&]*(--tags|--follow-tags|refs\\/tags\\/)`,
21324
+ `${P}gh\\s+pr\\s+merge\\b|${ghApiWrite("\\/pulls\\/\\d+\\/merge\\b").source}`,
21307
21325
  "i"
21308
21326
  )
21309
21327
  },
21310
- { op: "pr-merge", re: /\bgh\s+pr\s+merge\b|\bgh\s+api\b[^\n]*\/pulls\/\d+\/merge\b/i },
21311
- { op: "pr-create", re: /\bgh\s+pr\s+create\b|\bgh\s+api\b[^\n]*-X\s+POST[^\n]*\/pulls\b/i },
21312
- { op: "push", re: new RegExp(`\\bgit\\s+${G}push\\b`, "i") },
21313
- { op: "commit", re: new RegExp(`\\bgit\\s+${G}commit\\b`, "i") },
21314
- { op: "branch", re: new RegExp(`\\bgit\\s+${G}(checkout\\s+-b|switch\\s+-c)\\b`, "i") }
21328
+ {
21329
+ op: "pr-create",
21330
+ re: new RegExp(`${P}gh\\s+pr\\s+create\\b|${ghApiWrite("\\/pulls\\b").source}`, "i")
21331
+ },
21332
+ { op: "push", re: new RegExp(`${P}git\\s+${G}push\\b`, "i") },
21333
+ { op: "commit", re: new RegExp(`${P}git\\s+${G}commit\\b`, "i") },
21334
+ { op: "branch", re: new RegExp(`${P}git\\s+${G}(checkout\\s+-b|switch\\s+-c)\\b`, "i") }
21315
21335
  ];
21316
21336
  var COMMAND_TOOLS3 = /* @__PURE__ */ new Set([
21317
21337
  "launch-process",
@@ -21658,7 +21678,7 @@ function isDispatchTool(tool) {
21658
21678
  function isEvaluationPrompt(prompt) {
21659
21679
  return EVALUATION_RE.test(prompt);
21660
21680
  }
21661
- var SELF_SCOPE_RE = /\b(my (work|change|diff|implementation|code|fix|patch|branch|pr)|this (diff|change|branch|pr|delta|implementation|patch)|the delta|the change i|what i (wrote|built|changed|implemented)|i just (wrote|built|changed|implemented))\b/i;
21681
+ var SELF_SCOPE_RE = /\b(my (work|change|diff|implementation|code|fix|patch|branch|pr)|this (diff|change|pr|delta|implementation|patch)|the delta|the change i|what i (wrote|built|changed|implemented)|i just (wrote|built|changed|implemented))\b/i;
21662
21682
  function isSelfScoped(prompt) {
21663
21683
  return SELF_SCOPE_RE.test(prompt);
21664
21684
  }
@@ -21726,11 +21746,14 @@ function decide2(tool, prompt, priorEvaluations) {
21726
21746
  }
21727
21747
  if (priorEvaluations >= 1) {
21728
21748
  return {
21729
- exit: EXIT_BLOCK2,
21730
- stdout: "",
21731
- stderr: `Blocked: second evaluation dispatch of your own work in this turn (verdict shopping). One evaluation has already run; commissioning another with a different prompt or scope selects the answer instead of measuring it. Report what the first pass returned, then re-plan.
21749
+ exit: EXIT_ALLOW10,
21750
+ stdout: `${JSON.stringify({
21751
+ decision: "warn",
21752
+ reason: `Second evaluation dispatch of your own work in this turn. If both passes judge the SAME subject, that is verdict shopping \u2014 commissioning another with a different prompt or scope selects the answer instead of measuring it. Report what the first pass returned, then re-plan. If this is an implementation fan-out rather than a second review, carry on: this check reads prose and cannot tell the two apart with certainty.`
21753
+ })}
21732
21754
  `,
21733
- evaluations: priorEvaluations
21755
+ stderr: "",
21756
+ evaluations: priorEvaluations + 1
21734
21757
  };
21735
21758
  }
21736
21759
  return {
@@ -23394,7 +23417,7 @@ var SLOP_RULES = [
23394
23417
  }
23395
23418
  },
23396
23419
  {
23397
- id: "slop-lock-shape",
23420
+ id: "slop-v8-lock-shape",
23398
23421
  catalogId: "V8",
23399
23422
  severity: "P2",
23400
23423
  engines: ["css"],
@@ -23421,27 +23444,6 @@ var SLOP_RULES = [
23421
23444
  return [];
23422
23445
  }
23423
23446
  },
23424
- {
23425
- id: "slop-lock-colour",
23426
- catalogId: "C6",
23427
- severity: "P3",
23428
- engines: ["css"],
23429
- description: "Colour Lock \u2014 multiple saturated accent hue families",
23430
- message: "Several accent hue families read as no single accent identity; lock one (C6 / Colour Lock).",
23431
- gated: (ctx) => ctx.has("colour lock", "color lock"),
23432
- detect: ({ content }) => {
23433
- const buckets = /* @__PURE__ */ new Set();
23434
- for (const pm of content.matchAll(/#([0-9a-f]{3}|[0-9a-f]{6})\b/gi)) {
23435
- const b = hueBucket("#" + (pm[1] ?? ""));
23436
- if (b !== null) buckets.add(b);
23437
- }
23438
- if (buckets.size >= 3) {
23439
- const idx = content.search(/#[0-9a-f]{3,6}\b/i);
23440
- return [{ line: lineOf(content, Math.max(0, idx)), snippet: `${buckets.size} distinct accent hue families` }];
23441
- }
23442
- return [];
23443
- }
23444
- },
23445
23447
  {
23446
23448
  id: "slop-l9-section-monotony",
23447
23449
  catalogId: "L9",
@@ -23483,6 +23485,116 @@ var SLOP_RULES = [
23483
23485
  if (maxRun > 2) return [{ line: 1, snippet: `${maxRun} consecutive media+text sections` }];
23484
23486
  return [];
23485
23487
  }
23488
+ },
23489
+ // -------------------------------------------------------------------------
23490
+ // Catalog thresholds promoted to rules (road-to-design-detector-evidence
23491
+ // Phase 3). Each entry below already published its number in
23492
+ // docs/guidelines/design-antipatterns.md — the prose is the specification,
23493
+ // nothing here is invented, and each was graded per rule against the clean
23494
+ // corpus rather than as a batch.
23495
+ // -------------------------------------------------------------------------
23496
+ {
23497
+ id: "slop-v4-over-rounded",
23498
+ catalogId: "V4",
23499
+ severity: "P3",
23500
+ engines: ["css"],
23501
+ description: "border-radius > 16px on an element declared under 200px wide",
23502
+ message: "Heavy rounding on a small surface reads as scaffold-default; scale the radius to the element (V4).",
23503
+ gated: (ctx) => ctx.has("pill", "fully rounded", "soft ui", "claymorphism"),
23504
+ detect: ({ content }) => cssBlocks(content).filter((b) => {
23505
+ const r = /border-radius\s*:\s*(\d+)px/i.exec(b.body);
23506
+ if (!r?.[1]) return false;
23507
+ const radius = parseInt(r[1], 10);
23508
+ if (radius <= 16 || radius >= 100) return false;
23509
+ const size = /(?:^|[;{\s])(?:max-)?(?:width|height)\s*:\s*(\d+)px/i.exec(b.body);
23510
+ return size?.[1] !== void 0 && parseInt(size[1], 10) < 200;
23511
+ }).map((b) => ({ line: b.line, snippet: b.selector.slice(0, 80) }))
23512
+ },
23513
+ {
23514
+ id: "slop-c3-dark-glow",
23515
+ catalogId: "C3",
23516
+ severity: "P2",
23517
+ engines: ["css"],
23518
+ description: "Saturated zero-offset glow (box-shadow / text-shadow) in a dark context",
23519
+ message: "A neon glow on dark reads as gaming-UI default rather than a considered accent (C3).",
23520
+ gated: (ctx) => ctx.has("glow", "neon", "cyberpunk", "gaming"),
23521
+ detect: ({ content, lines }) => {
23522
+ const darkContext = /prefers-color-scheme\s*:\s*dark/i.test(content) || /\.dark\b|\[data-theme=["']?dark/i.test(content) || /background(?:-color)?\s*:\s*#(?:0[0-9a-f]{5}|1[0-9a-f]{5}|000|111)\b/i.test(content);
23523
+ if (!darkContext) return [];
23524
+ const out = [];
23525
+ for (let i = 0; i < lines.length; i++) {
23526
+ const l = lines[i] ?? "";
23527
+ const m = /(?:box|text)-shadow\s*:\s*0\s+0\s+(\d+)px[^;]*?(#[0-9a-f]{3,8})/i.exec(l);
23528
+ if (!m?.[1] || !m[2]) continue;
23529
+ if (parseInt(m[1], 10) < 8) continue;
23530
+ if (hueBucket(m[2]) === null) continue;
23531
+ out.push({ line: i + 1, snippet: l.trim().slice(0, 80) });
23532
+ }
23533
+ return out;
23534
+ }
23535
+ },
23536
+ {
23537
+ id: "slop-t9-uppercase-body",
23538
+ catalogId: "T9",
23539
+ severity: "P3",
23540
+ engines: ["css"],
23541
+ description: "text-transform: uppercase applied to body-length text",
23542
+ message: "All-caps destroys word-shape for sustained reading; reserve it for short labels (T9).",
23543
+ gated: (ctx) => ctx.has("all caps", "all-caps", "uppercase display"),
23544
+ detect: ({ content }) => cssBlocks(content).filter((b) => /\b(p|body|article|\.prose|\.body|\.content|\.copy|blockquote|li)\b/i.test(b.selector)).filter((b) => !/label|button|\bth\b|badge|chip|tag|eyebrow|kicker|caption|nav/i.test(b.selector)).filter((b) => /text-transform\s*:\s*uppercase/i.test(b.body)).map((b) => ({ line: b.line, snippet: b.selector.slice(0, 80) }))
23545
+ },
23546
+ {
23547
+ id: "slop-t10-wide-tracking-body",
23548
+ catalogId: "T10",
23549
+ severity: "P3",
23550
+ engines: ["css"],
23551
+ description: "letter-spacing above 0.05em on body-length text",
23552
+ message: "Wide tracking slows sustained reading; it belongs to display type, not body (T10).",
23553
+ gated: (ctx) => ctx.has("wide tracking", "letterspacing", "letter-spacing"),
23554
+ detect: ({ content }) => cssBlocks(content).filter((b) => /\b(p|body|article|\.prose|\.body|\.content|\.copy|blockquote|li)\b/i.test(b.selector)).filter((b) => !/label|button|\bth\b|badge|chip|tag|eyebrow|kicker|caption|nav|h[1-6]/i.test(b.selector)).filter((b) => {
23555
+ const em = /letter-spacing\s*:\s*(\d*\.?\d+)(em|rem)/i.exec(b.body);
23556
+ if (em?.[1]) return parseFloat(em[1]) > 0.05;
23557
+ const px = /letter-spacing\s*:\s*(\d*\.?\d+)px/i.exec(b.body);
23558
+ return px?.[1] !== void 0 && parseFloat(px[1]) > 0.8;
23559
+ }).map((b) => ({ line: b.line, snippet: b.selector.slice(0, 80) }))
23560
+ },
23561
+ {
23562
+ id: "slop-m1-bounce-easing",
23563
+ catalogId: "M1",
23564
+ severity: "P2",
23565
+ engines: ["css"],
23566
+ description: "Bounce or elastic easing on a UI transition",
23567
+ message: "Overshoot draws attention to the animation instead of the state change (M1).",
23568
+ gated: (ctx) => ctx.has("bounce", "playful motion", "elastic"),
23569
+ detect: ({ lines }) => {
23570
+ const out = [];
23571
+ for (let i = 0; i < lines.length; i++) {
23572
+ const l = lines[i] ?? "";
23573
+ const cb = /cubic-bezier\(\s*[-\d.]+\s*,\s*(-?[\d.]+)\s*,\s*[-\d.]+\s*,\s*(-?[\d.]+)\s*\)/i.exec(l);
23574
+ if (cb?.[1] !== void 0 && cb[2] !== void 0) {
23575
+ const y1 = parseFloat(cb[1]);
23576
+ const y2 = parseFloat(cb[2]);
23577
+ if (y1 < 0 || y1 > 1 || y2 < 0 || y2 > 1) {
23578
+ out.push({ line: i + 1, snippet: l.trim().slice(0, 80) });
23579
+ continue;
23580
+ }
23581
+ }
23582
+ if (/(?:transition|animation)[^;]*\b(?:bounce|elastic|back(?:In|Out|InOut))\b/i.test(l)) {
23583
+ out.push({ line: i + 1, snippet: l.trim().slice(0, 80) });
23584
+ }
23585
+ }
23586
+ return out;
23587
+ }
23588
+ },
23589
+ {
23590
+ id: "slop-m3-img-hover-transform",
23591
+ catalogId: "M3",
23592
+ severity: "P3",
23593
+ engines: ["css"],
23594
+ description: "transform or filter animation on an <img> hover",
23595
+ message: "Hover-scaling an image triggers composite plus decode and often shifts layout (M3).",
23596
+ gated: (ctx) => ctx.has("image hover", "hover zoom", "ken burns"),
23597
+ detect: ({ content }) => cssBlocks(content).filter((b) => /\bimg\b/i.test(b.selector) && /:hover|:focus-within/i.test(b.selector)).filter((b) => /(?:^|[;{\s])(?:transform|filter)\s*:/i.test(b.body)).map((b) => ({ line: b.line, snippet: b.selector.slice(0, 80) }))
23486
23598
  }
23487
23599
  ];
23488
23600
 
@@ -24207,8 +24319,11 @@ function decide4(event, state) {
24207
24319
  if (state.nudges >= MAX_NUDGES) return { state, warn: false };
24208
24320
  return { state: { ...state, nudges: state.nudges + 1 }, warn: true };
24209
24321
  }
24322
+ function stateChanged(before, after) {
24323
+ return before.consulted !== after.consulted || before.nudges !== after.nudges;
24324
+ }
24210
24325
  function nudgeReason2(file) {
24211
- return `Non-trivial UI write to ${file} with no design consultation this session. Run \`existing-ui-audit\` first, then the fe-design loop (brief \u2192 build \u2192 review). Skip only if this is ui-trivial: <=1 file, <=5 lines, no new component, no new state, no new dependency.`;
24326
+ return `Non-trivial UI write to ${file} with no design consultation this session. Run \`existing-ui-audit\` first, then the fe-design loop (brief \u2192 inventory, if an artifact was provided \u2192 build \u2192 review). Skip only if this is ui-trivial: <=1 file, <=5 lines, no new component, no new state, no new dependency.`;
24212
24327
  }
24213
24328
  function main37() {
24214
24329
  let envelope;
@@ -24229,7 +24344,7 @@ function main37() {
24229
24344
  if (!event) return EXIT_ALLOW15;
24230
24345
  const before = readState2(root, session);
24231
24346
  const { state, warn } = decide4(event, before);
24232
- if (state.consulted !== before.consulted || state.nudges !== before.nudges) {
24347
+ if (stateChanged(before, state)) {
24233
24348
  writeState2(root, session, state);
24234
24349
  }
24235
24350
  if (!warn) return EXIT_ALLOW15;
@@ -25066,10 +25181,13 @@ function _isObject13(v) {
25066
25181
  return typeof v === "object" && v !== null && !Array.isArray(v);
25067
25182
  }
25068
25183
  var FILE_TOKEN_RE = /`?\b[\w][\w.\-]{0,80}\.(ts|tsx|js|jsx|mjs|cjs|py|php|rb|go|rs|java|kt|swift|md|mdx|json|ya?ml|css|scss|less|html|vue|svelte|sql|sh|bash|c|cpp|h|hpp|cs|toml|xml)\b`?/gi;
25069
- function detectEnumeratedFiles(text) {
25184
+ var FILE_SIGNAL_FLOOR = 3;
25185
+ function enumeratedFileTokens(text) {
25070
25186
  const matches = text.match(FILE_TOKEN_RE) ?? [];
25071
- const unique = new Set(matches.map((m) => m.replace(/`/g, "").toLowerCase()));
25072
- return unique.size;
25187
+ return [...new Set(matches.map((m) => m.replace(/`/g, "").toLowerCase()))];
25188
+ }
25189
+ function detectEnumeratedFiles(text) {
25190
+ return enumeratedFileTokens(text).length;
25073
25191
  }
25074
25192
  var EXPLICIT_COUNT_RE = /\b(\d+)\s+(files?|modules?|components?|endpoints?|scripts?|skills?|rules?|tickets?|tests?|screens?|pages?|repos?|services?|classes?|functions?|methods?|slices?|tasks?|items?|targets?|routes?|controllers?|Dateien|Module|Tests|Komponenten|Skripte|Regeln|Tickets|Aufgaben|Klassen|Funktionen|Endpunkte)\b/i;
25075
25193
  function detectExplicitSliceCount(text) {
@@ -25121,7 +25239,7 @@ function extractTaskSignals(text) {
25121
25239
  const explicit = detectExplicitSliceCount(text) ?? 0;
25122
25240
  const conjunction = detectMultiDeliverableConjunction(text);
25123
25241
  const forEach = detectForEachShape(text);
25124
- const fileSignal = fileCount >= 3 ? fileCount : 0;
25242
+ const fileSignal = fileCount >= FILE_SIGNAL_FLOOR ? fileCount : 0;
25125
25243
  let slices = Math.max(fileSignal, explicit, conjunction);
25126
25244
  if (slices === 0 && forEach) {
25127
25245
  slices = 2;
@@ -25715,12 +25833,19 @@ function readCiSettled(workspaceRoot2) {
25715
25833
  return { seen: false, settled: false };
25716
25834
  }
25717
25835
  var _COMPLETION_RE = /(^|\n)\s*(?:\*\*)?(?:fertig\b|damit ist alles erledigt|aufgabe erledigt|alles erledigt\b|komplett(?:er)? (?:auftrag|abgearbeitet)|der komplette auftrag ist durch|done[.!]|all done\b|task complete)/i;
25836
+ var _NEGATED_CLAIM_RE = /\b(noch nicht|nicht fertig|nicht durch|wäre verfrüht|ist verfrüht|not yet|not done|isn'?t done|nein)\b/i;
25837
+ function _lineAround(prose, at) {
25838
+ const start = prose.lastIndexOf("\n", at) + 1;
25839
+ const end = prose.indexOf("\n", at);
25840
+ return prose.slice(start, end === -1 ? prose.length : end);
25841
+ }
25718
25842
  function detectCompletionClaim(reply, ci) {
25719
25843
  if (!ci.seen || ci.settled) return null;
25720
25844
  const prose = visibleProse(reply);
25721
25845
  const m = _COMPLETION_RE.exec(prose);
25722
25846
  if (!m) return null;
25723
25847
  const at = m.index;
25848
+ if (_NEGATED_CLAIM_RE.test(_lineAround(prose, at))) return null;
25724
25849
  return {
25725
25850
  detector: "completion",
25726
25851
  evidence: prose.slice(at, at + 120).trim(),
@@ -26492,6 +26617,7 @@ function readState3(file) {
26492
26617
  schema_version: 1,
26493
26618
  counters: parsed.counters,
26494
26619
  advisory_fired_at: typeof parsed.advisory_fired_at === "string" ? parsed.advisory_fired_at : null,
26620
+ missing_envelope_warned_at: typeof parsed.missing_envelope_warned_at === "string" ? parsed.missing_envelope_warned_at : null,
26495
26621
  updated_at: typeof parsed.updated_at === "string" ? parsed.updated_at : ""
26496
26622
  };
26497
26623
  }
@@ -26501,9 +26627,30 @@ function readState3(file) {
26501
26627
  schema_version: 1,
26502
26628
  counters: emptyCounters(),
26503
26629
  advisory_fired_at: null,
26630
+ missing_envelope_warned_at: null,
26504
26631
  updated_at: ""
26505
26632
  };
26506
26633
  }
26634
+ function envelopeExists(workspaceRoot2, since = null) {
26635
+ const target = path66.join(workspaceRoot2, RECYCLE_ENVELOPE_REL);
26636
+ let raw;
26637
+ try {
26638
+ raw = fs64.readFileSync(target, "utf-8");
26639
+ } catch (exc) {
26640
+ return exc?.code !== "ENOENT";
26641
+ }
26642
+ if (since === null) return true;
26643
+ try {
26644
+ const written = JSON.parse(raw).written_at;
26645
+ if (typeof written !== "string") return true;
26646
+ return Date.parse(written) >= Date.parse(since);
26647
+ } catch {
26648
+ return true;
26649
+ }
26650
+ }
26651
+ function buildMissingEnvelopeLine(workspaceRoot2) {
26652
+ return `recycle advised earlier, but no envelope exists at ${path66.join(workspaceRoot2, RECYCLE_ENVELOPE_REL)} \u2014 /clear now starts the successor from nothing. Re-run \`agent-config session:recycle\` and check that it prints the absolute path it wrote before clearing.`;
26653
+ }
26507
26654
  function readThresholdTokens() {
26508
26655
  const override = process11.env[THRESHOLD_OVERRIDE_ENV];
26509
26656
  if (override !== void 0) {
@@ -26514,7 +26661,7 @@ function readThresholdTokens() {
26514
26661
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : null;
26515
26662
  }
26516
26663
  function buildAdvisoryLine3(tokens, threshold) {
26517
- return `context past recycle threshold (${tokens.toLocaleString("en-US")} of ${threshold.toLocaleString("en-US")} tokens): run \`agent-config session:recycle\` to write the recycle envelope, then /clear \u2014 the successor session resumes from the envelope at session_start (road-to-token-economy-recycling)`;
26664
+ return `context past recycle threshold (${tokens.toLocaleString("en-US")} of ${threshold.toLocaleString("en-US")} tokens): run \`agent-config session:recycle\` to write the recycle envelope. It prints the absolute path it wrote \u2014 /clear only after you have seen that line. The successor session then resumes from the envelope at session_start (road-to-token-economy-recycling)`;
26518
26665
  }
26519
26666
  function writeContextFill(workspaceRoot2, tokens, threshold, ts) {
26520
26667
  try {
@@ -26563,10 +26710,12 @@ function main45() {
26563
26710
  const threshold = readThresholdTokens();
26564
26711
  const tokens = counters.final_context_tokens;
26565
26712
  const shouldAdvise = threshold !== null && tokens !== null && tokens >= threshold && state.advisory_fired_at === null;
26713
+ const shouldWarnMissing = threshold !== null && state.advisory_fired_at !== null && (state.missing_envelope_warned_at ?? null) === null && !envelopeExists(workspaceRoot2, state.advisory_fired_at);
26566
26714
  const nextState2 = {
26567
26715
  schema_version: 1,
26568
26716
  counters,
26569
26717
  advisory_fired_at: shouldAdvise ? now : state.advisory_fired_at,
26718
+ missing_envelope_warned_at: shouldWarnMissing ? now : state.missing_envelope_warned_at ?? null,
26570
26719
  updated_at: now
26571
26720
  };
26572
26721
  try {
@@ -26581,6 +26730,17 @@ function main45() {
26581
26730
  reason: `session-eol: context ${tokens} >= recycle threshold ${threshold}`,
26582
26731
  additional_context: buildAdvisoryLine3(tokens, threshold)
26583
26732
  })}
26733
+ `
26734
+ );
26735
+ return EXIT_WARN13;
26736
+ }
26737
+ if (shouldWarnMissing) {
26738
+ process11.stdout.write(
26739
+ `${JSON.stringify({
26740
+ decision: "warn",
26741
+ reason: "session-eol: recycle advised, no envelope written",
26742
+ additional_context: buildMissingEnvelopeLine(workspaceRoot2)
26743
+ })}
26584
26744
  `
26585
26745
  );
26586
26746
  return EXIT_WARN13;
@@ -9936,7 +9936,6 @@ var MERGEABLE_KEYS = [
9936
9936
  "personal.bot_icon",
9937
9937
  "personal.pr_comment_bot_icon",
9938
9938
  "personal.autonomy",
9939
- "telegraph.speak_scope",
9940
9939
  // Knowledge-card global cross-project sharing is a USER-GLOBAL setting
9941
9940
  // (ADR-100 / road-to-structure-grounding-v2). Whitelisted so the
9942
9941
  // ~/.event4u/agent-config/agent-settings.yml values are honoured.
@@ -10219,7 +10218,12 @@ var REMOVED_KEYS = /* @__PURE__ */ new Map([
10219
10218
  ["hooks.turn_end_gate.enabled", "the turn-end gate is always armed"],
10220
10219
  ["hooks.turn_end_gate.promissory", "the turn-end gate is always armed"],
10221
10220
  ["hooks.turn_end_gate.language", "the turn-end gate is always armed"],
10222
- ["hooks.turn_end_gate.verification", "the turn-end gate is always armed"]
10221
+ ["hooks.turn_end_gate.verification", "the turn-end gate is always armed"],
10222
+ ["telegraph.speak_scope", "the rule body states its own scope; compile_router gates on telegraph.speak alone"],
10223
+ ["chat_history.max_size_kb", "the rotate command takes --max-kb from argv; session-count pruning bounds the file"],
10224
+ ["chat_history.on_overflow", "the overflow mode comes from the rotate command --mode argv"],
10225
+ ["quality.wait_for_remote_ci", "whether to poll follows from the push plus a detectable remote pipeline"],
10226
+ ["legal_review_prep.consented_at", "the provenance sidecar settings:set writes and consentVerdict reads"]
10223
10227
  ]);
10224
10228
  var _warnedRemovedKeys = /* @__PURE__ */ new Set();
10225
10229
  function _readDottedSettingsPath(root, dotted) {
@@ -14580,7 +14584,6 @@ var userType = external_exports.enum(["", "consultant", "creator", "developer",
14580
14584
  var profileId = external_exports.enum(["developer", "content_creator", "founder", "agency", "finance", "ops"]);
14581
14585
  var accessStyle = external_exports.enum(["getters_setters", "get_attribute", "magic_properties"]);
14582
14586
  var chatFreq = external_exports.enum(["per_turn", "per_phase", "per_tool"]);
14583
- var chatOverflow = external_exports.enum(["rotate", "condense"]);
14584
14587
  var qualityCadence = external_exports.enum(["end_of_roadmap", "per_phase", "per_step"]);
14585
14588
  var regenCadence = external_exports.enum(["per_step", "every_5_steps", "phase_boundary"]);
14586
14589
  var worktreeMode = external_exports.enum(["off", "on", "ask"]);
@@ -14727,12 +14730,6 @@ var settingsSchema = external_exports.object({
14727
14730
  frequency: chatFreq.default("per_turn").describe(
14728
14731
  "How often the chat-history writer flushes to disk. per_turn = after every user / agent exchange (default, lowest data loss on crash). per_phase = at phase boundaries (cheaper I/O). per_tool = after every tool call (highest fidelity, noisiest log)."
14729
14732
  ),
14730
- max_size_kb: external_exports.number().int().min(0).default(2048).describe(
14731
- "Maximum size (KB) of the active chat-history file before chat_history.on_overflow kicks in. Set 0 to disable rotation / condensation entirely (file grows forever)."
14732
- ),
14733
- on_overflow: chatOverflow.default("rotate").describe(
14734
- "What happens when chat_history.max_size_kb is hit. rotate = move the current log aside and start fresh (default). condense = telegraph-condense the oldest entries in place to keep recent context."
14735
- ),
14736
14733
  text_limits: external_exports.object({
14737
14734
  user: external_exports.number().int().min(0).default(0).describe(
14738
14735
  "Per-message character cap for user inputs in the chat-history log. 0 = log verbatim (default). Raise above 0 only if your prompts contain large pasted artefacts you do not want stored."
@@ -14781,9 +14778,6 @@ var settingsSchema = external_exports.object({
14781
14778
  quality: external_exports.object({
14782
14779
  local_auto_run: external_exports.boolean().default(false).describe(
14783
14780
  "Run quality tools (linters, type-checks, formatters) and the local test suite autonomously after edits. Off by default \u2014 the agent never runs quality tools proactively and does not ask; the user runs them manually (e.g. /quality-fix) and remote CI is the authoritative gate. The agent only runs a quality tool on an explicit ask, a concrete CI failure, or the new-gate carve-out. Turn on to restore autonomous pipeline runs."
14784
- ),
14785
- wait_for_remote_ci: external_exports.boolean().default(false).describe(
14786
- "After pushing a branch, poll the remote CI provider (GitHub Actions, GitLab CI) and surface failures inline. Off by default \u2014 useful when local CI does not cover everything the remote pipeline runs."
14787
14781
  )
14788
14782
  }),
14789
14783
  design: external_exports.object({
@@ -14809,12 +14803,9 @@ var settingsSchema = external_exports.object({
14809
14803
  }).default({ identity_allowlist: [], forbid_terminal_capture: true, data_bearing_gate: "on" }),
14810
14804
  telegraph: external_exports.object({
14811
14805
  speak: external_exports.boolean().default(false).describe(
14812
- "Whether the telegraph-speak rule ships at all. false (default) = DORMANT: compile_router omits the rule from dist/router.json entirely, so its body never reaches a host. This \u2014 not speak_scope \u2014 is the lever that stops the cost. Set true only after an output-side bench clears the kill-criterion bar (docs/adrs/telegraph/0002)."
14813
- ),
14814
- speak_scope: external_exports.enum(["off", "reply", "all"]).default("off").describe(
14815
- "Where telegraph condensation applies WHEN speak is true. off (default) = agent reply prose is exempt. compile_router never reads this key: with speak false the rule does not ship, so this setting has no effect on its own. Quote the value in YAML \u2014 bare `off` parses as a boolean under YAML 1.1 and is rejected."
14806
+ "Whether the telegraph-speak rule ships at all. false (default) = DORMANT: compile_router omits the rule from dist/router.json entirely, so its body never reaches a host. This is the only lever that stops the cost. Set true only after an output-side bench clears the kill-criterion bar (docs/adrs/telegraph/0002)."
14816
14807
  )
14817
- }).default({ speak: false, speak_scope: "off" }),
14808
+ }).default({ speak: false }),
14818
14809
  tokens: external_exports.object({
14819
14810
  rich_skills: richSkillsMode.default("on").describe(
14820
14811
  "Whether skills marked token_budget_class: rich may load in full (exempt from telegraph-speak + thin-projector trimming), consumed by the token-budget-discipline rule. on = allowed (default); off = fall back to standard condensed behavior; ask = surface an estimated token delta (tokens, not dollars) and ask once per session before loading."
@@ -15124,13 +15115,10 @@ var settingsSchema = external_exports.object({
15124
15115
  acknowledged: external_exports.boolean().default(false).describe(
15125
15116
  "I understand the legal-review-prep pack provides templates and general information ONLY \u2014 it is NOT legal advice, creates no attorney-client relationship, and never replaces a licensed lawyer. Individual cases require an attorney. The pack stays inactive until this is checked."
15126
15117
  ),
15127
- consented_at: external_exports.string().default("").describe(
15128
- "ISO timestamp recorded when the legal-review-prep acknowledgment was given. Set automatically by the setup wizard; leave empty otherwise."
15129
- ),
15130
15118
  require_council: external_exports.boolean().default(true).describe(
15131
15119
  "Gate legal work-product behind a multi-model AI-council / deep-research pass (defense-in-depth: documented multi-stage review + audit trail; fail-closed when no council is configured). Leave on for the safest posture. Turning it off lets single-model legal output through \u2014 not recommended for a high-risk pack."
15132
15120
  )
15133
- }).default({ acknowledged: false, consented_at: "", require_council: true })
15121
+ }).default({ acknowledged: false, require_council: true })
15134
15122
  });
15135
15123
 
15136
15124
  // node_modules/zod-to-json-schema/dist/esm/Options.js
@@ -3,13 +3,13 @@
3
3
  "artefact_count": 603,
4
4
  "scanner_version": "1eaf68b6e9c9"
5
5
  },
6
- "generated_at": "2026-08-12",
6
+ "generated_at": "2026-08-13",
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 \"zero runtime daemon\".",
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": "10.1.0"
12
+ "version": "10.3.0"
13
13
  },
14
14
  "registries": [
15
15
  {
@@ -9,12 +9,12 @@
9
9
  "transport": {
10
10
  "type": "stdio"
11
11
  },
12
- "version": "10.1.0"
12
+ "version": "10.3.0"
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": "10.1.0"
19
+ "version": "10.3.0"
20
20
  }