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.
Files changed (61) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +209 -0
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +633 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/mcp-server.d.ts +24 -0
  8. package/dist/mcp-server.d.ts.map +1 -0
  9. package/dist/mcp-server.js +411 -0
  10. package/dist/mcp-server.js.map +1 -0
  11. package/dist/memory.d.ts +40 -0
  12. package/dist/memory.d.ts.map +1 -0
  13. package/dist/memory.js +241 -0
  14. package/dist/memory.js.map +1 -0
  15. package/dist/merge.d.ts +32 -0
  16. package/dist/merge.d.ts.map +1 -0
  17. package/dist/merge.js +251 -0
  18. package/dist/merge.js.map +1 -0
  19. package/dist/models/base.d.ts +72 -0
  20. package/dist/models/base.d.ts.map +1 -0
  21. package/dist/models/base.js +342 -0
  22. package/dist/models/base.js.map +1 -0
  23. package/dist/models/claude.d.ts +23 -0
  24. package/dist/models/claude.d.ts.map +1 -0
  25. package/dist/models/claude.js +30 -0
  26. package/dist/models/claude.js.map +1 -0
  27. package/dist/models/codex.d.ts +25 -0
  28. package/dist/models/codex.d.ts.map +1 -0
  29. package/dist/models/codex.js +34 -0
  30. package/dist/models/codex.js.map +1 -0
  31. package/dist/models/gemini.d.ts +23 -0
  32. package/dist/models/gemini.d.ts.map +1 -0
  33. package/dist/models/gemini.js +32 -0
  34. package/dist/models/gemini.js.map +1 -0
  35. package/dist/patch.d.ts +40 -0
  36. package/dist/patch.d.ts.map +1 -0
  37. package/dist/patch.js +183 -0
  38. package/dist/patch.js.map +1 -0
  39. package/dist/progress.d.ts +71 -0
  40. package/dist/progress.d.ts.map +1 -0
  41. package/dist/progress.js +268 -0
  42. package/dist/progress.js.map +1 -0
  43. package/dist/report.d.ts +19 -0
  44. package/dist/report.d.ts.map +1 -0
  45. package/dist/report.js +245 -0
  46. package/dist/report.js.map +1 -0
  47. package/dist/scanner.d.ts +64 -0
  48. package/dist/scanner.d.ts.map +1 -0
  49. package/dist/scanner.js +645 -0
  50. package/dist/scanner.js.map +1 -0
  51. package/dist/setup.d.ts +52 -0
  52. package/dist/setup.d.ts.map +1 -0
  53. package/dist/setup.js +252 -0
  54. package/dist/setup.js.map +1 -0
  55. package/dist/types.d.ts +153 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +203 -0
  58. package/dist/types.js.map +1 -0
  59. package/examples/claude-code-skill.md +22 -0
  60. package/examples/mcp-config.json +9 -0
  61. package/package.json +77 -0
