@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +110 -167
- package/README.md +1 -1
- package/dist/agent-src/commands/analyze/reference-repo.md +62 -0
- package/dist/agent-src/commands/roadmap/create.md +4 -1
- package/dist/agent-src/commands/roadmap/next.md +38 -0
- package/dist/agent-src/contexts/communication/rules-auto/token-efficiency-mechanics.md +22 -1
- package/dist/agent-src/contexts/contracts/frugality-charter.md +1 -1
- package/dist/agent-src/personas/advisors/first-principles.md +6 -0
- package/dist/agent-src/rules/active-remediation.md +53 -2
- package/dist/agent-src/rules/code-provenance.md +66 -4
- package/dist/agent-src/rules/content-quoting-floor.md +6 -0
- package/dist/agent-src/rules/context-hygiene.md +39 -0
- package/dist/agent-src/rules/design-fidelity.md +49 -3
- package/dist/agent-src/rules/token-budget-discipline.md +3 -2
- package/dist/agent-src/rules/token-efficiency.md +22 -0
- package/dist/agent-src/skills/ai-council/SKILL.md +28 -6
- package/dist/agent-src/skills/condense-memory/SKILL.md +1 -1
- package/dist/agent-src/skills/design-review/references/verification-automation.md +23 -1
- package/dist/agent-src/skills/fe-design/SKILL.md +27 -3
- package/dist/agent-src/skills/judge-synthesis/SKILL.md +30 -0
- package/dist/agent-src/skills/learning-to-rule-or-skill/SKILL.md +11 -0
- package/dist/agent-src/skills/roadmap-writing/SKILL.md +9 -9
- package/dist/agent-src/skills/skill-writing/SKILL.md +4 -0
- package/dist/agent-src/skills/token-optimizer/SKILL.md +5 -1
- package/dist/agent-src/templates/agent-settings.md +12 -28
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +2 -2
- package/dist/agent-src/templates/persona.md +26 -0
- package/dist/agent-src/templates/roadmaps.md +27 -7
- package/dist/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
- package/dist/agent-src/templates/skill.md +35 -1
- package/dist/cli/commands/commands.candidates.test.js +257 -0
- package/dist/cli/commands/commands.candidates.test.js.map +1 -0
- package/dist/cli/commands/commands.js +199 -0
- package/dist/cli/commands/commands.js.map +1 -1
- package/dist/cli/main.js +1 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/registry.js +2 -2
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/{chunk-3JUTT26I.js → chunk-6ENSXSBW.js} +1 -1
- package/dist/cli-delegate/{chunk-TVGXH7VA.js → chunk-6LOPHJLD.js} +1 -1
- package/dist/cli-delegate/{chunk-XT2YTJCZ.js → chunk-AYKQGIBG.js} +4 -0
- package/dist/cli-delegate/{chunk-HJSKTMIF.js → chunk-BV3WR67D.js} +3 -19
- package/dist/cli-delegate/{chunk-HTIU3W56.js → chunk-BWMXLD4B.js} +6 -2
- package/dist/cli-delegate/{chunk-2H5SE7DU.js → chunk-FV34EGEX.js} +166 -39
- package/dist/cli-delegate/{chunk-XTC5ARB6.js → chunk-IR3IVRVC.js} +7 -2
- package/dist/cli-delegate/{chunk-LRXJK6GN.js → chunk-JMQZ7MM5.js} +1 -1
- package/dist/cli-delegate/{chunk-NX5AXSLD.js → chunk-X3VOARZD.js} +3 -3
- package/dist/cli-delegate/cmd_analyze_session.js +1 -1
- package/dist/cli-delegate/cmd_brand_status.js +1 -1
- package/dist/cli-delegate/cmd_conformance.js +881 -204
- package/dist/cli-delegate/cmd_doctor.js +3 -3
- package/dist/cli-delegate/cmd_explain.js +2 -2
- package/dist/cli-delegate/cmd_export.js +4 -4
- package/dist/cli-delegate/cmd_handoff.js +6 -5
- package/dist/cli-delegate/cmd_mcp_available.js +1 -1
- package/dist/cli-delegate/cmd_migrate.js +2 -2
- package/dist/cli-delegate/cmd_packs_active.js +2 -2
- package/dist/cli-delegate/cmd_prune.js +4 -4
- package/dist/cli-delegate/cmd_route_audit.js +2 -2
- package/dist/cli-delegate/cmd_route_explain.js +1 -1
- package/dist/cli-delegate/cmd_session_recycle.js +44 -9
- package/dist/cli-delegate/cmd_settings_get.js +2 -2
- package/dist/cli-delegate/cmd_settings_migrate.js +4 -4
- package/dist/cli-delegate/cmd_settings_set.js +2 -2
- package/dist/cli-delegate/cmd_sync.js +4 -4
- package/dist/cli-delegate/cmd_uninstall.js +4 -4
- package/dist/cli-delegate/cmd_update.js +1 -1
- package/dist/cli-delegate/cmd_upgrade.js +1 -1
- package/dist/cli-delegate/cmd_validate.js +4 -4
- package/dist/cli-delegate/cmd_versions.js +1 -1
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +21 -21
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +1 -1
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +2 -2
- package/dist/discovery/trust-report.md +1 -1
- package/dist/discovery/workspaces.json +2 -2
- package/dist/hooks/dispatch.js +204 -44
- package/dist/install/install.mjs +9 -21
- package/dist/mcp/registry-manifest.json +2 -2
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1337 -490
- package/dist/router.json +1 -1
- package/dist/scripts/_lib/agent_settings.js +25 -2
- package/dist/scripts/_lib/agent_settings.js.map +1 -1
- package/dist/scripts/_lib/compile_time_toggles.js +4 -3
- package/dist/scripts/_lib/compile_time_toggles.js.map +1 -1
- package/dist/server/io/yamlIO.js +0 -2
- package/dist/server/io/yamlIO.js.map +1 -1
- package/dist/server/schemas/settings.js +3 -9
- package/dist/server/schemas/settings.js.map +1 -1
- package/dist/shared/settingsClasses.js +64 -2
- package/dist/shared/settingsClasses.js.map +1 -1
- package/dist/ui/assets/{index-B5qGYOJo.js → index-5fXOHoVh.js} +2 -2
- package/dist/ui/assets/index-5fXOHoVh.js.map +1 -0
- package/dist/ui/index.html +1 -1
- package/docs/contracts/settings-classes.md +307 -145
- package/docs/guidelines/agent-infra/active-remediation-mechanics.md +54 -0
- package/docs/guidelines/agent-infra/layered-settings.md +1 -2
- package/docs/guidelines/agent-infra/symptom-driven-harvest-loop.md +104 -0
- package/docs/guidelines/design-antipatterns.md +79 -10
- package/docs/guidelines/design-fidelity-mechanics.md +120 -2
- package/package.json +1 -1
- package/src/agent-src/templates/scripts/work_engine/_lib/agent_settings.ts +0 -1
- package/src/config/agent-settings.template.yml +12 -30
- package/src/config/gate-coverage.yml +42 -8
- package/src/config/gate-violation-baselines.json +15 -3
- package/src/config/profiles/balanced.ini +0 -2
- package/src/config/profiles/full.ini +1 -3
- package/src/config/profiles/minimal.ini +0 -2
- package/src/config/review-prompt-binding-baseline.json +19 -0
- package/src/config/rule-enforcement-baseline.json +0 -1
- package/src/scripts/_cli/cmd_session_recycle.ts +66 -9
- package/src/scripts/_cli/handoff_sessions.ts +3 -2
- package/src/scripts/_dispatch.bash +1 -0
- package/src/scripts/_lib/agent_settings.ts +25 -2
- package/src/scripts/_lib/bench_telegraph.ts +1 -1
- package/src/scripts/_lib/cc_transcript.ts +25 -0
- package/src/scripts/_lib/compile_time_toggles.ts +4 -3
- package/src/scripts/ai_council/clients.ts +243 -34
- package/src/scripts/cache_realization_report.ts +3 -2
- package/src/scripts/check_ci_local_parity.ts +60 -6
- package/src/scripts/check_review_prompt_binding.ts +553 -0
- package/src/scripts/check_rule_projection_integrity.ts +3 -1
- package/src/scripts/check_suppression_hygiene.ts +19 -3
- package/src/scripts/conformance_scan.ts +282 -9
- package/src/scripts/cost/track.mjs +10 -4
- package/src/scripts/council_cli.ts +33 -3
- package/src/scripts/design_slop_rules.test.ts +37 -6
- package/src/scripts/design_slop_rules.ts +150 -22
- package/src/scripts/dispatch_r2_reviewer.ts +15 -1
- package/src/scripts/external_sources_denylist.json +3 -1
- package/src/scripts/hook_manifest.yaml +17 -6
- package/src/scripts/hooks/block_unauthorized_git.ts +54 -8
- package/src/scripts/hooks/delegation_nudge_hook.ts +33 -8
- package/src/scripts/hooks/evidence_independence.ts +61 -9
- package/src/scripts/hooks/session_eol_hook.ts +123 -3
- package/src/scripts/hooks/turn_end_gate_hook.ts +31 -0
- package/src/scripts/hooks/ui_route_nudge_hook.ts +55 -2
- package/src/scripts/lint_design_antipattern_parity.ts +201 -0
- package/src/scripts/lint_harvest_provenance.ts +483 -0
- package/src/scripts/lint_settings_classes.ts +273 -11
- package/src/scripts/lint_skill_router_head.ts +254 -0
- package/src/scripts/lint_symptom_intake.ts +241 -0
- package/src/scripts/report_consultation_rate.ts +128 -2
- package/src/scripts/report_skill_activation.ts +6 -4
- package/src/scripts/report_skill_obligation_violations.ts +2 -1
- package/src/scripts/run_skill_evals.ts +10 -5
- package/src/scripts/schemas/persona.schema.json +8 -0
- package/src/scripts/schemas/provenance-harvest.schema.json +39 -0
- package/src/scripts/sweep_dead_scan_roots.ts +51 -0
- package/src/server/io/yamlIO.ts +0 -2
- package/src/server/schemas/settings.ts +3 -19
- package/src/shared/settingsClasses.ts +93 -2
- package/dist/ui/assets/index-B5qGYOJo.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-08-
|
|
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
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-08-
|
|
2
|
+
"checksum": "sha256:80669a1f5e725ff7c28914cf550d50c890591d1329a51a65f08666a61377d6d3",
|
|
3
|
+
"generated_at": "2026-08-13T06:03:54Z",
|
|
4
4
|
"scanner_version": "1eaf68b6e9c9",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
{
|
package/dist/hooks/dispatch.js
CHANGED
|
@@ -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(
|
|
21302
|
-
{
|
|
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
|
-
|
|
21324
|
+
`${P}gh\\s+pr\\s+merge\\b|${ghApiWrite("\\/pulls\\/\\d+\\/merge\\b").source}`,
|
|
21307
21325
|
"i"
|
|
21308
21326
|
)
|
|
21309
21327
|
},
|
|
21310
|
-
{
|
|
21311
|
-
|
|
21312
|
-
|
|
21313
|
-
|
|
21314
|
-
{ op: "
|
|
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|
|
|
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:
|
|
21730
|
-
stdout:
|
|
21731
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
25184
|
+
var FILE_SIGNAL_FLOOR = 3;
|
|
25185
|
+
function enumeratedFileTokens(text) {
|
|
25070
25186
|
const matches = text.match(FILE_TOKEN_RE) ?? [];
|
|
25071
|
-
|
|
25072
|
-
|
|
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 >=
|
|
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
|
|
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;
|
package/dist/install/install.mjs
CHANGED
|
@@ -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
|
|
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
|
|
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,
|
|
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-
|
|
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.
|
|
12
|
+
"version": "10.3.0"
|
|
13
13
|
},
|
|
14
14
|
"registries": [
|
|
15
15
|
{
|
package/dist/mcp/server.json
CHANGED
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"transport": {
|
|
10
10
|
"type": "stdio"
|
|
11
11
|
},
|
|
12
|
-
"version": "10.
|
|
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.
|
|
19
|
+
"version": "10.3.0"
|
|
20
20
|
}
|