agileflow 4.0.0-alpha.2 → 4.0.0-alpha.21

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 (372) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/content/plugins/accessibility/plugin.yaml +14 -0
  3. package/content/plugins/accessibility/skills/agileflow-accessibility/SKILL.md +392 -0
  4. package/content/plugins/accessibility/skills/agileflow-accessibility/references/aria-patterns.md +528 -0
  5. package/content/plugins/accessibility/skills/agileflow-accessibility/references/testing-checklist.md +457 -0
  6. package/content/plugins/accessibility/skills/agileflow-accessibility/references/wcag-guide.md +683 -0
  7. package/content/plugins/accessibility/skills/agileflow-accessibility/workflows/audit-page.md +310 -0
  8. package/content/plugins/accessibility/skills/agileflow-accessibility/workflows/implement-accessible-component.md +479 -0
  9. package/content/plugins/ads/agents/ads-audit-budget.md +185 -0
  10. package/content/plugins/ads/agents/ads-audit-compliance.md +171 -0
  11. package/content/plugins/ads/agents/ads-audit-creative.md +168 -0
  12. package/content/plugins/ads/agents/ads-audit-google.md +227 -0
  13. package/content/plugins/ads/agents/ads-audit-meta.md +184 -0
  14. package/content/plugins/ads/agents/ads-audit-tracking.md +205 -0
  15. package/content/plugins/ads/agents/ads-consensus.md +410 -0
  16. package/content/plugins/ads/agents/ads-generate.md +152 -0
  17. package/content/plugins/ads/agents/ads-performance-tracker.md +212 -0
  18. package/content/plugins/ads/plugin.yaml +23 -4
  19. package/content/plugins/ads/skills/agileflow-ads/SKILL.md +218 -0
  20. package/content/plugins/ads/skills/agileflow-ads/references/ad-copy-formula-guide.md +131 -0
  21. package/content/plugins/ads/skills/agileflow-ads/references/audience-targeting-guide.md +137 -0
  22. package/content/plugins/ads/skills/agileflow-ads/references/bid-strategy-guide.md +115 -0
  23. package/content/plugins/ads/skills/agileflow-ads/references/platform-benchmarks.md +100 -0
  24. package/content/plugins/ads/skills/agileflow-ads/workflows/audit.md +118 -0
  25. package/content/plugins/ads/skills/agileflow-ads/workflows/generate.md +84 -0
  26. package/content/plugins/audit/agents/a11y-analyzer-aria.md +173 -0
  27. package/content/plugins/audit/agents/a11y-analyzer-forms.md +173 -0
  28. package/content/plugins/audit/agents/a11y-analyzer-keyboard.md +183 -0
  29. package/content/plugins/audit/agents/a11y-analyzer-semantic.md +169 -0
  30. package/content/plugins/audit/agents/a11y-analyzer-visual.md +172 -0
  31. package/content/plugins/audit/agents/a11y-consensus.md +249 -0
  32. package/content/plugins/audit/agents/accessibility.md +558 -0
  33. package/content/plugins/audit/agents/api-quality-analyzer-conventions.md +156 -0
  34. package/content/plugins/audit/agents/api-quality-analyzer-docs.md +184 -0
  35. package/content/plugins/audit/agents/api-quality-analyzer-errors.md +191 -0
  36. package/content/plugins/audit/agents/api-quality-analyzer-pagination.md +179 -0
  37. package/content/plugins/audit/agents/api-quality-analyzer-versioning.md +150 -0
  38. package/content/plugins/audit/agents/api-quality-consensus.md +217 -0
  39. package/content/plugins/audit/agents/api-validator.md +191 -0
  40. package/content/plugins/audit/agents/arch-analyzer-circular.md +156 -0
  41. package/content/plugins/audit/agents/arch-analyzer-complexity.md +193 -0
  42. package/content/plugins/audit/agents/arch-analyzer-coupling.md +152 -0
  43. package/content/plugins/audit/agents/arch-analyzer-layering.md +160 -0
  44. package/content/plugins/audit/agents/arch-analyzer-patterns.md +210 -0
  45. package/content/plugins/audit/agents/arch-consensus.md +228 -0
  46. package/content/plugins/audit/agents/browser-qa.md +342 -0
  47. package/content/plugins/audit/agents/code-reviewer.md +298 -0
  48. package/content/plugins/audit/agents/completeness-analyzer-api.md +199 -0
  49. package/content/plugins/audit/agents/completeness-analyzer-conditional.md +211 -0
  50. package/content/plugins/audit/agents/completeness-analyzer-handlers.md +166 -0
  51. package/content/plugins/audit/agents/completeness-analyzer-imports.md +165 -0
  52. package/content/plugins/audit/agents/completeness-analyzer-routes.md +190 -0
  53. package/content/plugins/audit/agents/completeness-analyzer-state.md +196 -0
  54. package/content/plugins/audit/agents/completeness-analyzer-stubs.md +206 -0
  55. package/content/plugins/audit/agents/completeness-consensus.md +295 -0
  56. package/content/plugins/audit/agents/error-analyzer.md +213 -0
  57. package/content/plugins/audit/agents/flow-analyzer-authorization.md +182 -0
  58. package/content/plugins/audit/agents/flow-analyzer-discovery.md +174 -0
  59. package/content/plugins/audit/agents/flow-analyzer-errors.md +186 -0
  60. package/content/plugins/audit/agents/flow-analyzer-feedback.md +185 -0
  61. package/content/plugins/audit/agents/flow-analyzer-navigation.md +177 -0
  62. package/content/plugins/audit/agents/flow-analyzer-persistence.md +193 -0
  63. package/content/plugins/audit/agents/flow-analyzer-wiring.md +169 -0
  64. package/content/plugins/audit/agents/flow-consensus.md +237 -0
  65. package/content/plugins/audit/agents/legal-analyzer-a11y.md +114 -0
  66. package/content/plugins/audit/agents/legal-analyzer-ai.md +121 -0
  67. package/content/plugins/audit/agents/legal-analyzer-consumer.md +114 -0
  68. package/content/plugins/audit/agents/legal-analyzer-content.md +117 -0
  69. package/content/plugins/audit/agents/legal-analyzer-international.md +119 -0
  70. package/content/plugins/audit/agents/legal-analyzer-licensing.md +119 -0
  71. package/content/plugins/audit/agents/legal-analyzer-privacy.md +112 -0
  72. package/content/plugins/audit/agents/legal-analyzer-security.md +116 -0
  73. package/content/plugins/audit/agents/legal-analyzer-terms.md +115 -0
  74. package/content/plugins/audit/agents/legal-consensus.md +250 -0
  75. package/content/plugins/audit/agents/logic-analyzer-edge.md +179 -0
  76. package/content/plugins/audit/agents/logic-analyzer-flow.md +264 -0
  77. package/content/plugins/audit/agents/logic-analyzer-invariant.md +215 -0
  78. package/content/plugins/audit/agents/logic-analyzer-race.md +280 -0
  79. package/content/plugins/audit/agents/logic-analyzer-type.md +227 -0
  80. package/content/plugins/audit/agents/logic-consensus.md +259 -0
  81. package/content/plugins/audit/agents/perf-analyzer-assets.md +182 -0
  82. package/content/plugins/audit/agents/perf-analyzer-bundle.md +173 -0
  83. package/content/plugins/audit/agents/perf-analyzer-caching.md +170 -0
  84. package/content/plugins/audit/agents/perf-analyzer-compute.md +173 -0
  85. package/content/plugins/audit/agents/perf-analyzer-memory.md +193 -0
  86. package/content/plugins/audit/agents/perf-analyzer-network.md +165 -0
  87. package/content/plugins/audit/agents/perf-analyzer-queries.md +162 -0
  88. package/content/plugins/audit/agents/perf-analyzer-rendering.md +168 -0
  89. package/content/plugins/audit/agents/perf-consensus.md +287 -0
  90. package/content/plugins/audit/agents/qa.md +820 -0
  91. package/content/plugins/audit/agents/quality-analyzer-comments.md +159 -0
  92. package/content/plugins/audit/agents/quality-analyzer-duplication.md +184 -0
  93. package/content/plugins/audit/agents/quality-analyzer-naming.md +160 -0
  94. package/content/plugins/audit/agents/quality-consensus.md +241 -0
  95. package/content/plugins/audit/agents/schema-validator.md +473 -0
  96. package/content/plugins/audit/agents/security-analyzer-api.md +210 -0
  97. package/content/plugins/audit/agents/security-analyzer-auth.md +169 -0
  98. package/content/plugins/audit/agents/security-analyzer-authz.md +180 -0
  99. package/content/plugins/audit/agents/security-analyzer-deps.md +153 -0
  100. package/content/plugins/audit/agents/security-analyzer-infra.md +184 -0
  101. package/content/plugins/audit/agents/security-analyzer-injection.md +155 -0
  102. package/content/plugins/audit/agents/security-analyzer-input.md +201 -0
  103. package/content/plugins/audit/agents/security-analyzer-secrets.md +183 -0
  104. package/content/plugins/audit/agents/security-consensus.md +283 -0
  105. package/content/plugins/audit/agents/test-analyzer-assertions.md +188 -0
  106. package/content/plugins/audit/agents/test-analyzer-coverage.md +189 -0
  107. package/content/plugins/audit/agents/test-analyzer-fragility.md +193 -0
  108. package/content/plugins/audit/agents/test-analyzer-integration.md +161 -0
  109. package/content/plugins/audit/agents/test-analyzer-maintenance.md +180 -0
  110. package/content/plugins/audit/agents/test-analyzer-mocking.md +188 -0
  111. package/content/plugins/audit/agents/test-analyzer-patterns.md +196 -0
  112. package/content/plugins/audit/agents/test-analyzer-structure.md +184 -0
  113. package/content/plugins/audit/agents/test-consensus.md +301 -0
  114. package/content/plugins/audit/agents/testing.md +561 -0
  115. package/content/plugins/audit/agents/ui-validator.md +344 -0
  116. package/content/plugins/audit/plugin.yaml +186 -5
  117. package/content/plugins/audit/skills/agileflow-audit/SKILL.md +113 -0
  118. package/content/plugins/audit/skills/agileflow-audit/references/audit-depth-guide.md +151 -0
  119. package/content/plugins/audit/skills/agileflow-audit/references/dependency-risk-guide.md +139 -0
  120. package/content/plugins/audit/skills/agileflow-audit/references/owasp-top10.md +120 -0
  121. package/content/plugins/audit/skills/agileflow-audit/references/performance-budget-guide.md +143 -0
  122. package/content/plugins/audit/skills/agileflow-audit/references/wcag-criteria.md +117 -0
  123. package/content/plugins/audit/skills/agileflow-audit/workflows/run-audit.md +52 -0
  124. package/content/plugins/audit/skills/agileflow-audit/workflows/tdd.md +66 -0
  125. package/content/plugins/core/agents/adr-writer.md +521 -0
  126. package/content/plugins/core/agents/epic-planner.md +520 -0
  127. package/content/plugins/core/agents/mentor.md +709 -0
  128. package/content/plugins/core/agents/orchestrator.md +776 -0
  129. package/content/plugins/core/agents/team-coordinator.md +334 -0
  130. package/content/plugins/core/agents/team-lead.md +181 -0
  131. package/content/plugins/core/agents/workspace-orchestrator.md +146 -0
  132. package/content/plugins/core/hooks/context-loader.js +31 -4
  133. package/content/plugins/core/hooks/damage-control-bash.js +10 -2
  134. package/content/plugins/core/hooks/damage-control-edit.js +4 -1
  135. package/content/plugins/core/hooks/damage-control-patterns.yaml +1 -1
  136. package/content/plugins/core/hooks/damage-control-write.js +4 -1
  137. package/content/plugins/core/hooks/{pre-compact-state.js → post-compact-state.js} +25 -8
  138. package/content/plugins/core/hooks/preferences-injector.js +352 -0
  139. package/content/plugins/core/plugin.yaml +24 -28
  140. package/content/plugins/core/skills/agileflow-adr/SKILL.md +34 -8
  141. package/content/plugins/core/skills/agileflow-adr/references/madr-format-guide.md +86 -0
  142. package/content/plugins/core/skills/agileflow-adr/workflows/write-adr.md +57 -0
  143. package/content/plugins/core/skills/agileflow-babysit-mentor/SKILL.md +94 -27
  144. package/content/plugins/core/skills/agileflow-babysit-mentor/references/mentor-decision-guide.md +81 -0
  145. package/content/plugins/core/skills/agileflow-babysit-mentor/workflows/mentor-session.md +79 -0
  146. package/content/plugins/core/skills/agileflow-epic-planner/SKILL.md +37 -7
  147. package/content/plugins/core/skills/agileflow-epic-planner/references/epic-sizing-guide.md +81 -0
  148. package/content/plugins/core/skills/agileflow-epic-planner/workflows/plan-epic.md +55 -0
  149. package/content/plugins/core/skills/agileflow-status-updater/SKILL.md +36 -20
  150. package/content/plugins/core/skills/agileflow-status-updater/references/status-transitions.md +89 -0
  151. package/content/plugins/core/skills/agileflow-status-updater/workflows/update-status.md +56 -0
  152. package/content/plugins/core/skills/agileflow-story-writer/SKILL.md +39 -114
  153. package/content/plugins/core/skills/agileflow-story-writer/references/estimation-reference.md +36 -0
  154. package/content/plugins/core/skills/agileflow-story-writer/references/story-template.md +92 -0
  155. package/content/plugins/core/skills/agileflow-story-writer/workflows/write-story.md +138 -0
  156. package/content/plugins/council/agents/council-advocate.md +223 -0
  157. package/content/plugins/council/agents/council-analyst.md +278 -0
  158. package/content/plugins/council/agents/council-compounder.md +204 -0
  159. package/content/plugins/council/agents/council-contrarian.md +217 -0
  160. package/content/plugins/council/agents/council-moonshot.md +217 -0
  161. package/content/plugins/council/agents/council-optimist.md +185 -0
  162. package/content/plugins/council/agents/council-revenue.md +200 -0
  163. package/content/plugins/council/agents/council-technical.md +218 -0
  164. package/content/plugins/council/agents/multi-expert.md +334 -0
  165. package/content/plugins/council/plugin.yaml +23 -4
  166. package/content/plugins/council/skills/agileflow-council/SKILL.md +102 -0
  167. package/content/plugins/council/skills/agileflow-council/references/decision-log-template.md +109 -0
  168. package/content/plugins/council/skills/agileflow-council/references/perspective-guide.md +104 -0
  169. package/content/plugins/council/skills/agileflow-council/references/when-to-convene-guide.md +112 -0
  170. package/content/plugins/council/skills/agileflow-council/workflows/convene.md +73 -0
  171. package/content/plugins/council/skills/agileflow-council/workflows/multi-expert.md +75 -0
  172. package/content/plugins/database/plugin.yaml +14 -0
  173. package/content/plugins/database/skills/agileflow-database/SKILL.md +284 -0
  174. package/content/plugins/database/skills/agileflow-database/references/indexing-guide.md +313 -0
  175. package/content/plugins/database/skills/agileflow-database/references/migration-guide.md +328 -0
  176. package/content/plugins/database/skills/agileflow-database/references/schema-design-guide.md +467 -0
  177. package/content/plugins/database/skills/agileflow-database/workflows/design-schema.md +213 -0
  178. package/content/plugins/database/skills/agileflow-database/workflows/optimize-query.md +253 -0
  179. package/content/plugins/debugging/plugin.yaml +14 -0
  180. package/content/plugins/debugging/skills/agileflow-debug/SKILL.md +236 -0
  181. package/content/plugins/debugging/skills/agileflow-debug/references/common-patterns.md +350 -0
  182. package/content/plugins/debugging/skills/agileflow-debug/references/debugging-strategies.md +328 -0
  183. package/content/plugins/debugging/skills/agileflow-debug/workflows/debug-issue.md +187 -0
  184. package/content/plugins/debugging/skills/agileflow-debug/workflows/reproduce-bug.md +194 -0
  185. package/content/plugins/delivery/agents/ci.md +547 -0
  186. package/content/plugins/delivery/agents/devops.md +789 -0
  187. package/content/plugins/delivery/plugin.yaml +19 -0
  188. package/content/plugins/delivery/skills/agileflow-delivery/SKILL.md +111 -0
  189. package/content/plugins/delivery/skills/agileflow-delivery/references/changelog-format-guide.md +133 -0
  190. package/content/plugins/delivery/skills/agileflow-delivery/references/ci-pipeline-guide.md +158 -0
  191. package/content/plugins/delivery/skills/agileflow-delivery/references/pr-checklist-guide.md +133 -0
  192. package/content/plugins/delivery/skills/agileflow-delivery/references/release-checklist.md +142 -0
  193. package/content/plugins/delivery/skills/agileflow-delivery/workflows/changelog.md +72 -0
  194. package/content/plugins/delivery/skills/agileflow-delivery/workflows/deploy.md +74 -0
  195. package/content/plugins/delivery/skills/agileflow-delivery/workflows/pr.md +75 -0
  196. package/content/plugins/docs/agents/documentation.md +544 -0
  197. package/content/plugins/docs/agents/readme-updater.md +640 -0
  198. package/content/plugins/docs/plugin.yaml +19 -0
  199. package/content/plugins/docs/skills/agileflow-docs/SKILL.md +106 -0
  200. package/content/plugins/docs/skills/agileflow-docs/references/api-doc-template.md +167 -0
  201. package/content/plugins/docs/skills/agileflow-docs/references/doc-types-guide.md +141 -0
  202. package/content/plugins/docs/skills/agileflow-docs/references/readme-template.md +156 -0
  203. package/content/plugins/docs/skills/agileflow-docs/workflows/readme-sync.md +57 -0
  204. package/content/plugins/docs/skills/agileflow-docs/workflows/sync.md +64 -0
  205. package/content/plugins/engineering/agents/api.md +718 -0
  206. package/content/plugins/engineering/agents/codebase-query.md +285 -0
  207. package/content/plugins/engineering/agents/compliance.md +559 -0
  208. package/content/plugins/engineering/agents/database.md +644 -0
  209. package/content/plugins/engineering/agents/integrations.md +644 -0
  210. package/content/plugins/engineering/agents/mobile.md +552 -0
  211. package/content/plugins/engineering/agents/monitoring.md +585 -0
  212. package/content/plugins/engineering/agents/performance.md +529 -0
  213. package/content/plugins/engineering/agents/refactor.md +592 -0
  214. package/content/plugins/engineering/agents/security.md +524 -0
  215. package/content/plugins/engineering/agents/ui.md +1336 -0
  216. package/content/plugins/engineering/plugin.yaml +37 -0
  217. package/content/plugins/engineering/skills/agileflow-engineering/SKILL.md +127 -0
  218. package/content/plugins/engineering/skills/agileflow-engineering/references/code-review-guide.md +126 -0
  219. package/content/plugins/engineering/skills/agileflow-engineering/references/domain-routing-guide.md +89 -0
  220. package/content/plugins/engineering/skills/agileflow-engineering/references/refactoring-guide.md +136 -0
  221. package/content/plugins/engineering/skills/agileflow-engineering/workflows/diagnose.md +63 -0
  222. package/content/plugins/engineering/skills/agileflow-engineering/workflows/impact.md +60 -0
  223. package/content/plugins/ideation/agents/brainstorm-analyzer-features.md +179 -0
  224. package/content/plugins/ideation/agents/brainstorm-analyzer-growth.md +169 -0
  225. package/content/plugins/ideation/agents/brainstorm-analyzer-integration.md +181 -0
  226. package/content/plugins/ideation/agents/brainstorm-analyzer-market.md +150 -0
  227. package/content/plugins/ideation/agents/brainstorm-analyzer-ux.md +180 -0
  228. package/content/plugins/ideation/agents/brainstorm-consensus.md +245 -0
  229. package/content/plugins/ideation/agents/design.md +568 -0
  230. package/content/plugins/ideation/agents/product.md +582 -0
  231. package/content/plugins/ideation/plugin.yaml +31 -0
  232. package/content/plugins/ideation/skills/agileflow-ideation/SKILL.md +109 -0
  233. package/content/plugins/ideation/skills/agileflow-ideation/references/brainstorm-techniques.md +138 -0
  234. package/content/plugins/ideation/skills/agileflow-ideation/references/competitive-analysis-template.md +148 -0
  235. package/content/plugins/ideation/skills/agileflow-ideation/references/feature-prioritization-guide.md +147 -0
  236. package/content/plugins/ideation/skills/agileflow-ideation/references/user-story-patterns.md +152 -0
  237. package/content/plugins/ideation/skills/agileflow-ideation/workflows/features.md +65 -0
  238. package/content/plugins/ideation/skills/agileflow-ideation/workflows/ideate.md +54 -0
  239. package/content/plugins/migration/agents/datamigration.md +757 -0
  240. package/content/plugins/migration/plugin.yaml +17 -0
  241. package/content/plugins/migration/skills/agileflow-migration/SKILL.md +106 -0
  242. package/content/plugins/migration/skills/agileflow-migration/references/data-validation-checklist.md +154 -0
  243. package/content/plugins/migration/skills/agileflow-migration/references/migration-patterns.md +209 -0
  244. package/content/plugins/migration/skills/agileflow-migration/references/rollback-playbook.md +171 -0
  245. package/content/plugins/migration/skills/agileflow-migration/references/version-compatibility-matrix.md +155 -0
  246. package/content/plugins/migration/skills/agileflow-migration/workflows/plan.md +73 -0
  247. package/content/plugins/migration/skills/agileflow-migration/workflows/validate.md +71 -0
  248. package/content/plugins/performance/plugin.yaml +14 -0
  249. package/content/plugins/performance/skills/agileflow-performance/SKILL.md +224 -0
  250. package/content/plugins/performance/skills/agileflow-performance/references/optimization-patterns.md +554 -0
  251. package/content/plugins/performance/skills/agileflow-performance/references/profiling-guide.md +383 -0
  252. package/content/plugins/performance/skills/agileflow-performance/references/web-vitals-guide.md +360 -0
  253. package/content/plugins/performance/skills/agileflow-performance/workflows/improve-web-vitals.md +344 -0
  254. package/content/plugins/performance/skills/agileflow-performance/workflows/profile-and-fix.md +254 -0
  255. package/content/plugins/planning/agents/analytics.md +670 -0
  256. package/content/plugins/planning/agents/rlm-subcore.md +215 -0
  257. package/content/plugins/planning/plugin.yaml +19 -0
  258. package/content/plugins/planning/skills/agileflow-planning/SKILL.md +111 -0
  259. package/content/plugins/planning/skills/agileflow-planning/references/estimation-guide.md +114 -0
  260. package/content/plugins/planning/skills/agileflow-planning/references/rpi-workflow.md +119 -0
  261. package/content/plugins/planning/skills/agileflow-planning/references/sprint-planning-guide.md +145 -0
  262. package/content/plugins/planning/skills/agileflow-planning/workflows/impact.md +63 -0
  263. package/content/plugins/planning/skills/agileflow-planning/workflows/rpi.md +104 -0
  264. package/content/plugins/psychology/plugin.yaml +14 -0
  265. package/content/plugins/psychology/skills/agileflow-retention/SKILL.md +252 -0
  266. package/content/plugins/psychology/skills/agileflow-retention/references/competitor-analysis.md +240 -0
  267. package/content/plugins/psychology/skills/agileflow-retention/references/psychology-models.md +349 -0
  268. package/content/plugins/psychology/skills/agileflow-retention/references/retention-patterns.md +279 -0
  269. package/content/plugins/psychology/skills/agileflow-retention/workflows/design-retention-feature.md +287 -0
  270. package/content/plugins/psychology/skills/agileflow-retention/workflows/retention-audit.md +259 -0
  271. package/content/plugins/refactoring/plugin.yaml +14 -0
  272. package/content/plugins/refactoring/skills/agileflow-refactor/SKILL.md +235 -0
  273. package/content/plugins/refactoring/skills/agileflow-refactor/references/refactoring-patterns.md +405 -0
  274. package/content/plugins/refactoring/skills/agileflow-refactor/references/safety-checks.md +177 -0
  275. package/content/plugins/refactoring/skills/agileflow-refactor/workflows/extract-module.md +226 -0
  276. package/content/plugins/refactoring/skills/agileflow-refactor/workflows/safe-refactor.md +169 -0
  277. package/content/plugins/research/agents/research.md +503 -0
  278. package/content/plugins/research/plugin.yaml +17 -0
  279. package/content/plugins/research/skills/agileflow-research/SKILL.md +110 -0
  280. package/content/plugins/research/skills/agileflow-research/references/knowledge-decay-guide.md +121 -0
  281. package/content/plugins/research/skills/agileflow-research/references/research-prompt-guide.md +141 -0
  282. package/content/plugins/research/skills/agileflow-research/references/synthesis-template.md +154 -0
  283. package/content/plugins/research/skills/agileflow-research/workflows/analyze.md +60 -0
  284. package/content/plugins/research/skills/agileflow-research/workflows/ask.md +64 -0
  285. package/content/plugins/research/skills/agileflow-research/workflows/import.md +66 -0
  286. package/content/plugins/research/skills/agileflow-research/workflows/synthesize.md +66 -0
  287. package/content/plugins/reviews/plugin.yaml +14 -0
  288. package/content/plugins/reviews/skills/agileflow-pr-reviewer/SKILL.md +241 -0
  289. package/content/plugins/reviews/skills/agileflow-pr-reviewer/references/review-checklist.md +200 -0
  290. package/content/plugins/reviews/skills/agileflow-pr-reviewer/references/security-patterns.md +328 -0
  291. package/content/plugins/reviews/skills/agileflow-pr-reviewer/workflows/review-pr.md +153 -0
  292. package/content/plugins/reviews/skills/agileflow-pr-reviewer/workflows/security-review.md +177 -0
  293. package/content/plugins/seo/agents/seo-analyzer-content.md +169 -0
  294. package/content/plugins/seo/agents/seo-analyzer-images.md +198 -0
  295. package/content/plugins/seo/agents/seo-analyzer-performance.md +217 -0
  296. package/content/plugins/seo/agents/seo-analyzer-schema.md +184 -0
  297. package/content/plugins/seo/agents/seo-analyzer-sitemap.md +177 -0
  298. package/content/plugins/seo/agents/seo-analyzer-technical.md +151 -0
  299. package/content/plugins/seo/agents/seo-consensus.md +304 -0
  300. package/content/plugins/seo/plugin.yaml +19 -4
  301. package/content/plugins/seo/skills/agileflow-seo/SKILL.md +188 -0
  302. package/content/plugins/seo/skills/agileflow-seo/references/cwv-thresholds.md +110 -0
  303. package/content/plugins/seo/skills/agileflow-seo/references/eeat-framework.md +144 -0
  304. package/content/plugins/seo/skills/agileflow-seo/references/keyword-research-guide.md +125 -0
  305. package/content/plugins/seo/skills/agileflow-seo/references/schema-types.md +139 -0
  306. package/content/plugins/seo/skills/agileflow-seo/references/technical-seo-checklist.md +139 -0
  307. package/content/plugins/seo/skills/agileflow-seo/workflows/audit.md +98 -0
  308. package/content/plugins/seo/skills/agileflow-seo/workflows/page.md +118 -0
  309. package/content/plugins/testing/plugin.yaml +16 -0
  310. package/content/plugins/testing/skills/agileflow-test-writer/SKILL.md +260 -0
  311. package/content/plugins/testing/skills/agileflow-test-writer/references/coverage-targets.md +239 -0
  312. package/content/plugins/testing/skills/agileflow-test-writer/references/test-patterns.md +420 -0
  313. package/content/plugins/testing/skills/agileflow-test-writer/workflows/add-coverage.md +154 -0
  314. package/content/plugins/testing/skills/agileflow-test-writer/workflows/write-tests-from-ac.md +225 -0
  315. package/package.json +2 -2
  316. package/src/cli/commands/doctor.js +818 -30
  317. package/src/cli/commands/hook.js +17 -14
  318. package/src/cli/commands/launch.js +1454 -0
  319. package/src/cli/commands/learn.js +149 -0
  320. package/src/cli/commands/plugins.js +113 -0
  321. package/src/cli/commands/setup.js +455 -110
  322. package/src/cli/commands/skills.js +324 -0
  323. package/src/cli/commands/status.js +8 -10
  324. package/src/cli/commands/update.js +76 -15
  325. package/src/cli/index.js +90 -26
  326. package/src/cli/wizard/babysit-mode-picker.js +192 -0
  327. package/src/cli/wizard/behaviors-picker.js +208 -54
  328. package/src/cli/wizard/ide-picker.js +40 -28
  329. package/src/cli/wizard/install-scope-picker.js +57 -0
  330. package/src/cli/wizard/launch-alias-picker.js +50 -0
  331. package/src/cli/wizard/launch-cli-picker.js +129 -0
  332. package/src/cli/wizard/launch-tmux-picker.js +133 -0
  333. package/src/cli/wizard/learnings-picker.js +40 -0
  334. package/src/cli/wizard/plugin-picker.js +47 -16
  335. package/src/lib/brand.js +116 -0
  336. package/src/lib/errors.js +120 -0
  337. package/src/lib/path-check.js +39 -0
  338. package/src/runtime/config/defaults.js +22 -17
  339. package/src/runtime/config/loader.js +77 -8
  340. package/src/runtime/config/schema.json +43 -16
  341. package/src/runtime/config/writer.js +3 -1
  342. package/src/runtime/ide/babysit-skill.js +202 -0
  343. package/src/runtime/ide/capabilities.js +84 -29
  344. package/src/runtime/ide/claude-code-content.js +177 -0
  345. package/src/runtime/ide/claude-code-settings.js +67 -29
  346. package/src/runtime/ide/claude-code-skills.js +47 -32
  347. package/src/runtime/ide/codex-config.js +295 -0
  348. package/src/runtime/installer/install.js +252 -24
  349. package/src/runtime/launch/alias-installer.js +191 -0
  350. package/src/runtime/launch/cli-resume.js +244 -0
  351. package/src/runtime/launch/closed-windows.js +338 -0
  352. package/src/runtime/launch/defaults.js +66 -0
  353. package/src/runtime/launch/detect-clis.js +69 -0
  354. package/src/runtime/launch/doctor.js +464 -0
  355. package/src/runtime/launch/exec-wrapper.js +114 -0
  356. package/src/runtime/launch/parallel-session.js +247 -0
  357. package/src/runtime/launch/prefs.js +211 -0
  358. package/src/runtime/launch/project-prefs.js +234 -0
  359. package/src/runtime/launch/resolve-cli.js +56 -0
  360. package/src/runtime/launch/restore.js +152 -0
  361. package/src/runtime/launch/schema.json +75 -0
  362. package/src/runtime/launch/session-lifecycle.js +313 -0
  363. package/src/runtime/launch/session-registry.js +401 -0
  364. package/src/runtime/launch/spawn.js +103 -0
  365. package/src/runtime/launch/tabs.js +350 -0
  366. package/src/runtime/launch/tmux.js +764 -0
  367. package/src/runtime/launch/worktree.js +260 -0
  368. package/src/runtime/plugins/registry.js +16 -11
  369. package/src/runtime/plugins/validator.js +57 -43
  370. package/src/runtime/skills/learnings.js +308 -0
  371. package/content/plugins/core/hooks/babysit-mentor-injector.js +0 -55
  372. package/src/cli/wizard/personalization.js +0 -64
