logicstamp-context 0.2.7 → 0.3.1

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 (61) hide show
  1. package/LLM_CONTEXT.md +2 -2
  2. package/README.md +59 -33
  3. package/dist/cli/commands/context.d.ts.map +1 -1
  4. package/dist/cli/commands/context.js +25 -9
  5. package/dist/cli/commands/context.js.map +1 -1
  6. package/dist/cli/commands/ignore.d.ts +16 -0
  7. package/dist/cli/commands/ignore.d.ts.map +1 -0
  8. package/dist/cli/commands/ignore.js +61 -0
  9. package/dist/cli/commands/ignore.js.map +1 -0
  10. package/dist/cli/commands/init.d.ts +2 -2
  11. package/dist/cli/commands/init.d.ts.map +1 -1
  12. package/dist/cli/commands/init.js +7 -8
  13. package/dist/cli/commands/init.js.map +1 -1
  14. package/dist/cli/commands/security.d.ts +1 -2
  15. package/dist/cli/commands/security.d.ts.map +1 -1
  16. package/dist/cli/commands/security.js +30 -69
  17. package/dist/cli/commands/security.js.map +1 -1
  18. package/dist/cli/handlers/ignoreHandler.d.ts +5 -0
  19. package/dist/cli/handlers/ignoreHandler.d.ts.map +1 -0
  20. package/dist/cli/handlers/ignoreHandler.js +23 -0
  21. package/dist/cli/handlers/ignoreHandler.js.map +1 -0
  22. package/dist/cli/handlers/securityHandler.d.ts.map +1 -1
  23. package/dist/cli/handlers/securityHandler.js +1 -5
  24. package/dist/cli/handlers/securityHandler.js.map +1 -1
  25. package/dist/cli/parser/argumentParser.d.ts +9 -0
  26. package/dist/cli/parser/argumentParser.d.ts.map +1 -1
  27. package/dist/cli/parser/argumentParser.js +31 -4
  28. package/dist/cli/parser/argumentParser.js.map +1 -1
  29. package/dist/cli/parser/helpText.d.ts +1 -0
  30. package/dist/cli/parser/helpText.d.ts.map +1 -1
  31. package/dist/cli/parser/helpText.js +63 -24
  32. package/dist/cli/parser/helpText.js.map +1 -1
  33. package/dist/cli/stamp.js +6 -0
  34. package/dist/cli/stamp.js.map +1 -1
  35. package/dist/core/astParser/detectors.d.ts.map +1 -1
  36. package/dist/core/astParser/detectors.js +95 -0
  37. package/dist/core/astParser/detectors.js.map +1 -1
  38. package/dist/core/pack/builder.d.ts.map +1 -1
  39. package/dist/core/pack/builder.js +25 -5
  40. package/dist/core/pack/builder.js.map +1 -1
  41. package/dist/core/pack/loader.d.ts +14 -0
  42. package/dist/core/pack/loader.d.ts.map +1 -1
  43. package/dist/core/pack/loader.js +86 -2
  44. package/dist/core/pack/loader.js.map +1 -1
  45. package/dist/core/pack.d.ts.map +1 -1
  46. package/dist/core/pack.js +15 -2
  47. package/dist/core/pack.js.map +1 -1
  48. package/dist/core/signature.d.ts.map +1 -1
  49. package/dist/core/signature.js +4 -0
  50. package/dist/core/signature.js.map +1 -1
  51. package/dist/types/UIFContract.d.ts +1 -1
  52. package/dist/types/UIFContract.d.ts.map +1 -1
  53. package/dist/utils/codeSanitizer.d.ts +24 -0
  54. package/dist/utils/codeSanitizer.d.ts.map +1 -0
  55. package/dist/utils/codeSanitizer.js +234 -0
  56. package/dist/utils/codeSanitizer.js.map +1 -0
  57. package/dist/utils/stampignore.d.ts.map +1 -1
  58. package/dist/utils/stampignore.js +36 -14
  59. package/dist/utils/stampignore.js.map +1 -1
  60. package/package.json +5 -2
  61. package/schema/logicstamp.context.schema.json +1 -1
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Code sanitization utilities
3
+ * Replaces secret values in code with "PRIVATE_DATA" based on security report
4
+ */
5
+ import type { SecurityReport } from '../cli/commands/security.js';
6
+ /**
7
+ * Load security report from file
8
+ */
9
+ export declare function loadSecurityReport(projectRoot: string): Promise<SecurityReport | null>;
10
+ /**
11
+ * Result of sanitization operation
12
+ */
13
+ export interface SanitizeResult {
14
+ sanitized: string;
15
+ secretsReplaced: boolean;
16
+ filePath: string;
17
+ matchCount: number;
18
+ }
19
+ /**
20
+ * Sanitize code by replacing secret values with "PRIVATE_DATA"
21
+ * Uses security report to identify which lines contain secrets
22
+ */
23
+ export declare function sanitizeCode(code: string, filePath: string, report: SecurityReport | null, projectRoot: string): SanitizeResult;
24
+ //# sourceMappingURL=codeSanitizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeSanitizer.d.ts","sourceRoot":"","sources":["../../src/utils/codeSanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAS5F;AA+LD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,GAAG,IAAI,EAC7B,WAAW,EAAE,MAAM,GAClB,cAAc,CAwDhB"}
@@ -0,0 +1,234 @@
1
+ /**
2
+ * Code sanitization utilities
3
+ * Replaces secret values in code with "PRIVATE_DATA" based on security report
4
+ */
5
+ import { resolve, isAbsolute, normalize } from 'node:path';
6
+ import { readFile } from 'node:fs/promises';
7
+ /**
8
+ * Load security report from file
9
+ */
10
+ export async function loadSecurityReport(projectRoot) {
11
+ try {
12
+ const reportPath = resolve(projectRoot, 'stamp_security_report.json');
13
+ const content = await readFile(reportPath, 'utf8');
14
+ return JSON.parse(content);
15
+ }
16
+ catch (error) {
17
+ // Report doesn't exist or can't be read - that's okay
18
+ return null;
19
+ }
20
+ }
21
+ /**
22
+ * Normalize a path for comparison (handles Windows case-insensitivity)
23
+ * Converts to lowercase on Windows and normalizes separators
24
+ */
25
+ function normalizePathForComparison(path) {
26
+ const normalized = normalize(resolve(path));
27
+ // On Windows, paths are case-insensitive, so lowercase for comparison
28
+ // Also normalize separators to forward slashes for consistency
29
+ if (process.platform === 'win32') {
30
+ return normalized.toLowerCase().replace(/\\/g, '/');
31
+ }
32
+ return normalized.replace(/\\/g, '/');
33
+ }
34
+ /**
35
+ * Get secret matches for a specific file
36
+ */
37
+ function getSecretMatchesForFile(report, filePath, projectRoot) {
38
+ // Try to match file path - handle both absolute and relative paths
39
+ const absoluteFilePath = isAbsolute(filePath) ? filePath : resolve(projectRoot, filePath);
40
+ const normalizedTargetPath = normalizePathForComparison(absoluteFilePath);
41
+ // Also normalize project roots for comparison
42
+ const normalizedReportRoot = normalizePathForComparison(report.projectRoot);
43
+ const normalizedCurrentRoot = normalizePathForComparison(projectRoot);
44
+ return report.matches.filter(match => {
45
+ // Normalize match file path - try multiple strategies
46
+ let matchFilePath;
47
+ if (isAbsolute(match.file)) {
48
+ // Match file is already absolute
49
+ matchFilePath = match.file;
50
+ }
51
+ else {
52
+ // Match file is relative - try resolving from report's projectRoot first
53
+ matchFilePath = resolve(report.projectRoot, match.file);
54
+ }
55
+ const normalizedMatchPath = normalizePathForComparison(matchFilePath);
56
+ // Direct path match
57
+ if (normalizedMatchPath === normalizedTargetPath) {
58
+ return true;
59
+ }
60
+ // If project roots differ, try resolving relative to current projectRoot
61
+ if (normalizedReportRoot !== normalizedCurrentRoot && !isAbsolute(match.file)) {
62
+ // Try resolving the match file relative to current projectRoot
63
+ const alternativePath = resolve(projectRoot, match.file);
64
+ const normalizedAlternative = normalizePathForComparison(alternativePath);
65
+ if (normalizedAlternative === normalizedTargetPath) {
66
+ return true;
67
+ }
68
+ // Try making both paths relative to their respective roots and comparing
69
+ // This handles cases where the file structure is the same but roots differ
70
+ try {
71
+ const relativeFromReport = match.file.replace(/^\.\//, '');
72
+ const relativeFromCurrent = filePath.replace(/^\.\//, '');
73
+ if (normalizePathForComparison(relativeFromReport) === normalizePathForComparison(relativeFromCurrent)) {
74
+ return true;
75
+ }
76
+ }
77
+ catch {
78
+ // Ignore errors in relative path comparison
79
+ }
80
+ }
81
+ return false;
82
+ });
83
+ }
84
+ /**
85
+ * Sanitize a line of code by replacing secret values with "PRIVATE_DATA"
86
+ * Uses the match information to accurately identify and replace the secret value
87
+ */
88
+ function sanitizeLine(line, matches) {
89
+ if (matches.length === 0) {
90
+ return line;
91
+ }
92
+ let sanitized = line;
93
+ // Sort matches by column (right to left) to avoid offset issues when replacing
94
+ const sortedMatches = [...matches].sort((a, b) => b.column - a.column);
95
+ for (const match of sortedMatches) {
96
+ // Extract the secret value from the snippet
97
+ // The snippet typically shows: "context = 'SECRET_VALUE' context"
98
+ // We need to extract the actual secret value
99
+ // For database URLs: postgres://user:password@host (check this FIRST before quoted value matching)
100
+ // Database URLs are often in quotes, so we need to handle them specially
101
+ if (match.type === 'Database URL with Credentials') {
102
+ // Extract the password from the URL pattern: protocol://user:password@host
103
+ const dbUrlMatch = match.snippet.match(/((?:postgres|mysql|mongodb):\/\/[^:]+:)([^@]+)(@)/i);
104
+ if (dbUrlMatch) {
105
+ const password = dbUrlMatch[2];
106
+ // Also try to find the full URL in the line to replace just the password part
107
+ const fullUrlMatch = sanitized.match(/(['"`])((?:postgres|mysql|mongodb):\/\/[^:]+:)([^@]+)(@[^'"`]+)\1/i);
108
+ if (fullUrlMatch) {
109
+ const quote = fullUrlMatch[1];
110
+ const prefix = fullUrlMatch[2];
111
+ const passwordPart = fullUrlMatch[3];
112
+ const suffix = fullUrlMatch[4];
113
+ // Replace the URL with password sanitized
114
+ sanitized = sanitized.replace(fullUrlMatch[0], `${quote}${prefix}PRIVATE_DATA${suffix}${quote}`);
115
+ }
116
+ else if (sanitized.includes(password)) {
117
+ // Fallback: just replace the password if we can't match the full URL
118
+ sanitized = sanitized.replace(password, 'PRIVATE_DATA');
119
+ }
120
+ }
121
+ continue;
122
+ }
123
+ // Try to extract quoted values: 'value', "value", or `value`
124
+ // Handle cases where snippet has extra context (leading/trailing spaces, etc.)
125
+ const quotedValueMatch = match.snippet.match(/[=:]\s*(['"`])([^'"`]+)\1/);
126
+ if (quotedValueMatch) {
127
+ const quote = quotedValueMatch[1];
128
+ const secretValue = quotedValueMatch[2];
129
+ // Replace the secret value in the line, preserving quotes
130
+ // The secretValue might be in the line even if the snippet has different context
131
+ if (secretValue && secretValue.length > 0) {
132
+ const escapedValue = secretValue.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
133
+ // Try to find and replace the quoted value in the line
134
+ // Match: quote + secretValue + quote (with word boundaries to avoid partial matches)
135
+ const quotePattern = new RegExp(`${quote}${escapedValue}${quote}`, 'g');
136
+ // Check if pattern matches (don't use test() as it modifies lastIndex)
137
+ if (quotePattern.exec(sanitized) !== null) {
138
+ // Reset regex lastIndex before replace
139
+ quotePattern.lastIndex = 0;
140
+ sanitized = sanitized.replace(quotePattern, `${quote}PRIVATE_DATA${quote}`);
141
+ }
142
+ else if (sanitized.includes(secretValue)) {
143
+ // Fallback: if exact quote match fails, try to replace the value itself
144
+ // This handles cases where quotes might differ or context is different
145
+ sanitized = sanitized.replace(new RegExp(escapedValue, 'g'), 'PRIVATE_DATA');
146
+ }
147
+ }
148
+ continue;
149
+ }
150
+ // Try to extract unquoted values after = or :
151
+ const unquotedValueMatch = match.snippet.match(/[=:]\s+([a-zA-Z0-9_\-]{16,})/);
152
+ if (unquotedValueMatch) {
153
+ const secretValue = unquotedValueMatch[1];
154
+ if (sanitized.includes(secretValue)) {
155
+ const escapedValue = secretValue.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
156
+ sanitized = sanitized.replace(new RegExp(`\\b${escapedValue}\\b`, 'g'), 'PRIVATE_DATA');
157
+ }
158
+ continue;
159
+ }
160
+ // For private keys, replace the entire key block
161
+ if (match.type === 'Private Key' && sanitized.includes('BEGIN')) {
162
+ // Find the private key block and replace content between BEGIN and END
163
+ sanitized = sanitized.replace(/(-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----)[\s\S]*?(-----END\s+(?:RSA\s+)?PRIVATE\s+KEY-----)/g, '$1\nPRIVATE_DATA\n$2');
164
+ continue;
165
+ }
166
+ // Fallback: try to find and replace long alphanumeric strings that match the pattern
167
+ // This is less precise but catches edge cases
168
+ const longStringMatch = match.snippet.match(/([a-zA-Z0-9_\-]{20,})/);
169
+ if (longStringMatch) {
170
+ const potentialSecret = longStringMatch[1];
171
+ // Only replace if it's not already been replaced and it's a reasonable length
172
+ if (potentialSecret.length >= 16 && sanitized.includes(potentialSecret) && !sanitized.includes('PRIVATE_DATA')) {
173
+ const escaped = potentialSecret.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
174
+ sanitized = sanitized.replace(new RegExp(escaped, 'g'), 'PRIVATE_DATA');
175
+ }
176
+ }
177
+ }
178
+ return sanitized;
179
+ }
180
+ /**
181
+ * Sanitize code by replacing secret values with "PRIVATE_DATA"
182
+ * Uses security report to identify which lines contain secrets
183
+ */
184
+ export function sanitizeCode(code, filePath, report, projectRoot) {
185
+ if (!report || report.matches.length === 0) {
186
+ return {
187
+ sanitized: code,
188
+ secretsReplaced: false,
189
+ filePath,
190
+ matchCount: 0,
191
+ };
192
+ }
193
+ // Get secret matches for this specific file
194
+ const fileMatches = getSecretMatchesForFile(report, filePath, projectRoot);
195
+ if (fileMatches.length === 0) {
196
+ // No matches for this file - return code unchanged
197
+ return {
198
+ sanitized: code,
199
+ secretsReplaced: false,
200
+ filePath,
201
+ matchCount: 0,
202
+ };
203
+ }
204
+ // Group matches by line number
205
+ const matchesByLine = new Map();
206
+ for (const match of fileMatches) {
207
+ if (!matchesByLine.has(match.line)) {
208
+ matchesByLine.set(match.line, []);
209
+ }
210
+ matchesByLine.get(match.line).push(match);
211
+ }
212
+ // Sanitize each line that has secrets
213
+ const lines = code.split('\n');
214
+ let secretsReplaced = false;
215
+ const sanitizedLines = lines.map((line, index) => {
216
+ const lineNumber = index + 1; // Line numbers are 1-based
217
+ const lineMatches = matchesByLine.get(lineNumber);
218
+ if (lineMatches && lineMatches.length > 0) {
219
+ const sanitized = sanitizeLine(line, lineMatches);
220
+ if (sanitized !== line) {
221
+ secretsReplaced = true;
222
+ }
223
+ return sanitized;
224
+ }
225
+ return line;
226
+ });
227
+ return {
228
+ sanitized: sanitizedLines.join('\n'),
229
+ secretsReplaced,
230
+ filePath,
231
+ matchCount: fileMatches.length,
232
+ };
233
+ }
234
+ //# sourceMappingURL=codeSanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codeSanitizer.js","sourceRoot":"","sources":["../../src/utils/codeSanitizer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAI5C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,WAAmB;IAC1D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,EAAE,4BAA4B,CAAC,CAAC;QACtE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAmB,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,sDAAsD;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,0BAA0B,CAAC,IAAY;IAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,sEAAsE;IACtE,+DAA+D;IAC/D,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,MAAsB,EACtB,QAAgB,EAChB,WAAmB;IAEnB,mEAAmE;IACnE,MAAM,gBAAgB,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC1F,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,gBAAgB,CAAC,CAAC;IAE1E,8CAA8C;IAC9C,MAAM,oBAAoB,GAAG,0BAA0B,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,WAAW,CAAC,CAAC;IAEtE,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QACnC,sDAAsD;QACtD,IAAI,aAAqB,CAAC;QAE1B,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,iCAAiC;YACjC,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,yEAAyE;YACzE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,mBAAmB,GAAG,0BAA0B,CAAC,aAAa,CAAC,CAAC;QAEtE,oBAAoB;QACpB,IAAI,mBAAmB,KAAK,oBAAoB,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,yEAAyE;QACzE,IAAI,oBAAoB,KAAK,qBAAqB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9E,+DAA+D;YAC/D,MAAM,eAAe,GAAG,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,qBAAqB,GAAG,0BAA0B,CAAC,eAAe,CAAC,CAAC;YAC1E,IAAI,qBAAqB,KAAK,oBAAoB,EAAE,CAAC;gBACnD,OAAO,IAAI,CAAC;YACd,CAAC;YAED,yEAAyE;YACzE,2EAA2E;YAC3E,IAAI,CAAC;gBACH,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC3D,MAAM,mBAAmB,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC1D,IAAI,0BAA0B,CAAC,kBAAkB,CAAC,KAAK,0BAA0B,CAAC,mBAAmB,CAAC,EAAE,CAAC;oBACvG,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,4CAA4C;YAC9C,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CAAC,IAAY,EAAE,OAAsB;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,+EAA+E;IAC/E,MAAM,aAAa,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAEvE,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,4CAA4C;QAC5C,kEAAkE;QAClE,6CAA6C;QAE7C,mGAAmG;QACnG,yEAAyE;QACzE,IAAI,KAAK,CAAC,IAAI,KAAK,+BAA+B,EAAE,CAAC;YACnD,2EAA2E;YAC3E,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;YAC7F,IAAI,UAAU,EAAE,CAAC;gBACf,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;gBAC/B,8EAA8E;gBAC9E,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;gBAC3G,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC9B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC/B,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBACrC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;oBAC/B,0CAA0C;oBAC1C,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,YAAY,CAAC,CAAC,CAAC,EACf,GAAG,KAAK,GAAG,MAAM,eAAe,MAAM,GAAG,KAAK,EAAE,CACjD,CAAC;gBACJ,CAAC;qBAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACxC,qEAAqE;oBACrE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,6DAA6D;QAC7D,+EAA+E;QAC/E,MAAM,gBAAgB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1E,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,WAAW,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAExC,0DAA0D;YAC1D,iFAAiF;YACjF,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;gBACxE,uDAAuD;gBACvD,qFAAqF;gBACrF,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,GAAG,YAAY,GAAG,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;gBACxE,uEAAuE;gBACvE,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE,CAAC;oBAC1C,uCAAuC;oBACvC,YAAY,CAAC,SAAS,GAAG,CAAC,CAAC;oBAC3B,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,KAAK,eAAe,KAAK,EAAE,CAAC,CAAC;gBAC9E,CAAC;qBAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC3C,wEAAwE;oBACxE,uEAAuE;oBACvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,8CAA8C;QAC9C,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC/E,IAAI,kBAAkB,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;gBACxE,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,IAAI,MAAM,CAAC,MAAM,YAAY,KAAK,EAAE,GAAG,CAAC,EACxC,cAAc,CACf,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QAED,iDAAiD;QACjD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAChE,uEAAuE;YACvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,iGAAiG,EACjG,sBAAsB,CACvB,CAAC;YACF,SAAS;QACX,CAAC;QAED,qFAAqF;QACrF,8CAA8C;QAC9C,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QACrE,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC3C,8EAA8E;YAC9E,IAAI,eAAe,CAAC,MAAM,IAAI,EAAE,IAAI,SAAS,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC/G,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;gBACvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,cAAc,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAYD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,IAAY,EACZ,QAAgB,EAChB,MAA6B,EAC7B,WAAmB;IAEnB,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO;YACL,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,KAAK;YACtB,QAAQ;YACR,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,GAAG,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE3E,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,mDAAmD;QACnD,OAAO;YACL,SAAS,EAAE,IAAI;YACf,eAAe,EAAE,KAAK;YACtB,QAAQ;YACR,UAAU,EAAE,CAAC;SACd,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;IACvD,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,sCAAsC;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,MAAM,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/C,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,2BAA2B;QACzD,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAElD,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAClD,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;gBACvB,eAAe,GAAG,IAAI,CAAC;YACzB,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;QACpC,eAAe;QACf,QAAQ;QACR,UAAU,EAAE,WAAW,CAAC,MAAM;KAC/B,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stampignore.d.ts","sourceRoot":"","sources":["../../src/utils/stampignore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAsC1F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuB/C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAwCT;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CAMV;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB3E"}
1
+ {"version":3,"file":"stampignore.d.ts","sourceRoot":"","sources":["../../src/utils/stampignore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,iBAAiB,CAAC;AAEnD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAO3E;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAsC1F;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,IAAI,CAAC,CA+Bf;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAuB/C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAgET;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,MAAM,EAAE,EACf,QAAQ,EAAE,MAAM,EAAE,EAClB,WAAW,EAAE,MAAM,GAClB,MAAM,EAAE,CAMV;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAmB3E"}
@@ -3,9 +3,9 @@
3
3
  * Similar to .gitignore, but for LogicStamp context generation
4
4
  */
5
5
  import { readFile, writeFile, access, unlink } from 'node:fs/promises';
6
- import { join } from 'node:path';
6
+ import { join, isAbsolute } from 'node:path';
7
7
  import { debugError } from './debug.js';
8
- import { normalizeEntryId } from './fsx.js';
8
+ import { normalizeEntryId, getRelativePath } from './fsx.js';
9
9
  /**
10
10
  * Default .stampignore filename
11
11
  */
@@ -122,17 +122,39 @@ export async function addToStampignore(targetDir, pathsToAdd) {
122
122
  * Supports glob patterns and exact paths
123
123
  */
124
124
  export function matchesIgnorePattern(filePath, patterns, projectRoot) {
125
- const normalizedPath = normalizeEntryId(filePath);
126
- const normalizedRoot = normalizeEntryId(projectRoot);
127
- // Make path relative to project root for matching
128
- let relativePath = normalizedPath;
129
- if (normalizedPath.startsWith(normalizedRoot)) {
130
- relativePath = normalizedPath.slice(normalizedRoot.length).replace(/^\//, '');
125
+ // Get relative path from project root
126
+ // Use getRelativePath which properly handles Windows paths and converts to forward slashes
127
+ let relativePath;
128
+ if (isAbsolute(filePath)) {
129
+ relativePath = getRelativePath(projectRoot, filePath);
130
+ // If the relative path starts with '..', the file is outside the project root
131
+ // Don't match files outside the project root
132
+ if (relativePath.startsWith('../')) {
133
+ return false;
134
+ }
131
135
  }
136
+ else {
137
+ relativePath = filePath;
138
+ }
139
+ // Handle edge case: if relative path is empty or just '.', skip matching
140
+ if (!relativePath || relativePath === '.' || relativePath === './') {
141
+ return false;
142
+ }
143
+ // Normalize the relative path for consistent matching
144
+ // normalizeEntryId normalizes path separators, drive letters, and removes leading ./
145
+ const normalizedRelativePath = normalizeEntryId(relativePath);
146
+ // Extract just the filename for filename-only pattern matching
147
+ const fileName = normalizedRelativePath.split('/').pop() || '';
132
148
  for (const pattern of patterns) {
149
+ // Normalize the pattern (should already be relative, but normalize for consistency)
133
150
  const normalizedPattern = normalizeEntryId(pattern);
134
- // Exact match
135
- if (normalizedPattern === relativePath || normalizedPattern === normalizedPath) {
151
+ // Exact match against full relative path
152
+ if (normalizedPattern === normalizedRelativePath) {
153
+ return true;
154
+ }
155
+ // Filename-only match: if pattern doesn't contain a slash, match against filename
156
+ // This allows patterns like "not-found.tsx" to match "src/not-found.tsx" or "app/not-found.tsx"
157
+ if (!normalizedPattern.includes('/') && normalizedPattern === fileName) {
136
158
  return true;
137
159
  }
138
160
  // Glob pattern matching (simple implementation)
@@ -143,12 +165,12 @@ export function matchesIgnorePattern(filePath, patterns, projectRoot) {
143
165
  .replace(/\*/g, '[^/]*')
144
166
  .replace(/\?/g, '.');
145
167
  const regex = new RegExp(`^${regexPattern}$`);
146
- // Check against relative path
147
- if (regex.test(relativePath)) {
168
+ // Check against normalized relative path
169
+ if (regex.test(normalizedRelativePath)) {
148
170
  return true;
149
171
  }
150
- // Also check against full normalized path
151
- if (regex.test(normalizedPath)) {
172
+ // Also check filename-only glob patterns (e.g., "*.test.tsx")
173
+ if (!normalizedPattern.includes('/') && regex.test(fileName)) {
152
174
  return true;
153
175
  }
154
176
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stampignore.js","sourceRoot":"","sources":["../../src/utils/stampignore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stampignore.js","sourceRoot":"","sources":["../../src/utils/stampignore.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "logicstamp-context",
3
- "version": "0.2.7",
3
+ "version": "0.3.1",
4
4
  "description": "Generate AI-friendly context bundles from React codebases with LogicStamp contracts",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,7 +47,10 @@
47
47
  "url": "https://github.com/LogicStamp/logicstamp-context/issues"
48
48
  },
49
49
  "homepage": "https://github.com/LogicStamp/logicstamp-context#readme",
50
- "author": "LogicStamp Contributors",
50
+ "author": "Amit Levi <amit23082@gmail.com> (https://amitlevi.dev)",
51
+ "contributors": [
52
+ "LogicStamp Contributors"
53
+ ],
51
54
  "license": "MIT",
52
55
  "publishConfig": {
53
56
  "access": "public"
@@ -117,7 +117,7 @@
117
117
  "source": {
118
118
  "type": "string",
119
119
  "pattern": "^logicstamp-context@\\d+\\.\\d+\\.\\d+$",
120
- "description": "Generator identifier with version (e.g., 'logicstamp-context@0.2.7'). Used for compatibility tracking and debugging."
120
+ "description": "Generator identifier with version (e.g., 'logicstamp-context@0.3.1'). Used for compatibility tracking and debugging."
121
121
  }
122
122
  },
123
123
  "additionalProperties": false