@event4u/agent-config 14.1.0 → 14.4.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 +291 -181
- package/agents/templates/.ai-council.yml.example +35 -0
- package/dist/agent-src/contexts/execution/roadmap-process-loop.md +83 -12
- package/dist/agent-src/rules/roadmap-progress-sync.md +48 -4
- package/dist/agent-src/scripts/resume_probe.ts +154 -9
- package/dist/agent-src/scripts/roadmap_gates.ts +210 -6
- package/dist/agent-src/skills/roadmap-management/SKILL.md +9 -4
- package/dist/agent-src/templates/agent-settings.md +70 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/telemetry/remote.ts +571 -0
- package/dist/agent-src/templates/scripts/telemetry/settings.ts +222 -44
- package/dist/cli/python/workspace_drive.js +8 -3
- package/dist/cli/python/workspace_drive.js.map +1 -1
- package/dist/cli/python/workspace_hosts.js +16 -12
- package/dist/cli/python/workspace_hosts.js.map +1 -1
- package/dist/cli/registry.js +2 -0
- package/dist/cli/registry.js.map +1 -1
- package/dist/cli-delegate/{chunk-F3YUF7SA.js → chunk-3UCJWMMP.js} +1 -1
- package/dist/cli-delegate/chunk-F7DQWYR5.js +69 -0
- package/dist/cli-delegate/{chunk-7PZ4FSZB.js → chunk-FBKL6JWT.js} +61 -2
- package/dist/cli-delegate/{chunk-MNWRDMR5.js → chunk-PKOBQADP.js} +1 -1
- package/dist/cli-delegate/cmd_conformance.js +26 -11
- package/dist/cli-delegate/cmd_doctor.js +2 -2
- package/dist/cli-delegate/cmd_handoff.js +3 -3
- package/dist/cli-delegate/cmd_route_audit.js +2 -2
- package/dist/cli-delegate/cmd_settings_set.js +17 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +4 -4
- 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 +3773 -1731
- package/dist/mcp/registry-manifest.json +2 -2
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +1070 -408
- package/dist/scripts/_lib/host_launch.js +66 -0
- package/dist/scripts/_lib/host_launch.js.map +1 -0
- package/dist/server/io/yamlIO.js +175 -3
- package/dist/server/io/yamlIO.js.map +1 -1
- package/dist/server/routes/wizard.js +20 -1
- package/dist/server/routes/wizard.js.map +1 -1
- package/dist/shared/settingsConsent.js +25 -0
- package/dist/shared/settingsConsent.js.map +1 -1
- package/docs/contracts/settings-classes.md +11 -0
- package/docs/guidelines/agent-infra/roadmap-progress-mechanics.md +2 -1
- package/package.json +1 -1
- package/src/agent-src/scripts/resume_probe.ts +154 -9
- package/src/agent-src/scripts/roadmap_gates.ts +210 -6
- package/src/agent-src/templates/scripts/telemetry/remote.ts +571 -0
- package/src/agent-src/templates/scripts/telemetry/settings.ts +222 -44
- package/src/config/estate-count-budget.json +120 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +32 -4
- package/src/config/gate-violation-baselines.json +63 -63
- package/src/config/gitignore-block.txt +5 -0
- package/src/config/hook-latency-budget.json +40 -1
- package/src/config/hook-token-budget.json +22 -0
- package/src/config/rule-stub-ceilings.json +11 -3
- package/src/scripts/_dispatch.bash +42 -1
- package/src/scripts/_lib/council_fallback_posture.ts +81 -0
- package/src/scripts/_lib/council_fallback_wiring.ts +126 -0
- package/src/scripts/_lib/council_settings_block.ts +152 -0
- package/src/scripts/_lib/headless_invocation.ts +285 -0
- package/src/scripts/_lib/host_launch.ts +72 -0
- package/src/scripts/_lib/map_to_object.ts +16 -0
- package/src/scripts/_lib/roadmap_checkboxes.ts +88 -0
- package/src/scripts/_lib/run_checkpoint.ts +409 -0
- package/src/scripts/_lib/session_register.ts +32 -1
- package/src/scripts/_lib/skill_catalogue_series.ts +91 -0
- package/src/scripts/_lib/stdin.ts +35 -1
- package/src/scripts/_lib/turn_end_refusals.ts +12 -4
- package/src/scripts/_lib/unattended_guard.ts +371 -0
- package/src/scripts/ai_council/config.ts +27 -1
- package/src/scripts/ai_council/events_log.ts +12 -1
- package/src/scripts/ai_council/fallback_config.ts +114 -0
- package/src/scripts/ai_council/mid_flight_fallback.ts +295 -0
- package/src/scripts/ai_council/orchestrator.ts +251 -292
- package/src/scripts/ai_council/py_parity.ts +139 -0
- package/src/scripts/ai_council/response_render.ts +99 -0
- package/src/scripts/ai_council/spend_gate.ts +123 -0
- package/src/scripts/ai_council/transport_resolver.ts +81 -13
- package/src/scripts/bench_hook_injection.ts +100 -6
- package/src/scripts/bench_hook_latency.ts +442 -16
- package/src/scripts/check_estate_count.ts +924 -0
- package/src/scripts/compile_hook_manifest.ts +67 -0
- package/src/scripts/council_cli.ts +100 -125
- package/src/scripts/decision_memo.ts +325 -0
- package/src/scripts/dispatch_r2_reviewer.ts +169 -15
- package/src/scripts/hook_manifest.json +1 -0
- package/src/scripts/hook_manifest.yaml +172 -25
- package/src/scripts/hooks/concern_registry.ts +6 -0
- package/src/scripts/hooks/dispatch_hook.ts +183 -10
- package/src/scripts/hooks/dispatch_issues.ts +26 -0
- package/src/scripts/hooks/end_review_nudge_hook.ts +97 -24
- package/src/scripts/hooks/hook_stdin.ts +111 -5
- package/src/scripts/hooks/injection_budget.ts +595 -0
- package/src/scripts/hooks/payload_stub.ts +446 -0
- package/src/scripts/hooks/run_continuation_hook.ts +627 -0
- package/src/scripts/hooks/session_eol_hook.ts +52 -0
- package/src/scripts/hooks/skill_route_hook.ts +172 -11
- package/src/scripts/hooks/telemetry_usage_hook.ts +339 -0
- package/src/scripts/hooks/tool_result_bytes_hook.ts +27 -0
- package/src/scripts/hooks/turn_end_gate_hook.ts +45 -7
- package/src/scripts/hooks_doctor.ts +16 -2
- package/src/scripts/install-hooks.sh +26 -0
- package/src/scripts/interruption_report.ts +330 -13
- package/src/scripts/lint_hook_manifest.ts +167 -0
- package/src/scripts/roadmap_progress_hook.ts +254 -46
- package/src/scripts/run_supervise.ts +623 -0
- package/src/scripts/session_register_hook.ts +108 -8
- package/src/scripts/sessions_cli.ts +18 -6
- package/src/scripts/telemetry_disclosure_hook.ts +244 -0
- package/src/server/io/yamlIO.ts +167 -3
- package/src/shared/settingsConsent.ts +49 -2
- package/dist/cli-delegate/chunk-MMJL4TIX.js +0 -18
|
@@ -437,7 +437,13 @@ var _VALID_ACTIONS = /* @__PURE__ */ new Set([
|
|
|
437
437
|
"proceed",
|
|
438
438
|
"skip_necessity",
|
|
439
439
|
"block_quota",
|
|
440
|
-
"quorum_result"
|
|
440
|
+
"quorum_result",
|
|
441
|
+
// A seat lost its cli transport mid-pass and was retried on the metered
|
|
442
|
+
// api rung. Without this action, attendance analysis cannot tell a seat
|
|
443
|
+
// SAVED by the fallback from a seat that was natively api all along — the
|
|
444
|
+
// two are indistinguishable in the response set, and only one of them
|
|
445
|
+
// costs money that the operator did not plan.
|
|
446
|
+
"transport_fallback"
|
|
441
447
|
]);
|
|
442
448
|
var _KILL_SWITCH_ENV = "AGENT_CONFIG_NO_EVENTS_LOG";
|
|
443
449
|
var _HERE = fileURLToPath(import.meta.url);
|
|
@@ -2571,6 +2577,42 @@ var import_yaml = __toESM(require_dist(), 1);
|
|
|
2571
2577
|
import * as fs4 from "node:fs";
|
|
2572
2578
|
import * as os2 from "node:os";
|
|
2573
2579
|
import * as path4 from "node:path";
|
|
2580
|
+
|
|
2581
|
+
// src/scripts/ai_council/fallback_config.ts
|
|
2582
|
+
var SECOND_MODEL_PROVIDERS = /* @__PURE__ */ new Set([
|
|
2583
|
+
"anthropic",
|
|
2584
|
+
"openai",
|
|
2585
|
+
"gemini"
|
|
2586
|
+
]);
|
|
2587
|
+
function buildFallback(raw, d) {
|
|
2588
|
+
if (!d.isDict(raw)) return { api_on_quota: false };
|
|
2589
|
+
const v = raw["api_on_quota"];
|
|
2590
|
+
if (v === void 0) return { api_on_quota: false };
|
|
2591
|
+
if (!d.isBool(v)) {
|
|
2592
|
+
throw d.error(
|
|
2593
|
+
`\`fallback.api_on_quota\`=${d.repr(v)} must be a boolean (got ${d.typeName(v)}).`
|
|
2594
|
+
);
|
|
2595
|
+
}
|
|
2596
|
+
return { api_on_quota: v };
|
|
2597
|
+
}
|
|
2598
|
+
function buildSecondModel(entry, cls, locked, d) {
|
|
2599
|
+
if (!("second_model" in entry)) return null;
|
|
2600
|
+
if (locked.has(cls)) {
|
|
2601
|
+
throw d.error(
|
|
2602
|
+
`decision_resolution.classes.${cls}.second_model=${d.repr(entry["second_model"])}: a second-model rung is not configurable for high-impact / user-required decisions \u2014 those classes are LOCKED to \`user\` (Iron Law) and never resolve on a model of any kind.`
|
|
2603
|
+
);
|
|
2604
|
+
}
|
|
2605
|
+
const raw = entry["second_model"];
|
|
2606
|
+
if (raw === null) return null;
|
|
2607
|
+
if (!(d.isStr(raw) && SECOND_MODEL_PROVIDERS.has(raw))) {
|
|
2608
|
+
throw d.error(
|
|
2609
|
+
`decision_resolution.classes.${cls}.second_model=${d.repr(raw)} not in ${d.sortedListRepr(SECOND_MODEL_PROVIDERS)} \u2014 the rung must be a provider whose local CLI runs under subscription auth, so a resolution can never become metered USD spend.`
|
|
2610
|
+
);
|
|
2611
|
+
}
|
|
2612
|
+
return raw;
|
|
2613
|
+
}
|
|
2614
|
+
|
|
2615
|
+
// src/scripts/ai_council/config.ts
|
|
2574
2616
|
var _VALID_PROVIDERS = /* @__PURE__ */ new Set([
|
|
2575
2617
|
"anthropic",
|
|
2576
2618
|
"openai",
|
|
@@ -2578,6 +2620,15 @@ var _VALID_PROVIDERS = /* @__PURE__ */ new Set([
|
|
|
2578
2620
|
"xai",
|
|
2579
2621
|
"perplexity"
|
|
2580
2622
|
]);
|
|
2623
|
+
var _FALLBACK_DEPS = {
|
|
2624
|
+
isDict: _isDict,
|
|
2625
|
+
isBool: _isBool,
|
|
2626
|
+
isStr: _isStr,
|
|
2627
|
+
repr: _pyRepr3,
|
|
2628
|
+
typeName: _pyTypeName,
|
|
2629
|
+
sortedListRepr: _sortedListRepr,
|
|
2630
|
+
error: (msg) => new CouncilConfigError(msg)
|
|
2631
|
+
};
|
|
2581
2632
|
var _RAW_KEY_PREFIXES = [
|
|
2582
2633
|
"sk-",
|
|
2583
2634
|
"sk-ant-",
|
|
@@ -2898,6 +2949,7 @@ function _build_config(raw, source_path) {
|
|
|
2898
2949
|
const quorum_min_present = _build_quorum_min_present(
|
|
2899
2950
|
_get(raw, "quorum_min_present", SOLO_FLOOR_MIN_PRESENT)
|
|
2900
2951
|
);
|
|
2952
|
+
const fallback = buildFallback(_get(raw, "fallback", {}), _FALLBACK_DEPS);
|
|
2901
2953
|
const necessity_classifier = _build_necessity_classifier(
|
|
2902
2954
|
_asDict(_getOr(raw, "necessity_classifier", {}))
|
|
2903
2955
|
);
|
|
@@ -2947,6 +2999,7 @@ function _build_config(raw, source_path) {
|
|
|
2947
2999
|
cli_call_budget,
|
|
2948
3000
|
quorum,
|
|
2949
3001
|
quorum_min_present,
|
|
3002
|
+
fallback,
|
|
2950
3003
|
necessity_classifier,
|
|
2951
3004
|
model_downgrade,
|
|
2952
3005
|
debate,
|
|
@@ -3237,7 +3290,13 @@ function _build_decision_resolution(d) {
|
|
|
3237
3290
|
`decision_resolution.classes.${cls}.confidence_threshold must be in [0.0, 1.0] (got ${_pyRepr3(_f(threshold))}).`
|
|
3238
3291
|
);
|
|
3239
3292
|
}
|
|
3240
|
-
|
|
3293
|
+
const second_model = buildSecondModel(
|
|
3294
|
+
entry_raw,
|
|
3295
|
+
cls,
|
|
3296
|
+
_LOCKED_IMPACT_CLASSES,
|
|
3297
|
+
_FALLBACK_DEPS
|
|
3298
|
+
);
|
|
3299
|
+
classes.set(cls, { mode, confidence_threshold: threshold, second_model });
|
|
3241
3300
|
}
|
|
3242
3301
|
const fast_path_raw = _getOr(d, "fast_path", {});
|
|
3243
3302
|
if (!_isDict(fast_path_raw)) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
readHookStdin
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-F7DQWYR5.js";
|
|
5
5
|
import {
|
|
6
6
|
load_agent_settings
|
|
7
7
|
} from "./chunk-NLP54U3J.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
2
2
|
import {
|
|
3
3
|
readHookStdin
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-F7DQWYR5.js";
|
|
5
5
|
import {
|
|
6
6
|
validateAssumption
|
|
7
7
|
} from "./chunk-ZPSXJTLI.js";
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
frontmatterPaths,
|
|
23
23
|
proseEqual,
|
|
24
24
|
splitFrontmatter
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-3UCJWMMP.js";
|
|
26
26
|
import "./chunk-FTAISGDQ.js";
|
|
27
27
|
import {
|
|
28
28
|
atomic_write_json,
|
|
@@ -33,7 +33,7 @@ import "./chunk-Q26HT4QT.js";
|
|
|
33
33
|
import {
|
|
34
34
|
projectStoreSlug,
|
|
35
35
|
resolveSessionRole
|
|
36
|
-
} from "./chunk-
|
|
36
|
+
} from "./chunk-FBKL6JWT.js";
|
|
37
37
|
import "./chunk-PZWRPRWP.js";
|
|
38
38
|
import "./chunk-M2DPGFZ4.js";
|
|
39
39
|
import {
|
|
@@ -1620,14 +1620,26 @@ function untrackedNonDocFiles(cwd) {
|
|
|
1620
1620
|
return [];
|
|
1621
1621
|
}
|
|
1622
1622
|
}
|
|
1623
|
+
var BINARY_PROBE_BYTES = 8e3;
|
|
1624
|
+
var UNTRACKED_FILE_READ_CAP_BYTES = 8 * 1024 * 1024;
|
|
1623
1625
|
function untrackedFileLineCount(cwd, relPath) {
|
|
1624
1626
|
try {
|
|
1625
|
-
const
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1627
|
+
const abs = path5.resolve(cwd, relPath);
|
|
1628
|
+
const size = fs5.statSync(abs).size;
|
|
1629
|
+
if (size === 0) return 0;
|
|
1630
|
+
if (size > UNTRACKED_FILE_READ_CAP_BYTES) {
|
|
1631
|
+
return MUTATION_LINE_THRESHOLD + 1;
|
|
1632
|
+
}
|
|
1633
|
+
const buf = fs5.readFileSync(abs);
|
|
1634
|
+
if (buf.length === 0) return 0;
|
|
1635
|
+
const probe = buf.subarray(0, Math.min(buf.length, BINARY_PROBE_BYTES));
|
|
1636
|
+
if (probe.includes(0)) return 0;
|
|
1637
|
+
let lines = 0;
|
|
1638
|
+
for (const byte of buf) {
|
|
1639
|
+
if (byte === 10) lines += 1;
|
|
1640
|
+
}
|
|
1641
|
+
if (buf[buf.length - 1] !== 10) lines += 1;
|
|
1642
|
+
return lines;
|
|
1631
1643
|
} catch {
|
|
1632
1644
|
return 0;
|
|
1633
1645
|
}
|
|
@@ -2728,8 +2740,11 @@ function main7() {
|
|
|
2728
2740
|
dispatchOpen ? null : detectPromissory(lastAssistant),
|
|
2729
2741
|
detectLanguage(lastAssistant, readLanguagePin(workspaceRoot)),
|
|
2730
2742
|
detectUnverifiedEdit(toolCalls),
|
|
2731
|
-
// Round 7 § Phase 1 — detector D
|
|
2732
|
-
//
|
|
2743
|
+
// Round 7 § Phase 1 — detector D. It is NOT unconditional, and this
|
|
2744
|
+
// comment said it was while sitting one line above the `dispatchOpen`
|
|
2745
|
+
// ternary that conditions it: A and D are both excused by an open
|
|
2746
|
+
// dispatch, per the note at the top of this loop. Corrected 2026-08-18.
|
|
2747
|
+
// It shipped with its own settings flag one commit earlier
|
|
2733
2748
|
// and that flag is gone: `hooks.turn_end_gate.*` was deleted on
|
|
2734
2749
|
// 2026-08-12 because a default-off safety gate is an absent one. Its
|
|
2735
2750
|
// gating is where the comment above says gating belongs — inside the
|
|
@@ -66,11 +66,11 @@ import {
|
|
|
66
66
|
_wizard_state_path,
|
|
67
67
|
main,
|
|
68
68
|
shutilWhich
|
|
69
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-3UCJWMMP.js";
|
|
70
70
|
import "./chunk-FTAISGDQ.js";
|
|
71
71
|
import "./chunk-EJITJBJX.js";
|
|
72
72
|
import "./chunk-Q26HT4QT.js";
|
|
73
|
-
import "./chunk-
|
|
73
|
+
import "./chunk-FBKL6JWT.js";
|
|
74
74
|
import "./chunk-PZWRPRWP.js";
|
|
75
75
|
import "./chunk-M2DPGFZ4.js";
|
|
76
76
|
import "./chunk-63WSP6YZ.js";
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
derive_session_tag,
|
|
5
5
|
list_sessions,
|
|
6
6
|
read_entries
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-PKOBQADP.js";
|
|
8
8
|
import {
|
|
9
9
|
RECYCLE_CONSUMED_REL,
|
|
10
10
|
RECYCLE_ENVELOPE_REL,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
import "./chunk-UEZ7D35A.js";
|
|
16
16
|
import {
|
|
17
17
|
readHookStdin
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-F7DQWYR5.js";
|
|
19
19
|
import {
|
|
20
20
|
hasBoundaryMarker,
|
|
21
21
|
scanEnvelopeDirectives,
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
_RAW_KEY_PREFIXES,
|
|
27
27
|
hardenedSpawnEnv,
|
|
28
28
|
projectStoreSlug
|
|
29
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-FBKL6JWT.js";
|
|
30
30
|
import "./chunk-PZWRPRWP.js";
|
|
31
31
|
import "./chunk-NLP54U3J.js";
|
|
32
32
|
import "./chunk-NDJLNC6Q.js";
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { createRequire as __acCreateRequire } from 'node:module'; const require = globalThis.require ?? __acCreateRequire(import.meta.url);
|
|
3
3
|
import {
|
|
4
4
|
read_entries
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-PKOBQADP.js";
|
|
6
6
|
import "./chunk-UEZ7D35A.js";
|
|
7
|
-
import "./chunk-
|
|
7
|
+
import "./chunk-F7DQWYR5.js";
|
|
8
8
|
import {
|
|
9
9
|
match_prompt
|
|
10
10
|
} from "./chunk-LF2KKJ4Q.js";
|
|
@@ -47,8 +47,9 @@ function replaceScalar(template, dottedPath, value) {
|
|
|
47
47
|
if (dottedPath.length === 0) return template;
|
|
48
48
|
const sections = dottedPath.slice(0, -1);
|
|
49
49
|
const key = dottedPath[dottedPath.length - 1];
|
|
50
|
-
const targetIndent = " ".repeat(sections.length);
|
|
51
50
|
const lines = template.split("\n");
|
|
51
|
+
const width = detectIndentWidth(lines);
|
|
52
|
+
const targetIndent = " ".repeat(width * sections.length);
|
|
52
53
|
const currentPath = new Array(sections.length).fill(null);
|
|
53
54
|
const formatted = formatScalar(value);
|
|
54
55
|
for (let i = 0; i < lines.length; i++) {
|
|
@@ -57,8 +58,8 @@ function replaceScalar(template, dottedPath, value) {
|
|
|
57
58
|
const stripped = line.trim();
|
|
58
59
|
if (stripped === "" || stripped.startsWith("#")) continue;
|
|
59
60
|
const indentLen = line.length - line.trimStart().length;
|
|
60
|
-
if (indentLen %
|
|
61
|
-
const level = indentLen /
|
|
61
|
+
if (indentLen % width !== 0) continue;
|
|
62
|
+
const level = indentLen / width;
|
|
62
63
|
if (level > sections.length) continue;
|
|
63
64
|
const m = /^([A-Za-z_][A-Za-z0-9_]*)\s*:/.exec(stripped);
|
|
64
65
|
if (!m) continue;
|
|
@@ -81,6 +82,19 @@ function replaceScalar(template, dottedPath, value) {
|
|
|
81
82
|
}
|
|
82
83
|
return template;
|
|
83
84
|
}
|
|
85
|
+
function detectIndentWidth(lines) {
|
|
86
|
+
let min = 0;
|
|
87
|
+
for (const line of lines) {
|
|
88
|
+
const trimmed = line.trim();
|
|
89
|
+
if (trimmed === "" || trimmed.startsWith("#") || trimmed.startsWith("-")) continue;
|
|
90
|
+
if (line.startsWith(" ")) continue;
|
|
91
|
+
const indentLen = line.length - line.trimStart().length;
|
|
92
|
+
if (indentLen === 0) continue;
|
|
93
|
+
if (!/^[A-Za-z_][\w.-]*\s*:/.test(trimmed)) continue;
|
|
94
|
+
if (min === 0 || indentLen < min) min = indentLen;
|
|
95
|
+
}
|
|
96
|
+
return min === 0 ? 2 : min;
|
|
97
|
+
}
|
|
84
98
|
function mergeIntoTemplate(templateBody, newValues) {
|
|
85
99
|
let body = templateBody;
|
|
86
100
|
const appended = [];
|
|
@@ -7247,7 +7247,7 @@
|
|
|
7247
7247
|
},
|
|
7248
7248
|
{
|
|
7249
7249
|
"category": "rule",
|
|
7250
|
-
"checksum": "sha256:
|
|
7250
|
+
"checksum": "sha256:eb7b748bf10ecbf3db0ad99d967d800dccf0d92bd25849f0133043b2dd9c5d3a",
|
|
7251
7251
|
"install": {
|
|
7252
7252
|
"default": true,
|
|
7253
7253
|
"removable": false
|
|
@@ -13075,7 +13075,7 @@
|
|
|
13075
13075
|
},
|
|
13076
13076
|
{
|
|
13077
13077
|
"category": "skill",
|
|
13078
|
-
"checksum": "sha256:
|
|
13078
|
+
"checksum": "sha256:c3931817f7dad3dcca3dd97971181dd42bbfa104783d2186f091bc7d9fc21794",
|
|
13079
13079
|
"install": {
|
|
13080
13080
|
"default": true,
|
|
13081
13081
|
"removable": false
|
|
@@ -14434,7 +14434,7 @@
|
|
|
14434
14434
|
"workspaces": []
|
|
14435
14435
|
}
|
|
14436
14436
|
],
|
|
14437
|
-
"checksum": "sha256:
|
|
14437
|
+
"checksum": "sha256:ebb8ea9f229d02a7600a7b9d4da6b9bc6d4025af3e92fb900ef1d369e978ffba",
|
|
14438
14438
|
"deprecations": [
|
|
14439
14439
|
{
|
|
14440
14440
|
"key": "tier",
|
|
@@ -14578,7 +14578,7 @@
|
|
|
14578
14578
|
"reason": "scaffold template for ticket-bundle tickets (ADR-101); carries no runtime frontmatter — emit-tickets fills it in per ticket"
|
|
14579
14579
|
}
|
|
14580
14580
|
],
|
|
14581
|
-
"generated_at": "2026-08-
|
|
14581
|
+
"generated_at": "2026-08-19T14:19:48Z",
|
|
14582
14582
|
"packs": [
|
|
14583
14583
|
{
|
|
14584
14584
|
"artefact_count": 118,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
ab7bba118ad6f38ec502bf10341186cb287c991cbb8347e7f06aaea864f6542e discovery-manifest.json
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"checksum": "sha256:
|
|
3
|
-
"generated_at": "2026-08-
|
|
2
|
+
"checksum": "sha256:ebb8ea9f229d02a7600a7b9d4da6b9bc6d4025af3e92fb900ef1d369e978ffba",
|
|
3
|
+
"generated_at": "2026-08-19T14:19:48Z",
|
|
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:ebb8ea9f229d02a7600a7b9d4da6b9bc6d4025af3e92fb900ef1d369e978ffba",
|
|
3
|
+
"generated_at": "2026-08-19T14:19:48Z",
|
|
4
4
|
"scanner_version": "de0a22b4ac4c",
|
|
5
5
|
"workspaces": [
|
|
6
6
|
{
|