tribunal-kit 4.5.1 → 4.6.1

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 (214) hide show
  1. package/.agent/.shared/ui-ux-pro-max/README.md +4 -4
  2. package/.agent/ARCHITECTURE.md +282 -277
  3. package/.agent/agents/accessibility-reviewer.md +187 -187
  4. package/.agent/agents/ai-code-reviewer.md +199 -199
  5. package/.agent/agents/api-architect.md +71 -66
  6. package/.agent/agents/backend-specialist.md +219 -215
  7. package/.agent/agents/cloud-engineer.md +98 -0
  8. package/.agent/agents/code-archaeologist.md +168 -161
  9. package/.agent/agents/database-architect.md +184 -184
  10. package/.agent/agents/db-latency-auditor.md +213 -216
  11. package/.agent/agents/debugger.md +198 -191
  12. package/.agent/agents/dependency-reviewer.md +106 -103
  13. package/.agent/agents/devops-engineer.md +218 -218
  14. package/.agent/agents/documentation-writer.md +209 -201
  15. package/.agent/agents/explorer-agent.md +167 -160
  16. package/.agent/agents/frontend-reviewer.md +162 -160
  17. package/.agent/agents/frontend-specialist.md +257 -248
  18. package/.agent/agents/game-developer.md +48 -48
  19. package/.agent/agents/logic-reviewer.md +118 -116
  20. package/.agent/agents/mobile-developer.md +197 -200
  21. package/.agent/agents/mobile-reviewer.md +159 -162
  22. package/.agent/agents/orchestrator.md +187 -181
  23. package/.agent/agents/penetration-tester.md +160 -157
  24. package/.agent/agents/performance-optimizer.md +183 -183
  25. package/.agent/agents/performance-reviewer.md +178 -178
  26. package/.agent/agents/precedence-reviewer.md +251 -250
  27. package/.agent/agents/product-manager.md +149 -142
  28. package/.agent/agents/product-owner.md +81 -80
  29. package/.agent/agents/project-planner.md +152 -142
  30. package/.agent/agents/qa-automation-engineer.md +216 -225
  31. package/.agent/agents/resilience-reviewer.md +88 -88
  32. package/.agent/agents/schema-reviewer.md +67 -67
  33. package/.agent/agents/security-auditor.md +180 -174
  34. package/.agent/agents/seo-specialist.md +188 -193
  35. package/.agent/agents/sql-reviewer.md +159 -161
  36. package/.agent/agents/supervisor-agent.md +173 -184
  37. package/.agent/agents/swarm-worker-contracts.md +170 -166
  38. package/.agent/agents/swarm-worker-registry.md +92 -92
  39. package/.agent/agents/system-architect.md +85 -0
  40. package/.agent/agents/test-coverage-reviewer.md +158 -160
  41. package/.agent/agents/test-engineer.md +118 -118
  42. package/.agent/agents/throughput-optimizer.md +291 -299
  43. package/.agent/agents/type-safety-reviewer.md +182 -175
  44. package/.agent/agents/ui-ux-auditor.md +300 -292
  45. package/.agent/agents/vitals-reviewer.md +223 -223
  46. package/.agent/mcp_config.json +37 -40
  47. package/.agent/patterns/generator.md +11 -9
  48. package/.agent/patterns/inversion.md +14 -12
  49. package/.agent/patterns/pipeline.md +11 -9
  50. package/.agent/patterns/reviewer.md +15 -13
  51. package/.agent/patterns/tool-wrapper.md +11 -9
  52. package/.agent/routing_index.json +714 -0
  53. package/.agent/rules/GEMINI.md +359 -352
  54. package/.agent/scripts/compile_router.py +112 -0
  55. package/.agent/scripts/migrate_skills_frontmatter.py +64 -0
  56. package/.agent/scripts/strengthen_skills.js +1 -1
  57. package/.agent/skills/advanced-rag-pipelines/SKILL.md +56 -0
  58. package/.agent/skills/agent-organizer/SKILL.md +156 -150
  59. package/.agent/skills/agentic-patterns/SKILL.md +313 -315
  60. package/.agent/skills/ai-prompt-injection-defense/SKILL.md +190 -184
  61. package/.agent/skills/api-patterns/SKILL.md +253 -247
  62. package/.agent/skills/api-security-auditor/SKILL.md +195 -193
  63. package/.agent/skills/app-builder/SKILL.md +573 -572
  64. package/.agent/skills/app-builder/templates/SKILL.md +108 -115
  65. package/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -76
  66. package/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -92
  67. package/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -88
  68. package/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -88
  69. package/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -83
  70. package/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -90
  71. package/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -90
  72. package/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +126 -122
  73. package/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +127 -122
  74. package/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +172 -169
  75. package/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +139 -134
  76. package/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -83
  77. package/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +122 -119
  78. package/.agent/skills/appflow-wireframe/SKILL.md +146 -145
  79. package/.agent/skills/architecture/SKILL.md +226 -219
  80. package/.agent/skills/authentication-best-practices/SKILL.md +197 -189
  81. package/.agent/skills/backend-security-expert/SKILL.md +16 -2
  82. package/.agent/skills/bash-linux/SKILL.md +179 -179
  83. package/.agent/skills/behavioral-modes/SKILL.md +239 -223
  84. package/.agent/skills/brainstorming/SKILL.md +498 -486
  85. package/.agent/skills/browser-native-ai/SKILL.md +57 -4
  86. package/.agent/skills/building-native-ui/SKILL.md +202 -202
  87. package/.agent/skills/cicd-pro/SKILL.md +442 -0
  88. package/.agent/skills/clean-code/SKILL.md +400 -381
  89. package/.agent/skills/cloud-architect/SKILL.md +439 -0
  90. package/.agent/skills/code-review-checklist/SKILL.md +203 -194
  91. package/.agent/skills/config-validator/SKILL.md +165 -165
  92. package/.agent/skills/containerization-pro/SKILL.md +452 -0
  93. package/.agent/skills/csharp-developer/SKILL.md +518 -518
  94. package/.agent/skills/data-validation-schemas/SKILL.md +333 -328
  95. package/.agent/skills/database-design/SKILL.md +247 -240
  96. package/.agent/skills/deployment-procedures/SKILL.md +172 -169
  97. package/.agent/skills/devops-engineer/SKILL.md +345 -345
  98. package/.agent/skills/devops-incident-responder/SKILL.md +143 -137
  99. package/.agent/skills/documentation-templates/SKILL.md +291 -279
  100. package/.agent/skills/edge-computing/SKILL.md +183 -181
  101. package/.agent/skills/emil-design-eng/SKILL.md +147 -0
  102. package/.agent/skills/error-resilience/SKILL.md +411 -428
  103. package/.agent/skills/extract-design-system/SKILL.md +160 -158
  104. package/.agent/skills/framer-motion-expert/SKILL.md +253 -244
  105. package/.agent/skills/frontend-design/SKILL.md +208 -201
  106. package/.agent/skills/frontend-security-expert/SKILL.md +16 -3
  107. package/.agent/skills/game-design-expert/SKILL.md +132 -129
  108. package/.agent/skills/game-engineering-expert/SKILL.md +148 -146
  109. package/.agent/skills/generative-ui-expert/SKILL.md +57 -1
  110. package/.agent/skills/geo-fundamentals/SKILL.md +148 -147
  111. package/.agent/skills/git-pro/SKILL.md +435 -0
  112. package/.agent/skills/github-operations/SKILL.md +335 -329
  113. package/.agent/skills/gsap-core/SKILL.md +319 -308
  114. package/.agent/skills/gsap-frameworks/SKILL.md +213 -207
  115. package/.agent/skills/gsap-performance/SKILL.md +139 -133
  116. package/.agent/skills/gsap-plugins/SKILL.md +486 -480
  117. package/.agent/skills/gsap-react/SKILL.md +202 -189
  118. package/.agent/skills/gsap-scrolltrigger/SKILL.md +357 -350
  119. package/.agent/skills/gsap-timeline/SKILL.md +165 -161
  120. package/.agent/skills/gsap-utils/SKILL.md +344 -338
  121. package/.agent/skills/harness-protocol/SKILL.md +48 -0
  122. package/.agent/skills/i18n-localization/SKILL.md +174 -163
  123. package/.agent/skills/intelligent-routing/SKILL.md +202 -246
  124. package/.agent/skills/knowledge-graph/SKILL.md +60 -52
  125. package/.agent/skills/lint-and-validate/SKILL.md +261 -261
  126. package/.agent/skills/llm-engineering/SKILL.md +400 -394
  127. package/.agent/skills/local-first/SKILL.md +178 -178
  128. package/.agent/skills/mcp-builder/SKILL.md +143 -142
  129. package/.agent/skills/mobile-design/SKILL.md +272 -263
  130. package/.agent/skills/monorepo-management/SKILL.md +335 -334
  131. package/.agent/skills/motion-engineering/SKILL.md +266 -234
  132. package/.agent/skills/nextjs-react-expert/SKILL.md +236 -234
  133. package/.agent/skills/nodejs-best-practices/SKILL.md +547 -548
  134. package/.agent/skills/observability/SKILL.md +343 -343
  135. package/.agent/skills/parallel-agents/SKILL.md +143 -146
  136. package/.agent/skills/performance-profiling/SKILL.md +259 -267
  137. package/.agent/skills/plan-writing/SKILL.md +150 -142
  138. package/.agent/skills/platform-engineer/SKILL.md +148 -147
  139. package/.agent/skills/playwright-best-practices/SKILL.md +188 -187
  140. package/.agent/skills/powershell-windows/SKILL.md +162 -162
  141. package/.agent/skills/project-idioms/SKILL.md +137 -137
  142. package/.agent/skills/python-patterns/SKILL.md +260 -259
  143. package/.agent/skills/python-pro/SKILL.md +324 -323
  144. package/.agent/skills/react-specialist/SKILL.md +305 -277
  145. package/.agent/skills/readme-builder/SKILL.md +310 -300
  146. package/.agent/skills/realtime-patterns/SKILL.md +323 -319
  147. package/.agent/skills/red-team-tactics/SKILL.md +231 -218
  148. package/.agent/skills/review-animations/SKILL.md +72 -0
  149. package/.agent/skills/review-animations/STANDARDS.md +73 -0
  150. package/.agent/skills/rust-pro/SKILL.md +671 -673
  151. package/.agent/skills/seo-fundamentals/SKILL.md +179 -179
  152. package/.agent/skills/server-management/SKILL.md +218 -214
  153. package/.agent/skills/shadcn-ui-expert/SKILL.md +231 -231
  154. package/.agent/skills/skill-creator/SKILL.md +87 -86
  155. package/.agent/skills/sql-pro/SKILL.md +629 -629
  156. package/.agent/skills/supabase-postgres-best-practices/SKILL.md +97 -97
  157. package/.agent/skills/swiftui-expert/SKILL.md +204 -201
  158. package/.agent/skills/system-design-pro/SKILL.md +345 -0
  159. package/.agent/skills/systematic-debugging/SKILL.md +153 -142
  160. package/.agent/skills/tailwind-patterns/SKILL.md +610 -566
  161. package/.agent/skills/tdd-workflow/SKILL.md +169 -161
  162. package/.agent/skills/test-result-analyzer/SKILL.md +313 -309
  163. package/.agent/skills/testing-patterns/SKILL.md +566 -579
  164. package/.agent/skills/trend-researcher/SKILL.md +243 -237
  165. package/.agent/skills/typescript-advanced/SKILL.md +336 -335
  166. package/.agent/skills/ui-ux-pro-max/SKILL.md +590 -562
  167. package/.agent/skills/ui-ux-researcher/SKILL.md +244 -244
  168. package/.agent/skills/vue-expert/SKILL.md +294 -275
  169. package/.agent/skills/vulnerability-scanner/SKILL.md +416 -404
  170. package/.agent/skills/web-accessibility-auditor/SKILL.md +219 -218
  171. package/.agent/skills/web-design-guidelines/SKILL.md +192 -186
  172. package/.agent/skills/webapp-testing/SKILL.md +167 -169
  173. package/.agent/skills/webgpu-performance/SKILL.md +56 -2
  174. package/.agent/skills/whimsy-injector/SKILL.md +346 -325
  175. package/.agent/skills/workflow-optimizer/SKILL.md +231 -229
  176. package/.agent/workflows/acf.md +141 -0
  177. package/.agent/workflows/api-tester.md +176 -151
  178. package/.agent/workflows/audit.md +150 -127
  179. package/.agent/workflows/brainstorm.md +134 -110
  180. package/.agent/workflows/changelog.md +140 -112
  181. package/.agent/workflows/create.md +168 -124
  182. package/.agent/workflows/debug.md +190 -165
  183. package/.agent/workflows/deploy.md +201 -180
  184. package/.agent/workflows/enhance.md +154 -128
  185. package/.agent/workflows/fix.md +136 -114
  186. package/.agent/workflows/generate.md +198 -183
  187. package/.agent/workflows/marathon.md +37 -11
  188. package/.agent/workflows/migrate.md +184 -160
  189. package/.agent/workflows/orchestrate.md +192 -168
  190. package/.agent/workflows/performance-benchmarker.md +135 -114
  191. package/.agent/workflows/plan.md +196 -173
  192. package/.agent/workflows/preview.md +103 -80
  193. package/.agent/workflows/refactor.md +192 -161
  194. package/.agent/workflows/review-ai.md +125 -101
  195. package/.agent/workflows/review.md +141 -116
  196. package/.agent/workflows/session.md +122 -94
  197. package/.agent/workflows/status.md +101 -79
  198. package/.agent/workflows/strengthen-skills.md +164 -138
  199. package/.agent/workflows/super-prompt.md +24 -0
  200. package/.agent/workflows/swarm.md +193 -179
  201. package/.agent/workflows/test.md +211 -189
  202. package/.agent/workflows/tribunal-backend.md +136 -105
  203. package/.agent/workflows/tribunal-database.md +129 -95
  204. package/.agent/workflows/tribunal-frontend.md +140 -96
  205. package/.agent/workflows/tribunal-full.md +131 -100
  206. package/.agent/workflows/tribunal-mobile.md +129 -95
  207. package/.agent/workflows/tribunal-performance.md +136 -110
  208. package/.agent/workflows/tribunal-speed.md +209 -183
  209. package/.agent/workflows/ui-ux-pro-max.md +155 -122
  210. package/README.md +107 -55
  211. package/mcp_config.json +1 -3
  212. package/package.json +94 -94
  213. package/.agent/GEMINI.md +0 -121
  214. package/.agent/skills/doc.md +0 -177
@@ -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.