package/dist/report.js ADDED
@@ -0,0 +1,245 @@
1
+ /**
2
+ * Report generation in Markdown and JSON formats.
3
+ */
4
+ import { clusterRepresentative, clusterPatches, isConsensus, } from './types.js';
5
+ import { mergedResultToDict } from './merge.js';
6
+ // ---------------------------------------------------------------------------
7
+ // ReportGenerator
8
+ // ---------------------------------------------------------------------------
9
+ export class ReportGenerator {
10
+ /**
11
+ * Generate a Markdown report from merged results.
12
+ *
13
+ * Matches the exact section order and formatting of the Python original.
14
+ */
15
+ toMarkdown(merged, prompt, context, elapsed) {
16
+ const lines = [];
17
+ // ---- Header ----
18
+ lines.push('# Code Triage Report');
19
+ lines.push('');
20
+ lines.push(`**Generated:** ${new Date().toISOString().replace('T', ' ').slice(0, 19)}`);
21
+ lines.push(`**Duration:** ${elapsed.toFixed(1)}s`);
22
+ lines.push(`**Models:** ${Object.keys(merged.summaries).join(', ')}`);
23
+ lines.push('');
24
+ // ---- Request ----
25
+ lines.push('## Request');
26
+ lines.push('');
27
+ lines.push(`> ${prompt}`);
28
+ lines.push('');
29
+ // ---- Summary ----
30
+ lines.push('## Summary');
31
+ lines.push('');
32
+ const total = merged.blockers.length +
33
+ merged.high.length +
34
+ merged.medium.length +
35
+ merged.low.length;
36
+ const consensusCount = merged.consensus.length;
37
+ lines.push(`- **Total Issues:** ${total}`);
38
+ lines.push(`- **Consensus (2+ models):** ${consensusCount}`);
39
+ lines.push(`- **Blockers (S0):** ${merged.blockers.length}`);
40
+ lines.push(`- **High (S1):** ${merged.high.length}`);
41
+ lines.push(`- **Medium (S2):** ${merged.medium.length}`);
42
+ lines.push(`- **Low (S3):** ${merged.low.length}`);
43
+ lines.push('');
44
+ // ---- Model Assessments ----
45
+ lines.push('### Model Assessments');
46
+ lines.push('');
47
+ for (const [model, summary] of Object.entries(merged.summaries)) {
48
+ lines.push(`**${model.toUpperCase()}:** ${summary}`);
49
+ lines.push('');
50
+ }
51
+ // ---- Blockers ----
52
+ if (merged.blockers.length > 0) {
53
+ lines.push('## Blockers (S0)');
54
+ lines.push('');
55
+ for (let i = 0; i < merged.blockers.length; i++) {
56
+ lines.push(...this._renderCluster(merged.blockers[i], i + 1));
57
+ }
58
+ }
59
+ // ---- High ----
60
+ if (merged.high.length > 0) {
61
+ lines.push('## High Priority (S1)');
62
+ lines.push('');
63
+ for (let i = 0; i < merged.high.length; i++) {
64
+ lines.push(...this._renderCluster(merged.high[i], i + 1));
65
+ }
66
+ }
67
+ // ---- Medium ----
68
+ if (merged.medium.length > 0) {
69
+ lines.push('## Medium Priority (S2)');
70
+ lines.push('');
71
+ for (let i = 0; i < merged.medium.length; i++) {
72
+ lines.push(...this._renderCluster(merged.medium[i], i + 1));
73
+ }
74
+ }
75
+ // ---- Low ----
76
+ if (merged.low.length > 0) {
77
+ lines.push('## Low Priority (S3)');
78
+ lines.push('');
79
+ for (let i = 0; i < merged.low.length; i++) {
80
+ lines.push(...this._renderCluster(merged.low[i], i + 1));
81
+ }
82
+ }
83
+ // ---- Consensus Findings ----
84
+ if (merged.consensus.length > 0) {
85
+ lines.push('## Consensus Findings');
86
+ lines.push('');
87
+ lines.push('*Issues identified by 2+ models:*');
88
+ lines.push('');
89
+ for (const cluster of merged.consensus) {
90
+ const f = clusterRepresentative(cluster);
91
+ const models = [...cluster.models].sort().join(', ');
92
+ lines.push(`- [${f.severity}] **${f.title}** (${f.location.path}) - *${models}*`);
93
+ }
94
+ lines.push('');
95
+ }
96
+ // ---- Unique Findings by Model ----
97
+ if (Object.keys(merged.unique_by_model).length > 0) {
98
+ lines.push('## Unique Findings by Model');
99
+ lines.push('');
100
+ for (const [model, findings] of Object.entries(merged.unique_by_model).sort()) {
101
+ if (findings.length > 0) {
102
+ lines.push(`### ${model.toUpperCase()} only (${findings.length})`);
103
+ lines.push('');
104
+ for (const f of findings) {
105
+ lines.push(`- [${f.severity}] ${f.title} (${f.location.path})`);
106
+ }
107
+ lines.push('');
108
+ }
109
+ }
110
+ }
111
+ // ---- Conflicts / Disagreements ----
112
+ if (merged.conflicts.length > 0) {
113
+ lines.push('## Conflicts / Disagreements');
114
+ lines.push('');
115
+ for (const conflict of merged.conflicts) {
116
+ lines.push(`### ${conflict.title}`);
117
+ lines.push(`*Type: ${conflict.conflict_type}*`);
118
+ lines.push('');
119
+ lines.push(conflict.details);
120
+ lines.push('');
121
+ }
122
+ }
123
+ // ---- Proposed Patches ----
124
+ if (merged.patches.length > 0) {
125
+ lines.push('## Proposed Patches');
126
+ lines.push('');
127
+ for (let i = 0; i < merged.patches.length; i++) {
128
+ const patch = merged.patches[i];
129
+ lines.push(`### Patch ${i + 1}: ${patch.description} (${patch.model})`);
130
+ lines.push(`*File: ${patch.path}*`);
131
+ lines.push('');
132
+ lines.push('```diff');
133
+ lines.push(patch.diff);
134
+ lines.push('```');
135
+ lines.push('');
136
+ }
137
+ }
138
+ // ---- Open Questions ----
139
+ if (merged.questions.length > 0) {
140
+ lines.push('## Open Questions');
141
+ lines.push('');
142
+ for (const q of merged.questions) {
143
+ lines.push(`- ${q}`);
144
+ }
145
+ lines.push('');
146
+ }
147
+ // ---- Recommended Plan ----
148
+ lines.push('## Recommended Plan');
149
+ lines.push('');
150
+ const planItems = [];
151
+ // Blockers first
152
+ for (const cluster of merged.blockers) {
153
+ const f = clusterRepresentative(cluster);
154
+ const tag = isConsensus(cluster) ? ' (consensus)' : '';
155
+ planItems.push(`1. **[BLOCKER]** ${f.title} - ${f.location.path}${tag}`);
156
+ }
157
+ // High priority consensus
158
+ for (const cluster of merged.high) {
159
+ if (isConsensus(cluster)) {
160
+ const f = clusterRepresentative(cluster);
161
+ planItems.push(`2. **[HIGH]** ${f.title} - ${f.location.path} (consensus)`);
162
+ }
163
+ }
164
+ // Remaining high
165
+ for (const cluster of merged.high) {
166
+ if (!isConsensus(cluster)) {
167
+ const f = clusterRepresentative(cluster);
168
+ planItems.push(`3. **[HIGH]** ${f.title} - ${f.location.path}`);
169
+ }
170
+ }
171
+ if (planItems.length > 0) {
172
+ lines.push(...planItems.slice(0, 10)); // Top 10 actions
173
+ }
174
+ else {
175
+ lines.push('No critical issues found. Consider reviewing medium/low findings.');
176
+ }
177
+ lines.push('');
178
+ lines.push('---');
179
+ lines.push('*Report generated by triage-ai v1.0.2*');
180
+ return lines.join('\n');
181
+ }
182
+ /** Render a single finding cluster as Markdown lines. */
183
+ _renderCluster(cluster, index) {
184
+ const lines = [];
185
+ const f = clusterRepresentative(cluster);
186
+ const consensusTag = isConsensus(cluster) ? ' [CONSENSUS]' : '';
187
+ const models = [...cluster.models].sort().join(', ');
188
+ lines.push(`### ${index}. ${f.title}${consensusTag}`);
189
+ lines.push('');
190
+ lines.push(`- **Severity:** ${f.severity}`);
191
+ lines.push(`- **Confidence:** ${f.confidence}`);
192
+ lines.push(`- **Category:** ${f.category}`);
193
+ lines.push(`- **Location:** \`${f.location.path}:${f.location.start_line}-${f.location.end_line}\``);
194
+ lines.push(`- **Models:** ${models}`);
195
+ lines.push('');
196
+ if (f.evidence) {
197
+ lines.push('**Evidence:**');
198
+ lines.push('```');
199
+ lines.push(f.evidence.slice(0, 500));
200
+ lines.push('```');
201
+ lines.push('');
202
+ }
203
+ if (f.recommendation) {
204
+ lines.push(`**Recommendation:** ${f.recommendation}`);
205
+ lines.push('');
206
+ }
207
+ // Show first patch if any
208
+ const patches = clusterPatches(cluster);
209
+ if (patches.length > 0) {
210
+ lines.push('**Proposed fix:**');
211
+ lines.push('```diff');
212
+ lines.push(patches[0].diff.slice(0, 1000));
213
+ lines.push('```');
214
+ lines.push('');
215
+ }
216
+ return lines;
217
+ }
218
+ /**
219
+ * Generate a JSON report from merged results.
220
+ */
221
+ toJson(merged, prompt, context, elapsed) {
222
+ const report = {
223
+ metadata: {
224
+ generated: new Date().toISOString(),
225
+ duration_seconds: elapsed,
226
+ prompt,
227
+ models: Object.keys(merged.summaries),
228
+ },
229
+ summary: {
230
+ total_issues: merged.blockers.length +
231
+ merged.high.length +
232
+ merged.medium.length +
233
+ merged.low.length,
234
+ consensus_count: merged.consensus.length,
235
+ blockers: merged.blockers.length,
236
+ high: merged.high.length,
237
+ medium: merged.medium.length,
238
+ low: merged.low.length,
239
+ },
240
+ results: mergedResultToDict(merged),
241
+ };
242
+ return JSON.stringify(report, null, 2);
243
+ }
244
+ }
245
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Repository scanning and context gathering.
3
+ *
4
+ * Handles:
5
+ * - Git diff detection
6
+ * - File discovery based on prompt
7
+ * - Secret redaction
8
+ *
9
+ * TypeScript port of triage_cli/repo_scan.py — faithful port, same logic,
10
+ * same constants, same behavior.
11
+ */
12
+ import type { ScanContext, FileContext } from './types.js';
13
+ export declare class RepoScanner {
14
+ readonly root: string;
15
+ constructor(root?: string);
16
+ /**
17
+ * Scan repository and return context for models.
18
+ *
19
+ * Returns ScanContext with:
20
+ * - is_git_repo, has_diff, git_diff, git_status, git_log
21
+ * - tree (directory structure)
22
+ * - files: list of { path, content, reason, description }
23
+ * - prompt: original prompt
24
+ * - root: resolved repo root
25
+ */
26
+ scan(diffOnly?: boolean, maxFiles?: number, prompt?: string): ScanContext;
27
+ /** Check if current directory is a git repository. */
28
+ _is_git_repo(): boolean;
29
+ /** Get git status output. */
30
+ _get_git_status(): string;
31
+ /** Get git diff for staged and unstaged changes. */
32
+ _get_git_diff(): string;
33
+ /** Get recent git commits for context. */
34
+ _get_git_log(limit?: number): string;
35
+ /** Get directory structure for orientation. */
36
+ _get_directory_tree(maxDepth?: number, maxEntries?: number): string;
37
+ /** Extract first docstring or comment as file description. */
38
+ _extract_file_description(content: string): string;
39
+ /**
40
+ * Discover relevant files based on prompt and repository structure.
41
+ *
42
+ * Returns list of FileContext objects.
43
+ * Order: explicit paths → explicit dirs → git diff files → keyword search → entrypoints.
44
+ */
45
+ _discover_files(prompt: string, maxFiles: number): FileContext[];
46
+ /** Extract likely file/function/class names from prompt. */
47
+ _extract_keywords(prompt: string): string[];
48
+ /** Find files that match keywords in name or content. */
49
+ _find_files_by_keywords(keywords: string[]): Array<[string, string]>;
50
+ /** Get list of files changed in git diff. */
51
+ _get_diff_file_list(): string[];
52
+ /** Check if file should be included in context. */
53
+ _should_include_file(filePath: string): boolean;
54
+ /** Read file content with size limit and secret redaction. */
55
+ _read_file(filePath: string, maxSize?: number): string | null;
56
+ /** Redact potential secrets from content. */
57
+ _redact_secrets(content: string): string;
58
+ /**
59
+ * Recursively glob a directory for files matching a suffix (e.g. ".py").
60
+ * When recursive=false, only looks in top-level of the directory.
61
+ */
62
+ private _globDir;
63
+ }
64
+ //# sourceMappingURL=scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../src/scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqF3D,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,IAAI,CAAC,EAAE,MAAM;IAIzB;;;;;;;;;OASG;IACH,IAAI,CACF,QAAQ,UAAQ,EAChB,QAAQ,SAAK,EACb,MAAM,SAAK,GACV,WAAW;IAsCd,sDAAsD;IACtD,YAAY,IAAI,OAAO;IAavB,6BAA6B;IAC7B,eAAe,IAAI,MAAM;IAazB,oDAAoD;IACpD,aAAa,IAAI,MAAM;IA0BvB,0CAA0C;IAC1C,YAAY,CAAC,KAAK,SAAK,GAAG,MAAM;IAahC,+CAA+C;IAC/C,mBAAmB,CAAC,QAAQ,SAAI,EAAE,UAAU,SAAM,GAAG,MAAM;IA0E3D,8DAA8D;IAC9D,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAoDlD;;;;;OAKG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,EAAE;IAqIhE,4DAA4D;IAC5D,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE;IAW3C,yDAAyD;IACzD,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IA6DpE,6CAA6C;IAC7C,mBAAmB,IAAI,MAAM,EAAE;IAoB/B,mDAAmD;IACnD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAmB/C,8DAA8D;IAC9D,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAU,GAAG,MAAM,GAAG,IAAI;IAuB9D,6CAA6C;IAC7C,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAcxC;;;OAGG;IACH,OAAO,CAAC,QAAQ;CA+CjB"}