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