javi-forge 1.4.0 → 1.6.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/README.md +191 -3
- package/ci-local/hooks/pre-push +17 -13
- package/dist/commands/ci.d.ts +4 -0
- package/dist/commands/ci.d.ts.map +1 -1
- package/dist/commands/ci.js +97 -0
- package/dist/commands/ci.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +56 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plugin.d.ts +16 -0
- package/dist/commands/plugin.d.ts.map +1 -1
- package/dist/commands/plugin.js +70 -1
- package/dist/commands/plugin.js.map +1 -1
- package/dist/commands/security.d.ts +25 -0
- package/dist/commands/security.d.ts.map +1 -0
- package/dist/commands/security.js +305 -0
- package/dist/commands/security.js.map +1 -0
- package/dist/commands/skills.d.ts +82 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +510 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/tdd.d.ts +21 -0
- package/dist/commands/tdd.d.ts.map +1 -0
- package/dist/commands/tdd.js +117 -0
- package/dist/commands/tdd.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +132 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +156 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/agent-skills.d.ts +38 -0
- package/dist/lib/agent-skills.d.ts.map +1 -0
- package/dist/lib/agent-skills.js +111 -0
- package/dist/lib/agent-skills.js.map +1 -0
- package/dist/lib/claudemd.d.ts +8 -0
- package/dist/lib/claudemd.d.ts.map +1 -0
- package/dist/lib/claudemd.js +72 -0
- package/dist/lib/claudemd.js.map +1 -0
- package/dist/lib/codex-export.d.ts +16 -0
- package/dist/lib/codex-export.d.ts.map +1 -0
- package/dist/lib/codex-export.js +111 -0
- package/dist/lib/codex-export.js.map +1 -0
- package/dist/lib/context.d.ts +12 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +75 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/plugin.d.ts +13 -1
- package/dist/lib/plugin.d.ts.map +1 -1
- package/dist/lib/plugin.js +68 -0
- package/dist/lib/plugin.js.map +1 -1
- package/dist/types/index.d.ts +119 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/ui/App.d.ts.map +1 -1
- package/dist/ui/App.js +6 -0
- package/dist/ui/App.js.map +1 -1
- package/dist/ui/OptionSelector.d.ts +2 -0
- package/dist/ui/OptionSelector.d.ts.map +1 -1
- package/dist/ui/OptionSelector.js +6 -0
- package/dist/ui/OptionSelector.js.map +1 -1
- package/dist/ui/Plugin.d.ts +1 -1
- package/dist/ui/Plugin.d.ts.map +1 -1
- package/dist/ui/Plugin.js +18 -1
- package/dist/ui/Plugin.js.map +1 -1
- package/dist/ui/Skills.d.ts +11 -0
- package/dist/ui/Skills.d.ts.map +1 -0
- package/dist/ui/Skills.js +119 -0
- package/dist/ui/Skills.js.map +1 -0
- package/package.json +1 -1
package/dist/commands/plugin.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import { installPlugin, removePlugin, listInstalledPlugins, validatePlugin, searchRegistry, } from '../lib/plugin.js';
|
|
1
|
+
import { installPlugin, removePlugin, listInstalledPlugins, validatePlugin, searchRegistry, syncPlugins, } from '../lib/plugin.js';
|
|
2
|
+
import { exportPluginAsAgentSkills, importAgentSkillsPackage } from '../lib/agent-skills.js';
|
|
3
|
+
import { exportPluginAsCodexToml } from '../lib/codex-export.js';
|
|
2
4
|
function report(onStep, id, label, status, detail) {
|
|
3
5
|
onStep({ id, label, status, detail });
|
|
4
6
|
}
|
|
@@ -75,4 +77,71 @@ export async function runPluginValidate(pluginDir, onStep) {
|
|
|
75
77
|
report(onStep, stepId, `Validate plugin: ${pluginDir}`, 'error', `${result.errors.length} errors:\n${msgs}`);
|
|
76
78
|
}
|
|
77
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Sync detected plugins into the project manifest.
|
|
82
|
+
*/
|
|
83
|
+
export async function runPluginSync(projectDir, dryRun, onStep) {
|
|
84
|
+
const stepId = 'plugin-sync';
|
|
85
|
+
report(onStep, stepId, 'Sync plugins', 'running');
|
|
86
|
+
try {
|
|
87
|
+
const result = await syncPlugins(projectDir, { dryRun });
|
|
88
|
+
const parts = [];
|
|
89
|
+
if (result.added.length > 0)
|
|
90
|
+
parts.push(`added: ${result.added.join(', ')}`);
|
|
91
|
+
if (result.removed.length > 0)
|
|
92
|
+
parts.push(`removed: ${result.removed.join(', ')}`);
|
|
93
|
+
if (result.unchanged.length > 0)
|
|
94
|
+
parts.push(`unchanged: ${result.unchanged.join(', ')}`);
|
|
95
|
+
if (parts.length === 0)
|
|
96
|
+
parts.push('no plugins detected');
|
|
97
|
+
const prefix = dryRun ? 'dry-run: ' : '';
|
|
98
|
+
report(onStep, stepId, 'Sync plugins', 'done', `${prefix}${parts.join(' | ')}`);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
102
|
+
report(onStep, stepId, 'Sync plugins', 'error', msg);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Export an installed plugin to Agent Skills spec format.
|
|
107
|
+
*/
|
|
108
|
+
export async function runPluginExport(name, onStep) {
|
|
109
|
+
const stepId = 'plugin-export';
|
|
110
|
+
report(onStep, stepId, `Export plugin: ${name}`, 'running');
|
|
111
|
+
const result = await exportPluginAsAgentSkills(name);
|
|
112
|
+
if (result.success) {
|
|
113
|
+
report(onStep, stepId, `Export plugin: ${name}`, 'done', `exported to ${result.path}`);
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
report(onStep, stepId, `Export plugin: ${name}`, 'error', result.error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Export an installed plugin to Codex-compatible TOML subagent files.
|
|
121
|
+
*/
|
|
122
|
+
export async function runPluginExportCodex(name, onStep) {
|
|
123
|
+
const stepId = 'plugin-export-codex';
|
|
124
|
+
report(onStep, stepId, `Export plugin as Codex TOML: ${name}`, 'running');
|
|
125
|
+
const result = await exportPluginAsCodexToml(name);
|
|
126
|
+
if (result.success) {
|
|
127
|
+
report(onStep, stepId, `Export plugin as Codex TOML: ${name}`, 'done', `exported ${result.files.length} TOML file(s)`);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
report(onStep, stepId, `Export plugin as Codex TOML: ${name}`, 'error', result.error);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Import an Agent Skills spec package and convert to javi-forge plugin format.
|
|
135
|
+
*/
|
|
136
|
+
export async function runPluginImport(sourceDir, dryRun, onStep) {
|
|
137
|
+
const stepId = 'plugin-import';
|
|
138
|
+
report(onStep, stepId, `Import agent-skills package: ${sourceDir}`, 'running');
|
|
139
|
+
const result = await importAgentSkillsPackage(sourceDir, { dryRun });
|
|
140
|
+
if (result.success) {
|
|
141
|
+
report(onStep, stepId, `Import agent-skills package: ${sourceDir}`, 'done', dryRun ? `dry-run: would import ${result.name}` : `imported ${result.name}`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
report(onStep, stepId, `Import agent-skills package: ${sourceDir}`, 'error', result.error);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
78
147
|
//# sourceMappingURL=plugin.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EACL,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,cAAc,EACd,cAAc,
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/commands/plugin.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Stack, SecurityFinding, SecurityBaseline, SecurityCheckResult } from '../types/index.js';
|
|
2
|
+
export type SecurityMode = 'baseline' | 'check' | 'update';
|
|
3
|
+
export type SecurityStepStatus = 'pending' | 'running' | 'done' | 'error' | 'skipped';
|
|
4
|
+
export interface SecurityStep {
|
|
5
|
+
id: string;
|
|
6
|
+
label: string;
|
|
7
|
+
status: SecurityStepStatus;
|
|
8
|
+
detail?: string;
|
|
9
|
+
}
|
|
10
|
+
export type SecurityStepCallback = (step: SecurityStep) => void;
|
|
11
|
+
export declare function getAuditCommand(stack: Stack, buildTool: string): {
|
|
12
|
+
cmd: string;
|
|
13
|
+
args: string[];
|
|
14
|
+
} | null;
|
|
15
|
+
export declare function makeFindingKey(finding: SecurityFinding): string;
|
|
16
|
+
export declare function parseNpmAudit(raw: string): SecurityFinding[];
|
|
17
|
+
export declare function parsePipAudit(raw: string): SecurityFinding[];
|
|
18
|
+
export declare function parseCargoAudit(raw: string): SecurityFinding[];
|
|
19
|
+
export declare function parseGovulncheck(raw: string): SecurityFinding[];
|
|
20
|
+
export declare function parseAuditOutput(stack: Stack, raw: string): SecurityFinding[];
|
|
21
|
+
export declare function detectRegressions(baseline: SecurityBaseline, current: SecurityFinding[]): SecurityCheckResult;
|
|
22
|
+
export declare function readBaseline(projectDir: string): Promise<SecurityBaseline | null>;
|
|
23
|
+
export declare function writeBaseline(projectDir: string, baseline: SecurityBaseline): Promise<void>;
|
|
24
|
+
export declare function runSecurity(mode: SecurityMode, projectDir: string, onStep: SecurityStepCallback): Promise<SecurityCheckResult | null>;
|
|
25
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../src/commands/security.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAStG,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAA;AAE1D,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;AAErF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,kBAAkB,CAAA;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,oBAAoB,GAAG,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;AAc/D,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAiBvG;AAMD,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAE/D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAiC5D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAoB5D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAmB9D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAyB/D;AAaD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CAQ7E;AAMD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,mBAAmB,CAS7G;AAUD,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAQvF;AAED,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjG;AAoCD,wBAAsB,WAAW,CAC/B,IAAI,EAAE,YAAY,EAClB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAiFrC"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { detectCIStack } from './ci.js';
|
|
6
|
+
const execFileAsync = promisify(execFile);
|
|
7
|
+
// =============================================================================
|
|
8
|
+
// Constants
|
|
9
|
+
// =============================================================================
|
|
10
|
+
const BASELINE_DIR = '.javi-forge';
|
|
11
|
+
const BASELINE_FILE = 'security-baseline.json';
|
|
12
|
+
const BASELINE_VERSION = '1.0.0';
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Audit command resolution
|
|
15
|
+
// =============================================================================
|
|
16
|
+
export function getAuditCommand(stack, buildTool) {
|
|
17
|
+
switch (stack) {
|
|
18
|
+
case 'node':
|
|
19
|
+
switch (buildTool) {
|
|
20
|
+
case 'pnpm': return { cmd: 'pnpm', args: ['audit', '--json'] };
|
|
21
|
+
case 'yarn': return { cmd: 'yarn', args: ['npm', 'audit', '--json'] };
|
|
22
|
+
default: return { cmd: 'npm', args: ['audit', '--json'] };
|
|
23
|
+
}
|
|
24
|
+
case 'python':
|
|
25
|
+
return { cmd: 'pip-audit', args: ['--format=json', '--output=-'] };
|
|
26
|
+
case 'go':
|
|
27
|
+
return { cmd: 'govulncheck', args: ['-json', './...'] };
|
|
28
|
+
case 'rust':
|
|
29
|
+
return { cmd: 'cargo', args: ['audit', '--json'] };
|
|
30
|
+
default:
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// =============================================================================
|
|
35
|
+
// Audit output parsing
|
|
36
|
+
// =============================================================================
|
|
37
|
+
export function makeFindingKey(finding) {
|
|
38
|
+
return `${finding.id}:${finding.package}`;
|
|
39
|
+
}
|
|
40
|
+
export function parseNpmAudit(raw) {
|
|
41
|
+
const findings = [];
|
|
42
|
+
try {
|
|
43
|
+
const data = JSON.parse(raw);
|
|
44
|
+
// npm audit v2 JSON format: { vulnerabilities: { [name]: { ... } } }
|
|
45
|
+
const vulns = data.vulnerabilities ?? {};
|
|
46
|
+
for (const [pkgName, info] of Object.entries(vulns)) {
|
|
47
|
+
const v = info;
|
|
48
|
+
// via can contain objects (direct vulns) or strings (transitive refs)
|
|
49
|
+
const directVias = (v.via ?? []).filter((x) => typeof x === 'object');
|
|
50
|
+
if (directVias.length === 0) {
|
|
51
|
+
findings.push({
|
|
52
|
+
id: `npm-${pkgName}`,
|
|
53
|
+
severity: normalizeSeverity(v.severity),
|
|
54
|
+
package: pkgName,
|
|
55
|
+
title: `Vulnerability in ${pkgName}`,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
for (const via of directVias) {
|
|
60
|
+
findings.push({
|
|
61
|
+
id: via.source ? `GHSA-${via.source}` : `npm-${pkgName}`,
|
|
62
|
+
severity: normalizeSeverity(v.severity),
|
|
63
|
+
package: pkgName,
|
|
64
|
+
title: via.title ?? `Vulnerability in ${pkgName}`,
|
|
65
|
+
url: via.url,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// If JSON parse fails, return empty — audit tool may not be available
|
|
73
|
+
}
|
|
74
|
+
return findings;
|
|
75
|
+
}
|
|
76
|
+
export function parsePipAudit(raw) {
|
|
77
|
+
const findings = [];
|
|
78
|
+
try {
|
|
79
|
+
const data = JSON.parse(raw);
|
|
80
|
+
// pip-audit JSON: array of { name, version, vulns: [{ id, fix_versions, description }] }
|
|
81
|
+
const deps = Array.isArray(data) ? data : (data.dependencies ?? []);
|
|
82
|
+
for (const dep of deps) {
|
|
83
|
+
for (const vuln of (dep.vulns ?? [])) {
|
|
84
|
+
findings.push({
|
|
85
|
+
id: vuln.id ?? `pip-${dep.name}`,
|
|
86
|
+
severity: normalizeSeverity(vuln.fix_versions?.length ? 'high' : 'moderate'),
|
|
87
|
+
package: dep.name,
|
|
88
|
+
title: vuln.description ?? `Vulnerability in ${dep.name}`,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// empty
|
|
95
|
+
}
|
|
96
|
+
return findings;
|
|
97
|
+
}
|
|
98
|
+
export function parseCargoAudit(raw) {
|
|
99
|
+
const findings = [];
|
|
100
|
+
try {
|
|
101
|
+
const data = JSON.parse(raw);
|
|
102
|
+
const vulns = data.vulnerabilities?.list ?? [];
|
|
103
|
+
for (const v of vulns) {
|
|
104
|
+
const advisory = v.advisory ?? {};
|
|
105
|
+
findings.push({
|
|
106
|
+
id: advisory.id ?? `cargo-${v.package?.name ?? 'unknown'}`,
|
|
107
|
+
severity: normalizeSeverity(advisory.cvss?.severity),
|
|
108
|
+
package: v.package?.name ?? 'unknown',
|
|
109
|
+
title: advisory.title ?? `Vulnerability in ${v.package?.name ?? 'unknown'}`,
|
|
110
|
+
url: advisory.url,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// empty
|
|
116
|
+
}
|
|
117
|
+
return findings;
|
|
118
|
+
}
|
|
119
|
+
export function parseGovulncheck(raw) {
|
|
120
|
+
const findings = [];
|
|
121
|
+
try {
|
|
122
|
+
// govulncheck JSON outputs one JSON object per line (NDJSON)
|
|
123
|
+
const lines = raw.split('\n').filter(l => l.trim());
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
try {
|
|
126
|
+
const entry = JSON.parse(line);
|
|
127
|
+
if (entry.osv) {
|
|
128
|
+
findings.push({
|
|
129
|
+
id: entry.osv.id ?? 'unknown',
|
|
130
|
+
severity: normalizeSeverity(entry.osv.database_specific?.severity),
|
|
131
|
+
package: entry.osv.affected?.[0]?.package?.name ?? 'unknown',
|
|
132
|
+
title: entry.osv.summary ?? entry.osv.id ?? 'Go vulnerability',
|
|
133
|
+
url: entry.osv.references?.[0]?.url,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// skip non-JSON lines
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// empty
|
|
144
|
+
}
|
|
145
|
+
return findings;
|
|
146
|
+
}
|
|
147
|
+
function normalizeSeverity(raw) {
|
|
148
|
+
if (!raw)
|
|
149
|
+
return 'moderate';
|
|
150
|
+
const lower = raw.toLowerCase();
|
|
151
|
+
if (lower === 'critical')
|
|
152
|
+
return 'critical';
|
|
153
|
+
if (lower === 'high')
|
|
154
|
+
return 'high';
|
|
155
|
+
if (lower === 'moderate' || lower === 'medium')
|
|
156
|
+
return 'moderate';
|
|
157
|
+
if (lower === 'low')
|
|
158
|
+
return 'low';
|
|
159
|
+
if (lower === 'info' || lower === 'none')
|
|
160
|
+
return 'info';
|
|
161
|
+
return 'moderate';
|
|
162
|
+
}
|
|
163
|
+
export function parseAuditOutput(stack, raw) {
|
|
164
|
+
switch (stack) {
|
|
165
|
+
case 'node': return parseNpmAudit(raw);
|
|
166
|
+
case 'python': return parsePipAudit(raw);
|
|
167
|
+
case 'rust': return parseCargoAudit(raw);
|
|
168
|
+
case 'go': return parseGovulncheck(raw);
|
|
169
|
+
default: return [];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// =============================================================================
|
|
173
|
+
// Regression detection
|
|
174
|
+
// =============================================================================
|
|
175
|
+
export function detectRegressions(baseline, current) {
|
|
176
|
+
const baselineKeySet = new Set(baseline.findingKeys);
|
|
177
|
+
const currentKeys = current.map(makeFindingKey);
|
|
178
|
+
const currentKeySet = new Set(currentKeys);
|
|
179
|
+
const regressions = current.filter(f => !baselineKeySet.has(makeFindingKey(f)));
|
|
180
|
+
const resolved = baseline.findings.filter(f => !currentKeySet.has(makeFindingKey(f)));
|
|
181
|
+
return { baseline, current, regressions, resolved };
|
|
182
|
+
}
|
|
183
|
+
// =============================================================================
|
|
184
|
+
// Baseline file I/O
|
|
185
|
+
// =============================================================================
|
|
186
|
+
function baselinePath(projectDir) {
|
|
187
|
+
return path.join(projectDir, BASELINE_DIR, BASELINE_FILE);
|
|
188
|
+
}
|
|
189
|
+
export async function readBaseline(projectDir) {
|
|
190
|
+
const bp = baselinePath(projectDir);
|
|
191
|
+
if (!await fs.pathExists(bp))
|
|
192
|
+
return null;
|
|
193
|
+
try {
|
|
194
|
+
return await fs.readJson(bp);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
export async function writeBaseline(projectDir, baseline) {
|
|
201
|
+
const bp = baselinePath(projectDir);
|
|
202
|
+
await fs.ensureDir(path.dirname(bp));
|
|
203
|
+
await fs.writeJson(bp, baseline, { spaces: 2 });
|
|
204
|
+
}
|
|
205
|
+
// =============================================================================
|
|
206
|
+
// Run audit tool
|
|
207
|
+
// =============================================================================
|
|
208
|
+
async function runAuditTool(projectDir, auditCmd) {
|
|
209
|
+
try {
|
|
210
|
+
const { stdout } = await execFileAsync(auditCmd.cmd, auditCmd.args, {
|
|
211
|
+
cwd: projectDir,
|
|
212
|
+
timeout: 120_000,
|
|
213
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
214
|
+
});
|
|
215
|
+
return stdout;
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
// npm audit exits non-zero when vulns are found — that's expected
|
|
219
|
+
// We still want the stdout (JSON output)
|
|
220
|
+
if (err && typeof err === 'object' && 'stdout' in err) {
|
|
221
|
+
const stdout = err.stdout;
|
|
222
|
+
if (stdout && stdout.trim().length > 0)
|
|
223
|
+
return stdout;
|
|
224
|
+
}
|
|
225
|
+
throw err;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
// =============================================================================
|
|
229
|
+
// Main security commands
|
|
230
|
+
// =============================================================================
|
|
231
|
+
function report(onStep, id, label, status, detail) {
|
|
232
|
+
onStep({ id, label, status, detail });
|
|
233
|
+
}
|
|
234
|
+
export async function runSecurity(mode, projectDir, onStep) {
|
|
235
|
+
// ── Detect stack ────────────────────────────────────────────────────────
|
|
236
|
+
report(onStep, 'detect', 'Detecting stack', 'running');
|
|
237
|
+
let stackInfo;
|
|
238
|
+
try {
|
|
239
|
+
stackInfo = await detectCIStack(projectDir);
|
|
240
|
+
report(onStep, 'detect', `Stack: ${stackInfo.stackType} (${stackInfo.buildTool})`, 'done');
|
|
241
|
+
}
|
|
242
|
+
catch (e) {
|
|
243
|
+
report(onStep, 'detect', 'Detecting stack', 'error', String(e));
|
|
244
|
+
throw e;
|
|
245
|
+
}
|
|
246
|
+
// ── Resolve audit command ──────────────────────────────────────────────
|
|
247
|
+
const auditCmd = getAuditCommand(stackInfo.stackType, stackInfo.buildTool);
|
|
248
|
+
if (!auditCmd) {
|
|
249
|
+
report(onStep, 'audit', 'Security audit', 'error', `No audit tool for stack "${stackInfo.stackType}". Supported: node, python, go, rust`);
|
|
250
|
+
throw new Error(`Unsupported stack for security audit: ${stackInfo.stackType}`);
|
|
251
|
+
}
|
|
252
|
+
// ── Run audit ──────────────────────────────────────────────────────────
|
|
253
|
+
report(onStep, 'audit', `Running ${auditCmd.cmd} audit`, 'running');
|
|
254
|
+
let raw;
|
|
255
|
+
try {
|
|
256
|
+
raw = await runAuditTool(projectDir, auditCmd);
|
|
257
|
+
report(onStep, 'audit', `Audit complete`, 'done');
|
|
258
|
+
}
|
|
259
|
+
catch (e) {
|
|
260
|
+
report(onStep, 'audit', `Audit failed`, 'error', `${auditCmd.cmd} not found or failed. Install it first.`);
|
|
261
|
+
throw e;
|
|
262
|
+
}
|
|
263
|
+
// ── Parse findings ─────────────────────────────────────────────────────
|
|
264
|
+
const findings = parseAuditOutput(stackInfo.stackType, raw);
|
|
265
|
+
switch (mode) {
|
|
266
|
+
case 'baseline':
|
|
267
|
+
case 'update': {
|
|
268
|
+
report(onStep, 'save', mode === 'update' ? 'Updating baseline' : 'Creating baseline', 'running');
|
|
269
|
+
const baseline = {
|
|
270
|
+
version: BASELINE_VERSION,
|
|
271
|
+
createdAt: new Date().toISOString(),
|
|
272
|
+
stack: stackInfo.stackType,
|
|
273
|
+
buildTool: stackInfo.buildTool,
|
|
274
|
+
findings,
|
|
275
|
+
findingKeys: findings.map(makeFindingKey),
|
|
276
|
+
};
|
|
277
|
+
await writeBaseline(projectDir, baseline);
|
|
278
|
+
report(onStep, 'save', `Baseline saved with ${findings.length} finding(s)`, 'done', baselinePath(projectDir));
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
case 'check': {
|
|
282
|
+
report(onStep, 'check', 'Checking for regressions', 'running');
|
|
283
|
+
const existing = await readBaseline(projectDir);
|
|
284
|
+
if (!existing) {
|
|
285
|
+
report(onStep, 'check', 'No baseline found', 'error', 'Run `javi-forge security baseline` first to create a baseline');
|
|
286
|
+
throw new Error('No security baseline found. Run `javi-forge security baseline` first.');
|
|
287
|
+
}
|
|
288
|
+
const result = detectRegressions(existing, findings);
|
|
289
|
+
if (result.regressions.length === 0) {
|
|
290
|
+
const resolvedMsg = result.resolved.length > 0
|
|
291
|
+
? ` (${result.resolved.length} resolved)`
|
|
292
|
+
: '';
|
|
293
|
+
report(onStep, 'check', `No new vulnerabilities${resolvedMsg}`, 'done');
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
const details = result.regressions
|
|
297
|
+
.map(r => ` ${r.severity.toUpperCase()} ${r.package}: ${r.title}`)
|
|
298
|
+
.join('\n');
|
|
299
|
+
report(onStep, 'check', `${result.regressions.length} regression(s) found`, 'error', details);
|
|
300
|
+
}
|
|
301
|
+
return result;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/commands/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { SkillConflict, SkillBudgetResult, SkillDuplicate, SkillDoctorResult, SkillScore, SkillBenchmarkResult } from '../types/index.js';
|
|
2
|
+
/** Estimate token count from a string */
|
|
3
|
+
export declare function estimateTokens(text: string): number;
|
|
4
|
+
/** Read a SKILL.md and extract its name + critical rules section */
|
|
5
|
+
export declare function parseSkillFile(skillPath: string): Promise<{
|
|
6
|
+
name: string;
|
|
7
|
+
rules: string[];
|
|
8
|
+
rawContent: string;
|
|
9
|
+
triggers: string[];
|
|
10
|
+
} | null>;
|
|
11
|
+
/** Extract critical rules from markdown content */
|
|
12
|
+
export declare function extractCriticalRules(content: string): string[];
|
|
13
|
+
/** Extract trigger keywords from a skill description */
|
|
14
|
+
export declare function extractTriggers(description: string): string[];
|
|
15
|
+
/** Discover all SKILL.md files in a skills directory */
|
|
16
|
+
export declare function discoverSkills(skillsDir: string): Promise<string[]>;
|
|
17
|
+
/** Check if two rules contradict each other */
|
|
18
|
+
export declare function detectRuleConflict(ruleA: string, ruleB: string): string | null;
|
|
19
|
+
/** Scan all skills for conflicting critical rules */
|
|
20
|
+
export declare function findConflicts(skillsDir: string): Promise<SkillConflict[]>;
|
|
21
|
+
/** Calculate token budget for all installed skills */
|
|
22
|
+
export declare function calculateBudget(skillsDir: string, budget?: number): Promise<SkillBudgetResult>;
|
|
23
|
+
/** Find skills that overlap in scope/triggers */
|
|
24
|
+
export declare function findDuplicates(skillsDir: string): Promise<SkillDuplicate[]>;
|
|
25
|
+
export type SkillsDoctorMode = 'doctor' | 'budget';
|
|
26
|
+
export interface SkillsDoctorOptions {
|
|
27
|
+
mode: SkillsDoctorMode;
|
|
28
|
+
skillsDir?: string;
|
|
29
|
+
budget?: number;
|
|
30
|
+
deep?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run the skills doctor analysis.
|
|
34
|
+
* - `doctor --deep`: full conflict + budget + duplicate analysis
|
|
35
|
+
* - `budget -b N`: budget-only analysis with custom token limit
|
|
36
|
+
*/
|
|
37
|
+
export declare function runSkillsDoctor(options: SkillsDoctorOptions): Promise<SkillDoctorResult>;
|
|
38
|
+
/**
|
|
39
|
+
* Score completeness (0-100): frontmatter fields, critical rules, structure.
|
|
40
|
+
*/
|
|
41
|
+
export declare function scoreCompleteness(parsed: {
|
|
42
|
+
name: string;
|
|
43
|
+
rules: string[];
|
|
44
|
+
rawContent: string;
|
|
45
|
+
triggers: string[];
|
|
46
|
+
}): number;
|
|
47
|
+
/**
|
|
48
|
+
* Score clarity (0-100): description quality, rule actionability, no vague terms.
|
|
49
|
+
*/
|
|
50
|
+
export declare function scoreClarity(parsed: {
|
|
51
|
+
name: string;
|
|
52
|
+
rules: string[];
|
|
53
|
+
rawContent: string;
|
|
54
|
+
triggers: string[];
|
|
55
|
+
}): number;
|
|
56
|
+
/**
|
|
57
|
+
* Score testability (0-100): Given/When/Then scenarios, specific rules.
|
|
58
|
+
*/
|
|
59
|
+
export declare function scoreTestability(parsed: {
|
|
60
|
+
name: string;
|
|
61
|
+
rules: string[];
|
|
62
|
+
rawContent: string;
|
|
63
|
+
triggers: string[];
|
|
64
|
+
}): number;
|
|
65
|
+
/**
|
|
66
|
+
* Score token efficiency (0-100): information density (rules per 1000 tokens).
|
|
67
|
+
*/
|
|
68
|
+
export declare function scoreTokenEfficiency(parsed: {
|
|
69
|
+
name: string;
|
|
70
|
+
rules: string[];
|
|
71
|
+
rawContent: string;
|
|
72
|
+
triggers: string[];
|
|
73
|
+
}): number;
|
|
74
|
+
/**
|
|
75
|
+
* Score a skill on all 4 dimensions and compute overall.
|
|
76
|
+
*/
|
|
77
|
+
export declare function scoreSkill(skillPath: string, threshold?: number): Promise<SkillScore | null>;
|
|
78
|
+
/**
|
|
79
|
+
* Run structural quality benchmark checks against a skill.
|
|
80
|
+
*/
|
|
81
|
+
export declare function benchmarkSkill(skillPath: string): Promise<SkillBenchmarkResult | null>;
|
|
82
|
+
//# sourceMappingURL=skills.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"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"}
|