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/LICENSE +201 -0
- package/README.md +186 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +222 -0
- package/dist/cli.js.map +1 -0
- package/dist/detect.d.ts +19 -0
- package/dist/detect.d.ts.map +1 -0
- package/dist/detect.js +129 -0
- package/dist/detect.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +19 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.js +411 -0
- package/dist/init.js.map +1 -0
- package/dist/patterns.d.ts +16 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +59 -0
- package/dist/patterns.js.map +1 -0
- package/dist/scan.d.ts +22 -0
- package/dist/scan.d.ts.map +1 -0
- package/dist/scan.js +142 -0
- package/dist/scan.js.map +1 -0
- package/dist/status.d.ts +16 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +105 -0
- package/dist/status.js.map +1 -0
- package/dist/verify.d.ts +22 -0
- package/dist/verify.d.ts.map +1 -0
- package/dist/verify.js +122 -0
- package/dist/verify.js.map +1 -0
- package/package.json +47 -0
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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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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
|
package/dist/init.js.map
ADDED
|
@@ -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"}
|