@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.
Files changed (68) hide show
  1. package/README.md +36 -0
  2. package/assets-manifest.json +25 -0
  3. package/cli.json +82 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +4 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/conformance.d.ts +24 -0
  8. package/dist/commands/conformance.js +111 -0
  9. package/dist/commands/conformance.js.map +1 -0
  10. package/dist/commands/docs.d.ts +32 -0
  11. package/dist/commands/docs.js +196 -0
  12. package/dist/commands/docs.js.map +1 -0
  13. package/dist/commands/freshness.d.ts +21 -0
  14. package/dist/commands/freshness.js +41 -0
  15. package/dist/commands/freshness.js.map +1 -0
  16. package/dist/commands/indexgen.d.ts +55 -0
  17. package/dist/commands/indexgen.js +256 -0
  18. package/dist/commands/indexgen.js.map +1 -0
  19. package/dist/commands/init.d.ts +28 -0
  20. package/dist/commands/init.js +378 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/validate.d.ts +25 -0
  23. package/dist/commands/validate.js +359 -0
  24. package/dist/commands/validate.js.map +1 -0
  25. package/dist/index.d.ts +17 -0
  26. package/dist/index.js +324 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/lib/findings.d.ts +17 -0
  29. package/dist/lib/findings.js +29 -0
  30. package/dist/lib/findings.js.map +1 -0
  31. package/dist/lib/frontmatter.d.ts +14 -0
  32. package/dist/lib/frontmatter.js +28 -0
  33. package/dist/lib/frontmatter.js.map +1 -0
  34. package/dist/lib/fsx.d.ts +21 -0
  35. package/dist/lib/fsx.js +100 -0
  36. package/dist/lib/fsx.js.map +1 -0
  37. package/dist/lib/git.d.ts +10 -0
  38. package/dist/lib/git.js +55 -0
  39. package/dist/lib/git.js.map +1 -0
  40. package/dist/lib/layer.d.ts +32 -0
  41. package/dist/lib/layer.js +138 -0
  42. package/dist/lib/layer.js.map +1 -0
  43. package/dist/lib/manifest.d.ts +62 -0
  44. package/dist/lib/manifest.js +54 -0
  45. package/dist/lib/manifest.js.map +1 -0
  46. package/dist/lib/schemas.d.ts +38 -0
  47. package/dist/lib/schemas.js +57 -0
  48. package/dist/lib/schemas.js.map +1 -0
  49. package/package.json +61 -0
  50. package/schemas/README.md +3 -0
  51. package/schemas/agent-profile.schema.json +129 -0
  52. package/schemas/context-changelog.schema.json +150 -0
  53. package/schemas/context-index.schema.json +137 -0
  54. package/schemas/context-manifest.schema.json +253 -0
  55. package/schemas/decision-record.schema.json +84 -0
  56. package/templates/README.md +5 -0
  57. package/templates/agent-profile.md +25 -0
  58. package/templates/agents/core.md +27 -0
  59. package/templates/boot-profile.md +39 -0
  60. package/templates/decision-record.md +28 -0
  61. package/templates/docs-viewer-assets/PROVENANCE.txt +18 -0
  62. package/templates/docs-viewer-assets/docsify-sidebar-collapse.min.css +24 -0
  63. package/templates/docs-viewer-assets/docsify-sidebar-collapse.min.js +149 -0
  64. package/templates/docs-viewer-assets/docsify.min.js +1 -0
  65. package/templates/docs-viewer-assets/search.min.js +314 -0
  66. package/templates/docs-viewer-assets/vue.css +1063 -0
  67. package/templates/docs-viewer.html +63 -0
  68. package/templates/leji.json +56 -0
