devflow-kit 0.9.0 → 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 (397) hide show
  1. package/CHANGELOG.md +167 -29
  2. package/LICENSE +1 -1
  3. package/README.md +179 -310
  4. package/dist/cli.js +3 -1
  5. package/dist/commands/init.d.ts +21 -0
  6. package/dist/commands/init.js +311 -576
  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/get-issue.md +0 -286
  370. package/src/claude/agents/devflow/pr-comments.md +0 -285
  371. package/src/claude/agents/devflow/project-state.md +0 -419
  372. package/src/claude/agents/devflow/pull-request.md +0 -493
  373. package/src/claude/agents/devflow/release.md +0 -1137
  374. package/src/claude/agents/devflow/tech-debt.md +0 -338
  375. package/src/claude/commands/devflow/brainstorm.md +0 -68
  376. package/src/claude/commands/devflow/breakdown.md +0 -125
  377. package/src/claude/commands/devflow/catch-up.md +0 -29
  378. package/src/claude/commands/devflow/code-review.md +0 -237
  379. package/src/claude/commands/devflow/commit.md +0 -17
  380. package/src/claude/commands/devflow/debug.md +0 -56
  381. package/src/claude/commands/devflow/design.md +0 -82
  382. package/src/claude/commands/devflow/devlog.md +0 -408
  383. package/src/claude/commands/devflow/get-issue.md +0 -16
  384. package/src/claude/commands/devflow/implement.md +0 -100
  385. package/src/claude/commands/devflow/plan.md +0 -223
  386. package/src/claude/commands/devflow/pull-request.md +0 -20
  387. package/src/claude/commands/devflow/release.md +0 -251
  388. package/src/claude/commands/devflow/resolve-comments.md +0 -583
  389. package/src/claude/scripts/statusline.sh +0 -47
  390. package/src/claude/settings.json +0 -6
  391. package/src/claude/skills/devflow/code-smell/SKILL.md +0 -428
  392. package/src/claude/skills/devflow/debug/SKILL.md +0 -119
  393. package/src/claude/skills/devflow/error-handling/SKILL.md +0 -597
  394. package/src/claude/skills/devflow/input-validation/SKILL.md +0 -514
  395. package/src/claude/skills/devflow/pattern-check/SKILL.md +0 -238
  396. package/src/claude/skills/devflow/research/SKILL.md +0 -138
  397. package/src/claude/skills/devflow/test-design/SKILL.md +0 -384
