@haposoft/cafekit 0.16.0-rc.7 → 0.16.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 (299) hide show
  1. package/README.md +116 -27
  2. package/bin/__tests__/codex-hooks-ownership.test.js +239 -0
  3. package/bin/__tests__/codex-hooks.test.js +295 -0
  4. package/bin/__tests__/codex-native.test.js +2289 -34
  5. package/bin/__tests__/develop-contract.test.js +400 -23
  6. package/bin/__tests__/installer-safety.test.js +3 -3
  7. package/bin/__tests__/optional-skill-inventory.test.js +249 -0
  8. package/bin/__tests__/output-styles.test.js +214 -0
  9. package/bin/__tests__/package-inventory.test.js +2131 -16
  10. package/bin/__tests__/runtime-schema.test.js +111 -0
  11. package/bin/__tests__/secret-output-guardrail.test.js +122 -0
  12. package/bin/__tests__/skill-routing-source.test.js +172 -0
  13. package/bin/__tests__/specs-v2-execution-closeout.test.js +1 -1
  14. package/bin/install.js +10 -0
  15. package/bin/lib/codex-install.js +170 -5
  16. package/bin/lib/context.js +14 -0
  17. package/bin/lib/i18n.js +12 -6
  18. package/bin/lib/skill-deps.js +5 -5
  19. package/bin/phases/claude-runtime.js +23 -0
  20. package/bin/phases/claude-settings.js +8 -0
  21. package/bin/phases/codex-hooks.js +156 -0
  22. package/bin/phases/codex-runtime.js +29 -38
  23. package/bin/phases/copy-payload.js +8 -2
  24. package/bin/phases/select-skill-bundles.js +96 -0
  25. package/bin/phases/skill-inventory.js +71 -0
  26. package/bin/phases/skills-setup.js +9 -2
  27. package/bin/phases/write-metadata.js +8 -5
  28. package/package.json +8 -2
  29. package/src/claude/CLAUDE.md +3 -3
  30. package/src/claude/agents/brainstormer.md +52 -69
  31. package/src/claude/agents/code-auditor.md +32 -14
  32. package/src/claude/agents/debugger.md +35 -20
  33. package/src/claude/agents/deployer.md +12 -5
  34. package/src/claude/agents/docs-keeper.md +11 -1
  35. package/src/claude/agents/implementer.md +25 -13
  36. package/src/claude/agents/inspector.md +6 -3
  37. package/src/claude/agents/project-manager.md +1 -1
  38. package/src/claude/agents/researcher.md +26 -55
  39. package/src/claude/agents/spec-maker.md +24 -13
  40. package/src/claude/agents/strategist.md +52 -0
  41. package/src/claude/agents/test-runner.md +117 -132
  42. package/src/claude/agents/ui-ux-designer.md +1 -1
  43. package/src/claude/hooks/__tests__/fixtures/statusline-default.golden +1 -0
  44. package/src/claude/hooks/__tests__/precompact.test.js +158 -0
  45. package/src/claude/hooks/__tests__/spec-gate.test.js +87 -4
  46. package/src/claude/hooks/__tests__/state.test.js +254 -3
  47. package/src/claude/hooks/__tests__/statusline.test.js +196 -0
  48. package/src/claude/hooks/agent.cjs +1 -1
  49. package/src/claude/hooks/docs-sync.cjs +12 -10
  50. package/src/claude/hooks/inspect-block.cjs +1 -1
  51. package/src/claude/hooks/lib/config.cjs +3 -0
  52. package/src/claude/hooks/lib/hook-state-dir.cjs +39 -0
  53. package/src/claude/hooks/lib/secret-keywords.cjs +42 -0
  54. package/src/claude/hooks/precompact.cjs +105 -0
  55. package/src/claude/hooks/rules.cjs +1 -1
  56. package/src/claude/hooks/secret-output-guardrail.cjs +43 -0
  57. package/src/claude/hooks/session.cjs +27 -1
  58. package/src/claude/hooks/spec-gate.cjs +3 -3
  59. package/src/claude/hooks/spec-state.cjs +32 -5
  60. package/src/claude/hooks/state.cjs +1 -1
  61. package/src/claude/hooks/task-scaffold-guard.cjs +1 -1
  62. package/src/claude/hooks/usage.cjs +1 -1
  63. package/src/claude/migration-manifest.json +29 -15
  64. package/src/claude/output-styles/coding-level-0-eli5.md +103 -0
  65. package/src/claude/output-styles/coding-level-1-junior.md +124 -0
  66. package/src/claude/output-styles/coding-level-2-mid.md +146 -0
  67. package/src/claude/output-styles/coding-level-3-senior.md +148 -0
  68. package/src/claude/output-styles/coding-level-4-lead.md +159 -0
  69. package/src/claude/output-styles/coding-level-5-god.md +91 -0
  70. package/src/claude/references/debugger/core-philosophy.md +5 -3
  71. package/src/claude/references/debugger/frontend-verification.md +2 -2
  72. package/src/claude/references/debugger/log-ci-analysis.md +13 -1
  73. package/src/claude/references/debugger/parallel-agent-hydration.md +19 -34
  74. package/src/claude/references/debugger/performance-diagnostics.md +2 -2
  75. package/src/claude/references/debugger/root-cause-tracing.md +37 -6
  76. package/src/claude/references/debugger/side-effect-gate.md +3 -1
  77. package/src/claude/references/debugger/verification-protocol.md +13 -12
  78. package/src/claude/rules/orchestrator.md +7 -1
  79. package/src/claude/rules/process-management.md +39 -0
  80. package/src/claude/rules/review-audit-self-decision.md +48 -0
  81. package/src/claude/rules/skill-domain-routing.md +26 -24
  82. package/src/claude/rules/skill-workflow-routing.md +22 -14
  83. package/src/claude/rules/workflow.md +3 -3
  84. package/src/claude/runtime.json +1 -0
  85. package/src/claude/runtime.schema.json +205 -0
  86. package/src/claude/scripts/generate-skill-catalog.cjs +156 -122
  87. package/src/claude/scripts/provenance.cjs +18 -5
  88. package/src/claude/scripts/spec-receipt.cjs +76 -21
  89. package/src/claude/scripts/spec-resolver.cjs +144 -4
  90. package/src/claude/scripts/workflow-policy.cjs +1 -1
  91. package/src/claude/settings/settings.json +16 -0
  92. package/src/claude/skills/agent-browser/SKILL.md +1 -1
  93. package/src/claude/skills/ai-multimodal/SKILL.md +1 -1
  94. package/src/claude/skills/brainstorm/SKILL.md +193 -172
  95. package/src/claude/skills/brainstorm/references/question-framework.md +105 -167
  96. package/src/claude/skills/chrome-devtools/SKILL.md +1 -1
  97. package/src/claude/skills/code-review/SKILL.md +43 -25
  98. package/src/claude/skills/code-review/references/spec-compliance-review.md +3 -4
  99. package/src/claude/skills/code-review/references/verification-gate.md +1 -1
  100. package/src/claude/skills/debug/SKILL.md +48 -19
  101. package/src/claude/skills/delegate/SKILL.md +1 -1
  102. package/src/claude/skills/develop/SKILL.md +92 -65
  103. package/src/claude/skills/develop/references/parallel-waves.md +36 -63
  104. package/src/claude/skills/develop/references/quality-gate.md +31 -4
  105. package/src/claude/skills/develop/references/subagent-patterns.md +21 -7
  106. package/src/claude/skills/docs/SKILL.md +42 -23
  107. package/src/claude/skills/docs/references/init-workflow.md +4 -4
  108. package/src/claude/skills/docs/references/reconstruct-workflow.md +6 -6
  109. package/src/claude/skills/docs/references/standard-docs-workflow.md +6 -2
  110. package/src/claude/skills/docs/references/summarize-workflow.md +2 -2
  111. package/src/claude/skills/docs/references/update-workflow.md +9 -7
  112. package/src/claude/skills/docs/templates/requirements-as-is.md +1 -1
  113. package/src/claude/skills/docx/SKILL.md +1 -1
  114. package/src/claude/skills/git/SKILL.md +1 -1
  115. package/src/claude/skills/git/references/commit-protocols.md +1 -1
  116. package/src/claude/skills/git/references/finish-branch.md +1 -1
  117. package/src/claude/skills/hotfix/SKILL.md +159 -170
  118. package/src/claude/skills/hotfix/references/diagnosis-protocol.md +14 -9
  119. package/src/claude/skills/hotfix/references/parallel-patterns.md +27 -13
  120. package/src/claude/skills/hotfix/references/prevention-gate.md +5 -0
  121. package/src/claude/skills/hotfix/references/review-cycle.md +21 -15
  122. package/src/claude/skills/hotfix/references/workflow-specialized.md +53 -21
  123. package/src/claude/skills/inspect/SKILL.md +55 -46
  124. package/src/claude/skills/inspect/references/internal-inspection.md +21 -5
  125. package/src/claude/skills/loop/SKILL.md +114 -0
  126. package/src/claude/skills/loop/references/bounded-loop-protocol.md +104 -0
  127. package/src/claude/skills/loop/references/metric-and-guard-contract.md +76 -0
  128. package/src/claude/skills/pdf/SKILL.md +1 -1
  129. package/src/claude/skills/pptx/SKILL.md +1 -1
  130. package/src/claude/skills/question/SKILL.md +16 -13
  131. package/src/claude/skills/research/SKILL.md +70 -43
  132. package/src/claude/skills/route/SKILL.md +94 -0
  133. package/src/claude/skills/route/references/agent-timing.md +46 -0
  134. package/src/claude/skills/route/references/chaining-patterns.md +53 -0
  135. package/src/claude/skills/route/references/task-taxonomy.md +48 -0
  136. package/src/claude/skills/specs/SKILL.md +48 -57
  137. package/src/claude/skills/specs/references/review.md +26 -8
  138. package/src/claude/skills/specs/references/templates.md +76 -31
  139. package/src/claude/skills/specs/templates/requirements-init.md +1 -1
  140. package/src/claude/skills/specs/templates/research.md +2 -2
  141. package/src/claude/skills/sync/SKILL.md +6 -6
  142. package/src/claude/skills/sync/references/sync-protocols.md +1 -1
  143. package/src/claude/skills/test/SKILL.md +120 -120
  144. package/src/claude/skills/test/references/execution-strategy.md +208 -361
  145. package/src/claude/skills/test/references/failure-triage.md +55 -121
  146. package/src/claude/skills/test/references/test-memory.md +20 -34
  147. package/src/claude/skills/ui-ux-pro-max/SKILL.md +1 -1
  148. package/src/claude/skills/web-testing/SKILL.md +1 -1
  149. package/src/claude/skills/xlsx/SKILL.md +1 -1
  150. package/src/claude/status.cjs +135 -33
  151. package/src/codex/AGENTS.md +14 -4
  152. package/src/codex/hooks/docs-sync.cjs +8 -3
  153. package/src/codex/hooks/lib/hook-context.cjs +18 -4
  154. package/src/codex/hooks/rules.cjs +29 -1
  155. package/src/codex/hooks/secret-output-guardrail.cjs +30 -0
  156. package/src/codex/hooks/spec-gate.cjs +3 -8
  157. package/src/codex/hooks/spec-state.cjs +34 -5
  158. package/src/codex/hooks.json +5 -0
  159. package/src/codex/runtime.json +2 -0
  160. package/src/common/.env.example +1 -1
  161. package/src/claude/skills/backend-development/SKILL.md +0 -101
  162. package/src/claude/skills/backend-development/references/backend-api-design.md +0 -495
  163. package/src/claude/skills/backend-development/references/backend-architecture.md +0 -454
  164. package/src/claude/skills/backend-development/references/backend-authentication.md +0 -338
  165. package/src/claude/skills/backend-development/references/backend-code-quality.md +0 -659
  166. package/src/claude/skills/backend-development/references/backend-debugging.md +0 -904
  167. package/src/claude/skills/backend-development/references/backend-devops.md +0 -491
  168. package/src/claude/skills/backend-development/references/backend-mindset.md +0 -387
  169. package/src/claude/skills/backend-development/references/backend-performance.md +0 -397
  170. package/src/claude/skills/backend-development/references/backend-security.md +0 -342
  171. package/src/claude/skills/backend-development/references/backend-technologies.md +0 -256
  172. package/src/claude/skills/backend-development/references/backend-testing.md +0 -429
  173. package/src/claude/skills/devops/.env.example +0 -76
  174. package/src/claude/skills/devops/SKILL.md +0 -102
  175. package/src/claude/skills/devops/references/browser-rendering.md +0 -305
  176. package/src/claude/skills/devops/references/cloudflare-d1-kv.md +0 -123
  177. package/src/claude/skills/devops/references/cloudflare-platform.md +0 -271
  178. package/src/claude/skills/devops/references/cloudflare-r2-storage.md +0 -280
  179. package/src/claude/skills/devops/references/cloudflare-workers-advanced.md +0 -312
  180. package/src/claude/skills/devops/references/cloudflare-workers-apis.md +0 -309
  181. package/src/claude/skills/devops/references/cloudflare-workers-basics.md +0 -418
  182. package/src/claude/skills/devops/references/docker-basics.md +0 -297
  183. package/src/claude/skills/devops/references/docker-compose.md +0 -292
  184. package/src/claude/skills/devops/references/gcloud-platform.md +0 -297
  185. package/src/claude/skills/devops/references/gcloud-services.md +0 -304
  186. package/src/claude/skills/devops/references/kubernetes-basics.md +0 -95
  187. package/src/claude/skills/devops/references/kubernetes-helm-advanced.md +0 -70
  188. package/src/claude/skills/devops/references/kubernetes-helm.md +0 -81
  189. package/src/claude/skills/devops/references/kubernetes-kubectl.md +0 -74
  190. package/src/claude/skills/devops/references/kubernetes-security-advanced.md +0 -94
  191. package/src/claude/skills/devops/references/kubernetes-security.md +0 -89
  192. package/src/claude/skills/devops/references/kubernetes-troubleshooting-advanced.md +0 -74
  193. package/src/claude/skills/devops/references/kubernetes-troubleshooting.md +0 -49
  194. package/src/claude/skills/devops/references/kubernetes-workflows-advanced.md +0 -75
  195. package/src/claude/skills/devops/references/kubernetes-workflows.md +0 -76
  196. package/src/claude/skills/devops/scripts/cloudflare_deploy.py +0 -269
  197. package/src/claude/skills/devops/scripts/docker_optimize.py +0 -332
  198. package/src/claude/skills/devops/scripts/requirements.txt +0 -20
  199. package/src/claude/skills/devops/scripts/tests/requirements.txt +0 -3
  200. package/src/claude/skills/devops/scripts/tests/test_cloudflare_deploy.py +0 -285
  201. package/src/claude/skills/devops/scripts/tests/test_docker_optimize.py +0 -436
  202. package/src/claude/skills/frontend-design/SKILL.md +0 -135
  203. package/src/claude/skills/frontend-design/references/ai-multimodal-overview.md +0 -165
  204. package/src/claude/skills/frontend-design/references/analysis-best-practices.md +0 -80
  205. package/src/claude/skills/frontend-design/references/analysis-prompts.md +0 -141
  206. package/src/claude/skills/frontend-design/references/analysis-techniques.md +0 -118
  207. package/src/claude/skills/frontend-design/references/animejs.md +0 -396
  208. package/src/claude/skills/frontend-design/references/anti-slop-rules.md +0 -103
  209. package/src/claude/skills/frontend-design/references/asset-generation.md +0 -337
  210. package/src/claude/skills/frontend-design/references/bento-motion-engine.md +0 -142
  211. package/src/claude/skills/frontend-design/references/design-extraction-overview.md +0 -71
  212. package/src/claude/skills/frontend-design/references/extraction-best-practices.md +0 -141
  213. package/src/claude/skills/frontend-design/references/extraction-output-templates.md +0 -162
  214. package/src/claude/skills/frontend-design/references/extraction-prompts.md +0 -127
  215. package/src/claude/skills/frontend-design/references/magicui-components.md +0 -129
  216. package/src/claude/skills/frontend-design/references/performance-guardrails.md +0 -169
  217. package/src/claude/skills/frontend-design/references/premium-design-patterns.md +0 -93
  218. package/src/claude/skills/frontend-design/references/redesign-audit-checklist.md +0 -114
  219. package/src/claude/skills/frontend-design/references/technical-accessibility.md +0 -119
  220. package/src/claude/skills/frontend-design/references/technical-best-practices.md +0 -97
  221. package/src/claude/skills/frontend-design/references/technical-optimization.md +0 -44
  222. package/src/claude/skills/frontend-design/references/technical-overview.md +0 -90
  223. package/src/claude/skills/frontend-design/references/technical-workflows.md +0 -150
  224. package/src/claude/skills/frontend-design/references/visual-analysis-overview.md +0 -95
  225. package/src/claude/skills/frontend-design/references/workflow-3d.md +0 -102
  226. package/src/claude/skills/frontend-design/references/workflow-describe.md +0 -87
  227. package/src/claude/skills/frontend-design/references/workflow-immersive.md +0 -87
  228. package/src/claude/skills/frontend-design/references/workflow-quick.md +0 -57
  229. package/src/claude/skills/frontend-design/references/workflow-screenshot.md +0 -63
  230. package/src/claude/skills/frontend-design/references/workflow-video.md +0 -74
  231. package/src/claude/skills/frontend-development/SKILL.md +0 -406
  232. package/src/claude/skills/frontend-development/resources/common-patterns.md +0 -331
  233. package/src/claude/skills/frontend-development/resources/complete-examples.md +0 -872
  234. package/src/claude/skills/frontend-development/resources/component-patterns.md +0 -502
  235. package/src/claude/skills/frontend-development/resources/data-fetching.md +0 -767
  236. package/src/claude/skills/frontend-development/resources/file-organization.md +0 -502
  237. package/src/claude/skills/frontend-development/resources/loading-and-error-states.md +0 -501
  238. package/src/claude/skills/frontend-development/resources/performance.md +0 -406
  239. package/src/claude/skills/frontend-development/resources/routing-guide.md +0 -364
  240. package/src/claude/skills/frontend-development/resources/styling-guide.md +0 -428
  241. package/src/claude/skills/frontend-development/resources/typescript-standards.md +0 -418
  242. package/src/claude/skills/mobile-development/SKILL.md +0 -218
  243. package/src/claude/skills/mobile-development/references/mobile-android.md +0 -604
  244. package/src/claude/skills/mobile-development/references/mobile-best-practices.md +0 -544
  245. package/src/claude/skills/mobile-development/references/mobile-debugging.md +0 -1089
  246. package/src/claude/skills/mobile-development/references/mobile-frameworks.md +0 -465
  247. package/src/claude/skills/mobile-development/references/mobile-ios.md +0 -496
  248. package/src/claude/skills/mobile-development/references/mobile-mindset.md +0 -542
  249. package/src/claude/skills/react-best-practices/AGENTS.md +0 -2249
  250. package/src/claude/skills/react-best-practices/README.md +0 -123
  251. package/src/claude/skills/react-best-practices/SKILL.md +0 -128
  252. package/src/claude/skills/react-best-practices/metadata.json +0 -15
  253. package/src/claude/skills/react-best-practices/rules/_sections.md +0 -46
  254. package/src/claude/skills/react-best-practices/rules/_template.md +0 -28
  255. package/src/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  256. package/src/claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
  257. package/src/claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
  258. package/src/claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
  259. package/src/claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
  260. package/src/claude/skills/react-best-practices/rules/async-parallel.md +0 -28
  261. package/src/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
  262. package/src/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
  263. package/src/claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
  264. package/src/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
  265. package/src/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  266. package/src/claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
  267. package/src/claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
  268. package/src/claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
  269. package/src/claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -82
  270. package/src/claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
  271. package/src/claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
  272. package/src/claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
  273. package/src/claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
  274. package/src/claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
  275. package/src/claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
  276. package/src/claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
  277. package/src/claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
  278. package/src/claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
  279. package/src/claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
  280. package/src/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
  281. package/src/claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
  282. package/src/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  283. package/src/claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
  284. package/src/claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
  285. package/src/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  286. package/src/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  287. package/src/claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
  288. package/src/claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
  289. package/src/claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
  290. package/src/claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
  291. package/src/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
  292. package/src/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  293. package/src/claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
  294. package/src/claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
  295. package/src/claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
  296. package/src/claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
  297. package/src/claude/skills/react-best-practices/rules/server-cache-react.md +0 -26
  298. package/src/claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -79
  299. package/src/claude/skills/react-best-practices/rules/server-serialization.md +0 -38
