@milehimikey/em 1.1.0 → 1.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/.claude/skills/event-modeling/SKILL.md +64 -81
- package/.claude/skills/event-modeling/reference/em-dsl.md +23 -18
- package/.claude/skills/event-modeling/reference/extract.md +123 -0
- package/.claude/skills/event-modeling/reference/methodology.md +23 -0
- package/.claude/skills/event-modeling/templates/live.html +65 -13
- package/.claude/skills/event-modeling/templates/model-readme.md +9 -6
- package/.claude/skills/event-modeling/templates/slice.md +2 -4
- package/.claude/skills/event-modeling/templates/state.md +16 -11
- package/README.md +44 -199
- package/dist/cli.js +21 -227
- package/dist/cli.js.map +1 -1
- package/dist/model/validate.d.ts +0 -2
- package/dist/model/validate.js +1 -1
- package/dist/model/validate.js.map +1 -1
- package/dist/render/serve.d.ts +20 -0
- package/dist/render/serve.js +202 -0
- package/dist/render/serve.js.map +1 -0
- package/package.json +4 -5
- package/.claude/skills/event-modeling/reference/frontmatter.md +0 -129
- package/dist/config.d.ts +0 -15
- package/dist/config.js +0 -60
- package/dist/config.js.map +0 -1
- package/dist/migrate/migrate.d.ts +0 -26
- package/dist/migrate/migrate.js +0 -276
- package/dist/migrate/migrate.js.map +0 -1
- package/dist/model/deriveSliceFields.d.ts +0 -21
- package/dist/model/deriveSliceFields.js +0 -60
- package/dist/model/deriveSliceFields.js.map +0 -1
- package/dist/model/frontmatter.d.ts +0 -21
- package/dist/model/frontmatter.js +0 -38
- package/dist/model/frontmatter.js.map +0 -1
- package/dist/model/sliceDoc.d.ts +0 -56
- package/dist/model/sliceDoc.js +0 -28
- package/dist/model/sliceDoc.js.map +0 -1
- package/dist/model/validateSliceDocs.d.ts +0 -7
- package/dist/model/validateSliceDocs.js +0 -195
- package/dist/model/validateSliceDocs.js.map +0 -1
- package/dist/slice/generate.d.ts +0 -17
- package/dist/slice/generate.js +0 -61
- package/dist/slice/generate.js.map +0 -1
- package/dist/slice/query.d.ts +0 -42
- package/dist/slice/query.js +0 -96
- package/dist/slice/query.js.map +0 -1
- package/dist/slice/sync.d.ts +0 -18
- package/dist/slice/sync.js +0 -104
- package/dist/slice/sync.js.map +0 -1
- package/dist/util/findModel.d.ts +0 -1
- package/dist/util/findModel.js +0 -27
- package/dist/util/findModel.js.map +0 -1
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
// Diagnostics for slice docs (slices/*.md), per docs/1.0.0-spec.md §5. Mirrors
|
|
3
|
-
// the Diagnostic { severity, message, line? } shape from validate.ts, using
|
|
4
|
-
// `file` instead of `line` since these point at a Markdown doc, not the .em.
|
|
5
|
-
import { existsSync } from "node:fs";
|
|
6
|
-
import { dirname, resolve } from "node:path";
|
|
7
|
-
import { buildDocIdByElementId, deriveGeneratedFields } from "./deriveSliceFields.js";
|
|
8
|
-
export const CURRENT_SCHEMA_VERSION = 1;
|
|
9
|
-
export const VALID_PATTERNS = [
|
|
10
|
-
"state-change",
|
|
11
|
-
"state-view",
|
|
12
|
-
"automation",
|
|
13
|
-
"translation",
|
|
14
|
-
];
|
|
15
|
-
export const VALID_STATUSES = [
|
|
16
|
-
"draft",
|
|
17
|
-
"reviewed",
|
|
18
|
-
"ready-to-implement",
|
|
19
|
-
"in-progress",
|
|
20
|
-
"implemented",
|
|
21
|
-
"deprecated",
|
|
22
|
-
"superseded",
|
|
23
|
-
];
|
|
24
|
-
const KEBAB_RE = /^[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
25
|
-
function sameStringArray(a, b) {
|
|
26
|
-
if (!Array.isArray(a))
|
|
27
|
-
return b.length === 0;
|
|
28
|
-
if (a.length !== b.length)
|
|
29
|
-
return false;
|
|
30
|
-
return a.every((v, i) => v === b[i]);
|
|
31
|
-
}
|
|
32
|
-
export function validateSliceDocs(model, modelPath, docs) {
|
|
33
|
-
const diags = [];
|
|
34
|
-
// Which .em elements already have a doc linking back to them (note "slices/<file>.md").
|
|
35
|
-
const notedPaths = new Set();
|
|
36
|
-
for (const el of model.elements) {
|
|
37
|
-
if (el.note)
|
|
38
|
-
notedPaths.add(resolve(dirname(modelPath), el.note));
|
|
39
|
-
}
|
|
40
|
-
// Every doc whose id + sliceElement look usable, so triggers/triggeredBy and
|
|
41
|
-
// drift-checks can resolve cross-doc even when other fields on a doc are invalid.
|
|
42
|
-
const docIdByElementId = buildDocIdByElementId(model, docs);
|
|
43
|
-
const seenIds = new Map(); // id -> first doc path that used it
|
|
44
|
-
const knownIds = new Set(docs.map((d) => d.frontmatter?.id).filter(Boolean));
|
|
45
|
-
for (const doc of docs) {
|
|
46
|
-
const data = doc.frontmatter;
|
|
47
|
-
if (!data) {
|
|
48
|
-
diags.push({
|
|
49
|
-
severity: "error",
|
|
50
|
-
file: doc.path,
|
|
51
|
-
message: "no frontmatter block found; run `em migrate` to upgrade this model directory",
|
|
52
|
-
});
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
if (typeof data.schemaVersion !== "number" || !Number.isInteger(data.schemaVersion)) {
|
|
56
|
-
diags.push({ severity: "error", file: doc.path, message: "missing or invalid `schemaVersion`" });
|
|
57
|
-
}
|
|
58
|
-
else if (data.schemaVersion > CURRENT_SCHEMA_VERSION) {
|
|
59
|
-
diags.push({
|
|
60
|
-
severity: "error",
|
|
61
|
-
file: doc.path,
|
|
62
|
-
message: `schemaVersion ${data.schemaVersion} is newer than this em build understands (${CURRENT_SCHEMA_VERSION}); upgrade @milehimikey/em`,
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
if (typeof data.id !== "string" || data.id.length === 0) {
|
|
66
|
-
diags.push({ severity: "error", file: doc.path, message: "missing or invalid `id`" });
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
if (!KEBAB_RE.test(data.id)) {
|
|
70
|
-
diags.push({
|
|
71
|
-
severity: "error",
|
|
72
|
-
file: doc.path,
|
|
73
|
-
message: `id "${data.id}" is not kebab-case (expected e.g. "place-order")`,
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
const firstPath = seenIds.get(data.id);
|
|
77
|
-
if (firstPath && firstPath !== doc.path) {
|
|
78
|
-
diags.push({
|
|
79
|
-
severity: "error",
|
|
80
|
-
file: doc.path,
|
|
81
|
-
message: `id "${data.id}" is also used by ${firstPath}; slice ids must be unique within a model directory`,
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
else if (!firstPath) {
|
|
85
|
-
seenIds.set(data.id, doc.path);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
if (typeof data.title !== "string" || data.title.length === 0) {
|
|
89
|
-
diags.push({ severity: "error", file: doc.path, message: "missing or invalid `title`" });
|
|
90
|
-
}
|
|
91
|
-
if (typeof data.pattern !== "string" || !VALID_PATTERNS.includes(data.pattern)) {
|
|
92
|
-
diags.push({
|
|
93
|
-
severity: "error",
|
|
94
|
-
file: doc.path,
|
|
95
|
-
message: `\`pattern\` must be one of ${VALID_PATTERNS.join(", ")}`,
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
if (typeof data.status !== "string" || !VALID_STATUSES.includes(data.status)) {
|
|
99
|
-
diags.push({
|
|
100
|
-
severity: "error",
|
|
101
|
-
file: doc.path,
|
|
102
|
-
message: `\`status\` must be one of ${VALID_STATUSES.join(", ")}`,
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
if (typeof data.version !== "number" || !Number.isInteger(data.version) || data.version < 1) {
|
|
106
|
-
diags.push({ severity: "error", file: doc.path, message: "`version` must be a positive integer" });
|
|
107
|
-
}
|
|
108
|
-
if (typeof data.model !== "string" || data.model.length === 0) {
|
|
109
|
-
diags.push({ severity: "error", file: doc.path, message: "missing or invalid `model`" });
|
|
110
|
-
}
|
|
111
|
-
else if (!existsSync(resolve(dirname(doc.path), data.model))) {
|
|
112
|
-
diags.push({
|
|
113
|
-
severity: "error",
|
|
114
|
-
file: doc.path,
|
|
115
|
-
message: `\`model\` "${data.model}" does not resolve to an existing file`,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
let sliceElementId;
|
|
119
|
-
if (typeof data.sliceElement !== "string" || data.sliceElement.length === 0) {
|
|
120
|
-
diags.push({ severity: "error", file: doc.path, message: "missing or invalid `sliceElement`" });
|
|
121
|
-
}
|
|
122
|
-
else if (!model.byId.has(data.sliceElement)) {
|
|
123
|
-
diags.push({
|
|
124
|
-
severity: "error",
|
|
125
|
-
file: doc.path,
|
|
126
|
-
message: `sliceElement "${data.sliceElement}" does not match any element in ${modelPath}`,
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
sliceElementId = data.sliceElement;
|
|
131
|
-
}
|
|
132
|
-
if (Array.isArray(data.upstreamEvents)) {
|
|
133
|
-
for (const name of data.upstreamEvents) {
|
|
134
|
-
const found = model.elements.some((e) => e.kind === "event" && e.name === name);
|
|
135
|
-
if (!found) {
|
|
136
|
-
diags.push({
|
|
137
|
-
severity: "warning",
|
|
138
|
-
file: doc.path,
|
|
139
|
-
message: `upstreamEvents references unknown event "${name}"`,
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
if (Array.isArray(data.relatedSlices)) {
|
|
145
|
-
for (const id of data.relatedSlices) {
|
|
146
|
-
if (!knownIds.has(id)) {
|
|
147
|
-
diags.push({
|
|
148
|
-
severity: "warning",
|
|
149
|
-
file: doc.path,
|
|
150
|
-
message: `relatedSlices references unknown slice id "${id}"`,
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
if (!notedPaths.has(resolve(doc.path))) {
|
|
156
|
-
diags.push({
|
|
157
|
-
severity: "warning",
|
|
158
|
-
file: doc.path,
|
|
159
|
-
message: 'no element in the .em model has `note "..."` pointing at this doc (orphan doc)',
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
else if (sliceElementId) {
|
|
163
|
-
const el = model.byId.get(sliceElementId);
|
|
164
|
-
const notePath = el.note && resolve(dirname(modelPath), el.note);
|
|
165
|
-
if (notePath !== resolve(doc.path)) {
|
|
166
|
-
diags.push({
|
|
167
|
-
severity: "warning",
|
|
168
|
-
file: doc.path,
|
|
169
|
-
message: `sliceElement "${sliceElementId}"'s note does not point back at this doc`,
|
|
170
|
-
});
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (sliceElementId) {
|
|
174
|
-
const derived = deriveGeneratedFields(model, sliceElementId, docIdByElementId);
|
|
175
|
-
if (derived) {
|
|
176
|
-
const drifted = !sameStringArray(data.commands, derived.commands) ||
|
|
177
|
-
!sameStringArray(data.events, derived.events) ||
|
|
178
|
-
!sameStringArray(data.readModels, derived.readModels) ||
|
|
179
|
-
!sameStringArray(data.contexts, derived.contexts) ||
|
|
180
|
-
!sameStringArray(data.personas, derived.personas) ||
|
|
181
|
-
(data.triggers ?? undefined) !== derived.triggers ||
|
|
182
|
-
(data.triggeredBy ?? undefined) !== derived.triggeredBy;
|
|
183
|
-
if (drifted) {
|
|
184
|
-
diags.push({
|
|
185
|
-
severity: "warning",
|
|
186
|
-
file: doc.path,
|
|
187
|
-
message: "frontmatter out of sync with .em; run `em slice sync`",
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
return diags;
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=validateSliceDocs.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateSliceDocs.js","sourceRoot":"","sources":["../../src/model/validateSliceDocs.ts"],"names":[],"mappings":"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"}
|
package/dist/slice/generate.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { SlicePattern } from "../model/sliceDoc.js";
|
|
2
|
-
export interface NewSliceOptions {
|
|
3
|
-
dir?: string;
|
|
4
|
-
modelPath?: string;
|
|
5
|
-
configPath?: string;
|
|
6
|
-
pattern?: SlicePattern;
|
|
7
|
-
id?: string;
|
|
8
|
-
/** The .em Element.id this doc documents, if already known (skips straight to a synced doc). */
|
|
9
|
-
sliceElement?: string;
|
|
10
|
-
force?: boolean;
|
|
11
|
-
}
|
|
12
|
-
export interface NewSliceResult {
|
|
13
|
-
path: string;
|
|
14
|
-
id: string;
|
|
15
|
-
modelPath: string;
|
|
16
|
-
}
|
|
17
|
-
export declare function newSlice(name: string, opts?: NewSliceOptions): NewSliceResult;
|
package/dist/slice/generate.js
DELETED
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
// `em slice new` — scaffolds slices/<id>.md: resolves the configured (or
|
|
3
|
-
// default) body template, injects the required frontmatter block, and never
|
|
4
|
-
// touches the .em (wiring `note "slices/<id>.md"` onto an element stays the
|
|
5
|
-
// agent's job — see docs/1.0.0-spec.md §6).
|
|
6
|
-
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
-
import { join, relative } from "node:path";
|
|
8
|
-
import { resolveConfig, resolveSliceTemplatePath } from "../config.js";
|
|
9
|
-
import { frontmatterFromData, stringifyFrontmatter } from "../model/frontmatter.js";
|
|
10
|
-
import { loadSliceDocs } from "../model/sliceDoc.js";
|
|
11
|
-
import { CURRENT_SCHEMA_VERSION } from "../model/validateSliceDocs.js";
|
|
12
|
-
import { findModelFile } from "../util/findModel.js";
|
|
13
|
-
import { dedupe, kebabSlug } from "../util/slug.js";
|
|
14
|
-
import { syncSlice } from "./sync.js";
|
|
15
|
-
export function newSlice(name, opts = {}) {
|
|
16
|
-
const dir = opts.dir ?? process.cwd();
|
|
17
|
-
const modelPath = findModelFile(dir, opts.modelPath);
|
|
18
|
-
const slicesDir = join(dir, "slices");
|
|
19
|
-
mkdirSync(slicesDir, { recursive: true });
|
|
20
|
-
const existingIds = new Set(loadSliceDocs(dir)
|
|
21
|
-
.map((d) => d.frontmatter?.id)
|
|
22
|
-
.filter((id) => typeof id === "string"));
|
|
23
|
-
let id;
|
|
24
|
-
if (opts.id) {
|
|
25
|
-
if (existingIds.has(opts.id)) {
|
|
26
|
-
throw new Error(`id "${opts.id}" is already used by another slice doc in ${slicesDir}`);
|
|
27
|
-
}
|
|
28
|
-
id = opts.id;
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
id = dedupe(kebabSlug(name), existingIds, "-");
|
|
32
|
-
}
|
|
33
|
-
const path = join(slicesDir, `${id}.md`);
|
|
34
|
-
if (existsSync(path) && !opts.force) {
|
|
35
|
-
throw new Error(`refusing to overwrite ${path} (use --force)`);
|
|
36
|
-
}
|
|
37
|
-
const resolvedConfig = resolveConfig(dir, opts.configPath);
|
|
38
|
-
const templatePath = resolveSliceTemplatePath(resolvedConfig);
|
|
39
|
-
const bodyTemplate = readFileSync(templatePath, "utf8");
|
|
40
|
-
const body = bodyTemplate.replaceAll("{{Slice Name}}", name);
|
|
41
|
-
const today = new Date().toISOString().slice(0, 10);
|
|
42
|
-
const data = {
|
|
43
|
-
schemaVersion: CURRENT_SCHEMA_VERSION,
|
|
44
|
-
id,
|
|
45
|
-
title: name,
|
|
46
|
-
pattern: opts.pattern ?? "state-change",
|
|
47
|
-
status: "draft",
|
|
48
|
-
version: 1,
|
|
49
|
-
model: relative(slicesDir, modelPath),
|
|
50
|
-
created: today,
|
|
51
|
-
updated: today,
|
|
52
|
-
};
|
|
53
|
-
if (opts.sliceElement)
|
|
54
|
-
data.sliceElement = opts.sliceElement;
|
|
55
|
-
writeFileSync(path, stringifyFrontmatter(frontmatterFromData(data), body));
|
|
56
|
-
if (opts.sliceElement) {
|
|
57
|
-
syncSlice(id, { dir, modelPath });
|
|
58
|
-
}
|
|
59
|
-
return { path, id, modelPath };
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/slice/generate.ts"],"names":[],"mappings":"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"}
|
package/dist/slice/query.d.ts
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { SliceDoc, SlicePattern, SliceStatus } from "../model/sliceDoc.js";
|
|
2
|
-
export interface SliceSummary {
|
|
3
|
-
id: string;
|
|
4
|
-
title: string;
|
|
5
|
-
pattern: SlicePattern | undefined;
|
|
6
|
-
status: SliceStatus | undefined;
|
|
7
|
-
version: number | undefined;
|
|
8
|
-
file: string;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* A doc's complete frontmatter, plus the `file` it came from so a caller can
|
|
12
|
-
* open it without a second lookup. `file` is set after the spread, so it wins
|
|
13
|
-
* over a frontmatter key of the same name — treat `file` as reserved.
|
|
14
|
-
*/
|
|
15
|
-
export type SliceRecord = Record<string, unknown> & {
|
|
16
|
-
file: string;
|
|
17
|
-
};
|
|
18
|
-
export interface ListOptions {
|
|
19
|
-
dir?: string;
|
|
20
|
-
status?: SliceStatus;
|
|
21
|
-
pattern?: SlicePattern;
|
|
22
|
-
context?: string;
|
|
23
|
-
tag?: string;
|
|
24
|
-
}
|
|
25
|
-
export declare function listSlices(opts?: ListOptions): SliceSummary[];
|
|
26
|
-
/** Same selection as listSlices, but every frontmatter field rather than the summary. */
|
|
27
|
-
export declare function listSliceRecords(opts?: ListOptions): SliceRecord[];
|
|
28
|
-
export declare function showSlice(id: string, opts?: {
|
|
29
|
-
dir?: string;
|
|
30
|
-
}): SliceDoc | undefined;
|
|
31
|
-
export type SearchOptions = ListOptions;
|
|
32
|
-
export declare function searchSlices(query: string, opts?: SearchOptions): SliceSummary[];
|
|
33
|
-
/** Same selection as searchSlices, but every frontmatter field rather than the summary. */
|
|
34
|
-
export declare function searchSliceRecords(query: string, opts?: SearchOptions): SliceRecord[];
|
|
35
|
-
export interface UpdateOptions {
|
|
36
|
-
dir?: string;
|
|
37
|
-
status?: SliceStatus;
|
|
38
|
-
bumpVersion?: boolean;
|
|
39
|
-
}
|
|
40
|
-
export declare function updateSlice(id: string, opts?: UpdateOptions): {
|
|
41
|
-
path: string;
|
|
42
|
-
};
|
package/dist/slice/query.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
// `em slice list|show|search|update` — reads (and, for `update`, writes)
|
|
3
|
-
// frontmatter only. Never the doc body, never the .em. That's what keeps
|
|
4
|
-
// these cheap across hundreds of slices — see docs/1.0.0-spec.md §6.
|
|
5
|
-
import { writeFileSync } from "node:fs";
|
|
6
|
-
import { mergeFrontmatter, stringifyFrontmatter } from "../model/frontmatter.js";
|
|
7
|
-
import { loadSliceDocs } from "../model/sliceDoc.js";
|
|
8
|
-
/** The one filter path. Every list/search entry point narrows docs through this. */
|
|
9
|
-
function selectDocs(opts, query = "") {
|
|
10
|
-
const dir = opts.dir ?? process.cwd();
|
|
11
|
-
const q = query.trim().toLowerCase();
|
|
12
|
-
return loadSliceDocs(dir)
|
|
13
|
-
.filter((d) => typeof d.frontmatter?.id === "string")
|
|
14
|
-
.filter((d) => !opts.status || d.frontmatter.status === opts.status)
|
|
15
|
-
.filter((d) => !opts.pattern || d.frontmatter.pattern === opts.pattern)
|
|
16
|
-
.filter((d) => !opts.context || asStringArray(d.frontmatter.contexts).includes(opts.context))
|
|
17
|
-
.filter((d) => !opts.tag || asStringArray(d.frontmatter.tags).includes(opts.tag))
|
|
18
|
-
.filter((d) => q.length === 0 || matchesQuery(d.frontmatter, q));
|
|
19
|
-
}
|
|
20
|
-
export function listSlices(opts = {}) {
|
|
21
|
-
return selectDocs(opts).map(toSummary).filter((s) => s !== null);
|
|
22
|
-
}
|
|
23
|
-
/** Same selection as listSlices, but every frontmatter field rather than the summary. */
|
|
24
|
-
export function listSliceRecords(opts = {}) {
|
|
25
|
-
return selectDocs(opts).map(toRecord);
|
|
26
|
-
}
|
|
27
|
-
export function showSlice(id, opts = {}) {
|
|
28
|
-
const dir = opts.dir ?? process.cwd();
|
|
29
|
-
return loadSliceDocs(dir).find((d) => d.frontmatter?.id === id);
|
|
30
|
-
}
|
|
31
|
-
export function searchSlices(query, opts = {}) {
|
|
32
|
-
return selectDocs(opts, query).map(toSummary).filter((s) => s !== null);
|
|
33
|
-
}
|
|
34
|
-
/** Same selection as searchSlices, but every frontmatter field rather than the summary. */
|
|
35
|
-
export function searchSliceRecords(query, opts = {}) {
|
|
36
|
-
return selectDocs(opts, query).map(toRecord);
|
|
37
|
-
}
|
|
38
|
-
export function updateSlice(id, opts = {}) {
|
|
39
|
-
const dir = opts.dir ?? process.cwd();
|
|
40
|
-
const doc = loadSliceDocs(dir).find((d) => d.frontmatter?.id === id);
|
|
41
|
-
if (!doc || !doc.document || !doc.frontmatter) {
|
|
42
|
-
throw new Error(`no slice doc with id "${id}" (with valid frontmatter) found in ${dir}`);
|
|
43
|
-
}
|
|
44
|
-
const patch = {};
|
|
45
|
-
if (opts.status)
|
|
46
|
-
patch.status = opts.status;
|
|
47
|
-
if (opts.bumpVersion) {
|
|
48
|
-
const current = typeof doc.frontmatter.version === "number" ? doc.frontmatter.version : 0;
|
|
49
|
-
patch.version = current + 1;
|
|
50
|
-
}
|
|
51
|
-
if (Object.keys(patch).length === 0) {
|
|
52
|
-
throw new Error("nothing to update — pass --status and/or --bump-version");
|
|
53
|
-
}
|
|
54
|
-
patch.updated = new Date().toISOString().slice(0, 10);
|
|
55
|
-
mergeFrontmatter(doc.document, patch);
|
|
56
|
-
writeFileSync(doc.path, stringifyFrontmatter(doc.document, doc.body));
|
|
57
|
-
return { path: doc.path };
|
|
58
|
-
}
|
|
59
|
-
function toSummary(doc) {
|
|
60
|
-
const data = doc.frontmatter;
|
|
61
|
-
if (!data || typeof data.id !== "string")
|
|
62
|
-
return null;
|
|
63
|
-
return {
|
|
64
|
-
id: data.id,
|
|
65
|
-
title: typeof data.title === "string" ? data.title : data.id,
|
|
66
|
-
pattern: data.pattern,
|
|
67
|
-
status: data.status,
|
|
68
|
-
version: typeof data.version === "number" ? data.version : undefined,
|
|
69
|
-
file: doc.file,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
function toRecord(doc) {
|
|
73
|
-
return { ...doc.frontmatter, file: doc.file };
|
|
74
|
-
}
|
|
75
|
-
function matchesQuery(data, q) {
|
|
76
|
-
const haystack = [
|
|
77
|
-
data.title,
|
|
78
|
-
...asStringArray(data.tags),
|
|
79
|
-
...asStringArray(data.commands),
|
|
80
|
-
...asStringArray(data.events),
|
|
81
|
-
...asStringArray(data.readModels),
|
|
82
|
-
// `compliance` is a reserved, unvalidated block (docs/1.0.0-spec.md §2.6) — its shape isn't
|
|
83
|
-
// known, so flatten whatever's there rather than reading named sub-fields. Without this,
|
|
84
|
-
// freeform compliance data (PCI-DSS, SOX, HIPAA, ...) would be the one thing in frontmatter
|
|
85
|
-
// an agent couldn't search for.
|
|
86
|
-
data.compliance !== undefined ? JSON.stringify(data.compliance) : undefined,
|
|
87
|
-
]
|
|
88
|
-
.filter((v) => typeof v === "string")
|
|
89
|
-
.join(" ")
|
|
90
|
-
.toLowerCase();
|
|
91
|
-
return haystack.includes(q);
|
|
92
|
-
}
|
|
93
|
-
function asStringArray(v) {
|
|
94
|
-
return Array.isArray(v) ? v.filter((x) => typeof x === "string") : [];
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=query.js.map
|
package/dist/slice/query.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/slice/query.ts"],"names":[],"mappings":"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"}
|
package/dist/slice/sync.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export interface SyncOptions {
|
|
2
|
-
dir?: string;
|
|
3
|
-
modelPath?: string;
|
|
4
|
-
}
|
|
5
|
-
export interface SyncResult {
|
|
6
|
-
id: string;
|
|
7
|
-
path: string;
|
|
8
|
-
changed: boolean;
|
|
9
|
-
}
|
|
10
|
-
export interface SyncAllResult {
|
|
11
|
-
synced: SyncResult[];
|
|
12
|
-
skipped: {
|
|
13
|
-
file: string;
|
|
14
|
-
reason: string;
|
|
15
|
-
}[];
|
|
16
|
-
}
|
|
17
|
-
export declare function syncSlice(id: string, opts?: SyncOptions): SyncResult;
|
|
18
|
-
export declare function syncAll(opts?: SyncOptions): SyncAllResult;
|
package/dist/slice/sync.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
// `em slice sync` — the one command that reads the .em and (re)writes the
|
|
3
|
-
// generated frontmatter fields (commands/events/readModels/contexts/personas/
|
|
4
|
-
// triggers/triggeredBy). Everything else (`list`/`show`/`search`) trusts this
|
|
5
|
-
// cache instead of re-deriving it. See docs/1.0.0-spec.md §6.
|
|
6
|
-
import { readFileSync, writeFileSync } from "node:fs";
|
|
7
|
-
import { dirname, resolve } from "node:path";
|
|
8
|
-
import { parse } from "../parser/parser.js";
|
|
9
|
-
import { normalize } from "../model/model.js";
|
|
10
|
-
import { buildDocIdByElementId, deriveGeneratedFields } from "../model/deriveSliceFields.js";
|
|
11
|
-
import { mergeFrontmatter, stringifyFrontmatter } from "../model/frontmatter.js";
|
|
12
|
-
import { loadSliceDocs } from "../model/sliceDoc.js";
|
|
13
|
-
import { findModelFile } from "../util/findModel.js";
|
|
14
|
-
const GENERATED_KEYS = ["commands", "events", "readModels", "contexts", "personas"];
|
|
15
|
-
/**
|
|
16
|
-
* Parse the .em and load every slice doc once. Shared by syncSlice and syncAll.
|
|
17
|
-
*
|
|
18
|
-
* Every doc's sliceElement is resolved up front — from frontmatter, or discovered
|
|
19
|
-
* from the .em's `note` back-reference — so `docIdByElementId` already covers docs
|
|
20
|
-
* that haven't had their sliceElement written yet. That makes a `--all` run
|
|
21
|
-
* order-independent: triggers/triggeredBy resolve between two freshly-scaffolded
|
|
22
|
-
* docs regardless of which one syncs first.
|
|
23
|
-
*/
|
|
24
|
-
function loadContext(opts) {
|
|
25
|
-
const dir = opts.dir ?? process.cwd();
|
|
26
|
-
const modelPath = findModelFile(dir, opts.modelPath);
|
|
27
|
-
const model = normalize(parse(readFileSync(modelPath, "utf8")));
|
|
28
|
-
const docs = loadSliceDocs(dir);
|
|
29
|
-
const elementByDocId = new Map();
|
|
30
|
-
for (const doc of docs) {
|
|
31
|
-
const id = doc.frontmatter?.id;
|
|
32
|
-
if (typeof id !== "string")
|
|
33
|
-
continue;
|
|
34
|
-
const raw = doc.frontmatter.sliceElement;
|
|
35
|
-
if (typeof raw === "string" && raw.length > 0) {
|
|
36
|
-
elementByDocId.set(id, raw);
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
const discovered = model.elements.find((el) => el.note && resolve(dirname(modelPath), el.note) === resolve(doc.path));
|
|
40
|
-
if (discovered)
|
|
41
|
-
elementByDocId.set(id, discovered.id);
|
|
42
|
-
}
|
|
43
|
-
const docIdByElementId = buildDocIdByElementId(model, docs);
|
|
44
|
-
for (const [docId, elementId] of elementByDocId)
|
|
45
|
-
docIdByElementId.set(elementId, docId);
|
|
46
|
-
return { dir, modelPath, model, docs, elementByDocId, docIdByElementId };
|
|
47
|
-
}
|
|
48
|
-
export function syncSlice(id, opts = {}) {
|
|
49
|
-
return syncOne(id, loadContext(opts));
|
|
50
|
-
}
|
|
51
|
-
function syncOne(id, ctx) {
|
|
52
|
-
const { dir, modelPath, model, docs, elementByDocId, docIdByElementId } = ctx;
|
|
53
|
-
const doc = docs.find((d) => d.frontmatter?.id === id);
|
|
54
|
-
if (!doc || !doc.frontmatter || !doc.document) {
|
|
55
|
-
throw new Error(`no slice doc with id "${id}" (with valid frontmatter) found in ${dir}`);
|
|
56
|
-
}
|
|
57
|
-
const sliceElementId = elementByDocId.get(id);
|
|
58
|
-
if (!sliceElementId) {
|
|
59
|
-
throw new Error(`slice "${id}" has no sliceElement set — wire \`note "slices/${doc.file}"\` onto an ` +
|
|
60
|
-
`element in ${modelPath} first, then re-run sync`);
|
|
61
|
-
}
|
|
62
|
-
const derived = deriveGeneratedFields(model, sliceElementId, docIdByElementId);
|
|
63
|
-
if (!derived) {
|
|
64
|
-
throw new Error(`sliceElement "${sliceElementId}" does not match any element in ${modelPath}`);
|
|
65
|
-
}
|
|
66
|
-
const before = doc.document.toJS();
|
|
67
|
-
const changed = before.sliceElement !== sliceElementId ||
|
|
68
|
-
GENERATED_KEYS.some((key) => JSON.stringify(before[key] ?? []) !== JSON.stringify(derived[key])) ||
|
|
69
|
-
before.triggers !== derived.triggers ||
|
|
70
|
-
before.triggeredBy !== derived.triggeredBy;
|
|
71
|
-
mergeFrontmatter(doc.document, { sliceElement: sliceElementId });
|
|
72
|
-
for (const key of GENERATED_KEYS)
|
|
73
|
-
mergeFrontmatter(doc.document, { [key]: derived[key] });
|
|
74
|
-
setOrDelete(doc, "triggers", derived.triggers);
|
|
75
|
-
setOrDelete(doc, "triggeredBy", derived.triggeredBy);
|
|
76
|
-
writeFileSync(doc.path, stringifyFrontmatter(doc.document, doc.body));
|
|
77
|
-
return { id, path: doc.path, changed };
|
|
78
|
-
}
|
|
79
|
-
export function syncAll(opts = {}) {
|
|
80
|
-
const ctx = loadContext(opts);
|
|
81
|
-
const synced = [];
|
|
82
|
-
const skipped = [];
|
|
83
|
-
for (const doc of ctx.docs) {
|
|
84
|
-
const id = doc.frontmatter?.id;
|
|
85
|
-
if (typeof id !== "string") {
|
|
86
|
-
skipped.push({ file: doc.file, reason: "no frontmatter (or no `id`); run `em migrate`" });
|
|
87
|
-
continue;
|
|
88
|
-
}
|
|
89
|
-
try {
|
|
90
|
-
synced.push(syncOne(id, ctx));
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
skipped.push({ file: doc.file, reason: e instanceof Error ? e.message : String(e) });
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
return { synced, skipped };
|
|
97
|
-
}
|
|
98
|
-
function setOrDelete(doc, key, value) {
|
|
99
|
-
if (value === undefined)
|
|
100
|
-
doc.document.delete(key);
|
|
101
|
-
else
|
|
102
|
-
mergeFrontmatter(doc.document, { [key]: value });
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=sync.js.map
|
package/dist/slice/sync.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/slice/sync.ts"],"names":[],"mappings":"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"}
|
package/dist/util/findModel.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function findModelFile(dir: string, explicitPath?: string): string;
|
package/dist/util/findModel.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
// Resolves "the .em file" for a model directory, per the skill's existing
|
|
3
|
-
// one-model-per-directory convention. Shared by every `em slice`/`em migrate`
|
|
4
|
-
// command so an explicit --model always wins and the "which .em?" ambiguity
|
|
5
|
-
// error is worded the same way everywhere.
|
|
6
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
7
|
-
import { resolve } from "node:path";
|
|
8
|
-
export function findModelFile(dir, explicitPath) {
|
|
9
|
-
if (explicitPath) {
|
|
10
|
-
// Relative to cwd, not `dir` — an explicit --model is a path the user typed
|
|
11
|
-
// at the shell, so it must resolve the same way their shell would resolve it.
|
|
12
|
-
// Checked eagerly: callers like `em slice new` only ever store this path in
|
|
13
|
-
// frontmatter, so a wrong one would otherwise sit undetected until validate.
|
|
14
|
-
const path = resolve(explicitPath);
|
|
15
|
-
if (!existsSync(path))
|
|
16
|
-
throw new Error(`model file not found: ${path}`);
|
|
17
|
-
return path;
|
|
18
|
-
}
|
|
19
|
-
const candidates = readdirSync(dir).filter((f) => f.endsWith(".em"));
|
|
20
|
-
if (candidates.length === 1)
|
|
21
|
-
return resolve(dir, candidates[0]);
|
|
22
|
-
if (candidates.length === 0) {
|
|
23
|
-
throw new Error(`no .em file found in ${dir} (pass --model <path.em>)`);
|
|
24
|
-
}
|
|
25
|
-
throw new Error(`multiple .em files found in ${dir} (${candidates.join(", ")}); pass --model <path.em>`);
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=findModel.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"findModel.js","sourceRoot":"","sources":["../../src/util/findModel.ts"],"names":[],"mappings":"AAAA,+BAA+B;AAC/B,0EAA0E;AAC1E,8EAA8E;AAC9E,4EAA4E;AAC5E,2CAA2C;AAE3C,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,YAAqB;IAC9D,IAAI,YAAY,EAAE,CAAC;QACjB,4EAA4E;QAC5E,8EAA8E;QAC9E,4EAA4E;QAC5E,6EAA6E;QAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACrE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,2BAA2B,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,IAAI,KAAK,CACb,+BAA+B,GAAG,KAAK,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,2BAA2B,CACxF,CAAC;AACJ,CAAC"}
|