feature-based-layered-architecture
4
总安装量
4
周安装量
#50378
全站排名
安装命令
npx skills add https://github.com/sasatech-labs/skills --skill Feature-Based-Layered-Architecture
Agent 安装分布
amp
4
opencode
4
cursor
4
kimi-cli
4
codex
4
github-copilot
4
Skill 文档
SasaTech Architecture
æ¦è¦
Feature-Based Layered Architecture for Next.js (App Router) with Supabase ã®ã¹ãã«ã
Handler / Service / Repository / Adapter ã®4ã¬ã¤ã¤ã¼æ§æã¨ãæ©è½(Features)åä½ã®ã¢ã¸ã¥ã¼ã«åå²ãã¿ã¼ã³ãå®ç¾©ããã ã¬ã¤ãï¼è¨è¨ææ³ã»å®è£ æ¹æ³ï¼ã¨ã«ã¼ã«ï¼å¶ç´ã»å¤å®åºæºï¼ã®2種é¡ã®ããã¥ã¡ã³ãã§æ§æããã
ã¬ã¤ãã¨ã«ã¼ã«
| é ç® | ã¬ã¤ã | ã«ã¼ã« |
|---|---|---|
| ç®ç | ã¢ã¼ããã¯ãã£ã®çè§£ãæ·±ãã | å®è£ æã®å¶ç´ãå®ç¾©ãã |
| å 容 | HOW/WHY â è¨è¨ææ³ãå®è£ æ¹æ³ãã³ã¼ãä¾ | DO/DON’T â å¤å®åºæºãNG/OKä¾ |
| å½¢å¼ | ãã¥ã¼ããªã¢ã«å½¢å¼ | æ§é åãããã«ã¼ã«å½¢å¼ |
| 使ç¨å ´é¢ | å¦ç¿æãè¨è¨å¤ææ | å®è£ æãã³ã¼ãã¬ãã¥ã¼æ |
| é ç½® | guides/ |
rules/ |
How to Use
ãã®ã¹ãã«ã¨ä½µãã¦ã以ä¸ã®å¤é¨ã¹ãã«ã®å°å ¥ãæ¨å¥¨ããã
npx skills add https://github.com/supabase/agent-skills --skill supabase-postgres-best-practices
npx skills add https://github.com/vercel-labs/agent-skills --skill vercel-react-best-practices
npx skills add https://github.com/vercel-labs/agent-skills --skill web-design-guidelines
| ã¹ãã« | ç¨é |
|---|---|
supabase-postgres-best-practices |
Supabase / PostgreSQL ã®ã¯ã¨ãªæé©åãRLSããã¤ã°ã¬ã¼ã·ã§ã³ |
vercel-react-best-practices |
React / Next.js ã®ã³ã³ãã¼ãã³ãè¨è¨ãããã©ã¼ãã³ã¹æé©å |
web-design-guidelines |
ã¢ã¯ã»ã·ããªãã£ãã¬ã¹ãã³ã·ããã¶ã¤ã³ãUI/UX |
Default Stack
| ã«ãã´ãª | æè¡ |
|---|---|
| Framework | Next.js (App Router) |
| Database / BaaS | Supabase |
| Language | TypeScript |
| Validation | Zod |
| Data Fetching | SWR |
| Logging | pino |
| Formatter | Biome |
| Linter | Biome + ESLint |
About Feature-Based Layered Architecture
Feature-Based Layered Architecture for Next.js (App Router) with Supabase
ã¬ã¤ã¤ã¼æ§æ
Handler ãªã¯ã¨ã¹ã/ã¬ã¹ãã³ã¹ãããªãã¼ã·ã§ã³ã楽観çèªè¨¼
â
Service ãã¸ãã¹ãã¸ãã¯ãå³å¯ãªèªå¯ãè¤æ° Repository 飿º
â
Repository ãã¼ã¿ã¢ã¯ã»ã¹
Adapter å¤é¨ API 飿ºï¼Stripe, Resend çï¼
ãã£ã¬ã¯ããªæ§æ
src/
âââ app/ # Next.js App Router
â âââ (auth)/ # èªè¨¼ãå¿
è¦ãªã«ã¼ãã°ã«ã¼ã
â âââ (public)/ # å
¬éã«ã¼ãã°ã«ã¼ã
â âââ api/ # API Routes (èãã¨ã³ããªã¼ãã¤ã³ã)
â
âââ features/ # æ©è½åä½ã®ã¢ã¸ã¥ã¼ã«
â âââ [feature]/
â âââ index.server.ts # ãµã¼ãã¼å°ç¨ã®å
¬éAPIï¼Service, Handlerï¼
â âââ index.client.ts # ã¯ã©ã¤ã¢ã³ãå©ç¨å¯ã®å
¬éAPIï¼Fetcher, åï¼
â âââ core/
â âââ schema.ts # Zodã¹ãã¼ã + åå®ç¾©
â âââ handler.ts # ãªã¯ã¨ã¹ã / ã¬ã¹ãã³ã¹å¦ç (server-only)
â âââ service.ts # ãã¸ãã¹ãã¸ã㯠(server-only)
â âââ repository.ts # ãã¼ã¿ã¢ã¯ã»ã¹ (server-only)
â âââ adapter.ts # å¤é¨API飿º (server-only)
â âââ fetcher.ts # APIå¼ã³åºã
â âââ hooks.ts # SWR Hookç
â
âââ components/ # å
±éUIã³ã³ãã¼ãã³ã
âââ hooks/ # å
±éHooks
âââ lib/ # ã¦ã¼ãã£ãªãã£
â âââ adapters/ # å¤é¨ãµã¼ãã¹é£æº
âââ types/ # å
±éåå®ç¾©ãSupabaseçæå
Guides
| ã¬ã¤ã | 説æ |
|---|---|
| architecture.md | Feature-based Layer Architecture ã®å ¨ä½è¨è¨ãã¬ã¤ã¤ã¼æ§æã責ååé¢ããã£ã¬ã¯ããªæ§æ |
| architecture/handler.md | Handler層ã®å®è£ ããªã¯ã¨ã¹ãå¦çãããªãã¼ã·ã§ã³ã楽観çèªè¨¼ãã¨ã©ã¼ãã³ããªã³ã° |
| architecture/service.md | Service層ã®å®è£ ããã¸ãã¹ãã¸ãã¯ãå³å¯ãªèªå¯ãRepository/Adapter飿ºããã©ã³ã¶ã¯ã·ã§ã³ç®¡ç |
| architecture/repository.md | Repository層ã®å®è£ ããã¼ã¿ã¢ã¯ã»ã¹ã®æ½è±¡åãSupabaseã¯ã¨ãªã®ã«ãã»ã«å |
| architecture/adapter.md | Adapter層ã®å®è£ ãå¤é¨ãµã¼ãã¹ï¼æ±ºæ¸ãã¡ã¼ã«ãAIçï¼ã¨ã®é£æºãã«ãã»ã«å |
| authentication.md | äºæ®µéèªè¨¼ã»èªå¯æ¦ç¥ã楽観çèªè¨¼(Handler)ã¨å³å¯ãªèªå¯(Service)ã®å®è£ ãã¿ã¼ã³ |
| testing.md | ã¬ã¤ã¤ã¼ãã¨ã®ãã¹ãæ¦ç¥ãUnit / Integration ãã¹ãã®ç¯å²ã¨ã¢ãã¯æ¹é |
| database.md | ãã¼ã¿ãã¼ã¹è¨è¨ãã³ã¡ã³ãè¦ç´ããã¤ã°ã¬ã¼ã·ã§ã³ãSupabase ã¨ã®é£æº |
| logging.md | pino ã使ç¨ããæ§é åãã°ã®å®è£ ãã¬ã¤ã¤ã¼ãã¨ã®ãã°åºåæ¹é |
| setup.md | æ°è¦ããã¸ã§ã¯ãã®ã»ããã¢ããæé ãä¾åããã±ã¼ã¸ãåºç¤ãã¡ã¤ã«ã®é ç½® |
| fetch-strategy.md | ãã¼ã¿å徿¦ç¥ãSSR/CSRã®é¸æåºæºã¨å®è£ ãã¿ã¼ã³ |
| error-handling.md | AppErrorã¯ã©ã¹ã¨withHTTPErrorã«ããã¨ã©ã¼ãã³ããªã³ã°è¨è¨ |
| wrappers.md | withHTTPError(Handler)ã®ã©ããã¼ã¦ã¼ãã£ãªã㣠|
Rules
ã«ãã´ãª
| ã«ãã´ãª | Prefix |
|---|---|
| ã¢ã¼ããã¯ã㣠| arch- |
| ãã¼ã¿ | data- |
| ãµã¼ãã¼ãµã¤ãä¿è· | server- |
| ã¹ãã¼ãã»åå®ç¾© | schema- |
| ã¬ã¹ãã³ã¹ | response- |
| ãã¹ã | test- |
| ããªãã¼ã·ã§ã³ | validation- |
| å½åè¦å | naming- |
| ããã³ãã¨ã³ã | frontend- |
ã¤ã³ãã¯ã
Impact ã¯ãéåæã«ã¢ã¼ããã¯ãã£ã¸ä¸ããå½±é¿ã®æ·±å»åº¦ã§å®ç¾©ããã
| Impact | åºæº |
|---|---|
| CRITICAL | ã¢ã¼ããã¯ãã£ã®æ ¹å¹¹ãå£ãããéåããã¨ãã®è¨è¨ãã¿ã¼ã³èªä½ãæç«ããªã |
| HIGH | ã¢ã¼ããã¯ãã£ã®æ´åæ§ãä¿å®æ§ã大ããæãªã |
| MEDIUM | ã³ã¼ãã®å質ãä¸è²«æ§ãä½ä¸ããã |
| LOW | éçºä½é¨ããã¿ã¼ã³ã®çµ±ä¸ã«é¢ããæ¨å¥¨äºé |
ã¢ã¼ããã¯ã㣠(arch-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| arch-three-layers | CRITICAL | Handler â Service â Repository, Adapter ã®æ§æãå¿ ãçµç± |
| arch-feature-structure | CRITICAL | æ©è½åä½ã§ features/ ã«ã¢ã¸ã¥ã¼ã«å |
| arch-external-services | HIGH | Stripe, Resend çã®å¤é¨ãµã¼ãã¹ã¯ Adapter çµç± |
| arch-logging-strategy | MEDIUM | pino ã§æ§é åãã°ãconsole.log ç¦æ¢ |
| arch-fetch-strategy | CRITICAL | SSR/CSRåãããfetcherçµç±ã§API Routeå¼ã³åºã |
| arch-logging-levels | MEDIUM | ãã°ã¬ãã«ãã¬ã¤ã¤ã¼ã¨ç¶æ³ã«å¿ãã¦ä½¿ãåã |
| arch-auth-strategy | HIGH | Handlerå±¤ã§æ¥½è¦³çèªè¨¼ãService層ã§å³å¯ãªèªå¯ãå ±æãã«ãã¼é¢æ°ç¦æ¢ |
| arch-auth-operations | HIGH | SignOutãSignInWithOTPçã®èªè¨¼æä½ã¯Service層ã«å®è£ ãHandler層ã§ã®ç´æ¥å®è¡ç¦æ¢ |
| arch-public-api | MEDIUM | Feature ã®å ¬éAPI㯠index.server.tsï¼Service, Handlerï¼ã¨ index.client.tsï¼Fetcher, åï¼ã§åé¢ç®¡ç |
| arch-handler-route-separation | HIGH | API Routeã¯èãã¨ã³ããªã¼ãã¤ã³ãã«éå®ããã¸ãã¯ã¯Handler層ã«åé¢ |
| arch-transaction-rpc-required | HIGH | è¤æ°ãã¼ãã«æ´æ°ã®ãã©ã³ã¶ã¯ã·ã§ã³å¦çã¯Supabase RPC颿°ãä½¿ç¨ |
| arch-adapter-placement | MEDIUM | æ±ç¨Adapterã¯lib/adapters/ãFeatureåºæAdapterã¯features/*/core/ã«é
ç½® |
| arch-feature-adapter-isolation | MEDIUM | Featureå Adapterãä»Featureã®å é¨Adapterã«ä¾åãããã¨ãç¦æ¢ |
ãã¼ã¿ (data-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| data-pagination | HIGH | å ¨ä»¶åå¾ç¦æ¢ãMAX_LIMITã§ãµã¼ãã¼å´ä¸éãå¼·å¶ããã¼ã¸ãã¼ã·ã§ã³å¿ é |
| data-comment-required | LOW | ãã¼ãã«ã»ã«ã©ã ã«æ¥æ¬èªã³ã¡ã³ãå¿ é |
| data-rls-required | CRITICAL | å ¨ãã¼ãã«ã§RLSæå¹åå¿ é ãæä½1ã¤ã®ããªã·ã¼ãå®ç¾© |
| data-migration-cli-required | MEDIUM | ãã¤ã°ã¬ã¼ã·ã§ã³ãã¡ã¤ã«ã¯Supabase CLIã§çæãæåä½æç¦æ¢ |
| data-update-trigger-required | MEDIUM | å
¨ãã¼ãã«ã«updated_at/update_userèªåæ´æ°ããªã¬ã¼ãé©ç¨ |
| data-select-minimal | MEDIUM | select('*')ãé¿ããå¿
è¦ãªã«ã©ã ã®ã¿ãæå® |
ãµã¼ãã¼ãµã¤ãä¿è· (server-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| server-supabase-via-api | CRITICAL | ã¯ã©ã¤ã¢ã³ããã Supabase ç´æ¥ä½¿ç¨ç¦æ¢ãAPI Route çµç±å¿ é |
| server-only-directive | HIGH | Handler/Service/Repository/Adapter ã« import 'server-only' ãå¿
é ã§è¨è¿° |
| server-no-public-env | HIGH | æ©å¯æ
å ±ï¼Supabase, API ãã¼ï¼ã« NEXT_PUBLIC_ ç¦æ¢ |
| server-webhook-signature-validation | CRITICAL | Webhookç½²åæ¤è¨¼å¿ é ãç½²åãªãã§ã®ãã¤ãã¼ããã¼ã¹ç¦æ¢ |
ã¹ãã¼ãã»åå®ç¾© (schema-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| schema-single-source | HIGH | åå®ç¾©ã¯ schema.ts ã«ä¸å
åãtypes.ts ä½æç¦æ¢ |
| schema-zod-infer | MEDIUM | Input åã¯ææ¸ããã z.infer<typeof schema> ã§å°åº |
ã¬ã¹ãã³ã¹ (response-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| response-with-http-error | HIGH | Handler颿°ã¯ withHTTPError ã§ã©ããå¿ é |
| response-apperror | MEDIUM | ã¨ã©ã¼ã¯ AppError ã¯ã©ã¹ã§ã¹ãã¼ãçã® Error ç¦æ¢ |
| response-helpers | LOW | AppResponse.ok(), AppResponse.created() çã®ã¬ã¹ãã³ã¹ãã«ãã¼ãä½¿ç¨ |
| response-adapter-errors | HIGH | Adapter層ã¯å¤é¨APIã¨ã©ã¼ãAppErrorã«å¤æãã¦ã¹ãã¼ |
ãã¹ã (test-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| test-layer-mocking | HIGH | åã¬ã¤ã¤ã¼ã¯ç´ä¸ã®ä¾åã®ã¿ãã¢ã㯠|
| test-server-only | MEDIUM | server-only ã¯ãã¹ãç°å¢ã§ã¢ãã¯å¿
é |
| test-file-location | LOW | ãã¹ããã¡ã¤ã«ã¯ __tests__ ã«é
ç½® |
| test-naming | LOW | ãã¹ãã¯æ¥æ¬èªã§æå³ãæç¢ºã« |
ããªãã¼ã·ã§ã³ (validation-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| validation-request | MEDIUM | ãªã¯ã¨ã¹ãå ¥åå¤ï¼ããã£ããã¹ãã©ã¡ã¼ã¿ãã¯ã¨ãªãã©ã¡ã¼ã¿ï¼ãZodã§ããªãã¼ã·ã§ã³ |
å½åè¦å (naming-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| naming-files | LOW | ãã¡ã¤ã«ã»ãã£ã¬ã¯ããªå㯠kebab-caseï¼ãã¬ã¼ã ã¯ã¼ã¯è¦ç´ãã¡ã¤ã«ãé¤ãï¼ |
| naming-methods | LOW | Repository: findMany/findByIdãService: get*/create* |
| naming-exports | MEDIUM | _ prefixå
é¨å®è£
+ ãã¡ã¤ã«æ«å°¾ã§exportéç´ |
ããã³ãã¨ã³ã (frontend-)
| ã«ã¼ã« | Impact | 説æ |
|---|---|---|
| frontend-data-fetching | LOW | Featureãã¨ã«fetcher.tsã¨hooks.tsã使ãã³ã³ãã¼ãã³ãããç´æ¥fetchç¦æ¢ |