@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,478 @@
1
+ ### 2a. Coord math (don't skip this — most failed taps come from getting it wrong)
2
+
3
+ `adb exec-out screencap -p > snap.png` writes a PNG at the device's full
4
+ logical resolution (**Phase 0.5 preset: 1080×4000**; stock Pixels often
5
+ 1080×2400). When the agent reads the PNG it's downsampled for chat display.
6
+ Scale taps back using the **ADB-reported size**, not the preview thumbnail:
7
+
8
+ ```
9
+ adb shell wm size # authoritative WxH for coord math
10
+ ```
11
+
12
+ To click an element you saw on screen:
13
+
14
+ ```
15
+ real_x = display_x * (device_width / display_width)
16
+ real_y = display_y * (device_height / display_height)
17
+ ```
18
+
19
+ Pass `real_x real_y` to `adb shell input tap`. If a tap appears to do
20
+ nothing, **dump the UI tree** rather than guessing:
21
+
22
+ ```bash
23
+ adb shell "uiautomator dump /sdcard/ui.xml && cat /sdcard/ui.xml" \
24
+ | head -200
25
+ # Search for the bounds="[x1,y1][x2,y2]" of the element you want.
26
+ ```
27
+
28
+ ### 2b. Walk every tab in order
29
+
30
+ For each tab in the bottom navigation:
31
+
32
+ 1. `adb shell input tap <tab_x> <tab_y>` — switch tab
33
+ 2. `sleep 5-7` — let the tab's `useFocusEffect` refetch settle
34
+ 3. `adb exec-out screencap -p > tab-<n>.png`
35
+ 4. `adb logcat -d ReactNativeJS:V '*:S' | grep -iE 'TypeError|Error|column|exception|isZero|getDate|Render Error|Property' | tail -10`
36
+ 5. **Read the screenshot.** Look for:
37
+ - Empty state where data should exist (signed-in user, dataset > 0)
38
+ - "—" / "0" / "undefined" / "NaN" in numeric cells
39
+ - Stuck skeleton (no data after 8s)
40
+ - Error boundary fallback
41
+ - Layout overflow / misaligned text
42
+ 6. **Read logcat.** Any `TypeError`, `column does not exist`, or
43
+ `ErrorBoundary` line is a finding even if the screen looks OK.
44
+
45
+ ### 2c. Drill into one detail row per tab
46
+
47
+ Tab-level screens hide bugs that only show on item detail. For each tab
48
+ that lists items, tap the first real (non-test) row and verify the detail
49
+ screen renders without "Couldn't load that entry" or skeleton lock.
50
+
51
+ ---
52
+
53
+ ## Phase 2.5: Auth area — walk both guest AND signed-in paths
54
+
55
+ > A native budgeting / productivity / journaling app typically supports a
56
+ > **guest path** (local-only, no auth) and a **signed-in path** (cloud
57
+ > sync). They share UI but route through completely different adapters
58
+ > (`localAdapter` vs `cloudAdapter`/PowerSync), so a fix that lands one
59
+ > path commonly regresses the other. **Both must be walked every session.**
60
+
61
+ ### 2.5a. Inventory the auth surface
62
+
63
+ Find the auth entry point and its branches:
64
+
65
+ ```bash
66
+ # Expo Router
67
+ ls apps/<mobile-app>/app/auth/ # index.tsx, callback.tsx, etc.
68
+ # React Navigation
69
+ grep -rn "AuthStack\|SignInScreen\|<Stack.Screen.*name=.\"auth" apps/<mobile-app>/src/
70
+ ```
71
+
72
+ List every auth entry point: magic-link email, OAuth (Apple/Google/etc.),
73
+ passkey, biometric unlock, **and** the guest-mode entry. Note the
74
+ SignedOut → SignedIn transition (`session.refresh()` in Zustand,
75
+ `onAuthStateChange` in Supabase, etc.).
76
+
77
+ ### 2.5b. Cold-start: signed-out auth screen
78
+
79
+ ```bash
80
+ adb shell pm clear <app.id> # nuclear: wipes session + cache
81
+ adb shell am start -n <app.id>/.MainActivity # or deep-link launcher
82
+ sleep 12
83
+ adb exec-out screencap -p > auth-cold.png
84
+ ```
85
+
86
+ The first screen MUST be the auth landing surface (NOT a stuck splash,
87
+ NOT a half-rendered tab bar). Verify visually:
88
+ - All advertised auth methods are present (no missing OAuth button)
89
+ - "Continue as guest" / equivalent is reachable
90
+ - No console warnings about missing OAuth client IDs
91
+
92
+ ### 2.5c. Walk A — guest path
93
+
94
+ 1. Tap "Continue as guest" (`uiautomator dump` for exact bounds, then
95
+ `input tap`).
96
+ 2. Wait for the home/today tab to paint, `screencap`.
97
+ 3. Walk every tab as in Phase 2 — confirm guest data flows through the
98
+ local adapter (no Supabase calls in logcat: `adb logcat -d | grep -i
99
+ "supabase\|fetch.*supabase\|GoTrue"` should be empty post-launch).
100
+ 4. CRUD round-trip (Phase 3) with **`QA-GUEST-`** prefix.
101
+ 5. Verify the row exists in the on-device store (SQLite / MMKV /
102
+ AsyncStorage), NOT in cloud:
103
+ ```text
104
+ execute_sql(query: "select count(*) from <main_table>
105
+ where notes ilike 'QA-GUEST-%'")
106
+ ```
107
+ Expect: `0`. (Guest writes must not hit cloud.)
108
+ 6. Confirm no Sentry events were captured for this guest session that
109
+ reference cloud APIs — if so, a cloud call leaked into the guest path.
110
+
111
+ ### 2.5d. Walk B — signed-in path (via magic link or test creds)
112
+
113
+ 1. From the guest session, find the "Sign in" / "Sync your data" entry
114
+ (often Settings → Sign in, or auth screen → Sign in tab).
115
+ 2. **Magic-link path:**
116
+ - Enter the test email.
117
+ - Use Supabase MCP to retrieve the link from auth.users:
118
+ ```text
119
+ execute_sql(query: "select id, email, last_sign_in_at,
120
+ confirmation_sent_at
121
+ from auth.users
122
+ where email = '<test@…>'
123
+ order by created_at desc limit 1")
124
+ ```
125
+ - For local development, magic-link emails are usually intercepted by
126
+ Supabase Inbucket / Mailpit at `http://localhost:54324` — fetch the
127
+ latest message's HTML and extract the `?token_hash=…&type=magiclink`
128
+ URL. Open it via `adb`:
129
+ ```bash
130
+ adb shell am start -W -a android.intent.action.VIEW \
131
+ -d "<deep-link-from-email>"
132
+ ```
133
+ - Watch logcat for `[supabase] auth state change → SIGNED_IN`.
134
+ 3. **OAuth path (when the test account supports it):**
135
+ - Tap the provider button.
136
+ - Browser intent opens; the in-emulator browser will redirect back via
137
+ the app's deep-link scheme.
138
+ - If the redirect doesn't fire (common on emulators without Play
139
+ Services), record this as a known-failure-on-emulator and use
140
+ magic-link instead.
141
+ 4. After SIGNED_IN, verify the signed-in path:
142
+ - `screencap` shows the post-auth home with **server-truth data**
143
+ (not the empty-state guest UI).
144
+ - Logcat shows TanStack queries firing against the cloud adapter.
145
+ - Run Phase 4 (sync-empty-state checklist) — this is where the
146
+ PowerSync-disabled bug lives and you must confirm cloud-direct
147
+ fallback engages.
148
+ 5. CRUD round-trip with **`QA-CLOUD-`** prefix → SQL must show `1` row.
149
+
150
+ ### 2.5e. Walk C — guest-to-cloud migration (if supported)
151
+
152
+ If the app supports promoting a guest workspace into a cloud workspace
153
+ (common in finance / journal / note apps), test it explicitly:
154
+
155
+ 1. Start fresh: `pm clear`, enter guest, create 3 `QA-GUEST-` rows.
156
+ 2. Sign in (Walk B).
157
+ 3. Confirm the migration prompt appears ("Bring in your local data?").
158
+ 4. Tap "Bring it all in".
159
+ 5. SQL-verify the rows now exist in cloud:
160
+ ```text
161
+ execute_sql(query: "select count(*) from <main_table>
162
+ where workspace_id = '<new_cloud_ws>'
163
+ and notes ilike 'QA-GUEST-%'")
164
+ ```
165
+ 6. Confirm the on-device guest workspace is either deleted or marked
166
+ migrated (and never re-imports on the next launch).
167
+
168
+ ### 2.5f. Walk D — sign-out and re-sign-in
169
+
170
+ 1. From the signed-in state, Settings → Sign out.
171
+ 2. Confirm the app returns to the auth screen and **all signed-in caches
172
+ are cleared** (no flash of stale data on the next sign-in).
173
+ 3. Sign back in. Cold-fetch should re-hydrate from cloud, not from a
174
+ stale persisted blob. Watch logcat for any
175
+ `TypeError: x.<method> is not a function` — that means the persister
176
+ served a corrupted post-sign-out cache (Phase 5).
177
+
178
+ ### 2.5g. Auth-area-specific failure modes to look for
179
+
180
+ | Symptom | Likely cause | Where to look |
181
+ |---|---|---|
182
+ | Magic-link button tap → nothing | `EXPO_PUBLIC_SUPABASE_URL` missing | `apps/*/.env.local`, `app.config.*` extras |
183
+ | OAuth redirect lands on dev launcher, not the app | scheme not registered in `AndroidManifest.xml` | `intent-filter` for `<scheme>://` |
184
+ | Biometric gate shown but cancel bricks the app | no escape hatch in BiometricGate | grep `LocalAuthentication` / `BiometricPrompt` for `dismissed` state |
185
+ | Signed-in user sees guest UI on first launch | Zustand session restore racing the first render | session bootstrap should set `loading=true` until first `getSession()` resolves |
186
+ | Signed-in user sees "No accounts" | sync layer disabled — Phase 4 | Phase 4 cloud-direct fallback |
187
+ | Sign-out leaves user on the home tab | navigation reset missing in the auth listener | grep `onAuthStateChange` → look for `router.replace('/auth')` |
188
+ | Persisted cache survives sign-out and corrupts the next user | persister not bound to the user id, no clear on SIGNED_OUT | wipe persister in the auth listener |
189
+
190
+ ---
191
+
192
+ ## Phase 3: Full CRUD round-trip with three-layer verification
193
+
194
+ Pick the app's primary mutation surface (FAB → "New X", or the equivalent).
195
+
196
+ ### 3a. Create
197
+
198
+ 1. Open the FAB / "+" / new-entry sheet.
199
+ 2. Fill required fields with `QA-TEST-` prefixed text + a memorable amount
200
+ (e.g. `S$ 12345`) so you can grep both UI and DB.
201
+ 3. Tap Save. Note the timestamp.
202
+ 4. Watch for the success toast/snackbar in the next `screencap`.
203
+
204
+ ### 3b. Verify in the DB via Supabase MCP
205
+
206
+ ```text
207
+ supabase:execute_sql
208
+ {
209
+ "query": "select id, amount, currency, posted_at, notes
210
+ from <main_table>
211
+ where workspace_id = '<ws>'
212
+ and (notes ilike '%QA%' or amount = -12345)
213
+ order by created_at desc limit 5;"
214
+ }
215
+ ```
216
+
217
+ A row with the exact amount and the `QA-TEST-` payee/note must exist. If
218
+ two rows came back, the Save button double-fired — log a P2 finding.
219
+
220
+ ### 3c. Verify it's visible in the list view
221
+
222
+ Navigate to the list, `screencap`, find the `QA-TEST-` row visually. If the
223
+ list cache wasn't invalidated after the mutation, this is the bug — log it
224
+ and pull-to-refresh / kill+relaunch to confirm.
225
+
226
+ ### 3d. Edit (when supported)
227
+
228
+ Tap the row → edit one field → Save → SQL-verify the change → re-open the
229
+ detail to confirm the new value persists across a cold render.
230
+
231
+ ### 3e. Delete
232
+
233
+ Use the in-app delete affordance (swipe / sheet button). Verify:
234
+ - snackbar / undo banner appears
235
+ - list view no longer contains the row
236
+ - SQL: `select count(*) from <main_table> where id = '<id>'` returns 0
237
+
238
+ If in-app delete is not yet wired, delete via Supabase MCP and verify the
239
+ app handles the missing row gracefully ("Couldn't load that entry" empty
240
+ state, not a crash).
241
+
242
+ ---
243
+
244
+ ## Phase 4: The "looks empty even though signed in" failure mode
245
+
246
+ This is the canonical native bug pattern and deserves its own phase.
247
+
248
+ ### Symptoms
249
+
250
+ - Home shows real net worth / KPIs from a server RPC, but the Accounts /
251
+ Transactions tab shows "No accounts yet" / "No transactions yet"
252
+ - The DB has hundreds of rows for this user (verify with Supabase MCP)
253
+ - No error in logcat or Sentry — just an empty state painted over real data
254
+
255
+ ### Root cause checklist
256
+
257
+ 1. **Sync layer disabled.** Many RN apps read the local SQLite replica
258
+ (PowerSync / Watermelon / Realm) on the cloud-session path and the cloud
259
+ directly only on the guest path. If the sync URL env var is unset, the
260
+ replica is empty and the screen renders an empty state. Grep:
261
+ ```bash
262
+ grep -rn "POWERSYNC_URL\|isPowerSyncEnabled\|sync.*disabled" apps/*/lib/ packages/*/src/ 2>/dev/null
263
+ ```
264
+ Fix: add a runtime `isSyncEnabled()` check and fall back to the
265
+ adapter's direct cloud fetcher when false.
266
+
267
+ 2. **Missing DB columns.** If `select *` returns the rows but a downstream
268
+ filter (`.eq('parent_account_id', …)`) hits a column that hasn't been
269
+ migrated to cloud, the query returns `[]` silently. Verify with:
270
+ ```text
271
+ list_tables(schemas: ["public"]) → check column list
272
+ ```
273
+ Fix: apply the missing migration via `apply_migration`.
274
+
275
+ 3. **PostgREST OR-syntax against a non-existent column.** Same shape as
276
+ above but the failure is loud (`column foo does not exist`). Surfaces in
277
+ `query_logs` on `source = 'postgres_logs'`.
278
+
279
+ ### Mitigation pattern (works across stacks)
280
+
281
+ Always provide a "cloud-direct fallback" hook the screen can opt into:
282
+
283
+ ```ts
284
+ // pseudo
285
+ const useCloudFallback = !isGuest && !isSyncEnabled()
286
+ const direct = useTabQuery(['<entity>-direct', wsId], () => listFromCloud(ctx),
287
+ [wsId], !!ctx && (isGuest || useCloudFallback))
288
+ const data = (isGuest || useCloudFallback) ? direct : useSyncReplica(wsId)
289
+ ```
290
+
291
+ ---
292
+
293
+ ## Phase 5: Cache-rehydration crashes (`isZero is not a function`)
294
+
295
+ Persistent query caches (`@tanstack/query-sync-storage-persister` + MMKV /
296
+ AsyncStorage / Drift) JSON-stringify everything they store. **Class
297
+ instances and Date objects lose their prototypes on rehydration**, so on
298
+ the next cold boot the first method call (`Money.isZero()`,
299
+ `Date.getDate()`) throws inside the React tree and the screen goes blank.
300
+
301
+ ### Diagnosis
302
+
303
+ `adb logcat -d ReactNativeJS:V` shows lines like:
304
+ ```
305
+ TypeError: x.isZero is not a function (it is undefined)
306
+ TypeError: start.getDate is not a function (it is undefined)
307
+ ```
308
+ …always under the same screen's `componentStack`.
309
+
310
+ ### Two complementary fixes
311
+
312
+ 1. **Skip persistence for cache keys that hold non-JSON-safe values.** In
313
+ the persister config:
314
+ ```ts
315
+ dehydrateOptions: {
316
+ shouldDehydrateQuery: (q) =>
317
+ !NON_PERSISTABLE_KEY_PREFIXES.includes(q.queryKey[0] as string)
318
+ }
319
+ ```
320
+ …and bump `buster: 'v2-…'` so existing devices wipe the corrupted blob.
321
+
322
+ 2. **Defensive re-wrap at the consumer.** For Date fields that survive
323
+ round-trips (e.g. weekStart/weekEnd from a chart series):
324
+ ```ts
325
+ const start = f.weekStart instanceof Date ? f.weekStart : new Date(f.weekStart)
326
+ ```
327
+
328
+ Both belong in the codebase: (1) prevents new corruption, (2) is the
329
+ seatbelt for any path that still flows through a persisted cache.
330
+
331
+ ---
332
+
333
+ ## Phase 6: Sentry MCP loop
334
+
335
+ Run the Sentry MCP **before**, **during**, and **after** the walk.
336
+
337
+ ### Before — baseline
338
+
339
+ ```text
340
+ search_issues(organizationSlug, regionUrl,
341
+ query: "issues from <project> in the last 24 hours, sorted by most recent")
342
+ ```
343
+ Note the issue IDs and event counts so post-walk drift is attributable.
344
+
345
+ ### During — confirm new captures
346
+
347
+ After each crash logged in logcat, search for a matching Sentry title
348
+ (`TypeError: x.isZero is not a function` etc.). If Sentry didn't capture it
349
+ the SDK isn't initialised on this build path — that itself is a finding.
350
+
351
+ ### After — resolve what you fixed
352
+
353
+ ```text
354
+ update_issue(organizationSlug, issueId: "<PROJECT>-<NUM>", status: "resolved")
355
+ ```
356
+ `update_issue` needs the Triage skill on the Sentry MCP connection; if the tool
357
+ is missing, resolve the issue in the Sentry UI instead.
358
+ Resolve only the IDs whose stack-trace + message exactly match the patch
359
+ you shipped this session. Never resolve speculatively — Sentry will
360
+ auto-reopen if the same fingerprint reappears.
361
+
362
+ ---
363
+
364
+ ## Phase 7: Edge cases the walk should not skip
365
+
366
+ | Scenario | How to trigger |
367
+ |---|---|
368
+ | Cold start with empty cache | `pm clear <app.id>` then relaunch |
369
+ | Sign out / sign in | Settings → Sign out → re-auth → verify Today re-hydrates |
370
+ | Background → foreground | `adb shell input keyevent KEYCODE_HOME` then relaunch |
371
+ | Offline | `adb shell svc wifi disable && svc data disable`, walk one tab, re-enable |
372
+ | Biometric gate cancel | When the gate appears, dismiss and verify the escape hatch (Try again / Disable lock) |
373
+ | Slow network | `adb shell tc qdisc add dev wlan0 root netem delay 2000ms` (clean up after) |
374
+ | Discard dialog from FAB | Open new entry, tap back, expect "Discard this entry?" |
375
+
376
+ ---
377
+
378
+ ## Phase 8: Cleanup
379
+
380
+ ```text
381
+ execute_sql(query:
382
+ "delete from <child_table> where <fk> in (select id from <main_table>
383
+ where notes ilike 'QA-TEST-%');
384
+ delete from <main_table> where notes ilike 'QA-TEST-%' returning id;")
385
+ ```
386
+ Confirm the returned id list matches what you created. Also delete any test
387
+ payees / categories you created if the schema treats them as side rows.
388
+
389
+ Then leave the app on the home tab so the next session starts clean.
390
+
391
+ ---
392
+
393
+ ## Phase 9: Report
394
+
395
+ ```markdown
396
+ ## Native build QA — <project> on Android emulator
397
+
398
+ ### Environment
399
+ - Stack: <Expo SDK / RN version / Capacitor version>
400
+ - Bundler: <metro:8081 ok | dead | restarted>
401
+ - Device: <emulator-5554, Android <ver>>, `adb shell wm size` (**expect 1080×4000 if using Phase 0.5 preset**)
402
+ - Account: <user@…> (workspace <id>) — <N> rows in primary table
403
+ - MCPs available: <supabase, sentry>
404
+
405
+ ### Walk results
406
+ | Surface | Render | Logcat | Notes |
407
+ |---|---|---|---|
408
+ | Today / Home | ✅ | clean | net worth ¥578k, chart W12-W19 |
409
+ | Activity | ✅ | clean | 50 rows, IN/OUT/NET correct |
410
+ | Accounts | ✅ after fix | (was empty) | required cloud-direct fallback (Phase 4) |
411
+ | Plan | ✅ | clean | budgets card "1 active" |
412
+ | Insights | ✅ | clean | 8-week money-in/out chart |
413
+
414
+ ### CRUD round-trip
415
+ - Created: <id> via FAB → DB row present → list visible → ✅
416
+ - Updated: field X — UI ✅, DB ✅, cold re-open ✅
417
+ - Deleted: undo banner shown, DB row gone, count(*) = 0
418
+
419
+ ### Patches shipped this session
420
+ 1. <file:line> — <one-liner>; resolves Sentry <ISSUE-ID>
421
+ 2. …
422
+
423
+ ### Sentry hygiene
424
+ - Resolved: <list of IDs>
425
+ - New unresolved: <list, with first-seen timestamps>
426
+
427
+ ### Known follow-ups
428
+ - <PowerSync URL not provisioned — cloud fallback in place>
429
+ - <migrations 0083–0086 partial; full apply needs CHECK-constraint refactor>
430
+ ```
431
+
432
+ ---
433
+
434
+ ## Anti-pattern catalogue (ship-blockers I want the agent to spot fast)
435
+
436
+ | Symptom on screen | Real cause | First fix |
437
+ |---|---|---|
438
+ | "Nothing changed after my patch" | Stale Metro bundle, stale APK, or stale dev-launcher cache | Run **Phase 1.5** — re-curl bundle, `--clear` Metro, `pm clear` if needed |
439
+ | White screen after dev-launcher tap | Metro died OR JS threw before mount | `curl localhost:8081/status` → restart bundler / read logcat for the throw |
440
+ | Emulator exits <1s / `adb devices` stays empty (`exit 1`) | Invalid `skin.name` / `skin.path` (often `_no_skin` on newer emulator) | Phase **0.5b–c** — valid SDK skin dir or minimal **1080×4000** custom skin folder |
441
+ | `adb shell wm size` shows **`720×1280`** despite `hw.lcd` edits | Stock skin `layout` overriding guest resolution | Phase **0.5c** custom skin with **1080×4000** `device.display`; re-verify **`wm size`** |
442
+ | "Error loading app · unexpected end of stream" / Expo cannot connect | `adb reverse` never set, Metro bound after deeplink fired, stale port | **`curl /status`** until running, **`adb reverse tcp:<p> tcp:<p>`**, relaunch deeplink (`Phase 1b–c`); emulator boot **before** one-shot launch scripts (`Phase 0.5`, `§1a`) |
443
+ | Blank where data should be (signed-in, populated user) | Sync replica empty; screen reads only from local SQLite | Add `isSyncEnabled()` runtime check + cloud-direct fallback |
444
+ | Persistent skeletons that never resolve | `useFocusEffect(refetch)` with an unstable refetch identity → infinite invalidate→refetch loop | Wrap `refetch` in `useCallback` with stable deps |
445
+ | `TypeError: x.isZero is not a function` after cold boot | Persisted cache rehydrated a `Money`/`Date` as a plain object | Skip persistence for that key + bump persister `buster` |
446
+ | `Property 'X' doesn't exist` ErrorBoundary | Renamed a hook return value, missed downstream callers | Grep the old name across the file before declaring the rename done |
447
+ | `column "Y" does not exist` in logcat / Sentry | Mobile shipped a migration that hasn't reached cloud | `list_tables` to confirm, `apply_migration` to ship the missing column |
448
+ | Tap does nothing | Wrong real-coord math from downscaled screenshot | `uiautomator dump` → read `bounds="[x1,y1][x2,y2]"` |
449
+ | Guest works but signed-in shows empty UI | Sync replica path not reached; cloud-direct fallback missing | Phase 2.5d + Phase 4 |
450
+ | Signed-in works but guest crashes / cloud-leaks | Adapter path imports `supabase` at module load instead of behind `if (cloud)` | Lazy-import cloud adapter; gate calls on `ctx.kind === 'cloud'` |
451
+ | Sign-out leaves stale data on next sign-in | Persister cache scoped to app, not to user id | Clear persister in `onAuthStateChange('SIGNED_OUT')` |
452
+
453
+ ---
454
+
455
+ ## Important rules
456
+
457
+ 1. **Read the codebase first** — Phase 0 is mandatory. Never test blindly.
458
+ 2. **Emulator/skin/`wm size` first** — Phase 0.5. If AVD exits instantly (`_no_skin`),
459
+ wrong **`Physical size`** (stock skin overriding `hw.lcd`), or adb never sees a device,
460
+ fix that loop before blaming Metro / JS.
461
+ 3. **Verify the build is fresh — Phase 1.5 is mandatory.** Confirm the
462
+ patch is on disk, in the bundle, and on the device before walking.
463
+ Skipping this phase is the #1 source of false "nothing changed"
464
+ reports.
465
+ 4. **Walk both auth paths every session — Phase 2.5 is mandatory.** Guest
466
+ and signed-in route through different adapters; a fix on one regresses
467
+ the other. Always exercise both, plus the migration path between them.
468
+ 5. **Prefer `am start -W`** for intents / activities — **`monkey -p` is unreliable**
469
+ and silently no-ops on some dev-client configurations.
470
+ 6. **Always pair UI screencap with logcat** — a screen can lie, a
471
+ stack-trace cannot.
472
+ 7. **Verify mutations against the DB**, not just the UI cache.
473
+ 8. **Bump the persister buster** whenever you change what gets persisted,
474
+ so existing devices wipe corrupted blobs on first cold boot.
475
+ 9. **Resolve Sentry only what you actually fixed.** Auto-reopens are
476
+ louder than over-eager closures.
477
+ 10. **Clean up server state at the end** — leave the workspace exactly as
478
+ you found it, minus the bugs you patched.
@@ -0,0 +1,107 @@
1
+ ---
2
+ name: mobile-rn-performance
3
+ description: Fix React Native / Expo performance, build, and upgrade issues. Use for jank, frame drops, slow startup, large bundles, memory leaks, Hermes, FlashList, Reanimated, Turbo Modules, Android 16KB alignment, or RN/Expo version upgrades.
4
+ license: MIT
5
+ paths:
6
+ - "**/ios/**"
7
+ - "**/android/**"
8
+ - "**/app.json"
9
+ - "**/app.config.*"
10
+ - "**/capacitor.config.*"
11
+ - "**/*.gradle"
12
+ - "**/Podfile"
13
+ ---
14
+
15
+ # React Native Performance & Build
16
+
17
+ **Degree of freedom: MIXED.** Which category and fix `[HIGH freedom]`; measure
18
+ before/after, 16KB alignment, and upgrade-helper diffs
19
+ `[LOW freedom — run exactly]`.
20
+
21
+ > The performance, bundling, and upgrade layer for React Native / Expo. `mobile-rn-screen` handles screen layout and native feel; this skill handles *speed, size, and version moves*.
22
+ >
23
+ > Distilled from [Callstack's React Native best-practices skill](https://github.com/callstackincubator/agent-skills) (MIT) and the Ultimate Guide to RN Optimization.
24
+
25
+ ## How to reason
26
+
27
+ 1. **Measure** — RN perf monitor / profiler numbers first
28
+ 2. **Category** — FPS, bundle, TTI, native, memory, or animation
29
+ 3. **Fix** — the profiled hotspot only
30
+ 4. **Re-measure** — before/after on a real low-end device
31
+
32
+ ## Worked example
33
+
34
+ > **Measure:** feed scroll drops to 38fps; React profiler shows every row re-rendering.
35
+ > **Category:** FPS & re-renders — not "add memo everywhere".
36
+ > **Fix:** `FlashList` + stable `keyExtractor`; animation stays on Reanimated shared values.
37
+ > **Re-measure:** 56fps on a low-end Android; no new storm on the changed screen.
38
+
39
+ ## Self-critique before reporting
40
+
41
+ - **Not vibes** — a number existed before the patch
42
+ - **Hotspot only** — no unprofiled memo/lazy spray
43
+ - **Both platforms** — Android measured; iOS-affecting native changes verified on macOS CI
44
+ - **Right owner** — layout / safe-area / touch feel → `mobile-rn-screen`; on-device walk → `mobile-emulator-test`; hybrid axes → `enhance-capacitor-ui`
45
+
46
+ ## Diagnose first, then fix [HIGH freedom]
47
+ Never optimize blind. Identify the symptom, then apply the matching category. Measure before/after.
48
+
49
+ | Symptom | Category | Impact |
50
+ |:--------|:---------|:-------|
51
+ | Janky scroll/animation, dropped frames | FPS & re-renders | CRITICAL |
52
+ | Large download / install size | Bundle size | CRITICAL |
53
+ | Slow cold start (high TTI) | TTI / startup | HIGH |
54
+ | Slow native operations | Native performance | HIGH |
55
+ | Memory grows over time / crashes | Memory management | MED-HIGH |
56
+ | Choppy gestures/transitions | Animations | MEDIUM |
57
+
58
+ ## 1. FPS & re-renders (CRITICAL)
59
+ - Profile with React DevTools + the RN perf monitor before changing code. Find the component re-rendering, don't guess.
60
+ - Memoize hot paths: `React.memo`, `useMemo`, `useCallback` — but only where a profile shows wasted renders (over-memoization adds its own cost).
61
+ - Stable references: don't create new objects/arrays/functions inline in props of list rows or memoized children.
62
+ - **Lists:** use `FlashList` (Shopify) over `FlatList` for long/heterogeneous lists. Provide stable `keyExtractor`, avoid anonymous `renderItem` closures, and give size hints. A FlatList re-render storm is the #1 RN list perf bug.
63
+ - Move continuous values (scroll, gesture, animation) off React state — see Animations.
64
+
65
+ ## 2. Bundle & app size (CRITICAL)
66
+ - Enable Hermes (default on modern RN) — smaller, faster startup.
67
+ - Audit the bundle: tree-shake, avoid pulling whole libraries for one function, lazy-load heavy screens.
68
+ - Ship per-architecture / split APKs; drop unused locales and assets.
69
+ - **Android 16KB page-size alignment** — required for Google Play; verify all third-party native libs are aligned or builds get rejected.
70
+
71
+ ## 3. TTI / startup (HIGH)
72
+ - Defer non-critical work past first paint (analytics, feature flags, heavy init).
73
+ - Lazy-init native modules; don't block the JS thread on startup.
74
+ - Measure TTI on a real low-end device, not a flagship or simulator.
75
+
76
+ ## 4. Native performance (HIGH)
77
+ - Prefer native (Turbo Modules / JSI) over JS polyfills for hot, frequent operations.
78
+ - Minimize bridge traffic: batch calls, avoid chatty per-frame round-trips.
79
+ - Profile with Xcode Instruments / Android Studio profiler for native hotspots.
80
+
81
+ ## 5. Memory (MED-HIGH)
82
+ - Clean up listeners, timers, and subscriptions in effect cleanup. Leaked listeners are the common JS leak.
83
+ - Watch image caches and large in-memory data; page or virtualize.
84
+ - Profile native leaks with platform tools when JS looks clean.
85
+
86
+ ## 6. Animations (MEDIUM)
87
+ - Use `react-native-reanimated` on the **UI thread** (`useSharedValue` / `useAnimatedStyle` / worklets). Never drive continuous animation through `setState` — it re-renders the tree every frame and collapses FPS.
88
+ - Use the native driver for `Animated` when staying on the core API.
89
+
90
+ ## React Native / Expo upgrades [LOW freedom — run exactly]
91
+ - Use the official **RN Upgrade Helper** diff for the exact version jump; apply native-side changes (`android/`, `ios/`, Podfile, Gradle) deliberately — these are where upgrades break.
92
+ - Bump Expo SDK via `expo install --fix`; align all `expo-*` and third-party native deps to the SDK's supported ranges.
93
+ - After upgrade: clean caches (`watchman watch-del`, Metro cache, Pods, Gradle), rebuild, and smoke-test on both platforms via `mobile-emulator-test`.
94
+ - For Linux/Windows devs: iOS-affecting upgrade changes verify on **macOS CI**, not locally.
95
+
96
+ ## Definition of done (RN perf) [LOW freedom — do not skip]
97
+ - [ ] Measured before/after on a real device (numbers, not vibes).
98
+ - [ ] The fix targets the profiled hotspot, not a guess.
99
+ - [ ] No new re-render storms introduced (re-profile the changed screen).
100
+ - [ ] Android 16KB alignment holds if native libs changed.
101
+ - [ ] Both platforms still build and run.
102
+
103
+ ## Composes with
104
+ - `mobile-rn-screen` — layout, safe-area, touch-target, native feel.
105
+ - `mobile-emulator-start` / `mobile-emulator-test` — boot + on-device verification.
106
+ - `workflow-spec-tdd` — spec + test the perf fix so it doesn't regress.
107
+ - `enhance-capacitor-ui` — if the app is hybrid rather than bare RN, the axis architecture differs.