claude-autopm 2.8.1 ā 2.8.2
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/README.md +116 -8
- package/bin/autopm.js +2 -0
- package/bin/commands/plugin.js +395 -0
- package/bin/commands/team.js +184 -10
- package/install/install.js +223 -4
- package/lib/plugins/PluginManager.js +1328 -0
- package/lib/plugins/PluginManager.old.js +400 -0
- package/package.json +4 -1
- package/scripts/publish-plugins.sh +166 -0
- package/autopm/.claude/agents/cloud/README.md +0 -55
- package/autopm/.claude/agents/cloud/aws-cloud-architect.md +0 -521
- package/autopm/.claude/agents/cloud/azure-cloud-architect.md +0 -436
- package/autopm/.claude/agents/cloud/gcp-cloud-architect.md +0 -385
- package/autopm/.claude/agents/cloud/gcp-cloud-functions-engineer.md +0 -306
- package/autopm/.claude/agents/cloud/gemini-api-expert.md +0 -880
- package/autopm/.claude/agents/cloud/kubernetes-orchestrator.md +0 -566
- package/autopm/.claude/agents/cloud/openai-python-expert.md +0 -1087
- package/autopm/.claude/agents/cloud/terraform-infrastructure-expert.md +0 -454
- package/autopm/.claude/agents/core/agent-manager.md +0 -296
- package/autopm/.claude/agents/core/code-analyzer.md +0 -131
- package/autopm/.claude/agents/core/file-analyzer.md +0 -162
- package/autopm/.claude/agents/core/test-runner.md +0 -200
- package/autopm/.claude/agents/data/airflow-orchestration-expert.md +0 -52
- package/autopm/.claude/agents/data/kedro-pipeline-expert.md +0 -50
- package/autopm/.claude/agents/data/langgraph-workflow-expert.md +0 -520
- package/autopm/.claude/agents/databases/README.md +0 -50
- package/autopm/.claude/agents/databases/bigquery-expert.md +0 -392
- package/autopm/.claude/agents/databases/cosmosdb-expert.md +0 -368
- package/autopm/.claude/agents/databases/mongodb-expert.md +0 -398
- package/autopm/.claude/agents/databases/postgresql-expert.md +0 -321
- package/autopm/.claude/agents/databases/redis-expert.md +0 -52
- package/autopm/.claude/agents/devops/README.md +0 -52
- package/autopm/.claude/agents/devops/azure-devops-specialist.md +0 -308
- package/autopm/.claude/agents/devops/docker-containerization-expert.md +0 -298
- package/autopm/.claude/agents/devops/github-operations-specialist.md +0 -335
- package/autopm/.claude/agents/devops/mcp-context-manager.md +0 -319
- package/autopm/.claude/agents/devops/observability-engineer.md +0 -574
- package/autopm/.claude/agents/devops/ssh-operations-expert.md +0 -1093
- package/autopm/.claude/agents/devops/traefik-proxy-expert.md +0 -444
- package/autopm/.claude/agents/frameworks/README.md +0 -64
- package/autopm/.claude/agents/frameworks/e2e-test-engineer.md +0 -360
- package/autopm/.claude/agents/frameworks/nats-messaging-expert.md +0 -254
- package/autopm/.claude/agents/frameworks/react-frontend-engineer.md +0 -217
- package/autopm/.claude/agents/frameworks/react-ui-expert.md +0 -226
- package/autopm/.claude/agents/frameworks/tailwindcss-expert.md +0 -770
- package/autopm/.claude/agents/frameworks/ux-design-expert.md +0 -244
- package/autopm/.claude/agents/integration/message-queue-engineer.md +0 -794
- package/autopm/.claude/agents/languages/README.md +0 -50
- package/autopm/.claude/agents/languages/bash-scripting-expert.md +0 -541
- package/autopm/.claude/agents/languages/javascript-frontend-engineer.md +0 -197
- package/autopm/.claude/agents/languages/nodejs-backend-engineer.md +0 -226
- package/autopm/.claude/agents/languages/python-backend-engineer.md +0 -214
- package/autopm/.claude/agents/languages/python-backend-expert.md +0 -289
- package/autopm/.claude/agents/testing/frontend-testing-engineer.md +0 -395
- package/autopm/.claude/commands/ai/langgraph-workflow.md +0 -65
- package/autopm/.claude/commands/ai/openai-chat.md +0 -65
- package/autopm/.claude/commands/azure/COMMANDS.md +0 -107
- package/autopm/.claude/commands/azure/COMMAND_MAPPING.md +0 -252
- package/autopm/.claude/commands/azure/INTEGRATION_FIX.md +0 -103
- package/autopm/.claude/commands/azure/README.md +0 -246
- package/autopm/.claude/commands/azure/active-work.md +0 -198
- package/autopm/.claude/commands/azure/aliases.md +0 -143
- package/autopm/.claude/commands/azure/blocked-items.md +0 -287
- package/autopm/.claude/commands/azure/clean.md +0 -93
- package/autopm/.claude/commands/azure/docs-query.md +0 -48
- package/autopm/.claude/commands/azure/feature-decompose.md +0 -380
- package/autopm/.claude/commands/azure/feature-list.md +0 -61
- package/autopm/.claude/commands/azure/feature-new.md +0 -115
- package/autopm/.claude/commands/azure/feature-show.md +0 -205
- package/autopm/.claude/commands/azure/feature-start.md +0 -130
- package/autopm/.claude/commands/azure/fix-integration-example.md +0 -93
- package/autopm/.claude/commands/azure/help.md +0 -150
- package/autopm/.claude/commands/azure/import-us.md +0 -269
- package/autopm/.claude/commands/azure/init.md +0 -211
- package/autopm/.claude/commands/azure/next-task.md +0 -262
- package/autopm/.claude/commands/azure/search.md +0 -160
- package/autopm/.claude/commands/azure/sprint-status.md +0 -235
- package/autopm/.claude/commands/azure/standup.md +0 -260
- package/autopm/.claude/commands/azure/sync-all.md +0 -99
- package/autopm/.claude/commands/azure/task-analyze.md +0 -186
- package/autopm/.claude/commands/azure/task-close.md +0 -329
- package/autopm/.claude/commands/azure/task-edit.md +0 -145
- package/autopm/.claude/commands/azure/task-list.md +0 -263
- package/autopm/.claude/commands/azure/task-new.md +0 -84
- package/autopm/.claude/commands/azure/task-reopen.md +0 -79
- package/autopm/.claude/commands/azure/task-show.md +0 -126
- package/autopm/.claude/commands/azure/task-start.md +0 -301
- package/autopm/.claude/commands/azure/task-status.md +0 -65
- package/autopm/.claude/commands/azure/task-sync.md +0 -67
- package/autopm/.claude/commands/azure/us-edit.md +0 -164
- package/autopm/.claude/commands/azure/us-list.md +0 -202
- package/autopm/.claude/commands/azure/us-new.md +0 -265
- package/autopm/.claude/commands/azure/us-parse.md +0 -253
- package/autopm/.claude/commands/azure/us-show.md +0 -188
- package/autopm/.claude/commands/azure/us-status.md +0 -320
- package/autopm/.claude/commands/azure/validate.md +0 -86
- package/autopm/.claude/commands/azure/work-item-sync.md +0 -47
- package/autopm/.claude/commands/cloud/infra-deploy.md +0 -38
- package/autopm/.claude/commands/github/workflow-create.md +0 -42
- package/autopm/.claude/commands/infrastructure/ssh-security.md +0 -65
- package/autopm/.claude/commands/infrastructure/traefik-setup.md +0 -65
- package/autopm/.claude/commands/kubernetes/deploy.md +0 -37
- package/autopm/.claude/commands/playwright/test-scaffold.md +0 -38
- package/autopm/.claude/commands/pm/blocked.md +0 -28
- package/autopm/.claude/commands/pm/clean.md +0 -119
- package/autopm/.claude/commands/pm/context-create.md +0 -136
- package/autopm/.claude/commands/pm/context-prime.md +0 -170
- package/autopm/.claude/commands/pm/context-update.md +0 -292
- package/autopm/.claude/commands/pm/context.md +0 -28
- package/autopm/.claude/commands/pm/epic-close.md +0 -86
- package/autopm/.claude/commands/pm/epic-decompose.md +0 -370
- package/autopm/.claude/commands/pm/epic-edit.md +0 -83
- package/autopm/.claude/commands/pm/epic-list.md +0 -30
- package/autopm/.claude/commands/pm/epic-merge.md +0 -222
- package/autopm/.claude/commands/pm/epic-oneshot.md +0 -119
- package/autopm/.claude/commands/pm/epic-refresh.md +0 -119
- package/autopm/.claude/commands/pm/epic-show.md +0 -28
- package/autopm/.claude/commands/pm/epic-split.md +0 -120
- package/autopm/.claude/commands/pm/epic-start.md +0 -195
- package/autopm/.claude/commands/pm/epic-status.md +0 -28
- package/autopm/.claude/commands/pm/epic-sync-modular.md +0 -338
- package/autopm/.claude/commands/pm/epic-sync-original.md +0 -473
- package/autopm/.claude/commands/pm/epic-sync.md +0 -486
- package/autopm/.claude/commands/pm/help.md +0 -28
- package/autopm/.claude/commands/pm/import.md +0 -115
- package/autopm/.claude/commands/pm/in-progress.md +0 -28
- package/autopm/.claude/commands/pm/init.md +0 -28
- package/autopm/.claude/commands/pm/issue-analyze.md +0 -202
- package/autopm/.claude/commands/pm/issue-close.md +0 -119
- package/autopm/.claude/commands/pm/issue-edit.md +0 -93
- package/autopm/.claude/commands/pm/issue-reopen.md +0 -87
- package/autopm/.claude/commands/pm/issue-show.md +0 -41
- package/autopm/.claude/commands/pm/issue-start.md +0 -234
- package/autopm/.claude/commands/pm/issue-status.md +0 -95
- package/autopm/.claude/commands/pm/issue-sync.md +0 -411
- package/autopm/.claude/commands/pm/next.md +0 -28
- package/autopm/.claude/commands/pm/prd-edit.md +0 -82
- package/autopm/.claude/commands/pm/prd-list.md +0 -28
- package/autopm/.claude/commands/pm/prd-new.md +0 -55
- package/autopm/.claude/commands/pm/prd-parse.md +0 -42
- package/autopm/.claude/commands/pm/prd-status.md +0 -28
- package/autopm/.claude/commands/pm/search.md +0 -28
- package/autopm/.claude/commands/pm/standup.md +0 -28
- package/autopm/.claude/commands/pm/status.md +0 -28
- package/autopm/.claude/commands/pm/sync.md +0 -99
- package/autopm/.claude/commands/pm/test-reference-update.md +0 -151
- package/autopm/.claude/commands/pm/validate.md +0 -28
- package/autopm/.claude/commands/pm/what-next.md +0 -28
- package/autopm/.claude/commands/python/api-scaffold.md +0 -50
- package/autopm/.claude/commands/python/docs-query.md +0 -48
- package/autopm/.claude/commands/react/app-scaffold.md +0 -50
- package/autopm/.claude/commands/testing/prime.md +0 -314
- package/autopm/.claude/commands/testing/run.md +0 -125
- package/autopm/.claude/commands/ui/bootstrap-scaffold.md +0 -65
- package/autopm/.claude/commands/ui/tailwind-system.md +0 -64
- package/autopm/.claude/rules/ai-integration-patterns.md +0 -219
- package/autopm/.claude/rules/ci-cd-kubernetes-strategy.md +0 -25
- package/autopm/.claude/rules/database-management-strategy.md +0 -17
- package/autopm/.claude/rules/database-pipeline.md +0 -94
- package/autopm/.claude/rules/devops-troubleshooting-playbook.md +0 -450
- package/autopm/.claude/rules/docker-first-development.md +0 -404
- package/autopm/.claude/rules/infrastructure-pipeline.md +0 -128
- package/autopm/.claude/rules/performance-guidelines.md +0 -403
- package/autopm/.claude/rules/ui-development-standards.md +0 -281
- package/autopm/.claude/rules/ui-framework-rules.md +0 -151
- package/autopm/.claude/rules/ux-design-rules.md +0 -209
- package/autopm/.claude/rules/visual-testing.md +0 -223
- package/autopm/.claude/scripts/azure/README.md +0 -192
- package/autopm/.claude/scripts/azure/active-work.js +0 -524
- package/autopm/.claude/scripts/azure/active-work.sh +0 -20
- package/autopm/.claude/scripts/azure/blocked.js +0 -520
- package/autopm/.claude/scripts/azure/blocked.sh +0 -20
- package/autopm/.claude/scripts/azure/daily.js +0 -533
- package/autopm/.claude/scripts/azure/daily.sh +0 -20
- package/autopm/.claude/scripts/azure/dashboard.js +0 -970
- package/autopm/.claude/scripts/azure/dashboard.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-list.js +0 -254
- package/autopm/.claude/scripts/azure/feature-list.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-show.js +0 -7
- package/autopm/.claude/scripts/azure/feature-show.sh +0 -20
- package/autopm/.claude/scripts/azure/feature-status.js +0 -604
- package/autopm/.claude/scripts/azure/feature-status.sh +0 -20
- package/autopm/.claude/scripts/azure/help.js +0 -342
- package/autopm/.claude/scripts/azure/help.sh +0 -20
- package/autopm/.claude/scripts/azure/next-task.js +0 -508
- package/autopm/.claude/scripts/azure/next-task.sh +0 -20
- package/autopm/.claude/scripts/azure/search.js +0 -469
- package/autopm/.claude/scripts/azure/search.sh +0 -20
- package/autopm/.claude/scripts/azure/setup.js +0 -745
- package/autopm/.claude/scripts/azure/setup.sh +0 -20
- package/autopm/.claude/scripts/azure/sprint-report.js +0 -1012
- package/autopm/.claude/scripts/azure/sprint-report.sh +0 -20
- package/autopm/.claude/scripts/azure/sync.js +0 -563
- package/autopm/.claude/scripts/azure/sync.sh +0 -20
- package/autopm/.claude/scripts/azure/us-list.js +0 -210
- package/autopm/.claude/scripts/azure/us-list.sh +0 -20
- package/autopm/.claude/scripts/azure/us-status.js +0 -238
- package/autopm/.claude/scripts/azure/us-status.sh +0 -20
- package/autopm/.claude/scripts/azure/validate.js +0 -626
- package/autopm/.claude/scripts/azure/validate.sh +0 -20
- package/autopm/.claude/scripts/azure/wrapper-template.sh +0 -20
- package/autopm/.claude/scripts/github/dependency-tracker.js +0 -554
- package/autopm/.claude/scripts/github/dependency-validator.js +0 -545
- package/autopm/.claude/scripts/github/dependency-visualizer.js +0 -477
- package/autopm/.claude/scripts/pm/analytics.js +0 -425
- package/autopm/.claude/scripts/pm/blocked.js +0 -164
- package/autopm/.claude/scripts/pm/blocked.sh +0 -78
- package/autopm/.claude/scripts/pm/clean.js +0 -464
- package/autopm/.claude/scripts/pm/context-create.js +0 -216
- package/autopm/.claude/scripts/pm/context-prime.js +0 -335
- package/autopm/.claude/scripts/pm/context-update.js +0 -344
- package/autopm/.claude/scripts/pm/context.js +0 -338
- package/autopm/.claude/scripts/pm/epic-close.js +0 -347
- package/autopm/.claude/scripts/pm/epic-edit.js +0 -382
- package/autopm/.claude/scripts/pm/epic-list.js +0 -273
- package/autopm/.claude/scripts/pm/epic-list.sh +0 -109
- package/autopm/.claude/scripts/pm/epic-show.js +0 -291
- package/autopm/.claude/scripts/pm/epic-show.sh +0 -105
- package/autopm/.claude/scripts/pm/epic-split.js +0 -522
- package/autopm/.claude/scripts/pm/epic-start/epic-start.js +0 -183
- package/autopm/.claude/scripts/pm/epic-start/epic-start.sh +0 -94
- package/autopm/.claude/scripts/pm/epic-status.js +0 -291
- package/autopm/.claude/scripts/pm/epic-status.sh +0 -104
- package/autopm/.claude/scripts/pm/epic-sync/README.md +0 -208
- package/autopm/.claude/scripts/pm/epic-sync/create-epic-issue.sh +0 -77
- package/autopm/.claude/scripts/pm/epic-sync/create-task-issues.sh +0 -86
- package/autopm/.claude/scripts/pm/epic-sync/update-epic-file.sh +0 -79
- package/autopm/.claude/scripts/pm/epic-sync/update-references.sh +0 -89
- package/autopm/.claude/scripts/pm/epic-sync.sh +0 -137
- package/autopm/.claude/scripts/pm/help.js +0 -92
- package/autopm/.claude/scripts/pm/help.sh +0 -90
- package/autopm/.claude/scripts/pm/in-progress.js +0 -178
- package/autopm/.claude/scripts/pm/in-progress.sh +0 -93
- package/autopm/.claude/scripts/pm/init.js +0 -321
- package/autopm/.claude/scripts/pm/init.sh +0 -178
- package/autopm/.claude/scripts/pm/issue-close.js +0 -232
- package/autopm/.claude/scripts/pm/issue-edit.js +0 -310
- package/autopm/.claude/scripts/pm/issue-show.js +0 -272
- package/autopm/.claude/scripts/pm/issue-start.js +0 -181
- package/autopm/.claude/scripts/pm/issue-sync/format-comment.sh +0 -468
- package/autopm/.claude/scripts/pm/issue-sync/gather-updates.sh +0 -460
- package/autopm/.claude/scripts/pm/issue-sync/post-comment.sh +0 -330
- package/autopm/.claude/scripts/pm/issue-sync/preflight-validation.sh +0 -348
- package/autopm/.claude/scripts/pm/issue-sync/update-frontmatter.sh +0 -387
- package/autopm/.claude/scripts/pm/lib/README.md +0 -85
- package/autopm/.claude/scripts/pm/lib/epic-discovery.js +0 -119
- package/autopm/.claude/scripts/pm/lib/logger.js +0 -78
- package/autopm/.claude/scripts/pm/next.js +0 -189
- package/autopm/.claude/scripts/pm/next.sh +0 -72
- package/autopm/.claude/scripts/pm/optimize.js +0 -407
- package/autopm/.claude/scripts/pm/pr-create.js +0 -337
- package/autopm/.claude/scripts/pm/pr-list.js +0 -257
- package/autopm/.claude/scripts/pm/prd-list.js +0 -242
- package/autopm/.claude/scripts/pm/prd-list.sh +0 -103
- package/autopm/.claude/scripts/pm/prd-new.js +0 -684
- package/autopm/.claude/scripts/pm/prd-parse.js +0 -547
- package/autopm/.claude/scripts/pm/prd-status.js +0 -152
- package/autopm/.claude/scripts/pm/prd-status.sh +0 -63
- package/autopm/.claude/scripts/pm/release.js +0 -460
- package/autopm/.claude/scripts/pm/search.js +0 -192
- package/autopm/.claude/scripts/pm/search.sh +0 -89
- package/autopm/.claude/scripts/pm/standup.js +0 -362
- package/autopm/.claude/scripts/pm/standup.sh +0 -95
- package/autopm/.claude/scripts/pm/status.js +0 -148
- package/autopm/.claude/scripts/pm/status.sh +0 -59
- package/autopm/.claude/scripts/pm/sync-batch.js +0 -337
- package/autopm/.claude/scripts/pm/sync.js +0 -343
- package/autopm/.claude/scripts/pm/template-list.js +0 -141
- package/autopm/.claude/scripts/pm/template-new.js +0 -366
- package/autopm/.claude/scripts/pm/validate.js +0 -274
- package/autopm/.claude/scripts/pm/validate.sh +0 -106
- package/autopm/.claude/scripts/pm/what-next.js +0 -660
- package/bin/node/azure-feature-show.js +0 -7
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Azure Script - Wrapper for Node.js implementation
|
|
4
|
-
# This wrapper maintains backward compatibility while delegating to the Node.js version
|
|
5
|
-
|
|
6
|
-
# Get the directory of this script
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
SCRIPT_NAME="$(basename "$0" .sh)"
|
|
9
|
-
|
|
10
|
-
# Check if Node.js is available and the .js file exists
|
|
11
|
-
if command -v node >/dev/null 2>&1 && [ -f "$SCRIPT_DIR/$SCRIPT_NAME.js" ]; then
|
|
12
|
-
# Use the Node.js implementation
|
|
13
|
-
node "$SCRIPT_DIR/$SCRIPT_NAME.js" "$@"
|
|
14
|
-
exit $?
|
|
15
|
-
else
|
|
16
|
-
# Fallback message
|
|
17
|
-
echo "ā ļø Node.js not found or $SCRIPT_NAME.js missing"
|
|
18
|
-
echo "Please ensure Node.js is installed and all files are present"
|
|
19
|
-
exit 1
|
|
20
|
-
fi
|
|
@@ -1,520 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Azure DevOps Blocked Items Script
|
|
5
|
-
* Migrated from autopm/.claude/scripts/azure/blocked.sh to Node.js
|
|
6
|
-
*
|
|
7
|
-
* Features:
|
|
8
|
-
* - Shows all blocked work items and their resolution status
|
|
9
|
-
* - Supports resolve mode to help unblock items
|
|
10
|
-
* - Groups items by urgency and type
|
|
11
|
-
* - Provides resolution suggestions
|
|
12
|
-
* - Cross-platform compatibility
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
const path = require('path');
|
|
16
|
-
const fs = require('fs').promises;
|
|
17
|
-
const https = require('https');
|
|
18
|
-
const yargs = require('yargs/yargs');
|
|
19
|
-
const { hideBin } = require('yargs/helpers');
|
|
20
|
-
|
|
21
|
-
// TODO: Implement utility modules before using this script
|
|
22
|
-
// const Logger = require('../../lib/utils/logger');
|
|
23
|
-
// const FileSystem = require('../../lib/utils/filesystem');
|
|
24
|
-
// const Config = require('../../lib/utils/config');
|
|
25
|
-
|
|
26
|
-
class AzureBlocked {
|
|
27
|
-
constructor(options = {}) {
|
|
28
|
-
// Initialize utilities (commented out until utils are implemented)
|
|
29
|
-
// const loggerOptions = {
|
|
30
|
-
// verbose: options.verbose || false,
|
|
31
|
-
// silent: options.silent || false
|
|
32
|
-
// };
|
|
33
|
-
|
|
34
|
-
// this.logger = new Logger(loggerOptions);
|
|
35
|
-
// this.fs = new FileSystem(this.logger);
|
|
36
|
-
// this.config = new Config(this.logger);
|
|
37
|
-
|
|
38
|
-
// Set options
|
|
39
|
-
this.options = {
|
|
40
|
-
projectPath: options.projectPath || process.cwd(),
|
|
41
|
-
verbose: options.verbose || false,
|
|
42
|
-
silent: options.silent || false,
|
|
43
|
-
resolveMode: options.resolveMode || false
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
// Set paths
|
|
47
|
-
this.envPath = path.join(this.options.projectPath, '.claude', '.env');
|
|
48
|
-
|
|
49
|
-
// Environment variables
|
|
50
|
-
this.envVars = {};
|
|
51
|
-
|
|
52
|
-
// Colors (disabled in silent mode)
|
|
53
|
-
this.colors = this.options.silent ? {
|
|
54
|
-
green: '',
|
|
55
|
-
yellow: '',
|
|
56
|
-
red: '',
|
|
57
|
-
blue: '',
|
|
58
|
-
cyan: '',
|
|
59
|
-
reset: ''
|
|
60
|
-
} : {
|
|
61
|
-
green: '\x1b[32m',
|
|
62
|
-
yellow: '\x1b[33m',
|
|
63
|
-
red: '\x1b[31m',
|
|
64
|
-
blue: '\x1b[34m',
|
|
65
|
-
cyan: '\x1b[36m',
|
|
66
|
-
reset: '\x1b[0m'
|
|
67
|
-
};
|
|
68
|
-
|
|
69
|
-
// For testing - allow dependency injection
|
|
70
|
-
this.https = options.https || https;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Main execution function
|
|
75
|
-
*/
|
|
76
|
-
async run() {
|
|
77
|
-
try {
|
|
78
|
-
if (!this.options.silent) {
|
|
79
|
-
this.logger.info('š§ Azure DevOps Blocked Items');
|
|
80
|
-
this.logger.info('==============================');
|
|
81
|
-
this.logger.info('');
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Load environment variables
|
|
85
|
-
await this.loadEnvironment();
|
|
86
|
-
|
|
87
|
-
// Validate environment
|
|
88
|
-
const validation = this.validateEnvironment();
|
|
89
|
-
if (!validation.valid) {
|
|
90
|
-
return {
|
|
91
|
-
success: false,
|
|
92
|
-
error: `Missing required environment variables: ${validation.errors.join(', ')}`
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// Fetch blocked items
|
|
97
|
-
const blockedItems = await this.fetchBlockedItems();
|
|
98
|
-
|
|
99
|
-
if (blockedItems.length === 0) {
|
|
100
|
-
const output = `${this.colors.green}ā
No blocked items found!${this.colors.reset}\nAll work items are flowing smoothly.`;
|
|
101
|
-
if (!this.options.silent) {
|
|
102
|
-
this.logger.info(output);
|
|
103
|
-
}
|
|
104
|
-
return {
|
|
105
|
-
success: true,
|
|
106
|
-
output,
|
|
107
|
-
summary: { blockedCount: 0 }
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Fetch detailed information for each blocked item
|
|
112
|
-
const detailedItems = [];
|
|
113
|
-
for (const item of blockedItems) {
|
|
114
|
-
try {
|
|
115
|
-
const details = await this.fetchWorkItem(item.id);
|
|
116
|
-
if (details) {
|
|
117
|
-
detailedItems.push(details);
|
|
118
|
-
}
|
|
119
|
-
} catch (error) {
|
|
120
|
-
if (this.options.verbose) {
|
|
121
|
-
this.logger.warn(`Failed to fetch details for item ${item.id}: ${error.message}`);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Group and format output
|
|
127
|
-
const grouped = this.groupBlockedItems(detailedItems);
|
|
128
|
-
const outputSections = [];
|
|
129
|
-
|
|
130
|
-
// Critical items
|
|
131
|
-
if (grouped.critical.length > 0) {
|
|
132
|
-
outputSections.push(this.formatCriticalItems(grouped.critical));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
// High priority items
|
|
136
|
-
if (grouped.high.length > 0) {
|
|
137
|
-
outputSections.push(this.formatHighPriorityItems(grouped.high));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Normal priority items
|
|
141
|
-
if (grouped.normal.length > 0) {
|
|
142
|
-
outputSections.push(this.formatNormalItems(grouped.normal));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
// Summary
|
|
146
|
-
outputSections.push(this.formatSummary(detailedItems));
|
|
147
|
-
|
|
148
|
-
// Resolution suggestions
|
|
149
|
-
if (this.options.resolveMode) {
|
|
150
|
-
outputSections.push(this.formatResolutionSuggestions(detailedItems));
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Actions
|
|
154
|
-
outputSections.push(this.formatQuickActions());
|
|
155
|
-
|
|
156
|
-
const fullOutput = outputSections.join('\n');
|
|
157
|
-
|
|
158
|
-
if (!this.options.silent) {
|
|
159
|
-
console.log(fullOutput);
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
return {
|
|
163
|
-
success: true,
|
|
164
|
-
output: fullOutput,
|
|
165
|
-
summary: {
|
|
166
|
-
blockedCount: detailedItems.length,
|
|
167
|
-
critical: grouped.critical.length,
|
|
168
|
-
high: grouped.high.length,
|
|
169
|
-
normal: grouped.normal.length
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
} catch (error) {
|
|
174
|
-
this.logger.error('Blocked items query failed', error);
|
|
175
|
-
return {
|
|
176
|
-
success: false,
|
|
177
|
-
error: error.message
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Load environment variables from .env file and process.env
|
|
184
|
-
*/
|
|
185
|
-
async loadEnvironment() {
|
|
186
|
-
// Load from process.env first
|
|
187
|
-
this.envVars = {
|
|
188
|
-
AZURE_DEVOPS_PAT: process.env.AZURE_DEVOPS_PAT || '',
|
|
189
|
-
AZURE_DEVOPS_ORG: process.env.AZURE_DEVOPS_ORG || '',
|
|
190
|
-
AZURE_DEVOPS_PROJECT: process.env.AZURE_DEVOPS_PROJECT || ''
|
|
191
|
-
};
|
|
192
|
-
|
|
193
|
-
// Override with .env file if exists
|
|
194
|
-
try {
|
|
195
|
-
if (await this.fs.exists(this.envPath)) {
|
|
196
|
-
const content = await fs.readFile(this.envPath, 'utf8');
|
|
197
|
-
const lines = content.split('\n');
|
|
198
|
-
|
|
199
|
-
for (const line of lines) {
|
|
200
|
-
const trimmed = line.trim();
|
|
201
|
-
if (trimmed && !trimmed.startsWith('#') && trimmed.includes('=')) {
|
|
202
|
-
const [key, ...valueParts] = trimmed.split('=');
|
|
203
|
-
const value = valueParts.join('=').replace(/^["']|["']$/g, '');
|
|
204
|
-
if (key && value && this.envVars.hasOwnProperty(key)) {
|
|
205
|
-
this.envVars[key] = value;
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
} catch (error) {
|
|
211
|
-
// Non-critical error, continue with process.env values
|
|
212
|
-
if (this.options.verbose) {
|
|
213
|
-
this.logger.warn(`Could not load .env file: ${error.message}`);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Validate required environment variables
|
|
220
|
-
*/
|
|
221
|
-
validateEnvironment() {
|
|
222
|
-
const required = ['AZURE_DEVOPS_PAT', 'AZURE_DEVOPS_ORG', 'AZURE_DEVOPS_PROJECT'];
|
|
223
|
-
const missing = required.filter(key => !this.envVars[key]);
|
|
224
|
-
|
|
225
|
-
return {
|
|
226
|
-
valid: missing.length === 0,
|
|
227
|
-
errors: missing
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/**
|
|
232
|
-
* Build WIQL query for blocked items
|
|
233
|
-
*/
|
|
234
|
-
buildBlockedItemsQuery() {
|
|
235
|
-
return `SELECT [System.Id], [System.Title], [System.WorkItemType],
|
|
236
|
-
[System.State], [System.AssignedTo], [System.Tags],
|
|
237
|
-
[Microsoft.VSTS.Common.Priority], [System.CreatedDate],
|
|
238
|
-
[System.ChangedDate], [System.IterationPath]
|
|
239
|
-
FROM workitems
|
|
240
|
-
WHERE [System.Tags] CONTAINS 'blocked'
|
|
241
|
-
AND [System.State] NOT IN ('Closed', 'Done', 'Removed')
|
|
242
|
-
ORDER BY [Microsoft.VSTS.Common.Priority] ASC, [System.CreatedDate] ASC`;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
/**
|
|
246
|
-
* Fetch blocked work items
|
|
247
|
-
*/
|
|
248
|
-
async fetchBlockedItems() {
|
|
249
|
-
const query = this.buildBlockedItemsQuery();
|
|
250
|
-
const queryData = { query: query };
|
|
251
|
-
|
|
252
|
-
const response = await this.callAzureApi('wit/wiql', {
|
|
253
|
-
method: 'POST',
|
|
254
|
-
headers: {
|
|
255
|
-
'Content-Type': 'application/json'
|
|
256
|
-
},
|
|
257
|
-
body: JSON.stringify(queryData)
|
|
258
|
-
});
|
|
259
|
-
|
|
260
|
-
const data = JSON.parse(response);
|
|
261
|
-
return data.workItems || [];
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/**
|
|
265
|
-
* Fetch detailed work item information
|
|
266
|
-
*/
|
|
267
|
-
async fetchWorkItem(id) {
|
|
268
|
-
const response = await this.callAzureApi(`wit/workitems/${id}`);
|
|
269
|
-
const data = JSON.parse(response);
|
|
270
|
-
|
|
271
|
-
const fields = data.fields || {};
|
|
272
|
-
|
|
273
|
-
return {
|
|
274
|
-
id: data.id,
|
|
275
|
-
title: (fields['System.Title'] || '').substring(0, 60),
|
|
276
|
-
type: fields['System.WorkItemType'] || '',
|
|
277
|
-
state: fields['System.State'] || '',
|
|
278
|
-
assignedTo: fields['System.AssignedTo'] ?
|
|
279
|
-
(fields['System.AssignedTo'].displayName || fields['System.AssignedTo']) : 'Unassigned',
|
|
280
|
-
priority: fields['Microsoft.VSTS.Common.Priority'] || 3,
|
|
281
|
-
tags: fields['System.Tags'] || '',
|
|
282
|
-
createdDate: fields['System.CreatedDate'] ?
|
|
283
|
-
fields['System.CreatedDate'].split('T')[0] : '',
|
|
284
|
-
changedDate: fields['System.ChangedDate'] ?
|
|
285
|
-
fields['System.ChangedDate'].split('T')[0] : '',
|
|
286
|
-
sprint: fields['System.IterationPath'] ?
|
|
287
|
-
fields['System.IterationPath'].split('\\').pop() : ''
|
|
288
|
-
};
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/**
|
|
292
|
-
* Call Azure DevOps REST API
|
|
293
|
-
*/
|
|
294
|
-
async callAzureApi(endpoint, options = {}) {
|
|
295
|
-
const { AZURE_DEVOPS_PAT, AZURE_DEVOPS_ORG, AZURE_DEVOPS_PROJECT } = this.envVars;
|
|
296
|
-
|
|
297
|
-
const auth = Buffer.from(`:${AZURE_DEVOPS_PAT}`).toString('base64');
|
|
298
|
-
const url = `https://dev.azure.com/${AZURE_DEVOPS_ORG}/${AZURE_DEVOPS_PROJECT}/_apis/${endpoint}?api-version=7.0`;
|
|
299
|
-
|
|
300
|
-
const requestOptions = {
|
|
301
|
-
method: options.method || 'GET',
|
|
302
|
-
headers: {
|
|
303
|
-
'Authorization': `Basic ${auth}`,
|
|
304
|
-
'User-Agent': 'ClaudeAutoPM/1.0',
|
|
305
|
-
...options.headers
|
|
306
|
-
}
|
|
307
|
-
};
|
|
308
|
-
|
|
309
|
-
return new Promise((resolve, reject) => {
|
|
310
|
-
const req = this.https.request(url, requestOptions, (res) => {
|
|
311
|
-
let data = '';
|
|
312
|
-
|
|
313
|
-
res.on('data', (chunk) => {
|
|
314
|
-
data += chunk;
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
res.on('end', () => {
|
|
318
|
-
if (res.statusCode >= 200 && res.statusCode < 300) {
|
|
319
|
-
resolve(data);
|
|
320
|
-
} else {
|
|
321
|
-
reject(new Error(`HTTP ${res.statusCode}: ${data}`));
|
|
322
|
-
}
|
|
323
|
-
});
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
req.on('error', (error) => {
|
|
327
|
-
reject(error);
|
|
328
|
-
});
|
|
329
|
-
|
|
330
|
-
if (options.body) {
|
|
331
|
-
req.write(options.body);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
req.end();
|
|
335
|
-
});
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Group blocked items by priority
|
|
340
|
-
*/
|
|
341
|
-
groupBlockedItems(items) {
|
|
342
|
-
const grouped = {
|
|
343
|
-
critical: [],
|
|
344
|
-
high: [],
|
|
345
|
-
normal: []
|
|
346
|
-
};
|
|
347
|
-
|
|
348
|
-
for (const item of items) {
|
|
349
|
-
if (item.priority === 1) {
|
|
350
|
-
grouped.critical.push(item);
|
|
351
|
-
} else if (item.priority === 2) {
|
|
352
|
-
grouped.high.push(item);
|
|
353
|
-
} else {
|
|
354
|
-
grouped.normal.push(item);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
return grouped;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/**
|
|
362
|
-
* Format critical items section
|
|
363
|
-
*/
|
|
364
|
-
formatCriticalItems(items) {
|
|
365
|
-
let output = `${this.colors.red}šØ Critical Blocked Items${this.colors.reset}\n`;
|
|
366
|
-
output += '========================\n';
|
|
367
|
-
|
|
368
|
-
for (const item of items) {
|
|
369
|
-
output += `⢠#${item.id} - ${item.title}\n`;
|
|
370
|
-
output += ` Type: ${item.type} | Assigned: ${item.assignedTo}\n`;
|
|
371
|
-
output += ` Blocked since: ${item.createdDate} | Sprint: ${item.sprint}\n\n`;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
return output;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
/**
|
|
378
|
-
* Format high priority items section
|
|
379
|
-
*/
|
|
380
|
-
formatHighPriorityItems(items) {
|
|
381
|
-
let output = `${this.colors.yellow}ā ļø High Priority Blocked Items${this.colors.reset}\n`;
|
|
382
|
-
output += '==============================\n';
|
|
383
|
-
|
|
384
|
-
for (const item of items) {
|
|
385
|
-
output += `⢠#${item.id} - ${item.title}\n`;
|
|
386
|
-
output += ` Type: ${item.type} | Assigned: ${item.assignedTo}\n`;
|
|
387
|
-
output += ` Blocked since: ${item.createdDate} | Sprint: ${item.sprint}\n\n`;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
return output;
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
/**
|
|
394
|
-
* Format normal priority items section
|
|
395
|
-
*/
|
|
396
|
-
formatNormalItems(items) {
|
|
397
|
-
let output = `${this.colors.blue}š Blocked Items${this.colors.reset}\n`;
|
|
398
|
-
output += '===============\n';
|
|
399
|
-
|
|
400
|
-
for (const item of items) {
|
|
401
|
-
output += `⢠#${item.id} - ${item.title}\n`;
|
|
402
|
-
output += ` Type: ${item.type} | Assigned: ${item.assignedTo}\n`;
|
|
403
|
-
output += ` Blocked since: ${item.createdDate} | Sprint: ${item.sprint}\n\n`;
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
return output;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
/**
|
|
410
|
-
* Format summary
|
|
411
|
-
*/
|
|
412
|
-
formatSummary(items) {
|
|
413
|
-
let output = 'š Blocked Items Summary\n';
|
|
414
|
-
output += '=======================\n';
|
|
415
|
-
output += `Total Blocked Items: ${items.length}\n`;
|
|
416
|
-
|
|
417
|
-
const byType = {};
|
|
418
|
-
const byAssignee = {};
|
|
419
|
-
|
|
420
|
-
for (const item of items) {
|
|
421
|
-
byType[item.type] = (byType[item.type] || 0) + 1;
|
|
422
|
-
byAssignee[item.assignedTo] = (byAssignee[item.assignedTo] || 0) + 1;
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
output += '\nBy Type:\n';
|
|
426
|
-
for (const [type, count] of Object.entries(byType)) {
|
|
427
|
-
output += ` ${type}: ${count}\n`;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
output += '\nBy Assignee:\n';
|
|
431
|
-
for (const [assignee, count] of Object.entries(byAssignee)) {
|
|
432
|
-
output += ` ${assignee}: ${count}\n`;
|
|
433
|
-
}
|
|
434
|
-
|
|
435
|
-
return output;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
/**
|
|
439
|
-
* Format resolution suggestions
|
|
440
|
-
*/
|
|
441
|
-
formatResolutionSuggestions(items) {
|
|
442
|
-
let output = '\nš§ Resolution Suggestions\n';
|
|
443
|
-
output += '========================\n';
|
|
444
|
-
|
|
445
|
-
output += '1. Review blocking dependencies and external factors\n';
|
|
446
|
-
output += '2. Escalate critical items to management\n';
|
|
447
|
-
output += '3. Consider alternative approaches or workarounds\n';
|
|
448
|
-
output += '4. Update item descriptions with current blocking reason\n';
|
|
449
|
-
output += '5. Set up regular review meetings for blocked items\n';
|
|
450
|
-
|
|
451
|
-
return output;
|
|
452
|
-
}
|
|
453
|
-
|
|
454
|
-
/**
|
|
455
|
-
* Format quick actions
|
|
456
|
-
*/
|
|
457
|
-
formatQuickActions() {
|
|
458
|
-
let output = '\nā” Quick Actions\n';
|
|
459
|
-
output += '===============\n';
|
|
460
|
-
output += '⢠View item details: /azure:task-show <id>\n';
|
|
461
|
-
output += '⢠Update blocking reason: /azure:task-edit <id>\n';
|
|
462
|
-
output += '⢠Remove blocked tag: /azure:task-unblock <id>\n';
|
|
463
|
-
output += '⢠Escalate to manager: /azure:escalate <id>\n';
|
|
464
|
-
output += '⢠Schedule review meeting: /azure:schedule-review\n';
|
|
465
|
-
|
|
466
|
-
return output;
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
// CLI interface
|
|
471
|
-
if (require.main === module) {
|
|
472
|
-
const argv = yargs(hideBin(process.argv))
|
|
473
|
-
.option('path', {
|
|
474
|
-
alias: 'p',
|
|
475
|
-
describe: 'Project path',
|
|
476
|
-
type: 'string',
|
|
477
|
-
default: process.cwd()
|
|
478
|
-
})
|
|
479
|
-
.option('resolve', {
|
|
480
|
-
alias: 'r',
|
|
481
|
-
describe: 'Show resolution suggestions',
|
|
482
|
-
type: 'boolean',
|
|
483
|
-
default: false
|
|
484
|
-
})
|
|
485
|
-
.option('verbose', {
|
|
486
|
-
alias: 'v',
|
|
487
|
-
describe: 'Verbose output',
|
|
488
|
-
type: 'boolean',
|
|
489
|
-
default: false
|
|
490
|
-
})
|
|
491
|
-
.option('silent', {
|
|
492
|
-
alias: 's',
|
|
493
|
-
describe: 'Silent mode',
|
|
494
|
-
type: 'boolean',
|
|
495
|
-
default: false
|
|
496
|
-
})
|
|
497
|
-
.help()
|
|
498
|
-
.argv;
|
|
499
|
-
|
|
500
|
-
const blocked = new AzureBlocked({
|
|
501
|
-
projectPath: argv.path,
|
|
502
|
-
resolveMode: argv.resolve,
|
|
503
|
-
verbose: argv.verbose,
|
|
504
|
-
silent: argv.silent
|
|
505
|
-
});
|
|
506
|
-
|
|
507
|
-
blocked.run()
|
|
508
|
-
.then((result) => {
|
|
509
|
-
if (!result.success) {
|
|
510
|
-
console.error('Azure blocked items query failed:', result.error);
|
|
511
|
-
process.exit(1);
|
|
512
|
-
}
|
|
513
|
-
})
|
|
514
|
-
.catch((error) => {
|
|
515
|
-
console.error('Azure blocked items query failed:', error.message);
|
|
516
|
-
process.exit(1);
|
|
517
|
-
});
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
module.exports = AzureBlocked;
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# Azure Script - Wrapper for Node.js implementation
|
|
4
|
-
# This wrapper maintains backward compatibility while delegating to the Node.js version
|
|
5
|
-
|
|
6
|
-
# Get the directory of this script
|
|
7
|
-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
8
|
-
SCRIPT_NAME="$(basename "$0" .sh)"
|
|
9
|
-
|
|
10
|
-
# Check if Node.js is available and the .js file exists
|
|
11
|
-
if command -v node >/dev/null 2>&1 && [ -f "$SCRIPT_DIR/$SCRIPT_NAME.js" ]; then
|
|
12
|
-
# Use the Node.js implementation
|
|
13
|
-
node "$SCRIPT_DIR/$SCRIPT_NAME.js" "$@"
|
|
14
|
-
exit $?
|
|
15
|
-
else
|
|
16
|
-
# Fallback message
|
|
17
|
-
echo "ā ļø Node.js not found or $SCRIPT_NAME.js missing"
|
|
18
|
-
echo "Please ensure Node.js is installed and all files are present"
|
|
19
|
-
exit 1
|
|
20
|
-
fi
|