@vyuhlabs/dxkit 2.1.0 → 2.2.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/CHANGELOG.md +92 -0
- package/README.md +9 -9
- package/dist/agents/extract.d.ts +25 -0
- package/dist/agents/extract.d.ts.map +1 -0
- package/dist/agents/extract.js +186 -0
- package/dist/agents/extract.js.map +1 -0
- package/dist/agents/schemas.d.ts +106 -0
- package/dist/agents/schemas.d.ts.map +1 -0
- package/dist/agents/schemas.js +86 -0
- package/dist/agents/schemas.js.map +1 -0
- package/dist/agents/session.d.ts +28 -0
- package/dist/agents/session.d.ts.map +1 -0
- package/dist/agents/session.js +223 -0
- package/dist/agents/session.js.map +1 -0
- package/dist/analyzers/bom/gather.d.ts +12 -1
- package/dist/analyzers/bom/gather.d.ts.map +1 -1
- package/dist/analyzers/bom/gather.js +46 -0
- package/dist/analyzers/bom/gather.js.map +1 -1
- package/dist/analyzers/bom/index.d.ts.map +1 -1
- package/dist/analyzers/bom/index.js +37 -0
- package/dist/analyzers/bom/index.js.map +1 -1
- package/dist/analyzers/bom/types.d.ts +20 -0
- package/dist/analyzers/bom/types.d.ts.map +1 -1
- package/dist/analyzers/index.d.ts +3 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +6 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/security/report.d.ts +6 -0
- package/dist/analyzers/security/report.d.ts.map +1 -0
- package/dist/analyzers/security/report.js +118 -0
- package/dist/analyzers/security/report.js.map +1 -0
- package/dist/analyzers/tools/dotnet.d.ts +8 -0
- package/dist/analyzers/tools/dotnet.d.ts.map +1 -0
- package/dist/analyzers/tools/dotnet.js +81 -0
- package/dist/analyzers/tools/dotnet.js.map +1 -0
- package/dist/analyzers/tools/gather-cache.d.ts +16 -0
- package/dist/analyzers/tools/gather-cache.d.ts.map +1 -0
- package/dist/analyzers/tools/gather-cache.js +126 -0
- package/dist/analyzers/tools/gather-cache.js.map +1 -0
- package/dist/analyzers/tools/go.d.ts +8 -0
- package/dist/analyzers/tools/go.d.ts.map +1 -0
- package/dist/analyzers/tools/go.js +84 -0
- package/dist/analyzers/tools/go.js.map +1 -0
- package/dist/analyzers/tools/node.d.ts +8 -0
- package/dist/analyzers/tools/node.d.ts.map +1 -0
- package/dist/analyzers/tools/node.js +160 -0
- package/dist/analyzers/tools/node.js.map +1 -0
- package/dist/analyzers/tools/python.d.ts +8 -0
- package/dist/analyzers/tools/python.d.ts.map +1 -0
- package/dist/analyzers/tools/python.js +81 -0
- package/dist/analyzers/tools/python.js.map +1 -0
- package/dist/analyzers/tools/rust.d.ts +8 -0
- package/dist/analyzers/tools/rust.d.ts.map +1 -0
- package/dist/analyzers/tools/rust.js +86 -0
- package/dist/analyzers/tools/rust.js.map +1 -0
- package/dist/analyzers/xlsx/bom.d.ts.map +1 -1
- package/dist/analyzers/xlsx/bom.js +11 -1
- package/dist/analyzers/xlsx/bom.js.map +1 -1
- package/dist/languages/capabilities/types.d.ts +1 -0
- package/dist/languages/capabilities/types.d.ts.map +1 -1
- package/dist/languages/csharp.d.ts +41 -6
- package/dist/languages/csharp.d.ts.map +1 -1
- package/dist/languages/csharp.js +225 -35
- package/dist/languages/csharp.js.map +1 -1
- package/dist/languages/go.d.ts +35 -0
- package/dist/languages/go.d.ts.map +1 -1
- package/dist/languages/go.js +156 -0
- package/dist/languages/go.js.map +1 -1
- package/dist/languages/python.d.ts +49 -0
- package/dist/languages/python.d.ts.map +1 -1
- package/dist/languages/python.js +202 -17
- package/dist/languages/python.js.map +1 -1
- package/dist/languages/rust.d.ts +15 -0
- package/dist/languages/rust.d.ts.map +1 -1
- package/dist/languages/rust.js +93 -0
- package/dist/languages/rust.js.map +1 -1
- package/dist/languages/typescript.d.ts +17 -0
- package/dist/languages/typescript.d.ts.map +1 -1
- package/dist/languages/typescript.js +106 -0
- package/dist/languages/typescript.js.map +1 -1
- package/package.json +1 -1
- package/templates/.ai/templates/session-checkpoint-template.md +97 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Managed Agent session orchestration.
|
|
4
|
+
*
|
|
5
|
+
* Creates sessions, mounts repos, sends tasks, streams results.
|
|
6
|
+
* Requires @anthropic-ai/sdk and ANTHROPIC_API_KEY.
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
42
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
43
|
+
};
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.loadConfig = loadConfig;
|
|
46
|
+
exports.setupAgents = setupAgents;
|
|
47
|
+
exports.listAgents = listAgents;
|
|
48
|
+
exports.runAgent = runAgent;
|
|
49
|
+
const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const path = __importStar(require("path"));
|
|
52
|
+
const extract_1 = require("./extract");
|
|
53
|
+
const logger = __importStar(require("../logger"));
|
|
54
|
+
const CONFIG_FILE = '.dxkit-agents.json';
|
|
55
|
+
/** Load agent config from disk. */
|
|
56
|
+
function loadConfig(cwd) {
|
|
57
|
+
const configPath = path.join(cwd, CONFIG_FILE);
|
|
58
|
+
if (!fs.existsSync(configPath))
|
|
59
|
+
return null;
|
|
60
|
+
try {
|
|
61
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf-8'));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/** Save agent config to disk. */
|
|
68
|
+
function saveConfig(cwd, config) {
|
|
69
|
+
fs.writeFileSync(path.join(cwd, CONFIG_FILE), JSON.stringify(config, null, 2));
|
|
70
|
+
}
|
|
71
|
+
/** Simple hash for change detection. */
|
|
72
|
+
function hashPrompt(content) {
|
|
73
|
+
let hash = 0;
|
|
74
|
+
for (let i = 0; i < content.length; i++) {
|
|
75
|
+
const char = content.charCodeAt(i);
|
|
76
|
+
hash = (hash << 5) - hash + char;
|
|
77
|
+
hash |= 0;
|
|
78
|
+
}
|
|
79
|
+
return `hash:${hash.toString(36)}`;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Set up all agents on Anthropic's infrastructure.
|
|
83
|
+
* Creates an environment and one agent per template.
|
|
84
|
+
*/
|
|
85
|
+
async function setupAgents(cwd, modelOverride) {
|
|
86
|
+
const client = new sdk_1.default();
|
|
87
|
+
logger.header('Setting up Managed Agents');
|
|
88
|
+
// Create environment
|
|
89
|
+
logger.info('Creating environment...');
|
|
90
|
+
const env = await client.beta.environments.create({
|
|
91
|
+
name: `dxkit-${Date.now()}`,
|
|
92
|
+
config: {
|
|
93
|
+
type: 'cloud',
|
|
94
|
+
networking: { type: 'unrestricted' },
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
logger.success(`Environment: ${env.id}`);
|
|
98
|
+
// Create agents from templates
|
|
99
|
+
const templates = (0, extract_1.listAgentTemplates)();
|
|
100
|
+
const agents = {};
|
|
101
|
+
for (const name of templates) {
|
|
102
|
+
const extracted = (0, extract_1.extractAgent)(name, modelOverride);
|
|
103
|
+
logger.info(`Creating agent: ${extracted.name}...`);
|
|
104
|
+
try {
|
|
105
|
+
const agent = await client.beta.agents.create({
|
|
106
|
+
name: extracted.name,
|
|
107
|
+
model: extracted.model,
|
|
108
|
+
system: extracted.systemPrompt,
|
|
109
|
+
tools: extracted.tools,
|
|
110
|
+
});
|
|
111
|
+
agents[name] = {
|
|
112
|
+
agent_id: agent.id,
|
|
113
|
+
agent_version: String(agent.version),
|
|
114
|
+
prompt_hash: hashPrompt(extracted.systemPrompt),
|
|
115
|
+
};
|
|
116
|
+
logger.success(` ${extracted.name} → ${agent.id}`);
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
logger.warn(` Failed to create ${extracted.name}: ${err instanceof Error ? err.message : err}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const config = {
|
|
123
|
+
version: '1.5.1',
|
|
124
|
+
environment_id: env.id,
|
|
125
|
+
agents,
|
|
126
|
+
};
|
|
127
|
+
saveConfig(cwd, config);
|
|
128
|
+
logger.success(`\nConfig saved to ${CONFIG_FILE}`);
|
|
129
|
+
logger.info(`${Object.keys(agents).length} agents created.`);
|
|
130
|
+
return config;
|
|
131
|
+
}
|
|
132
|
+
/** List registered agents. */
|
|
133
|
+
function listAgents(cwd) {
|
|
134
|
+
const config = loadConfig(cwd);
|
|
135
|
+
if (!config) {
|
|
136
|
+
logger.warn('No agents configured. Run: npx @vyuhlabs/dxkit agents setup');
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
logger.header('Registered Agents');
|
|
140
|
+
logger.info(`Environment: ${config.environment_id}`);
|
|
141
|
+
console.log('');
|
|
142
|
+
for (const [name, agent] of Object.entries(config.agents)) {
|
|
143
|
+
console.log(` ${name.padEnd(25)} ${agent.agent_id}`);
|
|
144
|
+
}
|
|
145
|
+
console.log(`\n ${Object.keys(config.agents).length} agents total.`);
|
|
146
|
+
}
|
|
147
|
+
/** Run an agent session on a GitHub repo. */
|
|
148
|
+
async function runAgent(cwd, agentType, repoUrl, githubToken, branch, task) {
|
|
149
|
+
const config = loadConfig(cwd);
|
|
150
|
+
if (!config) {
|
|
151
|
+
throw new Error('No agents configured. Run: npx @vyuhlabs/dxkit agents setup');
|
|
152
|
+
}
|
|
153
|
+
const agentDef = config.agents[agentType];
|
|
154
|
+
if (!agentDef) {
|
|
155
|
+
throw new Error(`Unknown agent: ${agentType}. Available: ${Object.keys(config.agents).join(', ')}`);
|
|
156
|
+
}
|
|
157
|
+
const client = new sdk_1.default();
|
|
158
|
+
logger.info(`Running ${agentType} on ${repoUrl}...`);
|
|
159
|
+
// Create session with repo mounted
|
|
160
|
+
const session = await client.beta.sessions.create({
|
|
161
|
+
agent: {
|
|
162
|
+
type: 'agent',
|
|
163
|
+
id: agentDef.agent_id,
|
|
164
|
+
version: Number(agentDef.agent_version),
|
|
165
|
+
},
|
|
166
|
+
environment_id: config.environment_id,
|
|
167
|
+
resources: [
|
|
168
|
+
{
|
|
169
|
+
type: 'github_repository',
|
|
170
|
+
url: repoUrl,
|
|
171
|
+
authorization_token: githubToken,
|
|
172
|
+
checkout: branch ? { type: 'branch', name: branch } : undefined,
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
logger.info(`Session: ${session.id}`);
|
|
177
|
+
// Send task
|
|
178
|
+
const taskMessage = task || 'Analyze this codebase thoroughly and return your findings as JSON.';
|
|
179
|
+
// Open stream first, then send message
|
|
180
|
+
const stream = await client.beta.sessions.events.stream(session.id);
|
|
181
|
+
await client.beta.sessions.events.send(session.id, {
|
|
182
|
+
events: [
|
|
183
|
+
{
|
|
184
|
+
type: 'user.message',
|
|
185
|
+
content: [{ type: 'text', text: taskMessage }],
|
|
186
|
+
},
|
|
187
|
+
],
|
|
188
|
+
});
|
|
189
|
+
// Collect output
|
|
190
|
+
let output = '';
|
|
191
|
+
let lastEventType = '';
|
|
192
|
+
for await (const event of stream) {
|
|
193
|
+
if (event.type === 'agent.message') {
|
|
194
|
+
for (const block of event.content) {
|
|
195
|
+
if (block.type === 'text' && block.text) {
|
|
196
|
+
output += block.text;
|
|
197
|
+
process.stdout.write('.');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (event.type === 'session.status_idle') {
|
|
202
|
+
const idleEvent = event;
|
|
203
|
+
if (idleEvent.stop_reason?.type !== 'requires_action') {
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
else if (event.type === 'session.status_terminated') {
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
lastEventType = event.type;
|
|
211
|
+
}
|
|
212
|
+
console.log(''); // newline after dots
|
|
213
|
+
logger.success(`Session completed (last event: ${lastEventType})`);
|
|
214
|
+
// Cleanup
|
|
215
|
+
try {
|
|
216
|
+
await client.beta.sessions.archive(session.id);
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// Archive may fail if session is already terminated
|
|
220
|
+
}
|
|
221
|
+
return output;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/agents/session.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyBH,gCAQC;AAsBD,kCAsDC;AAGD,gCAeC;AAGD,4BA8FC;AA9ND,4DAA0C;AAC1C,uCAAyB;AACzB,2CAA6B;AAC7B,uCAA6D;AAC7D,kDAAoC;AAgBpC,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAEzC,mCAAmC;AACnC,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,SAAS,UAAU,CAAC,GAAW,EAAE,MAAmB;IAClD,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjF,CAAC;AAED,wCAAwC;AACxC,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QACjC,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,WAAW,CAAC,GAAW,EAAE,aAAsB;IACnE,MAAM,MAAM,GAAG,IAAI,aAAS,EAAE,CAAC;IAE/B,MAAM,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC;IAE3C,qBAAqB;IACrB,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;QAChD,IAAI,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE;QAC3B,MAAM,EAAE;YACN,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;SACrC;KACF,CAAC,CAAC;IACH,MAAM,CAAC,OAAO,CAAC,gBAAgB,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAEzC,+BAA+B;IAC/B,MAAM,SAAS,GAAG,IAAA,4BAAkB,GAAE,CAAC;IACvC,MAAM,MAAM,GAA0B,EAAE,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,aAAa,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,mBAAmB,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC;QAEpD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBAC5C,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,MAAM,EAAE,SAAS,CAAC,YAAY;gBAC9B,KAAK,EAAE,SAAS,CAAC,KAAyD;aAC3E,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,GAAG;gBACb,QAAQ,EAAE,KAAK,CAAC,EAAE;gBAClB,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;gBACpC,WAAW,EAAE,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC;aAChD,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,IAAI,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,sBAAsB,SAAS,CAAC,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACnG,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAgB;QAC1B,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,GAAG,CAAC,EAAE;QACtB,MAAM;KACP,CAAC;IAEF,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,OAAO,CAAC,qBAAqB,WAAW,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,kBAAkB,CAAC,CAAC;IAE7D,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8BAA8B;AAC9B,SAAgB,UAAU,CAAC,GAAW;IACpC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACnC,MAAM,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,gBAAgB,CAAC,CAAC;AACxE,CAAC;AAED,6CAA6C;AACtC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,SAAiB,EACjB,OAAe,EACf,WAAmB,EACnB,MAAe,EACf,IAAa;IAEb,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,kBAAkB,SAAS,gBAAgB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACnF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,aAAS,EAAE,CAAC;IAE/B,MAAM,CAAC,IAAI,CAAC,WAAW,SAAS,OAAO,OAAO,KAAK,CAAC,CAAC;IAErD,mCAAmC;IACnC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChD,KAAK,EAAE;YACL,IAAI,EAAE,OAAO;YACb,EAAE,EAAE,QAAQ,CAAC,QAAQ;YACrB,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC;SACxC;QACD,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,mBAAmB;gBACzB,GAAG,EAAE,OAAO;gBACZ,mBAAmB,EAAE,WAAW;gBAChC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;aAChE;SACF;KACF,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAEtC,YAAY;IACZ,MAAM,WAAW,GACf,IAAI,IAAI,oEAAoE,CAAC;IAE/E,uCAAuC;IACvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAEpE,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE;QACjD,MAAM,EAAE;YACN;gBACE,IAAI,EAAE,cAAc;gBACpB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;aAC/C;SACF;KACF,CAAC,CAAC;IAEH,iBAAiB;IACjB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,aAAa,GAAG,EAAE,CAAC;IAEvB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACnC,KAAK,MAAM,KAAK,IAAK,KAA6D,CAAC,OAAO,EAAE,CAAC;gBAC3F,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;oBACxC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC;oBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;YAChD,MAAM,SAAS,GAAG,KAA2C,CAAC;YAC9D,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACtD,MAAM;YACR,CAAC;QACH,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,2BAA2B,EAAE,CAAC;YACtD,MAAM;QACR,CAAC;QACD,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB;IACtC,MAAM,CAAC,OAAO,CAAC,kCAAkC,aAAa,GAAG,CAAC,CAAC;IAEnE,UAAU;IACV,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,oDAAoD;IACtD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* result sets to build a per-package join keyed by `package@version`.
|
|
6
6
|
*/
|
|
7
7
|
import type { DepVulnFinding } from '../../languages/capabilities/types';
|
|
8
|
-
import type { BomEntry } from './types';
|
|
8
|
+
import type { BomEntry, BomTopLevelRollup } from './types';
|
|
9
9
|
/**
|
|
10
10
|
* Compare two version strings as semver triples. Strips a leading
|
|
11
11
|
* 'v' (Go-pack convention) and compares dot-separated numeric
|
|
@@ -29,6 +29,17 @@ export declare function maxSemver(versions: string[]): string;
|
|
|
29
29
|
* picks the richest available value per package.
|
|
30
30
|
*/
|
|
31
31
|
export declare function deriveTier1Resolution(vulns: DepVulnFinding[]): string;
|
|
32
|
+
/**
|
|
33
|
+
* Build the per-top-level-dep rollup from a flat list of entries.
|
|
34
|
+
* Walks every advisory under every entry; increments the counter for
|
|
35
|
+
* each top-level the advisory lists (a vuln reachable from two
|
|
36
|
+
* top-levels increments both, matching Snyk's grouping semantics).
|
|
37
|
+
*
|
|
38
|
+
* Entries with no topLevelDep attribution contribute nothing — the
|
|
39
|
+
* rollup is best-effort based on what each pack populates. Pure
|
|
40
|
+
* function; unit-testable.
|
|
41
|
+
*/
|
|
42
|
+
export declare function buildByTopLevelDep(entries: BomEntry[]): Record<string, BomTopLevelRollup>;
|
|
32
43
|
/**
|
|
33
44
|
* Join LICENSES + DEP_VULNS by (package, version). Strategy:
|
|
34
45
|
* - Primary index: package@version. Both LicenseFinding and
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/analyzers/bom/gather.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,oCAAoC,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"gather.d.ts","sourceRoot":"","sources":["../../../src/analyzers/bom/gather.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,oCAAoC,CAAC;AACzF,OAAO,KAAK,EAAE,QAAQ,EAAe,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIxE;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB1D;AAED;mDACmD;AACnD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAGpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,MAAM,CAQrE;AAYD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAkCzF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiF5E"}
|
|
@@ -9,6 +9,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.compareSemver = compareSemver;
|
|
10
10
|
exports.maxSemver = maxSemver;
|
|
11
11
|
exports.deriveTier1Resolution = deriveTier1Resolution;
|
|
12
|
+
exports.buildByTopLevelDep = buildByTopLevelDep;
|
|
12
13
|
exports.gatherBomEntries = gatherBomEntries;
|
|
13
14
|
const gather_1 = require("../licenses/gather");
|
|
14
15
|
const gather_2 = require("../security/gather");
|
|
@@ -78,6 +79,51 @@ function maxSeverityOf(vulns) {
|
|
|
78
79
|
}
|
|
79
80
|
return best;
|
|
80
81
|
}
|
|
82
|
+
/**
|
|
83
|
+
* Build the per-top-level-dep rollup from a flat list of entries.
|
|
84
|
+
* Walks every advisory under every entry; increments the counter for
|
|
85
|
+
* each top-level the advisory lists (a vuln reachable from two
|
|
86
|
+
* top-levels increments both, matching Snyk's grouping semantics).
|
|
87
|
+
*
|
|
88
|
+
* Entries with no topLevelDep attribution contribute nothing — the
|
|
89
|
+
* rollup is best-effort based on what each pack populates. Pure
|
|
90
|
+
* function; unit-testable.
|
|
91
|
+
*/
|
|
92
|
+
function buildByTopLevelDep(entries) {
|
|
93
|
+
const accum = new Map();
|
|
94
|
+
for (const e of entries) {
|
|
95
|
+
for (const v of e.vulns) {
|
|
96
|
+
const tops = v.topLevelDep;
|
|
97
|
+
if (!tops || tops.length === 0)
|
|
98
|
+
continue;
|
|
99
|
+
for (const top of tops) {
|
|
100
|
+
const cur = accum.get(top);
|
|
101
|
+
if (!cur) {
|
|
102
|
+
accum.set(top, {
|
|
103
|
+
advisoryCount: 1,
|
|
104
|
+
maxSeverity: v.severity,
|
|
105
|
+
packages: new Set([e.package]),
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
cur.advisoryCount++;
|
|
110
|
+
if (SEV_RANK[v.severity] < SEV_RANK[cur.maxSeverity])
|
|
111
|
+
cur.maxSeverity = v.severity;
|
|
112
|
+
cur.packages.add(e.package);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const out = {};
|
|
118
|
+
for (const [top, data] of accum) {
|
|
119
|
+
out[top] = {
|
|
120
|
+
advisoryCount: data.advisoryCount,
|
|
121
|
+
maxSeverity: data.maxSeverity,
|
|
122
|
+
packages: [...data.packages].sort(),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
return out;
|
|
126
|
+
}
|
|
81
127
|
async function gatherBomEntries(cwd) {
|
|
82
128
|
const [licensesEnv, depVulns] = await Promise.all([
|
|
83
129
|
(0, gather_1.gatherLicensesResult)(cwd),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/analyzers/bom/gather.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAgBH,sCAgBC;AAID,8BAGC;AAaD,sDAQC;
|
|
1
|
+
{"version":3,"file":"gather.js","sourceRoot":"","sources":["../../../src/analyzers/bom/gather.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/bom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAY,SAAS,EAAe,MAAM,SAAS,CAAC;AAEhE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,iBAAsB,GAC/B,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/bom/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,KAAK,EAAY,SAAS,EAAe,MAAM,SAAS,CAAC;AAEhE,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,iBAAsB,GAC/B,OAAO,CAAC,SAAS,CAAC,CAsCpB;AASD,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CA8I1E"}
|
|
@@ -86,6 +86,7 @@ async function analyzeBom(repoPath, _options = {}) {
|
|
|
86
86
|
actionableVulns,
|
|
87
87
|
totalAdvisories,
|
|
88
88
|
vulnOnlyPackages,
|
|
89
|
+
byTopLevelDep: (0, gather_1.buildByTopLevelDep)(entries),
|
|
89
90
|
},
|
|
90
91
|
entries,
|
|
91
92
|
toolsUsed,
|
|
@@ -142,6 +143,42 @@ function formatBomReport(report, elapsed) {
|
|
|
142
143
|
}
|
|
143
144
|
L.push('---');
|
|
144
145
|
L.push('');
|
|
146
|
+
// Snyk-style top-level dep rollup — upgrade-oriented view answering
|
|
147
|
+
// "which single `npm install X` / `go get Y` resolves the most
|
|
148
|
+
// advisories". Only rendered when at least one finding carried
|
|
149
|
+
// topLevelDep attribution (packs that can't parse a lockfile/graph
|
|
150
|
+
// simply don't populate it).
|
|
151
|
+
const topLevelEntries = Object.entries(s.byTopLevelDep);
|
|
152
|
+
if (topLevelEntries.length > 0) {
|
|
153
|
+
L.push('## Top-Level Dep Groups');
|
|
154
|
+
L.push('');
|
|
155
|
+
L.push('Grouped by direct manifest dep so each row is one upgrade decision. ' +
|
|
156
|
+
'Sorted by severity, then advisory count — the top row is the single ' +
|
|
157
|
+
'upgrade that resolves the most critical/highest-volume issues.');
|
|
158
|
+
L.push('');
|
|
159
|
+
const SEV_RANK = { critical: 0, high: 1, medium: 2, low: 3 };
|
|
160
|
+
const sorted = topLevelEntries.sort((a, b) => SEV_RANK[a[1].maxSeverity] - SEV_RANK[b[1].maxSeverity] ||
|
|
161
|
+
b[1].advisoryCount - a[1].advisoryCount ||
|
|
162
|
+
a[0].localeCompare(b[0]));
|
|
163
|
+
const cap = 30;
|
|
164
|
+
const shown = sorted.slice(0, cap);
|
|
165
|
+
L.push('| Worst Severity | Top-Level Dep | Advisories | Vulnerable Packages |');
|
|
166
|
+
L.push('|----------------|---------------|-----------:|---------------------|');
|
|
167
|
+
for (const [top, r] of shown) {
|
|
168
|
+
const pkgCap = 8;
|
|
169
|
+
const pkgList = r.packages.length > pkgCap
|
|
170
|
+
? `${r.packages.slice(0, pkgCap).join(', ')}, +${r.packages.length - pkgCap} more`
|
|
171
|
+
: r.packages.join(', ');
|
|
172
|
+
L.push(`| ${SEV_BADGE[r.maxSeverity]} | \`${top}\` | ${r.advisoryCount} | ${pkgList} |`);
|
|
173
|
+
}
|
|
174
|
+
if (sorted.length > cap) {
|
|
175
|
+
L.push('');
|
|
176
|
+
L.push(`_Showing ${cap} of ${sorted.length} top-level deps with rolled-up advisories._`);
|
|
177
|
+
}
|
|
178
|
+
L.push('');
|
|
179
|
+
L.push('---');
|
|
180
|
+
L.push('');
|
|
181
|
+
}
|
|
145
182
|
// Vulnerable packages section — worst-first, one row per package
|
|
146
183
|
if (s.vulnerablePackages > 0) {
|
|
147
184
|
L.push('## Vulnerable Packages');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/bom/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcH,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/bom/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -35,6 +35,21 @@ export interface BomEntry {
|
|
|
35
35
|
* user can decide whether to trust the license=UNKNOWN row. */
|
|
36
36
|
joinedFromBoth: boolean;
|
|
37
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Per-top-level-dep aggregation. A single advisory may roll up under
|
|
40
|
+
* multiple top-levels (e.g. lodash reachable from 20 loopback packages),
|
|
41
|
+
* in which case each top-level's `advisoryCount` increments by one.
|
|
42
|
+
* Matches Snyk's UI rollup: "@loopback/cli has 49 advisories".
|
|
43
|
+
*/
|
|
44
|
+
export interface BomTopLevelRollup {
|
|
45
|
+
/** Total advisories rolled up under this top-level. */
|
|
46
|
+
advisoryCount: number;
|
|
47
|
+
/** Highest severity across all rolled-up advisories. */
|
|
48
|
+
maxSeverity: BomSeverity;
|
|
49
|
+
/** Distinct vulnerable package names reachable under this top-level.
|
|
50
|
+
* Rendered in markdown as a comma-joined list; cap in renderer. */
|
|
51
|
+
packages: string[];
|
|
52
|
+
}
|
|
38
53
|
export interface BomReport {
|
|
39
54
|
repo: string;
|
|
40
55
|
analyzedAt: string;
|
|
@@ -63,6 +78,11 @@ export interface BomReport {
|
|
|
63
78
|
/** Packages found only by a vuln scanner — license scanner
|
|
64
79
|
* missed them. See BomEntry.joinedFromBoth. */
|
|
65
80
|
vulnOnlyPackages: number;
|
|
81
|
+
/** Snyk-style upgrade-oriented grouping: per-top-level-dep rollup
|
|
82
|
+
* built from `vulns[].topLevelDep`. Empty when no findings carry
|
|
83
|
+
* topLevelDep attribution (e.g. pre-10h.4 packs or projects
|
|
84
|
+
* without a parseable dep graph). */
|
|
85
|
+
byTopLevelDep: Record<string, BomTopLevelRollup>;
|
|
66
86
|
};
|
|
67
87
|
entries: ReadonlyArray<BomEntry>;
|
|
68
88
|
toolsUsed: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/bom/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEjE,MAAM,WAAW,QAAQ;IAEvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAGhB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,KAAK,EAAE,cAAc,EAAE,CAAC;IAExB;uEACmE;IACnE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAEhC;;;gDAG4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;oEAIgE;IAChE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,aAAa,EAAE,GAAG,CAAC;IACnB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB;;qCAE6B;QAC7B,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxC;;sDAE8C;QAC9C,kBAAkB,EAAE,MAAM,CAAC;QAC3B;oEAC4D;QAC5D,eAAe,EAAE,MAAM,CAAC;QACxB;;;2DAGmD;QACnD,eAAe,EAAE,MAAM,CAAC;QACxB;wDACgD;QAChD,gBAAgB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/analyzers/bom/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEjE,MAAM,WAAW,QAAQ;IAEvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAGhB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IAKrB,KAAK,EAAE,cAAc,EAAE,CAAC;IAExB;uEACmE;IACnE,WAAW,EAAE,WAAW,GAAG,IAAI,CAAC;IAEhC;;;gDAG4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IAEtB;;;;oEAIgE;IAChE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,uDAAuD;IACvD,aAAa,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB;wEACoE;IACpE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,aAAa,EAAE,GAAG,CAAC;IACnB,OAAO,EAAE;QACP,aAAa,EAAE,MAAM,CAAC;QACtB;;qCAE6B;QAC7B,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACxC;;sDAE8C;QAC9C,kBAAkB,EAAE,MAAM,CAAC;QAC3B;oEAC4D;QAC5D,eAAe,EAAE,MAAM,CAAC;QACxB;;;2DAGmD;QACnD,eAAe,EAAE,MAAM,CAAC;QACxB;wDACgD;QAChD,gBAAgB,EAAE,MAAM,CAAC;QACzB;;;8CAGsC;QACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;KAClD,CAAC;IACF,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.analyzeHealth = void 0;
|
|
4
|
+
var health_1 = require("./health");
|
|
5
|
+
Object.defineProperty(exports, "analyzeHealth", { enumerable: true, get: function () { return health_1.analyzeHealth; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":";;;AAAA,mCAAyC;AAAhC,uGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown report formatter matching tmp/reports/vulnerability-scan-*.md format.
|
|
3
|
+
*/
|
|
4
|
+
import { SecurityReport } from './types';
|
|
5
|
+
export declare function formatSecurityReport(report: SecurityReport, elapsed: string): string;
|
|
6
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../src/analyzers/security/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,cAAc,EAAmB,MAAM,SAAS,CAAC;AA6C1D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAuFpF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatSecurityReport = formatSecurityReport;
|
|
4
|
+
const SEVERITY_ORDER = ['critical', 'high', 'medium', 'low'];
|
|
5
|
+
const CATEGORY_SECTIONS = [
|
|
6
|
+
{
|
|
7
|
+
key: 'secrets-and-keys',
|
|
8
|
+
title: '1. Secrets & Credentials Exposure',
|
|
9
|
+
filter: (f) => f.category === 'secret' || f.category === 'private-key',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
key: 'code-vuln',
|
|
13
|
+
title: '2. Code Vulnerability Patterns',
|
|
14
|
+
filter: (f) => f.category === 'code-vuln',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
key: 'config',
|
|
18
|
+
title: '3. Configuration Vulnerabilities',
|
|
19
|
+
filter: (f) => f.category === 'config',
|
|
20
|
+
},
|
|
21
|
+
];
|
|
22
|
+
function severityLabel(s) {
|
|
23
|
+
return s.toUpperCase();
|
|
24
|
+
}
|
|
25
|
+
function formatFinding(f) {
|
|
26
|
+
const lines = [];
|
|
27
|
+
lines.push(`### ${severityLabel(f.severity)}: ${f.description}`);
|
|
28
|
+
if (f.file) {
|
|
29
|
+
const loc = f.line ? `${f.file}:${f.line}` : f.file;
|
|
30
|
+
lines.push(`- **File:** \`${loc}\``);
|
|
31
|
+
}
|
|
32
|
+
if (f.cwe)
|
|
33
|
+
lines.push(`- **CWE:** ${f.cwe}`);
|
|
34
|
+
lines.push(`- **Rule:** ${f.rule}`);
|
|
35
|
+
if (f.snippet)
|
|
36
|
+
lines.push(`- **Snippet:** \`${f.snippet}\``);
|
|
37
|
+
if (f.remediation)
|
|
38
|
+
lines.push(`- **Remediation:** ${f.remediation}`);
|
|
39
|
+
lines.push('');
|
|
40
|
+
return lines.join('\n');
|
|
41
|
+
}
|
|
42
|
+
function formatSecurityReport(report, elapsed) {
|
|
43
|
+
const lines = [];
|
|
44
|
+
lines.push('# Vulnerability Scan Report');
|
|
45
|
+
lines.push('');
|
|
46
|
+
lines.push(`**Date:** ${report.analyzedAt.slice(0, 10)}`);
|
|
47
|
+
lines.push(`**Repository:** ${report.repo}`);
|
|
48
|
+
lines.push(`**Branch:** ${report.branch}`);
|
|
49
|
+
lines.push(`**Commit:** ${report.commitSha}`);
|
|
50
|
+
lines.push('');
|
|
51
|
+
lines.push('---');
|
|
52
|
+
lines.push('');
|
|
53
|
+
// Executive Summary
|
|
54
|
+
lines.push('## Executive Summary');
|
|
55
|
+
lines.push('');
|
|
56
|
+
lines.push('| Severity | Count |');
|
|
57
|
+
lines.push('|----------|-------|');
|
|
58
|
+
lines.push(`| CRITICAL | ${report.summary.critical} |`);
|
|
59
|
+
lines.push(`| HIGH | ${report.summary.high} |`);
|
|
60
|
+
lines.push(`| MEDIUM | ${report.summary.medium} |`);
|
|
61
|
+
lines.push(`| LOW | ${report.summary.low} |`);
|
|
62
|
+
lines.push(`| **Total** | **${report.summary.total}** |`);
|
|
63
|
+
lines.push('');
|
|
64
|
+
lines.push(`Overall severity: **${report.summary.overallSeverity.toUpperCase()}**. ` +
|
|
65
|
+
`Dependency audit flagged ${report.dependencies.total} vulnerable packages.`);
|
|
66
|
+
lines.push('');
|
|
67
|
+
lines.push('---');
|
|
68
|
+
lines.push('');
|
|
69
|
+
// Category sections — sorted by severity within each
|
|
70
|
+
for (const section of CATEGORY_SECTIONS) {
|
|
71
|
+
const sectionFindings = report.findings.filter(section.filter);
|
|
72
|
+
if (sectionFindings.length === 0)
|
|
73
|
+
continue;
|
|
74
|
+
lines.push(`## ${section.title}`);
|
|
75
|
+
lines.push('');
|
|
76
|
+
sectionFindings.sort((a, b) => SEVERITY_ORDER.indexOf(a.severity) - SEVERITY_ORDER.indexOf(b.severity));
|
|
77
|
+
for (const f of sectionFindings) {
|
|
78
|
+
lines.push(formatFinding(f));
|
|
79
|
+
}
|
|
80
|
+
lines.push('---');
|
|
81
|
+
lines.push('');
|
|
82
|
+
}
|
|
83
|
+
// Dependency section
|
|
84
|
+
lines.push('## 4. Dependency Vulnerabilities');
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push(`**Tool:** ${report.dependencies.tool || 'not available'}`);
|
|
87
|
+
lines.push('');
|
|
88
|
+
lines.push('| Severity | Count |');
|
|
89
|
+
lines.push('|----------|-------|');
|
|
90
|
+
lines.push(`| Critical | ${report.dependencies.critical} |`);
|
|
91
|
+
lines.push(`| High | ${report.dependencies.high} |`);
|
|
92
|
+
lines.push(`| Medium | ${report.dependencies.medium} |`);
|
|
93
|
+
lines.push(`| Low | ${report.dependencies.low} |`);
|
|
94
|
+
lines.push(`| **Total** | **${report.dependencies.total}** |`);
|
|
95
|
+
lines.push('');
|
|
96
|
+
if (report.dependencies.subprojects && report.dependencies.subprojects.length > 0) {
|
|
97
|
+
lines.push('### By subproject');
|
|
98
|
+
lines.push('');
|
|
99
|
+
lines.push('| Subproject | Critical | High | Medium | Low | Total |');
|
|
100
|
+
lines.push('|------------|----------|------|--------|-----|-------|');
|
|
101
|
+
for (const sp of report.dependencies.subprojects) {
|
|
102
|
+
lines.push(`| ${sp.name} | ${sp.critical} | ${sp.high} | ${sp.medium} | ${sp.low} | ${sp.total} |`);
|
|
103
|
+
}
|
|
104
|
+
lines.push('');
|
|
105
|
+
}
|
|
106
|
+
lines.push('---');
|
|
107
|
+
lines.push('');
|
|
108
|
+
// Footer
|
|
109
|
+
lines.push(`**Tools used:** ${report.toolsUsed.join(', ')}`);
|
|
110
|
+
if (report.toolsUnavailable.length > 0) {
|
|
111
|
+
lines.push(`**Tools unavailable:** ${report.toolsUnavailable.join(', ')}`);
|
|
112
|
+
}
|
|
113
|
+
lines.push(`**Analysis time:** ${elapsed}s`);
|
|
114
|
+
lines.push('');
|
|
115
|
+
lines.push('*Generated by [VyuhLabs DXKit](https://www.npmjs.com/package/@vyuhlabs/dxkit)*');
|
|
116
|
+
return lines.join('\n');
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=report.js.map
|