@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.
- package/README.md +2 -3
- package/dist/formatter.d.ts.map +1 -1
- package/dist/formatter.js +16 -6
- package/dist/formatter.js.map +1 -1
- package/dist/formatter.test.d.ts +2 -0
- package/dist/formatter.test.d.ts.map +1 -0
- package/dist/formatter.test.js +232 -0
- package/dist/formatter.test.js.map +1 -0
- package/dist/handlers/disable.test.d.ts +2 -0
- package/dist/handlers/disable.test.d.ts.map +1 -0
- package/dist/handlers/disable.test.js +115 -0
- package/dist/handlers/disable.test.js.map +1 -0
- package/dist/handlers/enable.d.ts.map +1 -1
- package/dist/handlers/enable.js +28 -10
- package/dist/handlers/enable.js.map +1 -1
- package/dist/handlers/enable.test.d.ts +2 -0
- package/dist/handlers/enable.test.d.ts.map +1 -0
- package/dist/handlers/enable.test.js +125 -0
- package/dist/handlers/enable.test.js.map +1 -0
- package/dist/handlers/export.d.ts.map +1 -1
- package/dist/handlers/export.js +11 -15
- package/dist/handlers/export.js.map +1 -1
- package/dist/handlers/export.test.d.ts +2 -0
- package/dist/handlers/export.test.d.ts.map +1 -0
- package/dist/handlers/export.test.js +492 -0
- package/dist/handlers/export.test.js.map +1 -0
- package/dist/handlers/list.d.ts.map +1 -1
- package/dist/handlers/list.js +8 -9
- package/dist/handlers/list.js.map +1 -1
- package/dist/handlers/list.test.d.ts +2 -0
- package/dist/handlers/list.test.d.ts.map +1 -0
- package/dist/handlers/list.test.js +154 -0
- package/dist/handlers/list.test.js.map +1 -0
- package/dist/handlers/show.d.ts.map +1 -1
- package/dist/handlers/show.js +1 -1
- package/dist/handlers/show.js.map +1 -1
- package/dist/handlers/show.test.d.ts +2 -0
- package/dist/handlers/show.test.d.ts.map +1 -0
- package/dist/handlers/show.test.js +322 -0
- package/dist/handlers/show.test.js.map +1 -0
- package/dist/handlers/status.d.ts.map +1 -1
- package/dist/handlers/status.js +24 -9
- package/dist/handlers/status.js.map +1 -1
- package/dist/handlers/status.test.d.ts +2 -0
- package/dist/handlers/status.test.d.ts.map +1 -0
- package/dist/handlers/status.test.js +141 -0
- package/dist/handlers/status.test.js.map +1 -0
- package/dist/handlers/sync.d.ts.map +1 -1
- package/dist/handlers/sync.js +5 -5
- package/dist/handlers/sync.js.map +1 -1
- package/dist/handlers/sync.test.d.ts +2 -0
- package/dist/handlers/sync.test.d.ts.map +1 -0
- package/dist/handlers/sync.test.js +120 -0
- package/dist/handlers/sync.test.js.map +1 -0
- package/dist/handlers/viewer.js +7 -7
- package/dist/handlers/viewer.js.map +1 -1
- package/dist/handlers/viewer.test.js +27 -23
- package/dist/handlers/viewer.test.js.map +1 -1
- package/dist/index.js +24 -16
- package/dist/index.js.map +1 -1
- package/dist/index.test.js +38 -3
- package/dist/index.test.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +22 -2
- package/dist/utils.js.map +1 -1
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +250 -0
- package/dist/utils.test.js.map +1 -0
- 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":"
|
|
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"}
|
package/dist/handlers/sync.js
CHANGED
|
@@ -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
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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,
|
|
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 @@
|
|
|
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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"}
|
package/dist/handlers/viewer.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { spawn } from
|
|
2
|
-
import { resolve, dirname } from
|
|
3
|
-
import { fileURLToPath } from
|
|
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,
|
|
7
|
-
const child = spawn(
|
|
8
|
-
child.on(
|
|
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(
|
|
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,
|
|
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
|
|
5
|
-
import * as childProcess from
|
|
6
|
-
vi.mock(
|
|
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(
|
|
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
|
|
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(
|
|
29
|
+
it("should spawn viewer CLI with args", async () => {
|
|
28
30
|
const mockChild = {
|
|
29
31
|
on: vi.fn((event, callback) => {
|
|
30
|
-
if (event ===
|
|
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(
|
|
38
|
-
await cmdViewer([
|
|
39
|
-
expect(mockSpawn).toHaveBeenCalledWith(
|
|
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(
|
|
44
|
+
it("should pass through exit code", async () => {
|
|
43
45
|
const mockChild = {
|
|
44
46
|
on: vi.fn((event, callback) => {
|
|
45
|
-
if (event ===
|
|
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(
|
|
54
|
+
const { cmdViewer } = await import("./viewer.js");
|
|
53
55
|
await cmdViewer([]);
|
|
54
56
|
expect(exitSpy).toHaveBeenCalledWith(1);
|
|
55
57
|
});
|
|
56
|
-
it(
|
|
57
|
-
const mockError = new 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 ===
|
|
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
|
|
68
|
-
|
|
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(
|
|
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":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,
|
|
1
|
+
{"version":3,"file":"viewer.test.js","sourceRoot":"","sources":["../../src/handlers/viewer.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,KAAK,EAAE,cAAc,EAAE,EAAE;IACrD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAuC,CAAC;IAC3E,OAAO;QACL,GAAG,MAAM;QACT,OAAO,EAAE,MAAM;QACf,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;KACf,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,SAAmC,CAAC;IACxC,IAAI,OAAoC,CAAC;IAEzC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE;aACT,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC;aACtB,kBAAkB,CAAC,GAAG,EAAE,CAAC,SAAkB,CAAC,CAAC;QAChD,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,CAAC,WAAW,EAAE,CAAC;QACtB,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC5B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrB,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;SACH,CAAC;QACF,SAAS,CAAC,eAAe,CAAC,SAAgB,CAAC,CAAC;QAE5C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QAEpC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,MAAM,EACN,CAAC,MAAM,CAAC,cAAc,CAAC,sBAAsB,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EACjE,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC5B,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACrB,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;SACH,CAAC;QACF,SAAS,CAAC,eAAe,CAAC,SAAgB,CAAC,CAAC;QAE5C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAEpB,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,SAAS,GAAG;YAChB,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;gBAC5B,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;oBACtB,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACtB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;SACH,CAAC;QACF,SAAS,CAAC,eAAe,CAAC,SAAgB,CAAC,CAAC;QAE5C,MAAM,eAAe,GAAG,EAAE;aACvB,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC;aACvB,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAEhC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QAEpB,MAAM,CAAC,eAAe,CAAC,CAAC,oBAAoB,CAC1C,qCAAqC,CACtC,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QAExC,eAAe,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -14,12 +14,20 @@ Usage:
|
|
|
14
14
|
opencode-trace <command> [options]
|
|
15
15
|
|
|
16
16
|
Commands:
|
|
17
|
-
enable [-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
-
|
|
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
|
|
46
|
-
--repair: rebuild corrupted
|
|
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 [
|
|
68
|
-
console.error(" disable [
|
|
69
|
-
console.error(" status [
|
|
70
|
-
console.error(" list
|
|
71
|
-
console.error(" sync [--repair]
|
|
72
|
-
console.error(" viewer [options]
|
|
73
|
-
console.error(" show <type> <session>
|
|
74
|
-
console.error(" export <type> <session>
|
|
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":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,SAAS,IAAI;IACX,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+CZ,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAExB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CACX,6DAA6D,CAC9D,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,WAAW,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAC5F,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACtF,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACrF,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;QACtF,OAAO,CAAC,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACrF,OAAO,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAElC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,MAAM;YACT,OAAO,CAAC,WAAW,CAAC,CAAC;YACrB,MAAM;QACR,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,MAAM;YACT,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC;YAC3B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7B,MAAM;QACR,KAAK,MAAM;YACT,IAAI,EAAE,CAAC;YACP,MAAM;QACR;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;YAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/index.test.js
CHANGED
|
@@ -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
|