opena2a-cli 0.3.2 → 0.3.3
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/README.md +22 -21
- package/dist/adapters/python.d.ts.map +1 -1
- package/dist/adapters/python.js +7 -3
- package/dist/adapters/python.js.map +1 -1
- package/dist/adapters/registry.d.ts.map +1 -1
- package/dist/adapters/registry.js +1 -7
- package/dist/adapters/registry.js.map +1 -1
- package/dist/commands/guard.d.ts +8 -0
- package/dist/commands/guard.d.ts.map +1 -1
- package/dist/commands/guard.js +30 -0
- package/dist/commands/guard.js.map +1 -1
- package/dist/commands/init.d.ts +8 -2
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +612 -162
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/onepassword-migration.d.ts.map +1 -1
- package/dist/commands/onepassword-migration.js +6 -0
- package/dist/commands/onepassword-migration.js.map +1 -1
- package/dist/commands/protect.d.ts +4 -0
- package/dist/commands/protect.d.ts.map +1 -1
- package/dist/commands/protect.js +250 -12
- package/dist/commands/protect.js.map +1 -1
- package/dist/commands/review.d.ts +2 -2
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +7 -7
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/shield.d.ts +1 -1
- package/dist/commands/shield.js +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/natural/llm-fallback.d.ts.map +1 -1
- package/dist/natural/llm-fallback.js +24 -4
- package/dist/natural/llm-fallback.js.map +1 -1
- package/dist/report/review-html.js +2 -2
- package/dist/router.js +1 -1
- package/dist/router.js.map +1 -1
- package/dist/semantic/command-index.json +1 -1
- package/dist/shield/status.d.ts.map +1 -1
- package/dist/shield/status.js +16 -16
- package/dist/shield/status.js.map +1 -1
- package/dist/shield/types.d.ts +3 -3
- package/dist/shield/types.d.ts.map +1 -1
- package/dist/util/ai-config.d.ts +40 -0
- package/dist/util/ai-config.d.ts.map +1 -0
- package/dist/util/ai-config.js +389 -0
- package/dist/util/ai-config.js.map +1 -0
- package/dist/util/detect.d.ts +2 -1
- package/dist/util/detect.d.ts.map +1 -1
- package/dist/util/detect.js +31 -1
- package/dist/util/detect.js.map +1 -1
- package/dist/util/format.d.ts +1 -0
- package/dist/util/format.d.ts.map +1 -1
- package/dist/util/format.js +20 -0
- package/dist/util/format.js.map +1 -1
- package/dist/util/hygiene.d.ts +16 -0
- package/dist/util/hygiene.d.ts.map +1 -0
- package/dist/util/hygiene.js +119 -0
- package/dist/util/hygiene.js.map +1 -0
- package/dist/util/scoring.d.ts +34 -0
- package/dist/util/scoring.d.ts.map +1 -0
- package/dist/util/scoring.js +144 -0
- package/dist/util/scoring.js.map +1 -0
- package/dist/util/secretless-config.d.ts +39 -0
- package/dist/util/secretless-config.d.ts.map +1 -0
- package/dist/util/secretless-config.js +265 -0
- package/dist/util/secretless-config.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Secretless config injection for AI tool config files.
|
|
4
|
+
*
|
|
5
|
+
* After `opena2a protect` migrates credentials to env vars, this module
|
|
6
|
+
* injects a managed section into CLAUDE.md, .cursorrules, etc. so AI
|
|
7
|
+
* coding tools know which env vars to use and which files to avoid.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.buildConfigItem = buildConfigItem;
|
|
44
|
+
exports.configureSecretlessForAiTools = configureSecretlessForAiTools;
|
|
45
|
+
exports.generateSecretlessSection = generateSecretlessSection;
|
|
46
|
+
exports.upsertSecretlessSection = upsertSecretlessSection;
|
|
47
|
+
exports.parseExistingCredentials = parseExistingCredentials;
|
|
48
|
+
const fs = __importStar(require("node:fs"));
|
|
49
|
+
const path = __importStar(require("node:path"));
|
|
50
|
+
// --- Service metadata lookup ---
|
|
51
|
+
const SERVICE_METADATA = {
|
|
52
|
+
ANTHROPIC_API_KEY: { service: 'Anthropic Messages API', authHeader: 'x-api-key: $ANTHROPIC_API_KEY' },
|
|
53
|
+
OPENAI_API_KEY: { service: 'OpenAI API', authHeader: 'Authorization: Bearer $OPENAI_API_KEY' },
|
|
54
|
+
GOOGLE_API_KEY: { service: 'Google API', authHeader: 'X-Goog-Api-Key: $GOOGLE_API_KEY' },
|
|
55
|
+
AWS_ACCESS_KEY_ID: { service: 'AWS', authHeader: '(AWS Signature V4)' },
|
|
56
|
+
GITHUB_TOKEN: { service: 'GitHub API', authHeader: 'Authorization: Bearer $GITHUB_TOKEN' },
|
|
57
|
+
API_KEY: { service: 'API Service', authHeader: '(check service docs)' },
|
|
58
|
+
};
|
|
59
|
+
const START_MARKER = '<!-- secretless:managed -->';
|
|
60
|
+
const END_MARKER = '<!-- /secretless:managed -->';
|
|
61
|
+
/** AI tool config files: [relative path, createIfMissing] */
|
|
62
|
+
const AI_TOOL_CONFIGS = [
|
|
63
|
+
['CLAUDE.md', true],
|
|
64
|
+
['.cursorrules', false],
|
|
65
|
+
['.windsurfrules', false],
|
|
66
|
+
['.clinerules', false],
|
|
67
|
+
['.github/copilot-instructions.md', false],
|
|
68
|
+
];
|
|
69
|
+
// --- Public API ---
|
|
70
|
+
/**
|
|
71
|
+
* Map an env var name to service metadata.
|
|
72
|
+
* Strips numeric suffixes (API_KEY_2 -> API_KEY) for lookup.
|
|
73
|
+
*/
|
|
74
|
+
function buildConfigItem(envVar) {
|
|
75
|
+
// Strip trailing _N suffix for lookup
|
|
76
|
+
const baseVar = envVar.replace(/_\d+$/, '');
|
|
77
|
+
const meta = SERVICE_METADATA[baseVar];
|
|
78
|
+
if (meta) {
|
|
79
|
+
return {
|
|
80
|
+
envVar,
|
|
81
|
+
service: meta.service,
|
|
82
|
+
// Replace the base var in the auth header template with the actual var
|
|
83
|
+
authHeader: meta.authHeader.replace(`$${baseVar}`, `$${envVar}`),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
envVar,
|
|
88
|
+
service: 'API Service',
|
|
89
|
+
authHeader: '(check service docs)',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Upsert the secretless section into all detected AI tool config files.
|
|
94
|
+
*/
|
|
95
|
+
function configureSecretlessForAiTools(targetDir, items) {
|
|
96
|
+
const result = {
|
|
97
|
+
toolsUpdated: [],
|
|
98
|
+
toolsSkipped: [],
|
|
99
|
+
};
|
|
100
|
+
if (items.length === 0)
|
|
101
|
+
return result;
|
|
102
|
+
for (const [relPath, createIfMissing] of AI_TOOL_CONFIGS) {
|
|
103
|
+
const filePath = path.join(targetDir, relPath);
|
|
104
|
+
// Merge with any existing credentials in the file
|
|
105
|
+
const existing = parseExistingCredentials(filePath);
|
|
106
|
+
const merged = mergeCredentials(existing, items);
|
|
107
|
+
const section = generateSecretlessSection(merged);
|
|
108
|
+
const updated = upsertSecretlessSection(filePath, section, createIfMissing);
|
|
109
|
+
if (updated) {
|
|
110
|
+
result.toolsUpdated.push(relPath);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
result.toolsSkipped.push(relPath);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
// --- Internal functions ---
|
|
119
|
+
/**
|
|
120
|
+
* Build the full markdown section with start/end markers.
|
|
121
|
+
*/
|
|
122
|
+
function generateSecretlessSection(items) {
|
|
123
|
+
const rows = items
|
|
124
|
+
.map(i => `| \`$${i.envVar}\` | ${i.service} | ${i.authHeader} |`)
|
|
125
|
+
.join('\n');
|
|
126
|
+
return `${START_MARKER}
|
|
127
|
+
## Secretless Mode
|
|
128
|
+
|
|
129
|
+
This project uses Secretless to protect credentials from AI context.
|
|
130
|
+
|
|
131
|
+
**Available API keys** (set as env vars -- use \`$VAR_NAME\` in commands, never ask for values):
|
|
132
|
+
|
|
133
|
+
| Env Var | Service | Auth Header |
|
|
134
|
+
|---------|---------|-------------|
|
|
135
|
+
${rows}
|
|
136
|
+
|
|
137
|
+
**Blocked file patterns** (never read, write, or reference):
|
|
138
|
+
- \`.env\`, \`.env.*\` -- environment variable files
|
|
139
|
+
- \`*.key\`, \`*.pem\`, \`*.p12\`, \`*.pfx\` -- private key files
|
|
140
|
+
- \`.aws/credentials\`, \`.ssh/*\` -- cloud/SSH credentials
|
|
141
|
+
- \`*.tfstate\`, \`*.tfvars\` -- Terraform state with secrets
|
|
142
|
+
- \`secrets/\`, \`credentials/\` -- secret directories
|
|
143
|
+
|
|
144
|
+
**If you need a credential:**
|
|
145
|
+
1. Reference it via \`$VAR_NAME\` in shell commands or \`process.env.VAR_NAME\` in code
|
|
146
|
+
2. Never hardcode credentials in source files
|
|
147
|
+
3. Never print or echo key values -- only reference them as variables
|
|
148
|
+
|
|
149
|
+
**If you find a hardcoded credential:**
|
|
150
|
+
1. Replace it with an environment variable reference
|
|
151
|
+
2. Add the variable name to \`.env.example\`
|
|
152
|
+
3. Warn the user to rotate the exposed credential
|
|
153
|
+
|
|
154
|
+
Verify setup: \`npx secretless-ai verify\`
|
|
155
|
+
|
|
156
|
+
## Transcript Protection
|
|
157
|
+
- NEVER ask users to paste API keys, tokens, or passwords into the conversation
|
|
158
|
+
- If a user pastes a credential, immediately warn them and suggest using environment variables
|
|
159
|
+
- Credentials in this conversation are automatically redacted by Secretless AI
|
|
160
|
+
${END_MARKER}`;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Upsert the secretless section into a file.
|
|
164
|
+
* Returns true if the file was modified, false if skipped or unchanged.
|
|
165
|
+
*/
|
|
166
|
+
function upsertSecretlessSection(filePath, section, createIfMissing) {
|
|
167
|
+
if (!fs.existsSync(filePath)) {
|
|
168
|
+
if (!createIfMissing)
|
|
169
|
+
return false;
|
|
170
|
+
// Ensure parent directory exists
|
|
171
|
+
const dir = path.dirname(filePath);
|
|
172
|
+
if (!fs.existsSync(dir)) {
|
|
173
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
174
|
+
}
|
|
175
|
+
const fd = fs.openSync(filePath, 'w', 0o600);
|
|
176
|
+
fs.writeSync(fd, '\n' + section + '\n');
|
|
177
|
+
fs.closeSync(fd);
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
181
|
+
// Check if section already exists
|
|
182
|
+
const startIdx = content.indexOf(START_MARKER);
|
|
183
|
+
if (startIdx === -1) {
|
|
184
|
+
// No existing section -- append with separator
|
|
185
|
+
const separator = content.length > 0 && !content.endsWith('\n') ? '\n' : '';
|
|
186
|
+
const prefix = content.length > 0 ? '\n' : '';
|
|
187
|
+
fs.writeFileSync(filePath, content + separator + prefix + section + '\n', 'utf-8');
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
// Find end of existing section
|
|
191
|
+
let endIdx = content.indexOf(END_MARKER, startIdx);
|
|
192
|
+
if (endIdx !== -1) {
|
|
193
|
+
// Has proper end marker -- replace from start to end (inclusive)
|
|
194
|
+
endIdx += END_MARKER.length;
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// Backward compat: old secretless-ai sections without end marker.
|
|
198
|
+
// Look for next <!-- marker or use EOF.
|
|
199
|
+
const nextMarker = content.indexOf('<!--', startIdx + START_MARKER.length);
|
|
200
|
+
endIdx = nextMarker !== -1 ? nextMarker : content.length;
|
|
201
|
+
// Trim trailing whitespace before the next marker
|
|
202
|
+
while (endIdx > startIdx && content[endIdx - 1] === '\n') {
|
|
203
|
+
endIdx--;
|
|
204
|
+
}
|
|
205
|
+
// Keep one newline
|
|
206
|
+
if (endIdx < content.length)
|
|
207
|
+
endIdx++;
|
|
208
|
+
}
|
|
209
|
+
const before = content.slice(0, startIdx);
|
|
210
|
+
const after = content.slice(endIdx);
|
|
211
|
+
const newContent = before + section + after;
|
|
212
|
+
// Check if content actually changed
|
|
213
|
+
if (newContent === content)
|
|
214
|
+
return false;
|
|
215
|
+
fs.writeFileSync(filePath, newContent, 'utf-8');
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Extract credential items from an existing secretless section's markdown table.
|
|
220
|
+
*/
|
|
221
|
+
function parseExistingCredentials(filePath) {
|
|
222
|
+
if (!fs.existsSync(filePath))
|
|
223
|
+
return [];
|
|
224
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
225
|
+
const startIdx = content.indexOf(START_MARKER);
|
|
226
|
+
if (startIdx === -1)
|
|
227
|
+
return [];
|
|
228
|
+
// Find the table rows between start and end markers
|
|
229
|
+
let endIdx = content.indexOf(END_MARKER, startIdx);
|
|
230
|
+
if (endIdx === -1) {
|
|
231
|
+
const nextMarker = content.indexOf('<!--', startIdx + START_MARKER.length);
|
|
232
|
+
endIdx = nextMarker !== -1 ? nextMarker : content.length;
|
|
233
|
+
}
|
|
234
|
+
const sectionContent = content.slice(startIdx, endIdx);
|
|
235
|
+
const items = [];
|
|
236
|
+
// Match table rows: | `$VAR` | Service | Header |
|
|
237
|
+
const rowPattern = /\|\s*`\$([^`]+)`\s*\|\s*([^|]+)\s*\|\s*([^|]+)\s*\|/g;
|
|
238
|
+
let match;
|
|
239
|
+
while ((match = rowPattern.exec(sectionContent)) !== null) {
|
|
240
|
+
const envVar = match[1].trim();
|
|
241
|
+
const service = match[2].trim();
|
|
242
|
+
const authHeader = match[3].trim();
|
|
243
|
+
// Skip the header row
|
|
244
|
+
if (envVar === 'Env Var' || envVar === 'Service')
|
|
245
|
+
continue;
|
|
246
|
+
items.push({ envVar, service, authHeader });
|
|
247
|
+
}
|
|
248
|
+
return items;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Merge new credentials with existing ones. Deduplicates by envVar (new takes precedence).
|
|
252
|
+
*/
|
|
253
|
+
function mergeCredentials(existing, incoming) {
|
|
254
|
+
const map = new Map();
|
|
255
|
+
// Add existing first
|
|
256
|
+
for (const item of existing) {
|
|
257
|
+
map.set(item.envVar, item);
|
|
258
|
+
}
|
|
259
|
+
// Incoming overwrites
|
|
260
|
+
for (const item of incoming) {
|
|
261
|
+
map.set(item.envVar, item);
|
|
262
|
+
}
|
|
263
|
+
return Array.from(map.values());
|
|
264
|
+
}
|
|
265
|
+
//# sourceMappingURL=secretless-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secretless-config.js","sourceRoot":"","sources":["../../src/util/secretless-config.ts"],"names":[],"mappings":"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"}
|