logicstamp-context 0.5.5 → 0.7.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 (90) hide show
  1. package/LLM_CONTEXT.md +67 -20
  2. package/README.md +50 -36
  3. package/dist/cli/commands/clean.d.ts +2 -2
  4. package/dist/cli/commands/clean.js +2 -2
  5. package/dist/cli/commands/compare.js +1 -1
  6. package/dist/cli/commands/compare.js.map +1 -1
  7. package/dist/cli/commands/context/configManager.js +2 -2
  8. package/dist/cli/commands/context/configManager.js.map +1 -1
  9. package/dist/cli/commands/context/contractBuilder.d.ts +1 -0
  10. package/dist/cli/commands/context/contractBuilder.d.ts.map +1 -1
  11. package/dist/cli/commands/context/contractBuilder.js +1 -1
  12. package/dist/cli/commands/context/contractBuilder.js.map +1 -1
  13. package/dist/cli/commands/context/incrementalWatch.d.ts +2 -2
  14. package/dist/cli/commands/context/incrementalWatch.d.ts.map +1 -1
  15. package/dist/cli/commands/context/incrementalWatch.js +100 -38
  16. package/dist/cli/commands/context/incrementalWatch.js.map +1 -1
  17. package/dist/cli/commands/context/index.d.ts +22 -2
  18. package/dist/cli/commands/context/index.d.ts.map +1 -1
  19. package/dist/cli/commands/context/index.js +24 -2
  20. package/dist/cli/commands/context/index.js.map +1 -1
  21. package/dist/cli/commands/context/statsCalculator.d.ts +1 -1
  22. package/dist/cli/commands/context/statsCalculator.js +4 -4
  23. package/dist/cli/commands/context/statsCalculator.js.map +1 -1
  24. package/dist/cli/commands/context/tokenEstimator.d.ts.map +1 -1
  25. package/dist/cli/commands/context/tokenEstimator.js +10 -7
  26. package/dist/cli/commands/context/tokenEstimator.js.map +1 -1
  27. package/dist/cli/commands/context/watchMode.d.ts +2 -2
  28. package/dist/cli/commands/context/watchMode.d.ts.map +1 -1
  29. package/dist/cli/commands/context/watchMode.js +8 -6
  30. package/dist/cli/commands/context/watchMode.js.map +1 -1
  31. package/dist/cli/commands/context.d.ts +2 -1
  32. package/dist/cli/commands/context.d.ts.map +1 -1
  33. package/dist/cli/commands/context.js +12 -7
  34. package/dist/cli/commands/context.js.map +1 -1
  35. package/dist/cli/commands/init.js +7 -7
  36. package/dist/cli/commands/init.js.map +1 -1
  37. package/dist/cli/commands/security.d.ts +1 -1
  38. package/dist/cli/commands/security.js +1 -1
  39. package/dist/cli/commands/style.d.ts +2 -2
  40. package/dist/cli/commands/style.js +2 -2
  41. package/dist/cli/commands/validate.d.ts +1 -1
  42. package/dist/cli/commands/validate.js +2 -2
  43. package/dist/cli/commands/validate.js.map +1 -1
  44. package/dist/cli/handlers/compareHandler.d.ts +1 -1
  45. package/dist/cli/handlers/compareHandler.js +5 -5
  46. package/dist/cli/handlers/compareHandler.js.map +1 -1
  47. package/dist/cli/handlers/contextHandler.d.ts +1 -1
  48. package/dist/cli/handlers/contextHandler.js +2 -2
  49. package/dist/cli/handlers/contextHandler.js.map +1 -1
  50. package/dist/cli/handlers/styleHandler.js +1 -1
  51. package/dist/cli/handlers/styleHandler.js.map +1 -1
  52. package/dist/cli/index.d.ts +2 -2
  53. package/dist/cli/index.js +10 -10
  54. package/dist/cli/index.js.map +1 -1
  55. package/dist/cli/parser/argumentParser.d.ts +1 -1
  56. package/dist/cli/parser/argumentParser.d.ts.map +1 -1
  57. package/dist/cli/parser/argumentParser.js +6 -1
  58. package/dist/cli/parser/argumentParser.js.map +1 -1
  59. package/dist/cli/parser/helpText.d.ts.map +1 -1
  60. package/dist/cli/parser/helpText.js +37 -30
  61. package/dist/cli/parser/helpText.js.map +1 -1
  62. package/dist/cli/stamp.d.ts +2 -2
  63. package/dist/cli/stamp.js +3 -3
  64. package/dist/cli/stamp.js.map +1 -1
  65. package/dist/core/pack/loader.d.ts +2 -0
  66. package/dist/core/pack/loader.d.ts.map +1 -1
  67. package/dist/core/pack/loader.js +106 -5
  68. package/dist/core/pack/loader.js.map +1 -1
  69. package/dist/extractors/react/propExtractor.d.ts.map +1 -1
  70. package/dist/extractors/react/propExtractor.js +164 -217
  71. package/dist/extractors/react/propExtractor.js.map +1 -1
  72. package/dist/extractors/styling/styleExtractor.d.ts +5 -2
  73. package/dist/extractors/styling/styleExtractor.d.ts.map +1 -1
  74. package/dist/extractors/styling/styleExtractor.js +177 -5
  75. package/dist/extractors/styling/styleExtractor.js.map +1 -1
  76. package/dist/types/UIFContract.d.ts +27 -4
  77. package/dist/types/UIFContract.d.ts.map +1 -1
  78. package/dist/types/UIFContract.js.map +1 -1
  79. package/dist/utils/config.d.ts +2 -0
  80. package/dist/utils/config.d.ts.map +1 -1
  81. package/dist/utils/config.js.map +1 -1
  82. package/dist/utils/fileLock.d.ts.map +1 -1
  83. package/dist/utils/fileLock.js +23 -4
  84. package/dist/utils/fileLock.js.map +1 -1
  85. package/dist/utils/schemaValidator.d.ts +24 -0
  86. package/dist/utils/schemaValidator.d.ts.map +1 -0
  87. package/dist/utils/schemaValidator.js +137 -0
  88. package/dist/utils/schemaValidator.js.map +1 -0
  89. package/package.json +6 -5
  90. package/schema/logicstamp.context.schema.json +70 -9
