@1aboveio/skills 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/LICENSE +3 -0
  2. package/README.md +90 -0
  3. package/bin/1aboveio-skills.mjs +18 -0
  4. package/package.json +28 -0
  5. package/runtime/skills/distribution/generated/recipes.json +1189 -0
  6. package/runtime/skills/distribution/scripts/bundles.mjs +280 -0
  7. package/runtime/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  8. package/skills/backend/airflow-dag-develop/LICENSE +3 -0
  9. package/skills/backend/airflow-dag-develop/SKILL.md +111 -0
  10. package/skills/backend/app-debug/LICENSE +3 -0
  11. package/skills/backend/app-debug/SKILL.md +109 -0
  12. package/skills/backend/app-debug/references/common-errors.md +128 -0
  13. package/skills/backend/python-backend/LICENSE +3 -0
  14. package/skills/backend/python-backend/SKILL.md +326 -0
  15. package/skills/cicd-pipeline/cloud-build/LICENSE +3 -0
  16. package/skills/cicd-pipeline/cloud-build/SKILL.md +707 -0
  17. package/skills/cicd-pipeline/cloud-debug/LICENSE +3 -0
  18. package/skills/cicd-pipeline/cloud-debug/SKILL.md +316 -0
  19. package/skills/cicd-pipeline/cloud-debug/references/build-failures.md +238 -0
  20. package/skills/cicd-pipeline/cloud-debug/references/deploy-failures.md +376 -0
  21. package/skills/cicd-pipeline/cloud-debug/references/pipeline-failures.md +378 -0
  22. package/skills/cicd-pipeline/cloud-deploy/LICENSE +3 -0
  23. package/skills/cicd-pipeline/cloud-deploy/SKILL.md +229 -0
  24. package/skills/cicd-pipeline/cloud-deploy/references/config-templates.md +257 -0
  25. package/skills/cicd-pipeline/docker/LICENSE +3 -0
  26. package/skills/cicd-pipeline/docker/SKILL.md +126 -0
  27. package/skills/cicd-pipeline/google-cloud/LICENSE +3 -0
  28. package/skills/cicd-pipeline/google-cloud/SKILL.md +118 -0
  29. package/skills/cicd-pipeline/google-cloud/references/gcs.md +469 -0
  30. package/skills/cicd-pipeline/google-cloud/references/iam.md +451 -0
  31. package/skills/cicd-pipeline/google-cloud/references/project.md +349 -0
  32. package/skills/cicd-pipeline/google-cloud/references/secrets.md +336 -0
  33. package/skills/cicd-pipeline/google-cloud/references/vpc.md +312 -0
  34. package/skills/cicd-pipeline/google-cloud/scripts/create-sa.sh +36 -0
  35. package/skills/cicd-pipeline/google-cloud/scripts/gcp-config.sh +31 -0
  36. package/skills/cicd-pipeline/google-cloud/scripts/grant-iap.sh +41 -0
  37. package/skills/cicd-pipeline/google-cloud/scripts/setup-secrets.sh +48 -0
  38. package/skills/cicd-pipeline/mergify/LICENSE +3 -0
  39. package/skills/cicd-pipeline/mergify/SKILL.md +138 -0
  40. package/skills/cicd-pipeline/mergify/assets/templates/mergify.yml +237 -0
  41. package/skills/cicd-pipeline/mergify/assets/templates/ruleset.json +46 -0
  42. package/skills/cicd-pipeline/mergify/references/branch-protection.md +277 -0
  43. package/skills/cicd-pipeline/mergify/references/configuration.md +183 -0
  44. package/skills/cicd-pipeline/mergify/references/diagnosis.md +73 -0
  45. package/skills/cicd-pipeline/mergify/references/traps.md +78 -0
  46. package/skills/cicd-pipeline/mergify/references/watch-contract.md +218 -0
  47. package/skills/cicd-pipeline/mergify/scripts/audit-core.mjs +131 -0
  48. package/skills/cicd-pipeline/mergify/scripts/audit.mjs +4 -0
  49. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery-core.mjs +663 -0
  50. package/skills/cicd-pipeline/mergify/scripts/watch-pr-delivery.mjs +4 -0
  51. package/skills/cicd-pipeline/podman/LICENSE +3 -0
  52. package/skills/cicd-pipeline/podman/SKILL.md +70 -0
  53. package/skills/cicd-pipeline/podman/agents/openai.yaml +4 -0
  54. package/skills/cicd-pipeline/podman/assets/templates/podman-compose-socket-directory.yml +6 -0
  55. package/skills/cicd-pipeline/podman/assets/templates/podman-service-override.conf +3 -0
  56. package/skills/cicd-pipeline/podman/references/compose-compatibility.md +70 -0
  57. package/skills/cicd-pipeline/podman/references/networking-and-ports.md +74 -0
  58. package/skills/cicd-pipeline/podman/references/rootless-services-and-sockets.md +156 -0
  59. package/skills/cicd-pipeline/podman/references/troubleshooting.md +98 -0
  60. package/skills/engineering/e2e-test/LICENSE +3 -0
  61. package/skills/engineering/e2e-test/SKILL.md +156 -0
  62. package/skills/engineering/e2e-test/assets/ci-gates.cloudbuild.yaml +272 -0
  63. package/skills/engineering/e2e-test/assets/ci-gates.github.yml +451 -0
  64. package/skills/engineering/e2e-test/assets/e2e-workflow.yml +282 -0
  65. package/skills/engineering/e2e-test/references/authoring/auth-flows.md +159 -0
  66. package/skills/engineering/e2e-test/references/authoring/playwright-config.md +71 -0
  67. package/skills/engineering/e2e-test/references/authoring/playwright-patterns.md +219 -0
  68. package/skills/engineering/e2e-test/references/authoring/test-skipping.md +44 -0
  69. package/skills/engineering/e2e-test/references/ci-integration.md +121 -0
  70. package/skills/engineering/e2e-test/references/ci-playwright-container.md +280 -0
  71. package/skills/engineering/e2e-test/references/debugging.md +36 -0
  72. package/skills/engineering/e2e-test/references/presentation-sweep.md +131 -0
  73. package/skills/engineering/e2e-test/references/reviewing.md +39 -0
  74. package/skills/engineering/e2e-test/references/route-discovery.md +50 -0
  75. package/skills/engineering/e2e-test/references/route-manifest.md +44 -0
  76. package/skills/engineering/e2e-test/scripts/detect-routes-fastapi.py +290 -0
  77. package/skills/engineering/e2e-test/scripts/detect-routes-nextjs.mjs +200 -0
  78. package/skills/engineering/e2e-test/scripts/post-visual-evidence.mjs +158 -0
  79. package/skills/engineering/e2e-test/scripts/presentation-checks.mjs +171 -0
  80. package/skills/engineering/e2e-test/scripts/presentation-perceivability.mjs +179 -0
  81. package/skills/engineering/e2e-test/scripts/presentation-reachability.mjs +154 -0
  82. package/skills/engineering/e2e-test/scripts/presentation-render-health.mjs +141 -0
  83. package/skills/engineering/e2e-test/scripts/presentation-sweep.mjs +148 -0
  84. package/skills/engineering/e2e-test/scripts/presentation-temporal.mjs +127 -0
  85. package/skills/engineering/e2e-test/scripts/presentation-visual.mjs +84 -0
  86. package/skills/engineering/e2e-test/scripts/project-route-manifest.mjs +75 -0
  87. package/skills/engineering/e2e-test/scripts/validate-manifest.mjs +106 -0
  88. package/skills/engineering/engineering-runtime/LICENSE +3 -0
  89. package/skills/engineering/engineering-runtime/SKILL.md +10 -0
  90. package/skills/engineering/engineering-runtime/agents/openai.yaml +6 -0
  91. package/skills/engineering/engineering-runtime/coherence/workflow.json +553 -0
  92. package/skills/engineering/engineering-runtime/scripts/exact-head-artifact.mjs +131 -0
  93. package/skills/engineering/engineering-runtime/scripts/head-check-set.mjs +398 -0
  94. package/skills/engineering/engineering-runtime/scripts/main-module.mjs +80 -0
  95. package/skills/engineering/engineering-runtime/scripts/mergify-yaml.mjs +11 -0
  96. package/skills/engineering/engineering-runtime/scripts/package-lock.json +43 -0
  97. package/skills/engineering/engineering-runtime/scripts/package.json +10 -0
  98. package/skills/engineering/engineering-runtime/scripts/required-check-plan.mjs +223 -0
  99. package/skills/engineering/engineering-runtime/scripts/workflow-coherence.mjs +576 -0
  100. package/skills/engineering/engineering-runtime/scripts/workflow-policy.mjs +166 -0
  101. package/skills/engineering/ensure-coverage/LICENSE +3 -0
  102. package/skills/engineering/ensure-coverage/SKILL.md +136 -0
  103. package/skills/engineering/ensure-coverage/evals/evals.json +125 -0
  104. package/skills/engineering/ensure-coverage/references/breadth/coverage-ledger.md +91 -0
  105. package/skills/engineering/ensure-coverage/references/breadth/inventory-contract.md +83 -0
  106. package/skills/engineering/ensure-coverage/references/breadth/surface-baseline.md +44 -0
  107. package/skills/engineering/ensure-coverage/references/breadth/surface-discovery.md +16 -0
  108. package/skills/engineering/ensure-coverage/references/depth/characterization.md +68 -0
  109. package/skills/engineering/ensure-coverage/references/depth/coverage.config.example.json +25 -0
  110. package/skills/engineering/ensure-coverage/references/depth/grading.md +35 -0
  111. package/skills/engineering/ensure-coverage/references/depth/mock-policy.md +87 -0
  112. package/skills/engineering/ensure-coverage/references/depth/test-smells.md +23 -0
  113. package/skills/engineering/ensure-coverage/references/enforcement/ci-contract.md +164 -0
  114. package/skills/engineering/ensure-coverage/references/enforcement/hooks.md +85 -0
  115. package/skills/engineering/ensure-coverage/references/examples/coverage-ledger.md +109 -0
  116. package/skills/engineering/ensure-coverage/references/examples/refund-flow.md +33 -0
  117. package/skills/engineering/ensure-coverage/references/presentation/axis.md +78 -0
  118. package/skills/engineering/ensure-coverage/references/presentation/runner-contract.md +74 -0
  119. package/skills/engineering/ensure-coverage/references/process/audit-mode.md +33 -0
  120. package/skills/engineering/ensure-coverage/references/process/output-template.md +139 -0
  121. package/skills/engineering/ensure-coverage/references/process/review-contract-template.md +119 -0
  122. package/skills/engineering/ensure-coverage/references/process/scope-class.md +178 -0
  123. package/skills/engineering/ensure-coverage/references/process/test-strategy.md +55 -0
  124. package/skills/engineering/ensure-coverage/schemas/coverage-config.schema.json +45 -0
  125. package/skills/engineering/ensure-coverage/schemas/coverage-file.schema.json +93 -0
  126. package/skills/engineering/ensure-coverage/scripts/adapters/nextjs-inventory.mjs +178 -0
  127. package/skills/engineering/ensure-coverage/scripts/check-quarantine-expiry.mjs +101 -0
  128. package/skills/engineering/ensure-coverage/scripts/ci-audit.mjs +358 -0
  129. package/skills/engineering/ensure-coverage/scripts/coverage-checklist.mjs +494 -0
  130. package/skills/engineering/ensure-coverage/scripts/coverage-ledger.mjs +663 -0
  131. package/skills/engineering/ensure-coverage/scripts/design-parity.mjs +591 -0
  132. package/skills/engineering/ensure-coverage/scripts/evidence-block.mjs +367 -0
  133. package/skills/engineering/ensure-coverage/scripts/lint-tests.mjs +269 -0
  134. package/skills/engineering/ensure-coverage/scripts/mock-policy-config.mjs +176 -0
  135. package/skills/engineering/ensure-coverage/scripts/package-lock.json +76 -0
  136. package/skills/engineering/ensure-coverage/scripts/package.json +19 -0
  137. package/skills/engineering/ensure-coverage/scripts/scope-class.mjs +554 -0
  138. package/skills/engineering/harness-runtime/LICENSE +3 -0
  139. package/skills/engineering/harness-runtime/SKILL.md +18 -0
  140. package/skills/engineering/harness-runtime/agents/openai.yaml +6 -0
  141. package/skills/engineering/harness-runtime/bin/discover-models.mjs +4 -0
  142. package/skills/engineering/harness-runtime/bin/model-catalog.mjs +4 -0
  143. package/skills/engineering/harness-runtime/contracts.md +15 -0
  144. package/skills/engineering/harness-runtime/discover-models.mjs +392 -0
  145. package/skills/engineering/harness-runtime/fixtures/native-question-schemas.json +33 -0
  146. package/skills/engineering/harness-runtime/fixtures/question-responses.json +54 -0
  147. package/skills/engineering/harness-runtime/index.mjs +767 -0
  148. package/skills/engineering/harness-runtime/model-catalog.mjs +787 -0
  149. package/skills/engineering/harness-runtime/native-question-contracts.md +37 -0
  150. package/skills/engineering/harness-runtime/references/model-catalog-seed.json +159 -0
  151. package/skills/engineering/harness-runtime/references/model-catalog.md +57 -0
  152. package/skills/engineering/implement-and-pr/LICENSE +3 -0
  153. package/skills/engineering/implement-and-pr/SKILL.md +176 -0
  154. package/skills/engineering/implement-and-pr/references/ci-iteration.md +10 -0
  155. package/skills/engineering/implement-and-pr/references/closeout.md +27 -0
  156. package/skills/engineering/implement-and-pr/references/contract-complete-fix-rounds.md +34 -0
  157. package/skills/engineering/implement-and-pr/references/evidence-rules.md +39 -0
  158. package/skills/engineering/implement-and-pr/references/incremental-plan.md +16 -0
  159. package/skills/engineering/implement-and-pr/references/self-review.md +23 -0
  160. package/skills/engineering/implement-and-pr/references/tdd-mode.md +18 -0
  161. package/skills/engineering/resolve-issues/LICENSE +3 -0
  162. package/skills/engineering/resolve-issues/SKILL.md +167 -0
  163. package/skills/engineering/resolve-issues/generated/workflow-repair-policy.json +448 -0
  164. package/skills/engineering/resolve-issues/references/breaker.md +82 -0
  165. package/skills/engineering/resolve-issues/references/deliverables.md +27 -0
  166. package/skills/engineering/resolve-issues/references/delivery.md +108 -0
  167. package/skills/engineering/resolve-issues/references/evidence-lane.md +21 -0
  168. package/skills/engineering/resolve-issues/references/exact-head-ci.md +287 -0
  169. package/skills/engineering/resolve-issues/references/fan-out.md +33 -0
  170. package/skills/engineering/resolve-issues/references/finalization.md +68 -0
  171. package/skills/engineering/resolve-issues/references/guarantees.md +10 -0
  172. package/skills/engineering/resolve-issues/references/high-risk.md +29 -0
  173. package/skills/engineering/resolve-issues/references/incidents/848/README.md +156 -0
  174. package/skills/engineering/resolve-issues/references/intake.md +86 -0
  175. package/skills/engineering/resolve-issues/references/integration-gate.md +53 -0
  176. package/skills/engineering/resolve-issues/references/interference.md +87 -0
  177. package/skills/engineering/resolve-issues/references/loop.md +134 -0
  178. package/skills/engineering/resolve-issues/references/model-catalog.md +9 -0
  179. package/skills/engineering/resolve-issues/references/postmortem.md +27 -0
  180. package/skills/engineering/resolve-issues/references/pre-flight-model-slots.md +41 -0
  181. package/skills/engineering/resolve-issues/references/pre-flight-recording-and-checkout.md +48 -0
  182. package/skills/engineering/resolve-issues/references/pre-flight.md +41 -0
  183. package/skills/engineering/resolve-issues/references/regression-checklist.md +26 -0
  184. package/skills/engineering/resolve-issues/references/run-state.md +288 -0
  185. package/skills/engineering/resolve-issues/references/sandboxed-testing.md +48 -0
  186. package/skills/engineering/resolve-issues/references/spawn-contract.md +96 -0
  187. package/skills/engineering/resolve-issues/references/terminal-evidence-journal.md +40 -0
  188. package/skills/engineering/resolve-issues/references/why.md +653 -0
  189. package/skills/engineering/resolve-issues/schemas/fix-round.schema.json +49 -0
  190. package/skills/engineering/resolve-issues/scripts/combine-and-verify.mjs +721 -0
  191. package/skills/engineering/resolve-issues/scripts/component-candidate.mjs +962 -0
  192. package/skills/engineering/resolve-issues/scripts/contract-revision.mjs +220 -0
  193. package/skills/engineering/resolve-issues/scripts/detect-delivery-mode.mjs +420 -0
  194. package/skills/engineering/resolve-issues/scripts/detect-target-branch.mjs +256 -0
  195. package/skills/engineering/resolve-issues/scripts/detect-workspace-mode.mjs +168 -0
  196. package/skills/engineering/resolve-issues/scripts/discover-models.mjs +9 -0
  197. package/skills/engineering/resolve-issues/scripts/doctrine.mjs +62 -0
  198. package/skills/engineering/resolve-issues/scripts/evidence-lifecycle-contract.mjs +191 -0
  199. package/skills/engineering/resolve-issues/scripts/exact-head-ci.mjs +413 -0
  200. package/skills/engineering/resolve-issues/scripts/exact-head-github-provider.mjs +332 -0
  201. package/skills/engineering/resolve-issues/scripts/finalize.mjs +488 -0
  202. package/skills/engineering/resolve-issues/scripts/fix-rounds.mjs +3307 -0
  203. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-circular-1001.json +16 -0
  204. package/skills/engineering/resolve-issues/scripts/fixtures/evidence-lifecycle-valid-sequencing.json +51 -0
  205. package/skills/engineering/resolve-issues/scripts/fixtures/fmm-express-830-component-candidate.json +17 -0
  206. package/skills/engineering/resolve-issues/scripts/fixtures/head-check-set-1081.json +166 -0
  207. package/skills/engineering/resolve-issues/scripts/gate-value-series.mjs +92 -0
  208. package/skills/engineering/resolve-issues/scripts/guide-index.mjs +73 -0
  209. package/skills/engineering/resolve-issues/scripts/head-check-set.mjs +159 -0
  210. package/skills/engineering/resolve-issues/scripts/interference.mjs +427 -0
  211. package/skills/engineering/resolve-issues/scripts/model-catalog.mjs +9 -0
  212. package/skills/engineering/resolve-issues/scripts/next-operations.mjs +419 -0
  213. package/skills/engineering/resolve-issues/scripts/postmortem.mjs +909 -0
  214. package/skills/engineering/resolve-issues/scripts/preflight-questions.mjs +322 -0
  215. package/skills/engineering/resolve-issues/scripts/reconcile-contained-unit-prs.mjs +415 -0
  216. package/skills/engineering/resolve-issues/scripts/release-state-contract.mjs +697 -0
  217. package/skills/engineering/resolve-issues/scripts/report.mjs +494 -0
  218. package/skills/engineering/resolve-issues/scripts/required-check-plan.mjs +172 -0
  219. package/skills/engineering/resolve-issues/scripts/round-metadata.mjs +79 -0
  220. package/skills/engineering/resolve-issues/scripts/run-state-review6-cases.mjs +334 -0
  221. package/skills/engineering/resolve-issues/scripts/run-state.mjs +4784 -0
  222. package/skills/engineering/resolve-issues/scripts/sandbox-selftest.mjs +395 -0
  223. package/skills/engineering/resolve-issues/scripts/spawn-contract.mjs +290 -0
  224. package/skills/engineering/resolve-issues/scripts/terminal-dispositions.mjs +170 -0
  225. package/skills/engineering/resolve-issues/scripts/terminal-evidence-journal.mjs +293 -0
  226. package/skills/engineering/resolve-issues/scripts/unit-kind.mjs +197 -0
  227. package/skills/engineering/resolve-issues/scripts/unit-lifecycle.mjs +127 -0
  228. package/skills/engineering/resolve-issues/scripts/watch-delivery.mjs +893 -0
  229. package/skills/engineering/resolve-issues/scripts/workspaces.mjs +829 -0
  230. package/skills/engineering/resolve-issues/workflows/independent-review.workflow.js +290 -0
  231. package/skills/engineering/resolve-issues/workflows/prior-art-scan.workflow.js +80 -0
  232. package/skills/engineering/resolve-issues/workflows/workflow-smoke.mjs +102 -0
  233. package/skills/engineering/resolve-release/LICENSE +3 -0
  234. package/skills/engineering/resolve-release/SKILL.md +112 -0
  235. package/skills/engineering/resolve-release/references/assembly.md +137 -0
  236. package/skills/engineering/resolve-release/references/auto-when-green.md +56 -0
  237. package/skills/engineering/resolve-release/references/candidate.md +167 -0
  238. package/skills/engineering/resolve-release/references/exposure.md +178 -0
  239. package/skills/engineering/resolve-release/references/handoff.md +24 -0
  240. package/skills/engineering/resolve-release/references/postmortem.md +230 -0
  241. package/skills/engineering/resolve-release/references/preflight.md +207 -0
  242. package/skills/engineering/resolve-release/references/principles.md +94 -0
  243. package/skills/engineering/resolve-release/references/regression-checklist.md +36 -0
  244. package/skills/engineering/resolve-release/references/related-skills.md +12 -0
  245. package/skills/engineering/resolve-release/references/routing.md +149 -0
  246. package/skills/engineering/resolve-release/references/verified-sha-github-flow.md +285 -0
  247. package/skills/engineering/resolve-release/references/versioning.md +202 -0
  248. package/skills/engineering/resolve-release/references/why.md +53 -0
  249. package/skills/engineering/resolve-release/scripts/adapter-completion-artifact.mjs +389 -0
  250. package/skills/engineering/resolve-release/scripts/build-changes.mjs +209 -0
  251. package/skills/engineering/resolve-release/scripts/candidate-hygiene.mjs +407 -0
  252. package/skills/engineering/resolve-release/scripts/candidate-identity.mjs +904 -0
  253. package/skills/engineering/resolve-release/scripts/candidate-traffic.mjs +81 -0
  254. package/skills/engineering/resolve-release/scripts/checked-adapter-loader.mjs +612 -0
  255. package/skills/engineering/resolve-release/scripts/close-attempt.mjs +135 -0
  256. package/skills/engineering/resolve-release/scripts/closeout-release.mjs +161 -0
  257. package/skills/engineering/resolve-release/scripts/doctrine.mjs +106 -0
  258. package/skills/engineering/resolve-release/scripts/durable-processing.mjs +522 -0
  259. package/skills/engineering/resolve-release/scripts/ensure-target-green.mjs +659 -0
  260. package/skills/engineering/resolve-release/scripts/evidence-bundle.mjs +1014 -0
  261. package/skills/engineering/resolve-release/scripts/finalize-release.mjs +526 -0
  262. package/skills/engineering/resolve-release/scripts/fixtures/durable-processing-adapter.mjs +169 -0
  263. package/skills/engineering/resolve-release/scripts/green-gate.mjs +599 -0
  264. package/skills/engineering/resolve-release/scripts/isolated-adapter-evaluator.mjs +752 -0
  265. package/skills/engineering/resolve-release/scripts/metadata-pr-status.mjs +56 -0
  266. package/skills/engineering/resolve-release/scripts/metadata-sync.mjs +1538 -0
  267. package/skills/engineering/resolve-release/scripts/postmortem.mjs +381 -0
  268. package/skills/engineering/resolve-release/scripts/preflight-probes.mjs +498 -0
  269. package/skills/engineering/resolve-release/scripts/production-endpoints.mjs +326 -0
  270. package/skills/engineering/resolve-release/scripts/rc-circuit-breaker.mjs +272 -0
  271. package/skills/engineering/resolve-release/scripts/report.mjs +417 -0
  272. package/skills/engineering/resolve-release/scripts/reprobe-credentials.mjs +114 -0
  273. package/skills/engineering/resolve-release/scripts/revalidate-candidate.mjs +238 -0
  274. package/skills/engineering/resolve-release/scripts/review-packet.mjs +503 -0
  275. package/skills/engineering/resolve-release/scripts/rollback-floor.mjs +263 -0
  276. package/skills/engineering/resolve-release/scripts/version-assert.mjs +339 -0
  277. package/skills/engineering/resolve-release/scripts/version-postmortem.mjs +485 -0
  278. package/skills/engineering/resolve-release/scripts/version.mjs +1199 -0
  279. package/skills/engineering/resolve-release/scripts/watch-candidate-delivery.mjs +449 -0
  280. package/skills/engineering/resolve-release/vendor/ACORN-LICENSE +21 -0
  281. package/skills/engineering/resolve-release/vendor/README.md +60 -0
  282. package/skills/engineering/resolve-release/vendor/acorn.mjs +6233 -0
  283. package/skills/engineering/resolve-release/vendor/quickjs/core/LICENSE +21 -0
  284. package/skills/engineering/resolve-release/vendor/quickjs/core/README.md +341 -0
  285. package/skills/engineering/resolve-release/vendor/quickjs/core/README.template.md +70 -0
  286. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs +2 -0
  287. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-TAV5CUKK.mjs.map +1 -0
  288. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs +7 -0
  289. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/chunk-V2S4ZYJR.mjs.map +1 -0
  290. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.mts +2033 -0
  291. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.d.ts +2033 -0
  292. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js +7 -0
  293. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.js.map +1 -0
  294. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs +2 -0
  295. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/index.mjs.map +1 -0
  296. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs +2 -0
  297. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-ES6BEMUI.mjs.map +1 -0
  298. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs +2 -0
  299. package/skills/engineering/resolve-release/vendor/quickjs/core/dist/module-asyncify-2EFITU5U.mjs.map +1 -0
  300. package/skills/engineering/resolve-release/vendor/quickjs/core/package.json +49 -0
  301. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/LICENSE +21 -0
  302. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/README.md +5 -0
  303. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.mts +549 -0
  304. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.d.ts +549 -0
  305. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js +2 -0
  306. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.js.map +1 -0
  307. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs +2 -0
  308. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/dist/index.mjs.map +1 -0
  309. package/skills/engineering/resolve-release/vendor/quickjs/ffi-types/package.json +36 -0
  310. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/LICENSE +47 -0
  311. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/README.md +82 -0
  312. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.d.ts +11 -0
  313. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.browser.mjs +22 -0
  314. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cjs +21 -0
  315. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.cjs +21 -0
  316. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.cloudflare.d.ts +11 -0
  317. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.d.ts +11 -0
  318. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.mjs +25 -0
  319. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/emscripten-module.wasm +0 -0
  320. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.mts +85 -0
  321. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.d.ts +85 -0
  322. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js +2 -0
  323. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.js.map +1 -0
  324. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs +2 -0
  325. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/ffi.mjs.map +1 -0
  326. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.mts +20 -0
  327. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.d.ts +20 -0
  328. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js +2 -0
  329. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.js.map +1 -0
  330. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs +2 -0
  331. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/dist/index.mjs.map +1 -0
  332. package/skills/engineering/resolve-release/vendor/quickjs/release-sync/package.json +61 -0
  333. package/skills/engineering/review-pr/LICENSE +3 -0
  334. package/skills/engineering/review-pr/SKILL.md +123 -0
  335. package/skills/engineering/review-pr/references/adversarial-reviewer-prompt.md +42 -0
  336. package/skills/engineering/review-pr/references/code-correctness.md +5 -0
  337. package/skills/engineering/review-pr/references/contract-freshness.md +9 -0
  338. package/skills/engineering/review-pr/references/coordination.md +18 -0
  339. package/skills/engineering/review-pr/references/domain-hazards.md +123 -0
  340. package/skills/engineering/review-pr/references/finding-themes.md +7 -0
  341. package/skills/engineering/review-pr/references/github-posting.md +98 -0
  342. package/skills/engineering/review-pr/references/golden-path-smoke.md +5 -0
  343. package/skills/engineering/review-pr/references/incremental-output.md +16 -0
  344. package/skills/engineering/review-pr/references/inputs-and-discovery.md +31 -0
  345. package/skills/engineering/review-pr/references/output-format.md +99 -0
  346. package/skills/engineering/review-pr/references/over-mock-screen.md +7 -0
  347. package/skills/engineering/review-pr/references/promotion-prs.md +16 -0
  348. package/skills/engineering/review-pr/references/re-review.md +18 -0
  349. package/skills/engineering/review-pr/references/review-method.md +199 -0
  350. package/skills/engineering/review-pr/references/review-mode.md +30 -0
  351. package/skills/engineering/review-pr/references/review-posture.md +53 -0
  352. package/skills/engineering/review-pr/references/round1-depth.md +62 -0
  353. package/skills/engineering/review-pr/references/scripts.md +17 -0
  354. package/skills/engineering/review-pr/references/workflow.md +16 -0
  355. package/skills/engineering/review-pr/schemas/findings.schema.json +282 -0
  356. package/skills/engineering/review-pr/scripts/finding-contract.mjs +285 -0
  357. package/skills/engineering/review-pr/scripts/post-review.mjs +405 -0
  358. package/skills/engineering/review-pr/scripts/pr-context.mjs +207 -0
  359. package/skills/engineering/review-pr/scripts/scan-diff.mjs +365 -0
  360. package/skills/engineering/review-pr/scripts/theme-contract.mjs +57 -0
  361. package/skills/engineering/smoke/LICENSE +3 -0
  362. package/skills/engineering/smoke/SKILL.md +131 -0
  363. package/skills/engineering/smoke/assets/smoke.manifest.example.json +53 -0
  364. package/skills/engineering/smoke/references/manifest.md +192 -0
  365. package/skills/engineering/smoke/scripts/smoke.mjs +713 -0
  366. package/skills/fullstack/better-auth/LICENSE +3 -0
  367. package/skills/fullstack/better-auth/SKILL.md +601 -0
  368. package/skills/fullstack/better-auth/references/feishu-api.md +270 -0
  369. package/skills/fullstack/monorepo/LICENSE +3 -0
  370. package/skills/fullstack/monorepo/SKILL.md +465 -0
  371. package/skills/fullstack/nextjs-fullstack/LICENSE +3 -0
  372. package/skills/fullstack/nextjs-fullstack/SKILL.md +210 -0
  373. package/skills/fullstack/nextjs-fullstack/conventions.md +318 -0
  374. package/skills/fullstack/nextjs-fullstack/frontend-conventions.md +61 -0
  375. package/skills/fullstack/nextjs-fullstack/nextjs16.md +287 -0
  376. package/skills/fullstack/nextjs-fullstack/server-actions.md +409 -0
  377. package/skills/fullstack/prisma-setup/LICENSE +3 -0
  378. package/skills/fullstack/prisma-setup/SKILL.md +180 -0
  379. package/skills/fullstack/prisma-setup/nextjs.md +258 -0
  380. package/skills/fullstack/prisma-setup/turborepo.md +301 -0
  381. package/skills/fullstack/shadcn/LICENSE +3 -0
  382. package/skills/fullstack/shadcn/SKILL.md +119 -0
  383. package/skills/fullstack/shadcn/assets/shadcn-small.png +0 -0
  384. package/skills/fullstack/shadcn/assets/shadcn.png +0 -0
  385. package/skills/fullstack/shadcn/cli.md +411 -0
  386. package/skills/fullstack/shadcn/customization.md +224 -0
  387. package/skills/fullstack/shadcn/evals/evals.json +90 -0
  388. package/skills/fullstack/shadcn/mcp.md +101 -0
  389. package/skills/fullstack/shadcn/rules/base-vs-radix.md +323 -0
  390. package/skills/fullstack/shadcn/rules/component-selection.md +67 -0
  391. package/skills/fullstack/shadcn/rules/composition.md +195 -0
  392. package/skills/fullstack/shadcn/rules/data-table.md +201 -0
  393. package/skills/fullstack/shadcn/rules/forms.md +255 -0
  394. package/skills/fullstack/shadcn/rules/icons.md +103 -0
  395. package/skills/fullstack/shadcn/rules/styling.md +167 -0
  396. package/skills/fullstack/zod-v4/LICENSE +3 -0
  397. package/skills/fullstack/zod-v4/SKILL.md +287 -0
