logicstamp-context 0.2.6 → 0.2.7
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 +28 -13
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +11 -1
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/commands/init.d.ts +4 -0
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +84 -9
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/security.d.ts +38 -0
- package/dist/cli/commands/security.d.ts.map +1 -0
- package/dist/cli/commands/security.js +343 -0
- package/dist/cli/commands/security.js.map +1 -0
- package/dist/cli/handlers/securityHandler.d.ts +5 -0
- package/dist/cli/handlers/securityHandler.d.ts.map +1 -0
- package/dist/cli/handlers/securityHandler.js +45 -0
- package/dist/cli/handlers/securityHandler.js.map +1 -0
- package/dist/cli/parser/argumentParser.d.ts.map +1 -1
- package/dist/cli/parser/argumentParser.js +23 -0
- package/dist/cli/parser/argumentParser.js.map +1 -1
- package/dist/cli/parser/helpText.d.ts +2 -0
- package/dist/cli/parser/helpText.d.ts.map +1 -1
- package/dist/cli/parser/helpText.js +453 -348
- package/dist/cli/parser/helpText.js.map +1 -1
- package/dist/cli/stamp.js +55 -1
- package/dist/cli/stamp.js.map +1 -1
- package/dist/utils/gitignore.d.ts +30 -2
- package/dist/utils/gitignore.d.ts.map +1 -1
- package/dist/utils/gitignore.js +132 -20
- package/dist/utils/gitignore.js.map +1 -1
- package/dist/utils/secretDetector.d.ts +21 -0
- package/dist/utils/secretDetector.d.ts.map +1 -0
- package/dist/utils/secretDetector.js +145 -0
- package/dist/utils/secretDetector.js.map +1 -0
- package/dist/utils/stampignore.d.ts +49 -0
- package/dist/utils/stampignore.d.ts.map +1 -0
- package/dist/utils/stampignore.js +189 -0
- package/dist/utils/stampignore.js.map +1 -0
- package/package.json +1 -1
- package/schema/logicstamp.context.schema.json +1 -1
|
@@ -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
|
|
1
|
+
{"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../../src/cli/parser/helpText.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDN,CAAC;AACJ,CAAC"}
|
package/dist/cli/stamp.js
CHANGED
|
@@ -12,7 +12,9 @@ import { handleCompare } from './handlers/compareHandler.js';
|
|
|
12
12
|
import { handleClean } from './handlers/cleanHandler.js';
|
|
13
13
|
import { handleStyle } from './handlers/styleHandler.js';
|
|
14
14
|
import { handleGenerate } from './handlers/contextHandler.js';
|
|
15
|
-
import {
|
|
15
|
+
import { handleSecurityScan } from './handlers/securityHandler.js';
|
|
16
|
+
import { securityHardResetCommand } from './commands/security.js';
|
|
17
|
+
import { getMainHelp, getSecurityHelp } from './parser/helpText.js';
|
|
16
18
|
import { printFoxIcon } from './handlers/initHandler.js';
|
|
17
19
|
async function main() {
|
|
18
20
|
const args = process.argv.slice(2);
|
|
@@ -46,6 +48,58 @@ async function main() {
|
|
|
46
48
|
await handleInit(args.slice(1));
|
|
47
49
|
return;
|
|
48
50
|
}
|
|
51
|
+
// Handle security command
|
|
52
|
+
if (subcommand === 'security') {
|
|
53
|
+
// Check for help
|
|
54
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
55
|
+
printFoxIcon();
|
|
56
|
+
console.log(getSecurityHelp());
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
// Handle security scan subcommand
|
|
60
|
+
if (args[1] === 'scan') {
|
|
61
|
+
// Check if --hard-reset was passed to scan (should be rejected)
|
|
62
|
+
const scanArgs = args.slice(2);
|
|
63
|
+
if (scanArgs.includes('--hard-reset')) {
|
|
64
|
+
console.error(`❌ Error: --hard-reset is not available for "stamp security scan"`);
|
|
65
|
+
console.error(` Use "stamp security --hard-reset" instead`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
await handleSecurityScan(scanArgs);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
// Check for --hard-reset at top level (only if no subcommand)
|
|
72
|
+
if (args.includes('--hard-reset')) {
|
|
73
|
+
const hardResetOptions = {
|
|
74
|
+
entry: undefined,
|
|
75
|
+
out: undefined,
|
|
76
|
+
force: args.includes('--force'),
|
|
77
|
+
quiet: args.includes('--quiet') || args.includes('-q'),
|
|
78
|
+
};
|
|
79
|
+
// Parse entry and out options
|
|
80
|
+
for (let i = 1; i < args.length; i++) {
|
|
81
|
+
const arg = args[i];
|
|
82
|
+
if (arg === '--out' || arg === '-o') {
|
|
83
|
+
hardResetOptions.out = args[i + 1];
|
|
84
|
+
i++;
|
|
85
|
+
}
|
|
86
|
+
else if (!arg.startsWith('-') && !hardResetOptions.entry && arg !== 'scan') {
|
|
87
|
+
hardResetOptions.entry = arg;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
await securityHardResetCommand(hardResetOptions);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// If no subcommand and no --hard-reset, show error
|
|
94
|
+
if (!args[1] || args[1].startsWith('--')) {
|
|
95
|
+
console.error(`❌ Security command requires a subcommand or --hard-reset`);
|
|
96
|
+
console.error('Run "stamp security scan --help" for usage information');
|
|
97
|
+
process.exit(1);
|
|
98
|
+
}
|
|
99
|
+
console.error(`❌ Unknown security command: ${args[1]}`);
|
|
100
|
+
console.error('Run "stamp security scan --help" for usage information');
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
49
103
|
if (subcommand !== 'context') {
|
|
50
104
|
console.error(`❌ Unknown command: ${subcommand}`);
|
|
51
105
|
console.error('Run "stamp --help" for usage information');
|
package/dist/cli/stamp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/cli/stamp.ts"],"names":[],"mappings":";AAEA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/cli/stamp.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Utilities for managing .gitignore files
|
|
3
3
|
*/
|
|
4
4
|
/**
|
|
5
|
-
* Patterns that should be added to .gitignore for LogicStamp context files
|
|
5
|
+
* Patterns that should be added to .gitignore for LogicStamp context & security files
|
|
6
6
|
*/
|
|
7
7
|
export declare const LOGICSTAMP_GITIGNORE_PATTERNS: string[];
|
|
8
8
|
/**
|
|
@@ -17,12 +17,27 @@ export declare function readGitignore(targetDir: string): Promise<string>;
|
|
|
17
17
|
* Check if a pattern exists in .gitignore content
|
|
18
18
|
*/
|
|
19
19
|
export declare function hasPattern(content: string, pattern: string): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Check if .gitignore has the LogicStamp block header comment
|
|
22
|
+
*/
|
|
23
|
+
export declare function hasLogicStampBlock(content: string): boolean;
|
|
20
24
|
/**
|
|
21
25
|
* Check if .gitignore has LogicStamp patterns
|
|
26
|
+
* This is a legacy function for backward compatibility - checks for key patterns
|
|
22
27
|
*/
|
|
23
28
|
export declare function hasLogicStampPatterns(content: string): boolean;
|
|
24
29
|
/**
|
|
25
|
-
*
|
|
30
|
+
* Get which LogicStamp patterns are missing from .gitignore content
|
|
31
|
+
*/
|
|
32
|
+
export declare function getMissingPatterns(content: string): string[];
|
|
33
|
+
/**
|
|
34
|
+
* Add LogicStamp patterns to .gitignore content (idempotent patch mode)
|
|
35
|
+
*
|
|
36
|
+
* Behavior:
|
|
37
|
+
* - If LogicStamp block exists: append only missing patterns to the block
|
|
38
|
+
* - If LogicStamp block doesn't exist: add full block at the end
|
|
39
|
+
* - Never duplicates patterns
|
|
40
|
+
* - Preserves user's manual additions
|
|
26
41
|
*/
|
|
27
42
|
export declare function addLogicStampPatterns(content: string): string;
|
|
28
43
|
/**
|
|
@@ -32,11 +47,24 @@ export declare function writeGitignore(targetDir: string, content: string): Prom
|
|
|
32
47
|
/**
|
|
33
48
|
* Add LogicStamp patterns to .gitignore file
|
|
34
49
|
* Creates .gitignore if it doesn't exist
|
|
50
|
+
* Uses idempotent patch mode - only adds missing patterns if block exists
|
|
35
51
|
*/
|
|
36
52
|
export declare function ensureGitignorePatterns(targetDir: string): Promise<{
|
|
37
53
|
added: boolean;
|
|
38
54
|
created: boolean;
|
|
39
55
|
}>;
|
|
56
|
+
/**
|
|
57
|
+
* Ensure a specific pattern is in .gitignore
|
|
58
|
+
* Adds the pattern if it doesn't exist, preserves existing content
|
|
59
|
+
*
|
|
60
|
+
* @param targetDir - Project root directory
|
|
61
|
+
* @param pattern - Pattern to ensure (relative to project root, e.g., "reports/security.json")
|
|
62
|
+
* @returns Result indicating if pattern was added and if .gitignore was created
|
|
63
|
+
*/
|
|
64
|
+
export declare function ensurePatternInGitignore(targetDir: string, pattern: string): Promise<{
|
|
65
|
+
added: boolean;
|
|
66
|
+
created: boolean;
|
|
67
|
+
}>;
|
|
40
68
|
/**
|
|
41
69
|
* Smart .gitignore management with config-based behavior (no prompting)
|
|
42
70
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,eAAO,MAAM,6BAA6B,
|
|
1
|
+
{"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;GAEG;AACH,eAAO,MAAM,6BAA6B,UAQzC,CAAC;AAEF;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOzE;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAOtE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAI5D;AA+CD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkD7D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BtF;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAiB9G;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA+B/C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACxC,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAyBpF"}
|
package/dist/utils/gitignore.js
CHANGED
|
@@ -6,15 +6,16 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { readConfig } from './config.js';
|
|
7
7
|
import { debugError } from './debug.js';
|
|
8
8
|
/**
|
|
9
|
-
* Patterns that should be added to .gitignore for LogicStamp context files
|
|
9
|
+
* Patterns that should be added to .gitignore for LogicStamp context & security files
|
|
10
10
|
*/
|
|
11
11
|
export const LOGICSTAMP_GITIGNORE_PATTERNS = [
|
|
12
|
-
'# LogicStamp context files',
|
|
12
|
+
'# LogicStamp context & security files',
|
|
13
13
|
'context.json',
|
|
14
14
|
'context_*.json',
|
|
15
15
|
'*.uif.json',
|
|
16
16
|
'logicstamp.manifest.json',
|
|
17
17
|
'.logicstamp/',
|
|
18
|
+
'stamp_security_report.json',
|
|
18
19
|
];
|
|
19
20
|
/**
|
|
20
21
|
* Check if .gitignore exists in the given directory
|
|
@@ -44,11 +45,18 @@ export async function readGitignore(targetDir) {
|
|
|
44
45
|
* Check if a pattern exists in .gitignore content
|
|
45
46
|
*/
|
|
46
47
|
export function hasPattern(content, pattern) {
|
|
47
|
-
const lines = content.split(
|
|
48
|
+
const lines = content.split(/\r?\n/).map(line => line.trim());
|
|
48
49
|
return lines.includes(pattern);
|
|
49
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if .gitignore has the LogicStamp block header comment
|
|
53
|
+
*/
|
|
54
|
+
export function hasLogicStampBlock(content) {
|
|
55
|
+
return hasPattern(content, '# LogicStamp context & security files');
|
|
56
|
+
}
|
|
50
57
|
/**
|
|
51
58
|
* Check if .gitignore has LogicStamp patterns
|
|
59
|
+
* This is a legacy function for backward compatibility - checks for key patterns
|
|
52
60
|
*/
|
|
53
61
|
export function hasLogicStampPatterns(content) {
|
|
54
62
|
// Check for the key patterns (ignore the comment line)
|
|
@@ -59,26 +67,94 @@ export function hasLogicStampPatterns(content) {
|
|
|
59
67
|
(hasPattern(content, 'context_*.json') || hasPattern(content, 'context_main.json'));
|
|
60
68
|
}
|
|
61
69
|
/**
|
|
62
|
-
*
|
|
70
|
+
* Get which LogicStamp patterns are missing from .gitignore content
|
|
63
71
|
*/
|
|
64
|
-
export function
|
|
65
|
-
|
|
66
|
-
// Check which patterns are missing
|
|
67
|
-
const missingPatterns = LOGICSTAMP_GITIGNORE_PATTERNS.filter(pattern => {
|
|
68
|
-
if (pattern.startsWith('#'))
|
|
69
|
-
return false; // Always add the comment
|
|
72
|
+
export function getMissingPatterns(content) {
|
|
73
|
+
return LOGICSTAMP_GITIGNORE_PATTERNS.filter(pattern => {
|
|
70
74
|
return !hasPattern(content, pattern);
|
|
71
75
|
});
|
|
72
|
-
|
|
73
|
-
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Find the insertion point for LogicStamp patterns in .gitignore content
|
|
79
|
+
* Returns the index where the LogicStamp block starts, or -1 if not found
|
|
80
|
+
*/
|
|
81
|
+
function findLogicStampBlockIndex(lines) {
|
|
82
|
+
const headerIndex = lines.findIndex(line => line.trim() === '# LogicStamp context & security files');
|
|
83
|
+
return headerIndex;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Find the insertion point for missing LogicStamp patterns
|
|
87
|
+
* Returns the index after the last existing LogicStamp pattern in the block
|
|
88
|
+
*/
|
|
89
|
+
function findLogicStampInsertionPoint(lines, startIndex) {
|
|
90
|
+
// Known LogicStamp patterns (excluding the header comment)
|
|
91
|
+
const knownPatterns = new Set(LOGICSTAMP_GITIGNORE_PATTERNS.filter(p => !p.startsWith('#')).map(p => p.trim()));
|
|
92
|
+
let lastPatternIndex = startIndex; // Start after the header comment
|
|
93
|
+
// Find the last LogicStamp pattern in the block
|
|
94
|
+
for (let i = startIndex + 1; i < lines.length; i++) {
|
|
95
|
+
const trimmed = lines[i].trim();
|
|
96
|
+
// If we hit a blank line, stop here (insert before the blank line)
|
|
97
|
+
if (trimmed === '') {
|
|
98
|
+
return i;
|
|
99
|
+
}
|
|
100
|
+
// If we hit a non-LogicStamp pattern (not a comment, not a known pattern), stop here
|
|
101
|
+
if (!trimmed.startsWith('#') && !knownPatterns.has(trimmed)) {
|
|
102
|
+
return i;
|
|
103
|
+
}
|
|
104
|
+
// If this is a LogicStamp pattern (comment or known pattern), update lastPatternIndex
|
|
105
|
+
if (trimmed.startsWith('#') || knownPatterns.has(trimmed)) {
|
|
106
|
+
lastPatternIndex = i + 1; // Insert after this line
|
|
107
|
+
}
|
|
74
108
|
}
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
109
|
+
// Block extends to end of file - insert at the end
|
|
110
|
+
return lastPatternIndex;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Add LogicStamp patterns to .gitignore content (idempotent patch mode)
|
|
114
|
+
*
|
|
115
|
+
* Behavior:
|
|
116
|
+
* - If LogicStamp block exists: append only missing patterns to the block
|
|
117
|
+
* - If LogicStamp block doesn't exist: add full block at the end
|
|
118
|
+
* - Never duplicates patterns
|
|
119
|
+
* - Preserves user's manual additions
|
|
120
|
+
*/
|
|
121
|
+
export function addLogicStampPatterns(content) {
|
|
122
|
+
const lines = content.split(/\r?\n/);
|
|
123
|
+
const hasBlock = hasLogicStampBlock(content);
|
|
124
|
+
const missingPatterns = getMissingPatterns(content);
|
|
125
|
+
// If block exists and all patterns are present, return unchanged
|
|
126
|
+
if (hasBlock && missingPatterns.length === 0) {
|
|
127
|
+
return content;
|
|
79
128
|
}
|
|
80
|
-
|
|
81
|
-
|
|
129
|
+
// If block exists but patterns are missing, append only missing ones
|
|
130
|
+
if (hasBlock && missingPatterns.length > 0) {
|
|
131
|
+
const blockStartIndex = findLogicStampBlockIndex(lines);
|
|
132
|
+
const insertIndex = findLogicStampInsertionPoint(lines, blockStartIndex);
|
|
133
|
+
// Insert missing patterns right after the last existing LogicStamp pattern
|
|
134
|
+
const newLines = [...lines];
|
|
135
|
+
const patternsToAdd = missingPatterns.map(p => p.trim());
|
|
136
|
+
// Insert patterns at the insertion point
|
|
137
|
+
newLines.splice(insertIndex, 0, ...patternsToAdd);
|
|
138
|
+
// Preserve original line ending style
|
|
139
|
+
const lineEnding = content.includes('\r\n') ? '\r\n' : '\n';
|
|
140
|
+
return newLines.join(lineEnding) + (content.endsWith(lineEnding) ? '' : lineEnding);
|
|
141
|
+
}
|
|
142
|
+
// Block doesn't exist - add full block at the end
|
|
143
|
+
let newContent = content;
|
|
144
|
+
// Add blank lines before the section if content exists
|
|
145
|
+
if (newContent.length > 0) {
|
|
146
|
+
// Normalize line endings and ensure we end with at least one newline
|
|
147
|
+
const normalized = newContent.replace(/\r\n/g, '\n');
|
|
148
|
+
if (!normalized.endsWith('\n')) {
|
|
149
|
+
newContent = normalized + '\n';
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
newContent = normalized;
|
|
153
|
+
}
|
|
154
|
+
// Add one more blank line if content doesn't already end with one
|
|
155
|
+
if (!newContent.endsWith('\n\n')) {
|
|
156
|
+
newContent += '\n';
|
|
157
|
+
}
|
|
82
158
|
}
|
|
83
159
|
// Add all LogicStamp patterns as a group
|
|
84
160
|
newContent += LOGICSTAMP_GITIGNORE_PATTERNS.join('\n') + '\n';
|
|
@@ -120,14 +196,50 @@ export async function writeGitignore(targetDir, content) {
|
|
|
120
196
|
/**
|
|
121
197
|
* Add LogicStamp patterns to .gitignore file
|
|
122
198
|
* Creates .gitignore if it doesn't exist
|
|
199
|
+
* Uses idempotent patch mode - only adds missing patterns if block exists
|
|
123
200
|
*/
|
|
124
201
|
export async function ensureGitignorePatterns(targetDir) {
|
|
125
202
|
const exists = await gitignoreExists(targetDir);
|
|
126
203
|
const content = await readGitignore(targetDir);
|
|
127
|
-
if
|
|
204
|
+
// Use smart patch mode - will append only missing patterns if block exists
|
|
205
|
+
const newContent = addLogicStampPatterns(content);
|
|
206
|
+
// Check if content actually changed
|
|
207
|
+
const contentChanged = content !== newContent;
|
|
208
|
+
if (!contentChanged) {
|
|
128
209
|
return { added: false, created: false };
|
|
129
210
|
}
|
|
130
|
-
|
|
211
|
+
await writeGitignore(targetDir, newContent);
|
|
212
|
+
return { added: true, created: !exists };
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Ensure a specific pattern is in .gitignore
|
|
216
|
+
* Adds the pattern if it doesn't exist, preserves existing content
|
|
217
|
+
*
|
|
218
|
+
* @param targetDir - Project root directory
|
|
219
|
+
* @param pattern - Pattern to ensure (relative to project root, e.g., "reports/security.json")
|
|
220
|
+
* @returns Result indicating if pattern was added and if .gitignore was created
|
|
221
|
+
*/
|
|
222
|
+
export async function ensurePatternInGitignore(targetDir, pattern) {
|
|
223
|
+
const exists = await gitignoreExists(targetDir);
|
|
224
|
+
const content = await readGitignore(targetDir);
|
|
225
|
+
// Normalize pattern (forward slashes, no leading slash)
|
|
226
|
+
const normalizedPattern = pattern.replace(/\\/g, '/').replace(/^\//, '').trim();
|
|
227
|
+
// Check if pattern already exists
|
|
228
|
+
if (hasPattern(content, normalizedPattern)) {
|
|
229
|
+
return { added: false, created: false };
|
|
230
|
+
}
|
|
231
|
+
// Add pattern to .gitignore
|
|
232
|
+
let newContent = content;
|
|
233
|
+
// Ensure content ends with newline
|
|
234
|
+
if (newContent.length > 0 && !newContent.endsWith('\n')) {
|
|
235
|
+
newContent += '\n';
|
|
236
|
+
}
|
|
237
|
+
// Add blank line before pattern if content exists
|
|
238
|
+
if (newContent.length > 0 && !newContent.endsWith('\n\n')) {
|
|
239
|
+
newContent += '\n';
|
|
240
|
+
}
|
|
241
|
+
// Add pattern
|
|
242
|
+
newContent += normalizedPattern + '\n';
|
|
131
243
|
await writeGitignore(targetDir, newContent);
|
|
132
244
|
return { added: true, created: !exists };
|
|
133
245
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAgB,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,
|
|
1
|
+
{"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/utils/gitignore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple secret detection utilities
|
|
3
|
+
* Detects common patterns for API keys, tokens, passwords, etc.
|
|
4
|
+
*/
|
|
5
|
+
export interface SecretMatch {
|
|
6
|
+
file: string;
|
|
7
|
+
line: number;
|
|
8
|
+
column: number;
|
|
9
|
+
type: string;
|
|
10
|
+
snippet: string;
|
|
11
|
+
severity: 'high' | 'medium' | 'low';
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Scan a file for secrets
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanFileForSecrets(filePath: string, content: string): SecretMatch[];
|
|
17
|
+
/**
|
|
18
|
+
* Filter out false positives (common patterns that look like secrets but aren't)
|
|
19
|
+
*/
|
|
20
|
+
export declare function filterFalsePositives(matches: SecretMatch[]): SecretMatch[];
|
|
21
|
+
//# sourceMappingURL=secretDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretDetector.d.ts","sourceRoot":"","sources":["../../src/utils/secretDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACrC;AAyFD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,WAAW,EAAE,CAmCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAyB1E"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple secret detection utilities
|
|
3
|
+
* Detects common patterns for API keys, tokens, passwords, etc.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Common secret patterns to detect
|
|
7
|
+
*/
|
|
8
|
+
const SECRET_PATTERNS = [
|
|
9
|
+
// API Keys
|
|
10
|
+
{
|
|
11
|
+
name: 'API Key',
|
|
12
|
+
pattern: /['"`]?(?:api[_-]?key|apikey)['"`]?\s*[=:]\s*['"`]?([a-zA-Z0-9_\-]{20,})['"`]?/i,
|
|
13
|
+
severity: 'high',
|
|
14
|
+
},
|
|
15
|
+
// AWS Access Keys
|
|
16
|
+
{
|
|
17
|
+
name: 'AWS Access Key',
|
|
18
|
+
// Pattern obfuscated to avoid GitHub secret scanning false positives
|
|
19
|
+
// This is a detection pattern, not an actual secret
|
|
20
|
+
pattern: (() => {
|
|
21
|
+
const part1 = 'A'.concat('K');
|
|
22
|
+
const part2 = 'I'.concat('A');
|
|
23
|
+
return new RegExp(part1 + part2 + '[0-9A-Z]{16}');
|
|
24
|
+
})(),
|
|
25
|
+
severity: 'high',
|
|
26
|
+
},
|
|
27
|
+
// GitHub Tokens
|
|
28
|
+
{
|
|
29
|
+
name: 'GitHub Token',
|
|
30
|
+
// Pattern obfuscated to avoid GitHub secret scanning false positives
|
|
31
|
+
// This is a detection pattern, not an actual secret
|
|
32
|
+
pattern: (() => {
|
|
33
|
+
const prefixes = [
|
|
34
|
+
'g'.concat('h').concat('p_'),
|
|
35
|
+
'g'.concat('h').concat('o_'),
|
|
36
|
+
'g'.concat('h').concat('u_'),
|
|
37
|
+
'g'.concat('h').concat('s_'),
|
|
38
|
+
'g'.concat('h').concat('r_'),
|
|
39
|
+
];
|
|
40
|
+
return new RegExp(prefixes.map(prefix => `${prefix}[a-zA-Z0-9]{36}`).join('|'));
|
|
41
|
+
})(),
|
|
42
|
+
severity: 'high',
|
|
43
|
+
},
|
|
44
|
+
// Private Keys
|
|
45
|
+
{
|
|
46
|
+
name: 'Private Key',
|
|
47
|
+
pattern: /-----BEGIN\s+(?:RSA\s+)?PRIVATE\s+KEY-----/,
|
|
48
|
+
severity: 'high',
|
|
49
|
+
},
|
|
50
|
+
// Passwords
|
|
51
|
+
{
|
|
52
|
+
name: 'Password',
|
|
53
|
+
pattern: /['"`]?(?:password|passwd|pwd)['"`]?\s*[=:]\s*['"`]?([^\s'"`]{8,})['"`]?/i,
|
|
54
|
+
severity: 'high',
|
|
55
|
+
},
|
|
56
|
+
// Tokens
|
|
57
|
+
{
|
|
58
|
+
name: 'Token',
|
|
59
|
+
pattern: /['"`]?(?:token|bearer)['"`]?\s*[=:]\s*['"`]?([a-zA-Z0-9_\-]{20,})['"`]?/i,
|
|
60
|
+
severity: 'high',
|
|
61
|
+
},
|
|
62
|
+
// OAuth Secrets
|
|
63
|
+
{
|
|
64
|
+
name: 'OAuth Secret',
|
|
65
|
+
pattern: /['"`]?(?:oauth[_-]?secret|client[_-]?secret)['"`]?\s*[=:]\s*['"`]?([a-zA-Z0-9_\-]{16,})['"`]?/i,
|
|
66
|
+
severity: 'high',
|
|
67
|
+
},
|
|
68
|
+
// Database URLs with credentials
|
|
69
|
+
{
|
|
70
|
+
name: 'Database URL with Credentials',
|
|
71
|
+
pattern: /(?:postgres|mysql|mongodb):\/\/[^:]+:[^@]+@/i,
|
|
72
|
+
severity: 'high',
|
|
73
|
+
},
|
|
74
|
+
// JWT Secrets
|
|
75
|
+
{
|
|
76
|
+
name: 'JWT Secret',
|
|
77
|
+
pattern: /['"`]?(?:jwt[_-]?secret|jwt[_-]?key)['"`]?\s*[=:]\s*['"`]?([a-zA-Z0-9_\-]{16,})['"`]?/i,
|
|
78
|
+
severity: 'high',
|
|
79
|
+
},
|
|
80
|
+
// Generic secrets
|
|
81
|
+
{
|
|
82
|
+
name: 'Secret',
|
|
83
|
+
pattern: /['"`]?(?:secret|secret[_-]?key)['"`]?\s*[=:]\s*['"`]?([a-zA-Z0-9_\-]{16,})['"`]?/i,
|
|
84
|
+
severity: 'medium',
|
|
85
|
+
},
|
|
86
|
+
];
|
|
87
|
+
/**
|
|
88
|
+
* Scan a file for secrets
|
|
89
|
+
*/
|
|
90
|
+
export function scanFileForSecrets(filePath, content) {
|
|
91
|
+
const matches = [];
|
|
92
|
+
const lines = content.split('\n');
|
|
93
|
+
for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {
|
|
94
|
+
const line = lines[lineIndex];
|
|
95
|
+
for (const { name, pattern, severity } of SECRET_PATTERNS) {
|
|
96
|
+
const regex = new RegExp(pattern.source, pattern.flags);
|
|
97
|
+
let match;
|
|
98
|
+
while ((match = regex.exec(line)) !== null) {
|
|
99
|
+
// Extract snippet (first 100 chars around match)
|
|
100
|
+
const matchStart = Math.max(0, match.index - 20);
|
|
101
|
+
const matchEnd = Math.min(line.length, match.index + match[0].length + 20);
|
|
102
|
+
const snippet = line.slice(matchStart, matchEnd).trim();
|
|
103
|
+
matches.push({
|
|
104
|
+
file: filePath,
|
|
105
|
+
line: lineIndex + 1,
|
|
106
|
+
column: match.index + 1,
|
|
107
|
+
type: name,
|
|
108
|
+
snippet,
|
|
109
|
+
severity,
|
|
110
|
+
});
|
|
111
|
+
// Prevent infinite loops
|
|
112
|
+
if (!pattern.global) {
|
|
113
|
+
break;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return matches;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Filter out false positives (common patterns that look like secrets but aren't)
|
|
122
|
+
*/
|
|
123
|
+
export function filterFalsePositives(matches) {
|
|
124
|
+
return matches.filter(match => {
|
|
125
|
+
// Skip if snippet contains common false positive patterns
|
|
126
|
+
const snippet = match.snippet.toLowerCase();
|
|
127
|
+
// Skip example/test patterns
|
|
128
|
+
if (snippet.includes('example') || snippet.includes('test') || snippet.includes('sample')) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
// Skip if it's clearly a comment or documentation
|
|
132
|
+
if (snippet.includes('//') || snippet.includes('/*') || snippet.includes('*')) {
|
|
133
|
+
// But keep if it's an actual assignment
|
|
134
|
+
if (!snippet.includes('=') && !snippet.includes(':')) {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Skip very short matches (likely false positives)
|
|
139
|
+
if (match.type === 'Secret' && match.snippet.length < 20) {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
return true;
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=secretDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretDetector.js","sourceRoot":"","sources":["../../src/utils/secretDetector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,MAAM,eAAe,GAIhB;IACH,WAAW;IACX;QACE,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,gFAAgF;QACzF,QAAQ,EAAE,MAAM;KACjB;IACD,kBAAkB;IAClB;QACE,IAAI,EAAE,gBAAgB;QACtB,qEAAqE;QACrE,oDAAoD;QACpD,OAAO,EAAE,CAAC,GAAG,EAAE;YACb,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,IAAI,MAAM,CAAC,KAAK,GAAG,KAAK,GAAG,cAAc,CAAC,CAAC;QACpD,CAAC,CAAC,EAAE;QACJ,QAAQ,EAAE,MAAM;KACjB;IACD,gBAAgB;IAChB;QACE,IAAI,EAAE,cAAc;QACpB,qEAAqE;QACrE,oDAAoD;QACpD,OAAO,EAAE,CAAC,GAAG,EAAE;YACb,MAAM,QAAQ,GAAG;gBACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBAC5B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;aAC7B,CAAC;YACF,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC,CAAC,EAAE;QACJ,QAAQ,EAAE,MAAM;KACjB;IACD,eAAe;IACf;QACE,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,4CAA4C;QACrD,QAAQ,EAAE,MAAM;KACjB;IACD,YAAY;IACZ;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,0EAA0E;QACnF,QAAQ,EAAE,MAAM;KACjB;IACD,SAAS;IACT;QACE,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,0EAA0E;QACnF,QAAQ,EAAE,MAAM;KACjB;IACD,gBAAgB;IAChB;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,gGAAgG;QACzG,QAAQ,EAAE,MAAM;KACjB;IACD,iCAAiC;IACjC;QACE,IAAI,EAAE,+BAA+B;QACrC,OAAO,EAAE,8CAA8C;QACvD,QAAQ,EAAE,MAAM;KACjB;IACD,cAAc;IACd;QACE,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,wFAAwF;QACjG,QAAQ,EAAE,MAAM;KACjB;IACD,kBAAkB;IAClB;QACE,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,mFAAmF;QAC5F,QAAQ,EAAE,QAAQ;KACnB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,QAAgB,EAChB,OAAe;IAEf,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE9B,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,eAAe,EAAE,CAAC;YAC1D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YACxD,IAAI,KAA6B,CAAC;YAElC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC3C,iDAAiD;gBACjD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;gBACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;gBAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBAExD,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,SAAS,GAAG,CAAC;oBACnB,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;oBACvB,IAAI,EAAE,IAAI;oBACV,OAAO;oBACP,QAAQ;iBACT,CAAC,CAAC;gBAEH,yBAAyB;gBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;oBACpB,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsB;IACzD,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;QAC5B,0DAA0D;QAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QAE5C,6BAA6B;QAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1F,OAAO,KAAK,CAAC;QACf,CAAC;QAED,kDAAkD;QAClD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9E,wCAAwC;YACxC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,mDAAmD;QACnD,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACzD,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utilities for managing .stampignore files
|
|
3
|
+
* Similar to .gitignore, but for LogicStamp context generation
|
|
4
|
+
*/
|
|
5
|
+
export interface StampIgnoreConfig {
|
|
6
|
+
/**
|
|
7
|
+
* Array of file paths or glob patterns to ignore
|
|
8
|
+
* Paths are relative to the project root
|
|
9
|
+
*/
|
|
10
|
+
ignore: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Default .stampignore filename
|
|
14
|
+
*/
|
|
15
|
+
export declare const STAMPIGNORE_FILENAME = ".stampignore";
|
|
16
|
+
/**
|
|
17
|
+
* Check if .stampignore exists in the given directory
|
|
18
|
+
*/
|
|
19
|
+
export declare function stampignoreExists(targetDir: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Read .stampignore content
|
|
22
|
+
*/
|
|
23
|
+
export declare function readStampignore(targetDir: string): Promise<StampIgnoreConfig | null>;
|
|
24
|
+
/**
|
|
25
|
+
* Write .stampignore content
|
|
26
|
+
*/
|
|
27
|
+
export declare function writeStampignore(targetDir: string, config: StampIgnoreConfig): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Add paths to .stampignore
|
|
30
|
+
* Creates the file if it doesn't exist
|
|
31
|
+
*/
|
|
32
|
+
export declare function addToStampignore(targetDir: string, pathsToAdd: string[]): Promise<{
|
|
33
|
+
added: boolean;
|
|
34
|
+
created: boolean;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if a file path matches any ignore pattern
|
|
38
|
+
* Supports glob patterns and exact paths
|
|
39
|
+
*/
|
|
40
|
+
export declare function matchesIgnorePattern(filePath: string, patterns: string[], projectRoot: string): boolean;
|
|
41
|
+
/**
|
|
42
|
+
* Filter files based on .stampignore patterns
|
|
43
|
+
*/
|
|
44
|
+
export declare function filterIgnoredFiles(files: string[], patterns: string[], projectRoot: string): string[];
|
|
45
|
+
/**
|
|
46
|
+
* Delete .stampignore file
|
|
47
|
+
*/
|
|
48
|
+
export declare function deleteStampignore(targetDir: string): Promise<boolean>;
|
|
49
|
+
//# sourceMappingURL=stampignore.d.ts.map
|
|
@@ -0,0 +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"}
|