@speclife/mcp-server 0.1.7 → 0.2.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.
@@ -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;AAQzE;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAYrD"}
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"}
@@ -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
@@ -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;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"}
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"}
@@ -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;AAyBzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuFxD"}
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;AA4BzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoGxD"}
@@ -10,6 +10,7 @@ const InitArgsSchema = z.object({
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
16
  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) => {
@@ -37,6 +38,7 @@ export function registerInitTool(server) {
37
38
  description: parsed.description,
38
39
  noWorktree: parsed.noWorktree,
39
40
  skipDraftPR: parsed.skipDraftPR,
41
+ generateTasks: parsed.generateTasks,
40
42
  }, { git, openspec, config, github });
41
43
  const lines = result.worktreePath
42
44
  ? [
@@ -50,6 +52,17 @@ export function registerInitTool(server) {
50
52
  `✓ Scaffolded proposal: ${result.proposalPath}`,
51
53
  `✓ Scaffolded tasks: ${result.tasksPath}`,
52
54
  ];
55
+ // Add task generation info
56
+ if (result.tasksGenerated) {
57
+ lines.push(`✓ Generated tasks with AI`);
58
+ if (result.tasksPreview) {
59
+ lines.push('');
60
+ lines.push('Generated tasks preview:');
61
+ lines.push('```');
62
+ lines.push(result.tasksPreview);
63
+ lines.push('```');
64
+ }
65
+ }
53
66
  // Add PR info if created
54
67
  if (result.pullRequest) {
55
68
  lines.push(`✓ Created draft PR #${result.pullRequest.number}: ${result.pullRequest.url}`);
@@ -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,mBAAmB,EACnB,qBAAqB,EACrB,YAAY,EACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC3B,sEAAsE,CACvE;IACD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACzC,yDAAyD,CAC1D;IACD,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACzC,yFAAyF,CAC1F;IACD,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC1C,2DAA2D,CAC5D;CACF,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,IAAI,CACT,eAAe,EACf,iJAAiJ,EACjJ,cAAc,CAAC,KAAK,EACpB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC1C,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,wDAAwD;YACxD,MAAM,mBAAmB,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YACxE,MAAM,MAAM,GAAG,mBAAmB;gBAChC,CAAC,CAAC,mBAAmB,CAAC;oBAClB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;oBAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI;iBACzB,CAAC;gBACJ,CAAC,CAAC,SAAS,CAAC;YAEd,eAAe;YACf,MAAM,MAAM,GAAG,MAAM,YAAY,CAC/B;gBACE,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;aAChC,EACD,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAClC,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY;gBAC/B,CAAC,CAAC;oBACE,uBAAuB,MAAM,CAAC,YAAY,EAAE;oBAC5C,qBAAqB,MAAM,CAAC,MAAM,EAAE;oBACpC,0BAA0B,MAAM,CAAC,YAAY,EAAE;oBAC/C,uBAAuB,MAAM,CAAC,SAAS,EAAE;iBAC1C;gBACH,CAAC,CAAC;oBACE,qBAAqB,MAAM,CAAC,MAAM,EAAE;oBACpC,0BAA0B,MAAM,CAAC,YAAY,EAAE;oBAC/C,uBAAuB,MAAM,CAAC,SAAS,EAAE;iBAC1C,CAAC;YAEN,yBAAyB;YACzB,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5F,CAAC;YAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAE1B,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;gBAC3C,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAC5E,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;gBAC1D,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;gBAC5D,KAAK,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;YAC5E,CAAC;YAED,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;gBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,WAAW,CAAC,GAAG,iCAAiC,CAAC,CAAC;YACnG,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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/tools/init.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * speclife_list tool
3
3
  *
4
- * List all active changes in the project
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;
@@ -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;AAWzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAyDxD"}
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,CAqHxD"}
@@ -1,14 +1,63 @@
1
1
  /**
2
2
  * speclife_list tool
3
3
  *
4
- * List all active changes in the project
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 in the project", ListArgsSchema.shape, async () => {
53
+ server.tool("speclife_list", "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,78 @@ 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({
73
+ owner: config.github.owner,
74
+ repo: config.github.repo,
75
+ });
76
+ }
77
+ catch {
78
+ // GitHub not configured, will show all as "local"
79
+ }
20
80
  // List changes
21
81
  const changeIds = await openspec.listChanges();
22
82
  if (changeIds.length === 0) {
23
83
  return {
24
84
  content: [{
25
85
  type: "text",
26
- text: "No active changes. Use speclife_init to create one.",
86
+ text: "No active changes. Use `speclife_init` to create one.",
27
87
  }],
28
88
  };
29
89
  }
30
- // Get status for each change
31
- const lines = ["# Active Changes", ""];
90
+ // Collect enriched data for each change
91
+ const items = [];
32
92
  for (const changeId of changeIds) {
33
93
  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}`, "");
94
+ if (!result)
95
+ continue;
96
+ const { change, taskSummary, onBranch } = result;
97
+ const branch = `spec/${changeId}`;
98
+ // Get PR status
99
+ let prInfo = { status: 'local' };
100
+ if (github) {
101
+ prInfo = await getPRStatus(github, branch);
102
+ }
103
+ // Get last activity (use change createdAt as fallback)
104
+ const lastActive = change.createdAt;
105
+ items.push({
106
+ id: changeId,
107
+ progress: calculateProgress(taskSummary.completed, taskSummary.total),
108
+ prStatus: prInfo.status,
109
+ prNumber: prInfo.number,
110
+ prUrl: prInfo.url,
111
+ lastActive,
112
+ isCurrent: onBranch,
113
+ });
114
+ }
115
+ // Filter and sort
116
+ let filtered = filterByStatus(items, options.status);
117
+ const sorted = sortItems(filtered, options.sort ?? 'activity');
118
+ // Format output
119
+ const lines = [];
120
+ if (options.status) {
121
+ lines.push(`# Changes (filtered: ${options.status})`, '');
122
+ }
123
+ else {
124
+ lines.push('# Active Changes', '');
125
+ }
126
+ if (sorted.length === 0) {
127
+ lines.push('No changes match the filter.');
128
+ }
129
+ else if (options.compact) {
130
+ // Compact format
131
+ for (const item of sorted) {
132
+ lines.push(formatCompactLine(item));
38
133
  }
39
134
  }
135
+ else {
136
+ // Table format
137
+ lines.push(formatTable(sorted));
138
+ }
139
+ lines.push('');
140
+ lines.push(formatSummary(items)); // Use unfiltered items for summary
40
141
  return {
41
142
  content: [{ type: "text", text: lines.join("\n") }],
42
143
  };
@@ -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,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"}
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/tools/list.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * speclife_merge tool
3
3
  *
4
- * Merge PR, sync main, cleanup worktree/branch, and auto-bump version
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;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA6BzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkFzD"}
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,CA0JzD"}
@@ -1,19 +1,20 @@
1
1
  /**
2
2
  * speclife_merge tool
3
3
  *
4
- * Merge PR, sync main, cleanup worktree/branch, and auto-bump version
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, createClaudeCliAdapter, createOpenSpecAdapter, mergeWorkflow } from "@speclife/core";
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
- versionBump: z.enum(['auto', 'patch', 'minor', 'major', 'none']).optional().describe("Version bump type after merge. 'auto' uses AI to analyze changes and determine bump type (default). 'none' skips version bump."),
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, and bump version", MergeArgsSchema.shape, async (args) => {
17
+ server.tool("speclife_merge", "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();
@@ -24,44 +25,111 @@ export function registerMergeTool(server) {
24
25
  owner: config.github.owner,
25
26
  repo: config.github.repo,
26
27
  });
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
28
+ // Run merge workflow
32
29
  const result = await mergeWorkflow({
33
30
  changeId: parsed.changeId,
34
31
  method: parsed.method,
35
32
  deleteBranch: parsed.deleteBranch,
36
33
  removeWorktree: parsed.removeWorktree,
37
- versionBump,
38
- }, { git, github, config, claudeCli, openspec });
34
+ }, { git, github, config });
39
35
  const lines = [
40
36
  `✓ Merged PR #${result.pullRequest.number}: ${result.pullRequest.url}`,
41
37
  ];
42
38
  if (result.mainSynced) {
43
39
  lines.push(`✓ Synced ${config.github.baseBranch} with latest changes`);
44
40
  }
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
41
  if (result.branchDeleted) {
57
42
  lines.push(`✓ Deleted local branch spec/${parsed.changeId}`);
58
43
  }
59
44
  if (result.worktreeRemoved) {
60
45
  lines.push(`✓ Removed worktree at ${result.worktreePath}`);
61
46
  }
62
- lines.push('', 'Change complete! You are now on the main branch with the merged changes.');
63
- if (result.newVersion) {
64
- lines.push(`CI will automatically publish v${result.newVersion} to npm.`);
47
+ lines.push('');
48
+ lines.push('Change complete! You are now on the main branch with the merged changes.');
49
+ // Auto-release analysis (if not skipped)
50
+ if (!parsed.skipRelease) {
51
+ lines.push('');
52
+ lines.push('---');
53
+ lines.push('');
54
+ try {
55
+ // Create git adapter for main repo
56
+ const mainRepoPath = result.repoPath || cwd;
57
+ const mainGit = createGitAdapter(mainRepoPath);
58
+ // Get latest tag and commits
59
+ const latestTag = await mainGit.getLatestTag();
60
+ const previousVersion = latestTag ? latestTag.replace(/^v/, '') : '0.0.0';
61
+ const rawCommits = latestTag
62
+ ? await mainGit.getCommitsSince(latestTag)
63
+ : await mainGit.getCommitsSince('HEAD~10');
64
+ if (rawCommits.length > 0) {
65
+ // Parse commits
66
+ const commits = rawCommits.map(({ sha, message }) => {
67
+ const parsed = parseConventionalCommit(message);
68
+ return {
69
+ sha,
70
+ message,
71
+ type: parsed.type,
72
+ scope: parsed.scope,
73
+ isBreaking: parsed.isBreaking,
74
+ };
75
+ });
76
+ // Determine bump type
77
+ const bumpType = suggestVersionBump(commits, previousVersion);
78
+ // Check if auto-release is allowed
79
+ const autoReleaseAllowed = isAutoReleaseAllowed(config, bumpType);
80
+ lines.push(`📊 **Release Analysis**`);
81
+ lines.push(` Commits since ${latestTag || 'start'}: ${commits.length}`);
82
+ lines.push(` Suggested bump: **${bumpType}** (${previousVersion} → next)`);
83
+ lines.push('');
84
+ if (autoReleaseAllowed) {
85
+ // Auto-release with auto-merge for patch/minor
86
+ const enableAutoMerge = bumpType !== 'major';
87
+ lines.push(`✨ Auto-release enabled for ${bumpType} bumps. Creating release PR...`);
88
+ lines.push('');
89
+ const releaseResult = await releaseWorkflow({ dryRun: false, autoMerge: enableAutoMerge }, { git: mainGit, github, repoPath: mainRepoPath });
90
+ lines.push(`✓ Created release PR: ${releaseResult.prUrl}`);
91
+ lines.push(` Version: ${releaseResult.previousVersion} → ${releaseResult.version}`);
92
+ if (releaseResult.autoMergeEnabled) {
93
+ lines.push(` 🤖 Auto-merge enabled - will merge when CI passes`);
94
+ lines.push('');
95
+ lines.push('**Release will happen automatically once CI passes!**');
96
+ }
97
+ else {
98
+ lines.push('');
99
+ lines.push('**Next:** Review and merge the release PR to publish.');
100
+ lines.push('(Auto-merge not available - enable in repo settings for fully automated releases)');
101
+ }
102
+ }
103
+ else {
104
+ // Manual release required (major bump)
105
+ lines.push(`⚠️ **Manual release required** (${bumpType} bump)`);
106
+ lines.push('');
107
+ if (bumpType === 'major') {
108
+ lines.push('Major releases require explicit confirmation. Run:');
109
+ lines.push('```');
110
+ lines.push('speclife_release --major');
111
+ lines.push('```');
112
+ }
113
+ else {
114
+ lines.push(`Auto-release disabled for ${bumpType} in config. Run:`);
115
+ lines.push('```');
116
+ lines.push('speclife_release');
117
+ lines.push('```');
118
+ }
119
+ }
120
+ }
121
+ else {
122
+ lines.push('💡 No commits since last release. Run `speclife_release` when ready.');
123
+ }
124
+ }
125
+ catch (releaseError) {
126
+ // Release analysis/creation failed - not critical
127
+ lines.push('💡 Ready to release? Run `speclife_release` to create a release PR.');
128
+ }
129
+ }
130
+ else {
131
+ lines.push('');
132
+ lines.push('💡 Ready to release? Run `speclife_release` to create a release PR.');
65
133
  }
66
134
  return {
67
135
  content: [{ type: "text", text: lines.join("\n") }],
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/tools/merge.ts"],"names":[],"mappings":"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"}
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,CAsJ3D"}
@@ -0,0 +1,154 @@
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", "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({
27
+ owner: config.github.owner,
28
+ repo: config.github.repo,
29
+ });
30
+ // Determine version from flags
31
+ let version = parsed.version;
32
+ let forcedBumpType;
33
+ if (!version) {
34
+ // Check for forced bump type flags
35
+ if (parsed.major) {
36
+ forcedBumpType = 'major';
37
+ }
38
+ else if (parsed.minor) {
39
+ forcedBumpType = 'minor';
40
+ }
41
+ else if (parsed.patch) {
42
+ forcedBumpType = 'patch';
43
+ }
44
+ // If forced bump, calculate version now
45
+ if (forcedBumpType) {
46
+ const latestTag = await git.getLatestTag();
47
+ const previousVersion = latestTag ? latestTag.replace(/^v/, '') : '0.0.0';
48
+ version = bumpVersion(previousVersion, forcedBumpType);
49
+ }
50
+ }
51
+ // Determine auto-merge: default to true for patch/minor, false for major
52
+ // User can override with explicit --autoMerge flag
53
+ const shouldAutoMerge = parsed.autoMerge ?? (forcedBumpType !== 'major');
54
+ // Run workflow
55
+ const result = await releaseWorkflow({
56
+ version,
57
+ dryRun: parsed.dryRun,
58
+ skipChangelog: parsed.skipChangelog,
59
+ autoMerge: shouldAutoMerge,
60
+ }, { git, github, repoPath: cwd });
61
+ const lines = [];
62
+ if (parsed.dryRun) {
63
+ lines.push('🔍 **Dry Run** - No changes made');
64
+ lines.push('');
65
+ }
66
+ lines.push(`## Version: ${result.previousVersion} → ${result.version}`);
67
+ // Show if bump was forced or auto-detected
68
+ if (forcedBumpType) {
69
+ lines.push(`Bump type: **${forcedBumpType}** (forced via --${forcedBumpType})`);
70
+ }
71
+ else if (parsed.version) {
72
+ lines.push(`Bump type: **${result.bumpType}** (explicit version provided)`);
73
+ }
74
+ else {
75
+ lines.push(`Bump type: **${result.bumpType}** (auto-detected from commits)`);
76
+ }
77
+ lines.push('');
78
+ // Commits summary
79
+ lines.push(`### Commits (${result.commits.length})`);
80
+ const breaking = result.commits.filter(c => c.isBreaking);
81
+ const features = result.commits.filter(c => c.type === 'feat');
82
+ const fixes = result.commits.filter(c => c.type === 'fix');
83
+ if (breaking.length > 0) {
84
+ lines.push(`- ⚠️ ${breaking.length} breaking change(s)`);
85
+ }
86
+ if (features.length > 0) {
87
+ lines.push(`- ✨ ${features.length} feature(s)`);
88
+ }
89
+ if (fixes.length > 0) {
90
+ lines.push(`- 🐛 ${fixes.length} fix(es)`);
91
+ }
92
+ lines.push('');
93
+ // Commit list
94
+ lines.push('**Changes:**');
95
+ for (const commit of result.commits.slice(0, 10)) {
96
+ const icon = commit.isBreaking ? '⚠️' : commit.type === 'feat' ? '✨' : commit.type === 'fix' ? '🐛' : '📝';
97
+ lines.push(`- ${icon} ${commit.message.slice(0, 80)}${commit.message.length > 80 ? '...' : ''}`);
98
+ }
99
+ if (result.commits.length > 10) {
100
+ lines.push(`- ... and ${result.commits.length - 10} more`);
101
+ }
102
+ lines.push('');
103
+ if (!parsed.dryRun) {
104
+ lines.push('---');
105
+ lines.push(`✓ Created release branch: ${result.branch}`);
106
+ lines.push(`✓ Updated package versions to ${result.version}`);
107
+ if (result.changelog) {
108
+ lines.push('✓ Generated changelog');
109
+ }
110
+ lines.push(`✓ Created PR: ${result.prUrl}`);
111
+ if (result.autoMergeEnabled) {
112
+ lines.push(`✓ 🤖 Auto-merge enabled - will merge when CI passes`);
113
+ lines.push('');
114
+ lines.push('**Release will happen automatically once CI passes!**');
115
+ }
116
+ else {
117
+ lines.push('');
118
+ lines.push('**Next steps:**');
119
+ lines.push('1. Review and merge the release PR');
120
+ lines.push('2. CI will automatically create git tag and GitHub release');
121
+ lines.push('3. CI will publish packages to npm');
122
+ if (shouldAutoMerge) {
123
+ lines.push('');
124
+ lines.push('💡 Auto-merge was requested but not available. Enable in repo settings for fully automated releases.');
125
+ }
126
+ }
127
+ }
128
+ else {
129
+ lines.push('---');
130
+ lines.push('Run `speclife_release` without `--dry-run` to create the release PR.');
131
+ if (parsed.version) {
132
+ lines.push(`Using explicit version: ${parsed.version}`);
133
+ }
134
+ else if (forcedBumpType) {
135
+ lines.push(`Forced ${forcedBumpType} bump → ${result.version}`);
136
+ }
137
+ else {
138
+ lines.push(`Suggested version: ${result.version} (based on commit analysis)`);
139
+ }
140
+ }
141
+ return {
142
+ content: [{ type: "text", text: lines.join("\n") }],
143
+ };
144
+ }
145
+ catch (error) {
146
+ const message = error instanceof Error ? error.message : String(error);
147
+ return {
148
+ content: [{ type: "text", text: `Error: ${message}` }],
149
+ isError: true,
150
+ };
151
+ }
152
+ });
153
+ }
154
+ //# 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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"}
@@ -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;AAsBzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmE1D"}
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,CA4F1D"}
@@ -9,9 +9,11 @@ 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", "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();
@@ -31,11 +33,28 @@ export function registerSubmitTool(server) {
31
33
  changeId: parsed.changeId,
32
34
  draft: parsed.draft,
33
35
  commitMessage: parsed.commitMessage,
36
+ skipValidation: parsed.skipValidation,
37
+ strict: parsed.strict,
34
38
  }, { git, github, openspec, config });
35
- const lines = [
36
- `✓ Committed: ${result.commitSha.slice(0, 7)}`,
37
- `✓ Pushed to: origin/${result.branch}`,
38
- ];
39
+ const lines = [];
40
+ // Show validation results if validation was run
41
+ if (result.validation) {
42
+ const statusEmoji = result.validation.status === 'pass' ? '✅' :
43
+ result.validation.status === 'pass_with_warnings' ? '⚠️' : '❌';
44
+ lines.push(`${statusEmoji} Spec Validation: ${result.validation.status.replace(/_/g, ' ').toUpperCase()}`);
45
+ if (result.validation.errors.length > 0) {
46
+ for (const error of result.validation.errors) {
47
+ lines.push(` ❌ ${error}`);
48
+ }
49
+ }
50
+ if (result.validation.warnings.length > 0) {
51
+ for (const warning of result.validation.warnings) {
52
+ lines.push(` ⚠️ ${warning}`);
53
+ }
54
+ }
55
+ lines.push('');
56
+ }
57
+ lines.push(`✓ Committed: ${result.commitSha.slice(0, 7)}`, `✓ Pushed to: origin/${result.branch}`);
39
58
  if (result.prCreated) {
40
59
  lines.push(`✓ Created PR #${result.pullRequest.number}: ${result.pullRequest.url}`);
41
60
  }
@@ -1 +1 @@
1
- {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../src/tools/submit.ts"],"names":[],"mappings":"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"}
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.1.7",
3
+ "version": "0.2.1",
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 --passWithNoTests",
20
+ "test": "vitest run",
21
21
  "typecheck": "tsc --noEmit"
22
22
  },
23
23
  "dependencies": {