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.
- package/README.md +159 -0
- package/autopm/.claude/agents/README.md +1 -1
- package/autopm/.claude/agents/core/mcp-manager.md +1 -1
- package/autopm/.claude/agents/decision-matrices/python-backend-selection.md +25 -25
- package/autopm/.claude/agents/decision-matrices/ui-framework-selection.md +43 -43
- package/autopm/.claude/agents/devops/github-operations-specialist.md +1 -1
- package/autopm/.claude/agents/frameworks/README.md +5 -5
- package/autopm/.claude/agents/frameworks/e2e-test-engineer.md +1 -1
- package/autopm/.claude/agents/frameworks/nats-messaging-expert.md +1 -1
- package/autopm/.claude/agents/frameworks/react-frontend-engineer.md +1 -1
- package/autopm/.claude/agents/frameworks/react-ui-expert.md +3 -3
- package/autopm/.claude/agents/frameworks/tailwindcss-expert.md +3 -3
- package/autopm/.claude/agents/frameworks/ux-design-expert.md +3 -3
- package/autopm/.claude/commands/infrastructure/traefik-setup.md +1 -1
- package/autopm/.claude/commands/playwright/test-scaffold.md +1 -1
- package/autopm/.claude/commands/pm/context.md +11 -0
- package/autopm/.claude/commands/pm/epic-decompose.md +25 -2
- package/autopm/.claude/commands/pm/epic-oneshot.md +13 -0
- package/autopm/.claude/commands/pm/epic-start.md +19 -0
- package/autopm/.claude/commands/pm/epic-sync-modular.md +10 -10
- package/autopm/.claude/commands/pm/epic-sync.md +14 -14
- package/autopm/.claude/commands/pm/issue-start.md +50 -5
- package/autopm/.claude/commands/pm/issue-sync.md +15 -15
- package/autopm/.claude/commands/pm/what-next.md +11 -0
- package/autopm/.claude/commands/ui/bootstrap-scaffold.md +6 -5
- package/autopm/.claude/commands/ui/tailwind-system.md +1 -1
- package/autopm/.claude/examples/mcp/playwright-mcp.md +2 -2
- package/autopm/.claude/examples/mcp-servers.example.json +2 -2
- package/autopm/.claude/hooks/docker-first-enforcement.sh +1 -1
- package/autopm/.claude/mcp/MCP-REGISTRY.md +1 -1
- package/autopm/.claude/mcp/playwright-mcp.md +2 -2
- package/autopm/.claude/rules/agent-coordination.md +26 -24
- package/autopm/.claude/rules/docker-first-development.md +1 -1
- package/autopm/.claude/rules/infrastructure-pipeline.md +1 -1
- package/autopm/.claude/rules/ui-development-standards.md +1 -1
- package/autopm/.claude/rules/visual-testing.md +3 -3
- package/autopm/.claude/scripts/azure/active-work.js +2 -2
- package/autopm/.claude/scripts/azure/blocked.js +13 -13
- package/autopm/.claude/scripts/azure/daily.js +1 -1
- package/autopm/.claude/scripts/azure/dashboard.js +1 -1
- package/autopm/.claude/scripts/azure/feature-list.js +2 -2
- package/autopm/.claude/scripts/azure/feature-status.js +1 -1
- package/autopm/.claude/scripts/azure/next-task.js +1 -1
- package/autopm/.claude/scripts/azure/search.js +1 -1
- package/autopm/.claude/scripts/azure/setup.js +15 -15
- package/autopm/.claude/scripts/azure/sprint-report.js +2 -2
- package/autopm/.claude/scripts/azure/sync.js +1 -1
- package/autopm/.claude/scripts/azure/us-list.js +1 -1
- package/autopm/.claude/scripts/azure/us-status.js +1 -1
- package/autopm/.claude/scripts/azure/validate.js +13 -13
- package/autopm/.claude/scripts/lib/frontmatter-utils.sh +42 -7
- package/autopm/.claude/scripts/lib/logging-utils.sh +20 -16
- package/autopm/.claude/scripts/lib/validation-utils.sh +1 -1
- package/autopm/.claude/scripts/pm/context.js +338 -0
- package/autopm/.claude/scripts/pm/issue-sync/format-comment.sh +3 -3
- package/autopm/.claude/scripts/pm/lib/README.md +85 -0
- package/autopm/.claude/scripts/pm/lib/logger.js +78 -0
- package/autopm/.claude/scripts/pm/next.js +25 -1
- package/autopm/.claude/scripts/pm/what-next.js +660 -0
- package/autopm/.claude/teams.json +3 -5
- package/autopm/.claude/templates/claude-templates/addons/devops-agents.md +2 -2
- package/autopm/.claude/templates/claude-templates/addons/docker-agents.md +4 -4
- package/autopm/.claude/templates/claude-templates/addons/minimal-agents.md +1 -1
- package/autopm/.claude/templates/issue-decomposition/api.yaml +2 -2
- package/autopm/.claude/templates/issue-decomposition/auth.yaml +4 -4
- package/autopm/.claude/templates/issue-decomposition/crud.yaml +3 -3
- package/autopm/.claude/templates/issue-decomposition/default.yaml +1 -1
- package/autopm/.claude/templates/issue-decomposition/ui-feature.yaml +2 -2
- package/bin/autopm.js +25 -0
- package/package.json +1 -2
- package/lib/agentExecutor.js.deprecated +0 -101
- package/lib/azure/cache.js +0 -80
- package/lib/azure/client.js +0 -77
- package/lib/azure/formatter.js +0 -177
- package/lib/commandHelpers.js +0 -177
- package/lib/context/manager.js +0 -290
- package/lib/documentation/manager.js +0 -528
- package/lib/github/workflow-manager.js +0 -546
- package/lib/helpers/azure-batch-api.js +0 -133
- package/lib/helpers/azure-cache-manager.js +0 -287
- package/lib/helpers/azure-parallel-processor.js +0 -158
- package/lib/helpers/azure-work-item-create.js +0 -278
- package/lib/helpers/gh-issue-create.js +0 -250
- package/lib/helpers/interactive-prompt.js +0 -336
- package/lib/helpers/output-manager.js +0 -335
- package/lib/helpers/progress-indicator.js +0 -258
- package/lib/performance/benchmarker.js +0 -429
- package/lib/pm/epic-decomposer.js +0 -273
- package/lib/pm/epic-syncer.js +0 -221
- package/lib/prdMetadata.js +0 -270
- package/lib/providers/azure/index.js +0 -234
- package/lib/providers/factory.js +0 -87
- package/lib/providers/github/index.js +0 -204
- package/lib/providers/interface.js +0 -73
- package/lib/python/scaffold-manager.js +0 -576
- package/lib/react/scaffold-manager.js +0 -745
- package/lib/regression/analyzer.js +0 -578
- package/lib/release/manager.js +0 -324
- package/lib/tailwind/manager.js +0 -486
- package/lib/traefik/manager.js +0 -484
- package/lib/utils/colors.js +0 -126
- package/lib/utils/config.js +0 -317
- package/lib/utils/filesystem.js +0 -316
- package/lib/utils/logger.js +0 -135
- package/lib/utils/prompts.js +0 -294
- package/lib/utils/shell.js +0 -237
- package/lib/validators/email-validator.js +0 -337
- 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
|
|
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
|
-
- `
|
|
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/
|
|
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
|
-
|
|
|
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
|
-
|
|
|
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
|
-
|
|
|
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,
|
|
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: [
|
|
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:
|
|
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[
|
|
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[
|
|
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 |
|
|
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 |
|
|
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 |
|
|
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
|
|
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
|
|
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 +
|
|
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. **
|
|
408
|
+
2. **terraform-infrastructure-expert** checks infrastructure health
|
|
409
409
|
3. **python-backend-expert** validates application state
|
|
410
|
-
4. **
|
|
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. **
|
|
416
|
+
2. **terraform-infrastructure-expert** isolates affected resources
|
|
417
417
|
3. **python-backend-expert** patches vulnerability
|
|
418
|
-
4. **
|
|
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. **
|
|
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. **
|
|
427
|
+
5. **terraform-infrastructure-expert** provisions additional infrastructure
|
|
428
428
|
|
|
429
429
|
### Data Corruption
|
|
430
430
|
|
|
431
|
-
1. **
|
|
432
|
-
2. **
|
|
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
|
-
|
|
|
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
|
|
|
@@ -179,8 +179,8 @@ describe('Accessibility', () => {
|
|
|
179
179
|
|
|
180
180
|
### Required Agents for Visual Testing
|
|
181
181
|
|
|
182
|
-
- **
|
|
183
|
-
- **
|
|
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.
|
|
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('../../
|
|
12
|
-
const AzureFormatter = require('../../
|
|
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
|
-
//
|
|
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
|
-
|
|
31
|
-
|
|
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('../../
|
|
13
|
+
const AzureDevOpsClient = require('../../providers/azure/lib/client');
|
|
14
14
|
|
|
15
15
|
class AzureDaily {
|
|
16
16
|
constructor(options = {}) {
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Lists all features in the current project
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
const AzureDevOpsClient = require('../../
|
|
9
|
-
const AzureFormatter = require('../../
|
|
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('../../
|
|
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('../../
|
|
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('../../
|
|
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
|
-
//
|
|
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
|
-
|
|
36
|
-
|
|
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('../../
|
|
13
|
-
const AzureFormatter = require('../../
|
|
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('../../
|
|
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('../../
|
|
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('../../
|
|
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
|
-
//
|
|
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
|
-
|
|
31
|
-
|
|
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
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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
|
-
|
|
9
|
-
readonly
|
|
10
|
-
readonly
|
|
11
|
-
readonly
|
|
12
|
-
readonly
|
|
13
|
-
readonly
|
|
14
|
-
readonly
|
|
15
|
-
readonly
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
readonly
|
|
22
|
-
readonly
|
|
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
|
|