@baselane/packs 0.1.5 → 0.1.7

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 (445) hide show
  1. package/package.json +2 -2
  2. package/packs/full-harness/pack.json +3093 -0
  3. package/packs/full-harness/rendered/.claude/agents/a11y-architect.md +138 -0
  4. package/packs/full-harness/rendered/.claude/agents/agent-evaluator.md +206 -0
  5. package/packs/full-harness/rendered/.claude/agents/architect.md +209 -0
  6. package/packs/full-harness/rendered/.claude/agents/build-error-resolver.md +114 -0
  7. package/packs/full-harness/rendered/.claude/agents/chief-of-staff.md +149 -0
  8. package/packs/full-harness/rendered/.claude/agents/code-architect.md +71 -0
  9. package/packs/full-harness/rendered/.claude/agents/code-explorer.md +69 -0
  10. package/packs/full-harness/rendered/.claude/agents/code-reviewer.md +312 -0
  11. package/packs/full-harness/rendered/.claude/agents/code-simplifier.md +47 -0
  12. package/packs/full-harness/rendered/.claude/agents/comment-analyzer.md +45 -0
  13. package/packs/full-harness/rendered/.claude/agents/conversation-analyzer.md +52 -0
  14. package/packs/full-harness/rendered/.claude/agents/cpp-build-resolver.md +90 -0
  15. package/packs/full-harness/rendered/.claude/agents/cpp-reviewer.md +64 -0
  16. package/packs/full-harness/rendered/.claude/agents/csharp-reviewer.md +93 -0
  17. package/packs/full-harness/rendered/.claude/agents/dart-build-resolver.md +201 -0
  18. package/packs/full-harness/rendered/.claude/agents/database-reviewer.md +91 -0
  19. package/packs/full-harness/rendered/.claude/agents/django-build-resolver.md +243 -0
  20. package/packs/full-harness/rendered/.claude/agents/django-reviewer.md +149 -0
  21. package/packs/full-harness/rendered/.claude/agents/doc-updater.md +107 -0
  22. package/packs/full-harness/rendered/.claude/agents/docs-lookup.md +64 -0
  23. package/packs/full-harness/rendered/.claude/agents/e2e-runner.md +107 -0
  24. package/packs/full-harness/rendered/.claude/agents/fastapi-reviewer.md +68 -0
  25. package/packs/full-harness/rendered/.claude/agents/flutter-reviewer.md +241 -0
  26. package/packs/full-harness/rendered/.claude/agents/fsharp-reviewer.md +92 -0
  27. package/packs/full-harness/rendered/.claude/agents/gan-evaluator.md +206 -0
  28. package/packs/full-harness/rendered/.claude/agents/gan-generator.md +128 -0
  29. package/packs/full-harness/rendered/.claude/agents/gan-planner.md +96 -0
  30. package/packs/full-harness/rendered/.claude/agents/go-build-resolver.md +94 -0
  31. package/packs/full-harness/rendered/.claude/agents/go-reviewer.md +68 -0
  32. package/packs/full-harness/rendered/.claude/agents/harmonyos-app-resolver.md +173 -0
  33. package/packs/full-harness/rendered/.claude/agents/harness-optimizer.md +32 -0
  34. package/packs/full-harness/rendered/.claude/agents/healthcare-reviewer.md +83 -0
  35. package/packs/full-harness/rendered/.claude/agents/homelab-architect.md +94 -0
  36. package/packs/full-harness/rendered/.claude/agents/java-build-resolver.md +266 -0
  37. package/packs/full-harness/rendered/.claude/agents/java-reviewer.md +179 -0
  38. package/packs/full-harness/rendered/.claude/agents/kotlin-build-resolver.md +118 -0
  39. package/packs/full-harness/rendered/.claude/agents/kotlin-reviewer.md +157 -0
  40. package/packs/full-harness/rendered/.claude/agents/loop-operator.md +33 -0
  41. package/packs/full-harness/rendered/.claude/agents/marketing-agent.md +141 -0
  42. package/packs/full-harness/rendered/.claude/agents/mle-reviewer.md +153 -0
  43. package/packs/full-harness/rendered/.claude/agents/network-architect.md +92 -0
  44. package/packs/full-harness/rendered/.claude/agents/network-config-reviewer.md +94 -0
  45. package/packs/full-harness/rendered/.claude/agents/network-troubleshooter.md +116 -0
  46. package/packs/full-harness/rendered/.claude/agents/opensource-forker.md +198 -0
  47. package/packs/full-harness/rendered/.claude/agents/opensource-packager.md +249 -0
  48. package/packs/full-harness/rendered/.claude/agents/opensource-sanitizer.md +188 -0
  49. package/packs/full-harness/rendered/.claude/agents/performance-optimizer.md +446 -0
  50. package/packs/full-harness/rendered/.claude/agents/php-reviewer.md +92 -0
  51. package/packs/full-harness/rendered/.claude/agents/planner.md +210 -0
  52. package/packs/full-harness/rendered/.claude/agents/pr-test-analyzer.md +45 -0
  53. package/packs/full-harness/rendered/.claude/agents/python-reviewer.md +90 -0
  54. package/packs/full-harness/rendered/.claude/agents/pytorch-build-resolver.md +120 -0
  55. package/packs/full-harness/rendered/.claude/agents/react-build-resolver.md +206 -0
  56. package/packs/full-harness/rendered/.claude/agents/react-reviewer.md +156 -0
  57. package/packs/full-harness/rendered/.claude/agents/refactor-cleaner.md +85 -0
  58. package/packs/full-harness/rendered/.claude/agents/rust-build-resolver.md +148 -0
  59. package/packs/full-harness/rendered/.claude/agents/rust-reviewer.md +85 -0
  60. package/packs/full-harness/rendered/.claude/agents/security-reviewer.md +108 -0
  61. package/packs/full-harness/rendered/.claude/agents/seo-specialist.md +54 -0
  62. package/packs/full-harness/rendered/.claude/agents/silent-failure-hunter.md +50 -0
  63. package/packs/full-harness/rendered/.claude/agents/spec-miner.md +207 -0
  64. package/packs/full-harness/rendered/.claude/agents/swift-build-resolver.md +161 -0
  65. package/packs/full-harness/rendered/.claude/agents/swift-reviewer.md +98 -0
  66. package/packs/full-harness/rendered/.claude/agents/tdd-guide.md +89 -0
  67. package/packs/full-harness/rendered/.claude/agents/type-design-analyzer.md +41 -0
  68. package/packs/full-harness/rendered/.claude/agents/typescript-reviewer.md +96 -0
  69. package/packs/full-harness/rendered/.claude/agents/vue-reviewer.md +195 -0
  70. package/packs/full-harness/rendered/.claude/commands/aside.md +6 -0
  71. package/packs/full-harness/rendered/.claude/commands/auto-update.md +6 -0
  72. package/packs/full-harness/rendered/.claude/commands/build-fix.md +6 -0
  73. package/packs/full-harness/rendered/.claude/commands/checkpoint.md +6 -0
  74. package/packs/full-harness/rendered/.claude/commands/code-review.md +6 -0
  75. package/packs/full-harness/rendered/.claude/commands/cost-report.md +6 -0
  76. package/packs/full-harness/rendered/.claude/commands/cpp-build.md +6 -0
  77. package/packs/full-harness/rendered/.claude/commands/cpp-review.md +6 -0
  78. package/packs/full-harness/rendered/.claude/commands/cpp-test.md +6 -0
  79. package/packs/full-harness/rendered/.claude/commands/ecc-guide.md +6 -0
  80. package/packs/full-harness/rendered/.claude/commands/epic-claim.md +6 -0
  81. package/packs/full-harness/rendered/.claude/commands/epic-decompose.md +6 -0
  82. package/packs/full-harness/rendered/.claude/commands/epic-publish.md +6 -0
  83. package/packs/full-harness/rendered/.claude/commands/epic-review.md +6 -0
  84. package/packs/full-harness/rendered/.claude/commands/epic-sync.md +6 -0
  85. package/packs/full-harness/rendered/.claude/commands/epic-unblock.md +6 -0
  86. package/packs/full-harness/rendered/.claude/commands/epic-validate.md +6 -0
  87. package/packs/full-harness/rendered/.claude/commands/evolve.md +6 -0
  88. package/packs/full-harness/rendered/.claude/commands/fastapi-review.md +6 -0
  89. package/packs/full-harness/rendered/.claude/commands/feature-dev.md +6 -0
  90. package/packs/full-harness/rendered/.claude/commands/flutter-build.md +6 -0
  91. package/packs/full-harness/rendered/.claude/commands/flutter-review.md +6 -0
  92. package/packs/full-harness/rendered/.claude/commands/flutter-test.md +6 -0
  93. package/packs/full-harness/rendered/.claude/commands/gan-build.md +6 -0
  94. package/packs/full-harness/rendered/.claude/commands/gan-design.md +6 -0
  95. package/packs/full-harness/rendered/.claude/commands/go-build.md +6 -0
  96. package/packs/full-harness/rendered/.claude/commands/go-review.md +6 -0
  97. package/packs/full-harness/rendered/.claude/commands/go-test.md +6 -0
  98. package/packs/full-harness/rendered/.claude/commands/gradle-build.md +6 -0
  99. package/packs/full-harness/rendered/.claude/commands/harness-audit.md +6 -0
  100. package/packs/full-harness/rendered/.claude/commands/hookify-configure.md +6 -0
  101. package/packs/full-harness/rendered/.claude/commands/hookify-help.md +6 -0
  102. package/packs/full-harness/rendered/.claude/commands/hookify-list.md +6 -0
  103. package/packs/full-harness/rendered/.claude/commands/hookify.md +6 -0
  104. package/packs/full-harness/rendered/.claude/commands/instinct-export.md +6 -0
  105. package/packs/full-harness/rendered/.claude/commands/instinct-import.md +6 -0
  106. package/packs/full-harness/rendered/.claude/commands/instinct-status.md +6 -0
  107. package/packs/full-harness/rendered/.claude/commands/jira.md +6 -0
  108. package/packs/full-harness/rendered/.claude/commands/kotlin-build.md +6 -0
  109. package/packs/full-harness/rendered/.claude/commands/kotlin-review.md +6 -0
  110. package/packs/full-harness/rendered/.claude/commands/kotlin-test.md +6 -0
  111. package/packs/full-harness/rendered/.claude/commands/learn-eval.md +6 -0
  112. package/packs/full-harness/rendered/.claude/commands/learn.md +6 -0
  113. package/packs/full-harness/rendered/.claude/commands/loop-start.md +6 -0
  114. package/packs/full-harness/rendered/.claude/commands/loop-status.md +6 -0
  115. package/packs/full-harness/rendered/.claude/commands/marketing-campaign.md +6 -0
  116. package/packs/full-harness/rendered/.claude/commands/model-route.md +6 -0
  117. package/packs/full-harness/rendered/.claude/commands/multi-backend.md +6 -0
  118. package/packs/full-harness/rendered/.claude/commands/multi-execute.md +6 -0
  119. package/packs/full-harness/rendered/.claude/commands/multi-frontend.md +6 -0
  120. package/packs/full-harness/rendered/.claude/commands/multi-plan.md +6 -0
  121. package/packs/full-harness/rendered/.claude/commands/multi-workflow.md +6 -0
  122. package/packs/full-harness/rendered/.claude/commands/orch-add-feature.md +6 -0
  123. package/packs/full-harness/rendered/.claude/commands/orch-build-mvp.md +6 -0
  124. package/packs/full-harness/rendered/.claude/commands/orch-change-feature.md +6 -0
  125. package/packs/full-harness/rendered/.claude/commands/orch-fix-defect.md +6 -0
  126. package/packs/full-harness/rendered/.claude/commands/orch-refine-code.md +6 -0
  127. package/packs/full-harness/rendered/.claude/commands/orch-review.md +6 -0
  128. package/packs/full-harness/rendered/.claude/commands/plan-canvas.md +6 -0
  129. package/packs/full-harness/rendered/.claude/commands/plan-prd.md +6 -0
  130. package/packs/full-harness/rendered/.claude/commands/plan.md +6 -0
  131. package/packs/full-harness/rendered/.claude/commands/pm2.md +6 -0
  132. package/packs/full-harness/rendered/.claude/commands/pr.md +6 -0
  133. package/packs/full-harness/rendered/.claude/commands/project-init.md +6 -0
  134. package/packs/full-harness/rendered/.claude/commands/projects.md +6 -0
  135. package/packs/full-harness/rendered/.claude/commands/promote.md +6 -0
  136. package/packs/full-harness/rendered/.claude/commands/prp-commit.md +6 -0
  137. package/packs/full-harness/rendered/.claude/commands/prp-implement.md +6 -0
  138. package/packs/full-harness/rendered/.claude/commands/prp-plan.md +6 -0
  139. package/packs/full-harness/rendered/.claude/commands/prp-pr.md +6 -0
  140. package/packs/full-harness/rendered/.claude/commands/prp-prd.md +6 -0
  141. package/packs/full-harness/rendered/.claude/commands/prune.md +6 -0
  142. package/packs/full-harness/rendered/.claude/commands/python-review.md +6 -0
  143. package/packs/full-harness/rendered/.claude/commands/quality-gate.md +6 -0
  144. package/packs/full-harness/rendered/.claude/commands/react-build.md +6 -0
  145. package/packs/full-harness/rendered/.claude/commands/react-review.md +6 -0
  146. package/packs/full-harness/rendered/.claude/commands/react-test.md +6 -0
  147. package/packs/full-harness/rendered/.claude/commands/refactor-clean.md +6 -0
  148. package/packs/full-harness/rendered/.claude/commands/resume-session.md +6 -0
  149. package/packs/full-harness/rendered/.claude/commands/review-pr.md +6 -0
  150. package/packs/full-harness/rendered/.claude/commands/rust-build.md +6 -0
  151. package/packs/full-harness/rendered/.claude/commands/rust-review.md +6 -0
  152. package/packs/full-harness/rendered/.claude/commands/rust-test.md +6 -0
  153. package/packs/full-harness/rendered/.claude/commands/santa-loop.md +6 -0
  154. package/packs/full-harness/rendered/.claude/commands/save-session.md +6 -0
  155. package/packs/full-harness/rendered/.claude/commands/security-scan.md +6 -0
  156. package/packs/full-harness/rendered/.claude/commands/sessions.md +6 -0
  157. package/packs/full-harness/rendered/.claude/commands/setup-pm.md +6 -0
  158. package/packs/full-harness/rendered/.claude/commands/skill-create.md +6 -0
  159. package/packs/full-harness/rendered/.claude/commands/skill-health.md +6 -0
  160. package/packs/full-harness/rendered/.claude/commands/test-coverage.md +6 -0
  161. package/packs/full-harness/rendered/.claude/commands/update-codemaps.md +6 -0
  162. package/packs/full-harness/rendered/.claude/commands/update-docs.md +6 -0
  163. package/packs/full-harness/rendered/.claude/commands/vue-review.md +6 -0
  164. package/packs/full-harness/rendered/.claude/skills/accessibility/SKILL.md +144 -0
  165. package/packs/full-harness/rendered/.claude/skills/agent-architecture-audit/SKILL.md +254 -0
  166. package/packs/full-harness/rendered/.claude/skills/agent-eval/SKILL.md +143 -0
  167. package/packs/full-harness/rendered/.claude/skills/agent-harness-construction/SKILL.md +72 -0
  168. package/packs/full-harness/rendered/.claude/skills/agent-introspection-debugging/SKILL.md +152 -0
  169. package/packs/full-harness/rendered/.claude/skills/agent-payment-x402/SKILL.md +223 -0
  170. package/packs/full-harness/rendered/.claude/skills/agent-self-evaluation/SKILL.md +181 -0
  171. package/packs/full-harness/rendered/.claude/skills/agent-sort/SKILL.md +214 -0
  172. package/packs/full-harness/rendered/.claude/skills/agentic-engineering/SKILL.md +62 -0
  173. package/packs/full-harness/rendered/.claude/skills/agentic-os/SKILL.md +386 -0
  174. package/packs/full-harness/rendered/.claude/skills/ai-first-engineering/SKILL.md +50 -0
  175. package/packs/full-harness/rendered/.claude/skills/ai-regression-testing/SKILL.md +384 -0
  176. package/packs/full-harness/rendered/.claude/skills/android-clean-architecture/SKILL.md +338 -0
  177. package/packs/full-harness/rendered/.claude/skills/angular-developer/SKILL.md +153 -0
  178. package/packs/full-harness/rendered/.claude/skills/api-connector-builder/SKILL.md +118 -0
  179. package/packs/full-harness/rendered/.claude/skills/api-design/SKILL.md +522 -0
  180. package/packs/full-harness/rendered/.claude/skills/architecture-decision-records/SKILL.md +178 -0
  181. package/packs/full-harness/rendered/.claude/skills/article-writing/SKILL.md +78 -0
  182. package/packs/full-harness/rendered/.claude/skills/automation-audit-ops/SKILL.md +141 -0
  183. package/packs/full-harness/rendered/.claude/skills/autonomous-agent-harness/SKILL.md +272 -0
  184. package/packs/full-harness/rendered/.claude/skills/autonomous-loops/SKILL.md +609 -0
  185. package/packs/full-harness/rendered/.claude/skills/backend-patterns/SKILL.md +560 -0
  186. package/packs/full-harness/rendered/.claude/skills/benchmark/SKILL.md +92 -0
  187. package/packs/full-harness/rendered/.claude/skills/benchmark-methodology/SKILL.md +185 -0
  188. package/packs/full-harness/rendered/.claude/skills/benchmark-optimization-loop/SKILL.md +67 -0
  189. package/packs/full-harness/rendered/.claude/skills/blender-motion-state-inspection/SKILL.md +162 -0
  190. package/packs/full-harness/rendered/.claude/skills/blueprint/SKILL.md +95 -0
  191. package/packs/full-harness/rendered/.claude/skills/brand-discovery/SKILL.md +140 -0
  192. package/packs/full-harness/rendered/.claude/skills/brand-voice/SKILL.md +96 -0
  193. package/packs/full-harness/rendered/.claude/skills/browser-qa/SKILL.md +103 -0
  194. package/packs/full-harness/rendered/.claude/skills/bun-runtime/SKILL.md +83 -0
  195. package/packs/full-harness/rendered/.claude/skills/canary-watch/SKILL.md +106 -0
  196. package/packs/full-harness/rendered/.claude/skills/carrier-relationship-management/SKILL.md +198 -0
  197. package/packs/full-harness/rendered/.claude/skills/cisco-ios-patterns/SKILL.md +162 -0
  198. package/packs/full-harness/rendered/.claude/skills/ck/SKILL.md +143 -0
  199. package/packs/full-harness/rendered/.claude/skills/claude-devfleet/SKILL.md +110 -0
  200. package/packs/full-harness/rendered/.claude/skills/click-path-audit/SKILL.md +243 -0
  201. package/packs/full-harness/rendered/.claude/skills/clickhouse-io/SKILL.md +443 -0
  202. package/packs/full-harness/rendered/.claude/skills/code-tour/SKILL.md +252 -0
  203. package/packs/full-harness/rendered/.claude/skills/codebase-onboarding/SKILL.md +232 -0
  204. package/packs/full-harness/rendered/.claude/skills/codehealth-mcp/SKILL.md +165 -0
  205. package/packs/full-harness/rendered/.claude/skills/coding-standards/SKILL.md +549 -0
  206. package/packs/full-harness/rendered/.claude/skills/competitive-platform-analysis/SKILL.md +209 -0
  207. package/packs/full-harness/rendered/.claude/skills/competitive-report-structure/SKILL.md +157 -0
  208. package/packs/full-harness/rendered/.claude/skills/compose-multiplatform-patterns/SKILL.md +298 -0
  209. package/packs/full-harness/rendered/.claude/skills/config-gc/SKILL.md +118 -0
  210. package/packs/full-harness/rendered/.claude/skills/configure-ecc/SKILL.md +383 -0
  211. package/packs/full-harness/rendered/.claude/skills/connections-optimizer/SKILL.md +188 -0
  212. package/packs/full-harness/rendered/.claude/skills/content-engine/SKILL.md +130 -0
  213. package/packs/full-harness/rendered/.claude/skills/content-hash-cache-pattern/SKILL.md +160 -0
  214. package/packs/full-harness/rendered/.claude/skills/context-budget/SKILL.md +134 -0
  215. package/packs/full-harness/rendered/.claude/skills/continuous-agent-loop/SKILL.md +44 -0
  216. package/packs/full-harness/rendered/.claude/skills/continuous-learning/SKILL.md +130 -0
  217. package/packs/full-harness/rendered/.claude/skills/continuous-learning-v2/SKILL.md +358 -0
  218. package/packs/full-harness/rendered/.claude/skills/cost-aware-llm-pipeline/SKILL.md +182 -0
  219. package/packs/full-harness/rendered/.claude/skills/cost-tracking/SKILL.md +95 -0
  220. package/packs/full-harness/rendered/.claude/skills/council/SKILL.md +202 -0
  221. package/packs/full-harness/rendered/.claude/skills/cpp-coding-standards/SKILL.md +722 -0
  222. package/packs/full-harness/rendered/.claude/skills/cpp-testing/SKILL.md +323 -0
  223. package/packs/full-harness/rendered/.claude/skills/crosspost/SKILL.md +110 -0
  224. package/packs/full-harness/rendered/.claude/skills/csharp-testing/SKILL.md +320 -0
  225. package/packs/full-harness/rendered/.claude/skills/customer-billing-ops/SKILL.md +139 -0
  226. package/packs/full-harness/rendered/.claude/skills/customs-trade-compliance/SKILL.md +248 -0
  227. package/packs/full-harness/rendered/.claude/skills/dart-flutter-patterns/SKILL.md +562 -0
  228. package/packs/full-harness/rendered/.claude/skills/dashboard-builder/SKILL.md +106 -0
  229. package/packs/full-harness/rendered/.claude/skills/data-scraper-agent/SKILL.md +763 -0
  230. package/packs/full-harness/rendered/.claude/skills/data-throughput-accelerator/SKILL.md +70 -0
  231. package/packs/full-harness/rendered/.claude/skills/database-migrations/SKILL.md +428 -0
  232. package/packs/full-harness/rendered/.claude/skills/deep-research/SKILL.md +158 -0
  233. package/packs/full-harness/rendered/.claude/skills/defi-amm-security/SKILL.md +164 -0
  234. package/packs/full-harness/rendered/.claude/skills/delivery-gate/SKILL.md +123 -0
  235. package/packs/full-harness/rendered/.claude/skills/deployment-patterns/SKILL.md +426 -0
  236. package/packs/full-harness/rendered/.claude/skills/design-system/SKILL.md +81 -0
  237. package/packs/full-harness/rendered/.claude/skills/django-celery/SKILL.md +456 -0
  238. package/packs/full-harness/rendered/.claude/skills/django-patterns/SKILL.md +733 -0
  239. package/packs/full-harness/rendered/.claude/skills/django-security/SKILL.md +642 -0
  240. package/packs/full-harness/rendered/.claude/skills/django-tdd/SKILL.md +728 -0
  241. package/packs/full-harness/rendered/.claude/skills/django-verification/SKILL.md +468 -0
  242. package/packs/full-harness/rendered/.claude/skills/dmux-workflows/SKILL.md +190 -0
  243. package/packs/full-harness/rendered/.claude/skills/docker-patterns/SKILL.md +363 -0
  244. package/packs/full-harness/rendered/.claude/skills/documentation-lookup/SKILL.md +89 -0
  245. package/packs/full-harness/rendered/.claude/skills/dotnet-patterns/SKILL.md +320 -0
  246. package/packs/full-harness/rendered/.claude/skills/dynamic-workflow-mode/SKILL.md +122 -0
  247. package/packs/full-harness/rendered/.claude/skills/e2e-testing/SKILL.md +325 -0
  248. package/packs/full-harness/rendered/.claude/skills/ecc-guide/SKILL.md +188 -0
  249. package/packs/full-harness/rendered/.claude/skills/ecc-recipes/SKILL.md +145 -0
  250. package/packs/full-harness/rendered/.claude/skills/ecc-tools-cost-audit/SKILL.md +159 -0
  251. package/packs/full-harness/rendered/.claude/skills/email-ops/SKILL.md +120 -0
  252. package/packs/full-harness/rendered/.claude/skills/energy-procurement/SKILL.md +213 -0
  253. package/packs/full-harness/rendered/.claude/skills/enterprise-agent-ops/SKILL.md +49 -0
  254. package/packs/full-harness/rendered/.claude/skills/error-handling/SKILL.md +375 -0
  255. package/packs/full-harness/rendered/.claude/skills/eval-harness/SKILL.md +268 -0
  256. package/packs/full-harness/rendered/.claude/skills/evm-token-decimals/SKILL.md +128 -0
  257. package/packs/full-harness/rendered/.claude/skills/exa-search/SKILL.md +106 -0
  258. package/packs/full-harness/rendered/.claude/skills/fal-ai-media/SKILL.md +287 -0
  259. package/packs/full-harness/rendered/.claude/skills/fastapi-patterns/SKILL.md +512 -0
  260. package/packs/full-harness/rendered/.claude/skills/finance-billing-ops/SKILL.md +126 -0
  261. package/packs/full-harness/rendered/.claude/skills/flox-environments/SKILL.md +495 -0
  262. package/packs/full-harness/rendered/.claude/skills/flutter-dart-code-review/SKILL.md +434 -0
  263. package/packs/full-harness/rendered/.claude/skills/foundation-models-on-device/SKILL.md +243 -0
  264. package/packs/full-harness/rendered/.claude/skills/frontend-a11y/SKILL.md +441 -0
  265. package/packs/full-harness/rendered/.claude/skills/frontend-design-direction/SKILL.md +91 -0
  266. package/packs/full-harness/rendered/.claude/skills/frontend-patterns/SKILL.md +655 -0
  267. package/packs/full-harness/rendered/.claude/skills/frontend-slides/SKILL.md +183 -0
  268. package/packs/full-harness/rendered/.claude/skills/fsharp-testing/SKILL.md +279 -0
  269. package/packs/full-harness/rendered/.claude/skills/gan-style-harness/SKILL.md +276 -0
  270. package/packs/full-harness/rendered/.claude/skills/gateguard/SKILL.md +131 -0
  271. package/packs/full-harness/rendered/.claude/skills/generating-python-installer/SKILL.md +820 -0
  272. package/packs/full-harness/rendered/.claude/skills/gget/SKILL.md +165 -0
  273. package/packs/full-harness/rendered/.claude/skills/git-workflow/SKILL.md +714 -0
  274. package/packs/full-harness/rendered/.claude/skills/github-ops/SKILL.md +143 -0
  275. package/packs/full-harness/rendered/.claude/skills/golang-patterns/SKILL.md +674 -0
  276. package/packs/full-harness/rendered/.claude/skills/golang-testing/SKILL.md +719 -0
  277. package/packs/full-harness/rendered/.claude/skills/google-workspace-ops/SKILL.md +94 -0
  278. package/packs/full-harness/rendered/.claude/skills/growth-log/SKILL.md +125 -0
  279. package/packs/full-harness/rendered/.claude/skills/healthcare-cdss-patterns/SKILL.md +243 -0
  280. package/packs/full-harness/rendered/.claude/skills/healthcare-emr-patterns/SKILL.md +157 -0
  281. package/packs/full-harness/rendered/.claude/skills/healthcare-eval-harness/SKILL.md +205 -0
  282. package/packs/full-harness/rendered/.claude/skills/healthcare-phi-compliance/SKILL.md +143 -0
  283. package/packs/full-harness/rendered/.claude/skills/hermes-imports/SKILL.md +87 -0
  284. package/packs/full-harness/rendered/.claude/skills/hexagonal-architecture/SKILL.md +275 -0
  285. package/packs/full-harness/rendered/.claude/skills/hipaa-compliance/SKILL.md +76 -0
  286. package/packs/full-harness/rendered/.claude/skills/homelab-network-readiness/SKILL.md +168 -0
  287. package/packs/full-harness/rendered/.claude/skills/homelab-network-setup/SKILL.md +128 -0
  288. package/packs/full-harness/rendered/.claude/skills/homelab-pihole-dns/SKILL.md +273 -0
  289. package/packs/full-harness/rendered/.claude/skills/homelab-vlan-segmentation/SKILL.md +310 -0
  290. package/packs/full-harness/rendered/.claude/skills/homelab-wireguard-vpn/SKILL.md +304 -0
  291. package/packs/full-harness/rendered/.claude/skills/hookify-rules/SKILL.md +128 -0
  292. package/packs/full-harness/rendered/.claude/skills/inherit-legacy-style/SKILL.md +154 -0
  293. package/packs/full-harness/rendered/.claude/skills/intent-driven-development/SKILL.md +360 -0
  294. package/packs/full-harness/rendered/.claude/skills/inventory-demand-planning/SKILL.md +232 -0
  295. package/packs/full-harness/rendered/.claude/skills/investor-materials/SKILL.md +95 -0
  296. package/packs/full-harness/rendered/.claude/skills/investor-outreach/SKILL.md +90 -0
  297. package/packs/full-harness/rendered/.claude/skills/ios-icon-gen/SKILL.md +156 -0
  298. package/packs/full-harness/rendered/.claude/skills/iterative-retrieval/SKILL.md +210 -0
  299. package/packs/full-harness/rendered/.claude/skills/ito-basket-compare/SKILL.md +62 -0
  300. package/packs/full-harness/rendered/.claude/skills/ito-data-atlas-agent/SKILL.md +62 -0
  301. package/packs/full-harness/rendered/.claude/skills/ito-market-intelligence/SKILL.md +59 -0
  302. package/packs/full-harness/rendered/.claude/skills/ito-trade-planner/SKILL.md +66 -0
  303. package/packs/full-harness/rendered/.claude/skills/java-coding-standards/SKILL.md +382 -0
  304. package/packs/full-harness/rendered/.claude/skills/jira-integration/SKILL.md +301 -0
  305. package/packs/full-harness/rendered/.claude/skills/jpa-patterns/SKILL.md +150 -0
  306. package/packs/full-harness/rendered/.claude/skills/knowledge-ops/SKILL.md +153 -0
  307. package/packs/full-harness/rendered/.claude/skills/kotlin-coroutines-flows/SKILL.md +283 -0
  308. package/packs/full-harness/rendered/.claude/skills/kotlin-exposed-patterns/SKILL.md +718 -0
  309. package/packs/full-harness/rendered/.claude/skills/kotlin-ktor-patterns/SKILL.md +688 -0
  310. package/packs/full-harness/rendered/.claude/skills/kotlin-patterns/SKILL.md +710 -0
  311. package/packs/full-harness/rendered/.claude/skills/kotlin-testing/SKILL.md +823 -0
  312. package/packs/full-harness/rendered/.claude/skills/kubernetes-patterns/SKILL.md +754 -0
  313. package/packs/full-harness/rendered/.claude/skills/laravel-patterns/SKILL.md +414 -0
  314. package/packs/full-harness/rendered/.claude/skills/laravel-plugin-discovery/SKILL.md +228 -0
  315. package/packs/full-harness/rendered/.claude/skills/laravel-security/SKILL.md +946 -0
  316. package/packs/full-harness/rendered/.claude/skills/laravel-tdd/SKILL.md +673 -0
  317. package/packs/full-harness/rendered/.claude/skills/laravel-verification/SKILL.md +178 -0
  318. package/packs/full-harness/rendered/.claude/skills/latency-critical-systems/SKILL.md +71 -0
  319. package/packs/full-harness/rendered/.claude/skills/lead-intelligence/SKILL.md +320 -0
  320. package/packs/full-harness/rendered/.claude/skills/liquid-glass-design/SKILL.md +279 -0
  321. package/packs/full-harness/rendered/.claude/skills/literature-review/SKILL.md +191 -0
  322. package/packs/full-harness/rendered/.claude/skills/llm-trading-agent-security/SKILL.md +144 -0
  323. package/packs/full-harness/rendered/.claude/skills/logistics-exception-management/SKILL.md +208 -0
  324. package/packs/full-harness/rendered/.claude/skills/loop-design-check/SKILL.md +141 -0
  325. package/packs/full-harness/rendered/.claude/skills/mailtrap-email-integration/SKILL.md +76 -0
  326. package/packs/full-harness/rendered/.claude/skills/make-interfaces-feel-better/SKILL.md +150 -0
  327. package/packs/full-harness/rendered/.claude/skills/manim-video/SKILL.md +88 -0
  328. package/packs/full-harness/rendered/.claude/skills/market-research/SKILL.md +74 -0
  329. package/packs/full-harness/rendered/.claude/skills/marketing-campaign/SKILL.md +112 -0
  330. package/packs/full-harness/rendered/.claude/skills/mcp-server-patterns/SKILL.md +68 -0
  331. package/packs/full-harness/rendered/.claude/skills/messages-ops/SKILL.md +103 -0
  332. package/packs/full-harness/rendered/.claude/skills/ml-adoption-playbook/SKILL.md +56 -0
  333. package/packs/full-harness/rendered/.claude/skills/mle-workflow/SKILL.md +345 -0
  334. package/packs/full-harness/rendered/.claude/skills/motion-advanced/SKILL.md +592 -0
  335. package/packs/full-harness/rendered/.claude/skills/motion-foundations/SKILL.md +295 -0
  336. package/packs/full-harness/rendered/.claude/skills/motion-patterns/SKILL.md +430 -0
  337. package/packs/full-harness/rendered/.claude/skills/motion-ui/SKILL.md +574 -0
  338. package/packs/full-harness/rendered/.claude/skills/mysql-patterns/SKILL.md +411 -0
  339. package/packs/full-harness/rendered/.claude/skills/nanoclaw-repl/SKILL.md +32 -0
  340. package/packs/full-harness/rendered/.claude/skills/nestjs-patterns/SKILL.md +229 -0
  341. package/packs/full-harness/rendered/.claude/skills/netmiko-ssh-automation/SKILL.md +172 -0
  342. package/packs/full-harness/rendered/.claude/skills/network-bgp-diagnostics/SKILL.md +166 -0
  343. package/packs/full-harness/rendered/.claude/skills/network-config-validation/SKILL.md +209 -0
  344. package/packs/full-harness/rendered/.claude/skills/network-interface-health/SKILL.md +151 -0
  345. package/packs/full-harness/rendered/.claude/skills/nextjs-turbopack/SKILL.md +56 -0
  346. package/packs/full-harness/rendered/.claude/skills/nodejs-keccak256/SKILL.md +100 -0
  347. package/packs/full-harness/rendered/.claude/skills/nutrient-document-processing/SKILL.md +166 -0
  348. package/packs/full-harness/rendered/.claude/skills/nuxt4-patterns/SKILL.md +99 -0
  349. package/packs/full-harness/rendered/.claude/skills/openclaw-persona-forge/SKILL.md +287 -0
  350. package/packs/full-harness/rendered/.claude/skills/opensource-pipeline/SKILL.md +254 -0
  351. package/packs/full-harness/rendered/.claude/skills/orch-add-feature/SKILL.md +43 -0
  352. package/packs/full-harness/rendered/.claude/skills/orch-build-mvp/SKILL.md +47 -0
  353. package/packs/full-harness/rendered/.claude/skills/orch-change-feature/SKILL.md +41 -0
  354. package/packs/full-harness/rendered/.claude/skills/orch-fix-defect/SKILL.md +41 -0
  355. package/packs/full-harness/rendered/.claude/skills/orch-pipeline/SKILL.md +119 -0
  356. package/packs/full-harness/rendered/.claude/skills/orch-refine-code/SKILL.md +42 -0
  357. package/packs/full-harness/rendered/.claude/skills/parallel-execution-optimizer/SKILL.md +70 -0
  358. package/packs/full-harness/rendered/.claude/skills/perl-patterns/SKILL.md +503 -0
  359. package/packs/full-harness/rendered/.claude/skills/perl-security/SKILL.md +502 -0
  360. package/packs/full-harness/rendered/.claude/skills/perl-testing/SKILL.md +474 -0
  361. package/packs/full-harness/rendered/.claude/skills/plan-canvas/SKILL.md +150 -0
  362. package/packs/full-harness/rendered/.claude/skills/plan-orchestrate/SKILL.md +261 -0
  363. package/packs/full-harness/rendered/.claude/skills/plankton-code-quality/SKILL.md +235 -0
  364. package/packs/full-harness/rendered/.claude/skills/postgres-patterns/SKILL.md +146 -0
  365. package/packs/full-harness/rendered/.claude/skills/prediction-market-oracle-research/SKILL.md +62 -0
  366. package/packs/full-harness/rendered/.claude/skills/prediction-market-risk-review/SKILL.md +59 -0
  367. package/packs/full-harness/rendered/.claude/skills/prisma-patterns/SKILL.md +399 -0
  368. package/packs/full-harness/rendered/.claude/skills/product-capability/SKILL.md +140 -0
  369. package/packs/full-harness/rendered/.claude/skills/product-lens/SKILL.md +91 -0
  370. package/packs/full-harness/rendered/.claude/skills/production-audit/SKILL.md +205 -0
  371. package/packs/full-harness/rendered/.claude/skills/production-scheduling/SKILL.md +223 -0
  372. package/packs/full-harness/rendered/.claude/skills/project-flow-ops/SKILL.md +110 -0
  373. package/packs/full-harness/rendered/.claude/skills/prompt-optimizer/SKILL.md +383 -0
  374. package/packs/full-harness/rendered/.claude/skills/pubmed-database/SKILL.md +174 -0
  375. package/packs/full-harness/rendered/.claude/skills/python-patterns/SKILL.md +749 -0
  376. package/packs/full-harness/rendered/.claude/skills/python-testing/SKILL.md +815 -0
  377. package/packs/full-harness/rendered/.claude/skills/pytorch-patterns/SKILL.md +395 -0
  378. package/packs/full-harness/rendered/.claude/skills/quality-nonconformance/SKILL.md +245 -0
  379. package/packs/full-harness/rendered/.claude/skills/quarkus-patterns/SKILL.md +721 -0
  380. package/packs/full-harness/rendered/.claude/skills/quarkus-security/SKILL.md +466 -0
  381. package/packs/full-harness/rendered/.claude/skills/quarkus-tdd/SKILL.md +810 -0
  382. package/packs/full-harness/rendered/.claude/skills/quarkus-verification/SKILL.md +478 -0
  383. package/packs/full-harness/rendered/.claude/skills/ralphinho-rfc-pipeline/SKILL.md +66 -0
  384. package/packs/full-harness/rendered/.claude/skills/react-native-patterns/SKILL.md +325 -0
  385. package/packs/full-harness/rendered/.claude/skills/react-patterns/SKILL.md +340 -0
  386. package/packs/full-harness/rendered/.claude/skills/react-performance/SKILL.md +573 -0
  387. package/packs/full-harness/rendered/.claude/skills/react-testing/SKILL.md +422 -0
  388. package/packs/full-harness/rendered/.claude/skills/recsys-pipeline-architect/SKILL.md +113 -0
  389. package/packs/full-harness/rendered/.claude/skills/recursive-decision-ledger/SKILL.md +77 -0
  390. package/packs/full-harness/rendered/.claude/skills/redis-patterns/SKILL.md +402 -0
  391. package/packs/full-harness/rendered/.claude/skills/regex-vs-llm-structured-text/SKILL.md +219 -0
  392. package/packs/full-harness/rendered/.claude/skills/remotion-video-creation/SKILL.md +41 -0
  393. package/packs/full-harness/rendered/.claude/skills/repo-scan/SKILL.md +77 -0
  394. package/packs/full-harness/rendered/.claude/skills/research-ops/SKILL.md +111 -0
  395. package/packs/full-harness/rendered/.claude/skills/returns-reverse-logistics/SKILL.md +225 -0
  396. package/packs/full-harness/rendered/.claude/skills/rules-distill/SKILL.md +263 -0
  397. package/packs/full-harness/rendered/.claude/skills/rust-patterns/SKILL.md +498 -0
  398. package/packs/full-harness/rendered/.claude/skills/rust-testing/SKILL.md +499 -0
  399. package/packs/full-harness/rendered/.claude/skills/safety-guard/SKILL.md +74 -0
  400. package/packs/full-harness/rendered/.claude/skills/santa-method/SKILL.md +305 -0
  401. package/packs/full-harness/rendered/.claude/skills/scholar-evaluation/SKILL.md +159 -0
  402. package/packs/full-harness/rendered/.claude/skills/search-first/SKILL.md +181 -0
  403. package/packs/full-harness/rendered/.claude/skills/security-bounty-hunter/SKILL.md +97 -0
  404. package/packs/full-harness/rendered/.claude/skills/security-review/SKILL.md +502 -0
  405. package/packs/full-harness/rendered/.claude/skills/security-scan/SKILL.md +164 -0
  406. package/packs/full-harness/rendered/.claude/skills/seo/SKILL.md +153 -0
  407. package/packs/full-harness/rendered/.claude/skills/skill-comply/SKILL.md +56 -0
  408. package/packs/full-harness/rendered/.claude/skills/skill-scout/SKILL.md +139 -0
  409. package/packs/full-harness/rendered/.claude/skills/skill-stocktake/SKILL.md +193 -0
  410. package/packs/full-harness/rendered/.claude/skills/social-graph-ranker/SKILL.md +153 -0
  411. package/packs/full-harness/rendered/.claude/skills/social-publisher/SKILL.md +128 -0
  412. package/packs/full-harness/rendered/.claude/skills/springboot-patterns/SKILL.md +313 -0
  413. package/packs/full-harness/rendered/.claude/skills/springboot-security/SKILL.md +271 -0
  414. package/packs/full-harness/rendered/.claude/skills/springboot-tdd/SKILL.md +157 -0
  415. package/packs/full-harness/rendered/.claude/skills/springboot-verification/SKILL.md +230 -0
  416. package/packs/full-harness/rendered/.claude/skills/strategic-compact/SKILL.md +136 -0
  417. package/packs/full-harness/rendered/.claude/skills/swift-actor-persistence/SKILL.md +142 -0
  418. package/packs/full-harness/rendered/.claude/skills/swift-concurrency-6-2/SKILL.md +216 -0
  419. package/packs/full-harness/rendered/.claude/skills/swift-protocol-di-testing/SKILL.md +189 -0
  420. package/packs/full-harness/rendered/.claude/skills/swiftui-patterns/SKILL.md +259 -0
  421. package/packs/full-harness/rendered/.claude/skills/taste/SKILL.md +263 -0
  422. package/packs/full-harness/rendered/.claude/skills/tdd-workflow/SKILL.md +580 -0
  423. package/packs/full-harness/rendered/.claude/skills/team-agent-orchestration/SKILL.md +109 -0
  424. package/packs/full-harness/rendered/.claude/skills/team-builder/SKILL.md +167 -0
  425. package/packs/full-harness/rendered/.claude/skills/terminal-ops/SKILL.md +108 -0
  426. package/packs/full-harness/rendered/.claude/skills/tinystruct-patterns/SKILL.md +277 -0
  427. package/packs/full-harness/rendered/.claude/skills/token-budget-advisor/SKILL.md +120 -0
  428. package/packs/full-harness/rendered/.claude/skills/ui-demo/SKILL.md +464 -0
  429. package/packs/full-harness/rendered/.claude/skills/ui-to-vue/SKILL.md +133 -0
  430. package/packs/full-harness/rendered/.claude/skills/uncloud/SKILL.md +342 -0
  431. package/packs/full-harness/rendered/.claude/skills/unified-notifications-ops/SKILL.md +186 -0
  432. package/packs/full-harness/rendered/.claude/skills/uspto-database/SKILL.md +176 -0
  433. package/packs/full-harness/rendered/.claude/skills/verification-loop/SKILL.md +126 -0
  434. package/packs/full-harness/rendered/.claude/skills/video-editing/SKILL.md +309 -0
  435. package/packs/full-harness/rendered/.claude/skills/videodb/SKILL.md +371 -0
  436. package/packs/full-harness/rendered/.claude/skills/visa-doc-translate/SKILL.md +117 -0
  437. package/packs/full-harness/rendered/.claude/skills/vite-patterns/SKILL.md +448 -0
  438. package/packs/full-harness/rendered/.claude/skills/vue-patterns/SKILL.md +470 -0
  439. package/packs/full-harness/rendered/.claude/skills/windows-desktop-e2e/SKILL.md +886 -0
  440. package/packs/full-harness/rendered/.claude/skills/workspace-surface-audit/SKILL.md +124 -0
  441. package/packs/full-harness/rendered/.claude/skills/x-api/SKILL.md +233 -0
  442. package/packs/full-harness/rendered/.github/copilot-instructions.md +89529 -0
  443. package/packs/full-harness/rendered/AGENTS.md +9663 -0
  444. package/packs/full-harness/rendered/CLAUDE.md +444 -0
  445. package/packs/full-harness/rendered/GEMINI.md +71959 -0
