claude-autopm 1.12.2 → 1.13.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/.github/workflows/test.yml +50 -0
- package/README.md +139 -3
- package/autopm/.claude/config.json +2 -0
- package/autopm/.claude/providers/azure/issue-show.js +1 -293
- package/bin/autopm.js +20 -0
- package/bin/commands/mcp.js +175 -0
- package/install/install.js +17 -0
- package/package.json +5 -5
- package/scripts/mcp-handler.js +1019 -1
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
name: Tests
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test-matrix:
|
|
11
|
+
name: test-matrix
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
|
|
14
|
+
strategy:
|
|
15
|
+
matrix:
|
|
16
|
+
node-version: [18.x, 20.x]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- name: Checkout code
|
|
20
|
+
uses: actions/checkout@v4
|
|
21
|
+
|
|
22
|
+
- name: Setup Node.js ${{ matrix.node-version }}
|
|
23
|
+
uses: actions/setup-node@v4
|
|
24
|
+
with:
|
|
25
|
+
node-version: ${{ matrix.node-version }}
|
|
26
|
+
cache: 'npm'
|
|
27
|
+
|
|
28
|
+
- name: Install dependencies
|
|
29
|
+
run: npm ci
|
|
30
|
+
|
|
31
|
+
- name: Run quick tests
|
|
32
|
+
run: npm test
|
|
33
|
+
|
|
34
|
+
- name: Check test coverage
|
|
35
|
+
run: npm run test:coverage
|
|
36
|
+
|
|
37
|
+
# Summary job that branch protection can depend on
|
|
38
|
+
test:
|
|
39
|
+
name: test
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
needs: test-matrix
|
|
42
|
+
if: always()
|
|
43
|
+
steps:
|
|
44
|
+
- name: Check test results
|
|
45
|
+
run: |
|
|
46
|
+
if [ "${{ needs.test-matrix.result }}" != "success" ]; then
|
|
47
|
+
echo "Tests failed"
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
echo "All tests passed"
|
package/README.md
CHANGED
|
@@ -41,6 +41,28 @@ ClaudeAutoPM uses a **hybrid approach** combining deterministic operations with
|
|
|
41
41
|
- **Smart Context Management** - Never lose track of your work
|
|
42
42
|
- **Automated Workflows** - From PRD to production deployment
|
|
43
43
|
|
|
44
|
+
## 📺 Visual Walkthrough
|
|
45
|
+
|
|
46
|
+
See ClaudeAutoPM in action - from installation to deployment:
|
|
47
|
+
|
|
48
|
+
### 1️⃣ Install AutoPM
|
|
49
|
+

|
|
50
|
+
|
|
51
|
+
### 2️⃣ First Claude Execution
|
|
52
|
+

|
|
53
|
+
|
|
54
|
+
### 3️⃣ Creation of PRD
|
|
55
|
+

|
|
56
|
+
|
|
57
|
+
### 4️⃣ GitHub Sync and Start Working on Issues
|
|
58
|
+

|
|
59
|
+
|
|
60
|
+
### 5️⃣ Issues Finished
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
### 6️⃣ Checking the Work Done (Web App + FastAPI)
|
|
64
|
+

