@askrjs/cli 0.0.2 → 0.0.4
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/README.md +46 -7
- package/dist/add.d.ts +16 -0
- package/dist/add.js +558 -1
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +43 -16
- package/dist/create.d.ts +5 -0
- package/dist/create.js +104 -26
- package/dist/directory-swap-DWoHtx7C.js +35 -0
- package/dist/discovery-Difb7Y4G.js +323 -0
- package/dist/generate.d.ts +5 -0
- package/dist/generate.js +461 -0
- package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
- package/dist/openapi.d.ts +25 -0
- package/dist/openapi.js +49 -16
- package/dist/planner-VAj7qlxr.js +285 -0
- package/dist/range-YUs9eimn.js +125 -0
- package/dist/registry-CyrRHRG5.js +209 -0
- package/dist/skills/askr-dashboard-charts/SKILL.md +61 -44
- package/dist/skills/askr-dashboard-charts/agents/openai.yaml +2 -2
- package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
- package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
- package/dist/skills.d.ts +18 -0
- package/dist/skills.js +1 -1
- package/dist/specification-DXnDOC-0.js +49 -0
- package/dist/ssg-config.d.ts +41 -0
- package/dist/ssg-config.js +1 -0
- package/dist/ssg.d.ts +61 -0
- package/dist/ssg.js +360 -24
- package/dist/templates/full-stack/AGENTS.md +0 -1
- package/dist/templates/full-stack/README.md +0 -1
- package/dist/templates/full-stack/index.html +0 -1
- package/dist/templates/full-stack/package.json +5 -3
- package/dist/templates/full-stack/server.ts +5 -9
- package/dist/templates/full-stack/src/action-authorizations.ts +2 -2
- package/dist/templates/full-stack/src/actions/create-message.ts +5 -5
- package/dist/templates/full-stack/src/i18n.ts +4 -4
- package/dist/templates/full-stack/src/main.tsx +4 -5
- package/dist/templates/full-stack/src/pages/home.tsx +5 -5
- package/dist/templates/full-stack/src/pages/layout.tsx +15 -5
- package/dist/templates/full-stack/src/pages/not-found.tsx +5 -2
- package/dist/templates/full-stack/src/routes.tsx +11 -12
- package/dist/templates/full-stack/src/schemas.ts +1 -2
- package/dist/templates/full-stack/src/server/action-registry.ts +5 -10
- package/dist/templates/full-stack/src/server/actions/create-message.ts +4 -4
- package/dist/templates/full-stack/src/server/app.ts +67 -57
- package/dist/templates/full-stack/src/server/dependencies.ts +10 -10
- package/dist/templates/full-stack/src/server/entry-server.ts +3 -3
- package/dist/templates/full-stack/src/telemetry.ts +1 -2
- package/dist/templates/full-stack/tests/actions/create-message.test.ts +7 -8
- package/dist/templates/full-stack/tsconfig.json +1 -2
- package/dist/templates/full-stack/vite.config.ts +5 -6
- package/dist/templates/spa/AGENTS.md +1 -1
- package/dist/templates/spa/package.json +3 -4
- package/dist/templates/spa/src/adapters/operations-client.ts +7 -2
- package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
- package/dist/templates/spa/src/pages/app/admin-home.tsx +21 -3
- package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
- package/dist/templates/spa/src/styles.css +1 -1
- package/dist/templates/spa/tsconfig.json +2 -1
- package/dist/templates/spa/vitest.config.ts +0 -4
- package/dist/templates/ssg/README.md +1 -1
- package/dist/templates/ssg/package.json +1 -1
- package/dist/templates/ssg/ssg.config.ts +7 -0
- package/dist/templates/ssg/tests/ssg-config.test.ts +5 -3
- package/dist/templates/ssg/tsconfig.json +2 -1
- package/dist/templates/ssg/vitest.config.ts +0 -4
- package/dist/templates/ssr/package.json +2 -2
- package/dist/templates/ssr/server.ts +4 -10
- package/dist/templates/ssr/src/entry-server.tsx +6 -4
- package/dist/templates/startkit/package.json +2 -2
- package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
- package/dist/templates/startkit/tsconfig.json +2 -1
- package/dist/update.d.ts +41 -0
- package/dist/update.js +282 -2
- package/dist/writer-D8qe_7ud.js +226 -0
- package/package.json +23 -22
- package/dist/add-DqhqRzBQ.js +0 -555
- package/dist/add-DqhqRzBQ.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/create.js.map +0 -1
- package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
- package/dist/openapi.js.map +0 -1
- package/dist/skills-Bh0mEhIx.js.map +0 -1
- package/dist/ssg.js.map +0 -1
- package/dist/templates/full-stack/src/vite-server.d.ts +0 -6
- package/dist/templates/spa/src/styles.d.ts +0 -1
- package/dist/templates/ssg/src/vite-env.d.ts +0 -5
- package/dist/templates/ssr/src/vite-server.d.ts +0 -7
- package/dist/templates/startkit/src/vite-env.d.ts +0 -5
- package/dist/update-DyW1na5V.js +0 -1140
- package/dist/update-DyW1na5V.js.map +0 -1
- package/skills/askr-accessibility/SKILL.md +0 -68
- package/skills/askr-accessibility/agents/openai.yaml +0 -4
- package/skills/askr-agent-execution/SKILL.md +0 -85
- package/skills/askr-agent-execution/agents/openai.yaml +0 -4
- package/skills/askr-agent-workflows/SKILL.md +0 -57
- package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
- package/skills/askr-api-integration/SKILL.md +0 -79
- package/skills/askr-api-integration/agents/openai.yaml +0 -4
- package/skills/askr-app-builder/SKILL.md +0 -99
- package/skills/askr-app-builder/agents/openai.yaml +0 -4
- package/skills/askr-auth-access/SKILL.md +0 -74
- package/skills/askr-auth-access/agents/openai.yaml +0 -4
- package/skills/askr-cli-vite/SKILL.md +0 -76
- package/skills/askr-cli-vite/agents/openai.yaml +0 -4
- package/skills/askr-dashboard-charts/SKILL.md +0 -82
- package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
- package/skills/askr-design-system/SKILL.md +0 -86
- package/skills/askr-design-system/agents/openai.yaml +0 -4
- package/skills/askr-env-config/SKILL.md +0 -74
- package/skills/askr-env-config/agents/openai.yaml +0 -4
- package/skills/askr-error-loading-empty/SKILL.md +0 -89
- package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
- package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
- package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
- package/skills/askr-forms-tables-crud/SKILL.md +0 -98
- package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
- package/skills/askr-mental-model/SKILL.md +0 -109
- package/skills/askr-mental-model/agents/openai.yaml +0 -4
- package/skills/askr-migration-react/SKILL.md +0 -81
- package/skills/askr-migration-react/agents/openai.yaml +0 -4
- package/skills/askr-observability-debugging/SKILL.md +0 -83
- package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
- package/skills/askr-project-structure/SKILL.md +0 -79
- package/skills/askr-project-structure/agents/openai.yaml +0 -4
- package/skills/askr-query-mutation/SKILL.md +0 -115
- package/skills/askr-query-mutation/agents/openai.yaml +0 -4
- package/skills/askr-realtime-streaming/SKILL.md +0 -76
- package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
- package/skills/askr-resources-data/SKILL.md +0 -100
- package/skills/askr-resources-data/agents/openai.yaml +0 -4
- package/skills/askr-routing-layouts/SKILL.md +0 -107
- package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
- package/skills/askr-runtime-reactivity/SKILL.md +0 -92
- package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
- package/skills/askr-ssr-ssg/SKILL.md +0 -76
- package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
- package/skills/askr-testing-determinism/SKILL.md +0 -75
- package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
- package/skills/askr-theming/SKILL.md +0 -86
- package/skills/askr-theming/agents/openai.yaml +0 -4
- package/skills/askr-ui-composition/SKILL.md +0 -92
- package/skills/askr-ui-composition/agents/openai.yaml +0 -4
- package/templates/full-stack/AGENTS.md +0 -12
- package/templates/full-stack/README.md +0 -18
- package/templates/full-stack/gitignore.template +0 -4
- package/templates/full-stack/index.html +0 -14
- package/templates/full-stack/package.json +0 -37
- package/templates/full-stack/server.ts +0 -13
- package/templates/full-stack/src/action-authorizations.ts +0 -10
- package/templates/full-stack/src/actions/create-message.ts +0 -10
- package/templates/full-stack/src/i18n.ts +0 -8
- package/templates/full-stack/src/main.tsx +0 -12
- package/templates/full-stack/src/pages/home.tsx +0 -25
- package/templates/full-stack/src/pages/layout.tsx +0 -33
- package/templates/full-stack/src/pages/not-found.tsx +0 -4
- package/templates/full-stack/src/routes.tsx +0 -20
- package/templates/full-stack/src/schemas.ts +0 -11
- package/templates/full-stack/src/server/action-registry.ts +0 -12
- package/templates/full-stack/src/server/actions/create-message.ts +0 -14
- package/templates/full-stack/src/server/app.ts +0 -66
- package/templates/full-stack/src/server/dependencies.ts +0 -55
- package/templates/full-stack/src/server/entry-server.ts +0 -8
- package/templates/full-stack/src/telemetry.ts +0 -4
- package/templates/full-stack/src/vite-server.d.ts +0 -6
- package/templates/full-stack/tests/actions/create-message.test.ts +0 -13
- package/templates/full-stack/tsconfig.json +0 -16
- package/templates/full-stack/vite.config.ts +0 -11
- package/templates/spa/AGENTS.md +0 -60
- package/templates/spa/README.md +0 -96
- package/templates/spa/gitignore.template +0 -16
- package/templates/spa/index.html +0 -13
- package/templates/spa/package.json +0 -35
- package/templates/spa/src/adapters/operations-client.ts +0 -90
- package/templates/spa/src/components/shared/metric-card.tsx +0 -27
- package/templates/spa/src/components/shared/status-badge.tsx +0 -24
- package/templates/spa/src/features/operations/operations.query.ts +0 -9
- package/templates/spa/src/main.tsx +0 -10
- package/templates/spa/src/pages/_layout.tsx +0 -9
- package/templates/spa/src/pages/_routes.tsx +0 -27
- package/templates/spa/src/pages/app/_layout.tsx +0 -94
- package/templates/spa/src/pages/app/_routes.tsx +0 -10
- package/templates/spa/src/pages/app/admin-home.tsx +0 -152
- package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
- package/templates/spa/src/pages/app/settings.tsx +0 -91
- package/templates/spa/src/pages/auth/_layout.tsx +0 -38
- package/templates/spa/src/pages/auth/_routes.tsx +0 -6
- package/templates/spa/src/pages/auth/login.tsx +0 -63
- package/templates/spa/src/pages/not-found.tsx +0 -22
- package/templates/spa/src/pages/public/_layout.tsx +0 -47
- package/templates/spa/src/pages/public/_routes.tsx +0 -6
- package/templates/spa/src/pages/public/home.tsx +0 -143
- package/templates/spa/src/shared/format.ts +0 -12
- package/templates/spa/src/shared/navigation.ts +0 -15
- package/templates/spa/src/styles/components.css +0 -49
- package/templates/spa/src/styles/layout.css +0 -192
- package/templates/spa/src/styles/reset.css +0 -44
- package/templates/spa/src/styles/theme.css +0 -57
- package/templates/spa/src/styles/tokens.css +0 -20
- package/templates/spa/src/styles.css +0 -7
- package/templates/spa/src/styles.d.ts +0 -1
- package/templates/spa/tests/app.test.tsx +0 -37
- package/templates/spa/tests/components/shared.test.tsx +0 -12
- package/templates/spa/tests/resources.test.ts +0 -22
- package/templates/spa/tsconfig.json +0 -20
- package/templates/spa/tsconfig.node.json +0 -10
- package/templates/spa/vite.config.ts +0 -24
- package/templates/spa/vitest.config.ts +0 -17
- package/templates/ssg/AGENTS.md +0 -55
- package/templates/ssg/README.md +0 -39
- package/templates/ssg/gitignore.template +0 -17
- package/templates/ssg/index.html +0 -13
- package/templates/ssg/package.json +0 -35
- package/templates/ssg/src/app.tsx +0 -14
- package/templates/ssg/src/components/badge.tsx +0 -3
- package/templates/ssg/src/components/counter.tsx +0 -30
- package/templates/ssg/src/components/site-shell.tsx +0 -111
- package/templates/ssg/src/jsx.d.ts +0 -23
- package/templates/ssg/src/main.tsx +0 -8
- package/templates/ssg/src/pages/about.tsx +0 -82
- package/templates/ssg/src/pages/content.tsx +0 -63
- package/templates/ssg/src/pages/example.tsx +0 -97
- package/templates/ssg/src/pages/home.tsx +0 -51
- package/templates/ssg/src/resources/user.ts +0 -15
- package/templates/ssg/src/routes.tsx +0 -15
- package/templates/ssg/src/styles.css +0 -89
- package/templates/ssg/src/vite-env.d.ts +0 -5
- package/templates/ssg/ssg.config.ts +0 -34
- package/templates/ssg/tests/app.test.tsx +0 -19
- package/templates/ssg/tests/components/counter.test.tsx +0 -18
- package/templates/ssg/tests/resources.test.ts +0 -11
- package/templates/ssg/tests/ssg-config.test.ts +0 -11
- package/templates/ssg/tsconfig.json +0 -20
- package/templates/ssg/tsconfig.node.json +0 -10
- package/templates/ssg/vite.config.ts +0 -24
- package/templates/ssg/vitest.config.ts +0 -17
- package/templates/ssr/AGENTS.md +0 -28
- package/templates/ssr/README.md +0 -38
- package/templates/ssr/gitignore.template +0 -16
- package/templates/ssr/index.html +0 -13
- package/templates/ssr/package.json +0 -34
- package/templates/ssr/server.ts +0 -16
- package/templates/ssr/src/app.tsx +0 -21
- package/templates/ssr/src/components/counter.tsx +0 -26
- package/templates/ssr/src/entry-server.tsx +0 -10
- package/templates/ssr/src/main.tsx +0 -11
- package/templates/ssr/src/pages/about.tsx +0 -75
- package/templates/ssr/src/pages/example.tsx +0 -113
- package/templates/ssr/src/pages/home.tsx +0 -56
- package/templates/ssr/src/resources/user.ts +0 -15
- package/templates/ssr/src/routes.tsx +0 -13
- package/templates/ssr/src/styles.css +0 -148
- package/templates/ssr/src/vite-server.d.ts +0 -7
- package/templates/ssr/tests/app.test.tsx +0 -24
- package/templates/ssr/tests/components/counter.test.tsx +0 -13
- package/templates/ssr/tests/resources.test.ts +0 -11
- package/templates/ssr/tsconfig.json +0 -22
- package/templates/ssr/tsconfig.node.json +0 -10
- package/templates/ssr/tsconfig.server.json +0 -15
- package/templates/ssr/vite.config.ts +0 -25
- package/templates/ssr/vitest.config.ts +0 -13
- package/templates/startkit/AGENTS.md +0 -77
- package/templates/startkit/README.md +0 -192
- package/templates/startkit/gitignore.template +0 -16
- package/templates/startkit/index.html +0 -13
- package/templates/startkit/package.json +0 -35
- package/templates/startkit/src/components/app-header.tsx +0 -93
- package/templates/startkit/src/components/app-sidebar.tsx +0 -95
- package/templates/startkit/src/components/data-table.tsx +0 -80
- package/templates/startkit/src/components/empty-state.tsx +0 -13
- package/templates/startkit/src/components/page-header.tsx +0 -23
- package/templates/startkit/src/components/stat-card.tsx +0 -24
- package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
- package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
- package/templates/startkit/src/lib/format.ts +0 -31
- package/templates/startkit/src/lib/mock-data.ts +0 -441
- package/templates/startkit/src/lib/routes.ts +0 -116
- package/templates/startkit/src/main.tsx +0 -12
- package/templates/startkit/src/pages/_layout.tsx +0 -56
- package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
- package/templates/startkit/src/pages/auth/login.tsx +0 -129
- package/templates/startkit/src/pages/home.tsx +0 -83
- package/templates/startkit/src/pages/not-found.tsx +0 -24
- package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
- package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
- package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
- package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
- package/templates/startkit/src/router.tsx +0 -7
- package/templates/startkit/src/routes/auth-config.ts +0 -38
- package/templates/startkit/src/routes/auth.ts +0 -8
- package/templates/startkit/src/routes/index.ts +0 -28
- package/templates/startkit/src/routes/public.ts +0 -8
- package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
- package/templates/startkit/src/routes/workspace/index.ts +0 -14
- package/templates/startkit/src/styles/components.css +0 -396
- package/templates/startkit/src/styles/layout.css +0 -192
- package/templates/startkit/src/styles/reset.css +0 -38
- package/templates/startkit/src/styles/theme.css +0 -76
- package/templates/startkit/src/styles/tokens.css +0 -67
- package/templates/startkit/src/styles.css +0 -7
- package/templates/startkit/src/toast.ts +0 -55
- package/templates/startkit/src/utils/join-classes.ts +0 -4
- package/templates/startkit/src/vite-env.d.ts +0 -5
- package/templates/startkit/tests/app.test.tsx +0 -32
- package/templates/startkit/tests/preferences.test.ts +0 -43
- package/templates/startkit/tests/resources.test.ts +0 -82
- package/templates/startkit/tsconfig.json +0 -20
- package/templates/startkit/tsconfig.node.json +0 -10
- package/templates/startkit/vite.config.ts +0 -32
- package/templates/startkit/vitest.config.ts +0 -13
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-auth-access
|
|
3
|
-
description: Use when building Askr authentication, session loading, public/app route branches, protected layouts, role and permission requirements, redirects, login/logout, and access-denied UX.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr Auth Access
|
|
7
|
-
|
|
8
|
-
Use this for authentication and authorization in route-first Askr apps. The goal is explicit route policy, explicit session resolution, and no token or permission logic leaking into pages.
|
|
9
|
-
|
|
10
|
-
## Inspect First
|
|
11
|
-
|
|
12
|
-
- `src/pages/_routes.tsx`, `src/pages/public/_routes.tsx`, and `src/pages/app/_routes.tsx`
|
|
13
|
-
- `src/pages/public/_layout.tsx` and `src/pages/app/_layout.tsx`
|
|
14
|
-
- Existing session, token, and user helpers in `src/shared` or `src/features/auth`
|
|
15
|
-
- Router auth resolver configuration
|
|
16
|
-
|
|
17
|
-
## Use This When
|
|
18
|
-
|
|
19
|
-
- You need guest-only and authenticated route branches.
|
|
20
|
-
- You need route-level auth or permission requirements.
|
|
21
|
-
- You need login, logout, redirect, or forbidden behavior.
|
|
22
|
-
- You need to keep access checks out of page-local component logic.
|
|
23
|
-
|
|
24
|
-
## Do This In Order
|
|
25
|
-
|
|
26
|
-
1. Keep public and authenticated branches explicit in the route tree.
|
|
27
|
-
2. Put an `AuthRequirement` on the narrowest route group or route that owns the policy.
|
|
28
|
-
3. Resolve session state before rendering protected data or destructive controls.
|
|
29
|
-
4. Redirect unauthenticated users to login with a return target when useful.
|
|
30
|
-
5. Show a signed-in forbidden state when the user is authenticated but lacks permission.
|
|
31
|
-
6. Keep token storage, refresh, and header policy in auth helpers or adapters, not components.
|
|
32
|
-
|
|
33
|
-
## Copy This Shape
|
|
34
|
-
|
|
35
|
-
```tsx
|
|
36
|
-
import { requireAnonymous, requireUser } from "@askrjs/auth";
|
|
37
|
-
|
|
38
|
-
group({ layout: AuthLayout, auth: requireAnonymous() }, () => {
|
|
39
|
-
registerAuthRoutes();
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
group({ layout: AppLayout, auth: requireUser() }, () => {
|
|
43
|
-
registerAppRoutes();
|
|
44
|
-
});
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Never Do These
|
|
48
|
-
|
|
49
|
-
- Per-page auth checks duplicated across protected routes.
|
|
50
|
-
- Rendering protected app data before session resolution.
|
|
51
|
-
- Putting token storage or API auth header logic in components.
|
|
52
|
-
- Treating roles and permissions as visual-only state.
|
|
53
|
-
- Client-only authorization decisions for sensitive server actions.
|
|
54
|
-
- Silent redirects when the user is signed in but lacks access.
|
|
55
|
-
|
|
56
|
-
## Validate
|
|
57
|
-
|
|
58
|
-
- Public and app branches are explicit.
|
|
59
|
-
- Protected routes have a function-based auth requirement in the route tree.
|
|
60
|
-
- Access-denied, loading, and redirect behavior are tested.
|
|
61
|
-
- Auth state is available to adapters without leaking transport details into UI.
|
|
62
|
-
|
|
63
|
-
## Done When
|
|
64
|
-
|
|
65
|
-
- Session resolution is explicit before protected data renders.
|
|
66
|
-
- Auth and authorization live in route requirements or auth workflows, not scattered through pages.
|
|
67
|
-
- Unauthorized, redirect, and signed-out states are all covered.
|
|
68
|
-
- Sensitive transport or token logic did not leak into UI components.
|
|
69
|
-
|
|
70
|
-
## Handoff
|
|
71
|
-
|
|
72
|
-
- Use `askr-routing-layouts` when auth changes also reshape the route tree.
|
|
73
|
-
- Use `askr-api-integration` when auth headers, session refresh, or adapter policy is changing.
|
|
74
|
-
- Use `askr-observability-debugging` when denial reasons or audit trails must stay visible.
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-cli-vite
|
|
3
|
-
description: Use when scaffolding Askr projects with @askrjs/cli, choosing spa/ssr/ssg/startkit templates, configuring @askrjs/vite, JSX import source, Vite build setup, generated app customization, or fixing transform wiring.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr CLI Vite
|
|
7
|
-
|
|
8
|
-
Use this only when the task is scaffold choice, initial project setup, or repair of Vite and transform wiring. It is not a normal feature-work skill after the app is already on the canonical path.
|
|
9
|
-
|
|
10
|
-
## Use This When
|
|
11
|
-
|
|
12
|
-
- Choosing between `spa`, `ssr`, `ssg`, and `startkit`.
|
|
13
|
-
- Fixing `@askrjs/vite` plugin wiring or JSX import-source setup.
|
|
14
|
-
- Repairing generated `package.json`, `vite.config.ts`, or `tsconfig` settings.
|
|
15
|
-
- Adjusting scaffolded build integration without changing runtime architecture.
|
|
16
|
-
|
|
17
|
-
## Inspect First
|
|
18
|
-
|
|
19
|
-
- `docs/create.md`
|
|
20
|
-
- `docs/workflows.md`
|
|
21
|
-
- Existing `package.json`, `vite.config.ts`, and `tsconfig.json`
|
|
22
|
-
- The nearest matching template under `templates/`
|
|
23
|
-
|
|
24
|
-
## Start From The Closest Template
|
|
25
|
-
|
|
26
|
-
- `startkit`: default for new product apps with dashboard, accounts, settings, login, themes, icons, and common checks.
|
|
27
|
-
- `spa`: minimal client-rendered interactive app.
|
|
28
|
-
- `ssr`: server-rendered app boundary.
|
|
29
|
-
- `ssg`: static generation scaffold with `ssg.config.ts`.
|
|
30
|
-
|
|
31
|
-
## Do This In Order
|
|
32
|
-
|
|
33
|
-
1. Choose the closest template instead of starting from raw Vite.
|
|
34
|
-
2. Preserve generated Vite wiring unless the app has a concrete build requirement.
|
|
35
|
-
3. Keep `askr()` as the owning plugin for Askr JSX and transforms.
|
|
36
|
-
4. Keep runtime route, data, and component decisions out of build config.
|
|
37
|
-
5. Treat generated files as app-owned after scaffold, not immutable.
|
|
38
|
-
6. Validate scripts and transforms before moving on to feature work.
|
|
39
|
-
|
|
40
|
-
## Copy This Shape
|
|
41
|
-
|
|
42
|
-
```ts
|
|
43
|
-
import { defineConfig } from "vite";
|
|
44
|
-
import { askr } from "@askrjs/vite";
|
|
45
|
-
|
|
46
|
-
export default defineConfig({
|
|
47
|
-
plugins: [askr()],
|
|
48
|
-
});
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Never Do These
|
|
52
|
-
|
|
53
|
-
- Duplicating JSX transform setup in Vite, `tsconfig`, and custom esbuild config.
|
|
54
|
-
- Choosing `startkit` for a tiny isolated demo when `spa` fits better.
|
|
55
|
-
- Treating CLI-generated files as immutable.
|
|
56
|
-
- Adding runtime route or data decisions to build config.
|
|
57
|
-
|
|
58
|
-
## Validate
|
|
59
|
-
|
|
60
|
-
- `vite.config.ts` uses `askr()`.
|
|
61
|
-
- `package.json` scripts match the selected template.
|
|
62
|
-
- `tsconfig` JSX settings match template conventions.
|
|
63
|
-
- `npm run dev`, `npm run build`, and available checks pass after setup.
|
|
64
|
-
|
|
65
|
-
## Done When
|
|
66
|
-
|
|
67
|
-
- The template matches the runtime boundary the app actually needs.
|
|
68
|
-
- Vite wiring stays package-owned and minimal.
|
|
69
|
-
- Generated files are ready for normal workflow skills.
|
|
70
|
-
- No runtime architecture leaked into build config.
|
|
71
|
-
|
|
72
|
-
## Handoff
|
|
73
|
-
|
|
74
|
-
- Use `askr-app-builder` only when the task is still a broad app brief.
|
|
75
|
-
- Use `askr-ssr-ssg` when the render boundary is the hard part.
|
|
76
|
-
- Use the normal route, data, or UI workflow skills once the scaffold exists.
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-dashboard-charts
|
|
3
|
-
description: Use when building askr dashboards, stat cards, activity feeds, product metrics, tables, async feedback, and @askrjs/charts visualizations such as area, bar, line, donut, heatmap, timeline, gauges, and chart chrome.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr Dashboard Charts
|
|
7
|
-
|
|
8
|
-
Use this for product dashboards and metric-heavy screens. The goal is route-owned data, deterministic metric formatting, and charts that answer product questions without inventing parallel UI systems.
|
|
9
|
-
|
|
10
|
-
## Use This When
|
|
11
|
-
|
|
12
|
-
- You are building a dashboard, metrics screen, stat-card surface, or chart-heavy route.
|
|
13
|
-
- The page needs resource-owned async loading plus chart composition.
|
|
14
|
-
- Charts and tables must share the same formatter logic.
|
|
15
|
-
- You need loading, empty, and error truth on a dense metrics screen.
|
|
16
|
-
|
|
17
|
-
## Inspect First
|
|
18
|
-
|
|
19
|
-
- `templates/startkit/src/pages/workspace/dashboard.tsx`
|
|
20
|
-
- Existing stat card, table, empty state, and chart styles
|
|
21
|
-
- Existing format helpers in `src/shared`
|
|
22
|
-
- Existing route or feature owners for the metrics you need
|
|
23
|
-
|
|
24
|
-
## Choose The Owner
|
|
25
|
-
|
|
26
|
-
- The route or page owns high-level loading and composition.
|
|
27
|
-
- `src/components/shared` owns reusable stat cards, page headers, tables, and empty states.
|
|
28
|
-
- `src/features/<domain>` owns domain-specific dashboard panels and metric workflows.
|
|
29
|
-
- `src/shared` owns formatting helpers so cards, tables, and charts stay consistent.
|
|
30
|
-
|
|
31
|
-
## Do This In Order
|
|
32
|
-
|
|
33
|
-
1. Load dashboard data in the route or feature container with `resource()` unless the data must be shared across screens.
|
|
34
|
-
2. Keep metric formatting in shared helpers.
|
|
35
|
-
3. Use `@askrjs/charts` components for chart visuals and keep CSS imported at the app boundary.
|
|
36
|
-
4. Pair charts with labels, summaries, or tables when precision matters.
|
|
37
|
-
5. Keep loading, empty, error, and refresh states explicit.
|
|
38
|
-
|
|
39
|
-
## Copy This Shape
|
|
40
|
-
|
|
41
|
-
```tsx
|
|
42
|
-
import { resource } from "@askrjs/askr/resources";
|
|
43
|
-
import { AreaChart, ChartPanel, ChartShell } from "@askrjs/charts/components";
|
|
44
|
-
|
|
45
|
-
const dashboard = resource(({ signal }) => loadDashboard({ signal }), []);
|
|
46
|
-
|
|
47
|
-
if (dashboard.pending && !dashboard.value) return <p>Loading dashboard...</p>;
|
|
48
|
-
if (dashboard.error) return <p role="alert">Unable to load dashboard.</p>;
|
|
49
|
-
|
|
50
|
-
<ChartShell title="Revenue" description="Last 7 days">
|
|
51
|
-
<ChartPanel title="Trend">
|
|
52
|
-
<AreaChart label="Revenue trend" data={dashboard.value.revenue} />
|
|
53
|
-
</ChartPanel>
|
|
54
|
-
</ChartShell>;
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Never Do These
|
|
58
|
-
|
|
59
|
-
- Inline mock metrics inside page JSX.
|
|
60
|
-
- Hardcoded chart colors in runtime code.
|
|
61
|
-
- Decorative charts that do not answer a product question.
|
|
62
|
-
- Dense dashboards without loading, empty, and error states.
|
|
63
|
-
|
|
64
|
-
## Validate
|
|
65
|
-
|
|
66
|
-
- Cards and charts share formatter logic.
|
|
67
|
-
- The page scans cleanly at mobile, tablet, and desktop widths.
|
|
68
|
-
- Chart data has stable labels and keys.
|
|
69
|
-
- Loading, empty, error, and refresh states are visible.
|
|
70
|
-
|
|
71
|
-
## Done When
|
|
72
|
-
|
|
73
|
-
- Route-owned loading and chart composition are clear.
|
|
74
|
-
- Metric formatting is shared and deterministic.
|
|
75
|
-
- Charts support the page's product question instead of decorating it.
|
|
76
|
-
- Async states remain explicit on the dashboard surface.
|
|
77
|
-
|
|
78
|
-
## Handoff
|
|
79
|
-
|
|
80
|
-
- Use `askr-resources-data` when async ownership is the real blocker.
|
|
81
|
-
- Use `askr-theming` when the hard part is shell and visual coherence.
|
|
82
|
-
- Use `askr-testing-determinism` before closing responsive or stateful chart changes.
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-design-system
|
|
3
|
-
description: Use when creating product-grade Askr interfaces, design-system rules, density, page hierarchy, navigation, forms, tables, panels, action placement, tokens, dark mode, responsive behavior, and operational UI polish.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr Design System
|
|
7
|
-
|
|
8
|
-
Use this only when a repeated product pattern must become shared across multiple screens. This is not the default starting skill for a single UI task.
|
|
9
|
-
|
|
10
|
-
## Inspect First
|
|
11
|
-
|
|
12
|
-
- Existing `src/styles`, tokens, theme imports, and shared components.
|
|
13
|
-
- `src/components/shared` before adding new UI building blocks.
|
|
14
|
-
- `@askrjs/themes` primitives already in use.
|
|
15
|
-
- Target product audience and primary workflows.
|
|
16
|
-
|
|
17
|
-
## Use This When
|
|
18
|
-
|
|
19
|
-
- The same pattern repeats across three or more screens.
|
|
20
|
-
- Theme primitives alone are not enough to express a product-specific shared pattern.
|
|
21
|
-
- You need consistent density, hierarchy, and action placement across the app.
|
|
22
|
-
- You are about to create a reusable product component, not just style one page.
|
|
23
|
-
|
|
24
|
-
## Product UI Defaults
|
|
25
|
-
|
|
26
|
-
- Prefer quiet, dense, scannable SaaS/admin interfaces.
|
|
27
|
-
- Use page headers, toolbars, panels, forms, tables, and clear action hierarchy.
|
|
28
|
-
- Keep primary actions close to the object or workflow they affect.
|
|
29
|
-
- Use icons for familiar tool actions and text for consequential commands.
|
|
30
|
-
- Use tokens and semantic slots rather than one-off visual styles.
|
|
31
|
-
- Before inventing a component, check `@askrjs/themes` layout, control, surface, feedback, shell, nav, and overlay exports.
|
|
32
|
-
|
|
33
|
-
## Do This In Order
|
|
34
|
-
|
|
35
|
-
1. Prove the pattern is repeated enough to deserve extraction.
|
|
36
|
-
2. Start from existing theme primitives and shared styles.
|
|
37
|
-
3. Extract the smallest product-specific shared component or CSS recipe that removes repetition.
|
|
38
|
-
4. Keep tokens in CSS and keep workflow logic out of design-system components.
|
|
39
|
-
5. Validate the pattern in light, dark, responsive, empty, error, and disabled states.
|
|
40
|
-
|
|
41
|
-
## Start From These Primitives
|
|
42
|
-
|
|
43
|
-
- Page width/rhythm: `Container`, `Section`.
|
|
44
|
-
- Vertical and horizontal composition: `Stack`, `Inline`, `Flex`.
|
|
45
|
-
- Responsive groups: `Block`.
|
|
46
|
-
- Low-level layout: `Box`, `Spacer`, `AspectRatio`.
|
|
47
|
-
- Product surfaces: `Card`, `Alert`, `Badge`, `ListGroup`, `Separator`, `Skeleton`.
|
|
48
|
-
- Forms/actions: `Button`, `ButtonGroup`, `Close`, `Field`, `FieldHint`, `FieldError`, `InputGroup`.
|
|
49
|
-
- Async states: `EmptyState`, `Spinner`, plus query/resource state-specific copy.
|
|
50
|
-
- App chrome: `Shell`, `ShellNav`, `ShellMain`, `Header`, `Sidebar`, `Navbar`.
|
|
51
|
-
- Navigation: `Nav`, `NavLink`, `NavGroup`, `NavBrand`, `Breadcrumb`, `Pagination`.
|
|
52
|
-
- Menus: themed `Dropdown`, `Menu`, and `Menubar` from `@askrjs/themes/components`.
|
|
53
|
-
|
|
54
|
-
## Never Do These
|
|
55
|
-
|
|
56
|
-
- Route layouts own shell chrome.
|
|
57
|
-
- Shared components own repeatable product surfaces.
|
|
58
|
-
- Page sections should be unframed layout regions; use cards/panels for repeated items or contained tools.
|
|
59
|
-
- Do not wrap cards inside cards; use `Section`, `Container`, `Stack`, and `Block` for page-level composition.
|
|
60
|
-
- Tables and forms should be compact but readable.
|
|
61
|
-
- Long labels must wrap or truncate intentionally.
|
|
62
|
-
- Marketing-page composition for operational apps.
|
|
63
|
-
- Decorative gradients, oversized hero panels, or low-density cards in work surfaces.
|
|
64
|
-
- Hardcoded colors and spacing outside tokens.
|
|
65
|
-
- Component variants that duplicate what CSS state or slots should handle.
|
|
66
|
-
- App-local design-system clones of theme primitives.
|
|
67
|
-
- Custom CSS grids or flex wrappers when `Block`, `Flex`, `Inline`, or `Stack` already express the layout.
|
|
68
|
-
|
|
69
|
-
## Validate
|
|
70
|
-
|
|
71
|
-
- Mobile, tablet, desktop, light, and dark modes are considered.
|
|
72
|
-
- Focus, hover, disabled, loading, empty, and error states feel consistent.
|
|
73
|
-
- Text does not overflow buttons, cards, navs, tables, or overlays.
|
|
74
|
-
- The interface optimizes repeated use, not only first impression.
|
|
75
|
-
|
|
76
|
-
## Done When
|
|
77
|
-
|
|
78
|
-
- A repeated product pattern became shared without creating a second component catalog.
|
|
79
|
-
- Theme primitives still provide the baseline behavior and styling model.
|
|
80
|
-
- The extracted pattern improves coherence across real repeated screens.
|
|
81
|
-
|
|
82
|
-
## Handoff
|
|
83
|
-
|
|
84
|
-
- Use `askr-theming` when the next step is token or shell styling.
|
|
85
|
-
- Use `askr-ui-composition` when the next step is interactive behavior.
|
|
86
|
-
- Use `askr-testing-determinism` before closing broad visual-system changes.
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-env-config
|
|
3
|
-
description: Use when configuring Askr apps with environment variables, API base URLs, feature flags, deployment config, local mocks, generated client configuration, and separating config from runtime state.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr Env Config
|
|
7
|
-
|
|
8
|
-
Use this for environment-specific application configuration. The goal is one typed config boundary, explicit public values, and no env reads scattered through UI code.
|
|
9
|
-
|
|
10
|
-
## Use This When
|
|
11
|
-
|
|
12
|
-
- You need API base URLs, feature flags, deployment config, or client configuration.
|
|
13
|
-
- The app has local mocks, staging behavior, or environment-specific stream endpoints.
|
|
14
|
-
- You need missing required config to fail early.
|
|
15
|
-
- You want tests to override config deterministically.
|
|
16
|
-
|
|
17
|
-
## Inspect First
|
|
18
|
-
|
|
19
|
-
- Existing Vite or runtime environment usage and app config helpers
|
|
20
|
-
- Generated API client configuration
|
|
21
|
-
- Local mock data and development-only switches
|
|
22
|
-
- Deployment target requirements
|
|
23
|
-
|
|
24
|
-
## Put Config In One Boundary
|
|
25
|
-
|
|
26
|
-
- Parse and validate config in `src/shared/config` or the repo's existing shared config module.
|
|
27
|
-
- Pass API base URLs and auth providers into `src/adapters`.
|
|
28
|
-
- Keep feature flags readable from features and pages without coupling them to transport details.
|
|
29
|
-
- Keep secrets out of client bundles.
|
|
30
|
-
|
|
31
|
-
## Do This In Order
|
|
32
|
-
|
|
33
|
-
1. Define a typed config object for the public values the client needs.
|
|
34
|
-
2. Validate required values at app startup.
|
|
35
|
-
3. Pass config into adapters and shared helpers instead of reading env values ad hoc.
|
|
36
|
-
4. Keep local mocks explicit and easy to disable.
|
|
37
|
-
5. Name and document reconnect intervals, stale thresholds, or polling settings centrally when the app is event-driven.
|
|
38
|
-
|
|
39
|
-
## Copy This Shape
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
export const appConfig = {
|
|
43
|
-
apiBaseUrl: requireEnv("VITE_API_BASE_URL"),
|
|
44
|
-
enableMocks: import.meta.env.VITE_ENABLE_MOCKS === "true",
|
|
45
|
-
streamReconnectMs: Number(import.meta.env.VITE_STREAM_RECONNECT_MS ?? 3000),
|
|
46
|
-
};
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Never Do These
|
|
50
|
-
|
|
51
|
-
- Reading env variables directly in many components.
|
|
52
|
-
- Shipping server secrets to the browser.
|
|
53
|
-
- Hidden dev mocks that change production behavior.
|
|
54
|
-
- Feature flags that fork route structure unpredictably.
|
|
55
|
-
|
|
56
|
-
## Validate
|
|
57
|
-
|
|
58
|
-
- Missing required config fails early with a useful message.
|
|
59
|
-
- API adapters receive config through one boundary.
|
|
60
|
-
- Local, staging, and production config paths are obvious.
|
|
61
|
-
- Tests can override config deterministically.
|
|
62
|
-
|
|
63
|
-
## Done When
|
|
64
|
-
|
|
65
|
-
- Public config is typed and centralized.
|
|
66
|
-
- Env reads no longer leak through UI files.
|
|
67
|
-
- Event-driven timing or fallback config is explicit where relevant.
|
|
68
|
-
- Secret and public config boundaries are clear.
|
|
69
|
-
|
|
70
|
-
## Handoff
|
|
71
|
-
|
|
72
|
-
- Use `askr-api-integration` when config shapes adapter behavior.
|
|
73
|
-
- Use `askr-realtime-streaming` when reconnect or polling config is the hard part.
|
|
74
|
-
- Use `askr-testing-determinism` when config override behavior needs validation.
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-error-loading-empty
|
|
3
|
-
description: Use when designing Askr loading, empty, error, stale, refreshing, pending-write, retry, disabled, partial-data, and eventual-consistency UX across routes, tables, forms, dashboards, queries, and mutations.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr Error Loading Empty
|
|
7
|
-
|
|
8
|
-
Use this whenever a feature touches async data or failure states. The goal is one truthful UI meaning per async state.
|
|
9
|
-
|
|
10
|
-
## Use This When
|
|
11
|
-
|
|
12
|
-
- You added a `resource()`, `createQuery()`, or `createMutation()` path.
|
|
13
|
-
- The screen can load, refresh, fail, be empty, or lag behind a write.
|
|
14
|
-
- The UX currently hides too much behind one spinner or one toast.
|
|
15
|
-
- The user needs truthful state during eventual consistency.
|
|
16
|
-
|
|
17
|
-
## Inspect First
|
|
18
|
-
|
|
19
|
-
- The owner of the async state.
|
|
20
|
-
- Existing shared alert, empty-state, skeleton, toast, and status components.
|
|
21
|
-
- Query fields such as `loading`, `refreshing`, `stale`, and `consistency`.
|
|
22
|
-
- Mutation fields such as `pending`, `error`, `result`, and `status`.
|
|
23
|
-
|
|
24
|
-
## Use This Vocabulary
|
|
25
|
-
|
|
26
|
-
- Initial loading: no usable data yet.
|
|
27
|
-
- Refreshing: old data is visible while new data loads.
|
|
28
|
-
- Empty: request succeeded but no records match.
|
|
29
|
-
- Error: request failed and user needs recovery or explanation.
|
|
30
|
-
- Partial: some data is usable, some failed or is still loading.
|
|
31
|
-
- Pending write: command accepted but read model may not reflect it yet.
|
|
32
|
-
- Stale: current read model is known or suspected to be behind.
|
|
33
|
-
|
|
34
|
-
## Do This In Order
|
|
35
|
-
|
|
36
|
-
1. Render a distinct state for initial load, empty, error, refresh, and pending write.
|
|
37
|
-
2. Keep useful old data visible during refresh when it is safe to do so.
|
|
38
|
-
3. Use truthful copy such as `refreshing`, `saved, syncing`, or `reconnecting`.
|
|
39
|
-
4. Disable only the actions that are actually unsafe.
|
|
40
|
-
5. Prefer row-level or local status when only one record is stale or pending.
|
|
41
|
-
|
|
42
|
-
## Copy This Shape
|
|
43
|
-
|
|
44
|
-
```tsx
|
|
45
|
-
if (accounts.pending && !accounts.value) {
|
|
46
|
-
return <p>Loading accounts...</p>;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (accounts.error && !accounts.value) {
|
|
50
|
-
return <p role="alert">Unable to load accounts.</p>;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return (
|
|
54
|
-
<section>
|
|
55
|
-
<Show when={accounts.refreshing || accounts.consistency === "pending-write"}>
|
|
56
|
-
<p role="status">Saved, syncing...</p>
|
|
57
|
-
</Show>
|
|
58
|
-
|
|
59
|
-
<Show when={(accounts.value?.items.length ?? 0) === 0}>
|
|
60
|
-
<p>No accounts matched this filter.</p>
|
|
61
|
-
</Show>
|
|
62
|
-
|
|
63
|
-
<AccountsTable rows={accounts.value?.items ?? []} />
|
|
64
|
-
</section>
|
|
65
|
-
);
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
- One spinner for every async state.
|
|
69
|
-
- Empty states that hide errors.
|
|
70
|
-
- Toast-only errors for important failed workflows.
|
|
71
|
-
- Claiming a write is fully complete before the read side confirms it.
|
|
72
|
-
- Clearing useful data during refresh.
|
|
73
|
-
- Global blocking UI when only one row or one mutation is actually stale.
|
|
74
|
-
|
|
75
|
-
## Validate
|
|
76
|
-
|
|
77
|
-
- Initial, refresh, empty, error, stale, and pending-write states are distinct.
|
|
78
|
-
- Retry paths call the real owner.
|
|
79
|
-
- Important failures are visible without depending only on color or toast.
|
|
80
|
-
- Copy tells the truth about eventual consistency.
|
|
81
|
-
|
|
82
|
-
## Done When
|
|
83
|
-
|
|
84
|
-
- The screen no longer hides multiple async truths behind one spinner.
|
|
85
|
-
|
|
86
|
-
## Handoff
|
|
87
|
-
|
|
88
|
-
- Use `askr-query-mutation` or `askr-resources-data` when the owning state model is still unclear.
|
|
89
|
-
- Use `askr-accessibility` when announcements, focus, or row-level status semantics need review.
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: askr-file-upload-artifacts
|
|
3
|
-
description: Use when building Askr file uploads, generated artifacts, progress, previews, validation, storage adapters, downloads, open flows, virus-scan or processing states, and event-sourced artifact readiness.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Askr File Upload Artifacts
|
|
7
|
-
|
|
8
|
-
Use this for uploads, downloads, previews, and generated files. The goal is one clear upload workflow, explicit processing truth, and no loss of progress or readiness state.
|
|
9
|
-
|
|
10
|
-
## Use This When
|
|
11
|
-
|
|
12
|
-
- You need file selection, upload, processing, preview, or download flows.
|
|
13
|
-
- Artifacts may be generated asynchronously after upload.
|
|
14
|
-
- You need progress, retry, cancellation, or readiness reconciliation.
|
|
15
|
-
- Validation rules include type, size, count, privacy, or retention.
|
|
16
|
-
|
|
17
|
-
## Inspect First
|
|
18
|
-
|
|
19
|
-
- Adapter support for upload URLs, multipart uploads, or artifact APIs
|
|
20
|
-
- Feature workflow for create, upload, process, and download
|
|
21
|
-
- File validation rules: type, size, count, privacy, retention
|
|
22
|
-
- Artifact processing states and event stream support
|
|
23
|
-
|
|
24
|
-
## Choose The Boundary
|
|
25
|
-
|
|
26
|
-
- `src/adapters`: upload transport, signed URL calls, artifact downloads.
|
|
27
|
-
- `src/features/<feature>`: validation, upload workflow, and artifact query or mutation state.
|
|
28
|
-
- `src/components/shared`: reusable file picker, progress list, and preview shell.
|
|
29
|
-
- `src/shared`: size formatting, safe filename helpers, and error normalization.
|
|
30
|
-
|
|
31
|
-
## Do This In Order
|
|
32
|
-
|
|
33
|
-
1. Keep file validation explicit before upload starts.
|
|
34
|
-
2. Model selection, uploading, processing, ready, and failure as separate states.
|
|
35
|
-
3. Preserve upload ID, artifact ID, processing job ID, and last event ID when readiness is asynchronous.
|
|
36
|
-
4. Treat upload completion and artifact readiness as separate truths.
|
|
37
|
-
5. Allow retry or refresh without duplicating uploads where possible.
|
|
38
|
-
|
|
39
|
-
## Copy This Shape
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
type ArtifactStatus =
|
|
43
|
-
| "selected"
|
|
44
|
-
| "uploading"
|
|
45
|
-
| "processing"
|
|
46
|
-
| "ready"
|
|
47
|
-
| "failed-validation"
|
|
48
|
-
| "failed-upload"
|
|
49
|
-
| "failed-processing";
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Never Do These
|
|
53
|
-
|
|
54
|
-
- Pretending an artifact is ready immediately after upload when processing is asynchronous.
|
|
55
|
-
- Client-only validation as the only protection.
|
|
56
|
-
- Losing progress and error state on route-local rerenders.
|
|
57
|
-
- Download links without accessible names or file metadata.
|
|
58
|
-
|
|
59
|
-
## Validate
|
|
60
|
-
|
|
61
|
-
- Validation, upload, processing, ready, and failure states are visible.
|
|
62
|
-
- Upload cancellation or retry behavior is explicit.
|
|
63
|
-
- Large files and unsupported types fail clearly.
|
|
64
|
-
- Artifact readiness is reconciled from server state.
|
|
65
|
-
|
|
66
|
-
## Done When
|
|
67
|
-
|
|
68
|
-
- Upload completion and artifact readiness are modeled separately.
|
|
69
|
-
- Progress and error state survive the owning workflow.
|
|
70
|
-
- Artifact metadata is preserved for retries and reconciliation.
|
|
71
|
-
- Users can understand whether a file is uploaded, processing, ready, or failed.
|
|
72
|
-
|
|
73
|
-
## Handoff
|
|
74
|
-
|
|
75
|
-
- Use `askr-api-integration` when signed URLs or artifact APIs are the hard part.
|
|
76
|
-
- Use `askr-error-loading-empty` when the hard part is presenting processing and failure truth.
|
|
77
|
-
- Use `askr-testing-determinism` before closing upload and retry behavior.
|