@urateam/cli 0.1.48 → 0.1.50

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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=retry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/retry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,99 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ describe("retryCommand", () => {
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ let processExit;
5
+ let consoleLog;
6
+ let consoleError;
7
+ let origToken;
8
+ let origDashboardUrl;
9
+ let fetchMock;
10
+ beforeEach(() => {
11
+ origToken = process.env.URATEAM_CLI_TOKEN;
12
+ origDashboardUrl = process.env.URATEAM_DASHBOARD_URL;
13
+ process.env.URATEAM_CLI_TOKEN = "test-token-secret";
14
+ delete process.env.URATEAM_DASHBOARD_URL;
15
+ processExit = vi
16
+ .spyOn(process, "exit")
17
+ .mockImplementation(((_code) => {
18
+ throw new Error(`process.exit(${_code})`);
19
+ }));
20
+ consoleLog = vi.spyOn(console, "log").mockImplementation(() => { });
21
+ consoleError = vi.spyOn(console, "error").mockImplementation(() => { });
22
+ fetchMock = vi.fn();
23
+ vi.stubGlobal("fetch", fetchMock);
24
+ });
25
+ afterEach(() => {
26
+ if (origToken !== undefined) {
27
+ process.env.URATEAM_CLI_TOKEN = origToken;
28
+ }
29
+ else {
30
+ delete process.env.URATEAM_CLI_TOKEN;
31
+ }
32
+ if (origDashboardUrl !== undefined) {
33
+ process.env.URATEAM_DASHBOARD_URL = origDashboardUrl;
34
+ }
35
+ else {
36
+ delete process.env.URATEAM_DASHBOARD_URL;
37
+ }
38
+ processExit.mockRestore();
39
+ consoleLog.mockRestore();
40
+ consoleError.mockRestore();
41
+ vi.unstubAllGlobals();
42
+ vi.resetModules();
43
+ });
44
+ it("success: 2xx response prints confirmation and exits 0", async () => {
45
+ const runId = "run-uuid-1234";
46
+ fetchMock.mockResolvedValue({
47
+ ok: true,
48
+ status: 200,
49
+ text: async () => JSON.stringify({ runId, mode: "retry", issueId: "LIN-42" }),
50
+ });
51
+ const { retryCommand } = await import("../commands/retry.js");
52
+ retryCommand.exitOverride();
53
+ await retryCommand.parseAsync([runId], { from: "user" });
54
+ expect(fetchMock).toHaveBeenCalledOnce();
55
+ const [calledUrl, calledOpts] = fetchMock.mock.calls[0];
56
+ expect(calledUrl).toBe(`http://localhost:3001/cli/runs/${encodeURIComponent(runId)}/retry`);
57
+ expect(calledOpts.headers["x-ura-cli-token"]).toBe("test-token-secret");
58
+ expect(processExit).not.toHaveBeenCalled();
59
+ const logs = consoleLog.mock.calls.map((c) => c.join(" ")).join("\n");
60
+ expect(logs).toContain(`Retry queued for run ${runId}.`);
61
+ });
62
+ it("failure: non-2xx response prints HTTP status to stderr and exits 1", async () => {
63
+ const runId = "run-uuid-5678";
64
+ fetchMock.mockResolvedValue({
65
+ ok: false,
66
+ status: 409,
67
+ text: async () => "Cannot retry a run in status running",
68
+ });
69
+ const { retryCommand } = await import("../commands/retry.js");
70
+ retryCommand.exitOverride();
71
+ await expect(retryCommand.parseAsync([runId], { from: "user" })).rejects.toThrow("process.exit(1)");
72
+ expect(consoleError).toHaveBeenCalledWith(expect.stringContaining("HTTP 409"));
73
+ expect(consoleError).toHaveBeenCalledWith(expect.stringContaining("Cannot retry a run in status running"));
74
+ });
75
+ it("missing URATEAM_CLI_TOKEN: prints clear error and does not call fetch", async () => {
76
+ delete process.env.URATEAM_CLI_TOKEN;
77
+ const { retryCommand } = await import("../commands/retry.js");
78
+ retryCommand.exitOverride();
79
+ await expect(retryCommand.parseAsync(["some-run-id"], { from: "user" })).rejects.toThrow("process.exit(1)");
80
+ expect(fetchMock).not.toHaveBeenCalled();
81
+ const errors = consoleError.mock.calls.map((c) => c.join(" ")).join("\n");
82
+ expect(errors).toContain("URATEAM_CLI_TOKEN");
83
+ });
84
+ it("--url override: POSTs to the provided URL instead of default", async () => {
85
+ const runId = "run-abc";
86
+ const customUrl = "http://my-dashboard:4000";
87
+ fetchMock.mockResolvedValue({
88
+ ok: true,
89
+ status: 200,
90
+ text: async () => JSON.stringify({ runId, mode: "retry", issueId: "LIN-1" }),
91
+ });
92
+ const { retryCommand } = await import("../commands/retry.js");
93
+ retryCommand.exitOverride();
94
+ await retryCommand.parseAsync([runId, "--url", customUrl], { from: "user" });
95
+ const [calledUrl] = fetchMock.mock.calls[0];
96
+ expect(calledUrl).toBe(`${customUrl}/cli/runs/${encodeURIComponent(runId)}/retry`);
97
+ });
98
+ });
99
+ //# sourceMappingURL=retry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.test.js","sourceRoot":"","sources":["../../src/__tests__/retry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=triage-quality.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-quality.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/triage-quality.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,101 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { formatTriageQualityText } from "../commands/triage-quality.js";
3
+ function makeEvent(overrides = {}) {
4
+ return {
5
+ id: overrides.id ?? "evt_abc",
6
+ timestamp: overrides.timestamp ?? new Date("2026-05-14T10:00:00Z"),
7
+ runId: overrides.runId ?? "run_aejLOYRQ",
8
+ issueId: overrides.issueId ?? "BEC-217",
9
+ payload: {
10
+ hasV2Prediction: true,
11
+ predicted: 6,
12
+ actual: 6,
13
+ intersection: 5,
14
+ missed: ["packages/core/src/audit/events.ts"],
15
+ unexpected: ["pnpm-lock.yaml"],
16
+ ...(overrides.payload ?? {}),
17
+ },
18
+ };
19
+ }
20
+ describe("formatTriageQualityText", () => {
21
+ it("outputs 'No triage-quality events' when list is empty", () => {
22
+ const out = formatTriageQualityText([], 7, 20);
23
+ expect(out).toContain("No triage-quality events in the last 7 days.");
24
+ });
25
+ it("includes header with days count", () => {
26
+ const out = formatTriageQualityText([makeEvent()], 14, 20);
27
+ expect(out).toContain("Triage v2 prediction quality — last 14 days");
28
+ });
29
+ it("includes Summary section", () => {
30
+ const events = [
31
+ makeEvent({ issueId: "BEC-1" }),
32
+ makeEvent({
33
+ issueId: "BEC-2",
34
+ payload: { hasV2Prediction: false, predicted: 0, actual: 3, intersection: 0, missed: [], unexpected: [] },
35
+ }),
36
+ ];
37
+ const out = formatTriageQualityText(events, 7, 20);
38
+ expect(out).toContain("Summary:");
39
+ expect(out).toContain("Runs with v2 prediction: 1");
40
+ expect(out).toContain("Runs without v2 prediction: 1");
41
+ });
42
+ it("computes intersection ratio correctly", () => {
43
+ // predicted=6, actual=6, intersection=5 → ratio = 5/6 ≈ 83%
44
+ const out = formatTriageQualityText([makeEvent()], 7, 20);
45
+ expect(out).toContain("Avg intersection ratio: 83%");
46
+ });
47
+ it("includes Top missed files section", () => {
48
+ const events = [
49
+ makeEvent({ payload: { hasV2Prediction: true, predicted: 2, actual: 1, intersection: 1, missed: ["CLAUDE.md"], unexpected: [] } }),
50
+ makeEvent({ payload: { hasV2Prediction: true, predicted: 2, actual: 1, intersection: 1, missed: ["CLAUDE.md"], unexpected: [] } }),
51
+ ];
52
+ const out = formatTriageQualityText(events, 7, 20);
53
+ expect(out).toContain("Top missed files (predicted but not in diff):");
54
+ expect(out).toContain("CLAUDE.md");
55
+ expect(out).toContain("2 runs");
56
+ });
57
+ it("includes Top unexpected files section", () => {
58
+ const events = [
59
+ makeEvent({ payload: { hasV2Prediction: true, predicted: 1, actual: 2, intersection: 1, missed: [], unexpected: ["pnpm-lock.yaml"] } }),
60
+ ];
61
+ const out = formatTriageQualityText(events, 7, 20);
62
+ expect(out).toContain("Top unexpected files (in diff but not predicted):");
63
+ expect(out).toContain("pnpm-lock.yaml");
64
+ });
65
+ it("includes Recent runs section with correct format for v2", () => {
66
+ const out = formatTriageQualityText([makeEvent()], 7, 20);
67
+ expect(out).toContain("Recent runs (most recent first):");
68
+ // run_aejLOYRQ sliced to 8 chars = "run_aejL"
69
+ expect(out).toContain("predicted=6");
70
+ expect(out).toContain("actual=6");
71
+ expect(out).toContain("hit=5/6");
72
+ });
73
+ it("includes Recent runs section with correct format for non-v2", () => {
74
+ const events = [
75
+ makeEvent({
76
+ payload: { hasV2Prediction: false, predicted: 0, actual: 4, intersection: 0, missed: [], unexpected: [] },
77
+ }),
78
+ ];
79
+ const out = formatTriageQualityText(events, 7, 20);
80
+ expect(out).toContain("(no v2 prediction)");
81
+ expect(out).toContain("actual=4");
82
+ });
83
+ it("respects limit for Recent runs table", () => {
84
+ const events = Array.from({ length: 10 }, (_, i) => makeEvent({ id: `evt-${i}`, issueId: `BEC-${i}`, runId: `run_${i.toString().padStart(8, "0")}` }));
85
+ const out = formatTriageQualityText(events, 7, 3);
86
+ // Only 3 runs should appear in Recent runs section
87
+ const recentSection = out.split("Recent runs (most recent first):")[1] ?? "";
88
+ const runLines = recentSection.split("\n").filter((l) => l.trim().startsWith("BEC-") || l.match(/^\s+BEC-/));
89
+ expect(runLines.length).toBeLessThanOrEqual(3);
90
+ });
91
+ it("shows (none) when no missed files", () => {
92
+ const events = [
93
+ makeEvent({ payload: { hasV2Prediction: true, predicted: 3, actual: 3, intersection: 3, missed: [], unexpected: [] } }),
94
+ ];
95
+ const out = formatTriageQualityText(events, 7, 20);
96
+ expect(out).toContain("Top missed files (predicted but not in diff):");
97
+ const missedSection = out.split("Top missed files (predicted but not in diff):")[1] ?? "";
98
+ expect(missedSection).toContain("(none)");
99
+ });
100
+ });
101
+ //# sourceMappingURL=triage-quality.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-quality.test.js","sourceRoot":"","sources":["../../src/__tests__/triage-quality.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * `ura retry` — re-queue a failed or retriable pipeline run via the
3
+ * running urateam container's /cli/* HTTP endpoint.
4
+ *
5
+ * Auth: the CLI passes `X-Ura-Cli-Token: $URATEAM_CLI_TOKEN`; the server's
6
+ * `/cli/*` routes 404 when the env var is unset and 403 on token mismatch.
7
+ * Audit events record the OS user from `os.userInfo().username` as the
8
+ * actor.
9
+ */
10
+ import { Command } from "commander";
11
+ export declare const retryCommand: Command;
12
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmCpC,eAAO,MAAM,YAAY,SAkCrB,CAAC"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * `ura retry` — re-queue a failed or retriable pipeline run via the
3
+ * running urateam container's /cli/* HTTP endpoint.
4
+ *
5
+ * Auth: the CLI passes `X-Ura-Cli-Token: $URATEAM_CLI_TOKEN`; the server's
6
+ * `/cli/*` routes 404 when the env var is unset and 403 on token mismatch.
7
+ * Audit events record the OS user from `os.userInfo().username` as the
8
+ * actor.
9
+ */
10
+ import { Command } from "commander";
11
+ import * as os from "node:os";
12
+ function fail(msg) {
13
+ console.error(msg);
14
+ process.exit(1);
15
+ }
16
+ function resolveDashboardUrl(override) {
17
+ const raw = override ??
18
+ process.env.URATEAM_DASHBOARD_URL ??
19
+ "http://localhost:3001";
20
+ return raw.replace(/\/+$/, "");
21
+ }
22
+ function resolveToken() {
23
+ const token = process.env.URATEAM_CLI_TOKEN;
24
+ if (!token) {
25
+ fail("URATEAM_CLI_TOKEN is not set. Set it in the same environment as the " +
26
+ "urateam container (matches `URATEAM_CLI_TOKEN` in .env) and re-run.");
27
+ }
28
+ return token;
29
+ }
30
+ function actor() {
31
+ try {
32
+ return os.userInfo().username;
33
+ }
34
+ catch {
35
+ return "unknown";
36
+ }
37
+ }
38
+ export const retryCommand = new Command("retry")
39
+ .description("Re-queue a failed or retriable pipeline run. Talks to the running urateam container via its /cli/runs/:id/retry endpoint.")
40
+ .argument("<run-id>", "Pipeline run id (UUID) to retry")
41
+ .option("--url <url>", "Dashboard URL (default: $URATEAM_DASHBOARD_URL or http://localhost:3001)")
42
+ .action(async (runId, opts) => {
43
+ const base = resolveDashboardUrl(opts.url);
44
+ const token = resolveToken();
45
+ const url = `${base}/cli/runs/${encodeURIComponent(runId)}/retry`;
46
+ let resp;
47
+ try {
48
+ resp = await fetch(url, {
49
+ method: "POST",
50
+ headers: {
51
+ "x-ura-cli-token": token,
52
+ "x-ura-actor": actor(),
53
+ },
54
+ });
55
+ }
56
+ catch (err) {
57
+ fail(`Failed to reach ${url}: ${err instanceof Error ? err.message : String(err)}`);
58
+ }
59
+ const body = await resp.text();
60
+ if (!resp.ok)
61
+ fail(`HTTP ${resp.status}: ${body}`);
62
+ console.log(`Retry queued for run ${runId}.`);
63
+ });
64
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,SAAS,IAAI,CAAC,GAAW;IACvB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,mBAAmB,CAAC,QAAiB;IAC5C,MAAM,GAAG,GACP,QAAQ;QACR,OAAO,CAAC,GAAG,CAAC,qBAAqB;QACjC,uBAAuB,CAAC;IAC1B,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,CACF,sEAAsE;YACpE,qEAAqE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,KAAK;IACZ,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CACV,2HAA2H,CAC5H;KACA,QAAQ,CAAC,UAAU,EAAE,iCAAiC,CAAC;KACvD,MAAM,CACL,aAAa,EACb,0EAA0E,CAC3E;KACA,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAsB,EAAE,EAAE;IACtD,MAAM,IAAI,GAAG,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,GAAG,IAAI,aAAa,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC;IAElE,IAAI,IAAc,CAAC;IACnB,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,iBAAiB,EAAE,KAAK;gBACxB,aAAa,EAAE,KAAK,EAAE;aACvB;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CACF,mBAAmB,GAAG,KACpB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACjD,EAAE,CACH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Command } from "commander";
2
+ import type { TriageQualityEvent } from "@urateam/core";
3
+ /**
4
+ * Format a list of triage quality events as human-readable text.
5
+ * Exported for unit testing.
6
+ */
7
+ export declare function formatTriageQualityText(events: TriageQualityEvent[], days: number, limit: number): string;
8
+ export declare const triageQualityCommand: Command;
9
+ //# sourceMappingURL=triage-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-quality.d.ts","sourceRoot":"","sources":["../../src/commands/triage-quality.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,KAAK,EAAS,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAK/D;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,kBAAkB,EAAE,EAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,MAAM,CAoHR;AAsBD,eAAO,MAAM,oBAAoB,SAwC9B,CAAC"}
@@ -0,0 +1,153 @@
1
+ import { Command } from "commander";
2
+ import { createDb } from "@urateam/core";
3
+ import { readTriageQualityEvents } from "@urateam/core";
4
+ // ─── Formatter ────────────────────────────────────────────────────────────────
5
+ /**
6
+ * Format a list of triage quality events as human-readable text.
7
+ * Exported for unit testing.
8
+ */
9
+ export function formatTriageQualityText(events, days, limit) {
10
+ const lines = [];
11
+ lines.push(`Triage v2 prediction quality — last ${days} days`);
12
+ lines.push("");
13
+ if (events.length === 0) {
14
+ lines.push(`No triage-quality events in the last ${days} days.`);
15
+ return lines.join("\n");
16
+ }
17
+ const v2Events = events.filter((e) => e.payload.hasV2Prediction);
18
+ const nonV2Count = events.length - v2Events.length;
19
+ // ── Summary (single pass over v2Events) ──────────────────────────────────
20
+ let sumPredicted = 0;
21
+ let sumActual = 0;
22
+ const intersectionRatios = [];
23
+ const missRates = [];
24
+ const unexpectedRates = [];
25
+ const missedCounts = new Map();
26
+ const unexpectedCounts = new Map();
27
+ for (const e of v2Events) {
28
+ const { predicted, actual, intersection, missed, unexpected } = e.payload;
29
+ sumPredicted += predicted;
30
+ sumActual += actual;
31
+ const denom = Math.max(predicted, actual);
32
+ if (denom > 0)
33
+ intersectionRatios.push(intersection / denom);
34
+ if (predicted > 0)
35
+ missRates.push(missed.length / predicted);
36
+ if (actual > 0)
37
+ unexpectedRates.push(unexpected.length / actual);
38
+ for (const f of missed)
39
+ missedCounts.set(f, (missedCounts.get(f) ?? 0) + 1);
40
+ for (const f of unexpected)
41
+ unexpectedCounts.set(f, (unexpectedCounts.get(f) ?? 0) + 1);
42
+ }
43
+ const avgPredicted = v2Events.length ? sumPredicted / v2Events.length : 0;
44
+ const avgActual = v2Events.length ? sumActual / v2Events.length : 0;
45
+ const avgIntersectionRatio = intersectionRatios.length
46
+ ? intersectionRatios.reduce((s, r) => s + r, 0) / intersectionRatios.length
47
+ : 0;
48
+ const avgMissRate = missRates.length
49
+ ? missRates.reduce((s, r) => s + r, 0) / missRates.length
50
+ : 0;
51
+ const avgUnexpectedRate = unexpectedRates.length
52
+ ? unexpectedRates.reduce((s, r) => s + r, 0) / unexpectedRates.length
53
+ : 0;
54
+ lines.push("Summary:");
55
+ lines.push(` Runs with v2 prediction: ${v2Events.length}`);
56
+ lines.push(` Runs without v2 prediction: ${nonV2Count}`);
57
+ lines.push(` Avg predicted count: ${avgPredicted.toFixed(1)}`);
58
+ lines.push(` Avg actual count: ${avgActual.toFixed(1)}`);
59
+ lines.push(` Avg intersection ratio: ${Math.round(avgIntersectionRatio * 100)}% (intersection / max(predicted, actual))`);
60
+ lines.push(` Avg miss rate: ${Math.round(avgMissRate * 100)}% (missed.length / predicted)`);
61
+ lines.push(` Avg unexpected rate: ${Math.round(avgUnexpectedRate * 100)}% (unexpected.length / actual)`);
62
+ lines.push("");
63
+ // ── Top missed files ──────────────────────────────────────────────────────
64
+ const topMissed = [...missedCounts.entries()]
65
+ .sort((a, b) => b[1] - a[1])
66
+ .slice(0, 10);
67
+ lines.push("Top missed files (predicted but not in diff):");
68
+ if (topMissed.length === 0) {
69
+ lines.push(" (none)");
70
+ }
71
+ else {
72
+ for (const [file, count] of topMissed) {
73
+ lines.push(` ${file.padEnd(50)} ${count} run${count !== 1 ? "s" : ""}`);
74
+ }
75
+ }
76
+ lines.push("");
77
+ // ── Top unexpected files ──────────────────────────────────────────────────
78
+ const topUnexpected = [...unexpectedCounts.entries()]
79
+ .sort((a, b) => b[1] - a[1])
80
+ .slice(0, 10);
81
+ lines.push("Top unexpected files (in diff but not predicted):");
82
+ if (topUnexpected.length === 0) {
83
+ lines.push(" (none)");
84
+ }
85
+ else {
86
+ for (const [file, count] of topUnexpected) {
87
+ lines.push(` ${file.padEnd(50)} ${count} run${count !== 1 ? "s" : ""}`);
88
+ }
89
+ }
90
+ lines.push("");
91
+ // ── Recent runs ───────────────────────────────────────────────────────────
92
+ lines.push("Recent runs (most recent first):");
93
+ const recentEvents = events.slice(0, limit);
94
+ for (const e of recentEvents) {
95
+ const issueId = (e.issueId ?? "(unknown)").padEnd(10);
96
+ const runId = e.runId ? e.runId.slice(0, 8) : "(unknown)";
97
+ const { predicted, actual, intersection, hasV2Prediction } = e.payload;
98
+ if (!hasV2Prediction) {
99
+ lines.push(` ${issueId} run ${runId} (no v2 prediction) actual=${actual}`);
100
+ }
101
+ else {
102
+ const denom = Math.max(predicted, actual);
103
+ const pct = denom > 0 ? Math.round((intersection / denom) * 100) : 100;
104
+ lines.push(` ${issueId} run ${runId} predicted=${predicted} actual=${actual} hit=${intersection}/${denom} (${pct}%)`);
105
+ }
106
+ }
107
+ return lines.join("\n");
108
+ }
109
+ // ─── Database helper ──────────────────────────────────────────────────────────
110
+ async function openDb(opts) {
111
+ const conn = process.env.DATABASE_URL;
112
+ if (!conn) {
113
+ opts.log("warning: DATABASE_URL is not set — defaulting to ./urateam.db");
114
+ return createDb({ connectionString: "./urateam.db" });
115
+ }
116
+ return createDb({ connectionString: conn });
117
+ }
118
+ // ─── Commander wiring ─────────────────────────────────────────────────────────
119
+ function fail(err) {
120
+ process.stderr.write((err instanceof Error ? err.message : String(err)) + "\n");
121
+ process.exit(1);
122
+ }
123
+ export const triageQualityCommand = new Command("triage-quality")
124
+ .description("Show aggregated pm.triage_quality_score stats from the audit log")
125
+ .option("--days <n>", "time window in days", "7")
126
+ .option("--limit <n>", "max events to print in the per-run table", "20")
127
+ .option("--format <fmt>", 'output format: text or json (default: text)', "text")
128
+ .action(async (opts) => {
129
+ const days = Math.max(1, parseInt(opts.days, 10) || 7);
130
+ const limit = Math.max(1, parseInt(opts.limit, 10) || 20);
131
+ const format = opts.format === "json" ? "json" : "text";
132
+ try {
133
+ const db = await openDb({
134
+ log: (msg) => process.stderr.write(msg + "\n"),
135
+ });
136
+ const sinceMs = Date.now() - days * 24 * 60 * 60 * 1000;
137
+ const events = await readTriageQualityEvents(db, {
138
+ sinceMs,
139
+ // Fetch up to 10× the display limit for summary stats accuracy
140
+ limit: Math.max(limit * 10, 500),
141
+ });
142
+ if (format === "json") {
143
+ process.stdout.write(JSON.stringify(events, null, 2) + "\n");
144
+ return;
145
+ }
146
+ // text mode
147
+ process.stdout.write(formatTriageQualityText(events, days, limit) + "\n");
148
+ }
149
+ catch (err) {
150
+ fail(err);
151
+ }
152
+ });
153
+ //# sourceMappingURL=triage-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage-quality.js","sourceRoot":"","sources":["../../src/commands/triage-quality.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -25,12 +25,14 @@ import { getPackageVersion } from "./version.js";
25
25
  import { licenseCommand } from "./commands/license.js";
