@sentry/warden 0.13.0 → 0.14.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/agents.lock +7 -0
- package/dist/cli/args.d.ts +14 -12
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +44 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/commands/init.d.ts +0 -3
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +206 -19
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/logs.d.ts +19 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +419 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +54 -21
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output/formatters.d.ts +2 -1
- package/dist/cli/output/formatters.d.ts.map +1 -1
- package/dist/cli/output/formatters.js +22 -19
- package/dist/cli/output/formatters.js.map +1 -1
- package/dist/cli/output/index.d.ts +1 -1
- package/dist/cli/output/index.d.ts.map +1 -1
- package/dist/cli/output/index.js +1 -1
- package/dist/cli/output/index.js.map +1 -1
- package/dist/cli/output/ink-runner.js +1 -1
- package/dist/cli/output/ink-runner.js.map +1 -1
- package/dist/cli/output/jsonl.d.ts +49 -13
- package/dist/cli/output/jsonl.d.ts.map +1 -1
- package/dist/cli/output/jsonl.js +137 -4
- package/dist/cli/output/jsonl.js.map +1 -1
- package/dist/cli/output/tasks.d.ts.map +1 -1
- package/dist/cli/output/tasks.js +1 -22
- package/dist/cli/output/tasks.js.map +1 -1
- package/dist/cli/terminal.d.ts.map +1 -1
- package/dist/cli/terminal.js +0 -2
- package/dist/cli/terminal.js.map +1 -1
- package/dist/config/schema.d.ts +49 -98
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +0 -12
- package/dist/config/schema.js.map +1 -1
- package/dist/evals/runner.d.ts.map +1 -1
- package/dist/evals/runner.js +0 -1
- package/dist/evals/runner.js.map +1 -1
- package/dist/evals/types.d.ts +9 -15
- package/dist/evals/types.d.ts.map +1 -1
- package/dist/output/github-checks.d.ts +1 -1
- package/dist/output/github-checks.d.ts.map +1 -1
- package/dist/output/github-checks.js +2 -6
- package/dist/output/github-checks.js.map +1 -1
- package/dist/output/issue-renderer.js +1 -1
- package/dist/output/issue-renderer.js.map +1 -1
- package/dist/sdk/analyze.d.ts.map +1 -1
- package/dist/sdk/analyze.js +13 -26
- package/dist/sdk/analyze.js.map +1 -1
- package/dist/sdk/auth.d.ts +16 -0
- package/dist/sdk/auth.d.ts.map +1 -0
- package/dist/sdk/auth.js +37 -0
- package/dist/sdk/auth.js.map +1 -0
- package/dist/sdk/errors.d.ts +5 -0
- package/dist/sdk/errors.d.ts.map +1 -1
- package/dist/sdk/errors.js +20 -0
- package/dist/sdk/errors.js.map +1 -1
- package/dist/sdk/prompt.js +1 -1
- package/dist/sdk/runner.d.ts +2 -1
- package/dist/sdk/runner.d.ts.map +1 -1
- package/dist/sdk/runner.js +3 -1
- package/dist/sdk/runner.js.map +1 -1
- package/dist/sdk/types.d.ts +0 -3
- package/dist/sdk/types.d.ts.map +1 -1
- package/dist/sdk/types.js.map +1 -1
- package/dist/types/index.d.ts +23 -24
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +19 -7
- package/dist/types/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/warden/SKILL.md +76 -0
- package/skills/warden/references/cli-reference.md +142 -0
- package/skills/warden/references/config-schema.md +111 -0
- package/skills/warden/references/configuration.md +110 -0
- package/skills/warden/references/creating-skills.md +84 -0
- package/skills/warden-sweep/SKILL.md +407 -0
- package/skills/warden-sweep/scripts/_utils.py +37 -0
- package/skills/warden-sweep/scripts/extract_findings.py +219 -0
- package/skills/warden-sweep/scripts/find_reviewers.py +115 -0
- package/skills/warden-sweep/scripts/generate_report.py +271 -0
- package/skills/warden-sweep/scripts/index_prs.py +187 -0
- package/skills/warden-sweep/scripts/organize.py +315 -0
- package/skills/warden-sweep/scripts/scan.py +632 -0
- package/dist/sdk/session.d.ts +0 -43
- package/dist/sdk/session.d.ts.map +0 -1
- package/dist/sdk/session.js +0 -105
- package/dist/sdk/session.js.map +0 -1
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { dirname, join, resolve } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import { loadWardenConfig } from '../../config/loader.js';
|
|
5
|
+
import { getRepoRoot } from '../git.js';
|
|
6
|
+
import { findExpiredArtifacts } from '../log-cleanup.js';
|
|
7
|
+
import { renderTerminalReport, filterReports } from '../terminal.js';
|
|
8
|
+
import { pluralize, formatDuration, formatCost, shortRunId, parseJsonlReports, parseLogMetadata, renderJsonlString, } from '../output/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Resolve a log directory path from the repo root.
|
|
11
|
+
*/
|
|
12
|
+
function resolveLogDir() {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
let repoPath;
|
|
15
|
+
try {
|
|
16
|
+
repoPath = getRepoRoot(cwd);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return { logDir: join(repoPath, '.warden', 'logs'), repoPath };
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Resolve a file argument to a full path.
|
|
25
|
+
* If the argument looks like a run ID (no `/` or `.`), look up matching files in .warden/logs/.
|
|
26
|
+
*/
|
|
27
|
+
function resolveFileArg(arg, logDir) {
|
|
28
|
+
// If it contains path separators or dots, treat as a file path
|
|
29
|
+
if (arg.includes('/') || arg.includes('.')) {
|
|
30
|
+
return [resolve(process.cwd(), arg)];
|
|
31
|
+
}
|
|
32
|
+
// Treat as a short run ID — glob for matching files
|
|
33
|
+
try {
|
|
34
|
+
const entries = readdirSync(logDir);
|
|
35
|
+
const matches = entries
|
|
36
|
+
.filter((e) => e.endsWith('.jsonl') && e.startsWith(arg))
|
|
37
|
+
.map((e) => join(logDir, e));
|
|
38
|
+
return matches;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// eslint-disable-next-line no-control-regex
|
|
45
|
+
const ANSI_RE = /\x1b\[[0-9;]*m/g;
|
|
46
|
+
/**
|
|
47
|
+
* Get the visual width of a string (ignoring ANSI escape codes).
|
|
48
|
+
*/
|
|
49
|
+
function visualWidth(str) {
|
|
50
|
+
return str.replace(ANSI_RE, '').length;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Pad a string to a visual width, accounting for ANSI codes.
|
|
54
|
+
*/
|
|
55
|
+
function padToWidth(str, width) {
|
|
56
|
+
const pad = width - visualWidth(str);
|
|
57
|
+
return pad > 0 ? str + ' '.repeat(pad) : str;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Right-align a string to a visual width, accounting for ANSI codes.
|
|
61
|
+
*/
|
|
62
|
+
function rightAlign(str, width) {
|
|
63
|
+
const pad = width - visualWidth(str);
|
|
64
|
+
return pad > 0 ? ' '.repeat(pad) + str : str;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Format a date as a human-friendly relative or short absolute string.
|
|
68
|
+
*/
|
|
69
|
+
function formatRelativeTime(date) {
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const diffMs = now - date.getTime();
|
|
72
|
+
const diffSec = Math.floor(diffMs / 1000);
|
|
73
|
+
const diffMin = Math.floor(diffSec / 60);
|
|
74
|
+
const diffHr = Math.floor(diffMin / 60);
|
|
75
|
+
const diffDays = Math.floor(diffHr / 24);
|
|
76
|
+
if (diffSec < 60)
|
|
77
|
+
return 'just now';
|
|
78
|
+
if (diffMin < 60)
|
|
79
|
+
return `${diffMin}m ago`;
|
|
80
|
+
if (diffHr < 24)
|
|
81
|
+
return `${diffHr}h ago`;
|
|
82
|
+
if (diffDays === 1)
|
|
83
|
+
return 'yesterday';
|
|
84
|
+
if (diffDays < 7)
|
|
85
|
+
return `${diffDays}d ago`;
|
|
86
|
+
// Older than a week: show short date
|
|
87
|
+
const month = date.toLocaleString('en-US', { month: 'short' });
|
|
88
|
+
const day = date.getDate();
|
|
89
|
+
const year = date.getFullYear();
|
|
90
|
+
const currentYear = new Date().getFullYear();
|
|
91
|
+
return year === currentYear ? `${month} ${day}` : `${month} ${day}, ${year}`;
|
|
92
|
+
}
|
|
93
|
+
const SEVERITY_COLORS = {
|
|
94
|
+
high: chalk.red,
|
|
95
|
+
medium: chalk.yellow,
|
|
96
|
+
low: chalk.green,
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Format a severity breakdown as colored counts.
|
|
100
|
+
*/
|
|
101
|
+
function formatSeverityBreakdown(bySeverity) {
|
|
102
|
+
const severities = ['high', 'medium', 'low'];
|
|
103
|
+
const parts = severities.map((sev) => {
|
|
104
|
+
const count = bySeverity[sev] ?? 0;
|
|
105
|
+
return count > 0 ? SEVERITY_COLORS[sev](String(count)) : chalk.dim('0');
|
|
106
|
+
});
|
|
107
|
+
return parts.join(chalk.dim(' / '));
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* List all JSONL log files in .warden/logs/.
|
|
111
|
+
*/
|
|
112
|
+
export async function runLogsList(options, reporter) {
|
|
113
|
+
const resolved = resolveLogDir();
|
|
114
|
+
if (!resolved) {
|
|
115
|
+
reporter.error('Not a git repository');
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
const { logDir } = resolved;
|
|
119
|
+
let entries;
|
|
120
|
+
try {
|
|
121
|
+
entries = readdirSync(logDir)
|
|
122
|
+
.filter((e) => e.endsWith('.jsonl'))
|
|
123
|
+
.sort()
|
|
124
|
+
.reverse(); // newest first (filenames embed timestamps)
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
entries = [];
|
|
128
|
+
}
|
|
129
|
+
if (entries.length === 0) {
|
|
130
|
+
reporter.warning('No log files found');
|
|
131
|
+
reporter.tip('Run warden to generate logs in .warden/logs/');
|
|
132
|
+
return 0;
|
|
133
|
+
}
|
|
134
|
+
// Parse all logs for metadata and sort by timestamp (newest first)
|
|
135
|
+
const logData = [];
|
|
136
|
+
for (const entry of entries) {
|
|
137
|
+
const filePath = join(logDir, entry);
|
|
138
|
+
logData.push({ entry, meta: parseLogMetadata(filePath) });
|
|
139
|
+
}
|
|
140
|
+
logData.sort((a, b) => {
|
|
141
|
+
const tsA = a.meta?.summary.run.timestamp ?? '';
|
|
142
|
+
const tsB = b.meta?.summary.run.timestamp ?? '';
|
|
143
|
+
return tsB.localeCompare(tsA);
|
|
144
|
+
});
|
|
145
|
+
if (options.json) {
|
|
146
|
+
const results = logData.map(({ entry, meta }) => ({
|
|
147
|
+
file: entry,
|
|
148
|
+
runId: meta?.summary.run.runId,
|
|
149
|
+
timestamp: meta?.summary.run.timestamp,
|
|
150
|
+
model: meta?.model,
|
|
151
|
+
headSha: meta?.headSha,
|
|
152
|
+
files: meta?.totalFiles,
|
|
153
|
+
findings: meta?.summary.totalFindings,
|
|
154
|
+
bySeverity: meta?.summary.bySeverity,
|
|
155
|
+
durationMs: meta?.summary.run.durationMs,
|
|
156
|
+
costUSD: meta?.summary.usage?.costUSD,
|
|
157
|
+
skills: meta?.skills,
|
|
158
|
+
}));
|
|
159
|
+
process.stdout.write(JSON.stringify(results, null, 2) + '\n');
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
const rows = [];
|
|
163
|
+
// Aggregate totals across all runs
|
|
164
|
+
const totals = {
|
|
165
|
+
findings: 0,
|
|
166
|
+
bySeverity: { high: 0, medium: 0, low: 0 },
|
|
167
|
+
costUSD: 0,
|
|
168
|
+
durationMs: 0,
|
|
169
|
+
skills: new Set(),
|
|
170
|
+
};
|
|
171
|
+
for (const { entry, meta } of logData) {
|
|
172
|
+
if (!meta) {
|
|
173
|
+
rows.push({
|
|
174
|
+
runId: entry.slice(0, 8),
|
|
175
|
+
date: '',
|
|
176
|
+
files: '',
|
|
177
|
+
findings: chalk.dim('parse error'),
|
|
178
|
+
time: '',
|
|
179
|
+
cost: '',
|
|
180
|
+
sha: '',
|
|
181
|
+
model: '-',
|
|
182
|
+
skills: '',
|
|
183
|
+
});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const { summary, skills } = meta;
|
|
187
|
+
totals.findings += summary.totalFindings;
|
|
188
|
+
totals.durationMs += summary.run.durationMs;
|
|
189
|
+
if (summary.usage) {
|
|
190
|
+
totals.costUSD += summary.usage.costUSD;
|
|
191
|
+
}
|
|
192
|
+
for (const [sev, count] of Object.entries(summary.bySeverity)) {
|
|
193
|
+
totals.bySeverity[sev] += count;
|
|
194
|
+
}
|
|
195
|
+
for (const skill of skills) {
|
|
196
|
+
totals.skills.add(skill);
|
|
197
|
+
}
|
|
198
|
+
rows.push({
|
|
199
|
+
runId: shortRunId(summary.run.runId),
|
|
200
|
+
date: formatRelativeTime(new Date(summary.run.timestamp)),
|
|
201
|
+
files: meta.totalFiles > 0 ? String(meta.totalFiles) : '',
|
|
202
|
+
findings: formatSeverityBreakdown(summary.bySeverity),
|
|
203
|
+
time: formatDuration(summary.run.durationMs),
|
|
204
|
+
cost: summary.usage ? formatCost(summary.usage.costUSD) : '',
|
|
205
|
+
sha: meta.headSha ? meta.headSha.slice(0, 7) : '',
|
|
206
|
+
model: meta.model ?? '-',
|
|
207
|
+
skills: skills.join(', '),
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
// Calculate column widths
|
|
211
|
+
const headers = {
|
|
212
|
+
runId: 'RUN',
|
|
213
|
+
date: 'DATE',
|
|
214
|
+
files: 'FILES',
|
|
215
|
+
findings: 'FINDINGS',
|
|
216
|
+
time: 'TIME',
|
|
217
|
+
cost: 'COST',
|
|
218
|
+
sha: 'SHA',
|
|
219
|
+
model: 'MODEL',
|
|
220
|
+
skills: 'SKILLS',
|
|
221
|
+
};
|
|
222
|
+
const widths = {
|
|
223
|
+
runId: Math.max(headers.runId.length, ...rows.map((r) => visualWidth(r.runId))),
|
|
224
|
+
date: Math.max(headers.date.length, ...rows.map((r) => visualWidth(r.date))),
|
|
225
|
+
files: Math.max(headers.files.length, ...rows.map((r) => visualWidth(r.files))),
|
|
226
|
+
findings: Math.max(headers.findings.length, ...rows.map((r) => visualWidth(r.findings))),
|
|
227
|
+
time: Math.max(headers.time.length, ...rows.map((r) => visualWidth(r.time))),
|
|
228
|
+
cost: Math.max(headers.cost.length, ...rows.map((r) => visualWidth(r.cost))),
|
|
229
|
+
sha: Math.max(headers.sha.length, ...rows.map((r) => visualWidth(r.sha))),
|
|
230
|
+
model: Math.max(headers.model.length, ...rows.map((r) => visualWidth(r.model))),
|
|
231
|
+
skills: Math.max(headers.skills.length, ...rows.map((r) => visualWidth(r.skills))),
|
|
232
|
+
};
|
|
233
|
+
// Header row
|
|
234
|
+
const headerLine = ` ${padToWidth(headers.runId, widths.runId)} ` +
|
|
235
|
+
`${padToWidth(headers.date, widths.date)} ` +
|
|
236
|
+
`${rightAlign(headers.files, widths.files)} ` +
|
|
237
|
+
`${padToWidth(headers.findings, widths.findings)} ` +
|
|
238
|
+
`${rightAlign(headers.time, widths.time)} ` +
|
|
239
|
+
`${rightAlign(headers.cost, widths.cost)} ` +
|
|
240
|
+
`${padToWidth(headers.sha, widths.sha)} ` +
|
|
241
|
+
`${padToWidth(headers.model, widths.model)} ` +
|
|
242
|
+
`${headers.skills}`;
|
|
243
|
+
reporter.text(chalk.dim(headerLine));
|
|
244
|
+
// Data rows
|
|
245
|
+
for (const row of rows) {
|
|
246
|
+
const line = ` ${padToWidth(chalk.bold(row.runId), widths.runId)} ` +
|
|
247
|
+
`${padToWidth(chalk.dim(row.date), widths.date)} ` +
|
|
248
|
+
`${rightAlign(chalk.dim(row.files), widths.files)} ` +
|
|
249
|
+
`${padToWidth(row.findings, widths.findings)} ` +
|
|
250
|
+
`${rightAlign(chalk.dim(row.time), widths.time)} ` +
|
|
251
|
+
`${rightAlign(chalk.dim(row.cost), widths.cost)} ` +
|
|
252
|
+
`${padToWidth(chalk.dim(row.sha), widths.sha)} ` +
|
|
253
|
+
`${padToWidth(chalk.dim(row.model), widths.model)} ` +
|
|
254
|
+
`${chalk.dim(row.skills)}`;
|
|
255
|
+
reporter.text(line);
|
|
256
|
+
}
|
|
257
|
+
// Summary footer
|
|
258
|
+
reporter.blank();
|
|
259
|
+
reporter.text(chalk.dim(`${entries.length} ${pluralize(entries.length, 'run')} · ` +
|
|
260
|
+
`${totals.findings} ${pluralize(totals.findings, 'finding')} `) +
|
|
261
|
+
formatSeverityBreakdown(totals.bySeverity) +
|
|
262
|
+
chalk.dim(` · ${formatDuration(totals.durationMs)}` +
|
|
263
|
+
` · ${formatCost(totals.costUSD)}` +
|
|
264
|
+
` · ${totals.skills.size} ${pluralize(totals.skills.size, 'skill')}`));
|
|
265
|
+
return 0;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Show results from JSONL log files (replaces `warden replay`).
|
|
269
|
+
*/
|
|
270
|
+
export async function runLogsShow(logsOptions, options, reporter) {
|
|
271
|
+
const { files: fileArgs } = logsOptions;
|
|
272
|
+
if (fileArgs.length === 0) {
|
|
273
|
+
reporter.error('No log files specified');
|
|
274
|
+
reporter.tip('Usage: warden logs show <file.jsonl> [file2.jsonl ...]');
|
|
275
|
+
return 1;
|
|
276
|
+
}
|
|
277
|
+
// Resolve file arguments (may be paths or run IDs)
|
|
278
|
+
const resolved = resolveLogDir();
|
|
279
|
+
const logDir = resolved?.logDir;
|
|
280
|
+
const resolvedFiles = [];
|
|
281
|
+
for (const arg of fileArgs) {
|
|
282
|
+
if (logDir) {
|
|
283
|
+
const matches = resolveFileArg(arg, logDir);
|
|
284
|
+
if (matches.length > 0) {
|
|
285
|
+
resolvedFiles.push(...matches);
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Fall back to treating as a direct path
|
|
290
|
+
resolvedFiles.push(resolve(process.cwd(), arg));
|
|
291
|
+
}
|
|
292
|
+
// Validate all files exist
|
|
293
|
+
const missingFiles = [];
|
|
294
|
+
for (const file of resolvedFiles) {
|
|
295
|
+
if (!existsSync(file)) {
|
|
296
|
+
missingFiles.push(file);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
if (missingFiles.length > 0) {
|
|
300
|
+
reporter.error(`Log ${pluralize(missingFiles.length, 'file')} not found: ${missingFiles.join(', ')}`);
|
|
301
|
+
return 1;
|
|
302
|
+
}
|
|
303
|
+
// Parse and merge reports from all files
|
|
304
|
+
const allReports = [];
|
|
305
|
+
let totalDurationMs = 0;
|
|
306
|
+
let lastRunMetadata;
|
|
307
|
+
for (const file of resolvedFiles) {
|
|
308
|
+
try {
|
|
309
|
+
const content = readFileSync(file, 'utf-8');
|
|
310
|
+
const parsed = parseJsonlReports(content);
|
|
311
|
+
allReports.push(...parsed.reports);
|
|
312
|
+
totalDurationMs += parsed.totalDurationMs;
|
|
313
|
+
if (parsed.runMetadata) {
|
|
314
|
+
lastRunMetadata = parsed.runMetadata;
|
|
315
|
+
reporter.debug(`Loaded ${parsed.reports.length} ${pluralize(parsed.reports.length, 'skill')} from ${file}`);
|
|
316
|
+
reporter.debug(` Run ID: ${parsed.runMetadata.runId}`);
|
|
317
|
+
reporter.debug(` Timestamp: ${parsed.runMetadata.timestamp}`);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
reporter.error(`Failed to parse ${file}: ${err instanceof Error ? err.message : String(err)}`);
|
|
322
|
+
return 1;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
if (allReports.length === 0) {
|
|
326
|
+
reporter.warning('No skill reports found in log files');
|
|
327
|
+
return 0;
|
|
328
|
+
}
|
|
329
|
+
// Load config for minConfidence default (matches main run flow)
|
|
330
|
+
let configMinConfidence;
|
|
331
|
+
if (resolved) {
|
|
332
|
+
try {
|
|
333
|
+
const configPath = resolve(resolved.repoPath, 'warden.toml');
|
|
334
|
+
if (existsSync(configPath)) {
|
|
335
|
+
const config = loadWardenConfig(dirname(configPath));
|
|
336
|
+
configMinConfidence = config.defaults?.minConfidence;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
catch {
|
|
340
|
+
// Use default
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
// Apply filtering
|
|
344
|
+
const filteredReports = filterReports(allReports, options.reportOn, options.minConfidence ?? configMinConfidence ?? 'medium');
|
|
345
|
+
// Output results
|
|
346
|
+
reporter.blank();
|
|
347
|
+
if (options.json) {
|
|
348
|
+
const jsonlContent = renderJsonlString(filteredReports, totalDurationMs, lastRunMetadata ? {
|
|
349
|
+
runId: lastRunMetadata.runId,
|
|
350
|
+
traceId: lastRunMetadata.traceId,
|
|
351
|
+
timestamp: new Date(lastRunMetadata.timestamp),
|
|
352
|
+
model: lastRunMetadata.model,
|
|
353
|
+
headSha: lastRunMetadata.headSha,
|
|
354
|
+
cwd: lastRunMetadata.cwd,
|
|
355
|
+
} : undefined);
|
|
356
|
+
process.stdout.write(jsonlContent);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
console.log(renderTerminalReport(filteredReports, reporter.mode, { verbosity: reporter.verbosity }));
|
|
360
|
+
}
|
|
361
|
+
// Show summary
|
|
362
|
+
reporter.blank();
|
|
363
|
+
reporter.renderSummary(filteredReports, totalDurationMs);
|
|
364
|
+
return 0;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Garbage-collect expired log files.
|
|
368
|
+
*/
|
|
369
|
+
export async function runLogsGc(options, reporter) {
|
|
370
|
+
const resolved = resolveLogDir();
|
|
371
|
+
if (!resolved) {
|
|
372
|
+
reporter.error('Not a git repository');
|
|
373
|
+
return 1;
|
|
374
|
+
}
|
|
375
|
+
const { logDir, repoPath } = resolved;
|
|
376
|
+
// Load config for retentionDays
|
|
377
|
+
let retentionDays = 30;
|
|
378
|
+
try {
|
|
379
|
+
const configPath = resolve(repoPath, 'warden.toml');
|
|
380
|
+
if (existsSync(configPath)) {
|
|
381
|
+
const config = loadWardenConfig(dirname(configPath));
|
|
382
|
+
retentionDays = config.logs?.retentionDays ?? 30;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch {
|
|
386
|
+
// Use default
|
|
387
|
+
}
|
|
388
|
+
const expired = findExpiredArtifacts(logDir, retentionDays);
|
|
389
|
+
if (expired.length === 0) {
|
|
390
|
+
reporter.success('Nothing to clean up');
|
|
391
|
+
return 0;
|
|
392
|
+
}
|
|
393
|
+
let deleted = 0;
|
|
394
|
+
for (const filePath of expired) {
|
|
395
|
+
try {
|
|
396
|
+
unlinkSync(filePath);
|
|
397
|
+
deleted++;
|
|
398
|
+
}
|
|
399
|
+
catch {
|
|
400
|
+
// Skip files we can't delete
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
reporter.success(`Removed ${deleted} expired ${pluralize(deleted, 'log file')}`);
|
|
404
|
+
return 0;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Dispatch to the appropriate logs subcommand.
|
|
408
|
+
*/
|
|
409
|
+
export async function runLogs(logsOptions, options, reporter) {
|
|
410
|
+
switch (logsOptions.subcommand) {
|
|
411
|
+
case 'list':
|
|
412
|
+
return runLogsList(options, reporter);
|
|
413
|
+
case 'show':
|
|
414
|
+
return runLogsShow(logsOptions, options, reporter);
|
|
415
|
+
case 'gc':
|
|
416
|
+
return runLogsGc(options, reporter);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG1D,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAErE,OAAO,EACL,SAAS,EACT,cAAc,EACd,UAAU,EACV,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,GAGlB,MAAM,oBAAoB,CAAC;AAE5B;;GAEG;AACH,SAAS,aAAa;IACpB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,GAAW,EAAE,MAAc;IACjD,+DAA+D;IAC/D,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,oDAAoD;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,OAAO;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;aACxD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,4CAA4C;AAC5C,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,KAAa;IAC5C,MAAM,GAAG,GAAG,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,KAAa;IAC5C,MAAM,GAAG,GAAG,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IACrC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,IAAU;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;IACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAEzC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,UAAU,CAAC;IACpC,IAAI,OAAO,GAAG,EAAE;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC3C,IAAI,MAAM,GAAG,EAAE;QAAE,OAAO,GAAG,MAAM,OAAO,CAAC;IACzC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,WAAW,CAAC;IACvC,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,GAAG,QAAQ,OAAO,CAAC;IAE5C,qCAAqC;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7C,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;AAC/E,CAAC;AAED,MAAM,eAAe,GAA4C;IAC/D,IAAI,EAAE,KAAK,CAAC,GAAG;IACf,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,GAAG,EAAE,KAAK,CAAC,KAAK;CACjB,CAAC;AAEF;;GAEG;AACH,SAAS,uBAAuB,CAAC,UAA6C;IAC5E,MAAM,UAAU,GAAe,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAmB,EAAE,QAAkB;IACvE,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAE5B,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC;aAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;aACnC,IAAI,EAAE;aACN,OAAO,EAAE,CAAC,CAAC,4CAA4C;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC;IACf,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACvC,QAAQ,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mEAAmE;IACnE,MAAM,OAAO,GAA2D,EAAE,CAAC;IAC3E,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACpB,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;QAChD,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAChD,IAAI,EAAE,KAAK;YACX,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,KAAK;YAC9B,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS;YACtC,KAAK,EAAE,IAAI,EAAE,KAAK;YAClB,OAAO,EAAE,IAAI,EAAE,OAAO;YACtB,KAAK,EAAE,IAAI,EAAE,UAAU;YACvB,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,aAAa;YACrC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU;YACpC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;YACxC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO;YACrC,MAAM,EAAE,IAAI,EAAE,MAAM;SACrB,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC;IAeD,MAAM,IAAI,GAAU,EAAE,CAAC;IAEvB,mCAAmC;IACnC,MAAM,MAAM,GAAG;QACb,QAAQ,EAAE,CAAC;QACX,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAA8B;QACtE,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,GAAG,EAAU;KAC1B,CAAC;IAEF,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,CAAC;gBACR,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,EAAE,EAAE;gBACR,KAAK,EAAE,EAAE;gBACT,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC;gBAClC,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,EAAE;gBACR,GAAG,EAAE,EAAE;gBACP,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACjC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;QACzC,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAC5C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC1C,CAAC;QACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,UAAU,CAAC,GAAe,CAAC,IAAI,KAAK,CAAC;QAC9C,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC;YACR,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACpC,IAAI,EAAE,kBAAkB,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzD,KAAK,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;YACzD,QAAQ,EAAE,uBAAuB,CAAC,OAAO,CAAC,UAAU,CAAC;YACrD,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;YAC5C,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;YAC5D,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YACjD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,GAAG;YACxB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1B,CAAC,CAAC;IACL,CAAC;IAED,0BAA0B;IAC1B,MAAM,OAAO,GAAG;QACd,KAAK,EAAE,KAAK;QACZ,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,QAAQ,EAAE,UAAU;QACpB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;KACjB,CAAC;IACF,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxF,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5E,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACzE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;KACnF,CAAC;IAEF,aAAa;IACb,MAAM,UAAU,GACd,KAAK,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;QAChD,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QAC5C,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;QAC9C,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;QACpD,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QAC5C,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;QAC5C,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;QAC1C,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;QAC9C,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IAErC,YAAY;IACZ,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GACR,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;YACxD,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACnD,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;YACrD,GAAG,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;YAChD,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACnD,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACnD,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI;YACjD,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;YACrD,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED,iBAAiB;IACjB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,IAAI,CACX,KAAK,CAAC,GAAG,CACP,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO;QAC5D,GAAG,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAChE;QACD,uBAAuB,CAAC,MAAM,CAAC,UAAU,CAAC;QAC1C,KAAK,CAAC,GAAG,CACP,QAAQ,cAAc,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;YAC3C,QAAQ,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;YACpC,QAAQ,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CACvE,CACF,CAAC;IAEF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAwB,EACxB,OAAmB,EACnB,QAAkB;IAElB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;IAExC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mDAAmD;IACnD,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC;IAEhC,MAAM,aAAa,GAAa,EAAE,CAAC;IACnC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC5C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,aAAa,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;gBAC/B,SAAS;YACX,CAAC;QACH,CAAC;QACD,yCAAyC;QACzC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,KAAK,CAAC,OAAO,SAAS,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtG,OAAO,CAAC,CAAC;IACX,CAAC;IAED,yCAAyC;IACzC,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,eAA6C,CAAC;IAElD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC1C,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;YACnC,eAAe,IAAI,MAAM,CAAC,eAAe,CAAC;YAE1C,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC;gBACrC,QAAQ,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;gBAC5G,QAAQ,CAAC,KAAK,CAAC,aAAa,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;gBACxD,QAAQ,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,QAAQ,CAAC,KAAK,CAAC,mBAAmB,IAAI,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/F,OAAO,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gEAAgE;IAChE,IAAI,mBAAoD,CAAC;IACzD,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;YAC7D,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;gBACrD,mBAAmB,GAAG,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;YACvD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,MAAM,eAAe,GAAG,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,aAAa,IAAI,mBAAmB,IAAI,QAAQ,CAAC,CAAC;IAE9H,iBAAiB;IACjB,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,YAAY,GAAG,iBAAiB,CAAC,eAAe,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;YACzF,KAAK,EAAE,eAAe,CAAC,KAAK;YAC5B,OAAO,EAAE,eAAe,CAAC,OAAO;YAChC,SAAS,EAAE,IAAI,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC;YAC9C,KAAK,EAAE,eAAe,CAAC,KAAK;YAC5B,OAAO,EAAE,eAAe,CAAC,OAAO;YAChC,GAAG,EAAE,eAAe,CAAC,GAAG;SACzB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,eAAe,EAAE,QAAQ,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,eAAe;IACf,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,QAAQ,CAAC,aAAa,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAEzD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,OAAmB,EAAE,QAAkB;IACrE,MAAM,QAAQ,GAAG,aAAa,EAAE,CAAC;IACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACvC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC;IAEtC,gCAAgC;IAChC,IAAI,aAAa,GAAG,EAAE,CAAC;IACvB,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;YACrD,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,cAAc;IAChB,CAAC;IAED,MAAM,OAAO,GAAG,oBAAoB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAE5D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QACxC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,UAAU,CAAC,QAAQ,CAAC,CAAC;YACrB,OAAO,EAAE,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,6BAA6B;QAC/B,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,OAAO,CAAC,WAAW,OAAO,YAAY,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;IAEjF,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,WAAwB,EACxB,OAAmB,EACnB,QAAkB;IAElB,QAAQ,WAAW,CAAC,UAAU,EAAE,CAAC;QAC/B,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QACxC,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACrD,KAAK,IAAI;YACP,OAAO,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC;AACH,CAAC"}
|
package/dist/cli/main.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AA2CA;;;GAGG;AACH,eAAO,MAAM,eAAe,iBAAwB,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,WAAW;;CAAmB,CAAC;AA+uB5C,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA0F1C"}
|
package/dist/cli/main.js
CHANGED
|
@@ -3,22 +3,23 @@ import { dirname, join, resolve } from 'node:path';
|
|
|
3
3
|
import { config as dotenvConfig } from 'dotenv';
|
|
4
4
|
import { Sentry, flushSentry, setGlobalAttributes, emitRunMetric, getTraceId } from '../sentry.js';
|
|
5
5
|
import { loadWardenConfig, resolveSkillConfigs } from '../config/loader.js';
|
|
6
|
+
import { verifyAuth } from '../sdk/runner.js';
|
|
6
7
|
import { resolveSkillAsync } from '../skills/loader.js';
|
|
7
8
|
import { matchTrigger, filterContextByPaths, shouldFail, countFindingsAtOrAbove } from '../triggers/matcher.js';
|
|
8
9
|
import { filterFindings } from '../types/index.js';
|
|
9
10
|
import { DEFAULT_CONCURRENCY, getAnthropicApiKey } from '../utils/index.js';
|
|
10
11
|
import { parseCliArgs, showHelp, showVersion, classifyTargets } from './args.js';
|
|
11
12
|
import { buildLocalEventContext, buildFileEventContext } from './context.js';
|
|
12
|
-
import { getRepoRoot, refExists, hasUncommittedChanges } from './git.js';
|
|
13
|
+
import { getRepoRoot, getHeadSha, refExists, hasUncommittedChanges } from './git.js';
|
|
13
14
|
import { renderTerminalReport, filterReports } from './terminal.js';
|
|
14
|
-
import { Reporter, detectOutputMode, parseVerbosity, Verbosity, runSkillTasks, runSkillTasksWithInk, pluralize, writeJsonlContent, renderJsonlString, getRepoLogPath, generateRunId, } from './output/index.js';
|
|
15
|
+
import { Reporter, detectOutputMode, parseVerbosity, Verbosity, runSkillTasks, runSkillTasksWithInk, pluralize, MODEL_DEFAULT_SENTINEL, writeJsonlContent, renderJsonlString, getRepoLogPath, generateRunId, } from './output/index.js';
|
|
15
16
|
import { cleanupArtifacts } from './log-cleanup.js';
|
|
16
|
-
import { resolveSessionsDir } from '../sdk/session.js';
|
|
17
17
|
import { collectFixableFindings, applyAllFixes, runInteractiveFixFlow, renderFixSummary, } from './fix.js';
|
|
18
18
|
import { runInit } from './commands/init.js';
|
|
19
19
|
import { runAdd } from './commands/add.js';
|
|
20
20
|
import { runSetupApp } from './commands/setup-app.js';
|
|
21
21
|
import { runSync } from './commands/sync.js';
|
|
22
|
+
import { runLogs } from './commands/logs.js';
|
|
22
23
|
/**
|
|
23
24
|
* Global abort controller for graceful shutdown on SIGINT.
|
|
24
25
|
* Used to cancel in-progress SDK queries.
|
|
@@ -76,7 +77,14 @@ function writeEmptyRunLog(repoPath, opts) {
|
|
|
76
77
|
const runId = generateRunId();
|
|
77
78
|
const timestamp = new Date();
|
|
78
79
|
const logPath = getRepoLogPath(repoPath, runId, timestamp);
|
|
79
|
-
|
|
80
|
+
let headSha;
|
|
81
|
+
try {
|
|
82
|
+
headSha = getHeadSha(repoPath);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Not in a git repo or HEAD is unborn
|
|
86
|
+
}
|
|
87
|
+
const content = renderJsonlString([], 0, { runId, traceId: opts?.traceId, timestamp, headSha });
|
|
80
88
|
try {
|
|
81
89
|
writeJsonlContent(logPath, content);
|
|
82
90
|
}
|
|
@@ -121,13 +129,21 @@ function processTaskResults(results, reportOn, minConfidence) {
|
|
|
121
129
|
/**
|
|
122
130
|
* Output results and handle fixes. Returns exit code.
|
|
123
131
|
*/
|
|
124
|
-
async function outputResultsAndHandleFixes(processed, options, reporter, repoPath, totalDuration, failFastAborted) {
|
|
132
|
+
async function outputResultsAndHandleFixes(processed, options, reporter, repoPath, totalDuration, failFastAborted, resolvedModel) {
|
|
125
133
|
const { reports, filteredReports, hasFailure, failureReasons } = processed;
|
|
126
134
|
const traceId = getTraceId();
|
|
127
135
|
const runId = generateRunId();
|
|
128
136
|
const timestamp = new Date();
|
|
137
|
+
// Capture HEAD SHA safely (non-fatal if not in a git repo)
|
|
138
|
+
let headSha;
|
|
139
|
+
try {
|
|
140
|
+
headSha = getHeadSha(repoPath);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Not in a git repo or HEAD is unborn
|
|
144
|
+
}
|
|
129
145
|
// Render JSONL content once so repo log and --output have identical timestamps
|
|
130
|
-
const jsonlContent = renderJsonlString(reports, totalDuration, { runId, traceId, timestamp });
|
|
146
|
+
const jsonlContent = renderJsonlString(reports, totalDuration, { runId, traceId, timestamp, model: resolvedModel, headSha });
|
|
131
147
|
// Always write repo-local JSONL log (non-fatal — don't lose analysis output)
|
|
132
148
|
const logPath = getRepoLogPath(repoPath, runId, timestamp);
|
|
133
149
|
let logWritten = false;
|
|
@@ -220,6 +236,14 @@ async function runSkills(context, options, reporter) {
|
|
|
220
236
|
if (!apiKey) {
|
|
221
237
|
reporter.debug('No API key found. Using Claude Code subscription auth.');
|
|
222
238
|
}
|
|
239
|
+
// Pre-flight: verify auth will work before starting analysis
|
|
240
|
+
try {
|
|
241
|
+
verifyAuth({ apiKey });
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
reporter.error(error.message);
|
|
245
|
+
return 1;
|
|
246
|
+
}
|
|
223
247
|
// Try to find repo root for config loading
|
|
224
248
|
let repoPath;
|
|
225
249
|
try {
|
|
@@ -286,16 +310,18 @@ async function runSkills(context, options, reporter) {
|
|
|
286
310
|
}
|
|
287
311
|
// Build skill tasks
|
|
288
312
|
// Model precedence: defaults.model > CLI flag > WARDEN_MODEL env var > SDK default
|
|
289
|
-
|
|
313
|
+
// sdkModel is undefined when no model is explicitly configured (lets SDK use its default).
|
|
314
|
+
// logModel records what was used for JSONL logs (sentinel when no explicit model).
|
|
315
|
+
const sdkModel = config?.defaults?.model ?? options.model ?? process.env['WARDEN_MODEL'];
|
|
316
|
+
const logModel = sdkModel ?? MODEL_DEFAULT_SENTINEL;
|
|
290
317
|
const runnerOptions = {
|
|
291
318
|
apiKey,
|
|
292
|
-
model,
|
|
319
|
+
model: sdkModel,
|
|
293
320
|
abortController,
|
|
294
321
|
maxTurns: config?.defaults?.maxTurns,
|
|
295
322
|
batchDelayMs: config?.defaults?.batchDelayMs,
|
|
296
323
|
maxContextFiles: config?.defaults?.chunking?.maxContextFiles,
|
|
297
324
|
auxiliaryMaxRetries: config?.defaults?.auxiliaryMaxRetries,
|
|
298
|
-
session: config?.sessions ?? { enabled: true },
|
|
299
325
|
};
|
|
300
326
|
const tasks = skillsToRun.map(({ skill, remote, filters }) => ({
|
|
301
327
|
name: skill,
|
|
@@ -323,7 +349,7 @@ async function runSkills(context, options, reporter) {
|
|
|
323
349
|
const totalDuration = Date.now() - startTime;
|
|
324
350
|
const effectiveMinConfidence = options.minConfidence ?? config?.defaults?.minConfidence ?? 'medium';
|
|
325
351
|
const processed = processTaskResults(results, options.reportOn, effectiveMinConfidence);
|
|
326
|
-
return outputResultsAndHandleFixes(processed, options, reporter, repoPath ?? cwd, totalDuration, failFastController?.signal.aborted);
|
|
352
|
+
return outputResultsAndHandleFixes(processed, options, reporter, repoPath ?? cwd, totalDuration, failFastController?.signal.aborted, logModel);
|
|
327
353
|
}
|
|
328
354
|
/**
|
|
329
355
|
* Run in file mode: analyze specific files.
|
|
@@ -524,6 +550,14 @@ async function runConfigMode(options, reporter) {
|
|
|
524
550
|
if (!apiKey) {
|
|
525
551
|
reporter.debug('No API key found. Using Claude Code subscription auth.');
|
|
526
552
|
}
|
|
553
|
+
// Pre-flight: verify auth will work before starting analysis
|
|
554
|
+
try {
|
|
555
|
+
verifyAuth({ apiKey });
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
reporter.error(error.message);
|
|
559
|
+
return 1;
|
|
560
|
+
}
|
|
527
561
|
// Build trigger tasks
|
|
528
562
|
const effectiveMinConfidence = options.minConfidence ?? config.defaults?.minConfidence ?? 'medium';
|
|
529
563
|
const tasks = triggersToRun.map((trigger) => ({
|
|
@@ -543,7 +577,6 @@ async function runConfigMode(options, reporter) {
|
|
|
543
577
|
maxTurns: trigger.maxTurns,
|
|
544
578
|
maxContextFiles: config.defaults?.chunking?.maxContextFiles,
|
|
545
579
|
auxiliaryMaxRetries: config.defaults?.auxiliaryMaxRetries,
|
|
546
|
-
session: config.sessions ?? { enabled: true },
|
|
547
580
|
},
|
|
548
581
|
}));
|
|
549
582
|
// Run triggers with Ink UI (TTY) or simple console output (non-TTY)
|
|
@@ -561,7 +594,9 @@ async function runConfigMode(options, reporter) {
|
|
|
561
594
|
// Process results and output
|
|
562
595
|
const totalDuration = Date.now() - startTime;
|
|
563
596
|
const processed = processTaskResults(results, options.reportOn, effectiveMinConfidence);
|
|
564
|
-
|
|
597
|
+
// Run-level model is the default (ignoring per-trigger overrides); per-skill models are on each report.
|
|
598
|
+
const defaultModel = config.defaults?.model ?? options.model ?? process.env['WARDEN_MODEL'] ?? MODEL_DEFAULT_SENTINEL;
|
|
599
|
+
return outputResultsAndHandleFixes(processed, options, reporter, repoPath, totalDuration, failFastController?.signal.aborted, defaultModel);
|
|
565
600
|
}
|
|
566
601
|
/**
|
|
567
602
|
* Run in direct skill mode: run a specific skill on uncommitted changes.
|
|
@@ -642,7 +677,7 @@ async function runCommand(options, reporter) {
|
|
|
642
677
|
return runFileMode(filePatterns, options, reporter);
|
|
643
678
|
}
|
|
644
679
|
export async function main() {
|
|
645
|
-
const { command, options, setupAppOptions } = parseCliArgs();
|
|
680
|
+
const { command, options, setupAppOptions, logsOptions } = parseCliArgs();
|
|
646
681
|
if (command === 'help') {
|
|
647
682
|
showHelp();
|
|
648
683
|
process.exit(0);
|
|
@@ -687,6 +722,12 @@ export async function main() {
|
|
|
687
722
|
return runSetupApp(setupAppOptions, reporter);
|
|
688
723
|
case 'sync':
|
|
689
724
|
return runSync(options, reporter);
|
|
725
|
+
case 'logs':
|
|
726
|
+
if (!logsOptions) {
|
|
727
|
+
reporter.error('Missing logs options');
|
|
728
|
+
process.exit(1);
|
|
729
|
+
}
|
|
730
|
+
return runLogs(logsOptions, options, reporter);
|
|
690
731
|
default:
|
|
691
732
|
return runCommand(options, reporter);
|
|
692
733
|
}
|
|
@@ -709,14 +750,6 @@ export async function main() {
|
|
|
709
750
|
isTTY: reporter.mode.isTTY,
|
|
710
751
|
reporter,
|
|
711
752
|
});
|
|
712
|
-
// Session cleanup mirrors log cleanup
|
|
713
|
-
await cleanupArtifacts({
|
|
714
|
-
dir: resolveSessionsDir(cleanupRoot, cfg?.sessions?.directory),
|
|
715
|
-
retentionDays: cfg?.sessions?.retentionDays ?? 7,
|
|
716
|
-
mode: cfg?.sessions?.cleanup ?? 'auto',
|
|
717
|
-
isTTY: reporter.mode.isTTY,
|
|
718
|
-
reporter,
|
|
719
|
-
});
|
|
720
753
|
}
|
|
721
754
|
catch {
|
|
722
755
|
// Config load or cleanup failed — skip silently
|