@specforge/mcp 2.2.0 → 2.4.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/dist/cli/commands/blueprints.d.ts +6 -0
- package/dist/cli/commands/blueprints.d.ts.map +1 -0
- package/dist/cli/commands/blueprints.js +257 -0
- package/dist/cli/commands/blueprints.js.map +1 -0
- package/dist/cli/commands/blueprints.types.d.ts +55 -0
- package/dist/cli/commands/blueprints.types.d.ts.map +1 -0
- package/dist/cli/commands/blueprints.types.js +3 -0
- package/dist/cli/commands/blueprints.types.js.map +1 -0
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +1 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +3 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/templates/content/sf-create-epics.d.ts +1 -1
- package/dist/cli/templates/content/sf-create-epics.d.ts.map +1 -1
- package/dist/cli/templates/content/sf-create-epics.js +72 -13
- package/dist/cli/templates/content/sf-create-epics.js.map +1 -1
- package/dist/cli/templates/content/sf-create-spec.d.ts +1 -1
- package/dist/cli/templates/content/sf-create-spec.d.ts.map +1 -1
- package/dist/cli/templates/content/sf-create-spec.js +91 -22
- package/dist/cli/templates/content/sf-create-spec.js.map +1 -1
- package/dist/cli/templates/content/sf-create-tickets.d.ts +1 -1
- package/dist/cli/templates/content/sf-create-tickets.d.ts.map +1 -1
- package/dist/cli/templates/content/sf-create-tickets.js +90 -18
- package/dist/cli/templates/content/sf-create-tickets.js.map +1 -1
- package/dist/tools/core/blueprint.d.ts +7 -0
- package/dist/tools/core/blueprint.d.ts.map +1 -0
- package/dist/tools/core/blueprint.js +210 -0
- package/dist/tools/core/blueprint.js.map +1 -0
- package/dist/tools/core/epic.d.ts.map +1 -1
- package/dist/tools/core/epic.js +95 -11
- package/dist/tools/core/epic.js.map +1 -1
- package/dist/tools/core/specification.d.ts.map +1 -1
- package/dist/tools/core/specification.js +98 -9
- package/dist/tools/core/specification.js.map +1 -1
- package/dist/tools/core/ticket.d.ts.map +1 -1
- package/dist/tools/core/ticket.js +48 -11
- package/dist/tools/core/ticket.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
export const SF_CREATE_SPEC_CONTENT = `# Create Specification (SpecForge)
|
|
7
7
|
|
|
8
|
-
Create a SpecForge specification structure with
|
|
8
|
+
Create a SpecForge specification structure with metadata extracted from a plan document.
|
|
9
9
|
|
|
10
10
|
## Arguments
|
|
11
11
|
- \`$ARGUMENTS\` - Required: Path to plan markdown file
|
|
@@ -16,21 +16,75 @@ Create a SpecForge specification structure with patterns extracted from a plan d
|
|
|
16
16
|
|
|
17
17
|
**Logic:**
|
|
18
18
|
- Read file at $ARGUMENTS
|
|
19
|
-
- Extract specification
|
|
20
|
-
- Identify
|
|
21
|
-
- Parse
|
|
22
|
-
- Extract
|
|
19
|
+
- Extract specification title and description
|
|
20
|
+
- Identify priority level (high/medium/low)
|
|
21
|
+
- Parse tags from plan categories/themes
|
|
22
|
+
- Extract goals, requirements, and constraints
|
|
23
23
|
|
|
24
24
|
### 2. Create Specification
|
|
25
25
|
|
|
26
26
|
**MCP Calls:**
|
|
27
27
|
\`\`\`typescript
|
|
28
|
-
|
|
28
|
+
specification({
|
|
29
|
+
operation: 'create',
|
|
30
|
+
|
|
31
|
+
// === REQUIRED ===
|
|
32
|
+
projectId: currentProjectId,
|
|
29
33
|
title: extractedTitle,
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
+
|
|
35
|
+
// === CORE (recommended) ===
|
|
36
|
+
description: shortSummary, // 2-3 sentence summary
|
|
37
|
+
content: fullMarkdownContent, // Full markdown content
|
|
38
|
+
background: problemContext, // Why this exists
|
|
39
|
+
scope: scopeDefinition, // What's in/out of scope
|
|
40
|
+
priority: 'high', // high | medium | low
|
|
41
|
+
tags: ['feature', 'api'],
|
|
42
|
+
estimatedHours: 40,
|
|
43
|
+
targetAudience: 'developers',
|
|
44
|
+
|
|
45
|
+
// === GOALS & REQUIREMENTS ===
|
|
46
|
+
goals: ['Enable X', 'Improve Y'],
|
|
47
|
+
requirements: ['Must do A', 'Must support B'],
|
|
48
|
+
nonFunctionalRequirements: ['< 100ms latency', '99.9% uptime'],
|
|
49
|
+
acceptanceCriteria: ['Users can X', 'System handles Y'],
|
|
50
|
+
successMetrics: ['50% reduction in Z'],
|
|
51
|
+
|
|
52
|
+
// === GUARDRAILS & RISKS ===
|
|
53
|
+
guardrails: ['Do NOT modify X', 'Avoid pattern Y'],
|
|
54
|
+
constraints: ['Must use existing auth', 'Budget limit'],
|
|
55
|
+
assumptions: ['Users have Node 18+'],
|
|
56
|
+
risks: ['Third-party API may change'],
|
|
57
|
+
|
|
58
|
+
// === TECHNICAL ===
|
|
59
|
+
architecture: 'Microservices with event-driven communication',
|
|
60
|
+
fileStructure: 'src/\\n components/\\n services/\\n utils/',
|
|
61
|
+
techStack: ['typescript', 'react', 'node'],
|
|
62
|
+
dependencies: ['@aws-sdk/client-s3', 'zod'],
|
|
63
|
+
apiContracts: { endpoints: [{ path: '/api/v1/users', method: 'GET' }] },
|
|
64
|
+
|
|
65
|
+
// === PATTERN INHERITANCE (for epics/tickets) ===
|
|
66
|
+
codeStandards: {
|
|
67
|
+
errorHandling: 'Use Result<T, E> pattern',
|
|
68
|
+
naming: 'camelCase for functions, PascalCase for types'
|
|
69
|
+
},
|
|
70
|
+
commonImports: [
|
|
71
|
+
"import { logger } from '@/lib/logger'",
|
|
72
|
+
"import { db } from '@/lib/db'"
|
|
73
|
+
],
|
|
74
|
+
returnTypes: {
|
|
75
|
+
success: '{ success: true, data: T }',
|
|
76
|
+
error: '{ success: false, error: string }'
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// === VALIDATION (for CI/CD) ===
|
|
80
|
+
validationCommands: {
|
|
81
|
+
test: 'npm test',
|
|
82
|
+
lint: 'npm run lint',
|
|
83
|
+
build: 'npm run build',
|
|
84
|
+
typeCheck: 'npm run typecheck'
|
|
85
|
+
},
|
|
86
|
+
workingDirectory: './src',
|
|
87
|
+
outputDirectory: './dist'
|
|
34
88
|
})
|
|
35
89
|
\`\`\`
|
|
36
90
|
|
|
@@ -41,27 +95,42 @@ create_specification({
|
|
|
41
95
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
42
96
|
SPECIFICATION CREATED
|
|
43
97
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
44
|
-
Title:
|
|
45
|
-
ID:
|
|
98
|
+
Title: {title}
|
|
99
|
+
ID: {specificationId}
|
|
100
|
+
Priority: {priority}
|
|
46
101
|
|
|
47
|
-
|
|
102
|
+
DESCRIPTION
|
|
48
103
|
─────────────────────────────────────────────────────────────────
|
|
49
|
-
|
|
50
|
-
• {pattern2}
|
|
51
|
-
• {pattern3}
|
|
104
|
+
{description}
|
|
52
105
|
|
|
53
|
-
|
|
106
|
+
TAGS
|
|
54
107
|
─────────────────────────────────────────────────────────────────
|
|
55
|
-
|
|
56
|
-
• {guardrail2}
|
|
108
|
+
{tags}
|
|
57
109
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
58
110
|
|
|
59
111
|
Next: Run /sf-create-epics {specificationId} to create epics
|
|
60
112
|
\`\`\`
|
|
61
113
|
|
|
114
|
+
## Field Reference
|
|
115
|
+
|
|
116
|
+
| Field | Required | Description |
|
|
117
|
+
|-------|----------|-------------|
|
|
118
|
+
| projectId | ✅ | Project to create spec in |
|
|
119
|
+
| title | ✅ | Specification title |
|
|
120
|
+
| description | | Short summary |
|
|
121
|
+
| content | | Full markdown content |
|
|
122
|
+
| background | | Problem context |
|
|
123
|
+
| scope | | In/out of scope |
|
|
124
|
+
| goals | | Business objectives |
|
|
125
|
+
| requirements | | Functional requirements |
|
|
126
|
+
| guardrails | | What NOT to do |
|
|
127
|
+
| architecture | | System design |
|
|
128
|
+
| techStack | | Technologies used |
|
|
129
|
+
| codeStandards | | Inherited by epics/tickets |
|
|
130
|
+
|
|
62
131
|
## Notes
|
|
63
|
-
-
|
|
64
|
-
-
|
|
65
|
-
- Use /sf-create-epics to add epics
|
|
132
|
+
- Only projectId and title are required
|
|
133
|
+
- codeStandards, commonImports, returnTypes are inherited by child epics/tickets
|
|
134
|
+
- Use /sf-create-epics to add epics after creation
|
|
66
135
|
`;
|
|
67
136
|
//# sourceMappingURL=sf-create-spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sf-create-spec.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-create-spec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG
|
|
1
|
+
{"version":3,"file":"sf-create-spec.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-create-spec.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiIrC,CAAC"}
|
|
@@ -3,5 +3,5 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Template for creating detailed tickets individually with full implementation context.
|
|
5
5
|
*/
|
|
6
|
-
export declare const SF_CREATE_TICKETS_CONTENT = "# Create Tickets (SpecForge)\n\nCreate detailed tickets for an epic with full implementation context.\n\n## Arguments\n- `$ARGUMENTS` - Required: Epic ID\n\n## Task\n\n### 1. Get Epic Context\n\n**MCP Calls:**\n```typescript\
|
|
6
|
+
export declare const SF_CREATE_TICKETS_CONTENT = "# Create Tickets (SpecForge)\n\nCreate detailed tickets for an epic with full implementation context.\n\n## Arguments\n- `$ARGUMENTS` - Required: Epic ID\n\n## Task\n\n### 1. Get Epic Context\n\n**MCP Calls:**\n```typescript\nepic({\n operation: 'get',\n epicId: $ARGUMENTS,\n include: ['tickets', 'specification'] // Get existing tickets and parent spec\n})\n```\n\n### 2. Extract Ticket Definitions\n\n**Logic:**\n- Read epic description and objective\n- Parse task breakdown from epic content\n- Determine complexity and dependencies\n- Extract acceptance criteria for each ticket\n\n### 3. Create Tickets\n\n**MCP Calls:**\n```typescript\n// For each task in epic\nfor (const task of tasks) {\n await ticket({\n operation: 'create',\n\n // === REQUIRED ===\n epicId: $ARGUMENTS,\n title: task.title,\n\n // === CORE (recommended) ===\n description: task.description,\n priority: 'high', // high | medium | low\n complexity: 'medium', // small | medium | large | xlarge\n estimatedHours: 4,\n tags: ['feature', 'api'],\n notes: 'Watch out for edge case X', // Warnings, considerations\n\n // === ACCEPTANCE CRITERIA ===\n acceptanceCriteria: [\n 'Function returns correct result for valid input',\n 'Function throws error for invalid input',\n 'Unit tests cover all branches'\n ],\n\n // === IMPLEMENTATION GUIDANCE ===\n implementation: {\n filesToCreate: ['src/services/user.service.ts'],\n filesToModify: ['src/index.ts'],\n steps: [\n 'Create UserService class',\n 'Implement createUser method',\n 'Add validation with zod',\n 'Write unit tests'\n ],\n testing: 'Use vitest with mocked database'\n },\n technicalDetails: {\n approach: 'Repository pattern with dependency injection',\n stack: ['typescript', 'prisma', 'zod'],\n endpoints: ['/api/users POST'],\n databaseChanges: ['Add users table']\n },\n\n // === CODE REFERENCES ===\n codeReferences: [{\n name: 'createUser',\n language: 'typescript',\n code: `async function createUser(data: CreateUserInput): Promise<User> {\n const validated = createUserSchema.parse(data);\n return await db.user.create({ data: validated });\n}`\n }],\n typeReferences: [{\n name: 'CreateUserInput',\n definition: `interface CreateUserInput {\n email: string;\n name: string;\n role?: 'admin' | 'user';\n}`\n }],\n\n // === DEPENDENCIES ===\n dependsOn: ['ticket-id-1', 'ticket-id-2'] // Must complete these first\n })\n}\n```\n\n### 4. Display Creation Results\n\n**Output:**\n```\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nTICKETS CREATED\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\nEpic: E{n} - {epicTitle}\n\nCREATED TICKETS\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nE{n}-T1 \u2502 {title} \u2502 {complexity} \u2502 ready\nE{n}-T2 \u2502 {title} \u2502 {complexity} \u2502 pending (depends on T1)\nE{n}-T3 \u2502 {title} \u2502 {complexity} \u2502 ready\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\nTotal: {ticketCount} tickets created\n\nNext: Run /sf-status to see overall progress\n```\n\n## Field Reference\n\n| Field | Required | Description |\n|-------|----------|-------------|\n| epicId | \u2705 | Parent epic |\n| title | \u2705 | Ticket title |\n| description | | What to implement |\n| complexity | | small \\| medium \\| large \\| xlarge |\n| acceptanceCriteria | | Success criteria (array of strings) |\n| implementation | | Steps, files to create/modify |\n| technicalDetails | | Approach, stack, endpoints |\n| codeReferences | | Code snippets to guide implementation |\n| typeReferences | | Type definitions to implement |\n| dependsOn | | Ticket IDs that must complete first |\n| notes | | Warnings, edge cases, considerations |\n\n## Notes\n- Only epicId and title are required\n- Tickets with dependsOn start as 'pending', others as 'ready'\n- codeReferences and typeReferences provide implementation guidance\n- Use /sf-next to start working on ready tickets\n";
|
|
7
7
|
//# sourceMappingURL=sf-create-tickets.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sf-create-tickets.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-create-tickets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"sf-create-tickets.d.ts","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-create-tickets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,yBAAyB,4kKA6IrC,CAAC"}
|
|
@@ -16,18 +16,20 @@ Create detailed tickets for an epic with full implementation context.
|
|
|
16
16
|
|
|
17
17
|
**MCP Calls:**
|
|
18
18
|
\`\`\`typescript
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
epic({
|
|
20
|
+
operation: 'get',
|
|
21
|
+
epicId: $ARGUMENTS,
|
|
22
|
+
include: ['tickets', 'specification'] // Get existing tickets and parent spec
|
|
23
|
+
})
|
|
21
24
|
\`\`\`
|
|
22
25
|
|
|
23
26
|
### 2. Extract Ticket Definitions
|
|
24
27
|
|
|
25
28
|
**Logic:**
|
|
26
|
-
- Read epic description and
|
|
27
|
-
- Parse task breakdown
|
|
28
|
-
-
|
|
29
|
-
-
|
|
30
|
-
- Add implementation guidance
|
|
29
|
+
- Read epic description and objective
|
|
30
|
+
- Parse task breakdown from epic content
|
|
31
|
+
- Determine complexity and dependencies
|
|
32
|
+
- Extract acceptance criteria for each ticket
|
|
31
33
|
|
|
32
34
|
### 3. Create Tickets
|
|
33
35
|
|
|
@@ -35,14 +37,67 @@ get_specification(epic.specificationId)
|
|
|
35
37
|
\`\`\`typescript
|
|
36
38
|
// For each task in epic
|
|
37
39
|
for (const task of tasks) {
|
|
38
|
-
await
|
|
40
|
+
await ticket({
|
|
41
|
+
operation: 'create',
|
|
42
|
+
|
|
43
|
+
// === REQUIRED ===
|
|
39
44
|
epicId: $ARGUMENTS,
|
|
40
45
|
title: task.title,
|
|
46
|
+
|
|
47
|
+
// === CORE (recommended) ===
|
|
41
48
|
description: task.description,
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
priority: 'high', // high | medium | low
|
|
50
|
+
complexity: 'medium', // small | medium | large | xlarge
|
|
51
|
+
estimatedHours: 4,
|
|
52
|
+
tags: ['feature', 'api'],
|
|
53
|
+
notes: 'Watch out for edge case X', // Warnings, considerations
|
|
54
|
+
|
|
55
|
+
// === ACCEPTANCE CRITERIA ===
|
|
56
|
+
acceptanceCriteria: [
|
|
57
|
+
'Function returns correct result for valid input',
|
|
58
|
+
'Function throws error for invalid input',
|
|
59
|
+
'Unit tests cover all branches'
|
|
60
|
+
],
|
|
61
|
+
|
|
62
|
+
// === IMPLEMENTATION GUIDANCE ===
|
|
63
|
+
implementation: {
|
|
64
|
+
filesToCreate: ['src/services/user.service.ts'],
|
|
65
|
+
filesToModify: ['src/index.ts'],
|
|
66
|
+
steps: [
|
|
67
|
+
'Create UserService class',
|
|
68
|
+
'Implement createUser method',
|
|
69
|
+
'Add validation with zod',
|
|
70
|
+
'Write unit tests'
|
|
71
|
+
],
|
|
72
|
+
testing: 'Use vitest with mocked database'
|
|
73
|
+
},
|
|
74
|
+
technicalDetails: {
|
|
75
|
+
approach: 'Repository pattern with dependency injection',
|
|
76
|
+
stack: ['typescript', 'prisma', 'zod'],
|
|
77
|
+
endpoints: ['/api/users POST'],
|
|
78
|
+
databaseChanges: ['Add users table']
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
// === CODE REFERENCES ===
|
|
82
|
+
codeReferences: [{
|
|
83
|
+
name: 'createUser',
|
|
84
|
+
language: 'typescript',
|
|
85
|
+
code: \`async function createUser(data: CreateUserInput): Promise<User> {
|
|
86
|
+
const validated = createUserSchema.parse(data);
|
|
87
|
+
return await db.user.create({ data: validated });
|
|
88
|
+
}\`
|
|
89
|
+
}],
|
|
90
|
+
typeReferences: [{
|
|
91
|
+
name: 'CreateUserInput',
|
|
92
|
+
definition: \`interface CreateUserInput {
|
|
93
|
+
email: string;
|
|
94
|
+
name: string;
|
|
95
|
+
role?: 'admin' | 'user';
|
|
96
|
+
}\`
|
|
97
|
+
}],
|
|
98
|
+
|
|
99
|
+
// === DEPENDENCIES ===
|
|
100
|
+
dependsOn: ['ticket-id-1', 'ticket-id-2'] // Must complete these first
|
|
46
101
|
})
|
|
47
102
|
}
|
|
48
103
|
\`\`\`
|
|
@@ -58,9 +113,9 @@ Epic: E{n} - {epicTitle}
|
|
|
58
113
|
|
|
59
114
|
CREATED TICKETS
|
|
60
115
|
─────────────────────────────────────────────────────────────────
|
|
61
|
-
E{n}-T1 │ {title} │ {complexity}
|
|
62
|
-
E{n}-T2 │ {title} │ {complexity} │
|
|
63
|
-
E{n}-T3 │ {title} │ {complexity}
|
|
116
|
+
E{n}-T1 │ {title} │ {complexity} │ ready
|
|
117
|
+
E{n}-T2 │ {title} │ {complexity} │ pending (depends on T1)
|
|
118
|
+
E{n}-T3 │ {title} │ {complexity} │ ready
|
|
64
119
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
65
120
|
|
|
66
121
|
Total: {ticketCount} tickets created
|
|
@@ -68,9 +123,26 @@ Total: {ticketCount} tickets created
|
|
|
68
123
|
Next: Run /sf-status to see overall progress
|
|
69
124
|
\`\`\`
|
|
70
125
|
|
|
126
|
+
## Field Reference
|
|
127
|
+
|
|
128
|
+
| Field | Required | Description |
|
|
129
|
+
|-------|----------|-------------|
|
|
130
|
+
| epicId | ✅ | Parent epic |
|
|
131
|
+
| title | ✅ | Ticket title |
|
|
132
|
+
| description | | What to implement |
|
|
133
|
+
| complexity | | small \\| medium \\| large \\| xlarge |
|
|
134
|
+
| acceptanceCriteria | | Success criteria (array of strings) |
|
|
135
|
+
| implementation | | Steps, files to create/modify |
|
|
136
|
+
| technicalDetails | | Approach, stack, endpoints |
|
|
137
|
+
| codeReferences | | Code snippets to guide implementation |
|
|
138
|
+
| typeReferences | | Type definitions to implement |
|
|
139
|
+
| dependsOn | | Ticket IDs that must complete first |
|
|
140
|
+
| notes | | Warnings, edge cases, considerations |
|
|
141
|
+
|
|
71
142
|
## Notes
|
|
72
|
-
-
|
|
73
|
-
-
|
|
74
|
-
-
|
|
143
|
+
- Only epicId and title are required
|
|
144
|
+
- Tickets with dependsOn start as 'pending', others as 'ready'
|
|
145
|
+
- codeReferences and typeReferences provide implementation guidance
|
|
146
|
+
- Use /sf-next to start working on ready tickets
|
|
75
147
|
`;
|
|
76
148
|
//# sourceMappingURL=sf-create-tickets.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sf-create-tickets.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-create-tickets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG
|
|
1
|
+
{"version":3,"file":"sf-create-tickets.js","sourceRoot":"","sources":["../../../../src/cli/templates/content/sf-create-tickets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6IxC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
2
|
+
import { ConsolidatedToolArgs, OperationHandler } from './types.js';
|
|
3
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
4
|
+
export declare const blueprintTool: Tool;
|
|
5
|
+
export declare function createBlueprintOperations(apiClient: ApiClient): Record<string, OperationHandler>;
|
|
6
|
+
export declare function createBlueprintHandler(apiClient: ApiClient): (args: ConsolidatedToolArgs, userId: string) => Promise<unknown>;
|
|
7
|
+
//# sourceMappingURL=blueprint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint.d.ts","sourceRoot":"","sources":["../../../src/tools/core/blueprint.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,aAAa,EAAE,IAgH3B,CAAC;AAUF,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAyFhG;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,SAAS,oEAG1D"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// mcp/src/tools/core/blueprint.ts
|
|
2
|
+
import { createOperationRouter } from './router.js';
|
|
3
|
+
export const blueprintTool = {
|
|
4
|
+
name: 'blueprint',
|
|
5
|
+
description: `Manage specification blueprints (flowcharts, diagrams, mockups, ADRs). Operations:
|
|
6
|
+
- create: Create a new blueprint for a specification
|
|
7
|
+
- get: Get blueprint by ID with full content
|
|
8
|
+
- update: Update blueprint fields
|
|
9
|
+
- list: List blueprints for a specification (with optional category/status filters)
|
|
10
|
+
- delete: Delete a blueprint and all its ticket references
|
|
11
|
+
- link: Link a ticket to a blueprint for implementation context
|
|
12
|
+
- unlink: Remove a ticket-blueprint link
|
|
13
|
+
- get_for_ticket: Get all blueprints linked to a ticket`,
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: {
|
|
17
|
+
operation: {
|
|
18
|
+
type: 'string',
|
|
19
|
+
enum: ['create', 'get', 'update', 'list', 'delete', 'link', 'unlink', 'get_for_ticket'],
|
|
20
|
+
description: 'The operation to perform',
|
|
21
|
+
},
|
|
22
|
+
// IDs
|
|
23
|
+
blueprintId: {
|
|
24
|
+
type: 'string',
|
|
25
|
+
description: 'Blueprint ID (for get, update, delete, link, unlink)',
|
|
26
|
+
},
|
|
27
|
+
specificationId: {
|
|
28
|
+
type: 'string',
|
|
29
|
+
description: 'Specification ID (for create, list)',
|
|
30
|
+
},
|
|
31
|
+
ticketId: {
|
|
32
|
+
type: 'string',
|
|
33
|
+
description: 'Ticket ID (for link, unlink, get_for_ticket)',
|
|
34
|
+
},
|
|
35
|
+
referenceId: {
|
|
36
|
+
type: 'string',
|
|
37
|
+
description: 'Reference ID (for unlink - alternative to ticketId+blueprintId)',
|
|
38
|
+
},
|
|
39
|
+
// Blueprint fields
|
|
40
|
+
title: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
description: 'Blueprint title',
|
|
43
|
+
},
|
|
44
|
+
description: {
|
|
45
|
+
type: 'string',
|
|
46
|
+
description: 'Blueprint description',
|
|
47
|
+
},
|
|
48
|
+
slug: {
|
|
49
|
+
type: 'string',
|
|
50
|
+
description: 'URL-friendly identifier',
|
|
51
|
+
},
|
|
52
|
+
category: {
|
|
53
|
+
type: 'string',
|
|
54
|
+
enum: ['flowchart', 'architecture', 'state', 'sequence', 'erd', 'mockup', 'adr', 'component', 'deployment', 'api'],
|
|
55
|
+
description: 'Blueprint category type',
|
|
56
|
+
},
|
|
57
|
+
content: {
|
|
58
|
+
type: 'string',
|
|
59
|
+
description: 'The blueprint content (Mermaid syntax, markdown, or ASCII art)',
|
|
60
|
+
},
|
|
61
|
+
format: {
|
|
62
|
+
type: 'string',
|
|
63
|
+
enum: ['markdown', 'mermaid', 'ascii', 'mixed'],
|
|
64
|
+
description: 'Content format (default: mermaid)',
|
|
65
|
+
},
|
|
66
|
+
tags: {
|
|
67
|
+
type: 'array',
|
|
68
|
+
items: { type: 'string' },
|
|
69
|
+
description: 'Categorization tags',
|
|
70
|
+
},
|
|
71
|
+
status: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
enum: ['draft', 'review', 'approved', 'deprecated'],
|
|
74
|
+
description: 'Blueprint status',
|
|
75
|
+
},
|
|
76
|
+
order: {
|
|
77
|
+
type: 'number',
|
|
78
|
+
description: 'Display order within specification',
|
|
79
|
+
},
|
|
80
|
+
version: {
|
|
81
|
+
type: 'string',
|
|
82
|
+
description: 'Semantic version (e.g., "1.0.0")',
|
|
83
|
+
},
|
|
84
|
+
// Reference fields
|
|
85
|
+
context: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
description: 'Why this blueprint is relevant to the ticket (for link)',
|
|
88
|
+
},
|
|
89
|
+
section: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
description: 'Specific section in blueprint relevant to ticket (for link)',
|
|
92
|
+
},
|
|
93
|
+
// Response options
|
|
94
|
+
outputFormat: {
|
|
95
|
+
type: 'string',
|
|
96
|
+
enum: ['json', 'toon'],
|
|
97
|
+
description: 'Output format (default: json)',
|
|
98
|
+
},
|
|
99
|
+
includeContent: {
|
|
100
|
+
type: 'boolean',
|
|
101
|
+
description: 'Include full content in list results (default: false)',
|
|
102
|
+
},
|
|
103
|
+
// Pagination
|
|
104
|
+
limit: {
|
|
105
|
+
type: 'number',
|
|
106
|
+
description: 'Max items to return',
|
|
107
|
+
},
|
|
108
|
+
offset: {
|
|
109
|
+
type: 'number',
|
|
110
|
+
description: 'Number of items to skip',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
required: ['operation'],
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
function validateRequired(args, ...fields) {
|
|
117
|
+
for (const field of fields) {
|
|
118
|
+
if (args[field] === undefined || args[field] === null || args[field] === '') {
|
|
119
|
+
throw new Error(`${field} is required`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
export function createBlueprintOperations(apiClient) {
|
|
124
|
+
return {
|
|
125
|
+
create: async (args, _userId) => {
|
|
126
|
+
validateRequired(args, 'specificationId', 'title');
|
|
127
|
+
return await apiClient.call('create_blueprint', {
|
|
128
|
+
specificationId: args.specificationId,
|
|
129
|
+
title: args.title,
|
|
130
|
+
description: args.description,
|
|
131
|
+
slug: args.slug,
|
|
132
|
+
category: args.category,
|
|
133
|
+
content: args.content,
|
|
134
|
+
format: args.format,
|
|
135
|
+
tags: args.tags,
|
|
136
|
+
status: args.status,
|
|
137
|
+
version: args.version,
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
get: async (args, _userId) => {
|
|
141
|
+
validateRequired(args, 'blueprintId');
|
|
142
|
+
return await apiClient.call('get_blueprint', {
|
|
143
|
+
blueprintId: args.blueprintId,
|
|
144
|
+
});
|
|
145
|
+
},
|
|
146
|
+
update: async (args, _userId) => {
|
|
147
|
+
validateRequired(args, 'blueprintId');
|
|
148
|
+
return await apiClient.call('update_blueprint', {
|
|
149
|
+
blueprintId: args.blueprintId,
|
|
150
|
+
title: args.title,
|
|
151
|
+
description: args.description,
|
|
152
|
+
slug: args.slug,
|
|
153
|
+
category: args.category,
|
|
154
|
+
content: args.content,
|
|
155
|
+
format: args.format,
|
|
156
|
+
tags: args.tags,
|
|
157
|
+
status: args.status,
|
|
158
|
+
order: args.order,
|
|
159
|
+
version: args.version,
|
|
160
|
+
});
|
|
161
|
+
},
|
|
162
|
+
list: async (args, _userId) => {
|
|
163
|
+
validateRequired(args, 'specificationId');
|
|
164
|
+
return await apiClient.call('list_blueprints', {
|
|
165
|
+
specificationId: args.specificationId,
|
|
166
|
+
category: args.category,
|
|
167
|
+
status: args.status,
|
|
168
|
+
limit: args.limit,
|
|
169
|
+
offset: args.offset,
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
delete: async (args, _userId) => {
|
|
173
|
+
validateRequired(args, 'blueprintId');
|
|
174
|
+
return await apiClient.call('delete_blueprint', {
|
|
175
|
+
blueprintId: args.blueprintId,
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
link: async (args, _userId) => {
|
|
179
|
+
validateRequired(args, 'ticketId', 'blueprintId');
|
|
180
|
+
return await apiClient.call('link_ticket_blueprint', {
|
|
181
|
+
ticketId: args.ticketId,
|
|
182
|
+
blueprintId: args.blueprintId,
|
|
183
|
+
context: args.context,
|
|
184
|
+
section: args.section,
|
|
185
|
+
});
|
|
186
|
+
},
|
|
187
|
+
unlink: async (args, _userId) => {
|
|
188
|
+
// Either referenceId or both ticketId and blueprintId required
|
|
189
|
+
if (!args.referenceId && (!args.ticketId || !args.blueprintId)) {
|
|
190
|
+
throw new Error('Either referenceId or both ticketId and blueprintId are required');
|
|
191
|
+
}
|
|
192
|
+
return await apiClient.call('unlink_ticket_blueprint', {
|
|
193
|
+
referenceId: args.referenceId,
|
|
194
|
+
ticketId: args.ticketId,
|
|
195
|
+
blueprintId: args.blueprintId,
|
|
196
|
+
});
|
|
197
|
+
},
|
|
198
|
+
get_for_ticket: async (args, _userId) => {
|
|
199
|
+
validateRequired(args, 'ticketId');
|
|
200
|
+
return await apiClient.call('get_ticket_blueprints', {
|
|
201
|
+
ticketId: args.ticketId,
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
export function createBlueprintHandler(apiClient) {
|
|
207
|
+
const operations = createBlueprintOperations(apiClient);
|
|
208
|
+
return createOperationRouter('blueprint', operations);
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=blueprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../../src/tools/core/blueprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"epic.d.ts","sourceRoot":"","sources":["../../../src/tools/core/epic.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"epic.d.ts","sourceRoot":"","sources":["../../../src/tools/core/epic.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,oCAAoC,CAAC;AAE1D,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,eAAO,MAAM,QAAQ,EAAE,IAmItB,CAAC;AAUF,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAmG3F;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,oEAGrD"}
|