@@ -0,0 +1,507 @@
1
+ # Security Correct Patterns
2
+
3
+ Extended correct patterns for security implementation. Reference from main SKILL.md.
4
+
5
+ ## Injection Prevention
6
+
7
+ ### SQL Injection Prevention
8
+ ```typescript
9
+ // SECURE: Parameterized queries
10
+ const user = await db.query('SELECT * FROM users WHERE id = $1', [userId]);
11
+ const result = await db.query('SELECT * FROM products WHERE name LIKE $1', [`%${search}%`]);
12
+ ```
13
+
14
+ ### NoSQL Injection Prevention
15
+ ```typescript
16
+ // SECURE: Coerce to string
17
+ const username = String(req.body.username);
18
+ const user = await db.users.findOne({ username });
19
+
20
+ // SECURE: Escape regex special characters
21
+ const escaped = userInput.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
22
+ db.users.find({ name: { $regex: escaped } });
23
+ ```
24
+
25
+ ### Command Injection Prevention
26
+ ```typescript
27
+ // SECURE: Use execFile with arguments array
28
+ execFile('ls', [userInput]); // Arguments are escaped
29
+ spawn('convert', [filename, 'output.png']);
30
+
31
+ // SECURE: Validate input format
32
+ const hostnamePattern = /^[a-zA-Z0-9.-]+$/;
33
+ if (!hostnamePattern.test(hostname)) {
34
+ throw new Error('Invalid hostname');
35
+ }
36
+ const args = ['-c', '4', hostname];
37
+ spawn('ping', args);
38
+ ```
39
+
40
+ ### Path Traversal Prevention
41
+ ```typescript
42
+ // SECURE: Normalize and validate path
43
+ const file = path.basename(req.params.filename); // Strip directory
44
+ const requestedPath = path.normalize(
45
+ path.join('./uploads', path.basename(req.params.filename))
46
+ );
47
+ const absoluteUploads = path.resolve('./uploads');
48
+ const absoluteRequested = path.resolve(requestedPath);
49
+
50
+ if (!absoluteRequested.startsWith(absoluteUploads + path.sep)) {
51
+ throw new Error('Path traversal attempt blocked');
52
+ }
53
+ fs.readFile(absoluteRequested);
54
+ ```
55
+
56
+ ### LDAP Injection Prevention
57
+ ```typescript
58
+ // SECURE: Escape LDAP special characters
59
+ function escapeLDAP(str: string): string {
60
+ return str.replace(/[\\*()]/g, char => `\\${char.charCodeAt(0).toString(16)}`);
61
+ }
62
+ const filter = `(uid=${escapeLDAP(username)})`;
63
+ ldap.search(baseDN, filter);
64
+ ```
65
+
66
+ ### Template Injection Prevention
67
+ ```typescript
68
+ // SECURE: Never build templates from user input
69
+ const template = 'Hello <%= name %>!';
70
+ ejs.render(template, { name: req.body.name });
71
+ ```
72
+
73
+ ### Header Injection Prevention
74
+ ```typescript
75
+ // SECURE: Validate or encode header values
76
+ const safeInput = encodeURIComponent(userInput);
77
+ res.setHeader('Location', `/user/${safeInput}`);
78
+ ```
79
+
80
+ ---
81
+
82
+ ## Authentication Patterns
83
+
84
+ ### Password Validation
85
+ ```typescript
86
+ import { z } from 'zod';
87
+
88
+ const PasswordSchema = z.string()
89
+ .min(12, 'Password must be at least 12 characters')
90
+ .max(128, 'Password cannot exceed 128 characters')
91
+ .regex(/[A-Z]/, 'Password must contain uppercase letter')
92
+ .regex(/[a-z]/, 'Password must contain lowercase letter')
93
+ .regex(/[0-9]/, 'Password must contain number')
94
+ .regex(/[^A-Za-z0-9]/, 'Password must contain special character');
95
+
96
+ // Check against breach databases
97
+ import { pwnedPassword } from 'hibp';
98
+
99
+ async function validatePassword(password: string): Promise<Result<void, Error>> {
100
+ const schemaResult = PasswordSchema.safeParse(password);
101
+ if (!schemaResult.success) {
102
+ return { ok: false, error: new Error(schemaResult.error.message) };
103
+ }
104
+
105
+ const breachCount = await pwnedPassword(password);
106
+ if (breachCount > 0) {
107
+ return { ok: false, error: new Error('Password found in breach database') };
108
+ }
109
+
110
+ return { ok: true, value: undefined };
111
+ }
112
+ ```
113
+
114
+ ### Secure Session Management
115
+ ```typescript
116
+ // SECURE: httpOnly cookie with secure flags
117
+ res.cookie('session', token, {
118
+ httpOnly: true,
119
+ secure: true,
120
+ sameSite: 'strict',
121
+ maxAge: 3600000 // 1 hour
122
+ });
123
+
124
+ // Cryptographically random session ID
125
+ const sessionId = crypto.randomBytes(32).toString('hex');
126
+
127
+ // Session rotation on privilege change
128
+ async function login(userId: string, res: Response): Promise<void> {
129
+ const newSessionId = crypto.randomBytes(32).toString('hex');
130
+
131
+ // Invalidate old session
132
+ await sessionStore.destroy(req.sessionID);
133
+
134
+ // Create new session with new ID
135
+ await sessionStore.create(newSessionId, {
136
+ userId,
137
+ createdAt: Date.now(),
138
+ lastAccess: Date.now()
139
+ });
140
+
141
+ res.cookie('session', newSessionId, {
142
+ httpOnly: true,
143
+ secure: true,
144
+ sameSite: 'strict',
145
+ maxAge: 3600000
146
+ });
147
+ }
148
+
149
+ // Session timeout with sliding window
150
+ async function validateSession(sessionId: string): Promise<Result<Session, Error>> {
151
+ const session = await sessionStore.get(sessionId);
152
+
153
+ if (!session) {
154
+ return { ok: false, error: new Error('Session not found') };
155
+ }
156
+
157
+ const MAX_IDLE_TIME = 30 * 60 * 1000; // 30 minutes
158
+ const MAX_SESSION_AGE = 24 * 60 * 60 * 1000; // 24 hours
159
+
160
+ const now = Date.now();
161
+
162
+ if (now - session.lastAccess > MAX_IDLE_TIME) {
163
+ await sessionStore.destroy(sessionId);
164
+ return { ok: false, error: new Error('Session expired (idle)') };
165
+ }
166
+
167
+ if (now - session.createdAt > MAX_SESSION_AGE) {
168
+ await sessionStore.destroy(sessionId);
169
+ return { ok: false, error: new Error('Session expired (max age)') };
170
+ }
171
+
172
+ // Update last access for sliding window
173
+ await sessionStore.update(sessionId, { lastAccess: now });
174
+
175
+ return { ok: true, value: session };
176
+ }
177
+ ```
178
+
179
+ ### Secure JWT Handling
180
+ ```typescript
181
+ // SECURE: Proper JWT configuration
182
+ jwt.sign(payload, process.env.JWT_SECRET, {
183
+ algorithm: 'HS256',
184
+ expiresIn: '15m',
185
+ issuer: 'myapp'
186
+ });
187
+
188
+ jwt.verify(token, secret, {
189
+ algorithms: ['HS256'], // Explicitly specify
190
+ issuer: 'myapp'
191
+ });
192
+
193
+ // Refresh token pattern
194
+ interface TokenPair {
195
+ accessToken: string;
196
+ refreshToken: string;
197
+ }
198
+
199
+ async function createTokenPair(userId: string): Promise<TokenPair> {
200
+ const accessToken = jwt.sign(
201
+ { userId, type: 'access' },
202
+ process.env.JWT_ACCESS_SECRET,
203
+ { algorithm: 'HS256', expiresIn: '15m' }
204
+ );
205
+
206
+ const refreshToken = jwt.sign(
207
+ { userId, type: 'refresh', jti: crypto.randomUUID() },
208
+ process.env.JWT_REFRESH_SECRET,
209
+ { algorithm: 'HS256', expiresIn: '7d' }
210
+ );
211
+
212
+ // Store refresh token hash for revocation
213
+ await tokenStore.save({
214
+ jti: jwt.decode(refreshToken).jti,
215
+ userId,
216
+ expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000)
217
+ });
218
+
219
+ return { accessToken, refreshToken };
220
+ }
221
+
222
+ async function refreshTokens(refreshToken: string): Promise<Result<TokenPair, Error>> {
223
+ try {
224
+ const payload = jwt.verify(refreshToken, process.env.JWT_REFRESH_SECRET, {
225
+ algorithms: ['HS256']
226
+ });
227
+
228
+ // Check if token is revoked
229
+ const stored = await tokenStore.find(payload.jti);
230
+ if (!stored) {
231
+ return { ok: false, error: new Error('Token revoked') };
232
+ }
233
+
234
+ // Revoke old refresh token
235
+ await tokenStore.delete(payload.jti);
236
+
237
+ // Issue new token pair
238
+ return { ok: true, value: await createTokenPair(payload.userId) };
239
+ } catch (error) {
240
+ return { ok: false, error: error as Error };
241
+ }
242
+ }
243
+ ```
244
+
245
+ ### Authorization Patterns
246
+ ```typescript
247
+ // SECURE: Layered auth middleware
248
+ app.delete('/api/users/:id',
249
+ requireAuth,
250
+ requireRole('admin'),
251
+ async (req, res) => {
252
+ await deleteUser(req.params.id);
253
+ }
254
+ );
255
+
256
+ // Role-Based Access Control (RBAC)
257
+ type Permission = 'read' | 'write' | 'delete' | 'admin';
258
+
259
+ interface Role {
260
+ name: string;
261
+ permissions: Permission[];
262
+ }
263
+
264
+ const ROLES: Record<string, Role> = {
265
+ viewer: { name: 'viewer', permissions: ['read'] },
266
+ editor: { name: 'editor', permissions: ['read', 'write'] },
267
+ admin: { name: 'admin', permissions: ['read', 'write', 'delete', 'admin'] }
268
+ };
269
+
270
+ function requirePermission(...required: Permission[]) {
271
+ return (req: Request, res: Response, next: NextFunction) => {
272
+ const userRole = ROLES[req.user.role];
273
+
274
+ if (!userRole) {
275
+ return res.status(403).json({ error: 'Invalid role' });
276
+ }
277
+
278
+ const hasAll = required.every(p => userRole.permissions.includes(p));
279
+
280
+ if (!hasAll) {
281
+ return res.status(403).json({ error: 'Insufficient permissions' });
282
+ }
283
+
284
+ next();
285
+ };
286
+ }
287
+
288
+ // Usage
289
+ app.delete('/api/posts/:id', requireAuth, requirePermission('delete'), handler);
290
+
291
+ // Attribute-Based Access Control (ABAC)
292
+ interface AccessPolicy {
293
+ resource: string;
294
+ action: string;
295
+ conditions: (user: User, resource: Resource) => boolean;
296
+ }
297
+
298
+ const policies: AccessPolicy[] = [
299
+ {
300
+ resource: 'post',
301
+ action: 'delete',
302
+ conditions: (user, post) =>
303
+ user.role === 'admin' || post.authorId === user.id
304
+ },
305
+ {
306
+ resource: 'comment',
307
+ action: 'edit',
308
+ conditions: (user, comment) =>
309
+ comment.authorId === user.id &&
310
+ Date.now() - comment.createdAt < 15 * 60 * 1000 // 15 min window
311
+ }
312
+ ];
313
+
314
+ function checkAccess(user: User, resource: Resource, action: string): boolean {
315
+ const policy = policies.find(
316
+ p => p.resource === resource.type && p.action === action
317
+ );
318
+
319
+ if (!policy) {
320
+ return false; // Deny by default
321
+ }
322
+
323
+ return policy.conditions(user, resource);
324
+ }
325
+ ```
326
+
327
+ ---
328
+
329
+ ## Cryptography Patterns
330
+
331
+ ### Secret Management
332
+ ```typescript
333
+ // SECURE: Environment variables with validation
334
+ import { z } from 'zod';
335
+
336
+ const SecretsSchema = z.object({
337
+ DB_PASSWORD: z.string().min(20),
338
+ API_KEY: z.string().regex(/^sk-(live|test)-[a-zA-Z0-9]{32}$/),
339
+ JWT_SECRET: z.string().min(64),
340
+ ENCRYPTION_KEY: z.string().length(64) // 32 bytes hex-encoded
341
+ });
342
+
343
+ function loadSecrets(): Result<Secrets, Error> {
344
+ const result = SecretsSchema.safeParse(process.env);
345
+ if (!result.success) {
346
+ return { ok: false, error: new Error('Invalid secrets configuration') };
347
+ }
348
+ return { ok: true, value: result.data };
349
+ }
350
+
351
+ // AWS Secrets Manager
352
+ import { SecretsManager } from '@aws-sdk/client-secrets-manager';
353
+
354
+ async function getSecret(secretId: string): Promise<Result<string, Error>> {
355
+ const client = new SecretsManager({ region: 'us-east-1' });
356
+
357
+ try {
358
+ const response = await client.getSecretValue({ SecretId: secretId });
359
+ if (!response.SecretString) {
360
+ return { ok: false, error: new Error('Secret not found') };
361
+ }
362
+ return { ok: true, value: response.SecretString };
363
+ } catch (error) {
364
+ return { ok: false, error: error as Error };
365
+ }
366
+ }
367
+ ```
368
+
369
+ ### Password Hashing
370
+ ```typescript
371
+ // SECURE: Argon2id (recommended)
372
+ import argon2 from 'argon2';
373
+
374
+ async function hashPassword(password: string): Promise<string> {
375
+ return argon2.hash(password, {
376
+ type: argon2.argon2id,
377
+ memoryCost: 65536, // 64 MB
378
+ timeCost: 3, // 3 iterations
379
+ parallelism: 4 // 4 parallel threads
380
+ });
381
+ }
382
+
383
+ async function verifyPassword(password: string, hash: string): Promise<boolean> {
384
+ return argon2.verify(hash, password);
385
+ }
386
+
387
+ // SECURE: bcrypt (widely supported)
388
+ import bcrypt from 'bcrypt';
389
+
390
+ async function hashPassword(password: string): Promise<string> {
391
+ const COST_FACTOR = 12; // Minimum for production
392
+ return bcrypt.hash(password, COST_FACTOR);
393
+ }
394
+ ```
395
+
396
+ ### Key Derivation
397
+ ```typescript
398
+ // SECURE: Derive key using scrypt
399
+ async function deriveKey(password: string, salt: Buffer): Promise<Buffer> {
400
+ return new Promise((resolve, reject) => {
401
+ crypto.scrypt(password, salt, 32, (err, key) => {
402
+ if (err) reject(err);
403
+ else resolve(key);
404
+ });
405
+ });
406
+ }
407
+
408
+ // Usage
409
+ const salt = crypto.randomBytes(16);
410
+ const key = await deriveKey(password, salt);
411
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
412
+ ```
413
+
414
+ ### Secure Random Generation
415
+ ```typescript
416
+ // SECURE: Cryptographic random
417
+ const token = crypto.randomBytes(32).toString('hex');
418
+ const id = crypto.randomUUID();
419
+ const code = crypto.randomInt(100000, 1000000);
420
+
421
+ // Secure token generation
422
+ function generateToken(bytes: number = 32): string {
423
+ return crypto.randomBytes(bytes).toString('hex');
424
+ }
425
+
426
+ // Secure numeric code (e.g., 2FA)
427
+ function generateOTP(digits: number = 6): string {
428
+ const max = Math.pow(10, digits);
429
+ const min = Math.pow(10, digits - 1);
430
+ return crypto.randomInt(min, max).toString();
431
+ }
432
+
433
+ // Secure API key generation
434
+ function generateApiKey(): string {
435
+ const prefix = 'sk';
436
+ const env = process.env.NODE_ENV === 'production' ? 'live' : 'test';
437
+ const random = crypto.randomBytes(24).toString('base64url');
438
+ return `${prefix}_${env}_${random}`;
439
+ }
440
+
441
+ // Secure password reset token
442
+ function generateResetToken(): { token: string; hash: string; expires: Date } {
443
+ const token = crypto.randomBytes(32).toString('hex');
444
+ const hash = crypto.createHash('sha256').update(token).digest('hex');
445
+ const expires = new Date(Date.now() + 60 * 60 * 1000); // 1 hour
446
+
447
+ return { token, hash, expires };
448
+ }
449
+ ```
450
+
451
+ ### Authenticated Encryption
452
+ ```typescript
453
+ // SECURE: AES-256-GCM (authenticated encryption)
454
+ interface EncryptedData {
455
+ ciphertext: string;
456
+ iv: string;
457
+ authTag: string;
458
+ }
459
+
460
+ function encrypt(plaintext: string, key: Buffer): EncryptedData {
461
+ const iv = crypto.randomBytes(12); // 96-bit IV for GCM
462
+ const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
463
+
464
+ let ciphertext = cipher.update(plaintext, 'utf8', 'hex');
465
+ ciphertext += cipher.final('hex');
466
+
467
+ const authTag = cipher.getAuthTag();
468
+
469
+ return {
470
+ ciphertext,
471
+ iv: iv.toString('hex'),
472
+ authTag: authTag.toString('hex')
473
+ };
474
+ }
475
+
476
+ function decrypt(data: EncryptedData, key: Buffer): string {
477
+ const decipher = crypto.createDecipheriv(
478
+ 'aes-256-gcm',
479
+ key,
480
+ Buffer.from(data.iv, 'hex')
481
+ );
482
+
483
+ decipher.setAuthTag(Buffer.from(data.authTag, 'hex'));
484
+
485
+ let plaintext = decipher.update(data.ciphertext, 'hex', 'utf8');
486
+ plaintext += decipher.final('utf8');
487
+
488
+ return plaintext;
489
+ }
490
+ ```
491
+
492
+ ### Timing-Safe Comparison
493
+ ```typescript
494
+ // SECURE: Constant-time comparison
495
+ import { timingSafeEqual } from 'crypto';
496
+
497
+ function verifyToken(provided: string, stored: string): boolean {
498
+ if (provided.length !== stored.length) {
499
+ return false;
500
+ }
501
+
502
+ return timingSafeEqual(
503
+ Buffer.from(provided),
504
+ Buffer.from(stored)
505
+ );
506
+ }
507
+ ```