@prestyj/cli 4.3.58 → 4.3.83

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 (66) hide show
  1. package/dist/cli.js +153 -0
  2. package/dist/cli.js.map +1 -1
  3. package/dist/core/auto-update.js +1 -1
  4. package/dist/core/auto-update.js.map +1 -1
  5. package/dist/core/pixel-fix-agent.d.ts +24 -0
  6. package/dist/core/pixel-fix-agent.d.ts.map +1 -0
  7. package/dist/core/pixel-fix-agent.js +49 -0
  8. package/dist/core/pixel-fix-agent.js.map +1 -0
  9. package/dist/core/pixel-fix.d.ts +70 -0
  10. package/dist/core/pixel-fix.d.ts.map +1 -0
  11. package/dist/core/pixel-fix.js +302 -0
  12. package/dist/core/pixel-fix.js.map +1 -0
  13. package/dist/core/pixel-fix.test.d.ts +2 -0
  14. package/dist/core/pixel-fix.test.d.ts.map +1 -0
  15. package/dist/core/pixel-fix.test.js +296 -0
  16. package/dist/core/pixel-fix.test.js.map +1 -0
  17. package/dist/core/pixel.d.ts +34 -0
  18. package/dist/core/pixel.d.ts.map +1 -0
  19. package/dist/core/pixel.js +308 -0
  20. package/dist/core/pixel.js.map +1 -0
  21. package/dist/core/pixel.test.d.ts +2 -0
  22. package/dist/core/pixel.test.d.ts.map +1 -0
  23. package/dist/core/pixel.test.js +214 -0
  24. package/dist/core/pixel.test.js.map +1 -0
  25. package/dist/core/source-maps.d.ts +47 -0
  26. package/dist/core/source-maps.d.ts.map +1 -0
  27. package/dist/core/source-maps.js +132 -0
  28. package/dist/core/source-maps.js.map +1 -0
  29. package/dist/core/source-maps.test.d.ts +2 -0
  30. package/dist/core/source-maps.test.d.ts.map +1 -0
  31. package/dist/core/source-maps.test.js +175 -0
  32. package/dist/core/source-maps.test.js.map +1 -0
  33. package/dist/modes/agent-home-mode.js +3 -3
  34. package/dist/modes/agent-home-mode.js.map +1 -1
  35. package/dist/ui/App.d.ts +2 -0
  36. package/dist/ui/App.d.ts.map +1 -1
  37. package/dist/ui/App.js +139 -7
  38. package/dist/ui/App.js.map +1 -1
  39. package/dist/ui/components/InputArea.d.ts +2 -1
  40. package/dist/ui/components/InputArea.d.ts.map +1 -1
  41. package/dist/ui/components/InputArea.js +6 -1
  42. package/dist/ui/components/InputArea.js.map +1 -1
  43. package/dist/ui/components/PixelOverlay.d.ts +11 -0
  44. package/dist/ui/components/PixelOverlay.d.ts.map +1 -0
  45. package/dist/ui/components/PixelOverlay.js +116 -0
  46. package/dist/ui/components/PixelOverlay.js.map +1 -0
  47. package/dist/ui/components/PlanOverlay.js +3 -3
  48. package/dist/ui/components/PlanOverlay.js.map +1 -1
  49. package/dist/ui/components/SkillsOverlay.js +3 -3
  50. package/dist/ui/components/SkillsOverlay.js.map +1 -1
  51. package/dist/ui/pixel.d.ts +22 -0
  52. package/dist/ui/pixel.d.ts.map +1 -0
  53. package/dist/ui/pixel.js +394 -0
  54. package/dist/ui/pixel.js.map +1 -0
  55. package/dist/ui/pixel.test.d.ts +2 -0
  56. package/dist/ui/pixel.test.d.ts.map +1 -0
  57. package/dist/ui/pixel.test.js +130 -0
  58. package/dist/ui/pixel.test.js.map +1 -0
  59. package/dist/ui/render.d.ts +2 -0
  60. package/dist/ui/render.d.ts.map +1 -1
  61. package/dist/ui/render.js +2 -0
  62. package/dist/ui/render.js.map +1 -1
  63. package/dist/utils/image.d.ts.map +1 -1
  64. package/dist/utils/image.js +15 -0
  65. package/dist/utils/image.js.map +1 -1
  66. package/package.json +37 -3
