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.
Files changed (81) hide show
  1. package/README.md +10 -1
  2. package/dist/cli/commands/clean.d.ts +2 -1
  3. package/dist/cli/commands/clean.d.ts.map +1 -1
  4. package/dist/cli/commands/clean.js +30 -2
  5. package/dist/cli/commands/clean.js.map +1 -1
  6. package/dist/cli/commands/compare/cleanup.d.ts +8 -0
  7. package/dist/cli/commands/compare/cleanup.d.ts.map +1 -0
  8. package/dist/cli/commands/compare/cleanup.js +27 -0
  9. package/dist/cli/commands/compare/cleanup.js.map +1 -0
  10. package/dist/cli/commands/compare/core.d.ts +29 -0
  11. package/dist/cli/commands/compare/core.d.ts.map +1 -0
  12. package/dist/cli/commands/compare/core.js +249 -0
  13. package/dist/cli/commands/compare/core.js.map +1 -0
  14. package/dist/cli/commands/compare/display.d.ts +9 -0
  15. package/dist/cli/commands/compare/display.d.ts.map +1 -0
  16. package/dist/cli/commands/compare/display.js +251 -0
  17. package/dist/cli/commands/compare/display.js.map +1 -0
  18. package/dist/cli/commands/compare/index.d.ts +26 -0
  19. package/dist/cli/commands/compare/index.d.ts.map +1 -0
  20. package/dist/cli/commands/compare/index.js +33 -0
  21. package/dist/cli/commands/compare/index.js.map +1 -0
  22. package/dist/cli/commands/compare/multiFile.d.ts +16 -0
  23. package/dist/cli/commands/compare/multiFile.d.ts.map +1 -0
  24. package/dist/cli/commands/compare/multiFile.js +113 -0
  25. package/dist/cli/commands/compare/multiFile.js.map +1 -0
  26. package/dist/cli/commands/compare/singleFile.d.ts +20 -0
  27. package/dist/cli/commands/compare/singleFile.d.ts.map +1 -0
  28. package/dist/cli/commands/compare/singleFile.js +341 -0
  29. package/dist/cli/commands/compare/singleFile.js.map +1 -0
  30. package/dist/cli/commands/{compare.d.ts → compare/types.d.ts} +21 -28
  31. package/dist/cli/commands/compare/types.d.ts.map +1 -0
  32. package/dist/cli/commands/compare/types.js +5 -0
  33. package/dist/cli/commands/compare/types.js.map +1 -0
  34. package/dist/cli/commands/compare/utils.d.ts +20 -0
  35. package/dist/cli/commands/compare/utils.d.ts.map +1 -0
  36. package/dist/cli/commands/compare/utils.js +94 -0
  37. package/dist/cli/commands/compare/utils.js.map +1 -0
  38. package/dist/cli/commands/context/watchMode/watchMode.d.ts.map +1 -1
  39. package/dist/cli/commands/context/watchMode/watchMode.js +2 -107
  40. package/dist/cli/commands/context/watchMode/watchMode.js.map +1 -1
  41. package/dist/cli/commands/context.d.ts +1 -0
  42. package/dist/cli/commands/context.d.ts.map +1 -1
  43. package/dist/cli/commands/context.js +3 -1
  44. package/dist/cli/commands/context.js.map +1 -1
  45. package/dist/cli/handlers/compareHandler.d.ts.map +1 -1
  46. package/dist/cli/handlers/compareHandler.js +297 -9
  47. package/dist/cli/handlers/compareHandler.js.map +1 -1
  48. package/dist/cli/index.js +1 -1
  49. package/dist/cli/index.js.map +1 -1
  50. package/dist/cli/parser/argumentParser.d.ts +2 -0
  51. package/dist/cli/parser/argumentParser.d.ts.map +1 -1
  52. package/dist/cli/parser/argumentParser.js +20 -2
  53. package/dist/cli/parser/argumentParser.js.map +1 -1
  54. package/dist/cli/parser/helpText.d.ts.map +1 -1
  55. package/dist/cli/parser/helpText.js +29 -0
  56. package/dist/cli/parser/helpText.js.map +1 -1
  57. package/dist/core/violations.d.ts +36 -0
  58. package/dist/core/violations.d.ts.map +1 -0
  59. package/dist/core/violations.js +292 -0
  60. package/dist/core/violations.js.map +1 -0
  61. package/dist/extractors/shared/propTypeNormalizer.d.ts.map +1 -1
  62. package/dist/extractors/shared/propTypeNormalizer.js +2 -1
  63. package/dist/extractors/shared/propTypeNormalizer.js.map +1 -1
  64. package/dist/index.d.ts +2 -2
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/utils/fileLock.d.ts.map +1 -1
  69. package/dist/utils/fileLock.js +79 -5
  70. package/dist/utils/fileLock.js.map +1 -1
  71. package/dist/utils/git.d.ts +135 -0
  72. package/dist/utils/git.d.ts.map +1 -0
  73. package/dist/utils/git.js +429 -0
  74. package/dist/utils/git.js.map +1 -0
  75. package/dist/utils/hash.d.ts.map +1 -1
  76. package/dist/utils/hash.js +20 -4
  77. package/dist/utils/hash.js.map +1 -1
  78. package/package.json +2 -1
  79. package/dist/cli/commands/compare.d.ts.map +0 -1
  80. package/dist/cli/commands/compare.js +0 -648
  81. package/dist/cli/commands/compare.js.map +0 -1
