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,63 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
echo "š PRD Status Report"
|
|
4
|
-
echo "===================="
|
|
5
|
-
echo ""
|
|
6
|
-
|
|
7
|
-
if [ ! -d ".claude/prds" ]; then
|
|
8
|
-
echo "No PRD directory found."
|
|
9
|
-
exit 0
|
|
10
|
-
fi
|
|
11
|
-
|
|
12
|
-
total=$(ls .claude/prds/*.md 2>/dev/null | wc -l)
|
|
13
|
-
[ $total -eq 0 ] && echo "No PRDs found." && exit 0
|
|
14
|
-
|
|
15
|
-
# Count by status
|
|
16
|
-
backlog=0
|
|
17
|
-
in_progress=0
|
|
18
|
-
implemented=0
|
|
19
|
-
|
|
20
|
-
for file in .claude/prds/*.md; do
|
|
21
|
-
[ -f "$file" ] || continue
|
|
22
|
-
status=$(grep "^status:" "$file" | head -1 | sed 's/^status: *//')
|
|
23
|
-
|
|
24
|
-
case "$status" in
|
|
25
|
-
backlog|draft|"") ((backlog++)) ;;
|
|
26
|
-
in-progress|active) ((in_progress++)) ;;
|
|
27
|
-
implemented|completed|done) ((implemented++)) ;;
|
|
28
|
-
*) ((backlog++)) ;;
|
|
29
|
-
esac
|
|
30
|
-
done
|
|
31
|
-
|
|
32
|
-
echo "Getting status..."
|
|
33
|
-
echo ""
|
|
34
|
-
echo ""
|
|
35
|
-
|
|
36
|
-
# Display chart
|
|
37
|
-
echo "š Distribution:"
|
|
38
|
-
echo "================"
|
|
39
|
-
|
|
40
|
-
echo ""
|
|
41
|
-
echo " Backlog: $(printf '%-3d' $backlog) [$(printf '%0.sā' $(seq 1 $((backlog*20/total))))]"
|
|
42
|
-
echo " In Progress: $(printf '%-3d' $in_progress) [$(printf '%0.sā' $(seq 1 $((in_progress*20/total))))]"
|
|
43
|
-
echo " Implemented: $(printf '%-3d' $implemented) [$(printf '%0.sā' $(seq 1 $((implemented*20/total))))]"
|
|
44
|
-
echo ""
|
|
45
|
-
echo " Total PRDs: $total"
|
|
46
|
-
|
|
47
|
-
# Recent activity
|
|
48
|
-
echo ""
|
|
49
|
-
echo "š
Recent PRDs (last 5 modified):"
|
|
50
|
-
ls -t .claude/prds/*.md 2>/dev/null | head -5 | while read file; do
|
|
51
|
-
name=$(grep "^name:" "$file" | head -1 | sed 's/^name: *//')
|
|
52
|
-
[ -z "$name" ] && name=$(basename "$file" .md)
|
|
53
|
-
echo " ⢠$name"
|
|
54
|
-
done
|
|
55
|
-
|
|
56
|
-
# Suggestions
|
|
57
|
-
echo ""
|
|
58
|
-
echo "š” Next Actions:"
|
|
59
|
-
[ $backlog -gt 0 ] && echo " ⢠Parse backlog PRDs to epics: /pm:prd-parse <name>"
|
|
60
|
-
[ $in_progress -gt 0 ] && echo " ⢠Check progress on active PRDs: /pm:epic-status <name>"
|
|
61
|
-
[ $total -eq 0 ] && echo " ⢠Create your first PRD: /pm:prd-new <name>"
|
|
62
|
-
|
|
63
|
-
exit 0
|
|
@@ -1,460 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* Release - Create a new release
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
const fs = require('fs');
|
|
7
|
-
const path = require('path');
|
|
8
|
-
const { execSync } = require('child_process');
|
|
9
|
-
const readline = require('readline');
|
|
10
|
-
|
|
11
|
-
class ReleaseManager {
|
|
12
|
-
constructor() {
|
|
13
|
-
this.packageFile = 'package.json';
|
|
14
|
-
this.changelogFile = 'CHANGELOG.md';
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
execCommand(command, options = {}) {
|
|
18
|
-
try {
|
|
19
|
-
return execSync(command, { encoding: 'utf8', ...options }).trim();
|
|
20
|
-
} catch (error) {
|
|
21
|
-
if (!options.ignoreError) {
|
|
22
|
-
throw error;
|
|
23
|
-
}
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
getPackageInfo() {
|
|
29
|
-
if (!fs.existsSync(this.packageFile)) {
|
|
30
|
-
throw new Error('package.json not found');
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const packageJson = JSON.parse(fs.readFileSync(this.packageFile, 'utf8'));
|
|
34
|
-
return {
|
|
35
|
-
name: packageJson.name,
|
|
36
|
-
version: packageJson.version,
|
|
37
|
-
description: packageJson.description
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
getCurrentVersion() {
|
|
42
|
-
const packageInfo = this.getPackageInfo();
|
|
43
|
-
return packageInfo.version;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
parseVersion(version) {
|
|
47
|
-
const match = version.match(/^(\d+)\.(\d+)\.(\d+)(-(.+))?$/);
|
|
48
|
-
if (!match) {
|
|
49
|
-
throw new Error(`Invalid version format: ${version}`);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
return {
|
|
53
|
-
major: parseInt(match[1]),
|
|
54
|
-
minor: parseInt(match[2]),
|
|
55
|
-
patch: parseInt(match[3]),
|
|
56
|
-
prerelease: match[5] || null
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
incrementVersion(currentVersion, type) {
|
|
61
|
-
const parsed = this.parseVersion(currentVersion);
|
|
62
|
-
|
|
63
|
-
switch (type) {
|
|
64
|
-
case 'major':
|
|
65
|
-
return `${parsed.major + 1}.0.0`;
|
|
66
|
-
case 'minor':
|
|
67
|
-
return `${parsed.major}.${parsed.minor + 1}.0`;
|
|
68
|
-
case 'patch':
|
|
69
|
-
return `${parsed.major}.${parsed.minor}.${parsed.patch + 1}`;
|
|
70
|
-
case 'prerelease':
|
|
71
|
-
if (parsed.prerelease) {
|
|
72
|
-
const num = parseInt(parsed.prerelease.match(/\d+$/)?.[0] || '0');
|
|
73
|
-
return `${parsed.major}.${parsed.minor}.${parsed.patch}-beta.${num + 1}`;
|
|
74
|
-
}
|
|
75
|
-
return `${parsed.major}.${parsed.minor}.${parsed.patch}-beta.1`;
|
|
76
|
-
default:
|
|
77
|
-
throw new Error(`Invalid version type: ${type}`);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
getGitStatus() {
|
|
82
|
-
const status = this.execCommand('git status --short');
|
|
83
|
-
return status ? status.split('\n') : [];
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
getRecentCommits(since) {
|
|
87
|
-
try {
|
|
88
|
-
const commits = this.execCommand(
|
|
89
|
-
`git log --oneline --pretty=format:"%h %s" ${since}..HEAD`
|
|
90
|
-
);
|
|
91
|
-
return commits ? commits.split('\n') : [];
|
|
92
|
-
} catch {
|
|
93
|
-
return [];
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
categorizeCommits(commits) {
|
|
98
|
-
const categories = {
|
|
99
|
-
features: [],
|
|
100
|
-
fixes: [],
|
|
101
|
-
docs: [],
|
|
102
|
-
chore: [],
|
|
103
|
-
other: []
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
commits.forEach(commit => {
|
|
107
|
-
const match = commit.match(/^[a-f0-9]+ (.+)$/);
|
|
108
|
-
if (!match) return;
|
|
109
|
-
|
|
110
|
-
const message = match[1];
|
|
111
|
-
|
|
112
|
-
if (message.startsWith('feat:') || message.startsWith('feat(')) {
|
|
113
|
-
categories.features.push(message);
|
|
114
|
-
} else if (message.startsWith('fix:') || message.startsWith('fix(')) {
|
|
115
|
-
categories.fixes.push(message);
|
|
116
|
-
} else if (message.startsWith('docs:') || message.startsWith('docs(')) {
|
|
117
|
-
categories.docs.push(message);
|
|
118
|
-
} else if (message.startsWith('chore:') || message.startsWith('chore(')) {
|
|
119
|
-
categories.chore.push(message);
|
|
120
|
-
} else {
|
|
121
|
-
categories.other.push(message);
|
|
122
|
-
}
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
return categories;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
generateChangelog(version, commits) {
|
|
129
|
-
const categories = this.categorizeCommits(commits);
|
|
130
|
-
const date = new Date().toISOString().split('T')[0];
|
|
131
|
-
|
|
132
|
-
let changelog = `## [${version}] - ${date}\n\n`;
|
|
133
|
-
|
|
134
|
-
if (categories.features.length > 0) {
|
|
135
|
-
changelog += '### ⨠Features\n';
|
|
136
|
-
categories.features.forEach(feat => {
|
|
137
|
-
changelog += `- ${feat}\n`;
|
|
138
|
-
});
|
|
139
|
-
changelog += '\n';
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
if (categories.fixes.length > 0) {
|
|
143
|
-
changelog += '### š Bug Fixes\n';
|
|
144
|
-
categories.fixes.forEach(fix => {
|
|
145
|
-
changelog += `- ${fix}\n`;
|
|
146
|
-
});
|
|
147
|
-
changelog += '\n';
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (categories.docs.length > 0) {
|
|
151
|
-
changelog += '### š Documentation\n';
|
|
152
|
-
categories.docs.forEach(doc => {
|
|
153
|
-
changelog += `- ${doc}\n`;
|
|
154
|
-
});
|
|
155
|
-
changelog += '\n';
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
if (categories.chore.length > 0) {
|
|
159
|
-
changelog += '### š§ Maintenance\n';
|
|
160
|
-
categories.chore.forEach(chore => {
|
|
161
|
-
changelog += `- ${chore}\n`;
|
|
162
|
-
});
|
|
163
|
-
changelog += '\n';
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
if (categories.other.length > 0) {
|
|
167
|
-
changelog += '### Other Changes\n';
|
|
168
|
-
categories.other.forEach(other => {
|
|
169
|
-
changelog += `- ${other}\n`;
|
|
170
|
-
});
|
|
171
|
-
changelog += '\n';
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
return changelog;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
updateChangelog(newEntry) {
|
|
178
|
-
let existingContent = '';
|
|
179
|
-
|
|
180
|
-
if (fs.existsSync(this.changelogFile)) {
|
|
181
|
-
existingContent = fs.readFileSync(this.changelogFile, 'utf8');
|
|
182
|
-
} else {
|
|
183
|
-
existingContent = '# Changelog\n\nAll notable changes to this project will be documented in this file.\n\n';
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// Insert new entry after the header
|
|
187
|
-
const lines = existingContent.split('\n');
|
|
188
|
-
let insertIndex = 0;
|
|
189
|
-
|
|
190
|
-
for (let i = 0; i < lines.length; i++) {
|
|
191
|
-
if (lines[i].startsWith('## ')) {
|
|
192
|
-
insertIndex = i;
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
if (i === lines.length - 1) {
|
|
196
|
-
insertIndex = lines.length;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
lines.splice(insertIndex, 0, newEntry);
|
|
201
|
-
fs.writeFileSync(this.changelogFile, lines.join('\n'));
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
updatePackageVersion(newVersion) {
|
|
205
|
-
const packageJson = JSON.parse(fs.readFileSync(this.packageFile, 'utf8'));
|
|
206
|
-
packageJson.version = newVersion;
|
|
207
|
-
fs.writeFileSync(this.packageFile, JSON.stringify(packageJson, null, 2) + '\n');
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
async createRelease(versionType, options = {}) {
|
|
211
|
-
console.log(`\nš Creating Release`);
|
|
212
|
-
console.log(`${'ā'.repeat(50)}\n`);
|
|
213
|
-
|
|
214
|
-
// Check for uncommitted changes
|
|
215
|
-
const changes = this.getGitStatus();
|
|
216
|
-
if (changes.length > 0 && !options.allowDirty) {
|
|
217
|
-
console.error('ā You have uncommitted changes:');
|
|
218
|
-
changes.forEach(change => console.log(` ${change}`));
|
|
219
|
-
console.log('\nš” Commit your changes first or use --allow-dirty');
|
|
220
|
-
return false;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
// Get current version
|
|
224
|
-
const currentVersion = this.getCurrentVersion();
|
|
225
|
-
const newVersion = options.version || this.incrementVersion(currentVersion, versionType);
|
|
226
|
-
|
|
227
|
-
console.log(`š¦ Package: ${this.getPackageInfo().name}`);
|
|
228
|
-
console.log(`š Current version: ${currentVersion}`);
|
|
229
|
-
console.log(`šÆ New version: ${newVersion}`);
|
|
230
|
-
|
|
231
|
-
// Get commits since last tag
|
|
232
|
-
const lastTag = this.execCommand('git describe --tags --abbrev=0', { ignoreError: true }) || 'HEAD~20';
|
|
233
|
-
const commits = this.getRecentCommits(lastTag);
|
|
234
|
-
|
|
235
|
-
if (commits.length > 0) {
|
|
236
|
-
console.log(`\nš Changes since ${lastTag}:`);
|
|
237
|
-
console.log(` Found ${commits.length} commits`);
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
// Generate changelog
|
|
241
|
-
const changelogEntry = this.generateChangelog(newVersion, commits);
|
|
242
|
-
|
|
243
|
-
if (options.dryRun) {
|
|
244
|
-
console.log('\nš DRY RUN - No changes will be made');
|
|
245
|
-
console.log('\nChangelog entry:');
|
|
246
|
-
console.log(`${'ā'.repeat(50)}`);
|
|
247
|
-
console.log(changelogEntry);
|
|
248
|
-
console.log(`${'ā'.repeat(50)}`);
|
|
249
|
-
return true;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
// Confirmation
|
|
253
|
-
if (!options.yes) {
|
|
254
|
-
const rl = readline.createInterface({
|
|
255
|
-
input: process.stdin,
|
|
256
|
-
output: process.stdout
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
const confirm = await new Promise(resolve => {
|
|
260
|
-
rl.question(`\nā ļø Create release ${newVersion}? (y/N): `, answer => {
|
|
261
|
-
rl.close();
|
|
262
|
-
resolve(answer.toLowerCase() === 'y');
|
|
263
|
-
});
|
|
264
|
-
});
|
|
265
|
-
|
|
266
|
-
if (!confirm) {
|
|
267
|
-
console.log('Release cancelled.');
|
|
268
|
-
return false;
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
try {
|
|
273
|
-
// Update package.json
|
|
274
|
-
console.log('\nš Updating package.json...');
|
|
275
|
-
this.updatePackageVersion(newVersion);
|
|
276
|
-
|
|
277
|
-
// Update CHANGELOG.md
|
|
278
|
-
console.log('š Updating CHANGELOG.md...');
|
|
279
|
-
this.updateChangelog(changelogEntry);
|
|
280
|
-
|
|
281
|
-
// Create release branch
|
|
282
|
-
console.log('šæ Creating release branch...');
|
|
283
|
-
const releaseBranch = `release/v${newVersion}`;
|
|
284
|
-
this.execCommand(`git checkout -b ${releaseBranch}`);
|
|
285
|
-
|
|
286
|
-
// Commit changes
|
|
287
|
-
console.log('š¤ Committing changes...');
|
|
288
|
-
this.execCommand('git add package.json CHANGELOG.md');
|
|
289
|
-
this.execCommand(`git commit -m "chore: release v${newVersion}"`);
|
|
290
|
-
|
|
291
|
-
// Push branch and create PR if not disabled
|
|
292
|
-
if (!options.noPush) {
|
|
293
|
-
console.log('š¤ Pushing to remote...');
|
|
294
|
-
this.execCommand(`git push -u origin ${releaseBranch}`);
|
|
295
|
-
|
|
296
|
-
// Create PR using gh CLI
|
|
297
|
-
try {
|
|
298
|
-
this.execCommand('which gh', { ignoreError: false });
|
|
299
|
-
console.log('š¦ Creating Pull Request...');
|
|
300
|
-
const prBody = `## Release v${newVersion}\n\n${changelogEntry}`;
|
|
301
|
-
const prUrl = this.execCommand(
|
|
302
|
-
`gh pr create --title "chore: release v${newVersion}" --body "${prBody.replace(/"/g, '\\"')}" --base main`
|
|
303
|
-
);
|
|
304
|
-
console.log(`ā
Pull Request created: ${prUrl}`);
|
|
305
|
-
|
|
306
|
-
// Auto-merge the PR
|
|
307
|
-
const prNumber = prUrl.split('/').pop();
|
|
308
|
-
console.log('š Auto-merging PR...');
|
|
309
|
-
this.execCommand(`gh pr merge ${prNumber} --squash --auto`);
|
|
310
|
-
|
|
311
|
-
// Wait for merge and create tag
|
|
312
|
-
console.log('ā³ Waiting for PR to merge...');
|
|
313
|
-
let merged = false;
|
|
314
|
-
for (let i = 0; i < 30; i++) {
|
|
315
|
-
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
316
|
-
const status = this.execCommand(`gh pr view ${prNumber} --json state -q .state`, { ignoreError: true });
|
|
317
|
-
if (status === 'MERGED') {
|
|
318
|
-
merged = true;
|
|
319
|
-
break;
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
if (merged) {
|
|
324
|
-
// Switch back to main and pull
|
|
325
|
-
console.log('š„ Updating main branch...');
|
|
326
|
-
this.execCommand('git checkout main');
|
|
327
|
-
this.execCommand('git pull origin main');
|
|
328
|
-
|
|
329
|
-
// Create tag
|
|
330
|
-
console.log('š·ļø Creating tag...');
|
|
331
|
-
const tagMessage = `Release v${newVersion}\n\n${changelogEntry}`;
|
|
332
|
-
this.execCommand(`git tag -a v${newVersion} -m "${tagMessage.replace(/"/g, '\\"')}"`);
|
|
333
|
-
this.execCommand('git push --tags');
|
|
334
|
-
} else {
|
|
335
|
-
console.log('ā ļø PR not merged yet. Please merge manually and create tag.');
|
|
336
|
-
}
|
|
337
|
-
} catch {
|
|
338
|
-
console.log('ā ļø GitHub CLI not available. Please create PR manually.');
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
// Create GitHub release if gh CLI is available
|
|
343
|
-
if (!options.noGithub) {
|
|
344
|
-
try {
|
|
345
|
-
this.execCommand('which gh', { ignoreError: false });
|
|
346
|
-
console.log('š¦ Creating GitHub release...');
|
|
347
|
-
|
|
348
|
-
const releaseNotes = changelogEntry
|
|
349
|
-
.split('\n')
|
|
350
|
-
.filter(line => !line.startsWith('## '))
|
|
351
|
-
.join('\n');
|
|
352
|
-
|
|
353
|
-
this.execCommand(
|
|
354
|
-
`gh release create v${newVersion} --title "v${newVersion}" --notes "${releaseNotes.replace(/"/g, '\\"')}"`
|
|
355
|
-
);
|
|
356
|
-
console.log('ā
GitHub release created');
|
|
357
|
-
} catch {
|
|
358
|
-
console.log('ā¹ļø GitHub CLI not available, skipping GitHub release');
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
// Publish to npm if requested
|
|
363
|
-
if (options.publish) {
|
|
364
|
-
console.log('š¦ Publishing to npm...');
|
|
365
|
-
this.execCommand('npm publish');
|
|
366
|
-
console.log('ā
Published to npm');
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
// Success
|
|
370
|
-
console.log('\nā
Release v' + newVersion + ' created successfully!');
|
|
371
|
-
|
|
372
|
-
// Next steps
|
|
373
|
-
console.log('\nš” Next steps:');
|
|
374
|
-
if (options.noPush) {
|
|
375
|
-
console.log(' ⢠Push changes: git push && git push --tags');
|
|
376
|
-
}
|
|
377
|
-
if (!options.publish) {
|
|
378
|
-
console.log(' ⢠Publish to npm: npm publish');
|
|
379
|
-
}
|
|
380
|
-
console.log(' ⢠View release: https://github.com/[org]/[repo]/releases');
|
|
381
|
-
|
|
382
|
-
return true;
|
|
383
|
-
} catch (error) {
|
|
384
|
-
console.error('ā Release failed:', error.message);
|
|
385
|
-
|
|
386
|
-
// Rollback
|
|
387
|
-
console.log('\nā ļø Rolling back changes...');
|
|
388
|
-
try {
|
|
389
|
-
this.execCommand('git reset --hard HEAD~1');
|
|
390
|
-
this.execCommand(`git tag -d v${newVersion}`, { ignoreError: true });
|
|
391
|
-
console.log('ā
Rolled back successfully');
|
|
392
|
-
} catch {}
|
|
393
|
-
|
|
394
|
-
return false;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
async run(args) {
|
|
399
|
-
let versionType = 'patch';
|
|
400
|
-
const options = {};
|
|
401
|
-
|
|
402
|
-
// Parse arguments
|
|
403
|
-
for (let i = 0; i < args.length; i++) {
|
|
404
|
-
const arg = args[i];
|
|
405
|
-
|
|
406
|
-
if (arg === 'major' || arg === 'minor' || arg === 'patch' || arg === 'prerelease') {
|
|
407
|
-
versionType = arg;
|
|
408
|
-
} else if (arg === '--version' || arg === '-v') {
|
|
409
|
-
options.version = args[++i];
|
|
410
|
-
} else if (arg === '--dry-run') {
|
|
411
|
-
options.dryRun = true;
|
|
412
|
-
} else if (arg === '--yes' || arg === '-y') {
|
|
413
|
-
options.yes = true;
|
|
414
|
-
} else if (arg === '--no-push') {
|
|
415
|
-
options.noPush = true;
|
|
416
|
-
} else if (arg === '--no-github') {
|
|
417
|
-
options.noGithub = true;
|
|
418
|
-
} else if (arg === '--publish') {
|
|
419
|
-
options.publish = true;
|
|
420
|
-
} else if (arg === '--allow-dirty') {
|
|
421
|
-
options.allowDirty = true;
|
|
422
|
-
} else if (arg === '--help' || arg === '-h') {
|
|
423
|
-
console.log('Usage: pm release [type] [options]');
|
|
424
|
-
console.log('\nTypes:');
|
|
425
|
-
console.log(' major Increment major version (1.0.0 -> 2.0.0)');
|
|
426
|
-
console.log(' minor Increment minor version (1.0.0 -> 1.1.0)');
|
|
427
|
-
console.log(' patch Increment patch version (1.0.0 -> 1.0.1) [default]');
|
|
428
|
-
console.log(' prerelease Create prerelease version (1.0.0 -> 1.0.0-beta.1)');
|
|
429
|
-
console.log('\nOptions:');
|
|
430
|
-
console.log(' -v, --version <ver> Use specific version');
|
|
431
|
-
console.log(' -y, --yes Skip confirmation');
|
|
432
|
-
console.log(' --dry-run Preview without making changes');
|
|
433
|
-
console.log(' --no-push Don\'t push to remote');
|
|
434
|
-
console.log(' --no-github Don\'t create GitHub release');
|
|
435
|
-
console.log(' --publish Publish to npm');
|
|
436
|
-
console.log(' --allow-dirty Allow uncommitted changes');
|
|
437
|
-
console.log('\nExamples:');
|
|
438
|
-
console.log(' pm release # Patch release');
|
|
439
|
-
console.log(' pm release minor # Minor release');
|
|
440
|
-
console.log(' pm release --version 2.0.0 # Specific version');
|
|
441
|
-
console.log(' pm release --dry-run # Preview release');
|
|
442
|
-
process.exit(0);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
const success = await this.createRelease(versionType, options);
|
|
447
|
-
process.exit(success ? 0 : 1);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
// Main execution
|
|
452
|
-
if (require.main === module) {
|
|
453
|
-
const manager = new ReleaseManager();
|
|
454
|
-
manager.run(process.argv.slice(2)).catch(error => {
|
|
455
|
-
console.error('ā Error:', error.message);
|
|
456
|
-
process.exit(1);
|
|
457
|
-
});
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
module.exports = ReleaseManager;
|