@@ -0,0 +1,55 @@
1
+ import { type Finding } from '../lib/findings.js';
2
+ import { type Manifest } from '../lib/manifest.js';
3
+ export interface IndexEntry {
4
+ id: string;
5
+ path: string;
6
+ title: string;
7
+ category: string;
8
+ summary?: string;
9
+ tags?: string[];
10
+ owners?: string[];
11
+ lastModified?: string;
12
+ contentHash?: string;
13
+ freshness?: {
14
+ reviewAfter: string;
15
+ };
16
+ links?: string[];
17
+ }
18
+ export interface ContextIndex {
19
+ $schema?: string;
20
+ schemaVersion: string;
21
+ generatedAt: string;
22
+ generator?: {
23
+ name?: string;
24
+ version?: string;
25
+ };
26
+ rootPath: string;
27
+ entries: IndexEntry[];
28
+ }
29
+ export interface IndexResult {
30
+ index: ContextIndex | null;
31
+ findings: Finding[];
32
+ /** Set by check(): true when the stored index no longer matches the tree. */
33
+ stale?: boolean;
34
+ }
35
+ export declare function declaredIndexPath(manifest: Manifest): string | null;
36
+ export declare function loadStoredIndex(root: string, manifest: Manifest): ContextIndex | null;
37
+ /**
38
+ * Generate the context index from the tree. Id stability, in priority order:
39
+ * document frontmatter `id`, the stored index's id for the same path, the
40
+ * stored index's id for the same contentHash (a pure move), then a filename
41
+ * slug (de-collided with the parent directory).
42
+ */
43
+ export declare function generateIndex(root: string, manifest: Manifest): IndexResult;
44
+ /** Key-order-insensitive serialization, mirrored by the Python SDK. */
45
+ export declare function stableStringify(value: unknown): string;
46
+ /**
47
+ * Check the stored index against a regeneration. `generatedAt`, `generator`,
48
+ * and `lastModified` are excluded from the comparison: content drift is what
49
+ * `contentHash` catches deterministically.
50
+ */
51
+ export declare function checkIndex(root: string, manifest: Manifest): IndexResult;
52
+ /** Serialize an index with stable key order, 2-space indent, trailing newline. */
53
+ export declare function serializeIndex(index: ContextIndex): string;
54
+ /** Generate and write the index to the declared path. */
55
+ export declare function writeIndex(root: string, manifest: Manifest): IndexResult;
@@ -0,0 +1,256 @@
1
+ import * as crypto from 'node:crypto';
2
+ import * as fs from 'node:fs';
3
+ import * as path from 'node:path';
4
+ import { finding } from '../lib/findings.js';
5
+ import { isFile, realpathWithin } from '../lib/fsx.js';
6
+ import { gitLastModified, gitToplevel } from '../lib/git.js';
7
+ import { duplicateIdFindings, readJsonArtifact, scanCategories } from '../lib/layer.js';
8
+ import { SDK_VERSION, SUPPORTED_LINES, schemaErrors } from '../lib/schemas.js';
9
+ const ID_PATTERN = /^[a-z0-9]+(-[a-z0-9]+)*$/;
10
+ function slugify(stem) {
11
+ return stem
12
+ .toLowerCase()
13
+ .replace(/[^a-z0-9]+/g, '-')
14
+ .replace(/^-+|-+$/g, '');
15
+ }
16
+ function firstHeading(body) {
17
+ const m = /^#\s+(.+)$/m.exec(body);
18
+ return m ? m[1].trim() : null;
19
+ }
20
+ function contentHash(root, relPath) {
21
+ const buf = fs.readFileSync(path.join(root, relPath));
22
+ return 'sha256:' + crypto.createHash('sha256').update(buf).digest('hex').slice(0, 16);
23
+ }
24
+ function str(v) {
25
+ return typeof v === 'string' && v !== '' ? v : undefined;
26
+ }
27
+ function strArray(v) {
28
+ if (!Array.isArray(v))
29
+ return undefined;
30
+ const out = v.filter((x) => typeof x === 'string');
31
+ return out.length > 0 ? out : undefined;
32
+ }
33
+ export function declaredIndexPath(manifest) {
34
+ return manifest.machine?.indexPath ?? null;
35
+ }
36
+ export function loadStoredIndex(root, manifest) {
37
+ const rel = declaredIndexPath(manifest);
38
+ if (!rel || !isFile(path.join(root, rel)))
39
+ return null;
40
+ const { data } = readJsonArtifact(root, rel);
41
+ if (!data || typeof data !== 'object')
42
+ return null;
43
+ return data;
44
+ }
45
+ /**
46
+ * Generate the context index from the tree. Id stability, in priority order:
47
+ * document frontmatter `id`, the stored index's id for the same path, the
48
+ * stored index's id for the same contentHash (a pure move), then a filename
49
+ * slug (de-collided with the parent directory).
50
+ */
51
+ export function generateIndex(root, manifest) {
52
+ const findings = [];
53
+ const docs = scanCategories(root, manifest);
54
+ const stored = loadStoredIndex(root, manifest);
55
+ const storedByPath = new Map();
56
+ const storedByHash = new Map();
57
+ for (const entry of stored?.entries ?? []) {
58
+ storedByPath.set(entry.path, entry);
59
+ if (entry.contentHash)
60
+ storedByHash.set(entry.contentHash, entry);
61
+ }
62
+ const inGit = gitToplevel(root) !== null;
63
+ const today = new Date().toISOString().slice(0, 10);
64
+ const used = new Map();
65
+ const entries = [];
66
+ for (const doc of docs) {
67
+ const fm = doc.frontmatter ?? {};
68
+ const hash = contentHash(root, doc.relPath);
69
+ const carried = storedByPath.get(doc.relPath) ?? storedByHash.get(hash);
70
+ let id = str(fm.id) ?? carried?.id;
71
+ if (!id) {
72
+ const stem = path.posix.basename(doc.relPath).replace(/\.md$/, '');
73
+ id = slugify(stem);
74
+ if (used.has(id)) {
75
+ const parent = slugify(path.posix.basename(path.posix.dirname(doc.relPath)));
76
+ id = parent ? `${parent}-${id}` : id;
77
+ }
78
+ let candidate = id;
79
+ let n = 2;
80
+ while (used.has(candidate))
81
+ candidate = `${id}-${n++}`;
82
+ id = candidate;
83
+ }
84
+ if (!ID_PATTERN.test(id)) {
85
+ findings.push(finding('id-pattern', 'error', `derived id "${id}" is not lowercase-hyphen`, doc.relPath));
86
+ }
87
+ if (used.has(id)) {
88
+ findings.push(finding('id-duplicate', 'error', `index id "${id}" already used by ${used.get(id)}`, doc.relPath));
89
+ }
90
+ used.set(id, doc.relPath);
91
+ const entry = {
92
+ id,
93
+ path: doc.relPath,
94
+ title: str(fm.title) ?? firstHeading(doc.body) ?? path.posix.basename(doc.relPath).replace(/\.md$/, ''),
95
+ category: doc.category,
96
+ };
97
+ const summary = str(fm.summary) ?? carried?.summary;
98
+ if (summary)
99
+ entry.summary = summary;
100
+ const tags = strArray(fm.tags);
101
+ if (tags)
102
+ entry.tags = tags;
103
+ const owners = strArray(fm.owners);
104
+ if (owners)
105
+ entry.owners = owners;
106
+ entry.lastModified = (inGit ? gitLastModified(root, doc.relPath) : null) ?? today;
107
+ entry.contentHash = hash;
108
+ const freshness = fm.freshness;
109
+ const reviewAfter = str(freshness?.reviewAfter);
110
+ if (reviewAfter)
111
+ entry.freshness = { reviewAfter };
112
+ const links = strArray(fm.links);
113
+ if (links)
114
+ entry.links = links;
115
+ entries.push(entry);
116
+ }
117
+ const index = {
118
+ $schema: 'https://leji.org/schemas/v1.0/context-index.schema.json',
119
+ schemaVersion: '1.0',
120
+ generatedAt: new Date().toISOString(),
121
+ generator: { name: 'leji', version: SDK_VERSION },
122
+ rootPath: manifest.rootPath,
123
+ entries,
124
+ };
125
+ return { index, findings };
126
+ }
127
+ /** Fields compared for currency; volatile fields are deliberately excluded. */
128
+ function comparable(entry) {
129
+ const { lastModified: _lastModified, ...rest } = entry;
130
+ return rest;
131
+ }
132
+ /** Key-order-insensitive serialization, mirrored by the Python SDK. */
133
+ export function stableStringify(value) {
134
+ if (Array.isArray(value))
135
+ return `[${value.map(stableStringify).join(',')}]`;
136
+ if (value !== null && typeof value === 'object') {
137
+ const keys = Object.keys(value).sort();
138
+ return `{${keys
139
+ .map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`)
140
+ .join(',')}}`;
141
+ }
142
+ return JSON.stringify(value);
143
+ }
144
+ /**
145
+ * Check the stored index against a regeneration. `generatedAt`, `generator`,
146
+ * and `lastModified` are excluded from the comparison: content drift is what
147
+ * `contentHash` catches deterministically.
148
+ */
149
+ export function checkIndex(root, manifest) {
150
+ const rel = declaredIndexPath(manifest);
151
+ const findings = [];
152
+ if (!rel || !isFile(path.join(root, rel))) {
153
+ findings.push(finding('index-required', 'error', rel
154
+ ? `declared index ${rel} does not exist; run \`leji index\``
155
+ : 'no machine.indexPath declared in leji.json', rel ?? 'leji.json'));
156
+ return { index: null, findings, stale: true };
157
+ }
158
+ const stored = loadStoredIndex(root, manifest);
159
+ if (!stored) {
160
+ findings.push(finding('artifact-parse', 'error', 'stored index is not valid JSON', rel));
161
+ return { index: null, findings, stale: true };
162
+ }
163
+ for (const err of schemaErrors('context-index', stored)) {
164
+ findings.push(finding('artifact-schema', 'error', err, rel));
165
+ }
166
+ if (typeof stored.schemaVersion === 'string' && !SUPPORTED_LINES.includes(stored.schemaVersion)) {
167
+ findings.push(finding('schema-version', 'error', `schemaVersion "${stored.schemaVersion}" is not supported by this SDK`, rel));
168
+ }
169
+ if (findings.length > 0)
170
+ return { index: stored, findings, stale: true };
171
+ const regen = generateIndex(root, manifest);
172
+ const want = stableStringify({
173
+ rootPath: regen.index.rootPath,
174
+ entries: regen.index.entries.map(comparable),
175
+ });
176
+ const got = stableStringify({
177
+ rootPath: stored.rootPath,
178
+ entries: [...stored.entries].sort((a, b) => (a.path < b.path ? -1 : 1)).map(comparable),
179
+ });
180
+ if (want !== got) {
181
+ const wantPaths = new Set(regen.index.entries.map((e) => e.path));
182
+ const gotPaths = new Set(stored.entries.map((e) => e.path));
183
+ const missing = [...wantPaths].filter((p) => !gotPaths.has(p));
184
+ const extra = [...gotPaths].filter((p) => !wantPaths.has(p));
185
+ const detail = missing.length > 0 || extra.length > 0
186
+ ? ` (missing: ${missing.length}, removed: ${extra.length})`
187
+ : ' (entry content drifted)';
188
+ findings.push(finding('index-stale', 'error', `index no longer matches the tree${detail}; run \`leji index\``, rel));
189
+ return { index: stored, findings, stale: true };
190
+ }
191
+ return {
192
+ index: stored,
193
+ findings: duplicateIdFindings(stored.entries.map((e) => ({ id: e.id, relPath: e.path })), 'index'),
194
+ stale: false,
195
+ };
196
+ }
197
+ const ENTRY_KEY_ORDER = [
198
+ 'id',
199
+ 'path',
200
+ 'title',
201
+ 'category',
202
+ 'summary',
203
+ 'tags',
204
+ 'owners',
205
+ 'lastModified',
206
+ 'contentHash',
207
+ 'freshness',
208
+ 'links',
209
+ ];
210
+ function orderedEntry(entry) {
211
+ const out = {};
212
+ for (const key of ENTRY_KEY_ORDER) {
213
+ if (entry[key] !== undefined)
214
+ out[key] = entry[key];
215
+ }
216
+ return out;
217
+ }
218
+ /** Serialize an index with stable key order, 2-space indent, trailing newline. */
219
+ export function serializeIndex(index) {
220
+ const out = {
221
+ $schema: index.$schema,
222
+ schemaVersion: index.schemaVersion,
223
+ generatedAt: index.generatedAt,
224
+ generator: index.generator,
225
+ rootPath: index.rootPath,
226
+ entries: index.entries.map(orderedEntry),
227
+ };
228
+ return JSON.stringify(out, null, 2) + '\n';
229
+ }
230
+ /** Generate and write the index to the declared path. */
231
+ export function writeIndex(root, manifest) {
232
+ const rel = declaredIndexPath(manifest);
233
+ if (!rel) {
234
+ return {
235
+ index: null,
236
+ findings: [finding('index-required', 'error', 'no machine.indexPath declared in leji.json', 'leji.json')],
237
+ };
238
+ }
239
+ const result = generateIndex(root, manifest);
240
+ if (result.index) {
241
+ const abs = path.join(root, rel);
242
+ fs.mkdirSync(path.dirname(abs), { recursive: true });
243
+ if (!realpathWithin(path.resolve(root), abs)) {
244
+ return {
245
+ index: result.index,
246
+ findings: [
247
+ ...result.findings,
248
+ finding('artifact-parse', 'error', `index path ${rel} resolves outside the layer root`, rel),
249
+ ],
250
+ };
251
+ }
252
+ fs.writeFileSync(abs, serializeIndex(result.index));
253
+ }
254
+ return result;
255
+ }
256
+ //# sourceMappingURL=indexgen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexgen.js","sourceRoot":"","sources":["../../src/commands/indexgen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type CategoryId, type Manifest } from '../lib/manifest.js';
2
+ export interface InitOptions {
3
+ dir: string;
4
+ yes: boolean;
5
+ name?: string;
6
+ level?: 'core' | 'indexed';
7
+ }
8
+ export interface InitAnswers {
9
+ name: string;
10
+ description: string;
11
+ rootPath: string;
12
+ ownerName: string;
13
+ ownerContact: string;
14
+ categories: CategoryId[];
15
+ level: 'core' | 'indexed';
16
+ }
17
+ export interface InitResult {
18
+ written: string[];
19
+ manifest: Manifest;
20
+ }
21
+ /**
22
+ * Bootstrap a context layer from the vendored templates. Interactive unless
23
+ * --yes. Refuses to run when leji.json already exists; never overwrites
24
+ * existing files (seeds land only where nothing is in the way).
25
+ */
26
+ export declare function initLayer(options: InitOptions): Promise<InitResult>;
27
+ /** Post-init guidance, printed by the CLI. */
28
+ export declare function enteringTheLayer(manifest: Manifest): string;