triage-ai 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +209 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +633 -0
- package/dist/cli.js.map +1 -0
- package/dist/mcp-server.d.ts +24 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +411 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/memory.d.ts +40 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +241 -0
- package/dist/memory.js.map +1 -0
- package/dist/merge.d.ts +32 -0
- package/dist/merge.d.ts.map +1 -0
- package/dist/merge.js +251 -0
- package/dist/merge.js.map +1 -0
- package/dist/models/base.d.ts +72 -0
- package/dist/models/base.d.ts.map +1 -0
- package/dist/models/base.js +342 -0
- package/dist/models/base.js.map +1 -0
- package/dist/models/claude.d.ts +23 -0
- package/dist/models/claude.d.ts.map +1 -0
- package/dist/models/claude.js +30 -0
- package/dist/models/claude.js.map +1 -0
- package/dist/models/codex.d.ts +25 -0
- package/dist/models/codex.d.ts.map +1 -0
- package/dist/models/codex.js +34 -0
- package/dist/models/codex.js.map +1 -0
- package/dist/models/gemini.d.ts +23 -0
- package/dist/models/gemini.d.ts.map +1 -0
- package/dist/models/gemini.js +32 -0
- package/dist/models/gemini.js.map +1 -0
- package/dist/patch.d.ts +40 -0
- package/dist/patch.d.ts.map +1 -0
- package/dist/patch.js +183 -0
- package/dist/patch.js.map +1 -0
- package/dist/progress.d.ts +71 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +268 -0
- package/dist/progress.js.map +1 -0
- package/dist/report.d.ts +19 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +245 -0
- package/dist/report.js.map +1 -0
- package/dist/scanner.d.ts +64 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +645 -0
- package/dist/scanner.js.map +1 -0
- package/dist/setup.d.ts +52 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +252 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +153 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +203 -0
- package/dist/types.js.map +1 -0
- package/examples/claude-code-skill.md +22 -0
- package/examples/mcp-config.json +9 -0
- package/package.json +77 -0
package/dist/patch.js
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Patch application with safety checks.
|
|
3
|
+
*
|
|
4
|
+
* Handles:
|
|
5
|
+
* - Creating git branches before applying
|
|
6
|
+
* - Validating patches apply cleanly (dry-run)
|
|
7
|
+
* - Limiting scope of changes
|
|
8
|
+
*/
|
|
9
|
+
import { execSync } from 'node:child_process';
|
|
10
|
+
import { writeFileSync, unlinkSync } from 'node:fs';
|
|
11
|
+
import { tmpdir } from 'node:os';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { randomBytes } from 'node:crypto';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// PatchApplicator
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
export class PatchApplicator {
|
|
18
|
+
maxFiles;
|
|
19
|
+
allowedSeverities;
|
|
20
|
+
appliedFiles;
|
|
21
|
+
constructor(maxFiles = 5, allowedSeverities = new Set(['S0', 'S1'])) {
|
|
22
|
+
this.maxFiles = maxFiles;
|
|
23
|
+
this.allowedSeverities = allowedSeverities;
|
|
24
|
+
this.appliedFiles = new Set();
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Apply patches to the repository.
|
|
28
|
+
*
|
|
29
|
+
* Returns the number of patches successfully applied.
|
|
30
|
+
*/
|
|
31
|
+
applyPatches(patches, createBranch = true, branchName) {
|
|
32
|
+
if (patches.length === 0)
|
|
33
|
+
return 0;
|
|
34
|
+
// Create branch if requested
|
|
35
|
+
if (createBranch) {
|
|
36
|
+
if (!this._createBranch(branchName)) {
|
|
37
|
+
console.log('Warning: Failed to create branch, applying to current branch');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
let applied = 0;
|
|
41
|
+
for (const patch of patches) {
|
|
42
|
+
// Check file limit
|
|
43
|
+
if (this.appliedFiles.size >= this.maxFiles) {
|
|
44
|
+
console.log(`Reached max file limit (${this.maxFiles}), stopping`);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
if (this._applySinglePatch(patch)) {
|
|
48
|
+
applied++;
|
|
49
|
+
this.appliedFiles.add(patch.path);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return applied;
|
|
53
|
+
}
|
|
54
|
+
/** Create a new git branch before applying patches. */
|
|
55
|
+
_createBranch(branchName) {
|
|
56
|
+
if (!branchName) {
|
|
57
|
+
const now = new Date();
|
|
58
|
+
const ts = now.getFullYear().toString() +
|
|
59
|
+
String(now.getMonth() + 1).padStart(2, '0') +
|
|
60
|
+
String(now.getDate()).padStart(2, '0') +
|
|
61
|
+
'_' +
|
|
62
|
+
String(now.getHours()).padStart(2, '0') +
|
|
63
|
+
String(now.getMinutes()).padStart(2, '0') +
|
|
64
|
+
String(now.getSeconds()).padStart(2, '0');
|
|
65
|
+
branchName = `triage/${ts}`;
|
|
66
|
+
}
|
|
67
|
+
try {
|
|
68
|
+
execSync(`git checkout -b ${branchName}`, {
|
|
69
|
+
stdio: 'pipe',
|
|
70
|
+
timeout: 10_000,
|
|
71
|
+
});
|
|
72
|
+
console.log(`Created branch: ${branchName}`);
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
77
|
+
console.log(`Failed to create branch: ${msg}`);
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Apply a single patch with validation. */
|
|
82
|
+
_applySinglePatch(patch) {
|
|
83
|
+
if (!this._isValidPatch(patch)) {
|
|
84
|
+
console.log(`Invalid patch format for ${patch.path}`);
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
if (!this._patchAppliesCleanly(patch)) {
|
|
88
|
+
console.log(`Patch does not apply cleanly to ${patch.path}`);
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
return this._doApplyPatch(patch);
|
|
92
|
+
}
|
|
93
|
+
/** Validate that the patch is a valid unified diff. */
|
|
94
|
+
_isValidPatch(patch) {
|
|
95
|
+
if (!patch.diff)
|
|
96
|
+
return false;
|
|
97
|
+
const lines = patch.diff.split('\n');
|
|
98
|
+
const hasMinus = lines.some((l) => l.startsWith('---') || l.startsWith('-'));
|
|
99
|
+
const hasPlus = lines.some((l) => l.startsWith('+++') || l.startsWith('+'));
|
|
100
|
+
const hasHunk = lines.some((l) => l.startsWith('@@'));
|
|
101
|
+
return hasMinus && hasPlus && hasHunk;
|
|
102
|
+
}
|
|
103
|
+
/** Check if the patch applies cleanly via `patch --dry-run`. */
|
|
104
|
+
_patchAppliesCleanly(patch) {
|
|
105
|
+
const tmpFile = this._writeTempPatch(patch.diff);
|
|
106
|
+
if (!tmpFile)
|
|
107
|
+
return false;
|
|
108
|
+
try {
|
|
109
|
+
execSync(`patch --dry-run -p1 -i ${tmpFile}`, {
|
|
110
|
+
stdio: 'pipe',
|
|
111
|
+
timeout: 10_000,
|
|
112
|
+
});
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
this._removeTempFile(tmpFile);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Apply the patch for real via `patch -p1`. */
|
|
123
|
+
_doApplyPatch(patch) {
|
|
124
|
+
const tmpFile = this._writeTempPatch(patch.diff);
|
|
125
|
+
if (!tmpFile)
|
|
126
|
+
return false;
|
|
127
|
+
try {
|
|
128
|
+
execSync(`patch -p1 -i ${tmpFile}`, {
|
|
129
|
+
stdio: 'pipe',
|
|
130
|
+
timeout: 10_000,
|
|
131
|
+
});
|
|
132
|
+
console.log(`Applied patch to ${patch.path}`);
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
137
|
+
console.log(`Failed to apply patch: ${msg}`);
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
this._removeTempFile(tmpFile);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** Write patch content to a temp file and return its path. */
|
|
145
|
+
_writeTempPatch(diff) {
|
|
146
|
+
const name = join(tmpdir(), `triage-${randomBytes(6).toString('hex')}.patch`);
|
|
147
|
+
try {
|
|
148
|
+
writeFileSync(name, diff, 'utf-8');
|
|
149
|
+
return name;
|
|
150
|
+
}
|
|
151
|
+
catch (e) {
|
|
152
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
153
|
+
console.log(`Error writing temp patch: ${msg}`);
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/** Remove a temp file, ignoring errors. */
|
|
158
|
+
_removeTempFile(path) {
|
|
159
|
+
try {
|
|
160
|
+
unlinkSync(path);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// ignore
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Show patches without applying (dry-run display).
|
|
168
|
+
*/
|
|
169
|
+
showPatches(patches) {
|
|
170
|
+
const lines = [];
|
|
171
|
+
for (let i = 0; i < patches.length; i++) {
|
|
172
|
+
const patch = patches[i];
|
|
173
|
+
lines.push(`=== Patch ${i + 1}: ${patch.path} ===`);
|
|
174
|
+
lines.push(`Model: ${patch.model}`);
|
|
175
|
+
lines.push(`Description: ${patch.description}`);
|
|
176
|
+
lines.push('');
|
|
177
|
+
lines.push(patch.diff);
|
|
178
|
+
lines.push('');
|
|
179
|
+
}
|
|
180
|
+
return lines.join('\n');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patch.js","sourceRoot":"","sources":["../src/patch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triage progress display — rich (TTY) and plain (CI/piped) modes.
|
|
3
|
+
*
|
|
4
|
+
* Rich TTY mode uses chalk colours and ora spinners, rendered with
|
|
5
|
+
* box-drawing characters. Plain mode emits simple bracketed lines
|
|
6
|
+
* so CI logs stay readable.
|
|
7
|
+
*/
|
|
8
|
+
import type { ProgressPhase } from './types.js';
|
|
9
|
+
export declare class TriageProgress {
|
|
10
|
+
private readonly isTTY;
|
|
11
|
+
private currentPhase;
|
|
12
|
+
private items;
|
|
13
|
+
constructor();
|
|
14
|
+
/**
|
|
15
|
+
* Begin a new phase. Finishes any active spinner from the previous phase
|
|
16
|
+
* and prints the phase header.
|
|
17
|
+
*/
|
|
18
|
+
startPhase(phase: ProgressPhase, title: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Register a pending item under the current phase.
|
|
21
|
+
* Prints a placeholder line in TTY mode.
|
|
22
|
+
*/
|
|
23
|
+
addItem(label: string, detail?: string): void;
|
|
24
|
+
/**
|
|
25
|
+
* Update an already-added item to done / failed / skipped.
|
|
26
|
+
* In TTY mode this re-prints the line in place only when there is no active
|
|
27
|
+
* spinner (the spinner path goes through stopSpinner instead).
|
|
28
|
+
*/
|
|
29
|
+
updateItem(label: string, status: 'done' | 'failed' | 'skipped', detail?: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Start an ora spinner for the given item. The spinner persists until
|
|
32
|
+
* `stopSpinner` is called.
|
|
33
|
+
*/
|
|
34
|
+
startSpinner(label: string, detail?: string): void;
|
|
35
|
+
/**
|
|
36
|
+
* Stop a running spinner and mark the item done or failed.
|
|
37
|
+
*/
|
|
38
|
+
stopSpinner(label: string, status: 'done' | 'failed', detail?: string): void;
|
|
39
|
+
/**
|
|
40
|
+
* Print the final summary line.
|
|
41
|
+
*
|
|
42
|
+
* @param totalTime Total wall-clock seconds
|
|
43
|
+
* @param totalFindings Number of unique findings
|
|
44
|
+
* @param consensusCount Number confirmed by 2+ models
|
|
45
|
+
*/
|
|
46
|
+
finish(totalTime: number, totalFindings: number, consensusCount: number): void;
|
|
47
|
+
/**
|
|
48
|
+
* Print the very first header line. Call once at startup.
|
|
49
|
+
*/
|
|
50
|
+
printHeader(): void;
|
|
51
|
+
private _itemText;
|
|
52
|
+
private _printItem;
|
|
53
|
+
private _plainItem;
|
|
54
|
+
private _sym;
|
|
55
|
+
private _phaseName;
|
|
56
|
+
private _stopAllSpinners;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format a plain-mode team summary line.
|
|
60
|
+
* Example: "[team] Claude ✓, Gemini ✓, Codex ✗"
|
|
61
|
+
*/
|
|
62
|
+
export declare function plainTeamLine(results: Array<{
|
|
63
|
+
name: string;
|
|
64
|
+
available: boolean;
|
|
65
|
+
}>): string;
|
|
66
|
+
/**
|
|
67
|
+
* Format a plain-mode severity breakdown line.
|
|
68
|
+
* Example: "[report] 3 S0, 5 S1, 8 S2, 6 S3"
|
|
69
|
+
*/
|
|
70
|
+
export declare function plainReportLine(s0: number, s1: number, s2: number, s3: number): string;
|
|
71
|
+
//# sourceMappingURL=progress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAa,MAAM,YAAY,CAAC;AAoD3D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,KAAK,CAAuC;;IAUpD;;;OAGG;IACH,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAcrD;;;OAGG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAiB7C;;;;OAIG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBvF;;;OAGG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAuBlD;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAoB5E;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI;IAkB9E;;OAEG;IACH,WAAW,IAAI,IAAI;IAanB,OAAO,CAAC,SAAS;IAsBjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,IAAI;IASZ,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,gBAAgB;CAQzB;AAMD;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,GACnD,MAAM,CAGR;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,MAAM,CAER"}
|
package/dist/progress.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Triage progress display — rich (TTY) and plain (CI/piped) modes.
|
|
3
|
+
*
|
|
4
|
+
* Rich TTY mode uses chalk colours and ora spinners, rendered with
|
|
5
|
+
* box-drawing characters. Plain mode emits simple bracketed lines
|
|
6
|
+
* so CI logs stay readable.
|
|
7
|
+
*/
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
import ora from 'ora';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Version — kept in sync with package.json at runtime
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const VERSION = '1.0.2';
|
|
14
|
+
// ---------------------------------------------------------------------------
|
|
15
|
+
// Box-drawing helpers
|
|
16
|
+
// ---------------------------------------------------------------------------
|
|
17
|
+
const BOX = {
|
|
18
|
+
top: '┌',
|
|
19
|
+
mid: '├',
|
|
20
|
+
pipe: '│',
|
|
21
|
+
bottom: '└',
|
|
22
|
+
dot: '·',
|
|
23
|
+
};
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
// Status symbols and colours
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
const SYM_DONE = chalk.green('✓');
|
|
28
|
+
const SYM_FAIL = chalk.red('✗');
|
|
29
|
+
const SYM_SKIP = chalk.dim('—');
|
|
30
|
+
const SYM_PENDING = chalk.dim(BOX.dot);
|
|
31
|
+
function phaseColour(phase) {
|
|
32
|
+
switch (phase) {
|
|
33
|
+
case 'intake': return chalk.cyan;
|
|
34
|
+
case 'team': return chalk.blue;
|
|
35
|
+
case 'assessment': return chalk.yellow;
|
|
36
|
+
case 'diagnosis': return chalk.magenta;
|
|
37
|
+
case 'report': return chalk.green;
|
|
38
|
+
case 'memory': return chalk.white;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// TriageProgress
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
export class TriageProgress {
|
|
45
|
+
isTTY;
|
|
46
|
+
currentPhase = null;
|
|
47
|
+
items = new Map();
|
|
48
|
+
constructor() {
|
|
49
|
+
this.isTTY = Boolean(process.stdout.isTTY);
|
|
50
|
+
}
|
|
51
|
+
// -------------------------------------------------------------------------
|
|
52
|
+
// Public API
|
|
53
|
+
// -------------------------------------------------------------------------
|
|
54
|
+
/**
|
|
55
|
+
* Begin a new phase. Finishes any active spinner from the previous phase
|
|
56
|
+
* and prints the phase header.
|
|
57
|
+
*/
|
|
58
|
+
startPhase(phase, title) {
|
|
59
|
+
this._stopAllSpinners();
|
|
60
|
+
this.items.clear();
|
|
61
|
+
this.currentPhase = phase;
|
|
62
|
+
if (this.isTTY) {
|
|
63
|
+
process.stdout.write('\n');
|
|
64
|
+
const colour = phaseColour(phase);
|
|
65
|
+
process.stdout.write(chalk.dim(BOX.mid) + ' ' + colour.bold(title) + '\n');
|
|
66
|
+
}
|
|
67
|
+
// Plain mode: phase name appears inline on each item line.
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register a pending item under the current phase.
|
|
71
|
+
* Prints a placeholder line in TTY mode.
|
|
72
|
+
*/
|
|
73
|
+
addItem(label, detail) {
|
|
74
|
+
const item = {
|
|
75
|
+
label,
|
|
76
|
+
status: 'pending',
|
|
77
|
+
detail,
|
|
78
|
+
spinner: null,
|
|
79
|
+
};
|
|
80
|
+
this.items.set(label, item);
|
|
81
|
+
if (this.isTTY) {
|
|
82
|
+
const detailStr = detail ? chalk.dim(' ' + detail) : '';
|
|
83
|
+
process.stdout.write(chalk.dim(BOX.pipe) + ' ' + SYM_PENDING + ' ' + chalk.dim(label) + detailStr + '\n');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Update an already-added item to done / failed / skipped.
|
|
88
|
+
* In TTY mode this re-prints the line in place only when there is no active
|
|
89
|
+
* spinner (the spinner path goes through stopSpinner instead).
|
|
90
|
+
*/
|
|
91
|
+
updateItem(label, status, detail) {
|
|
92
|
+
const item = this.items.get(label);
|
|
93
|
+
if (!item) {
|
|
94
|
+
// Auto-create the item if it was never added
|
|
95
|
+
this.addItem(label, detail);
|
|
96
|
+
return this.updateItem(label, status, detail);
|
|
97
|
+
}
|
|
98
|
+
if (item.spinner) {
|
|
99
|
+
this.stopSpinner(label, status === 'failed' ? 'failed' : 'done', detail);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
item.status = status;
|
|
103
|
+
if (detail !== undefined)
|
|
104
|
+
item.detail = detail;
|
|
105
|
+
if (this.isTTY) {
|
|
106
|
+
this._printItem(item);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
this._plainItem(item);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Start an ora spinner for the given item. The spinner persists until
|
|
114
|
+
* `stopSpinner` is called.
|
|
115
|
+
*/
|
|
116
|
+
startSpinner(label, detail) {
|
|
117
|
+
if (!this.items.has(label)) {
|
|
118
|
+
const item = { label, status: 'running', detail, spinner: null };
|
|
119
|
+
this.items.set(label, item);
|
|
120
|
+
}
|
|
121
|
+
const item = this.items.get(label);
|
|
122
|
+
item.status = 'running';
|
|
123
|
+
if (detail !== undefined)
|
|
124
|
+
item.detail = detail;
|
|
125
|
+
if (this.isTTY) {
|
|
126
|
+
const spinner = ora({
|
|
127
|
+
text: this._itemText(item),
|
|
128
|
+
prefixText: chalk.dim(BOX.pipe) + ' ',
|
|
129
|
+
color: 'yellow',
|
|
130
|
+
});
|
|
131
|
+
spinner.start();
|
|
132
|
+
item.spinner = spinner;
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
process.stdout.write(`[${this._phaseName()}] ${label}…\n`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Stop a running spinner and mark the item done or failed.
|
|
140
|
+
*/
|
|
141
|
+
stopSpinner(label, status, detail) {
|
|
142
|
+
const item = this.items.get(label);
|
|
143
|
+
if (!item)
|
|
144
|
+
return;
|
|
145
|
+
item.status = status;
|
|
146
|
+
if (detail !== undefined)
|
|
147
|
+
item.detail = detail;
|
|
148
|
+
if (this.isTTY && item.spinner) {
|
|
149
|
+
const text = this._itemText(item);
|
|
150
|
+
if (status === 'done') {
|
|
151
|
+
item.spinner.succeed(chalk.dim(BOX.pipe) + ' ' + text);
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
item.spinner.fail(chalk.dim(BOX.pipe) + ' ' + text);
|
|
155
|
+
}
|
|
156
|
+
item.spinner = null;
|
|
157
|
+
}
|
|
158
|
+
else if (!this.isTTY) {
|
|
159
|
+
this._plainItem(item);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Print the final summary line.
|
|
164
|
+
*
|
|
165
|
+
* @param totalTime Total wall-clock seconds
|
|
166
|
+
* @param totalFindings Number of unique findings
|
|
167
|
+
* @param consensusCount Number confirmed by 2+ models
|
|
168
|
+
*/
|
|
169
|
+
finish(totalTime, totalFindings, consensusCount) {
|
|
170
|
+
this._stopAllSpinners();
|
|
171
|
+
const timeStr = totalTime.toFixed(1) + 's';
|
|
172
|
+
const summary = `${totalFindings} findings, ${consensusCount} consensus`;
|
|
173
|
+
if (this.isTTY) {
|
|
174
|
+
process.stdout.write('\n');
|
|
175
|
+
process.stdout.write(chalk.dim(BOX.bottom) + ' ' +
|
|
176
|
+
chalk.bold('Done') + ' in ' + chalk.cyan(timeStr) +
|
|
177
|
+
' — ' + chalk.yellow(summary) + '\n');
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
process.stdout.write(`[done] ${timeStr} — ${summary}\n`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Print the very first header line. Call once at startup.
|
|
185
|
+
*/
|
|
186
|
+
printHeader() {
|
|
187
|
+
if (this.isTTY) {
|
|
188
|
+
process.stdout.write(chalk.dim(BOX.top) + ' ' + chalk.bold.white('triage-ai') +
|
|
189
|
+
' ' + chalk.dim('v' + VERSION) + '\n');
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
// -------------------------------------------------------------------------
|
|
193
|
+
// Private helpers
|
|
194
|
+
// -------------------------------------------------------------------------
|
|
195
|
+
_itemText(item) {
|
|
196
|
+
const sym = this._sym(item.status);
|
|
197
|
+
let labelPart;
|
|
198
|
+
switch (item.status) {
|
|
199
|
+
case 'running':
|
|
200
|
+
case 'done':
|
|
201
|
+
labelPart = chalk.white(item.label);
|
|
202
|
+
break;
|
|
203
|
+
case 'failed':
|
|
204
|
+
labelPart = chalk.red(item.label);
|
|
205
|
+
break;
|
|
206
|
+
default:
|
|
207
|
+
labelPart = chalk.dim(item.label);
|
|
208
|
+
}
|
|
209
|
+
const padding = ' '.padEnd(Math.max(1, 32 - item.label.length));
|
|
210
|
+
const detailPart = item.detail ? chalk.dim(padding + item.detail) : '';
|
|
211
|
+
return `${sym} ${labelPart}${detailPart}`;
|
|
212
|
+
}
|
|
213
|
+
_printItem(item) {
|
|
214
|
+
process.stdout.write(chalk.dim(BOX.pipe) + ' ' + this._itemText(item) + '\n');
|
|
215
|
+
}
|
|
216
|
+
_plainItem(item) {
|
|
217
|
+
const phase = this._phaseName();
|
|
218
|
+
const sym = item.status === 'done' ? '✓' : item.status === 'failed' ? '✗' : '—';
|
|
219
|
+
const detail = item.detail ? ` (${item.detail})` : '';
|
|
220
|
+
process.stdout.write(`[${phase}] ${item.label} ${sym}${detail}\n`);
|
|
221
|
+
}
|
|
222
|
+
_sym(status) {
|
|
223
|
+
switch (status) {
|
|
224
|
+
case 'done': return SYM_DONE;
|
|
225
|
+
case 'failed': return SYM_FAIL;
|
|
226
|
+
case 'skipped': return SYM_SKIP;
|
|
227
|
+
default: return SYM_PENDING;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
_phaseName() {
|
|
231
|
+
switch (this.currentPhase) {
|
|
232
|
+
case 'intake': return 'intake';
|
|
233
|
+
case 'team': return 'team';
|
|
234
|
+
case 'assessment': return 'assess';
|
|
235
|
+
case 'diagnosis': return 'diag';
|
|
236
|
+
case 'report': return 'report';
|
|
237
|
+
case 'memory': return 'memory';
|
|
238
|
+
default: return 'triage';
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
_stopAllSpinners() {
|
|
242
|
+
for (const item of this.items.values()) {
|
|
243
|
+
if (item.spinner) {
|
|
244
|
+
item.spinner.stop();
|
|
245
|
+
item.spinner = null;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
// Plain-mode convenience helpers (used by cli.ts for team / report)
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
/**
|
|
254
|
+
* Format a plain-mode team summary line.
|
|
255
|
+
* Example: "[team] Claude ✓, Gemini ✓, Codex ✗"
|
|
256
|
+
*/
|
|
257
|
+
export function plainTeamLine(results) {
|
|
258
|
+
const parts = results.map((r) => `${r.name} ${r.available ? '✓' : '✗'}`);
|
|
259
|
+
return `[team] ${parts.join(', ')}`;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Format a plain-mode severity breakdown line.
|
|
263
|
+
* Example: "[report] 3 S0, 5 S1, 8 S2, 6 S3"
|
|
264
|
+
*/
|
|
265
|
+
export function plainReportLine(s0, s1, s2, s3) {
|
|
266
|
+
return `[report] ${s0} S0, ${s1} S1, ${s2} S2, ${s3} S3`;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=progress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress.js","sourceRoot":"","sources":["../src/progress.ts"],"names":[],"mappings":"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"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Report generation in Markdown and JSON formats.
|
|
3
|
+
*/
|
|
4
|
+
import { type MergedResult, type FindingCluster, type ScanContext } from './types.js';
|
|
5
|
+
export declare class ReportGenerator {
|
|
6
|
+
/**
|
|
7
|
+
* Generate a Markdown report from merged results.
|
|
8
|
+
*
|
|
9
|
+
* Matches the exact section order and formatting of the Python original.
|
|
10
|
+
*/
|
|
11
|
+
toMarkdown(merged: MergedResult, prompt: string, context: ScanContext, elapsed: number): string;
|
|
12
|
+
/** Render a single finding cluster as Markdown lines. */
|
|
13
|
+
_renderCluster(cluster: FindingCluster, index: number): string[];
|
|
14
|
+
/**
|
|
15
|
+
* Generate a JSON report from merged results.
|
|
16
|
+
*/
|
|
17
|
+
toJson(merged: MergedResult, prompt: string, context: ScanContext, elapsed: number): string;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,WAAW,EAIjB,MAAM,YAAY,CAAC;AAOpB,qBAAa,eAAe;IAC1B;;;;OAIG;IACH,UAAU,CACR,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,GACd,MAAM;IAgMT,yDAAyD;IACzD,cAAc,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4ChE;;OAEG;IACH,MAAM,CACJ,MAAM,EAAE,YAAY,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE,MAAM,GACd,MAAM;CAyBV"}
|