skyboard-cli 0.1.1 → 0.1.3
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/dist/__tests__/auth-state.test.d.ts +1 -0
- package/dist/__tests__/auth-state.test.js +86 -0
- package/dist/__tests__/auth-state.test.js.map +1 -0
- package/dist/__tests__/card-ref.test.d.ts +1 -0
- package/dist/__tests__/card-ref.test.js +36 -0
- package/dist/__tests__/card-ref.test.js.map +1 -0
- package/dist/__tests__/column-match.test.d.ts +1 -0
- package/dist/__tests__/column-match.test.js +49 -0
- package/dist/__tests__/column-match.test.js.map +1 -0
- package/dist/__tests__/commands.test.d.ts +1 -0
- package/dist/__tests__/commands.test.js +243 -0
- package/dist/__tests__/commands.test.js.map +1 -0
- package/dist/__tests__/helpers.d.ts +50 -0
- package/dist/__tests__/helpers.js +135 -0
- package/dist/__tests__/helpers.js.map +1 -0
- package/dist/__tests__/materialize.test.d.ts +1 -0
- package/dist/__tests__/materialize.test.js +186 -0
- package/dist/__tests__/materialize.test.js.map +1 -0
- package/dist/__tests__/pds.test.d.ts +1 -0
- package/dist/__tests__/pds.test.js +80 -0
- package/dist/__tests__/pds.test.js.map +1 -0
- package/dist/commands/add.d.ts +1 -0
- package/dist/commands/add.js +41 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/boards.d.ts +3 -0
- package/dist/commands/boards.js +54 -0
- package/dist/commands/boards.js.map +1 -0
- package/dist/commands/cards.d.ts +7 -0
- package/dist/commands/cards.js +54 -0
- package/dist/commands/cards.js.map +1 -0
- package/dist/commands/cols.d.ts +4 -0
- package/dist/commands/cols.js +44 -0
- package/dist/commands/cols.js.map +1 -0
- package/dist/commands/comment.d.ts +4 -0
- package/dist/commands/comment.js +55 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/edit.d.ts +7 -0
- package/dist/commands/edit.js +80 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/login.d.ts +1 -0
- package/dist/commands/login.js +20 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +1 -0
- package/dist/commands/logout.js +14 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/mv.d.ts +4 -0
- package/dist/commands/mv.js +74 -0
- package/dist/commands/mv.js.map +1 -0
- package/dist/commands/new.d.ts +6 -0
- package/dist/commands/new.js +72 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/rm.d.ts +5 -0
- package/dist/commands/rm.js +67 -0
- package/dist/commands/rm.js.map +1 -0
- package/dist/commands/show.d.ts +4 -0
- package/dist/commands/show.js +90 -0
- package/dist/commands/show.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.js +71 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/use.d.ts +1 -0
- package/dist/commands/use.js +61 -0
- package/dist/commands/use.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.js +23 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +126 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +28 -0
- package/dist/lib/auth.js +219 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/card-ref.d.ts +7 -0
- package/dist/lib/card-ref.js +23 -0
- package/dist/lib/card-ref.js.map +1 -0
- package/dist/lib/column-match.d.ts +6 -0
- package/dist/lib/column-match.js +35 -0
- package/dist/lib/column-match.js.map +1 -0
- package/dist/lib/config.d.ts +32 -0
- package/dist/lib/config.js +153 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/display.d.ts +11 -0
- package/dist/lib/display.js +97 -0
- package/dist/lib/display.js.map +1 -0
- package/dist/lib/materialize.d.ts +2 -0
- package/dist/lib/materialize.js +111 -0
- package/dist/lib/materialize.js.map +1 -0
- package/dist/lib/pds.d.ts +26 -0
- package/dist/lib/pds.js +187 -0
- package/dist/lib/pds.js.map +1 -0
- package/dist/lib/permissions.d.ts +4 -0
- package/dist/lib/permissions.js +13 -0
- package/dist/lib/permissions.js.map +1 -0
- package/dist/lib/schemas.d.ts +209 -0
- package/dist/lib/schemas.js +82 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/tid.d.ts +9 -0
- package/dist/lib/tid.js +16 -0
- package/dist/lib/tid.js.map +1 -0
- package/dist/lib/types.d.ts +129 -0
- package/dist/lib/types.js +3 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { OWNER_DID, USER_DID } from "./helpers.js";
|
|
3
|
+
// Mock config module
|
|
4
|
+
const mockLoadAuthInfo = vi.fn();
|
|
5
|
+
const mockClearDefaultBoard = vi.fn();
|
|
6
|
+
const mockGetDefaultBoard = vi.fn();
|
|
7
|
+
vi.mock("../lib/config.js", () => ({
|
|
8
|
+
loadAuthInfo: (...args) => mockLoadAuthInfo(...args),
|
|
9
|
+
clearDefaultBoard: (...args) => mockClearDefaultBoard(...args),
|
|
10
|
+
getDefaultBoard: (...args) => mockGetDefaultBoard(...args),
|
|
11
|
+
}));
|
|
12
|
+
// Mock auth module
|
|
13
|
+
const mockLogin = vi.fn();
|
|
14
|
+
const mockLogout = vi.fn();
|
|
15
|
+
vi.mock("../lib/auth.js", () => ({
|
|
16
|
+
login: (...args) => mockLogin(...args),
|
|
17
|
+
logout: (...args) => mockLogout(...args),
|
|
18
|
+
}));
|
|
19
|
+
import { logoutCommand } from "../commands/logout.js";
|
|
20
|
+
import { loginCommand } from "../commands/login.js";
|
|
21
|
+
beforeEach(() => {
|
|
22
|
+
vi.clearAllMocks();
|
|
23
|
+
vi.spyOn(console, "log").mockImplementation(() => { });
|
|
24
|
+
vi.spyOn(console, "error").mockImplementation(() => { });
|
|
25
|
+
});
|
|
26
|
+
describe("logoutCommand", () => {
|
|
27
|
+
it("clears the default board on logout", () => {
|
|
28
|
+
mockLoadAuthInfo.mockReturnValue({
|
|
29
|
+
did: OWNER_DID,
|
|
30
|
+
handle: "owner.test",
|
|
31
|
+
service: "https://pds.example.com",
|
|
32
|
+
});
|
|
33
|
+
logoutCommand();
|
|
34
|
+
expect(mockLogout).toHaveBeenCalledOnce();
|
|
35
|
+
expect(mockClearDefaultBoard).toHaveBeenCalledOnce();
|
|
36
|
+
});
|
|
37
|
+
it("does not clear board if not logged in", () => {
|
|
38
|
+
mockLoadAuthInfo.mockReturnValue(null);
|
|
39
|
+
logoutCommand();
|
|
40
|
+
expect(mockLogout).not.toHaveBeenCalled();
|
|
41
|
+
expect(mockClearDefaultBoard).not.toHaveBeenCalled();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe("loginCommand", () => {
|
|
45
|
+
it("clears the default board when switching to a different account", async () => {
|
|
46
|
+
mockLoadAuthInfo.mockReturnValue({
|
|
47
|
+
did: OWNER_DID,
|
|
48
|
+
handle: "owner.test",
|
|
49
|
+
service: "https://pds.example.com",
|
|
50
|
+
});
|
|
51
|
+
mockLogin.mockResolvedValue({ did: USER_DID, handle: "user.test" });
|
|
52
|
+
await loginCommand("user.test");
|
|
53
|
+
expect(mockClearDefaultBoard).toHaveBeenCalledOnce();
|
|
54
|
+
});
|
|
55
|
+
it("does not clear the default board when logging in as the same account", async () => {
|
|
56
|
+
mockLoadAuthInfo.mockReturnValue({
|
|
57
|
+
did: OWNER_DID,
|
|
58
|
+
handle: "owner.test",
|
|
59
|
+
service: "https://pds.example.com",
|
|
60
|
+
});
|
|
61
|
+
mockLogin.mockResolvedValue({ did: OWNER_DID, handle: "owner.test" });
|
|
62
|
+
await loginCommand("owner.test");
|
|
63
|
+
expect(mockClearDefaultBoard).not.toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
it("does not clear the default board on first login (no previous auth)", async () => {
|
|
66
|
+
mockLoadAuthInfo.mockReturnValue(null);
|
|
67
|
+
mockLogin.mockResolvedValue({ did: OWNER_DID, handle: "owner.test" });
|
|
68
|
+
await loginCommand("owner.test");
|
|
69
|
+
expect(mockClearDefaultBoard).not.toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
it("does not clear the default board if login fails", async () => {
|
|
72
|
+
mockLoadAuthInfo.mockReturnValue({
|
|
73
|
+
did: OWNER_DID,
|
|
74
|
+
handle: "owner.test",
|
|
75
|
+
service: "https://pds.example.com",
|
|
76
|
+
});
|
|
77
|
+
mockLogin.mockRejectedValue(new Error("OAuth failed"));
|
|
78
|
+
const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => {
|
|
79
|
+
throw new Error("process.exit");
|
|
80
|
+
}));
|
|
81
|
+
await expect(loginCommand("user.test")).rejects.toThrow("process.exit");
|
|
82
|
+
expect(mockClearDefaultBoard).not.toHaveBeenCalled();
|
|
83
|
+
exitSpy.mockRestore();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=auth-state.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-state.test.js","sourceRoot":"","sources":["../../src/__tests__/auth-state.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveCardRef } from "../lib/card-ref.js";
|
|
3
|
+
import { makeMaterializedTask, TASK_RKEY_1, TASK_RKEY_2, TASK_RKEY_3 } from "./helpers.js";
|
|
4
|
+
describe("resolveCardRef", () => {
|
|
5
|
+
const tasks = [
|
|
6
|
+
makeMaterializedTask({ rkey: TASK_RKEY_1, title: "First Task" }),
|
|
7
|
+
makeMaterializedTask({ rkey: TASK_RKEY_2, title: "Second Task" }),
|
|
8
|
+
makeMaterializedTask({ rkey: TASK_RKEY_3, title: "Third Task" }),
|
|
9
|
+
];
|
|
10
|
+
it("matches a task by 4+ character rkey prefix", () => {
|
|
11
|
+
// TASK_RKEY_1 = "3jui7a2zbbb22" — need enough chars to disambiguate from TASK_RKEY_2 "3jui7a2zbbb33"
|
|
12
|
+
const result = resolveCardRef(TASK_RKEY_1.slice(0, 12), tasks);
|
|
13
|
+
expect(result.rkey).toBe(TASK_RKEY_1);
|
|
14
|
+
});
|
|
15
|
+
it("matches a task by full rkey", () => {
|
|
16
|
+
const result = resolveCardRef(TASK_RKEY_2, tasks);
|
|
17
|
+
expect(result.rkey).toBe(TASK_RKEY_2);
|
|
18
|
+
});
|
|
19
|
+
it("throws on too-short prefix (< 4 chars)", () => {
|
|
20
|
+
expect(() => resolveCardRef("3ju", tasks)).toThrow("too short");
|
|
21
|
+
});
|
|
22
|
+
it("throws when no task matches", () => {
|
|
23
|
+
expect(() => resolveCardRef("zzzz", tasks)).toThrow('No card found');
|
|
24
|
+
});
|
|
25
|
+
it("throws on ambiguous match with list of candidates", () => {
|
|
26
|
+
// TASK_RKEY_1 = "3jui7a2zbbb22", TASK_RKEY_2 = "3jui7a2zbbb33"
|
|
27
|
+
// They share prefix "3jui7a2zbbb"
|
|
28
|
+
expect(() => resolveCardRef("3jui7a2zbbb", tasks)).toThrow("Ambiguous");
|
|
29
|
+
});
|
|
30
|
+
it("resolves unambiguous prefix that partially overlaps", () => {
|
|
31
|
+
// TASK_RKEY_3 = "3jui7a2zbcc44" — prefix "3jui7a2zbcc" is unique
|
|
32
|
+
const result = resolveCardRef("3jui7a2zbcc", tasks);
|
|
33
|
+
expect(result.rkey).toBe(TASK_RKEY_3);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=card-ref.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-ref.test.js","sourceRoot":"","sources":["../../src/__tests__/card-ref.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3F,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,KAAK,GAAG;QACZ,oBAAoB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAChE,oBAAoB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QACjE,oBAAoB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;KACjE,CAAC;IAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,qGAAqG;QACrG,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,+DAA+D;QAC/D,kCAAkC;QAClC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,iEAAiE;QACjE,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { resolveColumn } from "../lib/column-match.js";
|
|
3
|
+
import { COLUMNS } from "./helpers.js";
|
|
4
|
+
describe("resolveColumn", () => {
|
|
5
|
+
// COLUMNS: To Do (0), In Progress (1), Done (2)
|
|
6
|
+
it("matches by 1-based numeric index", () => {
|
|
7
|
+
expect(resolveColumn("1", COLUMNS)).toEqual(COLUMNS[0]); // To Do
|
|
8
|
+
expect(resolveColumn("2", COLUMNS)).toEqual(COLUMNS[1]); // In Progress
|
|
9
|
+
expect(resolveColumn("3", COLUMNS)).toEqual(COLUMNS[2]); // Done
|
|
10
|
+
});
|
|
11
|
+
it("matches by exact name (case-insensitive)", () => {
|
|
12
|
+
expect(resolveColumn("To Do", COLUMNS)).toEqual(COLUMNS[0]);
|
|
13
|
+
expect(resolveColumn("to do", COLUMNS)).toEqual(COLUMNS[0]);
|
|
14
|
+
expect(resolveColumn("IN PROGRESS", COLUMNS)).toEqual(COLUMNS[1]);
|
|
15
|
+
expect(resolveColumn("done", COLUMNS)).toEqual(COLUMNS[2]);
|
|
16
|
+
});
|
|
17
|
+
it("matches by prefix", () => {
|
|
18
|
+
expect(resolveColumn("Do", COLUMNS)).toEqual(COLUMNS[2]); // "Done" unique prefix
|
|
19
|
+
});
|
|
20
|
+
it("matches by substring", () => {
|
|
21
|
+
expect(resolveColumn("Prog", COLUMNS)).toEqual(COLUMNS[1]); // "In Progress"
|
|
22
|
+
});
|
|
23
|
+
it("throws on ambiguous prefix match", () => {
|
|
24
|
+
// Columns with ambiguous prefixes
|
|
25
|
+
const cols = [
|
|
26
|
+
{ id: "a", name: "Alpha One", order: 0 },
|
|
27
|
+
{ id: "b", name: "Alpha Two", order: 1 },
|
|
28
|
+
];
|
|
29
|
+
expect(() => resolveColumn("Alpha", cols)).toThrow("Ambiguous");
|
|
30
|
+
});
|
|
31
|
+
it("throws on ambiguous substring match", () => {
|
|
32
|
+
const cols = [
|
|
33
|
+
{ id: "a", name: "Pre-Review", order: 0 },
|
|
34
|
+
{ id: "b", name: "Post-Review", order: 1 },
|
|
35
|
+
];
|
|
36
|
+
// "Review" is a substring of both but not a prefix of either
|
|
37
|
+
expect(() => resolveColumn("Review", cols)).toThrow("Ambiguous");
|
|
38
|
+
});
|
|
39
|
+
it("throws on no match with available columns", () => {
|
|
40
|
+
expect(() => resolveColumn("Nonexistent", COLUMNS)).toThrow("No column matching");
|
|
41
|
+
expect(() => resolveColumn("Nonexistent", COLUMNS)).toThrow("To Do");
|
|
42
|
+
});
|
|
43
|
+
it("ignores out-of-range numeric index", () => {
|
|
44
|
+
// "0" is out of 1-based range, and doesn't match any name
|
|
45
|
+
expect(() => resolveColumn("0", COLUMNS)).toThrow("No column matching");
|
|
46
|
+
expect(() => resolveColumn("99", COLUMNS)).toThrow("No column matching");
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=column-match.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"column-match.test.js","sourceRoot":"","sources":["../../src/__tests__/column-match.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { OWNER_DID, USER_DID, BOARD_RKEY, TASK_RKEY_1, makeBoard, makeMaterializedTask, makeComment, } from "./helpers.js";
|
|
3
|
+
// Mock modules before importing commands
|
|
4
|
+
vi.mock("../lib/auth.js", () => ({
|
|
5
|
+
requireAgent: vi.fn(),
|
|
6
|
+
}));
|
|
7
|
+
vi.mock("../lib/config.js", () => ({
|
|
8
|
+
getDefaultBoard: vi.fn(),
|
|
9
|
+
loadConfig: vi.fn(() => ({ knownBoards: [] })),
|
|
10
|
+
saveConfig: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
vi.mock("../lib/pds.js", () => ({
|
|
13
|
+
fetchBoardData: vi.fn(),
|
|
14
|
+
fetchBoard: vi.fn(),
|
|
15
|
+
}));
|
|
16
|
+
// Mock generateTID to return a predictable value
|
|
17
|
+
vi.mock("../lib/tid.js", async (importOriginal) => {
|
|
18
|
+
const orig = await importOriginal();
|
|
19
|
+
return {
|
|
20
|
+
...orig,
|
|
21
|
+
generateTID: vi.fn(() => "3juitestid0000000"),
|
|
22
|
+
};
|
|
23
|
+
});
|
|
24
|
+
import { requireAgent } from "../lib/auth.js";
|
|
25
|
+
import { getDefaultBoard } from "../lib/config.js";
|
|
26
|
+
import { fetchBoardData } from "../lib/pds.js";
|
|
27
|
+
import { newCommand } from "../commands/new.js";
|
|
28
|
+
import { mvCommand } from "../commands/mv.js";
|
|
29
|
+
import { editCommand } from "../commands/edit.js";
|
|
30
|
+
import { rmCommand } from "../commands/rm.js";
|
|
31
|
+
import { showCommand } from "../commands/show.js";
|
|
32
|
+
import { cardsCommand } from "../commands/cards.js";
|
|
33
|
+
const mockPutRecord = vi.fn(async (_input) => ({ uri: "at://fake", cid: "fakecid" }));
|
|
34
|
+
const mockDeleteRecord = vi.fn(async (_input) => ({}));
|
|
35
|
+
const mockAgent = {
|
|
36
|
+
com: {
|
|
37
|
+
atproto: {
|
|
38
|
+
repo: {
|
|
39
|
+
putRecord: mockPutRecord,
|
|
40
|
+
deleteRecord: mockDeleteRecord,
|
|
41
|
+
listRecords: vi.fn(async () => ({ data: { records: [] } })),
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
function setupMocks(taskOverrides) {
|
|
47
|
+
vi.mocked(requireAgent).mockResolvedValue({
|
|
48
|
+
agent: mockAgent,
|
|
49
|
+
did: OWNER_DID,
|
|
50
|
+
handle: "owner.test",
|
|
51
|
+
});
|
|
52
|
+
vi.mocked(getDefaultBoard).mockReturnValue({
|
|
53
|
+
did: OWNER_DID,
|
|
54
|
+
rkey: BOARD_RKEY,
|
|
55
|
+
name: "Test Board",
|
|
56
|
+
});
|
|
57
|
+
const task = makeMaterializedTask({ rkey: TASK_RKEY_1, did: OWNER_DID, title: "Test Task", ...taskOverrides }, { effectiveTitle: taskOverrides?.title ?? "Test Task" });
|
|
58
|
+
const boardData = {
|
|
59
|
+
board: makeBoard(),
|
|
60
|
+
tasks: [task],
|
|
61
|
+
trusts: [],
|
|
62
|
+
comments: [],
|
|
63
|
+
allParticipants: [OWNER_DID],
|
|
64
|
+
};
|
|
65
|
+
vi.mocked(fetchBoardData).mockResolvedValue(boardData);
|
|
66
|
+
return { task, boardData };
|
|
67
|
+
}
|
|
68
|
+
beforeEach(() => {
|
|
69
|
+
vi.clearAllMocks();
|
|
70
|
+
// Suppress console output during tests
|
|
71
|
+
vi.spyOn(console, "log").mockImplementation(() => { });
|
|
72
|
+
vi.spyOn(console, "error").mockImplementation(() => { });
|
|
73
|
+
});
|
|
74
|
+
describe("newCommand", () => {
|
|
75
|
+
it("creates a task record via putRecord", async () => {
|
|
76
|
+
setupMocks();
|
|
77
|
+
await newCommand("My New Task", { json: true });
|
|
78
|
+
expect(mockPutRecord).toHaveBeenCalledOnce();
|
|
79
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
80
|
+
expect(call.repo).toBe(OWNER_DID);
|
|
81
|
+
expect(call.collection).toBe("dev.skyboard.task");
|
|
82
|
+
expect(call.record.$type).toBe("dev.skyboard.task");
|
|
83
|
+
expect(call.record.title).toBe("My New Task");
|
|
84
|
+
expect(call.record.columnId).toBe("col-todo"); // first column
|
|
85
|
+
expect(call.record.position).toBeDefined();
|
|
86
|
+
expect(call.record.boardUri).toContain(BOARD_RKEY);
|
|
87
|
+
});
|
|
88
|
+
it("creates task in specified column", async () => {
|
|
89
|
+
setupMocks();
|
|
90
|
+
await newCommand("Task in Done", { column: "Done", json: true });
|
|
91
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
92
|
+
expect(call.record.columnId).toBe("col-done");
|
|
93
|
+
});
|
|
94
|
+
it("includes description when provided", async () => {
|
|
95
|
+
setupMocks();
|
|
96
|
+
await newCommand("With Desc", { description: "A description", json: true });
|
|
97
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
98
|
+
expect(call.record.description).toBe("A description");
|
|
99
|
+
});
|
|
100
|
+
it("outputs JSON when --json flag is set", async () => {
|
|
101
|
+
setupMocks();
|
|
102
|
+
await newCommand("JSON Task", { json: true });
|
|
103
|
+
expect(console.log).toHaveBeenCalled();
|
|
104
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
105
|
+
const parsed = JSON.parse(output);
|
|
106
|
+
expect(parsed.title).toBe("JSON Task");
|
|
107
|
+
expect(parsed.column).toBe("To Do");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe("mvCommand", () => {
|
|
111
|
+
it("creates an op record with columnId and position", async () => {
|
|
112
|
+
setupMocks();
|
|
113
|
+
await mvCommand(TASK_RKEY_1, "Done", { json: true });
|
|
114
|
+
expect(mockPutRecord).toHaveBeenCalledOnce();
|
|
115
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
116
|
+
expect(call.repo).toBe(OWNER_DID);
|
|
117
|
+
expect(call.collection).toBe("dev.skyboard.op");
|
|
118
|
+
expect(call.record.$type).toBe("dev.skyboard.op");
|
|
119
|
+
expect(call.record.fields.columnId).toBe("col-done");
|
|
120
|
+
expect(call.record.fields.position).toBeDefined();
|
|
121
|
+
expect(call.record.targetTaskUri).toContain(TASK_RKEY_1);
|
|
122
|
+
});
|
|
123
|
+
it("outputs JSON with rkey and column name", async () => {
|
|
124
|
+
setupMocks();
|
|
125
|
+
await mvCommand(TASK_RKEY_1, "In Progress", { json: true });
|
|
126
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
127
|
+
const parsed = JSON.parse(output);
|
|
128
|
+
expect(parsed.rkey).toBe(TASK_RKEY_1);
|
|
129
|
+
expect(parsed.column).toBe("In Progress");
|
|
130
|
+
});
|
|
131
|
+
});
|
|
132
|
+
describe("editCommand", () => {
|
|
133
|
+
it("creates an op with title field", async () => {
|
|
134
|
+
setupMocks();
|
|
135
|
+
await editCommand(TASK_RKEY_1, { title: "New Title", json: true });
|
|
136
|
+
expect(mockPutRecord).toHaveBeenCalledOnce();
|
|
137
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
138
|
+
expect(call.collection).toBe("dev.skyboard.op");
|
|
139
|
+
expect(call.record.fields.title).toBe("New Title");
|
|
140
|
+
expect(call.record.targetTaskUri).toContain(TASK_RKEY_1);
|
|
141
|
+
});
|
|
142
|
+
it("creates an op with description field", async () => {
|
|
143
|
+
setupMocks();
|
|
144
|
+
await editCommand(TASK_RKEY_1, { description: "New Desc", json: true });
|
|
145
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
146
|
+
expect(call.record.fields.description).toBe("New Desc");
|
|
147
|
+
});
|
|
148
|
+
it("resolves label names to IDs", async () => {
|
|
149
|
+
setupMocks();
|
|
150
|
+
await editCommand(TASK_RKEY_1, { label: ["bug"], json: true });
|
|
151
|
+
const call = mockPutRecord.mock.calls[0][0];
|
|
152
|
+
expect(call.record.fields.labelIds).toEqual(["lbl-bug"]);
|
|
153
|
+
});
|
|
154
|
+
it("exits when no fields provided", async () => {
|
|
155
|
+
setupMocks();
|
|
156
|
+
const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => {
|
|
157
|
+
throw new Error("process.exit");
|
|
158
|
+
}));
|
|
159
|
+
await expect(editCommand(TASK_RKEY_1, {})).rejects.toThrow("process.exit");
|
|
160
|
+
expect(mockPutRecord).not.toHaveBeenCalled();
|
|
161
|
+
exitSpy.mockRestore();
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe("rmCommand", () => {
|
|
165
|
+
it("deletes own task via deleteRecord with --force", async () => {
|
|
166
|
+
setupMocks();
|
|
167
|
+
await rmCommand(TASK_RKEY_1, { force: true, json: true });
|
|
168
|
+
expect(mockDeleteRecord).toHaveBeenCalledOnce();
|
|
169
|
+
const call = mockDeleteRecord.mock.calls[0][0];
|
|
170
|
+
expect(call.repo).toBe(OWNER_DID);
|
|
171
|
+
expect(call.collection).toBe("dev.skyboard.task");
|
|
172
|
+
expect(call.rkey).toBe(TASK_RKEY_1);
|
|
173
|
+
});
|
|
174
|
+
it("rejects deletion of task owned by another user", async () => {
|
|
175
|
+
// Task owned by USER_DID, but we're logged in as OWNER_DID
|
|
176
|
+
setupMocks({ did: USER_DID });
|
|
177
|
+
const exitSpy = vi.spyOn(process, "exit").mockImplementation((() => {
|
|
178
|
+
throw new Error("process.exit");
|
|
179
|
+
}));
|
|
180
|
+
await expect(rmCommand(TASK_RKEY_1, { force: true, json: true })).rejects.toThrow("process.exit");
|
|
181
|
+
expect(mockDeleteRecord).not.toHaveBeenCalled();
|
|
182
|
+
expect(console.error).toHaveBeenCalled();
|
|
183
|
+
exitSpy.mockRestore();
|
|
184
|
+
});
|
|
185
|
+
it("outputs JSON with deleted rkey", async () => {
|
|
186
|
+
setupMocks();
|
|
187
|
+
await rmCommand(TASK_RKEY_1, { force: true, json: true });
|
|
188
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
189
|
+
const parsed = JSON.parse(output);
|
|
190
|
+
expect(parsed.deleted).toBe(TASK_RKEY_1);
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
describe("showCommand", () => {
|
|
194
|
+
it("displays card details in JSON mode", async () => {
|
|
195
|
+
const { boardData } = setupMocks();
|
|
196
|
+
await showCommand(TASK_RKEY_1, { json: true });
|
|
197
|
+
expect(console.log).toHaveBeenCalled();
|
|
198
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
199
|
+
const parsed = JSON.parse(output);
|
|
200
|
+
expect(parsed.rkey).toBe(TASK_RKEY_1);
|
|
201
|
+
expect(parsed.title).toBe("Test Task");
|
|
202
|
+
expect(parsed.column).toBe("To Do");
|
|
203
|
+
});
|
|
204
|
+
it("includes comments in JSON output", async () => {
|
|
205
|
+
const { boardData } = setupMocks();
|
|
206
|
+
const comment = makeComment({
|
|
207
|
+
targetTaskUri: `at://${OWNER_DID}/dev.skyboard.task/${TASK_RKEY_1}`,
|
|
208
|
+
text: "Hello!",
|
|
209
|
+
});
|
|
210
|
+
boardData.comments = [comment];
|
|
211
|
+
vi.mocked(fetchBoardData).mockResolvedValue(boardData);
|
|
212
|
+
await showCommand(TASK_RKEY_1, { json: true });
|
|
213
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
214
|
+
const parsed = JSON.parse(output);
|
|
215
|
+
expect(parsed.comments).toHaveLength(1);
|
|
216
|
+
expect(parsed.comments[0].text).toBe("Hello!");
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
describe("cardsCommand", () => {
|
|
220
|
+
it("outputs JSON with columns and cards", async () => {
|
|
221
|
+
setupMocks();
|
|
222
|
+
await cardsCommand({ json: true });
|
|
223
|
+
expect(console.log).toHaveBeenCalled();
|
|
224
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
225
|
+
const parsed = JSON.parse(output);
|
|
226
|
+
expect(parsed).toBeInstanceOf(Array);
|
|
227
|
+
expect(parsed).toHaveLength(3); // 3 columns
|
|
228
|
+
expect(parsed[0].column).toBe("To Do");
|
|
229
|
+
expect(parsed[0].cards).toHaveLength(1);
|
|
230
|
+
expect(parsed[0].cards[0].title).toBe("Test Task");
|
|
231
|
+
});
|
|
232
|
+
it("includes all columns even if empty", async () => {
|
|
233
|
+
setupMocks();
|
|
234
|
+
await cardsCommand({ json: true });
|
|
235
|
+
const output = vi.mocked(console.log).mock.calls[0][0];
|
|
236
|
+
const parsed = JSON.parse(output);
|
|
237
|
+
expect(parsed[1].column).toBe("In Progress");
|
|
238
|
+
expect(parsed[1].cards).toHaveLength(0);
|
|
239
|
+
expect(parsed[2].column).toBe("Done");
|
|
240
|
+
expect(parsed[2].cards).toHaveLength(0);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
//# sourceMappingURL=commands.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.test.js","sourceRoot":"","sources":["../../src/__tests__/commands.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Board, Task, Op, Trust, Comment, Column, MaterializedTask } from "../lib/types.js";
|
|
2
|
+
export declare const OWNER_DID = "did:plc:owner111111111111";
|
|
3
|
+
export declare const TRUSTED_DID = "did:plc:trusted22222222222";
|
|
4
|
+
export declare const USER_DID = "did:plc:user3333333333333";
|
|
5
|
+
export declare const UNTRUSTED_DID = "did:plc:untrusted44444444";
|
|
6
|
+
export declare const BOARD_RKEY = "3jui7a2zbbb11";
|
|
7
|
+
export declare const TASK_RKEY_1 = "3jui7a2zbbb22";
|
|
8
|
+
export declare const TASK_RKEY_2 = "3jui7a2zbbb33";
|
|
9
|
+
export declare const TASK_RKEY_3 = "3jui7a2zbcc44";
|
|
10
|
+
export declare const OP_RKEY_1 = "3jui7a2zbdd55";
|
|
11
|
+
export declare const OP_RKEY_2 = "3jui7a2zbdd66";
|
|
12
|
+
export declare const BOARD_URI = "at://did:plc:owner111111111111/dev.skyboard.board/3jui7a2zbbb11";
|
|
13
|
+
export declare const TASK_URI_1 = "at://did:plc:owner111111111111/dev.skyboard.task/3jui7a2zbbb22";
|
|
14
|
+
export declare const TASK_URI_2 = "at://did:plc:owner111111111111/dev.skyboard.task/3jui7a2zbbb33";
|
|
15
|
+
export declare const TASK_URI_3 = "at://did:plc:user3333333333333/dev.skyboard.task/3jui7a2zbcc44";
|
|
16
|
+
export declare const PDS_ENDPOINT = "https://pds.example.com";
|
|
17
|
+
export declare const COLUMNS: Column[];
|
|
18
|
+
export declare function makeBoard(overrides?: Partial<Board>): Board;
|
|
19
|
+
export declare function makeTask(overrides?: Partial<Task>): Task;
|
|
20
|
+
export declare function makeOp(overrides?: Partial<Op>): Op;
|
|
21
|
+
export declare function makeTrust(overrides?: Partial<Trust>): Trust;
|
|
22
|
+
export declare function makeComment(overrides?: Partial<Comment>): Comment;
|
|
23
|
+
/**
|
|
24
|
+
* Wraps a task into a MaterializedTask with no ops applied.
|
|
25
|
+
*/
|
|
26
|
+
export declare function makeMaterializedTask(taskOverrides?: Partial<Task>, matOverrides?: Partial<MaterializedTask>): MaterializedTask;
|
|
27
|
+
/**
|
|
28
|
+
* Build a fake DID document response for resolvePDS.
|
|
29
|
+
*/
|
|
30
|
+
export declare function makePLCResponse(did: string, pdsEndpoint: string): {
|
|
31
|
+
id: string;
|
|
32
|
+
service: {
|
|
33
|
+
id: string;
|
|
34
|
+
type: string;
|
|
35
|
+
serviceEndpoint: string;
|
|
36
|
+
}[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Build a listRecords response.
|
|
40
|
+
*/
|
|
41
|
+
export declare function makeListRecordsResponse(records: Array<{
|
|
42
|
+
uri: string;
|
|
43
|
+
value: Record<string, unknown>;
|
|
44
|
+
}>, cursor?: string): {
|
|
45
|
+
records: {
|
|
46
|
+
uri: string;
|
|
47
|
+
value: Record<string, unknown>;
|
|
48
|
+
}[];
|
|
49
|
+
cursor: string | undefined;
|
|
50
|
+
};
|