tribunal-kit 4.5.0 → 4.6.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 (217) hide show
  1. package/.agent/.shared/ui-ux-pro-max/README.md +4 -4
  2. package/.agent/ARCHITECTURE.md +279 -277
  3. package/.agent/GEMINI.md +127 -121
  4. package/.agent/agents/accessibility-reviewer.md +187 -187
  5. package/.agent/agents/ai-code-reviewer.md +199 -199
  6. package/.agent/agents/api-architect.md +71 -66
  7. package/.agent/agents/backend-specialist.md +219 -215
  8. package/.agent/agents/cloud-engineer.md +98 -0
  9. package/.agent/agents/code-archaeologist.md +168 -161
  10. package/.agent/agents/database-architect.md +184 -184
  11. package/.agent/agents/db-latency-auditor.md +213 -216
  12. package/.agent/agents/debugger.md +198 -191
  13. package/.agent/agents/dependency-reviewer.md +106 -103
  14. package/.agent/agents/devops-engineer.md +218 -218
  15. package/.agent/agents/documentation-writer.md +209 -201
  16. package/.agent/agents/explorer-agent.md +167 -160
  17. package/.agent/agents/frontend-reviewer.md +162 -160
  18. package/.agent/agents/frontend-specialist.md +257 -248
  19. package/.agent/agents/game-developer.md +48 -48
  20. package/.agent/agents/logic-reviewer.md +118 -116
  21. package/.agent/agents/mobile-developer.md +197 -200
  22. package/.agent/agents/mobile-reviewer.md +159 -162
  23. package/.agent/agents/orchestrator.md +187 -181
  24. package/.agent/agents/penetration-tester.md +160 -157
  25. package/.agent/agents/performance-optimizer.md +183 -183
  26. package/.agent/agents/performance-reviewer.md +178 -178
  27. package/.agent/agents/precedence-reviewer.md +251 -250
  28. package/.agent/agents/product-manager.md +149 -142
  29. package/.agent/agents/product-owner.md +81 -80
  30. package/.agent/agents/project-planner.md +152 -142
  31. package/.agent/agents/qa-automation-engineer.md +216 -225
  32. package/.agent/agents/resilience-reviewer.md +88 -88
  33. package/.agent/agents/schema-reviewer.md +67 -67
  34. package/.agent/agents/security-auditor.md +180 -174
  35. package/.agent/agents/seo-specialist.md +188 -193
  36. package/.agent/agents/sql-reviewer.md +159 -161
  37. package/.agent/agents/supervisor-agent.md +173 -184
  38. package/.agent/agents/swarm-worker-contracts.md +170 -166
  39. package/.agent/agents/swarm-worker-registry.md +92 -92
  40. package/.agent/agents/system-architect.md +85 -0
  41. package/.agent/agents/test-coverage-reviewer.md +158 -160
  42. package/.agent/agents/test-engineer.md +118 -118
  43. package/.agent/agents/throughput-optimizer.md +291 -299
  44. package/.agent/agents/type-safety-reviewer.md +182 -175
  45. package/.agent/agents/ui-ux-auditor.md +300 -292
  46. package/.agent/agents/vitals-reviewer.md +223 -223
  47. package/.agent/mcp_config.json +37 -40
  48. package/.agent/patterns/generator.md +11 -9
  49. package/.agent/patterns/inversion.md +14 -12
  50. package/.agent/patterns/pipeline.md +11 -9
  51. package/.agent/patterns/reviewer.md +15 -13
  52. package/.agent/patterns/tool-wrapper.md +11 -9
  53. package/.agent/routing_index.json +654 -0
  54. package/.agent/rules/GEMINI.md +358 -352
  55. package/.agent/scripts/compile_router.py +112 -0
  56. package/.agent/scripts/migrate_skills_frontmatter.py +64 -0
  57. package/.agent/scripts/strengthen_skills.js +1 -1
  58. package/.agent/skills/advanced-rag-pipelines/SKILL.md +56 -0
  59. package/.agent/skills/agent-organizer/SKILL.md +156 -150
  60. package/.agent/skills/agentic-patterns/SKILL.md +313 -315
  61. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +190 -184
  62. package/.agent/skills/api-patterns/SKILL.md +253 -247
  63. package/.agent/skills/api-security-auditor/SKILL.md +195 -193
  64. package/.agent/skills/app-builder/SKILL.md +573 -572
  65. package/.agent/skills/app-builder/templates/SKILL.md +108 -115
  66. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
  67. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
  68. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
  69. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
  70. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
  71. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
  72. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
  73. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +126 -122
  74. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +127 -122
  75. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +172 -169
  76. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +139 -134
  77. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
  78. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +122 -119
  79. package/.agent/skills/appflow-wireframe/SKILL.md +146 -145
  80. package/.agent/skills/architecture/SKILL.md +226 -219
  81. package/.agent/skills/authentication-best-practices/SKILL.md +197 -189
  82. package/.agent/skills/backend-security-expert/SKILL.md +16 -2
  83. package/.agent/skills/bash-linux/SKILL.md +179 -179
  84. package/.agent/skills/behavioral-modes/SKILL.md +239 -223
  85. package/.agent/skills/brainstorming/SKILL.md +498 -486
  86. package/.agent/skills/browser-native-ai/SKILL.md +57 -4
  87. package/.agent/skills/building-native-ui/SKILL.md +202 -202
  88. package/.agent/skills/cicd-pro/SKILL.md +442 -0
  89. package/.agent/skills/clean-code/SKILL.md +400 -381
  90. package/.agent/skills/cloud-architect/SKILL.md +439 -0
  91. package/.agent/skills/code-review-checklist/SKILL.md +203 -194
  92. package/.agent/skills/config-validator/SKILL.md +165 -165
  93. package/.agent/skills/containerization-pro/SKILL.md +452 -0
  94. package/.agent/skills/csharp-developer/SKILL.md +518 -518
  95. package/.agent/skills/data-validation-schemas/SKILL.md +333 -328
  96. package/.agent/skills/database-design/SKILL.md +247 -240
  97. package/.agent/skills/deployment-procedures/SKILL.md +172 -169
  98. package/.agent/skills/devops-engineer/SKILL.md +345 -345
  99. package/.agent/skills/devops-incident-responder/SKILL.md +143 -137
  100. package/.agent/skills/doc.md +209 -177
  101. package/.agent/skills/documentation-templates/SKILL.md +291 -279
  102. package/.agent/skills/edge-computing/SKILL.md +183 -181
  103. package/.agent/skills/error-resilience/SKILL.md +411 -428
  104. package/.agent/skills/extract-design-system/SKILL.md +160 -158
  105. package/.agent/skills/framer-motion-expert/SKILL.md +253 -244
  106. package/.agent/skills/frontend-design/SKILL.md +208 -201
  107. package/.agent/skills/frontend-security-expert/SKILL.md +16 -3
  108. package/.agent/skills/game-design-expert/SKILL.md +132 -129
  109. package/.agent/skills/game-engineering-expert/SKILL.md +148 -146
  110. package/.agent/skills/generative-ui-expert/SKILL.md +57 -1
  111. package/.agent/skills/geo-fundamentals/SKILL.md +148 -147
  112. package/.agent/skills/git-pro/SKILL.md +435 -0
  113. package/.agent/skills/github-operations/SKILL.md +335 -329
  114. package/.agent/skills/gsap-core/SKILL.md +319 -308
  115. package/.agent/skills/gsap-frameworks/SKILL.md +213 -207
  116. package/.agent/skills/gsap-performance/SKILL.md +139 -133
  117. package/.agent/skills/gsap-plugins/SKILL.md +486 -480
  118. package/.agent/skills/gsap-react/SKILL.md +202 -189
  119. package/.agent/skills/gsap-scrolltrigger/SKILL.md +357 -350
  120. package/.agent/skills/gsap-timeline/SKILL.md +165 -161
  121. package/.agent/skills/gsap-utils/SKILL.md +344 -338
  122. package/.agent/skills/harness-protocol/SKILL.md +48 -0
  123. package/.agent/skills/i18n-localization/SKILL.md +174 -163
  124. package/.agent/skills/intelligent-routing/SKILL.md +202 -246
  125. package/.agent/skills/knowledge-graph/SKILL.md +60 -52
  126. package/.agent/skills/lint-and-validate/SKILL.md +261 -261
  127. package/.agent/skills/llm-engineering/SKILL.md +400 -394
  128. package/.agent/skills/local-first/SKILL.md +178 -178
  129. package/.agent/skills/mcp-builder/SKILL.md +143 -142
  130. package/.agent/skills/mobile-design/SKILL.md +272 -263
  131. package/.agent/skills/monorepo-management/SKILL.md +335 -334
  132. package/.agent/skills/motion-engineering/SKILL.md +266 -234
  133. package/.agent/skills/nextjs-react-expert/SKILL.md +236 -234
  134. package/.agent/skills/nodejs-best-practices/SKILL.md +547 -548
  135. package/.agent/skills/observability/SKILL.md +343 -343
  136. package/.agent/skills/parallel-agents/SKILL.md +143 -146
  137. package/.agent/skills/performance-profiling/SKILL.md +259 -267
  138. package/.agent/skills/plan-writing/SKILL.md +150 -142
  139. package/.agent/skills/platform-engineer/SKILL.md +148 -147
  140. package/.agent/skills/playwright-best-practices/SKILL.md +188 -187
  141. package/.agent/skills/powershell-windows/SKILL.md +162 -162
  142. package/.agent/skills/project-idioms/SKILL.md +137 -137
  143. package/.agent/skills/python-patterns/SKILL.md +260 -259
  144. package/.agent/skills/python-pro/SKILL.md +324 -323
  145. package/.agent/skills/react-specialist/SKILL.md +305 -277
  146. package/.agent/skills/readme-builder/SKILL.md +310 -300
  147. package/.agent/skills/realtime-patterns/SKILL.md +323 -319
  148. package/.agent/skills/red-team-tactics/SKILL.md +231 -218
  149. package/.agent/skills/rust-pro/SKILL.md +671 -673
  150. package/.agent/skills/seo-fundamentals/SKILL.md +179 -179
  151. package/.agent/skills/server-management/SKILL.md +218 -214
  152. package/.agent/skills/shadcn-ui-expert/SKILL.md +231 -231
  153. package/.agent/skills/skill-creator/SKILL.md +87 -86
  154. package/.agent/skills/sql-pro/SKILL.md +629 -629
  155. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +97 -97
  156. package/.agent/skills/swiftui-expert/SKILL.md +204 -201
  157. package/.agent/skills/system-design-pro/SKILL.md +345 -0
  158. package/.agent/skills/systematic-debugging/SKILL.md +153 -142
  159. package/.agent/skills/tailwind-patterns/SKILL.md +610 -566
  160. package/.agent/skills/tdd-workflow/SKILL.md +169 -161
  161. package/.agent/skills/test-result-analyzer/SKILL.md +313 -309
  162. package/.agent/skills/testing-patterns/SKILL.md +566 -579
  163. package/.agent/skills/trend-researcher/SKILL.md +243 -237
  164. package/.agent/skills/typescript-advanced/SKILL.md +336 -335
  165. package/.agent/skills/ui-ux-pro-max/SKILL.md +590 -562
  166. package/.agent/skills/ui-ux-researcher/SKILL.md +244 -244
  167. package/.agent/skills/vue-expert/SKILL.md +294 -275
  168. package/.agent/skills/vulnerability-scanner/SKILL.md +416 -404
  169. package/.agent/skills/web-accessibility-auditor/SKILL.md +219 -218
  170. package/.agent/skills/web-design-guidelines/SKILL.md +192 -186
  171. package/.agent/skills/webapp-testing/SKILL.md +167 -169
  172. package/.agent/skills/webgpu-performance/SKILL.md +56 -2
  173. package/.agent/skills/whimsy-injector/SKILL.md +346 -325
  174. package/.agent/skills/workflow-optimizer/SKILL.md +231 -229
  175. package/.agent/workflows/acf.md +141 -0
  176. package/.agent/workflows/api-tester.md +176 -151
  177. package/.agent/workflows/audit.md +150 -127
  178. package/.agent/workflows/brainstorm.md +134 -110
  179. package/.agent/workflows/changelog.md +140 -112
  180. package/.agent/workflows/create.md +168 -124
  181. package/.agent/workflows/debug.md +190 -165
  182. package/.agent/workflows/deploy.md +201 -180
  183. package/.agent/workflows/enhance.md +154 -128
  184. package/.agent/workflows/fix.md +136 -114
  185. package/.agent/workflows/generate.md +198 -183
  186. package/.agent/workflows/marathon.md +37 -11
  187. package/.agent/workflows/migrate.md +184 -160
  188. package/.agent/workflows/orchestrate.md +192 -168
  189. package/.agent/workflows/performance-benchmarker.md +135 -114
  190. package/.agent/workflows/plan.md +196 -173
  191. package/.agent/workflows/preview.md +103 -80
  192. package/.agent/workflows/refactor.md +192 -161
  193. package/.agent/workflows/review-ai.md +125 -101
  194. package/.agent/workflows/review.md +141 -116
  195. package/.agent/workflows/session.md +122 -94
  196. package/.agent/workflows/status.md +101 -79
  197. package/.agent/workflows/strengthen-skills.md +164 -138
  198. package/.agent/workflows/super-prompt.md +24 -0
  199. package/.agent/workflows/swarm.md +193 -179
  200. package/.agent/workflows/test.md +211 -189
  201. package/.agent/workflows/tribunal-backend.md +136 -105
  202. package/.agent/workflows/tribunal-database.md +122 -95
  203. package/.agent/workflows/tribunal-frontend.md +221 -96
  204. package/.agent/workflows/tribunal-full.md +129 -100
  205. package/.agent/workflows/tribunal-mobile.md +122 -95
  206. package/.agent/workflows/tribunal-performance.md +136 -110
  207. package/.agent/workflows/tribunal-speed.md +209 -183
  208. package/.agent/workflows/ui-ux-pro-max.md +145 -122
  209. package/README.md +107 -55
  210. package/bin/mcp-server.js +159 -0
  211. package/bin/tribunal-kit.js +105 -29
  212. package/bin/wrapper.js +16 -7
  213. package/mcp_config.json +9 -0
  214. package/package.json +94 -86
  215. package/scripts/changelog.js +4 -3
  216. package/scripts/validate-payload.js +6 -1
  217. package/scripts/postinstall.js +0 -127
