@leji-org/leji 1.0.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/README.md +36 -0
- package/assets-manifest.json +25 -0
- package/cli.json +82 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +4 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/conformance.d.ts +24 -0
- package/dist/commands/conformance.js +111 -0
- package/dist/commands/conformance.js.map +1 -0
- package/dist/commands/docs.d.ts +32 -0
- package/dist/commands/docs.js +196 -0
- package/dist/commands/docs.js.map +1 -0
- package/dist/commands/freshness.d.ts +21 -0
- package/dist/commands/freshness.js +41 -0
- package/dist/commands/freshness.js.map +1 -0
- package/dist/commands/indexgen.d.ts +55 -0
- package/dist/commands/indexgen.js +256 -0
- package/dist/commands/indexgen.js.map +1 -0
- package/dist/commands/init.d.ts +28 -0
- package/dist/commands/init.js +378 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/validate.d.ts +25 -0
- package/dist/commands/validate.js +359 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.js +324 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/findings.d.ts +17 -0
- package/dist/lib/findings.js +29 -0
- package/dist/lib/findings.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +14 -0
- package/dist/lib/frontmatter.js +28 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/fsx.d.ts +21 -0
- package/dist/lib/fsx.js +100 -0
- package/dist/lib/fsx.js.map +1 -0
- package/dist/lib/git.d.ts +10 -0
- package/dist/lib/git.js +55 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/layer.d.ts +32 -0
- package/dist/lib/layer.js +138 -0
- package/dist/lib/layer.js.map +1 -0
- package/dist/lib/manifest.d.ts +62 -0
- package/dist/lib/manifest.js +54 -0
- package/dist/lib/manifest.js.map +1 -0
- package/dist/lib/schemas.d.ts +38 -0
- package/dist/lib/schemas.js +57 -0
- package/dist/lib/schemas.js.map +1 -0
- package/package.json +61 -0
- package/schemas/README.md +3 -0
- package/schemas/agent-profile.schema.json +129 -0
- package/schemas/context-changelog.schema.json +150 -0
- package/schemas/context-index.schema.json +137 -0
- package/schemas/context-manifest.schema.json +253 -0
- package/schemas/decision-record.schema.json +84 -0
- package/templates/README.md +5 -0
- package/templates/agent-profile.md +25 -0
- package/templates/agents/core.md +27 -0
- package/templates/boot-profile.md +39 -0
- package/templates/decision-record.md +28 -0
- package/templates/docs-viewer-assets/PROVENANCE.txt +18 -0
- package/templates/docs-viewer-assets/docsify-sidebar-collapse.min.css +24 -0
- package/templates/docs-viewer-assets/docsify-sidebar-collapse.min.js +149 -0
- package/templates/docs-viewer-assets/docsify.min.js +1 -0
- package/templates/docs-viewer-assets/search.min.js +314 -0
- package/templates/docs-viewer-assets/vue.css +1063 -0
- package/templates/docs-viewer.html +63 -0
- package/templates/leji.json +56 -0
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
import * as path from 'node:path';
|
|
2
|
+
import { finding, sortFindings } from '../lib/findings.js';
|
|
3
|
+
import { exists, isFile, readText, underPath, walkMd } from '../lib/fsx.js';
|
|
4
|
+
import { parseFrontmatter } from '../lib/frontmatter.js';
|
|
5
|
+
import { gitShowHead, gitToplevel } from '../lib/git.js';
|
|
6
|
+
import { duplicateIdFindings, readJsonArtifact, scanAgentProfiles, scanDecisionRecords, } from '../lib/layer.js';
|
|
7
|
+
import { CATEGORY_IDS, claimedLevel, levelAtLeast, loadManifest } from '../lib/manifest.js';
|
|
8
|
+
import { SUPPORTED_LINES, schemaErrors } from '../lib/schemas.js';
|
|
9
|
+
import { checkIndex, stableStringify } from './indexgen.js';
|
|
10
|
+
/** Vendor entrypoint files checked for the redirect rule even when undeclared. */
|
|
11
|
+
export const KNOWN_VENDOR_FILES = [
|
|
12
|
+
'CLAUDE.md',
|
|
13
|
+
'AGENTS.md',
|
|
14
|
+
'.cursorrules',
|
|
15
|
+
'.cursor/rules',
|
|
16
|
+
'.github/copilot-instructions.md',
|
|
17
|
+
];
|
|
18
|
+
/**
|
|
19
|
+
* Canonical changelog order (machine-readable-surface.md req 3): ascending by
|
|
20
|
+
* `date`, then `id` as the tiebreak. `date` is UTC (date-only or `…Z`), so a
|
|
21
|
+
* lexical compare of the string is chronological; `id` is unique, so the pair
|
|
22
|
+
* is a total order.
|
|
23
|
+
*/
|
|
24
|
+
function compareByDateId(a, b) {
|
|
25
|
+
const ad = String(a.date ?? '');
|
|
26
|
+
const bd = String(b.date ?? '');
|
|
27
|
+
if (ad !== bd)
|
|
28
|
+
return ad < bd ? -1 : 1;
|
|
29
|
+
const ai = String(a.id ?? '');
|
|
30
|
+
const bi = String(b.id ?? '');
|
|
31
|
+
return ai < bi ? -1 : ai > bi ? 1 : 0;
|
|
32
|
+
}
|
|
33
|
+
function checkDeclaredFile(root, rel, what, findings) {
|
|
34
|
+
if (!isFile(path.join(root, rel))) {
|
|
35
|
+
findings.push(finding('missing-declared-file', 'error', `${what} declared in leji.json does not exist`, rel));
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
function checkBootProfile(root, manifest, findings) {
|
|
41
|
+
const rel = manifest.bootProfilePath;
|
|
42
|
+
if (!checkDeclaredFile(root, rel, 'boot profile', findings))
|
|
43
|
+
return;
|
|
44
|
+
const text = readText(path.join(root, rel));
|
|
45
|
+
const headings = [...text.matchAll(/^#{1,6}\s+(.+)$/gm)].map((m) => m[1].toLowerCase());
|
|
46
|
+
for (const section of ['identity', 'loading', 'posture']) {
|
|
47
|
+
if (!headings.some((h) => h.includes(section))) {
|
|
48
|
+
findings.push(finding('boot-profile-sections', 'warning', `boot profile has no "${section}" heading; it must cover identity, loading, and posture`, rel));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const changelogPath = manifest.machine?.changelogPath;
|
|
52
|
+
const decisionsPath = manifest.machine?.decisionRecordsPath ?? manifest.categories.decisions?.paths[0];
|
|
53
|
+
const mentions = (p) => {
|
|
54
|
+
if (!p)
|
|
55
|
+
return false;
|
|
56
|
+
const base = p.endsWith('/') ? p.slice(0, -1) : p;
|
|
57
|
+
return text.includes(base);
|
|
58
|
+
};
|
|
59
|
+
if (!mentions(changelogPath) && !mentions(decisionsPath)) {
|
|
60
|
+
findings.push(finding('boot-profile-maintenance', 'warning', 'boot profile references neither the declared changelog nor the decision-records location; state the maintenance duties', rel));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function checkCategories(root, manifest, findings) {
|
|
64
|
+
const mapped = CATEGORY_IDS.filter((c) => manifest.categories[c]);
|
|
65
|
+
if (!(mapped.includes('domain') || mapped.includes('system')) || !mapped.includes('decisions')) {
|
|
66
|
+
findings.push(finding('categories-minimum', 'error', 'a layer must map at least domain or system, plus decisions, to claim any conformance level', 'leji.json'));
|
|
67
|
+
}
|
|
68
|
+
for (const category of mapped) {
|
|
69
|
+
for (const declared of manifest.categories[category].paths) {
|
|
70
|
+
if (!exists(path.join(root, declared))) {
|
|
71
|
+
findings.push(finding('category-path-missing', 'error', `${category} path does not exist`, declared));
|
|
72
|
+
}
|
|
73
|
+
else if (walkMd(root, declared).length === 0) {
|
|
74
|
+
findings.push(finding('category-empty', 'error', `${category} path has no markdown content; an empty category must not be mapped`, declared));
|
|
75
|
+
}
|
|
76
|
+
if (!underPath(declared, manifest.rootPath)) {
|
|
77
|
+
findings.push(finding('paths-outside-root', 'warning', `${category} path falls outside rootPath ${manifest.rootPath}`, declared));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const [key, rel] of Object.entries(manifest.machine ?? {})) {
|
|
82
|
+
if (typeof rel === 'string' && !underPath(rel, manifest.rootPath)) {
|
|
83
|
+
findings.push(finding('paths-outside-root', 'warning', `machine.${key} falls outside rootPath ${manifest.rootPath}`, rel));
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function checkVendorAdapters(root, manifest, findings) {
|
|
88
|
+
const declared = manifest.vendorAdapters ?? [];
|
|
89
|
+
for (const rel of declared) {
|
|
90
|
+
checkDeclaredFile(root, rel, 'vendor adapter', findings);
|
|
91
|
+
}
|
|
92
|
+
const candidates = new Set([...declared, ...KNOWN_VENDOR_FILES]);
|
|
93
|
+
for (const rel of candidates) {
|
|
94
|
+
const abs = path.join(root, rel);
|
|
95
|
+
if (!isFile(abs))
|
|
96
|
+
continue;
|
|
97
|
+
if (!readText(abs).includes(manifest.bootProfilePath)) {
|
|
98
|
+
findings.push(finding('vendor-adapter-redirect', 'error', `vendor entrypoint does not redirect to the boot profile (${manifest.bootProfilePath})`, rel));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function checkOwners(manifest, findings) {
|
|
103
|
+
// A continuity owner exists to cover the primary's absence (governance.md
|
|
104
|
+
// req 4), so naming the same person provides no continuity.
|
|
105
|
+
const primary = manifest.owners?.primary?.name;
|
|
106
|
+
const continuity = manifest.owners?.continuity?.name;
|
|
107
|
+
if (primary && continuity && primary === continuity) {
|
|
108
|
+
findings.push(finding('continuity-self', 'warning', "continuity owner exists to cover the primary's absence; naming the same person provides none", 'leji.json'));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function checkAgentsMap(root, manifest, findings) {
|
|
112
|
+
const profilesDir = manifest.machine?.agentProfilesPath;
|
|
113
|
+
for (const [role, rel] of Object.entries(manifest.agents ?? {})) {
|
|
114
|
+
if (!checkDeclaredFile(root, rel, `agents.${role} profile`, findings))
|
|
115
|
+
continue;
|
|
116
|
+
// Targets under agentProfilesPath are validated by the directory scan;
|
|
117
|
+
// targets outside it still owe a valid agent-profile frontmatter.
|
|
118
|
+
if (profilesDir && underPath(rel, profilesDir))
|
|
119
|
+
continue;
|
|
120
|
+
const fm = parseFrontmatter(readText(path.join(root, rel)));
|
|
121
|
+
if (fm.error) {
|
|
122
|
+
findings.push(finding('profile-frontmatter', 'error', fm.error, rel));
|
|
123
|
+
}
|
|
124
|
+
else if (!fm.data) {
|
|
125
|
+
findings.push(finding('profile-frontmatter', 'error', 'missing YAML frontmatter', rel));
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
for (const err of schemaErrors('agent-profile', fm.data)) {
|
|
129
|
+
findings.push(finding('profile-frontmatter', 'error', err, rel));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function checkFederationMounts(root, manifest, findings) {
|
|
135
|
+
const mounts = manifest.federation?.mounts ?? [];
|
|
136
|
+
// Identity rules (distribution.md pattern 3): paths and names unique within
|
|
137
|
+
// the manifest; a mount never reuses the host layer's own name.
|
|
138
|
+
const seenPaths = new Set();
|
|
139
|
+
const seenNames = new Set();
|
|
140
|
+
for (const mount of mounts) {
|
|
141
|
+
if (seenPaths.has(mount.path)) {
|
|
142
|
+
findings.push(finding('mount-duplicate', 'error', `two mounts declare the same path "${mount.path}"`, mount.path));
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
seenPaths.add(mount.path);
|
|
146
|
+
}
|
|
147
|
+
if (seenNames.has(mount.name)) {
|
|
148
|
+
findings.push(finding('mount-duplicate', 'error', `two mounts declare the same name "${mount.name}"`, mount.path));
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
seenNames.add(mount.name);
|
|
152
|
+
}
|
|
153
|
+
if (mount.name === manifest.name) {
|
|
154
|
+
findings.push(finding('mount-self', 'error', `mount "${mount.name}" reuses the host layer's own name`, mount.path));
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
for (const mount of mounts) {
|
|
158
|
+
const abs = path.join(root, mount.path);
|
|
159
|
+
if (!exists(abs)) {
|
|
160
|
+
findings.push(finding('missing-declared-file', 'error', `federation mount "${mount.name}" declared in leji.json does not exist`, mount.path));
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const siblingManifest = path.join(abs, 'leji.json');
|
|
164
|
+
if (!isFile(siblingManifest)) {
|
|
165
|
+
findings.push(finding('mount-not-a-layer', 'warning', 'mounted path carries no leji.json; a sibling layer brings its own manifest', mount.path));
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
const sibling = JSON.parse(readText(siblingManifest));
|
|
170
|
+
if (typeof sibling.name === 'string' && sibling.name !== mount.name) {
|
|
171
|
+
findings.push(finding('mount-name-mismatch', 'warning', `mount declares name "${mount.name}" but the sibling manifest says "${sibling.name}"`, mount.path));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
findings.push(finding('mount-not-a-layer', 'warning', 'mounted leji.json is not valid JSON', mount.path));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function checkProfilesAndDecisions(root, manifest, findings) {
|
|
180
|
+
const profiles = scanAgentProfiles(root, manifest);
|
|
181
|
+
const ids = [];
|
|
182
|
+
const knownIds = new Set();
|
|
183
|
+
for (const p of profiles) {
|
|
184
|
+
findings.push(...p.findings);
|
|
185
|
+
ids.push({ id: p.frontmatter?.id, relPath: p.relPath });
|
|
186
|
+
if (typeof p.frontmatter?.id === 'string')
|
|
187
|
+
knownIds.add(p.frontmatter.id);
|
|
188
|
+
}
|
|
189
|
+
findings.push(...duplicateIdFindings(ids, 'agent profile'));
|
|
190
|
+
for (const p of profiles) {
|
|
191
|
+
const inherits = p.frontmatter?.inherits;
|
|
192
|
+
if (typeof inherits === 'string' && !knownIds.has(inherits)) {
|
|
193
|
+
findings.push(finding('inherits-unknown', 'warning', `inherits "${inherits}" but no profile declares that id`, p.relPath));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const decisions = scanDecisionRecords(root, manifest);
|
|
197
|
+
const decisionIds = [];
|
|
198
|
+
for (const d of decisions) {
|
|
199
|
+
findings.push(...d.findings);
|
|
200
|
+
decisionIds.push({ id: d.frontmatter?.id, relPath: d.relPath });
|
|
201
|
+
}
|
|
202
|
+
findings.push(...duplicateIdFindings(decisionIds, 'decision record'));
|
|
203
|
+
if (decisions.filter((d) => d.findings.length === 0).length === 0) {
|
|
204
|
+
const where = manifest.machine?.decisionRecordsPath ?? manifest.categories.decisions?.paths[0] ?? 'leji.json';
|
|
205
|
+
findings.push(finding('decisions-empty', 'error', 'no valid decision record found; core conformance requires at least one', where));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
function checkSchemaVersion(rel, data, findings) {
|
|
209
|
+
const v = data?.schemaVersion;
|
|
210
|
+
if (typeof v === 'string' && !SUPPORTED_LINES.includes(v)) {
|
|
211
|
+
findings.push(finding('schema-version', 'error', `schemaVersion "${v}" is not supported by this SDK`, rel));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Append-only discipline: every entry present at HEAD must be unchanged and in
|
|
216
|
+
* the same position; new entries only append. Without a git baseline the
|
|
217
|
+
* property is unverifiable and reported as a warning (error under --strict).
|
|
218
|
+
*/
|
|
219
|
+
export function checkChangelogAppendOnly(root, rel, strict = false) {
|
|
220
|
+
const findings = [];
|
|
221
|
+
const { data, finding: parseFinding } = readJsonArtifact(root, rel);
|
|
222
|
+
if (parseFinding)
|
|
223
|
+
return { findings: [parseFinding], verified: false };
|
|
224
|
+
if (!data) {
|
|
225
|
+
return {
|
|
226
|
+
findings: [finding('changelog-required', 'error', `declared changelog ${rel} does not exist`, rel)],
|
|
227
|
+
verified: false,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
for (const err of schemaErrors('context-changelog', data)) {
|
|
231
|
+
findings.push(finding('artifact-schema', 'error', err, rel));
|
|
232
|
+
}
|
|
233
|
+
checkSchemaVersion(rel, data, findings);
|
|
234
|
+
// Schema findings above cover malformed shapes; guard so they can't crash us.
|
|
235
|
+
const rawEntries = data.entries;
|
|
236
|
+
const entries = Array.isArray(rawEntries)
|
|
237
|
+
? rawEntries.filter((e) => e !== null && typeof e === 'object')
|
|
238
|
+
: [];
|
|
239
|
+
findings.push(...duplicateIdFindings(entries.map((e, i) => ({ id: e.id, relPath: `${rel}#${i}` })), 'changelog').map((f) => ({ ...f, path: rel })));
|
|
240
|
+
if (gitToplevel(root) === null) {
|
|
241
|
+
findings.push(finding('changelog-unverifiable', strict ? 'error' : 'warning', 'not a git repository; append-only discipline cannot be verified', rel));
|
|
242
|
+
return { findings, verified: false };
|
|
243
|
+
}
|
|
244
|
+
const headText = gitShowHead(root, rel);
|
|
245
|
+
if (headText === null) {
|
|
246
|
+
return { findings, verified: true };
|
|
247
|
+
}
|
|
248
|
+
let headEntries;
|
|
249
|
+
try {
|
|
250
|
+
const parsed = JSON.parse(headText).entries;
|
|
251
|
+
headEntries = Array.isArray(parsed)
|
|
252
|
+
? parsed.filter((e) => e !== null && typeof e === 'object')
|
|
253
|
+
: [];
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return { findings, verified: true };
|
|
257
|
+
}
|
|
258
|
+
// Discipline is set-keyed by `id` (machine-readable-surface.md req 3): order
|
|
259
|
+
// is derived from (date, id), not array position, so reordering is fine.
|
|
260
|
+
// Every entry present at HEAD must survive unchanged unless it was compacted
|
|
261
|
+
// from the OLDEST end of the canonical order, with a `compaction` entry added.
|
|
262
|
+
if (headEntries.length > 0 && entries.length === 0) {
|
|
263
|
+
findings.push(finding('changelog-append-only', 'error', 'changelog compacted to empty; the compaction entry must survive', rel));
|
|
264
|
+
return { findings, verified: true };
|
|
265
|
+
}
|
|
266
|
+
const newIds = new Set(entries.map((e) => e.id));
|
|
267
|
+
const headById = new Map(headEntries.map((e) => [e.id, e]));
|
|
268
|
+
const newById = new Map(entries.map((e) => [e.id, e]));
|
|
269
|
+
// Surviving entries (present in both) are immutable. Key-order-insensitive:
|
|
270
|
+
// reformatting an entry is not a change.
|
|
271
|
+
for (const [id, headEntry] of headById) {
|
|
272
|
+
const current = newById.get(id);
|
|
273
|
+
if (current && stableStringify(current) !== stableStringify(headEntry)) {
|
|
274
|
+
findings.push(finding('changelog-append-only', 'error', `entry "${id ?? '?'}" modified since HEAD; surviving entries are immutable`, rel));
|
|
275
|
+
return { findings, verified: true };
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
// Any ids dropped since HEAD must be a contiguous run from the oldest end of
|
|
279
|
+
// the canonical (date, id) order, never from the middle or the newest end.
|
|
280
|
+
const headCanonical = [...headEntries].sort(compareByDateId);
|
|
281
|
+
const droppedIds = headCanonical.filter((e) => !newIds.has(e.id)).map((e) => e.id);
|
|
282
|
+
if (droppedIds.length > 0) {
|
|
283
|
+
const n = droppedIds.length;
|
|
284
|
+
const oldestPrefix = new Set(headCanonical.slice(0, n).map((e) => e.id));
|
|
285
|
+
const fromOldestEnd = droppedIds.every((id) => oldestPrefix.has(id));
|
|
286
|
+
if (!fromOldestEnd) {
|
|
287
|
+
findings.push(finding('changelog-append-only', 'error', `${n} ${n === 1 ? 'entry' : 'entries'} removed from other than the oldest end since HEAD; only the oldest entries may be compacted`, rel));
|
|
288
|
+
return { findings, verified: true };
|
|
289
|
+
}
|
|
290
|
+
const appended = entries.filter((e) => !headById.has(e.id));
|
|
291
|
+
if (!appended.some((e) => e.type === 'compaction')) {
|
|
292
|
+
findings.push(finding('changelog-append-only', 'error', `${n} ${n === 1 ? 'entry' : 'entries'} removed since HEAD without a compaction entry recording the drop`, rel));
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
return { findings, verified: true };
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Full layer validation: manifest, level-aware artifact requirements, schema
|
|
299
|
+
* checks, frontmatter contracts, lint rules. Index and changelog are required
|
|
300
|
+
* from `indexed`; at least one valid agent profile from `governed`. Artifacts
|
|
301
|
+
* present below their required level are still schema-validated.
|
|
302
|
+
*/
|
|
303
|
+
export function validateLayer(root) {
|
|
304
|
+
const { manifest, findings } = loadManifest(root);
|
|
305
|
+
if (!manifest)
|
|
306
|
+
return { findings: sortFindings(findings), manifest: null };
|
|
307
|
+
const level = claimedLevel(manifest);
|
|
308
|
+
// Git is required at core conformance and above (context-layer.md, Requirements):
|
|
309
|
+
// history, checkout currency, and append-only integrity all derive from it. A
|
|
310
|
+
// non-git working copy is a degraded read, not a canonical layer; warn rather
|
|
311
|
+
// than pass it silently.
|
|
312
|
+
if (gitToplevel(root) === null) {
|
|
313
|
+
findings.push(finding('git-required', 'warning', 'context layer is not in a git repository; core conformance requires git (a degraded, no-git copy cannot claim conformance)', 'leji.json'));
|
|
314
|
+
}
|
|
315
|
+
checkBootProfile(root, manifest, findings);
|
|
316
|
+
checkCategories(root, manifest, findings);
|
|
317
|
+
checkVendorAdapters(root, manifest, findings);
|
|
318
|
+
checkOwners(manifest, findings);
|
|
319
|
+
checkAgentsMap(root, manifest, findings);
|
|
320
|
+
checkFederationMounts(root, manifest, findings);
|
|
321
|
+
checkProfilesAndDecisions(root, manifest, findings);
|
|
322
|
+
const indexRel = manifest.machine?.indexPath;
|
|
323
|
+
const indexExists = indexRel !== undefined && isFile(path.join(root, indexRel));
|
|
324
|
+
if (levelAtLeast(level, 'indexed') || indexExists) {
|
|
325
|
+
if (!levelAtLeast(level, 'indexed') && indexExists) {
|
|
326
|
+
const stored = readJsonArtifact(root, indexRel);
|
|
327
|
+
if (stored.finding)
|
|
328
|
+
findings.push(stored.finding);
|
|
329
|
+
else {
|
|
330
|
+
for (const err of schemaErrors('context-index', stored.data)) {
|
|
331
|
+
findings.push(finding('artifact-schema', 'error', err, indexRel));
|
|
332
|
+
}
|
|
333
|
+
checkSchemaVersion(indexRel, stored.data, findings);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
// checkIndex covers schema, schemaVersion, and currency.
|
|
338
|
+
findings.push(...checkIndex(root, manifest).findings);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
const changelogRel = manifest.machine?.changelogPath;
|
|
342
|
+
const changelogExists = changelogRel !== undefined && isFile(path.join(root, changelogRel));
|
|
343
|
+
if (levelAtLeast(level, 'indexed') && !changelogExists) {
|
|
344
|
+
findings.push(finding('changelog-required', 'error', changelogRel
|
|
345
|
+
? `declared changelog ${changelogRel} does not exist`
|
|
346
|
+
: 'no machine.changelogPath declared; indexed conformance requires a machine changelog', changelogRel ?? 'leji.json'));
|
|
347
|
+
}
|
|
348
|
+
else if (changelogExists) {
|
|
349
|
+
findings.push(...checkChangelogAppendOnly(root, changelogRel).findings);
|
|
350
|
+
}
|
|
351
|
+
if (levelAtLeast(level, 'governed')) {
|
|
352
|
+
const profiles = scanAgentProfiles(root, manifest);
|
|
353
|
+
if (profiles.filter((p) => p.findings.length === 0).length === 0) {
|
|
354
|
+
findings.push(finding('profile-required', 'error', 'governed conformance requires at least one valid agent profile', manifest.machine?.agentProfilesPath ?? 'leji.json'));
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return { findings: sortFindings(findings), manifest };
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export { validateLayer } from './commands/validate.js';
|
|
2
|
+
export { checkIndex, generateIndex, writeIndex } from './commands/indexgen.js';
|
|
3
|
+
export { checkChangelogAppendOnly } from './commands/validate.js';
|
|
4
|
+
export { conformanceReport } from './commands/conformance.js';
|
|
5
|
+
export { buildSidebar, generateDocs, resolveDocsPort, serveDocs } from './commands/docs.js';
|
|
6
|
+
export { freshnessReport } from './commands/freshness.js';
|
|
7
|
+
export { initLayer } from './commands/init.js';
|
|
8
|
+
export { loadManifest } from './lib/manifest.js';
|
|
9
|
+
export { SDK_VERSION, SUPPORTED_LINES } from './lib/schemas.js';
|
|
10
|
+
export type { Finding, Severity } from './lib/findings.js';
|
|
11
|
+
export type { Manifest, ConformanceLevel, CategoryId } from './lib/manifest.js';
|
|
12
|
+
export type { ContextIndex, IndexEntry } from './commands/indexgen.js';
|
|
13
|
+
export type { ConformanceResult, ChecklistItem } from './commands/conformance.js';
|
|
14
|
+
export type { FreshnessReport } from './commands/freshness.js';
|
|
15
|
+
export type { InitOptions, InitResult } from './commands/init.js';
|
|
16
|
+
/** Run the CLI; returns the process exit code. */
|
|
17
|
+
export declare function run(argv: string[]): Promise<number>;
|