opena2a-cli 0.1.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/adapters/docker.d.ts +8 -0
- package/dist/adapters/docker.d.ts.map +1 -0
- package/dist/adapters/docker.js +60 -0
- package/dist/adapters/docker.js.map +1 -0
- package/dist/adapters/import.d.ts +12 -0
- package/dist/adapters/import.d.ts.map +1 -0
- package/dist/adapters/import.js +76 -0
- package/dist/adapters/import.js.map +1 -0
- package/dist/adapters/index.d.ts +9 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +40 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/python.d.ts +9 -0
- package/dist/adapters/python.d.ts.map +1 -0
- package/dist/adapters/python.js +73 -0
- package/dist/adapters/python.js.map +1 -0
- package/dist/adapters/registry.d.ts +6 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +86 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/spawn.d.ts +9 -0
- package/dist/adapters/spawn.d.ts.map +1 -0
- package/dist/adapters/spawn.js +63 -0
- package/dist/adapters/spawn.js.map +1 -0
- package/dist/adapters/types.d.ts +35 -0
- package/dist/adapters/types.d.ts.map +1 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/branding.d.ts +3 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +21 -0
- package/dist/branding.js.map +1 -0
- package/dist/commands/baselines.d.ts +14 -0
- package/dist/commands/baselines.d.ts.map +1 -0
- package/dist/commands/baselines.js +269 -0
- package/dist/commands/baselines.js.map +1 -0
- package/dist/commands/guard.d.ts +38 -0
- package/dist/commands/guard.d.ts.map +1 -0
- package/dist/commands/guard.js +307 -0
- package/dist/commands/guard.js.map +1 -0
- package/dist/commands/init.d.ts +14 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +356 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/onepassword-migration.d.ts +23 -0
- package/dist/commands/onepassword-migration.d.ts.map +1 -0
- package/dist/commands/onepassword-migration.js +179 -0
- package/dist/commands/onepassword-migration.js.map +1 -0
- package/dist/commands/protect.d.ts +34 -0
- package/dist/commands/protect.d.ts.map +1 -0
- package/dist/commands/protect.js +642 -0
- package/dist/commands/protect.js.map +1 -0
- package/dist/commands/runtime.d.ts +28 -0
- package/dist/commands/runtime.d.ts.map +1 -0
- package/dist/commands/runtime.js +309 -0
- package/dist/commands/runtime.js.map +1 -0
- package/dist/commands/self-register.d.ts +39 -0
- package/dist/commands/self-register.d.ts.map +1 -0
- package/dist/commands/self-register.js +528 -0
- package/dist/commands/self-register.js.map +1 -0
- package/dist/commands/verify.d.ts +25 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +300 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/contextual/advisor.d.ts +12 -0
- package/dist/contextual/advisor.d.ts.map +1 -0
- package/dist/contextual/advisor.js +94 -0
- package/dist/contextual/advisor.js.map +1 -0
- package/dist/contextual/index.d.ts +3 -0
- package/dist/contextual/index.d.ts.map +1 -0
- package/dist/contextual/index.js +7 -0
- package/dist/contextual/index.js.map +1 -0
- package/dist/guided/attack-walkthrough.d.ts +13 -0
- package/dist/guided/attack-walkthrough.d.ts.map +1 -0
- package/dist/guided/attack-walkthrough.js +113 -0
- package/dist/guided/attack-walkthrough.js.map +1 -0
- package/dist/guided/wizard.d.ts +2 -0
- package/dist/guided/wizard.d.ts.map +1 -0
- package/dist/guided/wizard.js +108 -0
- package/dist/guided/wizard.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +326 -0
- package/dist/index.js.map +1 -0
- package/dist/natural/index.d.ts +4 -0
- package/dist/natural/index.d.ts.map +1 -0
- package/dist/natural/index.js +9 -0
- package/dist/natural/index.js.map +1 -0
- package/dist/natural/intent-map.d.ts +7 -0
- package/dist/natural/intent-map.d.ts.map +1 -0
- package/dist/natural/intent-map.js +145 -0
- package/dist/natural/intent-map.js.map +1 -0
- package/dist/natural/llm-fallback.d.ts +8 -0
- package/dist/natural/llm-fallback.d.ts.map +1 -0
- package/dist/natural/llm-fallback.js +143 -0
- package/dist/natural/llm-fallback.js.map +1 -0
- package/dist/report/interactive-html.d.ts +51 -0
- package/dist/report/interactive-html.d.ts.map +1 -0
- package/dist/report/interactive-html.js +508 -0
- package/dist/report/interactive-html.js.map +1 -0
- package/dist/router.d.ts +23 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +132 -0
- package/dist/router.js.map +1 -0
- package/dist/semantic/command-index.json +182 -0
- package/dist/semantic/index.d.ts +3 -0
- package/dist/semantic/index.d.ts.map +1 -0
- package/dist/semantic/index.js +28 -0
- package/dist/semantic/index.js.map +1 -0
- package/dist/semantic/search.d.ts +17 -0
- package/dist/semantic/search.d.ts.map +1 -0
- package/dist/semantic/search.js +123 -0
- package/dist/semantic/search.js.map +1 -0
- package/dist/util/action-prompt.d.ts +29 -0
- package/dist/util/action-prompt.d.ts.map +1 -0
- package/dist/util/action-prompt.js +126 -0
- package/dist/util/action-prompt.js.map +1 -0
- package/dist/util/advisories.d.ts +43 -0
- package/dist/util/advisories.d.ts.map +1 -0
- package/dist/util/advisories.js +229 -0
- package/dist/util/advisories.js.map +1 -0
- package/dist/util/colors.d.ts +9 -0
- package/dist/util/colors.d.ts.map +1 -0
- package/dist/util/colors.js +18 -0
- package/dist/util/colors.js.map +1 -0
- package/dist/util/credential-patterns.d.ts +38 -0
- package/dist/util/credential-patterns.d.ts.map +1 -0
- package/dist/util/credential-patterns.js +203 -0
- package/dist/util/credential-patterns.js.map +1 -0
- package/dist/util/detect.d.ts +11 -0
- package/dist/util/detect.d.ts.map +1 -0
- package/dist/util/detect.js +49 -0
- package/dist/util/detect.js.map +1 -0
- package/dist/util/format.d.ts +6 -0
- package/dist/util/format.d.ts.map +1 -0
- package/dist/util/format.js +49 -0
- package/dist/util/format.js.map +1 -0
- package/dist/util/report-submission.d.ts +64 -0
- package/dist/util/report-submission.d.ts.map +1 -0
- package/dist/util/report-submission.js +109 -0
- package/dist/util/report-submission.js.map +1 -0
- package/dist/util/spinner.d.ts +10 -0
- package/dist/util/spinner.d.ts.map +1 -0
- package/dist/util/spinner.js +38 -0
- package/dist/util/spinner.js.map +1 -0
- package/dist/util/version.d.ts +5 -0
- package/dist/util/version.d.ts.map +1 -0
- package/dist/util/version.js +24 -0
- package/dist/util/version.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opena2a init -- Initialize security posture assessment for a project.
|
|
3
|
+
*
|
|
4
|
+
* Detects project type, scans for credentials, checks hygiene,
|
|
5
|
+
* calculates trust score, and generates prioritized next steps.
|
|
6
|
+
*/
|
|
7
|
+
export interface InitOptions {
|
|
8
|
+
targetDir?: string;
|
|
9
|
+
ci?: boolean;
|
|
10
|
+
format?: 'text' | 'json';
|
|
11
|
+
verbose?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export declare function init(options: InitOptions): Promise<number>;
|
|
14
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA8BD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAuGhE"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* opena2a init -- Initialize security posture assessment for a project.
|
|
4
|
+
*
|
|
5
|
+
* Detects project type, scans for credentials, checks hygiene,
|
|
6
|
+
* calculates trust score, and generates prioritized next steps.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.init = init;
|
|
43
|
+
const fs = __importStar(require("node:fs"));
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
const colors_js_1 = require("../util/colors.js");
|
|
46
|
+
const detect_js_1 = require("../util/detect.js");
|
|
47
|
+
const credential_patterns_js_1 = require("../util/credential-patterns.js");
|
|
48
|
+
const advisories_js_1 = require("../util/advisories.js");
|
|
49
|
+
const version_js_1 = require("../util/version.js");
|
|
50
|
+
// --- Core ---
|
|
51
|
+
async function init(options) {
|
|
52
|
+
const targetDir = path.resolve(options.targetDir ?? process.cwd());
|
|
53
|
+
if (!fs.existsSync(targetDir)) {
|
|
54
|
+
process.stderr.write((0, colors_js_1.red)(`Directory not found: ${targetDir}\n`));
|
|
55
|
+
return 1;
|
|
56
|
+
}
|
|
57
|
+
// 1. Detect project type
|
|
58
|
+
const project = (0, detect_js_1.detectProject)(targetDir);
|
|
59
|
+
// 2. Quick credential scan
|
|
60
|
+
const credentialMatches = (0, credential_patterns_js_1.quickCredentialScan)(targetDir);
|
|
61
|
+
const credsBySeverity = {};
|
|
62
|
+
for (const m of credentialMatches) {
|
|
63
|
+
credsBySeverity[m.severity] = (credsBySeverity[m.severity] || 0) + 1;
|
|
64
|
+
}
|
|
65
|
+
// 3. Security hygiene checks
|
|
66
|
+
const checks = runHygieneChecks(targetDir, project, credentialMatches.length);
|
|
67
|
+
// 4. Check advisories (non-blocking)
|
|
68
|
+
let advisoryCheck = { advisories: [], matchedPackages: [], total: 0, fromCache: false };
|
|
69
|
+
try {
|
|
70
|
+
advisoryCheck = await (0, advisories_js_1.checkAdvisories)(targetDir);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// Advisory check is best-effort, don't fail init
|
|
74
|
+
}
|
|
75
|
+
// 5. Calculate trust score
|
|
76
|
+
const { score, grade } = calculateTrustScore(credsBySeverity, checks, targetDir);
|
|
77
|
+
// 6. Generate next steps
|
|
78
|
+
const nextSteps = generateNextSteps(credentialMatches.length, credsBySeverity, checks);
|
|
79
|
+
// 7. Build report
|
|
80
|
+
const report = {
|
|
81
|
+
projectName: project.name,
|
|
82
|
+
projectVersion: project.version,
|
|
83
|
+
projectType: formatProjectType(project),
|
|
84
|
+
directory: targetDir,
|
|
85
|
+
credentialFindings: credentialMatches.length,
|
|
86
|
+
credentialsBySeverity: credsBySeverity,
|
|
87
|
+
hygieneChecks: checks,
|
|
88
|
+
trustScore: score,
|
|
89
|
+
grade,
|
|
90
|
+
nextSteps,
|
|
91
|
+
advisories: {
|
|
92
|
+
count: advisoryCheck.advisories.length,
|
|
93
|
+
matchedPackages: advisoryCheck.matchedPackages,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
// 8. Output
|
|
97
|
+
if (options.format === 'json') {
|
|
98
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
printReport(report, options.verbose);
|
|
102
|
+
// Verbose: show individual credential findings
|
|
103
|
+
if (options.verbose && credentialMatches.length > 0) {
|
|
104
|
+
process.stdout.write((0, colors_js_1.bold)(' Credential Details') + '\n');
|
|
105
|
+
process.stdout.write((0, colors_js_1.gray)(' ' + '-'.repeat(47)) + '\n');
|
|
106
|
+
for (const m of credentialMatches) {
|
|
107
|
+
const sev = m.severity === 'critical' ? (0, colors_js_1.red)('[CRITICAL]')
|
|
108
|
+
: m.severity === 'high' ? (0, colors_js_1.yellow)('[HIGH]')
|
|
109
|
+
: (0, colors_js_1.cyan)('[MEDIUM]');
|
|
110
|
+
const relPath = path.relative(targetDir, m.filePath);
|
|
111
|
+
process.stdout.write(` ${sev} ${(0, colors_js_1.bold)(m.findingId)}: ${m.title}\n`);
|
|
112
|
+
process.stdout.write(` ${(0, colors_js_1.dim)(' File:')} ${relPath}:${m.line}\n`);
|
|
113
|
+
if (m.explanation) {
|
|
114
|
+
process.stdout.write(` ${(0, colors_js_1.dim)(' Why:')} ${m.explanation}\n`);
|
|
115
|
+
}
|
|
116
|
+
process.stdout.write('\n');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Drift detection callout (always shown when drift findings exist)
|
|
120
|
+
const driftFindings = credentialMatches.filter(m => m.findingId.startsWith('DRIFT'));
|
|
121
|
+
if (driftFindings.length > 0) {
|
|
122
|
+
process.stdout.write((0, colors_js_1.yellow)((0, colors_js_1.bold)(' Scope Drift Detected')) + '\n');
|
|
123
|
+
process.stdout.write((0, colors_js_1.gray)(' ' + '-'.repeat(47)) + '\n');
|
|
124
|
+
for (const d of driftFindings) {
|
|
125
|
+
const relPath = path.relative(targetDir, d.filePath);
|
|
126
|
+
const driftType = d.findingId === 'DRIFT-001' ? 'Google Maps key may access Gemini AI' : 'AWS key may access Bedrock AI';
|
|
127
|
+
process.stdout.write(` ${(0, colors_js_1.yellow)(d.findingId)} ${driftType}\n`);
|
|
128
|
+
process.stdout.write(` ${(0, colors_js_1.dim)(' ' + relPath + ':' + d.line)}\n`);
|
|
129
|
+
}
|
|
130
|
+
process.stdout.write('\n');
|
|
131
|
+
process.stdout.write((0, colors_js_1.dim)(' Scope drift: keys provisioned for one service silently') + '\n');
|
|
132
|
+
process.stdout.write((0, colors_js_1.dim)(' gain access to AI services, expanding attack surface.') + '\n');
|
|
133
|
+
process.stdout.write((0, colors_js_1.dim)(' Run: opena2a protect') + '\n');
|
|
134
|
+
process.stdout.write('\n');
|
|
135
|
+
}
|
|
136
|
+
// Show advisory warnings after main report
|
|
137
|
+
if (advisoryCheck.advisories.length > 0) {
|
|
138
|
+
(0, advisories_js_1.printAdvisoryWarnings)(advisoryCheck);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const hasCritical = nextSteps.some(s => s.severity === 'critical');
|
|
142
|
+
return hasCritical ? 1 : 0;
|
|
143
|
+
}
|
|
144
|
+
// --- Hygiene checks ---
|
|
145
|
+
function runHygieneChecks(dir, project, credCount) {
|
|
146
|
+
const checks = [];
|
|
147
|
+
// Credential scan result
|
|
148
|
+
if (credCount === 0) {
|
|
149
|
+
checks.push({ label: 'Credential scan', status: 'pass', detail: 'no findings' });
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
checks.push({
|
|
153
|
+
label: 'Credential scan',
|
|
154
|
+
status: 'fail',
|
|
155
|
+
detail: `${credCount} finding${credCount === 1 ? '' : 's'}`,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
// .gitignore
|
|
159
|
+
const gitignorePath = path.join(dir, '.gitignore');
|
|
160
|
+
if (fs.existsSync(gitignorePath)) {
|
|
161
|
+
checks.push({ label: '.gitignore', status: 'pass', detail: 'present' });
|
|
162
|
+
// .env protection
|
|
163
|
+
const gitignoreContent = fs.readFileSync(gitignorePath, 'utf-8');
|
|
164
|
+
if (gitignoreContent.includes('.env')) {
|
|
165
|
+
checks.push({ label: '.env protection', status: 'pass', detail: 'in .gitignore' });
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
checks.push({ label: '.env protection', status: 'warn', detail: 'NOT in .gitignore' });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
checks.push({ label: '.gitignore', status: 'warn', detail: 'missing' });
|
|
173
|
+
checks.push({ label: '.env protection', status: 'warn', detail: 'no .gitignore' });
|
|
174
|
+
}
|
|
175
|
+
// Lock file
|
|
176
|
+
const lockFiles = [
|
|
177
|
+
{ file: 'package-lock.json', label: 'package-lock.json' },
|
|
178
|
+
{ file: 'yarn.lock', label: 'yarn.lock' },
|
|
179
|
+
{ file: 'pnpm-lock.yaml', label: 'pnpm-lock.yaml' },
|
|
180
|
+
{ file: 'bun.lockb', label: 'bun.lockb' },
|
|
181
|
+
{ file: 'go.sum', label: 'go.sum' },
|
|
182
|
+
{ file: 'poetry.lock', label: 'poetry.lock' },
|
|
183
|
+
{ file: 'Pipfile.lock', label: 'Pipfile.lock' },
|
|
184
|
+
];
|
|
185
|
+
const foundLock = lockFiles.find(lf => fs.existsSync(path.join(dir, lf.file)));
|
|
186
|
+
if (foundLock) {
|
|
187
|
+
checks.push({ label: 'Lock file', status: 'pass', detail: foundLock.label });
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
checks.push({ label: 'Lock file', status: 'warn', detail: 'none found' });
|
|
191
|
+
}
|
|
192
|
+
// Security config
|
|
193
|
+
const securityConfigs = ['.opena2a.yaml', '.opena2a.json', '.opena2a/guard/signatures.json'];
|
|
194
|
+
const foundConfig = securityConfigs.find(sc => fs.existsSync(path.join(dir, sc)));
|
|
195
|
+
if (foundConfig) {
|
|
196
|
+
checks.push({ label: 'Security config', status: 'pass', detail: foundConfig });
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
checks.push({ label: 'Security config', status: 'info', detail: 'none' });
|
|
200
|
+
}
|
|
201
|
+
// MCP config
|
|
202
|
+
if (project.hasMcp) {
|
|
203
|
+
checks.push({ label: 'MCP config', status: 'info', detail: 'found' });
|
|
204
|
+
}
|
|
205
|
+
return checks;
|
|
206
|
+
}
|
|
207
|
+
// --- Trust score ---
|
|
208
|
+
function calculateTrustScore(credsBySeverity, checks, dir) {
|
|
209
|
+
let score = 100;
|
|
210
|
+
// Credential penalties
|
|
211
|
+
score -= (credsBySeverity['critical'] || 0) * 25;
|
|
212
|
+
score -= (credsBySeverity['high'] || 0) * 15;
|
|
213
|
+
score -= (credsBySeverity['medium'] || 0) * 8;
|
|
214
|
+
score -= (credsBySeverity['low'] || 0) * 3;
|
|
215
|
+
// Hygiene penalties
|
|
216
|
+
const gitignoreCheck = checks.find(c => c.label === '.gitignore');
|
|
217
|
+
if (gitignoreCheck?.status !== 'pass')
|
|
218
|
+
score -= 15;
|
|
219
|
+
const envCheck = checks.find(c => c.label === '.env protection');
|
|
220
|
+
if (envCheck?.status === 'warn')
|
|
221
|
+
score -= 10;
|
|
222
|
+
const lockCheck = checks.find(c => c.label === 'Lock file');
|
|
223
|
+
if (lockCheck?.status !== 'pass')
|
|
224
|
+
score -= 5;
|
|
225
|
+
// Bonus for security config
|
|
226
|
+
const secConfig = checks.find(c => c.label === 'Security config');
|
|
227
|
+
if (secConfig?.status === 'pass')
|
|
228
|
+
score += 5;
|
|
229
|
+
score = Math.max(0, Math.min(100, score));
|
|
230
|
+
let grade;
|
|
231
|
+
if (score >= 90)
|
|
232
|
+
grade = 'A';
|
|
233
|
+
else if (score >= 80)
|
|
234
|
+
grade = 'B';
|
|
235
|
+
else if (score >= 70)
|
|
236
|
+
grade = 'C';
|
|
237
|
+
else if (score >= 60)
|
|
238
|
+
grade = 'D';
|
|
239
|
+
else
|
|
240
|
+
grade = 'F';
|
|
241
|
+
return { score, grade };
|
|
242
|
+
}
|
|
243
|
+
// --- Next steps ---
|
|
244
|
+
function generateNextSteps(credCount, credsBySeverity, checks) {
|
|
245
|
+
const steps = [];
|
|
246
|
+
// Credentials -> protect
|
|
247
|
+
if (credCount > 0) {
|
|
248
|
+
steps.push({
|
|
249
|
+
severity: 'critical',
|
|
250
|
+
description: `Migrate ${credCount} hardcoded credential${credCount === 1 ? '' : 's'}`,
|
|
251
|
+
command: 'opena2a protect',
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
// .env protection
|
|
255
|
+
const envCheck = checks.find(c => c.label === '.env protection');
|
|
256
|
+
if (envCheck?.status === 'warn') {
|
|
257
|
+
steps.push({
|
|
258
|
+
severity: 'high',
|
|
259
|
+
description: 'Add .env to .gitignore',
|
|
260
|
+
command: "echo '.env' >> .gitignore",
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
// No .gitignore
|
|
264
|
+
const gitignoreCheck = checks.find(c => c.label === '.gitignore');
|
|
265
|
+
if (gitignoreCheck?.status !== 'pass') {
|
|
266
|
+
steps.push({
|
|
267
|
+
severity: 'high',
|
|
268
|
+
description: 'Create .gitignore',
|
|
269
|
+
command: 'npx gitignore node',
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
// Sign config files
|
|
273
|
+
steps.push({
|
|
274
|
+
severity: 'medium',
|
|
275
|
+
description: 'Sign config files for integrity',
|
|
276
|
+
command: 'opena2a guard sign',
|
|
277
|
+
});
|
|
278
|
+
// Runtime protection
|
|
279
|
+
steps.push({
|
|
280
|
+
severity: 'low',
|
|
281
|
+
description: 'Start runtime protection',
|
|
282
|
+
command: 'opena2a runtime start',
|
|
283
|
+
});
|
|
284
|
+
return steps;
|
|
285
|
+
}
|
|
286
|
+
// --- Output ---
|
|
287
|
+
function formatProjectType(project) {
|
|
288
|
+
const parts = [];
|
|
289
|
+
switch (project.type) {
|
|
290
|
+
case 'node':
|
|
291
|
+
parts.push('Node.js');
|
|
292
|
+
break;
|
|
293
|
+
case 'go':
|
|
294
|
+
parts.push('Go');
|
|
295
|
+
break;
|
|
296
|
+
case 'python':
|
|
297
|
+
parts.push('Python');
|
|
298
|
+
break;
|
|
299
|
+
default: parts.push('Unknown');
|
|
300
|
+
}
|
|
301
|
+
if (project.hasMcp)
|
|
302
|
+
parts.push('+ MCP server');
|
|
303
|
+
return parts.join(' ');
|
|
304
|
+
}
|
|
305
|
+
function printReport(report, _verbose) {
|
|
306
|
+
const VERSION = (0, version_js_1.getVersion)();
|
|
307
|
+
process.stdout.write('\n');
|
|
308
|
+
process.stdout.write((0, colors_js_1.bold)(' OpenA2A Security Initialization') + (0, colors_js_1.dim)(` v${VERSION}`) + '\n\n');
|
|
309
|
+
// Project info
|
|
310
|
+
const projectDisplay = report.projectName
|
|
311
|
+
? `${report.projectName}${report.projectVersion ? ' v' + report.projectVersion : ''}`
|
|
312
|
+
: path.basename(report.directory);
|
|
313
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Project')} ${projectDisplay}\n`);
|
|
314
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Type')} ${report.projectType}\n`);
|
|
315
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Directory')} ${report.directory}\n`);
|
|
316
|
+
process.stdout.write('\n');
|
|
317
|
+
// Security posture
|
|
318
|
+
process.stdout.write((0, colors_js_1.bold)(' Security Posture') + '\n');
|
|
319
|
+
process.stdout.write((0, colors_js_1.gray)(' ' + '-'.repeat(47)) + '\n');
|
|
320
|
+
for (const check of report.hygieneChecks) {
|
|
321
|
+
const statusDisplay = check.status === 'pass' ? (0, colors_js_1.green)(check.detail)
|
|
322
|
+
: check.status === 'fail' ? (0, colors_js_1.red)(check.detail)
|
|
323
|
+
: check.status === 'warn' ? (0, colors_js_1.yellow)(check.detail)
|
|
324
|
+
: (0, colors_js_1.dim)(check.detail);
|
|
325
|
+
process.stdout.write(` ${(0, colors_js_1.dim)(check.label.padEnd(20))} ${statusDisplay}\n`);
|
|
326
|
+
}
|
|
327
|
+
process.stdout.write((0, colors_js_1.gray)(' ' + '-'.repeat(47)) + '\n');
|
|
328
|
+
// Trust score
|
|
329
|
+
const scoreColor = report.trustScore >= 80 ? colors_js_1.green
|
|
330
|
+
: report.trustScore >= 60 ? colors_js_1.yellow
|
|
331
|
+
: colors_js_1.red;
|
|
332
|
+
process.stdout.write(` ${(0, colors_js_1.dim)('Trust Score')} ${scoreColor(`${report.trustScore} / 100`)} ${(0, colors_js_1.dim)('[Grade:')} ${scoreColor(report.grade)}${(0, colors_js_1.dim)(']')}\n`);
|
|
333
|
+
process.stdout.write('\n');
|
|
334
|
+
// Next steps
|
|
335
|
+
if (report.nextSteps.length > 0) {
|
|
336
|
+
process.stdout.write((0, colors_js_1.bold)(' Next Steps') + '\n');
|
|
337
|
+
process.stdout.write((0, colors_js_1.gray)(' ' + '-'.repeat(47)) + '\n');
|
|
338
|
+
for (const step of report.nextSteps) {
|
|
339
|
+
const severityTag = step.severity === 'critical' ? (0, colors_js_1.red)(`[CRITICAL]`)
|
|
340
|
+
: step.severity === 'high' ? (0, colors_js_1.yellow)(`[HIGH]`)
|
|
341
|
+
: step.severity === 'medium' ? (0, colors_js_1.cyan)(`[MEDIUM]`)
|
|
342
|
+
: (0, colors_js_1.dim)(`[LOW]`);
|
|
343
|
+
process.stdout.write(` ${severityTag.padEnd(22)} ${step.description}\n`);
|
|
344
|
+
process.stdout.write(` ${' '.repeat(12)} ${(0, colors_js_1.dim)(step.command)}\n\n`);
|
|
345
|
+
}
|
|
346
|
+
process.stdout.write((0, colors_js_1.gray)(' ' + '-'.repeat(47)) + '\n');
|
|
347
|
+
}
|
|
348
|
+
process.stdout.write('\n');
|
|
349
|
+
// Quick start hints for new users
|
|
350
|
+
process.stdout.write((0, colors_js_1.dim)(' Tip: Try these commands to explore further:') + '\n');
|
|
351
|
+
process.stdout.write((0, colors_js_1.dim)(' opena2a ~<query> Search commands (e.g. opena2a ~drift)') + '\n');
|
|
352
|
+
process.stdout.write((0, colors_js_1.dim)(' opena2a ? Get smart recommendations') + '\n');
|
|
353
|
+
process.stdout.write((0, colors_js_1.dim)(' opena2a --help See all available commands') + '\n');
|
|
354
|
+
process.stdout.write('\n');
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guided 1Password migration flow.
|
|
3
|
+
*
|
|
4
|
+
* Called from protect.ts after successful credential migration to local vault.
|
|
5
|
+
* Walks users through migrating secrets to 1Password for team sharing
|
|
6
|
+
* and audit trails. Uses the offerAction pattern for transparency.
|
|
7
|
+
*
|
|
8
|
+
* Secretless already has full 1Password backend, migration infrastructure,
|
|
9
|
+
* and CLI backend switching. This module provides the guided UX layer.
|
|
10
|
+
*/
|
|
11
|
+
interface MigrationContext {
|
|
12
|
+
/** Number of credentials in local vault */
|
|
13
|
+
credentialCount: number;
|
|
14
|
+
/** Whether to skip interactive prompts */
|
|
15
|
+
ci?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Offer to migrate local vault credentials to 1Password.
|
|
19
|
+
* Returns true if migration was performed successfully.
|
|
20
|
+
*/
|
|
21
|
+
export declare function offer1PasswordMigration(ctx: MigrationContext): Promise<boolean>;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=onepassword-migration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword-migration.d.ts","sourceRoot":"","sources":["../../src/commands/onepassword-migration.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,UAAU,gBAAgB;IACxB,2CAA2C;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,0CAA0C;IAC1C,EAAE,CAAC,EAAE,OAAO,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAkKrF"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Guided 1Password migration flow.
|
|
4
|
+
*
|
|
5
|
+
* Called from protect.ts after successful credential migration to local vault.
|
|
6
|
+
* Walks users through migrating secrets to 1Password for team sharing
|
|
7
|
+
* and audit trails. Uses the offerAction pattern for transparency.
|
|
8
|
+
*
|
|
9
|
+
* Secretless already has full 1Password backend, migration infrastructure,
|
|
10
|
+
* and CLI backend switching. This module provides the guided UX layer.
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.offer1PasswordMigration = offer1PasswordMigration;
|
|
14
|
+
const colors_js_1 = require("../util/colors.js");
|
|
15
|
+
const spinner_js_1 = require("../util/spinner.js");
|
|
16
|
+
/**
|
|
17
|
+
* Offer to migrate local vault credentials to 1Password.
|
|
18
|
+
* Returns true if migration was performed successfully.
|
|
19
|
+
*/
|
|
20
|
+
async function offer1PasswordMigration(ctx) {
|
|
21
|
+
// CI or non-TTY: skip silently
|
|
22
|
+
if (ctx.ci || !process.stdin.isTTY) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
// Check if user previously declined permanently
|
|
26
|
+
let rememberedChoice;
|
|
27
|
+
try {
|
|
28
|
+
const shared = await import('@opena2a/shared');
|
|
29
|
+
const mod = 'default' in shared ? shared.default : shared;
|
|
30
|
+
rememberedChoice = mod.getRememberedChoice('1password-skip');
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// shared not available
|
|
34
|
+
}
|
|
35
|
+
if (rememberedChoice === true) {
|
|
36
|
+
// User said "don't ask again"
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
// Step 1: Offer
|
|
40
|
+
process.stdout.write('\n' + (0, colors_js_1.bold)('1Password Integration') + '\n\n');
|
|
41
|
+
process.stdout.write(`Your ${ctx.credentialCount} credential(s) are in the local encrypted vault.\n` +
|
|
42
|
+
'Migrate to 1Password for team sharing and audit trails?\n\n');
|
|
43
|
+
let userChoice;
|
|
44
|
+
try {
|
|
45
|
+
const { select } = await import('@inquirer/prompts');
|
|
46
|
+
userChoice = await select({
|
|
47
|
+
message: 'Migrate to 1Password?',
|
|
48
|
+
choices: [
|
|
49
|
+
{ name: 'Yes, set up 1Password', value: 'yes' },
|
|
50
|
+
{ name: 'No, keep local vault', value: 'no' },
|
|
51
|
+
{ name: 'No, and do not ask again', value: 'never' },
|
|
52
|
+
],
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
if (userChoice === 'never') {
|
|
59
|
+
try {
|
|
60
|
+
const shared = await import('@opena2a/shared');
|
|
61
|
+
const mod = 'default' in shared ? shared.default : shared;
|
|
62
|
+
mod.setRememberedChoice('1password-skip', true);
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// ignore
|
|
66
|
+
}
|
|
67
|
+
process.stdout.write((0, colors_js_1.dim)('Noted. Enable later: opena2a protect --1password') + '\n');
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
if (userChoice === 'no') {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
// Step 2: Prerequisites
|
|
74
|
+
process.stdout.write('\n' + (0, colors_js_1.bold)('Prerequisites') + '\n\n');
|
|
75
|
+
process.stdout.write('Before migrating, you need:\n\n');
|
|
76
|
+
process.stdout.write(' 1. ' + (0, colors_js_1.bold)('1Password desktop app') + '\n');
|
|
77
|
+
process.stdout.write(' Download: ' + (0, colors_js_1.cyan)('https://1password.com/downloads') + '\n\n');
|
|
78
|
+
process.stdout.write(' 2. ' + (0, colors_js_1.bold)('Developer settings enabled') + '\n');
|
|
79
|
+
process.stdout.write(' 1Password > Settings > Developer > "Integrate with 1Password CLI"\n\n');
|
|
80
|
+
process.stdout.write(' 3. ' + (0, colors_js_1.bold)('1Password CLI') + '\n');
|
|
81
|
+
process.stdout.write(' Install: ' + (0, colors_js_1.cyan)('brew install 1password-cli') + '\n\n');
|
|
82
|
+
let ready = false;
|
|
83
|
+
try {
|
|
84
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
85
|
+
ready = await confirm({ message: 'Ready?', default: true });
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (!ready) {
|
|
91
|
+
process.stdout.write((0, colors_js_1.dim)('Run this flow again after setup: opena2a protect .') + '\n');
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
// Step 3: Verify 1Password CLI
|
|
95
|
+
const spinner = new spinner_js_1.Spinner('Checking 1Password CLI...');
|
|
96
|
+
spinner.start();
|
|
97
|
+
const opAvailable = await check1PasswordCli();
|
|
98
|
+
spinner.stop();
|
|
99
|
+
if (!opAvailable) {
|
|
100
|
+
process.stdout.write((0, colors_js_1.red)('1Password CLI not found or not authenticated.') + '\n');
|
|
101
|
+
process.stdout.write((0, colors_js_1.dim)('Install: brew install 1password-cli') + '\n');
|
|
102
|
+
process.stdout.write((0, colors_js_1.dim)('Then: op signin') + '\n');
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
process.stdout.write((0, colors_js_1.green)('1Password CLI verified.') + '\n\n');
|
|
106
|
+
// Step 4: Show plan
|
|
107
|
+
process.stdout.write((0, colors_js_1.cyan)('What will happen:') + '\n');
|
|
108
|
+
process.stdout.write(` 1. Create a "Secretless" vault in 1Password (if needed)\n`);
|
|
109
|
+
process.stdout.write(` 2. Copy ${ctx.credentialCount} secret(s) from local vault to 1Password\n`);
|
|
110
|
+
process.stdout.write(` 3. Set 1Password as the default Secretless backend\n\n`);
|
|
111
|
+
process.stdout.write((0, colors_js_1.dim)('If anything goes wrong:') + '\n');
|
|
112
|
+
process.stdout.write(` - Your local vault is preserved (not deleted)\n`);
|
|
113
|
+
process.stdout.write(` - Run: ${(0, colors_js_1.cyan)('secretless-ai backend set local')} to revert\n\n`);
|
|
114
|
+
let proceed = false;
|
|
115
|
+
try {
|
|
116
|
+
const { confirm } = await import('@inquirer/prompts');
|
|
117
|
+
proceed = await confirm({ message: 'Proceed with migration?', default: true });
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
if (!proceed) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
// Step 5: Execute migration
|
|
126
|
+
spinner.update('Migrating secrets to 1Password...');
|
|
127
|
+
spinner.start();
|
|
128
|
+
try {
|
|
129
|
+
const secretless = await Function('return import("secretless-ai")')();
|
|
130
|
+
const mod = 'default' in secretless ? secretless.default : secretless;
|
|
131
|
+
// Attempt migration
|
|
132
|
+
if (mod.migrateSecrets) {
|
|
133
|
+
const result = await mod.migrateSecrets('local', '1password', {
|
|
134
|
+
deleteFromSource: false,
|
|
135
|
+
});
|
|
136
|
+
spinner.stop();
|
|
137
|
+
const migrated = result?.migrated ?? 0;
|
|
138
|
+
const failed = result?.failed ?? 0;
|
|
139
|
+
if (failed > 0) {
|
|
140
|
+
process.stdout.write((0, colors_js_1.yellow)(`Migrated ${migrated}, failed ${failed} secret(s).`) + '\n');
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
process.stdout.write((0, colors_js_1.green)(`Successfully migrated ${migrated} secret(s) to 1Password.`) + '\n');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
spinner.stop();
|
|
148
|
+
process.stdout.write((0, colors_js_1.yellow)('Migration API not available in this version of secretless-ai.') + '\n');
|
|
149
|
+
process.stdout.write((0, colors_js_1.dim)('Update: npm install -g secretless-ai@latest') + '\n');
|
|
150
|
+
return false;
|
|
151
|
+
}
|
|
152
|
+
// Step 6: Set default backend
|
|
153
|
+
if (mod.setBackend) {
|
|
154
|
+
await mod.setBackend('1password');
|
|
155
|
+
process.stdout.write((0, colors_js_1.green)('Default backend set to 1Password.') + '\n');
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
spinner.stop();
|
|
161
|
+
process.stderr.write((0, colors_js_1.red)('Migration failed: ') + (err instanceof Error ? err.message : String(err)) + '\n');
|
|
162
|
+
process.stdout.write((0, colors_js_1.dim)('Your local vault is unchanged. Run: secretless-ai backend set local') + '\n');
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if 1Password CLI is installed and authenticated.
|
|
168
|
+
*/
|
|
169
|
+
async function check1PasswordCli() {
|
|
170
|
+
try {
|
|
171
|
+
const { execSync } = await import('node:child_process');
|
|
172
|
+
execSync('op account get', { stdio: 'pipe', timeout: 5000 });
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=onepassword-migration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onepassword-migration.js","sourceRoot":"","sources":["../../src/commands/onepassword-migration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opena2a protect — Detect credentials and migrate to Secretless vault.
|
|
3
|
+
*
|
|
4
|
+
* Flow:
|
|
5
|
+
* 1. Run HMA CRED + DRIFT checks on the target directory
|
|
6
|
+
* 2. For each detected credential with a raw value:
|
|
7
|
+
* a. Store in Secretless SecretStore
|
|
8
|
+
* b. Replace in source file with environment variable reference
|
|
9
|
+
* c. Register broker policy (default: deny-all, must be explicitly allowed)
|
|
10
|
+
* d. Add to .env.example
|
|
11
|
+
* 3. Re-run scan to verify clean
|
|
12
|
+
* 4. Output migration report
|
|
13
|
+
*/
|
|
14
|
+
export interface ProtectOptions {
|
|
15
|
+
/** Target directory to scan and protect */
|
|
16
|
+
targetDir: string;
|
|
17
|
+
/** Dry run mode (show what would change, don't modify) */
|
|
18
|
+
dryRun?: boolean;
|
|
19
|
+
/** Verbose output */
|
|
20
|
+
verbose?: boolean;
|
|
21
|
+
/** CI mode (no interactive prompts) */
|
|
22
|
+
ci?: boolean;
|
|
23
|
+
/** Output format */
|
|
24
|
+
format?: 'text' | 'json';
|
|
25
|
+
/** Skip verification re-scan */
|
|
26
|
+
skipVerify?: boolean;
|
|
27
|
+
/** Path to write interactive HTML report */
|
|
28
|
+
report?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Main protect command. Scans for credentials, migrates to vault, verifies clean.
|
|
32
|
+
*/
|
|
33
|
+
export declare function protect(options: ProtectOptions): Promise<number>;
|
|
34
|
+
//# sourceMappingURL=protect.d.ts.map
|