secretless-ai 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/detect.js ADDED
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ /**
3
+ * Auto-detect which AI tools are present in a project.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.detectAITools = detectAITools;
40
+ exports.toolDisplayName = toolDisplayName;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const DETECTORS = [
44
+ {
45
+ tool: 'claude-code',
46
+ markers: ['.claude', 'CLAUDE.md', '.claude/settings.json'],
47
+ configDir: '.claude',
48
+ settingsFile: '.claude/settings.json',
49
+ hooksSupported: true,
50
+ },
51
+ {
52
+ tool: 'cursor',
53
+ markers: ['.cursor', '.cursorrules', '.cursor/rules'],
54
+ configDir: '.cursor',
55
+ settingsFile: '.cursor/settings.json',
56
+ hooksSupported: false,
57
+ },
58
+ {
59
+ tool: 'copilot',
60
+ markers: ['.github/copilot-instructions.md', '.copilot'],
61
+ configDir: '.github',
62
+ settingsFile: '.github/copilot-instructions.md',
63
+ hooksSupported: false,
64
+ },
65
+ {
66
+ tool: 'windsurf',
67
+ markers: ['.windsurfrules', '.windsurf'],
68
+ configDir: '.windsurf',
69
+ settingsFile: '.windsurfrules',
70
+ hooksSupported: false,
71
+ },
72
+ {
73
+ tool: 'cline',
74
+ markers: ['.clinerules', '.cline'],
75
+ configDir: '.cline',
76
+ settingsFile: '.clinerules',
77
+ hooksSupported: false,
78
+ },
79
+ {
80
+ tool: 'aider',
81
+ markers: ['.aider.conf.yml', '.aiderignore'],
82
+ configDir: '.',
83
+ settingsFile: '.aider.conf.yml',
84
+ hooksSupported: false,
85
+ },
86
+ ];
87
+ /**
88
+ * Detect AI tools present in the project directory.
89
+ * Returns all detected tools sorted by priority (hooks-capable first).
90
+ */
91
+ function detectAITools(projectDir) {
92
+ const results = [];
93
+ for (const detector of DETECTORS) {
94
+ const found = detector.markers.some(marker => {
95
+ const fullPath = path.join(projectDir, marker);
96
+ return fs.existsSync(fullPath);
97
+ });
98
+ if (found) {
99
+ results.push({
100
+ tool: detector.tool,
101
+ configDir: detector.configDir,
102
+ settingsFile: detector.settingsFile,
103
+ hooksSupported: detector.hooksSupported,
104
+ });
105
+ }
106
+ }
107
+ // Sort: hooks-capable tools first
108
+ results.sort((a, b) => {
109
+ if (a.hooksSupported && !b.hooksSupported)
110
+ return -1;
111
+ if (!a.hooksSupported && b.hooksSupported)
112
+ return 1;
113
+ return 0;
114
+ });
115
+ return results;
116
+ }
117
+ /** Get display name for a tool */
118
+ function toolDisplayName(tool) {
119
+ const names = {
120
+ 'claude-code': 'Claude Code',
121
+ 'cursor': 'Cursor',
122
+ 'copilot': 'GitHub Copilot',
123
+ 'windsurf': 'Windsurf',
124
+ 'cline': 'Cline',
125
+ 'aider': 'Aider',
126
+ };
127
+ return names[tool];
128
+ }
129
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { init } from './init';
2
+ export { scan, type ScanFinding, type ScanOptions } from './scan';
3
+ export { status, type StatusResult } from './status';
4
+ export { verify, type VerifyResult } from './verify';
5
+ export { detectAITools, toolDisplayName, type AITool } from './detect';
6
+ export { CREDENTIAL_PATTERNS, SECRET_FILE_PATTERNS, CONFIG_FILES, type CredentialPattern } from './patterns';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,EAAE,IAAI,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG_FILES = exports.SECRET_FILE_PATTERNS = exports.CREDENTIAL_PATTERNS = exports.toolDisplayName = exports.detectAITools = exports.verify = exports.status = exports.scan = exports.init = void 0;
4
+ var init_1 = require("./init");
5
+ Object.defineProperty(exports, "init", { enumerable: true, get: function () { return init_1.init; } });
6
+ var scan_1 = require("./scan");
7
+ Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scan_1.scan; } });
8
+ var status_1 = require("./status");
9
+ Object.defineProperty(exports, "status", { enumerable: true, get: function () { return status_1.status; } });
10
+ var verify_1 = require("./verify");
11
+ Object.defineProperty(exports, "verify", { enumerable: true, get: function () { return verify_1.verify; } });
12
+ var detect_1 = require("./detect");
13
+ Object.defineProperty(exports, "detectAITools", { enumerable: true, get: function () { return detect_1.detectAITools; } });
14
+ Object.defineProperty(exports, "toolDisplayName", { enumerable: true, get: function () { return detect_1.toolDisplayName; } });
15
+ var patterns_1 = require("./patterns");
16
+ Object.defineProperty(exports, "CREDENTIAL_PATTERNS", { enumerable: true, get: function () { return patterns_1.CREDENTIAL_PATTERNS; } });
17
+ Object.defineProperty(exports, "SECRET_FILE_PATTERNS", { enumerable: true, get: function () { return patterns_1.SECRET_FILE_PATTERNS; } });
18
+ Object.defineProperty(exports, "CONFIG_FILES", { enumerable: true, get: function () { return patterns_1.CONFIG_FILES; } });
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+BAA8B;AAArB,4FAAA,IAAI,OAAA;AACb,+BAAkE;AAAzD,4FAAA,IAAI,OAAA;AACb,mCAAqD;AAA5C,gGAAA,MAAM,OAAA;AACf,mCAAqD;AAA5C,gGAAA,MAAM,OAAA;AACf,mCAAuE;AAA9D,uGAAA,aAAa,OAAA;AAAE,yGAAA,eAAe,OAAA;AACvC,uCAA6G;AAApG,+GAAA,mBAAmB,OAAA;AAAE,gHAAA,oBAAoB,OAAA;AAAE,wGAAA,YAAY,OAAA"}
package/dist/init.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Initialize Secretless for a project.
3
+ * Auto-detects AI tools and installs appropriate protections.
4
+ */
5
+ import { type AITool } from './detect';
6
+ interface InitResult {
7
+ toolsDetected: AITool[];
8
+ toolsConfigured: AITool[];
9
+ filesCreated: string[];
10
+ filesModified: string[];
11
+ secretsFound: number;
12
+ }
13
+ /**
14
+ * Initialize Secretless protections for the project.
15
+ * This is the main entry point called by `npx secretless-ai init`.
16
+ */
17
+ export declare function init(projectDir: string): InitResult;
18
+ export {};
19
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAkC,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAkBvE,UAAU,UAAU;IAClB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAoDnD"}
package/dist/init.js ADDED
@@ -0,0 +1,411 @@
1
+ "use strict";
2
+ /**
3
+ * Initialize Secretless for a project.
4
+ * Auto-detects AI tools and installs appropriate protections.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.init = init;
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const detect_1 = require("./detect");
44
+ const patterns_1 = require("./patterns");
45
+ /** Known API services with their auth header formats */
46
+ const SERVICE_HINTS = {
47
+ ANTHROPIC_API_KEY: { service: 'Anthropic Messages API', authHeader: 'x-api-key: $ANTHROPIC_API_KEY' },
48
+ OPENAI_API_KEY: { service: 'OpenAI API', authHeader: 'Authorization: Bearer $OPENAI_API_KEY' },
49
+ GAMMA_API_KEY: { service: 'Gamma API', authHeader: 'X-API-KEY: $GAMMA_API_KEY' },
50
+ AWS_ACCESS_KEY_ID: { service: 'AWS', authHeader: '(use AWS SDK or aws configure)' },
51
+ GITHUB_TOKEN: { service: 'GitHub API', authHeader: 'Authorization: Bearer $GITHUB_TOKEN' },
52
+ SLACK_TOKEN: { service: 'Slack API', authHeader: 'Authorization: Bearer $SLACK_TOKEN' },
53
+ GOOGLE_API_KEY: { service: 'Google API', authHeader: 'key=$GOOGLE_API_KEY (query param)' },
54
+ STRIPE_SECRET_KEY: { service: 'Stripe API', authHeader: 'Authorization: Bearer $STRIPE_SECRET_KEY' },
55
+ SENDGRID_API_KEY: { service: 'SendGrid API', authHeader: 'Authorization: Bearer $SENDGRID_API_KEY' },
56
+ SUPABASE_SERVICE_ROLE_KEY: { service: 'Supabase', authHeader: 'apikey: $SUPABASE_SERVICE_ROLE_KEY' },
57
+ AZURE_API_KEY: { service: 'Azure', authHeader: 'api-key: $AZURE_API_KEY' },
58
+ };
59
+ /**
60
+ * Initialize Secretless protections for the project.
61
+ * This is the main entry point called by `npx secretless-ai init`.
62
+ */
63
+ function init(projectDir) {
64
+ const result = {
65
+ toolsDetected: [],
66
+ toolsConfigured: [],
67
+ filesCreated: [],
68
+ filesModified: [],
69
+ secretsFound: 0,
70
+ };
71
+ // Detect AI tools
72
+ const detected = (0, detect_1.detectAITools)(projectDir);
73
+ result.toolsDetected = detected.map(d => d.tool);
74
+ // If no tools detected, default to Claude Code (most common for npx users)
75
+ if (detected.length === 0) {
76
+ detected.push({
77
+ tool: 'claude-code',
78
+ configDir: '.claude',
79
+ settingsFile: '.claude/settings.json',
80
+ hooksSupported: true,
81
+ });
82
+ }
83
+ // Quick scan for existing secrets
84
+ result.secretsFound = quickScan(projectDir);
85
+ // Configure each detected tool
86
+ for (const tool of detected) {
87
+ switch (tool.tool) {
88
+ case 'claude-code':
89
+ configureClaudeCode(projectDir, result);
90
+ break;
91
+ case 'cursor':
92
+ configureCursor(projectDir, result);
93
+ break;
94
+ case 'copilot':
95
+ configureCopilot(projectDir, result);
96
+ break;
97
+ case 'windsurf':
98
+ configureWindsurf(projectDir, result);
99
+ break;
100
+ case 'cline':
101
+ configureCline(projectDir, result);
102
+ break;
103
+ case 'aider':
104
+ configureAider(projectDir, result);
105
+ break;
106
+ }
107
+ result.toolsConfigured.push(tool.tool);
108
+ }
109
+ return result;
110
+ }
111
+ // ============================================================================
112
+ // Claude Code Configuration
113
+ // ============================================================================
114
+ function configureClaudeCode(projectDir, result) {
115
+ const claudeDir = path.join(projectDir, '.claude');
116
+ const hooksDir = path.join(claudeDir, 'hooks');
117
+ // Ensure directories exist
118
+ fs.mkdirSync(hooksDir, { recursive: true });
119
+ // 1. Install PreToolUse hook
120
+ const hookPath = path.join(hooksDir, 'secretless-guard.sh');
121
+ if (!fs.existsSync(hookPath)) {
122
+ fs.writeFileSync(hookPath, generateClaudeHookScript(), { mode: 0o755 });
123
+ result.filesCreated.push('.claude/hooks/secretless-guard.sh');
124
+ }
125
+ // 2. Update settings.json with hook config and deny rules
126
+ const settingsPath = path.join(claudeDir, 'settings.json');
127
+ const settings = readJsonFile(settingsPath) || {};
128
+ // Add hooks config
129
+ if (!settings.hooks)
130
+ settings.hooks = {};
131
+ if (!settings.hooks.PreToolUse)
132
+ settings.hooks.PreToolUse = [];
133
+ const hookExists = settings.hooks.PreToolUse.some((h) => h.hooks?.some((hh) => hh.command?.includes('secretless-guard')));
134
+ if (!hookExists) {
135
+ settings.hooks.PreToolUse.push({
136
+ matcher: 'Read|Grep|Glob|Bash|Write|Edit',
137
+ hooks: [{
138
+ type: 'command',
139
+ command: '"$CLAUDE_PROJECT_DIR"/.claude/hooks/secretless-guard.sh',
140
+ }],
141
+ });
142
+ result.filesModified.push('.claude/settings.json');
143
+ }
144
+ // Add deny rules for secret files
145
+ if (!settings.permissions)
146
+ settings.permissions = {};
147
+ if (!settings.permissions.deny)
148
+ settings.permissions.deny = [];
149
+ const denyRules = [
150
+ 'Read(.env*)',
151
+ 'Read(*.key)',
152
+ 'Read(*.pem)',
153
+ 'Read(*.p12)',
154
+ 'Read(*.pfx)',
155
+ 'Read(*.tfstate)',
156
+ 'Read(*.tfvars)',
157
+ 'Read(.aws/credentials)',
158
+ 'Read(.ssh/*)',
159
+ 'Bash(cat .env*)',
160
+ 'Bash(cat *.key)',
161
+ 'Bash(echo $*SECRET*)',
162
+ 'Bash(echo $*PASSWORD*)',
163
+ 'Bash(echo $*API_KEY*)',
164
+ ];
165
+ for (const rule of denyRules) {
166
+ if (!settings.permissions.deny.includes(rule)) {
167
+ settings.permissions.deny.push(rule);
168
+ }
169
+ }
170
+ writeJsonFile(settingsPath, settings);
171
+ // 3. Add Secretless instructions to CLAUDE.md
172
+ const claudeMdPath = path.join(projectDir, 'CLAUDE.md');
173
+ addSecretlessInstructions(claudeMdPath, 'claude-code', result);
174
+ }
175
+ // ============================================================================
176
+ // Cursor Configuration
177
+ // ============================================================================
178
+ function configureCursor(projectDir, result) {
179
+ const rulesPath = path.join(projectDir, '.cursorrules');
180
+ addSecretlessInstructions(rulesPath, 'cursor', result);
181
+ }
182
+ // ============================================================================
183
+ // GitHub Copilot Configuration
184
+ // ============================================================================
185
+ function configureCopilot(projectDir, result) {
186
+ const githubDir = path.join(projectDir, '.github');
187
+ fs.mkdirSync(githubDir, { recursive: true });
188
+ const instructionsPath = path.join(githubDir, 'copilot-instructions.md');
189
+ addSecretlessInstructions(instructionsPath, 'copilot', result);
190
+ }
191
+ // ============================================================================
192
+ // Windsurf Configuration
193
+ // ============================================================================
194
+ function configureWindsurf(projectDir, result) {
195
+ const rulesPath = path.join(projectDir, '.windsurfrules');
196
+ addSecretlessInstructions(rulesPath, 'windsurf', result);
197
+ }
198
+ // ============================================================================
199
+ // Cline Configuration
200
+ // ============================================================================
201
+ function configureCline(projectDir, result) {
202
+ const rulesPath = path.join(projectDir, '.clinerules');
203
+ addSecretlessInstructions(rulesPath, 'cline', result);
204
+ }
205
+ // ============================================================================
206
+ // Aider Configuration
207
+ // ============================================================================
208
+ function configureAider(projectDir, result) {
209
+ const ignorePath = path.join(projectDir, '.aiderignore');
210
+ const existing = fs.existsSync(ignorePath) ? fs.readFileSync(ignorePath, 'utf-8') : '';
211
+ if (!existing.includes('# Secretless')) {
212
+ const secretPatterns = [
213
+ '',
214
+ '# Secretless: keep secrets out of AI context',
215
+ '.env',
216
+ '.env.*',
217
+ '*.key',
218
+ '*.pem',
219
+ '*.p12',
220
+ '*.pfx',
221
+ '*.tfstate',
222
+ '*.tfvars',
223
+ '.aws/',
224
+ '.ssh/',
225
+ 'secrets/',
226
+ 'credentials/',
227
+ ].join('\n');
228
+ fs.writeFileSync(ignorePath, existing + secretPatterns + '\n');
229
+ if (existing) {
230
+ result.filesModified.push('.aiderignore');
231
+ }
232
+ else {
233
+ result.filesCreated.push('.aiderignore');
234
+ }
235
+ }
236
+ }
237
+ // ============================================================================
238
+ // Shared Utilities
239
+ // ============================================================================
240
+ const SECRETLESS_MARKER = '<!-- secretless:managed -->';
241
+ function buildSecretlessInstructions() {
242
+ // Detect which env vars are actually set
243
+ const availableKeys = [];
244
+ for (const envVar of Object.keys(SERVICE_HINTS)) {
245
+ if (process.env[envVar] && process.env[envVar].length > 0) {
246
+ availableKeys.push(envVar);
247
+ }
248
+ }
249
+ let keyTable = '';
250
+ if (availableKeys.length > 0) {
251
+ keyTable = `\n**Available API keys** (set as env vars — use \`$VAR_NAME\` in commands, never ask for values):\n\n`;
252
+ keyTable += `| Env Var | Service | Auth Header |\n|---------|---------|-------------|\n`;
253
+ for (const envVar of availableKeys) {
254
+ const hint = SERVICE_HINTS[envVar];
255
+ keyTable += `| \`$${envVar}\` | ${hint.service} | \`${hint.authHeader}\` |\n`;
256
+ }
257
+ }
258
+ return `
259
+ ${SECRETLESS_MARKER}
260
+ ## Secretless Mode
261
+
262
+ This project uses Secretless to protect credentials from AI context.
263
+ ${keyTable}
264
+ **Blocked file patterns** (never read, write, or reference):
265
+ - \`.env\`, \`.env.*\` — environment variable files
266
+ - \`*.key\`, \`*.pem\`, \`*.p12\`, \`*.pfx\` — private key files
267
+ - \`.aws/credentials\`, \`.ssh/*\` — cloud/SSH credentials
268
+ - \`*.tfstate\`, \`*.tfvars\` — Terraform state with secrets
269
+ - \`secrets/\`, \`credentials/\` — secret directories
270
+
271
+ **If you need a credential:**
272
+ 1. Reference it via \`$VAR_NAME\` in shell commands or \`process.env.VAR_NAME\` in code
273
+ 2. Never hardcode credentials in source files
274
+ 3. Never print or echo key values — only reference them as variables
275
+
276
+ **If you find a hardcoded credential:**
277
+ 1. Replace it with an environment variable reference
278
+ 2. Add the variable name to \`.env.example\`
279
+ 3. Warn the user to rotate the exposed credential
280
+
281
+ Verify setup: \`npx secretless-ai verify\`
282
+ `;
283
+ }
284
+ function addSecretlessInstructions(filePath, tool, result) {
285
+ const existing = fs.existsSync(filePath) ? fs.readFileSync(filePath, 'utf-8') : '';
286
+ if (existing.includes(SECRETLESS_MARKER)) {
287
+ return; // Already configured
288
+ }
289
+ fs.writeFileSync(filePath, existing + buildSecretlessInstructions());
290
+ if (existing) {
291
+ result.filesModified.push(path.relative(process.cwd(), filePath));
292
+ }
293
+ else {
294
+ result.filesCreated.push(path.relative(process.cwd(), filePath));
295
+ }
296
+ }
297
+ function generateClaudeHookScript() {
298
+ // Build pattern list for the shell script
299
+ const filePatterns = [
300
+ '.env', '.env.local', '.env.development', '.env.production', '.env.staging',
301
+ '.key', '.pem', '.p12', '.pfx', '.crt',
302
+ 'credentials', '.aws/credentials', '.ssh/',
303
+ '.docker/config.json', '.git-credentials',
304
+ '.npmrc', '.pypirc',
305
+ '.tfstate', '.tfvars',
306
+ 'secrets/', '.opena2a/secretless-ai/',
307
+ ];
308
+ return `#!/bin/bash
309
+ # Secretless Guard — PreToolUse hook for Claude Code
310
+ # Blocks file access to secrets before they enter AI context.
311
+ # Managed by secretless-ai. Do not edit manually.
312
+
313
+ set -euo pipefail
314
+
315
+ INPUT=$(cat)
316
+ TOOL_NAME=$(echo "$INPUT" | grep -o '"tool_name":"[^"]*"' | head -1 | cut -d'"' -f4)
317
+
318
+ # Extract file path from tool input (handles Read, Grep, Glob, Edit, Write)
319
+ FILE_PATH=$(echo "$INPUT" | grep -o '"file_path":"[^"]*"' | head -1 | cut -d'"' -f4)
320
+ if [ -z "$FILE_PATH" ]; then
321
+ FILE_PATH=$(echo "$INPUT" | grep -o '"path":"[^"]*"' | head -1 | cut -d'"' -f4)
322
+ fi
323
+
324
+ # For Bash tool, check the command for secret access patterns
325
+ if [ "$TOOL_NAME" = "Bash" ]; then
326
+ COMMAND=$(echo "$INPUT" | grep -o '"command":"[^"]*"' | head -1 | cut -d'"' -f4)
327
+ # Block commands that dump secret files
328
+ if echo "$COMMAND" | grep -qiE '(cat|head|tail|less|more|type)\\s+.*\\.(env|key|pem|p12|pfx)'; then
329
+ echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"Secretless: blocked command that reads secret files"}}'
330
+ exit 0
331
+ fi
332
+ # Block commands that echo secret env vars
333
+ if echo "$COMMAND" | grep -qiE 'echo\\s+.*\\$(SECRET|PASSWORD|API_KEY|TOKEN|PRIVATE_KEY)'; then
334
+ echo '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"Secretless: blocked command that exposes secret environment variables"}}'
335
+ exit 0
336
+ fi
337
+ exit 0
338
+ fi
339
+
340
+ # Skip if no file path found
341
+ if [ -z "$FILE_PATH" ]; then
342
+ exit 0
343
+ fi
344
+
345
+ # Normalize path for matching
346
+ BASENAME=$(basename "$FILE_PATH")
347
+ LOWER_PATH=$(echo "$FILE_PATH" | tr '[:upper:]' '[:lower:]')
348
+
349
+ # Block patterns
350
+ ${filePatterns.map(p => {
351
+ if (p.startsWith('.') && !p.includes('/')) {
352
+ // Extension or dotfile match
353
+ if (p.includes('*')) {
354
+ return `# Match ${p}\nif echo "$BASENAME" | grep -qE '\\${p.replace('*', '.*')}$'; then BLOCKED=1; REASON="${p}"; fi`;
355
+ }
356
+ return `# Match ${p}\nif [ "$BASENAME" = "${p}" ] || echo "$BASENAME" | grep -qE '^\\${p}'; then BLOCKED=1; REASON="${p}"; fi`;
357
+ }
358
+ // Path fragment match
359
+ return `# Match ${p}\nif echo "$LOWER_PATH" | grep -qi '${p}'; then BLOCKED=1; REASON="${p}"; fi`;
360
+ }).join('\n')}
361
+
362
+ if [ "\${BLOCKED:-0}" = "1" ]; then
363
+ echo "{\\"hookSpecificOutput\\":{\\"hookEventName\\":\\"PreToolUse\\",\\"permissionDecision\\":\\"deny\\",\\"permissionDecisionReason\\":\\"Secretless: blocked access to secret file matching pattern '$REASON'\\"}}"
364
+ exit 0
365
+ fi
366
+
367
+ exit 0
368
+ `;
369
+ }
370
+ function quickScan(projectDir) {
371
+ let count = 0;
372
+ for (const configFile of patterns_1.CONFIG_FILES) {
373
+ const fullPath = path.join(projectDir, configFile);
374
+ if (!fs.existsSync(fullPath))
375
+ continue;
376
+ try {
377
+ const stat = fs.statSync(fullPath);
378
+ if (stat.size > 10 * 1024 * 1024)
379
+ continue; // Skip files > 10MB
380
+ const content = fs.readFileSync(fullPath, 'utf-8');
381
+ for (const line of content.split('\n')) {
382
+ if (line.length > 4096)
383
+ continue; // ReDoS protection
384
+ for (const pattern of patterns_1.CREDENTIAL_PATTERNS) {
385
+ if (pattern.regex.test(line)) {
386
+ count++;
387
+ break; // One finding per line
388
+ }
389
+ }
390
+ }
391
+ }
392
+ catch {
393
+ // Skip unreadable files
394
+ }
395
+ }
396
+ return count;
397
+ }
398
+ function readJsonFile(filePath) {
399
+ if (!fs.existsSync(filePath))
400
+ return null;
401
+ try {
402
+ return JSON.parse(fs.readFileSync(filePath, 'utf-8'));
403
+ }
404
+ catch {
405
+ return null;
406
+ }
407
+ }
408
+ function writeJsonFile(filePath, data) {
409
+ fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
410
+ }
411
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Credential patterns used across all Secretless integrations.
3
+ * Shared between scanner, hooks, and MCP server.
4
+ */
5
+ export interface CredentialPattern {
6
+ id: string;
7
+ name: string;
8
+ regex: RegExp;
9
+ envPrefix: string;
10
+ }
11
+ export declare const CREDENTIAL_PATTERNS: CredentialPattern[];
12
+ /** File patterns that should never be read by AI tools */
13
+ export declare const SECRET_FILE_PATTERNS: string[];
14
+ /** Config files that may contain hardcoded secrets */
15
+ export declare const CONFIG_FILES: string[];
16
+ //# sourceMappingURL=patterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAalD,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,EAAE,MAAM,EAsBxC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,YAAY,UAWxB,CAAC"}