@cliangdev/flux-plugin 0.3.1-dev.bdbaeae → 0.3.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/commands/dashboard.md +1 -1
- package/package.json +1 -3
- package/src/server/adapters/factory.ts +28 -6
- package/src/server/adapters/types.ts +1 -1
- package/src/server/index.ts +0 -2
- package/src/server/tools/__tests__/mcp-interface.test.ts +0 -6
- package/src/server/tools/index.ts +1 -2
- package/src/server/tools/init-project.ts +12 -26
- package/src/server/adapters/github/__tests__/criteria-deps.test.ts +0 -579
- package/src/server/adapters/github/__tests__/documents-stats.test.ts +0 -789
- package/src/server/adapters/github/__tests__/epic-task-crud.test.ts +0 -1072
- package/src/server/adapters/github/__tests__/foundation.test.ts +0 -537
- package/src/server/adapters/github/__tests__/index-store.test.ts +0 -319
- package/src/server/adapters/github/__tests__/prd-crud.test.ts +0 -836
- package/src/server/adapters/github/adapter.ts +0 -1552
- package/src/server/adapters/github/client.ts +0 -33
- package/src/server/adapters/github/config.ts +0 -59
- package/src/server/adapters/github/helpers/criteria.ts +0 -157
- package/src/server/adapters/github/helpers/index-store.ts +0 -75
- package/src/server/adapters/github/helpers/meta.ts +0 -26
- package/src/server/adapters/github/index.ts +0 -5
- package/src/server/adapters/github/mappers/epic.ts +0 -21
- package/src/server/adapters/github/mappers/index.ts +0 -15
- package/src/server/adapters/github/mappers/prd.ts +0 -50
- package/src/server/adapters/github/mappers/task.ts +0 -37
- package/src/server/adapters/github/types.ts +0 -27
- package/src/server/tools/__tests__/z-configure-github.test.ts +0 -509
- package/src/server/tools/__tests__/z-init-project.test.ts +0 -168
- package/src/server/tools/configure-github.ts +0 -411
package/commands/dashboard.md
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cliangdev/flux-plugin",
|
|
3
|
-
"version": "0.3.1
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Claude Code plugin for AI-first workflow orchestration with MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/server/index.js",
|
|
@@ -59,8 +59,6 @@
|
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@linear/sdk": "^70.0.0",
|
|
61
61
|
"@modelcontextprotocol/sdk": "^1.25.2",
|
|
62
|
-
"@octokit/graphql": "^9.0.3",
|
|
63
|
-
"@octokit/rest": "^22.0.1",
|
|
64
62
|
"chalk": "^5.4.1",
|
|
65
63
|
"zod": "^4.3.5"
|
|
66
64
|
},
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Adapter Factory
|
|
3
|
+
*
|
|
4
|
+
* Creates the appropriate adapter based on project configuration.
|
|
5
|
+
* Supports LocalAdapter and LinearAdapter; future adapters will be added here.
|
|
6
|
+
*/
|
|
7
|
+
|
|
1
8
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
9
|
import { config } from "../config.js";
|
|
3
|
-
import { GitHubAdapter } from "./github/adapter.js";
|
|
4
|
-
import { loadGithubConfig } from "./github/config.js";
|
|
5
10
|
import { LinearAdapter } from "./linear/adapter.js";
|
|
6
11
|
import { linearConfigExists, loadLinearConfig } from "./linear/config.js";
|
|
7
12
|
import { LocalAdapter } from "./local-adapter.js";
|
|
@@ -9,8 +14,12 @@ import type { AdapterConfig, BackendAdapter } from "./types.js";
|
|
|
9
14
|
|
|
10
15
|
let cachedAdapter: BackendAdapter | null = null;
|
|
11
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Get the adapter configuration from project.json
|
|
19
|
+
*/
|
|
12
20
|
function getAdapterConfig(): AdapterConfig {
|
|
13
21
|
if (!existsSync(config.projectJsonPath)) {
|
|
22
|
+
// Default to local adapter if project not initialized
|
|
14
23
|
return { type: "local" };
|
|
15
24
|
}
|
|
16
25
|
|
|
@@ -23,6 +32,12 @@ function getAdapterConfig(): AdapterConfig {
|
|
|
23
32
|
}
|
|
24
33
|
}
|
|
25
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Create an adapter instance based on configuration.
|
|
37
|
+
*
|
|
38
|
+
* @param adapterConfig - Optional override for adapter configuration
|
|
39
|
+
* @returns The appropriate BackendAdapter implementation
|
|
40
|
+
*/
|
|
26
41
|
export function createAdapter(adapterConfig?: AdapterConfig): BackendAdapter {
|
|
27
42
|
const cfg = adapterConfig ?? getAdapterConfig();
|
|
28
43
|
|
|
@@ -45,10 +60,6 @@ export function createAdapter(adapterConfig?: AdapterConfig): BackendAdapter {
|
|
|
45
60
|
case "notion":
|
|
46
61
|
// TODO: Implement NotionAdapter
|
|
47
62
|
throw new Error("Notion adapter not yet implemented");
|
|
48
|
-
case "github": {
|
|
49
|
-
const githubConfig = loadGithubConfig();
|
|
50
|
-
return new GitHubAdapter(githubConfig);
|
|
51
|
-
}
|
|
52
63
|
default: {
|
|
53
64
|
const _exhaustive: never = cfg.type;
|
|
54
65
|
throw new Error(`Unknown adapter type: ${cfg.type}`);
|
|
@@ -56,6 +67,13 @@ export function createAdapter(adapterConfig?: AdapterConfig): BackendAdapter {
|
|
|
56
67
|
}
|
|
57
68
|
}
|
|
58
69
|
|
|
70
|
+
/**
|
|
71
|
+
* Get or create a cached adapter instance.
|
|
72
|
+
* Uses singleton pattern to avoid creating multiple adapter instances.
|
|
73
|
+
*
|
|
74
|
+
* @param forceNew - If true, creates a new adapter even if one is cached
|
|
75
|
+
* @returns The cached or newly created adapter
|
|
76
|
+
*/
|
|
59
77
|
export function getAdapter(forceNew = false): BackendAdapter {
|
|
60
78
|
if (forceNew || !cachedAdapter) {
|
|
61
79
|
cachedAdapter = createAdapter();
|
|
@@ -63,6 +81,10 @@ export function getAdapter(forceNew = false): BackendAdapter {
|
|
|
63
81
|
return cachedAdapter;
|
|
64
82
|
}
|
|
65
83
|
|
|
84
|
+
/**
|
|
85
|
+
* Clear the cached adapter instance.
|
|
86
|
+
* Useful for testing or when project configuration changes.
|
|
87
|
+
*/
|
|
66
88
|
export function clearAdapterCache(): void {
|
|
67
89
|
cachedAdapter = null;
|
|
68
90
|
}
|
|
@@ -288,6 +288,6 @@ export interface CascadeResult {
|
|
|
288
288
|
* Adapter configuration stored in project.json
|
|
289
289
|
*/
|
|
290
290
|
export interface AdapterConfig {
|
|
291
|
-
type: "local" | "specflux" | "linear" | "notion"
|
|
291
|
+
type: "local" | "specflux" | "linear" | "notion";
|
|
292
292
|
config?: Record<string, unknown>;
|
|
293
293
|
}
|
package/src/server/index.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { fluxProjectExists, initDb } from "./db/index.js";
|
|
|
5
5
|
import {
|
|
6
6
|
addCriteriaTool,
|
|
7
7
|
addDependencyTool,
|
|
8
|
-
configureGithubTool,
|
|
9
8
|
configureLinearTool,
|
|
10
9
|
createEpicTool,
|
|
11
10
|
createPrdTool,
|
|
@@ -51,7 +50,6 @@ const tools: ToolDefinition[] = [
|
|
|
51
50
|
getStatsTool,
|
|
52
51
|
getVersionTool,
|
|
53
52
|
// Configuration tools
|
|
54
|
-
configureGithubTool,
|
|
55
53
|
configureLinearTool,
|
|
56
54
|
// Display tools
|
|
57
55
|
renderStatusTool,
|
|
@@ -84,12 +84,6 @@ describe("MCP Interface", () => {
|
|
|
84
84
|
expect(toolOption?.params?.vision).toBeDefined();
|
|
85
85
|
expect(toolOption?.params?.adapter).toBeDefined();
|
|
86
86
|
});
|
|
87
|
-
|
|
88
|
-
test("adapter param includes github option", () => {
|
|
89
|
-
const error = createProjectNotInitializedError("/cwd", "/root");
|
|
90
|
-
const toolOption = error.setup.options.find((o) => o.method === "tool");
|
|
91
|
-
expect(toolOption?.params?.adapter).toContain("github");
|
|
92
|
-
});
|
|
93
87
|
});
|
|
94
88
|
|
|
95
89
|
describe("registerTools", () => {
|
|
@@ -64,7 +64,7 @@ export function createProjectNotInitializedError(
|
|
|
64
64
|
params: {
|
|
65
65
|
name: "Project name (required)",
|
|
66
66
|
vision: "Brief project description (required)",
|
|
67
|
-
adapter: "local | linear
|
|
67
|
+
adapter: "local | linear (default: local)",
|
|
68
68
|
},
|
|
69
69
|
},
|
|
70
70
|
],
|
|
@@ -140,7 +140,6 @@ export function registerTools(server: Server, tools: ToolDefinition[]) {
|
|
|
140
140
|
});
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
-
export { configureGithubTool } from "./configure-github.js";
|
|
144
143
|
export { configureLinearTool } from "./configure-linear.js";
|
|
145
144
|
export { createEpicTool } from "./create-epic.js";
|
|
146
145
|
export { createPrdTool } from "./create-prd.js";
|
|
@@ -48,13 +48,7 @@ function setupClaudeSettings(projectRoot: string): void {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
const adapterTypes = [
|
|
52
|
-
"local",
|
|
53
|
-
"specflux",
|
|
54
|
-
"linear",
|
|
55
|
-
"notion",
|
|
56
|
-
"github",
|
|
57
|
-
] as const;
|
|
51
|
+
const adapterTypes = ["local", "specflux", "linear", "notion"] as const;
|
|
58
52
|
|
|
59
53
|
const inputSchema = z.object({
|
|
60
54
|
name: z.string().min(1, "Project name is required"),
|
|
@@ -86,37 +80,29 @@ async function handler(input: unknown) {
|
|
|
86
80
|
writeFileSync(config.projectJsonPath, JSON.stringify(projectJson, null, 2));
|
|
87
81
|
config.clearCache();
|
|
88
82
|
|
|
89
|
-
|
|
90
|
-
initDb();
|
|
91
|
-
const projectId = generateId("proj");
|
|
92
|
-
const db = getDb();
|
|
93
|
-
insert(db, "projects", {
|
|
94
|
-
id: projectId,
|
|
95
|
-
name: parsed.name,
|
|
96
|
-
ref_prefix: refPrefix,
|
|
97
|
-
});
|
|
98
|
-
}
|
|
83
|
+
initDb();
|
|
99
84
|
|
|
100
|
-
|
|
85
|
+
const projectId = generateId("proj");
|
|
86
|
+
const db = getDb();
|
|
87
|
+
insert(db, "projects", {
|
|
88
|
+
id: projectId,
|
|
89
|
+
name: parsed.name,
|
|
90
|
+
ref_prefix: refPrefix,
|
|
91
|
+
});
|
|
101
92
|
|
|
102
|
-
|
|
103
|
-
parsed.adapter === "github"
|
|
104
|
-
? "Run configure_github to connect your GitHub tracking repository."
|
|
105
|
-
: parsed.adapter === "linear"
|
|
106
|
-
? "Run configure_linear to connect your Linear workspace."
|
|
107
|
-
: "Run /flux:prd to start planning.";
|
|
93
|
+
setupClaudeSettings(config.projectRoot);
|
|
108
94
|
|
|
109
95
|
return {
|
|
110
96
|
success: true,
|
|
111
97
|
project: projectJson,
|
|
112
|
-
message: `Flux project initialized.
|
|
98
|
+
message: `Flux project initialized. Run /flux:prd to start planning.`,
|
|
113
99
|
};
|
|
114
100
|
}
|
|
115
101
|
|
|
116
102
|
export const initProjectTool: ToolDefinition = {
|
|
117
103
|
name: "init_project",
|
|
118
104
|
description:
|
|
119
|
-
"Initialize a new Flux project. Required: name, vision. Optional: adapter (local|linear|
|
|
105
|
+
"Initialize a new Flux project. Required: name, vision. Optional: adapter (local|specflux|linear|notion, default 'local'). Creates .flux/ directory with project.json and SQLite database. Returns {success, project, message}. Fails if .flux/ already exists.",
|
|
120
106
|
inputSchema,
|
|
121
107
|
handler,
|
|
122
108
|
};
|