@sigil-engine/core 0.1.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 (48) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/dist/cache.d.ts +24 -0
  3. package/dist/cache.d.ts.map +1 -0
  4. package/dist/cache.js +97 -0
  5. package/dist/cache.js.map +1 -0
  6. package/dist/diff.d.ts +34 -0
  7. package/dist/diff.d.ts.map +1 -0
  8. package/dist/diff.js +319 -0
  9. package/dist/diff.js.map +1 -0
  10. package/dist/extract.d.ts +27 -0
  11. package/dist/extract.d.ts.map +1 -0
  12. package/dist/extract.js +162 -0
  13. package/dist/extract.js.map +1 -0
  14. package/dist/index.d.ts +26 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +21 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/plugin.d.ts +103 -0
  19. package/dist/plugin.d.ts.map +1 -0
  20. package/dist/plugin.js +47 -0
  21. package/dist/plugin.js.map +1 -0
  22. package/dist/safety.d.ts +25 -0
  23. package/dist/safety.d.ts.map +1 -0
  24. package/dist/safety.js +139 -0
  25. package/dist/safety.js.map +1 -0
  26. package/dist/schema.d.ts +184 -0
  27. package/dist/schema.d.ts.map +1 -0
  28. package/dist/schema.js +33 -0
  29. package/dist/schema.js.map +1 -0
  30. package/dist/serialize.d.ts +16 -0
  31. package/dist/serialize.d.ts.map +1 -0
  32. package/dist/serialize.js +75 -0
  33. package/dist/serialize.js.map +1 -0
  34. package/package.json +35 -0
  35. package/src/cache.ts +133 -0
  36. package/src/diff.ts +421 -0
  37. package/src/extract.ts +196 -0
  38. package/src/index.ts +94 -0
  39. package/src/plugin.ts +186 -0
  40. package/src/safety.ts +185 -0
  41. package/src/schema.ts +270 -0
  42. package/src/serialize.ts +97 -0
  43. package/tests/cache.test.ts +47 -0
  44. package/tests/diff.test.ts +222 -0
  45. package/tests/plugin.test.ts +107 -0
  46. package/tests/schema.test.ts +132 -0
  47. package/tests/serialize.test.ts +92 -0
  48. package/tsconfig.json +20 -0