@@ -1,327 +1,326 @@
1
- ---
2
- name: python-pro
3
- description: Python 3.12+ specialist. FastAPI, Pydantic v2, asyncio, modern types, pytest. Use when building Python APIs, data pipelines, automation, or any Python code.
4
- allowed-tools: Read, Write, Edit, Glob, Grep
5
- version: 3.1.0
6
- last-updated: 2026-04-06
7
- ---
8
-
9
- # Python 3.12+ — Dense Reference
10
-
11
- ## Hallucination Traps (Read First)
12
- - ❌ `from typing import List, Dict, Optional, Union` → ✅ `list[str]`, `dict[k,v]`, `X | None`, `X | Y` (Python 3.10+)
13
- - ❌ `user.dict()` / `user.json()` / `UserCreate.parse_obj()` → ✅ Pydantic v2: `model_dump()`, `model_dump_json()`, `model_validate()`
14
- - Pydantic `class Config: orm_mode = True` → ✅ `model_config = {"from_attributes": True}`
15
- - ❌ `@validator` / `@root_validator` → ✅ `@field_validator` / `@model_validator`
16
- - ❌ `@app.on_event("startup")` → ✅ `lifespan` context manager (deprecated)
17
- - ❌ `import requests` in async code → ✅ `httpx.AsyncClient()` (requests BLOCKS the event loop)
18
- - ❌ `asyncio.run()` inside running loop → ✅ `await` directly or use `loop.create_task()`
19
- - ❌ `except Exception as e: pass` → ✅ always log or re-raise
20
-
21
- ---
22
-
23
- ## Type System (3.12+)
24
-
25
- ```python
26
- # Built-in generics (3.9+) — no typing imports needed for basic types
27
- def process(items: list[str]) -> dict[str, int]: ...
28
- def find(user_id: int) -> User | None: ... # 3.10+ union
29
- def parse(raw: str) -> int | float | None: ...
30
-
31
- # Generic syntax (3.12+)
32
- def first[T](items: list[T]) -> T | None:
33
- return items[0] if items else None
34
- type Point = tuple[float, float] # 3.12+ type alias
35
-
36
- # Protocol (structural typing — duck typing with types)
37
- from typing import Protocol, runtime_checkable
38
- @runtime_checkable
39
- class Renderable(Protocol):
40
- def render(self) -> str: ...
41
-
42
- # TypedDict — typed dict with optional keys
43
- from typing import TypedDict, NotRequired
44
- class UserPayload(TypedDict):
45
- name: str; email: str
46
- age: NotRequired[int] # optional key
47
-
48
- # ParamSpec — preserve signatures in decorators
49
- from typing import TypeVar, ParamSpec
50
- from collections.abc import Callable
51
- T = TypeVar("T"); P = ParamSpec("P")
52
- def with_logging(func: Callable[P, T]) -> Callable[P, T]:
53
- def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
54
- result = func(*args, **kwargs)
55
- return result
56
- return wrapper
57
- ```
58
-
59
- ---
60
-
61
- ## Pydantic v2
62
-
63
- ```python
64
- from pydantic import BaseModel, Field, field_validator, model_validator
65
- from enum import Enum
66
-
67
- class Role(str, Enum):
68
- ADMIN = "admin"; USER = "user"
69
-
70
- class UserCreate(BaseModel):
71
- name: str = Field(..., min_length=2, max_length=100)
72
- email: str = Field(..., pattern=r"^[\w.-]+@[\w.-]+\.\w+$")
73
- age: int = Field(..., ge=13, le=120)
74
- role: Role = Role.USER
75
- tags: list[str] = Field(default_factory=list)
76
-
77
- @field_validator("name")
78
- @classmethod
79
- def name_titlecase(cls, v: str) -> str:
80
- if not v[0].isupper(): raise ValueError("Name must start with uppercase")
81
- return v.strip()
82
-
83
- @model_validator(mode="after")
84
- def check_admin_age(self) -> "UserCreate":
85
- if self.role == Role.ADMIN and self.age < 18:
86
- raise ValueError("Admins must be 18+")
87
- return self
88
-
89
- class UserResponse(BaseModel):
90
- id: int; name: str; email: str
91
- model_config = {"from_attributes": True} # ORM mode (was orm_mode=True in v1)
92
-
93
- # Serialization
94
- user.model_dump() # ✅ (was .dict())
95
- user.model_dump_json() # ✅ (was .json())
96
- user.model_dump(exclude={"password"}, mode="json")
97
- UserCreate.model_validate({"name": "Alice", "email": "a@b.com", "age": 30}) # ✅ (was parse_obj)
98
- UserCreate.model_validate_json('{"name": "Bob", ...}')
99
- ```
100
-
101
- ---
102
-
103
- ## FastAPI
104
-
105
- ```python
106
- from fastapi import FastAPI, HTTPException, Depends, Query, Path, status
107
- from contextlib import asynccontextmanager
108
-
109
- @asynccontextmanager
110
- async def lifespan(app: FastAPI):
111
- await init_db(); await redis.connect() # startup
112
- yield
113
- await redis.close() # shutdown
114
-
115
- app = FastAPI(title="My API", version="1.0.0", lifespan=lifespan)
116
-
117
- # CORS — never "*" in production
118
- from fastapi.middleware.cors import CORSMiddleware
119
- app.add_middleware(CORSMiddleware,
120
- allow_origins=["https://myapp.com"], # ❌ NEVER ["*"]
121
- allow_credentials=True, allow_methods=["GET","POST","PUT","DELETE"], allow_headers=["*"])
122
-
123
- # Routes
124
- @app.get("/users", response_model=list[UserResponse])
125
- async def list_users(skip: int = Query(0, ge=0), limit: int = Query(20, le=100)) -> list[UserResponse]:
126
- return await db.execute(select(User).offset(skip).limit(limit))
127
-
128
- @app.post("/users", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
129
- async def create_user(payload: UserCreate) -> UserResponse:
130
- user = User(**payload.model_dump())
131
- db.add(user); await db.commit(); await db.refresh(user)
132
- return user
133
-
134
- # Dependency Injection
135
- async def get_db() -> AsyncGenerator[AsyncSession, None]:
136
- async with async_session() as session:
137
- try: yield session
138
- finally: await session.close()
139
-
140
- async def get_current_user(token: str = Depends(oauth2_scheme), db: AsyncSession = Depends(get_db)) -> User:
141
- payload = decode_jwt(token)
142
- user = await db.get(User, payload["sub"])
143
- if not user: raise HTTPException(status_code=401, detail="Invalid credentials")
144
- return user
145
-
146
- def require_role(role: Role):
147
- async def checker(user: User = Depends(get_current_user)) -> User:
148
- if user.role != role: raise HTTPException(status_code=403, detail="Forbidden")
149
- return user
150
- return checker
151
-
152
- # Background Tasks
153
- from fastapi import BackgroundTasks
154
- @app.post("/orders")
155
- async def create_order(order: OrderCreate, bg: BackgroundTasks) -> OrderResponse:
156
- result = await save_order(order)
157
- bg.add_task(send_email, result.email)
158
- return result
159
-
160
- # Exception handlers
161
- from fastapi.responses import JSONResponse
162
- @app.exception_handler(AppError)
163
- async def app_error(request: Request, exc: AppError) -> JSONResponse:
164
- return JSONResponse(status_code=exc.status_code, content={"error": exc.message})
165
- ```
166
-
167
- ---
168
-
169
- ## Async Patterns
170
-
171
- ```python
172
- import asyncio, httpx
173
-
174
- # Parallel calls — await all simultaneously
175
- async def fetch_all() -> tuple:
176
- async with httpx.AsyncClient() as client:
177
- users, posts = await asyncio.gather(
178
- client.get("/users"), client.get("/posts")
179
- )
180
- return users.json(), posts.json()
181
-
182
- # Timeout
183
- async with asyncio.timeout(5.0): # 3.11+ (was asyncio.wait_for)
184
- result = await slow_operation()
185
-
186
- # Semaphore — limit concurrent ops
187
- sem = asyncio.Semaphore(10)
188
- async def limited_fetch(url: str) -> dict:
189
- async with sem:
190
- async with httpx.AsyncClient() as client:
191
- return (await client.get(url)).json()
192
-
193
- # Producer-Consumer
194
- async def producer(q: asyncio.Queue[str]):
195
- for item in data: await q.put(item)
196
- await q.put(None) # sentinel
197
-
198
- async def consumer(q: asyncio.Queue[str]):
199
- while (item := await q.get()) is not None:
200
- await process(item)
201
- q.task_done()
202
- ```
203
-
204
- ---
205
-
206
- ## Error Handling
207
-
208
- ```python
209
- # NEVER silently swallow exceptions
210
- try: result = await risky_op()
211
- except SpecificError as e: logger.error("Failed: %s", e); raise
212
- except Exception: logger.exception("Unexpected"); raise
213
-
214
- # Custom exceptions with context
215
- class ServiceError(Exception):
216
- def __init__(self, msg: str, code: int = 500, context: dict | None = None):
217
- super().__init__(msg)
218
- self.code = code; self.context = context or {}
219
-
220
- # Context managers for cleanup
221
- from contextlib import asynccontextmanager
222
- @asynccontextmanager
223
- async def managed_connection():
224
- conn = await db.connect()
225
- try: yield conn
226
- finally: await conn.close()
227
- ```
228
-
229
- ---
230
-
231
- ## Testing (pytest)
232
-
233
- ```python
234
- import pytest
235
- from httpx import AsyncClient, ASGITransport
236
-
237
- @pytest.fixture
238
- async def client():
239
- async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as c:
240
- yield c
241
-
242
- @pytest.mark.anyio
243
- async def test_create_user(client: AsyncClient):
244
- r = await client.post("/users", json={"name": "Alice", "email": "a@b.com", "age": 25})
245
- assert r.status_code == 201
246
- assert r.json()["name"] == "Alice"
247
-
248
- # Fixtures with factories (avoid fixtures that return complex data directly)
249
- @pytest.fixture
250
- def make_user(db_session):
251
- async def _make(name="Alice", role="user"):
252
- return await User.create(db=db_session, name=name, role=role)
253
- return _make
254
- ```
255
-
256
- ---
257
-
258
- ## Project Structure
259
-
260
- ```
261
- my-api/
262
- ├── app/
263
- │ ├── main.py # FastAPI app + lifespan
264
- │ ├── models/ # SQLAlchemy ORM models
265
- │ ├── schemas/ # Pydantic request/response models
266
- │ ├── routers/ # APIRouter groups
267
- │ ├── services/ # Business logic (no FastAPI imports)
268
- │ ├── dependencies.py # Shared Depends() callables
269
- │ └── config.py # Settings via pydantic-settings
270
- ├── tests/
271
- ├── alembic/ # Migrations
272
- └── pyproject.toml
273
- ```
274
-
275
-
276
- ---
277
-
278
-
279
-
280
- AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
281
-
282
- 1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
283
- 2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
284
- 3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
285
- 4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
286
- 5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
287
-
288
- ---
289
-
290
-
291
-
292
- **Slash command: `/review` or `/tribunal-full`**
293
- **Active reviewers: `logic-reviewer` · `security-auditor`**
294
-
295
- ### ❌ Forbidden AI Tropes
296
-
297
- 1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
298
- 2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
299
- 3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
300
-
301
-
302
-
303
- Review these questions before confirming output:
304
- ```
305
- ✅ Did I rely ONLY on real, verified tools and methods?
306
- ✅ Is this solution appropriately scoped to the user's constraints?
307
- ✅ Did I handle potential failure modes and edge cases?
308
- ✅ Have I avoided generic boilerplate that doesn't add value?
309
- ```
310
-
311
- ### 🛑 Verification-Before-Completion (VBC) Protocol
312
-
313
- **CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
314
- - ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
315
- - ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
316
-
317
-
318
- ## Pre-Flight Checklist
319
- - [ ] Have I reviewed the user's specific constraints and requests?
320
- - [ ] Have I checked the environment for relevant existing implementations?
321
-
322
- ## VBC Protocol (Verification-Before-Completion)
323
- You MUST verify existing code signatures and variables before attempting to modify or call them. No hallucination is permitted.
1
+ ---
2
+ name: python-pro
3
+ description: Python 3.12+ specialist. FastAPI, Pydantic v2, asyncio, modern types, pytest. Use when building Python APIs, data pipelines, automation, or any Python code.
4
+ allowed-tools: Read, Write, Edit, Glob, Grep
5
+ version: 3.1.0
6
+ last-updated: 2026-04-06
7
+ routing:
8
+ domain: general
9
+ tier: basic
10
+ ---
11
+
12
+ # Python 3.12+ — Dense Reference
13
+
14
+ ## Hallucination Traps (Read First)
324
15
 
