@opencode-trace/cli 0.0.3 → 0.0.5

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 (70) hide show
  1. package/README.md +2 -3
  2. package/dist/formatter.d.ts.map +1 -1
  3. package/dist/formatter.js +16 -6
  4. package/dist/formatter.js.map +1 -1
  5. package/dist/formatter.test.d.ts +2 -0
  6. package/dist/formatter.test.d.ts.map +1 -0
  7. package/dist/formatter.test.js +232 -0
  8. package/dist/formatter.test.js.map +1 -0
  9. package/dist/handlers/disable.test.d.ts +2 -0
  10. package/dist/handlers/disable.test.d.ts.map +1 -0
  11. package/dist/handlers/disable.test.js +115 -0
  12. package/dist/handlers/disable.test.js.map +1 -0
  13. package/dist/handlers/enable.d.ts.map +1 -1
  14. package/dist/handlers/enable.js +28 -10
  15. package/dist/handlers/enable.js.map +1 -1
  16. package/dist/handlers/enable.test.d.ts +2 -0
  17. package/dist/handlers/enable.test.d.ts.map +1 -0
  18. package/dist/handlers/enable.test.js +125 -0
  19. package/dist/handlers/enable.test.js.map +1 -0
  20. package/dist/handlers/export.d.ts.map +1 -1
  21. package/dist/handlers/export.js +11 -15
  22. package/dist/handlers/export.js.map +1 -1
  23. package/dist/handlers/export.test.d.ts +2 -0
  24. package/dist/handlers/export.test.d.ts.map +1 -0
  25. package/dist/handlers/export.test.js +492 -0
  26. package/dist/handlers/export.test.js.map +1 -0
  27. package/dist/handlers/list.d.ts.map +1 -1
  28. package/dist/handlers/list.js +8 -9
  29. package/dist/handlers/list.js.map +1 -1
  30. package/dist/handlers/list.test.d.ts +2 -0
  31. package/dist/handlers/list.test.d.ts.map +1 -0
  32. package/dist/handlers/list.test.js +154 -0
  33. package/dist/handlers/list.test.js.map +1 -0
  34. package/dist/handlers/show.d.ts.map +1 -1
  35. package/dist/handlers/show.js +1 -1
  36. package/dist/handlers/show.js.map +1 -1
  37. package/dist/handlers/show.test.d.ts +2 -0
  38. package/dist/handlers/show.test.d.ts.map +1 -0
  39. package/dist/handlers/show.test.js +322 -0
  40. package/dist/handlers/show.test.js.map +1 -0
  41. package/dist/handlers/status.d.ts.map +1 -1
  42. package/dist/handlers/status.js +24 -9
  43. package/dist/handlers/status.js.map +1 -1
  44. package/dist/handlers/status.test.d.ts +2 -0
  45. package/dist/handlers/status.test.d.ts.map +1 -0
  46. package/dist/handlers/status.test.js +141 -0
  47. package/dist/handlers/status.test.js.map +1 -0
  48. package/dist/handlers/sync.d.ts.map +1 -1
  49. package/dist/handlers/sync.js +5 -5
  50. package/dist/handlers/sync.js.map +1 -1
  51. package/dist/handlers/sync.test.d.ts +2 -0
  52. package/dist/handlers/sync.test.d.ts.map +1 -0
  53. package/dist/handlers/sync.test.js +120 -0
  54. package/dist/handlers/sync.test.js.map +1 -0
  55. package/dist/handlers/viewer.js +7 -7
  56. package/dist/handlers/viewer.js.map +1 -1
  57. package/dist/handlers/viewer.test.js +27 -23
  58. package/dist/handlers/viewer.test.js.map +1 -1
  59. package/dist/index.js +24 -16
  60. package/dist/index.js.map +1 -1
  61. package/dist/index.test.js +38 -3
  62. package/dist/index.test.js.map +1 -1
  63. package/dist/utils.d.ts.map +1 -1
  64. package/dist/utils.js +22 -2
  65. package/dist/utils.js.map +1 -1
  66. package/dist/utils.test.d.ts +2 -0
  67. package/dist/utils.test.d.ts.map +1 -0
  68. package/dist/utils.test.js +250 -0
  69. package/dist/utils.test.js.map +1 -0
  70. package/package.json +4 -3
