@askrjs/cli 0.0.2
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/LICENSE +201 -0
- package/README.md +140 -0
- package/dist/add-DqhqRzBQ.js +555 -0
- package/dist/add-DqhqRzBQ.js.map +1 -0
- package/dist/add.js +3 -0
- package/dist/cli.js +91 -0
- package/dist/cli.js.map +1 -0
- package/dist/create.js +923 -0
- package/dist/create.js.map +1 -0
- package/dist/is-direct-execution-Cdlr-ZUl.js +20 -0
- package/dist/is-direct-execution-Cdlr-ZUl.js.map +1 -0
- package/dist/openapi.js +127 -0
- package/dist/openapi.js.map +1 -0
- package/dist/skills/askr-accessibility/SKILL.md +68 -0
- package/dist/skills/askr-accessibility/agents/openai.yaml +4 -0
- package/dist/skills/askr-agent-execution/SKILL.md +85 -0
- package/dist/skills/askr-agent-execution/agents/openai.yaml +4 -0
- package/dist/skills/askr-agent-workflows/SKILL.md +57 -0
- package/dist/skills/askr-agent-workflows/agents/openai.yaml +4 -0
- package/dist/skills/askr-api-integration/SKILL.md +79 -0
- package/dist/skills/askr-api-integration/agents/openai.yaml +4 -0
- package/dist/skills/askr-app-builder/SKILL.md +99 -0
- package/dist/skills/askr-app-builder/agents/openai.yaml +4 -0
- package/dist/skills/askr-auth-access/SKILL.md +74 -0
- package/dist/skills/askr-auth-access/agents/openai.yaml +4 -0
- package/dist/skills/askr-cli-vite/SKILL.md +76 -0
- package/dist/skills/askr-cli-vite/agents/openai.yaml +4 -0
- package/dist/skills/askr-dashboard-charts/SKILL.md +82 -0
- package/dist/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
- package/dist/skills/askr-design-system/SKILL.md +86 -0
- package/dist/skills/askr-design-system/agents/openai.yaml +4 -0
- package/dist/skills/askr-env-config/SKILL.md +74 -0
- package/dist/skills/askr-env-config/agents/openai.yaml +4 -0
- package/dist/skills/askr-error-loading-empty/SKILL.md +89 -0
- package/dist/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
- package/dist/skills/askr-file-upload-artifacts/SKILL.md +77 -0
- package/dist/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
- package/dist/skills/askr-forms-tables-crud/SKILL.md +98 -0
- package/dist/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
- package/dist/skills/askr-mental-model/SKILL.md +109 -0
- package/dist/skills/askr-mental-model/agents/openai.yaml +4 -0
- package/dist/skills/askr-migration-react/SKILL.md +81 -0
- package/dist/skills/askr-migration-react/agents/openai.yaml +4 -0
- package/dist/skills/askr-observability-debugging/SKILL.md +83 -0
- package/dist/skills/askr-observability-debugging/agents/openai.yaml +4 -0
- package/dist/skills/askr-project-structure/SKILL.md +79 -0
- package/dist/skills/askr-project-structure/agents/openai.yaml +4 -0
- package/dist/skills/askr-query-mutation/SKILL.md +115 -0
- package/dist/skills/askr-query-mutation/agents/openai.yaml +4 -0
- package/dist/skills/askr-realtime-streaming/SKILL.md +76 -0
- package/dist/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
- package/dist/skills/askr-resources-data/SKILL.md +100 -0
- package/dist/skills/askr-resources-data/agents/openai.yaml +4 -0
- package/dist/skills/askr-routing-layouts/SKILL.md +107 -0
- package/dist/skills/askr-routing-layouts/agents/openai.yaml +4 -0
- package/dist/skills/askr-runtime-reactivity/SKILL.md +92 -0
- package/dist/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
- package/dist/skills/askr-ssr-ssg/SKILL.md +76 -0
- package/dist/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
- package/dist/skills/askr-testing-determinism/SKILL.md +75 -0
- package/dist/skills/askr-testing-determinism/agents/openai.yaml +4 -0
- package/dist/skills/askr-theming/SKILL.md +86 -0
- package/dist/skills/askr-theming/agents/openai.yaml +4 -0
- package/dist/skills/askr-ui-composition/SKILL.md +92 -0
- package/dist/skills/askr-ui-composition/agents/openai.yaml +4 -0
- package/dist/skills-Bh0mEhIx.js +682 -0
- package/dist/skills-Bh0mEhIx.js.map +1 -0
- package/dist/skills.js +3 -0
- package/dist/ssg.js +188 -0
- package/dist/ssg.js.map +1 -0
- package/dist/templates/full-stack/AGENTS.md +12 -0
- package/dist/templates/full-stack/README.md +18 -0
- package/dist/templates/full-stack/gitignore.template +4 -0
- package/dist/templates/full-stack/index.html +14 -0
- package/dist/templates/full-stack/package.json +37 -0
- package/dist/templates/full-stack/server.ts +13 -0
- package/dist/templates/full-stack/src/action-authorizations.ts +10 -0
- package/dist/templates/full-stack/src/actions/create-message.ts +10 -0
- package/dist/templates/full-stack/src/i18n.ts +8 -0
- package/dist/templates/full-stack/src/main.tsx +12 -0
- package/dist/templates/full-stack/src/pages/home.tsx +25 -0
- package/dist/templates/full-stack/src/pages/layout.tsx +33 -0
- package/dist/templates/full-stack/src/pages/not-found.tsx +4 -0
- package/dist/templates/full-stack/src/routes.tsx +20 -0
- package/dist/templates/full-stack/src/schemas.ts +11 -0
- package/dist/templates/full-stack/src/server/action-registry.ts +12 -0
- package/dist/templates/full-stack/src/server/actions/create-message.ts +14 -0
- package/dist/templates/full-stack/src/server/app.ts +66 -0
- package/dist/templates/full-stack/src/server/dependencies.ts +55 -0
- package/dist/templates/full-stack/src/server/entry-server.ts +8 -0
- package/dist/templates/full-stack/src/telemetry.ts +4 -0
- package/dist/templates/full-stack/src/vite-server.d.ts +6 -0
- package/dist/templates/full-stack/tests/actions/create-message.test.ts +13 -0
- package/dist/templates/full-stack/tsconfig.json +16 -0
- package/dist/templates/full-stack/vite.config.ts +11 -0
- package/dist/templates/spa/AGENTS.md +60 -0
- package/dist/templates/spa/README.md +96 -0
- package/dist/templates/spa/gitignore.template +16 -0
- package/dist/templates/spa/index.html +13 -0
- package/dist/templates/spa/package.json +35 -0
- package/dist/templates/spa/src/adapters/operations-client.ts +90 -0
- package/dist/templates/spa/src/components/shared/metric-card.tsx +27 -0
- package/dist/templates/spa/src/components/shared/status-badge.tsx +24 -0
- package/dist/templates/spa/src/features/operations/operations.query.ts +9 -0
- package/dist/templates/spa/src/main.tsx +10 -0
- package/dist/templates/spa/src/pages/_layout.tsx +9 -0
- package/dist/templates/spa/src/pages/_routes.tsx +27 -0
- package/dist/templates/spa/src/pages/app/_layout.tsx +94 -0
- package/dist/templates/spa/src/pages/app/_routes.tsx +10 -0
- package/dist/templates/spa/src/pages/app/admin-home.tsx +152 -0
- package/dist/templates/spa/src/pages/app/agent-runs.tsx +93 -0
- package/dist/templates/spa/src/pages/app/settings.tsx +91 -0
- package/dist/templates/spa/src/pages/auth/_layout.tsx +38 -0
- package/dist/templates/spa/src/pages/auth/_routes.tsx +6 -0
- package/dist/templates/spa/src/pages/auth/login.tsx +63 -0
- package/dist/templates/spa/src/pages/not-found.tsx +22 -0
- package/dist/templates/spa/src/pages/public/_layout.tsx +47 -0
- package/dist/templates/spa/src/pages/public/_routes.tsx +6 -0
- package/dist/templates/spa/src/pages/public/home.tsx +143 -0
- package/dist/templates/spa/src/shared/format.ts +12 -0
- package/dist/templates/spa/src/shared/navigation.ts +15 -0
- package/dist/templates/spa/src/styles/components.css +49 -0
- package/dist/templates/spa/src/styles/layout.css +192 -0
- package/dist/templates/spa/src/styles/reset.css +44 -0
- package/dist/templates/spa/src/styles/theme.css +57 -0
- package/dist/templates/spa/src/styles/tokens.css +20 -0
- package/dist/templates/spa/src/styles.css +7 -0
- package/dist/templates/spa/src/styles.d.ts +1 -0
- package/dist/templates/spa/tests/app.test.tsx +37 -0
- package/dist/templates/spa/tests/components/shared.test.tsx +12 -0
- package/dist/templates/spa/tests/resources.test.ts +22 -0
- package/dist/templates/spa/tsconfig.json +20 -0
- package/dist/templates/spa/tsconfig.node.json +10 -0
- package/dist/templates/spa/vite.config.ts +24 -0
- package/dist/templates/spa/vitest.config.ts +17 -0
- package/dist/templates/ssg/AGENTS.md +55 -0
- package/dist/templates/ssg/README.md +39 -0
- package/dist/templates/ssg/gitignore.template +17 -0
- package/dist/templates/ssg/index.html +13 -0
- package/dist/templates/ssg/package.json +35 -0
- package/dist/templates/ssg/src/app.tsx +14 -0
- package/dist/templates/ssg/src/components/badge.tsx +3 -0
- package/dist/templates/ssg/src/components/counter.tsx +30 -0
- package/dist/templates/ssg/src/components/site-shell.tsx +111 -0
- package/dist/templates/ssg/src/jsx.d.ts +23 -0
- package/dist/templates/ssg/src/main.tsx +8 -0
- package/dist/templates/ssg/src/pages/about.tsx +82 -0
- package/dist/templates/ssg/src/pages/content.tsx +63 -0
- package/dist/templates/ssg/src/pages/example.tsx +97 -0
- package/dist/templates/ssg/src/pages/home.tsx +51 -0
- package/dist/templates/ssg/src/resources/user.ts +15 -0
- package/dist/templates/ssg/src/routes.tsx +15 -0
- package/dist/templates/ssg/src/styles.css +89 -0
- package/dist/templates/ssg/src/vite-env.d.ts +5 -0
- package/dist/templates/ssg/ssg.config.ts +34 -0
- package/dist/templates/ssg/tests/app.test.tsx +19 -0
- package/dist/templates/ssg/tests/components/counter.test.tsx +18 -0
- package/dist/templates/ssg/tests/resources.test.ts +11 -0
- package/dist/templates/ssg/tests/ssg-config.test.ts +11 -0
- package/dist/templates/ssg/tsconfig.json +20 -0
- package/dist/templates/ssg/tsconfig.node.json +10 -0
- package/dist/templates/ssg/vite.config.ts +24 -0
- package/dist/templates/ssg/vitest.config.ts +17 -0
- package/dist/templates/ssr/AGENTS.md +28 -0
- package/dist/templates/ssr/README.md +38 -0
- package/dist/templates/ssr/gitignore.template +16 -0
- package/dist/templates/ssr/index.html +13 -0
- package/dist/templates/ssr/package.json +34 -0
- package/dist/templates/ssr/server.ts +16 -0
- package/dist/templates/ssr/src/app.tsx +21 -0
- package/dist/templates/ssr/src/components/counter.tsx +26 -0
- package/dist/templates/ssr/src/entry-server.tsx +10 -0
- package/dist/templates/ssr/src/main.tsx +11 -0
- package/dist/templates/ssr/src/pages/about.tsx +75 -0
- package/dist/templates/ssr/src/pages/example.tsx +113 -0
- package/dist/templates/ssr/src/pages/home.tsx +56 -0
- package/dist/templates/ssr/src/resources/user.ts +15 -0
- package/dist/templates/ssr/src/routes.tsx +13 -0
- package/dist/templates/ssr/src/styles.css +148 -0
- package/dist/templates/ssr/src/vite-server.d.ts +7 -0
- package/dist/templates/ssr/tests/app.test.tsx +24 -0
- package/dist/templates/ssr/tests/components/counter.test.tsx +13 -0
- package/dist/templates/ssr/tests/resources.test.ts +11 -0
- package/dist/templates/ssr/tsconfig.json +22 -0
- package/dist/templates/ssr/tsconfig.node.json +10 -0
- package/dist/templates/ssr/tsconfig.server.json +15 -0
- package/dist/templates/ssr/vite.config.ts +25 -0
- package/dist/templates/ssr/vitest.config.ts +13 -0
- package/dist/templates/startkit/AGENTS.md +77 -0
- package/dist/templates/startkit/README.md +192 -0
- package/dist/templates/startkit/gitignore.template +16 -0
- package/dist/templates/startkit/index.html +13 -0
- package/dist/templates/startkit/package.json +35 -0
- package/dist/templates/startkit/src/components/app-header.tsx +93 -0
- package/dist/templates/startkit/src/components/app-sidebar.tsx +95 -0
- package/dist/templates/startkit/src/components/data-table.tsx +80 -0
- package/dist/templates/startkit/src/components/empty-state.tsx +13 -0
- package/dist/templates/startkit/src/components/page-header.tsx +23 -0
- package/dist/templates/startkit/src/components/stat-card.tsx +24 -0
- package/dist/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
- package/dist/templates/startkit/src/features/accounts/account-table.tsx +79 -0
- package/dist/templates/startkit/src/lib/format.ts +31 -0
- package/dist/templates/startkit/src/lib/mock-data.ts +441 -0
- package/dist/templates/startkit/src/lib/routes.ts +116 -0
- package/dist/templates/startkit/src/main.tsx +12 -0
- package/dist/templates/startkit/src/pages/_layout.tsx +56 -0
- package/dist/templates/startkit/src/pages/auth/_layout.tsx +7 -0
- package/dist/templates/startkit/src/pages/auth/login.tsx +129 -0
- package/dist/templates/startkit/src/pages/home.tsx +83 -0
- package/dist/templates/startkit/src/pages/not-found.tsx +24 -0
- package/dist/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
- package/dist/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
- package/dist/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
- package/dist/templates/startkit/src/pages/workspace/settings.tsx +218 -0
- package/dist/templates/startkit/src/router.tsx +7 -0
- package/dist/templates/startkit/src/routes/auth-config.ts +38 -0
- package/dist/templates/startkit/src/routes/auth.ts +8 -0
- package/dist/templates/startkit/src/routes/index.ts +28 -0
- package/dist/templates/startkit/src/routes/public.ts +8 -0
- package/dist/templates/startkit/src/routes/workspace/accounts.ts +8 -0
- package/dist/templates/startkit/src/routes/workspace/index.ts +14 -0
- package/dist/templates/startkit/src/styles/components.css +396 -0
- package/dist/templates/startkit/src/styles/layout.css +192 -0
- package/dist/templates/startkit/src/styles/reset.css +38 -0
- package/dist/templates/startkit/src/styles/theme.css +76 -0
- package/dist/templates/startkit/src/styles/tokens.css +67 -0
- package/dist/templates/startkit/src/styles.css +7 -0
- package/dist/templates/startkit/src/toast.ts +55 -0
- package/dist/templates/startkit/src/utils/join-classes.ts +4 -0
- package/dist/templates/startkit/src/vite-env.d.ts +5 -0
- package/dist/templates/startkit/tests/app.test.tsx +32 -0
- package/dist/templates/startkit/tests/preferences.test.ts +43 -0
- package/dist/templates/startkit/tests/resources.test.ts +82 -0
- package/dist/templates/startkit/tsconfig.json +20 -0
- package/dist/templates/startkit/tsconfig.node.json +10 -0
- package/dist/templates/startkit/vite.config.ts +32 -0
- package/dist/templates/startkit/vitest.config.ts +13 -0
- package/dist/update-DyW1na5V.js +1140 -0
- package/dist/update-DyW1na5V.js.map +1 -0
- package/dist/update.js +3 -0
- package/package.json +84 -0
- package/skills/askr-accessibility/SKILL.md +68 -0
- package/skills/askr-accessibility/agents/openai.yaml +4 -0
- package/skills/askr-agent-execution/SKILL.md +85 -0
- package/skills/askr-agent-execution/agents/openai.yaml +4 -0
- package/skills/askr-agent-workflows/SKILL.md +57 -0
- package/skills/askr-agent-workflows/agents/openai.yaml +4 -0
- package/skills/askr-api-integration/SKILL.md +79 -0
- package/skills/askr-api-integration/agents/openai.yaml +4 -0
- package/skills/askr-app-builder/SKILL.md +99 -0
- package/skills/askr-app-builder/agents/openai.yaml +4 -0
- package/skills/askr-auth-access/SKILL.md +74 -0
- package/skills/askr-auth-access/agents/openai.yaml +4 -0
- package/skills/askr-cli-vite/SKILL.md +76 -0
- package/skills/askr-cli-vite/agents/openai.yaml +4 -0
- package/skills/askr-dashboard-charts/SKILL.md +82 -0
- package/skills/askr-dashboard-charts/agents/openai.yaml +4 -0
- package/skills/askr-design-system/SKILL.md +86 -0
- package/skills/askr-design-system/agents/openai.yaml +4 -0
- package/skills/askr-env-config/SKILL.md +74 -0
- package/skills/askr-env-config/agents/openai.yaml +4 -0
- package/skills/askr-error-loading-empty/SKILL.md +89 -0
- package/skills/askr-error-loading-empty/agents/openai.yaml +4 -0
- package/skills/askr-file-upload-artifacts/SKILL.md +77 -0
- package/skills/askr-file-upload-artifacts/agents/openai.yaml +4 -0
- package/skills/askr-forms-tables-crud/SKILL.md +98 -0
- package/skills/askr-forms-tables-crud/agents/openai.yaml +4 -0
- package/skills/askr-mental-model/SKILL.md +109 -0
- package/skills/askr-mental-model/agents/openai.yaml +4 -0
- package/skills/askr-migration-react/SKILL.md +81 -0
- package/skills/askr-migration-react/agents/openai.yaml +4 -0
- package/skills/askr-observability-debugging/SKILL.md +83 -0
- package/skills/askr-observability-debugging/agents/openai.yaml +4 -0
- package/skills/askr-project-structure/SKILL.md +79 -0
- package/skills/askr-project-structure/agents/openai.yaml +4 -0
- package/skills/askr-query-mutation/SKILL.md +115 -0
- package/skills/askr-query-mutation/agents/openai.yaml +4 -0
- package/skills/askr-realtime-streaming/SKILL.md +76 -0
- package/skills/askr-realtime-streaming/agents/openai.yaml +4 -0
- package/skills/askr-resources-data/SKILL.md +100 -0
- package/skills/askr-resources-data/agents/openai.yaml +4 -0
- package/skills/askr-routing-layouts/SKILL.md +107 -0
- package/skills/askr-routing-layouts/agents/openai.yaml +4 -0
- package/skills/askr-runtime-reactivity/SKILL.md +92 -0
- package/skills/askr-runtime-reactivity/agents/openai.yaml +4 -0
- package/skills/askr-ssr-ssg/SKILL.md +76 -0
- package/skills/askr-ssr-ssg/agents/openai.yaml +4 -0
- package/skills/askr-testing-determinism/SKILL.md +75 -0
- package/skills/askr-testing-determinism/agents/openai.yaml +4 -0
- package/skills/askr-theming/SKILL.md +86 -0
- package/skills/askr-theming/agents/openai.yaml +4 -0
- package/skills/askr-ui-composition/SKILL.md +92 -0
- package/skills/askr-ui-composition/agents/openai.yaml +4 -0
- package/templates/full-stack/AGENTS.md +12 -0
- package/templates/full-stack/README.md +18 -0
- package/templates/full-stack/gitignore.template +4 -0
- package/templates/full-stack/index.html +14 -0
- package/templates/full-stack/package.json +37 -0
- package/templates/full-stack/server.ts +13 -0
- package/templates/full-stack/src/action-authorizations.ts +10 -0
- package/templates/full-stack/src/actions/create-message.ts +10 -0
- package/templates/full-stack/src/i18n.ts +8 -0
- package/templates/full-stack/src/main.tsx +12 -0
- package/templates/full-stack/src/pages/home.tsx +25 -0
- package/templates/full-stack/src/pages/layout.tsx +33 -0
- package/templates/full-stack/src/pages/not-found.tsx +4 -0
- package/templates/full-stack/src/routes.tsx +20 -0
- package/templates/full-stack/src/schemas.ts +11 -0
- package/templates/full-stack/src/server/action-registry.ts +12 -0
- package/templates/full-stack/src/server/actions/create-message.ts +14 -0
- package/templates/full-stack/src/server/app.ts +66 -0
- package/templates/full-stack/src/server/dependencies.ts +55 -0
- package/templates/full-stack/src/server/entry-server.ts +8 -0
- package/templates/full-stack/src/telemetry.ts +4 -0
- package/templates/full-stack/src/vite-server.d.ts +6 -0
- package/templates/full-stack/tests/actions/create-message.test.ts +13 -0
- package/templates/full-stack/tsconfig.json +16 -0
- package/templates/full-stack/vite.config.ts +11 -0
- package/templates/spa/AGENTS.md +60 -0
- package/templates/spa/README.md +96 -0
- package/templates/spa/gitignore.template +16 -0
- package/templates/spa/index.html +13 -0
- package/templates/spa/package.json +35 -0
- package/templates/spa/src/adapters/operations-client.ts +90 -0
- package/templates/spa/src/components/shared/metric-card.tsx +27 -0
- package/templates/spa/src/components/shared/status-badge.tsx +24 -0
- package/templates/spa/src/features/operations/operations.query.ts +9 -0
- package/templates/spa/src/main.tsx +10 -0
- package/templates/spa/src/pages/_layout.tsx +9 -0
- package/templates/spa/src/pages/_routes.tsx +27 -0
- package/templates/spa/src/pages/app/_layout.tsx +94 -0
- package/templates/spa/src/pages/app/_routes.tsx +10 -0
- package/templates/spa/src/pages/app/admin-home.tsx +152 -0
- package/templates/spa/src/pages/app/agent-runs.tsx +93 -0
- package/templates/spa/src/pages/app/settings.tsx +91 -0
- package/templates/spa/src/pages/auth/_layout.tsx +38 -0
- package/templates/spa/src/pages/auth/_routes.tsx +6 -0
- package/templates/spa/src/pages/auth/login.tsx +63 -0
- package/templates/spa/src/pages/not-found.tsx +22 -0
- package/templates/spa/src/pages/public/_layout.tsx +47 -0
- package/templates/spa/src/pages/public/_routes.tsx +6 -0
- package/templates/spa/src/pages/public/home.tsx +143 -0
- package/templates/spa/src/shared/format.ts +12 -0
- package/templates/spa/src/shared/navigation.ts +15 -0
- package/templates/spa/src/styles/components.css +49 -0
- package/templates/spa/src/styles/layout.css +192 -0
- package/templates/spa/src/styles/reset.css +44 -0
- package/templates/spa/src/styles/theme.css +57 -0
- package/templates/spa/src/styles/tokens.css +20 -0
- package/templates/spa/src/styles.css +7 -0
- package/templates/spa/src/styles.d.ts +1 -0
- package/templates/spa/tests/app.test.tsx +37 -0
- package/templates/spa/tests/components/shared.test.tsx +12 -0
- package/templates/spa/tests/resources.test.ts +22 -0
- package/templates/spa/tsconfig.json +20 -0
- package/templates/spa/tsconfig.node.json +10 -0
- package/templates/spa/vite.config.ts +24 -0
- package/templates/spa/vitest.config.ts +17 -0
- package/templates/ssg/AGENTS.md +55 -0
- package/templates/ssg/README.md +39 -0
- package/templates/ssg/gitignore.template +17 -0
- package/templates/ssg/index.html +13 -0
- package/templates/ssg/package.json +35 -0
- package/templates/ssg/src/app.tsx +14 -0
- package/templates/ssg/src/components/badge.tsx +3 -0
- package/templates/ssg/src/components/counter.tsx +30 -0
- package/templates/ssg/src/components/site-shell.tsx +111 -0
- package/templates/ssg/src/jsx.d.ts +23 -0
- package/templates/ssg/src/main.tsx +8 -0
- package/templates/ssg/src/pages/about.tsx +82 -0
- package/templates/ssg/src/pages/content.tsx +63 -0
- package/templates/ssg/src/pages/example.tsx +97 -0
- package/templates/ssg/src/pages/home.tsx +51 -0
- package/templates/ssg/src/resources/user.ts +15 -0
- package/templates/ssg/src/routes.tsx +15 -0
- package/templates/ssg/src/styles.css +89 -0
- package/templates/ssg/src/vite-env.d.ts +5 -0
- package/templates/ssg/ssg.config.ts +34 -0
- package/templates/ssg/tests/app.test.tsx +19 -0
- package/templates/ssg/tests/components/counter.test.tsx +18 -0
- package/templates/ssg/tests/resources.test.ts +11 -0
- package/templates/ssg/tests/ssg-config.test.ts +11 -0
- package/templates/ssg/tsconfig.json +20 -0
- package/templates/ssg/tsconfig.node.json +10 -0
- package/templates/ssg/vite.config.ts +24 -0
- package/templates/ssg/vitest.config.ts +17 -0
- package/templates/ssr/AGENTS.md +28 -0
- package/templates/ssr/README.md +38 -0
- package/templates/ssr/gitignore.template +16 -0
- package/templates/ssr/index.html +13 -0
- package/templates/ssr/package.json +34 -0
- package/templates/ssr/server.ts +16 -0
- package/templates/ssr/src/app.tsx +21 -0
- package/templates/ssr/src/components/counter.tsx +26 -0
- package/templates/ssr/src/entry-server.tsx +10 -0
- package/templates/ssr/src/main.tsx +11 -0
- package/templates/ssr/src/pages/about.tsx +75 -0
- package/templates/ssr/src/pages/example.tsx +113 -0
- package/templates/ssr/src/pages/home.tsx +56 -0
- package/templates/ssr/src/resources/user.ts +15 -0
- package/templates/ssr/src/routes.tsx +13 -0
- package/templates/ssr/src/styles.css +148 -0
- package/templates/ssr/src/vite-server.d.ts +7 -0
- package/templates/ssr/tests/app.test.tsx +24 -0
- package/templates/ssr/tests/components/counter.test.tsx +13 -0
- package/templates/ssr/tests/resources.test.ts +11 -0
- package/templates/ssr/tsconfig.json +22 -0
- package/templates/ssr/tsconfig.node.json +10 -0
- package/templates/ssr/tsconfig.server.json +15 -0
- package/templates/ssr/vite.config.ts +25 -0
- package/templates/ssr/vitest.config.ts +13 -0
- package/templates/startkit/AGENTS.md +77 -0
- package/templates/startkit/README.md +192 -0
- package/templates/startkit/gitignore.template +16 -0
- package/templates/startkit/index.html +13 -0
- package/templates/startkit/package.json +35 -0
- package/templates/startkit/src/components/app-header.tsx +93 -0
- package/templates/startkit/src/components/app-sidebar.tsx +95 -0
- package/templates/startkit/src/components/data-table.tsx +80 -0
- package/templates/startkit/src/components/empty-state.tsx +13 -0
- package/templates/startkit/src/components/page-header.tsx +23 -0
- package/templates/startkit/src/components/stat-card.tsx +24 -0
- package/templates/startkit/src/features/accounts/account-filters.tsx +61 -0
- package/templates/startkit/src/features/accounts/account-table.tsx +79 -0
- package/templates/startkit/src/lib/format.ts +31 -0
- package/templates/startkit/src/lib/mock-data.ts +441 -0
- package/templates/startkit/src/lib/routes.ts +116 -0
- package/templates/startkit/src/main.tsx +12 -0
- package/templates/startkit/src/pages/_layout.tsx +56 -0
- package/templates/startkit/src/pages/auth/_layout.tsx +7 -0
- package/templates/startkit/src/pages/auth/login.tsx +129 -0
- package/templates/startkit/src/pages/home.tsx +83 -0
- package/templates/startkit/src/pages/not-found.tsx +24 -0
- package/templates/startkit/src/pages/workspace/_layout.tsx +17 -0
- package/templates/startkit/src/pages/workspace/accounts/index.tsx +217 -0
- package/templates/startkit/src/pages/workspace/dashboard.tsx +118 -0
- package/templates/startkit/src/pages/workspace/settings.tsx +218 -0
- package/templates/startkit/src/router.tsx +7 -0
- package/templates/startkit/src/routes/auth-config.ts +38 -0
- package/templates/startkit/src/routes/auth.ts +8 -0
- package/templates/startkit/src/routes/index.ts +28 -0
- package/templates/startkit/src/routes/public.ts +8 -0
- package/templates/startkit/src/routes/workspace/accounts.ts +8 -0
- package/templates/startkit/src/routes/workspace/index.ts +14 -0
- package/templates/startkit/src/styles/components.css +396 -0
- package/templates/startkit/src/styles/layout.css +192 -0
- package/templates/startkit/src/styles/reset.css +38 -0
- package/templates/startkit/src/styles/theme.css +76 -0
- package/templates/startkit/src/styles/tokens.css +67 -0
- package/templates/startkit/src/styles.css +7 -0
- package/templates/startkit/src/toast.ts +55 -0
- package/templates/startkit/src/utils/join-classes.ts +4 -0
- package/templates/startkit/src/vite-env.d.ts +5 -0
- package/templates/startkit/tests/app.test.tsx +32 -0
- package/templates/startkit/tests/preferences.test.ts +43 -0
- package/templates/startkit/tests/resources.test.ts +82 -0
- package/templates/startkit/tsconfig.json +20 -0
- package/templates/startkit/tsconfig.node.json +10 -0
- package/templates/startkit/vite.config.ts +32 -0
- package/templates/startkit/vitest.config.ts +13 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { state } from '@askrjs/askr';
|
|
2
|
+
import {
|
|
3
|
+
Accordion,
|
|
4
|
+
AccordionItem,
|
|
5
|
+
AccordionHeader,
|
|
6
|
+
AccordionTrigger,
|
|
7
|
+
AccordionContent,
|
|
8
|
+
} from '@askrjs/ui/accordion';
|
|
9
|
+
import { Toggle } from '@askrjs/ui/toggle';
|
|
10
|
+
import { Input } from '@askrjs/ui/input';
|
|
11
|
+
import Counter from '../components/counter';
|
|
12
|
+
|
|
13
|
+
export default function Example() {
|
|
14
|
+
const [name, setName] = state('');
|
|
15
|
+
const [bold, setBold] = state(false);
|
|
16
|
+
|
|
17
|
+
return (
|
|
18
|
+
<>
|
|
19
|
+
<h1>Component Showcase</h1>
|
|
20
|
+
<p class="text-muted">
|
|
21
|
+
askr-ui headless components styled by askr-themes — working together
|
|
22
|
+
out of the box.
|
|
23
|
+
</p>
|
|
24
|
+
|
|
25
|
+
<Counter />
|
|
26
|
+
|
|
27
|
+
<div class="showcase-section">
|
|
28
|
+
<h3>Reactivity</h3>
|
|
29
|
+
<p>
|
|
30
|
+
Askr uses <code>state()</code> for reactive values that automatically
|
|
31
|
+
track dependencies and update only the DOM nodes that need to change.
|
|
32
|
+
</p>
|
|
33
|
+
<p>
|
|
34
|
+
Create reactive state with{' '}
|
|
35
|
+
<code>const [count, setCount] = state(0)</code>, read with{' '}
|
|
36
|
+
<code>count()</code>, and update with{' '}
|
|
37
|
+
<code>setCount(n => n + 1)</code>.
|
|
38
|
+
</p>
|
|
39
|
+
<p>
|
|
40
|
+
Core primitives: <code>state()</code>, <code>derive()</code>,{' '}
|
|
41
|
+
<code>selector()</code>, <code>resource()</code>, and <code>For</code>
|
|
42
|
+
.
|
|
43
|
+
</p>
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="showcase-section">
|
|
47
|
+
<h3>Accordion</h3>
|
|
48
|
+
<Accordion type="single" collapsible>
|
|
49
|
+
<AccordionItem value="reactivity">
|
|
50
|
+
<AccordionHeader>
|
|
51
|
+
<AccordionTrigger>
|
|
52
|
+
What is fine-grained reactivity?
|
|
53
|
+
</AccordionTrigger>
|
|
54
|
+
</AccordionHeader>
|
|
55
|
+
<AccordionContent>
|
|
56
|
+
<p>
|
|
57
|
+
Fine-grained reactivity means updates are surgical. When a state
|
|
58
|
+
value changes, only the specific DOM nodes that read that value
|
|
59
|
+
are updated — no virtual DOM diffing, no component re-renders.
|
|
60
|
+
</p>
|
|
61
|
+
</AccordionContent>
|
|
62
|
+
</AccordionItem>
|
|
63
|
+
<AccordionItem value="ssr">
|
|
64
|
+
<AccordionHeader>
|
|
65
|
+
<AccordionTrigger>Does Askr support SSR?</AccordionTrigger>
|
|
66
|
+
</AccordionHeader>
|
|
67
|
+
<AccordionContent>
|
|
68
|
+
<p>
|
|
69
|
+
Yes. Askr provides <code>renderToString()</code> and{' '}
|
|
70
|
+
<code>renderToStream()</code> for server-side rendering, plus{' '}
|
|
71
|
+
<code>hydrateSPA()</code> for client hydration.
|
|
72
|
+
</p>
|
|
73
|
+
</AccordionContent>
|
|
74
|
+
</AccordionItem>
|
|
75
|
+
<AccordionItem value="themes">
|
|
76
|
+
<AccordionHeader>
|
|
77
|
+
<AccordionTrigger>How does theming work?</AccordionTrigger>
|
|
78
|
+
</AccordionHeader>
|
|
79
|
+
<AccordionContent>
|
|
80
|
+
<p>
|
|
81
|
+
askr-ui components emit <code>data-slot</code> attributes.
|
|
82
|
+
askr-themes provides CSS that targets these slots with design
|
|
83
|
+
tokens. Switch themes by changing a single CSS import.
|
|
84
|
+
</p>
|
|
85
|
+
</AccordionContent>
|
|
86
|
+
</AccordionItem>
|
|
87
|
+
</Accordion>
|
|
88
|
+
</div>
|
|
89
|
+
|
|
90
|
+
<div class="showcase-section">
|
|
91
|
+
<h3>Toggle & Input</h3>
|
|
92
|
+
<p class="text-muted">
|
|
93
|
+
Reactive state driving UI updates in real time.
|
|
94
|
+
</p>
|
|
95
|
+
<div style="display: flex; align-items: center; gap: var(--ak-space-md); margin-bottom: var(--ak-space-md);">
|
|
96
|
+
<Toggle pressed={bold()} onPress={() => setBold((b) => !b)}>
|
|
97
|
+
Bold
|
|
98
|
+
</Toggle>
|
|
99
|
+
<Input
|
|
100
|
+
placeholder="Type your name..."
|
|
101
|
+
value={name()}
|
|
102
|
+
onInput={(e: Event) =>
|
|
103
|
+
setName((e.target as HTMLInputElement).value)
|
|
104
|
+
}
|
|
105
|
+
/>
|
|
106
|
+
</div>
|
|
107
|
+
<p style={`font-weight: ${bold() ? '700' : '400'}`}>
|
|
108
|
+
{name() ? `Hello, ${name()}!` : 'Type something above...'}
|
|
109
|
+
</p>
|
|
110
|
+
</div>
|
|
111
|
+
</>
|
|
112
|
+
);
|
|
113
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Link } from '@askrjs/askr/router';
|
|
2
|
+
import { Button } from '@askrjs/ui/button';
|
|
3
|
+
|
|
4
|
+
export default function Home() {
|
|
5
|
+
return (
|
|
6
|
+
<>
|
|
7
|
+
<section class="text-center section">
|
|
8
|
+
<h1>Welcome to Askr</h1>
|
|
9
|
+
<p class="text-muted">
|
|
10
|
+
A minimalist reactive framework for modern web applications.
|
|
11
|
+
Fine-grained reactivity, zero runtime dependencies, TypeScript-first.
|
|
12
|
+
</p>
|
|
13
|
+
<div class="hero-actions">
|
|
14
|
+
<Button asChild>
|
|
15
|
+
<Link href="/example">View Examples</Link>
|
|
16
|
+
</Button>
|
|
17
|
+
<Button asChild>
|
|
18
|
+
<Link href="/about">Learn More</Link>
|
|
19
|
+
</Button>
|
|
20
|
+
</div>
|
|
21
|
+
</section>
|
|
22
|
+
|
|
23
|
+
<div class="features">
|
|
24
|
+
<div class="feature-card">
|
|
25
|
+
<h3>
|
|
26
|
+
<span class="badge">Reactive</span>
|
|
27
|
+
</h3>
|
|
28
|
+
<p>
|
|
29
|
+
<code>state()</code> and <code>derive()</code> give you fine-grained
|
|
30
|
+
reactivity. Only the DOM nodes that depend on changed values update
|
|
31
|
+
— nothing more.
|
|
32
|
+
</p>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="feature-card">
|
|
35
|
+
<h3>
|
|
36
|
+
<span class="badge">Async</span>
|
|
37
|
+
</h3>
|
|
38
|
+
<p>
|
|
39
|
+
<code>resource()</code> handles data fetching with built-in loading
|
|
40
|
+
states, error handling, and automatic refetching when dependencies
|
|
41
|
+
change.
|
|
42
|
+
</p>
|
|
43
|
+
</div>
|
|
44
|
+
<div class="feature-card">
|
|
45
|
+
<h3>
|
|
46
|
+
<span class="badge">Composable</span>
|
|
47
|
+
</h3>
|
|
48
|
+
<p>
|
|
49
|
+
askr-ui provides headless components. askr-themes provides CSS
|
|
50
|
+
themes. Mix and match — or build your own.
|
|
51
|
+
</p>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
54
|
+
</>
|
|
55
|
+
);
|
|
56
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { resource } from '@askrjs/askr/resources';
|
|
2
|
+
|
|
3
|
+
export function fetchUser(id: number) {
|
|
4
|
+
return resource(
|
|
5
|
+
async ({ signal }: { signal: AbortSignal }) => {
|
|
6
|
+
// Simulate API call
|
|
7
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
8
|
+
if (signal.aborted) {
|
|
9
|
+
throw new DOMException('Request aborted', 'AbortError');
|
|
10
|
+
}
|
|
11
|
+
return { id, name: `User ${id}`, email: `user${id}@example.com` };
|
|
12
|
+
},
|
|
13
|
+
[id]
|
|
14
|
+
);
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRouteRegistry, group, route } from '@askrjs/askr/router';
|
|
2
|
+
import AppLayout from './app';
|
|
3
|
+
import Home from './pages/home';
|
|
4
|
+
import About from './pages/about';
|
|
5
|
+
import Example from './pages/example';
|
|
6
|
+
|
|
7
|
+
export const pageRegistry = createRouteRegistry(() => {
|
|
8
|
+
group({ layout: AppLayout }, () => {
|
|
9
|
+
route('/', Home);
|
|
10
|
+
route('/about', About);
|
|
11
|
+
route('/example', Example);
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
@import '@askrjs/themes/default';
|
|
2
|
+
|
|
3
|
+
/* Layout */
|
|
4
|
+
body {
|
|
5
|
+
margin: 0;
|
|
6
|
+
background: var(--ak-color-bg);
|
|
7
|
+
color: var(--ak-color-fg);
|
|
8
|
+
font-family: var(--ak-font-family);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
header {
|
|
12
|
+
border-bottom: 1px solid var(--ak-color-border);
|
|
13
|
+
padding: var(--ak-space-md) var(--ak-space-xl);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
header nav {
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: space-between;
|
|
20
|
+
max-width: var(--ak-layout-content-max-width);
|
|
21
|
+
margin: 0 auto;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
header nav a {
|
|
25
|
+
color: var(--ak-color-fg);
|
|
26
|
+
text-decoration: none;
|
|
27
|
+
font-size: var(--ak-font-size-md);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
header nav a:hover {
|
|
31
|
+
color: var(--ak-color-primary);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
main {
|
|
35
|
+
max-width: var(--ak-layout-content-max-width);
|
|
36
|
+
margin: 0 auto;
|
|
37
|
+
padding: var(--ak-space-xl);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Utility */
|
|
41
|
+
.nav-links {
|
|
42
|
+
display: flex;
|
|
43
|
+
align-items: center;
|
|
44
|
+
gap: var(--ak-space-lg);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.section {
|
|
48
|
+
margin-bottom: var(--ak-space-xl);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.text-center {
|
|
52
|
+
text-align: center;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.text-muted {
|
|
56
|
+
color: var(--ak-color-muted);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
h1,
|
|
60
|
+
h2,
|
|
61
|
+
h3 {
|
|
62
|
+
color: var(--ak-color-fg);
|
|
63
|
+
margin: 0 0 var(--ak-space-md);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
p {
|
|
67
|
+
line-height: 1.6;
|
|
68
|
+
margin: 0 0 var(--ak-space-md);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
code {
|
|
72
|
+
background: var(--ak-color-surface-muted);
|
|
73
|
+
padding: 0.15em 0.4em;
|
|
74
|
+
border-radius: var(--ak-radius-sm);
|
|
75
|
+
font-size: 0.9em;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Feature grid */
|
|
79
|
+
.features {
|
|
80
|
+
display: grid;
|
|
81
|
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|
82
|
+
gap: var(--ak-space-lg);
|
|
83
|
+
margin: var(--ak-space-xl) 0;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.feature-card {
|
|
87
|
+
background: var(--ak-color-surface);
|
|
88
|
+
border: 1px solid var(--ak-color-border);
|
|
89
|
+
border-radius: var(--ak-radius-md);
|
|
90
|
+
padding: var(--ak-space-lg);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/* Counter */
|
|
94
|
+
.counter {
|
|
95
|
+
background: var(--ak-color-surface);
|
|
96
|
+
border: 1px solid var(--ak-color-border);
|
|
97
|
+
border-radius: var(--ak-radius-md);
|
|
98
|
+
padding: var(--ak-space-xl);
|
|
99
|
+
text-align: center;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.counter-value {
|
|
103
|
+
font-size: 4rem;
|
|
104
|
+
font-weight: 800;
|
|
105
|
+
color: var(--ak-color-primary);
|
|
106
|
+
margin: var(--ak-space-lg) 0;
|
|
107
|
+
line-height: 1;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.counter-controls {
|
|
111
|
+
display: flex;
|
|
112
|
+
justify-content: center;
|
|
113
|
+
gap: var(--ak-space-md);
|
|
114
|
+
margin-top: var(--ak-space-lg);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* Component showcase */
|
|
118
|
+
.showcase-section {
|
|
119
|
+
background: var(--ak-color-surface);
|
|
120
|
+
border: 1px solid var(--ak-color-border);
|
|
121
|
+
border-radius: var(--ak-radius-md);
|
|
122
|
+
padding: var(--ak-space-lg);
|
|
123
|
+
margin-bottom: var(--ak-space-lg);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
.showcase-section h3 {
|
|
127
|
+
margin-bottom: var(--ak-space-md);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Hero buttons */
|
|
131
|
+
.hero-actions {
|
|
132
|
+
display: flex;
|
|
133
|
+
gap: var(--ak-space-md);
|
|
134
|
+
justify-content: center;
|
|
135
|
+
margin: var(--ak-space-xl) 0;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/* Responsive */
|
|
139
|
+
@media (max-width: 48rem) {
|
|
140
|
+
.features {
|
|
141
|
+
grid-template-columns: 1fr;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.hero-actions {
|
|
145
|
+
flex-direction: column;
|
|
146
|
+
align-items: stretch;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vite-plus/test';
|
|
2
|
+
|
|
3
|
+
describe('App Component', () => {
|
|
4
|
+
it('renders layout with navigation', () => {
|
|
5
|
+
const app = (
|
|
6
|
+
<div>
|
|
7
|
+
<header>
|
|
8
|
+
<nav>
|
|
9
|
+
<strong>Askr</strong>
|
|
10
|
+
<div>
|
|
11
|
+
<a href="/example">Example</a>
|
|
12
|
+
<a href="/about">About</a>
|
|
13
|
+
</div>
|
|
14
|
+
</nav>
|
|
15
|
+
</header>
|
|
16
|
+
<main>
|
|
17
|
+
<p>Content goes here</p>
|
|
18
|
+
</main>
|
|
19
|
+
</div>
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
expect(app).toBeDefined();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vite-plus/test';
|
|
2
|
+
import { renderToString } from '@askrjs/askr/ssr';
|
|
3
|
+
import Counter from '../../src/components/counter';
|
|
4
|
+
|
|
5
|
+
describe('Counter', () => {
|
|
6
|
+
it('renders its initial state during SSR', () => {
|
|
7
|
+
const html = renderToString(() => <Counter />);
|
|
8
|
+
|
|
9
|
+
expect(html).toContain('counter-value');
|
|
10
|
+
expect(html).toContain('>0<');
|
|
11
|
+
expect(html).toContain('>even<');
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vite-plus/test';
|
|
2
|
+
import { fetchUser } from '../src/resources/user';
|
|
3
|
+
|
|
4
|
+
describe('SSR Resources', () => {
|
|
5
|
+
it('creates a resource for fetching user data', () => {
|
|
6
|
+
// Resources are called during component render
|
|
7
|
+
// Here we just verify the function is defined
|
|
8
|
+
expect(fetchUser).toBeDefined();
|
|
9
|
+
expect(typeof fetchUser).toBe('function');
|
|
10
|
+
});
|
|
11
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"useDefineForClassFields": true,
|
|
5
|
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"moduleResolution": "bundler",
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"allowSyntheticDefaultImports": true,
|
|
11
|
+
"strict": true,
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"noEmit": true,
|
|
15
|
+
"jsx": "preserve",
|
|
16
|
+
"jsxImportSource": "@askrjs/askr",
|
|
17
|
+
"types": ["vite/client"]
|
|
18
|
+
},
|
|
19
|
+
"include": ["src"],
|
|
20
|
+
"exclude": ["dist"],
|
|
21
|
+
"references": [{ "path": "./tsconfig.node.json" }]
|
|
22
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["ES2022"],
|
|
5
|
+
"module": "NodeNext",
|
|
6
|
+
"moduleResolution": "NodeNext",
|
|
7
|
+
"strict": true,
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"outDir": "dist/server",
|
|
11
|
+
"noEmit": false,
|
|
12
|
+
"types": ["node"]
|
|
13
|
+
},
|
|
14
|
+
"include": ["server.ts", "src/vite-server.d.ts"]
|
|
15
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { defineConfig } from 'vite-plus';
|
|
2
|
+
import { askr } from '@askrjs/vite';
|
|
3
|
+
import { askrServer } from '@askrjs/vite/server';
|
|
4
|
+
|
|
5
|
+
export default defineConfig({
|
|
6
|
+
plugins: [askr(), askrServer({ entry: './src/entry-server.tsx' })],
|
|
7
|
+
lint: {
|
|
8
|
+
ignorePatterns: ['dist/**', 'node_modules/**', 'coverage/**'],
|
|
9
|
+
},
|
|
10
|
+
fmt: {
|
|
11
|
+
semi: true,
|
|
12
|
+
singleQuote: true,
|
|
13
|
+
trailingComma: 'es5',
|
|
14
|
+
printWidth: 80,
|
|
15
|
+
tabWidth: 2,
|
|
16
|
+
},
|
|
17
|
+
server: {
|
|
18
|
+
port: 5173,
|
|
19
|
+
open: true,
|
|
20
|
+
},
|
|
21
|
+
build: {
|
|
22
|
+
manifest: true,
|
|
23
|
+
sourcemap: true,
|
|
24
|
+
},
|
|
25
|
+
});
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineConfig } from 'vite-plus';
|
|
2
|
+
import { askr } from '@askrjs/vite';
|
|
3
|
+
|
|
4
|
+
export default defineConfig({
|
|
5
|
+
plugins: [askr()],
|
|
6
|
+
test: {
|
|
7
|
+
environment: 'jsdom',
|
|
8
|
+
globals: true,
|
|
9
|
+
coverage: {
|
|
10
|
+
reporter: ['text', 'json', 'html'],
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# {{appName}}
|
|
2
|
+
|
|
3
|
+
Client-side SPA built with Askr, askr-ui, and askr-themes.
|
|
4
|
+
|
|
5
|
+
## Agent Workflow
|
|
6
|
+
|
|
7
|
+
- Read `package.json`, `src/main.tsx`, `src/router.tsx`, the nearest route file, and the nearest feature folder before editing.
|
|
8
|
+
- Use Askr skills in this order when scope is unclear: `askr-app-builder`, `askr-mental-model`, `askr-project-structure`, then the specialized skill for the touched surface.
|
|
9
|
+
- Prefer the smallest change that matches the existing route, feature, shell, and style conventions.
|
|
10
|
+
- Validate with the narrowest relevant executable check first, then widen only if needed.
|
|
11
|
+
|
|
12
|
+
## Commands
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm run dev # Vite dev server with HMR (port 5173)
|
|
16
|
+
npm run build # Production build to dist/
|
|
17
|
+
npm run preview # Serve production build locally
|
|
18
|
+
npm test # Vitest (jsdom)
|
|
19
|
+
npm run typecheck # tsc --noEmit
|
|
20
|
+
npm run lint # ESLint
|
|
21
|
+
npm run fmt # Prettier
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Architecture
|
|
25
|
+
|
|
26
|
+
- **Framework:** Askr - actor-backed, fine-grained reactive UI. No virtual DOM.
|
|
27
|
+
- **Components:** askr-ui headless components (Button, Accordion, Toggle, Input, etc.). Props use `onPress` (not `onClick`), `asChild` for polymorphism, `data-slot` attributes for styling hooks.
|
|
28
|
+
- **Styling:** askr-themes CSS via `[data-slot]` selectors. Keep `src/styles.css` as a thin entrypoint and organize styles in `src/styles/*` using layers (reset/tokens/theme/layout/components).
|
|
29
|
+
- **Routing:** `createRouteRegistry()` composes `group()` and `route()` declarations in `src/router.tsx`. Use `currentRoute()` inside components and navigate with `<Link href="...">`.
|
|
30
|
+
- **State:** Prefer `const [value, setValue] = state(initial)`. Read with `value()`, update with `setValue(...)`. `derive()` for computed values. `resource()` for async data.
|
|
31
|
+
- **Data flow:** Keep sample data in `src/lib/mock-data.ts`, not inline in pages. Read async data with `resource()` and keep mock mutations in the same lib boundary.
|
|
32
|
+
- **Preferences:** Keep persistent appearance/session helpers in the lib boundary and initialize at app bootstrap.
|
|
33
|
+
- **Vite plugin:** `askr()` from `@askrjs/vite` handles JSX transform - no manual esbuild config needed.
|
|
34
|
+
|
|
35
|
+
## Do Not Invent By Default
|
|
36
|
+
|
|
37
|
+
- React hooks, React Router patterns, or `useEffect`-style data loading.
|
|
38
|
+
- Generic query-client or global-store abstractions when `resource()`, `createQuery()`, or `createMutation()` already fit.
|
|
39
|
+
- App-local `Button`, `Card`, `Panel`, `Sidebar`, `Navbar`, `EmptyState`, `HStack`, or `VStack` clones before checking `@askrjs/ui` and `@askrjs/themes`.
|
|
40
|
+
- Route-local API clients or DTO mapping inside page components.
|
|
41
|
+
|
|
42
|
+
## File Structure
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
src/
|
|
46
|
+
main.tsx # Entry: createSPA + navigate
|
|
47
|
+
app.tsx # Root layout with nav
|
|
48
|
+
router.tsx # Route registration
|
|
49
|
+
styles.css # Style entrypoint
|
|
50
|
+
styles/ # reset/tokens/theme/layout/components layers
|
|
51
|
+
components/ # App-level reusable components
|
|
52
|
+
layouts/ # app and auth route layouts
|
|
53
|
+
features/ # feature-scoped UI modules
|
|
54
|
+
pages/ # Route page components
|
|
55
|
+
lib/ # Mock data + formatting helpers
|
|
56
|
+
tests/ # Vitest tests
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Conventions
|
|
60
|
+
|
|
61
|
+
- TypeScript strict mode, ESM-only
|
|
62
|
+
- JSX import source: `@askrjs/askr`
|
|
63
|
+
- Use askr-ui components instead of raw HTML for interactive elements
|
|
64
|
+
- Prefer composed components from `src/components/*` for app surfaces like panels, headers, tables, and empty states
|
|
65
|
+
- Style with tokens; avoid hardcoded non-theme colors in component classes
|
|
66
|
+
- Keep spacing on a strict rhythm: 4/8/16/24/32/48
|
|
67
|
+
- Keep typography to a small semantic scale (title/section/body/muted)
|
|
68
|
+
- Prefer subtle borders over heavy shadows or decorative effects
|
|
69
|
+
- Ensure consistent hover/focus-visible/disabled/empty/error treatment across components
|
|
70
|
+
- Prettier + ESLint enforced
|
|
71
|
+
|
|
72
|
+
## Validation
|
|
73
|
+
|
|
74
|
+
- Run the narrowest relevant test first.
|
|
75
|
+
- Run `npm run typecheck` for type-sensitive changes.
|
|
76
|
+
- Run `npm run build` when app boot, routing, or packaging changes.
|
|
77
|
+
- Confirm loading, empty, error, stale, and pending states remain truthful for user-visible flows.
|