26
26
  import { adminCommand } from "./commands/admin.js";
27
27
  import { stopCommand, haltCommand } from "./commands/control.js";
28
+ import { retryCommand } from "./commands/retry.js";
28
29
  import { initCommand } from "./commands/init.js";
29
30
  import { repoCommand } from "./commands/repo.js";
30
31
  import { uninstallCommand } from "./commands/uninstall.js";
31
32
  import { serviceCommand } from "./commands/service.js";
32
33
  import { selfAuthLinearCommand } from "./commands/self-auth-linear.js";
33
34
  import { bootstrapCommand } from "./commands/bootstrap.js";
35
+ import { triageQualityCommand } from "./commands/triage-quality.js";
34
36
  const program = new Command();
35
37
  program
36
38
  .name("ura")
@@ -46,11 +48,13 @@ program.addCommand(licenseCommand, { hidden: true });
46
48
  program.addCommand(adminCommand);
47
49
  program.addCommand(stopCommand);
48
50
  program.addCommand(haltCommand);
51
+ program.addCommand(retryCommand);
49
52
  program.addCommand(initCommand);
50
53
  program.addCommand(repoCommand);
51
54
  program.addCommand(uninstallCommand);
52
55
  program.addCommand(serviceCommand);
53
56
  program.addCommand(selfAuthLinearCommand);
54
57
  program.addCommand(bootstrapCommand);
58
+ program.addCommand(triageQualityCommand);
55
59
  program.parse();
56
60
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@urateam/cli",
3
- "version": "0.1.48",
3
+ "version": "0.1.50",
4
4
  "license": "BUSL-1.1",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -23,8 +23,8 @@
23
23
  "commander": "^13.1.0",
24
24
  "postgres": "^3.4.0",
25
25
  "zod": "^4.3.6",
26
- "@urateam/core": "0.1.46",
27
- "@urateam/dashboard": "0.1.46"
26
+ "@urateam/core": "0.1.48",
27
+ "@urateam/dashboard": "0.1.48"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@types/better-sqlite3": "^7.6.0",