devflow-kit 0.9.0 → 1.1.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 (414) hide show
  1. package/CHANGELOG.md +197 -29
  2. package/LICENSE +1 -1
  3. package/README.md +185 -309
  4. package/dist/cli.js +7 -1
  5. package/dist/commands/ambient.d.ts +18 -0
  6. package/dist/commands/ambient.js +136 -0
  7. package/dist/commands/init.d.ts +23 -0
  8. package/dist/commands/init.js +393 -571
  9. package/dist/commands/list.d.ts +3 -0
  10. package/dist/commands/list.js +20 -0
  11. package/dist/commands/memory.d.ts +22 -0
  12. package/dist/commands/memory.js +175 -0
  13. package/dist/commands/uninstall.d.ts +10 -0
  14. package/dist/commands/uninstall.js +418 -78
  15. package/dist/plugins.d.ts +46 -0
  16. package/dist/plugins.js +169 -0
  17. package/dist/utils/cli.d.ts +5 -0
  18. package/dist/utils/cli.js +14 -0
  19. package/dist/utils/installer.d.ts +41 -0
  20. package/dist/utils/installer.js +177 -0
  21. package/dist/utils/paths.d.ts +10 -0
  22. package/dist/utils/paths.js +23 -3
  23. package/dist/utils/post-install.d.ts +80 -0
  24. package/dist/utils/post-install.js +508 -0
  25. package/dist/utils/safe-delete-install.d.ts +29 -0
  26. package/dist/utils/safe-delete-install.js +191 -0
  27. package/dist/utils/safe-delete.d.ts +12 -0
  28. package/dist/utils/safe-delete.js +83 -0
  29. package/package.json +18 -8
  30. package/plugins/devflow-ambient/.claude-plugin/plugin.json +7 -0
  31. package/plugins/devflow-ambient/README.md +49 -0
  32. package/plugins/devflow-ambient/commands/ambient.md +110 -0
  33. package/plugins/devflow-ambient/skills/ambient-router/SKILL.md +89 -0
  34. package/plugins/devflow-ambient/skills/ambient-router/references/skill-catalog.md +64 -0
  35. package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
  36. package/plugins/devflow-audit-claude/README.md +46 -0
  37. package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
  38. package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
  39. package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
  40. package/plugins/devflow-code-review/README.md +73 -0
  41. package/plugins/devflow-code-review/agents/git.md +272 -0
  42. package/plugins/devflow-code-review/agents/reviewer.md +119 -0
  43. package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
  44. package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
  45. package/plugins/devflow-code-review/commands/code-review.md +141 -0
  46. package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
  47. package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
  48. package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
  49. package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
  50. package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
  51. package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
  52. package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
  53. package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
  54. package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
  55. package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
  56. package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
  57. package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
  58. package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
  59. package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
  60. package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
  61. package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
  62. package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
  63. package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
  64. package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
  65. package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
  66. package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
  67. package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
  68. package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
  69. package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
  70. package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
  71. package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
  72. package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
  73. package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
  74. package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
  75. package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
  76. package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
  77. package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
  78. package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
  79. package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
  80. package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
  81. package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
  82. package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
  83. package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
  84. package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
  85. package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
  86. package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
  87. package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
  88. package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
  89. package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
  90. package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
  91. package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
  92. package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
  93. package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
  94. package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
  95. package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
  96. package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
  97. package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
  98. package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
  99. package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
  100. package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
  101. package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
  102. package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
  103. package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
  104. package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
  105. package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
  106. package/plugins/devflow-core-skills/.claude-plugin/plugin.json +28 -0
  107. package/plugins/devflow-core-skills/README.md +50 -0
  108. package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
  109. package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
  110. package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
  111. package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
  112. package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
  113. package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
  114. package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
  115. package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
  116. package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
  117. package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
  118. package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +138 -0
  119. package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
  120. package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
  121. package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
  122. package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
  123. package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
  124. package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
  125. package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
  126. package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
  127. package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
  128. package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
  129. package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
  130. package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
  131. package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
  132. package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
  133. package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
  134. package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
  135. package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
  136. package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
  137. package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
  138. package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
  139. package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
  140. package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
  141. package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
  142. package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
  143. package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
  144. package/plugins/devflow-core-skills/skills/test-driven-development/SKILL.md +139 -0
  145. package/plugins/devflow-core-skills/skills/test-driven-development/references/rationalization-prevention.md +111 -0
  146. package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
  147. package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
  148. package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
  149. package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
  150. package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
  151. package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
  152. package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
  153. package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
  154. package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
  155. package/plugins/devflow-debug/README.md +65 -0
  156. package/plugins/devflow-debug/agents/git.md +272 -0
  157. package/plugins/devflow-debug/commands/debug-teams.md +231 -0
  158. package/plugins/devflow-debug/commands/debug.md +160 -0
  159. package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
  160. package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
  161. package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
  162. package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
  163. package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
  164. package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
  165. package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
  166. package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
  167. package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
  168. package/plugins/devflow-implement/README.md +71 -0
  169. package/plugins/devflow-implement/agents/coder.md +122 -0
  170. package/plugins/devflow-implement/agents/git.md +272 -0
  171. package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
  172. package/plugins/devflow-implement/agents/shepherd.md +94 -0
  173. package/plugins/devflow-implement/agents/simplifier.md +62 -0
  174. package/plugins/devflow-implement/agents/skimmer.md +88 -0
  175. package/plugins/devflow-implement/agents/synthesizer.md +204 -0
  176. package/plugins/devflow-implement/agents/validator.md +86 -0
  177. package/plugins/devflow-implement/commands/implement-teams.md +608 -0
  178. package/plugins/devflow-implement/commands/implement.md +426 -0
  179. package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
  180. package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
  181. package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
  182. package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
  183. package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
  184. package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
  185. package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
  186. package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
  187. package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
  188. package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
  189. package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
  190. package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
  191. package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
  192. package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
  193. package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
  194. package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
  195. package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
  196. package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
  197. package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
  198. package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
  199. package/plugins/devflow-resolve/README.md +65 -0
  200. package/plugins/devflow-resolve/agents/git.md +272 -0
  201. package/plugins/devflow-resolve/agents/resolver.md +131 -0
  202. package/plugins/devflow-resolve/agents/simplifier.md +62 -0
  203. package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
  204. package/plugins/devflow-resolve/commands/resolve.md +237 -0
  205. package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
  206. package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
  207. package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
  208. package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
  209. package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
  210. package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
  211. package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
  212. package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
  213. package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
  214. package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
  215. package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
  216. package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
  217. package/plugins/devflow-self-review/README.md +38 -0
  218. package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
  219. package/plugins/devflow-self-review/agents/simplifier.md +62 -0
  220. package/plugins/devflow-self-review/agents/validator.md +86 -0
  221. package/plugins/devflow-self-review/commands/self-review.md +126 -0
  222. package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
  223. package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
  224. package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
  225. package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
  226. package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
  227. package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
  228. package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
  229. package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
  230. package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
  231. package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
  232. package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
  233. package/plugins/devflow-specify/README.md +46 -0
  234. package/plugins/devflow-specify/agents/skimmer.md +88 -0
  235. package/plugins/devflow-specify/agents/synthesizer.md +204 -0
  236. package/plugins/devflow-specify/commands/specify-teams.md +314 -0
  237. package/plugins/devflow-specify/commands/specify.md +179 -0
  238. package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
  239. package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
  240. package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
  241. package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
  242. package/scripts/hooks/ambient-prompt.sh +48 -0
  243. package/scripts/hooks/background-memory-update.sh +208 -0
  244. package/scripts/hooks/ensure-memory-gitignore.sh +17 -0
  245. package/scripts/hooks/pre-compact-memory.sh +87 -0
  246. package/scripts/hooks/session-start-memory.sh +126 -0
  247. package/scripts/hooks/stop-update-memory.sh +85 -0
  248. package/shared/agents/coder.md +122 -0
  249. package/shared/agents/git.md +272 -0
  250. package/shared/agents/resolver.md +131 -0
  251. package/shared/agents/reviewer.md +119 -0
  252. package/shared/agents/scrutinizer.md +80 -0
  253. package/shared/agents/shepherd.md +94 -0
  254. package/shared/agents/simplifier.md +62 -0
  255. package/shared/agents/skimmer.md +88 -0
  256. package/shared/agents/synthesizer.md +204 -0
  257. package/shared/agents/validator.md +86 -0
  258. package/shared/skills/accessibility/SKILL.md +229 -0
  259. package/shared/skills/accessibility/references/detection.md +171 -0
  260. package/shared/skills/accessibility/references/patterns.md +670 -0
  261. package/shared/skills/accessibility/references/violations.md +419 -0
  262. package/shared/skills/agent-teams/SKILL.md +124 -0
  263. package/shared/skills/agent-teams/references/cleanup.md +104 -0
  264. package/shared/skills/agent-teams/references/communication.md +122 -0
  265. package/shared/skills/agent-teams/references/team-patterns.md +217 -0
  266. package/shared/skills/ambient-router/SKILL.md +89 -0
  267. package/shared/skills/ambient-router/references/skill-catalog.md +64 -0
  268. package/shared/skills/architecture-patterns/SKILL.md +153 -0
  269. package/shared/skills/architecture-patterns/references/detection.md +337 -0
  270. package/shared/skills/architecture-patterns/references/patterns.md +873 -0
  271. package/shared/skills/architecture-patterns/references/violations.md +575 -0
  272. package/shared/skills/complexity-patterns/SKILL.md +143 -0
  273. package/shared/skills/complexity-patterns/references/detection.md +264 -0
  274. package/shared/skills/complexity-patterns/references/patterns.md +487 -0
  275. package/shared/skills/complexity-patterns/references/violations.md +361 -0
  276. package/shared/skills/consistency-patterns/SKILL.md +140 -0
  277. package/shared/skills/consistency-patterns/references/detection.md +207 -0
  278. package/shared/skills/consistency-patterns/references/patterns.md +202 -0
  279. package/shared/skills/consistency-patterns/references/violations.md +213 -0
  280. package/shared/skills/core-patterns/SKILL.md +162 -0
  281. package/shared/skills/core-patterns/references/checklist.md +276 -0
  282. package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
  283. package/shared/skills/core-patterns/references/detection.md +303 -0
  284. package/shared/skills/core-patterns/references/patterns.md +576 -0
  285. package/shared/skills/core-patterns/references/violations.md +369 -0
  286. package/shared/skills/database-patterns/SKILL.md +134 -0
  287. package/shared/skills/database-patterns/references/detection.md +208 -0
  288. package/shared/skills/database-patterns/references/patterns.md +394 -0
  289. package/shared/skills/database-patterns/references/violations.md +332 -0
  290. package/shared/skills/dependencies-patterns/SKILL.md +141 -0
  291. package/shared/skills/dependencies-patterns/references/detection.md +181 -0
  292. package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
  293. package/shared/skills/dependencies-patterns/references/violations.md +247 -0
  294. package/shared/skills/docs-framework/SKILL.md +138 -0
  295. package/shared/skills/docs-framework/references/patterns.md +346 -0
  296. package/shared/skills/docs-framework/references/violations.md +221 -0
  297. package/shared/skills/documentation-patterns/SKILL.md +125 -0
  298. package/shared/skills/documentation-patterns/references/detection.md +190 -0
  299. package/shared/skills/documentation-patterns/references/patterns.md +189 -0
  300. package/shared/skills/documentation-patterns/references/violations.md +163 -0
  301. package/shared/skills/frontend-design/SKILL.md +254 -0
  302. package/shared/skills/frontend-design/references/detection.md +184 -0
  303. package/shared/skills/frontend-design/references/patterns.md +511 -0
  304. package/shared/skills/frontend-design/references/violations.md +453 -0
  305. package/shared/skills/git-safety/SKILL.md +122 -0
  306. package/shared/skills/git-safety/references/detection.md +290 -0
  307. package/shared/skills/git-safety/references/patterns.md +289 -0
  308. package/shared/skills/git-safety/references/violations.md +18 -0
  309. package/shared/skills/git-workflow/SKILL.md +158 -0
  310. package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
  311. package/shared/skills/git-workflow/references/commit-violations.md +77 -0
  312. package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
  313. package/shared/skills/git-workflow/references/pr-violations.md +96 -0
  314. package/shared/skills/github-patterns/SKILL.md +153 -0
  315. package/shared/skills/github-patterns/references/patterns.md +572 -0
  316. package/shared/skills/github-patterns/references/violations.md +298 -0
  317. package/shared/skills/implementation-patterns/SKILL.md +162 -0
  318. package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
  319. package/shared/skills/implementation-patterns/references/violations.md +483 -0
  320. package/shared/skills/input-validation/SKILL.md +148 -0
  321. package/shared/skills/input-validation/references/detection.md +283 -0
  322. package/shared/skills/input-validation/references/patterns.md +361 -0
  323. package/shared/skills/input-validation/references/violations.md +224 -0
  324. package/shared/skills/performance-patterns/SKILL.md +154 -0
  325. package/shared/skills/performance-patterns/references/detection.md +351 -0
  326. package/shared/skills/performance-patterns/references/patterns.md +503 -0
  327. package/shared/skills/performance-patterns/references/violations.md +354 -0
  328. package/shared/skills/react/SKILL.md +276 -0
  329. package/shared/skills/react/references/patterns.md +1331 -0
  330. package/shared/skills/react/references/violations.md +565 -0
  331. package/shared/skills/regression-patterns/SKILL.md +146 -0
  332. package/shared/skills/regression-patterns/references/detection.md +237 -0
  333. package/shared/skills/regression-patterns/references/patterns.md +226 -0
  334. package/shared/skills/regression-patterns/references/violations.md +225 -0
  335. package/shared/skills/review-methodology/SKILL.md +119 -0
  336. package/shared/skills/review-methodology/references/patterns.md +186 -0
  337. package/shared/skills/review-methodology/references/report-template.md +142 -0
  338. package/shared/skills/review-methodology/references/violations.md +125 -0
  339. package/shared/skills/security-patterns/SKILL.md +156 -0
  340. package/shared/skills/security-patterns/references/detection.md +287 -0
  341. package/shared/skills/security-patterns/references/patterns.md +507 -0
  342. package/shared/skills/security-patterns/references/violations.md +237 -0
  343. package/shared/skills/self-review/SKILL.md +149 -0
  344. package/shared/skills/self-review/references/patterns.md +405 -0
  345. package/shared/skills/self-review/references/report-template.md +253 -0
  346. package/shared/skills/self-review/references/violations.md +308 -0
  347. package/shared/skills/test-driven-development/SKILL.md +139 -0
  348. package/shared/skills/test-driven-development/references/rationalization-prevention.md +111 -0
  349. package/shared/skills/test-patterns/SKILL.md +183 -0
  350. package/shared/skills/test-patterns/references/detection.md +149 -0
  351. package/shared/skills/test-patterns/references/patterns.md +220 -0
  352. package/shared/skills/test-patterns/references/report-template.md +108 -0
  353. package/shared/skills/test-patterns/references/violations.md +221 -0
  354. package/shared/skills/typescript/SKILL.md +176 -0
  355. package/shared/skills/typescript/references/patterns.md +1105 -0
  356. package/shared/skills/typescript/references/violations.md +433 -0
  357. package/src/templates/claudeignore.template +188 -0
  358. package/src/templates/managed-settings.json +160 -0
  359. package/src/templates/settings.json +59 -0
  360. package/dist/cli.d.ts.map +0 -1
  361. package/dist/cli.js.map +0 -1
  362. package/dist/commands/init.d.ts.map +0 -1
  363. package/dist/commands/init.js.map +0 -1
  364. package/dist/commands/uninstall.d.ts.map +0 -1
  365. package/dist/commands/uninstall.js.map +0 -1
  366. package/dist/utils/git.d.ts.map +0 -1
  367. package/dist/utils/git.js.map +0 -1
  368. package/dist/utils/paths.d.ts.map +0 -1
  369. package/dist/utils/paths.js.map +0 -1
  370. package/src/claude/CLAUDE.md +0 -400
  371. package/src/claude/agents/devflow/audit-architecture.md +0 -132
  372. package/src/claude/agents/devflow/audit-complexity.md +0 -132
  373. package/src/claude/agents/devflow/audit-database.md +0 -132
  374. package/src/claude/agents/devflow/audit-dependencies.md +0 -132
  375. package/src/claude/agents/devflow/audit-documentation.md +0 -132
  376. package/src/claude/agents/devflow/audit-performance.md +0 -256
  377. package/src/claude/agents/devflow/audit-security.md +0 -259
  378. package/src/claude/agents/devflow/audit-tests.md +0 -132
  379. package/src/claude/agents/devflow/audit-typescript.md +0 -132
  380. package/src/claude/agents/devflow/brainstorm.md +0 -279
  381. package/src/claude/agents/devflow/catch-up.md +0 -345
  382. package/src/claude/agents/devflow/code-review.md +0 -307
  383. package/src/claude/agents/devflow/commit.md +0 -380
  384. package/src/claude/agents/devflow/debug.md +0 -476
  385. package/src/claude/agents/devflow/design.md +0 -491
  386. package/src/claude/agents/devflow/get-issue.md +0 -286
  387. package/src/claude/agents/devflow/pr-comments.md +0 -285
  388. package/src/claude/agents/devflow/project-state.md +0 -419
  389. package/src/claude/agents/devflow/pull-request.md +0 -493
  390. package/src/claude/agents/devflow/release.md +0 -1137
  391. package/src/claude/agents/devflow/tech-debt.md +0 -338
  392. package/src/claude/commands/devflow/brainstorm.md +0 -68
  393. package/src/claude/commands/devflow/breakdown.md +0 -125
  394. package/src/claude/commands/devflow/catch-up.md +0 -29
  395. package/src/claude/commands/devflow/code-review.md +0 -237
  396. package/src/claude/commands/devflow/commit.md +0 -17
  397. package/src/claude/commands/devflow/debug.md +0 -56
  398. package/src/claude/commands/devflow/design.md +0 -82
  399. package/src/claude/commands/devflow/devlog.md +0 -408
  400. package/src/claude/commands/devflow/get-issue.md +0 -16
  401. package/src/claude/commands/devflow/implement.md +0 -100
  402. package/src/claude/commands/devflow/plan.md +0 -223
  403. package/src/claude/commands/devflow/pull-request.md +0 -20
  404. package/src/claude/commands/devflow/release.md +0 -251
  405. package/src/claude/commands/devflow/resolve-comments.md +0 -583
  406. package/src/claude/scripts/statusline.sh +0 -47
  407. package/src/claude/settings.json +0 -6
  408. package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
  409. package/src/claude/skills/devflow/debug/SKILL.md +0 -119
  410. package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
  411. package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
  412. package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
  413. package/src/claude/skills/devflow/research/SKILL.md +0 -138
  414. package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