@@ -313,9 +313,12 @@ ARGUMENTS:
313
313
  <new.json> Path to new context file or context_main.json
314
314
 
315
315
  OPTIONS:
316
+ --baseline <ref> Compare against a git ref (e.g., git:main, git:HEAD, git:v1.0.0)
316
317
  --approve Auto-approve updates (non-interactive, CI-safe)
317
318
  --clean-orphaned Auto-delete orphaned files with --approve
318
319
  --stats Show token count statistics per folder
320
+ --strict Detect breaking changes (removed props, events, functions)
321
+ and exit with code 1 if errors found
319
322
  --skip-gitignore Skip .gitignore setup when compiling fresh context (auto-mode only)
320
323
  --quiet Show only diffs (suppress summaries, PASS folders, and token analysis)
321
324
  -h, --help Show this help
@@ -326,6 +329,12 @@ COMPARISON MODES:
326
329
  → Detects ADDED, ORPHANED, DRIFT, and PASS status per folder
327
330
  → Shows three-tier output: folder summary, component summary, details
328
331
 
332
+ Git Baseline Mode:
333
+ Compare current working tree against a git ref (branch, tag, commit)
334
+ → Uses git worktree to checkout ref in isolation
335
+ → Generates context for both versions and compares
336
+ → Useful for PR reviews, CI validation, and release checks
337
+
329
338
  Single-File Mode:
330
339
  Compares two individual context.json files
331
340
  → Detects added/removed/changed components
@@ -362,6 +371,24 @@ EXAMPLES:
362
371
  stamp context compare || exit 1
363
372
  CI validation: fail build if drift detected
364
373
 
374
+ stamp context compare --baseline git:main
375
+ Compare current working tree against main branch
376
+ → "What changed in this branch vs main?"
377
+
378
+ stamp context compare --baseline git:HEAD
379
+ Compare uncommitted changes against last commit
380
+
381
+ stamp context compare --baseline git:v1.0.0
382
+ Compare against a release tag
383
+ → "What changed since last release?"
384
+
385
+ stamp context compare --strict
386
+ Detect breaking changes and fail if errors found
387
+ → Exit code 1 if removed props, events, or functions detected
388
+
389
+ stamp context compare --baseline git:main --strict
390
+ Compare against main with breaking change detection
391
+
365
392
  EXIT CODES:
366
393
  0 PASS - No drift OR drift approved and updated
367
394
  1 DRIFT - Changes detected but not approved
@@ -414,6 +441,8 @@ BEHAVIOR:
414
441
  FILES REMOVED:
415
442
  • context_main.json Main index file
416
443
  • **/context.json All folder context files
444
+ • **/context.toon All folder TOON format bundles
445
+ • **/context_*.toon TOON format variants
417
446
  • .logicstamp/ Cache directory (if present)
418
447
 
419
448
  EXAMPLES:
