@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.
Files changed (92) hide show
  1. package/agents.lock +7 -0
  2. package/dist/cli/args.d.ts +14 -12
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +44 -1
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/cli/commands/init.d.ts +0 -3
  7. package/dist/cli/commands/init.d.ts.map +1 -1
  8. package/dist/cli/commands/init.js +206 -19
  9. package/dist/cli/commands/init.js.map +1 -1
  10. package/dist/cli/commands/logs.d.ts +19 -0
  11. package/dist/cli/commands/logs.d.ts.map +1 -0
  12. package/dist/cli/commands/logs.js +419 -0
  13. package/dist/cli/commands/logs.js.map +1 -0
  14. package/dist/cli/main.d.ts.map +1 -1
  15. package/dist/cli/main.js +54 -21
  16. package/dist/cli/main.js.map +1 -1
  17. package/dist/cli/output/formatters.d.ts +2 -1
  18. package/dist/cli/output/formatters.d.ts.map +1 -1
  19. package/dist/cli/output/formatters.js +22 -19
  20. package/dist/cli/output/formatters.js.map +1 -1
  21. package/dist/cli/output/index.d.ts +1 -1
  22. package/dist/cli/output/index.d.ts.map +1 -1
  23. package/dist/cli/output/index.js +1 -1
  24. package/dist/cli/output/index.js.map +1 -1
  25. package/dist/cli/output/ink-runner.js +1 -1
  26. package/dist/cli/output/ink-runner.js.map +1 -1
  27. package/dist/cli/output/jsonl.d.ts +49 -13
  28. package/dist/cli/output/jsonl.d.ts.map +1 -1
  29. package/dist/cli/output/jsonl.js +137 -4
  30. package/dist/cli/output/jsonl.js.map +1 -1
  31. package/dist/cli/output/tasks.d.ts.map +1 -1
  32. package/dist/cli/output/tasks.js +1 -22
  33. package/dist/cli/output/tasks.js.map +1 -1
  34. package/dist/cli/terminal.d.ts.map +1 -1
  35. package/dist/cli/terminal.js +0 -2
  36. package/dist/cli/terminal.js.map +1 -1
  37. package/dist/config/schema.d.ts +49 -98
  38. package/dist/config/schema.d.ts.map +1 -1
  39. package/dist/config/schema.js +0 -12
  40. package/dist/config/schema.js.map +1 -1
  41. package/dist/evals/runner.d.ts.map +1 -1
  42. package/dist/evals/runner.js +0 -1
  43. package/dist/evals/runner.js.map +1 -1
  44. package/dist/evals/types.d.ts +9 -15
  45. package/dist/evals/types.d.ts.map +1 -1
  46. package/dist/output/github-checks.d.ts +1 -1
  47. package/dist/output/github-checks.d.ts.map +1 -1
  48. package/dist/output/github-checks.js +2 -6
  49. package/dist/output/github-checks.js.map +1 -1
  50. package/dist/output/issue-renderer.js +1 -1
  51. package/dist/output/issue-renderer.js.map +1 -1
  52. package/dist/sdk/analyze.d.ts.map +1 -1
  53. package/dist/sdk/analyze.js +13 -26
  54. package/dist/sdk/analyze.js.map +1 -1
  55. package/dist/sdk/auth.d.ts +16 -0
  56. package/dist/sdk/auth.d.ts.map +1 -0
  57. package/dist/sdk/auth.js +37 -0
  58. package/dist/sdk/auth.js.map +1 -0
  59. package/dist/sdk/errors.d.ts +5 -0
  60. package/dist/sdk/errors.d.ts.map +1 -1
  61. package/dist/sdk/errors.js +20 -0
  62. package/dist/sdk/errors.js.map +1 -1
  63. package/dist/sdk/prompt.js +1 -1
  64. package/dist/sdk/runner.d.ts +2 -1
  65. package/dist/sdk/runner.d.ts.map +1 -1
  66. package/dist/sdk/runner.js +3 -1
  67. package/dist/sdk/runner.js.map +1 -1
  68. package/dist/sdk/types.d.ts +0 -3
  69. package/dist/sdk/types.d.ts.map +1 -1
  70. package/dist/sdk/types.js.map +1 -1
  71. package/dist/types/index.d.ts +23 -24
  72. package/dist/types/index.d.ts.map +1 -1
  73. package/dist/types/index.js +19 -7
  74. package/dist/types/index.js.map +1 -1
  75. package/package.json +1 -1
  76. package/skills/warden/SKILL.md +76 -0
  77. package/skills/warden/references/cli-reference.md +142 -0
  78. package/skills/warden/references/config-schema.md +111 -0
  79. package/skills/warden/references/configuration.md +110 -0
  80. package/skills/warden/references/creating-skills.md +84 -0
  81. package/skills/warden-sweep/SKILL.md +407 -0
  82. package/skills/warden-sweep/scripts/_utils.py +37 -0
  83. package/skills/warden-sweep/scripts/extract_findings.py +219 -0
  84. package/skills/warden-sweep/scripts/find_reviewers.py +115 -0
  85. package/skills/warden-sweep/scripts/generate_report.py +271 -0
  86. package/skills/warden-sweep/scripts/index_prs.py +187 -0
  87. package/skills/warden-sweep/scripts/organize.py +315 -0
  88. package/skills/warden-sweep/scripts/scan.py +632 -0
  89. package/dist/sdk/session.d.ts +0 -43
  90. package/dist/sdk/session.d.ts.map +0 -1
  91. package/dist/sdk/session.js +0 -105
  92. 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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AA0CA;;;GAGG;AACH,eAAO,MAAM,eAAe,iBAAwB,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,WAAW;;CAAmB,CAAC;AA6sB5C,wBAAsB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CA4F1C"}
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
- const content = renderJsonlString([], 0, { runId, traceId: opts?.traceId, timestamp });
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
- const model = config?.defaults?.model ?? options.model ?? process.env['WARDEN_MODEL'];
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
- return outputResultsAndHandleFixes(processed, options, reporter, repoPath, totalDuration, failFastController?.signal.aborted);
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