@@ -0,0 +1,508 @@
1
+ import { promises as fs, writeFileSync, unlinkSync } from 'fs';
2
+ import { execSync } from 'child_process';
3
+ import * as path from 'path';
4
+ import * as p from '@clack/prompts';
5
+ import { getManagedSettingsPath } from './paths.js';
6
+ function isNodeSystemError(error) {
7
+ return (error instanceof Error &&
8
+ 'code' in error &&
9
+ typeof error.code === 'string');
10
+ }
11
+ /**
12
+ * Replace ${DEVFLOW_DIR} placeholders in a settings template.
13
+ */
14
+ export function substituteSettingsTemplate(template, devflowDir) {
15
+ return template.replace(/\$\{DEVFLOW_DIR\}/g, devflowDir);
16
+ }
17
+ /**
18
+ * Add Agent Teams configuration to settings JSON.
19
+ * Sets teammateMode and CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS env var.
20
+ */
21
+ export function applyTeamsConfig(settingsJson) {
22
+ const settings = JSON.parse(settingsJson);
23
+ settings.teammateMode = 'auto';
24
+ if (!settings.env) {
25
+ settings.env = {};
26
+ }
27
+ settings.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS = '1';
28
+ return JSON.stringify(settings, null, 2) + '\n';
29
+ }
30
+ /**
31
+ * Remove Agent Teams configuration from settings JSON.
32
+ * Strips teammateMode and CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS env var.
33
+ */
34
+ export function stripTeamsConfig(settingsJson) {
35
+ const settings = JSON.parse(settingsJson);
36
+ delete settings.teammateMode;
37
+ if (settings.env) {
38
+ delete settings.env.CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS;
39
+ if (Object.keys(settings.env).length === 0) {
40
+ delete settings.env;
41
+ }
42
+ }
43
+ return JSON.stringify(settings, null, 2) + '\n';
44
+ }
45
+ /**
46
+ * Compute which entries need appending to a .gitignore file.
47
+ * Returns only entries not already present.
48
+ */
49
+ export function computeGitignoreAppend(existingContent, entries) {
50
+ const existingLines = existingContent.split('\n').map(l => l.trim());
51
+ return entries.filter(entry => !existingLines.includes(entry));
52
+ }
53
+ /**
54
+ * Merge DevFlow deny entries into an existing managed settings object.
55
+ * Preserves existing entries, deduplicates, and returns the merged JSON string.
56
+ */
57
+ export function mergeDenyList(existingJson, newDenyEntries) {
58
+ const existing = JSON.parse(existingJson);
59
+ const currentDeny = existing.permissions?.deny ?? [];
60
+ const merged = [...new Set([...currentDeny, ...newDenyEntries])];
61
+ existing.permissions = { ...existing.permissions, deny: merged };
62
+ return JSON.stringify(existing, null, 2) + '\n';
63
+ }
64
+ /**
65
+ * Attempt to install managed settings (security deny list) to the system path.
66
+ * Managed settings have highest precedence in Claude Code and cannot be overridden.
67
+ *
68
+ * Strategy:
69
+ * 1. Try direct write (works if running as root or directory is writable)
70
+ * 2. If EACCES in TTY, offer to retry with sudo
71
+ * 3. Returns true if managed settings were written, false if caller should fall back
72
+ */
73
+ export async function installManagedSettings(rootDir, verbose) {
74
+ let managedPath;
75
+ try {
76
+ managedPath = getManagedSettingsPath();
77
+ }
78
+ catch {
79
+ return false; // Unsupported platform
80
+ }
81
+ const managedDir = path.dirname(managedPath);
82
+ const sourceManaged = path.join(rootDir, 'src', 'templates', 'managed-settings.json');
83
+ let newDenyEntries;
84
+ try {
85
+ const template = JSON.parse(await fs.readFile(sourceManaged, 'utf-8'));
86
+ newDenyEntries = template.permissions?.deny ?? [];
87
+ }
88
+ catch {
89
+ if (verbose) {
90
+ p.log.warn('Could not read managed settings template');
91
+ }
92
+ return false;
93
+ }
94
+ // Build the content to write (merge with existing if present)
95
+ let content;
96
+ try {
97
+ const existing = await fs.readFile(managedPath, 'utf-8');
98
+ content = mergeDenyList(existing, newDenyEntries);
99
+ }
100
+ catch {
101
+ // File doesn't exist — use template as-is
102
+ content = JSON.stringify({ permissions: { deny: newDenyEntries } }, null, 2) + '\n';
103
+ }
104
+ // Attempt 1: direct write
105
+ try {
106
+ await fs.mkdir(managedDir, { recursive: true });
107
+ await fs.writeFile(managedPath, content, 'utf-8');
108
+ if (verbose) {
109
+ p.log.success(`Managed settings written to ${managedPath}`);
110
+ }
111
+ return true;
112
+ }
113
+ catch (error) {
114
+ if (!isNodeSystemError(error) || error.code !== 'EACCES') {
115
+ if (verbose) {
116
+ p.log.warn(`Could not write managed settings: ${error}`);
117
+ }
118
+ return false;
119
+ }
120
+ }
121
+ // Attempt 2: sudo (TTY only)
122
+ if (!process.stdin.isTTY) {
123
+ return false;
124
+ }
125
+ const confirmed = await p.confirm({
126
+ message: `Managed settings require admin access (${managedDir}). Use sudo?`,
127
+ initialValue: true,
128
+ });
129
+ if (p.isCancel(confirmed) || !confirmed) {
130
+ return false;
131
+ }
132
+ try {
133
+ execSync(`sudo mkdir -p '${managedDir}'`, { stdio: 'inherit' });
134
+ // Write via sudo tee to avoid shell quoting issues with the JSON content
135
+ const tmpFile = path.join(rootDir, '.managed-settings-tmp.json');
136
+ await fs.writeFile(tmpFile, content, 'utf-8');
137
+ execSync(`sudo cp '${tmpFile}' '${managedPath}'`, { stdio: 'inherit' });
138
+ await fs.rm(tmpFile, { force: true });
139
+ if (verbose) {
140
+ p.log.success(`Managed settings written to ${managedPath} (via sudo)`);
141
+ }
142
+ return true;
143
+ }
144
+ catch (error) {
145
+ if (verbose) {
146
+ p.log.warn(`sudo write failed: ${error}`);
147
+ }
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * Remove DevFlow deny entries from managed settings.
153
+ * If only DevFlow entries remain, deletes the file entirely.
154
+ *
155
+ * Mirrors installManagedSettings strategy:
156
+ * 1. Try direct write/delete
157
+ * 2. If EACCES and TTY, ask user before sudo
158
+ * 3. Non-TTY: return false (caller logs preservation message)
159
+ */
160
+ export async function removeManagedSettings(rootDir, verbose) {
161
+ let managedPath;
162
+ try {
163
+ managedPath = getManagedSettingsPath();
164
+ }
165
+ catch {
166
+ return false;
167
+ }
168
+ let existingContent;
169
+ try {
170
+ existingContent = await fs.readFile(managedPath, 'utf-8');
171
+ }
172
+ catch {
173
+ return false; // File doesn't exist
174
+ }
175
+ // Load our deny entries to identify which to remove
176
+ const sourceManaged = path.join(rootDir, 'src', 'templates', 'managed-settings.json');
177
+ let devflowDenyEntries;
178
+ try {
179
+ const template = JSON.parse(await fs.readFile(sourceManaged, 'utf-8'));
180
+ devflowDenyEntries = template.permissions?.deny ?? [];
181
+ }
182
+ catch {
183
+ return false;
184
+ }
185
+ const existing = JSON.parse(existingContent);
186
+ const currentDeny = existing.permissions?.deny ?? [];
187
+ const devflowSet = new Set(devflowDenyEntries);
188
+ const remaining = currentDeny.filter(entry => !devflowSet.has(entry));
189
+ // Determine the target action: delete file entirely or write updated content
190
+ let shouldDelete = false;
191
+ let updatedContent = null;
192
+ if (remaining.length === 0) {
193
+ const otherKeys = Object.keys(existing).filter(k => k !== 'permissions');
194
+ const hasOtherPermissions = existing.permissions &&
195
+ Object.keys(existing.permissions).filter(k => k !== 'deny').length > 0;
196
+ if (otherKeys.length === 0 && !hasOtherPermissions) {
197
+ shouldDelete = true;
198
+ }
199
+ else {
200
+ delete existing.permissions.deny;
201
+ if (Object.keys(existing.permissions).length === 0) {
202
+ delete existing.permissions;
203
+ }
204
+ updatedContent = JSON.stringify(existing, null, 2) + '\n';
205
+ }
206
+ }
207
+ else {
208
+ existing.permissions.deny = remaining;
209
+ updatedContent = JSON.stringify(existing, null, 2) + '\n';
210
+ }
211
+ // Attempt 1: direct write/delete
212
+ try {
213
+ if (shouldDelete) {
214
+ unlinkSync(managedPath);
215
+ }
216
+ else {
217
+ writeFileSync(managedPath, updatedContent, 'utf-8');
218
+ }
219
+ if (verbose) {
220
+ p.log.success(shouldDelete ? 'Managed settings file removed' : 'DevFlow deny entries removed from managed settings');
221
+ }
222
+ return true;
223
+ }
224
+ catch (error) {
225
+ if (!isNodeSystemError(error) || error.code !== 'EACCES') {
226
+ if (verbose) {
227
+ p.log.warn(`Could not update managed settings: ${error}`);
228
+ }
229
+ return false;
230
+ }
231
+ }
232
+ // Attempt 2: sudo (TTY only, with explicit consent)
233
+ if (!process.stdin.isTTY) {
234
+ return false;
235
+ }
236
+ const managedDir = path.dirname(managedPath);
237
+ const confirmed = await p.confirm({
238
+ message: `Managed settings cleanup requires admin access (${managedDir}). Use sudo?`,
239
+ initialValue: true,
240
+ });
241
+ if (p.isCancel(confirmed) || !confirmed) {
242
+ return false;
243
+ }
244
+ try {
245
+ if (shouldDelete) {
246
+ execSync(`sudo rm '${managedPath}'`, { stdio: 'inherit' });
247
+ }
248
+ else {
249
+ const tmpFile = path.join(rootDir, '.managed-settings-tmp.json');
250
+ await fs.writeFile(tmpFile, updatedContent, 'utf-8');
251
+ execSync(`sudo cp '${tmpFile}' '${managedPath}'`, { stdio: 'inherit' });
252
+ await fs.rm(tmpFile, { force: true });
253
+ }
254
+ if (verbose) {
255
+ p.log.success(shouldDelete ? 'Managed settings file removed' : 'DevFlow deny entries removed from managed settings');
256
+ }
257
+ return true;
258
+ }
259
+ catch (error) {
260
+ if (verbose) {
261
+ p.log.warn(`sudo cleanup failed: ${error}`);
262
+ }
263
+ return false;
264
+ }
265
+ }
266
+ /**
267
+ * Install or update settings.json with DevFlow configuration.
268
+ * Prompts interactively in TTY mode when settings already exist.
269
+ * In non-TTY mode, skips override (safe default).
270
+ *
271
+ * When securityMode is 'managed', the deny list goes to system-level managed
272
+ * settings and is excluded from user settings.json. When 'user', the deny list
273
+ * is included in settings.json (original behavior).
274
+ */
275
+ export async function installSettings(claudeDir, rootDir, devflowDir, verbose, teamsEnabled = false, securityMode = 'user') {
276
+ const settingsPath = path.join(claudeDir, 'settings.json');
277
+ const sourceSettingsPath = path.join(rootDir, 'src', 'templates', 'settings.json');
278
+ try {
279
+ const settingsTemplate = await fs.readFile(sourceSettingsPath, 'utf-8');
280
+ let settingsContent = substituteSettingsTemplate(settingsTemplate, devflowDir);
281
+ // When securityMode is 'user', inject deny list from managed-settings template
282
+ if (securityMode === 'user') {
283
+ const managedTemplatePath = path.join(rootDir, 'src', 'templates', 'managed-settings.json');
284
+ try {
285
+ const managedTemplate = JSON.parse(await fs.readFile(managedTemplatePath, 'utf-8'));
286
+ const settings = JSON.parse(settingsContent);
287
+ settings.permissions = managedTemplate.permissions;
288
+ settingsContent = JSON.stringify(settings, null, 2) + '\n';
289
+ }
290
+ catch {
291
+ if (verbose) {
292
+ p.log.warn('Could not load security deny list — settings will be written without it');
293
+ }
294
+ }
295
+ }
296
+ if (!teamsEnabled) {
297
+ settingsContent = stripTeamsConfig(settingsContent);
298
+ }
299
+ let settingsExists = false;
300
+ try {
301
+ await fs.access(settingsPath);
302
+ settingsExists = true;
303
+ }
304
+ catch {
305
+ settingsExists = false;
306
+ }
307
+ if (!settingsExists) {
308
+ await fs.writeFile(settingsPath, settingsContent, 'utf-8');
309
+ if (verbose) {
310
+ p.log.success('Settings configured');
311
+ }
312
+ return;
313
+ }
314
+ // Settings exist — check if they already have hooks
315
+ let hasHooks = false;
316
+ try {
317
+ const existing = JSON.parse(await fs.readFile(settingsPath, 'utf-8'));
318
+ hasHooks = !!existing.hooks;
319
+ }
320
+ catch { /* parse error = treat as no hooks */ }
321
+ if (hasHooks) {
322
+ const existing = await fs.readFile(settingsPath, 'utf-8');
323
+ const updated = teamsEnabled
324
+ ? applyTeamsConfig(existing)
325
+ : stripTeamsConfig(existing);
326
+ await fs.writeFile(settingsPath, updated, 'utf-8');
327
+ if (verbose) {
328
+ p.log.info(`Settings updated (teams ${teamsEnabled ? 'enabled' : 'disabled'})`);
329
+ }
330
+ return;
331
+ }
332
+ // Settings exist without hooks — prompt in TTY, warn in non-TTY
333
+ if (process.stdin.isTTY) {
334
+ const confirmed = await p.confirm({
335
+ message: 'settings.json exists without hooks (Working Memory needs hooks). Override?',
336
+ initialValue: true,
337
+ });
338
+ if (p.isCancel(confirmed)) {
339
+ p.cancel('Installation cancelled.');
340
+ process.exit(0);
341
+ }
342
+ if (confirmed) {
343
+ await fs.writeFile(settingsPath, settingsContent, 'utf-8');
344
+ p.log.success('Settings overridden');
345
+ }
346
+ else {
347
+ p.log.info('Keeping existing settings');
348
+ }
349
+ }
350
+ else {
351
+ p.log.warn('Settings exist without hooks. Working Memory requires hooks.');
352
+ p.log.info('Re-run interactively to configure, or manually add hooks to settings.json');
353
+ }
354
+ }
355
+ catch (error) {
356
+ if (verbose) {
357
+ p.log.warn(`Could not configure settings: ${error}`);
358
+ }
359
+ }
360
+ }
361
+ /**
362
+ * Create .claudeignore in git repository root (skip if already exists).
363
+ */
364
+ export async function installClaudeignore(gitRoot, rootDir, verbose) {
365
+ const claudeignorePath = path.join(gitRoot, '.claudeignore');
366
+ const claudeignoreTemplatePath = path.join(rootDir, 'src', 'templates', 'claudeignore.template');
367
+ try {
368
+ const claudeignoreContent = await fs.readFile(claudeignoreTemplatePath, 'utf-8');
369
+ await fs.writeFile(claudeignorePath, claudeignoreContent, { encoding: 'utf-8', flag: 'wx' });
370
+ if (verbose) {
371
+ p.log.success('.claudeignore created');
372
+ }
373
+ }
374
+ catch (error) {
375
+ if (isNodeSystemError(error) && error.code === 'EEXIST') {
376
+ // Already exists, skip silently
377
+ }
378
+ else if (verbose) {
379
+ p.log.warn(`Could not create .claudeignore: ${error}`);
380
+ }
381
+ }
382
+ }
383
+ /**
384
+ * Update .gitignore with DevFlow entries (for local scope installs).
385
+ */
386
+ export async function updateGitignore(gitRoot, verbose) {
387
+ try {
388
+ const gitignorePath = path.join(gitRoot, '.gitignore');
389
+ const entriesToAdd = ['.claude/', '.devflow/', '.memory/', '.docs/'];
390
+ let gitignoreContent = '';
391
+ try {
392
+ gitignoreContent = await fs.readFile(gitignorePath, 'utf-8');
393
+ }
394
+ catch { /* doesn't exist */ }
395
+ const linesToAdd = computeGitignoreAppend(gitignoreContent, entriesToAdd);
396
+ if (linesToAdd.length > 0) {
397
+ const newContent = gitignoreContent
398
+ ? `${gitignoreContent.trimEnd()}\n\n# DevFlow local installation\n${linesToAdd.join('\n')}\n`
399
+ : `# DevFlow local installation\n${linesToAdd.join('\n')}\n`;
400
+ await fs.writeFile(gitignorePath, newContent, 'utf-8');
401
+ if (verbose) {
402
+ p.log.success('.gitignore updated');
403
+ }
404
+ }
405
+ }
406
+ catch (error) {
407
+ if (verbose) {
408
+ p.log.warn(`Could not update .gitignore: ${error instanceof Error ? error.message : error}`);
409
+ }
410
+ }
411
+ }
412
+ /**
413
+ * Create .docs/ directory structure for DevFlow artifacts.
414
+ */
415
+ export async function createDocsStructure(verbose) {
416
+ const docsDir = path.join(process.cwd(), '.docs');
417
+ try {
418
+ await fs.mkdir(path.join(docsDir, 'status', 'compact'), { recursive: true });
419
+ await fs.mkdir(path.join(docsDir, 'reviews'), { recursive: true });
420
+ await fs.mkdir(path.join(docsDir, 'releases'), { recursive: true });
421
+ if (verbose) {
422
+ p.log.success('.docs/ structure ready');
423
+ }
424
+ }
425
+ catch { /* may already exist */ }
426
+ }
427
+ /**
428
+ * Create .memory/ directory for working memory files.
429
+ * Separate from .docs/ which is for reviews/releases.
430
+ */
431
+ export async function createMemoryDir(verbose, cwd) {
432
+ const memoryDir = path.join(cwd ?? process.cwd(), '.memory');
433
+ try {
434
+ await fs.mkdir(memoryDir, { recursive: true });
435
+ if (verbose) {
436
+ p.log.success('.memory/ directory ready');
437
+ }
438
+ }
439
+ catch { /* may already exist */ }
440
+ }
441
+ /**
442
+ * Migrate memory files from .docs/ to .memory/.
443
+ * One-time migration for existing users. Skips if destination exists (no clobber).
444
+ * Also cleans up ephemeral files from .docs/.
445
+ * Returns count of migrated files.
446
+ */
447
+ export async function migrateMemoryFiles(verbose, cwd) {
448
+ const root = cwd ?? process.cwd();
449
+ const docsDir = path.join(root, '.docs');
450
+ const memoryDir = path.join(root, '.memory');
451
+ const migrations = [
452
+ { src: path.join(docsDir, 'WORKING-MEMORY.md'), dest: path.join(memoryDir, 'WORKING-MEMORY.md') },
453
+ { src: path.join(docsDir, 'patterns.md'), dest: path.join(memoryDir, 'PROJECT-PATTERNS.md') },
454
+ { src: path.join(docsDir, 'working-memory-backup.json'), dest: path.join(memoryDir, 'backup.json') },
455
+ ];
456
+ let migrated = 0;
457
+ for (const { src, dest } of migrations) {
458
+ try {
459
+ await fs.access(src);
460
+ }
461
+ catch {
462
+ continue; // Source doesn't exist
463
+ }
464
+ try {
465
+ await fs.access(dest);
466
+ continue; // Destination already exists — no clobber
467
+ }
468
+ catch {
469
+ // Destination doesn't exist — proceed with migration
470
+ }
471
+ try {
472
+ await fs.rename(src, dest);
473
+ migrated++;
474
+ }
475
+ catch {
476
+ // Cross-device or permission error — try copy+delete
477
+ try {
478
+ await fs.copyFile(src, dest);
479
+ await fs.rm(src, { force: true });
480
+ migrated++;
481
+ }
482
+ catch {
483
+ // Migration failed for this file — skip silently
484
+ }
485
+ }
486
+ }
487
+ // Clean up ephemeral files from .docs/
488
+ const ephemeralFiles = [
489
+ path.join(docsDir, '.working-memory-update.log'),
490
+ path.join(docsDir, '.working-memory-last-trigger'),
491
+ ];
492
+ for (const file of ephemeralFiles) {
493
+ try {
494
+ await fs.rm(file, { force: true });
495
+ }
496
+ catch { /* doesn't exist or can't remove */ }
497
+ }
498
+ // Clean up lock directory
499
+ try {
500
+ await fs.rmdir(path.join(docsDir, '.working-memory.lock'));
501
+ }
502
+ catch { /* doesn't exist or not empty */ }
503
+ if (migrated > 0 && verbose) {
504
+ p.log.success(`Migrated ${migrated} memory file(s) from .docs/ to .memory/`);
505
+ }
506
+ return migrated;
507
+ }
508
+ //# sourceMappingURL=post-install.js.map
@@ -0,0 +1,29 @@
1
+ import type { Shell } from './safe-delete.js';
2
+ /** Bump this when the safe-delete block changes. */
3
+ export declare const SAFE_DELETE_BLOCK_VERSION = 2;
4
+ /**
5
+ * Generate the safe-delete shell function block with markers.
6
+ * Returns null for unsupported shells.
7
+ */
8
+ export declare function generateSafeDeleteBlock(shell: Shell, platform: NodeJS.Platform, trashCommand: string | null): string | null;
9
+ /**
10
+ * Check if the safe-delete block is already installed in a profile file.
11
+ */
12
+ export declare function isAlreadyInstalled(profilePath: string): Promise<boolean>;
13
+ /**
14
+ * Append the safe-delete block to a profile file.
15
+ * Creates parent directories and the file if they don't exist.
16
+ */
17
+ export declare function installToProfile(profilePath: string, block: string): Promise<void>;
18
+ /**
19
+ * Extract the installed safe-delete block version from a profile file.
20
+ * Returns 0 (not installed), 1 (legacy block without version stamp), or N (versioned block).
21
+ */
22
+ export declare function getInstalledVersion(profilePath: string): Promise<number>;
23
+ /**
24
+ * Remove the safe-delete block from a profile file.
25
+ * Returns true if the block was found and removed, false otherwise.
26
+ * For fish function files, deletes the file if it becomes empty.
27
+ */
28
+ export declare function removeFromProfile(profilePath: string): Promise<boolean>;
29
+ //# sourceMappingURL=safe-delete-install.d.ts.map