@zigrivers/scaffold 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +477 -0
  3. package/dist/cli/commands/adopt.d.ts +12 -0
  4. package/dist/cli/commands/adopt.d.ts.map +1 -0
  5. package/dist/cli/commands/adopt.js +107 -0
  6. package/dist/cli/commands/adopt.js.map +1 -0
  7. package/dist/cli/commands/adopt.test.d.ts +2 -0
  8. package/dist/cli/commands/adopt.test.d.ts.map +1 -0
  9. package/dist/cli/commands/adopt.test.js +277 -0
  10. package/dist/cli/commands/adopt.test.js.map +1 -0
  11. package/dist/cli/commands/build.d.ts +12 -0
  12. package/dist/cli/commands/build.d.ts.map +1 -0
  13. package/dist/cli/commands/build.js +105 -0
  14. package/dist/cli/commands/build.js.map +1 -0
  15. package/dist/cli/commands/build.test.d.ts +2 -0
  16. package/dist/cli/commands/build.test.d.ts.map +1 -0
  17. package/dist/cli/commands/build.test.js +272 -0
  18. package/dist/cli/commands/build.test.js.map +1 -0
  19. package/dist/cli/commands/dashboard.d.ts +14 -0
  20. package/dist/cli/commands/dashboard.d.ts.map +1 -0
  21. package/dist/cli/commands/dashboard.js +102 -0
  22. package/dist/cli/commands/dashboard.js.map +1 -0
  23. package/dist/cli/commands/dashboard.test.d.ts +2 -0
  24. package/dist/cli/commands/dashboard.test.d.ts.map +1 -0
  25. package/dist/cli/commands/dashboard.test.js +142 -0
  26. package/dist/cli/commands/dashboard.test.js.map +1 -0
  27. package/dist/cli/commands/decisions.d.ts +13 -0
  28. package/dist/cli/commands/decisions.d.ts.map +1 -0
  29. package/dist/cli/commands/decisions.js +62 -0
  30. package/dist/cli/commands/decisions.js.map +1 -0
  31. package/dist/cli/commands/decisions.test.d.ts +2 -0
  32. package/dist/cli/commands/decisions.test.d.ts.map +1 -0
  33. package/dist/cli/commands/decisions.test.js +154 -0
  34. package/dist/cli/commands/decisions.test.js.map +1 -0
  35. package/dist/cli/commands/info.d.ts +12 -0
  36. package/dist/cli/commands/info.d.ts.map +1 -0
  37. package/dist/cli/commands/info.js +110 -0
  38. package/dist/cli/commands/info.js.map +1 -0
  39. package/dist/cli/commands/info.test.d.ts +2 -0
  40. package/dist/cli/commands/info.test.d.ts.map +1 -0
  41. package/dist/cli/commands/info.test.js +392 -0
  42. package/dist/cli/commands/info.test.js.map +1 -0
  43. package/dist/cli/commands/init.d.ts +13 -0
  44. package/dist/cli/commands/init.d.ts.map +1 -0
  45. package/dist/cli/commands/init.js +46 -0
  46. package/dist/cli/commands/init.js.map +1 -0
  47. package/dist/cli/commands/init.test.d.ts +2 -0
  48. package/dist/cli/commands/init.test.d.ts.map +1 -0
  49. package/dist/cli/commands/init.test.js +156 -0
  50. package/dist/cli/commands/init.test.js.map +1 -0
  51. package/dist/cli/commands/knowledge.d.ts +4 -0
  52. package/dist/cli/commands/knowledge.d.ts.map +1 -0
  53. package/dist/cli/commands/knowledge.js +346 -0
  54. package/dist/cli/commands/knowledge.js.map +1 -0
  55. package/dist/cli/commands/knowledge.test.d.ts +2 -0
  56. package/dist/cli/commands/knowledge.test.d.ts.map +1 -0
  57. package/dist/cli/commands/knowledge.test.js +293 -0
  58. package/dist/cli/commands/knowledge.test.js.map +1 -0
  59. package/dist/cli/commands/list.d.ts +12 -0
  60. package/dist/cli/commands/list.d.ts.map +1 -0
  61. package/dist/cli/commands/list.js +73 -0
  62. package/dist/cli/commands/list.js.map +1 -0
  63. package/dist/cli/commands/list.test.d.ts +2 -0
  64. package/dist/cli/commands/list.test.d.ts.map +1 -0
  65. package/dist/cli/commands/list.test.js +166 -0
  66. package/dist/cli/commands/list.test.js.map +1 -0
  67. package/dist/cli/commands/next.d.ts +12 -0
  68. package/dist/cli/commands/next.d.ts.map +1 -0
  69. package/dist/cli/commands/next.js +75 -0
  70. package/dist/cli/commands/next.js.map +1 -0
  71. package/dist/cli/commands/next.test.d.ts +2 -0
  72. package/dist/cli/commands/next.test.d.ts.map +1 -0
  73. package/dist/cli/commands/next.test.js +236 -0
  74. package/dist/cli/commands/next.test.js.map +1 -0
  75. package/dist/cli/commands/reset.d.ts +13 -0
  76. package/dist/cli/commands/reset.d.ts.map +1 -0
  77. package/dist/cli/commands/reset.js +105 -0
  78. package/dist/cli/commands/reset.js.map +1 -0
  79. package/dist/cli/commands/reset.test.d.ts +2 -0
  80. package/dist/cli/commands/reset.test.d.ts.map +1 -0
  81. package/dist/cli/commands/reset.test.js +211 -0
  82. package/dist/cli/commands/reset.test.js.map +1 -0
  83. package/dist/cli/commands/run.d.ts +14 -0
  84. package/dist/cli/commands/run.d.ts.map +1 -0
  85. package/dist/cli/commands/run.js +379 -0
  86. package/dist/cli/commands/run.js.map +1 -0
  87. package/dist/cli/commands/run.test.d.ts +2 -0
  88. package/dist/cli/commands/run.test.d.ts.map +1 -0
  89. package/dist/cli/commands/run.test.js +535 -0
  90. package/dist/cli/commands/run.test.js.map +1 -0
  91. package/dist/cli/commands/skip.d.ts +13 -0
  92. package/dist/cli/commands/skip.d.ts.map +1 -0
  93. package/dist/cli/commands/skip.js +123 -0
  94. package/dist/cli/commands/skip.js.map +1 -0
  95. package/dist/cli/commands/skip.test.d.ts +2 -0
  96. package/dist/cli/commands/skip.test.d.ts.map +1 -0
  97. package/dist/cli/commands/skip.test.js +339 -0
  98. package/dist/cli/commands/skip.test.js.map +1 -0
  99. package/dist/cli/commands/status.d.ts +12 -0
  100. package/dist/cli/commands/status.d.ts.map +1 -0
  101. package/dist/cli/commands/status.js +79 -0
  102. package/dist/cli/commands/status.js.map +1 -0
  103. package/dist/cli/commands/status.test.d.ts +2 -0
  104. package/dist/cli/commands/status.test.d.ts.map +1 -0
  105. package/dist/cli/commands/status.test.js +245 -0
  106. package/dist/cli/commands/status.test.js.map +1 -0
  107. package/dist/cli/commands/update.d.ts +11 -0
  108. package/dist/cli/commands/update.d.ts.map +1 -0
  109. package/dist/cli/commands/update.js +159 -0
  110. package/dist/cli/commands/update.js.map +1 -0
  111. package/dist/cli/commands/update.test.d.ts +2 -0
  112. package/dist/cli/commands/update.test.d.ts.map +1 -0
  113. package/dist/cli/commands/update.test.js +140 -0
  114. package/dist/cli/commands/update.test.js.map +1 -0
  115. package/dist/cli/commands/validate.d.ts +12 -0
  116. package/dist/cli/commands/validate.d.ts.map +1 -0
  117. package/dist/cli/commands/validate.js +65 -0
  118. package/dist/cli/commands/validate.js.map +1 -0
  119. package/dist/cli/commands/validate.test.d.ts +2 -0
  120. package/dist/cli/commands/validate.test.d.ts.map +1 -0
  121. package/dist/cli/commands/validate.test.js +159 -0
  122. package/dist/cli/commands/validate.test.js.map +1 -0
  123. package/dist/cli/commands/version.d.ts +13 -0
  124. package/dist/cli/commands/version.d.ts.map +1 -0
  125. package/dist/cli/commands/version.js +89 -0
  126. package/dist/cli/commands/version.js.map +1 -0
  127. package/dist/cli/commands/version.test.d.ts +2 -0
  128. package/dist/cli/commands/version.test.d.ts.map +1 -0
  129. package/dist/cli/commands/version.test.js +63 -0
  130. package/dist/cli/commands/version.test.js.map +1 -0
  131. package/dist/cli/index.d.ts +4 -0
  132. package/dist/cli/index.d.ts.map +1 -0
  133. package/dist/cli/index.js +72 -0
  134. package/dist/cli/index.js.map +1 -0
  135. package/dist/cli/index.test.d.ts +2 -0
  136. package/dist/cli/index.test.d.ts.map +1 -0
  137. package/dist/cli/index.test.js +8 -0
  138. package/dist/cli/index.test.js.map +1 -0
  139. package/dist/cli/middleware/output-mode.d.ts +21 -0
  140. package/dist/cli/middleware/output-mode.d.ts.map +1 -0
  141. package/dist/cli/middleware/output-mode.js +27 -0
  142. package/dist/cli/middleware/output-mode.js.map +1 -0
  143. package/dist/cli/middleware/output-mode.test.d.ts +2 -0
  144. package/dist/cli/middleware/output-mode.test.d.ts.map +1 -0
  145. package/dist/cli/middleware/output-mode.test.js +41 -0
  146. package/dist/cli/middleware/output-mode.test.js.map +1 -0
  147. package/dist/cli/middleware/project-root.d.ts +21 -0
  148. package/dist/cli/middleware/project-root.d.ts.map +1 -0
  149. package/dist/cli/middleware/project-root.js +54 -0
  150. package/dist/cli/middleware/project-root.js.map +1 -0
  151. package/dist/cli/middleware/project-root.test.d.ts +2 -0
  152. package/dist/cli/middleware/project-root.test.d.ts.map +1 -0
  153. package/dist/cli/middleware/project-root.test.js +112 -0
  154. package/dist/cli/middleware/project-root.test.js.map +1 -0
  155. package/dist/cli/output/auto.d.ts +18 -0
  156. package/dist/cli/output/auto.d.ts.map +1 -0
  157. package/dist/cli/output/auto.js +43 -0
  158. package/dist/cli/output/auto.js.map +1 -0
  159. package/dist/cli/output/context.d.ts +19 -0
  160. package/dist/cli/output/context.d.ts.map +1 -0
  161. package/dist/cli/output/context.js +15 -0
  162. package/dist/cli/output/context.js.map +1 -0
  163. package/dist/cli/output/context.test.d.ts +2 -0
  164. package/dist/cli/output/context.test.d.ts.map +1 -0
  165. package/dist/cli/output/context.test.js +335 -0
  166. package/dist/cli/output/context.test.js.map +1 -0
  167. package/dist/cli/output/error-display.d.ts +31 -0
  168. package/dist/cli/output/error-display.d.ts.map +1 -0
  169. package/dist/cli/output/error-display.js +79 -0
  170. package/dist/cli/output/error-display.js.map +1 -0
  171. package/dist/cli/output/error-display.test.d.ts +2 -0
  172. package/dist/cli/output/error-display.test.d.ts.map +1 -0
  173. package/dist/cli/output/error-display.test.js +230 -0
  174. package/dist/cli/output/error-display.test.js.map +1 -0
  175. package/dist/cli/output/interactive.d.ts +22 -0
  176. package/dist/cli/output/interactive.d.ts.map +1 -0
  177. package/dist/cli/output/interactive.js +126 -0
  178. package/dist/cli/output/interactive.js.map +1 -0
  179. package/dist/cli/output/json.d.ts +17 -0
  180. package/dist/cli/output/json.d.ts.map +1 -0
  181. package/dist/cli/output/json.js +62 -0
  182. package/dist/cli/output/json.js.map +1 -0
  183. package/dist/cli/types.d.ts +11 -0
  184. package/dist/cli/types.d.ts.map +1 -0
  185. package/dist/cli/types.js +2 -0
  186. package/dist/cli/types.js.map +1 -0
  187. package/dist/config/loader.d.ts +22 -0
  188. package/dist/config/loader.d.ts.map +1 -0
  189. package/dist/config/loader.js +159 -0
  190. package/dist/config/loader.js.map +1 -0
  191. package/dist/config/loader.test.d.ts +2 -0
  192. package/dist/config/loader.test.d.ts.map +1 -0
  193. package/dist/config/loader.test.js +226 -0
  194. package/dist/config/loader.test.js.map +1 -0
  195. package/dist/config/migration.d.ts +15 -0
  196. package/dist/config/migration.d.ts.map +1 -0
  197. package/dist/config/migration.js +39 -0
  198. package/dist/config/migration.js.map +1 -0
  199. package/dist/config/migration.test.d.ts +2 -0
  200. package/dist/config/migration.test.d.ts.map +1 -0
  201. package/dist/config/migration.test.js +44 -0
  202. package/dist/config/migration.test.js.map +1 -0
  203. package/dist/config/schema.d.ts +121 -0
  204. package/dist/config/schema.d.ts.map +1 -0
  205. package/dist/config/schema.js +22 -0
  206. package/dist/config/schema.js.map +1 -0
  207. package/dist/config/schema.test.d.ts +2 -0
  208. package/dist/config/schema.test.d.ts.map +1 -0
  209. package/dist/config/schema.test.js +126 -0
  210. package/dist/config/schema.test.js.map +1 -0
  211. package/dist/core/adapters/adapter.d.ts +64 -0
  212. package/dist/core/adapters/adapter.d.ts.map +1 -0
  213. package/dist/core/adapters/adapter.js +25 -0
  214. package/dist/core/adapters/adapter.js.map +1 -0
  215. package/dist/core/adapters/adapter.test.d.ts +2 -0
  216. package/dist/core/adapters/adapter.test.d.ts.map +1 -0
  217. package/dist/core/adapters/adapter.test.js +175 -0
  218. package/dist/core/adapters/adapter.test.js.map +1 -0
  219. package/dist/core/adapters/claude-code.d.ts +9 -0
  220. package/dist/core/adapters/claude-code.d.ts.map +1 -0
  221. package/dist/core/adapters/claude-code.js +34 -0
  222. package/dist/core/adapters/claude-code.js.map +1 -0
  223. package/dist/core/adapters/claude-code.test.d.ts +2 -0
  224. package/dist/core/adapters/claude-code.test.d.ts.map +1 -0
  225. package/dist/core/adapters/claude-code.test.js +100 -0
  226. package/dist/core/adapters/claude-code.test.js.map +1 -0
  227. package/dist/core/adapters/codex.d.ts +10 -0
  228. package/dist/core/adapters/codex.d.ts.map +1 -0
  229. package/dist/core/adapters/codex.js +61 -0
  230. package/dist/core/adapters/codex.js.map +1 -0
  231. package/dist/core/adapters/codex.test.d.ts +2 -0
  232. package/dist/core/adapters/codex.test.d.ts.map +1 -0
  233. package/dist/core/adapters/codex.test.js +122 -0
  234. package/dist/core/adapters/codex.test.js.map +1 -0
  235. package/dist/core/adapters/universal.d.ts +10 -0
  236. package/dist/core/adapters/universal.d.ts.map +1 -0
  237. package/dist/core/adapters/universal.js +45 -0
  238. package/dist/core/adapters/universal.js.map +1 -0
  239. package/dist/core/adapters/universal.test.d.ts +2 -0
  240. package/dist/core/adapters/universal.test.d.ts.map +1 -0
  241. package/dist/core/adapters/universal.test.js +121 -0
  242. package/dist/core/adapters/universal.test.js.map +1 -0
  243. package/dist/core/assembly/context-gatherer.d.ts +17 -0
  244. package/dist/core/assembly/context-gatherer.d.ts.map +1 -0
  245. package/dist/core/assembly/context-gatherer.js +49 -0
  246. package/dist/core/assembly/context-gatherer.js.map +1 -0
  247. package/dist/core/assembly/context-gatherer.test.d.ts +2 -0
  248. package/dist/core/assembly/context-gatherer.test.d.ts.map +1 -0
  249. package/dist/core/assembly/context-gatherer.test.js +252 -0
  250. package/dist/core/assembly/context-gatherer.test.js.map +1 -0
  251. package/dist/core/assembly/depth-resolver.d.ts +11 -0
  252. package/dist/core/assembly/depth-resolver.d.ts.map +1 -0
  253. package/dist/core/assembly/depth-resolver.js +23 -0
  254. package/dist/core/assembly/depth-resolver.js.map +1 -0
  255. package/dist/core/assembly/depth-resolver.test.d.ts +2 -0
  256. package/dist/core/assembly/depth-resolver.test.d.ts.map +1 -0
  257. package/dist/core/assembly/depth-resolver.test.js +100 -0
  258. package/dist/core/assembly/depth-resolver.test.js.map +1 -0
  259. package/dist/core/assembly/engine.d.ts +22 -0
  260. package/dist/core/assembly/engine.d.ts.map +1 -0
  261. package/dist/core/assembly/engine.js +215 -0
  262. package/dist/core/assembly/engine.js.map +1 -0
  263. package/dist/core/assembly/engine.test.d.ts +2 -0
  264. package/dist/core/assembly/engine.test.d.ts.map +1 -0
  265. package/dist/core/assembly/engine.test.js +462 -0
  266. package/dist/core/assembly/engine.test.js.map +1 -0
  267. package/dist/core/assembly/instruction-loader.d.ts +16 -0
  268. package/dist/core/assembly/instruction-loader.d.ts.map +1 -0
  269. package/dist/core/assembly/instruction-loader.js +40 -0
  270. package/dist/core/assembly/instruction-loader.js.map +1 -0
  271. package/dist/core/assembly/instruction-loader.test.d.ts +2 -0
  272. package/dist/core/assembly/instruction-loader.test.d.ts.map +1 -0
  273. package/dist/core/assembly/instruction-loader.test.js +109 -0
  274. package/dist/core/assembly/instruction-loader.test.js.map +1 -0
  275. package/dist/core/assembly/knowledge-loader.d.ts +34 -0
  276. package/dist/core/assembly/knowledge-loader.d.ts.map +1 -0
  277. package/dist/core/assembly/knowledge-loader.js +204 -0
  278. package/dist/core/assembly/knowledge-loader.js.map +1 -0
  279. package/dist/core/assembly/knowledge-loader.test.d.ts +2 -0
  280. package/dist/core/assembly/knowledge-loader.test.d.ts.map +1 -0
  281. package/dist/core/assembly/knowledge-loader.test.js +205 -0
  282. package/dist/core/assembly/knowledge-loader.test.js.map +1 -0
  283. package/dist/core/assembly/meta-prompt-loader.d.ts +13 -0
  284. package/dist/core/assembly/meta-prompt-loader.d.ts.map +1 -0
  285. package/dist/core/assembly/meta-prompt-loader.js +91 -0
  286. package/dist/core/assembly/meta-prompt-loader.js.map +1 -0
  287. package/dist/core/assembly/meta-prompt-loader.test.d.ts +2 -0
  288. package/dist/core/assembly/meta-prompt-loader.test.d.ts.map +1 -0
  289. package/dist/core/assembly/meta-prompt-loader.test.js +232 -0
  290. package/dist/core/assembly/meta-prompt-loader.test.js.map +1 -0
  291. package/dist/core/assembly/methodology-change.d.ts +27 -0
  292. package/dist/core/assembly/methodology-change.d.ts.map +1 -0
  293. package/dist/core/assembly/methodology-change.js +41 -0
  294. package/dist/core/assembly/methodology-change.js.map +1 -0
  295. package/dist/core/assembly/methodology-change.test.d.ts +2 -0
  296. package/dist/core/assembly/methodology-change.test.d.ts.map +1 -0
  297. package/dist/core/assembly/methodology-change.test.js +145 -0
  298. package/dist/core/assembly/methodology-change.test.js.map +1 -0
  299. package/dist/core/assembly/methodology-resolver.d.ts +11 -0
  300. package/dist/core/assembly/methodology-resolver.d.ts.map +1 -0
  301. package/dist/core/assembly/methodology-resolver.js +19 -0
  302. package/dist/core/assembly/methodology-resolver.js.map +1 -0
  303. package/dist/core/assembly/methodology-resolver.test.d.ts +2 -0
  304. package/dist/core/assembly/methodology-resolver.test.d.ts.map +1 -0
  305. package/dist/core/assembly/methodology-resolver.test.js +87 -0
  306. package/dist/core/assembly/methodology-resolver.test.js.map +1 -0
  307. package/dist/core/assembly/preset-loader.d.ts +26 -0
  308. package/dist/core/assembly/preset-loader.d.ts.map +1 -0
  309. package/dist/core/assembly/preset-loader.js +146 -0
  310. package/dist/core/assembly/preset-loader.js.map +1 -0
  311. package/dist/core/assembly/preset-loader.test.d.ts +2 -0
  312. package/dist/core/assembly/preset-loader.test.d.ts.map +1 -0
  313. package/dist/core/assembly/preset-loader.test.js +107 -0
  314. package/dist/core/assembly/preset-loader.test.js.map +1 -0
  315. package/dist/core/assembly/update-mode.d.ts +25 -0
  316. package/dist/core/assembly/update-mode.d.ts.map +1 -0
  317. package/dist/core/assembly/update-mode.js +70 -0
  318. package/dist/core/assembly/update-mode.js.map +1 -0
  319. package/dist/core/assembly/update-mode.test.d.ts +2 -0
  320. package/dist/core/assembly/update-mode.test.d.ts.map +1 -0
  321. package/dist/core/assembly/update-mode.test.js +235 -0
  322. package/dist/core/assembly/update-mode.test.js.map +1 -0
  323. package/dist/core/dependency/dependency.d.ts +20 -0
  324. package/dist/core/dependency/dependency.d.ts.map +1 -0
  325. package/dist/core/dependency/dependency.js +104 -0
  326. package/dist/core/dependency/dependency.js.map +1 -0
  327. package/dist/core/dependency/dependency.test.d.ts +2 -0
  328. package/dist/core/dependency/dependency.test.d.ts.map +1 -0
  329. package/dist/core/dependency/dependency.test.js +166 -0
  330. package/dist/core/dependency/dependency.test.js.map +1 -0
  331. package/dist/core/dependency/eligibility.d.ts +17 -0
  332. package/dist/core/dependency/eligibility.d.ts.map +1 -0
  333. package/dist/core/dependency/eligibility.js +60 -0
  334. package/dist/core/dependency/eligibility.js.map +1 -0
  335. package/dist/core/dependency/eligibility.test.d.ts +2 -0
  336. package/dist/core/dependency/eligibility.test.d.ts.map +1 -0
  337. package/dist/core/dependency/eligibility.test.js +198 -0
  338. package/dist/core/dependency/eligibility.test.js.map +1 -0
  339. package/dist/core/dependency/graph.d.ts +12 -0
  340. package/dist/core/dependency/graph.d.ts.map +1 -0
  341. package/dist/core/dependency/graph.js +34 -0
  342. package/dist/core/dependency/graph.js.map +1 -0
  343. package/dist/core/knowledge/knowledge-update-assembler.d.ts +24 -0
  344. package/dist/core/knowledge/knowledge-update-assembler.d.ts.map +1 -0
  345. package/dist/core/knowledge/knowledge-update-assembler.js +46 -0
  346. package/dist/core/knowledge/knowledge-update-assembler.js.map +1 -0
  347. package/dist/core/knowledge/knowledge-update-assembler.test.d.ts +2 -0
  348. package/dist/core/knowledge/knowledge-update-assembler.test.d.ts.map +1 -0
  349. package/dist/core/knowledge/knowledge-update-assembler.test.js +93 -0
  350. package/dist/core/knowledge/knowledge-update-assembler.test.js.map +1 -0
  351. package/dist/core/knowledge/knowledge-update-template.md +55 -0
  352. package/dist/dashboard/generator.d.ts +37 -0
  353. package/dist/dashboard/generator.d.ts.map +1 -0
  354. package/dist/dashboard/generator.js +42 -0
  355. package/dist/dashboard/generator.js.map +1 -0
  356. package/dist/dashboard/generator.test.d.ts +2 -0
  357. package/dist/dashboard/generator.test.d.ts.map +1 -0
  358. package/dist/dashboard/generator.test.js +186 -0
  359. package/dist/dashboard/generator.test.js.map +1 -0
  360. package/dist/dashboard/template.d.ts +4 -0
  361. package/dist/dashboard/template.d.ts.map +1 -0
  362. package/dist/dashboard/template.js +190 -0
  363. package/dist/dashboard/template.js.map +1 -0
  364. package/dist/e2e/commands.test.d.ts +9 -0
  365. package/dist/e2e/commands.test.d.ts.map +1 -0
  366. package/dist/e2e/commands.test.js +499 -0
  367. package/dist/e2e/commands.test.js.map +1 -0
  368. package/dist/e2e/init.test.d.ts +10 -0
  369. package/dist/e2e/init.test.d.ts.map +1 -0
  370. package/dist/e2e/init.test.js +180 -0
  371. package/dist/e2e/init.test.js.map +1 -0
  372. package/dist/e2e/knowledge.test.d.ts +2 -0
  373. package/dist/e2e/knowledge.test.d.ts.map +1 -0
  374. package/dist/e2e/knowledge.test.js +103 -0
  375. package/dist/e2e/knowledge.test.js.map +1 -0
  376. package/dist/e2e/pipeline.test.d.ts +8 -0
  377. package/dist/e2e/pipeline.test.d.ts.map +1 -0
  378. package/dist/e2e/pipeline.test.js +295 -0
  379. package/dist/e2e/pipeline.test.js.map +1 -0
  380. package/dist/index.d.ts +3 -0
  381. package/dist/index.d.ts.map +1 -0
  382. package/dist/index.js +7 -0
  383. package/dist/index.js.map +1 -0
  384. package/dist/project/adopt.d.ts +28 -0
  385. package/dist/project/adopt.d.ts.map +1 -0
  386. package/dist/project/adopt.js +49 -0
  387. package/dist/project/adopt.js.map +1 -0
  388. package/dist/project/adopt.test.d.ts +2 -0
  389. package/dist/project/adopt.test.d.ts.map +1 -0
  390. package/dist/project/adopt.test.js +220 -0
  391. package/dist/project/adopt.test.js.map +1 -0
  392. package/dist/project/claude-md.d.ts +33 -0
  393. package/dist/project/claude-md.d.ts.map +1 -0
  394. package/dist/project/claude-md.js +112 -0
  395. package/dist/project/claude-md.js.map +1 -0
  396. package/dist/project/claude-md.test.d.ts +2 -0
  397. package/dist/project/claude-md.test.d.ts.map +1 -0
  398. package/dist/project/claude-md.test.js +151 -0
  399. package/dist/project/claude-md.test.js.map +1 -0
  400. package/dist/project/detector.d.ts +7 -0
  401. package/dist/project/detector.d.ts.map +1 -0
  402. package/dist/project/detector.js +78 -0
  403. package/dist/project/detector.js.map +1 -0
  404. package/dist/project/detector.test.d.ts +2 -0
  405. package/dist/project/detector.test.d.ts.map +1 -0
  406. package/dist/project/detector.test.js +137 -0
  407. package/dist/project/detector.test.js.map +1 -0
  408. package/dist/project/frontmatter.d.ts +17 -0
  409. package/dist/project/frontmatter.d.ts.map +1 -0
  410. package/dist/project/frontmatter.js +236 -0
  411. package/dist/project/frontmatter.js.map +1 -0
  412. package/dist/project/frontmatter.test.d.ts +2 -0
  413. package/dist/project/frontmatter.test.d.ts.map +1 -0
  414. package/dist/project/frontmatter.test.js +218 -0
  415. package/dist/project/frontmatter.test.js.map +1 -0
  416. package/dist/project/signals.d.ts +12 -0
  417. package/dist/project/signals.d.ts.map +1 -0
  418. package/dist/project/signals.js +2 -0
  419. package/dist/project/signals.js.map +1 -0
  420. package/dist/state/completion.d.ts +22 -0
  421. package/dist/state/completion.d.ts.map +1 -0
  422. package/dist/state/completion.js +82 -0
  423. package/dist/state/completion.js.map +1 -0
  424. package/dist/state/completion.test.d.ts +2 -0
  425. package/dist/state/completion.test.d.ts.map +1 -0
  426. package/dist/state/completion.test.js +246 -0
  427. package/dist/state/completion.test.js.map +1 -0
  428. package/dist/state/decision-logger.d.ts +16 -0
  429. package/dist/state/decision-logger.d.ts.map +1 -0
  430. package/dist/state/decision-logger.js +80 -0
  431. package/dist/state/decision-logger.js.map +1 -0
  432. package/dist/state/decision-logger.test.d.ts +2 -0
  433. package/dist/state/decision-logger.test.d.ts.map +1 -0
  434. package/dist/state/decision-logger.test.js +182 -0
  435. package/dist/state/decision-logger.test.js.map +1 -0
  436. package/dist/state/lock-manager.d.ts +18 -0
  437. package/dist/state/lock-manager.d.ts.map +1 -0
  438. package/dist/state/lock-manager.js +134 -0
  439. package/dist/state/lock-manager.js.map +1 -0
  440. package/dist/state/lock-manager.test.d.ts +2 -0
  441. package/dist/state/lock-manager.test.d.ts.map +1 -0
  442. package/dist/state/lock-manager.test.js +190 -0
  443. package/dist/state/lock-manager.test.js.map +1 -0
  444. package/dist/state/state-manager.d.ts +37 -0
  445. package/dist/state/state-manager.d.ts.map +1 -0
  446. package/dist/state/state-manager.js +125 -0
  447. package/dist/state/state-manager.js.map +1 -0
  448. package/dist/state/state-manager.test.d.ts +2 -0
  449. package/dist/state/state-manager.test.d.ts.map +1 -0
  450. package/dist/state/state-manager.test.js +240 -0
  451. package/dist/state/state-manager.test.js.map +1 -0
  452. package/dist/types/adapter.d.ts +24 -0
  453. package/dist/types/adapter.d.ts.map +1 -0
  454. package/dist/types/adapter.js +2 -0
  455. package/dist/types/adapter.js.map +1 -0
  456. package/dist/types/assembly.d.ts +89 -0
  457. package/dist/types/assembly.d.ts.map +1 -0
  458. package/dist/types/assembly.js +2 -0
  459. package/dist/types/assembly.js.map +1 -0
  460. package/dist/types/claude-md.d.ts +11 -0
  461. package/dist/types/claude-md.d.ts.map +1 -0
  462. package/dist/types/claude-md.js +2 -0
  463. package/dist/types/claude-md.js.map +1 -0
  464. package/dist/types/cli.d.ts +15 -0
  465. package/dist/types/cli.d.ts.map +1 -0
  466. package/dist/types/cli.js +2 -0
  467. package/dist/types/cli.js.map +1 -0
  468. package/dist/types/config.d.ts +40 -0
  469. package/dist/types/config.d.ts.map +1 -0
  470. package/dist/types/config.js +2 -0
  471. package/dist/types/config.js.map +1 -0
  472. package/dist/types/decision.d.ts +14 -0
  473. package/dist/types/decision.d.ts.map +1 -0
  474. package/dist/types/decision.js +2 -0
  475. package/dist/types/decision.js.map +1 -0
  476. package/dist/types/dependency.d.ts +12 -0
  477. package/dist/types/dependency.d.ts.map +1 -0
  478. package/dist/types/dependency.js +2 -0
  479. package/dist/types/dependency.js.map +1 -0
  480. package/dist/types/enums.d.ts +23 -0
  481. package/dist/types/enums.d.ts.map +1 -0
  482. package/dist/types/enums.js +11 -0
  483. package/dist/types/enums.js.map +1 -0
  484. package/dist/types/enums.test.d.ts +2 -0
  485. package/dist/types/enums.test.d.ts.map +1 -0
  486. package/dist/types/enums.test.js +13 -0
  487. package/dist/types/enums.test.js.map +1 -0
  488. package/dist/types/errors.d.ts +24 -0
  489. package/dist/types/errors.d.ts.map +1 -0
  490. package/dist/types/errors.js +2 -0
  491. package/dist/types/errors.js.map +1 -0
  492. package/dist/types/frontmatter.d.ts +43 -0
  493. package/dist/types/frontmatter.d.ts.map +1 -0
  494. package/dist/types/frontmatter.js +2 -0
  495. package/dist/types/frontmatter.js.map +1 -0
  496. package/dist/types/index.d.ts +14 -0
  497. package/dist/types/index.d.ts.map +1 -0
  498. package/dist/types/index.js +14 -0
  499. package/dist/types/index.js.map +1 -0
  500. package/dist/types/lock.d.ts +10 -0
  501. package/dist/types/lock.d.ts.map +1 -0
  502. package/dist/types/lock.js +2 -0
  503. package/dist/types/lock.js.map +1 -0
  504. package/dist/types/state.d.ts +49 -0
  505. package/dist/types/state.d.ts.map +1 -0
  506. package/dist/types/state.js +2 -0
  507. package/dist/types/state.js.map +1 -0
  508. package/dist/types/wizard.d.ts +14 -0
  509. package/dist/types/wizard.d.ts.map +1 -0
  510. package/dist/types/wizard.js +2 -0
  511. package/dist/types/wizard.js.map +1 -0
  512. package/dist/utils/errors.d.ts +42 -0
  513. package/dist/utils/errors.d.ts.map +1 -0
  514. package/dist/utils/errors.js +232 -0
  515. package/dist/utils/errors.js.map +1 -0
  516. package/dist/utils/errors.test.d.ts +2 -0
  517. package/dist/utils/errors.test.d.ts.map +1 -0
  518. package/dist/utils/errors.test.js +91 -0
  519. package/dist/utils/errors.test.js.map +1 -0
  520. package/dist/utils/fs.d.ts +11 -0
  521. package/dist/utils/fs.d.ts.map +1 -0
  522. package/dist/utils/fs.js +20 -0
  523. package/dist/utils/fs.js.map +1 -0
  524. package/dist/utils/fs.test.d.ts +2 -0
  525. package/dist/utils/fs.test.d.ts.map +1 -0
  526. package/dist/utils/fs.test.js +93 -0
  527. package/dist/utils/fs.test.js.map +1 -0
  528. package/dist/utils/index.d.ts +4 -0
  529. package/dist/utils/index.d.ts.map +1 -0
  530. package/dist/utils/index.js +4 -0
  531. package/dist/utils/index.js.map +1 -0
  532. package/dist/utils/levenshtein.d.ts +11 -0
  533. package/dist/utils/levenshtein.d.ts.map +1 -0
  534. package/dist/utils/levenshtein.js +37 -0
  535. package/dist/utils/levenshtein.js.map +1 -0
  536. package/dist/utils/levenshtein.test.d.ts +2 -0
  537. package/dist/utils/levenshtein.test.d.ts.map +1 -0
  538. package/dist/utils/levenshtein.test.js +34 -0
  539. package/dist/utils/levenshtein.test.js.map +1 -0
  540. package/dist/validation/config-validator.d.ts +10 -0
  541. package/dist/validation/config-validator.d.ts.map +1 -0
  542. package/dist/validation/config-validator.js +11 -0
  543. package/dist/validation/config-validator.js.map +1 -0
  544. package/dist/validation/dependency-validator.d.ts +10 -0
  545. package/dist/validation/dependency-validator.d.ts.map +1 -0
  546. package/dist/validation/dependency-validator.js +34 -0
  547. package/dist/validation/dependency-validator.js.map +1 -0
  548. package/dist/validation/frontmatter-validator.d.ts +12 -0
  549. package/dist/validation/frontmatter-validator.d.ts.map +1 -0
  550. package/dist/validation/frontmatter-validator.js +50 -0
  551. package/dist/validation/frontmatter-validator.js.map +1 -0
  552. package/dist/validation/index.d.ts +19 -0
  553. package/dist/validation/index.d.ts.map +1 -0
  554. package/dist/validation/index.js +64 -0
  555. package/dist/validation/index.js.map +1 -0
  556. package/dist/validation/index.test.d.ts +2 -0
  557. package/dist/validation/index.test.d.ts.map +1 -0
  558. package/dist/validation/index.test.js +241 -0
  559. package/dist/validation/index.test.js.map +1 -0
  560. package/dist/validation/state-validator.d.ts +15 -0
  561. package/dist/validation/state-validator.d.ts.map +1 -0
  562. package/dist/validation/state-validator.js +104 -0
  563. package/dist/validation/state-validator.js.map +1 -0
  564. package/dist/wizard/questions.d.ts +18 -0
  565. package/dist/wizard/questions.d.ts.map +1 -0
  566. package/dist/wizard/questions.js +46 -0
  567. package/dist/wizard/questions.js.map +1 -0
  568. package/dist/wizard/suggestion.d.ts +10 -0
  569. package/dist/wizard/suggestion.d.ts.map +1 -0
  570. package/dist/wizard/suggestion.js +17 -0
  571. package/dist/wizard/suggestion.js.map +1 -0
  572. package/dist/wizard/wizard.d.ts +19 -0
  573. package/dist/wizard/wizard.d.ts.map +1 -0
  574. package/dist/wizard/wizard.js +104 -0
  575. package/dist/wizard/wizard.js.map +1 -0
  576. package/dist/wizard/wizard.test.d.ts +2 -0
  577. package/dist/wizard/wizard.test.d.ts.map +1 -0
  578. package/dist/wizard/wizard.test.js +167 -0
  579. package/dist/wizard/wizard.test.js.map +1 -0
  580. package/knowledge/core/adr-craft.md +281 -0
  581. package/knowledge/core/api-design.md +501 -0
  582. package/knowledge/core/database-design.md +380 -0
  583. package/knowledge/core/domain-modeling.md +317 -0
  584. package/knowledge/core/operations-runbook.md +513 -0
  585. package/knowledge/core/security-review.md +523 -0
  586. package/knowledge/core/system-architecture.md +402 -0
  587. package/knowledge/core/task-decomposition.md +372 -0
  588. package/knowledge/core/testing-strategy.md +409 -0
  589. package/knowledge/core/user-stories.md +337 -0
  590. package/knowledge/core/user-story-innovation.md +171 -0
  591. package/knowledge/core/ux-specification.md +380 -0
  592. package/knowledge/finalization/apply-fixes-and-freeze.md +93 -0
  593. package/knowledge/finalization/developer-onboarding.md +376 -0
  594. package/knowledge/finalization/implementation-playbook.md +404 -0
  595. package/knowledge/product/gap-analysis.md +305 -0
  596. package/knowledge/product/prd-craft.md +324 -0
  597. package/knowledge/product/prd-innovation.md +204 -0
  598. package/knowledge/review/review-adr.md +203 -0
  599. package/knowledge/review/review-api-contracts.md +233 -0
  600. package/knowledge/review/review-database-schema.md +229 -0
  601. package/knowledge/review/review-domain-modeling.md +288 -0
  602. package/knowledge/review/review-implementation-tasks.md +202 -0
  603. package/knowledge/review/review-methodology.md +215 -0
  604. package/knowledge/review/review-operations.md +212 -0
  605. package/knowledge/review/review-prd.md +235 -0
  606. package/knowledge/review/review-security.md +213 -0
  607. package/knowledge/review/review-system-architecture.md +296 -0
  608. package/knowledge/review/review-testing-strategy.md +176 -0
  609. package/knowledge/review/review-user-stories.md +172 -0
  610. package/knowledge/review/review-ux-spec.md +208 -0
  611. package/knowledge/validation/critical-path-analysis.md +203 -0
  612. package/knowledge/validation/cross-phase-consistency.md +181 -0
  613. package/knowledge/validation/decision-completeness.md +218 -0
  614. package/knowledge/validation/dependency-validation.md +233 -0
  615. package/knowledge/validation/implementability-review.md +252 -0
  616. package/knowledge/validation/scope-management.md +223 -0
  617. package/knowledge/validation/traceability.md +198 -0
  618. package/methodology/custom-defaults.yml +43 -0
  619. package/methodology/deep.yml +42 -0
  620. package/methodology/mvp.yml +42 -0
  621. package/package.json +58 -0
  622. package/pipeline/architecture/review-architecture.md +44 -0
  623. package/pipeline/architecture/system-architecture.md +45 -0
  624. package/pipeline/decisions/adrs.md +45 -0
  625. package/pipeline/decisions/review-adrs.md +39 -0
  626. package/pipeline/finalization/apply-fixes-and-freeze.md +39 -0
  627. package/pipeline/finalization/developer-onboarding-guide.md +36 -0
  628. package/pipeline/finalization/implementation-playbook.md +45 -0
  629. package/pipeline/modeling/domain-modeling.md +57 -0
  630. package/pipeline/modeling/review-domain-modeling.md +41 -0
  631. package/pipeline/planning/implementation-tasks.md +57 -0
  632. package/pipeline/planning/review-tasks.md +38 -0
  633. package/pipeline/pre/create-prd.md +45 -0
  634. package/pipeline/pre/innovate-prd.md +47 -0
  635. package/pipeline/pre/innovate-user-stories.md +47 -0
  636. package/pipeline/pre/review-prd.md +44 -0
  637. package/pipeline/pre/review-user-stories.md +43 -0
  638. package/pipeline/pre/user-stories.md +48 -0
  639. package/pipeline/quality/operations.md +42 -0
  640. package/pipeline/quality/review-operations.md +37 -0
  641. package/pipeline/quality/review-security.md +40 -0
  642. package/pipeline/quality/review-testing.md +39 -0
  643. package/pipeline/quality/security.md +44 -0
  644. package/pipeline/quality/testing-strategy.md +42 -0
  645. package/pipeline/specification/api-contracts.md +44 -0
  646. package/pipeline/specification/database-schema.md +41 -0
  647. package/pipeline/specification/review-api.md +40 -0
  648. package/pipeline/specification/review-database.md +39 -0
  649. package/pipeline/specification/review-ux.md +38 -0
  650. package/pipeline/specification/ux-spec.md +43 -0
  651. package/pipeline/validation/critical-path-walkthrough.md +37 -0
  652. package/pipeline/validation/cross-phase-consistency.md +35 -0
  653. package/pipeline/validation/decision-completeness.md +36 -0
  654. package/pipeline/validation/dependency-graph-validation.md +36 -0
  655. package/pipeline/validation/implementability-dry-run.md +36 -0
  656. package/pipeline/validation/scope-creep-check.md +38 -0
  657. package/pipeline/validation/traceability-matrix.md +36 -0