16
+ - ❌ `from typing import List, Dict, Optional, Union` → ✅ `list[str]`, `dict[k,v]`, `X | None`, `X | Y` (Python 3.10+)
17
+ - ❌ `user.dict()` / `user.json()` / `UserCreate.parse_obj()` → ✅ Pydantic v2: `model_dump()`, `model_dump_json()`, `model_validate()`
18
+ - ❌ Pydantic `class Config: orm_mode = True` → ✅ `model_config = {"from_attributes": True}`
19
+ - ❌ `@validator` / `@root_validator` → ✅ `@field_validator` / `@model_validator`
20
+ - ❌ `@app.on_event("startup")` → ✅ `lifespan` context manager (deprecated)
21
+ - ❌ `import requests` in async code → ✅ `httpx.AsyncClient()` (requests BLOCKS the event loop)
22
+ - ❌ `asyncio.run()` inside running loop → ✅ `await` directly or use `loop.create_task()`
23
+ - ❌ `except Exception as e: pass` → ✅ always log or re-raise
24
+
25
+ ---
26
+
27
+ ## Type System (3.12+)
28
+
29
+ ```python
30
+ # Built-in generics (3.9+) — no typing imports needed for basic types
31
+ def process(items: list[str]) -> dict[str, int]: ...
32
+ def find(user_id: int) -> User | None: ... # 3.10+ union
33
+ def parse(raw: str) -> int | float | None: ...
34
+
35
+ # Generic syntax (3.12+)
36
+ def first[T](items: list[T]) -> T | None:
37
+ return items[0] if items else None
38
+ type Point = tuple[float, float] # 3.12+ type alias
39
+
40
+ # Protocol (structural typing — duck typing with types)
41
+ from typing import Protocol, runtime_checkable
42
+ @runtime_checkable
43
+ class Renderable(Protocol):
44
+ def render(self) -> str: ...
45
+
46
+ # TypedDict — typed dict with optional keys
47
+ from typing import TypedDict, NotRequired
48
+ class UserPayload(TypedDict):
49
+ name: str; email: str
50
+ age: NotRequired[int] # optional key
51
+
52
+ # ParamSpec — preserve signatures in decorators
53
+ from typing import TypeVar, ParamSpec
54
+ from collections.abc import Callable
55
+ T = TypeVar("T"); P = ParamSpec("P")
56
+ def with_logging(func: Callable[P, T]) -> Callable[P, T]:
57
+ def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
58
+ result = func(*args, **kwargs)
59
+ return result
60
+ return wrapper
61
+ ```
62
+
63
+ ---
64
+
65
+ ## Pydantic v2
66
+
67
+ ```python
68
+ from pydantic import BaseModel, Field, field_validator, model_validator
69
+ from enum import Enum
70
+
71
+ class Role(str, Enum):
72
+ ADMIN = "admin"; USER = "user"
73
+
74
+ class UserCreate(BaseModel):
75
+ name: str = Field(..., min_length=2, max_length=100)
76
+ email: str = Field(..., pattern=r"^[\w.-]+@[\w.-]+\.\w+$")
77
+ age: int = Field(..., ge=13, le=120)
78
+ role: Role = Role.USER
79
+ tags: list[str] = Field(default_factory=list)
80
+
81
+ @field_validator("name")
82
+ @classmethod
83
+ def name_titlecase(cls, v: str) -> str:
84
+ if not v[0].isupper(): raise ValueError("Name must start with uppercase")
85
+ return v.strip()
86
+
87
+ @model_validator(mode="after")
88
+ def check_admin_age(self) -> "UserCreate":
89
+ if self.role == Role.ADMIN and self.age < 18:
90
+ raise ValueError("Admins must be 18+")
91
+ return self
92
+
93
+ class UserResponse(BaseModel):
94
+ id: int; name: str; email: str
95
+ model_config = {"from_attributes": True} # ORM mode (was orm_mode=True in v1)
96
+
97
+ # Serialization
98
+ user.model_dump() # ✅ (was .dict())
99
+ user.model_dump_json() # ✅ (was .json())
100
+ user.model_dump(exclude={"password"}, mode="json")
101
+ UserCreate.model_validate({"name": "Alice", "email": "a@b.com", "age": 30}) # ✅ (was parse_obj)
102
+ UserCreate.model_validate_json('{"name": "Bob", ...}')
103
+ ```
104
+
105
+ ---
106
+
107
+ ## FastAPI
108
+
109
+ ```python
110
+ from fastapi import FastAPI, HTTPException, Depends, Query, Path, status
111
+ from contextlib import asynccontextmanager
112
+
113
+ @asynccontextmanager
114
+ async def lifespan(app: FastAPI):
115
+ await init_db(); await redis.connect() # startup
116
+ yield
117
+ await redis.close() # shutdown
118
+
119
+ app = FastAPI(title="My API", version="1.0.0", lifespan=lifespan)
120
+
121
+ # CORS — never "*" in production
122
+ from fastapi.middleware.cors import CORSMiddleware
123
+ app.add_middleware(CORSMiddleware,
124
+ allow_origins=["https://myapp.com"], # ❌ NEVER ["*"]
125
+ allow_credentials=True, allow_methods=["GET","POST","PUT","DELETE"], allow_headers=["*"])
126
+
127
+ # Routes
128
+ @app.get("/users", response_model=list[UserResponse])
129
+ async def list_users(skip: int = Query(0, ge=0), limit: int = Query(20, le=100)) -> list[UserResponse]:
130
+ return await db.execute(select(User).offset(skip).limit(limit))
131
+
132
+ @app.post("/users", response_model=UserResponse, status_code=status.HTTP_201_CREATED)
133
+ async def create_user(payload: UserCreate) -> UserResponse:
134
+ user = User(**payload.model_dump())
135
+ db.add(user); await db.commit(); await db.refresh(user)
136
+ return user
137
+
138
+ # Dependency Injection
139
+ async def get_db() -> AsyncGenerator[AsyncSession, None]:
140
+ async with async_session() as session:
141
+ try: yield session
142
+ finally: await session.close()
143
+
144
+ async def get_current_user(token: str = Depends(oauth2_scheme), db: AsyncSession = Depends(get_db)) -> User:
145
+ payload = decode_jwt(token)
146
+ user = await db.get(User, payload["sub"])
147
+ if not user: raise HTTPException(status_code=401, detail="Invalid credentials")
148
+ return user
149
+
150
+ def require_role(role: Role):
151
+ async def checker(user: User = Depends(get_current_user)) -> User:
152
+ if user.role != role: raise HTTPException(status_code=403, detail="Forbidden")
153
+ return user
154
+ return checker
155
+
156
+ # Background Tasks
157
+ from fastapi import BackgroundTasks
158
+ @app.post("/orders")
159
+ async def create_order(order: OrderCreate, bg: BackgroundTasks) -> OrderResponse:
160
+ result = await save_order(order)
161
+ bg.add_task(send_email, result.email)
162
+ return result
163
+
164
+ # Exception handlers
165
+ from fastapi.responses import JSONResponse
166
+ @app.exception_handler(AppError)
167
+ async def app_error(request: Request, exc: AppError) -> JSONResponse:
168
+ return JSONResponse(status_code=exc.status_code, content={"error": exc.message})
169
+ ```
170
+
171
+ ---
172
+
173
+ ## Async Patterns
174
+
175
+ ```python
176
+ import asyncio, httpx
177
+
178
+ # Parallel calls — await all simultaneously
179
+ async def fetch_all() -> tuple:
180
+ async with httpx.AsyncClient() as client:
181
+ users, posts = await asyncio.gather(
182
+ client.get("/users"), client.get("/posts")
183
+ )
184
+ return users.json(), posts.json()
185
+
186
+ # Timeout
187
+ async with asyncio.timeout(5.0): # 3.11+ (was asyncio.wait_for)
188
+ result = await slow_operation()
189
+
190
+ # Semaphore — limit concurrent ops
191
+ sem = asyncio.Semaphore(10)
192
+ async def limited_fetch(url: str) -> dict:
193
+ async with sem:
194
+ async with httpx.AsyncClient() as client:
195
+ return (await client.get(url)).json()
196
+
197
+ # Producer-Consumer
198
+ async def producer(q: asyncio.Queue[str]):
199
+ for item in data: await q.put(item)
200
+ await q.put(None) # sentinel
201
+
202
+ async def consumer(q: asyncio.Queue[str]):
203
+ while (item := await q.get()) is not None:
204
+ await process(item)
205
+ q.task_done()
206
+ ```
207
+
208
+ ---
209
+
210
+ ## Error Handling
211
+
212
+ ```python
213
+ # NEVER silently swallow exceptions
214
+ try: result = await risky_op()
215
+ except SpecificError as e: logger.error("Failed: %s", e); raise
216
+ except Exception: logger.exception("Unexpected"); raise
217
+
218
+ # Custom exceptions with context
219
+ class ServiceError(Exception):
220
+ def __init__(self, msg: str, code: int = 500, context: dict | None = None):
221
+ super().__init__(msg)
222
+ self.code = code; self.context = context or {}
223
+
224
+ # Context managers for cleanup
225
+ from contextlib import asynccontextmanager
226
+ @asynccontextmanager
227
+ async def managed_connection():
228
+ conn = await db.connect()
229
+ try: yield conn
230
+ finally: await conn.close()
231
+ ```
232
+
233
+ ---
234
+
235
+ ## Testing (pytest)
236
+
237
+ ```python
238
+ import pytest
239
+ from httpx import AsyncClient, ASGITransport
240
+
241
+ @pytest.fixture
242
+ async def client():
243
+ async with AsyncClient(transport=ASGITransport(app=app), base_url="http://test") as c:
244
+ yield c
245
+
246
+ @pytest.mark.anyio
247
+ async def test_create_user(client: AsyncClient):
248
+ r = await client.post("/users", json={"name": "Alice", "email": "a@b.com", "age": 25})
249
+ assert r.status_code == 201
250
+ assert r.json()["name"] == "Alice"
251
+
252
+ # Fixtures with factories (avoid fixtures that return complex data directly)
253
+ @pytest.fixture
254
+ def make_user(db_session):
255
+ async def _make(name="Alice", role="user"):
256
+ return await User.create(db=db_session, name=name, role=role)
257
+ return _make
258
+ ```
259
+
260
+ ---
261
+
262
+ ## Project Structure
263
+
264
+ ```
265
+ my-api/
266
+ ├── app/
267
+ │ ├── main.py # FastAPI app + lifespan
268
+ │ ├── models/ # SQLAlchemy ORM models
269
+ │ ├── schemas/ # Pydantic request/response models
270
+ │ ├── routers/ # APIRouter groups
271
+ │ ├── services/ # Business logic (no FastAPI imports)
272
+ │ ├── dependencies.py # Shared Depends() callables
273
+ │ └── config.py # Settings via pydantic-settings
274
+ ├── tests/
275
+ ├── alembic/ # Migrations
276
+ └── pyproject.toml
277
+ ```
278
+
279
+ ---
280
+
281
+ AI coding assistants often fall into specific bad habits when dealing with this domain. These are strictly forbidden:
282
+
283
+ 1. **Over-engineering:** Proposing complex abstractions or distributed systems when a simpler approach suffices.
284
+ 2. **Hallucinated Libraries/Methods:** Using non-existent methods or packages. Always `// VERIFY` or check `package.json` / `requirements.txt`.
285
+ 3. **Skipping Edge Cases:** Writing the "happy path" and ignoring error handling, timeouts, or data validation.
286
+ 4. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
287
+ 5. **Silent Degradation:** Catching and suppressing errors without logging or re-raising.
288
+
289
+ ---
290
+
291
+ **Slash command: `/review` or `/tribunal-full`**
292
+ **Active reviewers: `logic-reviewer` · `security-auditor`**
293
+
294
+ ### ❌ Forbidden AI Tropes
295
+
296
+ 1. **Blind Assumptions:** Never make an assumption without documenting it clearly with `// VERIFY: [reason]`.
297
+ 2. **Silent Degradation:** Catching and suppressing errors without logging or handling.
298
+ 3. **Context Amnesia:** Forgetting the user's constraints and offering generic advice instead of tailored solutions.
299
+
300
+ Review these questions before confirming output:
301
+
302
+ ```
303
+ ✅ Did I rely ONLY on real, verified tools and methods?
304
+ ✅ Is this solution appropriately scoped to the user's constraints?
305
+ ✅ Did I handle potential failure modes and edge cases?
306
+ ✅ Have I avoided generic boilerplate that doesn't add value?
307
+ ```
308
+
309
+ ### 🛑 Verification-Before-Completion (VBC) Protocol
310
+
311
+ **CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
312
+
313
+ - ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
314
+ - ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.
315
+
316
+ ## Pre-Flight Checklist
317
+
318
+ - [ ] Have I reviewed the user's specific constraints and requests?
319
+ - [ ] Have I checked the environment for relevant existing implementations?
320
+
321
+ ## VBC Protocol (Verification-Before-Completion)
322
+
323
+ You MUST verify existing code signatures and variables before attempting to modify or call them. No hallucination is permitted.
325
324
 
326
325
  ---
327
326
 
@@ -351,6 +350,7 @@ AI coding assistants often fall into specific bad habits when dealing with this
351
350
  ### ✅ Pre-Flight Self-Audit
352
351
 
353
352
  Review these questions before confirming output:
353
+
354
354
  ```
355
355
  ✅ Did I rely ONLY on real, verified tools and methods?
356
356
  ✅ Is this solution appropriately scoped to the user's constraints?
@@ -361,5 +361,6 @@ Review these questions before confirming output:
361
361
  ### 🛑 Verification-Before-Completion (VBC) Protocol
362
362
 
363
363
  **CRITICAL:** You must follow a strict "evidence-based closeout" state machine.
364
+
364
365
  - ❌ **Forbidden:** Declaring a task complete because the output "looks correct."
365
366
  - ✅ **Required:** You are explicitly forbidden from finalizing any task without providing **concrete evidence** (terminal output, passing tests, compile success, or equivalent proof) that your output works as intended.