@specforge/mcp 3.0.3 → 3.0.6
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/autopilot/agents/agent-runner.d.ts.map +1 -1
- package/dist/autopilot/agents/agent-runner.js +20 -0
- package/dist/autopilot/agents/agent-runner.js.map +1 -1
- package/dist/autopilot/api/autopilot-api-client.d.ts.map +1 -1
- package/dist/autopilot/api/autopilot-api-client.js +12 -0
- package/dist/autopilot/api/autopilot-api-client.js.map +1 -1
- package/dist/autopilot/types.d.ts +6 -0
- package/dist/autopilot/types.d.ts.map +1 -1
- package/dist/autopilot/types.js.map +1 -1
- package/dist/cli/commands/check-circular.d.ts +24 -0
- package/dist/cli/commands/check-circular.d.ts.map +1 -0
- package/dist/cli/commands/check-circular.js +131 -0
- package/dist/cli/commands/check-circular.js.map +1 -0
- package/dist/cli/commands/critical-path.d.ts +23 -0
- package/dist/cli/commands/critical-path.d.ts.map +1 -0
- package/dist/cli/commands/critical-path.js +151 -0
- package/dist/cli/commands/critical-path.js.map +1 -0
- package/dist/cli/commands/index.d.ts +3 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +3 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/tree.d.ts +25 -0
- package/dist/cli/commands/tree.d.ts.map +1 -0
- package/dist/cli/commands/tree.js +132 -0
- package/dist/cli/commands/tree.js.map +1 -0
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +7 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +137 -0
- package/dist/tools/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Critical Path Command
|
|
3
|
+
*
|
|
4
|
+
* Display the critical path (longest dependency chain) for a specification.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import { resolveConfig } from '../config/index.js';
|
|
8
|
+
import { withErrorHandler, CliError, NetworkError } from '../middleware/error-handler.js';
|
|
9
|
+
import { printBlank, printHeader } from '../ui/output.js';
|
|
10
|
+
import { colors } from '../ui/colors.js';
|
|
11
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
12
|
+
/**
|
|
13
|
+
* Format ticket ID for display
|
|
14
|
+
*/
|
|
15
|
+
function formatTicketId(ticketNumber) {
|
|
16
|
+
return colors.primary(`T-${ticketNumber}`);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Get status color
|
|
20
|
+
*/
|
|
21
|
+
function getStatusColor(status) {
|
|
22
|
+
switch (status) {
|
|
23
|
+
case 'done':
|
|
24
|
+
return colors.muted;
|
|
25
|
+
case 'active':
|
|
26
|
+
return colors.primary;
|
|
27
|
+
case 'ready':
|
|
28
|
+
return colors.success;
|
|
29
|
+
case 'pending':
|
|
30
|
+
return colors.warning;
|
|
31
|
+
default:
|
|
32
|
+
return (s) => s;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Display critical path in human-readable format
|
|
37
|
+
*/
|
|
38
|
+
function displayCriticalPath(response) {
|
|
39
|
+
printBlank();
|
|
40
|
+
printHeader('Critical Path');
|
|
41
|
+
printBlank();
|
|
42
|
+
if (response.path.length === 0) {
|
|
43
|
+
console.log(colors.muted('No incomplete tickets found.'));
|
|
44
|
+
console.log(colors.muted('All tickets may be completed or there are no dependencies.'));
|
|
45
|
+
printBlank();
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
console.log(`${colors.bold('Length:')} ${response.path.length} tickets`);
|
|
49
|
+
console.log(`${colors.bold('Estimated:')} ${response.totalEstimatedHours}h total`);
|
|
50
|
+
printBlank();
|
|
51
|
+
// Display path as a chain
|
|
52
|
+
console.log(colors.muted('Dependency chain (must be completed in order):'));
|
|
53
|
+
printBlank();
|
|
54
|
+
for (let i = 0; i < response.path.length; i++) {
|
|
55
|
+
const ticket = response.path[i];
|
|
56
|
+
const statusColor = getStatusColor(ticket.status);
|
|
57
|
+
const prefix = i === 0 ? ' ' : ' │\n └──▶ ';
|
|
58
|
+
const isFirst = i === 0;
|
|
59
|
+
if (isFirst) {
|
|
60
|
+
console.log(` ┌── ${formatTicketId(ticket.ticketNumber)}: ${ticket.title}`);
|
|
61
|
+
console.log(` │ Status: ${statusColor(ticket.status)}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
console.log(` │`);
|
|
65
|
+
console.log(` └──▶ ${formatTicketId(ticket.ticketNumber)}: ${ticket.title}`);
|
|
66
|
+
if (i < response.path.length - 1) {
|
|
67
|
+
console.log(` ┌── Status: ${statusColor(ticket.status)}`);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.log(` Status: ${statusColor(ticket.status)}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
printBlank();
|
|
75
|
+
console.log(colors.muted('The critical path shows the longest chain of dependent tickets.'));
|
|
76
|
+
console.log(colors.muted('Completing these first will make the most progress.'));
|
|
77
|
+
printBlank();
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Critical path command action handler
|
|
81
|
+
*/
|
|
82
|
+
export async function criticalPathAction(options) {
|
|
83
|
+
const config = resolveConfig();
|
|
84
|
+
if (!config.apiKey) {
|
|
85
|
+
throw new CliError('Not authenticated', 1, 'Run `specforge login` to authenticate first');
|
|
86
|
+
}
|
|
87
|
+
// Determine specification to use
|
|
88
|
+
const specificationId = options.specificationId || config.specificationId;
|
|
89
|
+
if (!specificationId) {
|
|
90
|
+
throw new CliError('No specification configured', 1, "Run 'specforge init' to set a specification, or use -s/--specification-id");
|
|
91
|
+
}
|
|
92
|
+
const spinner = ora({
|
|
93
|
+
text: 'Calculating critical path...',
|
|
94
|
+
color: 'cyan',
|
|
95
|
+
}).start();
|
|
96
|
+
try {
|
|
97
|
+
const client = new ApiClient({
|
|
98
|
+
apiKey: config.apiKey,
|
|
99
|
+
apiUrl: config.apiUrl,
|
|
100
|
+
debug: config.debug,
|
|
101
|
+
});
|
|
102
|
+
const result = await client.call('get_critical_path', {
|
|
103
|
+
specificationId,
|
|
104
|
+
});
|
|
105
|
+
spinner.stop();
|
|
106
|
+
if (options.json) {
|
|
107
|
+
console.log(JSON.stringify(result, null, 2));
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
displayCriticalPath(result);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
spinner.fail('Failed to calculate critical path');
|
|
114
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
115
|
+
if (message.includes('404') || message.includes('not found')) {
|
|
116
|
+
throw new CliError('Specification not found', 1, 'The configured specification may have been deleted. Run `specforge init` to select a new one.');
|
|
117
|
+
}
|
|
118
|
+
if (message.includes('401') || message.includes('Unauthorized')) {
|
|
119
|
+
throw new CliError('Authentication failed', 1, 'Your API key may be invalid. Run `specforge login` to re-authenticate');
|
|
120
|
+
}
|
|
121
|
+
throw new NetworkError(`Failed to calculate critical path: ${message}`);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Register critical-path command with Commander
|
|
126
|
+
*/
|
|
127
|
+
export function registerCriticalPathCommand(program) {
|
|
128
|
+
program
|
|
129
|
+
.command('critical-path')
|
|
130
|
+
.description('Show the critical path (longest dependency chain)')
|
|
131
|
+
.option('-s, --specification-id <id>', 'Specification ID')
|
|
132
|
+
.option('--json', 'Output as JSON')
|
|
133
|
+
.addHelpText('after', `
|
|
134
|
+
Examples:
|
|
135
|
+
$ specforge critical-path # Show critical path for current spec
|
|
136
|
+
$ specforge critical-path --json # Output as JSON
|
|
137
|
+
$ specforge critical-path -s spec-123 # Show for specific specification
|
|
138
|
+
|
|
139
|
+
The critical path is the longest chain of dependent tickets that must be
|
|
140
|
+
completed sequentially. Understanding this path helps with:
|
|
141
|
+
|
|
142
|
+
- Identifying bottlenecks in your implementation plan
|
|
143
|
+
- Prioritizing which tickets to work on first
|
|
144
|
+
- Estimating minimum time to complete all work
|
|
145
|
+
|
|
146
|
+
If the dependency tree has been generated (via \`specforge tree\`), this
|
|
147
|
+
operation runs in O(1) time. Otherwise, it calculates the path on-the-fly.
|
|
148
|
+
`)
|
|
149
|
+
.action(withErrorHandler(criticalPathAction));
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=critical-path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"critical-path.js","sourceRoot":"","sources":["../../../src/cli/commands/critical-path.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,4 +19,7 @@ export { registerFeedbackCommand } from './feedback.js';
|
|
|
19
19
|
export { registerBlueprintsCommand } from './blueprints.js';
|
|
20
20
|
export { registerMembersCommand } from './members.js';
|
|
21
21
|
export { registerInvitationsCommand } from './invitations.js';
|
|
22
|
+
export { registerCheckCircularCommand } from './check-circular.js';
|
|
23
|
+
export { registerTreeCommand } from './tree.js';
|
|
24
|
+
export { registerCriticalPathCommand } from './critical-path.js';
|
|
22
25
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -19,4 +19,7 @@ export { registerFeedbackCommand } from './feedback.js';
|
|
|
19
19
|
export { registerBlueprintsCommand } from './blueprints.js';
|
|
20
20
|
export { registerMembersCommand } from './members.js';
|
|
21
21
|
export { registerInvitationsCommand } from './invitations.js';
|
|
22
|
+
export { registerCheckCircularCommand } from './check-circular.js';
|
|
23
|
+
export { registerTreeCommand } from './tree.js';
|
|
24
|
+
export { registerCriticalPathCommand } from './critical-path.js';
|
|
22
25
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/commands/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,2BAA2B,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree Command
|
|
3
|
+
*
|
|
4
|
+
* Generate and display the dependency tree for a specification.
|
|
5
|
+
*/
|
|
6
|
+
import { Command } from 'commander';
|
|
7
|
+
/**
|
|
8
|
+
* Command options
|
|
9
|
+
*/
|
|
10
|
+
interface TreeOptions {
|
|
11
|
+
specificationId?: string;
|
|
12
|
+
projectId?: string;
|
|
13
|
+
force?: boolean;
|
|
14
|
+
json?: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Tree command action handler
|
|
18
|
+
*/
|
|
19
|
+
export declare function treeAction(options: TreeOptions): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Register tree command with Commander
|
|
22
|
+
*/
|
|
23
|
+
export declare function registerTreeCommand(program: Command): void;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/tree.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,UAAU,WAAW;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAsFD;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEpE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyB1D"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tree Command
|
|
3
|
+
*
|
|
4
|
+
* Generate and display the dependency tree for a specification.
|
|
5
|
+
*/
|
|
6
|
+
import ora from 'ora';
|
|
7
|
+
import { resolveConfig } from '../config/index.js';
|
|
8
|
+
import { withErrorHandler, CliError, NetworkError } from '../middleware/error-handler.js';
|
|
9
|
+
import { printBlank, printHeader } from '../ui/output.js';
|
|
10
|
+
import { colors } from '../ui/colors.js';
|
|
11
|
+
import { ApiClient } from '../../client/api-client.js';
|
|
12
|
+
/**
|
|
13
|
+
* Display tree summary in human-readable format
|
|
14
|
+
*/
|
|
15
|
+
function displayTreeSummary(response) {
|
|
16
|
+
printBlank();
|
|
17
|
+
printHeader('Dependency Tree Generated');
|
|
18
|
+
printBlank();
|
|
19
|
+
const summary = response.summary;
|
|
20
|
+
console.log(`Version: ${colors.primary(String(response.version))}`);
|
|
21
|
+
console.log(`Generated: ${colors.muted(new Date(response.generatedAt).toLocaleString())}`);
|
|
22
|
+
printBlank();
|
|
23
|
+
// Ticket counts by status
|
|
24
|
+
console.log(colors.bold('Ticket Status:'));
|
|
25
|
+
console.log(` Pending: ${colors.warning(String(summary.ticketsByStatus.pending))}`);
|
|
26
|
+
console.log(` Ready: ${colors.success(String(summary.ticketsByStatus.ready))}`);
|
|
27
|
+
console.log(` Active: ${colors.primary(String(summary.ticketsByStatus.active))}`);
|
|
28
|
+
console.log(` Done: ${colors.muted(String(summary.ticketsByStatus.done))}`);
|
|
29
|
+
console.log(` Total: ${colors.bold(String(summary.totalTickets))}`);
|
|
30
|
+
printBlank();
|
|
31
|
+
// Ready tickets
|
|
32
|
+
if (summary.readyTickets.length > 0) {
|
|
33
|
+
console.log(`${colors.success(`${summary.readyTickets.length} tickets ready`)} to work on`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
console.log(colors.warning('No tickets ready to work on'));
|
|
37
|
+
}
|
|
38
|
+
// Blocked tickets
|
|
39
|
+
if (summary.blockedTickets.length > 0) {
|
|
40
|
+
console.log(`${colors.warning(`${summary.blockedTickets.length} tickets blocked`)} by dependencies`);
|
|
41
|
+
}
|
|
42
|
+
// Critical path
|
|
43
|
+
if (summary.criticalPathLength > 0) {
|
|
44
|
+
console.log(`Critical path: ${colors.primary(`${summary.criticalPathLength} tickets`)} ` +
|
|
45
|
+
`(${summary.criticalPathHours}h estimated)`);
|
|
46
|
+
}
|
|
47
|
+
// Circular dependencies warning
|
|
48
|
+
if (summary.hasCircularDeps) {
|
|
49
|
+
printBlank();
|
|
50
|
+
console.log(colors.error('Warning: Circular dependencies detected!'));
|
|
51
|
+
console.log(colors.muted('Run `specforge check-circular` for details.'));
|
|
52
|
+
}
|
|
53
|
+
printBlank();
|
|
54
|
+
console.log(colors.muted('Use `specforge next` to see the next actionable ticket.'));
|
|
55
|
+
printBlank();
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Tree command action handler
|
|
59
|
+
*/
|
|
60
|
+
export async function treeAction(options) {
|
|
61
|
+
const config = resolveConfig();
|
|
62
|
+
if (!config.apiKey) {
|
|
63
|
+
throw new CliError('Not authenticated', 1, 'Run `specforge login` to authenticate first');
|
|
64
|
+
}
|
|
65
|
+
// Determine specification to use
|
|
66
|
+
const specificationId = options.specificationId || config.specificationId;
|
|
67
|
+
if (!specificationId && !options.projectId) {
|
|
68
|
+
throw new CliError('No specification configured', 1, "Run 'specforge init' to set a specification, or use -s/--specification-id");
|
|
69
|
+
}
|
|
70
|
+
const spinner = ora({
|
|
71
|
+
text: 'Generating dependency tree...',
|
|
72
|
+
color: 'cyan',
|
|
73
|
+
}).start();
|
|
74
|
+
try {
|
|
75
|
+
const client = new ApiClient({
|
|
76
|
+
apiKey: config.apiKey,
|
|
77
|
+
apiUrl: config.apiUrl,
|
|
78
|
+
debug: config.debug,
|
|
79
|
+
});
|
|
80
|
+
const result = await client.call('generate_dependency_tree', {
|
|
81
|
+
specificationId,
|
|
82
|
+
force: options.force,
|
|
83
|
+
});
|
|
84
|
+
spinner.stop();
|
|
85
|
+
if (options.json) {
|
|
86
|
+
console.log(JSON.stringify(result, null, 2));
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
displayTreeSummary(result);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
spinner.fail('Failed to generate dependency tree');
|
|
93
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
94
|
+
if (message.includes('404') || message.includes('not found')) {
|
|
95
|
+
throw new CliError('Specification not found', 1, 'The configured specification may have been deleted. Run `specforge init` to select a new one.');
|
|
96
|
+
}
|
|
97
|
+
if (message.includes('401') || message.includes('Unauthorized')) {
|
|
98
|
+
throw new CliError('Authentication failed', 1, 'Your API key may be invalid. Run `specforge login` to re-authenticate');
|
|
99
|
+
}
|
|
100
|
+
throw new NetworkError(`Failed to generate dependency tree: ${message}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Register tree command with Commander
|
|
105
|
+
*/
|
|
106
|
+
export function registerTreeCommand(program) {
|
|
107
|
+
program
|
|
108
|
+
.command('tree')
|
|
109
|
+
.description('Generate and display the dependency tree')
|
|
110
|
+
.option('-s, --specification-id <id>', 'Specification ID to generate tree for')
|
|
111
|
+
.option('-p, --project-id <id>', 'Project ID (generates trees for all specifications)')
|
|
112
|
+
.option('--force', 'Force regeneration even if tree exists')
|
|
113
|
+
.option('--json', 'Output as JSON')
|
|
114
|
+
.addHelpText('after', `
|
|
115
|
+
Examples:
|
|
116
|
+
$ specforge tree # Generate tree for current specification
|
|
117
|
+
$ specforge tree --force # Force regeneration
|
|
118
|
+
$ specforge tree --json # Output as JSON
|
|
119
|
+
$ specforge tree -s spec-123 # Generate for specific specification
|
|
120
|
+
|
|
121
|
+
The tree command pre-computes and stores a dependency tree on the specification.
|
|
122
|
+
This enables fast O(1) reads for operations like:
|
|
123
|
+
- specforge next (get next actionable tickets)
|
|
124
|
+
- specforge blockers (get blocked tickets)
|
|
125
|
+
- specforge critical-path (get critical path)
|
|
126
|
+
|
|
127
|
+
The tree is automatically updated when tickets or dependencies change,
|
|
128
|
+
but you can regenerate it manually with --force if needed.
|
|
129
|
+
`)
|
|
130
|
+
.action(withErrorHandler(treeAction));
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree.js","sourceRoot":"","sources":["../../../src/cli/commands/tree.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgCpC;;GAEG;AACH,QAAA,MAAM,WAAW,UAAU,CAAC;AA0L5B;;GAEG;AACH,QAAA,MAAM,OAAO,SAAkB,CAAC;AAShC;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,IAAI,CAQ1D;AAED;;GAEG;AACH,OAAO,EAAE,OAAO,EAAE,CAAC;AAEnB;;GAEG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -9,7 +9,7 @@ import { authGuardHook } from './middleware/auth-guard.js';
|
|
|
9
9
|
import { withErrorHandler, debugLog } from './middleware/error-handler.js';
|
|
10
10
|
import { resolveConfig } from './config/loader.js';
|
|
11
11
|
import { colors } from './ui/index.js';
|
|
12
|
-
import { registerLoginCommand, registerInitCommand, registerConfigureCommand, registerDoctorCommand, registerStatusCommand, registerProjectsCommand, registerSpecsCommand, registerSwitchCommand, registerTicketsCommand, registerNextCommand, registerBlockedCommand, registerFeedbackCommand, registerBlueprintsCommand, registerMembersCommand, registerInvitationsCommand, } from './commands/index.js';
|
|
12
|
+
import { registerLoginCommand, registerInitCommand, registerConfigureCommand, registerDoctorCommand, registerStatusCommand, registerProjectsCommand, registerSpecsCommand, registerSwitchCommand, registerTicketsCommand, registerNextCommand, registerBlockedCommand, registerFeedbackCommand, registerBlueprintsCommand, registerMembersCommand, registerInvitationsCommand, registerCheckCircularCommand, registerTreeCommand, registerCriticalPathCommand, } from './commands/index.js';
|
|
13
13
|
import { registerTicketCommand } from './commands/ticket/index.js';
|
|
14
14
|
import { registerSessionCommands } from './commands/session/index.js';
|
|
15
15
|
import { registerDebugCommands } from './commands/debug/index.js';
|
|
@@ -109,6 +109,12 @@ function registerCommands(program) {
|
|
|
109
109
|
registerNextCommand(program);
|
|
110
110
|
// E10 - Blocked Command (implemented)
|
|
111
111
|
registerBlockedCommand(program);
|
|
112
|
+
// Check Circular Dependencies Command (implemented)
|
|
113
|
+
registerCheckCircularCommand(program);
|
|
114
|
+
// Tree Command (implemented)
|
|
115
|
+
registerTreeCommand(program);
|
|
116
|
+
// Critical Path Command (implemented)
|
|
117
|
+
registerCriticalPathCommand(program);
|
|
112
118
|
// E11 - Ticket Command (implemented)
|
|
113
119
|
registerTicketCommand(program);
|
|
114
120
|
// E12 - Session Commands (implemented)
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,yBAAyB,EACzB,sBAAsB,EACtB,0BAA0B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.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,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAML,gBAAgB,EAKjB,MAAM,wBAAwB,CAAC;AAwBhC;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAML,gBAAgB,EAKjB,MAAM,wBAAwB,CAAC;AAwBhC;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAgFD,wBAAgB,QAAQ,IAAI,IAAI,EAAE,CAugFjC;AAED;;GAEG;AACH,KAAK,WAAW,GAAG,CACjB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,OAAO,CAAC,CAAC;AA6EtB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,SAAS,GACnB,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAmoC7B;AAqCD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,CAAC,CA4DlB;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,KAAK,GAAE,OAAe,GACrB,OAAO,CAAC,OAAO,GAAG,gBAAgB,CAAC,CAOrC;AAGD,OAAO,EACL,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC"}
|
package/dist/tools/index.js
CHANGED
|
@@ -66,6 +66,7 @@ const READ_TOOL_NAMES = new Set([
|
|
|
66
66
|
'lookup_tickets_by_status',
|
|
67
67
|
// Dependency operations
|
|
68
68
|
'get_dependency_tree',
|
|
69
|
+
'check_circular_dependencies',
|
|
69
70
|
// Context operations
|
|
70
71
|
'get_implementation_context',
|
|
71
72
|
'get_next_actionable_tickets',
|
|
@@ -602,6 +603,29 @@ Optional includes (ignored when summary=true):
|
|
|
602
603
|
required: ['specificationId'],
|
|
603
604
|
},
|
|
604
605
|
},
|
|
606
|
+
{
|
|
607
|
+
name: 'check_circular_dependencies',
|
|
608
|
+
description: `Check for circular dependencies between tickets in a specification.
|
|
609
|
+
|
|
610
|
+
Returns any cycles found where tickets depend on each other in a loop (e.g., A→B→C→A).
|
|
611
|
+
|
|
612
|
+
Examples:
|
|
613
|
+
- check_circular_dependencies specificationId="spec-123"
|
|
614
|
+
- check_circular_dependencies projectId="proj-123" // Check all specs in project`,
|
|
615
|
+
inputSchema: {
|
|
616
|
+
type: 'object',
|
|
617
|
+
properties: {
|
|
618
|
+
specificationId: {
|
|
619
|
+
type: 'string',
|
|
620
|
+
description: 'Specification ID to check (optional if projectId provided)',
|
|
621
|
+
},
|
|
622
|
+
projectId: {
|
|
623
|
+
type: 'string',
|
|
624
|
+
description: 'Project ID to check all specifications (optional if specificationId provided)',
|
|
625
|
+
},
|
|
626
|
+
},
|
|
627
|
+
},
|
|
628
|
+
},
|
|
605
629
|
// ========================================================================
|
|
606
630
|
// Context & AI Tools (Epic 4)
|
|
607
631
|
// ========================================================================
|
|
@@ -814,6 +838,34 @@ Optional includes (ignored when summary=true):
|
|
|
814
838
|
required: ['ticketId', 'progress'],
|
|
815
839
|
},
|
|
816
840
|
},
|
|
841
|
+
{
|
|
842
|
+
name: 'pause_work_session',
|
|
843
|
+
description: 'Pause work on a ticket, setting it back to ready status. Use this to temporarily pause work on a ticket without completing it.',
|
|
844
|
+
inputSchema: {
|
|
845
|
+
type: 'object',
|
|
846
|
+
properties: {
|
|
847
|
+
ticketId: {
|
|
848
|
+
type: 'string',
|
|
849
|
+
description: 'The ID of the ticket to pause',
|
|
850
|
+
},
|
|
851
|
+
},
|
|
852
|
+
required: ['ticketId'],
|
|
853
|
+
},
|
|
854
|
+
},
|
|
855
|
+
{
|
|
856
|
+
name: 'resume_work_session',
|
|
857
|
+
description: 'Resume work on a paused ticket, setting it to active status. Use this to continue work on a ticket that was previously paused.',
|
|
858
|
+
inputSchema: {
|
|
859
|
+
type: 'object',
|
|
860
|
+
properties: {
|
|
861
|
+
ticketId: {
|
|
862
|
+
type: 'string',
|
|
863
|
+
description: 'The ID of the ticket to resume',
|
|
864
|
+
},
|
|
865
|
+
},
|
|
866
|
+
required: ['ticketId'],
|
|
867
|
+
},
|
|
868
|
+
},
|
|
817
869
|
// ========================================================================
|
|
818
870
|
// Status & Analytics Tools (Epic 8)
|
|
819
871
|
// ========================================================================
|
|
@@ -2534,6 +2586,51 @@ At least one scope filter (projectId, specificationId, or epicId) is required.`,
|
|
|
2534
2586
|
},
|
|
2535
2587
|
},
|
|
2536
2588
|
},
|
|
2589
|
+
// ========================================================================
|
|
2590
|
+
// Delete Operations
|
|
2591
|
+
// ========================================================================
|
|
2592
|
+
{
|
|
2593
|
+
name: 'delete_ticket',
|
|
2594
|
+
description: 'Delete a ticket and all its related records (dependencies, test results, discoveries, blueprint references)',
|
|
2595
|
+
inputSchema: {
|
|
2596
|
+
type: 'object',
|
|
2597
|
+
properties: {
|
|
2598
|
+
ticketId: {
|
|
2599
|
+
type: 'string',
|
|
2600
|
+
description: 'The ID of the ticket to delete',
|
|
2601
|
+
},
|
|
2602
|
+
},
|
|
2603
|
+
required: ['ticketId'],
|
|
2604
|
+
},
|
|
2605
|
+
},
|
|
2606
|
+
{
|
|
2607
|
+
name: 'delete_epic',
|
|
2608
|
+
description: 'Delete an epic and cascade delete all its tickets and related records',
|
|
2609
|
+
inputSchema: {
|
|
2610
|
+
type: 'object',
|
|
2611
|
+
properties: {
|
|
2612
|
+
epicId: {
|
|
2613
|
+
type: 'string',
|
|
2614
|
+
description: 'The ID of the epic to delete',
|
|
2615
|
+
},
|
|
2616
|
+
},
|
|
2617
|
+
required: ['epicId'],
|
|
2618
|
+
},
|
|
2619
|
+
},
|
|
2620
|
+
{
|
|
2621
|
+
name: 'delete_specification',
|
|
2622
|
+
description: 'Delete a specification and cascade delete all epics, tickets, and related records',
|
|
2623
|
+
inputSchema: {
|
|
2624
|
+
type: 'object',
|
|
2625
|
+
properties: {
|
|
2626
|
+
specificationId: {
|
|
2627
|
+
type: 'string',
|
|
2628
|
+
description: 'The ID of the specification to delete',
|
|
2629
|
+
},
|
|
2630
|
+
},
|
|
2631
|
+
required: ['specificationId'],
|
|
2632
|
+
},
|
|
2633
|
+
},
|
|
2537
2634
|
];
|
|
2538
2635
|
// Apply format parameter to all read operations
|
|
2539
2636
|
return tools.map(tool => READ_TOOL_NAMES.has(tool.name) ? addFormatParameter(tool) : tool);
|
|
@@ -2789,6 +2886,13 @@ export function createToolHandlers(apiClient) {
|
|
|
2789
2886
|
specificationId: args.specificationId,
|
|
2790
2887
|
});
|
|
2791
2888
|
},
|
|
2889
|
+
check_circular_dependencies: async (_client, args) => {
|
|
2890
|
+
const argsWithContext = injectContext(args, ['specificationId', 'projectId']);
|
|
2891
|
+
return await apiClient.call('check_circular_dependencies', {
|
|
2892
|
+
specificationId: argsWithContext.specificationId,
|
|
2893
|
+
projectId: argsWithContext.projectId,
|
|
2894
|
+
});
|
|
2895
|
+
},
|
|
2792
2896
|
// ========================================================================
|
|
2793
2897
|
// Context & AI Tools
|
|
2794
2898
|
// ========================================================================
|
|
@@ -3033,6 +3137,18 @@ export function createToolHandlers(apiClient) {
|
|
|
3033
3137
|
message: args.message,
|
|
3034
3138
|
});
|
|
3035
3139
|
},
|
|
3140
|
+
pause_work_session: async (_client, args) => {
|
|
3141
|
+
validateRequired(args, 'ticketId');
|
|
3142
|
+
return await apiClient.call('pause_work_session', {
|
|
3143
|
+
ticketId: args.ticketId,
|
|
3144
|
+
});
|
|
3145
|
+
},
|
|
3146
|
+
resume_work_session: async (_client, args) => {
|
|
3147
|
+
validateRequired(args, 'ticketId');
|
|
3148
|
+
return await apiClient.call('resume_work_session', {
|
|
3149
|
+
ticketId: args.ticketId,
|
|
3150
|
+
});
|
|
3151
|
+
},
|
|
3036
3152
|
// ========================================================================
|
|
3037
3153
|
// Status & Analytics Tools
|
|
3038
3154
|
// ========================================================================
|
|
@@ -3613,6 +3729,27 @@ export function createToolHandlers(apiClient) {
|
|
|
3613
3729
|
includeSent: args.includeSent,
|
|
3614
3730
|
});
|
|
3615
3731
|
},
|
|
3732
|
+
// ========================================================================
|
|
3733
|
+
// Delete Operations
|
|
3734
|
+
// ========================================================================
|
|
3735
|
+
delete_ticket: async (_client, args) => {
|
|
3736
|
+
validateRequired(args, 'ticketId');
|
|
3737
|
+
return await apiClient.call('delete_ticket', {
|
|
3738
|
+
ticketId: args.ticketId,
|
|
3739
|
+
});
|
|
3740
|
+
},
|
|
3741
|
+
delete_epic: async (_client, args) => {
|
|
3742
|
+
validateRequired(args, 'epicId');
|
|
3743
|
+
return await apiClient.call('delete_epic', {
|
|
3744
|
+
epicId: args.epicId,
|
|
3745
|
+
});
|
|
3746
|
+
},
|
|
3747
|
+
delete_specification: async (_client, args) => {
|
|
3748
|
+
validateRequired(args, 'specificationId');
|
|
3749
|
+
return await apiClient.call('delete_specification', {
|
|
3750
|
+
specificationId: args.specificationId,
|
|
3751
|
+
});
|
|
3752
|
+
},
|
|
3616
3753
|
};
|
|
3617
3754
|
}
|
|
3618
3755
|
/**
|