@@ -1,25 +1,22 @@
1
1
  /**
2
- * Claude Code skill mirror.
2
+ * Skill mirror for IDEs that discover skills from a dotdir.
3
3
  *
4
4
  * Plugin skills are sourced under `apps/cli/content/plugins/<id>/skills/<skill-id>/`
5
- * and copied into `.agileflow/plugins/<id>/skills/<skill-id>/` by the
6
- * sync engine. But Claude Code discovers skills from `.claude/skills/<skill-id>/`,
7
- * so this module mirrors enabled plugin skills to that canonical
8
- * location and prunes orphaned skills when plugins are disabled.
9
- *
5
+ * and copied into the target IDE's skill directory by the installer.
10
6
  * We use copy (not symlink) for portability — Windows symlink behavior
11
- * is inconsistent and Claude Code itself runs there. The duplication
12
- * cost is negligible at v4-alpha skill counts.
7
+ * is inconsistent and the supported IDEs run on mixed platforms.
8
+ * The duplication cost is negligible at v4-alpha skill counts.
13
9
  */
14
- const fs = require('fs');
15
- const path = require('path');
10
+ const fs = require("fs");
11
+ const path = require("path");
12
+ const { renderSkillForTarget } = require("./babysit-skill.js");
16
13
 
17
14
  /**
18
15
  * @typedef {import('../plugins/registry.js').PluginManifest} PluginManifest
19
16
  *
20
17
  * @typedef {Object} MirrorResult
21
- * @property {string[]} mirrored - skill ids written to .claude/skills/
22
- * @property {string[]} pruned - skill ids removed from .claude/skills/ (orphans)
18
+ * @property {string[]} mirrored - skill ids written to the target skills dir
19
+ * @property {string[]} pruned - skill ids removed from the target skills dir (orphans)
23
20
  * @property {Array<{ skillId: string, error: string }>} skipped - skills whose source was missing
24
21
  */