@@ -0,0 +1,523 @@
1
+ ---
2
+ name: security-review
3
+ description: OWASP Top 10, authentication, authorization, data protection, and threat modeling
4
+ topics: [security, owasp, authentication, authorization, threat-modeling, secrets-management, dependency-auditing]
5
+ ---
6
+
7
+ ## OWASP Top 10
8
+
9
+ The OWASP Top 10 represents the most critical security risks to web applications. Every project should evaluate each risk and implement appropriate mitigations.
10
+
11
+ ### A01: Broken Access Control
12
+
13
+ Users act outside their intended permissions: accessing other users' data, modifying records they shouldn't, escalating privileges.
14
+
15
+ **Attack patterns:**
16
+ - Modifying URL parameters to access another user's resource (`/api/users/123` -> `/api/users/456`)
17
+ - Bypassing access control checks by sending requests directly to the API (skipping frontend checks)
18
+ - Privilege escalation by manipulating JWT claims or session data
19
+ - Accessing admin endpoints without admin role
20
+
21
+ **Mitigations:**
22
+ - Deny by default: every endpoint requires explicit permission grants
23
+ - Verify resource ownership on every request, not just at the UI level
24
+ - Use parameterized access control (the user can access records where `owner_id = authenticated_user_id`)
25
+ - Server-side enforcement — never rely on client-side checks alone
26
+ - Log and alert on access control failures
27
+
28
+ ```typescript
29
+ // BAD: Only checks if user is authenticated, not if they own the resource
30
+ app.get('/api/orders/:id', requireAuth, async (req, res) => {
31
+ const order = await db.orders.findById(req.params.id);
32
+ res.json(order);
33
+ });
34
+
35
+ // GOOD: Verifies the authenticated user owns the requested resource
36
+ app.get('/api/orders/:id', requireAuth, async (req, res) => {
37
+ const order = await db.orders.findById(req.params.id);
38
+ if (!order || order.userId !== req.user.id) {
39
+ return res.status(404).json({ error: { code: 'NOT_FOUND' } });
40
+ }
41
+ res.json(order);
42
+ });
43
+ ```
44
+
45
+ ### A02: Cryptographic Failures
46
+
47
+ Sensitive data exposed due to weak or missing encryption.
48
+
49
+ **At-risk data:** Passwords, credit card numbers, health records, personal data, API keys, session tokens.
50
+
51
+ **Mitigations:**
52
+ - Classify data by sensitivity (public, internal, confidential, restricted)
53
+ - Encrypt sensitive data at rest (database encryption, encrypted backups)
54
+ - Use TLS 1.2+ for all data in transit (HTTPS everywhere, no mixed content)
55
+ - Hash passwords with bcrypt, scrypt, or Argon2 (NEVER MD5 or SHA-256 for passwords)
56
+ - Don't store sensitive data you don't need — the safest data is data you don't have
57
+
58
+ ### A03: Injection
59
+
60
+ Untrusted data sent to an interpreter as part of a command or query, causing unintended execution.
61
+
62
+ **SQL injection:**
63
+
64
+ ```typescript
65
+ // BAD: String concatenation — vulnerable
66
+ const query = `SELECT * FROM users WHERE email = '${email}'`;
67
+
68
+ // GOOD: Parameterized query — safe
69
+ const query = `SELECT * FROM users WHERE email = $1`;
70
+ const result = await db.query(query, [email]);
71
+
72
+ // GOOD: ORM with parameterized API — safe
73
+ const user = await db.users.findFirst({ where: { email } });
74
+ ```
75
+
76
+ **NoSQL injection:**
77
+
78
+ ```typescript
79
+ // BAD: User input directly in query object
80
+ db.users.find({ email: req.body.email, password: req.body.password });
81
+ // Attacker sends: { "password": { "$ne": "" } } — bypasses password check
82
+
83
+ // GOOD: Validate and sanitize input types before use
84
+ const email = String(req.body.email);
85
+ const passwordHash = await hash(String(req.body.password));
86
+ db.users.find({ email, passwordHash });
87
+ ```
88
+
89
+ **Command injection:**
90
+
91
+ ```typescript
92
+ // BAD: User input in shell command
93
+ exec(`convert ${userFilename} output.png`);
94
+
95
+ // GOOD: Use library APIs instead of shell commands
96
+ sharp(userFilePath).toFile('output.png');
97
+ ```
98
+
99
+ **Prevention rules:**
100
+ - Use parameterized queries for all database access
101
+ - Use ORM/query builders that parameterize automatically
102
+ - Validate and sanitize all user input at the boundary
103
+ - Never construct shell commands from user input
104
+
105
+ ### A04: Insecure Design
106
+
107
+ Security flaws from missing or ineffective control design, as opposed to implementation bugs. These are architectural problems.
108
+
109
+ **Examples:**
110
+ - Password reset via security questions (attackable)
111
+ - No rate limiting on login endpoint (brute force possible)
112
+ - No account lockout policy (unlimited password attempts)
113
+ - Returning different error messages for "user not found" vs. "wrong password" (user enumeration)
114
+
115
+ **Mitigations:**
116
+ - Threat model during design phase, not after implementation
117
+ - Use established security patterns (don't invent custom auth)
118
+ - Rate limit all authentication endpoints
119
+ - Return generic error messages for auth failures ("Invalid credentials" for both wrong email and wrong password)
120
+ - Require MFA for sensitive operations
121
+
122
+ ### A05: Security Misconfiguration
123
+
124
+ Default credentials, unnecessary features enabled, verbose error messages, missing security headers.
125
+
126
+ **Common misconfigurations:**
127
+ - Debug mode enabled in production (stack traces exposed)
128
+ - Default database passwords unchanged
129
+ - Directory listing enabled on web server
130
+ - Unnecessary HTTP methods enabled (TRACE, OPTIONS returning too much)
131
+ - Missing security headers (CSP, X-Frame-Options, X-Content-Type-Options)
132
+
133
+ **Mitigations:**
134
+ - Hardened configuration for each environment (dev uses relaxed settings; production uses strict settings)
135
+ - Remove default accounts and sample data before deployment
136
+ - Disable stack traces and verbose error messages in production
137
+ - Set security headers on all responses:
138
+
139
+ ```
140
+ Content-Security-Policy: default-src 'self'; script-src 'self'
141
+ X-Content-Type-Options: nosniff
142
+ X-Frame-Options: DENY
143
+ Strict-Transport-Security: max-age=31536000; includeSubDomains
144
+ Referrer-Policy: strict-origin-when-cross-origin
145
+ Permissions-Policy: camera=(), microphone=(), geolocation=()
146
+ ```
147
+
148
+ ### A06: Vulnerable and Outdated Components
149
+
150
+ Using libraries with known vulnerabilities.
151
+
152
+ **Mitigations:**
153
+ - Run dependency audit on every CI build (`npm audit`, `pip audit`, `cargo audit`)
154
+ - Subscribe to security advisories for critical dependencies
155
+ - Update dependencies regularly (weekly for patch versions, monthly for minor)
156
+ - Pin dependency versions (use lockfiles: `package-lock.json`, `poetry.lock`)
157
+ - Remove unused dependencies
158
+ - Prefer dependencies with active maintenance and security response processes
159
+
160
+ ### A07: Identification and Authentication Failures
161
+
162
+ Broken authentication mechanisms that allow attackers to assume identities.
163
+
164
+ **Common failures:**
165
+ - Permitting weak passwords ("123456", "password")
166
+ - Storing passwords in plaintext or with reversible encryption
167
+ - Missing brute-force protection
168
+ - Session tokens in URLs (exposed in logs and browser history)
169
+ - Session not invalidated after logout or password change
170
+
171
+ **Mitigations:**
172
+ - Enforce password complexity requirements (minimum 8 characters, no common passwords list)
173
+ - Hash passwords with Argon2id, bcrypt (cost factor 12+), or scrypt
174
+ - Rate limit login attempts (5 failures per minute per IP and per account)
175
+ - Implement account lockout (lock after 10 consecutive failures, unlock after 30 minutes)
176
+ - Invalidate all sessions when password changes
177
+ - Use secure, HttpOnly, SameSite cookies for session tokens
178
+ - Implement MFA for sensitive applications
179
+
180
+ ### A08: Software and Data Integrity Failures
181
+
182
+ Code and infrastructure that doesn't verify integrity: unverified CI/CD pipelines, auto-updated dependencies, unsigned software.
183
+
184
+ **Mitigations:**
185
+ - Verify dependency integrity (lockfile checksums)
186
+ - Use signed commits for critical code paths
187
+ - Review CI/CD pipeline configuration changes with the same rigor as application code
188
+ - Don't auto-merge dependency updates without CI verification
189
+ - Use Subresource Integrity (SRI) for CDN-loaded scripts
190
+
191
+ ### A09: Security Logging and Monitoring Failures
192
+
193
+ Insufficient logging to detect, investigate, or alert on attacks.
194
+
195
+ **What to log:**
196
+ - All authentication attempts (success and failure, with IP and user agent)
197
+ - Authorization failures (user tried to access something they shouldn't)
198
+ - Input validation failures (potential injection attempts)
199
+ - Changes to user permissions or roles
200
+ - Administrative actions (user creation, role changes, config changes)
201
+ - Application errors (5xx responses with context)
202
+
203
+ **What NEVER to log:**
204
+ - Passwords (even failed ones — they might be the correct password for a different account)
205
+ - Session tokens, API keys, or JWT tokens
206
+ - Credit card numbers, SSNs, or other PII
207
+ - Full request bodies of sensitive endpoints (login, payment)
208
+
209
+ **Log format:** Use structured logging (JSON) with correlation IDs for request tracing. Include timestamp, severity, source, action, actor, target, and result.
210
+
211
+ ### A10: Server-Side Request Forgery (SSRF)
212
+
213
+ The application fetches a URL provided by the user, allowing the attacker to make requests from the server's network position (accessing internal services, cloud metadata endpoints).
214
+
215
+ **Mitigations:**
216
+ - Validate and whitelist allowed URL schemes (only `https://`)
217
+ - Block requests to internal IP ranges (10.x, 172.16-31.x, 192.168.x, 169.254.x, localhost)
218
+ - Block requests to cloud metadata endpoints (169.254.169.254)
219
+ - Use a URL parser to normalize and validate before fetching
220
+ - Run URL-fetching services in an isolated network segment
221
+
222
+ ## Authentication Patterns
223
+
224
+ ### Session-Based Authentication
225
+
226
+ **How it works:**
227
+ 1. User submits credentials
228
+ 2. Server validates credentials, creates a session record (in database or Redis)
229
+ 3. Server sends a session ID in a Set-Cookie header (HttpOnly, Secure, SameSite)
230
+ 4. Browser automatically sends the cookie on subsequent requests
231
+ 5. Server looks up the session record to identify the user
232
+
233
+ **When to use:** Server-rendered web applications, applications where the backend controls the frontend.
234
+
235
+ **Security requirements:**
236
+ - Session IDs must be cryptographically random (128+ bits of entropy)
237
+ - Store sessions server-side (never trust session data stored client-side)
238
+ - Set cookie flags: `HttpOnly` (no JavaScript access), `Secure` (HTTPS only), `SameSite=Lax` or `Strict` (CSRF protection)
239
+ - Rotate session ID after login (prevent session fixation)
240
+ - Set session expiration (absolute timeout: 24 hours, idle timeout: 30 minutes)
241
+ - Invalidate sessions on logout, password change, and privilege change
242
+
243
+ ### JWT Authentication
244
+
245
+ **How it works:**
246
+ 1. User submits credentials
247
+ 2. Server validates credentials, generates a signed JWT containing claims (user ID, roles, expiration)
248
+ 3. Server returns the JWT in the response body
249
+ 4. Client stores the JWT (typically in memory, NOT in localStorage)
250
+ 5. Client sends the JWT in the `Authorization: Bearer <token>` header on each request
251
+ 6. Server validates the JWT signature and extracts claims
252
+
253
+ **When to use:** API-first applications, SPAs, mobile apps, microservices where session sharing is impractical.
254
+
255
+ **Security requirements:**
256
+ - Sign with a strong algorithm (RS256 or ES256, not HS256 with a weak secret)
257
+ - Set short expiration (15-60 minutes)
258
+ - Use refresh tokens (stored HttpOnly cookie) for re-authentication
259
+ - Never store JWTs in localStorage (XSS-accessible) — use HttpOnly cookies or in-memory only
260
+ - Include only necessary claims (don't put sensitive data in the payload — it's base64, not encrypted)
261
+ - Validate the token on every request (signature, expiration, issuer, audience)
262
+
263
+ ### Multi-Factor Authentication (MFA)
264
+
265
+ Add MFA for any application that handles sensitive data, financial transactions, or administrative actions.
266
+
267
+ **Implementation options:**
268
+ - TOTP (Time-based One-Time Password) via authenticator apps (Google Authenticator, Authy)
269
+ - WebAuthn / FIDO2 hardware keys (strongest, best UX)
270
+ - SMS codes (weakest — vulnerable to SIM swapping, but better than nothing)
271
+ - Email codes (moderate — depends on email security)
272
+
273
+ **Recovery:** Always provide recovery codes (one-time use) in case the user loses their MFA device.
274
+
275
+ ## Authorization Patterns
276
+
277
+ ### Role-Based Access Control (RBAC)
278
+
279
+ Users are assigned roles. Roles have permissions. Authorization checks whether the user's role has the required permission.
280
+
281
+ ```
282
+ User: alice@example.com
283
+ Role: admin
284
+ Permissions: users:read, users:write, users:delete, orders:read, orders:write
285
+
286
+ User: bob@example.com
287
+ Role: member
288
+ Permissions: orders:read, orders:write (own orders only)
289
+ ```
290
+
291
+ **Best for:** Most applications. Simple to implement, easy to understand, covers 80% of authorization needs.
292
+
293
+ ### Attribute-Based Access Control (ABAC)
294
+
295
+ Authorization decisions based on attributes of the user, the resource, and the context.
296
+
297
+ **Example policy:**
298
+ - User can read a document if: user.department == document.department AND document.classification <= user.clearanceLevel
299
+ - User can modify a resource if: user.id == resource.ownerId OR user.role == 'admin'
300
+
301
+ **Best for:** Complex authorization requirements that RBAC can't express cleanly (multi-tenancy, data classification, time-based access).
302
+
303
+ ### Resource-Level Permissions
304
+
305
+ Authorization checks that verify the user can access a specific resource instance, not just the resource type.
306
+
307
+ ```typescript
308
+ // Type-level: "Can this user access orders?" — Role check
309
+ // Instance-level: "Can this user access THIS order?" — Ownership check
310
+
311
+ async function authorizeOrderAccess(userId: string, orderId: string): boolean {
312
+ const order = await db.orders.findById(orderId);
313
+ return order && (order.userId === userId || await isAdmin(userId));
314
+ }
315
+ ```
316
+
317
+ Always implement instance-level checks for user-owned resources. Type-level checks alone allow users to access each other's data.
318
+
319
+ ## Data Protection
320
+
321
+ ### Encryption at Rest
322
+
323
+ Sensitive data stored in databases, files, or backups should be encrypted:
324
+
325
+ - **Database-level encryption:** Transparent Data Encryption (TDE) encrypts the entire database. No application changes needed. Protects against physical storage theft.
326
+ - **Column-level encryption:** Encrypt specific sensitive columns (SSN, credit card). Application decrypts as needed. More granular control.
327
+ - **Backup encryption:** All database backups and file exports must be encrypted. An unencrypted backup negates database encryption.
328
+
329
+ ### Encryption in Transit
330
+
331
+ All network communication should use TLS:
332
+
333
+ - **HTTPS everywhere:** No HTTP endpoints, no mixed content
334
+ - **TLS version:** 1.2 minimum, 1.3 preferred
335
+ - **HSTS header:** Force HTTPS for all future requests: `Strict-Transport-Security: max-age=31536000; includeSubDomains`
336
+ - **Internal services:** Use TLS for service-to-service communication too, not just client-facing
337
+
338
+ ### PII Handling
339
+
340
+ Personally Identifiable Information requires special handling:
341
+
342
+ - **Inventory:** Know what PII you store and where (data mapping exercise)
343
+ - **Minimization:** Don't collect PII you don't need
344
+ - **Retention:** Define how long you keep PII and what triggers deletion
345
+ - **Access logging:** Log who accessed PII and when
346
+ - **Right to deletion:** Implement user data deletion (GDPR Article 17, CCPA)
347
+ - **Pseudonymization:** Replace identifying data with pseudonyms where full PII isn't needed
348
+
349
+ ### Data Classification
350
+
351
+ Classify all data by sensitivity:
352
+
353
+ | Level | Examples | Controls |
354
+ |-------|---------|----------|
355
+ | Public | Marketing content, public API docs | No restrictions |
356
+ | Internal | Internal metrics, non-PII user data | Authentication required |
357
+ | Confidential | PII, financial data, health data | Encryption, access logging, retention policy |
358
+ | Restricted | Passwords, encryption keys, API secrets | Encryption, strict access control, rotation |
359
+
360
+ ## Secrets Management
361
+
362
+ ### Environment Variables
363
+
364
+ The simplest secrets management: store secrets in environment variables, never in code.
365
+
366
+ **Rules:**
367
+ - Never commit secrets to git (use `.gitignore` for `.env` files)
368
+ - Never log secrets (redact in logging middleware)
369
+ - Never pass secrets in URLs (URLs appear in logs, browser history, Referer headers)
370
+ - Use `.env.example` with placeholder values as a template
371
+
372
+ ### Vault Systems
373
+
374
+ For production environments, use a dedicated secrets manager:
375
+
376
+ - **Cloud-native:** AWS Secrets Manager, Google Secret Manager, Azure Key Vault
377
+ - **Self-hosted:** HashiCorp Vault, Infisical, Doppler
378
+
379
+ **Benefits over environment variables:**
380
+ - Access control and audit logging
381
+ - Automatic rotation
382
+ - Dynamic secrets (database credentials generated on demand)
383
+ - Encryption at rest and in transit
384
+
385
+ ### Key Rotation
386
+
387
+ Secrets should be rotatable without downtime:
388
+
389
+ - **JWT signing keys:** Support multiple active keys. Add new key, start signing with it, keep old key for validation during transition, remove old key after all tokens expire.
390
+ - **API keys:** Issue new key, update consumers, revoke old key.
391
+ - **Database passwords:** Update the secret store, restart application (zero-downtime if using connection pool draining).
392
+ - **Encryption keys:** Re-encrypt data with new key during a migration. Support decrypting with both old and new keys during transition.
393
+
394
+ ### Never Commit Secrets
395
+
396
+ Prevent accidental secret commits:
397
+
398
+ - Add `.env`, `*.pem`, `*.key` to `.gitignore`
399
+ - Use pre-commit hooks to scan for secrets (git-secrets, detect-secrets, gitleaks)
400
+ - Run secret scanning in CI (GitHub secret scanning, TruffleHog)
401
+ - If a secret is committed: rotate it immediately (assume it's compromised), remove from history with `git filter-branch` or BFG Repo Cleaner
402
+
403
+ ## Threat Modeling
404
+
405
+ ### STRIDE Model
406
+
407
+ Analyze threats using the STRIDE categories:
408
+
409
+ | Category | Threat | Example | Mitigation |
410
+ |----------|--------|---------|------------|
411
+ | **S**poofing | Attacker impersonates a user | Stolen credentials | MFA, strong password policy |
412
+ | **T**ampering | Attacker modifies data | Man-in-the-middle attack | TLS, input validation, integrity checks |
413
+ | **R**epudiation | User denies performing an action | "I didn't delete that" | Audit logging, non-repudiation |
414
+ | **I**nformation Disclosure | Sensitive data exposed | Database dump leaked | Encryption, access control, data classification |
415
+ | **D**enial of Service | Service made unavailable | DDoS attack | Rate limiting, CDN, auto-scaling |
416
+ | **E**levation of Privilege | User gains unauthorized access | SQL injection to admin | Input validation, principle of least privilege |
417
+
418
+ ### Attack Surface Analysis
419
+
420
+ Enumerate all entry points where attackers can interact with the system:
421
+
422
+ - **Network:** HTTP endpoints, WebSocket connections, database ports
423
+ - **Data inputs:** Form fields, URL parameters, headers, file uploads, API request bodies
424
+ - **Authentication:** Login page, password reset, API key endpoints, OAuth callbacks
425
+ - **Infrastructure:** Admin panels, monitoring endpoints, health checks, CI/CD webhooks
426
+
427
+ For each entry point, assess: what could an attacker do? What data could they access? What operations could they trigger?
428
+
429
+ ### Trust Boundaries
430
+
431
+ Identify where trust levels change:
432
+
433
+ - **Browser to server:** User input is untrusted. Validate everything.
434
+ - **Server to database:** Application code is trusted. Database constraints are the last line of defense.
435
+ - **Server to external API:** External API responses are partially trusted. Validate response shapes.
436
+ - **Internal service to internal service:** Trust level depends on network isolation. In a shared network, verify identity.
437
+
438
+ ### Data Flow Analysis for Threats
439
+
440
+ Trace sensitive data through the system and identify exposure points:
441
+
442
+ ```
443
+ User enters password
444
+ -> HTTPS to API server (encrypted in transit: OK)
445
+ -> Validation middleware (password in memory: OK, brief)
446
+ -> Auth service (hashed with bcrypt: OK)
447
+ -> Database (stored as hash: OK)
448
+ -> Backup system (encrypted backup: OK)
449
+ -> Log system (THREAT: is password logged? Must not be!)
450
+ ```
451
+
452
+ For each sensitive data flow, verify:
453
+ - Is it encrypted in transit?
454
+ - Is it encrypted at rest?
455
+ - Who can access it? (Users, admins, services, backup systems, log systems)
456
+ - How long is it retained?
457
+ - How is it deleted?
458
+
459
+ ## Dependency Auditing
460
+
461
+ ### Known Vulnerability Scanning
462
+
463
+ Run automated vulnerability scanning on every CI build:
464
+
465
+ ```bash
466
+ # Node.js
467
+ npm audit --audit-level=high
468
+
469
+ # Python
470
+ pip audit
471
+
472
+ # Go
473
+ govulncheck ./...
474
+
475
+ # Rust
476
+ cargo audit
477
+ ```
478
+
479
+ **Policy:**
480
+ - **Critical vulnerabilities:** Block merge. Fix immediately.
481
+ - **High vulnerabilities:** Block merge. Fix within 24 hours.
482
+ - **Medium vulnerabilities:** Warning. Fix within one sprint.
483
+ - **Low vulnerabilities:** Track. Fix when convenient.
484
+
485
+ ### License Compliance
486
+
487
+ Verify that dependency licenses permit your intended use:
488
+
489
+ **Generally safe:** MIT, Apache 2.0, BSD, ISC
490
+
491
+ **Requires attention:** LGPL (linking restrictions), MPL (file-level copyleft)
492
+
493
+ **Potentially problematic:** GPL (copyleft — entire project must be GPL), AGPL (network use triggers copyleft), SSPL (commercial use restrictions)
494
+
495
+ **No license:** Treat as all rights reserved — do not use without explicit permission.
496
+
497
+ ### Supply Chain Security
498
+
499
+ Protect against compromised dependencies:
500
+
501
+ - **Lockfiles:** Always commit lockfiles. They pin exact versions and include integrity hashes.
502
+ - **Verify checksums:** `npm ci` (not `npm install`) verifies against lockfile checksums.
503
+ - **Review dependency changes:** When updating, check the changelog and diff for unexpected changes.
504
+ - **Minimize dependencies:** Fewer dependencies mean less attack surface. Consider whether you really need that utility library.
505
+ - **Monitor for compromised packages:** Subscribe to security advisories for critical dependencies. Watch for maintainer account takeovers.
506
+
507
+ ## Common Pitfalls
508
+
509
+ **Authentication as afterthought.** Building all endpoints without auth, then adding it at the end. This leaves forgotten endpoints unprotected and creates inconsistent auth patterns. Fix: design auth requirements for every endpoint during API design. Implement auth middleware before any endpoint handlers.
510
+
511
+ **Overly permissive defaults.** Default user role has admin access, default CORS allows all origins, default rate limits are too generous. Fix: deny by default. Each permission must be explicitly granted. CORS allows specific origins only. Rate limits start conservative and are relaxed based on monitoring.
512
+
513
+ **Missing input validation at boundaries.** Trusting that the frontend validates input, so the backend skips validation. Fix: validate at every trust boundary. Frontend validation is a UX convenience; backend validation is a security requirement.
514
+
515
+ **Logging sensitive data.** Request logging that includes passwords, tokens, or PII in the log files. Fix: implement a logging middleware that redacts sensitive fields before logging. Test that redaction works.
516
+
517
+ **Storing secrets in git.** An API key committed in the first commit, now buried in git history. Fix: use git-secrets or gitleaks in pre-commit hooks. If a secret is committed, rotate it immediately — removing it from git history is not sufficient because it may have been cloned.
518
+
519
+ **Relying on security through obscurity.** "Nobody will find the admin endpoint at /api/sekrit-admin." Fix: assume attackers will find every endpoint. Every endpoint must have proper authentication and authorization regardless of its discoverability.
520
+
521
+ **No rate limiting.** Login endpoints with unlimited attempts allow brute-force password attacks. API endpoints with no rate limits allow denial of service. Fix: implement rate limiting on all public endpoints. Start with conservative limits. Use exponential backoff for authentication failures.
522
+
523
+ **Ignoring dependency vulnerabilities.** Running `npm audit` shows 47 vulnerabilities but nobody addresses them because "they're all low severity." Fix: set a policy and enforce it in CI. Critical and high vulnerabilities block deployment. Medium vulnerabilities have a SLA for resolution.