devflow-kit 0.8.1 → 1.0.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 (395) hide show
  1. package/CHANGELOG.md +185 -29
  2. package/LICENSE +1 -1
  3. package/README.md +179 -308
  4. package/dist/cli.js +3 -1
  5. package/dist/commands/init.d.ts +21 -0
  6. package/dist/commands/init.js +311 -575
  7. package/dist/commands/list.d.ts +3 -0
  8. package/dist/commands/list.js +20 -0
  9. package/dist/commands/uninstall.d.ts +10 -0
  10. package/dist/commands/uninstall.js +351 -78
  11. package/dist/plugins.d.ts +46 -0
  12. package/dist/plugins.js +162 -0
  13. package/dist/utils/cli.d.ts +5 -0
  14. package/dist/utils/cli.js +14 -0
  15. package/dist/utils/installer.d.ts +41 -0
  16. package/dist/utils/installer.js +177 -0
  17. package/dist/utils/paths.d.ts +10 -0
  18. package/dist/utils/paths.js +23 -3
  19. package/dist/utils/post-install.d.ts +68 -0
  20. package/dist/utils/post-install.js +427 -0
  21. package/dist/utils/safe-delete-install.d.ts +22 -0
  22. package/dist/utils/safe-delete-install.js +156 -0
  23. package/dist/utils/safe-delete.d.ts +12 -0
  24. package/dist/utils/safe-delete.js +83 -0
  25. package/package.json +18 -8
  26. package/plugins/devflow-audit-claude/.claude-plugin/plugin.json +7 -0
  27. package/plugins/devflow-audit-claude/README.md +46 -0
  28. package/plugins/devflow-audit-claude/agents/claude-md-auditor.md +134 -0
  29. package/plugins/devflow-audit-claude/commands/audit-claude.md +85 -0
  30. package/plugins/devflow-code-review/.claude-plugin/plugin.json +31 -0
  31. package/plugins/devflow-code-review/README.md +73 -0
  32. package/plugins/devflow-code-review/agents/git.md +272 -0
  33. package/plugins/devflow-code-review/agents/reviewer.md +119 -0
  34. package/plugins/devflow-code-review/agents/synthesizer.md +204 -0
  35. package/plugins/devflow-code-review/commands/code-review-teams.md +262 -0
  36. package/plugins/devflow-code-review/commands/code-review.md +141 -0
  37. package/plugins/devflow-code-review/skills/accessibility/SKILL.md +229 -0
  38. package/plugins/devflow-code-review/skills/accessibility/references/detection.md +171 -0
  39. package/plugins/devflow-code-review/skills/accessibility/references/patterns.md +670 -0
  40. package/plugins/devflow-code-review/skills/accessibility/references/violations.md +419 -0
  41. package/plugins/devflow-code-review/skills/agent-teams/SKILL.md +124 -0
  42. package/plugins/devflow-code-review/skills/agent-teams/references/cleanup.md +104 -0
  43. package/plugins/devflow-code-review/skills/agent-teams/references/communication.md +122 -0
  44. package/plugins/devflow-code-review/skills/agent-teams/references/team-patterns.md +217 -0
  45. package/plugins/devflow-code-review/skills/architecture-patterns/SKILL.md +153 -0
  46. package/plugins/devflow-code-review/skills/architecture-patterns/references/detection.md +337 -0
  47. package/plugins/devflow-code-review/skills/architecture-patterns/references/patterns.md +873 -0
  48. package/plugins/devflow-code-review/skills/architecture-patterns/references/violations.md +575 -0
  49. package/plugins/devflow-code-review/skills/complexity-patterns/SKILL.md +143 -0
  50. package/plugins/devflow-code-review/skills/complexity-patterns/references/detection.md +264 -0
  51. package/plugins/devflow-code-review/skills/complexity-patterns/references/patterns.md +487 -0
  52. package/plugins/devflow-code-review/skills/complexity-patterns/references/violations.md +361 -0
  53. package/plugins/devflow-code-review/skills/consistency-patterns/SKILL.md +140 -0
  54. package/plugins/devflow-code-review/skills/consistency-patterns/references/detection.md +207 -0
  55. package/plugins/devflow-code-review/skills/consistency-patterns/references/patterns.md +202 -0
  56. package/plugins/devflow-code-review/skills/consistency-patterns/references/violations.md +213 -0
  57. package/plugins/devflow-code-review/skills/database-patterns/SKILL.md +134 -0
  58. package/plugins/devflow-code-review/skills/database-patterns/references/detection.md +208 -0
  59. package/plugins/devflow-code-review/skills/database-patterns/references/patterns.md +394 -0
  60. package/plugins/devflow-code-review/skills/database-patterns/references/violations.md +332 -0
  61. package/plugins/devflow-code-review/skills/dependencies-patterns/SKILL.md +141 -0
  62. package/plugins/devflow-code-review/skills/dependencies-patterns/references/detection.md +181 -0
  63. package/plugins/devflow-code-review/skills/dependencies-patterns/references/patterns.md +225 -0
  64. package/plugins/devflow-code-review/skills/dependencies-patterns/references/violations.md +247 -0
  65. package/plugins/devflow-code-review/skills/documentation-patterns/SKILL.md +125 -0
  66. package/plugins/devflow-code-review/skills/documentation-patterns/references/detection.md +190 -0
  67. package/plugins/devflow-code-review/skills/documentation-patterns/references/patterns.md +189 -0
  68. package/plugins/devflow-code-review/skills/documentation-patterns/references/violations.md +163 -0
  69. package/plugins/devflow-code-review/skills/frontend-design/SKILL.md +254 -0
  70. package/plugins/devflow-code-review/skills/frontend-design/references/detection.md +184 -0
  71. package/plugins/devflow-code-review/skills/frontend-design/references/patterns.md +511 -0
  72. package/plugins/devflow-code-review/skills/frontend-design/references/violations.md +453 -0
  73. package/plugins/devflow-code-review/skills/performance-patterns/SKILL.md +154 -0
  74. package/plugins/devflow-code-review/skills/performance-patterns/references/detection.md +351 -0
  75. package/plugins/devflow-code-review/skills/performance-patterns/references/patterns.md +503 -0
  76. package/plugins/devflow-code-review/skills/performance-patterns/references/violations.md +354 -0
  77. package/plugins/devflow-code-review/skills/react/SKILL.md +276 -0
  78. package/plugins/devflow-code-review/skills/react/references/patterns.md +1331 -0
  79. package/plugins/devflow-code-review/skills/react/references/violations.md +565 -0
  80. package/plugins/devflow-code-review/skills/regression-patterns/SKILL.md +146 -0
  81. package/plugins/devflow-code-review/skills/regression-patterns/references/detection.md +237 -0
  82. package/plugins/devflow-code-review/skills/regression-patterns/references/patterns.md +226 -0
  83. package/plugins/devflow-code-review/skills/regression-patterns/references/violations.md +225 -0
  84. package/plugins/devflow-code-review/skills/review-methodology/SKILL.md +119 -0
  85. package/plugins/devflow-code-review/skills/review-methodology/references/patterns.md +186 -0
  86. package/plugins/devflow-code-review/skills/review-methodology/references/report-template.md +142 -0
  87. package/plugins/devflow-code-review/skills/review-methodology/references/violations.md +125 -0
  88. package/plugins/devflow-code-review/skills/security-patterns/SKILL.md +156 -0
  89. package/plugins/devflow-code-review/skills/security-patterns/references/detection.md +287 -0
  90. package/plugins/devflow-code-review/skills/security-patterns/references/patterns.md +507 -0
  91. package/plugins/devflow-code-review/skills/security-patterns/references/violations.md +237 -0
  92. package/plugins/devflow-code-review/skills/test-patterns/SKILL.md +183 -0
  93. package/plugins/devflow-code-review/skills/test-patterns/references/detection.md +149 -0
  94. package/plugins/devflow-code-review/skills/test-patterns/references/patterns.md +220 -0
  95. package/plugins/devflow-code-review/skills/test-patterns/references/report-template.md +108 -0
  96. package/plugins/devflow-code-review/skills/test-patterns/references/violations.md +221 -0
  97. package/plugins/devflow-core-skills/.claude-plugin/plugin.json +27 -0
  98. package/plugins/devflow-core-skills/README.md +50 -0
  99. package/plugins/devflow-core-skills/skills/accessibility/SKILL.md +229 -0
  100. package/plugins/devflow-core-skills/skills/accessibility/references/detection.md +171 -0
  101. package/plugins/devflow-core-skills/skills/accessibility/references/patterns.md +670 -0
  102. package/plugins/devflow-core-skills/skills/accessibility/references/violations.md +419 -0
  103. package/plugins/devflow-core-skills/skills/core-patterns/SKILL.md +162 -0
  104. package/plugins/devflow-core-skills/skills/core-patterns/references/checklist.md +276 -0
  105. package/plugins/devflow-core-skills/skills/core-patterns/references/code-smell-violations.md +144 -0
  106. package/plugins/devflow-core-skills/skills/core-patterns/references/detection.md +303 -0
  107. package/plugins/devflow-core-skills/skills/core-patterns/references/patterns.md +576 -0
  108. package/plugins/devflow-core-skills/skills/core-patterns/references/violations.md +369 -0
  109. package/plugins/devflow-core-skills/skills/docs-framework/SKILL.md +134 -0
  110. package/plugins/devflow-core-skills/skills/docs-framework/references/patterns.md +346 -0
  111. package/plugins/devflow-core-skills/skills/docs-framework/references/violations.md +221 -0
  112. package/plugins/devflow-core-skills/skills/frontend-design/SKILL.md +254 -0
  113. package/plugins/devflow-core-skills/skills/frontend-design/references/detection.md +184 -0
  114. package/plugins/devflow-core-skills/skills/frontend-design/references/patterns.md +511 -0
  115. package/plugins/devflow-core-skills/skills/frontend-design/references/violations.md +453 -0
  116. package/plugins/devflow-core-skills/skills/git-safety/SKILL.md +122 -0
  117. package/plugins/devflow-core-skills/skills/git-safety/references/detection.md +290 -0
  118. package/plugins/devflow-core-skills/skills/git-safety/references/patterns.md +289 -0
  119. package/plugins/devflow-core-skills/skills/git-safety/references/violations.md +18 -0
  120. package/plugins/devflow-core-skills/skills/git-workflow/SKILL.md +158 -0
  121. package/plugins/devflow-core-skills/skills/git-workflow/references/commit-patterns.md +115 -0
  122. package/plugins/devflow-core-skills/skills/git-workflow/references/commit-violations.md +77 -0
  123. package/plugins/devflow-core-skills/skills/git-workflow/references/pr-patterns.md +127 -0
  124. package/plugins/devflow-core-skills/skills/git-workflow/references/pr-violations.md +96 -0
  125. package/plugins/devflow-core-skills/skills/github-patterns/SKILL.md +153 -0
  126. package/plugins/devflow-core-skills/skills/github-patterns/references/patterns.md +572 -0
  127. package/plugins/devflow-core-skills/skills/github-patterns/references/violations.md +298 -0
  128. package/plugins/devflow-core-skills/skills/input-validation/SKILL.md +148 -0
  129. package/plugins/devflow-core-skills/skills/input-validation/references/detection.md +283 -0
  130. package/plugins/devflow-core-skills/skills/input-validation/references/patterns.md +361 -0
  131. package/plugins/devflow-core-skills/skills/input-validation/references/violations.md +224 -0
  132. package/plugins/devflow-core-skills/skills/react/SKILL.md +276 -0
  133. package/plugins/devflow-core-skills/skills/react/references/patterns.md +1331 -0
  134. package/plugins/devflow-core-skills/skills/react/references/violations.md +565 -0
  135. package/plugins/devflow-core-skills/skills/test-patterns/SKILL.md +183 -0
  136. package/plugins/devflow-core-skills/skills/test-patterns/references/detection.md +149 -0
  137. package/plugins/devflow-core-skills/skills/test-patterns/references/patterns.md +220 -0
  138. package/plugins/devflow-core-skills/skills/test-patterns/references/report-template.md +108 -0
  139. package/plugins/devflow-core-skills/skills/test-patterns/references/violations.md +221 -0
  140. package/plugins/devflow-core-skills/skills/typescript/SKILL.md +176 -0
  141. package/plugins/devflow-core-skills/skills/typescript/references/patterns.md +1105 -0
  142. package/plugins/devflow-core-skills/skills/typescript/references/violations.md +433 -0
  143. package/plugins/devflow-debug/.claude-plugin/plugin.json +18 -0
  144. package/plugins/devflow-debug/README.md +65 -0
  145. package/plugins/devflow-debug/agents/git.md +272 -0
  146. package/plugins/devflow-debug/commands/debug-teams.md +231 -0
  147. package/plugins/devflow-debug/commands/debug.md +160 -0
  148. package/plugins/devflow-debug/skills/agent-teams/SKILL.md +124 -0
  149. package/plugins/devflow-debug/skills/agent-teams/references/cleanup.md +104 -0
  150. package/plugins/devflow-debug/skills/agent-teams/references/communication.md +122 -0
  151. package/plugins/devflow-debug/skills/agent-teams/references/team-patterns.md +217 -0
  152. package/plugins/devflow-debug/skills/git-safety/SKILL.md +122 -0
  153. package/plugins/devflow-debug/skills/git-safety/references/detection.md +290 -0
  154. package/plugins/devflow-debug/skills/git-safety/references/patterns.md +289 -0
  155. package/plugins/devflow-debug/skills/git-safety/references/violations.md +18 -0
  156. package/plugins/devflow-implement/.claude-plugin/plugin.json +21 -0
  157. package/plugins/devflow-implement/README.md +71 -0
  158. package/plugins/devflow-implement/agents/coder.md +122 -0
  159. package/plugins/devflow-implement/agents/git.md +272 -0
  160. package/plugins/devflow-implement/agents/scrutinizer.md +80 -0
  161. package/plugins/devflow-implement/agents/shepherd.md +94 -0
  162. package/plugins/devflow-implement/agents/simplifier.md +62 -0
  163. package/plugins/devflow-implement/agents/skimmer.md +88 -0
  164. package/plugins/devflow-implement/agents/synthesizer.md +204 -0
  165. package/plugins/devflow-implement/agents/validator.md +86 -0
  166. package/plugins/devflow-implement/commands/implement-teams.md +608 -0
  167. package/plugins/devflow-implement/commands/implement.md +426 -0
  168. package/plugins/devflow-implement/skills/accessibility/SKILL.md +229 -0
  169. package/plugins/devflow-implement/skills/accessibility/references/detection.md +171 -0
  170. package/plugins/devflow-implement/skills/accessibility/references/patterns.md +670 -0
  171. package/plugins/devflow-implement/skills/accessibility/references/violations.md +419 -0
  172. package/plugins/devflow-implement/skills/agent-teams/SKILL.md +124 -0
  173. package/plugins/devflow-implement/skills/agent-teams/references/cleanup.md +104 -0
  174. package/plugins/devflow-implement/skills/agent-teams/references/communication.md +122 -0
  175. package/plugins/devflow-implement/skills/agent-teams/references/team-patterns.md +217 -0
  176. package/plugins/devflow-implement/skills/frontend-design/SKILL.md +254 -0
  177. package/plugins/devflow-implement/skills/frontend-design/references/detection.md +184 -0
  178. package/plugins/devflow-implement/skills/frontend-design/references/patterns.md +511 -0
  179. package/plugins/devflow-implement/skills/frontend-design/references/violations.md +453 -0
  180. package/plugins/devflow-implement/skills/implementation-patterns/SKILL.md +162 -0
  181. package/plugins/devflow-implement/skills/implementation-patterns/references/patterns.md +1063 -0
  182. package/plugins/devflow-implement/skills/implementation-patterns/references/violations.md +483 -0
  183. package/plugins/devflow-implement/skills/self-review/SKILL.md +149 -0
  184. package/plugins/devflow-implement/skills/self-review/references/patterns.md +405 -0
  185. package/plugins/devflow-implement/skills/self-review/references/report-template.md +253 -0
  186. package/plugins/devflow-implement/skills/self-review/references/violations.md +308 -0
  187. package/plugins/devflow-resolve/.claude-plugin/plugin.json +19 -0
  188. package/plugins/devflow-resolve/README.md +65 -0
  189. package/plugins/devflow-resolve/agents/git.md +272 -0
  190. package/plugins/devflow-resolve/agents/resolver.md +131 -0
  191. package/plugins/devflow-resolve/agents/simplifier.md +62 -0
  192. package/plugins/devflow-resolve/commands/resolve-teams.md +298 -0
  193. package/plugins/devflow-resolve/commands/resolve.md +237 -0
  194. package/plugins/devflow-resolve/skills/agent-teams/SKILL.md +124 -0
  195. package/plugins/devflow-resolve/skills/agent-teams/references/cleanup.md +104 -0
  196. package/plugins/devflow-resolve/skills/agent-teams/references/communication.md +122 -0
  197. package/plugins/devflow-resolve/skills/agent-teams/references/team-patterns.md +217 -0
  198. package/plugins/devflow-resolve/skills/implementation-patterns/SKILL.md +162 -0
  199. package/plugins/devflow-resolve/skills/implementation-patterns/references/patterns.md +1063 -0
  200. package/plugins/devflow-resolve/skills/implementation-patterns/references/violations.md +483 -0
  201. package/plugins/devflow-resolve/skills/security-patterns/SKILL.md +156 -0
  202. package/plugins/devflow-resolve/skills/security-patterns/references/detection.md +287 -0
  203. package/plugins/devflow-resolve/skills/security-patterns/references/patterns.md +507 -0
  204. package/plugins/devflow-resolve/skills/security-patterns/references/violations.md +237 -0
  205. package/plugins/devflow-self-review/.claude-plugin/plugin.json +7 -0
  206. package/plugins/devflow-self-review/README.md +38 -0
  207. package/plugins/devflow-self-review/agents/scrutinizer.md +80 -0
  208. package/plugins/devflow-self-review/agents/simplifier.md +62 -0
  209. package/plugins/devflow-self-review/agents/validator.md +86 -0
  210. package/plugins/devflow-self-review/commands/self-review.md +126 -0
  211. package/plugins/devflow-self-review/skills/core-patterns/SKILL.md +162 -0
  212. package/plugins/devflow-self-review/skills/core-patterns/references/checklist.md +276 -0
  213. package/plugins/devflow-self-review/skills/core-patterns/references/code-smell-violations.md +144 -0
  214. package/plugins/devflow-self-review/skills/core-patterns/references/detection.md +303 -0
  215. package/plugins/devflow-self-review/skills/core-patterns/references/patterns.md +576 -0
  216. package/plugins/devflow-self-review/skills/core-patterns/references/violations.md +369 -0
  217. package/plugins/devflow-self-review/skills/self-review/SKILL.md +149 -0
  218. package/plugins/devflow-self-review/skills/self-review/references/patterns.md +405 -0
  219. package/plugins/devflow-self-review/skills/self-review/references/report-template.md +253 -0
  220. package/plugins/devflow-self-review/skills/self-review/references/violations.md +308 -0
  221. package/plugins/devflow-specify/.claude-plugin/plugin.json +15 -0
  222. package/plugins/devflow-specify/README.md +46 -0
  223. package/plugins/devflow-specify/agents/skimmer.md +88 -0
  224. package/plugins/devflow-specify/agents/synthesizer.md +204 -0
  225. package/plugins/devflow-specify/commands/specify-teams.md +314 -0
  226. package/plugins/devflow-specify/commands/specify.md +179 -0
  227. package/plugins/devflow-specify/skills/agent-teams/SKILL.md +124 -0
  228. package/plugins/devflow-specify/skills/agent-teams/references/cleanup.md +104 -0
  229. package/plugins/devflow-specify/skills/agent-teams/references/communication.md +122 -0
  230. package/plugins/devflow-specify/skills/agent-teams/references/team-patterns.md +217 -0
  231. package/scripts/hooks/background-memory-update.sh +167 -0
  232. package/scripts/hooks/pre-compact-memory.sh +81 -0
  233. package/scripts/hooks/session-start-memory.sh +84 -0
  234. package/scripts/hooks/stop-update-memory.sh +81 -0
  235. package/shared/agents/coder.md +122 -0
  236. package/shared/agents/git.md +272 -0
  237. package/shared/agents/resolver.md +131 -0
  238. package/shared/agents/reviewer.md +119 -0
  239. package/shared/agents/scrutinizer.md +80 -0
  240. package/shared/agents/shepherd.md +94 -0
  241. package/shared/agents/simplifier.md +62 -0
  242. package/shared/agents/skimmer.md +88 -0
  243. package/shared/agents/synthesizer.md +204 -0
  244. package/shared/agents/validator.md +86 -0
  245. package/shared/skills/accessibility/SKILL.md +229 -0
  246. package/shared/skills/accessibility/references/detection.md +171 -0
  247. package/shared/skills/accessibility/references/patterns.md +670 -0
  248. package/shared/skills/accessibility/references/violations.md +419 -0
  249. package/shared/skills/agent-teams/SKILL.md +124 -0
  250. package/shared/skills/agent-teams/references/cleanup.md +104 -0
  251. package/shared/skills/agent-teams/references/communication.md +122 -0
  252. package/shared/skills/agent-teams/references/team-patterns.md +217 -0
  253. package/shared/skills/architecture-patterns/SKILL.md +153 -0
  254. package/shared/skills/architecture-patterns/references/detection.md +337 -0
  255. package/shared/skills/architecture-patterns/references/patterns.md +873 -0
  256. package/shared/skills/architecture-patterns/references/violations.md +575 -0
  257. package/shared/skills/complexity-patterns/SKILL.md +143 -0
  258. package/shared/skills/complexity-patterns/references/detection.md +264 -0
  259. package/shared/skills/complexity-patterns/references/patterns.md +487 -0
  260. package/shared/skills/complexity-patterns/references/violations.md +361 -0
  261. package/shared/skills/consistency-patterns/SKILL.md +140 -0
  262. package/shared/skills/consistency-patterns/references/detection.md +207 -0
  263. package/shared/skills/consistency-patterns/references/patterns.md +202 -0
  264. package/shared/skills/consistency-patterns/references/violations.md +213 -0
  265. package/shared/skills/core-patterns/SKILL.md +162 -0
  266. package/shared/skills/core-patterns/references/checklist.md +276 -0
  267. package/shared/skills/core-patterns/references/code-smell-violations.md +144 -0
  268. package/shared/skills/core-patterns/references/detection.md +303 -0
  269. package/shared/skills/core-patterns/references/patterns.md +576 -0
  270. package/shared/skills/core-patterns/references/violations.md +369 -0
  271. package/shared/skills/database-patterns/SKILL.md +134 -0
  272. package/shared/skills/database-patterns/references/detection.md +208 -0
  273. package/shared/skills/database-patterns/references/patterns.md +394 -0
  274. package/shared/skills/database-patterns/references/violations.md +332 -0
  275. package/shared/skills/dependencies-patterns/SKILL.md +141 -0
  276. package/shared/skills/dependencies-patterns/references/detection.md +181 -0
  277. package/shared/skills/dependencies-patterns/references/patterns.md +225 -0
  278. package/shared/skills/dependencies-patterns/references/violations.md +247 -0
  279. package/shared/skills/docs-framework/SKILL.md +134 -0
  280. package/shared/skills/docs-framework/references/patterns.md +346 -0
  281. package/shared/skills/docs-framework/references/violations.md +221 -0
  282. package/shared/skills/documentation-patterns/SKILL.md +125 -0
  283. package/shared/skills/documentation-patterns/references/detection.md +190 -0
  284. package/shared/skills/documentation-patterns/references/patterns.md +189 -0
  285. package/shared/skills/documentation-patterns/references/violations.md +163 -0
  286. package/shared/skills/frontend-design/SKILL.md +254 -0
  287. package/shared/skills/frontend-design/references/detection.md +184 -0
  288. package/shared/skills/frontend-design/references/patterns.md +511 -0
  289. package/shared/skills/frontend-design/references/violations.md +453 -0
  290. package/shared/skills/git-safety/SKILL.md +122 -0
  291. package/shared/skills/git-safety/references/detection.md +290 -0
  292. package/shared/skills/git-safety/references/patterns.md +289 -0
  293. package/shared/skills/git-safety/references/violations.md +18 -0
  294. package/shared/skills/git-workflow/SKILL.md +158 -0
  295. package/shared/skills/git-workflow/references/commit-patterns.md +115 -0
  296. package/shared/skills/git-workflow/references/commit-violations.md +77 -0
  297. package/shared/skills/git-workflow/references/pr-patterns.md +127 -0
  298. package/shared/skills/git-workflow/references/pr-violations.md +96 -0
  299. package/shared/skills/github-patterns/SKILL.md +153 -0
  300. package/shared/skills/github-patterns/references/patterns.md +572 -0
  301. package/shared/skills/github-patterns/references/violations.md +298 -0
  302. package/shared/skills/implementation-patterns/SKILL.md +162 -0
  303. package/shared/skills/implementation-patterns/references/patterns.md +1063 -0
  304. package/shared/skills/implementation-patterns/references/violations.md +483 -0
  305. package/shared/skills/input-validation/SKILL.md +148 -0
  306. package/shared/skills/input-validation/references/detection.md +283 -0
  307. package/shared/skills/input-validation/references/patterns.md +361 -0
  308. package/shared/skills/input-validation/references/violations.md +224 -0
  309. package/shared/skills/performance-patterns/SKILL.md +154 -0
  310. package/shared/skills/performance-patterns/references/detection.md +351 -0
  311. package/shared/skills/performance-patterns/references/patterns.md +503 -0
  312. package/shared/skills/performance-patterns/references/violations.md +354 -0
  313. package/shared/skills/react/SKILL.md +276 -0
  314. package/shared/skills/react/references/patterns.md +1331 -0
  315. package/shared/skills/react/references/violations.md +565 -0
  316. package/shared/skills/regression-patterns/SKILL.md +146 -0
  317. package/shared/skills/regression-patterns/references/detection.md +237 -0
  318. package/shared/skills/regression-patterns/references/patterns.md +226 -0
  319. package/shared/skills/regression-patterns/references/violations.md +225 -0
  320. package/shared/skills/review-methodology/SKILL.md +119 -0
  321. package/shared/skills/review-methodology/references/patterns.md +186 -0
  322. package/shared/skills/review-methodology/references/report-template.md +142 -0
  323. package/shared/skills/review-methodology/references/violations.md +125 -0
  324. package/shared/skills/security-patterns/SKILL.md +156 -0
  325. package/shared/skills/security-patterns/references/detection.md +287 -0
  326. package/shared/skills/security-patterns/references/patterns.md +507 -0
  327. package/shared/skills/security-patterns/references/violations.md +237 -0
  328. package/shared/skills/self-review/SKILL.md +149 -0
  329. package/shared/skills/self-review/references/patterns.md +405 -0
  330. package/shared/skills/self-review/references/report-template.md +253 -0
  331. package/shared/skills/self-review/references/violations.md +308 -0
  332. package/shared/skills/test-patterns/SKILL.md +183 -0
  333. package/shared/skills/test-patterns/references/detection.md +149 -0
  334. package/shared/skills/test-patterns/references/patterns.md +220 -0
  335. package/shared/skills/test-patterns/references/report-template.md +108 -0
  336. package/shared/skills/test-patterns/references/violations.md +221 -0
  337. package/shared/skills/typescript/SKILL.md +176 -0
  338. package/shared/skills/typescript/references/patterns.md +1105 -0
  339. package/shared/skills/typescript/references/violations.md +433 -0
  340. package/src/templates/claudeignore.template +188 -0
  341. package/src/templates/managed-settings.json +146 -0
  342. package/src/templates/settings.json +59 -0
  343. package/dist/cli.d.ts.map +0 -1
  344. package/dist/cli.js.map +0 -1
  345. package/dist/commands/init.d.ts.map +0 -1
  346. package/dist/commands/init.js.map +0 -1
  347. package/dist/commands/uninstall.d.ts.map +0 -1
  348. package/dist/commands/uninstall.js.map +0 -1
  349. package/dist/utils/git.d.ts.map +0 -1
  350. package/dist/utils/git.js.map +0 -1
  351. package/dist/utils/paths.d.ts.map +0 -1
  352. package/dist/utils/paths.js.map +0 -1
  353. package/src/claude/CLAUDE.md +0 -400
  354. package/src/claude/agents/devflow/audit-architecture.md +0 -132
  355. package/src/claude/agents/devflow/audit-complexity.md +0 -132
  356. package/src/claude/agents/devflow/audit-database.md +0 -132
  357. package/src/claude/agents/devflow/audit-dependencies.md +0 -132
  358. package/src/claude/agents/devflow/audit-documentation.md +0 -132
  359. package/src/claude/agents/devflow/audit-performance.md +0 -256
  360. package/src/claude/agents/devflow/audit-security.md +0 -259
  361. package/src/claude/agents/devflow/audit-tests.md +0 -132
  362. package/src/claude/agents/devflow/audit-typescript.md +0 -132
  363. package/src/claude/agents/devflow/brainstorm.md +0 -279
  364. package/src/claude/agents/devflow/catch-up.md +0 -345
  365. package/src/claude/agents/devflow/code-review.md +0 -307
  366. package/src/claude/agents/devflow/commit.md +0 -380
  367. package/src/claude/agents/devflow/debug.md +0 -476
  368. package/src/claude/agents/devflow/design.md +0 -491
  369. package/src/claude/agents/devflow/pr-comments.md +0 -285
  370. package/src/claude/agents/devflow/project-state.md +0 -419
  371. package/src/claude/agents/devflow/pull-request.md +0 -423
  372. package/src/claude/agents/devflow/release.md +0 -1137
  373. package/src/claude/agents/devflow/tech-debt.md +0 -338
  374. package/src/claude/commands/devflow/brainstorm.md +0 -68
  375. package/src/claude/commands/devflow/breakdown.md +0 -125
  376. package/src/claude/commands/devflow/catch-up.md +0 -29
  377. package/src/claude/commands/devflow/code-review.md +0 -237
  378. package/src/claude/commands/devflow/commit.md +0 -17
  379. package/src/claude/commands/devflow/debug.md +0 -56
  380. package/src/claude/commands/devflow/design.md +0 -82
  381. package/src/claude/commands/devflow/devlog.md +0 -408
  382. package/src/claude/commands/devflow/implement.md +0 -100
  383. package/src/claude/commands/devflow/plan.md +0 -223
  384. package/src/claude/commands/devflow/pull-request.md +0 -269
  385. package/src/claude/commands/devflow/release.md +0 -251
  386. package/src/claude/commands/devflow/resolve-comments.md +0 -583
  387. package/src/claude/scripts/statusline.sh +0 -47
  388. package/src/claude/settings.json +0 -6
  389. package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
  390. package/src/claude/skills/devflow/debug/SKILL.md +0 -119
  391. package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
  392. package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
  393. package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
  394. package/src/claude/skills/devflow/research/SKILL.md +0 -138
  395. package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
