@gopherine/obsidian-mcp 0.1.1
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/CHANGELOG.md +60 -0
- package/LICENSE +661 -0
- package/README.md +235 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +805 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/brainstorm.d.ts +9 -0
- package/dist/commands/brainstorm.js +37 -0
- package/dist/commands/brainstorm.js.map +1 -0
- package/dist/commands/brainstorm.test.d.ts +1 -0
- package/dist/commands/brainstorm.test.js +110 -0
- package/dist/commands/brainstorm.test.js.map +1 -0
- package/dist/commands/context.d.ts +18 -0
- package/dist/commands/context.js +88 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/context.test.d.ts +1 -0
- package/dist/commands/context.test.js +230 -0
- package/dist/commands/context.test.js.map +1 -0
- package/dist/commands/decide.d.ts +12 -0
- package/dist/commands/decide.js +40 -0
- package/dist/commands/decide.js.map +1 -0
- package/dist/commands/decide.test.d.ts +1 -0
- package/dist/commands/decide.test.js +109 -0
- package/dist/commands/decide.test.js.map +1 -0
- package/dist/commands/graph.d.ts +15 -0
- package/dist/commands/graph.js +89 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/graph.test.d.ts +1 -0
- package/dist/commands/graph.test.js +215 -0
- package/dist/commands/graph.test.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.js +256 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/learn.d.ts +25 -0
- package/dist/commands/learn.js +92 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/learn.test.d.ts +1 -0
- package/dist/commands/learn.test.js +241 -0
- package/dist/commands/learn.test.js.map +1 -0
- package/dist/commands/prune.d.ts +58 -0
- package/dist/commands/prune.js +246 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/read.d.ts +8 -0
- package/dist/commands/read.js +7 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/read.test.d.ts +1 -0
- package/dist/commands/read.test.js +48 -0
- package/dist/commands/read.test.js.map +1 -0
- package/dist/commands/resume.d.ts +20 -0
- package/dist/commands/resume.js +138 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/resume.test.d.ts +1 -0
- package/dist/commands/resume.test.js +243 -0
- package/dist/commands/resume.test.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.js +25 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/search.test.d.ts +1 -0
- package/dist/commands/search.test.js +61 -0
- package/dist/commands/search.test.js.map +1 -0
- package/dist/commands/session.d.ts +22 -0
- package/dist/commands/session.js +79 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/session.test.d.ts +1 -0
- package/dist/commands/session.test.js +185 -0
- package/dist/commands/session.test.js.map +1 -0
- package/dist/commands/skill/index.d.ts +30 -0
- package/dist/commands/skill/index.js +61 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/skill/index.test.d.ts +1 -0
- package/dist/commands/skill/index.test.js +137 -0
- package/dist/commands/skill/index.test.js.map +1 -0
- package/dist/commands/skill/install.d.ts +14 -0
- package/dist/commands/skill/install.js +107 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/install.test.d.ts +1 -0
- package/dist/commands/skill/install.test.js +225 -0
- package/dist/commands/skill/install.test.js.map +1 -0
- package/dist/commands/skill/list.d.ts +6 -0
- package/dist/commands/skill/list.js +5 -0
- package/dist/commands/skill/list.js.map +1 -0
- package/dist/commands/skill/list.test.d.ts +1 -0
- package/dist/commands/skill/list.test.js +101 -0
- package/dist/commands/skill/list.test.js.map +1 -0
- package/dist/commands/skill/schema.d.ts +27 -0
- package/dist/commands/skill/schema.js +55 -0
- package/dist/commands/skill/schema.js.map +1 -0
- package/dist/commands/skill/schema.test.d.ts +1 -0
- package/dist/commands/skill/schema.test.js +142 -0
- package/dist/commands/skill/schema.test.js.map +1 -0
- package/dist/commands/skill/validate.d.ts +10 -0
- package/dist/commands/skill/validate.js +39 -0
- package/dist/commands/skill/validate.js.map +1 -0
- package/dist/commands/skill/validate.test.d.ts +1 -0
- package/dist/commands/skill/validate.test.js +171 -0
- package/dist/commands/skill/validate.test.js.map +1 -0
- package/dist/commands/task.d.ts +34 -0
- package/dist/commands/task.js +160 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/task.test.d.ts +1 -0
- package/dist/commands/task.test.js +395 -0
- package/dist/commands/task.test.js.map +1 -0
- package/dist/commands/todo.d.ts +15 -0
- package/dist/commands/todo.js +99 -0
- package/dist/commands/todo.js.map +1 -0
- package/dist/commands/todo.test.d.ts +1 -0
- package/dist/commands/todo.test.js +324 -0
- package/dist/commands/todo.test.js.map +1 -0
- package/dist/commands/write.d.ts +12 -0
- package/dist/commands/write.js +40 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/commands/write.test.d.ts +1 -0
- package/dist/commands/write.test.js +79 -0
- package/dist/commands/write.test.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +48 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +1 -0
- package/dist/config.test.js +147 -0
- package/dist/config.test.js.map +1 -0
- package/dist/core/executor.d.ts +11 -0
- package/dist/core/executor.js +42 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/executor.test.d.ts +1 -0
- package/dist/core/executor.test.js +206 -0
- package/dist/core/executor.test.js.map +1 -0
- package/dist/core/middleware/error-handler.d.ts +2 -0
- package/dist/core/middleware/error-handler.js +29 -0
- package/dist/core/middleware/error-handler.js.map +1 -0
- package/dist/core/middleware/index.d.ts +2 -0
- package/dist/core/middleware/index.js +3 -0
- package/dist/core/middleware/index.js.map +1 -0
- package/dist/core/middleware/logging.d.ts +2 -0
- package/dist/core/middleware/logging.js +18 -0
- package/dist/core/middleware/logging.js.map +1 -0
- package/dist/core/registry.d.ts +12 -0
- package/dist/core/registry.js +407 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.test.d.ts +1 -0
- package/dist/core/registry.test.js +162 -0
- package/dist/core/registry.test.js.map +1 -0
- package/dist/core/types.d.ts +38 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/integration/coordination.test.d.ts +1 -0
- package/dist/integration/coordination.test.js +286 -0
- package/dist/integration/coordination.test.js.map +1 -0
- package/dist/integration/project-artifacts.test.d.ts +1 -0
- package/dist/integration/project-artifacts.test.js +275 -0
- package/dist/integration/project-artifacts.test.js.map +1 -0
- package/dist/integration/registry-graph.test.d.ts +1 -0
- package/dist/integration/registry-graph.test.js +157 -0
- package/dist/integration/registry-graph.test.js.map +1 -0
- package/dist/integration/vault-lifecycle.test.d.ts +1 -0
- package/dist/integration/vault-lifecycle.test.js +183 -0
- package/dist/integration/vault-lifecycle.test.js.map +1 -0
- package/dist/lib/auto-number.d.ts +10 -0
- package/dist/lib/auto-number.js +33 -0
- package/dist/lib/auto-number.js.map +1 -0
- package/dist/lib/auto-number.test.d.ts +1 -0
- package/dist/lib/auto-number.test.js +88 -0
- package/dist/lib/auto-number.test.js.map +1 -0
- package/dist/lib/escape-regex.d.ts +4 -0
- package/dist/lib/escape-regex.js +7 -0
- package/dist/lib/escape-regex.js.map +1 -0
- package/dist/lib/escape-regex.test.d.ts +1 -0
- package/dist/lib/escape-regex.test.js +27 -0
- package/dist/lib/escape-regex.test.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +34 -0
- package/dist/lib/frontmatter.js +74 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/frontmatter.test.d.ts +1 -0
- package/dist/lib/frontmatter.test.js +192 -0
- package/dist/lib/frontmatter.test.js.map +1 -0
- package/dist/lib/project-detector.d.ts +12 -0
- package/dist/lib/project-detector.js +123 -0
- package/dist/lib/project-detector.js.map +1 -0
- package/dist/lib/project-detector.test.d.ts +1 -0
- package/dist/lib/project-detector.test.js +117 -0
- package/dist/lib/project-detector.test.js.map +1 -0
- package/dist/lib/safe-external-path.d.ts +10 -0
- package/dist/lib/safe-external-path.js +46 -0
- package/dist/lib/safe-external-path.js.map +1 -0
- package/dist/lib/safe-external-path.test.d.ts +1 -0
- package/dist/lib/safe-external-path.test.js +99 -0
- package/dist/lib/safe-external-path.test.js.map +1 -0
- package/dist/lib/search-engine.d.ts +19 -0
- package/dist/lib/search-engine.js +157 -0
- package/dist/lib/search-engine.js.map +1 -0
- package/dist/lib/search-engine.test.d.ts +1 -0
- package/dist/lib/search-engine.test.js +120 -0
- package/dist/lib/search-engine.test.js.map +1 -0
- package/dist/lib/session-registry.d.ts +59 -0
- package/dist/lib/session-registry.js +230 -0
- package/dist/lib/session-registry.js.map +1 -0
- package/dist/lib/session-registry.test.d.ts +1 -0
- package/dist/lib/session-registry.test.js +199 -0
- package/dist/lib/session-registry.test.js.map +1 -0
- package/dist/lib/skill-registry.d.ts +13 -0
- package/dist/lib/skill-registry.js +76 -0
- package/dist/lib/skill-registry.js.map +1 -0
- package/dist/lib/token-estimator.d.ts +19 -0
- package/dist/lib/token-estimator.js +58 -0
- package/dist/lib/token-estimator.js.map +1 -0
- package/dist/lib/token-estimator.test.d.ts +1 -0
- package/dist/lib/token-estimator.test.js +65 -0
- package/dist/lib/token-estimator.test.js.map +1 -0
- package/dist/lib/vault-fs.d.ts +39 -0
- package/dist/lib/vault-fs.js +183 -0
- package/dist/lib/vault-fs.js.map +1 -0
- package/dist/lib/vault-fs.test.d.ts +1 -0
- package/dist/lib/vault-fs.test.js +210 -0
- package/dist/lib/vault-fs.test.js.map +1 -0
- package/dist/mcp-server.d.ts +2 -0
- package/dist/mcp-server.js +385 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/test-helpers.d.ts +20 -0
- package/dist/test-helpers.js +46 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/test-helpers.test.d.ts +1 -0
- package/dist/test-helpers.test.js +90 -0
- package/dist/test-helpers.test.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdir } from "fs/promises";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { createTestContext } from "../test-helpers.js";
|
|
5
|
+
import { sessionCommand } from "../commands/session.js";
|
|
6
|
+
import { resumeCommand } from "../commands/resume.js";
|
|
7
|
+
import { pruneCommand, statsCommand, deprecateCommand } from "../commands/prune.js";
|
|
8
|
+
import { taskCommand } from "../commands/task.js";
|
|
9
|
+
import { learnCommand } from "../commands/learn.js";
|
|
10
|
+
import { decideCommand } from "../commands/decide.js";
|
|
11
|
+
import { readCommand } from "../commands/read.js";
|
|
12
|
+
import { serializeFrontmatter, createFrontmatter } from "../lib/frontmatter.js";
|
|
13
|
+
describe("integration > coordination", () => {
|
|
14
|
+
let ctx;
|
|
15
|
+
let vaultRoot;
|
|
16
|
+
let cleanup;
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
const tc = await createTestContext({ project: "my-project" });
|
|
19
|
+
ctx = tc.ctx;
|
|
20
|
+
vaultRoot = tc.vaultRoot;
|
|
21
|
+
cleanup = tc.cleanup;
|
|
22
|
+
await mkdir(join(vaultRoot, "projects/my-project/tasks"), { recursive: true });
|
|
23
|
+
await mkdir(join(vaultRoot, "projects/my-project/sessions"), { recursive: true });
|
|
24
|
+
await mkdir(join(vaultRoot, "projects/my-project/decisions"), { recursive: true });
|
|
25
|
+
await mkdir(join(vaultRoot, "projects/my-project/learnings"), { recursive: true });
|
|
26
|
+
});
|
|
27
|
+
afterEach(async () => {
|
|
28
|
+
await cleanup();
|
|
29
|
+
});
|
|
30
|
+
describe("session lifecycle", () => {
|
|
31
|
+
it("register session then list_active returns it", async () => {
|
|
32
|
+
const reg = await sessionCommand({ action: "register", tool: "claude-code", project: "my-project", taskSummary: "Build API" }, ctx);
|
|
33
|
+
expect(reg.session_id).toBeDefined();
|
|
34
|
+
expect(reg.conflicts).toHaveLength(0);
|
|
35
|
+
const list = await sessionCommand({ action: "list_active" }, ctx);
|
|
36
|
+
expect(list.active_sessions).toHaveLength(1);
|
|
37
|
+
expect(list.active_sessions[0].tool).toBe("claude-code");
|
|
38
|
+
expect(list.active_sessions[0].project).toBe("my-project");
|
|
39
|
+
expect(list.active_sessions[0].task_summary).toBe("Build API");
|
|
40
|
+
});
|
|
41
|
+
it("register two sessions then list_active returns both", async () => {
|
|
42
|
+
await sessionCommand({ action: "register", tool: "claude-code", project: "my-project", taskSummary: "Task A" }, ctx);
|
|
43
|
+
await sessionCommand({ action: "register", tool: "opencode", project: "my-project", taskSummary: "Task B" }, ctx);
|
|
44
|
+
const list = await sessionCommand({ action: "list_active" }, ctx);
|
|
45
|
+
expect(list.active_sessions).toHaveLength(2);
|
|
46
|
+
const tools = list.active_sessions.map((s) => s.tool);
|
|
47
|
+
expect(tools).toContain("claude-code");
|
|
48
|
+
expect(tools).toContain("opencode");
|
|
49
|
+
});
|
|
50
|
+
it("heartbeat updates session then list shows updated timestamp", async () => {
|
|
51
|
+
const reg = await sessionCommand({ action: "register", tool: "claude-code", project: "my-project" }, ctx);
|
|
52
|
+
const sessionId = reg.session_id;
|
|
53
|
+
const listBefore = await sessionCommand({ action: "list_active" }, ctx);
|
|
54
|
+
const beforeTs = listBefore.active_sessions[0].last_heartbeat;
|
|
55
|
+
await sessionCommand({ action: "heartbeat", sessionId }, ctx);
|
|
56
|
+
const listAfter = await sessionCommand({ action: "list_active" }, ctx);
|
|
57
|
+
const afterTs = listAfter.active_sessions[0].last_heartbeat;
|
|
58
|
+
expect(new Date(afterTs).getTime()).toBeGreaterThanOrEqual(new Date(beforeTs).getTime());
|
|
59
|
+
});
|
|
60
|
+
it("complete session then list_active no longer includes it", async () => {
|
|
61
|
+
const reg = await sessionCommand({ action: "register", tool: "claude-code", project: "my-project" }, ctx);
|
|
62
|
+
const sessionId = reg.session_id;
|
|
63
|
+
await sessionCommand({ action: "complete", sessionId, project: "my-project", tool: "claude-code", outcome: "Done" }, ctx);
|
|
64
|
+
const list = await sessionCommand({ action: "list_active" }, ctx);
|
|
65
|
+
expect(list.active_sessions).toHaveLength(0);
|
|
66
|
+
});
|
|
67
|
+
it("register session with files_touched then complete persists session note", async () => {
|
|
68
|
+
const reg = await sessionCommand({
|
|
69
|
+
action: "register",
|
|
70
|
+
tool: "claude-code",
|
|
71
|
+
project: "my-project",
|
|
72
|
+
taskSummary: "Refactor auth",
|
|
73
|
+
filesTouched: ["src/auth.ts", "src/middleware.ts"],
|
|
74
|
+
}, ctx);
|
|
75
|
+
const sessionId = reg.session_id;
|
|
76
|
+
const complete = await sessionCommand({
|
|
77
|
+
action: "complete",
|
|
78
|
+
sessionId,
|
|
79
|
+
project: "my-project",
|
|
80
|
+
tool: "claude-code",
|
|
81
|
+
outcome: "Refactored auth module",
|
|
82
|
+
filesTouched: ["src/auth.ts", "src/middleware.ts"],
|
|
83
|
+
tasksCompleted: ["task-001"],
|
|
84
|
+
}, ctx);
|
|
85
|
+
expect(complete.session_note_path).toBeDefined();
|
|
86
|
+
const content = await readCommand({ path: complete.session_note_path }, ctx);
|
|
87
|
+
expect(content).toContain("claude-code");
|
|
88
|
+
expect(content).toContain("Refactored auth module");
|
|
89
|
+
expect(content).toContain("src/auth.ts");
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
describe("resume", () => {
|
|
93
|
+
it("resume with no sessions returns empty last_sessions and suggested_next_steps", async () => {
|
|
94
|
+
const result = await resumeCommand({ project: "my-project" }, ctx);
|
|
95
|
+
expect(result.project).toBe("my-project");
|
|
96
|
+
expect(result.last_sessions).toHaveLength(0);
|
|
97
|
+
expect(result.active_sessions).toHaveLength(0);
|
|
98
|
+
expect(result.interrupted_sessions).toHaveLength(0);
|
|
99
|
+
expect(result.suggested_next_steps).toHaveLength(0);
|
|
100
|
+
});
|
|
101
|
+
it("create tasks and sessions then resume returns interrupted/in-progress context", async () => {
|
|
102
|
+
await taskCommand({ action: "add", title: "Active task", project: "my-project" }, ctx);
|
|
103
|
+
await taskCommand({ action: "update", taskId: "task-001", status: "in-progress", project: "my-project" }, ctx);
|
|
104
|
+
const reg = await sessionCommand({
|
|
105
|
+
action: "register",
|
|
106
|
+
tool: "claude-code",
|
|
107
|
+
project: "my-project",
|
|
108
|
+
taskSummary: "Working on auth",
|
|
109
|
+
}, ctx);
|
|
110
|
+
await sessionCommand({
|
|
111
|
+
action: "complete",
|
|
112
|
+
sessionId: reg.session_id,
|
|
113
|
+
project: "my-project",
|
|
114
|
+
tool: "claude-code",
|
|
115
|
+
outcome: "Implemented auth flow",
|
|
116
|
+
}, ctx);
|
|
117
|
+
const result = await resumeCommand({ project: "my-project" }, ctx);
|
|
118
|
+
expect(result.last_sessions.length).toBeGreaterThanOrEqual(1);
|
|
119
|
+
expect(result.last_sessions[0].tool).toBe("claude-code");
|
|
120
|
+
expect(result.last_sessions[0].outcome).toBe("Implemented auth flow");
|
|
121
|
+
expect(result.suggested_next_steps.length).toBeGreaterThanOrEqual(1);
|
|
122
|
+
expect(result.suggested_next_steps.some((s) => s.includes("In-progress task"))).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it("resume respects limit parameter", async () => {
|
|
125
|
+
for (let i = 0; i < 5; i++) {
|
|
126
|
+
const reg = await sessionCommand({
|
|
127
|
+
action: "register",
|
|
128
|
+
tool: `tool-${i}`,
|
|
129
|
+
project: "my-project",
|
|
130
|
+
taskSummary: `Session ${i}`,
|
|
131
|
+
}, ctx);
|
|
132
|
+
await sessionCommand({
|
|
133
|
+
action: "complete",
|
|
134
|
+
sessionId: reg.session_id,
|
|
135
|
+
project: "my-project",
|
|
136
|
+
tool: `tool-${i}`,
|
|
137
|
+
outcome: `Completed session ${i}`,
|
|
138
|
+
}, ctx);
|
|
139
|
+
}
|
|
140
|
+
const result = await resumeCommand({ project: "my-project", limit: 2 }, ctx);
|
|
141
|
+
expect(result.last_sessions.length).toBeLessThanOrEqual(2);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe("prune", () => {
|
|
145
|
+
it("prune dry-run mode reports candidates but does not delete", async () => {
|
|
146
|
+
const oldDate = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
|
147
|
+
const sessionContent = serializeFrontmatter(createFrontmatter({
|
|
148
|
+
type: "session",
|
|
149
|
+
status: "completed",
|
|
150
|
+
completed_at: oldDate,
|
|
151
|
+
created: oldDate,
|
|
152
|
+
}), "\n# Old session\n");
|
|
153
|
+
await ctx.vaultFs.write("projects/my-project/sessions/2025-01-01-claude-aabbccdd.md", sessionContent);
|
|
154
|
+
const result = await pruneCommand({ mode: "dry-run", project: "my-project", policy: { sessions: 30 } }, ctx);
|
|
155
|
+
expect(result).toHaveLength(1);
|
|
156
|
+
expect(result[0].stats.sessions_scanned).toBe(1);
|
|
157
|
+
expect(result[0].stats.total_archived).toBe(1);
|
|
158
|
+
expect(result[0].stats.total_deleted).toBe(0);
|
|
159
|
+
const files = await ctx.vaultFs.list("projects/my-project/sessions", 1);
|
|
160
|
+
expect(files.filter((f) => f.endsWith(".md"))).toHaveLength(1);
|
|
161
|
+
});
|
|
162
|
+
it("prune archive mode moves old sessions to _archive", async () => {
|
|
163
|
+
const oldDate = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
|
164
|
+
const sessionContent = serializeFrontmatter(createFrontmatter({
|
|
165
|
+
type: "session",
|
|
166
|
+
status: "completed",
|
|
167
|
+
completed_at: oldDate,
|
|
168
|
+
created: oldDate,
|
|
169
|
+
}), "\n# Old session\n");
|
|
170
|
+
await ctx.vaultFs.write("projects/my-project/sessions/2025-01-01-claude-aabbccdd.md", sessionContent);
|
|
171
|
+
const result = await pruneCommand({ mode: "archive", project: "my-project", policy: { sessions: 30 } }, ctx);
|
|
172
|
+
expect(result).toHaveLength(1);
|
|
173
|
+
expect(result[0].archived).toHaveLength(1);
|
|
174
|
+
expect(result[0].archived[0].to).toContain("_archive");
|
|
175
|
+
const activeFiles = await ctx.vaultFs.list("projects/my-project/sessions", 1);
|
|
176
|
+
expect(activeFiles.filter((f) => f.endsWith(".md"))).toHaveLength(0);
|
|
177
|
+
});
|
|
178
|
+
it("prune with no stale items returns empty results", async () => {
|
|
179
|
+
const recentDate = new Date().toISOString();
|
|
180
|
+
const sessionContent = serializeFrontmatter(createFrontmatter({
|
|
181
|
+
type: "session",
|
|
182
|
+
status: "completed",
|
|
183
|
+
completed_at: recentDate,
|
|
184
|
+
created: recentDate,
|
|
185
|
+
}), "\n# Recent session\n");
|
|
186
|
+
await ctx.vaultFs.write("projects/my-project/sessions/2026-03-19-claude-aabbccdd.md", sessionContent);
|
|
187
|
+
const result = await pruneCommand({ mode: "dry-run", project: "my-project", policy: { sessions: 30 } }, ctx);
|
|
188
|
+
expect(result).toHaveLength(1);
|
|
189
|
+
expect(result[0].stats.sessions_scanned).toBe(1);
|
|
190
|
+
expect(result[0].stats.total_archived).toBe(0);
|
|
191
|
+
expect(result[0].stats.total_deleted).toBe(0);
|
|
192
|
+
});
|
|
193
|
+
it("prune delete mode removes old tasks", async () => {
|
|
194
|
+
const oldDate = new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString().slice(0, 10);
|
|
195
|
+
const taskContent = serializeFrontmatter(createFrontmatter({
|
|
196
|
+
type: "task",
|
|
197
|
+
id: "task-old-001",
|
|
198
|
+
status: "done",
|
|
199
|
+
created: oldDate,
|
|
200
|
+
updated: oldDate,
|
|
201
|
+
}), "\n# Old task\n");
|
|
202
|
+
await ctx.vaultFs.write("projects/my-project/tasks/task-old-001.md", taskContent);
|
|
203
|
+
const result = await pruneCommand({ mode: "delete", project: "my-project", policy: { doneTasks: 30 } }, ctx);
|
|
204
|
+
expect(result).toHaveLength(1);
|
|
205
|
+
expect(result[0].deleted).toHaveLength(1);
|
|
206
|
+
expect(result[0].deleted[0]).toContain("task-old-001");
|
|
207
|
+
const files = await ctx.vaultFs.list("projects/my-project/tasks", 1);
|
|
208
|
+
expect(files.filter((f) => f.endsWith(".md"))).toHaveLength(0);
|
|
209
|
+
});
|
|
210
|
+
});
|
|
211
|
+
describe("stats", () => {
|
|
212
|
+
it("stats returns task breakdown", async () => {
|
|
213
|
+
await taskCommand({ action: "add", title: "Backlog task", project: "my-project" }, ctx);
|
|
214
|
+
await taskCommand({ action: "add", title: "Active task", project: "my-project" }, ctx);
|
|
215
|
+
await taskCommand({ action: "add", title: "Done task", project: "my-project" }, ctx);
|
|
216
|
+
await taskCommand({ action: "update", taskId: "task-002", status: "in-progress", project: "my-project" }, ctx);
|
|
217
|
+
await taskCommand({ action: "update", taskId: "task-003", status: "done", project: "my-project" }, ctx);
|
|
218
|
+
const stats = await statsCommand({ project: "my-project" }, ctx);
|
|
219
|
+
expect(stats.project).toBe("my-project");
|
|
220
|
+
expect(stats.tasks.total).toBe(3);
|
|
221
|
+
expect(stats.tasks.backlog).toBe(1);
|
|
222
|
+
expect(stats.tasks.inProgress).toBe(1);
|
|
223
|
+
expect(stats.tasks.done).toBe(1);
|
|
224
|
+
});
|
|
225
|
+
it("stats after creating tasks reflects new count", async () => {
|
|
226
|
+
const before = await statsCommand({ project: "my-project" }, ctx);
|
|
227
|
+
expect(before.tasks.total).toBe(0);
|
|
228
|
+
await taskCommand({ action: "add", title: "New task", project: "my-project" }, ctx);
|
|
229
|
+
const after = await statsCommand({ project: "my-project" }, ctx);
|
|
230
|
+
expect(after.tasks.total).toBe(1);
|
|
231
|
+
expect(after.tasks.backlog).toBe(1);
|
|
232
|
+
});
|
|
233
|
+
it("stats includes learning and ADR counts", async () => {
|
|
234
|
+
await learnCommand({
|
|
235
|
+
action: "add",
|
|
236
|
+
title: "Test learning",
|
|
237
|
+
discovery: "Something useful",
|
|
238
|
+
project: "my-project",
|
|
239
|
+
}, ctx);
|
|
240
|
+
await decideCommand({
|
|
241
|
+
title: "Use React",
|
|
242
|
+
context: "Need UI framework",
|
|
243
|
+
decision: "React chosen",
|
|
244
|
+
project: "my-project",
|
|
245
|
+
}, ctx);
|
|
246
|
+
const stats = await statsCommand({ project: "my-project" }, ctx);
|
|
247
|
+
expect(stats.learnings).toBe(1);
|
|
248
|
+
expect(stats.adrs).toBe(1);
|
|
249
|
+
expect(stats.totalFiles).toBeGreaterThanOrEqual(2);
|
|
250
|
+
});
|
|
251
|
+
});
|
|
252
|
+
describe("deprecate", () => {
|
|
253
|
+
it("deprecate marks vault item with deprecated status", async () => {
|
|
254
|
+
await decideCommand({
|
|
255
|
+
title: "Old decision",
|
|
256
|
+
context: "Initial context",
|
|
257
|
+
decision: "Initial decision",
|
|
258
|
+
project: "my-project",
|
|
259
|
+
}, ctx);
|
|
260
|
+
const adrList = await ctx.vaultFs.list("projects/my-project/decisions", 1);
|
|
261
|
+
const adrPath = adrList.find((f) => f.endsWith(".md"));
|
|
262
|
+
const result = await deprecateCommand({ path: adrPath }, ctx);
|
|
263
|
+
expect(result.path).toBe(adrPath);
|
|
264
|
+
expect(result.status).toBe("deprecated");
|
|
265
|
+
const content = await readCommand({ path: adrPath }, ctx);
|
|
266
|
+
expect(content).toContain("status: deprecated");
|
|
267
|
+
});
|
|
268
|
+
it("deprecate with reason appends deprecation notice", async () => {
|
|
269
|
+
await learnCommand({
|
|
270
|
+
action: "add",
|
|
271
|
+
title: "Outdated learning",
|
|
272
|
+
discovery: "No longer relevant",
|
|
273
|
+
project: "my-project",
|
|
274
|
+
}, ctx);
|
|
275
|
+
const learnList = await ctx.vaultFs.list("projects/my-project/learnings", 1);
|
|
276
|
+
const learnPath = learnList.find((f) => f.endsWith(".md"));
|
|
277
|
+
const reason = "Replaced by new approach";
|
|
278
|
+
await deprecateCommand({ path: learnPath, reason }, ctx);
|
|
279
|
+
const content = await readCommand({ path: learnPath }, ctx);
|
|
280
|
+
expect(content).toContain("status: deprecated");
|
|
281
|
+
expect(content).toContain("Deprecated");
|
|
282
|
+
expect(content).toContain(reason);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
//# sourceMappingURL=coordination.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordination.test.js","sourceRoot":"","sources":["../../src/integration/coordination.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAEhF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,IAAI,GAAyD,CAAC;IAC9D,IAAI,SAAiB,CAAC;IACtB,IAAI,OAA4B,CAAC;IAEjC,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,EAAE,GAAG,MAAM,iBAAiB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9D,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC;QACb,SAAS,GAAG,EAAE,CAAC,SAAS,CAAC;QACzB,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC;QACrB,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,2BAA2B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,8BAA8B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnF,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,+BAA+B,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;YAEpI,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEtC,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YAElE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;YACrH,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;YAElH,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YAElE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,eAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;YAC3E,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1G,MAAM,SAAS,GAAG,GAAG,CAAC,UAAW,CAAC;YAElC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YACxE,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YAE/D,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YAE9D,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG,SAAS,CAAC,eAAgB,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YAE7D,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,sBAAsB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1G,MAAM,SAAS,GAAG,GAAG,CAAC,UAAW,CAAC;YAElC,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YAE1H,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,GAAG,CAAC,CAAC;YAElE,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;YACvF,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;gBAC/B,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,YAAY;gBACrB,WAAW,EAAE,eAAe;gBAC5B,YAAY,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC;aACnD,EAAE,GAAG,CAAC,CAAC;YACR,MAAM,SAAS,GAAG,GAAG,CAAC,UAAW,CAAC;YAElC,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC;gBACpC,MAAM,EAAE,UAAU;gBAClB,SAAS;gBACT,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,wBAAwB;gBACjC,YAAY,EAAE,CAAC,aAAa,EAAE,mBAAmB,CAAC;gBAClD,cAAc,EAAE,CAAC,UAAU,CAAC;aAC7B,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;YAEjD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,iBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;YAE9E,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;YACpD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,8EAA8E,EAAE,KAAK,IAAI,EAAE;YAC5F,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACpD,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;YAC7F,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YACvF,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAE/G,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;gBAC/B,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,YAAY;gBACrB,WAAW,EAAE,iBAAiB;aAC/B,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,cAAc,CAAC;gBACnB,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,GAAG,CAAC,UAAW;gBAC1B,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,uBAAuB;aACjC,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAEnE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;YACtE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7F,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3B,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC;oBAC/B,MAAM,EAAE,UAAU;oBAClB,IAAI,EAAE,QAAQ,CAAC,EAAE;oBACjB,OAAO,EAAE,YAAY;oBACrB,WAAW,EAAE,WAAW,CAAC,EAAE;iBAC5B,EAAE,GAAG,CAAC,CAAC;gBAER,MAAM,cAAc,CAAC;oBACnB,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,GAAG,CAAC,UAAW;oBAC1B,OAAO,EAAE,YAAY;oBACrB,IAAI,EAAE,QAAQ,CAAC,EAAE;oBACjB,OAAO,EAAE,qBAAqB,CAAC,EAAE;iBAClC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;YAE7E,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC;QAC7D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,MAAM,cAAc,GAAG,oBAAoB,CACzC,iBAAiB,CAAC;gBAChB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,WAAW;gBACnB,YAAY,EAAE,OAAO;gBACrB,OAAO,EAAE,OAAO;aACjB,CAAC,EACF,mBAAmB,CACpB,CAAC;YACF,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,cAAc,CAAC,CAAC;YAEtG,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAE7G,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAE9C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;YACxE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,MAAM,cAAc,GAAG,oBAAoB,CACzC,iBAAiB,CAAC;gBAChB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,WAAW;gBACnB,YAAY,EAAE,OAAO;gBACrB,OAAO,EAAE,OAAO;aACjB,CAAC,EACF,mBAAmB,CACpB,CAAC;YACF,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,cAAc,CAAC,CAAC;YAEtG,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAE7G,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;YAEvD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAC;YAC9E,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,cAAc,GAAG,oBAAoB,CACzC,iBAAiB,CAAC;gBAChB,IAAI,EAAE,SAAS;gBACf,MAAM,EAAE,WAAW;gBACnB,YAAY,EAAE,UAAU;gBACxB,OAAO,EAAE,UAAU;aACpB,CAAC,EACF,sBAAsB,CACvB,CAAC;YACF,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,4DAA4D,EAAE,cAAc,CAAC,CAAC;YAEtG,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAE7G,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3F,MAAM,WAAW,GAAG,oBAAoB,CACtC,iBAAiB,CAAC;gBAChB,IAAI,EAAE,MAAM;gBACZ,EAAE,EAAE,cAAc;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,OAAO;aACjB,CAAC,EACF,gBAAgB,CACjB,CAAC;YACF,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,2CAA2C,EAAE,WAAW,CAAC,CAAC;YAElF,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;YAE7G,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;YAEvD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAC;YACrE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE;QACrB,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YACxF,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YACvF,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YACrF,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAC/G,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAExG,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAEjE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAElE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAEnC,MAAM,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAEpF,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAEjE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,YAAY,CAAC;gBACjB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,eAAe;gBACtB,SAAS,EAAE,kBAAkB;gBAC7B,OAAO,EAAE,YAAY;aACtB,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,aAAa,CAAC;gBAClB,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,mBAAmB;gBAC5B,QAAQ,EAAE,cAAc;gBACxB,OAAO,EAAE,YAAY;aACtB,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;YAEjE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3B,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,aAAa,CAAC;gBAClB,KAAK,EAAE,cAAc;gBACrB,OAAO,EAAE,iBAAiB;gBAC1B,QAAQ,EAAE,kBAAkB;gBAC5B,OAAO,EAAE,YAAY;aACtB,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAE,CAAC;YAExD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YAE9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEzC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,YAAY,CAAC;gBACjB,MAAM,EAAE,KAAK;gBACb,KAAK,EAAE,mBAAmB;gBAC1B,SAAS,EAAE,oBAAoB;gBAC/B,OAAO,EAAE,YAAY;aACtB,EAAE,GAAG,CAAC,CAAC;YAER,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAAC;YAC7E,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAE,CAAC;YAE5D,MAAM,MAAM,GAAG,0BAA0B,CAAC;YAC1C,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;YAEzD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC;YAE5D,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;YAChD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import { mkdir } from "fs/promises";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { createTestContext } from "../test-helpers.js";
|
|
5
|
+
import { taskCommand } from "../commands/task.js";
|
|
6
|
+
import { learnCommand } from "../commands/learn.js";
|
|
7
|
+
import { decideCommand } from "../commands/decide.js";
|
|
8
|
+
import { brainstormCommand } from "../commands/brainstorm.js";
|
|
9
|
+
import { todoCommand } from "../commands/todo.js";
|
|
10
|
+
import { pruneCommand } from "../commands/prune.js";
|
|
11
|
+
import { contextCommand } from "../commands/context.js";
|
|
12
|
+
import { searchCommand } from "../commands/search.js";
|
|
13
|
+
import { readCommand } from "../commands/read.js";
|
|
14
|
+
describe("integration > project artifacts", () => {
|
|
15
|
+
let ctx;
|
|
16
|
+
let vaultRoot;
|
|
17
|
+
let cleanup;
|
|
18
|
+
beforeEach(async () => {
|
|
19
|
+
const tc = await createTestContext({ project: "my-project" });
|
|
20
|
+
ctx = tc.ctx;
|
|
21
|
+
vaultRoot = tc.vaultRoot;
|
|
22
|
+
cleanup = tc.cleanup;
|
|
23
|
+
await mkdir(join(vaultRoot, "projects/my-project/decisions"), { recursive: true });
|
|
24
|
+
await mkdir(join(vaultRoot, "projects/my-project/tasks"), { recursive: true });
|
|
25
|
+
await mkdir(join(vaultRoot, "projects/my-project/learnings"), { recursive: true });
|
|
26
|
+
await mkdir(join(vaultRoot, "projects/my-project/brainstorms"), { recursive: true });
|
|
27
|
+
});
|
|
28
|
+
afterEach(async () => {
|
|
29
|
+
await cleanup();
|
|
30
|
+
});
|
|
31
|
+
describe("task + learn cross-commands", () => {
|
|
32
|
+
it("create task then list tasks returns it", async () => {
|
|
33
|
+
const added = await taskCommand({ action: "add", title: "Build auth system", project: "my-project" }, ctx);
|
|
34
|
+
expect(added.task_id).toBe("task-001");
|
|
35
|
+
expect(added.path).toBeDefined();
|
|
36
|
+
const listed = await taskCommand({ action: "list", project: "my-project" }, ctx);
|
|
37
|
+
expect(listed.tasks).toHaveLength(1);
|
|
38
|
+
expect(listed.tasks[0].title).toBe("Build auth system");
|
|
39
|
+
expect(listed.tasks[0].status).toBe("backlog");
|
|
40
|
+
});
|
|
41
|
+
it("create multiple tasks then board groups by status", async () => {
|
|
42
|
+
await taskCommand({ action: "add", title: "Task A", project: "my-project" }, ctx);
|
|
43
|
+
await taskCommand({ action: "add", title: "Task B", project: "my-project" }, ctx);
|
|
44
|
+
await taskCommand({ action: "update", taskId: "task-001", status: "in-progress", project: "my-project" }, ctx);
|
|
45
|
+
const result = await taskCommand({ action: "board", project: "my-project" }, ctx);
|
|
46
|
+
expect(result.board["backlog"]).toHaveLength(1);
|
|
47
|
+
expect(result.board["backlog"][0].id).toBe("task-002");
|
|
48
|
+
expect(result.board["in-progress"]).toHaveLength(1);
|
|
49
|
+
expect(result.board["in-progress"][0].id).toBe("task-001");
|
|
50
|
+
});
|
|
51
|
+
it("update task status from backlog to in-progress", async () => {
|
|
52
|
+
await taskCommand({ action: "add", title: "Migrate DB", project: "my-project" }, ctx);
|
|
53
|
+
const updated = await taskCommand({ action: "update", taskId: "task-001", status: "in-progress", project: "my-project" }, ctx);
|
|
54
|
+
expect(updated.updated_fields).toContain("status");
|
|
55
|
+
const listed = await taskCommand({ action: "list", status: "in-progress", project: "my-project" }, ctx);
|
|
56
|
+
expect(listed.tasks).toHaveLength(1);
|
|
57
|
+
expect(listed.tasks[0].id).toBe("task-001");
|
|
58
|
+
});
|
|
59
|
+
it("create learning then list learnings returns it", async () => {
|
|
60
|
+
const added = await learnCommand({
|
|
61
|
+
action: "add",
|
|
62
|
+
title: "Paging is fast",
|
|
63
|
+
discovery: "Cursor-based pagination outperforms offset for large datasets",
|
|
64
|
+
project: "my-project",
|
|
65
|
+
}, ctx);
|
|
66
|
+
expect(added.learning_id).toBeDefined();
|
|
67
|
+
expect(added.path).toBeDefined();
|
|
68
|
+
const listed = await learnCommand({ action: "list", project: "my-project" }, ctx);
|
|
69
|
+
expect(listed.learnings).toHaveLength(1);
|
|
70
|
+
expect(listed.learnings[0].title).toBe("Paging is fast");
|
|
71
|
+
});
|
|
72
|
+
it("create multiple learnings then filter by tag", async () => {
|
|
73
|
+
await learnCommand({
|
|
74
|
+
action: "add",
|
|
75
|
+
title: "Redis caching",
|
|
76
|
+
discovery: "Redis reduces DB load by 60%",
|
|
77
|
+
tags: ["performance"],
|
|
78
|
+
project: "my-project",
|
|
79
|
+
}, ctx);
|
|
80
|
+
await learnCommand({
|
|
81
|
+
action: "add",
|
|
82
|
+
title: "Type safety",
|
|
83
|
+
discovery: "Strict mode catches bugs at compile time",
|
|
84
|
+
tags: ["typescript"],
|
|
85
|
+
project: "my-project",
|
|
86
|
+
}, ctx);
|
|
87
|
+
await learnCommand({
|
|
88
|
+
action: "add",
|
|
89
|
+
title: "Connection pooling",
|
|
90
|
+
discovery: "PG pool with 10 connections handles 1000 RPS",
|
|
91
|
+
tags: ["performance"],
|
|
92
|
+
project: "my-project",
|
|
93
|
+
}, ctx);
|
|
94
|
+
const perfLearnings = await learnCommand({ action: "list", tag: "performance", project: "my-project" }, ctx);
|
|
95
|
+
expect(perfLearnings.learnings).toHaveLength(2);
|
|
96
|
+
for (const l of perfLearnings.learnings) {
|
|
97
|
+
expect(l.tags).toContain("performance");
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
it("create task with blockedBy then update resolves blockers", async () => {
|
|
101
|
+
await taskCommand({
|
|
102
|
+
action: "add",
|
|
103
|
+
title: "Set up CI",
|
|
104
|
+
blockedBy: ["task-999"],
|
|
105
|
+
project: "my-project",
|
|
106
|
+
}, ctx);
|
|
107
|
+
const listed = await taskCommand({ action: "list", project: "my-project" }, ctx);
|
|
108
|
+
expect(listed.tasks[0].blocked_by).toEqual(["task-999"]);
|
|
109
|
+
const updated = await taskCommand({
|
|
110
|
+
action: "update",
|
|
111
|
+
taskId: "task-001",
|
|
112
|
+
blockedBy: [],
|
|
113
|
+
project: "my-project",
|
|
114
|
+
}, ctx);
|
|
115
|
+
expect(updated.updated_fields).toContain("blocked_by");
|
|
116
|
+
const after = await taskCommand({ action: "list", project: "my-project" }, ctx);
|
|
117
|
+
expect(after.tasks[0].blocked_by).toEqual([]);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe("decide + brainstorm", () => {
|
|
121
|
+
it("create ADR with all fields then read it back via readCommand", async () => {
|
|
122
|
+
const result = await decideCommand({
|
|
123
|
+
title: "Use PostgreSQL",
|
|
124
|
+
context: "Need relational DB for ACID compliance",
|
|
125
|
+
decision: "PostgreSQL chosen for JSON support and extensions",
|
|
126
|
+
alternatives: "MySQL, SQLite, MongoDB",
|
|
127
|
+
consequences: "Requires DB hosting, migrations needed",
|
|
128
|
+
project: "my-project",
|
|
129
|
+
}, ctx);
|
|
130
|
+
expect(result.decision_number).toBe(1);
|
|
131
|
+
const content = await readCommand({ path: result.path }, ctx);
|
|
132
|
+
expect(content).toContain("Use PostgreSQL");
|
|
133
|
+
expect(content).toContain("Need relational DB");
|
|
134
|
+
expect(content).toContain("PostgreSQL chosen");
|
|
135
|
+
expect(content).toContain("MySQL, SQLite");
|
|
136
|
+
expect(content).toContain("Requires DB hosting");
|
|
137
|
+
});
|
|
138
|
+
it("create ADR then second ADR has incremented number", async () => {
|
|
139
|
+
const first = await decideCommand({
|
|
140
|
+
title: "First decision",
|
|
141
|
+
context: "C1",
|
|
142
|
+
decision: "D1",
|
|
143
|
+
project: "my-project",
|
|
144
|
+
}, ctx);
|
|
145
|
+
const second = await decideCommand({
|
|
146
|
+
title: "Second decision",
|
|
147
|
+
context: "C2",
|
|
148
|
+
decision: "D2",
|
|
149
|
+
project: "my-project",
|
|
150
|
+
}, ctx);
|
|
151
|
+
expect(first.decision_number).toBe(1);
|
|
152
|
+
expect(second.decision_number).toBe(2);
|
|
153
|
+
expect(second.path).not.toBe(first.path);
|
|
154
|
+
});
|
|
155
|
+
it("create brainstorm then read it back, verify content", async () => {
|
|
156
|
+
const result = await brainstormCommand({
|
|
157
|
+
topic: "Feature flag system",
|
|
158
|
+
content: "Should support percentage-based rollouts and user targeting",
|
|
159
|
+
project: "my-project",
|
|
160
|
+
}, ctx);
|
|
161
|
+
expect(result.total_entries).toBe(1);
|
|
162
|
+
const content = await readCommand({ path: result.path }, ctx);
|
|
163
|
+
expect(content).toContain("Feature flag system");
|
|
164
|
+
expect(content).toContain("percentage-based rollouts");
|
|
165
|
+
});
|
|
166
|
+
it("create brainstorm to existing topic appends entry", async () => {
|
|
167
|
+
const first = await brainstormCommand({
|
|
168
|
+
topic: "API design",
|
|
169
|
+
content: "Consider REST vs GraphQL",
|
|
170
|
+
project: "my-project",
|
|
171
|
+
}, ctx);
|
|
172
|
+
expect(first.total_entries).toBe(1);
|
|
173
|
+
const second = await brainstormCommand({
|
|
174
|
+
topic: "API design",
|
|
175
|
+
content: "Versioning via URL path is simpler",
|
|
176
|
+
project: "my-project",
|
|
177
|
+
}, ctx);
|
|
178
|
+
expect(second.total_entries).toBe(2);
|
|
179
|
+
expect(second.path).toBe(first.path);
|
|
180
|
+
const content = await readCommand({ path: second.path }, ctx);
|
|
181
|
+
expect(content).toContain("REST vs GraphQL");
|
|
182
|
+
expect(content).toContain("Versioning via URL path");
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
describe("todo", () => {
|
|
186
|
+
it("add todo then list returns it", async () => {
|
|
187
|
+
await todoCommand({ action: "add", item: "Write unit tests", project: "my-project" }, ctx);
|
|
188
|
+
const result = await todoCommand({ action: "list", project: "my-project" }, ctx);
|
|
189
|
+
expect(result.todos).toHaveLength(1);
|
|
190
|
+
expect(result.todos[0].text).toBe("Write unit tests");
|
|
191
|
+
expect(result.todos[0].completed).toBe(false);
|
|
192
|
+
});
|
|
193
|
+
it("add multiple todos then complete one", async () => {
|
|
194
|
+
await todoCommand({ action: "add", item: "Setup CI", project: "my-project" }, ctx);
|
|
195
|
+
await todoCommand({ action: "add", item: "Deploy staging", project: "my-project" }, ctx);
|
|
196
|
+
await todoCommand({ action: "add", item: "Write docs", project: "my-project" }, ctx);
|
|
197
|
+
await todoCommand({ action: "complete", item: "Deploy staging", project: "my-project" }, ctx);
|
|
198
|
+
const result = await todoCommand({ action: "list", project: "my-project" }, ctx);
|
|
199
|
+
expect(result.todos).toHaveLength(2);
|
|
200
|
+
const texts = result.todos.map((t) => t.text);
|
|
201
|
+
expect(texts).toContain("Setup CI");
|
|
202
|
+
expect(texts).toContain("Write docs");
|
|
203
|
+
expect(texts).not.toContain("Deploy staging");
|
|
204
|
+
});
|
|
205
|
+
it("add todo with high priority then list with blockersOnly returns it", async () => {
|
|
206
|
+
await todoCommand({ action: "add", item: "Fix critical bug", priority: "high", project: "my-project" }, ctx);
|
|
207
|
+
await todoCommand({ action: "add", item: "Refactor module", priority: "medium", project: "my-project" }, ctx);
|
|
208
|
+
await todoCommand({ action: "add", item: "Update readme", priority: "low", project: "my-project" }, ctx);
|
|
209
|
+
const result = await todoCommand({ action: "list", blockersOnly: true, project: "my-project" }, ctx);
|
|
210
|
+
expect(result.todos).toHaveLength(1);
|
|
211
|
+
expect(result.todos[0].text).toBe("Fix critical bug");
|
|
212
|
+
expect(result.todos[0].priority).toBe("high");
|
|
213
|
+
});
|
|
214
|
+
it("add todo then remove it", async () => {
|
|
215
|
+
await todoCommand({ action: "add", item: "Temporary item", project: "my-project" }, ctx);
|
|
216
|
+
await todoCommand({ action: "add", item: "Keep this", project: "my-project" }, ctx);
|
|
217
|
+
await todoCommand({ action: "remove", item: "Temporary item", project: "my-project" }, ctx);
|
|
218
|
+
const result = await todoCommand({ action: "list", project: "my-project" }, ctx);
|
|
219
|
+
expect(result.todos).toHaveLength(1);
|
|
220
|
+
expect(result.todos[0].text).toBe("Keep this");
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe("multi-artifact flow", () => {
|
|
224
|
+
it("create ADR, task, and learning for same project then context includes learning count", async () => {
|
|
225
|
+
await decideCommand({
|
|
226
|
+
title: "Use monorepo",
|
|
227
|
+
context: "Need shared code",
|
|
228
|
+
decision: "Turborepo with npm workspaces",
|
|
229
|
+
project: "my-project",
|
|
230
|
+
}, ctx);
|
|
231
|
+
await taskCommand({ action: "add", title: "Setup turborepo", project: "my-project" }, ctx);
|
|
232
|
+
await learnCommand({
|
|
233
|
+
action: "add",
|
|
234
|
+
title: "Turborepo caching",
|
|
235
|
+
discovery: "Remote cache speeds up CI by 3x",
|
|
236
|
+
project: "my-project",
|
|
237
|
+
}, ctx);
|
|
238
|
+
await learnCommand({
|
|
239
|
+
action: "add",
|
|
240
|
+
title: "Workspaces limits",
|
|
241
|
+
discovery: "npm workspaces support up to 200 packages",
|
|
242
|
+
project: "my-project",
|
|
243
|
+
}, ctx);
|
|
244
|
+
const result = await contextCommand({ project: "my-project" }, ctx);
|
|
245
|
+
expect(result.learning_count).toBe(2);
|
|
246
|
+
expect(result.project_slug).toBe("my-project");
|
|
247
|
+
});
|
|
248
|
+
it("create tasks then prune in dry-run mode reports them (zero actual deletions)", async () => {
|
|
249
|
+
await taskCommand({ action: "add", title: "Old task", project: "my-project" }, ctx);
|
|
250
|
+
await taskCommand({ action: "add", title: "Another task", project: "my-project" }, ctx);
|
|
251
|
+
await taskCommand({ action: "update", taskId: "task-001", status: "done", project: "my-project" }, ctx);
|
|
252
|
+
await taskCommand({ action: "update", taskId: "task-002", status: "cancelled", project: "my-project" }, ctx);
|
|
253
|
+
const result = await pruneCommand({ mode: "dry-run", project: "my-project" }, ctx);
|
|
254
|
+
expect(result).toHaveLength(1);
|
|
255
|
+
expect(result[0].project).toBe("my-project");
|
|
256
|
+
expect(result[0].stats.total_deleted).toBe(0);
|
|
257
|
+
expect(result[0].stats.total_archived).toBe(0);
|
|
258
|
+
const tasks = await taskCommand({ action: "list", project: "my-project" }, ctx);
|
|
259
|
+
expect(tasks.tasks).toHaveLength(2);
|
|
260
|
+
});
|
|
261
|
+
it("create ADR then search finds it by title", async () => {
|
|
262
|
+
const adr = await decideCommand({
|
|
263
|
+
title: "Adopt Zero Trust Security",
|
|
264
|
+
context: "Traditional perimeter security is insufficient",
|
|
265
|
+
decision: "Implement zero-trust architecture with mTLS",
|
|
266
|
+
project: "my-project",
|
|
267
|
+
}, ctx);
|
|
268
|
+
const results = await searchCommand({ query: "Zero Trust Security", project: "my-project" }, ctx);
|
|
269
|
+
expect(results.length).toBeGreaterThanOrEqual(1);
|
|
270
|
+
const paths = results.map((r) => r.path);
|
|
271
|
+
expect(paths.some((p) => p === adr.path)).toBe(true);
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
//# sourceMappingURL=project-artifacts.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-artifacts.test.js","sourceRoot":"","sources":["../../src/integration/project-artifacts.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|