@kensaurus/skills 0.0.0-stage → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (425) hide show
  1. package/.claude-plugin/marketplace.json +53 -0
  2. package/.claude-plugin/plugin.json +40 -0
  3. package/.cursor-plugin/plugin.json +38 -0
  4. package/.mcp.json +28 -0
  5. package/CHANGELOG.md +1790 -0
  6. package/LICENSE +21 -0
  7. package/LICENSE-APACHE +62 -0
  8. package/NOTICE +13 -0
  9. package/README.md +821 -2
  10. package/SECURITY.md +55 -0
  11. package/agents/code-reviewer.md +60 -0
  12. package/agents/completion-judge.md +89 -0
  13. package/agents/db-migrator.md +125 -0
  14. package/agents/debugger.md +47 -0
  15. package/agents/deploy-checker.md +100 -0
  16. package/agents/perf-monitor.md +74 -0
  17. package/assets/favicon.png +0 -0
  18. package/assets/logo-light.png +0 -0
  19. package/assets/logo.png +0 -0
  20. package/assets/logo.svg +6 -0
  21. package/assets/og.png +0 -0
  22. package/bin/install.mjs +1127 -0
  23. package/bin/kenji.js +2 -0
  24. package/commands/adr.md +17 -0
  25. package/commands/aeo-plan.md +18 -0
  26. package/commands/arch-boundaries.md +17 -0
  27. package/commands/aso-plan.md +18 -0
  28. package/commands/auth-flows.md +19 -0
  29. package/commands/backup-plan.md +17 -0
  30. package/commands/burndown-full.md +25 -0
  31. package/commands/capacitor-plan.md +18 -0
  32. package/commands/codemod-safety.md +22 -0
  33. package/commands/commit.md +18 -0
  34. package/commands/complete-everything.md +40 -0
  35. package/commands/cost-plan.md +19 -0
  36. package/commands/deadcode-plan.md +26 -0
  37. package/commands/deadcode.md +32 -0
  38. package/commands/debug-issue.md +17 -0
  39. package/commands/deps-plan.md +18 -0
  40. package/commands/docs-plan.md +17 -0
  41. package/commands/doctrine.md +19 -0
  42. package/commands/error-plan.md +19 -0
  43. package/commands/feedback-to-closure.md +36 -0
  44. package/commands/fix-issue.md +76 -0
  45. package/commands/gate-logic.md +26 -0
  46. package/commands/green-repo.md +36 -0
  47. package/commands/grill-me.md +19 -0
  48. package/commands/gtm-plan.md +21 -0
  49. package/commands/gtm-weekly.md +17 -0
  50. package/commands/gtm.md +22 -0
  51. package/commands/handoff.md +15 -0
  52. package/commands/housekeep-backlog.md +18 -0
  53. package/commands/housekeep-files.md +22 -0
  54. package/commands/housekeep-gates.md +18 -0
  55. package/commands/instant-nav.md +11 -0
  56. package/commands/integrity-plan.md +19 -0
  57. package/commands/launch-kit.md +16 -0
  58. package/commands/mcp-guide.md +40 -0
  59. package/commands/mobile-plan.md +19 -0
  60. package/commands/native-rn-monorepo/README.md +78 -0
  61. package/commands/native-rn-monorepo/android-build.md +26 -0
  62. package/commands/native-rn-monorepo/android-install.md +32 -0
  63. package/commands/native-rn-monorepo/android-logcat.md +37 -0
  64. package/commands/native-rn-monorepo/ios-ci-logs.md +56 -0
  65. package/commands/native-rn-monorepo/ios-ci-status.md +52 -0
  66. package/commands/native-rn-monorepo/ios-ci-trigger.md +59 -0
  67. package/commands/native-rn-monorepo/rn-reset.md +50 -0
  68. package/commands/native-rn-monorepo/rn-ship-ios.md +67 -0
  69. package/commands/native-rn-monorepo/rn-verify.md +53 -0
  70. package/commands/perf-plan.md +18 -0
  71. package/commands/plan-mode.md +74 -0
  72. package/commands/pr.md +16 -0
  73. package/commands/pricing-plan.md +20 -0
  74. package/commands/privacy-plan.md +18 -0
  75. package/commands/readability.md +12 -0
  76. package/commands/readme.md +15 -0
  77. package/commands/refactor.md +15 -0
  78. package/commands/release-prep.md +17 -0
  79. package/commands/research.md +25 -0
  80. package/commands/responsive-audit.md +21 -0
  81. package/commands/review-code.md +18 -0
  82. package/commands/rls-plan.md +18 -0
  83. package/commands/secrets-plan.md +18 -0
  84. package/commands/security-plan.md +19 -0
  85. package/commands/ship-and-observe.md +36 -0
  86. package/commands/skill-conflicts.md +19 -0
  87. package/commands/slop-plan.md +18 -0
  88. package/commands/stub-plan.md +18 -0
  89. package/commands/test-mutation.md +16 -0
  90. package/commands/test-plan.md +17 -0
  91. package/commands/test.md +29 -0
  92. package/commands/thirdparty-web-interface-guidelines.md +185 -0
  93. package/commands/uiux-plan.md +18 -0
  94. package/commands/uiux.md +45 -0
  95. package/commands/update-deps.md +21 -0
  96. package/commands/validation-plan.md +19 -0
  97. package/commands-portable/fix-issue.md +72 -0
  98. package/commands-portable/plan-mode.md +92 -0
  99. package/commands-portable/research.md +91 -0
  100. package/docs/screenshots/README.md +5 -0
  101. package/docs/screenshots/audit-dark.png +0 -0
  102. package/docs/screenshots/build-dark.png +0 -0
  103. package/docs/screenshots/grill-dark.png +0 -0
  104. package/docs/screenshots/hero-dark.png +0 -0
  105. package/docs/screenshots/hero-light.png +0 -0
  106. package/docs/screenshots/ship-dark.png +0 -0
  107. package/docs/screenshots/src/showcase.html +320 -0
  108. package/hooks/completion-gate.mjs +258 -0
  109. package/hooks/cursor-hooks.json +13 -0
  110. package/hooks/hooks.json +15 -0
  111. package/install.sh +21 -0
  112. package/llms.txt +40 -0
  113. package/mcp/README.md +266 -0
  114. package/mcp/VERSIONS.md +41 -0
  115. package/mcp/mcp-full.json.template +124 -0
  116. package/mcp/mcp.json.template +29 -0
  117. package/mcp/pinned-versions.json +27 -0
  118. package/package.json +94 -4
  119. package/rules/approved-plan-execution.mdc +65 -0
  120. package/rules/full-stack-ship-discipline.mdc +37 -0
  121. package/rules/native-rn-monorepo/README.md +63 -0
  122. package/rules/native-rn-monorepo/_project.mdc +69 -0
  123. package/rules/native-rn-monorepo/native-android.mdc +72 -0
  124. package/rules/native-rn-monorepo/native-ios.mdc +61 -0
  125. package/rules/native-rn-monorepo/react-native-js.mdc +78 -0
  126. package/rules/native-rn-monorepo/web.mdc +60 -0
  127. package/rules/project-starter/components.mdc +54 -0
  128. package/rules/project-starter/data-fetching.mdc +77 -0
  129. package/rules/project-starter/git.mdc +41 -0
  130. package/rules/project-starter/supabase.mdc +37 -0
  131. package/rules/project-starter/tailwind.mdc +48 -0
  132. package/rules/project-starter/typescript.mdc +36 -0
  133. package/rules/project-starter/web-performance.mdc +42 -0
  134. package/rules/senior-engineer.mdc +30 -0
  135. package/rules/shell-first-search.mdc +19 -0
  136. package/rules/skill-workflows.mdc +35 -0
  137. package/rules/verification-before-completion.mdc +57 -0
  138. package/skills/audit-accessibility/SKILL.md +441 -0
  139. package/skills/audit-agent-speed/SKILL.md +181 -0
  140. package/skills/audit-agent-speed/scripts/stop-typecheck.mjs +151 -0
  141. package/skills/audit-analytics/SKILL.md +138 -0
  142. package/skills/audit-auth-flows/SKILL.md +267 -0
  143. package/skills/audit-backend-architecture/SKILL.md +266 -0
  144. package/skills/audit-backend-architecture/references/patterns.md +386 -0
  145. package/skills/audit-bundle-size/SKILL.md +295 -0
  146. package/skills/audit-cicd/SKILL.md +218 -0
  147. package/skills/audit-code-quality/SKILL.md +314 -0
  148. package/skills/audit-code-review/SKILL.md +289 -0
  149. package/skills/audit-codemod-safety/SKILL.md +159 -0
  150. package/skills/audit-db-schema/SKILL.md +465 -0
  151. package/skills/audit-db-schema/references/details.md +110 -0
  152. package/skills/audit-doctrine/SKILL.md +189 -0
  153. package/skills/audit-env-parity/SKILL.md +133 -0
  154. package/skills/audit-fe-api/SKILL.md +458 -0
  155. package/skills/audit-gate-logic/SKILL.md +219 -0
  156. package/skills/audit-i18n/SKILL.md +339 -0
  157. package/skills/audit-infra-cost/SKILL.md +142 -0
  158. package/skills/audit-langfuse-llm/SKILL.md +468 -0
  159. package/skills/audit-langfuse-llm/references/details.md +226 -0
  160. package/skills/audit-llm-security/SKILL.md +147 -0
  161. package/skills/audit-monetization-iap/SKILL.md +137 -0
  162. package/skills/audit-payment-system/SKILL.md +268 -0
  163. package/skills/audit-payment-system/references/checklist.md +283 -0
  164. package/skills/audit-performance/SKILL.md +383 -0
  165. package/skills/audit-performance/references/loading-priority-2026.md +81 -0
  166. package/skills/audit-realworld/SKILL.md +287 -0
  167. package/skills/audit-registry-listing/SKILL.md +122 -0
  168. package/skills/audit-resilience/SKILL.md +153 -0
  169. package/skills/audit-responsive/SKILL.md +221 -0
  170. package/skills/audit-responsive/references/checklist.md +166 -0
  171. package/skills/audit-security/SKILL.md +289 -0
  172. package/skills/audit-skill-conflicts/SKILL.md +178 -0
  173. package/skills/audit-ui-states/SKILL.md +146 -0
  174. package/skills/audit-uiux-design-system/SKILL.md +475 -0
  175. package/skills/audit-uiux-design-system/references/details.md +71 -0
  176. package/skills/audit-ux/SKILL.md +381 -0
  177. package/skills/audit-ux/references/details.md +245 -0
  178. package/skills/audit-ux-journeys/SKILL.md +215 -0
  179. package/skills/audit-ux-journeys/references/checklist.md +179 -0
  180. package/skills/backend-db-performance/SKILL.md +441 -0
  181. package/skills/backend-error-handling/SKILL.md +489 -0
  182. package/skills/backend-error-handling/references/details.md +58 -0
  183. package/skills/backend-observability/SKILL.md +88 -0
  184. package/skills/backend-patterns/SKILL.md +499 -0
  185. package/skills/backend-patterns/references/architecture-patterns.md +298 -0
  186. package/skills/backend-realtime/SKILL.md +403 -0
  187. package/skills/backend-realtime/references/patterns.md +74 -0
  188. package/skills/burndown-full/SKILL.md +174 -0
  189. package/skills/complete-everything/SKILL.md +295 -0
  190. package/skills/data-pipeline/SKILL.md +109 -0
  191. package/skills/data-visualization/SKILL.md +488 -0
  192. package/skills/debug-error/SKILL.md +322 -0
  193. package/skills/debug-fe-be-integration/SKILL.md +459 -0
  194. package/skills/debug-sentry-monitor/SKILL.md +497 -0
  195. package/skills/debug-sentry-monitor/references/details.md +165 -0
  196. package/skills/deploy-npm/SKILL.md +394 -0
  197. package/skills/deploy-npm/references/example-mushi-mushi.md +52 -0
  198. package/skills/deploy-verify/SKILL.md +489 -0
  199. package/skills/design-api/SKILL.md +379 -0
  200. package/skills/design-canvas/SKILL.md +155 -0
  201. package/skills/design-email/SKILL.md +370 -0
  202. package/skills/design-frontend/SKILL.md +143 -0
  203. package/skills/design-generative-art/SKILL.md +474 -0
  204. package/skills/design-mobile-first/SKILL.md +506 -0
  205. package/skills/design-motion/SKILL.md +333 -0
  206. package/skills/design-motion/references/delight-interactions.md +191 -0
  207. package/skills/design-prd/SKILL.md +443 -0
  208. package/skills/design-system/SKILL.md +457 -0
  209. package/skills/design-theme/SKILL.md +226 -0
  210. package/skills/design-theme/themes/tsumagoi-ranch.md +150 -0
  211. package/skills/docs-adr/SKILL.md +168 -0
  212. package/skills/docs-coauthor/SKILL.md +368 -0
  213. package/skills/docs-comparison-pages/SKILL.md +117 -0
  214. package/skills/docs-domain-modeling/SKILL.md +97 -0
  215. package/skills/docs-launch-kit/SKILL.md +139 -0
  216. package/skills/docs-writer/SKILL.md +469 -0
  217. package/skills/enhance-agent-guardrails/SKILL.md +164 -0
  218. package/skills/enhance-arch-boundaries/SKILL.md +154 -0
  219. package/skills/enhance-capacitor-ui/SKILL.md +463 -0
  220. package/skills/enhance-capacitor-ui/references/details.md +750 -0
  221. package/skills/enhance-email-deliverability/SKILL.md +143 -0
  222. package/skills/enhance-growth-loops/SKILL.md +122 -0
  223. package/skills/enhance-lifecycle-email/SKILL.md +130 -0
  224. package/skills/enhance-motion/SKILL.md +193 -0
  225. package/skills/enhance-onboarding/SKILL.md +148 -0
  226. package/skills/enhance-pwa/SKILL.md +303 -0
  227. package/skills/enhance-readability/SKILL.md +146 -0
  228. package/skills/enhance-readme/SKILL.md +496 -0
  229. package/skills/enhance-readme/package-lock.json +187 -0
  230. package/skills/enhance-readme/package.json +17 -0
  231. package/skills/enhance-readme/scripts/generate-readme-blocks.mjs +199 -0
  232. package/skills/enhance-readme/scripts/record-readme-tour.mjs +442 -0
  233. package/skills/enhance-skill-prompts/SKILL.md +167 -0
  234. package/skills/enhance-skill-prompts/references/exemplar-audit-auth-flows.md +311 -0
  235. package/skills/enhance-ux-laws/SKILL.md +409 -0
  236. package/skills/enhance-web-conversion/SKILL.md +155 -0
  237. package/skills/enhance-web-forms/SKILL.md +154 -0
  238. package/skills/enhance-web-instant-nav/SKILL.md +138 -0
  239. package/skills/enhance-web-instant-nav/references/bfcache-blockers.md +23 -0
  240. package/skills/enhance-web-instant-nav/references/early-hints.md +33 -0
  241. package/skills/enhance-web-instant-nav/references/speculation-rules.md +44 -0
  242. package/skills/enhance-web-landing/SKILL.md +459 -0
  243. package/skills/enhance-web-landing/references/details.md +773 -0
  244. package/skills/enhance-web-redesign/SKILL.md +228 -0
  245. package/skills/enhance-web-seo/SKILL.md +276 -0
  246. package/skills/enhance-web-ui/SKILL.md +473 -0
  247. package/skills/enhance-web-ui/references/details.md +674 -0
  248. package/skills/enhance-web-ux/HEURISTICS.md +248 -0
  249. package/skills/enhance-web-ux/PATTERNS.md +375 -0
  250. package/skills/enhance-web-ux/SKILL.md +464 -0
  251. package/skills/enhance-web-ux/examples.md +222 -0
  252. package/skills/enhance-web-ux/references/details.md +406 -0
  253. package/skills/enhance-web-web3d/SKILL.md +397 -0
  254. package/skills/enhance-web-web3d/references/css-canvas-effects.md +180 -0
  255. package/skills/handoff/SKILL.md +66 -0
  256. package/skills/housekeep-backlog/SKILL.md +149 -0
  257. package/skills/housekeep-dead-code/SKILL.md +387 -0
  258. package/skills/housekeep-dead-code/references/ratchet-ci.md +205 -0
  259. package/skills/housekeep-dead-code/references/supabase-hygiene.md +152 -0
  260. package/skills/housekeep-design/SKILL.md +207 -0
  261. package/skills/housekeep-files/SKILL.md +220 -0
  262. package/skills/housekeep-files/references/naming-and-catalog.md +86 -0
  263. package/skills/housekeep-files/scripts/housekeep-files.ps1 +360 -0
  264. package/skills/housekeep-files/scripts/housekeep-files.sh +238 -0
  265. package/skills/housekeep-gates/SKILL.md +174 -0
  266. package/skills/iterate-agent-harness/SKILL.md +137 -0
  267. package/skills/iterate-gtm-weekly/SKILL.md +103 -0
  268. package/skills/iterate-post-launch/SKILL.md +292 -0
  269. package/skills/meta-mcp-builder/SKILL.md +313 -0
  270. package/skills/meta-skill-creator/SKILL.md +304 -0
  271. package/skills/mobile-capacitor-platform/SKILL.md +103 -0
  272. package/skills/mobile-emulator-start/SKILL.md +296 -0
  273. package/skills/mobile-emulator-test/SKILL.md +491 -0
  274. package/skills/mobile-emulator-test/references/details.md +478 -0
  275. package/skills/mobile-rn-performance/SKILL.md +107 -0
  276. package/skills/mobile-rn-screen/SKILL.md +476 -0
  277. package/skills/mobile-rn-screen/references/details.md +785 -0
  278. package/skills/mushi-health/SKILL.md +206 -0
  279. package/skills/mushi-integration/SKILL.md +257 -0
  280. package/skills/plan-aeo-readiness/SKILL.md +166 -0
  281. package/skills/plan-antislop/SKILL.md +281 -0
  282. package/skills/plan-aso/SKILL.md +149 -0
  283. package/skills/plan-backup-dr/SKILL.md +131 -0
  284. package/skills/plan-capacitor-hardening/SKILL.md +217 -0
  285. package/skills/plan-data-integrity/SKILL.md +187 -0
  286. package/skills/plan-dead-code/SKILL.md +386 -0
  287. package/skills/plan-dead-code/references/knip-config.md +214 -0
  288. package/skills/plan-dead-code/references/output-templates.md +133 -0
  289. package/skills/plan-dead-code/references/preservation-contract.md +50 -0
  290. package/skills/plan-dead-code/references/residue-greps.md +84 -0
  291. package/skills/plan-dependency-provenance/SKILL.md +200 -0
  292. package/skills/plan-docs-sync/SKILL.md +143 -0
  293. package/skills/plan-docs-sync/references/drift-taxonomy.md +43 -0
  294. package/skills/plan-docs-sync/references/output-templates.md +33 -0
  295. package/skills/plan-docs-sync/references/preservation-contract.md +17 -0
  296. package/skills/plan-error-handling/SKILL.md +205 -0
  297. package/skills/plan-gtm/SKILL.md +276 -0
  298. package/skills/plan-gtm/references/benchmarks-2026.md +183 -0
  299. package/skills/plan-input-validation/SKILL.md +179 -0
  300. package/skills/plan-llm-cost-guardrails/SKILL.md +176 -0
  301. package/skills/plan-mobile-readiness/SKILL.md +171 -0
  302. package/skills/plan-perf-audit/SKILL.md +145 -0
  303. package/skills/plan-perf-audit/references/audit-scope.md +51 -0
  304. package/skills/plan-perf-audit/references/output-templates.md +33 -0
  305. package/skills/plan-perf-audit/references/preservation-contract.md +13 -0
  306. package/skills/plan-pricing/SKILL.md +173 -0
  307. package/skills/plan-privacy-compliance/SKILL.md +148 -0
  308. package/skills/plan-rls-audit/SKILL.md +231 -0
  309. package/skills/plan-secrets-audit/SKILL.md +181 -0
  310. package/skills/plan-security-audit/SKILL.md +168 -0
  311. package/skills/plan-security-audit/references/output-templates.md +36 -0
  312. package/skills/plan-security-audit/references/owasp-supabase-scope.md +55 -0
  313. package/skills/plan-security-audit/references/preservation-contract.md +18 -0
  314. package/skills/plan-stub-checker/SKILL.md +216 -0
  315. package/skills/plan-stub-checker/references/detection-methodology.md +75 -0
  316. package/skills/plan-stub-checker/references/detection-taxonomy.md +34 -0
  317. package/skills/plan-stub-checker/references/output-templates.md +63 -0
  318. package/skills/plan-stub-checker/references/preservation-contract.md +24 -0
  319. package/skills/plan-test-coverage/SKILL.md +170 -0
  320. package/skills/plan-test-coverage/references/methodology.md +54 -0
  321. package/skills/plan-test-coverage/references/output-templates.md +34 -0
  322. package/skills/plan-test-coverage/references/preservation-contract.md +15 -0
  323. package/skills/plan-uiux-unification/SKILL.md +230 -0
  324. package/skills/plan-uiux-unification/references/output-templates.md +67 -0
  325. package/skills/plan-uiux-unification/references/phase-workbook.md +85 -0
  326. package/skills/plan-uiux-unification/references/preservation-contract.md +24 -0
  327. package/skills/protocol-browser-anti-stall/SKILL.md +211 -0
  328. package/skills/protocol-browser-anti-stall/references/mcp-to-cli-map.md +113 -0
  329. package/skills/protocol-browser-anti-stall/references/playwright-session-coordination.md +170 -0
  330. package/skills/research/SKILL.md +422 -0
  331. package/skills/test-exploratory/SKILL.md +165 -0
  332. package/skills/test-exploratory/references/charter-template.md +29 -0
  333. package/skills/test-load/SKILL.md +126 -0
  334. package/skills/test-mutation/SKILL.md +160 -0
  335. package/skills/test-playwright/SKILL.md +354 -0
  336. package/skills/test-qa/SKILL.md +364 -0
  337. package/skills/test-qa/references/details.md +268 -0
  338. package/skills/test-red-team/SKILL.md +386 -0
  339. package/skills/test-red-team/references/owasp-attack-checklist.md +193 -0
  340. package/skills/test-unit/SKILL.md +259 -0
  341. package/skills/test-unit/references/details.md +267 -0
  342. package/skills/test-visual-regression/SKILL.md +132 -0
  343. package/skills/thirdparty-emil-design-eng/ATTRIBUTION.md +20 -0
  344. package/skills/thirdparty-emil-design-eng/SKILL.md +21 -0
  345. package/skills/thirdparty-emil-design-eng/references/emil-design-eng.md +676 -0
  346. package/skills/thirdparty-ui-ux-pro-max/ATTRIBUTION.md +22 -0
  347. package/skills/thirdparty-ui-ux-pro-max/SKILL.md +304 -0
  348. package/skills/thirdparty-ui-ux-pro-max/data/charts.csv +26 -0
  349. package/skills/thirdparty-ui-ux-pro-max/data/colors.csv +97 -0
  350. package/skills/thirdparty-ui-ux-pro-max/data/icons.csv +101 -0
  351. package/skills/thirdparty-ui-ux-pro-max/data/landing.csv +31 -0
  352. package/skills/thirdparty-ui-ux-pro-max/data/products.csv +97 -0
  353. package/skills/thirdparty-ui-ux-pro-max/data/react-performance.csv +45 -0
  354. package/skills/thirdparty-ui-ux-pro-max/data/stacks/astro.csv +54 -0
  355. package/skills/thirdparty-ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  356. package/skills/thirdparty-ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  357. package/skills/thirdparty-ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  358. package/skills/thirdparty-ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  359. package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  360. package/skills/thirdparty-ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  361. package/skills/thirdparty-ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  362. package/skills/thirdparty-ui-ux-pro-max/data/stacks/react.csv +54 -0
  363. package/skills/thirdparty-ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  364. package/skills/thirdparty-ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  365. package/skills/thirdparty-ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  366. package/skills/thirdparty-ui-ux-pro-max/data/stacks/vue.csv +50 -0
  367. package/skills/thirdparty-ui-ux-pro-max/data/styles.csv +68 -0
  368. package/skills/thirdparty-ui-ux-pro-max/data/typography.csv +58 -0
  369. package/skills/thirdparty-ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  370. package/skills/thirdparty-ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  371. package/skills/thirdparty-ui-ux-pro-max/data/web-interface.csv +31 -0
  372. package/skills/thirdparty-ui-ux-pro-max/scripts/core.py +253 -0
  373. package/skills/thirdparty-ui-ux-pro-max/scripts/design_system.py +1067 -0
  374. package/skills/thirdparty-ui-ux-pro-max/scripts/search.py +114 -0
  375. package/skills/thirdparty-web-interface-guidelines/ATTRIBUTION.md +23 -0
  376. package/skills/thirdparty-web-interface-guidelines/SKILL.md +190 -0
  377. package/skills/workflow-build-feature/SKILL.md +118 -0
  378. package/skills/workflow-coding-discipline/SKILL.md +140 -0
  379. package/skills/workflow-environment-ready/SKILL.md +128 -0
  380. package/skills/workflow-feature-flag/SKILL.md +262 -0
  381. package/skills/workflow-feedback-to-closure/SKILL.md +165 -0
  382. package/skills/workflow-fix-and-ship/SKILL.md +136 -0
  383. package/skills/workflow-git-commit/SKILL.md +200 -0
  384. package/skills/workflow-green-repo/SKILL.md +166 -0
  385. package/skills/workflow-grilling/SKILL.md +73 -0
  386. package/skills/workflow-gtm/SKILL.md +153 -0
  387. package/skills/workflow-housekeep/SKILL.md +453 -0
  388. package/skills/workflow-housekeep/references/templates.md +109 -0
  389. package/skills/workflow-launch-ready/SKILL.md +145 -0
  390. package/skills/workflow-merge-conflicts/SKILL.md +62 -0
  391. package/skills/workflow-onboard/SKILL.md +99 -0
  392. package/skills/workflow-parallel-agents/SKILL.md +164 -0
  393. package/skills/workflow-pr/SKILL.md +197 -0
  394. package/skills/workflow-quality-gate/SKILL.md +147 -0
  395. package/skills/workflow-refactor/SKILL.md +274 -0
  396. package/skills/workflow-release-prep/SKILL.md +207 -0
  397. package/skills/workflow-ship-and-observe/SKILL.md +164 -0
  398. package/skills/workflow-spec-tdd/SKILL.md +141 -0
  399. package/skills/workflow-spec-tdd/references/spec-template.md +126 -0
  400. package/skills/workflow-spec-tdd/references/tdd-patterns.md +167 -0
  401. package/skills-cursor/babysit/SKILL.md +17 -0
  402. package/skills-cursor/canvas/SKILL.md +142 -0
  403. package/skills-cursor/canvas/sdk/canvas-tokens.d.ts +235 -0
  404. package/skills-cursor/canvas/sdk/chart-primitives.d.ts +200 -0
  405. package/skills-cursor/canvas/sdk/dag-layout.d.ts +102 -0
  406. package/skills-cursor/canvas/sdk/diff-view.d.ts +130 -0
  407. package/skills-cursor/canvas/sdk/form-primitives.d.ts +194 -0
  408. package/skills-cursor/canvas/sdk/hooks.d.ts +117 -0
  409. package/skills-cursor/canvas/sdk/index.d.ts +47 -0
  410. package/skills-cursor/canvas/sdk/theme.d.ts +61 -0
  411. package/skills-cursor/canvas/sdk/todo-list.d.ts +49 -0
  412. package/skills-cursor/canvas/sdk/ui-primitives.d.ts +549 -0
  413. package/skills-cursor/canvas/sdk/ui-primitives.test.d.ts +2 -0
  414. package/skills-cursor/create-hook/SKILL.md +238 -0
  415. package/skills-cursor/create-rule/SKILL.md +185 -0
  416. package/skills-cursor/create-skill/SKILL.md +269 -0
  417. package/skills-cursor/create-skill/references/authoring-guide.md +182 -0
  418. package/skills-cursor/create-subagent/SKILL.md +228 -0
  419. package/skills-cursor/migrate-to-skills/SKILL.md +121 -0
  420. package/skills-cursor/shell/SKILL.md +22 -0
  421. package/skills-cursor/split-to-prs/SKILL.md +47 -0
  422. package/skills-cursor/statusline/SKILL.md +193 -0
  423. package/skills-cursor/update-cli-config/SKILL.md +85 -0
  424. package/skills-cursor/update-cursor-settings/SKILL.md +137 -0
  425. package/skills.sh.json +297 -0
