@dzhechkov/harness-core 0.4.2 → 0.4.4
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/.dz-manifest.json +104 -28
- package/README.md +15 -4
- package/dist/backlog.d.ts +35 -0
- package/dist/backlog.d.ts.map +1 -1
- package/dist/backlog.js +167 -3
- package/dist/backlog.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/loop-blobs.generated.d.ts.map +1 -1
- package/dist/loop-blobs.generated.js +1 -0
- package/dist/loop-blobs.generated.js.map +1 -1
- package/dist/loop-lint.d.ts +6 -2
- package/dist/loop-lint.d.ts.map +1 -1
- package/dist/loop-lint.js +54 -0
- package/dist/loop-lint.js.map +1 -1
- package/dist/loop-plan-graph.d.ts +49 -0
- package/dist/loop-plan-graph.d.ts.map +1 -0
- package/dist/loop-plan-graph.js +128 -0
- package/dist/loop-plan-graph.js.map +1 -0
- package/dist/loop-plan.d.ts +17 -0
- package/dist/loop-plan.d.ts.map +1 -1
- package/dist/loop-plan.js +18 -15
- package/dist/loop-plan.js.map +1 -1
- package/dist/loop-render.d.ts.map +1 -1
- package/dist/loop-render.js +8 -0
- package/dist/loop-render.js.map +1 -1
- package/dist/model-recommender.d.ts +91 -0
- package/dist/model-recommender.d.ts.map +1 -0
- package/dist/model-recommender.js +186 -0
- package/dist/model-recommender.js.map +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +4 -1
- package/dist/registry.js.map +1 -1
- package/dist/skills-verify.d.ts +40 -0
- package/dist/skills-verify.d.ts.map +1 -1
- package/dist/skills-verify.js +80 -10
- package/dist/skills-verify.js.map +1 -1
- package/dist/trace-bundle.d.ts +209 -0
- package/dist/trace-bundle.d.ts.map +1 -0
- package/dist/trace-bundle.js +601 -0
- package/dist/trace-bundle.js.map +1 -0
- package/dist/usage.d.ts +7 -0
- package/dist/usage.d.ts.map +1 -1
- package/dist/usage.js +30 -2
- package/dist/usage.js.map +1 -1
- package/package.json +18 -18
- package/sbom.json +217 -27
- package/src/backlog.ts +176 -3
- package/src/index.ts +3 -0
- package/src/loop-blobs.generated.ts +1 -0
- package/src/loop-lint.ts +55 -1
- package/src/loop-plan-graph.ts +132 -0
- package/src/loop-plan.ts +35 -15
- package/src/loop-render.ts +8 -0
- package/src/model-recommender.ts +228 -0
- package/src/registry.ts +4 -1
- package/src/skills-verify.ts +108 -10
- package/src/trace-bundle.ts +743 -0
- package/src/usage.ts +42 -2
- package/LICENSE +0 -21
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* model-recommender (backlog a9c3dd5c, function 3) — the PURE half of `dz routing recommend`.
|
|
3
|
+
*
|
|
4
|
+
* NOT a fifth analyzer (ADR-001 D1): this module HARVESTS per-stage (model → success) samples out of
|
|
5
|
+
* the harness's own workflow records (and imported run-meta sidecars) and hands them to the EXISTING
|
|
6
|
+
* `selectAutoCost` brain in routing-outcomes.ts — the same brain the `auto-cost` plan spec reads. The
|
|
7
|
+
* store that brain trusts (`.dz/routing-outcomes.json`) had never been fed before this feature.
|
|
8
|
+
*
|
|
9
|
+
* Honesty rules, load-bearing:
|
|
10
|
+
* - The ONLY grade a record carries is RUN-level. Attributing it to every stage's model is an
|
|
11
|
+
* INFERENCE, and the printed basis states the rule rather than implying it (ADR-001 D2).
|
|
12
|
+
* - Cross-family QE is UNREPRESENTABLE, not filtered: the qe pick is computed with the family
|
|
13
|
+
* parameter forced to the cross of the code pick's family (ADR-001 D3).
|
|
14
|
+
* - `--apply` idempotency lives here as a pure plan (`planFeed`): double-feeding the same runs
|
|
15
|
+
* would manufacture confidence the data does not contain (ADR-001 D4).
|
|
16
|
+
*
|
|
17
|
+
* No fs, no clock, no randomness — the CLI reads records and does the I/O.
|
|
18
|
+
*/
|
|
19
|
+
import { COST_LADDER, selectAutoCost } from './routing-outcomes.js';
|
|
20
|
+
/** success ⇔ grade ≥ this floor. DATA, exported, and printed in every basis (FR-4). */
|
|
21
|
+
export const GRADE_SUCCESS_FLOOR = 'B';
|
|
22
|
+
const SUCCESS_GRADES = new Set(['A+', 'A', 'A-', 'B+', 'B']);
|
|
23
|
+
export function gradeIsSuccess(grade) {
|
|
24
|
+
return SUCCESS_GRADES.has(grade.trim().toUpperCase());
|
|
25
|
+
}
|
|
26
|
+
const RULE_TEXT = `success ⇔ QE grade ≥ ${GRADE_SUCCESS_FLOOR} (run-level); the run's ONE grade is attributed to every ` +
|
|
27
|
+
`stage's model of that run — an inference, stated here because a hidden basis is an opinion in uniform`;
|
|
28
|
+
/** `codex:gpt-5.5:xhigh (usage-switched)` → `gpt-5.5`; claude ids pass through; unknown → null. */
|
|
29
|
+
export function normalizeModelId(raw) {
|
|
30
|
+
if (typeof raw !== 'string' || raw === '')
|
|
31
|
+
return null;
|
|
32
|
+
let id = raw.replace(/ \(usage-switched\)$/, '').trim();
|
|
33
|
+
const codex = /^codex:([^:]+)(?::[a-z]+)?$/.exec(id);
|
|
34
|
+
if (codex !== null)
|
|
35
|
+
id = codex[1];
|
|
36
|
+
return COST_LADDER.some((r) => r.id === id) ? id : null;
|
|
37
|
+
}
|
|
38
|
+
function isRecord(v) {
|
|
39
|
+
return typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
40
|
+
}
|
|
41
|
+
/** The run-level grade, wherever this record's era put it (`result.qeGrade`, `result.grade`,
|
|
42
|
+
* `result.qe.grade`). A string that does not look like a grade is not one. */
|
|
43
|
+
function extractGrade(result) {
|
|
44
|
+
const looksLikeGrade = (v) => typeof v === 'string' && /^[A-F][+-]?$/.test(v.trim().toUpperCase());
|
|
45
|
+
if (looksLikeGrade(result['qeGrade']))
|
|
46
|
+
return result['qeGrade'].trim().toUpperCase();
|
|
47
|
+
if (looksLikeGrade(result['grade']))
|
|
48
|
+
return result['grade'].trim().toUpperCase();
|
|
49
|
+
const qe = result['qe'];
|
|
50
|
+
if (isRecord(qe) && looksLikeGrade(qe['grade']))
|
|
51
|
+
return qe['grade'].trim().toUpperCase();
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
/** Harvest per-stage samples from already-read records (live harness records AND the `runMeta.records`
|
|
55
|
+
* of imported run-meta sidecars — they are the same shape by construction). */
|
|
56
|
+
export function harvestStageOutcomes(records) {
|
|
57
|
+
const samples = [];
|
|
58
|
+
const skipped = { noResult: 0, noModels: 0, noGrade: 0, unknownModel: 0 };
|
|
59
|
+
const runs = new Set();
|
|
60
|
+
let min = null;
|
|
61
|
+
let max = null;
|
|
62
|
+
for (const source of records) {
|
|
63
|
+
if (!isRecord(source)) {
|
|
64
|
+
skipped.noResult += 1;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const result = source['result'];
|
|
68
|
+
if (!isRecord(result)) {
|
|
69
|
+
skipped.noResult += 1;
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const modelsUsed = result['modelsUsed'];
|
|
73
|
+
if (!isRecord(modelsUsed)) {
|
|
74
|
+
skipped.noModels += 1;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const grade = extractGrade(result);
|
|
78
|
+
if (grade === null) {
|
|
79
|
+
skipped.noGrade += 1;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const runId = typeof source['runId'] === 'string' ? source['runId'] : JSON.stringify(modelsUsed).slice(0, 40);
|
|
83
|
+
const ts = typeof source['timestamp'] === 'string' ? source['timestamp'] : null;
|
|
84
|
+
const tier = typeof result['tier'] === 'string' && result['tier'] !== '' ? result['tier'] : 'unknown';
|
|
85
|
+
let contributed = false;
|
|
86
|
+
for (const [stage, rawModel] of Object.entries(modelsUsed)) {
|
|
87
|
+
const model = normalizeModelId(rawModel);
|
|
88
|
+
if (model === null) {
|
|
89
|
+
skipped.unknownModel += 1;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
contributed = true;
|
|
93
|
+
samples.push({ runId, ts, tier, stage, model, success: gradeIsSuccess(grade), grade });
|
|
94
|
+
}
|
|
95
|
+
if (contributed) {
|
|
96
|
+
runs.add(runId);
|
|
97
|
+
if (ts !== null) {
|
|
98
|
+
if (min === null || ts < min)
|
|
99
|
+
min = ts;
|
|
100
|
+
if (max === null || ts > max)
|
|
101
|
+
max = ts;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
samples,
|
|
107
|
+
runsUsed: runs.size,
|
|
108
|
+
window: min !== null && max !== null ? { min, max } : null,
|
|
109
|
+
skipped,
|
|
110
|
+
rule: RULE_TEXT,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function rungFamily(id) {
|
|
114
|
+
const rung = COST_LADDER.find((r) => r.id === id);
|
|
115
|
+
return rung !== undefined ? rung.family : 'claude';
|
|
116
|
+
}
|
|
117
|
+
function toSpec(id) {
|
|
118
|
+
return rungFamily(id) === 'openai' ? `codex:${id}:high` : id;
|
|
119
|
+
}
|
|
120
|
+
const CROSS_NOTE = 'the qe pick is computed with the family FORCED to the cross of the code pick — a same-family qe recommendation is unrepresentable (ADR-001 D3)';
|
|
121
|
+
/** Recommend per stage over the harvested samples (optionally one tier's slice). */
|
|
122
|
+
export function recommendModels(harvest, opts = {}) {
|
|
123
|
+
const slice = opts.tier === undefined ? harvest.samples : harvest.samples.filter((s) => s.tier === opts.tier);
|
|
124
|
+
const tierLabel = opts.tier ?? 'all';
|
|
125
|
+
const byStage = new Map();
|
|
126
|
+
for (const s of slice) {
|
|
127
|
+
const bucket = byStage.get(s.stage) ?? [];
|
|
128
|
+
bucket.push(s);
|
|
129
|
+
byStage.set(s.stage, bucket);
|
|
130
|
+
}
|
|
131
|
+
const statsFor = (stage) => (model) => {
|
|
132
|
+
const rows = (byStage.get(stage) ?? []).filter((s) => s.model === model);
|
|
133
|
+
const successes = rows.filter((s) => s.success).length;
|
|
134
|
+
return { attempts: rows.length, successes, successRate: rows.length === 0 ? 0 : successes / rows.length };
|
|
135
|
+
};
|
|
136
|
+
const pickFor = (stage, family) => {
|
|
137
|
+
const pick = selectAutoCost(stage, tierLabel, statsFor(stage), {
|
|
138
|
+
...(opts.qualityBar !== undefined ? { qualityBar: opts.qualityBar } : {}),
|
|
139
|
+
...(opts.minSamples !== undefined ? { minSamples: opts.minSamples } : {}),
|
|
140
|
+
...(family !== undefined ? { family } : {}),
|
|
141
|
+
});
|
|
142
|
+
return {
|
|
143
|
+
stage,
|
|
144
|
+
spec: toSpec(pick.model),
|
|
145
|
+
pick,
|
|
146
|
+
family: rungFamily(pick.model),
|
|
147
|
+
samples: (byStage.get(stage) ?? []).length,
|
|
148
|
+
insufficientData: !pick.metBar,
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
const stages = [...byStage.keys()].sort();
|
|
152
|
+
const perStage = [];
|
|
153
|
+
// code first — the qe family depends on it (D3).
|
|
154
|
+
const code = pickFor('code');
|
|
155
|
+
for (const stage of stages) {
|
|
156
|
+
if (stage === 'qe') {
|
|
157
|
+
const cross = code.family === 'claude' ? 'openai' : 'claude';
|
|
158
|
+
perStage.push(pickFor('qe', cross));
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
perStage.push(pickFor(stage));
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (!stages.includes('code'))
|
|
165
|
+
perStage.unshift(code);
|
|
166
|
+
return {
|
|
167
|
+
perStage,
|
|
168
|
+
basis: { runsUsed: harvest.runsUsed, window: harvest.window, rule: harvest.rule, skipped: harvest.skipped, crossFamilyNote: CROSS_NOTE },
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/** A run feeds ONCE. Double-feeding the same telemetry manufactures confidence the data does not
|
|
172
|
+
* contain — the second `--apply` must feed 0 and say which runs it skipped. */
|
|
173
|
+
export function planFeed(samples, alreadyFed) {
|
|
174
|
+
const fed = new Set(alreadyFed);
|
|
175
|
+
const toFeed = [];
|
|
176
|
+
const skippedRuns = new Set();
|
|
177
|
+
for (const s of samples) {
|
|
178
|
+
if (fed.has(s.runId))
|
|
179
|
+
skippedRuns.add(s.runId);
|
|
180
|
+
else
|
|
181
|
+
toFeed.push(s);
|
|
182
|
+
}
|
|
183
|
+
const fedAfter = [...new Set([...alreadyFed, ...toFeed.map((s) => s.runId)])].sort();
|
|
184
|
+
return { toFeed, skippedRuns: [...skippedRuns].sort(), fedAfter };
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=model-recommender.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-recommender.js","sourceRoot":"","sources":["../src/model-recommender.ts"],"names":[],"mappings":"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"}
|
package/dist/registry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoCvD;AAeD,sGAAsG;AACtG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBlF;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,yBAAyB;AACzB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAoCvD;AAeD,sGAAsG;AACtG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAmBlF;AAED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,yBAAyB;AACzB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,aAAa,EAAE,CAAC;IAC3C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAmFD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAmCnD;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAK1F;AAED,mCAAmC;AACnC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAE/F"}
|
package/dist/registry.js
CHANGED
|
@@ -173,7 +173,10 @@ function categoryFromPack(pack) {
|
|
|
173
173
|
if (pack.includes('pm') ||
|
|
174
174
|
pack.includes('idea2prd') ||
|
|
175
175
|
pack.includes('reverse-engineering') ||
|
|
176
|
-
pack.includes('presentation')
|
|
176
|
+
pack.includes('presentation') ||
|
|
177
|
+
// decision-mockups: an owner-facing decision page is stakeholder communication, the same
|
|
178
|
+
// cluster as PRDs and presentations — not design, and not a QE artifact.
|
|
179
|
+
pack.includes('decision-mockups'))
|
|
177
180
|
return 'product';
|
|
178
181
|
// Digitized-book knowledge packs (ADR-001 book-knowledge-digitizer) — `skills-book-*` and named
|
|
179
182
|
// digitizer outputs like `skills-12factor` (The Twelve-Factor App). Future digitized public packs
|
package/dist/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/skills-verify.d.ts
CHANGED
|
@@ -85,6 +85,16 @@ export interface InitPlugin {
|
|
|
85
85
|
export interface InitFacts {
|
|
86
86
|
/** Registered skill names. `null` means the key was ABSENT (schema drift) — never "none". */
|
|
87
87
|
readonly skills: readonly string[] | null;
|
|
88
|
+
/**
|
|
89
|
+
* Registered slash-command names, e.g. `loop-designer:init` (MEASURED on Claude Code 2.1.233: the
|
|
90
|
+
* `system/init` event carries a `slash_commands` array, and a plugin command registers under
|
|
91
|
+
* `<plugin>:<file basename>` — its frontmatter `name:` does NOT rename it).
|
|
92
|
+
*
|
|
93
|
+
* `null` means the key was ABSENT or not all strings — schema drift, never "no commands". A
|
|
94
|
+
* plugin whose commands silently failed to load and a Claude Code build that stopped emitting the
|
|
95
|
+
* key are indistinguishable from `[]`, so `[]` is never synthesised here.
|
|
96
|
+
*/
|
|
97
|
+
readonly slashCommands: readonly string[] | null;
|
|
88
98
|
readonly plugins: readonly InitPlugin[];
|
|
89
99
|
/** False when the `plugins` key was absent or not an array — unreadable, not empty (QE6 #7). */
|
|
90
100
|
readonly pluginsReadable: boolean;
|
|
@@ -119,12 +129,18 @@ export interface RegistrationControls {
|
|
|
119
129
|
readonly cwdMatched: boolean | null;
|
|
120
130
|
/** Was the `skills` key present at all? A missing key is schema drift, not "nothing registered". */
|
|
121
131
|
readonly skillsListPresent: boolean;
|
|
132
|
+
/** Same question for `slash_commands`. `false` when absent/unreadable — never "no commands". */
|
|
133
|
+
readonly commandsListPresent: boolean;
|
|
122
134
|
}
|
|
123
135
|
export interface RegistrationResult {
|
|
124
136
|
readonly verdict: RegistrationVerdict;
|
|
125
137
|
readonly reason: string;
|
|
126
138
|
readonly expected: readonly string[];
|
|
127
139
|
readonly missing: readonly string[];
|
|
140
|
+
/** The `--expect-commands` set this verdict was measured against (empty when not asked). */
|
|
141
|
+
readonly expectedCommands: readonly string[];
|
|
142
|
+
/** Expected commands absent from the live `slash_commands` listing. */
|
|
143
|
+
readonly missingCommands: readonly string[];
|
|
128
144
|
readonly registeredCount: number | null;
|
|
129
145
|
readonly clientVersion: string | null;
|
|
130
146
|
readonly plugins: readonly InitPlugin[];
|
|
@@ -160,6 +176,12 @@ export interface RegistrationEvidence {
|
|
|
160
176
|
};
|
|
161
177
|
/** Explicit `--expect` list; when absent the expectation is the scan's registrable set. */
|
|
162
178
|
readonly expected?: readonly string[];
|
|
179
|
+
/**
|
|
180
|
+
* Explicit `--expect-commands` list, e.g. `loop-designer:init`. Absent/empty ⇒ commands are not
|
|
181
|
+
* part of this vehicle's expectation (a bare skill has no commands BY DESIGN — ADR-003 D-2 — so
|
|
182
|
+
* demanding them there would be a false FAIL, not a stronger gate).
|
|
183
|
+
*/
|
|
184
|
+
readonly expectedCommands?: readonly string[];
|
|
163
185
|
}
|
|
164
186
|
export interface SkillsVerifyOptions {
|
|
165
187
|
/** Must CANONICALISE (realpath) so symlinked project paths compare equal; may throw. */
|
|
@@ -175,6 +197,24 @@ export declare function verifyRegistration(evidence: RegistrationEvidence, optio
|
|
|
175
197
|
/** Exit code contract: pass=0, fail=1, inconclusive=2 (distinct so CI can treat it separately). */
|
|
176
198
|
export declare function registrationExitCode(verdict: RegistrationVerdict, strict?: boolean): number;
|
|
177
199
|
export declare function renderRegistrationReport(result: RegistrationResult, scan?: StaticScan): string;
|
|
200
|
+
/**
|
|
201
|
+
* The names a plugin's OWN manifest says its commands and skills should register under, so a
|
|
202
|
+
* `--plugin-dir` gate run can default its expectation to the manifest instead of to a hand-typed
|
|
203
|
+
* list that drifts from it.
|
|
204
|
+
*
|
|
205
|
+
* The naming rules are MEASURED, not assumed (Claude Code 2.1.233, fixture probe 2026-08-17):
|
|
206
|
+
* · a command registers as `<plugin>:<file basename without .md>` — its frontmatter `name:` does
|
|
207
|
+
* NOT rename it (a fixture declaring `name: renamed-second` registered as `probeplug:second`);
|
|
208
|
+
* · a skill registers as `<plugin>:<directory basename>` — likewise not its frontmatter name.
|
|
209
|
+
*
|
|
210
|
+
* Returns `null` when the manifest is missing/unreadable/nameless: an unreadable manifest must not
|
|
211
|
+
* silently become an EMPTY expectation, which is the shape that passes without checking anything.
|
|
212
|
+
*/
|
|
213
|
+
export declare function declaredPluginSurface(pluginDir: string): {
|
|
214
|
+
name: string;
|
|
215
|
+
skills: string[];
|
|
216
|
+
commands: string[];
|
|
217
|
+
} | null;
|
|
178
218
|
/**
|
|
179
219
|
* Scan a PACKAGE directory for skill dirs that could never register.
|
|
180
220
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills-verify.d.ts","sourceRoot":"","sources":["../src/skills-verify.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,yFAAyF;AACzF,MAAM,MAAM,cAAc,GACtB,aAAa,GACb,iBAAiB,GACjB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,qGAAqG;IACrG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACnD;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,SAAS;QAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,uFAAuF;QACvF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,+FAA+F;QAC/F,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,8FAA8F;QAC9F,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;QACvC,sFAAsF;QACtF,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;KAC5B,EAAE,CAAC;IACJ;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AA6DD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CA6BtD;AAcD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAiP/D;AAID,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,sGAAsG;IACtG,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,gGAAgG;IAChG,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CACvC;AAED;;;GAGG;AACH;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAEnE;AAID;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,CAEjE;AAED,oGAAoG;AACpG,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAC7B,oGAAoG;IACpG,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"skills-verify.d.ts","sourceRoot":"","sources":["../src/skills-verify.ts"],"names":[],"mappings":"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"}
|
package/dist/skills-verify.js
CHANGED
|
@@ -415,6 +415,14 @@ function parseStream(streamText) {
|
|
|
415
415
|
? rawSkills
|
|
416
416
|
: null
|
|
417
417
|
: null;
|
|
418
|
+
// Same treatment as `skills`, for the same reason: an ABSENT key is unreadable schema, and a
|
|
419
|
+
// partially-unparseable array must not be narrowed to the strings it happens to contain.
|
|
420
|
+
const rawCommands = obj.slash_commands;
|
|
421
|
+
const slashCommands = Array.isArray(rawCommands)
|
|
422
|
+
? rawCommands.every((s) => typeof s === 'string')
|
|
423
|
+
? rawCommands
|
|
424
|
+
: null
|
|
425
|
+
: null;
|
|
418
426
|
const rawPlugins = obj.plugins;
|
|
419
427
|
// An ABSENT or non-array `plugins` key is unreadable schema, not proof that nothing loaded —
|
|
420
428
|
// with containers present that difference decides FAIL vs INCONCLUSIVE (QE6 #7).
|
|
@@ -435,6 +443,7 @@ function parseStream(streamText) {
|
|
|
435
443
|
: [];
|
|
436
444
|
found.push({
|
|
437
445
|
skills,
|
|
446
|
+
slashCommands,
|
|
438
447
|
plugins,
|
|
439
448
|
pluginsReadable,
|
|
440
449
|
// An empty or relative cwd testifies to nothing — `resolve("")` silently becomes the caller's
|
|
@@ -458,11 +467,13 @@ export function verifyRegistration(evidence, options = {}) {
|
|
|
458
467
|
reason,
|
|
459
468
|
expected: [],
|
|
460
469
|
missing: [],
|
|
470
|
+
expectedCommands: [],
|
|
471
|
+
missingCommands: [],
|
|
461
472
|
registeredCount: null,
|
|
462
473
|
clientVersion: null,
|
|
463
474
|
plugins: [],
|
|
464
475
|
advisories: [],
|
|
465
|
-
controls: { cwdMatched: null, skillsListPresent: false },
|
|
476
|
+
controls: { cwdMatched: null, skillsListPresent: false, commandsListPresent: false },
|
|
466
477
|
layout: [],
|
|
467
478
|
});
|
|
468
479
|
if (!evidence || typeof evidence !== 'object')
|
|
@@ -488,16 +499,22 @@ export function verifyRegistration(evidence, options = {}) {
|
|
|
488
499
|
}
|
|
489
500
|
});
|
|
490
501
|
const expected = evidence.expected ?? scan.registrable;
|
|
502
|
+
// Unlike `expected`, this has NO fallback to a discovered set: there is nothing on disk that
|
|
503
|
+
// proves which command names a session should surface, and a guessed expectation is how a gate
|
|
504
|
+
// starts passing for the wrong reason. Not asked ⇒ not checked, and the report says so.
|
|
505
|
+
const expectedCommands = evidence.expectedCommands ?? [];
|
|
491
506
|
const layout = scan.findings;
|
|
492
507
|
const fail = (verdict, reason, extra = {}) => ({
|
|
493
508
|
expected,
|
|
509
|
+
expectedCommands,
|
|
510
|
+
missingCommands: [],
|
|
494
511
|
layout,
|
|
495
512
|
advisories: scan.advisories,
|
|
496
513
|
plugins: [],
|
|
497
514
|
clientVersion: null,
|
|
498
515
|
missing: [],
|
|
499
516
|
registeredCount: null,
|
|
500
|
-
controls: { cwdMatched: null, skillsListPresent: false },
|
|
517
|
+
controls: { cwdMatched: null, skillsListPresent: false, commandsListPresent: false },
|
|
501
518
|
...extra,
|
|
502
519
|
verdict,
|
|
503
520
|
reason,
|
|
@@ -553,20 +570,30 @@ export function verifyRegistration(evidence, options = {}) {
|
|
|
553
570
|
return fail('inconclusive', `session read ${facts.cwd}, not ${projectDir} — its listing does not describe this project`, {
|
|
554
571
|
...withFacts,
|
|
555
572
|
registeredCount: facts.skills?.length ?? null,
|
|
556
|
-
controls: { cwdMatched: false, skillsListPresent: facts.skills !== null },
|
|
573
|
+
controls: { cwdMatched: false, skillsListPresent: facts.skills !== null, commandsListPresent: facts.slashCommands !== null },
|
|
557
574
|
});
|
|
558
575
|
}
|
|
559
576
|
// 5. The listing must be readable in full.
|
|
560
577
|
if (facts.skills === null) {
|
|
561
578
|
return fail('inconclusive', 'the init listing has no readable `skills` array (absent or not all strings) — cannot read it', {
|
|
562
579
|
...withFacts,
|
|
563
|
-
controls: { cwdMatched: true, skillsListPresent: false },
|
|
580
|
+
controls: { cwdMatched: true, skillsListPresent: false, commandsListPresent: facts.slashCommands !== null },
|
|
564
581
|
});
|
|
565
582
|
}
|
|
566
|
-
|
|
583
|
+
// 5b. …and so must the COMMAND listing, whenever commands were expected. An absent
|
|
584
|
+
// `slash_commands` key is schema drift, exactly like an absent `skills` key: treating it as
|
|
585
|
+
// `[]` would report "your five commands did not register" on a Claude Code build that simply
|
|
586
|
+
// stopped emitting the key, and treating it as "fine" would pass a plugin whose commands
|
|
587
|
+
// really are missing. Neither is observable ⇒ inconclusive.
|
|
588
|
+
if (expectedCommands.length > 0 && facts.slashCommands === null) {
|
|
589
|
+
return fail('inconclusive', 'the init listing has no readable `slash_commands` array (absent or not all strings) — command registration cannot be observed', { ...withFacts, controls: { cwdMatched: true, skillsListPresent: true, commandsListPresent: false } });
|
|
590
|
+
}
|
|
591
|
+
const controls = { cwdMatched: true, skillsListPresent: true, commandsListPresent: facts.slashCommands !== null };
|
|
567
592
|
const registered = new Set(facts.skills);
|
|
568
593
|
const missing = expected.filter((name) => !registered.has(name));
|
|
569
|
-
const
|
|
594
|
+
const registeredCommands = new Set(facts.slashCommands ?? []);
|
|
595
|
+
const missingCommands = expectedCommands.filter((name) => !registeredCommands.has(name));
|
|
596
|
+
const common = { ...withFacts, expectedCommands, missingCommands, registeredCount: facts.skills.length, controls };
|
|
570
597
|
// 6. Load-blocking layout problems fail on their own — one healthy skill must not mask them.
|
|
571
598
|
if (layout.length > 0) {
|
|
572
599
|
return {
|
|
@@ -660,7 +687,13 @@ export function verifyRegistration(evidence, options = {}) {
|
|
|
660
687
|
detail: `${v} — its individual skills are NOT verified: a plugin skill's command name depends on frontmatter this gate does not model`,
|
|
661
688
|
}));
|
|
662
689
|
const allAdvisories = [...scan.advisories, ...containerAdvisories];
|
|
663
|
-
if (missing.length > 0) {
|
|
690
|
+
if (missing.length > 0 || missingCommands.length > 0) {
|
|
691
|
+
const parts = [];
|
|
692
|
+
if (missing.length > 0)
|
|
693
|
+
parts.push(`${missing.length} of ${expected.length} expected skill(s) did NOT register`);
|
|
694
|
+
if (missingCommands.length > 0) {
|
|
695
|
+
parts.push(`${missingCommands.length} of ${expectedCommands.length} expected command(s) did NOT register (${missingCommands.join(', ')})`);
|
|
696
|
+
}
|
|
664
697
|
return {
|
|
665
698
|
expected,
|
|
666
699
|
layout,
|
|
@@ -668,7 +701,7 @@ export function verifyRegistration(evidence, options = {}) {
|
|
|
668
701
|
...common,
|
|
669
702
|
missing,
|
|
670
703
|
verdict: 'fail',
|
|
671
|
-
reason:
|
|
704
|
+
reason: parts.join('; '),
|
|
672
705
|
};
|
|
673
706
|
}
|
|
674
707
|
return {
|
|
@@ -678,9 +711,11 @@ export function verifyRegistration(evidence, options = {}) {
|
|
|
678
711
|
...common,
|
|
679
712
|
missing: [],
|
|
680
713
|
verdict: 'pass',
|
|
681
|
-
reason: expected.length === 0
|
|
714
|
+
reason: expected.length === 0 && expectedCommands.length === 0
|
|
682
715
|
? 'nothing was expected to register; the session listing was read successfully'
|
|
683
|
-
: `all ${expected.length} expected skill(s)
|
|
716
|
+
: `all ${expected.length} expected skill(s)` +
|
|
717
|
+
(expectedCommands.length > 0 ? ` and all ${expectedCommands.length} expected command(s)` : '') +
|
|
718
|
+
' are registered',
|
|
684
719
|
};
|
|
685
720
|
}
|
|
686
721
|
/** Exit code contract: pass=0, fail=1, inconclusive=2 (distinct so CI can treat it separately). */
|
|
@@ -713,6 +748,12 @@ export function renderRegistrationReport(result, scan) {
|
|
|
713
748
|
for (const name of result.missing)
|
|
714
749
|
out.push(` - ${name}`);
|
|
715
750
|
}
|
|
751
|
+
if (result.expectedCommands.length) {
|
|
752
|
+
out.push(` commands: ${result.expectedCommands.length} expected` +
|
|
753
|
+
(result.controls.commandsListPresent ? '' : ' · slash_commands listing UNREADABLE'));
|
|
754
|
+
for (const name of result.missingCommands)
|
|
755
|
+
out.push(` - MISSING ${name}`);
|
|
756
|
+
}
|
|
716
757
|
if (result.layout.length) {
|
|
717
758
|
out.push(' layout problems (these can never register):');
|
|
718
759
|
for (const f of result.layout)
|
|
@@ -728,6 +769,35 @@ export function renderRegistrationReport(result, scan) {
|
|
|
728
769
|
}
|
|
729
770
|
return out.join('\n');
|
|
730
771
|
}
|
|
772
|
+
/**
|
|
773
|
+
* The names a plugin's OWN manifest says its commands and skills should register under, so a
|
|
774
|
+
* `--plugin-dir` gate run can default its expectation to the manifest instead of to a hand-typed
|
|
775
|
+
* list that drifts from it.
|
|
776
|
+
*
|
|
777
|
+
* The naming rules are MEASURED, not assumed (Claude Code 2.1.233, fixture probe 2026-08-17):
|
|
778
|
+
* · a command registers as `<plugin>:<file basename without .md>` — its frontmatter `name:` does
|
|
779
|
+
* NOT rename it (a fixture declaring `name: renamed-second` registered as `probeplug:second`);
|
|
780
|
+
* · a skill registers as `<plugin>:<directory basename>` — likewise not its frontmatter name.
|
|
781
|
+
*
|
|
782
|
+
* Returns `null` when the manifest is missing/unreadable/nameless: an unreadable manifest must not
|
|
783
|
+
* silently become an EMPTY expectation, which is the shape that passes without checking anything.
|
|
784
|
+
*/
|
|
785
|
+
export function declaredPluginSurface(pluginDir) {
|
|
786
|
+
let obj;
|
|
787
|
+
try {
|
|
788
|
+
obj = JSON.parse(readFileSync(join(pluginDir, '.claude-plugin', 'plugin.json'), 'utf8'));
|
|
789
|
+
}
|
|
790
|
+
catch {
|
|
791
|
+
return null;
|
|
792
|
+
}
|
|
793
|
+
const name = typeof obj.name === 'string' && obj.name ? obj.name : null;
|
|
794
|
+
if (name === null)
|
|
795
|
+
return null;
|
|
796
|
+
const list = (value) => Array.isArray(value) ? value.filter((x) => typeof x === 'string') : [];
|
|
797
|
+
const skills = list(obj.skills).map((rel) => `${name}:${basename(rel.replace(/\/+$/, ''))}`);
|
|
798
|
+
const commands = list(obj.commands).map((rel) => `${name}:${basename(rel).replace(/\.md$/i, '')}`);
|
|
799
|
+
return { name, skills, commands };
|
|
800
|
+
}
|
|
731
801
|
// ── The publish-time guard fact ─────────────────────────────────────
|
|
732
802
|
/**
|
|
733
803
|
* Scan a PACKAGE directory for skill dirs that could never register.
|