@@ -0,0 +1,141 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { mkdtempSync, rmSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ vi.mock("node:os", async (importOriginal) => {
6
+ const original = await importOriginal();
7
+ return {
8
+ ...original,
9
+ homedir: () => {
10
+ const testDir = process.env._TEST_DIR_;
11
+ if (testDir)
12
+ return testDir;
13
+ return original.homedir();
14
+ },
15
+ };
16
+ });
17
+ vi.mock("@opencode-trace/core", async (importOriginal) => {
18
+ const original = await importOriginal();
19
+ return {
20
+ ...original,
21
+ record: {
22
+ initStateManager: vi.fn().mockResolvedValue(undefined),
23
+ setGlobalTraceEnabled: vi.fn(),
24
+ setStoragePreference: vi.fn(),
25
+ setSessionEnabled: vi.fn(),
26
+ setSessionStoragePreference: vi.fn(),
27
+ getGlobalTraceEnabled: vi.fn().mockReturnValue(false),
28
+ getStoragePreference: vi.fn().mockReturnValue("global"),
29
+ getSessionEnabled: vi.fn().mockReturnValue(false),
30
+ getSessionStoragePreference: vi.fn().mockReturnValue(null),
31
+ },
32
+ };
33
+ });
34
+ import { cmdStatus } from "./status.js";
35
+ import { GLOBAL_TRACE_DIR, LOCAL_TRACE_DIR } from "../utils.js";
36
+ import { record } from "@opencode-trace/core";
37
+ let testDir;
38
+ let logSpy;
39
+ let errSpy;
40
+ let exitSpy;
41
+ beforeEach(() => {
42
+ testDir = mkdtempSync(join(tmpdir(), "cli-handler-test-"));
43
+ process.env._TEST_DIR_ = testDir;
44
+ vi.clearAllMocks();
45
+ logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
46
+ errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
47
+ exitSpy = vi.spyOn(process, "exit").mockImplementation(((code) => {
48
+ throw new Error(`exit_${code}`);
49
+ }));
50
+ });
51
+ afterEach(() => {
52
+ rmSync(testDir, { recursive: true, force: true });
53
+ delete process.env._TEST_DIR_;
54
+ vi.restoreAllMocks();
55
+ });
56
+ function getStatusOutput() {
57
+ const calls = logSpy.mock.calls;
58
+ expect(calls.length).toBeGreaterThan(0);
59
+ const firstArg = calls[0]?.[0];
60
+ expect(typeof firstArg).toBe("string");
61
+ return JSON.parse(firstArg);
62
+ }
63
+ describe("cmdStatus", () => {
64
+ it("no flags shows global status only", async () => {
65
+ await cmdStatus([]);
66
+ const status = getStatusOutput();
67
+ expect(status).toEqual({
68
+ global: { enabled: false, storage: "global" },
69
+ });
70
+ expect(record.getGlobalTraceEnabled).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
71
+ expect(record.getStoragePreference).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
72
+ });
73
+ it("-g flag shows global status only", async () => {
74
+ await cmdStatus(["-g"]);
75
+ const status = getStatusOutput();
76
+ expect(status).toHaveProperty("global");
77
+ expect(status).not.toHaveProperty("local");
78
+ expect(status).not.toHaveProperty("session");
79
+ expect(status.global).toEqual({ enabled: false, storage: "global" });
80
+ });
81
+ it("-l flag shows local status only", async () => {
82
+ await cmdStatus(["-l"]);
83
+ const status = getStatusOutput();
84
+ expect(status).toHaveProperty("local");
85
+ expect(status).not.toHaveProperty("global");
86
+ expect(status).not.toHaveProperty("session");
87
+ expect(status.local).toEqual({ enabled: false });
88
+ expect(record.getGlobalTraceEnabled).toHaveBeenCalledWith(LOCAL_TRACE_DIR);
89
+ });
90
+ it("-g -l flags show both global and local", async () => {
91
+ await cmdStatus(["-g", "-l"]);
92
+ const status = getStatusOutput();
93
+ expect(status).toHaveProperty("global");
94
+ expect(status).toHaveProperty("local");
95
+ expect(status).not.toHaveProperty("session");
96
+ expect(record.getGlobalTraceEnabled).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
97
+ expect(record.getGlobalTraceEnabled).toHaveBeenCalledWith(LOCAL_TRACE_DIR);
98
+ });
99
+ it("-s without sessionId exits with code 1", async () => {
100
+ await expect(cmdStatus(["-s"])).rejects.toThrow("exit_1");
101
+ expect(errSpy).toHaveBeenCalledWith("Error: session-id is required when using -s");
102
+ });
103
+ it("-s with sessionId shows session status only", async () => {
104
+ await cmdStatus(["-s", "my-session"]);
105
+ const status = getStatusOutput();
106
+ expect(status).toEqual({
107
+ session: { id: "my-session", enabled: false, storage: null },
108
+ });
109
+ expect(status).not.toHaveProperty("global");
110
+ expect(status).not.toHaveProperty("local");
111
+ expect(record.getSessionEnabled).toHaveBeenCalledWith("my-session", GLOBAL_TRACE_DIR);
112
+ expect(record.getSessionStoragePreference).toHaveBeenCalledWith("my-session", GLOBAL_TRACE_DIR);
113
+ });
114
+ it("all flags combined shows all three scopes", async () => {
115
+ await cmdStatus(["-g", "-l", "-s", "my-session"]);
116
+ const status = getStatusOutput();
117
+ expect(status).toHaveProperty("global");
118
+ expect(status).toHaveProperty("local");
119
+ expect(status).toHaveProperty("session");
120
+ expect(status.global.enabled).toBe(false);
121
+ expect(status.local.enabled).toBe(false);
122
+ expect(status.session.id).toBe("my-session");
123
+ expect(status.session.enabled).toBe(false);
124
+ });
125
+ it("reflects mocked return values in output", async () => {
126
+ vi.mocked(record.getGlobalTraceEnabled).mockReturnValue(true);
127
+ vi.mocked(record.getStoragePreference).mockReturnValue("local");
128
+ vi.mocked(record.getSessionEnabled).mockReturnValue(true);
129
+ vi.mocked(record.getSessionStoragePreference).mockReturnValue("local");
130
+ await cmdStatus(["-g", "-l", "-s", "my-session"]);
131
+ const status = getStatusOutput();
132
+ expect(status.global).toEqual({ enabled: true, storage: "local" });
133
+ expect(status.local).toEqual({ enabled: true });
134
+ expect(status.session).toEqual({
135
+ id: "my-session",
136
+ enabled: true,
137
+ storage: "local",
138
+ });
139
+ });
140
+ });
141
+ //# sourceMappingURL=status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.test.js","sourceRoot":"","sources":["../../src/handlers/status.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/handlers/sync.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAgB3D"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/handlers/sync.ts"],"names":[],"mappings":"AAKA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3D"}
@@ -1,15 +1,15 @@
1
1
  import { resolve } from "node:path";
2
+ import { existsSync, rmSync } from "node:fs";
2
3
  import { record, logger } from "@opencode-trace/core";
3
4
  import { parseFlags, GLOBAL_TRACE_DIR } from "../utils.js";
4
5
  export async function cmdSync(args) {
5
6
  const { flags } = parseFlags(args);
6
7
  const traceDir = GLOBAL_TRACE_DIR;
7
8
  if (flags.repair) {
8
- const { existsSync, rmSync } = await import("node:fs");
9
- const dbPath = resolve(traceDir, "state.db");
10
- if (existsSync(dbPath)) {
11
- rmSync(dbPath, { force: true });
12
- logger.info("Removed corrupted state.db");
9
+ const configPath = resolve(traceDir, "config.json");
10
+ if (existsSync(configPath)) {
11
+ rmSync(configPath, { force: true });
12
+ logger.info("Removed corrupted config.json");
13
13
  }
14
14
  }
15
15
  await record.initStateManager(traceDir);
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/handlers/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAElC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC7C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/handlers/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAc;IAC1C,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;IAElC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACpD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,MAAM,MAAM,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sync.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.test.d.ts","sourceRoot":"","sources":["../../src/handlers/sync.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,120 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
2
+ import { mkdtempSync, rmSync, existsSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ vi.mock("node:os", async (importOriginal) => {
6
+ const original = await importOriginal();
7
+ return {
8
+ ...original,
9
+ homedir: () => {
10
+ const testDir = process.env._TEST_DIR_;
11
+ if (testDir)
12
+ return testDir;
13
+ return original.homedir();
14
+ },
15
+ };
16
+ });
17
+ vi.mock("@opencode-trace/core", async (importOriginal) => {
18
+ const original = await importOriginal();
19
+ return {
20
+ ...original,
21
+ record: {
22
+ ...original.record,
23
+ initStateManager: vi.fn().mockResolvedValue(undefined),
24
+ syncState: vi.fn(),
25
+ },
26
+ logger: {
27
+ ...original.logger,
28
+ info: vi.fn(),
29
+ warn: vi.fn(),
30
+ error: vi.fn(),
31
+ },
32
+ };
33
+ });
34
+ vi.mock("node:fs", async (importOriginal) => {
35
+ const original = await importOriginal();
36
+ return {
37
+ ...original,
38
+ existsSync: vi.fn(),
39
+ rmSync: vi.fn(),
40
+ writeFileSync: vi.fn(),
41
+ };
42
+ });
43
+ import { cmdSync } from "./sync.js";
44
+ import { GLOBAL_TRACE_DIR } from "../utils.js";
45
+ import { record as mockedRecord, logger as mockedLogger } from "@opencode-trace/core";
46
+ const initStateManagerMock = vi.mocked(mockedRecord.initStateManager);
47
+ const syncStateMock = vi.mocked(mockedRecord.syncState);
48
+ const loggerInfoMock = vi.mocked(mockedLogger.info);
49
+ let testDir;
50
+ let configPath;
51
+ let exitSpy;
52
+ beforeEach(() => {
53
+ testDir = mkdtempSync(join(tmpdir(), "cli-sync-test-"));
54
+ process.env._TEST_DIR_ = testDir;
55
+ configPath = join(GLOBAL_TRACE_DIR, "config.json");
56
+ vi.clearAllMocks();
57
+ exitSpy = vi.spyOn(process, "exit").mockImplementation(((code) => {
58
+ throw new Error(`exit_${code}`);
59
+ }));
60
+ });
61
+ afterEach(() => {
62
+ rmSync(testDir, { recursive: true, force: true });
63
+ delete process.env._TEST_DIR_;
64
+ vi.restoreAllMocks();
65
+ });
66
+ describe("cmdSync", () => {
67
+ it("calls initStateManager and syncState on GLOBAL_TRACE_DIR, and logs completion", async () => {
68
+ vi.mocked(existsSync).mockReturnValue(false);
69
+ await cmdSync([]);
70
+ expect(initStateManagerMock).toHaveBeenCalledTimes(1);
71
+ expect(initStateManagerMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
72
+ expect(syncStateMock).toHaveBeenCalledTimes(1);
73
+ expect(syncStateMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
74
+ expect(loggerInfoMock).toHaveBeenCalledWith("Sync completed");
75
+ });
76
+ it("does NOT touch config.json when --repair is not set", async () => {
77
+ vi.mocked(existsSync).mockReturnValue(false);
78
+ await cmdSync([]);
79
+ expect(existsSync).not.toHaveBeenCalled();
80
+ expect(rmSync).not.toHaveBeenCalled();
81
+ });
82
+ });
83
+ describe("cmdSync --repair", () => {
84
+ it("removes config.json and logs removal when it exists", async () => {
85
+ vi.mocked(existsSync).mockReturnValue(true);
86
+ await cmdSync(["--repair"]);
87
+ expect(existsSync).toHaveBeenCalledTimes(1);
88
+ expect(existsSync).toHaveBeenCalledWith(configPath);
89
+ expect(rmSync).toHaveBeenCalledTimes(1);
90
+ expect(rmSync).toHaveBeenCalledWith(configPath, { force: true });
91
+ expect(loggerInfoMock).toHaveBeenCalledWith("Removed corrupted config.json");
92
+ // After repair, normal sync flow still runs
93
+ expect(initStateManagerMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
94
+ expect(syncStateMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
95
+ expect(loggerInfoMock).toHaveBeenCalledWith("Sync completed");
96
+ });
97
+ it("does NOT call rmSync when config.json does not exist", async () => {
98
+ vi.mocked(existsSync).mockReturnValue(false);
99
+ await cmdSync(["--repair"]);
100
+ expect(existsSync).toHaveBeenCalledWith(configPath);
101
+ expect(rmSync).not.toHaveBeenCalled();
102
+ // logger.info "Removed corrupted config.json" should NOT be called
103
+ expect(loggerInfoMock).not.toHaveBeenCalledWith("Removed corrupted config.json");
104
+ // Normal sync flow still runs
105
+ expect(initStateManagerMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
106
+ expect(syncStateMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
107
+ expect(loggerInfoMock).toHaveBeenCalledWith("Sync completed");
108
+ });
109
+ it("ignores extra positional args but still applies --repair", async () => {
110
+ vi.mocked(existsSync).mockReturnValue(true);
111
+ await cmdSync(["--repair", "extra-arg"]);
112
+ expect(existsSync).toHaveBeenCalledWith(configPath);
113
+ expect(rmSync).toHaveBeenCalledWith(configPath, { force: true });
114
+ expect(loggerInfoMock).toHaveBeenCalledWith("Removed corrupted config.json");
115
+ expect(initStateManagerMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
116
+ expect(syncStateMock).toHaveBeenCalledWith(GLOBAL_TRACE_DIR);
117
+ expect(loggerInfoMock).toHaveBeenCalledWith("Sync completed");
118
+ });
119
+ });
120
+ //# sourceMappingURL=sync.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.test.js","sourceRoot":"","sources":["../../src/handlers/sync.test.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,15 @@
1
- import { spawn } from 'node:child_process';
2
- import { resolve, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
1
+ import { spawn } from "node:child_process";
2
+ import { resolve, dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
4
  const __dirname = dirname(fileURLToPath(import.meta.url));
5
5
  export async function cmdViewer(args) {
6
- const viewerPath = resolve(__dirname, '..', '..', 'viewer', 'cli.js');
7
- const child = spawn('node', [viewerPath, ...args], { stdio: 'inherit' });
8
- child.on('error', (err) => {
6
+ const viewerPath = resolve(__dirname, "..", "..", "viewer", "cli.js");
7
+ const child = spawn("node", [viewerPath, ...args], { stdio: "inherit" });
8
+ child.on("error", (err) => {
9
9
  console.error(`Failed to spawn viewer: ${err.message}`);
10
10
  process.exit(1);
11
11
  });
12
- child.on('exit', (code) => {
12
+ child.on("exit", (code) => {
13
13
  process.exit(code ?? 0);
14
14
  });
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/handlers/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAExC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAEzD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAErE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;IAExE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC,CAAC,CAAA;IAEF,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC"}
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/handlers/viewer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc;IAC5C,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACxB,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,73 +1,77 @@
1
1
  /**
2
2
  * @vitest-environment node
3
3
  */
4
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
5
- import * as childProcess from 'node:child_process';
6
- vi.mock('node:child_process', async (importOriginal) => {
4
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
5
+ import * as childProcess from "node:child_process";
6
+ vi.mock("node:child_process", async (importOriginal) => {
7
7
  const actual = await importOriginal();
8
8
  return {
9
9
  ...actual,
10
10
  default: actual,
11
- spawn: vi.fn()
11
+ spawn: vi.fn(),
12
12
  };
13
13
  });
14
- describe('cmdViewer', () => {
14
+ describe("cmdViewer", () => {
15
15
  let mockSpawn;
16
16
  let exitSpy;
17
17
  beforeEach(async () => {
18
18
  vi.resetModules();
19
19
  mockSpawn = vi.mocked(childProcess.spawn);
20
- exitSpy = vi.spyOn(process, 'exit').mockImplementation(() => undefined);
20
+ exitSpy = vi
21
+ .spyOn(process, "exit")
22
+ .mockImplementation(() => undefined);
21
23
  vi.clearAllMocks();
22
24
  });
23
25
  afterEach(() => {
24
26
  exitSpy.mockRestore();
25
27
  vi.restoreAllMocks();
26
28
  });
27
- it('should spawn viewer CLI with args', async () => {
29
+ it("should spawn viewer CLI with args", async () => {
28
30
  const mockChild = {
29
31
  on: vi.fn((event, callback) => {
30
- if (event === 'exit') {
32
+ if (event === "exit") {
31
33
  callback(0);
32
34
  }
33
35
  return mockChild;
34
- })
36
+ }),
35
37
  };
36
38
  mockSpawn.mockReturnValue(mockChild);
37
- const { cmdViewer } = await import('./viewer.js');
38
- await cmdViewer(['--port', '3000']);
39
- expect(mockSpawn).toHaveBeenCalledWith('node', [expect.stringMatching(/viewer[\/\\]cli\.js$/), '--port', '3000'], { stdio: 'inherit' });
39
+ const { cmdViewer } = await import("./viewer.js");
40
+ await cmdViewer(["--port", "3000"]);
41
+ expect(mockSpawn).toHaveBeenCalledWith("node", [expect.stringMatching(/viewer[\/\\]cli\.js$/), "--port", "3000"], { stdio: "inherit" });
40
42
  expect(exitSpy).toHaveBeenCalledWith(0);
41
43
  });
42
- it('should pass through exit code', async () => {
44
+ it("should pass through exit code", async () => {
43
45
  const mockChild = {
44
46
  on: vi.fn((event, callback) => {
45
- if (event === 'exit') {
47
+ if (event === "exit") {
46
48
  callback(1);
47
49
  }
48
50
  return mockChild;
49
- })
51
+ }),
50
52
  };
51
53
  mockSpawn.mockReturnValue(mockChild);
52
- const { cmdViewer } = await import('./viewer.js');
54
+ const { cmdViewer } = await import("./viewer.js");
53
55
  await cmdViewer([]);
54
56
  expect(exitSpy).toHaveBeenCalledWith(1);
55
57
  });
56
- it('should handle spawn errors', async () => {
57
- const mockError = new Error('spawn error');
58
+ it("should handle spawn errors", async () => {
59
+ const mockError = new Error("spawn error");
58
60
  const mockChild = {
59
61
  on: vi.fn((event, callback) => {
60
- if (event === 'error') {
62
+ if (event === "error") {
61
63
  callback(mockError);
62
64
  }
63
65
  return mockChild;
64
- })
66
+ }),
65
67
  };
66
68
  mockSpawn.mockReturnValue(mockChild);
67
- const consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
68
- const { cmdViewer } = await import('./viewer.js');
69
+ const consoleErrorSpy = vi
70
+ .spyOn(console, "error")
71
+ .mockImplementation(() => { });
72
+ const { cmdViewer } = await import("./viewer.js");
69
73
  await cmdViewer([]);
70
- expect(consoleErrorSpy).toHaveBeenCalledWith('Failed to spawn viewer: spawn error');
74
+ expect(consoleErrorSpy).toHaveBeenCalledWith("Failed to spawn viewer: spawn error");
71
75
  expect(exitSpy).toHaveBeenCalledWith(1);
72
76
  consoleErrorSpy.mockRestore();
73
77
  });
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.test.js","sourceRoot":"","sources":["../../src/handlers/viewer.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"viewer.test.js","sourceRoot":"","sources":["../../src/handlers/viewer.test.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -14,12 +14,20 @@ Usage:
14
14
  opencode-trace <command> [options]
15
15
 
16
16
  Commands:
17
- enable [-s] [session-id] Enable trace (global by default)
18
- -s: enable specific session
19
- disable [-s] [session-id] Disable trace (global by default)
20
- -s: disable specific session
21
- status [-s] [session-id] Show trace status (global by default)
22
- -s: show specific session status
17
+ enable [-g] [-l] [-s <id>] [-d global|local]
18
+ Enable trace recording
19
+ -g, --global: enable global scope (default)
20
+ -l, --local: enable local scope
21
+ -s, --session <id>: enable session scope
22
+ -d, --dir <global|local>: storage location
23
+ disable [-g] [-l] [-s <id>] Disable trace recording
24
+ -g, --global: disable global scope (default)
25
+ -l, --local: disable local scope
26
+ -s, --session <id>: disable session scope
27
+ status [-g] [-l] [-s <id>] Show trace status
28
+ -g, --global: show global scope (default)
29
+ -l, --local: show local scope
30
+ -s, --session <id>: show session scope
23
31
  list List all sessions
24
32
  Shows: session-id, title, created, updated
25
33
  show <session-id> metadata Show session metadata
@@ -42,8 +50,8 @@ Commands:
42
50
  -r: request range (not for raw)
43
51
  --collapse: top-level collapse (sys,tool,msgs)
44
52
  --collapse-blocks: block types (text,thinking,td,tc,tr,image,other)
45
- sync [--repair] Sync SQLite with filesystem
46
- --repair: rebuild corrupted state.db
53
+ sync [--repair] Sync filesystem indexes
54
+ --repair: rebuild corrupted config.json
47
55
  viewer [options] Start web viewer
48
56
  Options: --port <num>, --no-open
49
57
  help Show this help message
@@ -64,14 +72,14 @@ async function main() {
64
72
  if (command === "--help" || command === "-h") {
65
73
  console.error("Usage: opencode-trace <command> [options]");
66
74
  console.error("Commands:");
67
- console.error(" enable [--session <id>] - Enable trace recording");
68
- console.error(" disable [--session <id>] - Disable trace recording");
69
- console.error(" status [--session <id>] - Show trace status");
70
- console.error(" list - List all sessions");
71
- console.error(" sync [--repair] - Sync trace data");
72
- console.error(" viewer [options] - Start web viewer");
73
- console.error(" show <type> <session> - Show trace data");
74
- console.error(" export <type> <session> - Export trace data");
75
+ console.error(" enable [-g] [-l] [-s <id>] [-d global|local] - Enable trace recording");
76
+ console.error(" disable [-g] [-l] [-s <id>] - Disable trace recording");
77
+ console.error(" status [-g] [-l] [-s <id>] - Show trace status");
78
+ console.error(" list - List all sessions");
79
+ console.error(" sync [--repair] - Sync trace data");
80
+ console.error(" viewer [options] - Start web viewer");
81
+ console.error(" show <type> <session> - Show trace data");
82
+ console.error(" export <type> <session> - Export trace data");
75
83
  process.exit(0);
76
84
  }
77
85
  const handlerArgs = args.slice(1);
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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"}
@@ -1,12 +1,15 @@
1
- import { describe, it, expect } from "vitest";
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
2
  import { execSync } from "node:child_process";
3
3
  import { resolve } from "node:path";
4
+ import { mkdtempSync, rmSync, existsSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
4
7
  const CLI_PATH = resolve(__dirname, "..", "dist", "index.js");
5
- function runCLI(args) {
8
+ function runCLI(args, cwd) {
6
9
  try {
7
10
  const stdout = execSync(`node ${CLI_PATH} ${args}`, {
8
11
  encoding: "utf-8",
9
- cwd: resolve(__dirname, ".."),
12
+ cwd: cwd ?? resolve(__dirname, ".."),
10
13
  });
11
14
  return { stdout, stderr: "", exitCode: 0 };
12
15
  }
@@ -18,6 +21,13 @@ function runCLI(args) {
18
21
  };
19
22
  }
20
23
  }
24
+ let testDir;
25
+ beforeEach(() => {
26
+ testDir = mkdtempSync(join(tmpdir(), "cli-test-"));
27
+ });
28
+ afterEach(() => {
29
+ rmSync(testDir, { recursive: true, force: true });
30
+ });
21
31
  describe("parseCollapse", () => {
22
32
  it("should accept valid collapse options in flags", () => {
23
33
  const result = runCLI("help --collapse sys,tool,msgs");
@@ -48,4 +58,29 @@ describe("help text", () => {
48
58
  expect(result.stdout).toContain("text,thinking,td,tc,tr,image,other");
49
59
  });
50
60
  });
61
+ describe("--local flag", () => {
62
+ it("enable --local saves to local directory", () => {
63
+ const result = runCLI(`enable --local`, testDir);
64
+ expect(result.exitCode).toBe(0);
65
+ expect(result.stdout).toContain("local");
66
+ const localConfig = join(testDir, ".opencode-trace", "config.json");
67
+ expect(existsSync(localConfig)).toBe(true);
68
+ });
69
+ it("enable without --local saves to global directory", () => {
70
+ const result = runCLI(`enable`, testDir);
71
+ expect(result.exitCode).toBe(0);
72
+ expect(result.stdout).toContain("global");
73
+ });
74
+ it("disable --local affects local directory", () => {
75
+ const result = runCLI(`disable --local`, testDir);
76
+ expect(result.exitCode).toBe(0);
77
+ expect(result.stdout).toContain("local");
78
+ const localConfig = join(testDir, ".opencode-trace", "config.json");
79
+ expect(existsSync(localConfig)).toBe(true);
80
+ });
81
+ it("status --local shows local status", () => {
82
+ const result = runCLI(`status --local`, testDir);
83
+ expect(result.exitCode).toBe(0);
84
+ });
85
+ });
51
86
  //# sourceMappingURL=index.test.js.map