agileflow 3.1.0 → 3.2.0
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/CHANGELOG.md +5 -0
- package/README.md +57 -85
- package/lib/dashboard-automations.js +130 -0
- package/lib/dashboard-git.js +254 -0
- package/lib/dashboard-inbox.js +64 -0
- package/lib/dashboard-protocol.js +1 -0
- package/lib/dashboard-server.js +114 -924
- package/lib/dashboard-session.js +136 -0
- package/lib/dashboard-status.js +72 -0
- package/lib/dashboard-terminal.js +354 -0
- package/lib/dashboard-websocket.js +88 -0
- package/lib/drivers/codex-driver.ts +4 -4
- package/lib/logger.js +106 -0
- package/package.json +4 -2
- package/scripts/agileflow-configure.js +2 -2
- package/scripts/agileflow-welcome.js +409 -434
- package/scripts/claude-tmux.sh +80 -2
- package/scripts/context-loader.js +4 -9
- package/scripts/lib/command-prereqs.js +280 -0
- package/scripts/lib/configure-detect.js +92 -2
- package/scripts/lib/configure-features.js +295 -1
- package/scripts/lib/context-formatter.js +468 -233
- package/scripts/lib/context-loader.js +27 -15
- package/scripts/lib/damage-control-utils.js +8 -1
- package/scripts/lib/feature-catalog.js +321 -0
- package/scripts/lib/portable-tasks-cli.js +274 -0
- package/scripts/lib/portable-tasks.js +479 -0
- package/scripts/lib/signal-detectors.js +1 -1
- package/scripts/lib/team-events.js +86 -1
- package/scripts/obtain-context.js +28 -4
- package/scripts/smart-detect.js +17 -0
- package/scripts/strip-ai-attribution.js +63 -0
- package/scripts/team-manager.js +7 -2
- package/scripts/welcome-deferred.js +437 -0
- package/src/core/agents/perf-analyzer-assets.md +174 -0
- package/src/core/agents/perf-analyzer-bundle.md +165 -0
- package/src/core/agents/perf-analyzer-caching.md +160 -0
- package/src/core/agents/perf-analyzer-compute.md +165 -0
- package/src/core/agents/perf-analyzer-memory.md +182 -0
- package/src/core/agents/perf-analyzer-network.md +157 -0
- package/src/core/agents/perf-analyzer-queries.md +155 -0
- package/src/core/agents/perf-analyzer-rendering.md +156 -0
- package/src/core/agents/perf-consensus.md +280 -0
- package/src/core/agents/security-analyzer-api.md +199 -0
- package/src/core/agents/security-analyzer-auth.md +160 -0
- package/src/core/agents/security-analyzer-authz.md +168 -0
- package/src/core/agents/security-analyzer-deps.md +147 -0
- package/src/core/agents/security-analyzer-infra.md +176 -0
- package/src/core/agents/security-analyzer-injection.md +148 -0
- package/src/core/agents/security-analyzer-input.md +191 -0
- package/src/core/agents/security-analyzer-secrets.md +175 -0
- package/src/core/agents/security-consensus.md +276 -0
- package/src/core/agents/test-analyzer-assertions.md +181 -0
- package/src/core/agents/test-analyzer-coverage.md +183 -0
- package/src/core/agents/test-analyzer-fragility.md +185 -0
- package/src/core/agents/test-analyzer-integration.md +155 -0
- package/src/core/agents/test-analyzer-maintenance.md +173 -0
- package/src/core/agents/test-analyzer-mocking.md +178 -0
- package/src/core/agents/test-analyzer-patterns.md +189 -0
- package/src/core/agents/test-analyzer-structure.md +177 -0
- package/src/core/agents/test-consensus.md +294 -0
- package/src/core/commands/{legal/audit.md → audit/legal.md} +13 -13
- package/src/core/commands/{logic/audit.md → audit/logic.md} +12 -12
- package/src/core/commands/audit/performance.md +443 -0
- package/src/core/commands/audit/security.md +443 -0
- package/src/core/commands/audit/test.md +442 -0
- package/src/core/commands/babysit.md +505 -463
- package/src/core/commands/configure.md +8 -8
- package/src/core/commands/research/ask.md +42 -9
- package/src/core/commands/research/import.md +14 -8
- package/src/core/commands/research/list.md +17 -16
- package/src/core/commands/research/synthesize.md +8 -8
- package/src/core/commands/research/view.md +28 -4
- package/src/core/commands/whats-new.md +2 -2
- package/src/core/experts/devops/expertise.yaml +13 -2
- package/src/core/experts/documentation/expertise.yaml +26 -4
- package/src/core/profiles/COMPARISON.md +170 -0
- package/src/core/profiles/README.md +178 -0
- package/src/core/profiles/claude-code.yaml +111 -0
- package/src/core/profiles/codex.yaml +103 -0
- package/src/core/profiles/cursor.yaml +134 -0
- package/src/core/profiles/examples.js +250 -0
- package/src/core/profiles/loader.js +235 -0
- package/src/core/profiles/windsurf.yaml +159 -0
- package/src/core/teams/logic-audit.json +6 -0
- package/src/core/teams/perf-audit.json +71 -0
- package/src/core/teams/security-audit.json +71 -0
- package/src/core/teams/test-audit.json +71 -0
- package/src/core/templates/command-prerequisites.yaml +169 -0
- package/src/core/templates/damage-control-patterns.yaml +9 -0
- package/tools/cli/installers/ide/_base-ide.js +33 -3
- package/tools/cli/installers/ide/claude-code.js +2 -69
- package/tools/cli/installers/ide/codex.js +9 -9
- package/tools/cli/installers/ide/cursor.js +165 -4
- package/tools/cli/installers/ide/windsurf.js +237 -6
- package/tools/cli/lib/content-transformer.js +234 -9
- package/tools/cli/lib/docs-setup.js +1 -1
- package/tools/cli/lib/ide-generator.js +357 -0
- package/tools/cli/lib/ide-registry.js +2 -2
- package/scripts/tmux-task-name.sh +0 -105
- package/scripts/tmux-task-watcher.sh +0 -344
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "perf-audit",
|
|
3
|
+
"description": "Multi-perspective performance bottleneck analysis team for finding optimization opportunities",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"lead": {
|
|
6
|
+
"agent": "agileflow-perf-consensus",
|
|
7
|
+
"delegate_mode": true,
|
|
8
|
+
"plan_approval": false
|
|
9
|
+
},
|
|
10
|
+
"teammates": [
|
|
11
|
+
{
|
|
12
|
+
"agent": "agileflow-perf-analyzer-queries",
|
|
13
|
+
"role": "analyzer",
|
|
14
|
+
"domain": "queries",
|
|
15
|
+
"description": "Analyzes N+1 queries, unindexed lookups, missing pagination, ORM anti-patterns"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"agent": "agileflow-perf-analyzer-rendering",
|
|
19
|
+
"role": "analyzer",
|
|
20
|
+
"domain": "rendering",
|
|
21
|
+
"description": "Analyzes unnecessary re-renders, missing memoization, expensive computations in render"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"agent": "agileflow-perf-analyzer-memory",
|
|
25
|
+
"role": "analyzer",
|
|
26
|
+
"domain": "memory",
|
|
27
|
+
"description": "Analyzes memory leaks, event listener cleanup, growing collections, closure captures"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"agent": "agileflow-perf-analyzer-bundle",
|
|
31
|
+
"role": "analyzer",
|
|
32
|
+
"domain": "bundle",
|
|
33
|
+
"description": "Analyzes large imports, missing tree-shaking, absent dynamic imports, duplicate deps"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"agent": "agileflow-perf-analyzer-compute",
|
|
37
|
+
"role": "analyzer",
|
|
38
|
+
"domain": "compute",
|
|
39
|
+
"description": "Analyzes sync I/O, CPU-intensive loops, blocking operations, algorithmic inefficiency"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"agent": "agileflow-perf-analyzer-network",
|
|
43
|
+
"role": "analyzer",
|
|
44
|
+
"domain": "network",
|
|
45
|
+
"description": "Analyzes HTTP waterfall, missing batching, no compression, large payloads"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"agent": "agileflow-perf-analyzer-caching",
|
|
49
|
+
"role": "analyzer",
|
|
50
|
+
"domain": "caching",
|
|
51
|
+
"description": "Analyzes missing memoization, redundant computations, no HTTP cache headers"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"agent": "agileflow-perf-analyzer-assets",
|
|
55
|
+
"role": "analyzer",
|
|
56
|
+
"domain": "assets",
|
|
57
|
+
"description": "Analyzes unoptimized images, render-blocking resources, missing lazy loading"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"quality_gates": {
|
|
61
|
+
"teammate_idle": {
|
|
62
|
+
"tests": false,
|
|
63
|
+
"lint": false,
|
|
64
|
+
"types": false
|
|
65
|
+
},
|
|
66
|
+
"task_completed": {
|
|
67
|
+
"require_validator_approval": false
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"tags": ["analysis", "performance", "optimization", "audit"]
|
|
71
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "security-audit",
|
|
3
|
+
"description": "Multi-perspective security vulnerability analysis team for finding exploitable weaknesses",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"lead": {
|
|
6
|
+
"agent": "agileflow-security-consensus",
|
|
7
|
+
"delegate_mode": true,
|
|
8
|
+
"plan_approval": false
|
|
9
|
+
},
|
|
10
|
+
"teammates": [
|
|
11
|
+
{
|
|
12
|
+
"agent": "agileflow-security-analyzer-injection",
|
|
13
|
+
"role": "analyzer",
|
|
14
|
+
"domain": "injection",
|
|
15
|
+
"description": "Analyzes SQL injection, command injection, NoSQL injection, template injection"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"agent": "agileflow-security-analyzer-auth",
|
|
19
|
+
"role": "analyzer",
|
|
20
|
+
"domain": "authentication",
|
|
21
|
+
"description": "Analyzes weak hashing, JWT flaws, session fixation, broken auth flows"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"agent": "agileflow-security-analyzer-authz",
|
|
25
|
+
"role": "analyzer",
|
|
26
|
+
"domain": "authorization",
|
|
27
|
+
"description": "Analyzes IDOR, privilege escalation, path traversal, CORS, CSRF"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"agent": "agileflow-security-analyzer-secrets",
|
|
31
|
+
"role": "analyzer",
|
|
32
|
+
"domain": "secrets-crypto",
|
|
33
|
+
"description": "Analyzes hardcoded credentials, weak crypto, insecure randomness"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"agent": "agileflow-security-analyzer-input",
|
|
37
|
+
"role": "analyzer",
|
|
38
|
+
"domain": "input-validation",
|
|
39
|
+
"description": "Analyzes XSS, prototype pollution, SSRF, file upload, ReDoS"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"agent": "agileflow-security-analyzer-deps",
|
|
43
|
+
"role": "analyzer",
|
|
44
|
+
"domain": "dependencies",
|
|
45
|
+
"description": "Analyzes known CVEs, typosquatting, overly permissive version ranges"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"agent": "agileflow-security-analyzer-infra",
|
|
49
|
+
"role": "analyzer",
|
|
50
|
+
"domain": "infrastructure",
|
|
51
|
+
"description": "Analyzes Docker security, security headers, HTTPS, exposed endpoints"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"agent": "agileflow-security-analyzer-api",
|
|
55
|
+
"role": "analyzer",
|
|
56
|
+
"domain": "api-security",
|
|
57
|
+
"description": "Analyzes mass assignment, data exposure, rate limiting, GraphQL"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"quality_gates": {
|
|
61
|
+
"teammate_idle": {
|
|
62
|
+
"tests": false,
|
|
63
|
+
"lint": false,
|
|
64
|
+
"types": false
|
|
65
|
+
},
|
|
66
|
+
"task_completed": {
|
|
67
|
+
"require_validator_approval": false
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"tags": ["analysis", "security", "vulnerabilities", "audit"]
|
|
71
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "test-audit",
|
|
3
|
+
"description": "Multi-perspective test quality analysis team for finding test suite weaknesses",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"lead": {
|
|
6
|
+
"agent": "agileflow-test-consensus",
|
|
7
|
+
"delegate_mode": true,
|
|
8
|
+
"plan_approval": false
|
|
9
|
+
},
|
|
10
|
+
"teammates": [
|
|
11
|
+
{
|
|
12
|
+
"agent": "agileflow-test-analyzer-coverage",
|
|
13
|
+
"role": "analyzer",
|
|
14
|
+
"domain": "coverage",
|
|
15
|
+
"description": "Analyzes untested critical paths, missing error path tests, low branch coverage"
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"agent": "agileflow-test-analyzer-fragility",
|
|
19
|
+
"role": "analyzer",
|
|
20
|
+
"domain": "fragility",
|
|
21
|
+
"description": "Analyzes timing-dependent tests, order-dependent tests, environment-dependent tests"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"agent": "agileflow-test-analyzer-mocking",
|
|
25
|
+
"role": "analyzer",
|
|
26
|
+
"domain": "mocking",
|
|
27
|
+
"description": "Analyzes over-mocking, mock leakage, testing mocks instead of code"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"agent": "agileflow-test-analyzer-assertions",
|
|
31
|
+
"role": "analyzer",
|
|
32
|
+
"domain": "assertions",
|
|
33
|
+
"description": "Analyzes weak assertions, missing negative tests, snapshot overuse"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"agent": "agileflow-test-analyzer-structure",
|
|
37
|
+
"role": "analyzer",
|
|
38
|
+
"domain": "structure",
|
|
39
|
+
"description": "Analyzes test organization, naming clarity, code duplication, file length"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"agent": "agileflow-test-analyzer-integration",
|
|
43
|
+
"role": "analyzer",
|
|
44
|
+
"domain": "integration",
|
|
45
|
+
"description": "Analyzes missing API tests, absent E2E coverage, unit-only test suites"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"agent": "agileflow-test-analyzer-maintenance",
|
|
49
|
+
"role": "analyzer",
|
|
50
|
+
"domain": "maintenance",
|
|
51
|
+
"description": "Analyzes dead tests, outdated assertions, tests passing for wrong reasons"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"agent": "agileflow-test-analyzer-patterns",
|
|
55
|
+
"role": "analyzer",
|
|
56
|
+
"domain": "patterns",
|
|
57
|
+
"description": "Analyzes anti-patterns: testing privates, deep mock chains, God test objects"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"quality_gates": {
|
|
61
|
+
"teammate_idle": {
|
|
62
|
+
"tests": false,
|
|
63
|
+
"lint": false,
|
|
64
|
+
"types": false
|
|
65
|
+
},
|
|
66
|
+
"task_completed": {
|
|
67
|
+
"require_validator_approval": false
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"tags": ["analysis", "testing", "quality", "audit"]
|
|
71
|
+
}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# command-prerequisites.yaml
|
|
2
|
+
#
|
|
3
|
+
# Declarative prerequisites for AgileFlow commands.
|
|
4
|
+
# Checked before command execution to warn about unmet requirements.
|
|
5
|
+
#
|
|
6
|
+
# Schema:
|
|
7
|
+
# commands.<name>.prerequisites[]:
|
|
8
|
+
# signal - Dot-path into extracted signals (e.g. git.branch, statusJson)
|
|
9
|
+
# description - Human-readable explanation of what's needed
|
|
10
|
+
# fix - Actionable instruction to resolve
|
|
11
|
+
# severity - critical (will fail) | high (poor results) | medium (suboptimal)
|
|
12
|
+
#
|
|
13
|
+
# Signals are extracted by smart-detect.js extractSignals() and include:
|
|
14
|
+
# git.branch, git.onFeatureBranch, git.isClean, git.filesChanged
|
|
15
|
+
# statusJson, storyCount, story, story.epic
|
|
16
|
+
# packageJson, tests.hasTestSetup
|
|
17
|
+
# files.playwright, files.tsconfig, files.coverage, files.ciConfig
|
|
18
|
+
|
|
19
|
+
version: "1.0.0"
|
|
20
|
+
|
|
21
|
+
settings:
|
|
22
|
+
fail_open: true
|
|
23
|
+
max_warnings: 5
|
|
24
|
+
|
|
25
|
+
commands:
|
|
26
|
+
verify:
|
|
27
|
+
prerequisites:
|
|
28
|
+
- signal: tests.hasTestSetup
|
|
29
|
+
description: "Test framework must be configured (scripts.test in package.json)"
|
|
30
|
+
fix: "Add a test script to package.json, e.g. \"test\": \"jest\" or \"test\": \"vitest\""
|
|
31
|
+
severity: critical
|
|
32
|
+
|
|
33
|
+
babysit:
|
|
34
|
+
prerequisites:
|
|
35
|
+
- signal: statusJson
|
|
36
|
+
description: "status.json must exist with stories to work on"
|
|
37
|
+
fix: "Run: /agileflow:story to create stories, or /agileflow:epic to plan an epic"
|
|
38
|
+
severity: critical
|
|
39
|
+
|
|
40
|
+
pr:
|
|
41
|
+
prerequisites:
|
|
42
|
+
- signal: git.onFeatureBranch
|
|
43
|
+
description: "Must be on a feature branch (not main/master)"
|
|
44
|
+
fix: "Create a feature branch: git checkout -b feat/your-feature"
|
|
45
|
+
severity: critical
|
|
46
|
+
- signal: story
|
|
47
|
+
description: "An active story should be set for PR description"
|
|
48
|
+
fix: "Run: /agileflow:status to set a current story"
|
|
49
|
+
severity: high
|
|
50
|
+
|
|
51
|
+
deploy:
|
|
52
|
+
prerequisites:
|
|
53
|
+
- signal: git.branch
|
|
54
|
+
description: "Git repository must be initialized"
|
|
55
|
+
fix: "Run: git init"
|
|
56
|
+
severity: critical
|
|
57
|
+
- signal: packageJson
|
|
58
|
+
description: "package.json must exist for deployment configuration"
|
|
59
|
+
fix: "Run: npm init -y"
|
|
60
|
+
severity: critical
|
|
61
|
+
|
|
62
|
+
audit:
|
|
63
|
+
prerequisites:
|
|
64
|
+
- signal: story
|
|
65
|
+
description: "An active story is needed to audit completion"
|
|
66
|
+
fix: "Run: /agileflow:status to set a current story"
|
|
67
|
+
severity: critical
|
|
68
|
+
- signal: statusJson
|
|
69
|
+
description: "status.json must exist with story data"
|
|
70
|
+
fix: "Run: /agileflow:story to create stories"
|
|
71
|
+
severity: critical
|
|
72
|
+
|
|
73
|
+
board:
|
|
74
|
+
prerequisites:
|
|
75
|
+
- signal: statusJson
|
|
76
|
+
description: "status.json must exist to display the board"
|
|
77
|
+
fix: "Run: /agileflow:story to create your first story"
|
|
78
|
+
severity: critical
|
|
79
|
+
- signal: storyCount
|
|
80
|
+
description: "At least one story must exist"
|
|
81
|
+
fix: "Run: /agileflow:story to create a story"
|
|
82
|
+
severity: high
|
|
83
|
+
|
|
84
|
+
sprint:
|
|
85
|
+
prerequisites:
|
|
86
|
+
- signal: statusJson
|
|
87
|
+
description: "status.json must exist for sprint planning"
|
|
88
|
+
fix: "Run: /agileflow:story to create stories first"
|
|
89
|
+
severity: critical
|
|
90
|
+
- signal: storyCount
|
|
91
|
+
description: "Stories are needed for sprint planning"
|
|
92
|
+
fix: "Run: /agileflow:epic to break down features into stories"
|
|
93
|
+
severity: high
|
|
94
|
+
|
|
95
|
+
browser-qa:
|
|
96
|
+
prerequisites:
|
|
97
|
+
- signal: files.playwright
|
|
98
|
+
description: "Playwright must be configured (playwright.config.ts or .js)"
|
|
99
|
+
fix: "Run: npm init playwright@latest"
|
|
100
|
+
severity: critical
|
|
101
|
+
|
|
102
|
+
review:
|
|
103
|
+
prerequisites:
|
|
104
|
+
- signal: git.onFeatureBranch
|
|
105
|
+
description: "Must be on a feature branch for code review"
|
|
106
|
+
fix: "Create a feature branch: git checkout -b feat/your-feature"
|
|
107
|
+
severity: critical
|
|
108
|
+
- signal: git.filesChanged
|
|
109
|
+
description: "There should be changed files to review"
|
|
110
|
+
fix: "Make some code changes before requesting a review"
|
|
111
|
+
severity: high
|
|
112
|
+
|
|
113
|
+
baseline:
|
|
114
|
+
prerequisites:
|
|
115
|
+
- signal: tests.hasTestSetup
|
|
116
|
+
description: "Test framework must be configured to establish a baseline"
|
|
117
|
+
fix: "Add a test script to package.json"
|
|
118
|
+
severity: critical
|
|
119
|
+
- signal: git.branch
|
|
120
|
+
description: "Git repository must be initialized"
|
|
121
|
+
fix: "Run: git init"
|
|
122
|
+
severity: high
|
|
123
|
+
|
|
124
|
+
metrics:
|
|
125
|
+
prerequisites:
|
|
126
|
+
- signal: statusJson
|
|
127
|
+
description: "status.json must exist for metrics calculation"
|
|
128
|
+
fix: "Run: /agileflow:story to start tracking work"
|
|
129
|
+
severity: critical
|
|
130
|
+
- signal: storyCount
|
|
131
|
+
description: "Stories are needed to compute metrics"
|
|
132
|
+
fix: "Run: /agileflow:story to create stories"
|
|
133
|
+
severity: high
|
|
134
|
+
|
|
135
|
+
velocity:
|
|
136
|
+
prerequisites:
|
|
137
|
+
- signal: statusJson
|
|
138
|
+
description: "status.json must exist for velocity tracking"
|
|
139
|
+
fix: "Run: /agileflow:story to start tracking work"
|
|
140
|
+
severity: critical
|
|
141
|
+
- signal: storyCount
|
|
142
|
+
description: "Completed stories are needed for velocity calculation"
|
|
143
|
+
fix: "Complete some stories to build velocity history"
|
|
144
|
+
severity: high
|
|
145
|
+
|
|
146
|
+
compress:
|
|
147
|
+
prerequisites:
|
|
148
|
+
- signal: statusJson
|
|
149
|
+
description: "status.json must exist to compress"
|
|
150
|
+
fix: "No status.json to compress - create stories first with /agileflow:story"
|
|
151
|
+
severity: critical
|
|
152
|
+
|
|
153
|
+
retro:
|
|
154
|
+
prerequisites:
|
|
155
|
+
- signal: statusJson
|
|
156
|
+
description: "status.json must exist for retrospective data"
|
|
157
|
+
fix: "Run: /agileflow:story to start tracking work"
|
|
158
|
+
severity: critical
|
|
159
|
+
- signal: storyCount
|
|
160
|
+
description: "Stories are needed for meaningful retrospective"
|
|
161
|
+
fix: "Complete some stories before running a retrospective"
|
|
162
|
+
severity: high
|
|
163
|
+
|
|
164
|
+
changelog:
|
|
165
|
+
prerequisites:
|
|
166
|
+
- signal: git.branch
|
|
167
|
+
description: "Git repository must be initialized with commit history"
|
|
168
|
+
fix: "Run: git init && git add -A && git commit -m 'initial commit'"
|
|
169
|
+
severity: critical
|
|
@@ -228,6 +228,15 @@ agileflowProtections:
|
|
|
228
228
|
#
|
|
229
229
|
# =====================================================
|
|
230
230
|
|
|
231
|
+
# ─── Release Process Enforcement ───
|
|
232
|
+
# Forces use of ./scripts/release.sh instead of manual commands
|
|
233
|
+
releaseProtections:
|
|
234
|
+
- pattern: '\bnpm\s+version\s+'
|
|
235
|
+
reason: "Use ./scripts/release.sh instead of npm version"
|
|
236
|
+
|
|
237
|
+
- pattern: '\bgit\s+tag\s+v\d+\.\d+\.\d+'
|
|
238
|
+
reason: "Use ./scripts/release.sh instead of manual git tag"
|
|
239
|
+
|
|
231
240
|
# ─── Project-Specific Patterns (add yours below) ───
|
|
232
241
|
# customPatterns:
|
|
233
242
|
# - pattern: 'your-pattern-here'
|
|
@@ -71,7 +71,8 @@ class BaseIdeSetup {
|
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
// Replace standalone "docs" word (not followed by .)
|
|
74
|
-
|
|
74
|
+
// Use replacement function to avoid $ in docsFolder being interpreted as regex backreference
|
|
75
|
+
result = result.replace(/\bdocs\b(?!\.)/g, () => this.docsFolder);
|
|
75
76
|
|
|
76
77
|
return result;
|
|
77
78
|
}
|
|
@@ -371,15 +372,38 @@ class BaseIdeSetup {
|
|
|
371
372
|
/**
|
|
372
373
|
* Recursively install markdown files from source to target directory
|
|
373
374
|
* Handles content injection and docs reference replacement.
|
|
375
|
+
* Optionally applies IDE-specific transformations via ideTransform callback.
|
|
376
|
+
*
|
|
374
377
|
* @param {string} sourceDir - Source directory path
|
|
375
378
|
* @param {string} targetDir - Target directory path
|
|
376
379
|
* @param {string} agileflowDir - AgileFlow installation directory (for dynamic content)
|
|
377
380
|
* @param {boolean} injectDynamic - Whether to inject dynamic content (only for top-level commands)
|
|
381
|
+
* @param {Function} [ideTransform] - Optional IDE transformation function: (content, filename) => string
|
|
378
382
|
* @returns {Promise<{commands: number, subdirs: number}>} Count of installed items
|
|
379
383
|
* @throws {CommandInstallationError} If command installation fails
|
|
380
384
|
* @throws {FilePermissionError} If permission denied
|
|
385
|
+
*
|
|
386
|
+
* @example
|
|
387
|
+
* // Without transformation (backward compatible)
|
|
388
|
+
* await installer.installCommandsRecursive(src, target, agileflow, true);
|
|
389
|
+
*
|
|
390
|
+
* @example
|
|
391
|
+
* // With IDE transformation
|
|
392
|
+
* await installer.installCommandsRecursive(
|
|
393
|
+
* src,
|
|
394
|
+
* target,
|
|
395
|
+
* agileflow,
|
|
396
|
+
* true,
|
|
397
|
+
* (content, filename) => ideGenerator.generateForIde(content, 'cursor')
|
|
398
|
+
* );
|
|
381
399
|
*/
|
|
382
|
-
async installCommandsRecursive(
|
|
400
|
+
async installCommandsRecursive(
|
|
401
|
+
sourceDir,
|
|
402
|
+
targetDir,
|
|
403
|
+
agileflowDir,
|
|
404
|
+
injectDynamic = false,
|
|
405
|
+
ideTransform = null
|
|
406
|
+
) {
|
|
383
407
|
let commandCount = 0;
|
|
384
408
|
let subdirCount = 0;
|
|
385
409
|
|
|
@@ -419,6 +443,11 @@ class BaseIdeSetup {
|
|
|
419
443
|
// Replace docs/ references with custom folder name
|
|
420
444
|
content = this.replaceDocsReferences(content);
|
|
421
445
|
|
|
446
|
+
// Apply IDE-specific transformation if provided
|
|
447
|
+
if (ideTransform && typeof ideTransform === 'function') {
|
|
448
|
+
content = ideTransform(content, entry.name);
|
|
449
|
+
}
|
|
450
|
+
|
|
422
451
|
await this.writeFile(targetPath, content);
|
|
423
452
|
commandCount++;
|
|
424
453
|
} catch (error) {
|
|
@@ -437,7 +466,8 @@ class BaseIdeSetup {
|
|
|
437
466
|
sourcePath,
|
|
438
467
|
targetPath,
|
|
439
468
|
agileflowDir,
|
|
440
|
-
false // Don't inject dynamic content in subdirectories
|
|
469
|
+
false, // Don't inject dynamic content in subdirectories
|
|
470
|
+
ideTransform // Pass ideTransform to recursive calls
|
|
441
471
|
);
|
|
442
472
|
commandCount += subResult.commands;
|
|
443
473
|
subdirCount += 1 + subResult.subdirs;
|
|
@@ -61,12 +61,9 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
61
61
|
// Claude Code specific: Setup damage control hooks
|
|
62
62
|
await this.setupDamageControl(projectDir, agileflowDir, ideDir, options);
|
|
63
63
|
|
|
64
|
-
// Claude Code specific: Setup SessionStart hooks (welcome, archive, context-loader
|
|
64
|
+
// Claude Code specific: Setup SessionStart hooks (welcome, archive, context-loader)
|
|
65
65
|
await this.setupSessionStartHooks(projectDir, agileflowDir, ideDir, options);
|
|
66
66
|
|
|
67
|
-
// Claude Code specific: Setup Stop hooks (tmux-task-watcher cleanup)
|
|
68
|
-
await this.setupStopHooks(projectDir, agileflowDir, ideDir, options);
|
|
69
|
-
|
|
70
67
|
return result;
|
|
71
68
|
}
|
|
72
69
|
|
|
@@ -259,12 +256,6 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
259
256
|
'node $CLAUDE_PROJECT_DIR/.agileflow/scripts/context-loader.js 2>/dev/null || true',
|
|
260
257
|
timeout: 5000,
|
|
261
258
|
},
|
|
262
|
-
{
|
|
263
|
-
type: 'command',
|
|
264
|
-
command:
|
|
265
|
-
'bash $CLAUDE_PROJECT_DIR/.agileflow/scripts/tmux-task-watcher.sh 2>/dev/null || true',
|
|
266
|
-
timeout: 5000,
|
|
267
|
-
},
|
|
268
259
|
];
|
|
269
260
|
|
|
270
261
|
// Check if SessionStart hooks already exist
|
|
@@ -294,65 +285,7 @@ class ClaudeCodeSetup extends BaseIdeSetup {
|
|
|
294
285
|
|
|
295
286
|
// Write settings
|
|
296
287
|
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
297
|
-
console.log(
|
|
298
|
-
chalk.dim(` - SessionStart hooks: welcome, archive, context-loader, tmux-task-watcher`)
|
|
299
|
-
);
|
|
300
|
-
}
|
|
301
|
-
|
|
302
|
-
/**
|
|
303
|
-
* Setup Stop hooks (tmux-task-watcher cleanup)
|
|
304
|
-
* @param {string} projectDir - Project directory
|
|
305
|
-
* @param {string} agileflowDir - AgileFlow installation directory
|
|
306
|
-
* @param {string} claudeDir - .claude directory path
|
|
307
|
-
* @param {Object} options - Setup options
|
|
308
|
-
*/
|
|
309
|
-
async setupStopHooks(projectDir, agileflowDir, claudeDir, options = {}) {
|
|
310
|
-
const settingsPath = path.join(claudeDir, 'settings.json');
|
|
311
|
-
let settings = {};
|
|
312
|
-
|
|
313
|
-
if (fs.existsSync(settingsPath)) {
|
|
314
|
-
try {
|
|
315
|
-
settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
|
|
316
|
-
} catch (e) {
|
|
317
|
-
settings = {};
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
if (!settings.hooks) settings.hooks = {};
|
|
322
|
-
if (!settings.hooks.Stop) settings.hooks.Stop = [];
|
|
323
|
-
|
|
324
|
-
const stopHooks = [
|
|
325
|
-
{
|
|
326
|
-
type: 'command',
|
|
327
|
-
command:
|
|
328
|
-
'bash $CLAUDE_PROJECT_DIR/.agileflow/scripts/tmux-task-watcher.sh stop 2>/dev/null || true',
|
|
329
|
-
timeout: 3000,
|
|
330
|
-
},
|
|
331
|
-
];
|
|
332
|
-
|
|
333
|
-
const existingEntry = settings.hooks.Stop.find(
|
|
334
|
-
h => h.matcher === '' || h.matcher === undefined
|
|
335
|
-
);
|
|
336
|
-
|
|
337
|
-
if (existingEntry) {
|
|
338
|
-
if (!existingEntry.hooks) existingEntry.hooks = [];
|
|
339
|
-
for (const newHook of stopHooks) {
|
|
340
|
-
const alreadyExists = existingEntry.hooks.some(
|
|
341
|
-
h => h.command && h.command.includes('tmux-task-watcher')
|
|
342
|
-
);
|
|
343
|
-
if (!alreadyExists) {
|
|
344
|
-
existingEntry.hooks.push(newHook);
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
} else {
|
|
348
|
-
settings.hooks.Stop.push({
|
|
349
|
-
matcher: '',
|
|
350
|
-
hooks: stopHooks,
|
|
351
|
-
});
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
355
|
-
console.log(chalk.dim(` - Stop hooks: tmux-task-watcher cleanup`));
|
|
288
|
+
console.log(chalk.dim(` - SessionStart hooks: welcome, archive, context-loader`));
|
|
356
289
|
}
|
|
357
290
|
|
|
358
291
|
/**
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AgileFlow CLI - OpenAI Codex
|
|
2
|
+
* AgileFlow CLI - OpenAI Codex Installer
|
|
3
3
|
*
|
|
4
|
-
* Installs AgileFlow for OpenAI Codex
|
|
4
|
+
* Installs AgileFlow for OpenAI Codex:
|
|
5
5
|
* - Agents become Codex Skills (.codex/skills/agileflow-NAME/)
|
|
6
6
|
* - Commands become Codex Prompts (~/.codex/prompts/agileflow-NAME.md)
|
|
7
7
|
* - AGENTS.md provides project instructions at repo root
|
|
8
8
|
*
|
|
9
9
|
* @see https://developers.openai.com/codex/
|
|
10
|
-
* @see ADR-0002: Codex
|
|
10
|
+
* @see ADR-0002: OpenAI Codex Integration Strategy
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
const path = require('node:path');
|
|
@@ -24,11 +24,11 @@ const {
|
|
|
24
24
|
} = require('../../lib/content-transformer');
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
|
-
* OpenAI Codex
|
|
27
|
+
* OpenAI Codex setup handler
|
|
28
28
|
*/
|
|
29
29
|
class CodexSetup extends BaseIdeSetup {
|
|
30
30
|
constructor() {
|
|
31
|
-
super('codex', 'OpenAI Codex
|
|
31
|
+
super('codex', 'OpenAI Codex', false);
|
|
32
32
|
// Per-repo config directory
|
|
33
33
|
this.configDir = '.codex';
|
|
34
34
|
// User-level Codex home (can be overridden by $CODEX_HOME)
|
|
@@ -44,12 +44,12 @@ class CodexSetup extends BaseIdeSetup {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
/**
|
|
47
|
-
* Detect if Codex
|
|
47
|
+
* Detect if OpenAI Codex is installed/configured
|
|
48
48
|
* @param {string} projectDir - Project directory
|
|
49
49
|
* @returns {Promise<boolean>}
|
|
50
50
|
*/
|
|
51
51
|
async detect(projectDir) {
|
|
52
|
-
// Check if Codex home exists (user has Codex
|
|
52
|
+
// Check if Codex home exists (user has OpenAI Codex)
|
|
53
53
|
const codexHomeExists = await this.exists(this.codexHome);
|
|
54
54
|
// Check if project has .codex/ or AGENTS.md
|
|
55
55
|
const projectCodexExists = await this.exists(path.join(projectDir, this.configDir));
|
|
@@ -229,7 +229,7 @@ ${codexHeader}${bodyContent}`;
|
|
|
229
229
|
|
|
230
230
|
const content = `# AGENTS.md
|
|
231
231
|
|
|
232
|
-
> Project instructions for Codex
|
|
232
|
+
> Project instructions for OpenAI Codex with AgileFlow integration
|
|
233
233
|
|
|
234
234
|
## Project Commands
|
|
235
235
|
|
|
@@ -334,7 +334,7 @@ This directory contains: [describe purpose]
|
|
|
334
334
|
}
|
|
335
335
|
|
|
336
336
|
/**
|
|
337
|
-
* Setup Codex
|
|
337
|
+
* Setup OpenAI Codex configuration
|
|
338
338
|
* @param {string} projectDir - Project directory
|
|
339
339
|
* @param {string} agileflowDir - AgileFlow installation directory
|
|
340
340
|
* @param {Object} options - Setup options
|