@@ -0,0 +1,296 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { EventEmitter } from "node:events";
6
+ import { buildAgentPrompt, fixError, } from "./pixel-fix.js";
7
+ let home;
8
+ beforeEach(() => {
9
+ home = mkdtempSync(join(tmpdir(), "ezcoder-fix-"));
10
+ });
11
+ afterEach(() => rmSync(home, { recursive: true, force: true }));
12
+ function setupProjectMapping(projectId, name, path) {
13
+ mkdirSync(join(home, ".ezcoder"), { recursive: true });
14
+ writeFileSync(join(home, ".ezcoder", "projects.json"), JSON.stringify({ [projectId]: { name, path } }));
15
+ }
16
+ const baseError = {
17
+ id: "err_abc123",
18
+ project_id: "proj_p1",
19
+ fingerprint: "fp",
20
+ status: "open",
21
+ type: "TypeError",
22
+ message: "Cannot read properties of undefined (reading 'name')",
23
+ stack: JSON.stringify([
24
+ { fn: "UserCard", file: "/repo/src/UserCard.tsx", line: 42, col: 23, in_app: true },
25
+ { fn: "lib", file: "/repo/node_modules/react/index.js", line: 1, col: 1, in_app: false },
26
+ ]),
27
+ code_context: JSON.stringify({
28
+ file: "/repo/src/UserCard.tsx",
29
+ error_line: 42,
30
+ lines: [
31
+ "function UserCard({ user }: Props) {",
32
+ " return (",
33
+ " <div>{user.name}</div>",
34
+ " );",
35
+ "}",
36
+ ],
37
+ }),
38
+ runtime: "node-22",
39
+ occurrences: 47,
40
+ recurrence_count: 0,
41
+ branch: null,
42
+ };
43
+ describe("buildAgentPrompt", () => {
44
+ it("includes the error type, message, and in-app location", () => {
45
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
46
+ expect(prompt).toContain("TypeError");
47
+ expect(prompt).toContain("Cannot read properties of undefined");
48
+ expect(prompt).toContain("Location: /repo/src/UserCard.tsx:42");
49
+ });
50
+ it("renders the code window with a marker on the error line", () => {
51
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
52
+ expect(prompt).toContain("> ");
53
+ expect(prompt).toContain("<div>{user.name}</div>");
54
+ });
55
+ it("renders the stack with (lib) for non-in-app frames", () => {
56
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
57
+ expect(prompt).toMatch(/UserCard\s+\/repo\/src\/UserCard\.tsx:42(?!\s*\(lib\))/);
58
+ expect(prompt).toMatch(/\/repo\/node_modules\/react\/index\.js:1\s+\(lib\)/);
59
+ });
60
+ it("includes the branch instruction", () => {
61
+ const prompt = buildAgentPrompt(baseError, "fix/pixel-err_abc123");
62
+ expect(prompt).toContain("Create branch: fix/pixel-err_abc123");
63
+ expect(prompt).toContain("Do not merge");
64
+ });
65
+ it("flags recurrence when recurrence_count > 0", () => {
66
+ const prompt = buildAgentPrompt({ ...baseError, recurrence_count: 2 }, "fix/pixel-x");
67
+ expect(prompt).toContain("2nd time");
68
+ expect(prompt).toContain("earlier fix did not hold");
69
+ });
70
+ });
71
+ function makeFakeChild(exitCode, stdout = "", stderr = "") {
72
+ const child = new EventEmitter();
73
+ child.stdout = new EventEmitter();
74
+ child.stderr = new EventEmitter();
75
+ setImmediate(() => {
76
+ if (stdout)
77
+ child.stdout.emit("data", Buffer.from(stdout));
78
+ if (stderr)
79
+ child.stderr.emit("data", Buffer.from(stderr));
80
+ child.emit("exit", exitCode);
81
+ });
82
+ return child;
83
+ }
84
+ function buildSpawnFn(handlers) {
85
+ const calls = [];
86
+ let i = 0;
87
+ const fn = (command, args, options) => {
88
+ const call = { command, args, options };
89
+ calls.push(call);
90
+ const handler = handlers[Math.min(i, handlers.length - 1)];
91
+ i++;
92
+ if (!handler)
93
+ throw new Error(`unexpected spawn call: ${command} ${args.join(" ")}`);
94
+ return handler(call);
95
+ };
96
+ return { fn, calls };
97
+ }
98
+ function fakeFetchScript(handlers) {
99
+ const calls = [];
100
+ let i = 0;
101
+ const fn = (async (input, init) => {
102
+ const url = String(input);
103
+ const method = (init?.method ?? "GET").toUpperCase();
104
+ calls.push({ method, url });
105
+ const handler = handlers[Math.min(i, handlers.length - 1)];
106
+ i++;
107
+ if (!handler)
108
+ throw new Error(`unexpected fetch: ${method} ${url}`);
109
+ return handler({ method, url });
110
+ });
111
+ return { fn, calls };
112
+ }
113
+ describe("fixError — orchestration", () => {
114
+ it("marks awaiting_review when the agent succeeds, branch exists, and has commits", async () => {
115
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
116
+ const { fn: fetchFn, calls: fetchCalls } = fakeFetchScript([
117
+ // GET /api/errors/err_abc123
118
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
119
+ // PATCH in_progress
120
+ () => new Response(JSON.stringify({ ...baseError, status: "in_progress" }), { status: 200 }),
121
+ // PATCH awaiting_review
122
+ () => new Response(JSON.stringify({ ...baseError, status: "awaiting_review" }), { status: 200 }),
123
+ ]);
124
+ const { fn: spawnFn, calls: spawnCalls } = buildSpawnFn([
125
+ // ezcoder agent run
126
+ () => makeFakeChild(0),
127
+ // git show-ref --verify refs/heads/fix/pixel-err_abc123
128
+ () => makeFakeChild(0),
129
+ // git show-ref --verify refs/heads/main
130
+ () => makeFakeChild(0),
131
+ // git rev-list --count main..fix/pixel-err_abc123
132
+ () => makeFakeChild(0, "3\n"),
133
+ ]);
134
+ const result = await fixError("err_abc123", {
135
+ homeDir: home,
136
+ fetchFn,
137
+ spawnFn,
138
+ inheritStdio: false,
139
+ });
140
+ expect(result.outcome).toBe("awaiting_review");
141
+ expect(result.branch).toBe("fix/pixel-err_abc123");
142
+ expect(result.reason).toContain("3 commit");
143
+ // First call to ezcoder uses the right cwd and args
144
+ const ggCall = spawnCalls[0];
145
+ expect(ggCall?.command).toBe("ezcoder");
146
+ expect(ggCall?.args).toContain("--json");
147
+ expect(ggCall?.args).toContain("--system-prompt");
148
+ expect(ggCall?.options.cwd).toBe("/tmp/demo-app");
149
+ // Status PATCH sequence: in_progress, then awaiting_review
150
+ const patchBodies = fetchCalls.filter((c) => c.method === "PATCH").map((c) => c.url);
151
+ expect(patchBodies).toEqual([
152
+ "https://ez-pixel-server.buzzbeamaustralia.workers.dev/api/errors/err_abc123",
153
+ "https://ez-pixel-server.buzzbeamaustralia.workers.dev/api/errors/err_abc123",
154
+ ]);
155
+ });
156
+ it("marks failed when the agent exits non-zero", async () => {
157
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
158
+ const { fn: fetchFn } = fakeFetchScript([
159
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
160
+ () => new Response("{}", { status: 200 }), // PATCH in_progress
161
+ () => new Response("{}", { status: 200 }), // PATCH failed
162
+ ]);
163
+ const { fn: spawnFn } = buildSpawnFn([() => makeFakeChild(1)]);
164
+ const result = await fixError("err_abc123", {
165
+ homeDir: home,
166
+ fetchFn,
167
+ spawnFn,
168
+ inheritStdio: false,
169
+ });
170
+ expect(result.outcome).toBe("failed");
171
+ expect(result.reason).toContain("exited with code 1");
172
+ });
173
+ it("marks failed when the branch was not created", async () => {
174
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
175
+ const { fn: fetchFn } = fakeFetchScript([
176
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
177
+ () => new Response("{}", { status: 200 }),
178
+ () => new Response("{}", { status: 200 }),
179
+ ]);
180
+ const { fn: spawnFn } = buildSpawnFn([
181
+ () => makeFakeChild(0), // ezcoder ok
182
+ () => makeFakeChild(1), // git show-ref FAIL
183
+ ]);
184
+ const result = await fixError("err_abc123", {
185
+ homeDir: home,
186
+ fetchFn,
187
+ spawnFn,
188
+ inheritStdio: false,
189
+ });
190
+ expect(result.outcome).toBe("failed");
191
+ expect(result.reason).toContain("not created");
192
+ });
193
+ it("marks failed when the branch exists but has no commits ahead of main", async () => {
194
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
195
+ const { fn: fetchFn } = fakeFetchScript([
196
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
197
+ () => new Response("{}", { status: 200 }),
198
+ () => new Response("{}", { status: 200 }),
199
+ ]);
200
+ const { fn: spawnFn } = buildSpawnFn([
201
+ () => makeFakeChild(0), // ezcoder
202
+ () => makeFakeChild(0), // branch exists
203
+ () => makeFakeChild(0), // main exists
204
+ () => makeFakeChild(0, "0\n"), // 0 commits ahead
205
+ ]);
206
+ const result = await fixError("err_abc123", {
207
+ homeDir: home,
208
+ fetchFn,
209
+ spawnFn,
210
+ inheritStdio: false,
211
+ });
212
+ expect(result.outcome).toBe("failed");
213
+ expect(result.reason).toContain("no new commits");
214
+ });
215
+ it("falls back to master when main does not exist", async () => {
216
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
217
+ const { fn: fetchFn } = fakeFetchScript([
218
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
219
+ () => new Response("{}", { status: 200 }),
220
+ () => new Response("{}", { status: 200 }),
221
+ ]);
222
+ const { fn: spawnFn, calls: spawnCalls } = buildSpawnFn([
223
+ () => makeFakeChild(0), // ezcoder
224
+ () => makeFakeChild(0), // branch exists
225
+ () => makeFakeChild(1), // main missing
226
+ () => makeFakeChild(0), // master exists
227
+ () => makeFakeChild(0, "2\n"), // 2 commits ahead of master
228
+ ]);
229
+ const result = await fixError("err_abc123", {
230
+ homeDir: home,
231
+ fetchFn,
232
+ spawnFn,
233
+ inheritStdio: false,
234
+ });
235
+ expect(result.outcome).toBe("awaiting_review");
236
+ const masterCall = spawnCalls.find((c) => c.args.includes("master..fix/pixel-err_abc123"));
237
+ expect(masterCall).toBeTruthy();
238
+ });
239
+ it("throws when no projects.json mapping exists for the project_id", async () => {
240
+ // No setupProjectMapping call — projects.json doesn't exist
241
+ const { fn: fetchFn } = fakeFetchScript([
242
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
243
+ ]);
244
+ const { fn: spawnFn } = buildSpawnFn([]);
245
+ await expect(fixError("err_abc123", {
246
+ homeDir: home,
247
+ fetchFn,
248
+ spawnFn,
249
+ inheritStdio: false,
250
+ })).rejects.toThrow(/No projects mapping/);
251
+ });
252
+ it("throws when the project_id has no entry in projects.json", async () => {
253
+ setupProjectMapping("proj_OTHER", "x", "/x");
254
+ const { fn: fetchFn } = fakeFetchScript([
255
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
256
+ ]);
257
+ const { fn: spawnFn } = buildSpawnFn([]);
258
+ await expect(fixError("err_abc123", {
259
+ homeDir: home,
260
+ fetchFn,
261
+ spawnFn,
262
+ inheritStdio: false,
263
+ })).rejects.toThrow(/No local mapping for project proj_p1/);
264
+ });
265
+ });
266
+ describe("fixError — wiring", () => {
267
+ it("marks the error in_progress before spawning the agent", async () => {
268
+ setupProjectMapping("proj_p1", "demo-app", "/tmp/demo-app");
269
+ const observed = [];
270
+ const { fn: fetchFn } = fakeFetchScript([
271
+ () => new Response(JSON.stringify(baseError), { status: 200 }),
272
+ () => {
273
+ observed.push("PATCH-1");
274
+ return new Response("{}", { status: 200 });
275
+ },
276
+ () => {
277
+ observed.push("PATCH-2");
278
+ return new Response("{}", { status: 200 });
279
+ },
280
+ ]);
281
+ const { fn: spawnFn } = buildSpawnFn([
282
+ () => {
283
+ observed.push("SPAWN");
284
+ return makeFakeChild(0);
285
+ },
286
+ () => makeFakeChild(0),
287
+ () => makeFakeChild(0),
288
+ () => makeFakeChild(0, "1\n"),
289
+ ]);
290
+ await fixError("err_abc123", { homeDir: home, fetchFn, spawnFn, inheritStdio: false });
291
+ expect(observed).toEqual(["PATCH-1", "SPAWN", "PATCH-2"]);
292
+ });
293
+ });
294
+ // Silence vitest unused import warning
295
+ void vi;
296
+ //# sourceMappingURL=pixel-fix.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel-fix.test.js","sourceRoot":"","sources":["../../src/core/pixel-fix.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ interface ListOptions {
2
+ ingestUrl?: string;
3
+ homeDir?: string;
4
+ fetchFn?: typeof fetch;
5
+ }
6
+ export interface PixelEntry {
7
+ errorId: string;
8
+ projectId: string;
9
+ projectName: string;
10
+ projectPath: string;
11
+ status: string;
12
+ type: string;
13
+ message: string;
14
+ occurrences: number;
15
+ recurrenceCount: number;
16
+ location: string;
17
+ branch: string | null;
18
+ lastSeenAt?: number;
19
+ }
20
+ export interface PixelFetchResult {
21
+ entries: PixelEntry[];
22
+ unreachable: string[];
23
+ hasProjects: boolean;
24
+ }
25
+ export declare function fetchPixelEntries(opts?: ListOptions): Promise<PixelFetchResult>;
26
+ export declare function listAllErrors(opts?: ListOptions): Promise<void>;
27
+ interface InstallCliOptions {
28
+ ingestUrl?: string;
29
+ name?: string;
30
+ skipPackageInstall: boolean;
31
+ }
32
+ export declare function runPixelInstall(opts: InstallCliOptions): Promise<void>;
33
+ export {};
34
+ //# sourceMappingURL=pixel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pixel.d.ts","sourceRoot":"","sources":["../../src/core/pixel.ts"],"names":[],"mappings":"AAwBA,UAAU,WAAW;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA+EzF;AAmCD,wBAAsB,aAAa,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFzE;AA4FD,UAAU,iBAAiB;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD5E"}
@@ -0,0 +1,308 @@
1
+ import { readFileSync, existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import chalk from "chalk";
5
+ import { DEFAULT_INGEST_URL, install } from "@prestyj/pixel";
6
+ export async function fetchPixelEntries(opts = {}) {
7
+ const home = opts.homeDir ?? homedir();
8
+ const path = join(home, ".ezcoder", "projects.json");
9
+ const fetchFn = opts.fetchFn ?? fetch;
10
+ if (!existsSync(path))
11
+ return { entries: [], unreachable: [], hasProjects: false };
12
+ let map;
13
+ try {
14
+ map = JSON.parse(readFileSync(path, "utf8"));
15
+ }
16
+ catch {
17
+ return { entries: [], unreachable: [], hasProjects: false };
18
+ }
19
+ const projectIds = Object.keys(map);
20
+ if (projectIds.length === 0)
21
+ return { entries: [], unreachable: [], hasProjects: false };
22
+ const ingestUrl = (opts.ingestUrl ?? DEFAULT_INGEST_URL).replace(/\/+$/, "");
23
+ const entries = [];
24
+ const unreachable = [];
25
+ for (const id of projectIds) {
26
+ const project = map[id];
27
+ if (!project)
28
+ continue;
29
+ try {
30
+ const res = await fetchFn(`${ingestUrl}/api/projects/${id}/errors`);
31
+ if (!res.ok) {
32
+ unreachable.push(project.name);
33
+ continue;
34
+ }
35
+ const body = (await res.json());
36
+ for (const err of body.errors) {
37
+ if (err.status === "merged")
38
+ continue;
39
+ entries.push({
40
+ errorId: err.id,
41
+ projectId: id,
42
+ projectName: project.name,
43
+ projectPath: project.path,
44
+ status: err.status,
45
+ type: err.type ?? "Error",
46
+ message: (err.message ?? "").trim(),
47
+ occurrences: err.occurrences,
48
+ recurrenceCount: err.recurrence_count,
49
+ location: deriveLocation(err.stack, project.path),
50
+ branch: err.branch,
51
+ lastSeenAt: err.last_seen_at,
52
+ });
53
+ }
54
+ }
55
+ catch {
56
+ unreachable.push(project.name);
57
+ }
58
+ }
59
+ // Group by project name; within project, order by status priority then count.
60
+ const statusOrder = {
61
+ failed: 0,
62
+ open: 1,
63
+ in_progress: 2,
64
+ awaiting_review: 3,
65
+ };
66
+ const grouped = new Map();
67
+ for (const e of entries) {
68
+ if (!grouped.has(e.projectName))
69
+ grouped.set(e.projectName, []);
70
+ grouped.get(e.projectName).push(e);
71
+ }
72
+ const sorted = [];
73
+ const projectNames = [...grouped.keys()].sort();
74
+ for (const name of projectNames) {
75
+ const group = grouped.get(name);
76
+ group.sort((a, b) => {
77
+ const ord = (statusOrder[a.status] ?? 99) - (statusOrder[b.status] ?? 99);
78
+ if (ord !== 0)
79
+ return ord;
80
+ if (a.recurrenceCount !== b.recurrenceCount)
81
+ return b.recurrenceCount - a.recurrenceCount;
82
+ return b.occurrences - a.occurrences;
83
+ });
84
+ sorted.push(...group);
85
+ }
86
+ return { entries: sorted, unreachable, hasProjects: true };
87
+ }
88
+ function deriveLocation(stack, projectPath) {
89
+ if (!stack)
90
+ return "unknown";
91
+ try {
92
+ const parsed = JSON.parse(stack);
93
+ if (Array.isArray(parsed)) {
94
+ const top = parsed.find((f) => typeof f === "object" &&
95
+ f !== null &&
96
+ "file" in f &&
97
+ "line" in f &&
98
+ "in_app" in f &&
99
+ f.in_app === true) ?? parsed[0];
100
+ if (top && top.file) {
101
+ const rel = relativizeFile(top.file, projectPath);
102
+ return `${rel}:${top.line ?? "?"}`;
103
+ }
104
+ }
105
+ }
106
+ catch {
107
+ // ignore
108
+ }
109
+ return "unknown";
110
+ }
111
+ function relativizeFile(file, projectPath) {
112
+ let f = file;
113
+ if (f.startsWith("file://"))
114
+ f = f.slice("file://".length);
115
+ if (projectPath && f.startsWith(projectPath + "/"))
116
+ f = f.slice(projectPath.length + 1);
117
+ return f;
118
+ }
119
+ export async function listAllErrors(opts = {}) {
120
+ const home = opts.homeDir ?? homedir();
121
+ const path = join(home, ".ezcoder", "projects.json");
122
+ const fetchFn = opts.fetchFn ?? fetch;
123
+ if (!existsSync(path)) {
124
+ printNoProjects();
125
+ return;
126
+ }
127
+ let map;
128
+ try {
129
+ map = JSON.parse(readFileSync(path, "utf8"));
130
+ }
131
+ catch {
132
+ console.error(chalk.red(`✗ ${path} is not valid JSON.`));
133
+ process.exitCode = 1;
134
+ return;
135
+ }
136
+ const projectIds = Object.keys(map);
137
+ if (projectIds.length === 0) {
138
+ printNoProjects();
139
+ return;
140
+ }
141
+ const ingestUrl = (opts.ingestUrl ?? DEFAULT_INGEST_URL).replace(/\/+$/, "");
142
+ let totalOpen = 0;
143
+ let totalAwaiting = 0;
144
+ let totalInProgress = 0;
145
+ let totalFailed = 0;
146
+ for (const id of projectIds) {
147
+ const project = map[id];
148
+ if (!project)
149
+ continue;
150
+ const url = `${ingestUrl}/api/projects/${id}/errors`;
151
+ let body;
152
+ try {
153
+ const res = await fetchFn(url);
154
+ if (!res.ok) {
155
+ console.log(chalk.red(`✗ ${project.name}: failed to fetch (${res.status})`) + chalk.dim(` ${url}`));
156
+ continue;
157
+ }
158
+ body = (await res.json());
159
+ }
160
+ catch (err) {
161
+ console.log(chalk.red(`✗ ${project.name}: ${err instanceof Error ? err.message : String(err)}`));
162
+ continue;
163
+ }
164
+ const errors = body.errors.filter((e) => e.status !== "merged");
165
+ if (errors.length === 0) {
166
+ console.log(chalk.hex("#4ade80")(`✓ ${project.name}`) + chalk.dim(" no open errors"));
167
+ continue;
168
+ }
169
+ console.log("");
170
+ console.log(chalk.hex("#a78bfa").bold(`▾ ${project.name}`) + chalk.dim(` ${project.path}`));
171
+ for (const err of errors) {
172
+ switch (err.status) {
173
+ case "open":
174
+ totalOpen++;
175
+ break;
176
+ case "in_progress":
177
+ totalInProgress++;
178
+ break;
179
+ case "awaiting_review":
180
+ totalAwaiting++;
181
+ break;
182
+ case "failed":
183
+ totalFailed++;
184
+ break;
185
+ }
186
+ printError(err);
187
+ }
188
+ }
189
+ printSummary(totalOpen, totalInProgress, totalAwaiting, totalFailed, projectIds.length);
190
+ }
191
+ function printError(err) {
192
+ const stack = parseStack(err.stack);
193
+ const topInApp = stack.find((f) => f.in_app) ?? stack[0];
194
+ const loc = topInApp ? `${topInApp.file}:${topInApp.line}` : "unknown location";
195
+ const statusBadge = badgeFor(err.status);
196
+ const message = (err.message ?? "").trim().slice(0, 100);
197
+ const recurrence = err.recurrence_count > 0 ? chalk.hex("#fbbf24")(` ↻${err.recurrence_count}`) : "";
198
+ console.log(" " +
199
+ statusBadge +
200
+ " " +
201
+ chalk.bold(err.type ?? "Error") +
202
+ chalk.dim(` ×${err.occurrences}`) +
203
+ recurrence);
204
+ if (message)
205
+ console.log(" " + chalk.hex("#cbd5e1")(message));
206
+ console.log(" " + chalk.dim(loc));
207
+ if (err.branch)
208
+ console.log(" " + chalk.dim(`branch: ${err.branch}`));
209
+ }
210
+ function badgeFor(status) {
211
+ const labels = {
212
+ open: chalk.bgHex("#dc2626").white(" OPEN "),
213
+ in_progress: chalk.bgHex("#2563eb").white(" WORKING "),
214
+ awaiting_review: chalk.bgHex("#eab308").black(" REVIEW "),
215
+ failed: chalk.bgHex("#7f1d1d").white(" FAILED "),
216
+ };
217
+ return labels[status] ?? chalk.bgHex("#374151").white(` ${status.toUpperCase()} `);
218
+ }
219
+ function parseStack(raw) {
220
+ if (!raw)
221
+ return [];
222
+ try {
223
+ const parsed = JSON.parse(raw);
224
+ if (Array.isArray(parsed)) {
225
+ return parsed.filter((f) => typeof f === "object" && f !== null && "file" in f && "line" in f && "in_app" in f);
226
+ }
227
+ }
228
+ catch {
229
+ // ignore
230
+ }
231
+ return [];
232
+ }
233
+ function printNoProjects() {
234
+ console.log("");
235
+ console.log(chalk.dim("No projects registered yet."));
236
+ console.log("");
237
+ console.log("Run " +
238
+ chalk.hex("#60a5fa").bold("ezcoder pixel install") +
239
+ " inside any project to wire it up.");
240
+ console.log("");
241
+ }
242
+ function printSummary(open, inProgress, awaiting, failed, projectCount) {
243
+ const total = open + inProgress + awaiting + failed;
244
+ console.log("");
245
+ if (total === 0) {
246
+ console.log(chalk.hex("#4ade80")(`All clean across ${plural(projectCount, "project")}.`));
247
+ console.log("");
248
+ return;
249
+ }
250
+ const parts = [];
251
+ if (open)
252
+ parts.push(chalk.hex("#ef4444")(`${open} open`));
253
+ if (inProgress)
254
+ parts.push(chalk.hex("#60a5fa")(`${inProgress} working`));
255
+ if (awaiting)
256
+ parts.push(chalk.hex("#eab308")(`${awaiting} awaiting review`));
257
+ if (failed)
258
+ parts.push(chalk.hex("#7f1d1d")(`${failed} failed`));
259
+ console.log(parts.join(chalk.dim(" · ")) + chalk.dim(` across ${plural(projectCount, "project")}`));
260
+ console.log("");
261
+ }
262
+ function plural(n, word) {
263
+ return `${n} ${word}${n === 1 ? "" : "s"}`;
264
+ }
265
+ export async function runPixelInstall(opts) {
266
+ const result = await install({
267
+ ingestUrl: opts.ingestUrl,
268
+ projectName: opts.name,
269
+ skipPackageInstall: opts.skipPackageInstall,
270
+ });
271
+ console.log("");
272
+ console.log(chalk
273
+ .hex("#4ade80")
274
+ .bold(result.reused ? "Pixel re-wired (existing project)." : "Pixel installed."));
275
+ console.log(chalk.dim(` Project: `) + result.projectName + chalk.dim(` (${result.projectId})`));
276
+ console.log(chalk.dim(` Kind: `) + result.projectKind);
277
+ console.log(chalk.dim(` Init file: `) + result.initFilePath);
278
+ console.log(chalk.dim(` Env file: `) + result.envFilePath);
279
+ console.log(chalk.dim(` Mapping: `) + result.projectsJsonPath);
280
+ switch (result.entryWiring.kind) {
281
+ case "injected":
282
+ console.log(chalk.dim(` Wired: `) + result.entryWiring.entryPath);
283
+ break;
284
+ case "already_present":
285
+ console.log(chalk.dim(` Entry: `) + result.entryWiring.entryPath + chalk.dim(" (already wired)"));
286
+ break;
287
+ case "no_entry_found":
288
+ console.log(chalk.hex("#fbbf24")(` ⚠ Could not auto-detect your entry file.`));
289
+ console.log(chalk.dim(` Add to the TOP of your entry: `));
290
+ console.log(" " + chalk.hex("#60a5fa")(`import "./ez-pixel.init.mjs";`));
291
+ break;
292
+ case "skipped":
293
+ console.log(chalk.hex("#fbbf24")(` ⚠ Entry wiring skipped: ${result.entryWiring.reason}`));
294
+ break;
295
+ }
296
+ if (!result.packageInstalled && !opts.skipPackageInstall) {
297
+ console.log(chalk.hex("#fbbf24")(` ⚠ Package install via ${result.packageManager} failed. Run it manually.`));
298
+ }
299
+ if (result.secondaryInit) {
300
+ console.log(chalk.dim(` Also wrote: `) + result.secondaryInit.path);
301
+ console.log(chalk.dim(` `) + chalk.dim(result.secondaryInit.description));
302
+ }
303
+ for (const w of result.warnings) {
304
+ console.log(chalk.hex("#fbbf24")(` ⚠ ${w}`));
305
+ }
306
+ console.log("");
307
+ }
308
+ //# sourceMappingURL=pixel.js.map