@milehimikey/em 1.6.1 → 1.7.1
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/skills/event-modeling/SKILL.md +94 -49
- package/.claude/skills/event-modeling/reference/conform.md +30 -8
- package/.claude/skills/event-modeling/reference/em-dsl.md +194 -73
- package/.claude/skills/event-modeling/reference/extract.md +14 -11
- package/.claude/skills/event-modeling/reference/implement.md +172 -0
- package/.claude/skills/event-modeling/reference/methodology.md +40 -33
- package/.claude/skills/event-modeling/templates/conformance-report.md +15 -9
- package/.claude/skills/event-modeling/templates/model-readme.md +7 -7
- package/.claude/skills/event-modeling/templates/slice.md +73 -7
- package/.claude/skills/event-modeling/templates/state.md +7 -6
- package/README.md +1 -0
- package/dist/catalog/build.d.ts +5 -0
- package/dist/catalog/build.js +1 -3
- package/dist/catalog/build.js.map +1 -1
- package/dist/catalog/classify.d.ts +7 -8
- package/dist/catalog/classify.js +7 -8
- package/dist/catalog/classify.js.map +1 -1
- package/dist/catalog/docJoin.d.ts +39 -0
- package/dist/catalog/docJoin.js +86 -0
- package/dist/catalog/docJoin.js.map +1 -0
- package/dist/catalog/driftSignal.d.ts +16 -0
- package/dist/catalog/driftSignal.js +24 -0
- package/dist/catalog/driftSignal.js.map +1 -0
- package/dist/catalog/frontmatterCoherenceValidate.d.ts +8 -0
- package/dist/catalog/frontmatterCoherenceValidate.js +52 -0
- package/dist/catalog/frontmatterCoherenceValidate.js.map +1 -0
- package/dist/catalog/lineageValidate.d.ts +9 -0
- package/dist/catalog/lineageValidate.js +161 -0
- package/dist/catalog/lineageValidate.js.map +1 -0
- package/dist/catalog/readSliceDoc.d.ts +2 -0
- package/dist/catalog/readSliceDoc.js +21 -0
- package/dist/catalog/readSliceDoc.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +94 -3
- package/dist/catalog/sliceDoc.js +157 -7
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +11 -0
- package/dist/catalog/sliceReadyValidate.js +85 -0
- package/dist/catalog/sliceReadyValidate.js.map +1 -0
- package/dist/cli/diff-inputs.d.ts +20 -0
- package/dist/cli/diff-inputs.js +75 -18
- package/dist/cli/diff-inputs.js.map +1 -1
- package/dist/cli/ledgerCheck.d.ts +38 -0
- package/dist/cli/ledgerCheck.js +116 -0
- package/dist/cli/ledgerCheck.js.map +1 -0
- package/dist/cli/skillCheck.d.ts +18 -0
- package/dist/cli/skillCheck.js +63 -0
- package/dist/cli/skillCheck.js.map +1 -0
- package/dist/cli/skillSync.d.ts +22 -0
- package/dist/cli/skillSync.js +69 -0
- package/dist/cli/skillSync.js.map +1 -0
- package/dist/cli/skillVersionCheck.d.ts +32 -0
- package/dist/cli/skillVersionCheck.js +145 -0
- package/dist/cli/skillVersionCheck.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +203 -32
- package/dist/cli.js.map +1 -1
- package/dist/emit/diffJson.d.ts +1 -1
- package/dist/emit/diffJson.js +18 -14
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/dot.js +46 -5
- package/dist/emit/dot.js.map +1 -1
- package/dist/emit/json.d.ts +10 -25
- package/dist/emit/json.js +70 -103
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/ledgerJson.d.ts +5 -0
- package/dist/emit/ledgerJson.js +25 -0
- package/dist/emit/ledgerJson.js.map +1 -0
- package/dist/emit/skillCheckJson.d.ts +5 -0
- package/dist/emit/skillCheckJson.js +32 -0
- package/dist/emit/skillCheckJson.js.map +1 -0
- package/dist/model/diff.d.ts +44 -1
- package/dist/model/diff.js +51 -9
- package/dist/model/diff.js.map +1 -1
- package/dist/model/edges.js +17 -17
- package/dist/model/edges.js.map +1 -1
- package/dist/model/model.d.ts +1 -1
- package/dist/model/refs.d.ts +23 -0
- package/dist/model/refs.js +75 -0
- package/dist/model/refs.js.map +1 -0
- package/dist/model/rules.d.ts +253 -0
- package/dist/model/rules.js +254 -0
- package/dist/model/rules.js.map +1 -0
- package/dist/model/validate.d.ts +23 -1
- package/dist/model/validate.js +207 -69
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +3 -2
- package/dist/parser/lexer.d.ts +17 -2
- package/dist/parser/lexer.js +119 -13
- package/dist/parser/lexer.js.map +1 -1
- package/dist/parser/parser.js +75 -34
- package/dist/parser/parser.js.map +1 -1
- package/dist/pipeline.d.ts +9 -0
- package/dist/pipeline.js +4 -2
- package/dist/pipeline.js.map +1 -1
- package/dist/render/sliceDiagram.js +33 -35
- package/dist/render/sliceDiagram.js.map +1 -1
- package/dist/render/sliceStatus.js +1 -1
- package/dist/render/sliceStatus.js.map +1 -1
- package/dist/util/isMainModule.d.ts +14 -0
- package/dist/util/isMainModule.js +33 -0
- package/dist/util/isMainModule.js.map +1 -0
- package/dist/util/walkDir.d.ts +4 -0
- package/dist/util/walkDir.js +28 -0
- package/dist/util/walkDir.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type SkillCheckFindingCode = "skill-check-not-installed" | "skill-check-stamp-missing" | "skill-check-stamp-mismatch" | "skill-check-content-drift";
|
|
2
|
+
export interface SkillCheckFinding {
|
|
3
|
+
code: SkillCheckFindingCode;
|
|
4
|
+
message: string;
|
|
5
|
+
vendoredStamp?: string | null;
|
|
6
|
+
installedVersion?: string;
|
|
7
|
+
driftedFiles?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface SkillCheckResult {
|
|
10
|
+
findings: SkillCheckFinding[];
|
|
11
|
+
ok: boolean;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Pure: compares vendoredDir against packagedDir (content) and installedVersion (em --version
|
|
15
|
+
* — injected, never re-derived; see src/cli.ts's PKG_VERSION) against the vendored SKILL.md's
|
|
16
|
+
* em-version: stamp. No process.exit, no console.
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkSkillSync(packagedDir: string, vendoredDir: string, installedVersion: string): SkillCheckResult;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// `em skill check` (MIL-93): checks a consuming repo's vendored skill copy for drift against
|
|
3
|
+
// the em package actually installed — the downstream half of the skill-drift problem (the
|
|
4
|
+
// in-repo half is MIL-92's skillVersionCheck.ts, which checks *this* repo's own package.json
|
|
5
|
+
// against *its own* bundled skill across two git revisions). This check has no git revisions
|
|
6
|
+
// at all: both sides are directories on disk right now, so unlike ledgerCheck.ts/
|
|
7
|
+
// skillVersionCheck.ts there's no GitRunner to inject.
|
|
8
|
+
//
|
|
9
|
+
// Two independent signals, both reported (never short-circuited on the first):
|
|
10
|
+
// - the vendored SKILL.md's em-version: stamp vs. the installed em's own version
|
|
11
|
+
// - a full content diff against the packaged skill (reusing planSkillSync's hash-walk), which
|
|
12
|
+
// catches a hand-edited vendored file even when its stamp still happens to match — the
|
|
13
|
+
// ticket's explicit "stamp says current, content isn't" case.
|
|
14
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { extractEmVersionStamp } from "./skillVersionCheck.js";
|
|
17
|
+
import { planSkillSync } from "./skillSync.js";
|
|
18
|
+
/**
|
|
19
|
+
* Pure: compares vendoredDir against packagedDir (content) and installedVersion (em --version
|
|
20
|
+
* — injected, never re-derived; see src/cli.ts's PKG_VERSION) against the vendored SKILL.md's
|
|
21
|
+
* em-version: stamp. No process.exit, no console.
|
|
22
|
+
*/
|
|
23
|
+
export function checkSkillSync(packagedDir, vendoredDir, installedVersion) {
|
|
24
|
+
if (!existsSync(vendoredDir)) {
|
|
25
|
+
return {
|
|
26
|
+
ok: false,
|
|
27
|
+
findings: [
|
|
28
|
+
{
|
|
29
|
+
code: "skill-check-not-installed",
|
|
30
|
+
message: `no vendored skill found at ${vendoredDir} — run \`em skill sync\` first`,
|
|
31
|
+
},
|
|
32
|
+
],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const findings = [];
|
|
36
|
+
const skillMdPath = join(vendoredDir, "SKILL.md");
|
|
37
|
+
const vendoredStamp = existsSync(skillMdPath) ? extractEmVersionStamp(readFileSync(skillMdPath, "utf8")) : null;
|
|
38
|
+
if (vendoredStamp === null) {
|
|
39
|
+
findings.push({
|
|
40
|
+
code: "skill-check-stamp-missing",
|
|
41
|
+
message: `${skillMdPath} has no em-version: stamp — vendored copy predates MIL-92 or was hand-edited`,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else if (vendoredStamp !== installedVersion) {
|
|
45
|
+
findings.push({
|
|
46
|
+
code: "skill-check-stamp-mismatch",
|
|
47
|
+
message: `vendored skill's em-version: stamp (${vendoredStamp}) doesn't match installed em (${installedVersion}) — run \`em skill sync\``,
|
|
48
|
+
vendoredStamp,
|
|
49
|
+
installedVersion,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
const plan = planSkillSync(packagedDir, vendoredDir);
|
|
53
|
+
if (plan.changes.length > 0) {
|
|
54
|
+
const driftedFiles = plan.changes.map((c) => c.relPath).sort();
|
|
55
|
+
findings.push({
|
|
56
|
+
code: "skill-check-content-drift",
|
|
57
|
+
message: `vendored skill differs from the packaged skill in ${driftedFiles.length} file(s) — run \`em skill sync\``,
|
|
58
|
+
driftedFiles,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return { findings, ok: findings.length === 0 };
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=skillCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillCheck.js","sourceRoot":"","sources":["../../src/cli/skillCheck.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,6FAA6F;AAC7F,0FAA0F;AAC1F,6FAA6F;AAC7F,6FAA6F;AAC7F,kFAAkF;AAClF,uDAAuD;AACvD,EAAE;AACF,+EAA+E;AAC/E,kFAAkF;AAClF,+FAA+F;AAC/F,0FAA0F;AAC1F,iEAAiE;AAEjE,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAqB/C;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,WAAmB,EAAE,gBAAwB;IAC/F,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,2BAA2B;oBACjC,OAAO,EAAE,8BAA8B,WAAW,gCAAgC;iBACnF;aACF;SACF,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,aAAa,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEhH,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,GAAG,WAAW,8EAA8E;SACtG,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,uCAAuC,aAAa,iCAAiC,gBAAgB,2BAA2B;YACzI,aAAa;YACb,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IACrD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,qDAAqD,YAAY,CAAC,MAAM,kCAAkC;YACnH,YAAY;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export type SkillSyncFileChangeKind = "added" | "modified" | "removed";
|
|
2
|
+
export interface SkillSyncFileChange {
|
|
3
|
+
relPath: string;
|
|
4
|
+
kind: SkillSyncFileChangeKind;
|
|
5
|
+
}
|
|
6
|
+
export interface SkillSyncPlan {
|
|
7
|
+
/** Sorted by relPath. Empty means vendoredDir already matches packagedDir exactly. */
|
|
8
|
+
changes: SkillSyncFileChange[];
|
|
9
|
+
/** Files present, identical, in both dirs — not listed in `changes`. */
|
|
10
|
+
unchangedCount: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Pure: compares packagedDir (source of truth) against vendoredDir (which may not exist yet —
|
|
14
|
+
* that's the fresh-sync case, not an error) by per-file sha256. No fs writes.
|
|
15
|
+
*/
|
|
16
|
+
export declare function planSkillSync(packagedDir: string, vendoredDir: string): SkillSyncPlan;
|
|
17
|
+
/**
|
|
18
|
+
* Shell: applies a plan produced by planSkillSync — copies added/modified files from
|
|
19
|
+
* packagedDir into vendoredDir, deletes removed files from vendoredDir. Idempotent; a plan
|
|
20
|
+
* with no changes is a no-op. Creates vendoredDir (and any needed subdirectories) as needed.
|
|
21
|
+
*/
|
|
22
|
+
export declare function applySkillSync(plan: SkillSyncPlan, packagedDir: string, vendoredDir: string): void;
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// `em skill sync` (MIL-93): materializes/updates a consuming repo's vendored copy of the
|
|
3
|
+
// event-modeling skill from the em package actually installed. Unlike `em ledger`/
|
|
4
|
+
// skillVersionCheck.ts (which diff two *git revisions* of the same repo), this diffs two
|
|
5
|
+
// *directories on disk right now* — the packaged skill bundled with the running em, and a
|
|
6
|
+
// vendored copy in some other repo — so there's no GitRunner here at all.
|
|
7
|
+
//
|
|
8
|
+
// Contract: the vendored copy is read-only from the consuming repo's point of view. Local
|
|
9
|
+
// edits are never merged — sync always makes vendoredDir byte-identical to packagedDir, the
|
|
10
|
+
// same "you don't own this copy" stance rlm-blueprint's hand-rolled sync guard already
|
|
11
|
+
// enforced by hand. That's why, unlike `em skill install`, there's no --force/confirmation
|
|
12
|
+
// gate: overwriting is the entire point.
|
|
13
|
+
//
|
|
14
|
+
// Split into a pure plan (walk + hash, no writes) and a thin apply (the actual fs mutation) so
|
|
15
|
+
// `em skill check` (src/cli/skillCheck.ts) can reuse planSkillSync's diff for its own
|
|
16
|
+
// content-drift detection without performing any writes.
|
|
17
|
+
import { existsSync, mkdirSync, copyFileSync, readFileSync, rmSync } from "node:fs";
|
|
18
|
+
import { createHash } from "node:crypto";
|
|
19
|
+
import { dirname, join } from "node:path";
|
|
20
|
+
import { walkDir } from "../util/walkDir.js";
|
|
21
|
+
function sha256(path) {
|
|
22
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pure: compares packagedDir (source of truth) against vendoredDir (which may not exist yet —
|
|
26
|
+
* that's the fresh-sync case, not an error) by per-file sha256. No fs writes.
|
|
27
|
+
*/
|
|
28
|
+
export function planSkillSync(packagedDir, vendoredDir) {
|
|
29
|
+
const packagedFiles = new Set(walkDir(packagedDir));
|
|
30
|
+
const vendoredFiles = new Set(existsSync(vendoredDir) ? walkDir(vendoredDir) : []);
|
|
31
|
+
const allPaths = [...new Set([...packagedFiles, ...vendoredFiles])].sort();
|
|
32
|
+
const changes = [];
|
|
33
|
+
let unchangedCount = 0;
|
|
34
|
+
for (const relPath of allPaths) {
|
|
35
|
+
const inPackaged = packagedFiles.has(relPath);
|
|
36
|
+
const inVendored = vendoredFiles.has(relPath);
|
|
37
|
+
if (inPackaged && !inVendored) {
|
|
38
|
+
changes.push({ relPath, kind: "added" });
|
|
39
|
+
}
|
|
40
|
+
else if (!inPackaged && inVendored) {
|
|
41
|
+
changes.push({ relPath, kind: "removed" });
|
|
42
|
+
}
|
|
43
|
+
else if (sha256(join(packagedDir, relPath)) !== sha256(join(vendoredDir, relPath))) {
|
|
44
|
+
changes.push({ relPath, kind: "modified" });
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
unchangedCount++;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return { changes, unchangedCount };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Shell: applies a plan produced by planSkillSync — copies added/modified files from
|
|
54
|
+
* packagedDir into vendoredDir, deletes removed files from vendoredDir. Idempotent; a plan
|
|
55
|
+
* with no changes is a no-op. Creates vendoredDir (and any needed subdirectories) as needed.
|
|
56
|
+
*/
|
|
57
|
+
export function applySkillSync(plan, packagedDir, vendoredDir) {
|
|
58
|
+
for (const change of plan.changes) {
|
|
59
|
+
const dest = join(vendoredDir, change.relPath);
|
|
60
|
+
if (change.kind === "removed") {
|
|
61
|
+
rmSync(dest);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
mkdirSync(dirname(dest), { recursive: true });
|
|
65
|
+
copyFileSync(join(packagedDir, change.relPath), dest);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=skillSync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillSync.js","sourceRoot":"","sources":["../../src/cli/skillSync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { GitRunner } from "./diff-inputs.js";
|
|
2
|
+
export type SkillVersionFindingCode = "skill-version-stamp-not-bumped" | "skill-version-stamp-stray-bump" | "skill-version-stamp-removed";
|
|
3
|
+
export interface SkillVersionFinding {
|
|
4
|
+
code: SkillVersionFindingCode;
|
|
5
|
+
message: string;
|
|
6
|
+
oldPkgVersion: string;
|
|
7
|
+
newPkgVersion: string;
|
|
8
|
+
oldStamp: string | null;
|
|
9
|
+
newStamp: string | null;
|
|
10
|
+
}
|
|
11
|
+
/** Why no finding could be produced — a state the check can't prove anything from, not a
|
|
12
|
+
* defect. `stamp-missing` covers the field not existing at EITHER revision (never adopted in
|
|
13
|
+
* this span) — distinct from it existing at `from` and being deleted by `to`, which is a
|
|
14
|
+
* `skill-version-stamp-removed` finding, not a skip. */
|
|
15
|
+
export type SkillVersionSkipReason = "package-json-unreadable" | "skill-md-unreadable" | "stamp-missing";
|
|
16
|
+
export interface SkillVersionCheckResult {
|
|
17
|
+
finding: SkillVersionFinding | null;
|
|
18
|
+
skipped: SkillVersionSkipReason | null;
|
|
19
|
+
}
|
|
20
|
+
/** Pull `em-version: X` out of a `---\n...\n---` frontmatter block. Minimal and single-purpose
|
|
21
|
+
* — SKILL.md's frontmatter is two plain scalar keys plus a folded `description:` block, not
|
|
22
|
+
* the richer schema src/catalog/sliceDoc.ts parses, so this doesn't reuse that parser.
|
|
23
|
+
* Exported for reuse by src/cli/skillCheck.ts (MIL-93), which needs the same extraction to
|
|
24
|
+
* compare a vendored copy's stamp against the installed em's own version — no reason to
|
|
25
|
+
* duplicate the regex a second time. */
|
|
26
|
+
export declare function extractEmVersionStamp(content: string): string | null;
|
|
27
|
+
/**
|
|
28
|
+
* Compare `pkgJsonPath`'s version and `skillMdPath`'s `em-version:` stamp between revisions
|
|
29
|
+
* `from` and `to` (`to: null` = current working tree, matching `em diff`/`em ledger`). Pure
|
|
30
|
+
* aside from the injected `GitRunner` and fs reads — no process.exit, no console.
|
|
31
|
+
*/
|
|
32
|
+
export declare function checkSkillVersionStamp(pkgJsonPath: string, skillMdPath: string, from: string, to: string | null, runGit?: GitRunner): SkillVersionCheckResult;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MIT
|
|
2
|
+
// MIL-92's version-stamp release gate: checks that package.json's `version` and SKILL.md's
|
|
3
|
+
// `em-version:` frontmatter stamp move together across two revisions. Repo-internal — unlike
|
|
4
|
+
// `em ledger` (MIL-89, src/cli/ledgerCheck.ts), which consumer repos run against their own
|
|
5
|
+
// slice docs, this checks *this repo's own* package version against *this repo's own* bundled
|
|
6
|
+
// skill, so it's never a shipped `em` subcommand — see scripts/check-skill-version-stamp.ts for
|
|
7
|
+
// the thin CLI shim, and docs/ci.md's precedent framing for why a version/content-agreement
|
|
8
|
+
// check needs two revisions rather than being folded into `em validate`.
|
|
9
|
+
//
|
|
10
|
+
// Both sides here are version strings compared for "did it move," not ledger's version-vs-
|
|
11
|
+
// freeform-content comparison — the meaningful case is package.json's version changing without
|
|
12
|
+
// the stamp following it (`skill-version-stamp-not-bumped`). Two more are flagged as cheap extra
|
|
13
|
+
// coverage: a stray stamp edit with no matching package.json move (`-stray-bump`), and the
|
|
14
|
+
// stamp being deleted outright (`-removed`, unconditional — regardless of whether package.json
|
|
15
|
+
// also changed, since losing the mechanism entirely is a problem on its own; a code review on
|
|
16
|
+
// this very PR caught an earlier version that silently skipped the pkgChanged+deleted-stamp
|
|
17
|
+
// combination). The one case that stays clean rather than becoming a finding: the stamp's
|
|
18
|
+
// first-ever introduction (no prior value to compare against) — the normal one-time bootstrap
|
|
19
|
+
// of the field, not a stray edit (this check's own introducing PR, confirmed on CI, first).
|
|
20
|
+
import { readFileSync } from "node:fs";
|
|
21
|
+
import { realGit, resolveRevision } from "./diff-inputs.js";
|
|
22
|
+
/** `to: null` reads the working tree directly (fs); a revision string resolves via git — same
|
|
23
|
+
* `to: null` = working-tree convention `em diff`/`em ledger` use. */
|
|
24
|
+
function readAt(path, rev, runGit) {
|
|
25
|
+
if (rev === null) {
|
|
26
|
+
try {
|
|
27
|
+
return { ok: true, content: readFileSync(path, "utf8") };
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return { ok: false };
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const result = resolveRevision(path, rev, runGit);
|
|
34
|
+
return result.ok ? { ok: true, content: result.content } : { ok: false };
|
|
35
|
+
}
|
|
36
|
+
function extractPkgVersion(content) {
|
|
37
|
+
try {
|
|
38
|
+
const parsed = JSON.parse(content);
|
|
39
|
+
const version = parsed?.version;
|
|
40
|
+
return typeof version === "string" ? version : null;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Pull `em-version: X` out of a `---\n...\n---` frontmatter block. Minimal and single-purpose
|
|
47
|
+
* — SKILL.md's frontmatter is two plain scalar keys plus a folded `description:` block, not
|
|
48
|
+
* the richer schema src/catalog/sliceDoc.ts parses, so this doesn't reuse that parser.
|
|
49
|
+
* Exported for reuse by src/cli/skillCheck.ts (MIL-93), which needs the same extraction to
|
|
50
|
+
* compare a vendored copy's stamp against the installed em's own version — no reason to
|
|
51
|
+
* duplicate the regex a second time. */
|
|
52
|
+
export function extractEmVersionStamp(content) {
|
|
53
|
+
const frontmatter = content.match(/^---\n([\s\S]*?)\n---/);
|
|
54
|
+
if (!frontmatter)
|
|
55
|
+
return null;
|
|
56
|
+
const line = frontmatter[1].split("\n").find((l) => /^em-version:\s*/.test(l));
|
|
57
|
+
if (!line)
|
|
58
|
+
return null;
|
|
59
|
+
return line
|
|
60
|
+
.replace(/^em-version:\s*/, "")
|
|
61
|
+
.trim()
|
|
62
|
+
.replace(/^["']|["']$/g, "");
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Compare `pkgJsonPath`'s version and `skillMdPath`'s `em-version:` stamp between revisions
|
|
66
|
+
* `from` and `to` (`to: null` = current working tree, matching `em diff`/`em ledger`). Pure
|
|
67
|
+
* aside from the injected `GitRunner` and fs reads — no process.exit, no console.
|
|
68
|
+
*/
|
|
69
|
+
export function checkSkillVersionStamp(pkgJsonPath, skillMdPath, from, to, runGit = realGit) {
|
|
70
|
+
const oldPkg = readAt(pkgJsonPath, from, runGit);
|
|
71
|
+
const newPkg = readAt(pkgJsonPath, to, runGit);
|
|
72
|
+
if (!oldPkg.ok || !newPkg.ok)
|
|
73
|
+
return { finding: null, skipped: "package-json-unreadable" };
|
|
74
|
+
const oldPkgVersion = extractPkgVersion(oldPkg.content);
|
|
75
|
+
const newPkgVersion = extractPkgVersion(newPkg.content);
|
|
76
|
+
if (oldPkgVersion === null || newPkgVersion === null)
|
|
77
|
+
return { finding: null, skipped: "package-json-unreadable" };
|
|
78
|
+
const oldSkill = readAt(skillMdPath, from, runGit);
|
|
79
|
+
const newSkill = readAt(skillMdPath, to, runGit);
|
|
80
|
+
if (!oldSkill.ok || !newSkill.ok)
|
|
81
|
+
return { finding: null, skipped: "skill-md-unreadable" };
|
|
82
|
+
const oldStamp = extractEmVersionStamp(oldSkill.content);
|
|
83
|
+
const newStamp = extractEmVersionStamp(newSkill.content);
|
|
84
|
+
// Never adopted anywhere in this revision span — nothing to compare. Distinct from the stamp
|
|
85
|
+
// being *removed* below: that's a regression, this is simply "the field doesn't exist yet."
|
|
86
|
+
if (oldStamp === null && newStamp === null)
|
|
87
|
+
return { finding: null, skipped: "stamp-missing" };
|
|
88
|
+
// The stamp's first-ever introduction (no em-version: key at `from`, one at `to`) has nothing
|
|
89
|
+
// to compare against either — not a stray edit, the normal one-time bootstrap of the field
|
|
90
|
+
// itself (e.g. this very check landing). Treat it as clean rather than a permanent
|
|
91
|
+
// false-positive on whichever PR happens to add the key.
|
|
92
|
+
if (oldStamp === null)
|
|
93
|
+
return { finding: null, skipped: null };
|
|
94
|
+
const pkgChanged = oldPkgVersion !== newPkgVersion;
|
|
95
|
+
// The stamp existed and is now gone entirely — a stronger signal than merely "left stale"
|
|
96
|
+
// (below), and one a naive "newStamp === null -> skip" early-out would otherwise swallow
|
|
97
|
+
// silently, including the worst case: package.json bumped in the very same change that
|
|
98
|
+
// deleted the stamp (caught in code review, MIL-92 PR #85 — no prior test combined
|
|
99
|
+
// pkgChanged: true with a deleted stamp). Always a finding, regardless of pkgChanged: removing
|
|
100
|
+
// the mechanism entirely is a problem on its own, not just when it coincides with a release.
|
|
101
|
+
if (newStamp === null) {
|
|
102
|
+
return {
|
|
103
|
+
skipped: null,
|
|
104
|
+
finding: {
|
|
105
|
+
code: "skill-version-stamp-removed",
|
|
106
|
+
message: pkgChanged
|
|
107
|
+
? `SKILL.md's em-version: stamp (was ${oldStamp}) was removed entirely while package.json bumped ${oldPkgVersion} -> ${newPkgVersion}`
|
|
108
|
+
: `SKILL.md's em-version: stamp (was ${oldStamp}) was removed entirely`,
|
|
109
|
+
oldPkgVersion,
|
|
110
|
+
newPkgVersion,
|
|
111
|
+
oldStamp,
|
|
112
|
+
newStamp: null,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
const stampChanged = oldStamp !== newStamp;
|
|
117
|
+
if (pkgChanged && !stampChanged) {
|
|
118
|
+
return {
|
|
119
|
+
skipped: null,
|
|
120
|
+
finding: {
|
|
121
|
+
code: "skill-version-stamp-not-bumped",
|
|
122
|
+
message: `package.json bumped ${oldPkgVersion} -> ${newPkgVersion} but SKILL.md's em-version: stamp stayed at ${newStamp}`,
|
|
123
|
+
oldPkgVersion,
|
|
124
|
+
newPkgVersion,
|
|
125
|
+
oldStamp,
|
|
126
|
+
newStamp,
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (!pkgChanged && stampChanged) {
|
|
131
|
+
return {
|
|
132
|
+
skipped: null,
|
|
133
|
+
finding: {
|
|
134
|
+
code: "skill-version-stamp-stray-bump",
|
|
135
|
+
message: `SKILL.md's em-version: stamp changed (${oldStamp ?? "(none)"} -> ${newStamp}) but package.json's version didn't move (still ${newPkgVersion})`,
|
|
136
|
+
oldPkgVersion,
|
|
137
|
+
newPkgVersion,
|
|
138
|
+
oldStamp,
|
|
139
|
+
newStamp,
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return { finding: null, skipped: null };
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=skillVersionCheck.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skillVersionCheck.js","sourceRoot":"","sources":["../../src/cli/skillVersionCheck.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.d.ts
CHANGED