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.
Files changed (101) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +57 -85
  3. package/lib/dashboard-automations.js +130 -0
  4. package/lib/dashboard-git.js +254 -0
  5. package/lib/dashboard-inbox.js +64 -0
  6. package/lib/dashboard-protocol.js +1 -0
  7. package/lib/dashboard-server.js +114 -924
  8. package/lib/dashboard-session.js +136 -0
  9. package/lib/dashboard-status.js +72 -0
  10. package/lib/dashboard-terminal.js +354 -0
  11. package/lib/dashboard-websocket.js +88 -0
  12. package/lib/drivers/codex-driver.ts +4 -4
  13. package/lib/logger.js +106 -0
  14. package/package.json +4 -2
  15. package/scripts/agileflow-configure.js +2 -2
  16. package/scripts/agileflow-welcome.js +409 -434
  17. package/scripts/claude-tmux.sh +80 -2
  18. package/scripts/context-loader.js +4 -9
  19. package/scripts/lib/command-prereqs.js +280 -0
  20. package/scripts/lib/configure-detect.js +92 -2
  21. package/scripts/lib/configure-features.js +295 -1
  22. package/scripts/lib/context-formatter.js +468 -233
  23. package/scripts/lib/context-loader.js +27 -15
  24. package/scripts/lib/damage-control-utils.js +8 -1
  25. package/scripts/lib/feature-catalog.js +321 -0
  26. package/scripts/lib/portable-tasks-cli.js +274 -0
  27. package/scripts/lib/portable-tasks.js +479 -0
  28. package/scripts/lib/signal-detectors.js +1 -1
  29. package/scripts/lib/team-events.js +86 -1
  30. package/scripts/obtain-context.js +28 -4
  31. package/scripts/smart-detect.js +17 -0
  32. package/scripts/strip-ai-attribution.js +63 -0
  33. package/scripts/team-manager.js +7 -2
  34. package/scripts/welcome-deferred.js +437 -0
  35. package/src/core/agents/perf-analyzer-assets.md +174 -0
  36. package/src/core/agents/perf-analyzer-bundle.md +165 -0
  37. package/src/core/agents/perf-analyzer-caching.md +160 -0
  38. package/src/core/agents/perf-analyzer-compute.md +165 -0
  39. package/src/core/agents/perf-analyzer-memory.md +182 -0
  40. package/src/core/agents/perf-analyzer-network.md +157 -0
  41. package/src/core/agents/perf-analyzer-queries.md +155 -0
  42. package/src/core/agents/perf-analyzer-rendering.md +156 -0
  43. package/src/core/agents/perf-consensus.md +280 -0
  44. package/src/core/agents/security-analyzer-api.md +199 -0
  45. package/src/core/agents/security-analyzer-auth.md +160 -0
  46. package/src/core/agents/security-analyzer-authz.md +168 -0
  47. package/src/core/agents/security-analyzer-deps.md +147 -0
  48. package/src/core/agents/security-analyzer-infra.md +176 -0
  49. package/src/core/agents/security-analyzer-injection.md +148 -0
  50. package/src/core/agents/security-analyzer-input.md +191 -0
  51. package/src/core/agents/security-analyzer-secrets.md +175 -0
  52. package/src/core/agents/security-consensus.md +276 -0
  53. package/src/core/agents/test-analyzer-assertions.md +181 -0
  54. package/src/core/agents/test-analyzer-coverage.md +183 -0
  55. package/src/core/agents/test-analyzer-fragility.md +185 -0
  56. package/src/core/agents/test-analyzer-integration.md +155 -0
  57. package/src/core/agents/test-analyzer-maintenance.md +173 -0
  58. package/src/core/agents/test-analyzer-mocking.md +178 -0
  59. package/src/core/agents/test-analyzer-patterns.md +189 -0
  60. package/src/core/agents/test-analyzer-structure.md +177 -0
  61. package/src/core/agents/test-consensus.md +294 -0
  62. package/src/core/commands/{legal/audit.md → audit/legal.md} +13 -13
  63. package/src/core/commands/{logic/audit.md → audit/logic.md} +12 -12
  64. package/src/core/commands/audit/performance.md +443 -0
  65. package/src/core/commands/audit/security.md +443 -0
  66. package/src/core/commands/audit/test.md +442 -0
  67. package/src/core/commands/babysit.md +505 -463
  68. package/src/core/commands/configure.md +8 -8
  69. package/src/core/commands/research/ask.md +42 -9
  70. package/src/core/commands/research/import.md +14 -8
  71. package/src/core/commands/research/list.md +17 -16
  72. package/src/core/commands/research/synthesize.md +8 -8
  73. package/src/core/commands/research/view.md +28 -4
  74. package/src/core/commands/whats-new.md +2 -2
  75. package/src/core/experts/devops/expertise.yaml +13 -2
  76. package/src/core/experts/documentation/expertise.yaml +26 -4
  77. package/src/core/profiles/COMPARISON.md +170 -0
  78. package/src/core/profiles/README.md +178 -0
  79. package/src/core/profiles/claude-code.yaml +111 -0
  80. package/src/core/profiles/codex.yaml +103 -0
  81. package/src/core/profiles/cursor.yaml +134 -0
  82. package/src/core/profiles/examples.js +250 -0
  83. package/src/core/profiles/loader.js +235 -0
  84. package/src/core/profiles/windsurf.yaml +159 -0
  85. package/src/core/teams/logic-audit.json +6 -0
  86. package/src/core/teams/perf-audit.json +71 -0
  87. package/src/core/teams/security-audit.json +71 -0
  88. package/src/core/teams/test-audit.json +71 -0
  89. package/src/core/templates/command-prerequisites.yaml +169 -0
  90. package/src/core/templates/damage-control-patterns.yaml +9 -0
  91. package/tools/cli/installers/ide/_base-ide.js +33 -3
  92. package/tools/cli/installers/ide/claude-code.js +2 -69
  93. package/tools/cli/installers/ide/codex.js +9 -9
  94. package/tools/cli/installers/ide/cursor.js +165 -4
  95. package/tools/cli/installers/ide/windsurf.js +237 -6
  96. package/tools/cli/lib/content-transformer.js +234 -9
  97. package/tools/cli/lib/docs-setup.js +1 -1
  98. package/tools/cli/lib/ide-generator.js +357 -0
  99. package/tools/cli/lib/ide-registry.js +2 -2
  100. package/scripts/tmux-task-name.sh +0 -105
  101. 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
- result = result.replace(/\bdocs\b(?!\.)/g, this.docsFolder);
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(sourceDir, targetDir, agileflowDir, injectDynamic = false) {
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, tmux-task-watcher)
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 CLI Installer
2
+ * AgileFlow CLI - OpenAI Codex Installer
3
3
  *
4
- * Installs AgileFlow for OpenAI Codex CLI:
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 CLI Integration Strategy
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 CLI setup handler
27
+ * OpenAI Codex setup handler
28
28
  */
29
29
  class CodexSetup extends BaseIdeSetup {
30
30
  constructor() {
31
- super('codex', 'OpenAI Codex CLI', false);
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 CLI is installed/configured
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 CLI)
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 CLI with AgileFlow integration
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 CLI configuration
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