claude-autopm 1.18.0 → 1.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +159 -0
  2. package/autopm/.claude/agents/README.md +1 -1
  3. package/autopm/.claude/agents/core/mcp-manager.md +1 -1
  4. package/autopm/.claude/agents/decision-matrices/python-backend-selection.md +25 -25
  5. package/autopm/.claude/agents/decision-matrices/ui-framework-selection.md +43 -43
  6. package/autopm/.claude/agents/devops/github-operations-specialist.md +1 -1
  7. package/autopm/.claude/agents/frameworks/README.md +5 -5
  8. package/autopm/.claude/agents/frameworks/e2e-test-engineer.md +1 -1
  9. package/autopm/.claude/agents/frameworks/nats-messaging-expert.md +1 -1
  10. package/autopm/.claude/agents/frameworks/react-frontend-engineer.md +1 -1
  11. package/autopm/.claude/agents/frameworks/react-ui-expert.md +3 -3
  12. package/autopm/.claude/agents/frameworks/tailwindcss-expert.md +3 -3
  13. package/autopm/.claude/agents/frameworks/ux-design-expert.md +3 -3
  14. package/autopm/.claude/commands/infrastructure/traefik-setup.md +1 -1
  15. package/autopm/.claude/commands/playwright/test-scaffold.md +1 -1
  16. package/autopm/.claude/commands/pm/context.md +11 -0
  17. package/autopm/.claude/commands/pm/epic-decompose.md +25 -2
  18. package/autopm/.claude/commands/pm/epic-oneshot.md +13 -0
  19. package/autopm/.claude/commands/pm/epic-start.md +19 -0
  20. package/autopm/.claude/commands/pm/epic-sync-modular.md +10 -10
  21. package/autopm/.claude/commands/pm/epic-sync.md +14 -14
  22. package/autopm/.claude/commands/pm/issue-start.md +50 -5
  23. package/autopm/.claude/commands/pm/issue-sync.md +15 -15
  24. package/autopm/.claude/commands/pm/what-next.md +11 -0
  25. package/autopm/.claude/commands/ui/bootstrap-scaffold.md +6 -5
  26. package/autopm/.claude/commands/ui/tailwind-system.md +1 -1
  27. package/autopm/.claude/examples/mcp/playwright-mcp.md +2 -2
  28. package/autopm/.claude/examples/mcp-servers.example.json +2 -2
  29. package/autopm/.claude/hooks/docker-first-enforcement.sh +1 -1
  30. package/autopm/.claude/mcp/MCP-REGISTRY.md +1 -1
  31. package/autopm/.claude/mcp/playwright-mcp.md +2 -2
  32. package/autopm/.claude/rules/agent-coordination.md +26 -24
  33. package/autopm/.claude/rules/docker-first-development.md +1 -1
  34. package/autopm/.claude/rules/infrastructure-pipeline.md +1 -1
  35. package/autopm/.claude/rules/ui-development-standards.md +1 -1
  36. package/autopm/.claude/rules/visual-testing.md +3 -3
  37. package/autopm/.claude/scripts/azure/active-work.js +2 -2
  38. package/autopm/.claude/scripts/azure/blocked.js +13 -13
  39. package/autopm/.claude/scripts/azure/daily.js +1 -1
  40. package/autopm/.claude/scripts/azure/dashboard.js +1 -1
  41. package/autopm/.claude/scripts/azure/feature-list.js +2 -2
  42. package/autopm/.claude/scripts/azure/feature-status.js +1 -1
  43. package/autopm/.claude/scripts/azure/next-task.js +1 -1
  44. package/autopm/.claude/scripts/azure/search.js +1 -1
  45. package/autopm/.claude/scripts/azure/setup.js +15 -15
  46. package/autopm/.claude/scripts/azure/sprint-report.js +2 -2
  47. package/autopm/.claude/scripts/azure/sync.js +1 -1
  48. package/autopm/.claude/scripts/azure/us-list.js +1 -1
  49. package/autopm/.claude/scripts/azure/us-status.js +1 -1
  50. package/autopm/.claude/scripts/azure/validate.js +13 -13
  51. package/autopm/.claude/scripts/lib/frontmatter-utils.sh +42 -7
  52. package/autopm/.claude/scripts/lib/logging-utils.sh +20 -16
  53. package/autopm/.claude/scripts/lib/validation-utils.sh +1 -1
  54. package/autopm/.claude/scripts/pm/context.js +338 -0
  55. package/autopm/.claude/scripts/pm/issue-sync/format-comment.sh +3 -3
  56. package/autopm/.claude/scripts/pm/lib/README.md +85 -0
  57. package/autopm/.claude/scripts/pm/lib/logger.js +78 -0
  58. package/autopm/.claude/scripts/pm/next.js +25 -1
  59. package/autopm/.claude/scripts/pm/what-next.js +660 -0
  60. package/autopm/.claude/teams.json +3 -5
  61. package/autopm/.claude/templates/claude-templates/addons/devops-agents.md +2 -2
  62. package/autopm/.claude/templates/claude-templates/addons/docker-agents.md +4 -4
  63. package/autopm/.claude/templates/claude-templates/addons/minimal-agents.md +1 -1
  64. package/autopm/.claude/templates/issue-decomposition/api.yaml +2 -2
  65. package/autopm/.claude/templates/issue-decomposition/auth.yaml +4 -4
  66. package/autopm/.claude/templates/issue-decomposition/crud.yaml +3 -3
  67. package/autopm/.claude/templates/issue-decomposition/default.yaml +1 -1
  68. package/autopm/.claude/templates/issue-decomposition/ui-feature.yaml +2 -2
  69. package/bin/autopm.js +25 -0
  70. package/package.json +1 -2
  71. package/lib/agentExecutor.js.deprecated +0 -101
  72. package/lib/azure/cache.js +0 -80
  73. package/lib/azure/client.js +0 -77
  74. package/lib/azure/formatter.js +0 -177
  75. package/lib/commandHelpers.js +0 -177
  76. package/lib/context/manager.js +0 -290
  77. package/lib/documentation/manager.js +0 -528
  78. package/lib/github/workflow-manager.js +0 -546
  79. package/lib/helpers/azure-batch-api.js +0 -133
  80. package/lib/helpers/azure-cache-manager.js +0 -287
  81. package/lib/helpers/azure-parallel-processor.js +0 -158
  82. package/lib/helpers/azure-work-item-create.js +0 -278
  83. package/lib/helpers/gh-issue-create.js +0 -250
  84. package/lib/helpers/interactive-prompt.js +0 -336
  85. package/lib/helpers/output-manager.js +0 -335
  86. package/lib/helpers/progress-indicator.js +0 -258
  87. package/lib/performance/benchmarker.js +0 -429
  88. package/lib/pm/epic-decomposer.js +0 -273
  89. package/lib/pm/epic-syncer.js +0 -221
  90. package/lib/prdMetadata.js +0 -270
  91. package/lib/providers/azure/index.js +0 -234
  92. package/lib/providers/factory.js +0 -87
  93. package/lib/providers/github/index.js +0 -204
  94. package/lib/providers/interface.js +0 -73
  95. package/lib/python/scaffold-manager.js +0 -576
  96. package/lib/react/scaffold-manager.js +0 -745
  97. package/lib/regression/analyzer.js +0 -578
  98. package/lib/release/manager.js +0 -324
  99. package/lib/tailwind/manager.js +0 -486
  100. package/lib/traefik/manager.js +0 -484
  101. package/lib/utils/colors.js +0 -126
  102. package/lib/utils/config.js +0 -317
  103. package/lib/utils/filesystem.js +0 -316
  104. package/lib/utils/logger.js +0 -135
  105. package/lib/utils/prompts.js +0 -294
  106. package/lib/utils/shell.js +0 -237
  107. package/lib/validators/email-validator.js +0 -337
  108. package/lib/workflow/manager.js +0 -449