25
22
 
@@ -28,7 +25,7 @@ const path = require('path');
28
25
  * @param {string} src
29
26
  * @param {string} dest
30
27
  */
31
- async function copyDir(src, dest) {
28
+ async function copyDir(src, dest, context = {}) {
32
29
  // Read the source listing FIRST. If src is missing (ENOENT), the
33
30
  // error propagates BEFORE we create dest, so a missing source can't
34
31
  // leave behind an empty destination dir for the caller to mistake
@@ -39,9 +36,19 @@ async function copyDir(src, dest) {
39
36
  const s = path.join(src, e.name);
40
37
  const d = path.join(dest, e.name);
41
38
  if (e.isDirectory()) {
42
- await copyDir(s, d);
39
+ await copyDir(s, d, context);
43
40
  } else if (e.isFile()) {
44
- await fs.promises.copyFile(s, d);
41
+ if (e.name === "SKILL.md" && context.skillId) {
42
+ const sourceText = await fs.promises.readFile(s, "utf8");
43
+ const rendered = renderSkillForTarget(
44
+ context.skillId,
45
+ sourceText,
46
+ context,
47
+ );
48
+ await fs.promises.writeFile(d, rendered, "utf8");
49
+ } else {
50
+ await fs.promises.copyFile(s, d);
51
+ }
45
52
  }
46
53
  }
47
54
  }
@@ -75,9 +82,9 @@ function collectPluginSkills(orderedPlugins) {
75
82
  // the plugin root, which is never what the author intended.
76
83
  if (
77
84
  !s ||
78
- typeof s.id !== 'string' ||
85
+ typeof s.id !== "string" ||
79
86
  !s.id ||
80
- typeof s.dir !== 'string' ||
87
+ typeof s.dir !== "string" ||
81
88
  !s.dir
82
89
  ) {
83
90
  continue;
@@ -92,8 +99,8 @@ function collectPluginSkills(orderedPlugins) {
92
99
  }
93
100
 
94
101
  /**
95
- * Mirror enabled plugin skills into `<projectRoot>/.claude/skills/<skill-id>/`
96
- * and remove any `.claude/skills/<id>/` whose id is not in the current
102
+ * Mirror enabled plugin skills into `<projectRoot>/<skillsDirRel>/<skill-id>/`
103
+ * and remove any `<skillsDirRel>/<id>/` whose id is not in the current
97
104
  * enabled set.
98
105
  *
99
106
  * Only AgileFlow-tracked skills are pruned: a skill is "tracked" iff
@@ -101,7 +108,7 @@ function collectPluginSkills(orderedPlugins) {
101
108
  * appears in any plugin's `provides.skills` (i.e., we recognize it).
102
109
  * To stay safe, we limit pruning to skills we've seen previously by
103
110
  * recording the install set in the file index — but for v4-alpha
104
- * simplicity, we prune every dir under `.claude/skills/` whose name
111
+ * simplicity, we prune every dir under the skills dir whose name
105
112
  * matches an `agileflow-*` convention OR is in the previously-mirrored
106
113
  * set on disk. Unknown user-placed skill dirs without that prefix are
107
114
  * left alone.
@@ -110,8 +117,13 @@ function collectPluginSkills(orderedPlugins) {
110
117
  * @param {string} projectRoot
111
118
  * @returns {Promise<MirrorResult>}
112
119
  */
113
- async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
114
- const claudeSkills = path.join(projectRoot, '.claude', 'skills');
120
+ async function mirrorClaudeCodeSkills(
121
+ orderedPlugins,
122
+ projectRoot,
123
+ skillsDirRel = ".claude/skills",
124
+ context = {},
125
+ ) {
126
+ const claudeSkills = path.join(projectRoot, skillsDirRel);
115
127
  await fs.promises.mkdir(claudeSkills, { recursive: true });
116
128
 
117
129
  const want = collectPluginSkills(orderedPlugins);
@@ -127,13 +139,13 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
127
139
  // Replace the destination wholesale so removed files in source
128
140
  // don't linger in the user's .claude/skills/.
129
141
  await rmDir(dest);
130
- await copyDir(sourceDir, dest);
142
+ await copyDir(sourceDir, dest, { ...context, skillId });
131
143
  mirrored.push(skillId);
132
144
  } catch (err) {
133
145
  // A missing source dir (ENOENT) shouldn't crash the entire
134
146
  // install — log and continue so other skills still mirror. A
135
147
  // permission error or unrelated failure still propagates.
136
- if (err && err.code === 'ENOENT') {
148
+ if (err && err.code === "ENOENT") {
137
149
  skipped.push({
138
150
  skillId,
139
151
  error: `source not found: ${sourceDir}`,
@@ -150,7 +162,7 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
150
162
  try {
151
163
  entries = await fs.promises.readdir(claudeSkills, { withFileTypes: true });
152
164
  } catch (err) {
153
- if (err.code === 'ENOENT') return { mirrored, pruned };
165
+ if (err.code === "ENOENT") return { mirrored, pruned };
154
166
  throw err;
155
167
  }
156
168
  for (const e of entries) {
@@ -160,7 +172,7 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
160
172
  // avoids blasting a user-placed third-party skill whose id we
161
173
  // don't manage. A dedicated prune-from-index approach can replace
162
174
  // this heuristic in a later phase.
163
- if (!e.name.startsWith('agileflow-')) continue;
175
+ if (!e.name.startsWith("agileflow-")) continue;
164
176
  await rmDir(path.join(claudeSkills, e.name));
165
177
  pruned.push(e.name);
166
178
  }
@@ -169,26 +181,29 @@ async function mirrorClaudeCodeSkills(orderedPlugins, projectRoot) {
169
181
  }
170
182
 
171
183
  /**
172
- * Remove all AgileFlow-mirrored skills from `.claude/skills/`. Used
173
- * when switching to a non-skill IDE.
184
+ * Remove all AgileFlow-mirrored skills from the target skills dir.
185
+ * Used when switching to a non-skill IDE.
174
186
  *
175
187
  * @param {string} projectRoot
176
188
  * @returns {Promise<string[]>} ids that were removed
177
189
  */
178
- async function unmirrorClaudeCodeSkills(projectRoot) {
179
- const claudeSkills = path.join(projectRoot, '.claude', 'skills');
190
+ async function unmirrorClaudeCodeSkills(
191
+ projectRoot,
192
+ skillsDirRel = ".claude/skills",
193
+ ) {
194
+ const claudeSkills = path.join(projectRoot, skillsDirRel);
180
195
  /** @type {string[]} */
181
196
  const removed = [];
182
197
  let entries;
183
198
  try {
184
199
  entries = await fs.promises.readdir(claudeSkills, { withFileTypes: true });
185
200
  } catch (err) {
186
- if (err.code === 'ENOENT') return removed;
201
+ if (err.code === "ENOENT") return removed;
187
202
  throw err;
188
203
  }
189
204
  for (const e of entries) {
190
205
  if (!e.isDirectory()) continue;
191
- if (!e.name.startsWith('agileflow-')) continue;
206
+ if (!e.name.startsWith("agileflow-")) continue;
192
207
  await rmDir(path.join(claudeSkills, e.name));
193
208
  removed.push(e.name);
194
209
  }
@@ -0,0 +1,295 @@
1
+ /**
2
+ * Codex config.toml writer.
3
+ *
4
+ * Codex hooks require the `[features].hooks = true` flag in config.toml.
5
+ * AgileFlow uses the project-local `config.toml` path because we need both
6
+ * the feature flag and the inline lifecycle hook tables.
7
+ *
8
+ * The writer is non-destructive:
9
+ * - it preserves unrelated top-level Codex config
10
+ * - it preserves user hook entries on the same events
11
+ * - it only manages the AgileFlow hook registrations and the feature flag
12
+ */
13
+ const fs = require("fs");
14
+ const path = require("path");
15
+ const toml = require("@iarna/toml");
16
+
17
+ const HOOK_COMMAND_MARKER = "agileflow hook";
18
+ const HOOK_TIMEOUT_SECONDS = 30;
19
+ const DEFAULT_APPROVAL_POLICY = "never";
20
+ const DEFAULT_SANDBOX_MODE = "danger-full-access";
21
+
22
+ /**
23
+ * Codex hook registrations we own. These map to the Codex lifecycle
24
+ * events that AgileFlow actually uses.
25
+ */
26
+ const MANAGED_HOOKS = [
27
+ {
28
+ event: "SessionStart",
29
+ matcher: null,
30
+ command: "npx agileflow hook SessionStart",
31
+ statusMessage: "Loading AgileFlow session context",
32
+ },
33
+ {
34
+ event: "PreToolUse",
35
+ matcher: "Bash",
36
+ command: "npx agileflow hook PreToolUse --matcher Bash",
37
+ statusMessage: "Checking Bash command",
38
+ },
39
+ {
40
+ event: "PreToolUse",
41
+ matcher: "Edit",
42
+ command: "npx agileflow hook PreToolUse --matcher Edit",
43
+ statusMessage: "Checking Edit command",
44
+ },
45
+ {
46
+ event: "PreToolUse",
47
+ matcher: "Write",
48
+ command: "npx agileflow hook PreToolUse --matcher Write",
49
+ statusMessage: "Checking Write command",
50
+ },
51
+ {
52
+ event: "Stop",
53
+ matcher: null,
54
+ command: "npx agileflow hook Stop",
55
+ statusMessage: "Saving AgileFlow state",
56
+ },
57
+ ];
58
+
59
+ /**
60
+ * @param {{ matcher: string|null, command: string, statusMessage?: string }} hook
61
+ */
62
+ function buildEntry({ matcher, command, statusMessage }) {
63
+ /** @type {{ matcher?: string, hooks: object[] }} */
64
+ const out = {
65
+ hooks: [
66
+ {
67
+ type: "command",
68
+ command,
69
+ timeout: HOOK_TIMEOUT_SECONDS,
70
+ ...(statusMessage ? { statusMessage } : {}),
71
+ },
72
+ ],
73
+ };
74
+ if (matcher) out.matcher = matcher;
75
+ return out;
76
+ }
77
+
78
+ /**
79
+ * @param {*} entry
80
+ * @returns {boolean}
81
+ */
82
+ function isAgileflowEntry(entry) {
83
+ if (!entry || typeof entry !== "object" || !Array.isArray(entry.hooks)) {
84
+ return false;
85
+ }
86
+ return Array.isArray(entry.hooks)
87
+ ? entry.hooks.some(
88
+ (h) =>
89
+ h &&
90
+ typeof h === "object" &&
91
+ h.type === "command" &&
92
+ typeof h.command === "string" &&
93
+ h.command.includes(HOOK_COMMAND_MARKER),
94
+ )
95
+ : false;
96
+ }
97
+
98
+ /**
99
+ * @param {string} configPath
100
+ * @returns {Promise<object>}
101
+ */
102
+ async function readExisting(configPath) {
103
+ try {
104
+ const raw = await fs.promises.readFile(configPath, "utf8");
105
+ const parsed = toml.parse(raw);
106
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
107
+ return {};
108
+ }
109
+ return parsed;
110
+ } catch (err) {
111
+ if (err.code === "ENOENT") return {};
112
+ if (err instanceof SyntaxError || err.name === "TomlError") return {};
113
+ throw err;
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Merge our managed hook registrations into an existing config object.
119
+ * @param {object} existing
120
+ * @returns {object}
121
+ */
122
+ function mergeManagedHooks(existing) {
123
+ /** @type {Record<string, any>} */
124
+ const next = {
125
+ ...(existing && typeof existing === "object" && !Array.isArray(existing)
126
+ ? existing
127
+ : {}),
128
+ };
129
+
130
+ const existingFeatures =
131
+ next.features &&
132
+ typeof next.features === "object" &&
133
+ !Array.isArray(next.features)
134
+ ? next.features
135
+ : {};
136
+ next.features = {
137
+ ...existingFeatures,
138
+ hooks: true,
139
+ collaboration_modes: true,
140
+ };
141
+ next.approval_policy = DEFAULT_APPROVAL_POLICY;
142
+ next.sandbox_mode = DEFAULT_SANDBOX_MODE;
143
+
144
+ const existingHooks =
145
+ next.hooks && typeof next.hooks === "object" && !Array.isArray(next.hooks)
146
+ ? next.hooks
147
+ : {};
148
+ const hooks = { ...existingHooks };
149
+ /** @type {Map<string, typeof MANAGED_HOOKS>} */
150
+ const grouped = new Map();
151
+ for (const managed of MANAGED_HOOKS) {
152
+ const list = grouped.get(managed.event);
153
+ if (list) list.push(managed);
154
+ else grouped.set(managed.event, [managed]);
155
+ }
156
+
157
+ for (const [event, managedList] of grouped.entries()) {
158
+ const prior = Array.isArray(hooks[event]) ? hooks[event] : [];
159
+ const userEntries = prior.filter((entry) => !isAgileflowEntry(entry));
160
+ hooks[event] = [...managedList.map(buildEntry), ...userEntries];
161
+ }
162
+
163
+ next.hooks = hooks;
164
+ return next;
165
+ }
166
+
167
+ /**
168
+ * Remove AgileFlow-managed hook registrations from a config object.
169
+ * @param {object} existing
170
+ * @returns {object}
171
+ */
172
+ function unmanageHooks(existing) {
173
+ /** @type {Record<string, any>} */
174
+ const next = {
175
+ ...(existing && typeof existing === "object" && !Array.isArray(existing)
176
+ ? existing
177
+ : {}),
178
+ };
179
+
180
+ if (
181
+ next.features &&
182
+ typeof next.features === "object" &&
183
+ !Array.isArray(next.features)
184
+ ) {
185
+ const features = { ...next.features };
186
+ delete features.hooks;
187
+ delete features.collaboration_modes;
188
+ if (Object.keys(features).length) next.features = features;
189
+ else delete next.features;
190
+ }
191
+
192
+ if (
193
+ next.hooks &&
194
+ typeof next.hooks === "object" &&
195
+ !Array.isArray(next.hooks)
196
+ ) {
197
+ const hooks = { ...next.hooks };
198
+ for (const managed of MANAGED_HOOKS) {
199
+ if (!Array.isArray(hooks[managed.event])) continue;
200
+ const userEntries = hooks[managed.event].filter(
201
+ (entry) => !isAgileflowEntry(entry),
202
+ );
203
+ if (userEntries.length) hooks[managed.event] = userEntries;
204
+ else delete hooks[managed.event];
205
+ }
206
+ if (Object.keys(hooks).length) next.hooks = hooks;
207
+ else delete next.hooks;
208
+ }
209
+
210
+ return next;
211
+ }
212
+
213
+ /**
214
+ * @param {string} configPath
215
+ * @param {object} config
216
+ */
217
+ async function writeConfigAtomic(configPath, config) {
218
+ await fs.promises.mkdir(path.dirname(configPath), { recursive: true });
219
+ const tmp = path.join(
220
+ path.dirname(configPath),
221
+ `.${path.basename(configPath)}.tmp-${process.pid}-${Math.random().toString(36).slice(2, 10)}`,
222
+ );
223
+ const text = toml.stringify(config);
224
+ try {
225
+ await fs.promises.writeFile(tmp, text, "utf8");
226
+ await fs.promises.rename(tmp, configPath);
227
+ } catch (err) {
228
+ try {
229
+ await fs.promises.unlink(tmp);
230
+ } catch {
231
+ /* swallow */
232
+ }
233
+ throw err;
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Register the AgileFlow Codex hooks in `<projectRoot>/.codex/config.toml`.
239
+ *
240
+ * @param {string} projectRoot
241
+ * @returns {Promise<string>} absolute path to the written config
242
+ */
243
+ async function writeCodexConfig(projectRoot) {
244
+ const configPath = path.join(projectRoot, ".codex", "config.toml");
245
+ const existing = await readExisting(configPath);
246
+ const merged = mergeManagedHooks(existing);
247
+ await writeConfigAtomic(configPath, merged);
248
+ return configPath;
249
+ }
250
+
251
+ /**
252
+ * Remove AgileFlow-managed Codex hook registrations.
253
+ *
254
+ * @param {string} projectRoot
255
+ * @returns {Promise<string|null>} path removed/updated, or null when absent
256
+ */
257
+ async function removeCodexConfig(projectRoot) {
258
+ const configPath = path.join(projectRoot, ".codex", "config.toml");
259
+ let existing;
260
+ try {
261
+ existing = await readExisting(configPath);
262
+ } catch (err) {
263
+ if (err.code === "ENOENT") return null;
264
+ throw err;
265
+ }
266
+
267
+ const stripped = unmanageHooks(existing);
268
+ if (Object.keys(stripped).length === 0) {
269
+ try {
270
+ await fs.promises.unlink(configPath);
271
+ } catch (err) {
272
+ if (err.code === "ENOENT") return null;
273
+ throw err;
274
+ }
275
+ return configPath;
276
+ }
277
+
278
+ await writeConfigAtomic(configPath, stripped);
279
+ return configPath;
280
+ }
281
+
282
+ module.exports = {
283
+ DEFAULT_APPROVAL_POLICY,
284
+ DEFAULT_SANDBOX_MODE,
285
+ HOOK_COMMAND_MARKER,
286
+ HOOK_TIMEOUT_SECONDS,
287
+ MANAGED_HOOKS,
288
+ buildEntry,
289
+ isAgileflowEntry,
290
+ mergeManagedHooks,
291
+ unmanageHooks,
292
+ readExisting,
293
+ writeCodexConfig,
294
+ removeCodexConfig,
295
+ };