@@ -0,0 +1,946 @@
1
+ ---
2
+ name: laravel-security
3
+ description: Laravel security best practices — authentication, authorization, Eloquent safety, CSRF, XSS prevention, API security, and secure deployment configurations.
4
+ ---
5
+
6
+ # Laravel Security Best Practices
7
+
8
+ Comprehensive security guidelines for Laravel applications to protect against common vulnerabilities.
9
+
10
+ ## When to Activate
11
+
12
+ - Setting up Laravel authentication and authorization (Sanctum, Passport, Jetstream, Breeze)
13
+ - Implementing user roles, permissions, and policies
14
+ - Configuring production security settings and environment variables
15
+ - Reviewing Laravel applications for security vulnerabilities
16
+ - Deploying Laravel applications to production
17
+ - Writing secure Eloquent queries and migrations
18
+
19
+ ## Production Configuration
20
+
21
+ ### Essential Production Settings
22
+
23
+ ```php
24
+ // config/app.php
25
+ 'env' => env('APP_ENV', 'production'),
26
+ 'debug' => (bool) env('APP_DEBUG', false), // CRITICAL: Never true in production
27
+ 'key' => env('APP_KEY'), // Must be set: php artisan key:generate
28
+
29
+ // config/session.php
30
+ 'secure' => env('SESSION_SECURE_COOKIE', true),
31
+ 'http_only' => true,
32
+ 'same_site' => 'lax',
33
+
34
+ // Verify APP_KEY is set at boot
35
+ // bootstrap/app.php or a service provider
36
+ if (empty(config('app.key'))) {
37
+ throw new RuntimeException('APP_KEY is not set. Run: php artisan key:generate');
38
+ }
39
+ ```
40
+
41
+ ### Environment File Security
42
+
43
+ ```bash
44
+ # NEVER commit .env to version control
45
+ # .gitignore already includes .env by default
46
+
47
+ # Use .env.example with placeholders instead
48
+ DB_PASSWORD=
49
+ APP_KEY=
50
+ SANCTUM_TOKEN_PREFIX=
51
+
52
+ # Validate required variables at boot
53
+ // In AppServiceProvider::boot()
54
+ $requiredKeys = ['app.key', 'database.connections.mysql.database', 'database.connections.mysql.username'];
55
+ foreach ($requiredKeys as $key) {
56
+ if (empty(config($key))) {
57
+ throw new RuntimeException("Missing required config key: {$key}");
58
+ }
59
+ }
60
+ ```
61
+
62
+ ### HTTPS Enforcement
63
+
64
+ ```php
65
+ // AppServiceProvider::boot() or middleware
66
+ if (app()->environment('production')) {
67
+ URL::forceScheme('https');
68
+ request()->server->set('HTTPS', 'on');
69
+ }
70
+
71
+ // config/app.php for trusted proxies (load balancers)
72
+ // Use specific IP ranges — * trusts all, allowing X-Forwarded-* spoofing
73
+ // AWS: '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'
74
+ 'trusted_proxies' => ['10.0.0.0/8', '172.16.0.0/12'],
75
+
76
+ // Force HTTPS in production via middleware
77
+ // app/Http/Middleware/ForceHttps.php
78
+ public function handle($request, Closure $next)
79
+ {
80
+ if (!$request->secure() && app()->environment('production')) {
81
+ return redirect()->secure($request->getRequestUri());
82
+ }
83
+ return $next($request);
84
+ }
85
+ ```
86
+
87
+ ## Authentication
88
+
89
+ ### Sanctum (API Token Authentication)
90
+
91
+ ```php
92
+ // config/sanctum.php
93
+ 'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf(
94
+ '%s%s',
95
+ 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1',
96
+ env('APP_URL') ? ',' . parse_url(env('APP_URL'), PHP_URL_HOST) : ''
97
+ )));
98
+
99
+ 'expiration' => 60 * 24, // Token expiration in minutes (null = never)
100
+ 'token_prefix' => env('SANCTUM_TOKEN_PREFIX', ''),
101
+
102
+ // Issuing tokens with abilities
103
+ $token = $user->createToken('api-token', ['read', 'write'])->plainTextToken;
104
+
105
+ // Validate abilities on routes
106
+ Route::middleware('auth:sanctum')->group(function () {
107
+ Route::get('/orders', function () {
108
+ // User must have 'read' ability
109
+ abort_unless(Auth::user()->tokenCan('read'), 403);
110
+ // ...
111
+ })->middleware('abilities:read');
112
+
113
+ Route::post('/orders', function () {
114
+ // User must have 'write' ability
115
+ abort_unless(Auth::user()->tokenCan('write'), 403);
116
+ // ...
117
+ })->middleware('abilities:write');
118
+ });
119
+ ```
120
+
121
+ ### Password Security
122
+
123
+ ```php
124
+ // config/hashing.php
125
+ // Default is bcrypt. Argon2id is stronger.
126
+ 'bcrypt' => [
127
+ 'rounds' => env('BCRYPT_ROUNDS', 12), // Increase for stronger hashing
128
+ ],
129
+
130
+ 'argon' => [
131
+ 'memory' => 65536,
132
+ 'threads' => 4,
133
+ 'time' => 4,
134
+ ],
135
+
136
+ // Password validation in RegisterRequest
137
+ public function rules(): array
138
+ {
139
+ return [
140
+ 'password' => [
141
+ 'required',
142
+ 'confirmed',
143
+ Password::min(12)
144
+ ->letters()
145
+ ->mixedCase()
146
+ ->numbers()
147
+ ->symbols()
148
+ ->uncompromised(), // Checks haveibeenpwned
149
+ ],
150
+ ];
151
+ }
152
+
153
+ // Rate limit login attempts
154
+ // App\Http\Controllers\Auth\AuthenticatedSessionController
155
+ protected function authenticated(Request $request, $user)
156
+ {
157
+ if ($user->wasRecentlyLockedOut()) {
158
+ // Notify user of suspicious login
159
+ $user->notify(new SuspiciousLoginNotification($request->ip()));
160
+ }
161
+ }
162
+ ```
163
+
164
+ ### Session Management
165
+
166
+ ```php
167
+ // config/session.php
168
+ 'driver' => env('SESSION_DRIVER', 'database'), // database/redis > file
169
+ 'lifetime' => env('SESSION_LIFETIME', 120),
170
+ 'expire_on_close' => env('SESSION_EXPIRE_ON_CLOSE', false),
171
+ 'encrypt' => env('SESSION_ENCRYPT', false),
172
+
173
+ // Regenerate session on login
174
+ // App\Http\Controllers\Auth\AuthenticatedSessionController
175
+ public function store(LoginRequest $request): RedirectResponse
176
+ {
177
+ $request->authenticate();
178
+ $request->session()->regenerate(); // CRITICAL: prevents session fixation
179
+ return redirect()->intended(RouteServiceProvider::HOME);
180
+ }
181
+
182
+ // Invalidate session on logout
183
+ public function destroy(Request $request): RedirectResponse
184
+ {
185
+ Auth::guard('web')->logout();
186
+ $request->session()->invalidate();
187
+ $request->session()->regenerateToken();
188
+ return redirect('/');
189
+ }
190
+ ```
191
+
192
+ ## Authorization
193
+
194
+ ### Gates
195
+
196
+ ```php
197
+ // App\Providers\AuthServiceProvider
198
+ use App\Models\Post;
199
+ use App\Models\User;
200
+ use Illuminate\Support\Facades\Gate;
201
+
202
+ public function boot(): void
203
+ {
204
+ Gate::define('update-post', function (User $user, Post $post): bool {
205
+ return $user->id === $post->user_id;
206
+ });
207
+
208
+ Gate::define('publish-post', function (User $user): bool {
209
+ return $user->role === 'editor' || $user->role === 'admin';
210
+ });
211
+
212
+ // Using before() for super-admin override
213
+ Gate::before(function (User $user, string $ability): ?bool {
214
+ if ($user->role === 'super-admin') {
215
+ return true; // Grants all abilities
216
+ }
217
+ return null; // Fall through to normal checks
218
+ });
219
+ }
220
+
221
+ // Usage in controllers
222
+ public function update(Request $request, Post $post): RedirectResponse
223
+ {
224
+ Gate::authorize('update-post', $post);
225
+ // Or: $this->authorize('update-post', $post);
226
+ // Or: abort_unless(Auth::user()->can('update-post', $post), 403);
227
+ // ...
228
+ }
229
+ ```
230
+
231
+ ### Policies
232
+
233
+ ```php
234
+ // App\Policies\PostPolicy
235
+ class PostPolicy
236
+ {
237
+ use HandlesAuthorization;
238
+
239
+ public function viewAny(?User $user): bool
240
+ {
241
+ return true; // Public listing
242
+ }
243
+
244
+ public function view(?User $user, Post $post): bool
245
+ {
246
+ return $post->is_published || ($user && $user->id === $post->user_id);
247
+ }
248
+
249
+ public function create(User $user): bool
250
+ {
251
+ return $user->hasVerifiedEmail(); // Must verify email first
252
+ }
253
+
254
+ public function update(User $user, Post $post): bool
255
+ {
256
+ return $user->id === $post->user_id;
257
+ }
258
+
259
+ public function delete(User $user, Post $post): bool
260
+ {
261
+ return $user->id === $post->user_id && $post->created_at->diffInDays(now()) <= 30;
262
+ }
263
+
264
+ public function restore(User $user, Post $post): bool
265
+ {
266
+ return $user->role === 'admin';
267
+ }
268
+
269
+ public function forceDelete(User $user, Post $post): bool
270
+ {
271
+ return $user->role === 'super-admin';
272
+ }
273
+ }
274
+
275
+ // Register in AuthServiceProvider
276
+ protected $policies = [
277
+ Post::class => PostPolicy::class,
278
+ ];
279
+
280
+ // Controller usage
281
+ public function show(Post $post): View
282
+ {
283
+ $this->authorize('view', $post);
284
+ return view('posts.show', compact('post'));
285
+ }
286
+
287
+ // Blade usage
288
+ @can('update', $post)
289
+ <a href="{{ route('posts.edit', $post) }}">Edit</a>
290
+ @endcan
291
+
292
+ @cannot('update', $post)
293
+ <span>You cannot edit this post</span>
294
+ @endcannot
295
+ ```
296
+
297
+ ### Middleware Authorization
298
+
299
+ ```php
300
+ // Using middleware in routes
301
+ Route::put('/posts/{post}', [PostController::class, 'update'])
302
+ ->middleware('can:update,post');
303
+
304
+ Route::get('/posts/create', [PostController::class, 'create'])
305
+ ->middleware('can:create,App\Models\Post');
306
+
307
+ // Custom authorization middleware
308
+ // app/Http/Middleware/CheckRole.php
309
+ class CheckRole
310
+ {
311
+ public function handle(Request $request, Closure $next, string $role): mixed
312
+ {
313
+ if (!$request->user() || $request->user()->role !== $role) {
314
+ abort(403, 'Unauthorized. This area requires role: ' . $role);
315
+ }
316
+ return $next($request);
317
+ }
318
+ }
319
+
320
+ // Register in Kernel
321
+ protected $routeMiddleware = [
322
+ 'role' => \App\Http\Middleware\CheckRole::class,
323
+ ];
324
+
325
+ // Route usage
326
+ Route::middleware(['auth', 'role:admin'])->group(function () {
327
+ Route::get('/admin', [AdminController::class, 'index']);
328
+ });
329
+ ```
330
+
331
+ ## Eloquent Security
332
+
333
+ ### Mass Assignment Protection
334
+
335
+ ```php
336
+ // BAD: $guarded = [] allows ALL columns to be mass-assigned
337
+ // NEVER use $guarded = [] in production
338
+
339
+ // GOOD: Whitelist fillable attributes
340
+ final class User extends Authenticatable
341
+ {
342
+ protected $fillable = [
343
+ 'name',
344
+ 'email',
345
+ 'phone',
346
+ 'avatar',
347
+ ];
348
+ // NEVER add 'role', 'is_admin', 'is_verified' here
349
+ }
350
+
351
+ // GOOD: Explicitly control which fields can be filled in requests
352
+ public function store(StoreUserRequest $request): RedirectResponse
353
+ {
354
+ $user = User::create($request->safe()->only([
355
+ 'name', 'email', 'phone', 'avatar'
356
+ ]));
357
+ // $request->safe() uses validated data only
358
+ // $request->only() is NOT safe on its own without validation rules
359
+ }
360
+
361
+ // BAD: Creating a user with request data directly
362
+ User::create($request->all()); // VULNERABLE to mass assignment!
363
+
364
+ // BETTER: Use DTOs for creation
365
+ $user = User::create($request->validated()); // Only validated fields
366
+ ```
367
+
368
+ ### SQL Injection Prevention
369
+
370
+ ```php
371
+ // GOOD: Eloquent automatically parameterizes queries
372
+ User::where('email', $userInput)->first();
373
+ User::whereRaw('email = ?', [$userInput])->first();
374
+
375
+ // GOOD: Query Builder also parameterizes
376
+ DB::table('users')->where('email', $userInput)->first();
377
+ DB::select('SELECT * FROM users WHERE email = ?', [$userInput]);
378
+
379
+ // BAD: Raw string interpolation
380
+ DB::select("SELECT * FROM users WHERE email = '{$userInput}'"); // VULNERABLE!
381
+ User::whereRaw("email = '{$userInput}'")->first(); // VULNERABLE!
382
+
383
+ // BAD: whereRaw/orderByRaw with unescaped input
384
+ User::orderByRaw($userInput); // VULNERABLE!
385
+ User::groupByRaw($userInput); // VULNERABLE!
386
+
387
+ // BAD: DB::statement with concatenation
388
+ DB::statement("INSERT INTO users (email) VALUES ('{$userInput}')"); // VULNERABLE!
389
+ ```
390
+
391
+ ### Attribute Casting
392
+
393
+ ```php
394
+ final class User extends Authenticatable
395
+ {
396
+ protected $casts = [
397
+ 'email_verified_at' => 'datetime',
398
+ 'is_admin' => 'boolean', // Cast to boolean prevents string injection
399
+ 'settings' => 'array', // Automatically json_encode/json_decode
400
+ 'metadata' => 'encrypted:array', // Laravel 11+ encrypted casting
401
+ 'password' => 'hashed', // Laravel 10+ auto-hashes on set
402
+ ];
403
+ }
404
+ ```
405
+
406
+ ### Model Security
407
+
408
+ ```php
409
+ final class User extends Authenticatable
410
+ {
411
+ // Hide sensitive attributes from JSON/API responses
412
+ protected $hidden = [
413
+ 'password',
414
+ 'remember_token',
415
+ 'two_factor_secret',
416
+ 'two_factor_recovery_codes',
417
+ ];
418
+
419
+ // Append only safe computed attributes
420
+ protected $appends = ['full_name']; // safe
421
+ // NEVER append sensitive computed data
422
+ }
423
+
424
+ final class Post extends Model
425
+ {
426
+ // Global scope to filter soft deleted records
427
+ use SoftDeletes;
428
+
429
+ // Prevent N+1 by restricting lazy loading (optional strict mode)
430
+ // AppServiceProvider::boot()
431
+ // Model::preventLazyLoading(!app()->isProduction());
432
+ }
433
+ ```
434
+
435
+ ## CSRF Protection
436
+
437
+ ### Default Protection
438
+
439
+ ```php
440
+ // Laravel CSRF is enabled by default via VerifyCsrfToken middleware
441
+ // app/Http/Kernel.php (protected $middlewareGroups['web'])
442
+
443
+ // All POST/PUT/PATCH/DELETE forms must include @csrf
444
+ <form method="POST" action="/posts">
445
+ @csrf
446
+ <input type="text" name="title">
447
+ <button type="submit">Create</button>
448
+ </form>
449
+ ```
450
+
451
+ ### Excluding Routes (Carefully)
452
+
453
+ ```php
454
+ // app/Http/Middleware/VerifyCsrfToken.php
455
+ class VerifyCsrfToken extends Middleware
456
+ {
457
+ // Only exclude routes that have external CSRF protection (webhooks, etc.)
458
+ protected $except = [
459
+ 'stripe/*', // Stripe webhooks use their own signature verification
460
+ // Avoid blanket 'api/*' — stateful Sanctum routes need CSRF.
461
+ // Exclude only specific stateless webhook/endpoint routes.
462
+ ];
463
+ }
464
+ ```
465
+
466
+ ### CSRF with JavaScript
467
+
468
+ ```html
469
+ <meta name="csrf-token" content="{{ csrf_token() }}">
470
+
471
+ <script>
472
+ // Axios example (Laravel ships with Axios)
473
+ axios.defaults.headers.common['X-CSRF-TOKEN'] = document.querySelector(
474
+ 'meta[name="csrf-token"]'
475
+ ).getAttribute('content');
476
+
477
+ // Fetch example
478
+ fetch('/posts', {
479
+ method: 'POST',
480
+ headers: {
481
+ 'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content'),
482
+ 'Content-Type': 'application/json',
483
+ },
484
+ body: JSON.stringify(data),
485
+ });
486
+ </script>
487
+ ```
488
+
489
+ ## XSS Prevention
490
+
491
+ ### Blade Templating Security
492
+
493
+ ```blade
494
+ {{-- SAFE: Auto-escaped by Blade --}}
495
+ {{ $userInput }}
496
+
497
+ {{-- DANGEROUS: Raw output — NEVER use with user input --}}
498
+ {!! $userInput !!}
499
+
500
+ {{-- SAFE: Only use {!! !!} with trusted content you control --}}
501
+ {!! $trustedHtmlFromYourServer !!}
502
+
503
+ {{-- GOOD: Use specific escaping directives --}}
504
+ @js($data) {{-- JSON encode for JavaScript --}}
505
+ @json($data) {{-- JSON encode in templates --}}
506
+
507
+ {{-- BAD: Direct user input in raw HTML --}}
508
+ <div>{!! $user->bio !!}</div> {{-- VULNERABLE if user provides bio --}}
509
+ ```
510
+
511
+ ### Safe HTML Handling
512
+
513
+ ```php
514
+ // When you must allow some HTML, use a whitelist approach
515
+ use HTMLPurifier; // Requires: composer require ezyang/htmlpurifier
516
+
517
+ public function sanitizeHtml(string $dirty): string
518
+ {
519
+ $config = \HTMLPurifier_Config::createDefault();
520
+ $config->set('HTML.Allowed', 'p,b,i,a[href],ul,ol,li,br');
521
+ $config->set('URI.AllowedSchemes', ['http', 'https', 'mailto']);
522
+ $purifier = new \HTMLPurifier($config);
523
+ return $purifier->purify($dirty);
524
+ }
525
+
526
+ // In blade:
527
+ <div>{!! $sanitizedContent !!}</div> {{-- Safe after purification --}}
528
+ ```
529
+
530
+ ### JavaScript Context Escaping
531
+
532
+ ```blade
533
+ {{-- SAFE: Blade @js escapes for JavaScript context --}}
534
+ <script>
535
+ const user = @js($user); // JSON + escaped for JS context
536
+ const settings = @json($settings); // Direct JSON encode
537
+ </script>
538
+
539
+ {{-- DANGEROUS: Manual JSON in JS context --}}
540
+ <script>
541
+ const user = {{ json_encode($user) }}; // NOT escaped for JS!
542
+ </script>
543
+ ```
544
+
545
+ ### HTTP Headers for XSS Protection
546
+
547
+ ```php
548
+ // App\Http\Middleware\SecurityHeaders.php
549
+ class SecurityHeaders
550
+ {
551
+ public function handle(Request $request, Closure $next): mixed
552
+ {
553
+ $response = $next($request);
554
+
555
+ $response->headers->set('X-Content-Type-Options', 'nosniff');
556
+ $response->headers->set('X-Frame-Options', 'DENY');
557
+ $response->headers->set('X-XSS-Protection', '1; mode=block');
558
+ $response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin');
559
+ $response->headers->set(
560
+ 'Content-Security-Policy',
561
+ "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'none'"
562
+ );
563
+
564
+ return $response;
565
+ }
566
+ }
567
+
568
+ // Register in kernel
569
+ protected $middleware = [
570
+ \App\Http\Middleware\SecurityHeaders::class,
571
+ ];
572
+ ```
573
+
574
+ ## Input Validation
575
+
576
+ ### Form Request Validation
577
+
578
+ ```php
579
+ final class StorePostRequest extends FormRequest
580
+ {
581
+ public function authorize(): bool
582
+ {
583
+ return $this->user()?->can('create', Post::class) ?? false;
584
+ }
585
+
586
+ public function rules(): array
587
+ {
588
+ return [
589
+ 'title' => ['required', 'string', 'max:255', 'sanitize_html'],
590
+ 'content' => ['required', 'string', 'max:10000'],
591
+ 'image' => [
592
+ 'required',
593
+ 'image',
594
+ 'mimes:jpg,jpeg,png,gif,webp', // Whitelist specific types
595
+ 'max:2048', // 2MB max
596
+ ],
597
+ 'tags' => ['array'],
598
+ 'tags.*' => ['integer', 'exists:tags,id'],
599
+ ];
600
+ }
601
+
602
+ public function messages(): array
603
+ {
604
+ return [
605
+ 'title.max' => 'Post title must not exceed 255 characters.',
606
+ 'image.max' => 'Image must be under 2MB.',
607
+ ];
608
+ }
609
+
610
+ // Sanitize input after validation
611
+ public function validated($key = null, $default = null): mixed
612
+ {
613
+ $validated = parent::validated();
614
+ $validated['title'] = strip_tags($validated['title']);
615
+ return $key ? ($validated[$key] ?? $default) : $validated;
616
+ }
617
+ }
618
+ ```
619
+
620
+ ### Custom Validation Rules
621
+
622
+ ```php
623
+ // app/Rules/StrongPassword.php
624
+ class StrongPassword implements Rule
625
+ {
626
+ public function passes($attribute, $value): bool
627
+ {
628
+ return preg_match('/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&#^()_\-+=])[A-Za-z\d@$!%*?&#^()_\-+=]{12,}$/', $value);
629
+ }
630
+
631
+ public function message(): string
632
+ {
633
+ return 'The :attribute must be at least 12 characters with uppercase, lowercase, number, and symbol.';
634
+ }
635
+ }
636
+
637
+ // app/Rules/NotBlacklistedDomain.php
638
+ class NotBlacklistedDomain implements Rule
639
+ {
640
+ private array $blacklisted = ['mailinator.com', 'guerrillamail.com'];
641
+
642
+ public function passes($attribute, $value): bool
643
+ {
644
+ $domain = substr(strrchr($value, '@'), 1);
645
+ return !in_array(strtolower($domain), $this->blacklisted);
646
+ }
647
+
648
+ public function message(): string
649
+ {
650
+ return 'Email from disposable domains is not allowed.';
651
+ }
652
+ }
653
+ ```
654
+
655
+ ## API Security
656
+
657
+ ### Rate Limiting
658
+
659
+ ```php
660
+ // App/Providers/RouteServiceProvider
661
+ protected function configureRateLimiting(): void
662
+ {
663
+ RateLimiter::for('api', function (Request $request) {
664
+ return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
665
+ });
666
+
667
+ RateLimiter::for('auth', function (Request $request) {
668
+ return Limit::perMinute(5)->by($request->ip())
669
+ ->response(function () {
670
+ return response()->json([
671
+ 'message' => 'Too many login attempts. Try again in 1 minute.',
672
+ ], 429);
673
+ });
674
+ });
675
+
676
+ RateLimiter::for('uploads', function (Request $request) {
677
+ return Limit::perHour(10)->by($request->user()?->id ?? $request->ip())
678
+ ->response(function () {
679
+ return response()->json([
680
+ 'message' => 'Upload limit reached. Try again later.',
681
+ ], 429);
682
+ });
683
+ });
684
+ }
685
+
686
+ // Route usage
687
+ Route::middleware(['auth:sanctum', 'throttle:api'])->group(function () {
688
+ Route::apiResource('posts', PostController::class);
689
+ });
690
+
691
+ Route::post('/login', [AuthController::class, 'login'])
692
+ ->middleware('throttle:auth');
693
+ ```
694
+
695
+ ### API Authentication — Sanctum vs Passport
696
+
697
+ ```php
698
+ // Sanctum (recommended for most apps — simple, first-party, SPA)
699
+ // config/sanctum.php
700
+ 'expiration' => 60 * 24, // Tokens expire after 24 hours
701
+ 'model' => User::class,
702
+
703
+ // Issuing scoped tokens
704
+ $token = $user->createToken('client-name', [
705
+ 'posts:read',
706
+ 'posts:write',
707
+ ])->plainTextToken;
708
+
709
+ // Middleware scoping
710
+ Route::middleware('auth:sanctum')->group(function () {
711
+ Route::get('/posts', [PostController::class, 'index'])
712
+ ->middleware('abilities:posts:read');
713
+
714
+ Route::post('/posts', [PostController::class, 'store'])
715
+ ->middleware('abilities:posts:write');
716
+ });
717
+
718
+ // Passport (OAuth2 — for third-party clients or complex auth flows)
719
+ // Install: composer require laravel/passport
720
+ Passport::tokensExpireIn(now()->addDays(15));
721
+ Passport::refreshTokensExpireIn(now()->addDays(30));
722
+ Passport::personalAccessTokensExpireIn(now()->addMonths(6));
723
+ ```
724
+
725
+ ### CORS Configuration
726
+
727
+ ```php
728
+ // config/cors.php
729
+ return [
730
+ 'paths' => ['api/*', 'sanctum/csrf-cookie'],
731
+ 'allowed_methods' => ['*'],
732
+ 'allowed_origins' => explode(',', env('CORS_ALLOWED_ORIGINS', '')), // Whitelist specific origins
733
+ 'allowed_origins_patterns' => [],
734
+ 'allowed_headers' => ['*'],
735
+ 'exposed_headers' => ['X-Total-Count', 'X-Pagination-Page'],
736
+ 'max_age' => 0,
737
+ 'supports_credentials' => true, // Required for Sanctum SPA auth
738
+ ];
739
+
740
+ // NEVER: Allow all origins in production unless absolutely necessary
741
+ // 'allowed_origins' => ['*'], // Only for truly public APIs
742
+ ```
743
+
744
+ ## File Upload Security
745
+
746
+ ### Validation
747
+
748
+ ```php
749
+ public function rules(): array
750
+ {
751
+ return [
752
+ 'document' => [
753
+ 'required',
754
+ 'file',
755
+ 'mimes:pdf,doc,docx,xls,xlsx', // Whitelist specific MIME types
756
+ 'max:10240', // 10MB
757
+ 'extensions:pdf,doc,docx,xls,xlsx', // Verify extension matches MIME
758
+ ],
759
+ 'avatar' => [
760
+ 'nullable',
761
+ 'image', // Ensures it's a valid image
762
+ 'mimes:jpg,jpeg,png,webp',
763
+ 'max:2048',
764
+ 'dimensions:min_width=100,min_height=100,max_width=2000,max_height=2000',
765
+ ],
766
+ ];
767
+ }
768
+ ```
769
+
770
+ ### Secure Storage
771
+
772
+ ```php
773
+ // Store files outside public directory
774
+ $path = $request->file('document')->store('documents', 'local');
775
+ // Never use 'public' disk for sensitive documents
776
+
777
+ // Use signed URLs for temporary file access
778
+ use Illuminate\Support\Facades\Storage;
779
+
780
+ public function download(Request $request, string $path)
781
+ {
782
+ // Generate temporary signed URL (expires in 15 minutes)
783
+ $url = Storage::temporaryUrl($path, now()->addMinutes(15));
784
+
785
+ // Validate user has permission
786
+ $this->authorize('download', $path);
787
+
788
+ return redirect($url);
789
+ }
790
+
791
+ // Storage configuration for cloud with encryption
792
+ // config/filesystems.php
793
+ 's3' => [
794
+ 'driver' => 's3',
795
+ 'key' => env('AWS_ACCESS_KEY_ID'),
796
+ 'secret' => env('AWS_SECRET_ACCESS_KEY'),
797
+ 'region' => env('AWS_DEFAULT_REGION'),
798
+ 'bucket' => env('AWS_BUCKET'),
799
+ 'url' => env('AWS_URL'),
800
+ 'endpoint' => env('AWS_ENDPOINT'),
801
+ 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
802
+ 'throw' => false,
803
+ 'server_side_encryption' => 'AES256', // Encrypt at rest
804
+ ],
805
+ ```
806
+
807
+ ## Dependencies and Secrets
808
+
809
+ ### Composer Security
810
+
811
+ ```bash
812
+ # Always audit dependencies in CI
813
+ composer audit
814
+
815
+ # Pin major versions in composer.json
816
+ "laravel/framework": "^11.0",
817
+ "spatie/laravel-permission": "^6.0"
818
+
819
+ # Check for abandoned packages
820
+ composer why-not
821
+
822
+ # Keep lock file in version control (it pins exact versions)
823
+ # Run `composer update` deliberately, never in CI/CD
824
+ ```
825
+
826
+ ### Secret Management
827
+
828
+ ```bash
829
+ # .env file (NEVER commit)
830
+ # .gitignore includes .env by default
831
+
832
+ APP_KEY=base64:abc123...
833
+ DB_PASSWORD=secure_password
834
+ STRIPE_KEY=sk_live_...
835
+ SANCTUM_TOKEN_PREFIX=myapp_
836
+
837
+ # For production: Use a secret manager
838
+ # Deploy with: env $(aws secretsmanager get-secret-value --secret-id prod/db | jq ...) php artisan serve
839
+
840
+ # Validate secrets at boot (AppServiceProvider::boot)
841
+ $secrets = ['services.stripe.key', 'services.stripe.webhook_secret'];
842
+ foreach ($secrets as $key) {
843
+ if (empty(config($key))) {
844
+ Log::critical("Missing secret: {$key}");
845
+ }
846
+ }
847
+ ```
848
+
849
+ ## Queue Security
850
+
851
+ ```php
852
+ // Define a named rate limiter (typically in AppServiceProvider::boot())
853
+ RateLimiter::for('payments', fn () => Limit::perMinute(5));
854
+ ```
855
+
856
+ ```php
857
+ // Encrypt sensitive job data by implementing the interface
858
+ final class ProcessPaymentJob implements ShouldQueue, ShouldBeEncrypted
859
+ {
860
+ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
861
+
862
+ public function __construct(
863
+ private readonly string $paymentIntentId, // Public IDs are fine
864
+ private readonly string $cardFingerprint, // Encrypted via ShouldBeEncrypted
865
+ ) {}
866
+
867
+ public function handle(): void
868
+ {
869
+ // Process payment
870
+ }
871
+
872
+ // Limit retries and delay between attempts
873
+ public function retryUntil(): Carbon
874
+ {
875
+ return now()->addMinutes(5);
876
+ }
877
+
878
+ // Rate limit how many jobs of this type can run
879
+ public function middleware(): array
880
+ {
881
+ return [
882
+ new RateLimited('payments'),
883
+ ];
884
+ }
885
+ }
886
+ ```
887
+
888
+ ## Logging Security Events
889
+
890
+ ```php
891
+ // config/logging.php
892
+ 'channels' => [
893
+ 'security' => [
894
+ 'driver' => 'single',
895
+ 'path' => storage_path('logs/security.log'),
896
+ 'level' => 'warning',
897
+ ],
898
+ ],
899
+
900
+ // Audit log helper
901
+ final class SecurityLogger
902
+ {
903
+ public static function log(string $event, array $context = []): void
904
+ {
905
+ Log::channel('security')->warning($event, array_merge([
906
+ 'user_id' => Auth::id(),
907
+ 'ip' => request()->ip(),
908
+ 'user_agent' => request()->userAgent(),
909
+ 'url' => request()->fullUrl(),
910
+ 'timestamp' => now()->toIso8601String(),
911
+ ], $context));
912
+ }
913
+ }
914
+
915
+ // Usage
916
+ SecurityLogger::log('failed_login_attempt', ['email' => $email]);
917
+ SecurityLogger::log('password_change');
918
+ SecurityLogger::log('role_change', ['target_user' => $targetId, 'new_role' => 'admin']);
919
+ SecurityLogger::log('suspicious_activity', ['reason' => 'multiple_attempts_from_different_ips']);
920
+ ```
921
+
922
+ ## Quick Security Checklist
923
+
924
+ | Check | Description |
925
+ |-------|-------------|
926
+ | `APP_DEBUG=false` | Never run with debug enabled in production |
927
+ | `APP_KEY` set | Always run `php artisan key:generate` |
928
+ | HTTPS enforced | Force HTTPS in production via middleware or proxy |
929
+ | `$fillable` whitelisted | Never use `$guarded = []` |
930
+ | CSRF active | `@csrf` on all state-changing forms |
931
+ | Sanctum/Passport configured | API authentication with token abilities/scopes |
932
+ | Rate limiting applied | Throttle API and auth endpoints |
933
+ | Input validation | FormRequest with specific rules, never `$request->all()` |
934
+ | File upload restrictions | Validate MIME types, size, dimensions |
935
+ | `composer audit` in CI | Check dependencies for known vulnerabilities |
936
+ | `password_hash` / `password_verify` | Use Laravel's built-in hashing (bcrypt/Argon2) |
937
+ | Session regeneration on login | Call `$request->session()->regenerate()` |
938
+ | Security headers middleware | CSP, X-Frame-Options, X-Content-Type-Options |
939
+ | Logged security events | Audit log for auth failures, role changes, suspicious activity |
940
+ | `.env` not committed | Verify `.gitignore` includes `.env` |
941
+
942
+ ## Related Skills
943
+
944
+ - `laravel-patterns` — Laravel architecture, routing, Eloquent, and API patterns
945
+ - `backend-patterns` — General backend API and database patterns
946
+ - `laravel-tdd` — Laravel testing with PHPUnit and Pest