@@ -0,0 +1,151 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Claude Code Stop hook, registered with `asyncRewake: true`: typecheck in the
4
+ * background after a turn, and wake Claude only when there is something new to fix.
5
+ *
6
+ * {
7
+ * "hooks": { "Stop": [{ "hooks": [{
8
+ * "type": "command",
9
+ * "command": "node \"$CLAUDE_PROJECT_DIR/.claude/hooks/stop-typecheck.mjs\" typecheck",
10
+ * "asyncRewake": true,
11
+ * "timeout": 600
12
+ * }] }] }
13
+ * }
14
+ *
15
+ * - Skips in ~0.3 s when no TypeScript input changed since the last check.
16
+ * - Exit 2 wakes Claude with the errors (stderr becomes a system reminder).
17
+ * Exit 0 stays silent. A plain synchronous Stop hook can't do this: its
18
+ * stdout only reaches the debug log, so Claude never sees the errors.
19
+ * - Re-wakes only when the error set changes, so a pre-existing error can't loop.
20
+ * - Summarizes large error sets (often one missing codegen step) instead of
21
+ * dumping hundreds of lines.
22
+ * - State, lock and tsbuildinfo live in this worktree's git dir, never in a
23
+ * node_modules shared across worktrees.
24
+ *
25
+ * Assumes the script (default `typecheck`) runs plain `tsc --noEmit` and accepts
26
+ * `--incremental --tsBuildInfoFile <path>`. Not for `tsc -b` or wrappers that
27
+ * reject extra flags. Package manager is picked from the lockfile.
28
+ *
29
+ * Usage: node stop-typecheck.mjs [script-name]
30
+ */
31
+ import { execFileSync, spawnSync } from "node:child_process";
32
+ import { createHash } from "node:crypto";
33
+ import fs from "node:fs";
34
+ import path from "node:path";
35
+
36
+ const script = process.argv[2] || "typecheck";
37
+ const cwd = process.env.CLAUDE_PROJECT_DIR || process.cwd();
38
+ const git = (...args) => execFileSync("git", args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }).trim();
39
+ const sha = (s) => createHash("sha1").update(s).digest("hex");
40
+ const STALE_LOCK_MS = 15 * 60 * 1000;
41
+
42
+ let gitDir;
43
+ try {
44
+ gitDir = git("rev-parse", "--path-format=absolute", "--git-dir");
45
+ } catch {
46
+ process.exit(0);
47
+ }
48
+ // Stay silent in a repo without the script rather than waking the agent with
49
+ // the package manager's "missing script" error.
50
+ try {
51
+ const scripts = JSON.parse(fs.readFileSync(path.join(cwd, "package.json"), "utf8")).scripts ?? {};
52
+ if (!(script in scripts)) process.exit(0);
53
+ } catch {
54
+ process.exit(0);
55
+ }
56
+
57
+ const stateFile = path.join(gitDir, "claude-stop-typecheck.json");
58
+ const lockFile = path.join(gitDir, "claude-stop-typecheck.lock");
59
+ const buildInfo = path.join(gitDir, "claude-stop-typecheck.tsbuildinfo");
60
+
61
+ // HEAD plus size and mtime of every changed or untracked TypeScript input.
62
+ const status = git("status", "--porcelain", "--untracked-files=all", "--", "*.ts", "*.tsx", "*.mts", "*.cts", "tsconfig*.json", "package.json");
63
+ const stamps = status
64
+ .split("\n")
65
+ .filter(Boolean)
66
+ .map((line) => {
67
+ const file = line.slice(3).split(" -> ").pop().replace(/^"|"$/g, "");
68
+ try {
69
+ const st = fs.statSync(path.join(cwd, file));
70
+ return `${line}|${st.size}|${st.mtimeMs}`;
71
+ } catch {
72
+ return line;
73
+ }
74
+ });
75
+ const fingerprint = sha([git("rev-parse", "HEAD"), ...stamps].join("\n"));
76
+
77
+ let state = {};
78
+ try {
79
+ state = JSON.parse(fs.readFileSync(stateFile, "utf8"));
80
+ } catch {}
81
+ if (state.fingerprint === fingerprint) process.exit(0);
82
+
83
+ // One run per worktree at a time; a later turn re-checks anyway.
84
+ let lock;
85
+ try {
86
+ lock = fs.openSync(lockFile, "wx");
87
+ } catch {
88
+ try {
89
+ if (Date.now() - fs.statSync(lockFile).mtimeMs < STALE_LOCK_MS) process.exit(0);
90
+ fs.rmSync(lockFile, { force: true });
91
+ lock = fs.openSync(lockFile, "wx");
92
+ } catch {
93
+ process.exit(0);
94
+ }
95
+ }
96
+
97
+ const runner = fs.existsSync(path.join(cwd, "pnpm-lock.yaml"))
98
+ ? "pnpm run --silent"
99
+ : fs.existsSync(path.join(cwd, "yarn.lock"))
100
+ ? "yarn run --silent"
101
+ : fs.existsSync(path.join(cwd, "bun.lock")) || fs.existsSync(path.join(cwd, "bun.lockb"))
102
+ ? "bun run"
103
+ : "npm run --silent";
104
+ const extraArgs = `--incremental --tsBuildInfoFile "${buildInfo}"`;
105
+ // npm needs `--` before script args; pnpm, yarn and bun forward them as-is.
106
+ const command = runner.startsWith("npm") ? `${runner} ${script} -- ${extraArgs}` : `${runner} ${script} ${extraArgs}`;
107
+
108
+ let exitCode = 0;
109
+ try {
110
+ const run = spawnSync(command, { cwd, shell: true, encoding: "utf8", maxBuffer: 64 << 20 });
111
+ const output = `${run.stdout || ""}${run.stderr || ""}`;
112
+ if (run.status === 0) {
113
+ state = { fingerprint, errorsHash: "" };
114
+ } else {
115
+ const errors = [...new Set(output.split(/\r?\n/).filter((l) => /error TS\d+/.test(l)))];
116
+ const report = errors.length ? errors : output.trim().split(/\r?\n/).slice(-30);
117
+ const errorsHash = sha(report.slice().sort().join("\n"));
118
+ if (errorsHash !== state.errorsHash) {
119
+ process.stderr.write(
120
+ `Background \`${script}\` failed after your last turn (${errors.length || "unknown number of"} error(s)). Fix these before finishing:\n` +
121
+ (errors.length > 50 ? summarize(errors) : report.slice(0, 40).join("\n")) +
122
+ "\n",
123
+ );
124
+ exitCode = 2;
125
+ }
126
+ state = { fingerprint, errorsHash };
127
+ }
128
+ fs.writeFileSync(stateFile, JSON.stringify(state));
129
+ } finally {
130
+ fs.closeSync(lock);
131
+ fs.rmSync(lockFile, { force: true });
132
+ }
133
+ process.exit(exitCode);
134
+
135
+ // Hundreds of errors usually cascade from one cause, such as missing generated code.
136
+ // Summarize so Claude fixes the root cause instead of chasing symptoms.
137
+ function summarize(errors) {
138
+ const count = (list, key) => list.reduce((m, l) => ((k) => (k ? m.set(k, (m.get(k) || 0) + 1) : m))(key(l)), new Map());
139
+ const top = (m, n) => [...m].sort((a, b) => b[1] - a[1]).slice(0, n);
140
+ const codes = top(count(errors, (l) => l.match(/error (TS\d+)/)?.[1]), 6).map(([c, n]) => `${c} x${n}`).join(", ");
141
+ const missing = top(count(errors.filter((l) => /TS2307/.test(l)), (l) => l.match(/module '([^']+)'/)?.[1]), 5);
142
+ const lines = [`By code: ${codes}`];
143
+ if (missing.length) {
144
+ lines.push("Most-missing modules:", ...missing.map(([mod, n]) => ` ${mod} (${n} imports)`));
145
+ if (missing.some(([mod]) => /generated|prisma|\.gen\b|codegen/i.test(mod))) {
146
+ lines.push("Generated code is missing in this checkout. Run the repo's codegen first (e.g. `npx prisma generate`), then re-check. Most other errors likely cascade from it.");
147
+ }
148
+ }
149
+ lines.push("First errors:", ...errors.slice(0, 10));
150
+ return lines.join("\n");
151
+ }
@@ -0,0 +1,138 @@
1
+ ---
2
+ name: audit-analytics
3
+ description: >
4
+ Read-only audit of product-analytics events (PostHog, Amplitude, Mixpanel,
5
+ GA4): taxonomy, funnels, consent-gated firing, dead or duplicate events. Use
6
+ when "audit our analytics", "are we tracking the right events", or "funnel
7
+ instrumentation".
8
+ license: MIT
9
+ effort: high
10
+ ---
11
+
12
+ # audit-analytics — Product-event instrumentation
13
+
14
+ **Degree of freedom: HIGH** — judgment on taxonomy and funnel coverage.
15
+ Consent-gate proof is `[LOW freedom]` when you confirm the SDK does not
16
+ init on boot (quote the init site; do not invent a legal opinion).
17
+
18
+ Read-only. You verify the app measures what the business needs to decide, with
19
+ one taxonomy, without leaking PII or firing before consent.
20
+
21
+ **The failure mode is silent:** the dashboard looks populated, but the key
22
+ funnel step was never instrumented, so every decision on it is guesswork.
23
+
24
+ > **Present findings. Propose a canonical taxonomy. Do not rewrite events
25
+ > until approved.**
26
+
27
+ ## This skill vs neighbors
28
+
29
+ | Skill | Owns |
30
+ |---|---|
31
+ | **audit-analytics** (this) | Event coverage, naming, consent-gated *firing* |
32
+ | `plan-privacy-compliance` | Legal data-flow + store labels; **run both** when consent is in play |
33
+ | `data-visualization` | Charts/dashboards as UI — not whether events exist |
34
+ | `iterate-post-launch` | What to fix next from *existing* prod signals |
35
+ | `audit-ux-journeys` | Task completion / IA; may recommend this skill when funnels are blind |
36
+ | `workflow-feature-flag` | Flag rollout; not event taxonomy |
37
+
38
+ Do **not** fire for "build me a chart" → `data-visualization`.
39
+ Do **not** fire for "GDPR / privacy labels" alone → `plan-privacy-compliance`
40
+ (then come back here for the event matrix).
41
+
42
+ ## How to reason
43
+
44
+ 1. **Observe** — quote the `track()` / schema name and where it fires
45
+ 2. **Interpret** — can the business answer the funnel question this event claims to answer?
46
+ 3. **Classify** — missing / dead / duplicate / phantom / PII / consent-before-init / correct
47
+ 4. **Severity** — key-funnel step never fired, or analytics before consent = P0
48
+
49
+ ## Worked example
50
+
51
+ > **Observe:** signup success fires `signup_completed` on web and
52
+ > `Signup Success` on iOS; PostHog inits in `layout.tsx` before the consent banner.
53
+ > **Interpret:** the funnel splits across two names; EU visitors are tracked
54
+ > before consent.
55
+ > **Classify:** taxonomy split + consent-before-init.
56
+ > **Severity:** P0 for consent; major for the name split.
57
+ > **Finding:** `Signup Success` | duplicate name | unify to `signup_completed`;
58
+ > init → `plan-privacy-compliance` + gate behind consent.
59
+
60
+ ---
61
+
62
+ ## Phase 0 — Detect the analytics stack [HIGH freedom]
63
+
64
+ - Provider: PostHog / Amplitude / Mixpanel / GA4 / Segment / custom table
65
+ - Where events are defined: central taxonomy vs scattered `track()` (scattered
66
+ is itself a finding)
67
+ - Typed schema vs free-form string names
68
+ - Web vs iOS vs Android vs server
69
+
70
+ ---
71
+
72
+ ## Phase 1 — Reconstruct the intended funnel [HIGH freedom]
73
+
74
+ From the product's core loop, list critical journeys as ordered steps
75
+ (e.g. install → signup → activation → first value → habit → conversion).
76
+ For each step, name the event(s) that *must* fire. This is the yardstick.
77
+
78
+ ---
79
+
80
+ ## Phase 2 — Coverage and correctness [HIGH freedom; consent init = LOW]
81
+
82
+ **Funnel completeness** — Each intended step has an event in code. Missing Y
83
+ means you cannot answer "why drop between X and Y".
84
+
85
+ **Taxonomy** — One convention (`object_action`, case, tense). Mixed names
86
+ (`signup_completed` vs `Signup Success`) fragment analysis. Properties
87
+ consistent (`user_id` vs `userId`).
88
+
89
+ **Dead / duplicate / phantom** — Defined never fired; same action twice under
90
+ different names; fired on render instead of on action.
91
+
92
+ **Property hygiene** — Plan tier, platform, source present so cohorts work later.
93
+
94
+ **PII & consent** — No raw email/name/address in properties. Analytics SDK
95
+ gated behind consent — **not** initialized on boot. Cross-check
96
+ `plan-privacy-compliance` for the legal inventory; this skill owns the
97
+ event-level gate.
98
+
99
+ **Cross-platform parity** — Same action → same event name on each client.
100
+
101
+ **Identity** — Anonymous → identified stitch after signup. Broken stitch
102
+ double-counts users.
103
+
104
+ ---
105
+
106
+ ## Definition of Done
107
+
108
+ - [ ] Intended funnel(s) written with required event per step
109
+ - [ ] Each step instrumented or gap logged
110
+ - [ ] Naming checked against one convention
111
+ - [ ] Dead, duplicate, phantom fires listed
112
+ - [ ] PII in properties + consent-gating verified; privacy handoff written
113
+ - [ ] Cross-platform parity checked if multi-platform
114
+ - [ ] Anonymous→identified stitching verified
115
+ - [ ] Nothing rewritten without approval
116
+
117
+ ## Self-critique before reporting [LOW freedom — do not skip]
118
+
119
+ 1. **Evidenced** — event name + file:line, not "we probably track signup"
120
+ 2. **Funnel first** — every finding maps to a step that must fire
121
+ 3. **No PII values** — report property *names*, never emails or user ids
122
+ 4. **Right owner** — legal inventory → `plan-privacy-compliance`
123
+ 5. **Nothing rewritten** — taxonomy proposed, not applied
124
+
125
+ ## Output format
126
+
127
+ 1. **Funnel coverage** — step | required event | present? | notes
128
+ 2. **Taxonomy findings** — inconsistent/dead/duplicate/phantom | severity | fix
129
+ 3. **PII/consent** — event | problem | handoff to `plan-privacy-compliance`
130
+ 4. **Fix plan** — taxonomy → missing events → consent gate, severity-ordered
131
+
132
+ ## Related
133
+
134
+ - `plan-privacy-compliance` — consent, deletion, store labels (run both)
135
+ - `iterate-post-launch` — consume a trustworthy data layer
136
+ - `audit-ux-journeys` — journeys that need funnel evidence
137
+ - `data-visualization` — rendering metrics, not collecting them
138
+ - `workflow-feature-flag` — flag exposure events
@@ -0,0 +1,267 @@
1
+ ---
2
+ name: audit-auth-flows
3
+ description: >
4
+ Read-only audit of app-layer auth: route×gate matrix, session lifecycle,
5
+ OAuth, provider traps (getSession vs getUser, middleware-only gates,
6
+ CVE-2025-29927). Use when "audit our auth" or "check middleware protection".
7
+ RLS → plan-rls-audit.
8
+ license: MIT
9
+ effort: high
10
+ ---
11
+
12
+ # audit-auth-flows — Middleware is edge routing, not a security boundary
13
+
14
+ **Degree of freedom: MIXED — declared per phase**
15
+
16
+ - Phases 0–4 (discovery, judgment): **[HIGH freedom]** — reason about what
17
+ you find; checklists prompt investigation, they are not tick-scripts.
18
+ - Phase 5 (live probes) and the getSession grep: **[LOW freedom — run
19
+ exactly]** — a skipped probe is an unproven claim, not a saved step.
20
+
21
+ Read-only. Map the auth surface and prove, route by route, that identity is
22
+ verified where it matters. Then stop. Hand fixes to a follow-up session.
23
+
24
+ **2026 consensus (official, post CVE-2025-29927):** Next.js middleware
25
+ runs before cache and routing. Vercel: *"We do not recommend Middleware
26
+ to be the sole method of protecting routes in your application."* An
27
+ audit that only reads `middleware.ts` and declares the app safe has
28
+ missed the point. Defense in depth: edge + route handler / server action
29
+ + data layer. Each layer covers a different part of the request path.
30
+
31
+ ## How to reason in this audit
32
+
33
+ Every finding is recorded in this shape, in this order:
34
+
35
+ 1. **Observe** — what does the code/probe actually show? (quote the line or the response)
36
+ 2. **Interpret** — what does that mean for who can reach what? (don't assume intent)
37
+ 3. **Classify** — real exposure / defense-in-depth-gap / correct-as-is / needs-a-probe
38
+ 4. **Severity** — by blast radius: unauth data access & auth bypass = critical;
39
+ everything else justified against what an attacker actually gains.
40
+
41
+ If you cannot complete Interpret from static code, it is a **needs-a-probe**
42
+ item for Phase 5, not a conclusion.
43
+
44
+ ## Worked example
45
+
46
+ > **Observe:** `middleware.ts` matcher is `['/dashboard/:path*']`. The route
47
+ > `/api/orders/[id]` has no check in the handler.
48
+ > **Interpret:** API routes are not under the matcher, so middleware never
49
+ > runs on them; the order endpoint is reachable without auth. Layout-level
50
+ > checks don't cover direct API calls.
51
+ > **Classify:** real exposure (not merely a defense-in-depth gap — data is
52
+ > actually reachable).
53
+ > **Severity:** critical — unauthenticated data access.
54
+ > **Finding row:** `/api/orders/[id]` | edge+route | critical | matcher
55
+ > excludes /api; handler has no `getUser()` check | probe P5-a confirmed
56
+ > 200 while logged out.
57
+
58
+ ## This skill vs neighbors
59
+
60
+ | Skill | Owns |
61
+ |---|---|
62
+ | **audit-auth-flows** (this) | Session lifecycle, route×gate matrix, OAuth, provider traps |
63
+ | `audit-security` | OWASP checklist (injection, headers, deps) — may fix inline |
64
+ | `plan-security-audit` | Plan-only hardening burndown |
65
+ | `plan-rls-audit` | Data-layer who-can-read-which-rows |
66
+ | `plan-secrets-audit` | Where `service_role` / keys live |
67
+ | `plan-privacy-compliance` | Consent / policy vs collection — not session gates |
68
+ | `backend-patterns` | Building the middleware / guard fixes after this audit |
69
+ | `test-exploratory` | Live guest vs logged-in probe (runtime complement to this static matrix) |
70
+
71
+ ---
72
+
73
+ ## Phase 0 — Detect the auth stack [HIGH freedom]
74
+
75
+ Identify: provider (Supabase Auth / NextAuth / Clerk / Auth0 / custom),
76
+ framework protection (Next.js middleware + `matcher`, route guards,
77
+ server-action checks), session transport (cookie vs `localStorage` vs
78
+ `Authorization` header), token model (JWT vs server session). Enumerate
79
+ pages, API routes, server actions, edge functions, admin areas. Record
80
+ the pinned framework version — auth CVEs are version-gated.
81
+
82
+ ---
83
+
84
+ ## Phase 1 — Route × gate coverage matrix [HIGH freedom — the centerpiece]
85
+
86
+ Every protected route / action, one row. Apply the reasoning chain per row.
87
+
88
+ | route/action | intended access | gate that protects it | verified server-side? | data-layer backstop? |
89
+
90
+ Hunt the gaps this exposes:
91
+
92
+ - **Matcher holes** — `config.matcher` misses a protected path. API
93
+ routes and server actions often bypass page middleware — each needs
94
+ its own check.
95
+ - **Layout-only protection** — a layout/wrapper is a client-side
96
+ illusion. It does not gate data fetches or direct API/action calls.
97
+ - **Middleware-as-only-gate** — the CVE-2025-29927 class. Any route
98
+ where middleware is the *sole* authorization layer is a finding
99
+ **regardless of framework version or host**. Patching the CVE is not
100
+ defense in depth.
101
+ - **Server action exposure** — Next.js server actions are POST
102
+ endpoints callable directly. Each mutating action must check identity
103
+ itself.
104
+ - **Unlisted routes** — grep the router; do not trust the matcher list.
105
+
106
+ ---
107
+
108
+ ## Phase 2 — Provider and framework traps [HIGH freedom, except the grep = LOW]
109
+
110
+ **Supabase (check first on this stack):**
111
+
112
+ - **[LOW freedom — run exactly]** `grep -rn "getSession(" <server-code-paths>`.
113
+ Treat every server-side hit as a finding until proven client-side-only.
114
+ Official JS docs: cookie/storage values *may not be authentic*;
115
+ `getSession()` is strongly advised against for authorization.
116
+ `getUser()` performs a network request to the Auth server and *can* be
117
+ used to base authorization rules. Newer SSR guides also use
118
+ `getClaims()` to *refresh* cookies — that is not a substitute for
119
+ verifying identity at the handler.
120
+ - Service-role key on any client-exposed path → `plan-secrets-audit`.
121
+ RLS assumed but not enforcing → `plan-rls-audit` (data-layer
122
+ backstop; this skill is the app layer above it).
123
+ - `autoRefreshToken` disabled without manual refresh; JWT expiry
124
+ absurdly short (<300s) hammering refresh.
125
+
126
+ **Next.js CVE-2025-29927** (GHSA-f82v-jwr5-mffw, critical): bypass
127
+ authorization if the check occurs only in middleware, via the internal
128
+ `x-middleware-subrequest` header. **Patched:** 12.3.5 / 13.5.9 /
129
+ 14.2.25 / 15.2.3. **Impacted:** self-hosted `next start` and
130
+ `output: 'standalone'`. Vercel-hosted apps were incidentally
131
+ protected; Netlify and Cloudflare Workers were not affected. Workaround
132
+ if unpatched: drop `x-middleware-subrequest` before it hits Next.
133
+ If below the fix → P0 *and* a defense-in-depth finding. Also sweep
134
+ later Next.js auth CVEs against the pinned version — query the GitHub
135
+ advisory database rather than listing CVEs from memory; 29927 is not the
136
+ only one.
137
+
138
+ **General rule:** any "the framework enforces auth at the edge"
139
+ assumption is a finding, whatever the framework.
140
+
141
+ **NextAuth / Clerk / Auth0** — session strategy (JWT vs database),
142
+ callback / redirect validation, and whether `auth()` / session checks
143
+ actually run server-side per protected operation.
144
+
145
+ ---
146
+
147
+ ## Phase 3 — Session lifecycle [HIGH freedom]
148
+
149
+ **Cookies** — `HttpOnly`, `Secure`, `SameSite` (Lax min, Strict for
150
+ sensitive); scoped path/domain; not readable by JS. Token in
151
+ `localStorage` is XSS-exfiltratable — flag it; CSRF-vs-XSS must be a
152
+ deliberate choice.
153
+
154
+ **Logout that actually logs out** — a stateless JWT stays valid until
155
+ expiry if logout only clears the client. Confirm server-side
156
+ invalidation (Supabase `signOut` revokes the refresh token). Probe it
157
+ (Phase 5). Official sessions FAQ: access tokens can still be presented
158
+ after sign-out unless the app also checks revocation / uses
159
+ `getUser()`.
160
+
161
+ **Rotation & timeouts** — rotate on privilege change (login, role
162
+ elevation) to kill fixation; idle timeout and absolute-max lifetime
163
+ both present. Current norm: short access tokens, longer **rotated**
164
+ refresh tokens with reuse detection, capped absolute session.
165
+
166
+ **Refresh-token rotation + reuse detection** — official Supabase
167
+ sessions docs: a refresh token is single-use, with two exceptions
168
+ (default **10s reuse interval** — do not widen; parent-token retry for
169
+ lost responses). Outside those exceptions the **whole session family
170
+ is revoked**. Disabling that in Advanced Settings is "generally not
171
+ recommended" — flag if widened or disabled.
172
+
173
+ ---
174
+
175
+ ## Phase 4 — Credentials, OAuth, authorization [HIGH freedom]
176
+
177
+ **OAuth / OIDC** — `state` (CSRF on the callback), PKCE for public
178
+ clients, redirect-URI allowlist exact-match, provider `email_verified`
179
+ checked before trust, account-linking collisions handled.
180
+
181
+ **Credential flows** — reset tokens single-use + expiring + not leaked
182
+ in URL/referrer; **user enumeration** via differing error text or
183
+ timing on login/reset/signup; rate limiting on auth endpoints
184
+ specifically; MFA state cannot be skipped mid-flow.
185
+
186
+ **Authorization above the data layer** — not just "is logged in" but
187
+ "is allowed"; IDOR on API params (`/api/orders/:id` scoped to caller?);
188
+ admin routes gated by role server-side. Name which layer each control
189
+ lives in. `plan-rls-audit` owns the data-layer half.
190
+
191
+ ---
192
+
193
+ ## Phase 5 — Live probes [LOW freedom — run each, in order, non-prod]
194
+
195
+ Force the failures rather than only reading code. Log each as
196
+ `P5-x | expected | actual | evidence`:
197
+
198
+ - **P5-a** Hit each protected route / API / action **unauthenticated** →
199
+ expect deny (not a redirect that still returns data).
200
+ - **P5-b** Replay a **logged-out** session token → expect reject.
201
+ - **P5-c** Tamper the session cookie / swap another user's identifier →
202
+ reject.
203
+ - **P5-d** IDOR: as user A, request user B's object by id → deny.
204
+ - **P5-e** If Next.js is version-vulnerable or self-hosted: send
205
+ `x-middleware-subrequest` and confirm WAF/edge *and* a route-handler
206
+ check still stop it.
207
+ - **P5-f** User-enumeration: compare wrong-password vs nonexistent-user
208
+ (text + timing).
209
+
210
+ Do not run these against production. Do not write exploit PoCs into
211
+ the repo.
212
+
213
+ ---
214
+
215
+ ## Self-critique before reporting [LOW freedom — do not skip]
216
+
217
+ Challenge every finding against this rubric; drop or downgrade any that fail:
218
+
219
+ 1. **Evidenced, not assumed** — quoted line or probe result? If it rests on
220
+ "the code probably…", mark unconfirmed or run the probe.
221
+ 2. **Reproducible** — did the probe succeed twice, or once? Flaky ≠ finding.
222
+ 3. **Severity justified** — "critical" requires actual unauth access or
223
+ bypass, not theoretical risk.
224
+ 4. **Right layer** — app-layer (yours) or data-layer (→ `plan-rls-audit`)?
225
+ 5. **No false safety** — did you confirm a gate *works*, or only that it
226
+ *exists*? A check a probe bypassed is critical, not a pass.
227
+
228
+ ---
229
+
230
+ ## Definition of Done
231
+
232
+ - [ ] Auth stack + framework version recorded
233
+ - [ ] Degree-of-freedom respected: Phase 5 probes and the getSession grep
234
+ run exactly, in order
235
+ - [ ] Route×gate matrix complete; every row reasoned
236
+ Observe→Interpret→Classify→Severity
237
+ - [ ] Matcher holes, layout-only, middleware-as-sole-gate, unprotected
238
+ server actions surfaced
239
+ - [ ] `getSession()`-for-authz grepped; `getUser()` confirmed on every
240
+ server gate
241
+ - [ ] CVE-2025-29927 (and later auth CVEs) checked against the pinned version
242
+ - [ ] Cookie flags, localStorage exposure, CSRF pairing assessed
243
+ - [ ] Server-side logout invalidation confirmed by probe; rotation +
244
+ idle/absolute timeouts present
245
+ - [ ] Refresh reuse interval not widened; family revocation not disabled
246
+ - [ ] OAuth state / PKCE / redirect-allowlist / email_verified checked
247
+ - [ ] User-enumeration, reset tokens, auth-endpoint rate limits, MFA-skip
248
+ checked
249
+ - [ ] App-layer authorization (roles, IDOR, admin) split from the RLS half
250
+ - [ ] Live probes run non-prod; each logged pass/fail
251
+ - [ ] Self-critique rubric applied; unevidenced/flaky findings dropped or
252
+ downgraded
253
+ - [ ] Read-only — findings presented, not patched
254
+
255
+ ## Output format
256
+
257
+ 1. **Route × gate matrix** — the table, gaps highlighted
258
+ 2. **Findings** — issue | layer (edge/route/data) | severity (critical =
259
+ unauth access / auth bypass) | file:line or probe | fix shape — each
260
+ finding in the worked-example shape
261
+ 3. **Provider-trap list** — exact call to change (`getSession` →
262
+ `getUser`, etc.)
263
+ 4. **Probe log** — P5-x | expected | actual | evidence
264
+ 5. **Fix plan** — auth-bypass and getSession-authz first, then session
265
+ lifecycle, then enumeration/OAuth. Handoffs: `plan-rls-audit`,
266
+ `plan-secrets-audit`, `plan-security-audit`, `backend-patterns`.
267
+ Present and stop.