@@ -35,7 +35,18 @@ function isProcessAlive(pid) {
35
35
  async function isLockStale(lockPath, staleThreshold) {
36
36
  try {
37
37
  const content = await readFile(lockPath, 'utf-8');
38
- const lockData = JSON.parse(content);
38
+ // If file is empty, another process just created it and is writing - not stale
39
+ if (!content.trim()) {
40
+ return false;
41
+ }
42
+ let lockData;
43
+ try {
44
+ lockData = JSON.parse(content);
45
+ }
46
+ catch {
47
+ // Can't parse JSON - likely another process is mid-write, not stale
48
+ return false;
49
+ }
39
50
  // Check if the process that created the lock is still alive
40
51
  const alive = isProcessAlive(lockData.pid);
41
52
  if (alive === 'unknown') {
@@ -54,9 +65,14 @@ async function isLockStale(lockPath, staleThreshold) {
54
65
  }
55
66
  return false;
56
67
  }
57
- catch {
58
- // If we can't read the lock file, assume it's stale
59
- return true;
68
+ catch (error) {
69
+ const err = error;
70
+ // File doesn't exist - either never created or already removed
71
+ if (err.code === 'ENOENT') {
72
+ return true;
73
+ }
74
+ // Other read errors - be conservative, assume not stale
75
+ return false;
60
76
  }
61
77
  }
62
78
  /**
@@ -126,6 +142,9 @@ export async function acquireLock(filePath, options = {}) {
126
142
  // Lock file exists - check if it's stale
127
143
  if (await isLockStale(lockPath, staleThreshold)) {
128
144
  await removeStale(lockPath);
145
+ // Small delay after removing stale lock to let filesystem catch up
146
+ // Especially important on Windows where file deletion can be asynchronous
147
+ await new Promise(resolve => setTimeout(resolve, 10));
129
148
  // Retry immediately after removing stale lock
130
149
  continue;
131
150
  }
@@ -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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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Schema validation utilities using AJV
3
+ * Validates JSON data against LogicStamp schemas at runtime
4
+ */
5
+ import type { UIFContract } from '../types/UIFContract.js';
6
+ /**
7
+ * Validate data against the UIFContract schema
8
+ * Returns validation result with detailed errors if invalid
9
+ */
10
+ export declare function validateUIFContract(data: unknown): {
11
+ valid: boolean;
12
+ errors: string[];
13
+ data: UIFContract | null;
14
+ };
15
+ /**
16
+ * Type guard that validates and narrows type
17
+ * Use when you just need a boolean check
18
+ */
19
+ export declare function isValidUIFContract(data: unknown): data is UIFContract;
20
+ /**
21
+ * Clear the cached validator (useful for testing)
22
+ */
23
+ export declare function clearValidatorCache(): void;
24
+ //# sourceMappingURL=schemaValidator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaValidator.d.ts","sourceRoot":"","sources":["../../src/utils/schemaValidator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAwD3D;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,OAAO,GAAG;IAClD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;CAC1B,CA+BA;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,WAAW,CAErE;AAqCD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAI1C"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Schema validation utilities using AJV
3
+ * Validates JSON data against LogicStamp schemas at runtime
4
+ */
5
+ import Ajv from 'ajv';
6
+ import { readFileSync } from 'node:fs';
7
+ import { join, dirname } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { debugError } from './debug.js';
10
+ // Resolve schema path relative to this module
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const schemaPath = join(__dirname, '../../schema/logicstamp.context.schema.json');
13
+ // Lazy-load schema and validator to avoid startup cost if validation isn't used
14
+ let ajv = null;
15
+ let contractValidator = null;
16
+ let schemaLoadError = null;
17
+ /**
18
+ * Initialize AJV and compile the UIFContract schema
19
+ * Called lazily on first validation attempt
20
+ */
21
+ function initializeValidator() {
22
+ if (contractValidator)
23
+ return contractValidator;
24
+ if (schemaLoadError)
25
+ return null;
26
+ try {
27
+ const schemaContent = readFileSync(schemaPath, 'utf8');
28
+ const schema = JSON.parse(schemaContent);
29
+ // Guard against malformed schema file
30
+ if (!schema?.definitions?.UIFContract) {
31
+ throw new Error('UIFContract definition not found in schema');
32
+ }
33
+ ajv = new Ajv({
34
+ allErrors: true, // Collect all errors, not just the first
35
+ strict: false, // Allow schema features that aren't strictly spec-compliant
36
+ verbose: true, // Ensures `data` field is present in errors for typeof reporting
37
+ });
38
+ // Compile the UIFContract definition specifically
39
+ // The schema file has definitions at the root level
40
+ contractValidator = ajv.compile({
41
+ $ref: '#/definitions/UIFContract',
42
+ definitions: schema.definitions,
43
+ });
44
+ return contractValidator;
45
+ }
46
+ catch (error) {
47
+ // Clean up on failure
48
+ ajv = null;
49
+ contractValidator = null;
50
+ schemaLoadError = error;
51
+ debugError('schemaValidator', 'initializeValidator', {
52
+ error: schemaLoadError.message,
53
+ note: 'Schema validation disabled, contracts will not be validated',
54
+ });
55
+ return null;
56
+ }
57
+ }
58
+ /**
59
+ * Validate data against the UIFContract schema
60
+ * Returns validation result with detailed errors if invalid
61
+ */
62
+ export function validateUIFContract(data) {
63
+ const validator = initializeValidator();
64
+ // If schema failed to load, reject validation
65
+ // This ensures corrupted or invalid contracts are never silently accepted
66
+ if (!validator) {
67
+ return {
68
+ valid: false,
69
+ errors: ['Schema validation unavailable: ' + (schemaLoadError?.message || 'failed to load schema')],
70
+ data: null,
71
+ };
72
+ }
73
+ const valid = validator(data);
74
+ if (valid) {
75
+ return {
76
+ valid: true,
77
+ errors: [],
78
+ data: data,
79
+ };
80
+ }
81
+ // Format errors for readability
82
+ const errors = formatValidationErrors(validator.errors);
83
+ return {
84
+ valid: false,
85
+ errors,
86
+ data: null,
87
+ };
88
+ }
89
+ /**
90
+ * Type guard that validates and narrows type
91
+ * Use when you just need a boolean check
92
+ */
93
+ export function isValidUIFContract(data) {
94
+ return validateUIFContract(data).valid;
95
+ }
96
+ /**
97
+ * Format AJV errors into human-readable strings
98
+ */
99
+ function formatValidationErrors(errors) {
100
+ if (!errors || errors.length === 0)
101
+ return [];
102
+ return errors.map((err) => {
103
+ const path = err.instancePath || '(root)';
104
+ const message = err.message || 'unknown error';
105
+ // Add context for common error types
106
+ switch (err.keyword) {
107
+ case 'required':
108
+ return `${path}: missing required property '${err.params.missingProperty}'`;
109
+ case 'type': {
110
+ // typeof null === 'object' and typeof [] === 'object', so handle explicitly
111
+ const got = err.data === null ? 'null' : Array.isArray(err.data) ? 'array' : typeof err.data;
112
+ return `${path}: ${message} (got ${got})`;
113
+ }
114
+ case 'enum':
115
+ return `${path}: ${message}. Allowed: ${err.params.allowedValues?.join(', ')}`;
116
+ case 'const':
117
+ return `${path}: ${message}. Expected: ${err.params.allowedValue}`;
118
+ case 'additionalProperties':
119
+ return `${path}: unexpected property '${err.params.additionalProperty}'`;
120
+ case 'anyOf':
121
+ case 'oneOf':
122
+ // These are notoriously noisy - simplify the message
123
+ return `${path}: ${message} (schema union mismatch)`;
124
+ default:
125
+ return `${path}: ${message}`;
126
+ }
127
+ });
128
+ }
129
+ /**
130
+ * Clear the cached validator (useful for testing)
131
+ */
132
+ export function clearValidatorCache() {
133
+ ajv = null;
134
+ contractValidator = null;
135
+ schemaLoadError = null;
136
+ }
137
+ //# sourceMappingURL=schemaValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaValidator.js","sourceRoot":"","sources":["../../src/utils/schemaValidator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "logicstamp-context",
3
- "version": "0.5.5",
4
- "description": "Deterministic architectural context for TypeScript codebases. Generates explicit component contracts and dependency graphs for AI workflows.",
3
+ "version": "0.7.0",
4
+ "description": "The context compiler for TypeScript. Compile your codebase into deterministic architectural contracts and dependency graphs for AI coding workflows.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "exports": {
@@ -60,10 +60,11 @@
60
60
  },
61
61
  "dependencies": {
62
62
  "@toon-format/toon": "^1.0.0",
63
+ "ajv": "^8.18.0",
63
64
  "chokidar": "^4.0.3",
64
65
  "css-tree": "^3.1.0",
65
- "glob": "^10.5.0",
66
- "ts-morph": "^21.0.1"
66
+ "glob": "^13.0.6",
67
+ "ts-morph": "^27.0.2"
67
68
  },
68
69
  "optionalDependencies": {
69
70
  "@anthropic-ai/tokenizer": "^0.0.4",
@@ -77,6 +78,6 @@
77
78
  "vitest": "^4.0.16"
78
79
  },
79
80
  "engines": {
80
- "node": ">=18.18.0"
81
+ "node": ">=20"
81
82
  }
82
83
  }
@@ -551,6 +551,9 @@
551
551
  },