@@ -89,7 +89,7 @@ check_docker_files() {
89
89
  if [[ ${#missing_files[@]} -gt 0 ]]; then
90
90
  echo ""
91
91
  echo "📝 MISSING FILES: ${missing_files[*]}"
92
- echo "💡 TIP: Use docker-expert agent to create Docker files:"
92
+ echo "💡 TIP: Use docker-containerization-expert agent to create Docker files:"
93
93
  echo " Task: Create Docker development environment for this project"
94
94
  echo ""
95
95
  fi
@@ -96,7 +96,7 @@ autopm mcp add
96
96
  cp .claude/examples/mcp/context7.md .claude/mcp/
97
97
 
98
98
  # Or from installed framework
99
- cp /path/to/framework/autopm/.claude/examples/mcp/playwright-mcp.md .claude/mcp/
99
+ cp .claude/examples/mcp/playwright-mcp.md .claude/mcp/
100
100
  ```
101
101
 
102
102
  ### ✅ Enabling/Disabling Servers
@@ -74,7 +74,7 @@ autopm mcp sync
74
74
  ### Integration with Agents
75
75
 
76
76
  Used extensively with:
77
- - `e2e-test-engineer` - For E2E test creation
77
+ - `frontend-testing-engineer` - For E2E test creation
78
78
  - `react-frontend-engineer` - For UI testing
79
79
  - `ux-design-expert` - For visual regression
80
80
 
@@ -309,4 +309,4 @@ npx playwright show-trace trace.zip
309
309
 
310
310
  - [Playwright Documentation](https://playwright.dev)
311
311
  - [MCP Browser Control](https://modelcontextprotocol.org/browser)
312
- - [E2E Test Engineer Agent](../agents/frameworks/e2e-test-engineer.md)
312
+ - [E2E Test Engineer Agent](../agents/frameworks/frontend-testing-engineer.md)
@@ -20,10 +20,10 @@ Comprehensive coordination system for multi-agent collaboration in ClaudeAutoPM.
20
20
  | python-backend-expert | Backend APIs | `*.py`, `requirements.txt`, `pyproject.toml` | react-ui-expert, kubernetes, cloud architects | framework: fastapi/flask/django |
21
21
  | react-ui-expert | Frontend UI | `*.tsx`, `*.jsx`, `*.css`, `package.json` | python-backend, e2e-test | framework: mui/chakra/antd/bootstrap |
22
22
  | e2e-test-engineer | E2E Tests | `tests/`, `*.spec.ts`, `playwright.config.ts` | react-ui, python-backend | tool: playwright/cypress |
23
- | multi-cloud-architect | Cloud Infrastructure | `terraform/`, `*.tf`, cloud configs | kubernetes, docker | provider: aws/azure/gcp |
23
+ | terraform-infrastructure-expert | Cloud Infrastructure | `terraform/`, `*.tf`, cloud configs | kubernetes, docker, cloud architects | provider: aws/azure/gcp |
24
24
  | kubernetes-orchestrator | K8s Manifests | `k8s/`, `charts/`, `*.yaml` | cloud architects, github-ops | tool: helm/kustomize |
25
25
  | docker-containerization-expert | Containers | `Dockerfile*`, `docker-compose*.yml` | All deployment agents | strategy: multi-stage/compose |
26
- | database-architect | Database | `migrations/`, `*.sql`, schema files | python-backend | engine: postgresql/mysql/mongodb |
26
+ | postgresql-expert / mongodb-expert | Database | `migrations/`, `*.sql`, schema files | python-backend-engineer | engine: postgresql/mongodb/redis |
27
27
  | github-operations-specialist | CI/CD | `.github/`, `*.yml`, `*.yaml` | All agents | platform: actions/azure-devops |
28
28
  | mcp-context-manager | Context | `.claude/mcp-servers.json`, context pools | All agents | pool: shared/isolated |
29
29
 
@@ -32,7 +32,7 @@ Comprehensive coordination system for multi-agent collaboration in ClaudeAutoPM.
32
32
  | Agent | Use Case | Replaces |
33
33
  |-------|----------|----------|
34
34
  | azure-devops-specialist | Azure DevOps specific | Part of github-operations |
35
- | playwright-mcp-frontend-tester | MCP browser control | Enhanced e2e-test |
35
+ | e2e-test-engineer | E2E testing with Playwright/Cypress | Support role |
36
36
  | code-analyzer | Read-only analysis | Support role |
37
37
  | file-analyzer | Log/file summarization | Support role |
38
38
  | test-runner | Test execution only | Support role |
@@ -103,7 +103,7 @@ Notes: Added rate limiting middleware
103
103
 
104
104
  ```yaml
105
105
  backend-context:
106
- agents: [python-backend-expert, database-architect]
106
+ agents: [python-backend-expert, postgresql-expert, mongodb-expert]
107
107
  sources: [context7, context7]
108
108
  filters: [python, fastapi, flask, django, sqlalchemy, databases]
109
109
  persistence: true
@@ -115,7 +115,7 @@ frontend-context:
115
115
  persistence: true
116
116
 
117
117
  infrastructure-context:
118
- agents: [multi-cloud-architect, kubernetes-orchestrator, docker-containerization-expert]
118
+ agents: [terraform-infrastructure-expert, kubernetes-orchestrator, docker-containerization-expert]
119
119
  sources: [context7, terraform-registry]
120
120
  filters: [terraform, kubernetes, docker, cloud-providers]
121
121
  persistence: true
@@ -159,7 +159,7 @@ Stream B: Frontend Development
159
159
  Priority: P1
160
160
 
161
161
  Stream C: Infrastructure
162
- Agent: multi-cloud-architect
162
+ Agent: terraform-infrastructure-expert
163
163
  Parameters:
164
164
  provider: aws
165
165
  iac: terraform
@@ -243,7 +243,7 @@ graph LR
243
243
  B -->|UI Ready| C[e2e-test-engineer]
244
244
  C -->|Tests Pass| D[github-operations-specialist]
245
245
  D -->|CI/CD Ready| E[kubernetes-orchestrator]
246
- E -->|Deployment Config| F[multi-cloud-architect]
246
+ E -->|Deployment Config| F[terraform-infrastructure-expert]
247
247
  F -->|Infrastructure| G[Production]
248
248
  ```
249
249
 
@@ -261,7 +261,7 @@ graph LR
261
261
 
262
262
  ```mermaid
263
263
  graph LR
264
- A[multi-cloud-architect] -->|New Infrastructure| B[docker-containerization-expert]
264
+ A[terraform-infrastructure-expert] -->|New Infrastructure| B[docker-containerization-expert]
265
265
  B -->|Updated Images| C[kubernetes-orchestrator]
266
266
  C -->|Manifests Ready| D[github-operations-specialist]
267
267
  D -->|Blue-Green Deploy| E[Production]
@@ -325,11 +325,11 @@ git commit -m "Multiple changes"
325
325
 
326
326
  | Scenario | Priority | Lead Agent | Support Agents | SLA |
327
327
  |----------|----------|------------|----------------|-----|
328
- | Production Down | P0 | kubernetes-orchestrator | multi-cloud, python-backend | 15 min |
328
+ | Production Down | P0 | kubernetes-orchestrator | terraform-infrastructure-expert, python-backend | 15 min |
329
329
  | Security Vulnerability | P0 | code-analyzer | python-backend, github-ops | 30 min |
330
- | Data Loss Risk | P0 | database-architect | multi-cloud, kubernetes | 15 min |
330
+ | Data Loss Risk | P0 | postgresql-expert | terraform-infrastructure-expert, kubernetes | 15 min |
331
331
  | Failed Deployment | P1 | github-operations-specialist | kubernetes-orchestrator | 1 hour |
332
- | Performance Degradation | P1 | python-backend-expert | database-architect, multi-cloud | 2 hours |
332
+ | Performance Degradation | P1 | python-backend-expert | postgresql-expert, terraform-infrastructure-expert | 2 hours |
333
333
  | Test Failures | P2 | e2e-test-engineer | react-ui, python-backend | 4 hours |
334
334
  | Feature Development | P3 | Varies by stream | Full stack team | 1-5 days |
335
335
  | Technical Debt | P4 | code-analyzer | All relevant agents | Best effort |
@@ -338,13 +338,13 @@ git commit -m "Multiple changes"
338
338
 
339
339
  ### Never Modify Without Coordination
340
340
 
341
- - **Production configurations** - Requires multi-cloud-architect + kubernetes-orchestrator
341
+ - **Production configurations** - Requires terraform-infrastructure-expert + kubernetes-orchestrator
342
342
  - **Security settings** - Requires security review + python-backend-expert
343
343
  - **API contracts** - Requires python-backend + react-ui agreement
344
- - **Database schemas** - Requires database-architect + python-backend
344
+ - **Database schemas** - Requires postgresql-expert + python-backend
345
345
  - **Authentication flows** - Requires security review + full stack team
346
346
  - **Payment processing** - Requires security + compliance review
347
- - **User data handling** - Requires privacy review + database-architect
347
+ - **User data handling** - Requires privacy review + postgresql-expert
348
348
 
349
349
  ### Safe for Independent Work
350
350
 
@@ -405,31 +405,31 @@ git commit -m "chore: Sync checkpoint"
405
405
  ### System Down
406
406
 
407
407
  1. **kubernetes-orchestrator** takes incident command
408
- 2. **multi-cloud-architect** checks infrastructure health
408
+ 2. **terraform-infrastructure-expert** checks infrastructure health
409
409
  3. **python-backend-expert** validates application state
410
- 4. **database-architect** verifies data integrity
410
+ 4. **postgresql-expert** verifies data integrity
411
411
  5. **github-operations-specialist** prepares rollback if needed
412
412
 
413
413
  ### Security Breach
414
414
 
415
415
  1. **code-analyzer** identifies scope and entry point
416
- 2. **multi-cloud-architect** isolates affected resources
416
+ 2. **terraform-infrastructure-expert** isolates affected resources
417
417
  3. **python-backend-expert** patches vulnerability
418
- 4. **database-architect** audits data access
418
+ 4. **postgresql-expert** audits data access
419
419
  5. **github-operations-specialist** deploys emergency fix
420
420
 
421
421
  ### Performance Crisis
422
422
 
423
423
  1. **python-backend-expert** profiles application bottlenecks
424
- 2. **database-architect** analyzes and optimizes queries
424
+ 2. **postgresql-expert** analyzes and optimizes queries
425
425
  3. **docker-containerization-expert** optimizes container resources
426
426
  4. **kubernetes-orchestrator** scales resources horizontally
427
- 5. **multi-cloud-architect** provisions additional infrastructure
427
+ 5. **terraform-infrastructure-expert** provisions additional infrastructure
428
428
 
429
429
  ### Data Corruption
430
430
 
431
- 1. **database-architect** stops writes immediately
432
- 2. **multi-cloud-architect** initiates backup restoration
431
+ 1. **postgresql-expert** stops writes immediately
432
+ 2. **terraform-infrastructure-expert** initiates backup restoration
433
433
  3. **kubernetes-orchestrator** redirects traffic to healthy replicas
434
434
  4. **python-backend-expert** validates data integrity checks
435
435
  5. **e2e-test-engineer** runs full regression suite
@@ -444,11 +444,13 @@ git commit -m "chore: Sync checkpoint"
444
444
  | flask-backend-engineer | python-backend-expert | framework: flask |
445
445
  | mui-react-expert | react-ui-expert | framework: mui |
446
446
  | chakra-ui-expert | react-ui-expert | framework: chakra |
447
+ | antd-react-expert | react-ui-expert | framework: antd |
448
+ | bootstrap-ui-expert | react-ui-expert | framework: bootstrap |
447
449
  | docker-expert | docker-containerization-expert | focus: dockerfile |
448
450
  | docker-compose-expert | docker-containerization-expert | focus: compose |
449
- | aws-cloud-architect | multi-cloud-architect | provider: aws |
450
- | gcp-cloud-architect | multi-cloud-architect | provider: gcp |
451
+ | docker-development-orchestrator | docker-containerization-expert | focus: development |
451
452
  | playwright-test-engineer | e2e-test-engineer | tool: playwright |
453
+ | playwright-mcp-frontend-tester | e2e-test-engineer | browser_control: mcp-enhanced |
452
454
 
453
455
  ### Backward Compatibility
454
456
 
@@ -43,7 +43,7 @@ project/
43
43
  ```bash
44
44
  # 1. Check if Docker files exist
45
45
  if [ ! -f "Dockerfile" ]; then
46
- Use docker-expert agent to create Dockerfile
46
+ Use docker-containerization-expert agent to create Dockerfile
47
47
  fi
48
48
 
49
49
  # 2. Build development image
@@ -23,7 +23,7 @@
23
23
  **Sequence**:
24
24
 
25
25
  ```
26
- 1. docker-expert → Optimize Dockerfile
26
+ 1. docker-containerization-expert → Optimize Dockerfile
27
27
  2. Security scan with Trivy/Snyk
28
28
  3. Build multi-stage image
29
29
  4. test-runner → Test container functionality
@@ -6,7 +6,7 @@
6
6
 
7
7
  ### 1. FRAMEWORK DECISION MATRIX
8
8
 
9
- **Bootstrap** - Use `bootstrap-ui-expert`:
9
+ **Bootstrap** - Use `react-ui-expert` (framework=bootstrap):
10
10
 
11
11
  - Rapid prototyping and MVP development
12
12
  - Component-heavy applications (dashboards, admin panels)
@@ -179,8 +179,8 @@ describe('Accessibility', () => {
179
179
 
180
180
  ### Required Agents for Visual Testing
181
181
 
182
- - **playwright-test-engineer**: Visual regression tests
183
- - **playwright-mcp-frontend-tester**: Browser automation
182
+ - **frontend-testing-engineer**: Visual regression tests
183
+ - **frontend-testing-engineer**: Browser automation
184
184
  - **react-frontend-engineer**: Component development
185
185
  - **code-analyzer**: Review UI code quality
186
186
 
@@ -188,7 +188,7 @@ describe('Accessibility', () => {
188
188
 
189
189
  ```
190
190
  1. Implement UI change following TDD
191
- 2. playwright-test-engineer → Create visual tests
191
+ 2. frontend-testing-engineer → Create visual tests
192
192
  3. Run visual regression tests at all breakpoints
193
193
  4. code-analyzer → Verify accessibility
194
194
  5. Capture screenshots for PR
@@ -8,8 +8,8 @@
8
8
  const path = require('path');
9
9
  const fs = require('fs');
10
10
  const chalk = require('chalk');
11
- const AzureDevOpsClient = require('../../lib/azure/client');
12
- const AzureFormatter = require('../../lib/azure/formatter');
11
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
12
+ const AzureFormatter = require('../../providers/azure/lib/formatter');
13
13
  const { table } = require('table');
14
14
 
15
15
  class AzureActiveWork {
@@ -18,22 +18,22 @@ const https = require('https');
18
18
  const yargs = require('yargs/yargs');
19
19
  const { hideBin } = require('yargs/helpers');
20
20
 
21
- // Import utilities
22
- const Logger = require('../../lib/utils/logger');
23
- const FileSystem = require('../../lib/utils/filesystem');
24
- const Config = require('../../lib/utils/config');
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
25
 
26
26
  class AzureBlocked {
27
27
  constructor(options = {}) {
28
- // Initialize utilities
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);
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
37
 
38
38
  // Set options
39
39
  this.options = {
@@ -10,7 +10,7 @@ const path = require('path');
10
10
  const fs = require('fs').promises;
11
11
  const chalk = require('chalk');
12
12
  const dotenv = require('dotenv');
13
- const AzureDevOpsClient = require('../../lib/azure/client');
13
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
14
14
 
15
15
  class AzureDaily {
16
16
  constructor(options = {}) {
@@ -7,7 +7,7 @@
7
7
 
8
8
  const path = require('path');
9
9
  const fs = require('fs');
10
- const AzureDevOpsClient = require('../../lib/azure/client');
10
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
11
11
 
12
12
  // Simple chalk replacement for stub
13
13
  const chalk = {
@@ -5,8 +5,8 @@
5
5
  * Lists all features in the current project
6
6
  */
7
7
 
8
- const AzureDevOpsClient = require('../../lib/azure/client');
9
- const AzureFormatter = require('../../lib/azure/formatter');
8
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
9
+ const AzureFormatter = require('../../providers/azure/lib/formatter');
10
10
  const chalk = require('chalk');
11
11
  const path = require('path');
12
12
  const fs = require('fs');
@@ -10,7 +10,7 @@ const path = require('path');
10
10
  const fs = require('fs').promises;
11
11
  const chalk = require('chalk');
12
12
  const dotenv = require('dotenv');
13
- const AzureDevOpsClient = require('../../lib/azure/client');
13
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
14
14
 
15
15
  class AzureFeatureStatus {
16
16
  constructor(options = {}) {
@@ -10,7 +10,7 @@ const path = require('path');
10
10
  const fs = require('fs').promises;
11
11
  const chalk = require('chalk');
12
12
  const dotenv = require('dotenv');
13
- const AzureDevOpsClient = require('../../lib/azure/client');
13
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
14
14
 
15
15
  class AzureNextTask {
16
16
  constructor(options = {}) {
@@ -10,7 +10,7 @@ const path = require('path');
10
10
  const fs = require('fs').promises;
11
11
  const chalk = require('chalk');
12
12
  const dotenv = require('dotenv');
13
- const AzureDevOpsClient = require('../../lib/azure/client');
13
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
14
14
 
15
15
  class AzureSearch {
16
16
  constructor(options = {}) {
@@ -22,24 +22,24 @@ const yargs = require('yargs/yargs');
22
22
  const { hideBin } = require('yargs/helpers');
23
23
  const yaml = require('js-yaml');
24
24
 
25
- // Import utilities
26
- const Logger = require('../../lib/utils/logger');
27
- const FileSystem = require('../../lib/utils/filesystem');
28
- const Prompts = require('../../lib/utils/prompts');
29
- const Config = require('../../lib/utils/config');
25
+ // TODO: Implement utility modules before using this script
26
+ // const Logger = require('../../lib/utils/logger');
27
+ // const FileSystem = require('../../lib/utils/filesystem');
28
+ // const Prompts = require('../../lib/utils/prompts');
29
+ // const Config = require('../../lib/utils/config');
30
30
 
31
31
  class AzureSetup {
32
32
  constructor(options = {}) {
33
- // Initialize utilities
34
- const loggerOptions = {
35
- verbose: options.verbose || false,
36
- silent: options.silent || false
37
- };
38
-
39
- this.logger = new Logger(loggerOptions);
40
- this.fs = new FileSystem(this.logger);
41
- this.prompts = new Prompts(this.logger);
42
- this.config = new Config(this.logger);
33
+ // Initialize utilities (commented out until utils are implemented)
34
+ // const loggerOptions = {
35
+ // verbose: options.verbose || false,
36
+ // silent: options.silent || false
37
+ // };
38
+
39
+ // this.logger = new Logger(loggerOptions);
40
+ // this.fs = new FileSystem(this.logger);
41
+ // this.prompts = new Prompts(this.logger);
42
+ // this.config = new Config(this.logger);
43
43
 
44
44
  // Set options
45
45
  this.options = {
@@ -9,8 +9,8 @@
9
9
  const path = require('path');
10
10
  const fs = require('fs');
11
11
  const chalk = require('chalk');
12
- const AzureDevOpsClient = require('../../lib/azure/client');
13
- const AzureFormatter = require('../../lib/azure/formatter');
12
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
13
+ const AzureFormatter = require('../../providers/azure/lib/formatter');
14
14
  const { table } = require('table');
15
15
 
16
16
  class AzureSprintReport {
@@ -7,7 +7,7 @@
7
7
 
8
8
  const path = require('path');
9
9
  const fs = require('fs').promises;
10
- const AzureDevOpsClient = require('../../lib/azure/client');
10
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
11
11
 
12
12
  // Simple chalk replacement for stub
13
13
  const chalk = {
@@ -9,7 +9,7 @@ const path = require('path');
9
9
  const fs = require('fs').promises;
10
10
  const chalk = require('chalk');
11
11
  const dotenv = require('dotenv');
12
- const AzureDevOpsClient = require('../../lib/azure/client');
12
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
13
13
 
14
14
  class AzureUserStoryList {
15
15
  constructor(options = {}) {
@@ -9,7 +9,7 @@ const path = require('path');
9
9
  const fs = require('fs').promises;
10
10
  const chalk = require('chalk');
11
11
  const dotenv = require('dotenv');
12
- const AzureDevOpsClient = require('../../lib/azure/client');
12
+ const AzureDevOpsClient = require('../../providers/azure/lib/client');
13
13
 
14
14
  class AzureUserStoryStatus {
15
15
  constructor(options = {}) {
@@ -18,22 +18,22 @@ const https = require('https');
18
18
  const yargs = require('yargs/yargs');
19
19
  const { hideBin } = require('yargs/helpers');
20
20
 
21
- // Import utilities
22
- const Logger = require('../../lib/utils/logger');
23
- const FileSystem = require('../../lib/utils/filesystem');
24
- const Config = require('../../lib/utils/config');
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
25
 
26
26
  class AzureValidate {
27
27
  constructor(options = {}) {
28
- // Initialize utilities
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);
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
37
 
38
38
  // Set options
39
39
  this.options = {
@@ -9,6 +9,21 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
9
9
  source "${SCRIPT_DIR}/logging-utils.sh"
10
10
  source "${SCRIPT_DIR}/datetime-utils.sh"
11
11
 
12
+ # Escape special characters for use in sed pattern
13
+ sed_escape_pattern() {
14
+ local str="$1"
15
+ # Escape characters that have special meaning in sed patterns: . * [ ] ^ $ \ /
16
+ printf '%s\n' "$str" | sed 's/[]\/$*.^[]/\\&/g'
17
+ }
18
+
19
+ # Escape special characters for use in sed replacement
20
+ sed_escape_replacement() {
21
+ local str="$1"
22
+ # Escape backslashes first, then other special characters
23
+ # This prevents double-escaping issues
24
+ printf '%s\n' "$str" | sed 's/\\/\\\\/g; s/&/\\&/g; s/|/\\|/g'
25
+ }
26
+
12
27
  # Update or add a field in frontmatter
13
28
  update_frontmatter_field() {
14
29
  local file_path="$1"
@@ -25,18 +40,32 @@ update_frontmatter_field() {
25
40
  # Create backup
26
41
  cp "$file_path" "${file_path}.bak"
27
42
 
43
+ # Escape field name and value for safe use in sed
44
+ local escaped_field_name
45
+ local escaped_field_value
46
+ escaped_field_name=$(sed_escape_pattern "$field_name")
47
+ escaped_field_value=$(sed_escape_replacement "$field_value")
48
+
28
49
  # Check if field exists
29
50
  if grep -q "^${field_name}:" "$file_path"; then
30
- # Update existing field
31
- sed -i.tmp "/^${field_name}:/c\\${field_name}: ${field_value}" "$file_path"
51
+ # Update existing field - delete old line and insert new one
52
+ # This approach avoids sed replacement string escaping issues
53
+ grep -v "^${escaped_field_name}:" "$file_path" > "${file_path}.tmp"
54
+ {
55
+ head -1 "${file_path}.tmp" # First --- line
56
+ printf '%s: %s\n' "$field_name" "$field_value" # New field value
57
+ tail -n +2 "${file_path}.tmp" # Rest of file
58
+ } > "${file_path}.tmp2" && mv "${file_path}.tmp2" "$file_path"
32
59
  rm -f "${file_path}.tmp"
33
60
  log_debug "Updated existing field: $field_name"
34
61
  else
35
62
  # Add new field after the first line of frontmatter (after opening ---)
36
- awk -v field="${field_name}: ${field_value}" '
37
- /^---$/ && NR==1 { print; print field; next }
38
- { print }
39
- ' "$file_path" > "${file_path}.tmp" && mv "${file_path}.tmp" "$file_path"
63
+ # Write the new line directly to avoid variable expansion issues
64
+ {
65
+ head -1 "$file_path" # First --- line
66
+ printf '%s: %s\n' "$field_name" "$field_value" # New field (preserves all chars)
67
+ tail -n +2 "$file_path" # Rest of file
68
+ } > "${file_path}.tmp" && mv "${file_path}.tmp" "$file_path"
40
69
  log_debug "Added new field: $field_name"
41
70
  fi
42
71
 
@@ -60,8 +89,14 @@ get_frontmatter_field() {
60
89
  return 1
61
90
  fi
62
91
 
92
+ # Escape field name for safe use in patterns
93
+ local escaped_field_name
94
+ escaped_field_name=$(sed_escape_pattern "$field_name")
95
+
63
96
  local field_value
64
- field_value=$(grep "^${field_name}:" "$file_path" | sed "s/^${field_name}: *//" | head -1)
97
+ # Use | delimiter to avoid conflicts with / in values
98
+ # Only remove the field name, colon, and exactly one space (YAML format)
99
+ field_value=$(grep "^${field_name}:" "$file_path" | sed "s|^${escaped_field_name}: ||" | head -1)
65
100
 
66
101
  log_debug "Retrieved field $field_name: '$field_value'"
67
102
  log_function_exit "get_frontmatter_field"
@@ -4,22 +4,26 @@
4
4
 
5
5
  set -euo pipefail
6
6
 
7
- # Colors for output
8
- readonly RED='\033[0;31m'
9
- readonly GREEN='\033[0;32m'
10
- readonly YELLOW='\033[1;33m'
11
- readonly BLUE='\033[0;34m'
12
- readonly PURPLE='\033[0;35m'
13
- readonly CYAN='\033[0;36m'
14
- readonly WHITE='\033[1;37m'
15
- readonly NC='\033[0m' # No Color
16
-
17
- # Log levels
18
- readonly LOG_LEVEL_DEBUG=0
19
- readonly LOG_LEVEL_INFO=1
20
- readonly LOG_LEVEL_WARNING=2
21
- readonly LOG_LEVEL_ERROR=3
22
- readonly LOG_LEVEL_SUCCESS=4
7
+ # Colors for output (only define if not already defined)
8
+ if [[ -z "${RED:-}" ]]; then
9
+ readonly RED='\033[0;31m'
10
+ readonly GREEN='\033[0;32m'
11
+ readonly YELLOW='\033[1;33m'
12
+ readonly BLUE='\033[0;34m'
13
+ readonly PURPLE='\033[0;35m'
14
+ readonly CYAN='\033[0;36m'
15
+ readonly WHITE='\033[1;37m'
16
+ readonly NC='\033[0m' # No Color
17
+ fi
18
+
19
+ # Log levels (only define if not already defined)
20
+ if [[ -z "${LOG_LEVEL_DEBUG:-}" ]]; then
21
+ readonly LOG_LEVEL_DEBUG=0
22
+ readonly LOG_LEVEL_INFO=1
23
+ readonly LOG_LEVEL_WARNING=2
24
+ readonly LOG_LEVEL_ERROR=3
25
+ readonly LOG_LEVEL_SUCCESS=4
26
+ fi
23
27
 
24
28
  # Default log level (can be overridden by AUTOPM_LOG_LEVEL env var)
25
29
  LOG_LEVEL=${AUTOPM_LOG_LEVEL:-$LOG_LEVEL_INFO}
@@ -12,7 +12,7 @@ source "${SCRIPT_DIR}/logging-utils.sh"
12
12
  validate_required_commands() {
13
13
  local commands=("$@")
14
14
 
15
- log_function_entry "validate_required_commands" "${commands[@]}"
15
+ log_function_entry "validate_required_commands" "${commands[@]:-}"
16
16
 
17
17
  local missing_commands=()
18
18