@@ -1,338 +0,0 @@
1
- # Backend Authentication & Authorization
2
-
3
- Modern authentication patterns including OAuth 2.1, JWT, RBAC, and MFA (2025 standards).
4
-
5
- ## OAuth 2.1 (2025 Standard)
6
-
7
- ### Key Changes from OAuth 2.0
8
-
9
- **Mandatory:**
10
- - PKCE (Proof Key for Code Exchange) for all clients
11
- - Exact redirect URI matching
12
- - State parameter for CSRF protection
13
-
14
- **Deprecated:**
15
- - Implicit grant flow (security risk)
16
- - Resource owner password credentials grant
17
- - Bearer token in query strings
18
-
19
- ### Authorization Code Flow with PKCE
20
-
21
- ```typescript
22
- // Step 1: Generate code verifier and challenge
23
- import crypto from 'crypto';
24
-
25
- const codeVerifier = crypto.randomBytes(32).toString('base64url');
26
- const codeChallenge = crypto
27
- .createHash('sha256')
28
- .update(codeVerifier)
29
- .digest('base64url');
30
-
31
- // Step 2: Redirect to authorization endpoint
32
- const authUrl = new URL('https://auth.example.com/authorize');
33
- authUrl.searchParams.set('client_id', 'your-client-id');
34
- authUrl.searchParams.set('redirect_uri', 'https://app.example.com/callback');
35
- authUrl.searchParams.set('response_type', 'code');
36
- authUrl.searchParams.set('scope', 'openid profile email');
37
- authUrl.searchParams.set('state', crypto.randomBytes(16).toString('hex'));
38
- authUrl.searchParams.set('code_challenge', codeChallenge);
39
- authUrl.searchParams.set('code_challenge_method', 'S256');
40
-
41
- // Step 3: Exchange code for token (with code_verifier)
42
- const tokenResponse = await fetch('https://auth.example.com/token', {
43
- method: 'POST',
44
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
45
- body: new URLSearchParams({
46
- grant_type: 'authorization_code',
47
- code: authCode,
48
- redirect_uri: redirectUri,
49
- client_id: clientId,
50
- code_verifier: codeVerifier,
51
- }),
52
- });
53
- ```
54
-
55
- ## JWT (JSON Web Tokens)
56
-
57
- ### Structure
58
-
59
- ```
60
- Header.Payload.Signature
61
- eyJhbGciOi... . eyJzdWIiOi... . SflKxwRJ...
62
- ```
63
-
64
- ### Best Practices (2025)
65
-
66
- 1. **Short expiration** - Access tokens: 15 minutes, Refresh tokens: 7 days
67
- 2. **Use RS256** - Asymmetric signing (not HS256 for public APIs)
68
- 3. **Validate everything** - Signature, issuer, audience, expiration
69
- 4. **Include minimal claims** - Don't include sensitive data
70
- 5. **Refresh token rotation** - Issue new refresh token on each use
71
-
72
- ### Implementation
73
-
74
- ```typescript
75
- import jwt from 'jsonwebtoken';
76
-
77
- // Generate JWT
78
- const accessToken = jwt.sign(
79
- {
80
- sub: user.id,
81
- email: user.email,
82
- roles: user.roles,
83
- },
84
- process.env.JWT_PRIVATE_KEY,
85
- {
86
- algorithm: 'RS256',
87
- expiresIn: '15m',
88
- issuer: 'https://api.example.com',
89
- audience: 'https://app.example.com',
90
- }
91
- );
92
-
93
- // Verify JWT
94
- const decoded = jwt.verify(token, process.env.JWT_PUBLIC_KEY, {
95
- algorithms: ['RS256'],
96
- issuer: 'https://api.example.com',
97
- audience: 'https://app.example.com',
98
- });
99
- ```
100
-
101
- ## Role-Based Access Control (RBAC)
102
-
103
- ### RBAC Model
104
-
105
- ```
106
- Users → Roles → Permissions → Resources
107
- ```
108
-
109
- ### Implementation (NestJS Example)
110
-
111
- ```typescript
112
- // Define roles
113
- export enum Role {
114
- ADMIN = 'admin',
115
- EDITOR = 'editor',
116
- VIEWER = 'viewer',
117
- }
118
-
119
- // Role decorator
120
- export const Roles = (...roles: Role[]) => SetMetadata('roles', roles);
121
-
122
- // Guard implementation
123
- @Injectable()
124
- export class RolesGuard implements CanActivate {
125
- constructor(private reflector: Reflector) {}
126
-
127
- canActivate(context: ExecutionContext): boolean {
128
- const requiredRoles = this.reflector.get<Role[]>('roles', context.getHandler());
129
- if (!requiredRoles) return true;
130
-
131
- const request = context.switchToHttp().getRequest();
132
- const user = request.user;
133
-
134
- return requiredRoles.some((role) => user.roles?.includes(role));
135
- }
136
- }
137
-
138
- // Usage
139
- @Post()
140
- @UseGuards(JwtAuthGuard, RolesGuard)
141
- @Roles(Role.ADMIN, Role.EDITOR)
142
- async createPost(@Body() createPostDto: CreatePostDto) {
143
- return this.postsService.create(createPostDto);
144
- }
145
- ```
146
-
147
- ### RBAC Best Practices
148
-
149
- 1. **Deny by default** - Explicitly grant permissions
150
- 2. **Least privilege** - Minimum permissions needed
151
- 3. **Role hierarchy** - Admin inherits Editor inherits Viewer
152
- 4. **Separate roles and permissions** - Flexible permission assignment
153
- 5. **Audit trail** - Log role changes and access
154
-
155
- ## Multi-Factor Authentication (MFA)
156
-
157
- ### TOTP (Time-Based One-Time Password)
158
-
159
- ```typescript
160
- import speakeasy from 'speakeasy';
161
- import QRCode from 'qrcode';
162
-
163
- // Generate secret
164
- const secret = speakeasy.generateSecret({
165
- name: 'MyApp',
166
- issuer: 'MyCompany',
167
- });
168
-
169
- // Generate QR code for user
170
- const qrCode = await QRCode.toDataURL(secret.otpauth_url);
171
-
172
- // Verify TOTP token
173
- const verified = speakeasy.totp.verify({
174
- secret: secret.base32,
175
- encoding: 'base32',
176
- token: userToken,
177
- window: 2, // Allow 2 time steps drift
178
- });
179
- ```
180
-
181
- ### FIDO2/WebAuthn (Passwordless - 2025 Standard)
182
-
183
- **Benefits:**
184
- - Phishing-resistant
185
- - No shared secrets
186
- - Hardware-backed security
187
- - Better UX (biometrics, security keys)
188
-
189
- **Implementation:**
190
- ```typescript
191
- // Registration
192
- const publicKeyCredentialCreationOptions = {
193
- challenge: crypto.randomBytes(32),
194
- rp: { name: 'MyApp', id: 'example.com' },
195
- user: {
196
- id: Buffer.from(user.id),
197
- name: user.email,
198
- displayName: user.name,
199
- },
200
- pubKeyCredParams: [{ alg: -7, type: 'public-key' }], // ES256
201
- authenticatorSelection: {
202
- authenticatorAttachment: 'platform', // 'platform' or 'cross-platform'
203
- userVerification: 'required',
204
- },
205
- timeout: 60000,
206
- attestation: 'direct',
207
- };
208
-
209
- // Use @simplewebauthn/server library
210
- import { verifyRegistrationResponse, verifyAuthenticationResponse } from '@simplewebauthn/server';
211
- ```
212
-
213
- ## Session Management
214
-
215
- ### Best Practices
216
-
217
- 1. **Secure cookies** - HttpOnly, Secure, SameSite=Strict
218
- 2. **Session timeout** - Idle: 15 minutes, Absolute: 8 hours
219
- 3. **Regenerate session ID** - After login, privilege elevation
220
- 4. **Server-side storage** - Redis for distributed systems
221
- 5. **CSRF protection** - SameSite cookies + CSRF tokens
222
-
223
- ### Implementation
224
-
225
- ```typescript
226
- import session from 'express-session';
227
- import RedisStore from 'connect-redis';
228
- import { createClient } from 'redis';
229
-
230
- const redisClient = createClient();
231
- await redisClient.connect();
232
-
233
- app.use(
234
- session({
235
- store: new RedisStore({ client: redisClient }),
236
- secret: process.env.SESSION_SECRET,
237
- resave: false,
238
- saveUninitialized: false,
239
- cookie: {
240
- secure: true, // HTTPS only
241
- httpOnly: true, // No JavaScript access
242
- sameSite: 'strict', // CSRF protection
243
- maxAge: 1000 * 60 * 15, // 15 minutes
244
- },
245
- })
246
- );
247
- ```
248
-
249
- ## Password Security
250
-
251
- ### Argon2id (2025 Standard - Replaces bcrypt)
252
-
253
- **Why Argon2id:**
254
- - Winner of Password Hashing Competition (2015)
255
- - Memory-hard (resistant to GPU/ASIC attacks)
256
- - Configurable CPU and memory cost
257
- - Combines Argon2i (data-independent) + Argon2d (data-dependent)
258
-
259
- ```typescript
260
- import argon2 from 'argon2';
261
-
262
- // Hash password
263
- const hash = await argon2.hash('password123', {
264
- type: argon2.argon2id,
265
- memoryCost: 65536, // 64 MB
266
- timeCost: 3, // 3 iterations
267
- parallelism: 4, // 4 threads
268
- });
269
-
270
- // Verify password
271
- const valid = await argon2.verify(hash, 'password123');
272
- ```
273
-
274
- ### Password Policy (2025 NIST Guidelines)
275
-
276
- - **Minimum length:** 12 characters (not 8)
277
- - **No composition rules** - Allow passphrases
278
- - **Check against breach databases** - HaveIBeenPwned API
279
- - **No periodic rotation** - Only on compromise
280
- - **Allow all printable characters** - Including spaces, emojis
281
-
282
- ## API Key Authentication
283
-
284
- ### Best Practices
285
-
286
- 1. **Prefix keys** - `sk_live_`, `pk_test_` (identify type/environment)
287
- 2. **Hash stored keys** - Store SHA-256 hash, not plaintext
288
- 3. **Key rotation** - Allow users to rotate keys
289
- 4. **Scope limiting** - Separate keys for read/write operations
290
- 5. **Rate limiting** - Per API key limits
291
-
292
- ```typescript
293
- // Generate API key
294
- const apiKey = `sk_${env}_${crypto.randomBytes(24).toString('base64url')}`;
295
-
296
- // Store hashed version
297
- const hashedKey = crypto.createHash('sha256').update(apiKey).digest('hex');
298
- await db.apiKeys.create({ userId, hashedKey, scopes: ['read'] });
299
-
300
- // Validate API key
301
- const providedHash = crypto.createHash('sha256').update(providedKey).digest('hex');
302
- const keyRecord = await db.apiKeys.findOne({ hashedKey: providedHash });
303
- ```
304
-
305
- ## Authentication Decision Matrix
306
-
307
- | Use Case | Recommended Approach |
308
- |----------|---------------------|
309
- | Web application | OAuth 2.1 + JWT |
310
- | Mobile app | OAuth 2.1 + PKCE |
311
- | SPA (Single Page App) | OAuth 2.1 Authorization Code + PKCE |
312
- | Server-to-server | Client credentials grant + mTLS |
313
- | Third-party API access | API keys with scopes |
314
- | High-security | WebAuthn/FIDO2 + MFA |
315
- | Internal admin | JWT + RBAC + MFA |
316
- | Microservices | Service mesh (mTLS) + JWT |
317
-
318
- ## Security Checklist
319
-
320
- - [ ] OAuth 2.1 with PKCE implemented
321
- - [ ] JWT tokens expire in 15 minutes
322
- - [ ] Refresh token rotation enabled
323
- - [ ] RBAC with deny-by-default
324
- - [ ] MFA required for admin accounts
325
- - [ ] Passwords hashed with Argon2id
326
- - [ ] Session cookies: HttpOnly, Secure, SameSite
327
- - [ ] Rate limiting on auth endpoints (10 attempts/15 min)
328
- - [ ] Account lockout after failed attempts
329
- - [ ] Password policy: 12+ chars, breach check
330
- - [ ] Audit logging for authentication events
331
-
332
- ## Resources
333
-
334
- - **OAuth 2.1:** https://oauth.net/2.1/
335
- - **JWT Best Practices:** https://datatracker.ietf.org/doc/html/rfc8725
336
- - **WebAuthn:** https://webauthn.guide/
337
- - **NIST Password Guidelines:** https://pages.nist.gov/800-63-3/
338
- - **OWASP Auth Cheat Sheet:** https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html