552
552
  "pageLayout": {
553
553
  "$ref": "#/definitions/PageLayoutMetadata"
554
+ },
555
+ "summary": {
556
+ "$ref": "#/definitions/StyleSummary"
554
557
  }
555
558
  },
556
559
  "additionalProperties": false
@@ -569,7 +572,14 @@
569
572
  "type": "string"
570
573
  }
571
574
  },
572
- "description": "Tailwind classes categorized by type (layout, spacing, colors, typography, borders, effects)"
575
+ "description": "Tailwind classes categorized by type (layout, spacing, colors, typography, borders, effects) - full mode only"
576
+ },
577
+ "categoriesUsed": {
578
+ "type": "array",
579
+ "items": {
580
+ "type": "string"
581
+ },
582
+ "description": "Category names used (e.g., ['layout', 'spacing', 'colors']) - lean mode only"
573
583
  },
574
584
  "breakpoints": {
575
585
  "type": "array",
@@ -684,7 +694,7 @@
684
694
  "properties": {
685
695
  "css": {
686
696
  "type": "string",
687
- "description": "Extracted CSS content from <style jsx> blocks"
697
+ "description": "Extracted CSS content from <style jsx> blocks - full mode only"
688
698
  },
689
699
  "global": {
690
700
  "type": "boolean",
@@ -695,14 +705,22 @@
695
705
  "items": {
696
706
  "type": "string"
697
707
  },
698
- "description": "CSS selectors found in the extracted CSS"
708
+ "description": "CSS selectors found in the extracted CSS - full mode only"
709
+ },
710
+ "selectorCount": {
711
+ "type": "number",
712
+ "description": "Number of CSS selectors found - lean mode only"
699
713
  },
700
714
  "properties": {
701
715
  "type": "array",
702
716
  "items": {
703
717
  "type": "string"
704
718
  },
705
- "description": "CSS properties found in the extracted CSS"
719
+ "description": "CSS properties found in the extracted CSS - full mode only"
720
+ },
721
+ "propertyCount": {
722
+ "type": "number",
723
+ "description": "Number of CSS properties found - lean mode only"
706
724
  }
707
725
  },
708
726
  "additionalProperties": false
@@ -715,7 +733,11 @@
715
733
  "items": {
716
734
  "type": "string"
717
735
  },
718
- "description": "Styled component names (e.g., ['div', 'Button'])"
736
+ "description": "Styled component names (e.g., ['div', 'Button']) - full mode only"
737
+ },
738
+ "componentCount": {
739
+ "type": "number",
740
+ "description": "Number of styled components - lean mode only"
719
741
  },