|
|
65
|
+
|
|
44
66
|
## 🚀 Get Started in 5 Minutes
|
|
45
67
|
|
|
46
68
|
### 🎯 Quick Start for New Users
|
|
@@ -215,7 +237,9 @@ autopm pm:epic-sync user-auth
|
|
|
215
237
|
- **50+ Specialized AI Agents** - Python, React, K8s, AWS, and more
|
|
216
238
|
- **Parallel Execution** - Multiple agents working simultaneously
|
|
217
239
|
- **Cross-Platform** - GitHub, Azure DevOps, GitLab (coming soon)
|
|
218
|
-
- **MCP Integration** - Context
|
|
240
|
+
- **MCP Integration** - Model Context Protocol for live documentation, codebase analysis, and tool integration
|
|
241
|
+
- **Agent Analysis** - Discover which agents use MCP and their configurations
|
|
242
|
+
- **Interactive Diagnostics** - Comprehensive health checks and connection testing
|
|
219
243
|
|
|
220
244
|
### 🤖 Dynamic Agent Teams
|
|
221
245
|
|
|
@@ -262,6 +286,110 @@ git checkout -b feat/backend/new-api # Auto-loads 'python_backend' team
|
|
|
262
286
|
|
|
263
287
|
Teams support inheritance, so specialized teams automatically include base agents. The active team configuration is saved in your project and persists across sessions.
|
|
264
288
|
|
|
289
|
+
## 🔌 MCP (Model Context Protocol) Management
|
|
290
|
+
|
|
291
|
+
ClaudeAutoPM provides comprehensive MCP management for agent-to-tool integration. **39 out of 53 agents (74%)** use MCP servers for live documentation and external tool access.
|
|
292
|
+
|
|
293
|
+
### Quick Start with MCP
|
|
294
|
+
|
|
295
|
+
```bash
|
|
296
|
+
# List all available MCP servers
|
|
297
|
+
autopm mcp list
|
|
298
|
+
|
|
299
|
+
# Check which agents use MCP
|
|
300
|
+
autopm mcp agents
|
|
301
|
+
🤖 Agents Using MCP
|
|
302
|
+
|
|
303
|
+
✅ react-frontend-engineer
|
|
304
|
+
└─ context7-docs
|
|
305
|
+
|
|
306
|
+
✅ python-backend-engineer
|
|
307
|
+
└─ context7-docs
|
|
308
|
+
└─ sqlite-mcp
|
|
309
|
+
|
|
310
|
+
📊 Summary:
|
|
311
|
+
Total agents: 53
|
|
312
|
+
Using MCP: 39 (74%)
|
|
313
|
+
|
|
314
|
+
# Enable MCP servers
|
|
315
|
+
autopm mcp enable context7-docs
|
|
316
|
+
autopm mcp enable github-mcp
|
|
317
|
+
|
|
318
|
+
# Configure API keys interactively
|
|
319
|
+
autopm mcp setup
|
|
320
|
+
|
|
321
|
+
# Sync configuration
|
|
322
|
+
autopm mcp sync
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### MCP Commands
|
|
326
|
+
|
|
327
|
+
#### **Agent Analysis**
|
|
328
|
+
```bash
|
|
329
|
+
autopm mcp agents # List agents using MCP
|
|
330
|
+
autopm mcp agents --by-server # Group by MCP server
|
|
331
|
+
autopm mcp agent <name> # Show agent MCP config
|
|
332
|
+
autopm mcp usage # Usage statistics
|
|
333
|
+
autopm mcp tree # Dependency tree
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
#### **Configuration & Diagnostics**
|
|
337
|
+
```bash
|
|
338
|
+
autopm mcp setup # Interactive API key setup
|
|
339
|
+
autopm mcp diagnose # Run diagnostics
|
|
340
|
+
autopm mcp test <server> # Test server connection
|
|
341
|
+
autopm mcp status # Show servers status
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
#### **Server Management**
|
|
345
|
+
```bash
|
|
346
|
+
autopm mcp list # List available servers
|
|
347
|
+
autopm mcp info <server> # Server details
|
|
348
|
+
autopm mcp enable <server> # Enable server
|
|
349
|
+
autopm mcp disable <server> # Disable server
|
|
350
|
+
autopm mcp sync # Sync configuration
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### MCP Server Types
|
|
354
|
+
|
|
355
|
+
- **Documentation** - `context7-docs` for live framework documentation (React, Python, AWS, etc.)
|
|
356
|
+
- **Codebase** - `context7-codebase` for project analysis and navigation
|
|
357
|
+
- **GitHub** - `github-mcp` for repository operations
|
|
358
|
+
- **Databases** - `sqlite-mcp`, `postgresql-mcp`, `mongodb-mcp` for data operations
|
|
359
|
+
- **Browser** - `playwright-mcp` for E2E testing and automation
|
|
360
|
+
|
|
361
|
+
### Example: Setting Up Context7
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
# 1. Enable context7 documentation server
|
|
365
|
+
autopm mcp enable context7-docs
|
|
366
|
+
|
|
367
|
+
# 2. Configure API key
|
|
368
|
+
cat > .claude/.env << EOF
|
|
369
|
+
CONTEXT7_API_KEY=your-api-key-here
|
|
370
|
+
CONTEXT7_WORKSPACE=your-workspace-id
|
|
371
|
+
EOF
|
|
372
|
+
|
|
373
|
+
# 3. Sync configuration
|
|
374
|
+
autopm mcp sync
|
|
375
|
+
|
|
376
|
+
# 4. Verify setup
|
|
377
|
+
autopm mcp diagnose
|
|
378
|
+
|
|
379
|
+
# 5. Test connection
|
|
380
|
+
autopm mcp test context7-docs
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### MCP Benefits
|
|
384
|
+
|
|
385
|
+
- ✅ **Live Documentation** - Agents access latest framework docs automatically
|
|
386
|
+
- ✅ **Codebase Context** - Deep understanding of your project structure
|
|
387
|
+
- ✅ **Tool Integration** - GitHub, databases, browsers, and more
|
|
388
|
+
- ✅ **No Hallucinations** - Real-time data instead of outdated training
|
|
389
|
+
- ✅ **Extensible** - Add custom MCP servers for your tools
|
|
390
|
+
|
|
391
|
+
📖 **Full MCP Setup Guide**: [`MCP_SETUP_GUIDE.md`](./MCP_SETUP_GUIDE.md)
|
|
392
|
+
|
|
265
393
|
## 📚 Full Documentation
|
|
266
394
|
|
|
267
395
|
For comprehensive guides, advanced features, and detailed configuration:
|
|
@@ -291,9 +419,17 @@ autopm azure:sprint-status
|
|
|
291
419
|
autopm context:create
|
|
292
420
|
```
|
|
293
421
|
|
|
294
|
-
###
|
|
422
|
+
### Latest Features (v1.12.x)
|
|
423
|
+
|
|
424
|
+
**v1.12.2 - Smart Installation & Command Fixes**
|
|
425
|
+
- **Smart Tool Detection** - Installer automatically detects Docker and kubectl availability
|
|
426
|
+
- **Intelligent Defaults** - Installation options filtered based on available tools
|
|
427
|
+
- **Command Format Fixes** - All PM scripts now use consistent `/pm:...` format
|
|
428
|
+
- **Version Tracking** - Update command now properly detects installed versions
|
|
429
|
+
|
|
430
|
+
**v1.9.x - Complete PM Command Suite**
|
|
295
431
|
|
|
296
|
-
|
|
432
|
+
17 new PM commands providing comprehensive project management capabilities:
|
|
297
433
|
|
|
298
434
|
#### **PRD & Epic Management**
|
|
299
435
|
```bash
|
|
@@ -1,293 +1 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Azure DevOps Issue Show Command
|
|
5
|
-
* Retrieves and displays work item details
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
class AzureIssueShow {
|
|
9
|
-
constructor(options = {}) {
|
|
10
|
-
this.config = options;
|
|
11
|
-
this.api = options.api || null;
|
|
12
|
-
this.connection = options.connection || null;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Execute the issue show command
|
|
17
|
-
* @param {Object} params - Command parameters
|
|
18
|
-
* @param {string|number} params.id - Work item ID
|
|
19
|
-
* @returns {Promise<Object>} Result object with success, data, and formatted output
|
|
20
|
-
*/
|
|
21
|
-
async execute(params) {
|
|
22
|
-
if (!params || !params.id) {
|
|
23
|
-
throw new Error('Work Item ID is required');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const workItemId = parseInt(params.id);
|
|
27
|
-
if (isNaN(workItemId)) {
|
|
28
|
-
throw new Error('Invalid work item ID');
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Check for Azure DevOps token
|
|
32
|
-
if (!process.env.AZURE_DEVOPS_TOKEN && !this.config.token) {
|
|
33
|
-
throw new Error('Azure DevOps personal access token is required. Set AZURE_DEVOPS_TOKEN environment variable.');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Get work item from API
|
|
37
|
-
let workItem;
|
|
38
|
-
try {
|
|
39
|
-
// Support both api and connection patterns
|
|
40
|
-
if (this.api && this.api.getWorkItem) {
|
|
41
|
-
workItem = await this.api.getWorkItem(workItemId);
|
|
42
|
-
} else if (this.connection && this.connection.getWorkItemTrackingApi) {
|
|
43
|
-
const witApi = await this.connection.getWorkItemTrackingApi();
|
|
44
|
-
workItem = await witApi.getWorkItem(workItemId);
|
|
45
|
-
} else {
|
|
46
|
-
const project = this.config.project || 'project';
|
|
47
|
-
throw new Error(`Work Item #${workItemId} not found in ${project}`);
|
|
48
|
-
}
|
|
49
|
-
} catch (error) {
|
|
50
|
-
const project = this.config.project || 'project';
|
|
51
|
-
|
|
52
|
-
// Handle specific error codes
|
|
53
|
-
if (error.statusCode === 404 || error.message.includes('not found')) {
|
|
54
|
-
throw new Error(`Work Item #${workItemId} not found in ${project}`);
|
|
55
|
-
}
|
|
56
|
-
if (error.statusCode === 403) {
|
|
57
|
-
throw new Error(`Access denied: Insufficient permissions to view Work Item #${workItemId} in ${project}`);
|
|
58
|
-
}
|
|
59
|
-
if (error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED') {
|
|
60
|
-
throw new Error(`Request timeout: Failed to retrieve Work Item #${workItemId} from Azure DevOps`);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// Re-throw original error if not handled
|
|
64
|
-
throw error;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Validate work item structure
|
|
68
|
-
if (!workItem || typeof workItem !== 'object') {
|
|
69
|
-
throw new Error(`Invalid response: Unable to parse Work Item #${workItemId} data`);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Check for required fields
|
|
73
|
-
if (!workItem.fields) {
|
|
74
|
-
throw new Error(`Azure DevOps API error: Invalid work item structure for #${workItemId}`);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
// Map Azure DevOps work item to common format
|
|
78
|
-
const data = this.mapWorkItem(workItem);
|
|
79
|
-
|
|
80
|
-
// Format for display
|
|
81
|
-
const formatted = this.formatWorkItem(data);
|
|
82
|
-
|
|
83
|
-
return {
|
|
84
|
-
success: true,
|
|
85
|
-
data: data,
|
|
86
|
-
formatted: formatted
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* Extract work item ID from relation URL
|
|
92
|
-
*/
|
|
93
|
-
extractWorkItemId(url) {
|
|
94
|
-
if (!url) return null;
|
|
95
|
-
const match = url.match(/workItems\/(\d+)$/);
|
|
96
|
-
return match ? parseInt(match[1]) : null;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Map Azure DevOps work item to common format
|
|
101
|
-
*/
|
|
102
|
-
mapWorkItem(workItem) {
|
|
103
|
-
const fields = workItem.fields || {};
|
|
104
|
-
const relations = workItem.relations || [];
|
|
105
|
-
|
|
106
|
-
// Map work item type
|
|
107
|
-
const typeMap = {
|
|
108
|
-
'User Story': 'issue',
|
|
109
|
-
'Bug': 'bug',
|
|
110
|
-
'Task': 'task',
|
|
111
|
-
'Epic': 'epic',
|
|
112
|
-
'Feature': 'feature'
|
|
113
|
-
};
|
|
114
|
-
|
|
115
|
-
// Map state
|
|
116
|
-
const stateMap = {
|
|
117
|
-
'New': 'open',
|
|
118
|
-
'Active': 'in_progress',
|
|
119
|
-
'In Progress': 'in_progress',
|
|
120
|
-
'Resolved': 'in_review', // Changed from 'resolved' to match test
|
|
121
|
-
'Closed': 'closed',
|
|
122
|
-
'Done': 'closed',
|
|
123
|
-
'Removed': 'cancelled' // Added for Bug work items
|
|
124
|
-
};
|
|
125
|
-
|
|
126
|
-
// Extract parent/children relationships and attachments from relations
|
|
127
|
-
let parent = null;
|
|
128
|
-
const children = [];
|
|
129
|
-
let attachmentCount = 0;
|
|
130
|
-
|
|
131
|
-
relations.forEach(relation => {
|
|
132
|
-
if (relation.rel === 'System.LinkTypes.Hierarchy-Reverse') {
|
|
133
|
-
// Parent relationship
|
|
134
|
-
parent = this.extractWorkItemId(relation.url);
|
|
135
|
-
} else if (relation.rel === 'System.LinkTypes.Hierarchy-Forward') {
|
|
136
|
-
// Child relationship
|
|
137
|
-
const childId = this.extractWorkItemId(relation.url);
|
|
138
|
-
if (childId) children.push(childId);
|
|
139
|
-
} else if (relation.rel === 'AttachedFile') {
|
|
140
|
-
// Attachment
|
|
141
|
-
attachmentCount++;
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
return {
|
|
146
|
-
id: workItem.id,
|
|
147
|
-
type: typeMap[fields['System.WorkItemType']] || 'issue',
|
|
148
|
-
title: fields['System.Title'] || '',
|
|
149
|
-
description: fields['System.Description'] || '',
|
|
150
|
-
state: stateMap[fields['System.State']] || 'open',
|
|
151
|
-
assignee: fields['System.AssignedTo']?.displayName || fields['System.AssignedTo'] || null,
|
|
152
|
-
creator: fields['System.CreatedBy']?.displayName || fields['System.CreatedBy'] || null,
|
|
153
|
-
created_at: fields['System.CreatedDate'] || null,
|
|
154
|
-
updated_at: fields['System.ChangedDate'] || null,
|
|
155
|
-
priority: fields['Microsoft.VSTS.Common.Priority'] || null,
|
|
156
|
-
tags: fields['System.Tags'] ? fields['System.Tags'].split(';').map(t => t.trim()) : [],
|
|
157
|
-
project: fields['System.TeamProject'] || null,
|
|
158
|
-
area: fields['System.AreaPath'] || null,
|
|
159
|
-
iteration: fields['System.IterationPath'] || null,
|
|
160
|
-
url: workItem._links?.html?.href || null,
|
|
161
|
-
// Additional fields expected by tests
|
|
162
|
-
workItemType: fields['System.WorkItemType'],
|
|
163
|
-
areaPath: fields['System.AreaPath'] || null,
|
|
164
|
-
iterationPath: fields['System.IterationPath'] || null,
|
|
165
|
-
storyPoints: fields['Microsoft.VSTS.Scheduling.StoryPoints'] || null,
|
|
166
|
-
parent: parent,
|
|
167
|
-
children: children,
|
|
168
|
-
attachmentCount: attachmentCount,
|
|
169
|
-
acceptanceCriteria: fields['Microsoft.VSTS.Common.AcceptanceCriteria'] || null,
|
|
170
|
-
originalType: fields['System.WorkItemType'],
|
|
171
|
-
originalState: fields['System.State'],
|
|
172
|
-
// Metrics object
|
|
173
|
-
metrics: {
|
|
174
|
-
storyPoints: fields['Microsoft.VSTS.Scheduling.StoryPoints'] || 0,
|
|
175
|
-
effort: fields['Microsoft.VSTS.Scheduling.Effort'] || 0,
|
|
176
|
-
remainingWork: fields['Microsoft.VSTS.Scheduling.RemainingWork'] || 0,
|
|
177
|
-
completedWork: fields['Microsoft.VSTS.Scheduling.CompletedWork'] || 0,
|
|
178
|
-
originalEstimate: fields['Microsoft.VSTS.Scheduling.OriginalEstimate'] || 0
|
|
179
|
-
}
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
/**
|
|
184
|
-
* Format work item for display
|
|
185
|
-
*/
|
|
186
|
-
formatWorkItem(data) {
|
|
187
|
-
const lines = [];
|
|
188
|
-
lines.push('═'.repeat(60));
|
|
189
|
-
lines.push(`${data.originalType || 'Work Item'} #${data.id}: ${data.title}`);
|
|
190
|
-
lines.push('═'.repeat(60));
|
|
191
|
-
lines.push('');
|
|
192
|
-
lines.push(`**Status:** ${data.state}`);
|
|
193
|
-
lines.push(`**Assignee:** ${data.assignee || 'Unassigned'}`);
|
|
194
|
-
lines.push(`**Priority:** ${data.priority || 'Not set'}`);
|
|
195
|
-
lines.push(`**Iteration:** ${data.iterationPath || data.iteration || 'Not set'}`);
|
|
196
|
-
|
|
197
|
-
// Add story points if present
|
|
198
|
-
if (data.metrics && data.metrics.storyPoints) {
|
|
199
|
-
lines.push(`**Story Points:** ${data.metrics.storyPoints}`);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Add parent/children relationships
|
|
203
|
-
if (data.parent) {
|
|
204
|
-
lines.push(`**Parent:** #${data.parent}`);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (data.children && data.children.length > 0) {
|
|
208
|
-
lines.push(`**Children:** ${data.children.map(c => `#${c}`).join(', ')}`);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Add tags
|
|
212
|
-
if (data.tags && data.tags.length > 0) {
|
|
213
|
-
lines.push(`**Tags:** ${data.tags.join(', ')}`);
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
// Add work metrics
|
|
217
|
-
if (data.metrics) {
|
|
218
|
-
if (data.metrics.remainingWork > 0) {
|
|
219
|
-
lines.push(`**Remaining:** ${data.metrics.remainingWork}h`);
|
|
220
|
-
}
|
|
221
|
-
if (data.metrics.completedWork > 0) {
|
|
222
|
-
lines.push(`**Completed:** ${data.metrics.completedWork}h`);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
if (data.created_at) {
|
|
227
|
-
lines.push(`**Created:** ${new Date(data.created_at).toLocaleString()}`);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
if (data.updated_at) {
|
|
231
|
-
lines.push(`**Updated:** ${new Date(data.updated_at).toLocaleString()}`);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
if (data.description) {
|
|
235
|
-
lines.push('');
|
|
236
|
-
lines.push('Description:');
|
|
237
|
-
lines.push('-'.repeat(60));
|
|
238
|
-
lines.push(data.description.substring(0, 500));
|
|
239
|
-
if (data.description.length > 500) {
|
|
240
|
-
lines.push('... (truncated)');
|
|
241
|
-
}
|
|
242
|
-
} else {
|
|
243
|
-
lines.push('');
|
|
244
|
-
lines.push('Description:');
|
|
245
|
-
lines.push('-'.repeat(60));
|
|
246
|
-
lines.push('_No description provided_');
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
// Generate Azure DevOps URL if not provided
|
|
250
|
-
if (data.url) {
|
|
251
|
-
lines.push('');
|
|
252
|
-
lines.push(`View Online: ${data.url}`);
|
|
253
|
-
} else if (this.config.organization && this.config.project) {
|
|
254
|
-
lines.push('');
|
|
255
|
-
lines.push('View in Azure DevOps:');
|
|
256
|
-
lines.push(`https://dev.azure.com/${this.config.organization}/${this.config.project}/_workitems/edit/${data.id}`);
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
lines.push('═'.repeat(60));
|
|
260
|
-
|
|
261
|
-
return lines.join('\n');
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Run as CLI command
|
|
266
|
-
*/
|
|
267
|
-
async run(args) {
|
|
268
|
-
const workItemId = args[0];
|
|
269
|
-
|
|
270
|
-
if (!workItemId) {
|
|
271
|
-
console.error('Error: Work Item ID is required');
|
|
272
|
-
console.error('Usage: azure-issue-show <work-item-id>');
|
|
273
|
-
process.exit(1);
|
|
274
|
-
}
|
|
275
|
-
|
|
276
|
-
try {
|
|
277
|
-
const result = await this.execute({ id: workItemId });
|
|
278
|
-
console.log(result.formatted);
|
|
279
|
-
} catch (error) {
|
|
280
|
-
console.error(`Error: ${error.message}`);
|
|
281
|
-
process.exit(1);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
// Export for testing and module usage
|
|
287
|
-
module.exports = AzureIssueShow;
|
|
288
|
-
|
|
289
|
-
// Run if called directly
|
|
290
|
-
if (require.main === module) {
|
|
291
|
-
const issueShow = new AzureIssueShow();
|
|
292
|
-
issueShow.run(process.argv.slice(2));
|
|
293
|
-
}
|
|
1
|
+
module.exports = function() { console.log("Should not execute"); };
|
package/bin/autopm.js
CHANGED
|
@@ -178,6 +178,8 @@ function main() {
|
|
|
178
178
|
.command(require('./commands/team'))
|
|
179
179
|
// Config management command
|
|
180
180
|
.command(require('./commands/config'))
|
|
181
|
+
// MCP management command
|
|
182
|
+
.command(require('./commands/mcp'))
|
|
181
183
|
// Global options
|
|
182
184
|
.option('verbose', {
|
|
183
185
|
type: 'boolean',
|
|
@@ -228,6 +230,24 @@ function main() {
|
|
|
228
230
|
# Validate configuration
|
|
229
231
|
autopm config validate
|
|
230
232
|
|
|
233
|
+
🔌 MCP (Model Context Protocol) Management:
|
|
234
|
+
# List and manage MCP servers
|
|
235
|
+
autopm mcp list # List all available MCP servers
|
|
236
|
+
autopm mcp enable context7-docs # Enable documentation server
|
|
237
|
+
autopm mcp sync # Sync configuration to .claude/mcp-servers.json
|
|
238
|
+
|
|
239
|
+
# Agent Analysis
|
|
240
|
+
autopm mcp agents # List agents using MCP
|
|
241
|
+
autopm mcp agent react-frontend-engineer # Show MCP config for agent
|
|
242
|
+
autopm mcp usage # Show MCP usage statistics
|
|
243
|
+
autopm mcp tree # Show agent-MCP dependency tree
|
|
244
|
+
|
|
245
|
+
# Configuration & Diagnostics
|
|
246
|
+
autopm mcp setup # Interactive API key setup
|
|
247
|
+
autopm mcp diagnose # Run comprehensive diagnostics
|
|
248
|
+
autopm mcp test context7-docs # Test MCP server connection
|
|
249
|
+
autopm mcp status # Show all MCP servers status
|
|
250
|
+
|
|
231
251
|
🔑 Token Setup:
|
|
232
252
|
# GitHub PAT (Settings → Developer settings → Personal access tokens)
|
|
233
253
|
Scopes: repo, workflow, admin:repo_hook
|