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.
Files changed (40) hide show
  1. package/LLM_CONTEXT.md +2 -2
  2. package/README.md +28 -13
  3. package/dist/cli/commands/context.d.ts.map +1 -1
  4. package/dist/cli/commands/context.js +11 -1
  5. package/dist/cli/commands/context.js.map +1 -1
  6. package/dist/cli/commands/init.d.ts +4 -0
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +84 -9
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/security.d.ts +38 -0
  11. package/dist/cli/commands/security.d.ts.map +1 -0
  12. package/dist/cli/commands/security.js +343 -0
  13. package/dist/cli/commands/security.js.map +1 -0
  14. package/dist/cli/handlers/securityHandler.d.ts +5 -0
  15. package/dist/cli/handlers/securityHandler.d.ts.map +1 -0
  16. package/dist/cli/handlers/securityHandler.js +45 -0
  17. package/dist/cli/handlers/securityHandler.js.map +1 -0
  18. package/dist/cli/parser/argumentParser.d.ts.map +1 -1
  19. package/dist/cli/parser/argumentParser.js +23 -0
  20. package/dist/cli/parser/argumentParser.js.map +1 -1
  21. package/dist/cli/parser/helpText.d.ts +2 -0
  22. package/dist/cli/parser/helpText.d.ts.map +1 -1
  23. package/dist/cli/parser/helpText.js +453 -348
  24. package/dist/cli/parser/helpText.js.map +1 -1
  25. package/dist/cli/stamp.js +55 -1
  26. package/dist/cli/stamp.js.map +1 -1
  27. package/dist/utils/gitignore.d.ts +30 -2
  28. package/dist/utils/gitignore.d.ts.map +1 -1
  29. package/dist/utils/gitignore.js +132 -20
  30. package/dist/utils/gitignore.js.map +1 -1
  31. package/dist/utils/secretDetector.d.ts +21 -0
  32. package/dist/utils/secretDetector.d.ts.map +1 -0
  33. package/dist/utils/secretDetector.js +145 -0
  34. package/dist/utils/secretDetector.js.map +1 -0
  35. package/dist/utils/stampignore.d.ts +49 -0
  36. package/dist/utils/stampignore.d.ts.map +1 -0
  37. package/dist/utils/stampignore.js +189 -0
  38. package/dist/utils/stampignore.js.map +1 -0
  39. package/package.json +1 -1
  40. 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDN,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../../src/cli/parser/helpText.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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 { getMainHelp } from './parser/helpText.js';
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');
@@ -1 +1 @@
1
- {"version":3,"file":"stamp.js","sourceRoot":"","sources":["../../src/cli/stamp.ts"],"names":[],"mappings":"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"}
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
- * Add LogicStamp patterns to .gitignore content
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,UAOzC,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,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQ9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA0B7D;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BtF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAY9G;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"}
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"}
@@ -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('\n').map(line => line.trim());
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
- * Add LogicStamp patterns to .gitignore content
70
+ * Get which LogicStamp patterns are missing from .gitignore content
63
71
  */
64
- export function addLogicStampPatterns(content) {
65
- const lines = content.split('\n');
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
- if (missingPatterns.length === 0 && hasPattern(content, '# LogicStamp context files')) {
73
- return content; // All patterns already exist
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
- // Add a blank line before the section if content exists and doesn't end with blank line
76
- let newContent = content;
77
- if (newContent.length > 0 && !newContent.endsWith('\n\n') && !newContent.endsWith('\n')) {
78
- newContent += '\n';
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
- if (newContent.length > 0 && !newContent.endsWith('\n\n')) {
81
- newContent += '\n';
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 (hasLogicStampPatterns(content)) {
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
- const newContent = addLogicStampPatterns(content);
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":"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"}
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":"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"}
@@ -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"}