@speclife/mcp-server 0.1.0

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.
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SpecLife MCP Server
4
+ *
5
+ * Exposes spec-driven development workflows as MCP tools
6
+ * for AI assistants (Claude Desktop, Cursor).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SpecLife MCP Server
4
+ *
5
+ * Exposes spec-driven development workflows as MCP tools
6
+ * for AI assistants (Claude Desktop, Cursor).
7
+ */
8
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
10
+ import { registerTools } from "./tools/index.js";
11
+ const server = new McpServer({
12
+ name: "speclife",
13
+ version: "0.1.0",
14
+ });
15
+ // Register all tools
16
+ registerTools(server);
17
+ // Start server with stdio transport
18
+ const transport = new StdioServerTransport();
19
+ await server.connect(transport);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;IAC3B,IAAI,EAAE,UAAU;IAChB,OAAO,EAAE,OAAO;CACjB,CAAC,CAAC;AAEH,qBAAqB;AACrB,aAAa,CAAC,MAAM,CAAC,CAAC;AAEtB,oCAAoC;AACpC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * speclife_implement tool
3
+ *
4
+ * AI-driven code implementation with multiple modes:
5
+ * - claude-cli: Uses Claude CLI with MCP servers (primary)
6
+ * - claude-sdk: Direct Anthropic SDK with tool-use (fully automated)
7
+ * - cursor: Opens Cursor IDE for manual implementation
8
+ */
9
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
10
+ export declare function registerImplementTool(server: McpServer): void;
11
+ //# sourceMappingURL=implement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/tools/implement.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoI7D"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * speclife_implement tool
3
+ *
4
+ * AI-driven code implementation with multiple modes:
5
+ * - claude-cli: Uses Claude CLI with MCP servers (primary)
6
+ * - claude-sdk: Direct Anthropic SDK with tool-use (fully automated)
7
+ * - cursor: Opens Cursor IDE for manual implementation
8
+ */
9
+ import { loadConfig, createOpenSpecAdapter, implementWorkflow, } from "@speclife/core";
10
+ import { z } from "zod";
11
+ const ImplementArgsSchema = z.object({
12
+ changeId: z.string().describe("Change ID to implement (e.g., 'add-user-auth')"),
13
+ mode: z.enum(['claude-cli', 'claude-sdk', 'cursor']).optional().describe("Implementation mode: 'claude-cli' (primary, uses MCP servers), 'claude-sdk' (fully automated), or 'cursor' (opens IDE)"),
14
+ taskId: z.string().optional().describe("Specific task ID to implement (e.g., '1.2'). If not provided, implements all uncompleted tasks."),
15
+ dryRun: z.boolean().optional().describe("Return the planned prompt/actions without executing (default: false)"),
16
+ });
17
+ export function registerImplementTool(server) {
18
+ server.tool("speclife_implement", "Implement a change using AI. Supports multiple modes: 'claude-cli' (primary - uses Claude CLI with MCP servers), 'claude-sdk' (fully automated with tool-use), or 'cursor' (opens IDE for manual implementation).", ImplementArgsSchema.shape, async (args) => {
19
+ try {
20
+ const parsed = ImplementArgsSchema.parse(args);
21
+ const cwd = process.cwd();
22
+ // Load config and create adapters
23
+ const config = await loadConfig(cwd);
24
+ const openspec = createOpenSpecAdapter({
25
+ projectRoot: cwd,
26
+ specDir: config.specDir
27
+ });
28
+ // Collect progress messages
29
+ const progressMessages = [];
30
+ // Run workflow
31
+ const result = await implementWorkflow({
32
+ changeId: parsed.changeId,
33
+ mode: parsed.mode,
34
+ taskId: parsed.taskId,
35
+ dryRun: parsed.dryRun,
36
+ }, { openspec, config }, (event) => {
37
+ progressMessages.push(event.message);
38
+ });
39
+ // Format output based on result
40
+ const lines = [];
41
+ // Mode indicator
42
+ lines.push(`Mode: ${result.mode}`);
43
+ lines.push('');
44
+ // Status
45
+ const statusEmoji = {
46
+ success: '✓',
47
+ partial: '⚠',
48
+ failed: '✗',
49
+ manual: '📝',
50
+ }[result.status];
51
+ lines.push(`${statusEmoji} Status: ${result.status}`);
52
+ lines.push('');
53
+ // For dry run, show the plan
54
+ if (parsed.dryRun && result.plan) {
55
+ lines.push('## Planned Prompt/Actions');
56
+ lines.push('');
57
+ lines.push('```');
58
+ // Truncate if very long
59
+ const maxPlanLength = 2000;
60
+ if (result.plan.length > maxPlanLength) {
61
+ lines.push(result.plan.slice(0, maxPlanLength));
62
+ lines.push(`... (truncated, ${result.plan.length - maxPlanLength} more characters)`);
63
+ }
64
+ else {
65
+ lines.push(result.plan);
66
+ }
67
+ lines.push('```');
68
+ }
69
+ else {
70
+ // Show output
71
+ lines.push('## Output');
72
+ lines.push('');
73
+ if (result.output) {
74
+ // Truncate if very long
75
+ const maxOutputLength = 3000;
76
+ if (result.output.length > maxOutputLength) {
77
+ lines.push(result.output.slice(0, maxOutputLength));
78
+ lines.push(`... (truncated, ${result.output.length - maxOutputLength} more characters)`);
79
+ }
80
+ else {
81
+ lines.push(result.output);
82
+ }
83
+ }
84
+ // Tasks completed
85
+ if (result.tasksCompleted.length > 0) {
86
+ lines.push('');
87
+ lines.push('## Tasks Completed');
88
+ for (const taskId of result.tasksCompleted) {
89
+ lines.push(`- [x] ${taskId}`);
90
+ }
91
+ }
92
+ // Tasks failed
93
+ if (result.tasksFailed && result.tasksFailed.length > 0) {
94
+ lines.push('');
95
+ lines.push('## Tasks Failed');
96
+ for (const { taskId, reason } of result.tasksFailed) {
97
+ lines.push(`- [ ] ${taskId}: ${reason}`);
98
+ }
99
+ }
100
+ }
101
+ // Next steps based on mode and status
102
+ lines.push('');
103
+ lines.push('## Next Steps');
104
+ if (result.mode === 'cursor') {
105
+ lines.push('1. Implement the tasks in Cursor');
106
+ lines.push('2. Run tests to verify changes');
107
+ lines.push('3. Update tasks.md to mark completed tasks');
108
+ lines.push('4. Run speclife_submit when ready');
109
+ }
110
+ else if (result.status === 'success') {
111
+ lines.push('1. Review the changes made');
112
+ lines.push('2. Run speclife_submit to create a PR');
113
+ }
114
+ else if (result.status === 'partial') {
115
+ lines.push('1. Review completed tasks');
116
+ lines.push('2. Address failed tasks manually or retry');
117
+ lines.push('3. Run speclife_submit when all tasks are complete');
118
+ }
119
+ else if (result.status === 'failed') {
120
+ lines.push('1. Review the error message above');
121
+ lines.push('2. Fix any issues and retry');
122
+ lines.push('3. Consider using a different mode if the issue persists');
123
+ }
124
+ return {
125
+ content: [{ type: "text", text: lines.join("\n") }],
126
+ };
127
+ }
128
+ catch (error) {
129
+ const message = error instanceof Error ? error.message : String(error);
130
+ return {
131
+ content: [{ type: "text", text: `Error: ${message}` }],
132
+ isError: true,
133
+ };
134
+ }
135
+ });
136
+ }
137
+ //# sourceMappingURL=implement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/tools/implement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * MCP Tool registration
3
+ */
4
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Register all SpecLife tools with the MCP server
7
+ */
8
+ export declare function registerTools(server: McpServer): void;
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYrD"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * MCP Tool registration
3
+ */
4
+ import { registerInitTool } from "./init.js";
5
+ import { registerStatusTool } from "./status.js";
6
+ import { registerListTool } from "./list.js";
7
+ import { registerSubmitTool } from "./submit.js";
8
+ import { registerMergeTool } from "./merge.js";
9
+ import { registerImplementTool } from "./implement.js";
10
+ /**
11
+ * Register all SpecLife tools with the MCP server
12
+ */
13
+ export function registerTools(server) {
14
+ // Phase 1: Foundation
15
+ registerInitTool(server);
16
+ registerStatusTool(server);
17
+ registerListTool(server);
18
+ // Phase 2: Submit and Merge
19
+ registerSubmitTool(server);
20
+ registerMergeTool(server);
21
+ // Phase 3: Implement (includes internal test loop)
22
+ registerImplementTool(server);
23
+ }
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,sBAAsB;IACtB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAEzB,4BAA4B;IAC5B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAE1B,mDAAmD;IACnD,qBAAqB,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * speclife_init tool
3
+ *
4
+ * Initialize a new change: create branch and scaffold proposal
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function registerInitTool(server: McpServer): void;
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuFxD"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * speclife_init tool
3
+ *
4
+ * Initialize a new change: create branch and scaffold proposal
5
+ */
6
+ import { loadConfig, createGitAdapter, createGitHubAdapter, createOpenSpecAdapter, initWorkflow } from "@speclife/core";
7
+ import { z } from "zod";
8
+ const InitArgsSchema = z.object({
9
+ changeId: z.string().describe("Unique identifier for the change (kebab-case, e.g., 'add-user-auth')"),
10
+ description: z.string().optional().describe("Brief description of the change (populates proposal.md)"),
11
+ noWorktree: z.boolean().optional().describe("Disable worktree creation - create branch in current directory instead (default: false)"),
12
+ skipDraftPR: z.boolean().optional().describe("Skip creating a draft PR (overrides config.createDraftPR)"),
13
+ });
14
+ export function registerInitTool(server) {
15
+ server.tool("speclife_init", "Initialize a new change: create worktree (default), scaffold proposal files (proposal.md, tasks.md), and create a draft PR for early visibility", InitArgsSchema.shape, async (args) => {
16
+ try {
17
+ const parsed = InitArgsSchema.parse(args);
18
+ const cwd = process.cwd();
19
+ // Load config and create adapters
20
+ const config = await loadConfig(cwd);
21
+ const git = createGitAdapter(cwd);
22
+ const openspec = createOpenSpecAdapter({
23
+ projectRoot: cwd,
24
+ specDir: config.specDir
25
+ });
26
+ // Create GitHub adapter if draft PR creation is enabled
27
+ const shouldCreateDraftPR = config.createDraftPR && !parsed.skipDraftPR;
28
+ const github = shouldCreateDraftPR
29
+ ? createGitHubAdapter({
30
+ owner: config.github.owner,
31
+ repo: config.github.repo,
32
+ })
33
+ : undefined;
34
+ // Run workflow
35
+ const result = await initWorkflow({
36
+ changeId: parsed.changeId,
37
+ description: parsed.description,
38
+ noWorktree: parsed.noWorktree,
39
+ skipDraftPR: parsed.skipDraftPR,
40
+ }, { git, openspec, config, github });
41
+ const lines = result.worktreePath
42
+ ? [
43
+ `✓ Created worktree: ${result.worktreePath}`,
44
+ `✓ Created branch: ${result.branch}`,
45
+ `✓ Scaffolded proposal: ${result.proposalPath}`,
46
+ `✓ Scaffolded tasks: ${result.tasksPath}`,
47
+ ]
48
+ : [
49
+ `✓ Created branch: ${result.branch}`,
50
+ `✓ Scaffolded proposal: ${result.proposalPath}`,
51
+ `✓ Scaffolded tasks: ${result.tasksPath}`,
52
+ ];
53
+ // Add PR info if created
54
+ if (result.pullRequest) {
55
+ lines.push(`✓ Created draft PR #${result.pullRequest.number}: ${result.pullRequest.url}`);
56
+ }
57
+ lines.push("");
58
+ lines.push("Next steps:");
59
+ if (result.worktreePath) {
60
+ lines.push(`1. cd ${result.worktreePath}`);
61
+ lines.push("2. Edit proposal.md to describe your change");
62
+ lines.push("3. Edit tasks.md to list implementation steps");
63
+ lines.push("4. Run speclife_implement to start AI-driven implementation");
64
+ }
65
+ else {
66
+ lines.push("1. Edit proposal.md to describe your change");
67
+ lines.push("2. Edit tasks.md to list implementation steps");
68
+ lines.push("3. Run speclife_implement to start AI-driven implementation");
69
+ }
70
+ if (result.pullRequest) {
71
+ lines.push("");
72
+ lines.push(`Note: Draft PR is live at ${result.pullRequest.url} - team can see progress early!`);
73
+ }
74
+ return {
75
+ content: [{ type: "text", text: lines.join("\n") }],
76
+ };
77
+ }
78
+ catch (error) {
79
+ const message = error instanceof Error ? error.message : String(error);
80
+ return {
81
+ content: [{ type: "text", text: `Error: ${message}` }],
82
+ isError: true,
83
+ };
84
+ }
85
+ });
86
+ }
87
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * speclife_list tool
3
+ *
4
+ * List all active changes in the project
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function registerListTool(server: McpServer): void;
8
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyDxD"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * speclife_list tool
3
+ *
4
+ * List all active changes in the project
5
+ */
6
+ import { loadConfig, createGitAdapter, createOpenSpecAdapter, statusWorkflow } from "@speclife/core";
7
+ import { z } from "zod";
8
+ const ListArgsSchema = z.object({});
9
+ export function registerListTool(server) {
10
+ server.tool("speclife_list", "List all active changes in the project", ListArgsSchema.shape, async () => {
11
+ try {
12
+ const cwd = process.cwd();
13
+ // Load config and create adapters
14
+ const config = await loadConfig(cwd);
15
+ const git = createGitAdapter(cwd);
16
+ const openspec = createOpenSpecAdapter({
17
+ projectRoot: cwd,
18
+ specDir: config.specDir
19
+ });
20
+ // List changes
21
+ const changeIds = await openspec.listChanges();
22
+ if (changeIds.length === 0) {
23
+ return {
24
+ content: [{
25
+ type: "text",
26
+ text: "No active changes. Use speclife_init to create one.",
27
+ }],
28
+ };
29
+ }
30
+ // Get status for each change
31
+ const lines = ["# Active Changes", ""];
32
+ for (const changeId of changeIds) {
33
+ const result = await statusWorkflow({ changeId }, { git, openspec });
34
+ if (result) {
35
+ const { change, taskSummary, onBranch } = result;
36
+ const branchIndicator = onBranch ? " ← current" : "";
37
+ lines.push(`- **${changeId}**${branchIndicator}`, ` State: ${change.state} | Tasks: ${taskSummary.completed}/${taskSummary.total}`, "");
38
+ }
39
+ }
40
+ return {
41
+ content: [{ type: "text", text: lines.join("\n") }],
42
+ };
43
+ }
44
+ catch (error) {
45
+ const message = error instanceof Error ? error.message : String(error);
46
+ return {
47
+ content: [{ type: "text", text: `Error: ${message}` }],
48
+ isError: true,
49
+ };
50
+ }
51
+ });
52
+ }
53
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEpC,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,wCAAwC,EACxC,cAAc,CAAC,KAAK,EACpB,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAE1B,kCAAkC;YAClC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,GAAG,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAClC,MAAM,QAAQ,GAAG,qBAAqB,CAAC;gBACrC,WAAW,EAAE,GAAG;gBAChB,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YAEH,eAAe;YACf,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAE/C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,qDAAqD;yBAC5D,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,6BAA6B;YAC7B,MAAM,KAAK,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YAEvC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;gBACjC,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;gBACrE,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC;oBACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;oBACrD,KAAK,CAAC,IAAI,CACR,OAAO,QAAQ,KAAK,eAAe,EAAE,EACrC,YAAY,MAAM,CAAC,KAAK,aAAa,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,KAAK,EAAE,EACjF,EAAE,CACH,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACpD,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,OAAO,EAAE,EAAE,CAAC;gBACtD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * speclife_merge tool
3
+ *
4
+ * Merge PR, sync main, and cleanup worktree/branch
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function registerMergeTool(server: McpServer): void;
8
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA2DzD"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * speclife_merge tool
3
+ *
4
+ * Merge PR, sync main, and cleanup worktree/branch
5
+ */
6
+ import { loadConfig, createGitAdapter, createGitHubAdapter, mergeWorkflow } from "@speclife/core";
7
+ import { z } from "zod";
8
+ const MergeArgsSchema = z.object({
9
+ changeId: z.string().describe("Change ID to merge (e.g., 'add-user-auth')"),
10
+ method: z.enum(['squash', 'merge', 'rebase']).optional().describe("Merge method: 'squash' (default), 'merge', or 'rebase'"),
11
+ deleteBranch: z.boolean().optional().describe("Delete local branch after merge (default: true)"),
12
+ removeWorktree: z.boolean().optional().describe("Remove worktree after merge if applicable (default: true)"),
13
+ });
14
+ export function registerMergeTool(server) {
15
+ server.tool("speclife_merge", "Merge a submitted PR, sync main branch, and cleanup local branch/worktree", MergeArgsSchema.shape, async (args) => {
16
+ try {
17
+ const parsed = MergeArgsSchema.parse(args);
18
+ const cwd = process.cwd();
19
+ // Load config and create adapters
20
+ const config = await loadConfig(cwd);
21
+ const git = createGitAdapter(cwd);
22
+ const github = createGitHubAdapter({
23
+ owner: config.github.owner,
24
+ repo: config.github.repo,
25
+ });
26
+ // Run workflow
27
+ const result = await mergeWorkflow({
28
+ changeId: parsed.changeId,
29
+ method: parsed.method,
30
+ deleteBranch: parsed.deleteBranch,
31
+ removeWorktree: parsed.removeWorktree,
32
+ }, { git, github, config });
33
+ const lines = [
34
+ `✓ Merged PR #${result.pullRequest.number}: ${result.pullRequest.url}`,
35
+ ];
36
+ if (result.mainSynced) {
37
+ lines.push(`✓ Synced ${config.github.baseBranch} with latest changes`);
38
+ }
39
+ if (result.branchDeleted) {
40
+ lines.push(`✓ Deleted local branch spec/${parsed.changeId}`);
41
+ }
42
+ if (result.worktreeRemoved) {
43
+ lines.push(`✓ Removed worktree at ${result.worktreePath}`);
44
+ }
45
+ lines.push('', 'Change complete! You are now on the main branch with the merged changes.');
46
+ return {
47
+ content: [{ type: "text", text: lines.join("\n") }],
48
+ };
49
+ }
50
+ catch (error) {
51
+ const message = error instanceof Error ? error.message : String(error);
52
+ return {
53
+ content: [{ type: "text", text: `Error: ${message}` }],
54
+ isError: true,
55
+ };
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * speclife_status tool
3
+ *
4
+ * Show current change state and progress
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function registerStatusTool(server: McpServer): void;
8
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAezE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmE1D"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * speclife_status tool
3
+ *
4
+ * Show current change state and progress
5
+ */
6
+ import { loadConfig, createGitAdapter, createOpenSpecAdapter, statusWorkflow } from "@speclife/core";
7
+ import { z } from "zod";
8
+ const StatusArgsSchema = z.object({
9
+ changeId: z.string().optional().describe("Change ID to get status for (uses current branch if not provided)"),
10
+ });
11
+ export function registerStatusTool(server) {
12
+ server.tool("speclife_status", "Show the current state and progress of a change", StatusArgsSchema.shape, async (args) => {
13
+ try {
14
+ const parsed = StatusArgsSchema.parse(args);
15
+ const cwd = process.cwd();
16
+ // Load config and create adapters
17
+ const config = await loadConfig(cwd);
18
+ const git = createGitAdapter(cwd);
19
+ const openspec = createOpenSpecAdapter({
20
+ projectRoot: cwd,
21
+ specDir: config.specDir
22
+ });
23
+ // Run workflow
24
+ const result = await statusWorkflow({ changeId: parsed.changeId }, { git, openspec });
25
+ if (!result) {
26
+ return {
27
+ content: [{
28
+ type: "text",
29
+ text: parsed.changeId
30
+ ? `Change '${parsed.changeId}' not found`
31
+ : "No active change on current branch. Use speclife_init to create one.",
32
+ }],
33
+ };
34
+ }
35
+ const { change, currentBranch, onBranch, taskSummary } = result;
36
+ const lines = [
37
+ `# Change: ${change.id}`,
38
+ "",
39
+ `**State:** ${change.state}`,
40
+ `**Branch:** ${change.branch}${onBranch ? " (current)" : ` (you're on ${currentBranch})`}`,
41
+ `**Tasks:** ${taskSummary.completed}/${taskSummary.total} (${taskSummary.percentage}%)`,
42
+ "",
43
+ "## Proposal Summary",
44
+ change.proposal.why.slice(0, 200) + (change.proposal.why.length > 200 ? "..." : ""),
45
+ "",
46
+ "## Tasks",
47
+ ];
48
+ for (const task of change.tasks) {
49
+ const checkbox = task.completed ? "☑" : "☐";
50
+ lines.push(`${checkbox} ${task.id} ${task.content}`);
51
+ }
52
+ return {
53
+ content: [{ type: "text", text: lines.join("\n") }],
54
+ };
55
+ }
56
+ catch (error) {
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ return {
59
+ content: [{ type: "text", text: `Error: ${message}` }],
60
+ isError: true,
61
+ };
62
+ }
63
+ });
64
+ }
65
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * speclife_submit tool
3
+ *
4
+ * Commit, push, create PR, and archive a change
5
+ */
6
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
7
+ export declare function registerSubmitTool(server: McpServer): void;
8
+ //# sourceMappingURL=submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/tools/submit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsBzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmE1D"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * speclife_submit tool
3
+ *
4
+ * Commit, push, create PR, and archive a change
5
+ */
6
+ import { loadConfig, createGitAdapter, createGitHubAdapter, createOpenSpecAdapter, submitWorkflow } from "@speclife/core";
7
+ import { z } from "zod";
8
+ const SubmitArgsSchema = z.object({
9
+ changeId: z.string().describe("Change ID to submit (e.g., 'add-user-auth')"),
10
+ draft: z.boolean().optional().describe("Create PR as draft (default: false)"),
11
+ commitMessage: z.string().optional().describe("Custom commit message (defaults to proposal-based message)"),
12
+ });
13
+ export function registerSubmitTool(server) {
14
+ server.tool("speclife_submit", "Submit a change: commit all changes, push to remote, create GitHub PR, and archive the change", SubmitArgsSchema.shape, async (args) => {
15
+ try {
16
+ const parsed = SubmitArgsSchema.parse(args);
17
+ const cwd = process.cwd();
18
+ // Load config and create adapters
19
+ const config = await loadConfig(cwd);
20
+ const git = createGitAdapter(cwd);
21
+ const github = createGitHubAdapter({
22
+ owner: config.github.owner,
23
+ repo: config.github.repo,
24
+ });
25
+ const openspec = createOpenSpecAdapter({
26
+ projectRoot: cwd,
27
+ specDir: config.specDir
28
+ });
29
+ // Run workflow
30
+ const result = await submitWorkflow({
31
+ changeId: parsed.changeId,
32
+ draft: parsed.draft,
33
+ commitMessage: parsed.commitMessage,
34
+ }, { git, github, openspec, config });
35
+ const lines = [
36
+ `✓ Committed: ${result.commitSha.slice(0, 7)}`,
37
+ `✓ Pushed to: origin/${result.branch}`,
38
+ ];
39
+ if (result.prCreated) {
40
+ lines.push(`✓ Created PR #${result.pullRequest.number}: ${result.pullRequest.url}`);
41
+ }
42
+ else if (result.prMarkedReady) {
43
+ lines.push(`✓ Marked PR #${result.pullRequest.number} ready for review: ${result.pullRequest.url}`);
44
+ }
45
+ else {
46
+ lines.push(`✓ PR #${result.pullRequest.number} already exists: ${result.pullRequest.url}`);
47
+ }
48
+ if (result.archived) {
49
+ lines.push(`✓ Archived change to openspec/changes/archive/`);
50
+ }
51
+ if (result.pullRequest.draft) {
52
+ lines.push('', 'Note: PR is still a draft. Mark ready for review when complete.');
53
+ }
54
+ lines.push('', 'Next steps:', '1. Review the PR on GitHub', '2. Once approved, run speclife_merge to complete');
55
+ return {
56
+ content: [{ type: "text", text: lines.join("\n") }],
57
+ };
58
+ }
59
+ catch (error) {
60
+ const message = error instanceof Error ? error.message : String(error);
61
+ return {
62
+ content: [{ type: "text", text: `Error: ${message}` }],
63
+ isError: true,
64
+ };
65
+ }
66
+ });
67
+ }
68
+ //# sourceMappingURL=submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/tools/submit.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@speclife/mcp-server",
3
+ "version": "0.1.0",
4
+ "description": "MCP server for SpecLife - AI assistant interface",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "speclife-mcp": "./dist/index.js"
10
+ },
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "start": "node dist/index.js",
14
+ "dev": "tsc --watch",
15
+ "test": "vitest run --passWithNoTests",
16
+ "typecheck": "tsc --noEmit"
17
+ },
18
+ "dependencies": {
19
+ "@modelcontextprotocol/sdk": "^1.0.0",
20
+ "@speclife/core": "*",
21
+ "zod": "^3.23.0"
22
+ },
23
+ "devDependencies": {
24
+ "@types/node": "^22.0.0",
25
+ "typescript": "^5.6.0",
26
+ "vitest": "^2.0.0"
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "publishConfig": {
32
+ "access": "public"
33
+ }
34
+ }
35
+