@@ -0,0 +1,4 @@
1
+
2
+ > @sigil-engine/core@0.1.0 build /Users/riomyers/sigil/packages/core
3
+ > tsc
4
+
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Incremental extraction cache — skip unchanged files on re-extraction.
3
+ *
4
+ * Saves file hashes after extraction. On re-extract, compares hashes
5
+ * and returns which files need re-parsing.
6
+ */
7
+ export interface FileCache {
8
+ files: Record<string, {
9
+ hash: string;
10
+ mtime: number;
11
+ }>;
12
+ last_full_extract: string;
13
+ }
14
+ export interface ChangedFiles {
15
+ changed: string[];
16
+ unchanged: string[];
17
+ added: string[];
18
+ removed: string[];
19
+ }
20
+ export declare function readCache(projectPath: string): FileCache | null;
21
+ export declare function writeCache(projectPath: string, cache: FileCache): void;
22
+ export declare function buildCacheFromFiles(projectPath: string, files: string[]): FileCache;
23
+ export declare function getChangedFiles(projectPath: string, currentFiles: string[], cache: FileCache): ChangedFiles;
24
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAgBD,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAQ/D;AAED,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,IAAI,CAEtE;AAMD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EAAE,GACd,SAAS,CAoBX;AAMD,wBAAgB,eAAe,CAC7B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,SAAS,GACf,YAAY,CAwCd"}
package/dist/cache.js ADDED
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Incremental extraction cache — skip unchanged files on re-extraction.
3
+ *
4
+ * Saves file hashes after extraction. On re-extract, compares hashes
5
+ * and returns which files need re-parsing.
6
+ */
7
+ import { resolve } from "path";
8
+ import { readFileSync, writeFileSync, existsSync, statSync } from "fs";
9
+ import { createHash } from "crypto";
10
+ // ---------------------------------------------------------------------------
11
+ // Cache file path
12
+ // ---------------------------------------------------------------------------
13
+ const CACHE_FILENAME = ".sigil-cache.json";
14
+ function cachePath(projectPath) {
15
+ return resolve(projectPath, CACHE_FILENAME);
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // Read / Write
19
+ // ---------------------------------------------------------------------------
20
+ export function readCache(projectPath) {
21
+ const cp = cachePath(projectPath);
22
+ if (!existsSync(cp))
23
+ return null;
24
+ try {
25
+ return JSON.parse(readFileSync(cp, "utf-8"));
26
+ }
27
+ catch {
28
+ return null;
29
+ }
30
+ }
31
+ export function writeCache(projectPath, cache) {
32
+ writeFileSync(cachePath(projectPath), JSON.stringify(cache, null, 2), "utf-8");
33
+ }
34
+ // ---------------------------------------------------------------------------
35
+ // Build cache from current file state
36
+ // ---------------------------------------------------------------------------
37
+ export function buildCacheFromFiles(projectPath, files) {
38
+ const fileMap = {};
39
+ const absProject = resolve(projectPath);
40
+ for (const relFile of files) {
41
+ const absFile = resolve(absProject, relFile);
42
+ try {
43
+ const stat = statSync(absFile);
44
+ const content = readFileSync(absFile, "utf-8");
45
+ const hash = createHash("sha256").update(content).digest("hex").slice(0, 12);
46
+ fileMap[relFile] = { hash, mtime: stat.mtimeMs };
47
+ }
48
+ catch {
49
+ // Skip unreadable files
50
+ }
51
+ }
52
+ return {
53
+ files: fileMap,
54
+ last_full_extract: new Date().toISOString(),
55
+ };
56
+ }
57
+ // ---------------------------------------------------------------------------
58
+ // Determine changed files
59
+ // ---------------------------------------------------------------------------
60
+ export function getChangedFiles(projectPath, currentFiles, cache) {
61
+ const absProject = resolve(projectPath);
62
+ const changed = [];
63
+ const unchanged = [];
64
+ const added = [];
65
+ const currentSet = new Set(currentFiles);
66
+ for (const relFile of currentFiles) {
67
+ const cached = cache.files[relFile];
68
+ if (!cached) {
69
+ added.push(relFile);
70
+ continue;
71
+ }
72
+ try {
73
+ const absFile = resolve(absProject, relFile);
74
+ const stat = statSync(absFile);
75
+ // Quick check: mtime unchanged = file unchanged
76
+ if (stat.mtimeMs === cached.mtime) {
77
+ unchanged.push(relFile);
78
+ continue;
79
+ }
80
+ // mtime changed — verify with hash
81
+ const content = readFileSync(absFile, "utf-8");
82
+ const hash = createHash("sha256").update(content).digest("hex").slice(0, 12);
83
+ if (hash === cached.hash) {
84
+ unchanged.push(relFile);
85
+ }
86
+ else {
87
+ changed.push(relFile);
88
+ }
89
+ }
90
+ catch {
91
+ changed.push(relFile);
92
+ }
93
+ }
94
+ const removed = Object.keys(cache.files).filter((f) => !currentSet.has(f));
95
+ return { changed, unchanged, added, removed };
96
+ }
97
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Context diff engine — structural comparison of two context documents.
3
+ *
4
+ * Compares entities, components, routes, exports, patterns, conventions,
5
+ * stack, and dependencies. Outputs a structured DiffResult.
6
+ *
7
+ * PURE: No I/O. Takes two documents, returns a diff.
8
+ */
9
+ import type { ContextDocument } from "./schema.js";
10
+ export type ChangeType = "added" | "removed" | "modified" | "renamed";
11
+ export type ChangeCategory = "entity" | "component" | "route" | "export" | "pattern" | "convention" | "stack" | "dependency";
12
+ export interface Change<T = unknown> {
13
+ type: ChangeType;
14
+ name: string;
15
+ category: ChangeCategory;
16
+ old?: T;
17
+ new?: T;
18
+ details?: string[];
19
+ }
20
+ export interface DiffResult {
21
+ summary: {
22
+ total_changes: number;
23
+ added: number;
24
+ removed: number;
25
+ modified: number;
26
+ };
27
+ changes: Change[];
28
+ stack_changes: Change[];
29
+ pattern_changes: Change[];
30
+ convention_changes: Change[];
31
+ }
32
+ export declare function diffContexts(oldDoc: ContextDocument, newDoc: ContextDocument): DiffResult;
33
+ export declare function formatDiff(result: DiffResult): string;
34
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,eAAe,EAKhB,MAAM,aAAa,CAAC;AAMrB,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;AAEtE,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,WAAW,GACX,OAAO,GACP,QAAQ,GACR,SAAS,GACT,YAAY,GACZ,OAAO,GACP,YAAY,CAAC;AAEjB,MAAM,WAAW,MAAM,CAAC,CAAC,GAAG,OAAO;IACjC,IAAI,EAAE,UAAU,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAMD,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,GAAG,UAAU,CAmCzF;AAqRD,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiDrD"}
package/dist/diff.js ADDED
@@ -0,0 +1,319 @@
1
+ /**
2
+ * Context diff engine — structural comparison of two context documents.
3
+ *
4
+ * Compares entities, components, routes, exports, patterns, conventions,
5
+ * stack, and dependencies. Outputs a structured DiffResult.
6
+ *
7
+ * PURE: No I/O. Takes two documents, returns a diff.
8
+ */
9
+ // ---------------------------------------------------------------------------
10
+ // Main diff
11
+ // ---------------------------------------------------------------------------
12
+ export function diffContexts(oldDoc, newDoc) {
13
+ const changes = [];
14
+ changes.push(...diffNamedList(oldDoc.entities, newDoc.entities, "entity", diffEntity));
15
+ changes.push(...diffNamedList(oldDoc.components, newDoc.components, "component", diffComponent));
16
+ changes.push(...diffByKey(oldDoc.routes, newDoc.routes, "route", (r) => r.path, diffRoute));
17
+ changes.push(...diffNamedList(oldDoc.exports, newDoc.exports, "export", diffExport));
18
+ changes.push(...diffDependencies(oldDoc, newDoc));
19
+ const stack_changes = diffRecord(oldDoc.stack ?? {}, newDoc.stack ?? {}, "stack");
20
+ const pattern_changes = diffRecord(oldDoc.patterns, newDoc.patterns, "pattern");
21
+ const convention_changes = diffRecord(oldDoc.conventions, newDoc.conventions, "convention");
22
+ const allChanges = [...changes, ...stack_changes, ...pattern_changes, ...convention_changes];
23
+ return {
24
+ summary: {
25
+ total_changes: allChanges.length,
26
+ added: allChanges.filter((c) => c.type === "added").length,
27
+ removed: allChanges.filter((c) => c.type === "removed").length,
28
+ modified: allChanges.filter((c) => c.type === "modified").length,
29
+ },
30
+ changes,
31
+ stack_changes,
32
+ pattern_changes,
33
+ convention_changes,
34
+ };
35
+ }
36
+ function diffNamedList(oldList, newList, category, detailDiff) {
37
+ const changes = [];
38
+ const oldMap = new Map();
39
+ for (const item of oldList) {
40
+ const key = item._meta ? `${item._meta.file}::${item.name}` : item.name;
41
+ oldMap.set(key, item);
42
+ }
43
+ const newMap = new Map();
44
+ for (const item of newList) {
45
+ const key = item._meta ? `${item._meta.file}::${item.name}` : item.name;
46
+ newMap.set(key, item);
47
+ }
48
+ for (const [key, newItem] of newMap) {
49
+ const oldItem = oldMap.get(key);
50
+ if (!oldItem) {
51
+ const byName = oldList.find((o) => o.name === newItem.name);
52
+ if (byName) {
53
+ const details = detailDiff(byName, newItem);
54
+ if (details.length > 0 || byName._meta?.file !== newItem._meta?.file) {
55
+ const allDetails = byName._meta?.file !== newItem._meta?.file
56
+ ? [`moved: ${byName._meta?.file} → ${newItem._meta?.file}`, ...details]
57
+ : details;
58
+ changes.push({ type: "modified", name: newItem.name, category, old: byName, new: newItem, details: allDetails });
59
+ }
60
+ }
61
+ else {
62
+ changes.push({ type: "added", name: newItem.name, category, new: newItem });
63
+ }
64
+ }
65
+ else {
66
+ const details = detailDiff(oldItem, newItem);
67
+ if (details.length > 0) {
68
+ changes.push({ type: "modified", name: newItem.name, category, old: oldItem, new: newItem, details });
69
+ }
70
+ }
71
+ }
72
+ for (const [key, oldItem] of oldMap) {
73
+ if (!newMap.has(key)) {
74
+ const byName = newList.find((n) => n.name === oldItem.name);
75
+ if (!byName) {
76
+ changes.push({ type: "removed", name: oldItem.name, category, old: oldItem });
77
+ }
78
+ }
79
+ }
80
+ return changes;
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Key-based diffing (routes)
84
+ // ---------------------------------------------------------------------------
85
+ function diffByKey(oldList, newList, category, keyFn, detailDiff) {
86
+ const changes = [];
87
+ const oldMap = new Map(oldList.map((item) => [keyFn(item), item]));
88
+ const newMap = new Map(newList.map((item) => [keyFn(item), item]));
89
+ for (const [key, newItem] of newMap) {
90
+ const oldItem = oldMap.get(key);
91
+ if (!oldItem) {
92
+ changes.push({ type: "added", name: key, category, new: newItem });
93
+ }
94
+ else {
95
+ const details = detailDiff(oldItem, newItem);
96
+ if (details.length > 0) {
97
+ changes.push({ type: "modified", name: key, category, old: oldItem, new: newItem, details });
98
+ }
99
+ }
100
+ }
101
+ for (const [key, oldItem] of oldMap) {
102
+ if (!newMap.has(key)) {
103
+ changes.push({ type: "removed", name: key, category, old: oldItem });
104
+ }
105
+ }
106
+ return changes;
107
+ }
108
+ // ---------------------------------------------------------------------------
109
+ // Record diffing (stack, patterns, conventions)
110
+ // ---------------------------------------------------------------------------
111
+ function diffRecord(oldObj, newObj, category) {
112
+ const changes = [];
113
+ const allKeys = new Set([...Object.keys(oldObj), ...Object.keys(newObj)]);
114
+ for (const key of allKeys) {
115
+ const oldVal = oldObj[key];
116
+ const newVal = newObj[key];
117
+ if (oldVal === undefined && newVal !== undefined) {
118
+ changes.push({ type: "added", name: key, category, new: newVal });
119
+ }
120
+ else if (oldVal !== undefined && newVal === undefined) {
121
+ changes.push({ type: "removed", name: key, category, old: oldVal });
122
+ }
123
+ else if (!deepEqual(oldVal, newVal)) {
124
+ changes.push({
125
+ type: "modified",
126
+ name: key,
127
+ category,
128
+ old: oldVal,
129
+ new: newVal,
130
+ details: [`${JSON.stringify(oldVal)} → ${JSON.stringify(newVal)}`],
131
+ });
132
+ }
133
+ }
134
+ return changes;
135
+ }
136
+ // ---------------------------------------------------------------------------
137
+ // Dependency diffing
138
+ // ---------------------------------------------------------------------------
139
+ function diffDependencies(oldDoc, newDoc) {
140
+ const changes = [];
141
+ const oldDeps = new Map((oldDoc.dependencies ?? []).map((d) => [d.name, d.version]));
142
+ const newDeps = new Map((newDoc.dependencies ?? []).map((d) => [d.name, d.version]));
143
+ for (const [name, version] of newDeps) {
144
+ if (!oldDeps.has(name)) {
145
+ changes.push({ type: "added", name, category: "dependency", new: version });
146
+ }
147
+ else if (oldDeps.get(name) !== version) {
148
+ changes.push({
149
+ type: "modified", name, category: "dependency",
150
+ old: oldDeps.get(name), new: version,
151
+ details: [`${oldDeps.get(name)} → ${version}`],
152
+ });
153
+ }
154
+ }
155
+ for (const [name] of oldDeps) {
156
+ if (!newDeps.has(name)) {
157
+ changes.push({ type: "removed", name, category: "dependency", old: oldDeps.get(name) });
158
+ }
159
+ }
160
+ return changes;
161
+ }
162
+ // ---------------------------------------------------------------------------
163
+ // Detail diff functions
164
+ // ---------------------------------------------------------------------------
165
+ function diffEntity(old, neu) {
166
+ const details = [];
167
+ const oldFields = new Map(old.fields.map((f) => [f.name, f]));
168
+ const newFields = new Map(neu.fields.map((f) => [f.name, f]));
169
+ for (const [name, newField] of newFields) {
170
+ if (!oldFields.has(name)) {
171
+ details.push(`+ field: ${name} (${newField.type})`);
172
+ }
173
+ else {
174
+ const oldField = oldFields.get(name);
175
+ if (oldField.type !== newField.type)
176
+ details.push(`~ field ${name}: type ${oldField.type} → ${newField.type}`);
177
+ if (oldField.nullable !== newField.nullable)
178
+ details.push(`~ field ${name}: nullable ${oldField.nullable} → ${newField.nullable}`);
179
+ if (oldField.unique !== newField.unique)
180
+ details.push(`~ field ${name}: unique ${oldField.unique} → ${newField.unique}`);
181
+ }
182
+ }
183
+ for (const name of oldFields.keys()) {
184
+ if (!newFields.has(name))
185
+ details.push(`- field: ${name}`);
186
+ }
187
+ const oldRels = new Set(old.relations.map((r) => `${r.to}:${r.type}`));
188
+ const newRels = new Set(neu.relations.map((r) => `${r.to}:${r.type}`));
189
+ for (const rel of newRels)
190
+ if (!oldRels.has(rel))
191
+ details.push(`+ relation: ${rel}`);
192
+ for (const rel of oldRels)
193
+ if (!newRels.has(rel))
194
+ details.push(`- relation: ${rel}`);
195
+ return details;
196
+ }
197
+ function diffComponent(old, neu) {
198
+ const details = [];
199
+ const oldProps = new Map(old.props.map((p) => [p.name, p]));
200
+ const newProps = new Map(neu.props.map((p) => [p.name, p]));
201
+ for (const [name, newProp] of newProps) {
202
+ if (!oldProps.has(name)) {
203
+ details.push(`+ prop: ${name}: ${newProp.type}`);
204
+ }
205
+ else if (oldProps.get(name).type !== newProp.type) {
206
+ details.push(`~ prop ${name}: ${oldProps.get(name).type} → ${newProp.type}`);
207
+ }
208
+ }
209
+ for (const name of oldProps.keys()) {
210
+ if (!newProps.has(name))
211
+ details.push(`- prop: ${name}`);
212
+ }
213
+ const addedDeps = neu.dependencies.filter((d) => !old.dependencies.includes(d));
214
+ const removedDeps = old.dependencies.filter((d) => !neu.dependencies.includes(d));
215
+ for (const d of addedDeps)
216
+ details.push(`+ dep: ${d}`);
217
+ for (const d of removedDeps)
218
+ details.push(`- dep: ${d}`);
219
+ return details;
220
+ }
221
+ function diffRoute(old, neu) {
222
+ const details = [];
223
+ const allMethods = new Set([...Object.keys(old.methods), ...Object.keys(neu.methods)]);
224
+ for (const method of allMethods) {
225
+ if (!old.methods[method] && neu.methods[method]) {
226
+ details.push(`+ method: ${method}`);
227
+ }
228
+ else if (old.methods[method] && !neu.methods[method]) {
229
+ details.push(`- method: ${method}`);
230
+ }
231
+ else if (old.methods[method] && neu.methods[method]) {
232
+ if (old.methods[method].auth !== neu.methods[method].auth) {
233
+ details.push(`~ ${method} auth: ${old.methods[method].auth} → ${neu.methods[method].auth}`);
234
+ }
235
+ }
236
+ }
237
+ return details;
238
+ }
239
+ function diffExport(old, neu) {
240
+ const details = [];
241
+ if (old.kind !== neu.kind)
242
+ details.push(`~ kind: ${old.kind} → ${neu.kind}`);
243
+ if (old.signature !== neu.signature)
244
+ details.push(`~ signature changed`);
245
+ return details;
246
+ }
247
+ // ---------------------------------------------------------------------------
248
+ // Deep equality (replaces JSON.stringify comparison)
249
+ // ---------------------------------------------------------------------------
250
+ function deepEqual(a, b) {
251
+ if (a === b)
252
+ return true;
253
+ if (a === null || b === null)
254
+ return false;
255
+ if (typeof a !== typeof b)
256
+ return false;
257
+ if (Array.isArray(a) && Array.isArray(b)) {
258
+ if (a.length !== b.length)
259
+ return false;
260
+ return a.every((val, i) => deepEqual(val, b[i]));
261
+ }
262
+ if (typeof a === "object" && typeof b === "object") {
263
+ const aObj = a;
264
+ const bObj = b;
265
+ const aKeys = Object.keys(aObj);
266
+ const bKeys = Object.keys(bObj);
267
+ if (aKeys.length !== bKeys.length)
268
+ return false;
269
+ return aKeys.every((key) => deepEqual(aObj[key], bObj[key]));
270
+ }
271
+ return false;
272
+ }
273
+ // ---------------------------------------------------------------------------
274
+ // Format diff for terminal output
275
+ // ---------------------------------------------------------------------------
276
+ export function formatDiff(result) {
277
+ const lines = [];
278
+ lines.push(`\n Context Diff Summary`);
279
+ lines.push(` ${"─".repeat(20)}`);
280
+ lines.push(` ${result.summary.total_changes} changes: +${result.summary.added} added, -${result.summary.removed} removed, ~${result.summary.modified} modified\n`);
281
+ const allChanges = [
282
+ ...result.stack_changes,
283
+ ...result.pattern_changes,
284
+ ...result.convention_changes,
285
+ ...result.changes,
286
+ ];
287
+ const grouped = new Map();
288
+ for (const change of allChanges) {
289
+ const list = grouped.get(change.category) ?? [];
290
+ list.push(change);
291
+ grouped.set(change.category, list);
292
+ }
293
+ const labels = {
294
+ stack: "Stack", pattern: "Patterns", convention: "Conventions",
295
+ entity: "Entities", component: "Components", route: "Routes",
296
+ export: "Exports", dependency: "Dependencies",
297
+ };
298
+ for (const [cat, label] of Object.entries(labels)) {
299
+ const changes = grouped.get(cat);
300
+ if (!changes || changes.length === 0)
301
+ continue;
302
+ lines.push(` ${label}`);
303
+ for (const change of changes) {
304
+ const symbol = change.type === "added" ? "+" : change.type === "removed" ? "-" : "~";
305
+ lines.push(` ${symbol} ${change.name}`);
306
+ if (change.details) {
307
+ for (const detail of change.details) {
308
+ lines.push(` ${detail}`);
309
+ }
310
+ }
311
+ }
312
+ lines.push("");
313
+ }
314
+ if (result.summary.total_changes === 0) {
315
+ lines.push(" No changes detected.\n");
316
+ }
317
+ return lines.join("\n");
318
+ }
319
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Extraction orchestrator — discovers plugins, runs them, merges results.
3
+ *
4
+ * PURE: This module returns a ContextDocument. It does NOT write to disk.
5
+ * I/O is handled by the CLI or calling code.
6
+ */
7
+ import { type ContextDocument } from "./schema.js";
8
+ import { type ProgressCallback } from "./plugin.js";
9
+ export interface ExtractOptions {
10
+ /** Absolute path to the project root */
11
+ projectPath: string;
12
+ /** Specific plugins to run (by name). If empty, auto-detect. */
13
+ plugins?: string[];
14
+ /** Progress callback for reporting extraction status */
15
+ onProgress?: ProgressCallback;
16
+ }
17
+ /**
18
+ * Extract a ContextDocument from a project.
19
+ *
20
+ * This is the primary API — it discovers applicable plugins,
21
+ * runs them, and merges results into a unified document.
22
+ *
23
+ * Returns a ContextDocument. Does NOT write to disk.
24
+ */
25
+ export declare function extractContext(opts: ExtractOptions): Promise<ContextDocument>;
26
+ export declare function deduplicateExports(doc: ContextDocument): void;
27
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,EAAuB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,aAAa,CAAC;AAMrB,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,wDAAwD;IACxD,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CAqFnF;AAiCD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,CAM7D"}