@@ -0,0 +1,427 @@
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/'];
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
+ //# sourceMappingURL=post-install.js.map
@@ -0,0 +1,22 @@
1
+ import type { Shell } from './safe-delete.js';
2
+ /**
3
+ * Generate the safe-delete shell function block with markers.
4
+ * Returns null for unsupported shells.
5
+ */
6
+ export declare function generateSafeDeleteBlock(shell: Shell, platform: NodeJS.Platform, trashCommand: string | null): string | null;
7
+ /**
8
+ * Check if the safe-delete block is already installed in a profile file.
9
+ */
10
+ export declare function isAlreadyInstalled(profilePath: string): Promise<boolean>;
11
+ /**
12
+ * Append the safe-delete block to a profile file.
13
+ * Creates parent directories and the file if they don't exist.
14
+ */
15
+ export declare function installToProfile(profilePath: string, block: string): Promise<void>;
16
+ /**
17
+ * Remove the safe-delete block from a profile file.
18
+ * Returns true if the block was found and removed, false otherwise.
19
+ * For fish function files, deletes the file if it becomes empty.
20
+ */
21
+ export declare function removeFromProfile(profilePath: string): Promise<boolean>;
22
+ //# sourceMappingURL=safe-delete-install.d.ts.map
@@ -0,0 +1,156 @@
1
+ import { promises as fs } from 'fs';
2
+ import * as path from 'path';
3
+ const START_MARKER = '# >>> DevFlow safe-delete >>>';
4
+ const END_MARKER = '# <<< DevFlow safe-delete <<<';
5
+ /**
6
+ * Generate the safe-delete shell function block with markers.
7
+ * Returns null for unsupported shells.
8
+ */
9
+ export function generateSafeDeleteBlock(shell, platform, trashCommand) {
10
+ if (shell === 'unknown')
11
+ return null;
12
+ if (shell === 'bash' || shell === 'zsh') {
13
+ const cmd = trashCommand ?? 'trash';
14
+ return [
15
+ START_MARKER,
16
+ `rm() {`,
17
+ ` local files=()`,
18
+ ` for arg in "$@"; do`,
19
+ ` [[ "$arg" =~ ^- ]] || files+=("$arg")`,
20
+ ` done`,
21
+ ` if (( \${#files[@]} > 0 )); then`,
22
+ ` ${cmd} "\${files[@]}"`,
23
+ ` fi`,
24
+ `}`,
25
+ `command() {`,
26
+ ` if [[ "$1" == "rm" ]]; then`,
27
+ ` shift; rm "$@"`,
28
+ ` else`,
29
+ ` builtin command "$@"`,
30
+ ` fi`,
31
+ `}`,
32
+ END_MARKER,
33
+ ].join('\n');
34
+ }
35
+ if (shell === 'fish') {
36
+ const cmd = trashCommand ?? 'trash';
37
+ return [
38
+ START_MARKER,
39
+ `function rm --description "Safe delete via trash"`,
40
+ ` set -l files`,
41
+ ` for arg in $argv`,
42
+ ` if not string match -q -- '-*' $arg`,
43
+ ` set files $files $arg`,
44
+ ` end`,
45
+ ` end`,
46
+ ` if test (count $files) -gt 0`,
47
+ ` ${cmd} $files`,
48
+ ` end`,
49
+ `end`,
50
+ END_MARKER,
51
+ ].join('\n');
52
+ }
53
+ if (shell === 'powershell') {
54
+ if (platform === 'win32') {
55
+ return [
56
+ START_MARKER,
57
+ `if (Get-Alias rm -ErrorAction SilentlyContinue) {`,
58
+ ` Remove-Alias rm -Force -Scope Global`,
59
+ `}`,
60
+ `function rm {`,
61
+ ` $files = $args | Where-Object { $_ -notlike '-*' }`,
62
+ ` if ($files) {`,
63
+ ` Add-Type -AssemblyName Microsoft.VisualBasic`,
64
+ ` foreach ($f in $files) {`,
65
+ ` $p = Resolve-Path $f -ErrorAction SilentlyContinue`,
66
+ ` if ($p) {`,
67
+ ` if (Test-Path $p -PathType Container) {`,
68
+ ` [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteDirectory(`,
69
+ ` $p, 'OnlyErrorDialogs', 'SendToRecycleBin')`,
70
+ ` } else {`,
71
+ ` [Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile(`,
72
+ ` $p, 'OnlyErrorDialogs', 'SendToRecycleBin')`,
73
+ ` }`,
74
+ ` }`,
75
+ ` }`,
76
+ ` }`,
77
+ `}`,
78
+ END_MARKER,
79
+ ].join('\n');
80
+ }
81
+ // macOS/Linux PowerShell
82
+ const cmd = trashCommand ?? 'trash';
83
+ return [
84
+ START_MARKER,
85
+ `if (Get-Alias rm -ErrorAction SilentlyContinue) {`,
86
+ ` Remove-Alias rm -Force -Scope Global`,
87
+ `}`,
88
+ `function rm {`,
89
+ ` $files = $args | Where-Object { $_ -notlike '-*' }`,
90
+ ` if ($files) { & ${cmd} @files }`,
91
+ `}`,
92
+ END_MARKER,
93
+ ].join('\n');
94
+ }
95
+ return null;
96
+ }
97
+ /**
98
+ * Check if the safe-delete block is already installed in a profile file.
99
+ */
100
+ export async function isAlreadyInstalled(profilePath) {
101
+ try {
102
+ const content = await fs.readFile(profilePath, 'utf-8');
103
+ return content.includes(START_MARKER) && content.includes(END_MARKER);
104
+ }
105
+ catch {
106
+ return false;
107
+ }
108
+ }
109
+ /**
110
+ * Append the safe-delete block to a profile file.
111
+ * Creates parent directories and the file if they don't exist.
112
+ */
113
+ export async function installToProfile(profilePath, block) {
114
+ await fs.mkdir(path.dirname(profilePath), { recursive: true });
115
+ let existing = '';
116
+ try {
117
+ existing = await fs.readFile(profilePath, 'utf-8');
118
+ }
119
+ catch {
120
+ // File doesn't exist yet — will be created
121
+ }
122
+ const separator = existing.length > 0 && !existing.endsWith('\n') ? '\n\n' : '\n';
123
+ const content = existing.length > 0 ? existing + separator + block + '\n' : block + '\n';
124
+ await fs.writeFile(profilePath, content, 'utf-8');
125
+ }
126
+ /**
127
+ * Remove the safe-delete block from a profile file.
128
+ * Returns true if the block was found and removed, false otherwise.
129
+ * For fish function files, deletes the file if it becomes empty.
130
+ */
131
+ export async function removeFromProfile(profilePath) {
132
+ let content;
133
+ try {
134
+ content = await fs.readFile(profilePath, 'utf-8');
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ const startIdx = content.indexOf(START_MARKER);
140
+ const endIdx = content.indexOf(END_MARKER);
141
+ if (startIdx === -1 || endIdx === -1)
142
+ return false;
143
+ const before = content.slice(0, startIdx);
144
+ const after = content.slice(endIdx + END_MARKER.length);
145
+ // Clean up surrounding whitespace
146
+ const cleaned = (before.trimEnd() + after.trimStart()).trim();
147
+ if (cleaned.length === 0) {
148
+ // File is empty after removal — delete it (fish function files)
149
+ await fs.unlink(profilePath);
150
+ }
151
+ else {
152
+ await fs.writeFile(profilePath, cleaned + '\n', 'utf-8');
153
+ }
154
+ return true;
155
+ }
156
+ //# sourceMappingURL=safe-delete-install.js.map
@@ -0,0 +1,12 @@
1
+ export type Platform = 'macos' | 'linux' | 'windows';
2
+ export type Shell = 'zsh' | 'bash' | 'fish' | 'powershell' | 'unknown';
3
+ export interface SafeDeleteInfo {
4
+ command: string | null;
5
+ installHint: string | null;
6
+ }
7
+ export declare function detectPlatform(): Platform;
8
+ export declare function detectShell(): Shell;
9
+ export declare function getProfilePath(shell: Shell): string | null;
10
+ export declare function getSafeDeleteInfo(platform: Platform): SafeDeleteInfo;
11
+ export declare function hasSafeDelete(platform: Platform): boolean;
12
+ //# sourceMappingURL=safe-delete.d.ts.map