@event4u/agent-config 17.0.0 → 17.2.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/.augment-plugin/marketplace.json +3 -3
- package/.augment-plugin/plugin.json +1 -1
- package/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +157 -468
- package/README.md +4 -3
- package/dist/agent-src/commands/project/analyze.md +9 -6
- package/dist/agent-src/commands/project/map.md +58 -0
- package/dist/agent-src/commands/project.md +5 -3
- package/dist/agent-src/contexts/execution/host-capability-manifest.md +5 -3
- package/dist/agent-src/skills/code-intelligence/SKILL.md +6 -0
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/roadmaps.md +5 -1
- package/dist/cli/registry.js +1 -1
- package/dist/cli-delegate/{chunk-IROAQ77A.js → chunk-3PK3VZHB.js} +107 -9
- package/dist/cli-delegate/{chunk-2SFOOFJJ.js → chunk-BZJ4Y3CI.js} +1 -1
- package/dist/cli-delegate/{chunk-CAL76ADI.js → chunk-CMZEKSNN.js} +52 -10
- package/dist/cli-delegate/{chunk-ESUNQ5XR.js → chunk-E3CFULNX.js} +22 -4
- package/dist/cli-delegate/{chunk-GOMILC3O.js → chunk-QBHEI5N4.js} +4 -3
- package/dist/cli-delegate/{chunk-SIOMDAKL.js → chunk-VYZGJLCA.js} +29 -39
- package/dist/cli-delegate/chunk-W5JXMF2T.js +77 -0
- package/dist/cli-delegate/{chunk-4SHNERBL.js → chunk-XIAPY44N.js} +1 -1
- package/dist/cli-delegate/{chunk-JHMMWNJ2.js → chunk-YHAPONWV.js} +1 -1
- package/dist/cli-delegate/cmd_conformance.js +32 -47
- package/dist/cli-delegate/cmd_doctor.js +4 -4
- package/dist/cli-delegate/cmd_doctor_neighbours.js +2 -2
- package/dist/cli-delegate/cmd_explain.js +1 -1
- package/dist/cli-delegate/cmd_export.js +6 -6
- package/dist/cli-delegate/cmd_fleet.js +3 -3
- package/dist/cli-delegate/cmd_preflight.js +3 -3
- package/dist/cli-delegate/cmd_prune.js +6 -6
- package/dist/cli-delegate/cmd_settings_migrate.js +6 -6
- package/dist/cli-delegate/cmd_settings_set.js +1 -1
- package/dist/cli-delegate/cmd_sync.js +6 -6
- package/dist/cli-delegate/cmd_uninstall.js +6 -6
- package/dist/cli-delegate/cmd_update.js +9 -13
- package/dist/cli-delegate/cmd_validate.js +6 -6
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +41 -15
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/dormancy-report.md +1 -1
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +6 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +5 -4
- package/dist/hooks/dispatch.js +163 -148
- package/dist/hooks/dispatch.sha256 +1 -1
- package/dist/hooks/instructions_observer.chunk.cjs +301 -0
- package/dist/hooks/instructions_observer.chunk.cjs.sha256 +1 -0
- package/dist/install/claudeRuleRewrite.js +10 -3
- package/dist/install/conflict.js +24 -2
- package/dist/install/conflictTracker.js +14 -3
- package/dist/install/install.mjs +222 -117
- package/dist/install/installThinLayer.js +1 -0
- package/dist/install/loggedWrites.js +142 -0
- package/dist/install/paths.js +12 -2
- package/dist/install/preserve.js +25 -4
- package/dist/install/txlog.js +10 -6
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +33595 -22916
- package/dist/scripts/_lib/egress_rules.js +4 -1
- package/dist/scripts/_lib/identifier_redaction.js +35 -2
- package/dist/scripts/ai_council/seat_policy.js +7 -1
- package/dist/server/schemas/settings.js +1 -1
- package/package.json +4 -1
- package/src/config/ci-local-parity.yml +1 -1
- package/src/config/continuity-surface.json +7 -0
- package/src/config/evaluator-budgets.json +4 -4
- package/src/config/gate-coverage.yml +27 -7
- package/src/config/gate-violation-baselines.json +9 -3
- package/src/config/gitignore-block.txt +6 -0
- package/src/config/hook-bundle-budget.json +19 -4
- package/src/config/hook-token-budget.json +1 -1
- package/src/config/packed-binary-manifest.json +27 -0
- package/src/config/production-entries.json +18 -0
- package/src/config/release-gate-locality.yml +0 -7
- package/src/config/skill-body-budget.json +7 -1
- package/src/install/claudeRuleRewrite.ts +10 -1
- package/src/install/conflict.ts +24 -1
- package/src/install/conflictTracker.ts +18 -2
- package/src/install/installThinLayer.ts +6 -0
- package/src/install/loggedWrites.ts +148 -0
- package/src/install/paths.ts +11 -2
- package/src/install/preserve.ts +40 -4
- package/src/install/txlog.ts +10 -6
- package/src/scripts/_cli/cmd_conformance.ts +3 -2
- package/src/scripts/_cli/cmd_update.ts +15 -17
- package/src/scripts/_lib/bench_ab_complexity.ts +14 -2
- package/src/scripts/_lib/collector_record.ts +1 -0
- package/src/scripts/_lib/council_settings_block.ts +9 -2
- package/src/scripts/_lib/egress_rules.ts +4 -1
- package/src/scripts/_lib/host_capability.ts +10 -5
- package/src/scripts/_lib/identifier_redaction.ts +38 -2
- package/src/scripts/_lib/price_freshness.ts +112 -0
- package/src/scripts/_lib/production_reach.ts +194 -0
- package/src/scripts/_lib/quota_parked.ts +17 -28
- package/src/scripts/_lib/release_findings_ingest.ts +13 -335
- package/src/scripts/_lib/runtime_journal.ts +7 -7
- package/src/scripts/_lib/tier_downshift_verdict.ts +81 -35
- package/src/scripts/ai_council/chairman.ts +5 -2
- package/src/scripts/ai_council/clients.ts +4 -3
- package/src/scripts/ai_council/free_hand_shadow.ts +24 -12
- package/src/scripts/ai_council/free_route_catalog.ts +142 -5
- package/src/scripts/ai_council/free_route_client.ts +4 -0
- package/src/scripts/ai_council/hand_payload.ts +115 -7
- package/src/scripts/ai_council/orchestrator.ts +7 -10
- package/src/scripts/ai_council/route_chooser.ts +1 -1
- package/src/scripts/ai_council/route_member.ts +66 -4
- package/src/scripts/ai_council/seat_policy.ts +8 -1
- package/src/scripts/ai_council/self_hosted_probe.ts +327 -0
- package/src/scripts/ai_council/status_surface.ts +2 -0
- package/src/scripts/ask_transport.ts +137 -15
- package/src/scripts/check_finding_dispositions.ts +25 -71
- package/src/scripts/check_release_pr_shape.ts +3 -3
- package/src/scripts/check_step_production_reach.ts +257 -0
- package/src/scripts/code_graph/build.ts +210 -10
- package/src/scripts/code_graph/cli.ts +168 -46
- package/src/scripts/code_graph/detect.ts +5 -4
- package/src/scripts/code_graph/docs_layer.ts +57 -0
- package/src/scripts/code_graph/extract.ts +58 -13
- package/src/scripts/code_graph/extract_more.ts +314 -0
- package/src/scripts/code_graph/laravel_overlay.ts +454 -0
- package/src/scripts/code_graph/map.ts +846 -0
- package/src/scripts/code_graph/map_model.ts +977 -0
- package/src/scripts/code_graph/map_verify.ts +140 -0
- package/src/scripts/code_graph/map_viewer/viewer.css +278 -0
- package/src/scripts/code_graph/map_viewer/viewer.js +756 -0
- package/src/scripts/code_graph/scip_reader.ts +201 -0
- package/src/scripts/code_graph/sqlite_store.ts +8 -1
- package/src/scripts/code_graph/types.ts +81 -15
- package/src/scripts/code_graph/validate.ts +16 -26
- package/src/scripts/code_graph/verbs.ts +7 -0
- package/src/scripts/council_cli.ts +10 -8
- package/src/scripts/hook_chunks.mjs +7 -0
- package/src/scripts/hook_manifest.json +1 -1
- package/src/scripts/hook_manifest.yaml +23 -0
- package/src/scripts/hooks/dispatch_hook.ts +4 -4
- package/src/scripts/hooks/instructions_observer_hook.ts +25 -6
- package/src/scripts/hooks/lazy_concern.ts +4 -0
- package/src/scripts/hooks/payload_stub.ts +27 -0
- package/src/scripts/hooks/spawn_guard_shadow_hook.ts +29 -70
- package/src/scripts/hooks/subagent_ledger_hook.ts +80 -0
- package/src/scripts/install-hooks.sh +5 -0
- package/src/scripts/install.ts +2 -2
- package/src/scripts/lint_agents_layout.ts +2 -0
- package/src/scripts/lint_decision_classes.ts +34 -0
- package/src/scripts/lint_hook_manifest.ts +25 -0
- package/src/scripts/lint_roadmap_blockers.ts +52 -3
- package/src/scripts/mcp_server/consumer_tool_catalog.json +53 -6
- package/src/scripts/mcp_server/graph_tools.ts +73 -1
- package/src/scripts/mcp_server/tools.ts +19 -36
- package/src/scripts/release.ts +5 -9
- package/src/scripts/release_drill.ts +11 -165
- package/src/scripts/release_publication.ts +0 -9
- package/src/scripts/report_production_reach.ts +35 -0
- package/src/scripts/worker_reuse_shadow_report.ts +399 -1
- package/src/server/schemas/settings.ts +1 -1
- package/src/vendor/grammars/README.md +10 -5
- package/src/vendor/grammars/tree-sitter-go.wasm +0 -0
- package/src/vendor/grammars/tree-sitter-java.wasm +0 -0
- package/src/vendor/grammars/tree-sitter-python.wasm +0 -0
- package/dist/cli-delegate/chunk-A4QJ6ENT.js +0 -50
- /package/dist/cli-delegate/{chunk-E6XNBVE4.js → chunk-KR5ZIFPO.js} +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The install transaction log read as an ownership record.
|
|
3
|
+
*
|
|
4
|
+
* WHY. The writer preserves any managed file it cannot prove is still the bytes
|
|
5
|
+
* it wrote. For a file deployed before the ownership ledger recorded digests,
|
|
6
|
+
* the ledger has nothing to compare against, so EVERY such file was preserved
|
|
7
|
+
* and a sidecar staged beside it — thousands of them on one upgrade, all
|
|
8
|
+
* untouched. Worse, the ledger then records the staged digest for each target,
|
|
9
|
+
* so the next run calls the same untouched file "user-modified".
|
|
10
|
+
*
|
|
11
|
+
* The proof was on disk the whole time. `src/scripts/install.ts` appends a
|
|
12
|
+
* `write` entry carrying the SHA-256 of the target's bytes immediately after
|
|
13
|
+
* every copy. A file whose bytes equal a digest the log records this installer
|
|
14
|
+
* writing to that exact path is the installer's own output, unedited. A path
|
|
15
|
+
* with no matching record keeps the existing answer. WHEN that proof may decide
|
|
16
|
+
* is narrower than "whenever it matches" — see `decideDeployWrite`.
|
|
17
|
+
*
|
|
18
|
+
* WHAT IS READ. The active log and every rotated sibling, plain or gzipped
|
|
19
|
+
* (`txlog.ts` rotates at 10 MB or 30 days, and the gzip step can leave both
|
|
20
|
+
* forms behind). An unreadable or truncated file contributes nothing — the
|
|
21
|
+
* failure direction is "no proof", which preserves.
|
|
22
|
+
*
|
|
23
|
+
* COST. Parsed per FILE and cached on that file's size and mtime. A rotated
|
|
24
|
+
* archive never changes, so only the active log is re-read when it grows — and
|
|
25
|
+
* an install appends to it after every file it touches, so a cache keyed on the
|
|
26
|
+
* whole set would re-parse the entire history once per candidate.
|
|
27
|
+
*/
|
|
28
|
+
import { gunzipSync } from 'node:zlib';
|
|
29
|
+
import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from 'node:fs';
|
|
30
|
+
import { basename, dirname, join, relative, resolve, sep } from 'node:path';
|
|
31
|
+
import { getLogPath } from './paths.js';
|
|
32
|
+
const WRITE_MARKER = '"kind":"write"';
|
|
33
|
+
const fileCache = new Map();
|
|
34
|
+
const dirRealpaths = new Map();
|
|
35
|
+
/**
|
|
36
|
+
* One canonical spelling for a path: its directory realpath'd, its basename
|
|
37
|
+
* kept. Both the log keys and the queries go through it, so `/var/…` and its
|
|
38
|
+
* macOS realpath twin meet. The directory is realpath'd rather than the file
|
|
39
|
+
* because the file may not exist, and is memoised because a log names a few
|
|
40
|
+
* hundred directories across tens of thousands of entries.
|
|
41
|
+
*/
|
|
42
|
+
export function canonicalPath(p) {
|
|
43
|
+
const abs = resolve(p);
|
|
44
|
+
const dir = dirname(abs);
|
|
45
|
+
let real = dirRealpaths.get(dir);
|
|
46
|
+
if (real === undefined) {
|
|
47
|
+
try {
|
|
48
|
+
real = realpathSync(dir);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
real = dir;
|
|
52
|
+
}
|
|
53
|
+
dirRealpaths.set(dir, real);
|
|
54
|
+
}
|
|
55
|
+
return join(real, basename(abs));
|
|
56
|
+
}
|
|
57
|
+
/** The active log plus its rotated siblings, sorted by name. */
|
|
58
|
+
function logFiles(logPath) {
|
|
59
|
+
const dir = dirname(logPath);
|
|
60
|
+
if (!existsSync(dir))
|
|
61
|
+
return [];
|
|
62
|
+
const stem = basename(logPath).replace(/\.jsonl$/, '');
|
|
63
|
+
try {
|
|
64
|
+
return readdirSync(dir)
|
|
65
|
+
.filter((n) => n.startsWith(stem) && (n.endsWith('.jsonl') || n.endsWith('.jsonl.gz')))
|
|
66
|
+
.map((n) => join(dir, n))
|
|
67
|
+
.sort();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function writesIn(file) {
|
|
74
|
+
let stamp;
|
|
75
|
+
try {
|
|
76
|
+
const st = statSync(file);
|
|
77
|
+
stamp = `${st.size}:${Math.trunc(st.mtimeMs)}`;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
const cached = fileCache.get(file);
|
|
83
|
+
if (cached !== undefined && cached.stamp === stamp)
|
|
84
|
+
return cached.entries;
|
|
85
|
+
let text = '';
|
|
86
|
+
try {
|
|
87
|
+
const raw = readFileSync(file);
|
|
88
|
+
text = (file.endsWith('.gz') ? gunzipSync(raw) : raw).toString('utf8');
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
text = '';
|
|
92
|
+
}
|
|
93
|
+
const entries = [];
|
|
94
|
+
for (const line of text.split('\n')) {
|
|
95
|
+
if (!line.includes(WRITE_MARKER))
|
|
96
|
+
continue;
|
|
97
|
+
let entry;
|
|
98
|
+
try {
|
|
99
|
+
entry = JSON.parse(line);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (typeof entry.path !== 'string' || typeof entry.sha256 !== 'string' || entry.sha256 === '')
|
|
105
|
+
continue;
|
|
106
|
+
entries.push([canonicalPath(entry.path), entry.sha256]);
|
|
107
|
+
}
|
|
108
|
+
fileCache.set(file, { stamp, entries });
|
|
109
|
+
return entries;
|
|
110
|
+
}
|
|
111
|
+
/** Every `write` the transaction log records, keyed by canonical path. */
|
|
112
|
+
export function loggedWriteDigests(logPath = getLogPath()) {
|
|
113
|
+
const writes = new Map();
|
|
114
|
+
for (const file of logFiles(logPath)) {
|
|
115
|
+
for (const [target, sha] of writesIn(file)) {
|
|
116
|
+
let set = writes.get(target);
|
|
117
|
+
if (set === undefined)
|
|
118
|
+
writes.set(target, (set = new Set()));
|
|
119
|
+
set.add(sha);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return writes;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Wrap a log writer so it records only paths this run's copy deploys.
|
|
126
|
+
*
|
|
127
|
+
* The claude-code rewrite and thinning passes walk the whole rule directory,
|
|
128
|
+
* including rules the user authored there; logging those rewrites would make
|
|
129
|
+
* the log vouch for content that was never the package's.
|
|
130
|
+
*/
|
|
131
|
+
export function onlyDeployed(anchor, currentFiles, log) {
|
|
132
|
+
return (target) => {
|
|
133
|
+
const rel = relative(resolve(anchor), resolve(target)).split(sep).join('/');
|
|
134
|
+
if (currentFiles.has(rel))
|
|
135
|
+
log(target);
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/** Did this installer write exactly `onDiskSha256` to `target`? */
|
|
139
|
+
export function wroteTheseBytes(target, onDiskSha256, writes) {
|
|
140
|
+
return writes.get(canonicalPath(target))?.has(onDiskSha256) === true;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=loggedWrites.js.map
|
package/dist/install/paths.js
CHANGED
|
@@ -61,12 +61,22 @@ export function getInstallRoot(home) {
|
|
|
61
61
|
return join(resolveHome(home), INSTALL_ROOT_SUBPATH);
|
|
62
62
|
}
|
|
63
63
|
/**
|
|
64
|
-
* Absolute path to the active transaction log:
|
|
65
|
-
*
|
|
64
|
+
* Absolute path to the active transaction log: `install-log.jsonl` in
|
|
65
|
+
* `$EVENT4U_CONFIG_HOME` when that is set and no explicit `home` is given,
|
|
66
|
+
* otherwise in `~/.event4u/agent-config/`.
|
|
66
67
|
*
|
|
67
68
|
* Phase A4 writers append here on every successful atomic rename.
|
|
69
|
+
*
|
|
70
|
+
* Without the variable, the hermetic test environment — which sets only that
|
|
71
|
+
* variable — appended every test install to the real user's log, and the log
|
|
72
|
+
* is now read back as ownership proof. A history written under the other root
|
|
73
|
+
* before a user switched roots is not read; the failure direction is "no
|
|
74
|
+
* proof", which preserves.
|
|
68
75
|
*/
|
|
69
76
|
export function getLogPath(home) {
|
|
77
|
+
const configHome = home ? undefined : process.env['EVENT4U_CONFIG_HOME'];
|
|
78
|
+
if (configHome)
|
|
79
|
+
return join(configHome, INSTALL_LOG_FILENAME);
|
|
70
80
|
return join(getInstallRoot(home), INSTALL_LOG_FILENAME);
|
|
71
81
|
}
|
|
72
82
|
/**
|
package/dist/install/preserve.js
CHANGED
|
@@ -80,7 +80,7 @@ export const EXIT_COMPLETED_WITH_CONFLICTS = 3;
|
|
|
80
80
|
* behaviour stands rather than being changed on a case nobody reasoned about.
|
|
81
81
|
*/
|
|
82
82
|
export function isLedgerMigration(inputs) {
|
|
83
|
-
if (!inputs.exists || inputs.force)
|
|
83
|
+
if (!inputs.exists || inputs.force || inputs.loggedWrite === true)
|
|
84
84
|
return false;
|
|
85
85
|
if (inputs.ledgerListed !== true)
|
|
86
86
|
return false;
|
|
@@ -88,12 +88,31 @@ export function isLedgerMigration(inputs) {
|
|
|
88
88
|
return false;
|
|
89
89
|
return classifyOwnership(inputs.recordedSha256, inputs.onDiskSha256) === 'unknown';
|
|
90
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* May the transaction-log proof decide this target? Only where the verdict
|
|
93
|
+
* would otherwise be a preservation the record cannot justify: a ledger-listed
|
|
94
|
+
* file with no digest (the migration branch), or a `recorded-modified` file
|
|
95
|
+
* whose recorded digest is a staged one. Everywhere else the log is not read —
|
|
96
|
+
* the ledger alone already decides, and a genuine edit must stay preserved.
|
|
97
|
+
*/
|
|
98
|
+
export function logProofApplies(inputs) {
|
|
99
|
+
if (!inputs.exists || inputs.force || inputs.onDiskSha256 === null)
|
|
100
|
+
return false;
|
|
101
|
+
const ownership = classifyOwnership(inputs.recordedSha256, inputs.onDiskSha256);
|
|
102
|
+
if (ownership === 'recorded-modified')
|
|
103
|
+
return inputs.recordedIsStaged === true;
|
|
104
|
+
// `loggedWrite` is cleared because `isLedgerMigration` excludes a proven
|
|
105
|
+
// target, and this asks whether the target is a candidate BEFORE the proof.
|
|
106
|
+
return ownership === 'unknown' && isLedgerMigration({ ...inputs, loggedWrite: false });
|
|
107
|
+
}
|
|
91
108
|
/**
|
|
92
109
|
* Decide whether the writer may replace one managed file.
|
|
93
110
|
*
|
|
94
|
-
* A target that does not exist is written. A forced run writes.
|
|
95
|
-
*
|
|
96
|
-
*
|
|
111
|
+
* A target that does not exist is written. A forced run writes. A target whose
|
|
112
|
+
* bytes the transaction log records this installer writing there is written
|
|
113
|
+
* where {@link logProofApplies} — there is no edit to lose. Otherwise the
|
|
114
|
+
* recorded-ownership verdict decides:
|
|
115
|
+
* `recorded-modified` preserves, and `recorded-unchanged` writes.
|
|
97
116
|
*
|
|
98
117
|
* The `unknown` arm is the one worth stating out loud. No recorded digest
|
|
99
118
|
* means no divergence to measure — a tree with no manifest, a global anchor
|
|
@@ -118,6 +137,8 @@ export function decideDeployWrite(inputs) {
|
|
|
118
137
|
return 'write';
|
|
119
138
|
if (inputs.force)
|
|
120
139
|
return 'write';
|
|
140
|
+
if (inputs.loggedWrite === true && logProofApplies(inputs))
|
|
141
|
+
return 'write';
|
|
121
142
|
const ownership = classifyOwnership(inputs.recordedSha256, inputs.onDiskSha256);
|
|
122
143
|
if (ownership === 'recorded-modified')
|
|
123
144
|
return 'preserve';
|
package/dist/install/txlog.js
CHANGED
|
@@ -6,14 +6,18 @@
|
|
|
6
6
|
* nothing is un-written automatically. No PID lockfile (per Phase-A4
|
|
7
7
|
* decision 8).
|
|
8
8
|
*
|
|
9
|
-
* WHAT ACTUALLY WRITES THIS FILE
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* a `write`
|
|
14
|
-
*
|
|
9
|
+
* WHAT ACTUALLY WRITES THIS FILE: `src/server/routes/install.ts`'s
|
|
10
|
+
* recovery-dismiss handler appends a `rollback` marker with an empty path and a
|
|
11
|
+
* null hash; `src/scripts/install.ts`, through `_log_tx_entry`, appends a
|
|
12
|
+
* `write` or `skip` entry per path it copies, preserves or stages a sidecar
|
|
13
|
+
* for, and a `write` entry per deployed Claude rule the host-form rewrite and
|
|
14
|
+
* the thinning pass rewrite after the copy. All call `appendTxLog`, so the
|
|
15
15
|
* entry shape is identical by construction rather than by convention.
|
|
16
16
|
*
|
|
17
|
+
* WHAT READS IT: recovery (the active log only) and `./loggedWrites.ts`, which
|
|
18
|
+
* reads every `write` digest in the active log AND its rotated siblings as
|
|
19
|
+
* proof that bytes on disk are the installer's own output.
|
|
20
|
+
*
|
|
17
21
|
* Rotation: 10 MB OR 30 days, whichever first. Rotated copies move to
|
|
18
22
|
* `install-log.<ISO>.jsonl.gz` siblings; recovery never scans them.
|
|
19
23
|
*
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"discovery": {
|
|
3
|
-
"artefact_count":
|
|
3
|
+
"artefact_count": 637,
|
|
4
4
|
"scanner_version": "de0a22b4ac4c"
|
|
5
5
|
},
|
|
6
|
-
"generated_at": "2026-10-
|
|
6
|
+
"generated_at": "2026-10-23",
|
|
7
7
|
"package": {
|
|
8
8
|
"description": "Governed skills, rules and commands for AI coding tools (Claude Code, Cursor, Windsurf, Copilot) \u2014 every claim machine-checked, including the artifact counts in these badges.",
|
|
9
9
|
"homepage": "https://event4u-app.github.io/agent-config",
|
|
10
10
|
"name": "@event4u/agent-config",
|
|
11
11
|
"repository": "https://github.com/event4u-app/agent-config",
|
|
12
|
-
"version": "17.
|
|
12
|
+
"version": "17.2.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": "17.
|
|
12
|
+
"version": "17.2.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": "17.
|
|
19
|
+
"version": "17.2.0"
|
|
20
20
|
}
|