claude-autopm 1.12.3 → 1.13.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.
- package/.github/workflows/test.yml +50 -0
- package/README.md +147 -1
- package/autopm/.claude/providers/azure/issue-show.js +1 -293
- package/bin/autopm.js +20 -0
- package/bin/commands/mcp.js +175 -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,46 @@ 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. **Click to expand each video:**
|
|
47
|
+
|
|
48
|
+
<details>
|
|
49
|
+
<summary><b>1️⃣ Install AutoPM</b> - Complete installation process</summary>
|
|
50
|
+
<br>
|
|
51
|
+
<img src="docs/assets/video-1.gif" width="100%" alt="Install AutoPM">
|
|
52
|
+
</details>
|
|
53
|
+
|
|
54
|
+
<details>
|
|
55
|
+
<summary><b>2️⃣ First Claude Execution</b> - Setting up and running Claude Code</summary>
|
|
56
|
+
<br>
|
|
57
|
+
<img src="docs/assets/video-2.gif" width="100%" alt="First Claude Execution">
|
|
58
|
+
</details>
|
|
59
|
+
|
|
60
|
+
<details>
|
|
61
|
+
<summary><b>3️⃣ Creation of PRD</b> - Product Requirements Document workflow</summary>
|
|
62
|
+
<br>
|
|
63
|
+
<img src="docs/assets/video-3.gif" width="100%" alt="Create PRD">
|
|
64
|
+
</details>
|
|
65
|
+
|
|
66
|
+
<details>
|
|
67
|
+
<summary><b>4️⃣ GitHub Sync and Start Working</b> - Synchronizing with GitHub and beginning tasks</summary>
|
|
68
|
+
<br>
|
|
69
|
+
<img src="docs/assets/video-4.gif" width="100%" alt="GitHub Sync">
|
|
70
|
+
</details>
|
|
71
|
+
|
|
72
|
+
<details>
|
|
73
|
+
<summary><b>5️⃣ Issues Finished</b> - Completing and closing tasks</summary>
|
|
74
|
+
<br>
|
|
75
|
+
<img src="docs/assets/video-5.gif" width="100%" alt="Issues Complete">
|
|
76
|
+
</details>
|
|
77
|
+
|
|
78
|
+
<details>
|
|
79
|
+
<summary><b>6️⃣ Checking the Work Done</b> - Running Web App + FastAPI demo</summary>
|
|
80
|
+
<br>
|
|
81
|
+
<img src="docs/assets/video-6.gif" width="100%" alt="Web App and FastAPI">
|
|
82
|
+
</details>
|
|
83
|
+
|
|
44
84
|
## 🚀 Get Started in 5 Minutes
|
|
45
85
|
|
|
46
86
|
### 🎯 Quick Start for New Users
|
|
@@ -215,7 +255,9 @@ autopm pm:epic-sync user-auth
|
|
|
215
255
|
- **50+ Specialized AI Agents** - Python, React, K8s, AWS, and more
|
|
216
256
|
- **Parallel Execution** - Multiple agents working simultaneously
|
|
217
257
|
- **Cross-Platform** - GitHub, Azure DevOps, GitLab (coming soon)
|
|
218
|
-
- **MCP Integration** - Context
|
|
258
|
+
- **MCP Integration** - Model Context Protocol for live documentation, codebase analysis, and tool integration
|
|
259
|
+
- **Agent Analysis** - Discover which agents use MCP and their configurations
|
|
260
|
+
- **Interactive Diagnostics** - Comprehensive health checks and connection testing
|
|
219
261
|
|
|
220
262
|
### 🤖 Dynamic Agent Teams
|
|
221
263
|
|
|
@@ -262,6 +304,110 @@ git checkout -b feat/backend/new-api # Auto-loads 'python_backend' team
|
|
|
262
304
|
|
|
263
305
|
Teams support inheritance, so specialized teams automatically include base agents. The active team configuration is saved in your project and persists across sessions.
|
|
264
306
|
|
|
307
|
+
## 🔌 MCP (Model Context Protocol) Management
|
|
308
|
+
|
|
309
|
+
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.
|
|
310
|
+
|
|
311
|
+
### Quick Start with MCP
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
# List all available MCP servers
|
|
315
|
+
autopm mcp list
|
|
316
|
+
|
|
317
|
+
# Check which agents use MCP
|
|
318
|
+
autopm mcp agents
|
|
319
|
+
🤖 Agents Using MCP
|
|
320
|
+
|
|
321
|
+
✅ react-frontend-engineer
|
|
322
|
+
└─ context7-docs
|
|
323
|
+
|
|
324
|
+
✅ python-backend-engineer
|
|
325
|
+
└─ context7-docs
|
|
326
|
+
└─ sqlite-mcp
|
|
327
|
+
|
|
328
|
+
📊 Summary:
|
|
329
|
+
Total agents: 53
|
|
330
|
+
Using MCP: 39 (74%)
|
|
331
|
+
|
|
332
|
+
# Enable MCP servers
|
|
333
|
+
autopm mcp enable context7-docs
|
|
334
|
+
autopm mcp enable github-mcp
|
|
335
|
+
|
|
336
|
+
# Configure API keys interactively
|
|
337
|
+
autopm mcp setup
|
|
338
|
+
|
|
339
|
+
# Sync configuration
|
|
340
|
+
autopm mcp sync
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### MCP Commands
|
|
344
|
+
|
|
345
|
+
#### **Agent Analysis**
|
|
346
|
+
```bash
|
|
347
|
+
autopm mcp agents # List agents using MCP
|
|
348
|
+
autopm mcp agents --by-server # Group by MCP server
|
|
349
|
+
autopm mcp agent <name> # Show agent MCP config
|
|
350
|
+
autopm mcp usage # Usage statistics
|
|
351
|
+
autopm mcp tree # Dependency tree
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
#### **Configuration & Diagnostics**
|
|
355
|
+
```bash
|
|
356
|
+
autopm mcp setup # Interactive API key setup
|
|
357
|
+
autopm mcp diagnose # Run diagnostics
|
|
358
|
+
autopm mcp test <server> # Test server connection
|
|
359
|
+
autopm mcp status # Show servers status
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
#### **Server Management**
|
|
363
|
+
```bash
|
|
364
|
+
autopm mcp list # List available servers
|
|
365
|
+
autopm mcp info <server> # Server details
|
|
366
|
+
autopm mcp enable <server> # Enable server
|
|
367
|
+
autopm mcp disable <server> # Disable server
|
|
368
|
+
autopm mcp sync # Sync configuration
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### MCP Server Types
|
|
372
|
+
|
|
373
|
+
- **Documentation** - `context7-docs` for live framework documentation (React, Python, AWS, etc.)
|
|
374
|
+
- **Codebase** - `context7-codebase` for project analysis and navigation
|
|
375
|
+
- **GitHub** - `github-mcp` for repository operations
|
|
376
|
+
- **Databases** - `sqlite-mcp`, `postgresql-mcp`, `mongodb-mcp` for data operations
|
|
377
|
+
- **Browser** - `playwright-mcp` for E2E testing and automation
|
|
378
|
+
|
|
379
|
+
### Example: Setting Up Context7
|
|
380
|
+
|
|
381
|
+
```bash
|
|
382
|
+
# 1. Enable context7 documentation server
|
|
383
|
+
autopm mcp enable context7-docs
|
|
384
|
+
|
|
385
|
+
# 2. Configure API key
|
|
386
|
+
cat > .claude/.env << EOF
|
|
387
|
+
CONTEXT7_API_KEY=your-api-key-here
|
|
388
|
+
CONTEXT7_WORKSPACE=your-workspace-id
|
|
389
|
+
EOF
|
|
390
|
+
|
|
391
|
+
# 3. Sync configuration
|
|
392
|
+
autopm mcp sync
|
|
393
|
+
|
|
394
|
+
# 4. Verify setup
|
|
395
|
+
autopm mcp diagnose
|
|
396
|
+
|
|
397
|
+
# 5. Test connection
|
|
398
|
+
autopm mcp test context7-docs
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### MCP Benefits
|
|
402
|
+
|
|
403
|
+
- ✅ **Live Documentation** - Agents access latest framework docs automatically
|
|
404
|
+
- ✅ **Codebase Context** - Deep understanding of your project structure
|
|
405
|
+
- ✅ **Tool Integration** - GitHub, databases, browsers, and more
|
|
406
|
+
- ✅ **No Hallucinations** - Real-time data instead of outdated training
|
|
407
|
+
- ✅ **Extensible** - Add custom MCP servers for your tools
|
|
408
|
+
|
|
409
|
+
📖 **Full MCP Setup Guide**: [`MCP_SETUP_GUIDE.md`](./MCP_SETUP_GUIDE.md)
|
|
410
|
+
|
|
265
411
|
## 📚 Full Documentation
|
|
266
412
|
|
|
267
413
|
For comprehensive guides, advanced features, and detailed configuration:
|
|
@@ -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
|