@@ -1 +1 @@
1
- {"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../../src/cli/parser/helpText.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../../src/cli/parser/helpText.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkHN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Shared Violation Detection Module
3
+ *
4
+ * Provides consistent breaking change detection across watch and compare commands.
5
+ * Uses adapters to normalize different input formats to a common internal representation.
6
+ */
7
+ import type { Violation, ViolationsSummary } from '../utils/config.js';
8
+ import type { BundleChanges } from '../cli/commands/context/watchMode/watchDiff.js';
9
+ import type { CompareResult } from '../cli/commands/compare/types.js';
10
+ export type { Violation, ViolationsSummary } from '../utils/config.js';
11
+ /**
12
+ * Input types for violation detection
13
+ */
14
+ export type ViolationDetectionInput = {
15
+ type: 'watch';
16
+ changes: BundleChanges;
17
+ } | {
18
+ type: 'compare';
19
+ result: CompareResult;
20
+ gitBaseline?: boolean;
21
+ };
22
+ /**
23
+ * Detect violations from either watch mode or compare mode input
24
+ */
25
+ export declare function detectViolations(input: ViolationDetectionInput): Violation[];
26
+ /**
27
+ * Create a summary of violations
28
+ */
29
+ export declare function summarizeViolations(violations: Violation[]): ViolationsSummary;
30
+ /**
31
+ * Display violations to console
32
+ */
33
+ export declare function displayViolations(violations: Violation[], options?: {
34
+ quiet?: boolean;
35
+ }): void;
36
+ //# sourceMappingURL=violations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violations.d.ts","sourceRoot":"","sources":["../../src/core/violations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,gDAAgD,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAGtE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA2RtE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,SAAS,EAAE,CAM5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAY9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAqBlG"}
@@ -0,0 +1,292 @@
1
+ /**
2
+ * Shared Violation Detection Module
3
+ *
4
+ * Provides consistent breaking change detection across watch and compare commands.
5
+ * Uses adapters to normalize different input formats to a common internal representation.
6
+ */
7
+ /**
8
+ * Normalize BundleChanges (watch mode) to NormalizedChange array
9
+ */
10
+ function normalizeFromWatch(changes) {
11
+ const normalized = [];
12
+ // Handle removed contracts
13
+ for (const entryId of changes.removed) {
14
+ normalized.push({
15
+ entryId,
16
+ removed: true,
17
+ });
18
+ }
19
+ // Handle changed contracts
20
+ for (const change of changes.changed) {
21
+ const { entryId, contractDiff } = change;
22
+ if (!contractDiff)
23
+ continue;
24
+ normalized.push({
25
+ entryId,
26
+ props: contractDiff.props,
27
+ emits: contractDiff.emits,
28
+ state: contractDiff.state,
29
+ functions: contractDiff.functions,
30
+ variables: contractDiff.variables,
31
+ });
32
+ }
33
+ return normalized;
34
+ }
35
+ /**
36
+ * Helper to compute diff between two objects (used for props, emits, state)
37
+ */
38
+ function diffObjects(oldObj, newObj) {
39
+ const oldKeys = new Set(Object.keys(oldObj));
40
+ const newKeys = new Set(Object.keys(newObj));
41
+ const added = [];
42
+ const removed = [];
43
+ const changed = [];
44
+ for (const key of newKeys) {
45
+ if (!oldKeys.has(key)) {
46
+ added.push(key);
47
+ }
48
+ else if (JSON.stringify(oldObj[key]) !== JSON.stringify(newObj[key])) {
49
+ changed.push({ name: key, old: oldObj[key], new: newObj[key] });
50
+ }
51
+ }
52
+ for (const key of oldKeys) {
53
+ if (!newKeys.has(key)) {
54
+ removed.push(key);
55
+ }
56
+ }
57
+ return { added, removed, changed };
58
+ }
59
+ /**
60
+ * Helper to compute diff between two arrays
61
+ */
62
+ function diffArrays(oldArr, newArr) {
63
+ const oldSet = new Set(oldArr);
64
+ const newSet = new Set(newArr);
65
+ const added = [];
66
+ const removed = [];
67
+ for (const item of newSet) {
68
+ if (!oldSet.has(item))
69
+ added.push(item);
70
+ }
71
+ for (const item of oldSet) {
72
+ if (!newSet.has(item))
73
+ removed.push(item);
74
+ }
75
+ return { added, removed };
76
+ }
77
+ /**
78
+ * Normalize CompareResult (compare mode) to NormalizedChange array
79
+ *
80
+ * All delta formats now use full old/new values:
81
+ * - props: { old: Record<string, any>, new: Record<string, any> }
82
+ * - emits: { old: Record<string, any>, new: Record<string, any> }
83
+ * - functions: { old: string[], new: string[] }
84
+ * - variables: { old: string[], new: string[] }
85
+ * - state: { old: Record<string, any>, new: Record<string, any> }
86
+ */
87
+ function normalizeFromCompare(result, gitBaseline) {
88
+ const normalized = [];
89
+ // Handle removed components
90
+ for (const id of result.removed) {
91
+ normalized.push({
92
+ entryId: id,
93
+ removed: true,
94
+ gitBaseline,
95
+ });
96
+ }
97
+ // Handle changed components
98
+ for (const change of result.changed) {
99
+ const { id, deltas } = change;
100
+ const normalizedChange = { entryId: id, gitBaseline };
101
+ for (const delta of deltas) {
102
+ switch (delta.type) {
103
+ case 'props': {
104
+ const oldObj = (delta.old && typeof delta.old === 'object' && !Array.isArray(delta.old))
105
+ ? delta.old : {};
106
+ const newObj = (delta.new && typeof delta.new === 'object' && !Array.isArray(delta.new))
107
+ ? delta.new : {};
108
+ normalizedChange.props = diffObjects(oldObj, newObj);
109
+ break;
110
+ }
111
+ case 'emits': {
112
+ const oldObj = (delta.old && typeof delta.old === 'object' && !Array.isArray(delta.old))
113
+ ? delta.old : {};
114
+ const newObj = (delta.new && typeof delta.new === 'object' && !Array.isArray(delta.new))
115
+ ? delta.new : {};
116
+ normalizedChange.emits = diffObjects(oldObj, newObj);
117
+ break;
118
+ }
119
+ case 'functions': {
120
+ const oldArr = Array.isArray(delta.old) ? delta.old : [];
121
+ const newArr = Array.isArray(delta.new) ? delta.new : [];
122
+ normalizedChange.functions = diffArrays(oldArr, newArr);
123
+ break;
124
+ }
125
+ case 'variables': {
126
+ const oldArr = Array.isArray(delta.old) ? delta.old : [];
127
+ const newArr = Array.isArray(delta.new) ? delta.new : [];
128
+ normalizedChange.variables = diffArrays(oldArr, newArr);
129
+ break;
130
+ }
131
+ case 'state': {
132
+ const oldObj = (delta.old && typeof delta.old === 'object' && !Array.isArray(delta.old))
133
+ ? delta.old : {};
134
+ const newObj = (delta.new && typeof delta.new === 'object' && !Array.isArray(delta.new))
135
+ ? delta.new : {};
136
+ normalizedChange.state = diffObjects(oldObj, newObj);
137
+ break;
138
+ }
139
+ // Other delta types (hash, imports, hooks, exports, components, apiSignature)
140
+ // are not breaking changes for violation detection
141
+ }
142
+ }
143
+ // Only add if there are actual changes to detect
144
+ if (normalizedChange.props || normalizedChange.emits || normalizedChange.state ||
145
+ normalizedChange.functions || normalizedChange.variables) {
146
+ normalized.push(normalizedChange);
147
+ }
148
+ }
149
+ return normalized;
150
+ }
151
+ /**
152
+ * Core detection logic - operates on normalized changes
153
+ * Breaking changes are treated as errors, type changes as warnings
154
+ * Note: Missing dependencies are not tracked as violations (they're expected for third-party packages)
155
+ */
156
+ function detectFromNormalized(changes) {
157
+ const violations = [];
158
+ for (const change of changes) {
159
+ const { entryId } = change;
160
+ // Contract removed is a breaking change
161
+ if (change.removed) {
162
+ violations.push({
163
+ type: 'contract_removed',
164
+ severity: 'error',
165
+ entryId,
166
+ message: `Contract removed: ${entryId}`,
167
+ });
168
+ continue;
169
+ }
170
+ // Removed props are breaking changes
171
+ if (change.props?.removed) {
172
+ for (const propName of change.props.removed) {
173
+ violations.push({
174
+ type: 'breaking_change_prop_removed',
175
+ severity: 'error',
176
+ entryId,
177
+ message: `Breaking change: prop '${propName}' removed from ${entryId}`,
178
+ details: { name: propName },
179
+ });
180
+ }
181
+ }
182
+ // Changed prop types are breaking changes (warning severity)
183
+ // Skip type changes in git baseline mode to avoid false positives from path differences
184
+ if (change.props?.changed && !change.gitBaseline) {
185
+ for (const prop of change.props.changed) {
186
+ violations.push({
187
+ type: 'breaking_change_prop_type',
188
+ severity: 'warning',
189
+ entryId,
190
+ message: `Prop '${prop.name}' type changed in ${entryId}`,
191
+ details: { name: prop.name, oldValue: prop.old, newValue: prop.new },
192
+ });
193
+ }
194
+ }
195
+ // Removed events are breaking changes
196
+ if (change.emits?.removed) {
197
+ for (const eventName of change.emits.removed) {
198
+ violations.push({
199
+ type: 'breaking_change_event_removed',
200
+ severity: 'error',
201
+ entryId,
202
+ message: `Breaking change: event '${eventName}' removed from ${entryId}`,
203
+ details: { name: eventName },
204
+ });
205
+ }
206
+ }
207
+ // Removed state is a breaking change (warning severity)
208
+ if (change.state?.removed) {
209
+ for (const stateName of change.state.removed) {
210
+ violations.push({
211
+ type: 'breaking_change_state_removed',
212
+ severity: 'warning',
213
+ entryId,
214
+ message: `State '${stateName}' removed from ${entryId}`,
215
+ details: { name: stateName },
216
+ });
217
+ }
218
+ }
219
+ // Removed functions are breaking changes
220
+ if (change.functions?.removed) {
221
+ for (const funcName of change.functions.removed) {
222
+ violations.push({
223
+ type: 'breaking_change_function_removed',
224
+ severity: 'error',
225
+ entryId,
226
+ message: `Breaking change: function '${funcName}' removed from ${entryId}`,
227
+ details: { name: funcName },
228
+ });
229
+ }
230
+ }
231
+ // Removed variables are breaking changes (warning severity)
232
+ if (change.variables?.removed) {
233
+ for (const varName of change.variables.removed) {
234
+ violations.push({
235
+ type: 'breaking_change_variable_removed',
236
+ severity: 'warning',
237
+ entryId,
238
+ message: `Variable '${varName}' removed from ${entryId}`,
239
+ details: { name: varName },
240
+ });
241
+ }
242
+ }
243
+ }
244
+ return violations;
245
+ }
246
+ /**
247
+ * Detect violations from either watch mode or compare mode input
248
+ */
249
+ export function detectViolations(input) {
250
+ const normalized = input.type === 'watch'
251
+ ? normalizeFromWatch(input.changes)
252
+ : normalizeFromCompare(input.result, input.gitBaseline);
253
+ return detectFromNormalized(normalized);
254
+ }
255
+ /**
256
+ * Create a summary of violations
257
+ */
258
+ export function summarizeViolations(violations) {
259
+ const errors = violations.filter(v => v.severity === 'error');
260
+ const warnings = violations.filter(v => v.severity === 'warning');
261
+ return {
262
+ timestamp: new Date().toISOString(),
263
+ totalViolations: violations.length,
264
+ errors: errors.length,
265
+ warnings: warnings.length,
266
+ violations,
267
+ changedFiles: [], // Caller should populate this if needed
268
+ };
269
+ }
270
+ /**
271
+ * Display violations to console
272
+ */
273
+ export function displayViolations(violations, options = {}) {
274
+ if (violations.length === 0)
275
+ return;
276
+ const errors = violations.filter(v => v.severity === 'error');
277
+ const warnings = violations.filter(v => v.severity === 'warning');
278
+ console.log(`\n ⚠️ Strict Mode: ${violations.length} violation(s) detected`);
279
+ if (errors.length > 0) {
280
+ console.log(`\n ❌ Errors (${errors.length}):`);
281
+ errors.forEach(v => {
282
+ console.log(` ${v.message}`);
283
+ });
284
+ }
285
+ if (warnings.length > 0) {
286
+ console.log(`\n ⚠️ Warnings (${warnings.length}):`);
287
+ warnings.forEach(v => {
288
+ console.log(` ${v.message}`);
289
+ });
290
+ }
291
+ }
292
+ //# sourceMappingURL=violations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"violations.js","sourceRoot":"","sources":["../../src/core/violations.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"propTypeNormalizer.d.ts","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,CA4DjF"}
1
+ {"version":3,"file":"propTypeNormalizer.d.ts","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,CA6DjF"}
@@ -39,7 +39,8 @@ export function normalizePropType(typeText, isOptional) {
39
39
  return trimmed.slice(1, -1);
40
40
  }
41
41
  return trimmed;
42
- });
42
+ })
43
+ .sort(); // Sort literals for determinism
43
44
  return {
44
45
  type: 'literal-union',
45
46
  literals,
@@ -1 +1 @@
1
- {"version":3,"file":"propTypeNormalizer.js","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,QAAQ;SACZ,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAO,8CAA8C;SACrF,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,UAAmB;IACrE,IAAI,CAAC;QACH,uFAAuF;QACvF,qGAAqG;QACrG,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAExD,wGAAwG;QACxG,gHAAgH;QAChH,8EAA8E;QAC9E,MAAM,mBAAmB,GAAG,+IAA+I,CAAC;QAC5K,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,SAAS;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzB,qCAAqC;gBACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAClD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;YAEL,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,QAAQ;gBACR,GAAG,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,oFAAoF;QACpF,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,SAAS;gBACpB,GAAG,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,IAAI,UAAU,EAAE,CAAC;YACf,gGAAgG;YAChG,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0CAA0C;QAC1C,UAAU,CAAC,oBAAoB,EAAE,mBAAmB,EAAE;YACpD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"propTypeNormalizer.js","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,QAAQ;SACZ,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAO,8CAA8C;SACrF,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,UAAmB;IACrE,IAAI,CAAC;QACH,uFAAuF;QACvF,qGAAqG;QACrG,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAExD,wGAAwG;QACxG,gHAAgH;QAChH,8EAA8E;QAC9E,MAAM,mBAAmB,GAAG,+IAA+I,CAAC;QAC5K,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,SAAS;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzB,qCAAqC;gBACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAClD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,EAAE,CAAC,CAAC,gCAAgC;YAE3C,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,QAAQ;gBACR,GAAG,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,oFAAoF;QACpF,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,SAAS;gBACpB,GAAG,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,IAAI,UAAU,EAAE,CAAC;YACf,gGAAgG;YAChG,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0CAA0C;QAC1C,UAAU,CAAC,oBAAoB,EAAE,mBAAmB,EAAE;YACpD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
package/dist/index.d.ts CHANGED
@@ -31,8 +31,8 @@ export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
31
31
  export { buildLogicSignature } from './core/signature.js';
32
32
  export { contextCommand } from './cli/commands/context.js';
33
33
  export type { ContextOptions } from './cli/commands/context.js';
34
- export { compareCommand, multiFileCompare } from './cli/commands/compare.js';
35
- export type { CompareOptions, CompareResult, FolderCompareResult, MultiFileCompareResult, MultiFileCompareOptions } from './cli/commands/compare.js';
34
+ export { compareCommand, multiFileCompare } from './cli/commands/compare/index.js';
35
+ export type { CompareOptions, CompareResult, FolderCompareResult, MultiFileCompareResult, MultiFileCompareOptions } from './cli/commands/compare/index.js';
36
36
  export { validateCommand, validateBundles, multiFileValidate } from './cli/commands/validate.js';
37
37
  export type { ValidationResult, FolderValidationResult, MultiFileValidationResult } from './cli/commands/validate.js';
38
38
  export { init } from './cli/commands/init.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7H,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjK,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7E,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACrJ,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5J,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7H,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjK,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC3J,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5J,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -26,7 +26,7 @@ export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
26
26
  export { buildLogicSignature } from './core/signature.js';
27
27
  // CLI commands (for programmatic use)
28
28
  export { contextCommand } from './cli/commands/context.js';
29
- export { compareCommand, multiFileCompare } from './cli/commands/compare.js';
29
+ export { compareCommand, multiFileCompare } from './cli/commands/compare/index.js';
30
30
  export { validateCommand, validateBundles, multiFileValidate } from './cli/commands/validate.js';
31
31
  export { init } from './cli/commands/init.js';
32
32
  export { cleanCommand } from './cli/commands/clean.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEjG,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5J,gDAAgD;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEjG,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5J,gDAAgD;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AA8FD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8D7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAYZ"}
1
+ {"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AA8FD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAsI7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAYZ"}
@@ -2,7 +2,7 @@
2
2
  * Lightweight file locking utility for preventing TOCTOU race conditions
3
3
  * Uses exclusive file creation with PID tracking for stale lock detection
4
4
  */
5
- import { open, unlink, readFile } from 'node:fs/promises';
5
+ import { open, unlink, readFile, access } from 'node:fs/promises';
6
6
  import { constants } from 'node:fs';
7
7
  /**
8
8
  * Check if a process is still running
@@ -115,6 +115,44 @@ export async function acquireLock(filePath, options = {}) {
115
115
  pid: process.pid,
116
116
  timestamp: Date.now(),
117
117
  };
118
+ // Helper function to try acquiring lock immediately with retries (for Windows race condition)
119
+ const tryAcquireImmediately = async () => {
120
+ for (let retry = 0; retry < 5; retry++) {
121
+ // Check timeout before each retry
122
+ if (Date.now() - startTime >= timeout) {
123
+ return null;
124
+ }
125
+ await new Promise(resolve => setTimeout(resolve, 10 + retry * 5)); // 10, 15, 20, 25, 30ms
126
+ try {
127
+ const handle = await open(lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY);
128
+ await handle.writeFile(JSON.stringify(lockContent));
129
+ await handle.close();
130
+ // Successfully acquired lock!
131
+ return {
132
+ release: async () => {
133
+ if (released)
134
+ return;
135
+ released = true;
136
+ try {
137
+ await unlink(lockPath);
138
+ }
139
+ catch {
140
+ // Ignore errors during release
141
+ }
142
+ },
143
+ };
144
+ }
145
+ catch (retryErr) {
146
+ const retryError = retryErr;
147
+ if (retryError.code !== 'EEXIST') {
148
+ // Not a file-exists error, something else went wrong - abort retry loop
149
+ return null;
150
+ }
151
+ // Still exists, continue retrying
152
+ }
153
+ }
154
+ return null; // Retry loop exhausted
155
+ };
118
156
  while (Date.now() - startTime < timeout) {
119
157
  try {
120
158
  // Try to create lock file exclusively (fails if exists)
@@ -140,17 +178,53 @@ export async function acquireLock(filePath, options = {}) {
140
178
  const err = error;
141
179
  if (err.code === 'EEXIST') {
142
180
  // Lock file exists - check if it's stale
143
- if (await isLockStale(lockPath, staleThreshold)) {
181
+ const stale = await isLockStale(lockPath, staleThreshold);
182
+ if (stale) {
144
183
  await removeStale(lockPath);
145
- // Small delay after removing stale lock to let filesystem catch up
184
+ // Delay after removing stale lock to let filesystem catch up
146
185
  // Especially important on Windows where file deletion can be asynchronous
147
- await new Promise(resolve => setTimeout(resolve, 10));
186
+ // Use longer delay under load (when tests run in parallel)
187
+ await new Promise(resolve => setTimeout(resolve, 20));
148
188
  // Retry immediately after removing stale lock
149
189
  continue;
150
190
  }
151
191
  // Lock is held by another active process - wait and retry
192
+ // On Windows, file deletion can be asynchronous, so we need to be more careful.
193
+ // Check if file still exists before waiting - if it's already gone, try to acquire immediately.
194
+ try {
195
+ await access(lockPath);
196
+ }
197
+ catch {
198
+ // File no longer exists - try to acquire immediately with retries
199
+ // On Windows, there's a race where access() says file is gone but open() still sees it.
200
+ // Retry a few times with small delays to handle Windows filesystem propagation delays.
201
+ const immediateResult = await tryAcquireImmediately();
202
+ if (immediateResult) {
203
+ return immediateResult;
204
+ }
205
+ // Retry loop exhausted, continue to normal wait logic
206
+ continue;
207
+ }
208
+ // File exists, wait before retrying
152
209
  await new Promise(resolve => setTimeout(resolve, retryInterval));
153
- continue;
210
+ // After waiting, check again if file still exists
211
+ // On Windows, the file might have been deleted while we waited, but the
212
+ // filesystem hasn't fully propagated the deletion yet. Try to acquire immediately.
213
+ try {
214
+ await access(lockPath);
215
+ // File still exists, continue to next iteration (will check stale again)
216
+ continue;
217
+ }
218
+ catch {
219
+ // File no longer exists - try to acquire immediately with retries
220
+ // Same retry logic as above to handle Windows race condition
221
+ const immediateResult = await tryAcquireImmediately();
222
+ if (immediateResult) {
223
+ return immediateResult;
224
+ }
225
+ // Retry loop exhausted, continue to normal wait/retry cycle
226
+ continue;
227
+ }
154
228
  }
155
229
  // Other error (e.g., permission denied, directory doesn't exist)
156
230
  // Don't retry for these errors
@@ -1 +1 @@
1
- {"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"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"}