@@ -0,0 +1,3 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1AboveIO
@@ -0,0 +1,601 @@
1
+ ---
2
+ name: better-auth
3
+ description: "Add or debug Better Auth in a Next.js App Router app: login flows, sessions, protected routes, middleware, OAuth providers (incl. Feishu/Lark via genericOAuth), cookies, callback handlers, Prisma schema requirements, NextAuth/Auth.js migration."
4
+ ---
5
+
6
+ # Better Auth for Next.js
7
+
8
+ **Better Auth** | **Next.js App Router** | **React 19**
9
+
10
+ ---
11
+
12
+ ## Auth Strategy Matrix
13
+
14
+ | Action | Source | Method |
15
+ |--------|--------|--------|
16
+ | Get session | RSC (server) | `getSession()` wrapper |
17
+ | Get session | Client component | Session React context |
18
+ | Get preferences | RSC (server) | Direct DB / wrapper |
19
+ | Get preferences | Client component | Session context |
20
+ | Update preferences | RSC / client | Server actions + `router.refresh()` |
21
+
22
+ ---
23
+
24
+ ## Setup
25
+
26
+ ### Installation
27
+
28
+ ```bash
29
+ npm install better-auth
30
+ ```
31
+
32
+ ### Environment Variables
33
+
34
+ ```env
35
+ DATABASE_URL="your-database-url"
36
+ BETTER_AUTH_SECRET="your-secret-key"
37
+ NEXT_PUBLIC_APP_URL="http://localhost:3000"
38
+ ```
39
+
40
+ ### Run Migrations
41
+
42
+ ```bash
43
+ npx better-auth migrate
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Core Configuration
49
+
50
+ ### Server Auth (lib/auth.ts)
51
+
52
+ ```typescript
53
+ import { betterAuth } from "better-auth"
54
+
55
+ export const auth = betterAuth({
56
+ database: {
57
+ provider: "postgres",
58
+ url: process.env.DATABASE_URL,
59
+ },
60
+ emailAndPassword: {
61
+ enabled: true,
62
+ },
63
+ // Add OAuth providers as needed
64
+ })
65
+ ```
66
+
67
+ ### API Route Handler
68
+
69
+ ```typescript
70
+ // app/api/auth/[...all]/route.ts
71
+ import { auth } from "@/lib/auth"
72
+
73
+ export const { GET, POST } = auth.handler()
74
+ ```
75
+
76
+ ### Client Auth (lib/auth-client.ts)
77
+
78
+ ```typescript
79
+ import { createAuthClient } from "better-auth/client"
80
+
81
+ export const authClient = createAuthClient({
82
+ baseURL: process.env.NEXT_PUBLIC_APP_URL,
83
+ })
84
+ ```
85
+
86
+ ---
87
+
88
+ ## NextAuth Migration Mappings
89
+
90
+ ### Client-side Sign In
91
+
92
+ ```typescript
93
+ // Before (NextAuth)
94
+ import { signIn } from "next-auth/react"
95
+ await signIn("github")
96
+
97
+ // After (Better Auth)
98
+ import { authClient } from "@/lib/auth-client"
99
+ const { data, error } = await authClient.signIn.social({
100
+ provider: "github",
101
+ })
102
+ ```
103
+
104
+ ### Client-side Sign Out
105
+
106
+ ```typescript
107
+ // Before
108
+ import { signOut } from "next-auth/react"
109
+ await signOut()
110
+
111
+ // After
112
+ import { authClient } from "@/lib/auth-client"
113
+ const { data, error } = await authClient.signOut()
114
+ ```
115
+
116
+ ### Client-side Session
117
+
118
+ ```typescript
119
+ // Before
120
+ import { useSession } from "next-auth/react"
121
+ const { data, status } = useSession()
122
+
123
+ // After
124
+ import { authClient } from "@/lib/auth-client"
125
+ const { data, isPending, error } = authClient.useSession?.() ?? {}
126
+ ```
127
+
128
+ ### Server-side Sign In
129
+
130
+ ```typescript
131
+ // Before
132
+ import { signIn } from "@/lib/auth"
133
+ await signIn("github")
134
+
135
+ // After
136
+ import { auth } from "@/lib/auth"
137
+ const { redirect, url } = await auth.api.signInSocial({
138
+ body: { provider: "github" },
139
+ })
140
+ ```
141
+
142
+ ### Server-side Sign Out
143
+
144
+ ```typescript
145
+ // Before
146
+ import { signOut } from "@/lib/auth"
147
+ await signOut()
148
+
149
+ // After
150
+ import { auth } from "@/lib/auth"
151
+ import { headers } from "next/headers"
152
+ const { success } = await auth.api.signOut({
153
+ headers: await headers(),
154
+ })
155
+ ```
156
+
157
+ ### Server-side Session
158
+
159
+ ```typescript
160
+ // Before
161
+ import { auth } from "@/lib/auth"
162
+ const session = await auth()
163
+
164
+ // After
165
+ import { auth } from "@/lib/auth"
166
+ import { headers } from "next/headers"
167
+ const session = await auth.api.getSession({
168
+ headers: await headers(),
169
+ })
170
+ ```
171
+
172
+ ---
173
+
174
+ ## Session Enrichment Pattern
175
+
176
+ ### Server-side Wrapper (lib/auth-server.ts)
177
+
178
+ ```typescript
179
+ "use server"
180
+
181
+ import { auth } from "./auth"
182
+ import { headers } from "next/headers"
183
+ import { db } from "./db"
184
+
185
+ export async function getSession() {
186
+ const session = await auth.api.getSession({
187
+ headers: await headers(),
188
+ })
189
+
190
+ if (!session) return null
191
+
192
+ const userData = await db.user.findUnique({
193
+ where: { id: session.user.id },
194
+ include: {
195
+ profile: true,
196
+ preferences: true,
197
+ },
198
+ })
199
+
200
+ return {
201
+ ...session,
202
+ user: {
203
+ ...session.user,
204
+ ...userData,
205
+ },
206
+ }
207
+ }
208
+ ```
209
+
210
+ ### Session Context Provider (React 19)
211
+
212
+ ```tsx
213
+ // context/session-context.tsx
214
+ "use client"
215
+
216
+ import { createContext, useContext, ReactNode, use } from "react"
217
+ import type { getSession } from "@/lib/auth-server"
218
+
219
+ type EnrichedSession = Awaited<ReturnType<typeof getSession>>
220
+
221
+ const SessionContext = createContext<EnrichedSession | null>(null)
222
+
223
+ export function SessionProvider({
224
+ children,
225
+ sessionPromise,
226
+ }: {
227
+ children: ReactNode
228
+ sessionPromise: Promise<EnrichedSession>
229
+ }) {
230
+ const session = use(sessionPromise) // React 19 pattern
231
+
232
+ return (
233
+ <SessionContext.Provider value={session}>
234
+ {children}
235
+ </SessionContext.Provider>
236
+ )
237
+ }
238
+
239
+ export function useSession() {
240
+ const context = useContext(SessionContext)
241
+ if (context === undefined) {
242
+ throw new Error("useSession must be used within SessionProvider")
243
+ }
244
+ return context
245
+ }
246
+ ```
247
+
248
+ ### Root Layout Integration
249
+
250
+ ```tsx
251
+ // app/layout.tsx
252
+ import { SessionProvider } from "@/context/session-context"
253
+ import { getSession } from "@/lib/auth-server"
254
+
255
+ export default async function RootLayout({
256
+ children,
257
+ }: {
258
+ children: React.ReactNode
259
+ }) {
260
+ const sessionPromise = getSession()
261
+
262
+ return (
263
+ <html lang="en">
264
+ <body>
265
+ <SessionProvider sessionPromise={sessionPromise}>
266
+ {children}
267
+ </SessionProvider>
268
+ </body>
269
+ </html>
270
+ )
271
+ }
272
+ ```
273
+
274
+ ### Usage in Client Components
275
+
276
+ ```tsx
277
+ "use client"
278
+
279
+ import { useSession } from "@/context/session-context"
280
+
281
+ export function UserProfile() {
282
+ const session = useSession()
283
+
284
+ if (!session) return <div>Not logged in</div>
285
+
286
+ return (
287
+ <div>
288
+ <h1>Welcome, {session.user.name}</h1>
289
+ <p>Theme: {session.user.preferences?.theme}</p>
290
+ </div>
291
+ )
292
+ }
293
+ ```
294
+
295
+ ---
296
+
297
+ ## Protected Routes
298
+
299
+ ### Client-side Protection
300
+
301
+ ```tsx
302
+ "use client"
303
+
304
+ import { authClient } from "@/lib/auth-client"
305
+ import { redirect } from "next/navigation"
306
+
307
+ export default function DashboardPage() {
308
+ const { data, error, isPending } = authClient.useSession?.() ?? {}
309
+
310
+ if (isPending) return <div>Loading...</div>
311
+ if (!data || error) redirect("/sign-in")
312
+
313
+ return <div>Welcome {data.user.name}</div>
314
+ }
315
+ ```
316
+
317
+ ### Server-side Protection
318
+
319
+ ```tsx
320
+ import { auth } from "@/lib/auth"
321
+ import { headers } from "next/headers"
322
+ import { redirect } from "next/navigation"
323
+
324
+ export default async function DashboardPage() {
325
+ const session = await auth.api.getSession({
326
+ headers: await headers(),
327
+ })
328
+
329
+ if (!session) redirect("/sign-in")
330
+
331
+ return <div>Welcome {session.user.name}</div>
332
+ }
333
+ ```
334
+
335
+ ---
336
+
337
+ ## Preferences Update Pattern
338
+
339
+ ```tsx
340
+ "use client"
341
+
342
+ import { useRouter } from "next/navigation"
343
+ import { updateUserPreferences } from "@/lib/actions"
344
+
345
+ export function UpdatePreferences() {
346
+ const router = useRouter()
347
+
348
+ async function handleUpdate(preferences: any) {
349
+ await updateUserPreferences(preferences)
350
+ router.refresh() // Refetch session via layout
351
+ }
352
+
353
+ return (
354
+ <button onClick={() => handleUpdate({ theme: "dark" })}>
355
+ Update Theme
356
+ </button>
357
+ )
358
+ }
359
+ ```
360
+
361
+ ---
362
+
363
+ ## File Structure
364
+
365
+ ```
366
+ app/
367
+ ├── api/
368
+ │ └── auth/
369
+ │ └── [...all]/
370
+ │ └── route.ts # Better Auth handler
371
+ ├── (auth)/
372
+ │ ├── login/
373
+ │ │ └── page.tsx
374
+ │ ├── register/
375
+ │ │ └── page.tsx
376
+ │ └── layout.tsx
377
+ └── dashboard/
378
+ └── page.tsx # Protected route
379
+ lib/
380
+ ├── auth.ts # Server config
381
+ ├── auth-client.ts # Client instance
382
+ └── auth-server.ts # Enriched session wrapper
383
+ context/
384
+ └── session-context.tsx # Provider + hook
385
+ ```
386
+
387
+ ---
388
+
389
+ ## Database Model Changes (from NextAuth)
390
+
391
+ | NextAuth | Better Auth |
392
+ |----------|-------------|
393
+ | `sessionToken` | `token` |
394
+ | `expires` | `expiresAt` |
395
+ | `emailVerified` (Date) | `emailVerified` (boolean) |
396
+
397
+ Additional Better Auth fields:
398
+ - `ipAddress`, `userAgent` on Session
399
+ - `createdAt`, `updatedAt` on all models
400
+ - `password` field on Account for credentials
401
+
402
+ ---
403
+
404
+ ## Rules
405
+
406
+ 1. **Server session:** Always use `getSession()` from `lib/auth-server.ts`
407
+ 2. **Client session:** Always use `useSession()` from context
408
+ 3. **Single source of truth:** Don't re-fetch user data inconsistently
409
+ 4. **Type safety:** Infer types from `getSession` return type
410
+ 5. **Prefer async RSC patterns** and `use()` in appropriate boundaries
411
+
412
+ ---
413
+
414
+
415
+ # Feishu + Better Auth OAuth Integration
416
+
417
+ Integrate Feishu (飞书) / Lark OAuth login with Better Auth in Next.js using the `genericOAuth` plugin.
418
+
419
+ ## Architecture
420
+
421
+ ```
422
+ Browser → /api/auth/sign-in/social {provider:"feishu"}
423
+ → 302 → accounts.feishu.cn/open-apis/authen/v1/authorize
424
+ → user approves → callback with ?code=...
425
+ → Better Auth exchanges code for token (POST tokenUrl)
426
+ → Better Auth calls getUserInfo → creates/links user + account
427
+ → session cookie set → redirect to app
428
+ ```
429
+
430
+ ## Prerequisites
431
+
432
+ - Better Auth v1.5+ with `genericOAuth` plugin
433
+ - Feishu App (Internal Enterprise or Marketplace) with **Web Application** capability enabled
434
+ - `verification` table in DB (required by genericOAuth plugin)
435
+
436
+ ## Step 1 — Feishu App Setup
437
+
438
+ 1. Create app at [Feishu Open Platform](https://open.feishu.cn/app)
439
+ 2. Enable **Web Application** capability (Security Settings → Redirect URLs)
440
+ 3. Add redirect URL: `https://<your-domain>/api/auth/oauth2/callback/feishu`
441
+ 4. Note your **App ID** (`cli_xxx`) and **App Secret**
442
+ 5. Request scopes:
443
+ - `contact:user.email:readonly` — **requires admin approval** (高级权限: Enable → Create version → Submit → Admin approve)
444
+
445
+ > ⚠️ Until email permission is approved, Feishu returns empty string `""` for email (not omitted). Use fallback pattern.
446
+
447
+ ## Step 2 — Server Auth Config
448
+
449
+ ```typescript
450
+ // src/lib/auth.ts
451
+ import { betterAuth } from "better-auth";
452
+ import { prismaAdapter } from "@better-auth/prisma-adapter";
453
+ import { genericOAuth } from "better-auth/plugins";
454
+ import prisma from "@/lib/db";
455
+
456
+ const FEISHU_BASE = process.env.FEISHU_BASE_URL ?? "feishu.cn";
457
+
458
+ export const auth = betterAuth({
459
+ database: prismaAdapter(prisma, { provider: "postgresql" }),
460
+ emailAndPassword: { enabled: true },
461
+ session: {
462
+ expiresIn: 60 * 60 * 24 * 7,
463
+ updateAge: 60 * 60 * 24,
464
+ },
465
+ trustedOrigins: [
466
+ process.env.NEXT_PUBLIC_APP_URL ?? "http://localhost:3000",
467
+ ],
468
+ plugins: [
469
+ genericOAuth({
470
+ config: [
471
+ {
472
+ providerId: "feishu",
473
+ clientId: process.env.FEISHU_APP_ID!,
474
+ clientSecret: process.env.FEISHU_APP_SECRET!,
475
+ authorizationUrl: `https://accounts.${FEISHU_BASE}/open-apis/authen/v1/authorize`,
476
+ tokenUrl: `https://open.${FEISHU_BASE}/open-apis/authen/v2/oauth/token`,
477
+ scopes: ["contact:user.email:readonly"],
478
+ authentication: "post",
479
+ getUserInfo: async (tokens) => {
480
+ const res = await fetch(
481
+ `https://open.${FEISHU_BASE}/open-apis/authen/v1/user_info`,
482
+ { headers: { Authorization: `Bearer ${tokens.accessToken}` } },
483
+ );
484
+ if (!res.ok) throw new Error(`Feishu userinfo failed: ${res.status}`);
485
+ const json = await res.json();
486
+ const profile = json.data || json;
487
+ return {
488
+ id: profile.open_id,
489
+ name: profile.name || profile.en_name,
490
+ email: profile.email || `${profile.open_id}@feishu.local`,
491
+ image: profile.avatar_url,
492
+ emailVerified: false,
493
+ };
494
+ },
495
+ },
496
+ ],
497
+ }),
498
+ ],
499
+ });
500
+ ```
501
+
502
+ ### Critical details
503
+
504
+ - **`authentication: "post"`** — Feishu token endpoint requires `client_id`/`client_secret` in JSON body (not Basic auth header)
505
+ - **`getUserInfo` over `mapProfileToUser`** — when `getUserInfo` is provided, `mapProfileToUser` is ignored; don't use both
506
+ - **`tokens.accessToken`** — Better Auth normalizes to camelCase; NOT `access_token`
507
+ - **`json.data`** — Feishu nests all user info under a `data` key; unwrap exactly once
508
+ - **`emailVerified: false`** — must be Boolean, not DateTime (Better Auth schema requirement)
509
+ - **Fallback email** — `${open_id}@feishu.local` when email scope not yet approved
510
+
511
+ ## Step 3 — Client Config
512
+
513
+ ```typescript
514
+ // src/lib/auth-client.ts
515
+ import { createAuthClient } from "better-auth/react";
516
+ import { genericOAuthClient } from "better-auth/client/plugins";
517
+
518
+ export const authClient = createAuthClient({
519
+ baseURL: process.env.NEXT_PUBLIC_APP_URL,
520
+ plugins: [genericOAuthClient()],
521
+ });
522
+ ```
523
+
524
+ ## Step 4 — Route Handler
525
+
526
+ ```typescript
527
+ // src/app/api/auth/[...all]/route.ts
528
+ import { toNextJsHandler } from "better-auth/next-js";
529
+ import { auth } from "@/lib/auth";
530
+
531
+ export const { GET, POST } = toNextJsHandler(auth);
532
+ ```
533
+
534
+ > ⚠️ **Must use `toNextJsHandler`** from `better-auth/next-js`. Manual `auth.handler(req as unknown as Request)` breaks in Next.js 16 standalone mode.
535
+
536
+ ## Step 5 — Database Schema
537
+
538
+ See [references/feishu-api.md](references/feishu-api.md) for the complete Prisma models (User, Session, Account, Verification).
539
+
540
+ **Schema gotchas to watch for:**
541
+
542
+ | Issue | Cause | Fix |
543
+ |-------|-------|-----|
544
+ | `emailVerified` insert fails | Schema has `DateTime` not `Boolean` | Migrate: `ALTER COLUMN TYPE BOOLEAN` |
545
+ | Account insert fails | Missing `At` suffix | Rename: `accessTokenExpires` → `accessTokenExpiresAt` |
546
+ | 500 on sign-in | Missing `Verification` model | Add Verification model, run migration |
547
+
548
+ ## Step 6 — Environment Variables
549
+
550
+ ```bash
551
+ # Feishu OAuth
552
+ FEISHU_APP_ID=cli_xxxxxxxxxxxx # From Feishu Dev Console
553
+ FEISHU_APP_SECRET=xxxxxxxxxxxx # Store in Secret Manager — no trailing newline!
554
+ FEISHU_BASE_URL=feishu.cn # or larksuite.com for international
555
+
556
+ # Better Auth
557
+ BETTER_AUTH_SECRET=<random-string>
558
+ BETTER_AUTH_URL=https://your-app.example.com # Required for deployed apps
559
+
560
+ # App URL (compile-time)
561
+ NEXT_PUBLIC_APP_URL=https://your-app.example.com
562
+ ```
563
+
564
+ ### Secret Manager warning
565
+
566
+ When storing secrets via `gcloud secrets versions add`:
567
+ ```bash
568
+ # ✅ CORRECT — no trailing newline
569
+ printf '%s' 'your-secret-value' | gcloud secrets versions add SECRET_NAME --data-file=-
570
+
571
+ # ❌ WRONG — echo/add adds \n which breaks OAuth token exchange
572
+ echo 'your-secret-value' | gcloud secrets versions add SECRET_NAME --data-file=-
573
+ ```
574
+
575
+ ## Step 7 — Trigger Login
576
+
577
+ ```typescript
578
+ // In a React component
579
+ import { authClient } from "@/lib/auth-client";
580
+
581
+ const handleFeishuLogin = () => {
582
+ authClient.signIn.social({ provider: "feishu", callbackURL: "/" });
583
+ };
584
+ ```
585
+
586
+ ## Troubleshooting
587
+
588
+ | Symptom | Cause | Fix |
589
+ |---------|-------|-----|
590
+ | `email_is_missing` or empty email | `contact:user.email:readonly` not approved | Request admin approval; use `@feishu.local` fallback |
591
+ | Token exchange fails | Trailing `\n` in app secret | Re-create secret with `printf '%s'` |
592
+ | 404 on `/api/auth/*` | Missing `toNextJsHandler` | Use `better-auth/next-js` adapter, not manual handler |
593
+ | Session not persisting | `BETTER_AUTH_URL` not set | Set env var to deployed URL |
594
+ | Error 20029 | Redirect URL not registered | Add exact callback URL in Feishu app settings |
595
+
596
+ ## References
597
+
598
+ - [Feishu Open Platform](https://open.feishu.cn/app)
599
+ - [Better Auth genericOAuth Plugin](https://www.better-auth.com/docs/plugins/generic-oauth)
600
+ - [Better Auth Next.js Adapter](https://www.better-auth.com/docs/integrations/next-js)
601
+ - **API reference:** [references/feishu-api.md](references/feishu-api.md) — OAuth endpoints, request/response formats, user info fields, error codes, Prisma schema, and Feishu/Lark domain differences. Load this when implementing the OAuth flow or debugging auth errors.