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.
- package/LLM_CONTEXT.md +2 -2
- package/README.md +59 -33
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +25 -9
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/ignore.d.ts +16 -0
- package/dist/cli/commands/ignore.d.ts.map +1 -0
- package/dist/cli/commands/ignore.js +61 -0
- package/dist/cli/commands/ignore.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -2
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +7 -8
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/security.d.ts +1 -2
- package/dist/cli/commands/security.d.ts.map +1 -1
- package/dist/cli/commands/security.js +30 -69
- package/dist/cli/commands/security.js.map +1 -1
- package/dist/cli/handlers/ignoreHandler.d.ts +5 -0
- package/dist/cli/handlers/ignoreHandler.d.ts.map +1 -0
- package/dist/cli/handlers/ignoreHandler.js +23 -0
- package/dist/cli/handlers/ignoreHandler.js.map +1 -0
- package/dist/cli/handlers/securityHandler.d.ts.map +1 -1
- package/dist/cli/handlers/securityHandler.js +1 -5
- package/dist/cli/handlers/securityHandler.js.map +1 -1
- package/dist/cli/parser/argumentParser.d.ts +9 -0
- package/dist/cli/parser/argumentParser.d.ts.map +1 -1
- package/dist/cli/parser/argumentParser.js +31 -4
- package/dist/cli/parser/argumentParser.js.map +1 -1
- package/dist/cli/parser/helpText.d.ts +1 -0
- package/dist/cli/parser/helpText.d.ts.map +1 -1
- package/dist/cli/parser/helpText.js +63 -24
- package/dist/cli/parser/helpText.js.map +1 -1
- package/dist/cli/stamp.js +6 -0
- package/dist/cli/stamp.js.map +1 -1
- package/dist/core/astParser/detectors.d.ts.map +1 -1
- package/dist/core/astParser/detectors.js +95 -0
- package/dist/core/astParser/detectors.js.map +1 -1
- package/dist/core/pack/builder.d.ts.map +1 -1
- package/dist/core/pack/builder.js +25 -5
- package/dist/core/pack/builder.js.map +1 -1
- package/dist/core/pack/loader.d.ts +14 -0
- package/dist/core/pack/loader.d.ts.map +1 -1
- package/dist/core/pack/loader.js +86 -2
- package/dist/core/pack/loader.js.map +1 -1
- package/dist/core/pack.d.ts.map +1 -1
- package/dist/core/pack.js +15 -2
- package/dist/core/pack.js.map +1 -1
- package/dist/core/signature.d.ts.map +1 -1
- package/dist/core/signature.js +4 -0
- package/dist/core/signature.js.map +1 -1
- package/dist/types/UIFContract.d.ts +1 -1
- package/dist/types/UIFContract.d.ts.map +1 -1
- package/dist/utils/codeSanitizer.d.ts +24 -0
- package/dist/utils/codeSanitizer.d.ts.map +1 -0
- package/dist/utils/codeSanitizer.js +234 -0
- package/dist/utils/codeSanitizer.js.map +1 -0
- package/dist/utils/stampignore.d.ts.map +1 -1
- package/dist/utils/stampignore.js +36 -14
- package/dist/utils/stampignore.js.map +1 -1
- package/package.json +5 -2
- 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":"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"}
|
|
@@ -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,
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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 ===
|
|
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(
|
|
168
|
+
// Check against normalized relative path
|
|
169
|
+
if (regex.test(normalizedRelativePath)) {
|
|
148
170
|
return true;
|
|
149
171
|
}
|
|
150
|
-
// Also check
|
|
151
|
-
if (regex.test(
|
|
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":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;
|
|
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.
|
|
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": "
|
|
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.
|
|
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
|