720
742
  "usesTheme": {
721
743
  "type": "boolean",
@@ -1067,7 +1089,11 @@
1067
1089
  "items": {
1068
1090
  "type": "string"
1069
1091
  },
1070
- "description": "Identified page sections"
1092
+ "description": "Identified page sections - full mode only"
1093
+ },
1094
+ "sectionCount": {
1095
+ "type": "number",
1096
+ "description": "Number of identified page sections - lean mode only"
1071
1097
  }
1072
1098
  },
1073
1099
  "additionalProperties": false
@@ -1080,14 +1106,22 @@
1080
1106
  "items": {
1081
1107
  "type": "string"
1082
1108
  },
1083
- "description": "Color utility classes (sorted, limited to top 10)"
1109
+ "description": "Color utility classes (sorted, limited to top 10) - full mode only"
1110
+ },
1111
+ "colorCount": {
1112
+ "type": "number",
1113
+ "description": "Number of color utility classes - lean mode only"
1084
1114
  },
1085
1115
  "spacing": {
1086
1116
  "type": "array",
1087
1117
  "items": {
1088
1118
  "type": "string"
1089
1119
  },
1090
- "description": "Spacing utility classes (sorted, limited to top 10)"
1120
+ "description": "Spacing utility classes (sorted, limited to top 10) - full mode only"
1121
+ },
1122
+ "spacingCount": {
1123
+ "type": "number",
1124
+ "description": "Number of spacing utility classes - lean mode only"
1091
1125
  },
