logicstamp-context 0.7.1 → 0.8.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 +10 -1
- package/dist/cli/commands/clean.d.ts +2 -1
- package/dist/cli/commands/clean.d.ts.map +1 -1
- package/dist/cli/commands/clean.js +30 -2
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/compare/cleanup.d.ts +8 -0
- package/dist/cli/commands/compare/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/compare/cleanup.js +27 -0
- package/dist/cli/commands/compare/cleanup.js.map +1 -0
- package/dist/cli/commands/compare/core.d.ts +29 -0
- package/dist/cli/commands/compare/core.d.ts.map +1 -0
- package/dist/cli/commands/compare/core.js +249 -0
- package/dist/cli/commands/compare/core.js.map +1 -0
- package/dist/cli/commands/compare/display.d.ts +9 -0
- package/dist/cli/commands/compare/display.d.ts.map +1 -0
- package/dist/cli/commands/compare/display.js +251 -0
- package/dist/cli/commands/compare/display.js.map +1 -0
- package/dist/cli/commands/compare/index.d.ts +26 -0
- package/dist/cli/commands/compare/index.d.ts.map +1 -0
- package/dist/cli/commands/compare/index.js +33 -0
- package/dist/cli/commands/compare/index.js.map +1 -0
- package/dist/cli/commands/compare/multiFile.d.ts +16 -0
- package/dist/cli/commands/compare/multiFile.d.ts.map +1 -0
- package/dist/cli/commands/compare/multiFile.js +113 -0
- package/dist/cli/commands/compare/multiFile.js.map +1 -0
- package/dist/cli/commands/compare/singleFile.d.ts +20 -0
- package/dist/cli/commands/compare/singleFile.d.ts.map +1 -0
- package/dist/cli/commands/compare/singleFile.js +341 -0
- package/dist/cli/commands/compare/singleFile.js.map +1 -0
- package/dist/cli/commands/{compare.d.ts → compare/types.d.ts} +21 -28
- package/dist/cli/commands/compare/types.d.ts.map +1 -0
- package/dist/cli/commands/compare/types.js +5 -0
- package/dist/cli/commands/compare/types.js.map +1 -0
- package/dist/cli/commands/compare/utils.d.ts +20 -0
- package/dist/cli/commands/compare/utils.d.ts.map +1 -0
- package/dist/cli/commands/compare/utils.js +94 -0
- package/dist/cli/commands/compare/utils.js.map +1 -0
- package/dist/cli/commands/context/watchMode/watchMode.d.ts.map +1 -1
- package/dist/cli/commands/context/watchMode/watchMode.js +2 -107
- package/dist/cli/commands/context/watchMode/watchMode.js.map +1 -1
- package/dist/cli/commands/context.d.ts +1 -0
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +3 -1
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/handlers/compareHandler.d.ts.map +1 -1
- package/dist/cli/handlers/compareHandler.js +297 -9
- package/dist/cli/handlers/compareHandler.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/parser/argumentParser.d.ts +2 -0
- package/dist/cli/parser/argumentParser.d.ts.map +1 -1
- package/dist/cli/parser/argumentParser.js +20 -2
- package/dist/cli/parser/argumentParser.js.map +1 -1
- package/dist/cli/parser/helpText.d.ts.map +1 -1
- package/dist/cli/parser/helpText.js +29 -0
- package/dist/cli/parser/helpText.js.map +1 -1
- package/dist/core/violations.d.ts +36 -0
- package/dist/core/violations.d.ts.map +1 -0
- package/dist/core/violations.js +292 -0
- package/dist/core/violations.js.map +1 -0
- package/dist/extractors/shared/propTypeNormalizer.d.ts.map +1 -1
- package/dist/extractors/shared/propTypeNormalizer.js +2 -1
- package/dist/extractors/shared/propTypeNormalizer.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/fileLock.d.ts.map +1 -1
- package/dist/utils/fileLock.js +79 -5
- package/dist/utils/fileLock.js.map +1 -1
- package/dist/utils/git.d.ts +135 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +429 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +20 -4
- package/dist/utils/hash.js.map +1 -1
- package/package.json +2 -1
- package/dist/cli/commands/compare.d.ts.map +0 -1
- package/dist/cli/commands/compare.js +0 -648
- package/dist/cli/commands/compare.js.map +0 -1
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Single file comparison logic
|
|
3
|
+
*/
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { debugError } from '../../../utils/debug.js';
|
|
6
|
+
import { formatTokenCount } from '../../../utils/tokens.js';
|
|
7
|
+
import { index, diff } from './core.js';
|
|
8
|
+
import { calculateTokens } from './utils.js';
|
|
9
|
+
/**
|
|
10
|
+
* Compare a single folder's context file
|
|
11
|
+
*/
|
|
12
|
+
export async function compareFolderContext(oldContextPath, newContextPath, stats, quiet, gitBaseline = false) {
|
|
13
|
+
// Load both files
|
|
14
|
+
let oldContent;
|
|
15
|
+
let newContent;
|
|
16
|
+
try {
|
|
17
|
+
oldContent = await readFile(oldContextPath, 'utf8');
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
const err = error;
|
|
21
|
+
debugError('compare', 'compareFolderContext', {
|
|
22
|
+
oldContextPath,
|
|
23
|
+
message: err.message,
|
|
24
|
+
code: err.code,
|
|
25
|
+
});
|
|
26
|
+
throw new Error(`Failed to read old context file "${oldContextPath}": ${err.code === 'ENOENT' ? 'File not found' : err.message}`);
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
newContent = await readFile(newContextPath, 'utf8');
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const err = error;
|
|
33
|
+
debugError('compare', 'compareFolderContext', {
|
|
34
|
+
newContextPath,
|
|
35
|
+
message: err.message,
|
|
36
|
+
code: err.code,
|
|
37
|
+
});
|
|
38
|
+
throw new Error(`Failed to read new context file "${newContextPath}": ${err.code === 'ENOENT' ? 'File not found' : err.message}`);
|
|
39
|
+
}
|
|
40
|
+
let oldBundles;
|
|
41
|
+
let newBundles;
|
|
42
|
+
try {
|
|
43
|
+
oldBundles = JSON.parse(oldContent);
|
|
44
|
+
newBundles = JSON.parse(newContent);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const err = error;
|
|
48
|
+
debugError('compare', 'compareFolderContext', {
|
|
49
|
+
oldContextPath,
|
|
50
|
+
newContextPath,
|
|
51
|
+
message: err.message,
|
|
52
|
+
});
|
|
53
|
+
throw new Error(`Failed to parse context files for folder: ${err.message}`);
|
|
54
|
+
}
|
|
55
|
+
// Index bundles (with normalization for git baseline mode)
|
|
56
|
+
const normalize = gitBaseline;
|
|
57
|
+
const ignoreHashOnly = gitBaseline; // Ignore hash-only changes in git baseline mode
|
|
58
|
+
const oldIdx = index(oldBundles, normalize);
|
|
59
|
+
const newIdx = index(newBundles, normalize);
|
|
60
|
+
// Compute diff
|
|
61
|
+
const result = diff(oldIdx, newIdx, normalize, ignoreHashOnly);
|
|
62
|
+
// Calculate token delta if stats requested and not in quiet mode
|
|
63
|
+
let tokenDelta;
|
|
64
|
+
if (stats && !quiet) {
|
|
65
|
+
const oldTokens = await calculateTokens(oldBundles);
|
|
66
|
+
const newTokens = await calculateTokens(newBundles);
|
|
67
|
+
tokenDelta = {
|
|
68
|
+
gpt4: newTokens.gpt4 - oldTokens.gpt4,
|
|
69
|
+
claude: newTokens.claude - oldTokens.claude,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return { result, tokenDelta };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Main compare command
|
|
76
|
+
* Returns the comparison result instead of exiting, allowing caller to handle approval logic
|
|
77
|
+
*/
|
|
78
|
+
export async function compareCommand(options) {
|
|
79
|
+
// Load both files
|
|
80
|
+
let oldContent;
|
|
81
|
+
let newContent;
|
|
82
|
+
try {
|
|
83
|
+
oldContent = await readFile(options.oldFile, 'utf8');
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const err = error;
|
|
87
|
+
debugError('compare', 'compareCommand', {
|
|
88
|
+
file: options.oldFile,
|
|
89
|
+
message: err.message,
|
|
90
|
+
code: err.code,
|
|
91
|
+
});
|
|
92
|
+
throw new Error(`Failed to read old file "${options.oldFile}": ${err.code === 'ENOENT' ? 'File not found' : err.message}`);
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
newContent = await readFile(options.newFile, 'utf8');
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
const err = error;
|
|
99
|
+
debugError('compare', 'compareCommand', {
|
|
100
|
+
file: options.newFile,
|
|
101
|
+
message: err.message,
|
|
102
|
+
code: err.code,
|
|
103
|
+
});
|
|
104
|
+
throw new Error(`Failed to read new file "${options.newFile}": ${err.code === 'ENOENT' ? 'File not found' : err.message}`);
|
|
105
|
+
}
|
|
106
|
+
let oldBundles;
|
|
107
|
+
let newBundles;
|
|
108
|
+
try {
|
|
109
|
+
oldBundles = JSON.parse(oldContent);
|
|
110
|
+
newBundles = JSON.parse(newContent);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const err = error;
|
|
114
|
+
debugError('compare', 'compareCommand', {
|
|
115
|
+
oldFile: options.oldFile,
|
|
116
|
+
newFile: options.newFile,
|
|
117
|
+
message: err.message,
|
|
118
|
+
});
|
|
119
|
+
throw new Error(`Failed to parse context files: ${err.message}`);
|
|
120
|
+
}
|
|
121
|
+
// Index bundles (with normalization for git baseline mode)
|
|
122
|
+
const normalize = options.gitBaseline ?? false;
|
|
123
|
+
const ignoreHashOnly = options.gitBaseline ?? false; // Ignore hash-only changes in git baseline mode
|
|
124
|
+
const oldIdx = index(oldBundles, normalize);
|
|
125
|
+
const newIdx = index(newBundles, normalize);
|
|
126
|
+
// Compute diff
|
|
127
|
+
const result = diff(oldIdx, newIdx, normalize, ignoreHashOnly);
|
|
128
|
+
// Output result (skip PASS status in quiet mode)
|
|
129
|
+
if (options.quiet && result.status === 'PASS') {
|
|
130
|
+
// Minimal output in quiet mode for PASS
|
|
131
|
+
process.stdout.write('✓\n');
|
|
132
|
+
}
|
|
133
|
+
else if (!options.quiet || result.status === 'DRIFT') {
|
|
134
|
+
console.log(`\n${result.status === 'PASS' ? '✅' : '⚠️'} ${result.status}\n`);
|
|
135
|
+
}
|
|
136
|
+
if (result.status === 'DRIFT') {
|
|
137
|
+
if (result.added.length > 0) {
|
|
138
|
+
if (!options.quiet) {
|
|
139
|
+
console.log(`Added components: ${result.added.length}`);
|
|
140
|
+
}
|
|
141
|
+
result.added.forEach(id => console.log(` + ${id}`));
|
|
142
|
+
if (!options.quiet) {
|
|
143
|
+
console.log();
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (result.removed.length > 0) {
|
|
147
|
+
if (!options.quiet) {
|
|
148
|
+
console.log(`Removed components: ${result.removed.length}`);
|
|
149
|
+
}
|
|
150
|
+
result.removed.forEach(id => console.log(` - ${id}`));
|
|
151
|
+
if (!options.quiet) {
|
|
152
|
+
console.log();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (result.changed.length > 0) {
|
|
156
|
+
if (!options.quiet) {
|
|
157
|
+
console.log(`Changed components: ${result.changed.length}`);
|
|
158
|
+
}
|
|
159
|
+
result.changed.forEach(({ id, deltas }) => {
|
|
160
|
+
console.log(` ~ ${id}`);
|
|
161
|
+
deltas.forEach(delta => {
|
|
162
|
+
console.log(` Δ ${delta.type}`);
|
|
163
|
+
if (delta.type === 'hash') {
|
|
164
|
+
console.log(` old: ${delta.old}`);
|
|
165
|
+
console.log(` new: ${delta.new}`);
|
|
166
|
+
}
|
|
167
|
+
else if (delta.type === 'imports' || delta.type === 'hooks' || delta.type === 'functions' ||
|
|
168
|
+
delta.type === 'components' || delta.type === 'variables') {
|
|
169
|
+
const oldSet = new Set(delta.old);
|
|
170
|
+
const newSet = new Set(delta.new);
|
|
171
|
+
// Find removed items
|
|
172
|
+
const removed = delta.old.filter((item) => !newSet.has(item));
|
|
173
|
+
// Find added items
|
|
174
|
+
const added = delta.new.filter((item) => !oldSet.has(item));
|
|
175
|
+
if (removed.length > 0) {
|
|
176
|
+
removed.forEach((item) => console.log(` - ${item}`));
|
|
177
|
+
}
|
|
178
|
+
if (added.length > 0) {
|
|
179
|
+
added.forEach((item) => console.log(` + ${item}`));
|
|
180
|
+
}
|
|
181
|
+
if (removed.length === 0 && added.length === 0) {
|
|
182
|
+
// Order changed but items are the same
|
|
183
|
+
console.log(` (order changed)`);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else if (delta.type === 'props' || delta.type === 'emits') {
|
|
187
|
+
// Props and emits should be arrays of strings (prop/emit names)
|
|
188
|
+
// Handle both arrays and objects (defensive coding for edge cases)
|
|
189
|
+
// If objects are passed, extract keys; if arrays, use directly
|
|
190
|
+
let oldArray;
|
|
191
|
+
let newArray;
|
|
192
|
+
if (Array.isArray(delta.old)) {
|
|
193
|
+
oldArray = delta.old;
|
|
194
|
+
}
|
|
195
|
+
else if (delta.old && typeof delta.old === 'object') {
|
|
196
|
+
// If it's an object, extract the keys
|
|
197
|
+
oldArray = Object.keys(delta.old);
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
// Fallback: treat as empty array
|
|
201
|
+
oldArray = [];
|
|
202
|
+
}
|
|
203
|
+
if (Array.isArray(delta.new)) {
|
|
204
|
+
newArray = delta.new;
|
|
205
|
+
}
|
|
206
|
+
else if (delta.new && typeof delta.new === 'object') {
|
|
207
|
+
// If it's an object, extract the keys
|
|
208
|
+
newArray = Object.keys(delta.new);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
// Fallback: treat as empty array
|
|
212
|
+
newArray = [];
|
|
213
|
+
}
|
|
214
|
+
const oldSet = new Set(oldArray);
|
|
215
|
+
const newSet = new Set(newArray);
|
|
216
|
+
// Find removed items
|
|
217
|
+
const removed = oldArray.filter((item) => !newSet.has(item));
|
|
218
|
+
// Find added items
|
|
219
|
+
const added = newArray.filter((item) => !oldSet.has(item));
|
|
220
|
+
if (removed.length > 0) {
|
|
221
|
+
removed.forEach((item) => console.log(` - ${item}`));
|
|
222
|
+
}
|
|
223
|
+
if (added.length > 0) {
|
|
224
|
+
added.forEach((item) => console.log(` + ${item}`));
|
|
225
|
+
}
|
|
226
|
+
if (removed.length === 0 && added.length === 0 && oldArray.length > 0) {
|
|
227
|
+
// Only show "order changed" if arrays are non-empty and identical
|
|
228
|
+
console.log(` (order changed)`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
else if (delta.type === 'state') {
|
|
232
|
+
const oldState = delta.old;
|
|
233
|
+
const newState = delta.new;
|
|
234
|
+
const oldKeys = Object.keys(oldState);
|
|
235
|
+
const newKeys = Object.keys(newState);
|
|
236
|
+
const oldSet = new Set(oldKeys);
|
|
237
|
+
const newSet = new Set(newKeys);
|
|
238
|
+
// Find removed state variables
|
|
239
|
+
const removed = oldKeys.filter((key) => !newSet.has(key));
|
|
240
|
+
// Find added state variables
|
|
241
|
+
const added = newKeys.filter((key) => !oldSet.has(key));
|
|
242
|
+
// Find changed state variables (type changed)
|
|
243
|
+
const changed = oldKeys.filter((key) => {
|
|
244
|
+
if (newSet.has(key)) {
|
|
245
|
+
return JSON.stringify(oldState[key]) !== JSON.stringify(newState[key]);
|
|
246
|
+
}
|
|
247
|
+
return false;
|
|
248
|
+
});
|
|
249
|
+
if (removed.length > 0) {
|
|
250
|
+
removed.forEach((key) => console.log(` - ${key}`));
|
|
251
|
+
}
|
|
252
|
+
if (added.length > 0) {
|
|
253
|
+
added.forEach((key) => console.log(` + ${key}`));
|
|
254
|
+
}
|
|
255
|
+
if (changed.length > 0) {
|
|
256
|
+
changed.forEach((key) => {
|
|
257
|
+
console.log(` ~ ${key}: ${JSON.stringify(oldState[key])} → ${JSON.stringify(newState[key])}`);
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
else if (delta.type === 'exports') {
|
|
262
|
+
console.log(` ${delta.old} → ${delta.new}`);
|
|
263
|
+
}
|
|
264
|
+
else if (delta.type === 'apiSignature') {
|
|
265
|
+
const oldSig = delta.old;
|
|
266
|
+
const newSig = delta.new;
|
|
267
|
+
// Handle null/undefined cases
|
|
268
|
+
if (!oldSig && newSig) {
|
|
269
|
+
console.log(` + Added API signature`);
|
|
270
|
+
if (newSig.parameters)
|
|
271
|
+
console.log(` parameters: ${JSON.stringify(newSig.parameters)}`);
|
|
272
|
+
if (newSig.returnType)
|
|
273
|
+
console.log(` returnType: ${newSig.returnType}`);
|
|
274
|
+
if (newSig.requestType)
|
|
275
|
+
console.log(` requestType: ${newSig.requestType}`);
|
|
276
|
+
if (newSig.responseType)
|
|
277
|
+
console.log(` responseType: ${newSig.responseType}`);
|
|
278
|
+
}
|
|
279
|
+
else if (oldSig && !newSig) {
|
|
280
|
+
console.log(` - Removed API signature`);
|
|
281
|
+
}
|
|
282
|
+
else if (oldSig && newSig) {
|
|
283
|
+
// Compare individual fields
|
|
284
|
+
const oldParams = oldSig.parameters ?? {};
|
|
285
|
+
const newParams = newSig.parameters ?? {};
|
|
286
|
+
const oldKeys = Object.keys(oldParams);
|
|
287
|
+
const newKeys = Object.keys(newParams);
|
|
288
|
+
const paramRemoved = oldKeys.filter(k => !(k in newParams));
|
|
289
|
+
const paramAdded = newKeys.filter(k => !(k in oldParams));
|
|
290
|
+
const paramChanged = oldKeys.filter(k => k in newParams && oldParams[k] !== newParams[k]);
|
|
291
|
+
if (paramRemoved.length > 0) {
|
|
292
|
+
paramRemoved.forEach(k => console.log(` - parameters.${k}: ${oldParams[k]}`));
|
|
293
|
+
}
|
|
294
|
+
if (paramAdded.length > 0) {
|
|
295
|
+
paramAdded.forEach(k => console.log(` + parameters.${k}: ${newParams[k]}`));
|
|
296
|
+
}
|
|
297
|
+
if (paramChanged.length > 0) {
|
|
298
|
+
paramChanged.forEach(k => console.log(` ~ parameters.${k}: ${oldParams[k]} → ${newParams[k]}`));
|
|
299
|
+
}
|
|
300
|
+
if (oldSig.returnType !== newSig.returnType) {
|
|
301
|
+
console.log(` ~ returnType: ${oldSig.returnType ?? '(none)'} → ${newSig.returnType ?? '(none)'}`);
|
|
302
|
+
}
|
|
303
|
+
if (oldSig.requestType !== newSig.requestType) {
|
|
304
|
+
console.log(` ~ requestType: ${oldSig.requestType ?? '(none)'} → ${newSig.requestType ?? '(none)'}`);
|
|
305
|
+
}
|
|
306
|
+
if (oldSig.responseType !== newSig.responseType) {
|
|
307
|
+
console.log(` ~ responseType: ${oldSig.responseType ?? '(none)'} → ${newSig.responseType ?? '(none)'}`);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
if (!options.quiet) {
|
|
314
|
+
console.log();
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
// Show token stats if requested (skip in quiet mode)
|
|
319
|
+
if (options.stats && !options.quiet) {
|
|
320
|
+
const oldTokens = await calculateTokens(oldBundles);
|
|
321
|
+
const newTokens = await calculateTokens(newBundles);
|
|
322
|
+
const deltaStat = newTokens.gpt4 - oldTokens.gpt4;
|
|
323
|
+
let deltaPercentStr = '0.00';
|
|
324
|
+
let deltaPercentNum = 0;
|
|
325
|
+
if (oldTokens.gpt4 > 0) {
|
|
326
|
+
deltaPercentNum = (deltaStat / oldTokens.gpt4) * 100;
|
|
327
|
+
deltaPercentStr = deltaPercentNum.toFixed(2);
|
|
328
|
+
}
|
|
329
|
+
const sign = deltaStat > 0 ? '+' : '';
|
|
330
|
+
const percentSign = deltaPercentNum > 0 ? '+' : deltaPercentNum < 0 ? '' : '';
|
|
331
|
+
console.log('Token Stats:');
|
|
332
|
+
console.log(` ⚠️ Current mode = tokenizer-based.`);
|
|
333
|
+
console.log(` Other modes / raw source = heuristic.`);
|
|
334
|
+
console.log(` For precise per-mode breakdown, use "stamp context --compare-modes".`);
|
|
335
|
+
console.log(` Old: ${formatTokenCount(oldTokens.gpt4)} (GPT-4o-mini) | ${formatTokenCount(oldTokens.claude)} (Claude)`);
|
|
336
|
+
console.log(` New: ${formatTokenCount(newTokens.gpt4)} (GPT-4o-mini) | ${formatTokenCount(newTokens.claude)} (Claude)`);
|
|
337
|
+
console.log(` Δ ${sign}${formatTokenCount(deltaStat)} (${percentSign}${deltaPercentStr}%)\n`);
|
|
338
|
+
}
|
|
339
|
+
return result;
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=singleFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleFile.js","sourceRoot":"","sources":["../../../../src/cli/commands/compare/singleFile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Compare command
|
|
3
|
-
* Detects added/removed components and changed signatures
|
|
2
|
+
* Compare command types and interfaces
|
|
4
3
|
*/
|
|
4
|
+
import type { ApiSignature } from '../../../types/UIFContract.js';
|
|
5
|
+
export interface LiteSig {
|
|
6
|
+
semanticHash: string;
|
|
7
|
+
imports: string[];
|
|
8
|
+
hooks: string[];
|
|
9
|
+
exportKind: 'default' | 'named' | 'none';
|
|
10
|
+
functions: string[];
|
|
11
|
+
components: string[];
|
|
12
|
+
props: Record<string, any>;
|
|
13
|
+
emits: Record<string, any>;
|
|
14
|
+
variables: string[];
|
|
15
|
+
state: Record<string, any>;
|
|
16
|
+
apiSignature?: ApiSignature;
|
|
17
|
+
}
|
|
5
18
|
export interface CompareResult {
|
|
6
19
|
status: 'PASS' | 'DRIFT';
|
|
7
20
|
added: string[];
|
|
@@ -9,7 +22,7 @@ export interface CompareResult {
|
|
|
9
22
|
changed: Array<{
|
|
10
23
|
id: string;
|
|
11
24
|
deltas: Array<{
|
|
12
|
-
type: 'hash' | 'imports' | 'hooks' | 'exports' | 'functions' | 'components' | 'props' | 'emits';
|
|
25
|
+
type: 'hash' | 'imports' | 'hooks' | 'exports' | 'functions' | 'components' | 'props' | 'emits' | 'variables' | 'state' | 'apiSignature';
|
|
13
26
|
old: any;
|
|
14
27
|
new: any;
|
|
15
28
|
}>;
|
|
@@ -52,6 +65,8 @@ export interface CompareOptions {
|
|
|
52
65
|
stats?: boolean;
|
|
53
66
|
approve?: boolean;
|
|
54
67
|
quiet?: boolean;
|
|
68
|
+
gitBaseline?: boolean;
|
|
69
|
+
strict?: boolean;
|
|
55
70
|
}
|
|
56
71
|
export interface MultiFileCompareOptions {
|
|
57
72
|
oldIndexFile: string;
|
|
@@ -60,29 +75,7 @@ export interface MultiFileCompareOptions {
|
|
|
60
75
|
approve?: boolean;
|
|
61
76
|
autoCleanOrphaned?: boolean;
|
|
62
77
|
quiet?: boolean;
|
|
78
|
+
gitBaseline?: boolean;
|
|
79
|
+
strict?: boolean;
|
|
63
80
|
}
|
|
64
|
-
|
|
65
|
-
* Main compare command
|
|
66
|
-
* Returns the comparison result instead of exiting, allowing caller to handle approval logic
|
|
67
|
-
*/
|
|
68
|
-
export declare function compareCommand(options: CompareOptions): Promise<CompareResult>;
|
|
69
|
-
/**
|
|
70
|
-
* Multi-file comparison - compares all context files using context_main.json indices
|
|
71
|
-
* This is the comprehensive comparison that handles:
|
|
72
|
-
* 1. context_main.json as root index
|
|
73
|
-
* 2. All folder context.json files
|
|
74
|
-
* 3. ADDED FILE detection (new folders)
|
|
75
|
-
* 4. ORPHANED FILE detection (deleted folders)
|
|
76
|
-
* 5. DRIFT detection (changed files)
|
|
77
|
-
* 6. PASS detection (unchanged files)
|
|
78
|
-
*/
|
|
79
|
-
export declare function multiFileCompare(options: MultiFileCompareOptions): Promise<MultiFileCompareResult>;
|
|
80
|
-
/**
|
|
81
|
-
* Format and display multi-file comparison results
|
|
82
|
-
*/
|
|
83
|
-
export declare function displayMultiFileCompareResult(result: MultiFileCompareResult, stats: boolean, quiet?: boolean): void;
|
|
84
|
-
/**
|
|
85
|
-
* Clean up orphaned files
|
|
86
|
-
*/
|
|
87
|
-
export declare function cleanOrphanedFiles(orphanedFiles: string[], baseDir: string, quiet?: boolean): Promise<number>;
|
|
88
|
-
//# sourceMappingURL=compare.d.ts.map
|
|
81
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/compare/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/cli/commands/compare/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for compare command
|
|
3
|
+
*/
|
|
4
|
+
import type { LogicStampBundle, LogicStampIndex } from '../../../core/pack.js';
|
|
5
|
+
/**
|
|
6
|
+
* Calculate token count for bundles
|
|
7
|
+
*/
|
|
8
|
+
export declare function calculateTokens(bundles: LogicStampBundle[]): Promise<{
|
|
9
|
+
gpt4: number;
|
|
10
|
+
claude: number;
|
|
11
|
+
}>;
|
|
12
|
+
/**
|
|
13
|
+
* Load LogicStampIndex from file
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadIndex(indexPath: string): Promise<LogicStampIndex>;
|
|
16
|
+
/**
|
|
17
|
+
* Discover orphaned context files on disk that are not in the new index
|
|
18
|
+
*/
|
|
19
|
+
export declare function findOrphanedFiles(oldIndex: LogicStampIndex, newIndex: LogicStampIndex, baseDir: string): Promise<string[]>;
|
|
20
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/compare/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAI/E;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAM5G;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CA4C3E;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CA2BnB"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for compare command
|
|
3
|
+
*/
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { estimateGPT4Tokens, estimateClaudeTokens } from '../../../utils/tokens.js';
|
|
7
|
+
import { debugError } from '../../../utils/debug.js';
|
|
8
|
+
/**
|
|
9
|
+
* Calculate token count for bundles
|
|
10
|
+
*/
|
|
11
|
+
export async function calculateTokens(bundles) {
|
|
12
|
+
const text = JSON.stringify(bundles);
|
|
13
|
+
return {
|
|
14
|
+
gpt4: await estimateGPT4Tokens(text),
|
|
15
|
+
claude: await estimateClaudeTokens(text),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load LogicStampIndex from file
|
|
20
|
+
*/
|
|
21
|
+
export async function loadIndex(indexPath) {
|
|
22
|
+
let content;
|
|
23
|
+
try {
|
|
24
|
+
content = await readFile(indexPath, 'utf8');
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const err = error;
|
|
28
|
+
debugError('compare', 'loadIndex', {
|
|
29
|
+
indexPath,
|
|
30
|
+
message: err.message,
|
|
31
|
+
code: err.code,
|
|
32
|
+
});
|
|
33
|
+
throw new Error(`Failed to load index from ${indexPath}: ${err.code === 'ENOENT' ? 'File not found' : err.message}`);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
const index = JSON.parse(content);
|
|
37
|
+
if (index.type !== 'LogicStampIndex') {
|
|
38
|
+
throw new Error(`Invalid index file: expected type 'LogicStampIndex', got '${index.type}'`);
|
|
39
|
+
}
|
|
40
|
+
// Backward compatibility: warn about old schema version
|
|
41
|
+
if (index.schemaVersion === '0.1') {
|
|
42
|
+
console.warn(`⚠️ Warning: context_main.json uses schema version 0.1 (legacy format).`);
|
|
43
|
+
console.warn(``);
|
|
44
|
+
console.warn(` Consider recompiling with "stamp context" to upgrade to version 0.2 (relative paths).`);
|
|
45
|
+
console.warn(``);
|
|
46
|
+
console.warn(` Optional cleanup: "stamp context clean --all --yes".`);
|
|
47
|
+
console.warn(``);
|
|
48
|
+
console.warn(` See docs/MIGRATION_0.3.2.md for details.\n`);
|
|
49
|
+
}
|
|
50
|
+
else if (index.schemaVersion !== '0.2') {
|
|
51
|
+
console.warn(`⚠️ Warning: Unknown schema version "${index.schemaVersion}". Expected '0.1' or '0.2'.`);
|
|
52
|
+
}
|
|
53
|
+
return index;
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const err = error;
|
|
57
|
+
debugError('compare', 'loadIndex', {
|
|
58
|
+
indexPath,
|
|
59
|
+
message: err.message,
|
|
60
|
+
});
|
|
61
|
+
throw new Error(`Failed to load index from ${indexPath}: ${err.message}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Discover orphaned context files on disk that are not in the new index
|
|
66
|
+
*/
|
|
67
|
+
export async function findOrphanedFiles(oldIndex, newIndex, baseDir) {
|
|
68
|
+
const orphaned = [];
|
|
69
|
+
const newContextFiles = new Set(newIndex.folders.map(f => f.contextFile));
|
|
70
|
+
// Check each old folder's context file
|
|
71
|
+
for (const folder of oldIndex.folders) {
|
|
72
|
+
if (!newContextFiles.has(folder.contextFile)) {
|
|
73
|
+
// Check if file still exists on disk
|
|
74
|
+
const contextPath = join(baseDir, folder.contextFile);
|
|
75
|
+
try {
|
|
76
|
+
await readFile(contextPath, 'utf8');
|
|
77
|
+
orphaned.push(folder.contextFile);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// File doesn't exist, not orphaned (already deleted)
|
|
81
|
+
const err = error;
|
|
82
|
+
if (err.code !== 'ENOENT') {
|
|
83
|
+
debugError('compare', 'findOrphanedFiles', {
|
|
84
|
+
contextPath,
|
|
85
|
+
message: err.message,
|
|
86
|
+
code: err.code,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return orphaned;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/cli/commands/compare/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watchMode.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/context/watchMode/watchMode.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"watchMode.d.ts","sourceRoot":"","sources":["../../../../../src/cli/commands/context/watchMode/watchMode.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyBH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AASpB,OAAO,EAAkB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAkBvE;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,GAAE,UAAU,GAAG,IAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA+lBxI"}
|