@speclife/mcp-server 0.1.7 → 0.3.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.
- package/README.md +107 -0
- package/dist/index.d.ts +14 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/implement.d.ts.map +1 -1
- package/dist/tools/implement.js +12 -21
- package/dist/tools/implement.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/init.d.ts.map +1 -1
- package/dist/tools/init.js +15 -20
- package/dist/tools/init.js.map +1 -1
- package/dist/tools/list.d.ts +1 -1
- package/dist/tools/list.d.ts.map +1 -1
- package/dist/tools/list.js +109 -11
- package/dist/tools/list.js.map +1 -1
- package/dist/tools/merge.d.ts +2 -1
- package/dist/tools/merge.d.ts.map +1 -1
- package/dist/tools/merge.js +94 -29
- package/dist/tools/merge.js.map +1 -1
- package/dist/tools/release.d.ts +9 -0
- package/dist/tools/release.d.ts.map +1 -0
- package/dist/tools/release.js +151 -0
- package/dist/tools/release.js.map +1 -0
- package/dist/tools/status.js +1 -1
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/submit.d.ts.map +1 -1
- package/dist/tools/submit.js +25 -9
- package/dist/tools/submit.js.map +1 -1
- package/package.json +2 -2
package/README.md
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# @speclife/mcp-server
|
|
2
|
+
|
|
3
|
+
> ⚠️ **DEPRECATED**: This MCP server is deprecated in favor of slash commands.
|
|
4
|
+
> See [Migration Guide](#migration-guide) below.
|
|
5
|
+
|
|
6
|
+
MCP server for SpecLife - provides spec-driven development tools for AI assistants.
|
|
7
|
+
|
|
8
|
+
## Migration Guide
|
|
9
|
+
|
|
10
|
+
Replace MCP tool calls with slash commands:
|
|
11
|
+
|
|
12
|
+
| MCP Tool | Slash Command | Notes |
|
|
13
|
+
|----------|---------------|-------|
|
|
14
|
+
| `speclife_init` | `/speclife start` | Creates worktree + branch |
|
|
15
|
+
| `speclife_submit` | `/speclife ship` | Commit, push, create PR |
|
|
16
|
+
| `speclife_merge` | `/speclife land` | Merge PR, cleanup, release |
|
|
17
|
+
| `speclife_release` | `/speclife release` | Manual release |
|
|
18
|
+
| `speclife_implement` | `/openspec-apply` | Use OpenSpec for implementation |
|
|
19
|
+
| `speclife_status` | `speclife status` | CLI command |
|
|
20
|
+
| `speclife_list` | `speclife worktree list` | CLI command |
|
|
21
|
+
|
|
22
|
+
### Why Migrate?
|
|
23
|
+
|
|
24
|
+
1. **No token configuration**: Slash commands use your editor's @github MCP
|
|
25
|
+
2. **Better integration**: Works with OpenSpec's existing commands
|
|
26
|
+
3. **Simpler setup**: No `GITHUB_TOKEN` or `ANTHROPIC_API_KEY` needed
|
|
27
|
+
|
|
28
|
+
### Setup Slash Commands
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Install CLI
|
|
32
|
+
npm install -g @speclife/cli
|
|
33
|
+
|
|
34
|
+
# Initialize project (creates slash commands)
|
|
35
|
+
speclife init
|
|
36
|
+
|
|
37
|
+
# Run AI-guided setup
|
|
38
|
+
/speclife setup
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Continued Support
|
|
42
|
+
|
|
43
|
+
The MCP server remains available for:
|
|
44
|
+
- CI/automation scenarios
|
|
45
|
+
- Editors without slash command support
|
|
46
|
+
- Gradual migration
|
|
47
|
+
|
|
48
|
+
No breaking changes are planned. The server will continue to work as-is.
|
|
49
|
+
|
|
50
|
+
## Installation
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
npm install -g @speclife/mcp-server
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Configuration
|
|
57
|
+
|
|
58
|
+
Add to your MCP configuration:
|
|
59
|
+
|
|
60
|
+
### Claude Desktop
|
|
61
|
+
|
|
62
|
+
```json
|
|
63
|
+
{
|
|
64
|
+
"mcpServers": {
|
|
65
|
+
"speclife": {
|
|
66
|
+
"command": "speclife-mcp",
|
|
67
|
+
"env": {
|
|
68
|
+
"GITHUB_TOKEN": "ghp_xxxx"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Cursor
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"mcpServers": {
|
|
80
|
+
"speclife": {
|
|
81
|
+
"command": "speclife-mcp",
|
|
82
|
+
"env": {
|
|
83
|
+
"GITHUB_TOKEN": "ghp_xxxx"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Available Tools
|
|
91
|
+
|
|
92
|
+
All tools are deprecated. Use slash commands instead.
|
|
93
|
+
|
|
94
|
+
| Tool | Description | Replacement |
|
|
95
|
+
|------|-------------|-------------|
|
|
96
|
+
| `speclife_init` | Create worktree and scaffold proposal | `/speclife start` |
|
|
97
|
+
| `speclife_status` | Show change state and progress | `speclife status` |
|
|
98
|
+
| `speclife_list` | List all active changes | `speclife worktree list` |
|
|
99
|
+
| `speclife_submit` | Commit, push, create PR | `/speclife ship` |
|
|
100
|
+
| `speclife_merge` | Merge PR and cleanup | `/speclife land` |
|
|
101
|
+
| `speclife_implement` | AI-driven implementation | `/openspec-apply` |
|
|
102
|
+
| `speclife_release` | Create release PR | `/speclife release` |
|
|
103
|
+
|
|
104
|
+
## License
|
|
105
|
+
|
|
106
|
+
MIT
|
|
107
|
+
|
package/dist/index.d.ts
CHANGED
|
@@ -2,8 +2,20 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SpecLife MCP Server
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* ⚠️ DEPRECATED: This MCP server is deprecated in favor of slash commands.
|
|
6
|
+
*
|
|
7
|
+
* Use /speclife slash commands instead:
|
|
8
|
+
* - /speclife start → replaces speclife_init
|
|
9
|
+
* - /speclife ship → replaces speclife_submit
|
|
10
|
+
* - /speclife land → replaces speclife_merge
|
|
11
|
+
* - /speclife release → replaces speclife_release
|
|
12
|
+
* - /openspec-apply → replaces speclife_implement
|
|
13
|
+
*
|
|
14
|
+
* The MCP server remains available for:
|
|
15
|
+
* - CI/automation scenarios
|
|
16
|
+
* - Editors without slash command support
|
|
17
|
+
*
|
|
18
|
+
* See README.md for migration guide.
|
|
7
19
|
*/
|
|
8
20
|
export {};
|
|
9
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG"}
|
package/dist/index.js
CHANGED
|
@@ -2,8 +2,20 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* SpecLife MCP Server
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* ⚠️ DEPRECATED: This MCP server is deprecated in favor of slash commands.
|
|
6
|
+
*
|
|
7
|
+
* Use /speclife slash commands instead:
|
|
8
|
+
* - /speclife start → replaces speclife_init
|
|
9
|
+
* - /speclife ship → replaces speclife_submit
|
|
10
|
+
* - /speclife land → replaces speclife_merge
|
|
11
|
+
* - /speclife release → replaces speclife_release
|
|
12
|
+
* - /openspec-apply → replaces speclife_implement
|
|
13
|
+
*
|
|
14
|
+
* The MCP server remains available for:
|
|
15
|
+
* - CI/automation scenarios
|
|
16
|
+
* - Editors without slash command support
|
|
17
|
+
*
|
|
18
|
+
* See README.md for migration guide.
|
|
7
19
|
*/
|
|
8
20
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
9
21
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;GAiBG;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"}
|
|
@@ -1 +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,
|
|
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,CA0H7D"}
|
package/dist/tools/implement.js
CHANGED
|
@@ -15,7 +15,7 @@ const ImplementArgsSchema = z.object({
|
|
|
15
15
|
dryRun: z.boolean().optional().describe("Return the planned prompt/actions without executing (default: false)"),
|
|
16
16
|
});
|
|
17
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) => {
|
|
18
|
+
server.tool("speclife_implement", "[DEPRECATED: Use /openspec-apply slash command instead] 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
19
|
try {
|
|
20
20
|
const parsed = ImplementArgsSchema.parse(args);
|
|
21
21
|
const cwd = process.cwd();
|
|
@@ -67,35 +67,26 @@ export function registerImplementTool(server) {
|
|
|
67
67
|
lines.push('```');
|
|
68
68
|
}
|
|
69
69
|
else {
|
|
70
|
-
// Show output
|
|
70
|
+
// Show message/output
|
|
71
71
|
lines.push('## Output');
|
|
72
72
|
lines.push('');
|
|
73
|
-
if (result.
|
|
73
|
+
if (result.message) {
|
|
74
74
|
// Truncate if very long
|
|
75
75
|
const maxOutputLength = 3000;
|
|
76
|
-
if (result.
|
|
77
|
-
lines.push(result.
|
|
78
|
-
lines.push(`... (truncated, ${result.
|
|
76
|
+
if (result.message.length > maxOutputLength) {
|
|
77
|
+
lines.push(result.message.slice(0, maxOutputLength));
|
|
78
|
+
lines.push(`... (truncated, ${result.message.length - maxOutputLength} more characters)`);
|
|
79
79
|
}
|
|
80
80
|
else {
|
|
81
|
-
lines.push(result.
|
|
81
|
+
lines.push(result.message);
|
|
82
82
|
}
|
|
83
83
|
}
|
|
84
|
-
//
|
|
85
|
-
if (result.tasksCompleted
|
|
84
|
+
// Task summary
|
|
85
|
+
if (result.tasksAttempted > 0 || result.tasksCompleted > 0) {
|
|
86
86
|
lines.push('');
|
|
87
|
-
lines.push(
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
}
|
|
87
|
+
lines.push(`## Task Summary`);
|
|
88
|
+
lines.push(`- Attempted: ${result.tasksAttempted}`);
|
|
89
|
+
lines.push(`- Completed: ${result.tasksCompleted}`);
|
|
99
90
|
}
|
|
100
91
|
}
|
|
101
92
|
// Next steps based on mode and status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/tools/implement.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,iBAAiB,GAGlB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC3B,gDAAgD,CACjD;IACD,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtE,wHAAwH,CACzH;IACD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,iGAAiG,CAClG;IACD,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACrC,sEAAsE,CACvE;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,IAAI,CACT,oBAAoB,EACpB,
|
|
1
|
+
{"version":3,"file":"implement.js","sourceRoot":"","sources":["../../src/tools/implement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AASzE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAerD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { registerListTool } from "./list.js";
|
|
|
7
7
|
import { registerSubmitTool } from "./submit.js";
|
|
8
8
|
import { registerMergeTool } from "./merge.js";
|
|
9
9
|
import { registerImplementTool } from "./implement.js";
|
|
10
|
+
import { registerReleaseTool } from "./release.js";
|
|
10
11
|
/**
|
|
11
12
|
* Register all SpecLife tools with the MCP server
|
|
12
13
|
*/
|
|
@@ -20,5 +21,7 @@ export function registerTools(server) {
|
|
|
20
21
|
registerMergeTool(server);
|
|
21
22
|
// Phase 3: Implement (includes internal test loop)
|
|
22
23
|
registerImplementTool(server);
|
|
24
|
+
// Phase 5: Release management
|
|
25
|
+
registerReleaseTool(server);
|
|
23
26
|
}
|
|
24
27
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +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;
|
|
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;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD;;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;IAE9B,8BAA8B;IAC9B,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
|
package/dist/tools/init.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AA2BzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgFxD"}
|
package/dist/tools/init.js
CHANGED
|
@@ -3,16 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Initialize a new change: create branch and scaffold proposal
|
|
5
5
|
*/
|
|
6
|
-
import { loadConfig, createGitAdapter,
|
|
6
|
+
import { loadConfig, createGitAdapter, createOpenSpecAdapter, initWorkflow } from "@speclife/core";
|
|
7
7
|
import { z } from "zod";
|
|
8
8
|
const InitArgsSchema = z.object({
|
|
9
9
|
changeId: z.string().describe("Unique identifier for the change (kebab-case, e.g., 'add-user-auth')"),
|
|
10
10
|
description: z.string().optional().describe("Brief description of the change (populates proposal.md)"),
|
|
11
11
|
noWorktree: z.boolean().optional().describe("Disable worktree creation - create branch in current directory instead (default: false)"),
|
|
12
12
|
skipDraftPR: z.boolean().optional().describe("Skip creating a draft PR (overrides config.createDraftPR)"),
|
|
13
|
+
generateTasks: z.boolean().optional().describe("Use AI to generate implementation tasks based on the description (requires Claude CLI)"),
|
|
13
14
|
});
|
|
14
15
|
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
|
+
server.tool("speclife_init", "[DEPRECATED: Use /speclife start slash command instead] 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
17
|
try {
|
|
17
18
|
const parsed = InitArgsSchema.parse(args);
|
|
18
19
|
const cwd = process.cwd();
|
|
@@ -23,21 +24,14 @@ export function registerInitTool(server) {
|
|
|
23
24
|
projectRoot: cwd,
|
|
24
25
|
specDir: config.specDir
|
|
25
26
|
});
|
|
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
27
|
// Run workflow
|
|
35
28
|
const result = await initWorkflow({
|
|
36
29
|
changeId: parsed.changeId,
|
|
37
30
|
description: parsed.description,
|
|
38
31
|
noWorktree: parsed.noWorktree,
|
|
39
32
|
skipDraftPR: parsed.skipDraftPR,
|
|
40
|
-
|
|
33
|
+
generateTasks: parsed.generateTasks,
|
|
34
|
+
}, { git, openspec, config });
|
|
41
35
|
const lines = result.worktreePath
|
|
42
36
|
? [
|
|
43
37
|
`✓ Created worktree: ${result.worktreePath}`,
|
|
@@ -50,9 +44,12 @@ export function registerInitTool(server) {
|
|
|
50
44
|
`✓ Scaffolded proposal: ${result.proposalPath}`,
|
|
51
45
|
`✓ Scaffolded tasks: ${result.tasksPath}`,
|
|
52
46
|
];
|
|
53
|
-
// Add
|
|
54
|
-
if (result.
|
|
55
|
-
|
|
47
|
+
// Add bootstrap results if any
|
|
48
|
+
if (result.bootstrapResults && result.bootstrapResults.length > 0) {
|
|
49
|
+
const successful = result.bootstrapResults.filter(r => r.success);
|
|
50
|
+
if (successful.length > 0) {
|
|
51
|
+
lines.push(`✓ Bootstrapped environments: ${successful.map(r => r.environment).join(', ')}`);
|
|
52
|
+
}
|
|
56
53
|
}
|
|
57
54
|
lines.push("");
|
|
58
55
|
lines.push("Next steps:");
|
|
@@ -60,17 +57,15 @@ export function registerInitTool(server) {
|
|
|
60
57
|
lines.push(`1. cd ${result.worktreePath}`);
|
|
61
58
|
lines.push("2. Edit proposal.md to describe your change");
|
|
62
59
|
lines.push("3. Edit tasks.md to list implementation steps");
|
|
63
|
-
lines.push("4.
|
|
60
|
+
lines.push("4. Use /openspec-apply to implement tasks");
|
|
64
61
|
}
|
|
65
62
|
else {
|
|
66
63
|
lines.push("1. Edit proposal.md to describe your change");
|
|
67
64
|
lines.push("2. Edit tasks.md to list implementation steps");
|
|
68
|
-
lines.push("3.
|
|
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!`);
|
|
65
|
+
lines.push("3. Use /openspec-apply to implement tasks");
|
|
73
66
|
}
|
|
67
|
+
lines.push("");
|
|
68
|
+
lines.push("Note: Use /speclife start slash command for a better experience.");
|
|
74
69
|
return {
|
|
75
70
|
content: [{ type: "text", text: lines.join("\n") }],
|
|
76
71
|
};
|
package/dist/tools/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/list.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* speclife_list tool
|
|
3
3
|
*
|
|
4
|
-
* List all active changes
|
|
4
|
+
* List all active changes with progress, PR status, and timestamps
|
|
5
5
|
*/
|
|
6
6
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
7
|
export declare function registerListTool(server: McpServer): void;
|
package/dist/tools/list.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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;AAyEzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkHxD"}
|
package/dist/tools/list.js
CHANGED
|
@@ -1,14 +1,63 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* speclife_list tool
|
|
3
3
|
*
|
|
4
|
-
* List all active changes
|
|
4
|
+
* List all active changes with progress, PR status, and timestamps
|
|
5
5
|
*/
|
|
6
|
-
import { loadConfig, createGitAdapter, createOpenSpecAdapter, statusWorkflow } from "@speclife/core";
|
|
6
|
+
import { loadConfig, createGitAdapter, createGitHubAdapter, createOpenSpecAdapter, statusWorkflow, formatCompactLine, formatTable, formatSummary, sortItems, filterByStatus, } from "@speclife/core";
|
|
7
7
|
import { z } from "zod";
|
|
8
|
-
const ListArgsSchema = z.object({
|
|
8
|
+
const ListArgsSchema = z.object({
|
|
9
|
+
compact: z.boolean().optional().describe("Show compact single-line output per change (default: false)"),
|
|
10
|
+
status: z.enum(['draft', 'ready', 'merged', 'closed', 'local']).optional().describe("Filter by PR status: draft, ready, merged, closed, or local"),
|
|
11
|
+
sort: z.enum(['activity', 'progress', 'name']).optional().describe("Sort by: activity (default), progress, or name"),
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Calculate progress from task summary
|
|
15
|
+
*/
|
|
16
|
+
function calculateProgress(completed, total) {
|
|
17
|
+
return {
|
|
18
|
+
completed,
|
|
19
|
+
total,
|
|
20
|
+
percentage: total > 0 ? Math.round((completed / total) * 100) : 0,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get PR status for a branch
|
|
25
|
+
*/
|
|
26
|
+
async function getPRStatus(github, branch) {
|
|
27
|
+
try {
|
|
28
|
+
const pr = await github.getPullRequestByBranch(branch);
|
|
29
|
+
if (!pr) {
|
|
30
|
+
return { status: 'local' };
|
|
31
|
+
}
|
|
32
|
+
let status;
|
|
33
|
+
if (pr.state === 'merged') {
|
|
34
|
+
status = 'merged';
|
|
35
|
+
}
|
|
36
|
+
else if (pr.state === 'closed') {
|
|
37
|
+
status = 'closed';
|
|
38
|
+
}
|
|
39
|
+
else if (pr.draft) {
|
|
40
|
+
status = 'draft';
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
status = 'ready';
|
|
44
|
+
}
|
|
45
|
+
return { status, number: pr.number, url: pr.url };
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
// If GitHub lookup fails, treat as local
|
|
49
|
+
return { status: 'local' };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
9
52
|
export function registerListTool(server) {
|
|
10
|
-
server.tool("speclife_list", "List all active changes
|
|
53
|
+
server.tool("speclife_list", "[DEPRECATED: Use speclife worktree list CLI command instead] List all active changes with progress bars, PR status, and last activity timestamps", ListArgsSchema.shape, async (args) => {
|
|
11
54
|
try {
|
|
55
|
+
const parsed = ListArgsSchema.parse(args);
|
|
56
|
+
const options = {
|
|
57
|
+
compact: parsed.compact,
|
|
58
|
+
status: parsed.status,
|
|
59
|
+
sort: parsed.sort,
|
|
60
|
+
};
|
|
12
61
|
const cwd = process.cwd();
|
|
13
62
|
// Load config and create adapters
|
|
14
63
|
const config = await loadConfig(cwd);
|
|
@@ -17,26 +66,75 @@ export function registerListTool(server) {
|
|
|
17
66
|
projectRoot: cwd,
|
|
18
67
|
specDir: config.specDir
|
|
19
68
|
});
|
|
69
|
+
// Create GitHub adapter for PR lookups
|
|
70
|
+
let github = null;
|
|
71
|
+
try {
|
|
72
|
+
github = createGitHubAdapter(config.github.owner, config.github.repo);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
// GitHub not configured, will show all as "local"
|
|
76
|
+
}
|
|
20
77
|
// List changes
|
|
21
78
|
const changeIds = await openspec.listChanges();
|
|
22
79
|
if (changeIds.length === 0) {
|
|
23
80
|
return {
|
|
24
81
|
content: [{
|
|
25
82
|
type: "text",
|
|
26
|
-
text: "No active changes. Use speclife_init to create one.",
|
|
83
|
+
text: "No active changes. Use `speclife_init` to create one.",
|
|
27
84
|
}],
|
|
28
85
|
};
|
|
29
86
|
}
|
|
30
|
-
//
|
|
31
|
-
const
|
|
87
|
+
// Collect enriched data for each change
|
|
88
|
+
const items = [];
|
|
32
89
|
for (const changeId of changeIds) {
|
|
33
90
|
const result = await statusWorkflow({ changeId }, { git, openspec });
|
|
34
|
-
if (result)
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
91
|
+
if (!result)
|
|
92
|
+
continue;
|
|
93
|
+
const { change, taskSummary, onBranch } = result;
|
|
94
|
+
const branch = `spec/${changeId}`;
|
|
95
|
+
// Get PR status
|
|
96
|
+
let prInfo = { status: 'local' };
|
|
97
|
+
if (github) {
|
|
98
|
+
prInfo = await getPRStatus(github, branch);
|
|
99
|
+
}
|
|
100
|
+
// Get last activity (use change createdAt as fallback)
|
|
101
|
+
const lastActive = change.createdAt;
|
|
102
|
+
items.push({
|
|
103
|
+
id: changeId,
|
|
104
|
+
progress: calculateProgress(taskSummary.completed, taskSummary.total),
|
|
105
|
+
prStatus: prInfo.status,
|
|
106
|
+
prNumber: prInfo.number,
|
|
107
|
+
prUrl: prInfo.url,
|
|
108
|
+
lastActive,
|
|
109
|
+
isCurrent: onBranch,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
// Filter and sort
|
|
113
|
+
let filtered = filterByStatus(items, options.status);
|
|
114
|
+
const sorted = sortItems(filtered, options.sort ?? 'activity');
|
|
115
|
+
// Format output
|
|
116
|
+
const lines = [];
|
|
117
|
+
if (options.status) {
|
|
118
|
+
lines.push(`# Changes (filtered: ${options.status})`, '');
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
lines.push('# Active Changes', '');
|
|
122
|
+
}
|
|
123
|
+
if (sorted.length === 0) {
|
|
124
|
+
lines.push('No changes match the filter.');
|
|
125
|
+
}
|
|
126
|
+
else if (options.compact) {
|
|
127
|
+
// Compact format
|
|
128
|
+
for (const item of sorted) {
|
|
129
|
+
lines.push(formatCompactLine(item));
|
|
38
130
|
}
|
|
39
131
|
}
|
|
132
|
+
else {
|
|
133
|
+
// Table format
|
|
134
|
+
lines.push(formatTable(sorted));
|
|
135
|
+
}
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push(formatSummary(items)); // Use unfiltered items for summary
|
|
40
138
|
return {
|
|
41
139
|
content: [{ type: "text", text: lines.join("\n") }],
|
|
42
140
|
};
|
package/dist/tools/list.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/merge.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* speclife_merge tool
|
|
3
3
|
*
|
|
4
|
-
* Merge PR, sync main, cleanup worktree/branch
|
|
4
|
+
* Merge PR, sync main, cleanup worktree/branch.
|
|
5
|
+
* Optionally auto-releases based on config (auto for patch/minor, manual for major).
|
|
5
6
|
*/
|
|
6
7
|
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
7
8
|
export declare function registerMergeTool(server: McpServer): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgCzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuJzD"}
|
package/dist/tools/merge.js
CHANGED
|
@@ -1,67 +1,132 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* speclife_merge tool
|
|
3
3
|
*
|
|
4
|
-
* Merge PR, sync main, cleanup worktree/branch
|
|
4
|
+
* Merge PR, sync main, cleanup worktree/branch.
|
|
5
|
+
* Optionally auto-releases based on config (auto for patch/minor, manual for major).
|
|
5
6
|
*/
|
|
6
|
-
import { loadConfig, createGitAdapter, createGitHubAdapter,
|
|
7
|
+
import { loadConfig, createGitAdapter, createGitHubAdapter, mergeWorkflow, releaseWorkflow, suggestVersionBump, parseConventionalCommit, isAutoReleaseAllowed, } from "@speclife/core";
|
|
7
8
|
import { z } from "zod";
|
|
8
9
|
const MergeArgsSchema = z.object({
|
|
9
10
|
changeId: z.string().describe("Change ID to merge (e.g., 'add-user-auth')"),
|
|
10
11
|
method: z.enum(['squash', 'merge', 'rebase']).optional().describe("Merge method: 'squash' (default), 'merge', or 'rebase'"),
|
|
11
12
|
deleteBranch: z.boolean().optional().describe("Delete local branch after merge (default: true)"),
|
|
12
13
|
removeWorktree: z.boolean().optional().describe("Remove worktree after merge if applicable (default: true)"),
|
|
13
|
-
|
|
14
|
+
skipRelease: z.boolean().optional().describe("Skip auto-release even if enabled in config (default: false)"),
|
|
14
15
|
});
|
|
15
16
|
export function registerMergeTool(server) {
|
|
16
|
-
server.tool("speclife_merge", "Merge a submitted PR, sync main branch, cleanup local branch/worktree
|
|
17
|
+
server.tool("speclife_merge", "[DEPRECATED: Use /speclife land slash command instead] Merge a submitted PR, sync main branch, and cleanup local branch/worktree. Auto-creates release PR for patch/minor bumps (configurable).", MergeArgsSchema.shape, async (args) => {
|
|
17
18
|
try {
|
|
18
19
|
const parsed = MergeArgsSchema.parse(args);
|
|
19
20
|
const cwd = process.cwd();
|
|
20
21
|
// Load config and create adapters
|
|
21
22
|
const config = await loadConfig(cwd);
|
|
22
23
|
const git = createGitAdapter(cwd);
|
|
23
|
-
const github = createGitHubAdapter(
|
|
24
|
-
|
|
25
|
-
repo: config.github.repo,
|
|
26
|
-
});
|
|
27
|
-
// Create optional adapters for version analysis
|
|
28
|
-
const versionBump = parsed.versionBump ?? 'auto';
|
|
29
|
-
const claudeCli = versionBump === 'auto' ? createClaudeCliAdapter() : undefined;
|
|
30
|
-
const openspec = versionBump === 'auto' ? createOpenSpecAdapter({ projectRoot: cwd }) : undefined;
|
|
31
|
-
// Run workflow
|
|
24
|
+
const github = createGitHubAdapter(config.github.owner, config.github.repo);
|
|
25
|
+
// Run merge workflow
|
|
32
26
|
const result = await mergeWorkflow({
|
|
33
27
|
changeId: parsed.changeId,
|
|
34
28
|
method: parsed.method,
|
|
35
29
|
deleteBranch: parsed.deleteBranch,
|
|
36
30
|
removeWorktree: parsed.removeWorktree,
|
|
37
|
-
|
|
38
|
-
}, { git, github, config, claudeCli, openspec });
|
|
31
|
+
}, { git, github, config });
|
|
39
32
|
const lines = [
|
|
40
33
|
`✓ Merged PR #${result.pullRequest.number}: ${result.pullRequest.url}`,
|
|
41
34
|
];
|
|
42
35
|
if (result.mainSynced) {
|
|
43
36
|
lines.push(`✓ Synced ${config.github.baseBranch} with latest changes`);
|
|
44
37
|
}
|
|
45
|
-
// Show version analysis and bump info
|
|
46
|
-
if (result.versionAnalysis) {
|
|
47
|
-
lines.push('');
|
|
48
|
-
lines.push(`📊 Version Analysis:`);
|
|
49
|
-
lines.push(` Bump: ${result.versionAnalysis.bump}`);
|
|
50
|
-
lines.push(` Reasoning: ${result.versionAnalysis.reasoning}`);
|
|
51
|
-
}
|
|
52
|
-
if (result.newVersion) {
|
|
53
|
-
lines.push(`✓ Bumped version to v${result.newVersion}`);
|
|
54
|
-
lines.push(`✓ Pushed version commit to ${config.github.baseBranch}`);
|
|
55
|
-
}
|
|
56
38
|
if (result.branchDeleted) {
|
|
57
39
|
lines.push(`✓ Deleted local branch spec/${parsed.changeId}`);
|
|
58
40
|
}
|
|
59
41
|
if (result.worktreeRemoved) {
|
|
60
42
|
lines.push(`✓ Removed worktree at ${result.worktreePath}`);
|
|
61
43
|
}
|
|
62
|
-
lines.push(''
|
|
63
|
-
|
|
64
|
-
|
|
44
|
+
lines.push('');
|
|
45
|
+
lines.push('Change complete! You are now on the main branch with the merged changes.');
|
|
46
|
+
// Auto-release analysis (if not skipped)
|
|
47
|
+
if (!parsed.skipRelease) {
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push('---');
|
|
50
|
+
lines.push('');
|
|
51
|
+
try {
|
|
52
|
+
// Create git adapter for main repo
|
|
53
|
+
const mainRepoPath = result.repoPath || cwd;
|
|
54
|
+
const mainGit = createGitAdapter(mainRepoPath);
|
|
55
|
+
// Get latest tag and commits
|
|
56
|
+
const latestTag = await mainGit.getLatestTag();
|
|
57
|
+
const previousVersion = latestTag ? latestTag.replace(/^v/, '') : '0.0.0';
|
|
58
|
+
const rawCommits = latestTag
|
|
59
|
+
? await mainGit.getCommitsSince(latestTag)
|
|
60
|
+
: await mainGit.getCommitsSince('HEAD~10');
|
|
61
|
+
if (rawCommits.length > 0) {
|
|
62
|
+
// Parse commits
|
|
63
|
+
const commits = rawCommits.map(({ sha, message }) => {
|
|
64
|
+
const parsed = parseConventionalCommit(message);
|
|
65
|
+
return {
|
|
66
|
+
sha,
|
|
67
|
+
message,
|
|
68
|
+
type: parsed.type,
|
|
69
|
+
scope: parsed.scope,
|
|
70
|
+
isBreaking: parsed.isBreaking,
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
// Determine bump type
|
|
74
|
+
const bumpType = suggestVersionBump(commits, previousVersion);
|
|
75
|
+
// Check if auto-release is allowed
|
|
76
|
+
const autoReleaseAllowed = isAutoReleaseAllowed(config, bumpType);
|
|
77
|
+
lines.push(`📊 **Release Analysis**`);
|
|
78
|
+
lines.push(` Commits since ${latestTag || 'start'}: ${commits.length}`);
|
|
79
|
+
lines.push(` Suggested bump: **${bumpType}** (${previousVersion} → next)`);
|
|
80
|
+
lines.push('');
|
|
81
|
+
if (autoReleaseAllowed) {
|
|
82
|
+
// Auto-release with auto-merge for patch/minor
|
|
83
|
+
const enableAutoMerge = bumpType !== 'major';
|
|
84
|
+
lines.push(`✨ Auto-release enabled for ${bumpType} bumps. Creating release PR...`);
|
|
85
|
+
lines.push('');
|
|
86
|
+
const releaseResult = await releaseWorkflow({ dryRun: false, autoMerge: enableAutoMerge }, { git: mainGit, github, repoPath: mainRepoPath });
|
|
87
|
+
lines.push(`✓ Created release PR: ${releaseResult.prUrl}`);
|
|
88
|
+
lines.push(` Version: ${releaseResult.previousVersion} → ${releaseResult.version}`);
|
|
89
|
+
if (releaseResult.autoMergeEnabled) {
|
|
90
|
+
lines.push(` 🤖 Auto-merge enabled - will merge when CI passes`);
|
|
91
|
+
lines.push('');
|
|
92
|
+
lines.push('**Release will happen automatically once CI passes!**');
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
lines.push('');
|
|
96
|
+
lines.push('**Next:** Review and merge the release PR to publish.');
|
|
97
|
+
lines.push('(Auto-merge not available - enable in repo settings for fully automated releases)');
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Manual release required (major bump)
|
|
102
|
+
lines.push(`⚠️ **Manual release required** (${bumpType} bump)`);
|
|
103
|
+
lines.push('');
|
|
104
|
+
if (bumpType === 'major') {
|
|
105
|
+
lines.push('Major releases require explicit confirmation. Run:');
|
|
106
|
+
lines.push('```');
|
|
107
|
+
lines.push('speclife_release --major');
|
|
108
|
+
lines.push('```');
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
lines.push(`Auto-release disabled for ${bumpType} in config. Run:`);
|
|
112
|
+
lines.push('```');
|
|
113
|
+
lines.push('speclife_release');
|
|
114
|
+
lines.push('```');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
lines.push('💡 No commits since last release. Run `speclife_release` when ready.');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch (releaseError) {
|
|
123
|
+
// Release analysis/creation failed - not critical
|
|
124
|
+
lines.push('💡 Ready to release? Run `speclife_release` to create a release PR.');
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
lines.push('');
|
|
129
|
+
lines.push('💡 Ready to release? Run `speclife_release` to create a release PR.');
|
|
65
130
|
}
|
|
66
131
|
return {
|
|
67
132
|
content: [{ type: "text", text: lines.join("\n") }],
|
package/dist/tools/merge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* speclife_release tool
|
|
3
|
+
*
|
|
4
|
+
* Create a release PR with AI-driven version decisions.
|
|
5
|
+
* Analyzes commits since last release and suggests appropriate version bump.
|
|
6
|
+
*/
|
|
7
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
8
|
+
export declare function registerReleaseTool(server: McpServer): void;
|
|
9
|
+
//# sourceMappingURL=release.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../src/tools/release.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAkCzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmJ3D"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* speclife_release tool
|
|
3
|
+
*
|
|
4
|
+
* Create a release PR with AI-driven version decisions.
|
|
5
|
+
* Analyzes commits since last release and suggests appropriate version bump.
|
|
6
|
+
*/
|
|
7
|
+
import { loadConfig, createGitAdapter, createGitHubAdapter, releaseWorkflow, bumpVersion, } from "@speclife/core";
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
const ReleaseArgsSchema = z.object({
|
|
10
|
+
version: z.string().optional().describe("Explicit version to release (e.g., '0.2.0'). If not provided, version is suggested based on commit analysis."),
|
|
11
|
+
major: z.boolean().optional().describe("Force a major version bump (e.g., 0.x.x → 1.0.0). Use for intentional breaking releases."),
|
|
12
|
+
minor: z.boolean().optional().describe("Force a minor version bump (e.g., 0.1.x → 0.2.0)."),
|
|
13
|
+
patch: z.boolean().optional().describe("Force a patch version bump (e.g., 0.1.0 → 0.1.1)."),
|
|
14
|
+
dryRun: z.boolean().optional().describe("Show what would be released without making changes (default: false)"),
|
|
15
|
+
skipChangelog: z.boolean().optional().describe("Skip changelog generation (default: false)"),
|
|
16
|
+
autoMerge: z.boolean().optional().describe("Enable auto-merge on the release PR (default: true for patch/minor, false for major). Requires repo settings to allow auto-merge."),
|
|
17
|
+
});
|
|
18
|
+
export function registerReleaseTool(server) {
|
|
19
|
+
server.tool("speclife_release", "[DEPRECATED: Use /speclife release slash command instead] Create a release PR with version bump and changelog. Analyzes commits since last release to suggest appropriate version. Use --major for intentional breaking releases, --minor/--patch to override suggestions.", ReleaseArgsSchema.shape, async (args) => {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = ReleaseArgsSchema.parse(args);
|
|
22
|
+
const cwd = process.cwd();
|
|
23
|
+
// Load config and create adapters
|
|
24
|
+
const config = await loadConfig(cwd);
|
|
25
|
+
const git = createGitAdapter(cwd);
|
|
26
|
+
const github = createGitHubAdapter(config.github.owner, config.github.repo);
|
|
27
|
+
// Determine version from flags
|
|
28
|
+
let version = parsed.version;
|
|
29
|
+
let forcedBumpType;
|
|
30
|
+
if (!version) {
|
|
31
|
+
// Check for forced bump type flags
|
|
32
|
+
if (parsed.major) {
|
|
33
|
+
forcedBumpType = 'major';
|
|
34
|
+
}
|
|
35
|
+
else if (parsed.minor) {
|
|
36
|
+
forcedBumpType = 'minor';
|
|
37
|
+
}
|
|
38
|
+
else if (parsed.patch) {
|
|
39
|
+
forcedBumpType = 'patch';
|
|
40
|
+
}
|
|
41
|
+
// If forced bump, calculate version now
|
|
42
|
+
if (forcedBumpType) {
|
|
43
|
+
const latestTag = await git.getLatestTag();
|
|
44
|
+
const previousVersion = latestTag ? latestTag.replace(/^v/, '') : '0.0.0';
|
|
45
|
+
version = bumpVersion(previousVersion, forcedBumpType);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Determine auto-merge: default to true for patch/minor, false for major
|
|
49
|
+
// User can override with explicit --autoMerge flag
|
|
50
|
+
const shouldAutoMerge = parsed.autoMerge ?? (forcedBumpType !== 'major');
|
|
51
|
+
// Run workflow
|
|
52
|
+
const result = await releaseWorkflow({
|
|
53
|
+
version,
|
|
54
|
+
dryRun: parsed.dryRun,
|
|
55
|
+
skipChangelog: parsed.skipChangelog,
|
|
56
|
+
autoMerge: shouldAutoMerge,
|
|
57
|
+
}, { git, github, repoPath: cwd });
|
|
58
|
+
const lines = [];
|
|
59
|
+
if (parsed.dryRun) {
|
|
60
|
+
lines.push('🔍 **Dry Run** - No changes made');
|
|
61
|
+
lines.push('');
|
|
62
|
+
}
|
|
63
|
+
lines.push(`## Version: ${result.previousVersion} → ${result.version}`);
|
|
64
|
+
// Show if bump was forced or auto-detected
|
|
65
|
+
if (forcedBumpType) {
|
|
66
|
+
lines.push(`Bump type: **${forcedBumpType}** (forced via --${forcedBumpType})`);
|
|
67
|
+
}
|
|
68
|
+
else if (parsed.version) {
|
|
69
|
+
lines.push(`Bump type: **${result.bumpType}** (explicit version provided)`);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
lines.push(`Bump type: **${result.bumpType}** (auto-detected from commits)`);
|
|
73
|
+
}
|
|
74
|
+
lines.push('');
|
|
75
|
+
// Commits summary
|
|
76
|
+
lines.push(`### Commits (${result.commits.length})`);
|
|
77
|
+
const breaking = result.commits.filter(c => c.isBreaking);
|
|
78
|
+
const features = result.commits.filter(c => c.type === 'feat');
|
|
79
|
+
const fixes = result.commits.filter(c => c.type === 'fix');
|
|
80
|
+
if (breaking.length > 0) {
|
|
81
|
+
lines.push(`- ⚠️ ${breaking.length} breaking change(s)`);
|
|
82
|
+
}
|
|
83
|
+
if (features.length > 0) {
|
|
84
|
+
lines.push(`- ✨ ${features.length} feature(s)`);
|
|
85
|
+
}
|
|
86
|
+
if (fixes.length > 0) {
|
|
87
|
+
lines.push(`- 🐛 ${fixes.length} fix(es)`);
|
|
88
|
+
}
|
|
89
|
+
lines.push('');
|
|
90
|
+
// Commit list
|
|
91
|
+
lines.push('**Changes:**');
|
|
92
|
+
for (const commit of result.commits.slice(0, 10)) {
|
|
93
|
+
const icon = commit.isBreaking ? '⚠️' : commit.type === 'feat' ? '✨' : commit.type === 'fix' ? '🐛' : '📝';
|
|
94
|
+
lines.push(`- ${icon} ${commit.message.slice(0, 80)}${commit.message.length > 80 ? '...' : ''}`);
|
|
95
|
+
}
|
|
96
|
+
if (result.commits.length > 10) {
|
|
97
|
+
lines.push(`- ... and ${result.commits.length - 10} more`);
|
|
98
|
+
}
|
|
99
|
+
lines.push('');
|
|
100
|
+
if (!parsed.dryRun) {
|
|
101
|
+
lines.push('---');
|
|
102
|
+
lines.push(`✓ Created release branch: ${result.branch}`);
|
|
103
|
+
lines.push(`✓ Updated package versions to ${result.version}`);
|
|
104
|
+
if (result.changelog) {
|
|
105
|
+
lines.push('✓ Generated changelog');
|
|
106
|
+
}
|
|
107
|
+
lines.push(`✓ Created PR: ${result.prUrl}`);
|
|
108
|
+
if (result.autoMergeEnabled) {
|
|
109
|
+
lines.push(`✓ 🤖 Auto-merge enabled - will merge when CI passes`);
|
|
110
|
+
lines.push('');
|
|
111
|
+
lines.push('**Release will happen automatically once CI passes!**');
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
lines.push('');
|
|
115
|
+
lines.push('**Next steps:**');
|
|
116
|
+
lines.push('1. Review and merge the release PR');
|
|
117
|
+
lines.push('2. CI will automatically create git tag and GitHub release');
|
|
118
|
+
lines.push('3. CI will publish packages to npm');
|
|
119
|
+
if (shouldAutoMerge) {
|
|
120
|
+
lines.push('');
|
|
121
|
+
lines.push('💡 Auto-merge was requested but not available. Enable in repo settings for fully automated releases.');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
lines.push('---');
|
|
127
|
+
lines.push('Run `speclife_release` without `--dry-run` to create the release PR.');
|
|
128
|
+
if (parsed.version) {
|
|
129
|
+
lines.push(`Using explicit version: ${parsed.version}`);
|
|
130
|
+
}
|
|
131
|
+
else if (forcedBumpType) {
|
|
132
|
+
lines.push(`Forced ${forcedBumpType} bump → ${result.version}`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
lines.push(`Suggested version: ${result.version} (based on commit analysis)`);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
content: [{ type: "text", text: lines.join("\n") }],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
144
|
+
return {
|
|
145
|
+
content: [{ type: "text", text: `Error: ${message}` }],
|
|
146
|
+
isError: true,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/tools/release.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/status.js
CHANGED
|
@@ -9,7 +9,7 @@ const StatusArgsSchema = z.object({
|
|
|
9
9
|
changeId: z.string().optional().describe("Change ID to get status for (uses current branch if not provided)"),
|
|
10
10
|
});
|
|
11
11
|
export function registerStatusTool(server) {
|
|
12
|
-
server.tool("speclife_status", "Show the current state and progress of a change", StatusArgsSchema.shape, async (args) => {
|
|
12
|
+
server.tool("speclife_status", "[DEPRECATED: Use speclife status CLI command instead] Show the current state and progress of a change", StatusArgsSchema.shape, async (args) => {
|
|
13
13
|
try {
|
|
14
14
|
const parsed = StatusArgsSchema.parse(args);
|
|
15
15
|
const cwd = process.cwd();
|
package/dist/tools/status.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.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,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACtC,mEAAmE,CACpE;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB,
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/tools/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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;
|
|
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;AA4BzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyF1D"}
|
package/dist/tools/submit.js
CHANGED
|
@@ -9,19 +9,18 @@ const SubmitArgsSchema = z.object({
|
|
|
9
9
|
changeId: z.string().describe("Change ID to submit (e.g., 'add-user-auth')"),
|
|
10
10
|
draft: z.boolean().optional().describe("Create PR as draft (default: false)"),
|
|
11
11
|
commitMessage: z.string().optional().describe("Custom commit message (defaults to proposal-based message)"),
|
|
12
|
+
skipValidation: z.boolean().optional().describe("Skip spec validation before submitting (default: false)"),
|
|
13
|
+
strict: z.boolean().optional().describe("Enable strict validation mode - fail on any warnings (default: false)"),
|
|
12
14
|
});
|
|
13
15
|
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) => {
|
|
16
|
+
server.tool("speclife_submit", "[DEPRECATED: Use /speclife ship slash command instead] Submit a change: validate spec, commit all changes, push to remote, create GitHub PR, and archive the change", SubmitArgsSchema.shape, async (args) => {
|
|
15
17
|
try {
|
|
16
18
|
const parsed = SubmitArgsSchema.parse(args);
|
|
17
19
|
const cwd = process.cwd();
|
|
18
20
|
// Load config and create adapters
|
|
19
21
|
const config = await loadConfig(cwd);
|
|
20
22
|
const git = createGitAdapter(cwd);
|
|
21
|
-
const github = createGitHubAdapter(
|
|
22
|
-
owner: config.github.owner,
|
|
23
|
-
repo: config.github.repo,
|
|
24
|
-
});
|
|
23
|
+
const github = createGitHubAdapter(config.github.owner, config.github.repo);
|
|
25
24
|
const openspec = createOpenSpecAdapter({
|
|
26
25
|
projectRoot: cwd,
|
|
27
26
|
specDir: config.specDir
|
|
@@ -31,11 +30,28 @@ export function registerSubmitTool(server) {
|
|
|
31
30
|
changeId: parsed.changeId,
|
|
32
31
|
draft: parsed.draft,
|
|
33
32
|
commitMessage: parsed.commitMessage,
|
|
33
|
+
skipValidation: parsed.skipValidation,
|
|
34
|
+
strict: parsed.strict,
|
|
34
35
|
}, { git, github, openspec, config });
|
|
35
|
-
const lines = [
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
const lines = [];
|
|
37
|
+
// Show validation results if validation was run
|
|
38
|
+
if (result.validation) {
|
|
39
|
+
const statusEmoji = result.validation.status === 'pass' ? '✅' :
|
|
40
|
+
result.validation.status === 'pass_with_warnings' ? '⚠️' : '❌';
|
|
41
|
+
lines.push(`${statusEmoji} Spec Validation: ${result.validation.status.replace(/_/g, ' ').toUpperCase()}`);
|
|
42
|
+
if (result.validation.errors.length > 0) {
|
|
43
|
+
for (const error of result.validation.errors) {
|
|
44
|
+
lines.push(` ❌ ${error}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (result.validation.warnings.length > 0) {
|
|
48
|
+
for (const warning of result.validation.warnings) {
|
|
49
|
+
lines.push(` ⚠️ ${warning}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
lines.push('');
|
|
53
|
+
}
|
|
54
|
+
lines.push(`✓ Committed: ${result.commitSha.slice(0, 7)}`, `✓ Pushed to: origin/${result.branch}`);
|
|
39
55
|
if (result.prCreated) {
|
|
40
56
|
lines.push(`✓ Created PR #${result.pullRequest.number}: ${result.pullRequest.url}`);
|
|
41
57
|
}
|
package/dist/tools/submit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/tools/submit.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,mBAAmB,EACnB,qBAAqB,EACrB,cAAc,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC3B,6CAA6C,CAC9C;IACD,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACpC,qCAAqC,CACtC;IACD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC3C,4DAA4D,CAC7D;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,IAAI,CACT,iBAAiB,EACjB
|
|
1
|
+
{"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/tools/submit.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@speclife/mcp-server",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "MCP server for SpecLife - AI assistant interface",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"build": "tsc",
|
|
18
18
|
"start": "node dist/index.js",
|
|
19
19
|
"dev": "tsc --watch",
|
|
20
|
-
"test": "vitest run
|
|
20
|
+
"test": "vitest run",
|
|
21
21
|
"typecheck": "tsc --noEmit"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|