1092
1126
  "radius": {
1093
1127
  "type": "string",
@@ -1098,7 +1132,11 @@
1098
1132
  "items": {
1099
1133
  "type": "string"
1100
1134
  },
1101
- "description": "Typography classes (sorted, limited to top 10)"
1135
+ "description": "Typography classes (sorted, limited to top 10) - full mode only"
1136
+ },
1137
+ "typographyCount": {
1138
+ "type": "number",
1139
+ "description": "Number of typography classes - lean mode only"
1102
1140
  }
1103
1141
  },
1104
1142
  "additionalProperties": false
@@ -1143,6 +1181,29 @@
1143
1181
  },
1144
1182
  "additionalProperties": false
1145
1183
  },
1184
+ "StyleSummary": {
1185
+ "type": "object",
1186
+ "required": ["mode", "sources"],
1187
+ "properties": {
1188
+ "mode": {
1189
+ "type": "string",
1190
+ "enum": ["lean", "full"],
1191
+ "description": "Style extraction mode: 'lean' (compact with counts/flags) or 'full' (verbose with arrays)"
1192
+ },
1193
+ "sources": {
1194
+ "type": "array",
1195
+ "items": {
1196
+ "type": "string"
1197
+ },
1198
+ "description": "Style sources detected (e.g., ['tailwind', 'shadcn', 'scss'])"
1199
+ },
1200
+ "fullModeBytes": {
1201
+ "type": "number",
1202
+ "description": "Estimated byte size of full mode output (only present in lean mode)"
1203
+ }
1204
+ },
1205
+ "additionalProperties": false
1206
+ },
1146
1207
  "NextJSMetadata": {
1147
1208
  "type": "object",
1148
1209
  "properties": {