diff --git a/TODO.md b/TODO.md index 23cd620..50bbaec 100644 --- a/TODO.md +++ b/TODO.md @@ -3,7 +3,7 @@ > **وضعیت (بهروزرسانی نهایی):** پیادهسازی کامل شده است. > > - بکاند: **۲۱۶ تست سبز**، `ruff check` تمیز، `mypy` روی **۹۰ فایل** بدون خطا. -> - فرانتاند: **۲۵ تست سبز**، `next lint` بدون هشدار، `tsc --noEmit` تمیز. +> - فرانتاند: **۴۵ تست سبز**، `next lint` بدون هشدار، `tsc --noEmit` تمیز. > - دو migration در `apps/api/alembic/versions/` ساخته و با `alembic check` > تأیید شد که هیچ drift ندارد. مسیر upgrade و downgrade هر دو تست شدهاند. > - workerها (`billing-worker`, `ai-runtime`, `sandbox-gateway`) واقعی و تستشدهاند. @@ -15,6 +15,20 @@ > `error_events` ذخیره میشود و در `/admin/errors` قابل مشاهده و رسیدگی است. > هیچ خطایی بدون پاکسازی secret ذخیره نمیشود (`app/core/redact.py`). > +> **افزودهٔ بعد از بستن مراحل (درخواست کاربر):** پالت فرمان (`⌘K`) و صفحهٔ +> `/admin/usage`. +> +> **افزودهٔ بعد از بستن مراحل (درخواست کاربر):** Motion system. یک واژگان +> مشترک در `apps/web/src/app/globals.css` — شش `@keyframes` و شش کلاس +> `.anim-*` بههمراه `.anim-stagger` برای ورود آبشاری — و همهٔ مدتزمانها +> پشت custom property. در `packages/ui/src/index.tsx` روی Button، Card، +> Stat، Loading/Empty/ErrorState، UsageBar، Timeline، Modal، Drawer، Table، +> ToastStack و ArtifactViewer اعمال شده و ریشهٔ هر صفحهٔ `(app)` با +> `.anim-stagger` وارد میشود. `prefers-reduced-motion` مدتزمانها را به +> ۰.۰۱ms میرساند تا وضعیت پایانی حفظ شود. قرارداد motion در +> `src/test/motion.test.tsx` Tests میشود تا بازنویسی بعدی آن را بیصدا +> حذف نکند. +> > **چیزهایی که عمداً باز ماندهاند:** در `docs/security-checklist.md` دو مورد > «⚠️ بدون تست اختصاصی» علامت خوردهاند (نبود secret در frontend، و مقدار پیشفرض > `NetworkPolicy.DENY_ALL`). هر دو کنترل در کد درست کار میکنند، فقط تست مستقل diff --git a/apps/web/src/app/(app)/admin/errors/page.tsx b/apps/web/src/app/(app)/admin/errors/page.tsx index dc83c43..fc91351 100644 --- a/apps/web/src/app/(app)/admin/errors/page.tsx +++ b/apps/web/src/app/(app)/admin/errors/page.tsx @@ -341,7 +341,7 @@ export default function AdminErrorsPage() { const tiles = summary?.open_by_severity ?? {}; return ( -
diff --git a/apps/web/src/app/(app)/admin/layout.tsx b/apps/web/src/app/(app)/admin/layout.tsx index b9e09a2..9809707 100644 --- a/apps/web/src/app/(app)/admin/layout.tsx +++ b/apps/web/src/app/(app)/admin/layout.tsx @@ -41,7 +41,7 @@ export default function AdminLayout({ children }: { children: React.ReactNode }) } return ( -