@cliangdev/flux-plugin 0.3.1 → 0.4.0-dev.17634ed
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/commands/dashboard.md +1 -1
- package/package.json +3 -1
- package/src/server/adapters/factory.ts +6 -28
- package/src/server/adapters/github/__tests__/criteria-deps.test.ts +579 -0
- package/src/server/adapters/github/__tests__/documents-stats.test.ts +789 -0
- package/src/server/adapters/github/__tests__/epic-task-crud.test.ts +1072 -0
- package/src/server/adapters/github/__tests__/foundation.test.ts +537 -0
- package/src/server/adapters/github/__tests__/index-store.test.ts +319 -0
- package/src/server/adapters/github/__tests__/prd-crud.test.ts +836 -0
- package/src/server/adapters/github/adapter.ts +1680 -0
- package/src/server/adapters/github/client.ts +34 -0
- package/src/server/adapters/github/config.ts +59 -0
- package/src/server/adapters/github/helpers/criteria.ts +157 -0
- package/src/server/adapters/github/helpers/index-store.ts +79 -0
- package/src/server/adapters/github/helpers/meta.ts +26 -0
- package/src/server/adapters/github/index.ts +5 -0
- package/src/server/adapters/github/mappers/epic.ts +21 -0
- package/src/server/adapters/github/mappers/index.ts +15 -0
- package/src/server/adapters/github/mappers/prd.ts +50 -0
- package/src/server/adapters/github/mappers/task.ts +37 -0
- package/src/server/adapters/github/types.ts +33 -0
- package/src/server/adapters/linear/adapter.ts +121 -105
- package/src/server/adapters/linear/client.ts +21 -14
- package/src/server/adapters/types.ts +1 -1
- package/src/server/index.ts +2 -0
- package/src/server/tools/__tests__/mcp-interface.test.ts +6 -0
- package/src/server/tools/__tests__/z-configure-github.test.ts +560 -0
- package/src/server/tools/__tests__/z-get-linear-url.test.ts +2 -2
- package/src/server/tools/__tests__/z-init-project.test.ts +168 -0
- package/src/server/tools/configure-github.ts +567 -0
- package/src/server/tools/index.ts +2 -1
- package/src/server/tools/init-project.ts +26 -12
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
+
import { existsSync, mkdirSync, rmSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
const TEST_DIR = `/tmp/flux-init-test-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
6
|
+
const FLUX_DIR = join(TEST_DIR, ".flux");
|
|
7
|
+
process.env.FLUX_PROJECT_ROOT = TEST_DIR;
|
|
8
|
+
|
|
9
|
+
import { config } from "../../config.js";
|
|
10
|
+
import { closeDb } from "../../db/index.js";
|
|
11
|
+
import { initProjectTool } from "../init-project.js";
|
|
12
|
+
|
|
13
|
+
describe("init_project", () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
closeDb();
|
|
16
|
+
config.clearCache();
|
|
17
|
+
if (existsSync(FLUX_DIR)) {
|
|
18
|
+
rmSync(FLUX_DIR, { recursive: true, force: true });
|
|
19
|
+
}
|
|
20
|
+
mkdirSync(TEST_DIR, { recursive: true });
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
afterEach(() => {
|
|
24
|
+
closeDb();
|
|
25
|
+
config.clearCache();
|
|
26
|
+
if (existsSync(TEST_DIR)) {
|
|
27
|
+
rmSync(TEST_DIR, { recursive: true, force: true });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
describe("local adapter", () => {
|
|
32
|
+
test("creates .flux directory and project.json", async () => {
|
|
33
|
+
await initProjectTool.handler({
|
|
34
|
+
name: "Test Project",
|
|
35
|
+
vision: "Test vision",
|
|
36
|
+
adapter: "local",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
expect(existsSync(FLUX_DIR)).toBe(true);
|
|
40
|
+
expect(existsSync(join(FLUX_DIR, "project.json"))).toBe(true);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("initializes SQLite database for local adapter", async () => {
|
|
44
|
+
await initProjectTool.handler({
|
|
45
|
+
name: "Test Project",
|
|
46
|
+
vision: "Test vision",
|
|
47
|
+
adapter: "local",
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
expect(existsSync(join(FLUX_DIR, "flux.db"))).toBe(true);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("returns planning message for local adapter", async () => {
|
|
54
|
+
const result = (await initProjectTool.handler({
|
|
55
|
+
name: "Test Project",
|
|
56
|
+
vision: "Test vision",
|
|
57
|
+
})) as any;
|
|
58
|
+
|
|
59
|
+
expect(result.success).toBe(true);
|
|
60
|
+
expect(result.message).toContain("/flux:prd");
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
describe("github adapter", () => {
|
|
65
|
+
test("creates .flux directory and project.json", async () => {
|
|
66
|
+
await initProjectTool.handler({
|
|
67
|
+
name: "Test Project",
|
|
68
|
+
vision: "Test vision",
|
|
69
|
+
adapter: "github",
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
expect(existsSync(FLUX_DIR)).toBe(true);
|
|
73
|
+
expect(existsSync(join(FLUX_DIR, "project.json"))).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
test("does not create SQLite database for github adapter", async () => {
|
|
77
|
+
await initProjectTool.handler({
|
|
78
|
+
name: "Test Project",
|
|
79
|
+
vision: "Test vision",
|
|
80
|
+
adapter: "github",
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
expect(existsSync(join(FLUX_DIR, "flux.db"))).toBe(false);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
test("project.json records adapter type as github", async () => {
|
|
87
|
+
const result = (await initProjectTool.handler({
|
|
88
|
+
name: "Test Project",
|
|
89
|
+
vision: "Test vision",
|
|
90
|
+
adapter: "github",
|
|
91
|
+
})) as any;
|
|
92
|
+
|
|
93
|
+
expect(result.project.adapter.type).toBe("github");
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test("returns configure_github next-step message", async () => {
|
|
97
|
+
const result = (await initProjectTool.handler({
|
|
98
|
+
name: "Test Project",
|
|
99
|
+
vision: "Test vision",
|
|
100
|
+
adapter: "github",
|
|
101
|
+
})) as any;
|
|
102
|
+
|
|
103
|
+
expect(result.success).toBe(true);
|
|
104
|
+
expect(result.message).toContain("configure_github");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("fails if project already initialized", async () => {
|
|
108
|
+
await initProjectTool.handler({
|
|
109
|
+
name: "Test Project",
|
|
110
|
+
vision: "Test vision",
|
|
111
|
+
adapter: "github",
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
await expect(
|
|
115
|
+
initProjectTool.handler({
|
|
116
|
+
name: "Test Project",
|
|
117
|
+
vision: "Test vision",
|
|
118
|
+
adapter: "github",
|
|
119
|
+
}),
|
|
120
|
+
).rejects.toThrow(/already initialized/i);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
describe("linear adapter", () => {
|
|
125
|
+
test("does not create SQLite database for linear adapter", async () => {
|
|
126
|
+
await initProjectTool.handler({
|
|
127
|
+
name: "Test Project",
|
|
128
|
+
vision: "Test vision",
|
|
129
|
+
adapter: "linear",
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
expect(existsSync(join(FLUX_DIR, "flux.db"))).toBe(false);
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
test("returns configure_linear next-step message", async () => {
|
|
136
|
+
const result = (await initProjectTool.handler({
|
|
137
|
+
name: "Test Project",
|
|
138
|
+
vision: "Test vision",
|
|
139
|
+
adapter: "linear",
|
|
140
|
+
})) as any;
|
|
141
|
+
|
|
142
|
+
expect(result.message).toContain("configure_linear");
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
describe("input validation", () => {
|
|
147
|
+
test("rejects missing name", async () => {
|
|
148
|
+
await expect(
|
|
149
|
+
initProjectTool.handler({ vision: "Test vision" }),
|
|
150
|
+
).rejects.toThrow();
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
test("rejects missing vision", async () => {
|
|
154
|
+
await expect(
|
|
155
|
+
initProjectTool.handler({ name: "Test Project" }),
|
|
156
|
+
).rejects.toThrow();
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("defaults to local adapter when not specified", async () => {
|
|
160
|
+
const result = (await initProjectTool.handler({
|
|
161
|
+
name: "Test Project",
|
|
162
|
+
vision: "Test vision",
|
|
163
|
+
})) as any;
|
|
164
|
+
|
|
165
|
+
expect(result.project.adapter.type).toBe("local");
|
|
166
|
+
});
|
|
167
|
+
});
|
|
168
|
+
});
|