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,178 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PM In-Progress Script - Node.js Implementation
|
|
5
|
-
*
|
|
6
|
-
* Migrated from in-progress.sh to show active work items
|
|
7
|
-
* Maintains full compatibility with the original bash implementation
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
|
|
13
|
-
function getInProgressWork() {
|
|
14
|
-
const result = {
|
|
15
|
-
activeIssues: [],
|
|
16
|
-
activeEpics: [],
|
|
17
|
-
totalActive: 0
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
if (!fs.existsSync('.claude/epics')) {
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
try {
|
|
25
|
-
const epicDirs = fs.readdirSync('.claude/epics', { withFileTypes: true })
|
|
26
|
-
.filter(dirent => dirent.isDirectory())
|
|
27
|
-
.map(dirent => dirent.name);
|
|
28
|
-
|
|
29
|
-
// Check for active work in updates directories
|
|
30
|
-
for (const epicName of epicDirs) {
|
|
31
|
-
const epicPath = path.join('.claude/epics', epicName);
|
|
32
|
-
const updatesPath = path.join(epicPath, 'updates');
|
|
33
|
-
|
|
34
|
-
if (fs.existsSync(updatesPath)) {
|
|
35
|
-
try {
|
|
36
|
-
const updateDirs = fs.readdirSync(updatesPath, { withFileTypes: true })
|
|
37
|
-
.filter(dirent => dirent.isDirectory())
|
|
38
|
-
.map(dirent => dirent.name);
|
|
39
|
-
|
|
40
|
-
for (const issueNum of updateDirs) {
|
|
41
|
-
const progressFile = path.join(updatesPath, issueNum, 'progress.md');
|
|
42
|
-
|
|
43
|
-
if (fs.existsSync(progressFile)) {
|
|
44
|
-
try {
|
|
45
|
-
const progressContent = fs.readFileSync(progressFile, 'utf8');
|
|
46
|
-
|
|
47
|
-
// Extract completion percentage
|
|
48
|
-
const completionMatch = progressContent.match(/^completion:\s*(.*)$/m);
|
|
49
|
-
const completion = completionMatch ? completionMatch[1].trim() : '0%';
|
|
50
|
-
|
|
51
|
-
// Extract last sync
|
|
52
|
-
const lastSyncMatch = progressContent.match(/^last_sync:\s*(.*)$/m);
|
|
53
|
-
const lastSync = lastSyncMatch ? lastSyncMatch[1].trim() : null;
|
|
54
|
-
|
|
55
|
-
// Get task name from task file
|
|
56
|
-
const taskFile = path.join(epicPath, `${issueNum}.md`);
|
|
57
|
-
let taskName = 'Unknown task';
|
|
58
|
-
|
|
59
|
-
if (fs.existsSync(taskFile)) {
|
|
60
|
-
try {
|
|
61
|
-
const taskContent = fs.readFileSync(taskFile, 'utf8');
|
|
62
|
-
const nameMatch = taskContent.match(/^name:\s*(.*)$/m);
|
|
63
|
-
if (nameMatch) {
|
|
64
|
-
taskName = nameMatch[1].trim();
|
|
65
|
-
}
|
|
66
|
-
} catch (error) {
|
|
67
|
-
// Keep default task name
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
result.activeIssues.push({
|
|
72
|
-
issueNum,
|
|
73
|
-
epicName,
|
|
74
|
-
taskName,
|
|
75
|
-
completion,
|
|
76
|
-
lastSync
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
result.totalActive++;
|
|
80
|
-
} catch (error) {
|
|
81
|
-
// Skip unreadable progress files
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
} catch (error) {
|
|
87
|
-
// Skip unreadable updates directories
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Check for active epics
|
|
94
|
-
for (const epicName of epicDirs) {
|
|
95
|
-
const epicFile = path.join('.claude/epics', epicName, 'epic.md');
|
|
96
|
-
|
|
97
|
-
if (fs.existsSync(epicFile)) {
|
|
98
|
-
try {
|
|
99
|
-
const epicContent = fs.readFileSync(epicFile, 'utf8');
|
|
100
|
-
|
|
101
|
-
const statusMatch = epicContent.match(/^status:\s*(.*)$/m);
|
|
102
|
-
const status = statusMatch ? statusMatch[1].trim() : '';
|
|
103
|
-
|
|
104
|
-
if (status === 'in-progress' || status === 'active') {
|
|
105
|
-
const nameMatch = epicContent.match(/^name:\s*(.*)$/m);
|
|
106
|
-
const name = nameMatch ? nameMatch[1].trim() : epicName;
|
|
107
|
-
|
|
108
|
-
const progressMatch = epicContent.match(/^progress:\s*(.*)$/m);
|
|
109
|
-
const progress = progressMatch ? progressMatch[1].trim() : '0%';
|
|
110
|
-
|
|
111
|
-
result.activeEpics.push({
|
|
112
|
-
name,
|
|
113
|
-
status,
|
|
114
|
-
progress
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
} catch (error) {
|
|
118
|
-
// Skip unreadable epic files
|
|
119
|
-
continue;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
} catch (error) {
|
|
124
|
-
// Directory doesn't exist or can't be read
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
return result;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
function formatInProgressOutput(data) {
|
|
131
|
-
let output = 'Getting status...\n\n\n';
|
|
132
|
-
output += '🔄 In Progress Work\n';
|
|
133
|
-
output += '===================\n\n';
|
|
134
|
-
|
|
135
|
-
// Active issues
|
|
136
|
-
if (data.activeIssues.length > 0) {
|
|
137
|
-
for (const issue of data.activeIssues) {
|
|
138
|
-
output += `📝 Issue #${issue.issueNum} - ${issue.taskName}\n`;
|
|
139
|
-
output += ` Epic: ${issue.epicName}\n`;
|
|
140
|
-
output += ` Progress: ${issue.completion} complete\n`;
|
|
141
|
-
|
|
142
|
-
if (issue.lastSync) {
|
|
143
|
-
output += ` Last update: ${issue.lastSync}\n`;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
output += '\n';
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
// Active epics
|
|
151
|
-
output += '📚 Active Epics:\n';
|
|
152
|
-
if (data.activeEpics.length > 0) {
|
|
153
|
-
for (const epic of data.activeEpics) {
|
|
154
|
-
output += ` • ${epic.name} - ${epic.progress} complete\n`;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
output += '\n';
|
|
159
|
-
|
|
160
|
-
if (data.totalActive === 0) {
|
|
161
|
-
output += 'No active work items found.\n\n';
|
|
162
|
-
output += '💡 Start work with: /pm:next\n';
|
|
163
|
-
} else {
|
|
164
|
-
output += `📊 Total active items: ${data.totalActive}\n`;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return output;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
// CommonJS export for testing
|
|
171
|
-
module.exports = getInProgressWork;
|
|
172
|
-
|
|
173
|
-
// CLI execution
|
|
174
|
-
if (require.main === module) {
|
|
175
|
-
const data = getInProgressWork();
|
|
176
|
-
console.log(formatInProgressOutput(data));
|
|
177
|
-
process.exit(0);
|
|
178
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
|
|
3
|
-
# PM In-Progress 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
|
-
|
|
9
|
-
# Check if Node.js is available
|
|
10
|
-
if command -v node >/dev/null 2>&1; then
|
|
11
|
-
# Use the Node.js implementation
|
|
12
|
-
node "$SCRIPT_DIR/in-progress.js"
|
|
13
|
-
exit $?
|
|
14
|
-
else
|
|
15
|
-
# Fallback to the original bash implementation if Node.js is not available
|
|
16
|
-
echo "⚠️ Node.js not found, falling back to bash implementation"
|
|
17
|
-
echo ""
|
|
18
|
-
|
|
19
|
-
# Original bash implementation (preserved for fallback)
|
|
20
|
-
echo "Getting status..."
|
|
21
|
-
echo ""
|
|
22
|
-
echo ""
|
|
23
|
-
|
|
24
|
-
echo "🔄 In Progress Work"
|
|
25
|
-
echo "==================="
|
|
26
|
-
echo ""
|
|
27
|
-
|
|
28
|
-
# Check for active work in updates directories
|
|
29
|
-
found=0
|
|
30
|
-
|
|
31
|
-
if [ -d ".claude/epics" ]; then
|
|
32
|
-
for updates_dir in .claude/epics/*/updates/*/; do
|
|
33
|
-
[ -d "$updates_dir" ] || continue
|
|
34
|
-
|
|
35
|
-
issue_num=$(basename "$updates_dir")
|
|
36
|
-
epic_name=$(basename $(dirname $(dirname "$updates_dir")))
|
|
37
|
-
|
|
38
|
-
if [ -f "$updates_dir/progress.md" ]; then
|
|
39
|
-
completion=$(grep "^completion:" "$updates_dir/progress.md" | head -1 | sed 's/^completion: *//')
|
|
40
|
-
[ -z "$completion" ] && completion="0%"
|
|
41
|
-
|
|
42
|
-
# Get task name from the task file
|
|
43
|
-
task_file=".claude/epics/$epic_name/$issue_num.md"
|
|
44
|
-
if [ -f "$task_file" ]; then
|
|
45
|
-
task_name=$(grep "^name:" "$task_file" | head -1 | sed 's/^name: *//')
|
|
46
|
-
else
|
|
47
|
-
task_name="Unknown task"
|
|
48
|
-
fi
|
|
49
|
-
|
|
50
|
-
echo "📝 Issue #$issue_num - $task_name"
|
|
51
|
-
echo " Epic: $epic_name"
|
|
52
|
-
echo " Progress: $completion complete"
|
|
53
|
-
|
|
54
|
-
# Check for recent updates
|
|
55
|
-
if [ -f "$updates_dir/progress.md" ]; then
|
|
56
|
-
last_update=$(grep "^last_sync:" "$updates_dir/progress.md" | head -1 | sed 's/^last_sync: *//')
|
|
57
|
-
[ -n "$last_update" ] && echo " Last update: $last_update"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
echo ""
|
|
61
|
-
((found++))
|
|
62
|
-
fi
|
|
63
|
-
done
|
|
64
|
-
fi
|
|
65
|
-
|
|
66
|
-
# Also check for in-progress epics
|
|
67
|
-
echo "📚 Active Epics:"
|
|
68
|
-
for epic_dir in .claude/epics/*/; do
|
|
69
|
-
[ -d "$epic_dir" ] || continue
|
|
70
|
-
[ -f "$epic_dir/epic.md" ] || continue
|
|
71
|
-
|
|
72
|
-
status=$(grep "^status:" "$epic_dir/epic.md" | head -1 | sed 's/^status: *//')
|
|
73
|
-
if [ "$status" = "in-progress" ] || [ "$status" = "active" ]; then
|
|
74
|
-
epic_name=$(grep "^name:" "$epic_dir/epic.md" | head -1 | sed 's/^name: *//')
|
|
75
|
-
progress=$(grep "^progress:" "$epic_dir/epic.md" | head -1 | sed 's/^progress: *//')
|
|
76
|
-
[ -z "$epic_name" ] && epic_name=$(basename "$epic_dir")
|
|
77
|
-
[ -z "$progress" ] && progress="0%"
|
|
78
|
-
|
|
79
|
-
echo " • $epic_name - $progress complete"
|
|
80
|
-
fi
|
|
81
|
-
done
|
|
82
|
-
|
|
83
|
-
echo ""
|
|
84
|
-
if [ $found -eq 0 ]; then
|
|
85
|
-
echo "No active work items found."
|
|
86
|
-
echo ""
|
|
87
|
-
echo "💡 Start work with: /pm:next"
|
|
88
|
-
else
|
|
89
|
-
echo "📊 Total active items: $found"
|
|
90
|
-
fi
|
|
91
|
-
|
|
92
|
-
exit 0
|
|
93
|
-
fi
|
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* PM Init Script - Node.js Implementation
|
|
5
|
-
*
|
|
6
|
-
* Migrated from init.sh to provide system initialization functionality
|
|
7
|
-
* Maintains full compatibility with the original bash implementation
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const fs = require('fs');
|
|
11
|
-
const path = require('path');
|
|
12
|
-
const { execSync, exec } = require('child_process');
|
|
13
|
-
const { promisify } = require('util');
|
|
14
|
-
|
|
15
|
-
const execAsync = promisify(exec);
|
|
16
|
-
|
|
17
|
-
async function initializeSystem(options = {}) {
|
|
18
|
-
const {
|
|
19
|
-
dryRun = false,
|
|
20
|
-
skipDependencyCheck = false,
|
|
21
|
-
verbose = false
|
|
22
|
-
} = options;
|
|
23
|
-
|
|
24
|
-
const result = {
|
|
25
|
-
dryRun,
|
|
26
|
-
options,
|
|
27
|
-
directories: {
|
|
28
|
-
required: [
|
|
29
|
-
'.claude/prds',
|
|
30
|
-
'.claude/epics',
|
|
31
|
-
'.claude/rules',
|
|
32
|
-
'.claude/agents',
|
|
33
|
-
'.claude/scripts/pm'
|
|
34
|
-
],
|
|
35
|
-
created: []
|
|
36
|
-
},
|
|
37
|
-
dependencies: {
|
|
38
|
-
gh: false,
|
|
39
|
-
ghAuth: false,
|
|
40
|
-
ghExtensions: []
|
|
41
|
-
},
|
|
42
|
-
git: {
|
|
43
|
-
isRepo: false,
|
|
44
|
-
hasRemote: false,
|
|
45
|
-
remoteUrl: null,
|
|
46
|
-
warnings: []
|
|
47
|
-
},
|
|
48
|
-
claude: {
|
|
49
|
-
exists: false,
|
|
50
|
-
created: false
|
|
51
|
-
},
|
|
52
|
-
summary: {}
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
// Create directory structure
|
|
56
|
-
if (!dryRun) {
|
|
57
|
-
for (const dir of result.directories.required) {
|
|
58
|
-
if (!fs.existsSync(dir)) {
|
|
59
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
60
|
-
result.directories.created.push(dir);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
} else {
|
|
64
|
-
// In dry run, check which directories would be created
|
|
65
|
-
for (const dir of result.directories.required) {
|
|
66
|
-
if (!fs.existsSync(dir)) {
|
|
67
|
-
result.directories.created.push(dir);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
// Check git repository status
|
|
73
|
-
try {
|
|
74
|
-
execSync('git rev-parse --git-dir', { stdio: 'ignore' });
|
|
75
|
-
result.git.isRepo = true;
|
|
76
|
-
|
|
77
|
-
try {
|
|
78
|
-
const remoteOutput = execSync('git remote -v', { encoding: 'utf8', stdio: 'pipe' });
|
|
79
|
-
if (remoteOutput.includes('origin')) {
|
|
80
|
-
result.git.hasRemote = true;
|
|
81
|
-
|
|
82
|
-
try {
|
|
83
|
-
result.git.remoteUrl = execSync('git remote get-url origin', {
|
|
84
|
-
encoding: 'utf8',
|
|
85
|
-
stdio: 'pipe'
|
|
86
|
-
}).trim();
|
|
87
|
-
|
|
88
|
-
// Check if remote is the AutoPM template repository
|
|
89
|
-
if (result.git.remoteUrl.includes('rlagowski/autopm')) {
|
|
90
|
-
result.git.warnings.push({
|
|
91
|
-
type: 'template_repo',
|
|
92
|
-
message: 'Remote origin points to the AutoPM template repository. Consider updating to your own repository.'
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
} catch (error) {
|
|
96
|
-
// Could not get remote URL
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
} catch (error) {
|
|
100
|
-
// No remotes configured
|
|
101
|
-
}
|
|
102
|
-
} catch (error) {
|
|
103
|
-
result.git.isRepo = false;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// Check dependencies
|
|
107
|
-
if (!skipDependencyCheck) {
|
|
108
|
-
try {
|
|
109
|
-
execSync('gh --version', { stdio: 'ignore' });
|
|
110
|
-
result.dependencies.gh = true;
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
execSync('gh auth status', { stdio: 'ignore' });
|
|
114
|
-
result.dependencies.ghAuth = true;
|
|
115
|
-
} catch (error) {
|
|
116
|
-
result.dependencies.ghAuth = false;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
const extensionsOutput = execSync('gh extension list', {
|
|
121
|
-
encoding: 'utf8',
|
|
122
|
-
stdio: 'pipe'
|
|
123
|
-
});
|
|
124
|
-
result.dependencies.ghExtensions = extensionsOutput
|
|
125
|
-
.split('\n')
|
|
126
|
-
.filter(line => line.trim())
|
|
127
|
-
.map(line => line.split('\t')[0]);
|
|
128
|
-
} catch (error) {
|
|
129
|
-
// No extensions or error listing them
|
|
130
|
-
}
|
|
131
|
-
} catch (error) {
|
|
132
|
-
result.dependencies.gh = false;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Handle CLAUDE.md
|
|
137
|
-
result.claude.exists = fs.existsSync('CLAUDE.md');
|
|
138
|
-
|
|
139
|
-
if (!result.claude.exists && !dryRun) {
|
|
140
|
-
const claudeContent = `# CLAUDE.md
|
|
141
|
-
|
|
142
|
-
> Think carefully and implement the most concise solution that changes as little code as possible.
|
|
143
|
-
|
|
144
|
-
## Project-Specific Instructions
|
|
145
|
-
|
|
146
|
-
Add your project-specific instructions here.
|
|
147
|
-
|
|
148
|
-
## Testing
|
|
149
|
-
|
|
150
|
-
Always run tests before committing:
|
|
151
|
-
- \`npm test\` or equivalent for your stack
|
|
152
|
-
|
|
153
|
-
## Code Style
|
|
154
|
-
|
|
155
|
-
Follow existing patterns in the codebase.
|
|
156
|
-
`;
|
|
157
|
-
|
|
158
|
-
fs.writeFileSync('CLAUDE.md', claudeContent);
|
|
159
|
-
result.claude.created = true;
|
|
160
|
-
} else if (!result.claude.exists && dryRun) {
|
|
161
|
-
result.claude.created = true; // Would be created
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// Generate summary
|
|
165
|
-
result.summary = {
|
|
166
|
-
directoriesCreated: result.directories.created.length,
|
|
167
|
-
gitConfigured: result.git.isRepo && result.git.hasRemote,
|
|
168
|
-
dependenciesReady: result.dependencies.gh && result.dependencies.ghAuth,
|
|
169
|
-
claudeReady: result.claude.exists || result.claude.created,
|
|
170
|
-
hasWarnings: result.git.warnings.length > 0
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
return result;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function displayBanner() {
|
|
177
|
-
return `
|
|
178
|
-
█████╗ ██╗ ██╗████████╗ ██████╗ ██████╗ ███╗ ███╗
|
|
179
|
-
██╔══██╗██║ ██║╚══██╔══╝██╔═══██╗██╔══██╗████╗ ████║
|
|
180
|
-
███████║██║ ██║ ██║ ██║ ██║██████╔╝██╔████╔██║
|
|
181
|
-
██╔══██║██║ ██║ ██║ ██║ ██║██╔═══╝ ██║╚██╔╝██║
|
|
182
|
-
██║ ██║╚██████╔╝ ██║ ╚██████╔╝██║ ██║ ╚═╝ ██║
|
|
183
|
-
╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝
|
|
184
|
-
|
|
185
|
-
┌─────────────────────────────────┐
|
|
186
|
-
│ Claude Code Project Management │
|
|
187
|
-
│ by https://x.com/aroussi │
|
|
188
|
-
└─────────────────────────────────┘
|
|
189
|
-
https://github.com/rlagowski/autopm
|
|
190
|
-
`;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function formatInitOutput(data) {
|
|
194
|
-
let output = 'Initializing...\n\n\n';
|
|
195
|
-
output += displayBanner();
|
|
196
|
-
output += '\n\n';
|
|
197
|
-
|
|
198
|
-
output += '🚀 Initializing Claude Code AutoPM System\n';
|
|
199
|
-
output += '======================================\n\n';
|
|
200
|
-
|
|
201
|
-
// Dependencies check
|
|
202
|
-
output += '🔍 Checking dependencies...\n';
|
|
203
|
-
if (data.dependencies.gh) {
|
|
204
|
-
output += ' ✅ GitHub CLI (gh) installed\n';
|
|
205
|
-
} else {
|
|
206
|
-
output += ' ❌ GitHub CLI (gh) not found\n';
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
output += '\n🔐 Checking GitHub authentication...\n';
|
|
210
|
-
if (data.dependencies.ghAuth) {
|
|
211
|
-
output += ' ✅ GitHub authenticated\n';
|
|
212
|
-
} else {
|
|
213
|
-
output += ' ⚠️ GitHub not authenticated\n';
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
output += '\n📦 Checking gh extensions...\n';
|
|
217
|
-
const hasSubIssue = data.dependencies.ghExtensions.some(ext =>
|
|
218
|
-
ext.includes('gh-sub-issue') || ext.includes('yahsan2/gh-sub-issue'));
|
|
219
|
-
|
|
220
|
-
if (hasSubIssue) {
|
|
221
|
-
output += ' ✅ gh-sub-issue extension installed\n';
|
|
222
|
-
} else {
|
|
223
|
-
output += ' 📥 gh-sub-issue extension needed\n';
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Directory structure
|
|
227
|
-
output += '\n📁 Creating directory structure...\n';
|
|
228
|
-
if (data.directories.created.length > 0) {
|
|
229
|
-
output += ' ✅ Directories created\n';
|
|
230
|
-
} else {
|
|
231
|
-
output += ' ✅ Directory structure exists\n';
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
// Git configuration
|
|
235
|
-
output += '\n🔗 Checking Git configuration...\n';
|
|
236
|
-
if (data.git.isRepo) {
|
|
237
|
-
output += ' ✅ Git repository detected\n';
|
|
238
|
-
|
|
239
|
-
if (data.git.hasRemote) {
|
|
240
|
-
output += ` ✅ Remote configured: ${data.git.remoteUrl}\n`;
|
|
241
|
-
|
|
242
|
-
// Show warnings
|
|
243
|
-
for (const warning of data.git.warnings) {
|
|
244
|
-
if (warning.type === 'template_repo') {
|
|
245
|
-
output += '\n ⚠️ WARNING: Your remote origin points to the AutoPM template repository!\n';
|
|
246
|
-
output += ' This means any issues you create will go to the template repo, not your project.\n\n';
|
|
247
|
-
output += ' To fix this:\n';
|
|
248
|
-
output += ' 1. Fork the repository or create your own on GitHub\n';
|
|
249
|
-
output += ' 2. Update your remote:\n';
|
|
250
|
-
output += ' git remote set-url origin https://github.com/YOUR_USERNAME/YOUR_REPO.git\n\n';
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
} else {
|
|
254
|
-
output += ' ⚠️ No remote configured\n';
|
|
255
|
-
output += ' Add with: git remote add origin <url>\n';
|
|
256
|
-
}
|
|
257
|
-
} else {
|
|
258
|
-
output += ' ⚠️ Not a git repository\n';
|
|
259
|
-
output += ' Initialize with: git init\n';
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
// CLAUDE.md
|
|
263
|
-
if (data.claude.created) {
|
|
264
|
-
output += '\n📄 Creating CLAUDE.md...\n';
|
|
265
|
-
output += ' ✅ CLAUDE.md created\n';
|
|
266
|
-
} else if (data.claude.exists) {
|
|
267
|
-
output += '\n📄 CLAUDE.md exists\n';
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Summary
|
|
271
|
-
output += '\n✅ Initialization Complete!\n';
|
|
272
|
-
output += '==========================\n\n';
|
|
273
|
-
|
|
274
|
-
output += '📊 System Status:\n';
|
|
275
|
-
if (data.dependencies.gh) {
|
|
276
|
-
try {
|
|
277
|
-
const ghVersion = execSync('gh --version', { encoding: 'utf8' }).split('\n')[0];
|
|
278
|
-
output += `${ghVersion}\n`;
|
|
279
|
-
} catch (error) {
|
|
280
|
-
output += 'GitHub CLI: Available\n';
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
output += ` Extensions: ${data.dependencies.ghExtensions.length} installed\n`;
|
|
285
|
-
|
|
286
|
-
if (data.dependencies.ghAuth) {
|
|
287
|
-
output += ' Auth: Authenticated\n';
|
|
288
|
-
} else {
|
|
289
|
-
output += ' Auth: Not authenticated\n';
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
output += '\n🎯 Next Steps:\n';
|
|
293
|
-
output += ' 1. Create your first PRD: /pm:prd-new <feature-name>\n';
|
|
294
|
-
output += ' 2. View help: /pm:help\n';
|
|
295
|
-
output += ' 3. Check status: /pm:status\n\n';
|
|
296
|
-
output += '📚 Documentation: README.md\n';
|
|
297
|
-
|
|
298
|
-
return output;
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
// CommonJS export for testing
|
|
302
|
-
module.exports = {
|
|
303
|
-
initializeSystem,
|
|
304
|
-
displayBanner,
|
|
305
|
-
formatInitOutput
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
// CLI execution
|
|
309
|
-
if (require.main === module) {
|
|
310
|
-
const dryRun = process.argv.includes('--dry-run');
|
|
311
|
-
|
|
312
|
-
module.exports.initializeSystem({ dryRun })
|
|
313
|
-
.then(result => {
|
|
314
|
-
console.log(module.exports.formatInitOutput(result));
|
|
315
|
-
process.exit(0);
|
|
316
|
-
})
|
|
317
|
-
.catch(error => {
|
|
318
|
-
console.error('❌ Initialization failed:', error.message);
|
|
319
|
-
process.exit(1);
|
|
320
|
-
});
|
|
321
|
-
}
|