@totaland/create-starter-kit 2.0.2 → 2.0.3
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/bin/index.js +18 -19
- package/package.json +6 -2
- package/templates/backend/.github/agents/ /360/237/216/255 planner.agent.md" +92 -0
- package/templates/backend/.github/agents/api-architect.agent.md +41 -0
- package/templates/backend/.github/agents/code-reviewer.agent.md +26 -0
- package/templates/backend/.github/agents/code-simplifier.agent.md +41 -0
- package/templates/backend/.github/agents/code-skeptic.agent.md +74 -0
- package/templates/backend/.github/agents/docs-specialist.agent.md +25 -0
- package/templates/backend/.github/agents/implementation-plan.agent.md +160 -0
- package/templates/backend/.github/agents/janitor.agent.md +90 -0
- package/templates/backend/.github/agents/ms-sql-dba.agent.md +25 -0
- package/templates/backend/.github/agents/plan.agent.md +115 -0
- package/templates/backend/.github/agents/planner.agent.md +15 -0
- package/templates/backend/.github/agents/playwright-tester.agent.md +13 -0
- package/templates/backend/.github/agents/postgresql-dba.agent.md +18 -0
- package/templates/backend/.github/agents/prd.agent.md +202 -0
- package/templates/backend/.github/agents/research-technical-spike.agent.md +170 -0
- package/templates/backend/.github/agents/software-engineer-agent-v1.agent.md +165 -0
- package/templates/backend/.github/agents/task-planner.agent.md +375 -0
- package/templates/backend/.github/agents/task-researcher.agent.md +255 -0
- package/templates/backend/.github/agents/tdd-green.agent.md +60 -0
- package/templates/backend/.github/agents/tdd-red.agent.md +60 -0
- package/templates/backend/.github/agents/tdd-refactor.agent.md +85 -0
- package/templates/backend/.github/agents/tech-debt-remediation-plan.agent.md +50 -0
- package/templates/backend/.github/agents/typescript-mcp-expert.agent.md +91 -0
- package/templates/backend/.github/agents/ultimate-thinking-beastmode.agent.md +644 -0
- package/templates/backend/.github/agents//360/237/216/255 generator.agent.md" +264 -0
- package/templates/backend/.github/agents//360/237/216/255 healer.agent.md" +44 -0
- package/templates/backend/.github/agents//360/237/216/255 pom.agent.md" +308 -0
- package/templates/backend/.github/instructions/a11y.instructions.md +369 -0
- package/templates/backend/.github/instructions/ms-sql-dba.instructions.md +25 -0
- package/templates/backend/.github/instructions/object-calisthenics.instructions.md +302 -0
- package/templates/backend/.github/instructions/performance-optimization.instructions.md +420 -0
- package/templates/backend/.github/instructions/playwright-python.instructions.md +62 -0
- package/templates/backend/.github/instructions/playwright-typescript.instructions.md +86 -0
- package/templates/backend/.github/instructions/security-and-owasp.instructions.md +51 -0
- package/templates/backend/.github/instructions/self-explanatory-code-commenting.instructions.md +162 -0
- package/templates/backend/.github/instructions/spec-driven-workflow-v1.instructions.md +323 -0
- package/templates/backend/.github/instructions/sql-sp-generation.instructions.md +74 -0
- package/templates/backend/.github/instructions/task-implementation.instructions.md +190 -0
- package/templates/backend/.github/instructions/typescript-mcp-server.instructions.md +228 -0
- package/templates/backend/.github/prompts/ai-prompt-engineering-safety-review.prompt.md +229 -0
- package/templates/backend/.github/prompts/architecture-blueprint-generator.prompt.md +321 -0
- package/templates/backend/.github/prompts/breakdown-epic-arch.prompt.md +65 -0
- package/templates/backend/.github/prompts/breakdown-epic-pm.prompt.md +57 -0
- package/templates/backend/.github/prompts/breakdown-feature-implementation.prompt.md +127 -0
- package/templates/backend/.github/prompts/breakdown-feature-prd.prompt.md +60 -0
- package/templates/backend/.github/prompts/breakdown-plan.prompt.md +508 -0
- package/templates/backend/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +293 -0
- package/templates/backend/.github/prompts/create-agentsmd.prompt.md +248 -0
- package/templates/backend/.github/prompts/create-github-issue-feature-from-specification.prompt.md +27 -0
- package/templates/backend/.github/prompts/create-github-issues-feature-from-implementation-plan.prompt.md +27 -0
- package/templates/backend/.github/prompts/create-github-issues-for-unmet-specification-requirements.prompt.md +35 -0
- package/templates/backend/.github/prompts/create-implementation-plan.prompt.md +156 -0
- package/templates/backend/.github/prompts/create-llms.prompt.md +209 -0
- package/templates/backend/.github/prompts/create-specification.prompt.md +126 -0
- package/templates/backend/.github/prompts/create-technical-spike.prompt.md +230 -0
- package/templates/backend/.github/prompts/csharp-nunit.prompt.md +71 -0
- package/templates/backend/.github/prompts/ef-core.prompt.md +76 -0
- package/templates/backend/.github/prompts/folder-structure-blueprint-generator.prompt.md +404 -0
- package/templates/backend/.github/prompts/gen-specs-as-issues.prompt.md +165 -0
- package/templates/backend/.github/prompts/generate-custom-instructions-from-codebase.prompt.md +239 -0
- package/templates/backend/.github/prompts/java-junit.prompt.md +64 -0
- package/templates/backend/.github/prompts/memory-merger.prompt.md +107 -0
- package/templates/backend/.github/prompts/multi-stage-dockerfile.prompt.md +46 -0
- package/templates/backend/.github/prompts/playwright-automation-fill-in-form.prompt.md +29 -0
- package/templates/backend/.github/prompts/playwright-explore-website.prompt.md +19 -0
- package/templates/backend/.github/prompts/playwright-generate-test.prompt.md +19 -0
- package/templates/backend/.github/prompts/postgresql-code-review.prompt.md +214 -0
- package/templates/backend/.github/prompts/postgresql-optimization.prompt.md +406 -0
- package/templates/backend/.github/prompts/project-workflow-analysis-blueprint-generator.prompt.md +294 -0
- package/templates/backend/.github/prompts/prompt-builder.prompt.md +142 -0
- package/templates/backend/.github/prompts/remember.prompt.md +125 -0
- package/templates/backend/.github/prompts/review-and-refactor.prompt.md +15 -0
- package/templates/backend/.github/prompts/sql-code-review.prompt.md +303 -0
- package/templates/backend/.github/prompts/sql-optimization.prompt.md +298 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-agents.prompt.md +72 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-chatmodes.prompt.md +71 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-collections.prompt.md +149 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-instructions.prompt.md +88 -0
- package/templates/backend/.github/prompts/suggest-awesome-github-copilot-prompts.prompt.md +71 -0
- package/templates/backend/.github/prompts/technology-stack-blueprint-generator.prompt.md +242 -0
- package/templates/backend/.github/prompts/typescript-mcp-server-generator.prompt.md +90 -0
- package/templates/backend/.github/prompts/update-implementation-plan.prompt.md +157 -0
- package/templates/backend/.github/prompts/update-markdown-file-index.prompt.md +76 -0
- package/templates/backend/Project_Folders_Structure_Blueprint.md +529 -0
- package/templates/backend/README.md +99 -0
- package/templates/backend/biome.json +45 -0
- package/templates/backend/drizzle.config.ts +10 -0
- package/templates/backend/knip.json +10 -0
- package/templates/backend/package.json +60 -0
- package/templates/backend/playwright.config.ts +16 -0
- package/templates/backend/pnpm-workspace.yaml +3 -0
- package/templates/backend/src/features/health/controller.ts +5 -0
- package/templates/backend/src/features/health/health.test.ts +23 -0
- package/templates/backend/src/features/health/index.ts +7 -0
- package/templates/backend/src/features/health/schemas.ts +29 -0
- package/templates/backend/src/features/orders/controller.ts +18 -0
- package/templates/backend/src/features/orders/index.ts +10 -0
- package/templates/backend/src/features/orders/schemas.ts +62 -0
- package/templates/backend/src/index.ts +43 -0
- package/templates/backend/src/lib/openapi.ts +25 -0
- package/templates/backend/src/lib/validateRequest.test.ts +84 -0
- package/templates/backend/src/lib/validateRequest.ts +72 -0
- package/templates/backend/tsconfig.build.json +10 -0
- package/templates/backend/tsconfig.json +30 -0
- package/templates/backend/vitest.config.ts +31 -0
- package/templates/frontend/.env.example +7 -0
- package/templates/frontend/.github/agents/ /360/237/216/255 planner.agent.md" +92 -0
- package/templates/frontend/.github/agents/api-architect.agent.md +41 -0
- package/templates/frontend/.github/agents/code-reviewer.agent.md +26 -0
- package/templates/frontend/.github/agents/code-simplifier.agent.md +41 -0
- package/templates/frontend/.github/agents/code-skeptic.agent.md +74 -0
- package/templates/frontend/.github/agents/docs-specialist.agent.md +25 -0
- package/templates/frontend/.github/agents/implementation-plan.agent.md +160 -0
- package/templates/frontend/.github/agents/janitor.agent.md +90 -0
- package/templates/frontend/.github/agents/ms-sql-dba.agent.md +25 -0
- package/templates/frontend/.github/agents/plan.agent.md +115 -0
- package/templates/frontend/.github/agents/planner.agent.md +15 -0
- package/templates/frontend/.github/agents/playwright-tester.agent.md +13 -0
- package/templates/frontend/.github/agents/postgresql-dba.agent.md +18 -0
- package/templates/frontend/.github/agents/prd.agent.md +202 -0
- package/templates/frontend/.github/agents/research-technical-spike.agent.md +170 -0
- package/templates/frontend/.github/agents/software-engineer-agent-v1.agent.md +165 -0
- package/templates/frontend/.github/agents/task-planner.agent.md +375 -0
- package/templates/frontend/.github/agents/task-researcher.agent.md +255 -0
- package/templates/frontend/.github/agents/tdd-green.agent.md +60 -0
- package/templates/frontend/.github/agents/tdd-red.agent.md +60 -0
- package/templates/frontend/.github/agents/tdd-refactor.agent.md +85 -0
- package/templates/frontend/.github/agents/tech-debt-remediation-plan.agent.md +50 -0
- package/templates/frontend/.github/agents/typescript-mcp-expert.agent.md +91 -0
- package/templates/frontend/.github/agents/ultimate-thinking-beastmode.agent.md +644 -0
- package/templates/frontend/.github/agents//360/237/216/255 generator.agent.md" +264 -0
- package/templates/frontend/.github/agents//360/237/216/255 healer.agent.md" +44 -0
- package/templates/frontend/.github/agents//360/237/216/255 pom.agent.md" +308 -0
- package/templates/frontend/.github/instructions/a11y.instructions.md +369 -0
- package/templates/frontend/.github/instructions/ms-sql-dba.instructions.md +25 -0
- package/templates/frontend/.github/instructions/object-calisthenics.instructions.md +302 -0
- package/templates/frontend/.github/instructions/performance-optimization.instructions.md +420 -0
- package/templates/frontend/.github/instructions/playwright-python.instructions.md +62 -0
- package/templates/frontend/.github/instructions/playwright-typescript.instructions.md +86 -0
- package/templates/frontend/.github/instructions/security-and-owasp.instructions.md +51 -0
- package/templates/frontend/.github/instructions/self-explanatory-code-commenting.instructions.md +162 -0
- package/templates/frontend/.github/instructions/spec-driven-workflow-v1.instructions.md +323 -0
- package/templates/frontend/.github/instructions/sql-sp-generation.instructions.md +74 -0
- package/templates/frontend/.github/instructions/task-implementation.instructions.md +190 -0
- package/templates/frontend/.github/instructions/typescript-mcp-server.instructions.md +228 -0
- package/templates/frontend/.github/prompts/ai-prompt-engineering-safety-review.prompt.md +229 -0
- package/templates/frontend/.github/prompts/architecture-blueprint-generator.prompt.md +321 -0
- package/templates/frontend/.github/prompts/breakdown-epic-arch.prompt.md +65 -0
- package/templates/frontend/.github/prompts/breakdown-epic-pm.prompt.md +57 -0
- package/templates/frontend/.github/prompts/breakdown-feature-implementation.prompt.md +127 -0
- package/templates/frontend/.github/prompts/breakdown-feature-prd.prompt.md +60 -0
- package/templates/frontend/.github/prompts/breakdown-plan.prompt.md +508 -0
- package/templates/frontend/.github/prompts/copilot-instructions-blueprint-generator.prompt.md +293 -0
- package/templates/frontend/.github/prompts/create-agentsmd.prompt.md +248 -0
- package/templates/frontend/.github/prompts/create-github-issue-feature-from-specification.prompt.md +27 -0
- package/templates/frontend/.github/prompts/create-github-issues-feature-from-implementation-plan.prompt.md +27 -0
- package/templates/frontend/.github/prompts/create-github-issues-for-unmet-specification-requirements.prompt.md +35 -0
- package/templates/frontend/.github/prompts/create-implementation-plan.prompt.md +156 -0
- package/templates/frontend/.github/prompts/create-llms.prompt.md +209 -0
- package/templates/frontend/.github/prompts/create-specification.prompt.md +126 -0
- package/templates/frontend/.github/prompts/create-technical-spike.prompt.md +230 -0
- package/templates/frontend/.github/prompts/csharp-nunit.prompt.md +71 -0
- package/templates/frontend/.github/prompts/ef-core.prompt.md +76 -0
- package/templates/frontend/.github/prompts/folder-structure-blueprint-generator.prompt.md +404 -0
- package/templates/frontend/.github/prompts/gen-specs-as-issues.prompt.md +165 -0
- package/templates/frontend/.github/prompts/generate-custom-instructions-from-codebase.prompt.md +239 -0
- package/templates/frontend/.github/prompts/java-junit.prompt.md +64 -0
- package/templates/frontend/.github/prompts/memory-merger.prompt.md +107 -0
- package/templates/frontend/.github/prompts/multi-stage-dockerfile.prompt.md +46 -0
- package/templates/frontend/.github/prompts/playwright-automation-fill-in-form.prompt.md +29 -0
- package/templates/frontend/.github/prompts/playwright-explore-website.prompt.md +19 -0
- package/templates/frontend/.github/prompts/playwright-generate-test.prompt.md +19 -0
- package/templates/frontend/.github/prompts/postgresql-code-review.prompt.md +214 -0
- package/templates/frontend/.github/prompts/postgresql-optimization.prompt.md +406 -0
- package/templates/frontend/.github/prompts/project-workflow-analysis-blueprint-generator.prompt.md +294 -0
- package/templates/frontend/.github/prompts/prompt-builder.prompt.md +142 -0
- package/templates/frontend/.github/prompts/remember.prompt.md +125 -0
- package/templates/frontend/.github/prompts/review-and-refactor.prompt.md +15 -0
- package/templates/frontend/.github/prompts/sql-code-review.prompt.md +303 -0
- package/templates/frontend/.github/prompts/sql-optimization.prompt.md +298 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-agents.prompt.md +72 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-chatmodes.prompt.md +71 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-collections.prompt.md +149 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-instructions.prompt.md +88 -0
- package/templates/frontend/.github/prompts/suggest-awesome-github-copilot-prompts.prompt.md +71 -0
- package/templates/frontend/.github/prompts/technology-stack-blueprint-generator.prompt.md +242 -0
- package/templates/frontend/.github/prompts/typescript-mcp-server-generator.prompt.md +90 -0
- package/templates/frontend/.github/prompts/update-implementation-plan.prompt.md +157 -0
- package/templates/frontend/.github/prompts/update-markdown-file-index.prompt.md +76 -0
- package/templates/frontend/README.md +199 -0
- package/templates/frontend/biome.json +45 -0
- package/templates/frontend/components.json +22 -0
- package/templates/frontend/index.html +13 -0
- package/templates/frontend/package.json +44 -0
- package/templates/frontend/postcss.config.js +6 -0
- package/templates/frontend/public/vite.svg +1 -0
- package/templates/frontend/src/App.css +42 -0
- package/templates/frontend/src/App.tsx +17 -0
- package/templates/frontend/src/assets/react.svg +1 -0
- package/templates/frontend/src/components/layout/layout.component.tsx +31 -0
- package/templates/frontend/src/components/menu-toggle-icon.tsx +53 -0
- package/templates/frontend/src/components/ui/button.tsx +57 -0
- package/templates/frontend/src/docs/RECOMMENDED_LIBRARIES.md +226 -0
- package/templates/frontend/src/docs/SETUP_SUMMARY.md +162 -0
- package/templates/frontend/src/hooks/use-scroll.ts +21 -0
- package/templates/frontend/src/index.css +121 -0
- package/templates/frontend/src/lib/api-client.ts +46 -0
- package/templates/frontend/src/lib/utils.ts +6 -0
- package/templates/frontend/src/main.tsx +30 -0
- package/templates/frontend/src/pages/about/about.page.tsx +50 -0
- package/templates/frontend/src/pages/home/home.page.tsx +43 -0
- package/templates/frontend/tailwind.config.js +59 -0
- package/templates/frontend/tsconfig.app.json +41 -0
- package/templates/frontend/tsconfig.json +13 -0
- package/templates/frontend/tsconfig.node.json +26 -0
- package/templates/frontend/vite.config.ts +14 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cybermate-api",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Fast TypeScript backend starter kit with Ultimate Express, Scalar API docs, and Drizzle ORM.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "build/index.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"start": "node build/index.js",
|
|
9
|
+
"dev": "vite-node --watch src/index.ts",
|
|
10
|
+
"typecheck": "npx tsc --noEmit",
|
|
11
|
+
"build": "swc src -d build --strip-leading-paths --copy-files",
|
|
12
|
+
"build:debug": "swc src -d build --strip-leading-paths --copy-files --source-maps",
|
|
13
|
+
"test": "vitest run",
|
|
14
|
+
"test:coverage": "vitest run --coverage",
|
|
15
|
+
"test:watch": "vitest",
|
|
16
|
+
"test:ui": "vitest --ui",
|
|
17
|
+
"prebuild": "rm -rf build",
|
|
18
|
+
"knip": "knip",
|
|
19
|
+
"db:generate": "drizzle-kit generate",
|
|
20
|
+
"db:migrate": "drizzle-kit migrate",
|
|
21
|
+
"db:push": "drizzle-kit push",
|
|
22
|
+
"db:studio": "drizzle-kit studio"
|
|
23
|
+
},
|
|
24
|
+
"files": [
|
|
25
|
+
"build"
|
|
26
|
+
],
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@biomejs/biome": "2.0.6",
|
|
29
|
+
"@swc-node/register": "^1.11.1",
|
|
30
|
+
"@swc/cli": "0.7.7",
|
|
31
|
+
"@swc/core": "^1.10.1",
|
|
32
|
+
"@types/bun": "1.2.14",
|
|
33
|
+
"@types/cors": "^2.8.19",
|
|
34
|
+
"@types/node": "24.0.7",
|
|
35
|
+
"@vitest/coverage-v8": "^4.0.13",
|
|
36
|
+
"@vitest/ui": "^4.0.13",
|
|
37
|
+
"knip": "^5.69.1",
|
|
38
|
+
"tsx": "^4.20.6",
|
|
39
|
+
"typescript": "^5.8.3",
|
|
40
|
+
"vite": "^5.4.21",
|
|
41
|
+
"vite-node": "^5.2.0",
|
|
42
|
+
"vitest": "^4.0.13"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@asteasolutions/zod-to-openapi": "^8.1.0",
|
|
46
|
+
"@scalar/express-api-reference": "^0.8.25",
|
|
47
|
+
"cors": "^2.8.5",
|
|
48
|
+
"dotenv": "17.0.0",
|
|
49
|
+
"drizzle-kit": "^0.31.7",
|
|
50
|
+
"drizzle-orm": "^0.44.7",
|
|
51
|
+
"lru-cache": "^11.2.2",
|
|
52
|
+
"postgres": "^3.4.7",
|
|
53
|
+
"ultimate-express": "^2.0.12",
|
|
54
|
+
"ultimate-ws": "^2.0.6",
|
|
55
|
+
"zod": "^4.1.12"
|
|
56
|
+
},
|
|
57
|
+
"trustedDependencies": [
|
|
58
|
+
"@swc/core"
|
|
59
|
+
]
|
|
60
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { defineConfig } from "@playwright/test";
|
|
2
|
+
import { config as loadEnv } from "dotenv";
|
|
3
|
+
|
|
4
|
+
// Load environment variables (e.g. PLAYWRIGHT_BASE_URL) before tests spin up.
|
|
5
|
+
loadEnv();
|
|
6
|
+
|
|
7
|
+
export default defineConfig({
|
|
8
|
+
testDir: "src/generated/tests",
|
|
9
|
+
reporter: [
|
|
10
|
+
["line"],
|
|
11
|
+
["html", { outputFolder: "playwright-report", open: "never" }],
|
|
12
|
+
],
|
|
13
|
+
use: {
|
|
14
|
+
baseURL: process.env.PLAYWRIGHT_BASE_URL ?? "http://localhost:3000",
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { vi } from 'vitest';
|
|
2
|
+
import type { Request, Response } from 'ultimate-express';
|
|
3
|
+
import { getHealth } from './controller.js';
|
|
4
|
+
|
|
5
|
+
// Simple ISO-8601 with offset matcher (aligned with schema)
|
|
6
|
+
const isoWithOffset =
|
|
7
|
+
/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})$/;
|
|
8
|
+
|
|
9
|
+
describe('GET /api/health', () => {
|
|
10
|
+
it('returns ok status and timestamp', () => {
|
|
11
|
+
const json = vi.fn();
|
|
12
|
+
const res = { json } as unknown as Response;
|
|
13
|
+
const req = {} as Request;
|
|
14
|
+
|
|
15
|
+
getHealth(req, res);
|
|
16
|
+
|
|
17
|
+
expect(json).toHaveBeenCalledTimes(1);
|
|
18
|
+
const payload = json.mock.calls[0][0] as { status: string; timestamp: string };
|
|
19
|
+
|
|
20
|
+
expect(payload).toMatchObject({ status: 'ok' });
|
|
21
|
+
expect(payload.timestamp).toMatch(isoWithOffset);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { registry } from '../../lib/openapi.js';
|
|
3
|
+
|
|
4
|
+
const isoDateTimeWithOffset = z
|
|
5
|
+
.string()
|
|
6
|
+
.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:?\d{2})$/, 'Invalid datetime');
|
|
7
|
+
|
|
8
|
+
export const HealthResponseSchema = z
|
|
9
|
+
.object({
|
|
10
|
+
status: z.literal('ok'),
|
|
11
|
+
timestamp: isoDateTimeWithOffset,
|
|
12
|
+
})
|
|
13
|
+
.openapi('HealthResponse');
|
|
14
|
+
|
|
15
|
+
registry.registerPath({
|
|
16
|
+
method: 'get',
|
|
17
|
+
path: '/api/health',
|
|
18
|
+
tags: ['Health'],
|
|
19
|
+
responses: {
|
|
20
|
+
200: {
|
|
21
|
+
description: 'Health check',
|
|
22
|
+
content: {
|
|
23
|
+
'application/json': {
|
|
24
|
+
schema: HealthResponseSchema,
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RequestHandler } from 'ultimate-express';
|
|
2
|
+
import type { z } from 'zod';
|
|
3
|
+
import type { ValidatedRequest } from '../../lib/validateRequest.js';
|
|
4
|
+
import { CreateOrderSchema } from './schemas.js';
|
|
5
|
+
|
|
6
|
+
type CreateOrderInput = z.infer<typeof CreateOrderSchema>;
|
|
7
|
+
|
|
8
|
+
export const getOrders: RequestHandler = (_req, res) => {
|
|
9
|
+
res.json([
|
|
10
|
+
{ id: 1, item: 'Laptop', price: 1200 },
|
|
11
|
+
{ id: 2, item: 'Mouse', price: 25 },
|
|
12
|
+
]);
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export const createOrder: RequestHandler<any, any, CreateOrderInput> = (req, res) => {
|
|
16
|
+
const { item, price } = (req as ValidatedRequest<{ body: CreateOrderInput }>).validated.body;
|
|
17
|
+
res.status(201).json({ id: 3, item, price });
|
|
18
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Router } from 'ultimate-express';
|
|
2
|
+
import { validateRequest } from '../../lib/validateRequest.js';
|
|
3
|
+
import { createOrder, getOrders } from './controller.js';
|
|
4
|
+
import { CreateOrderSchema } from './schemas.js';
|
|
5
|
+
|
|
6
|
+
// TODO: replace with real implementation
|
|
7
|
+
export const ordersRouter = Router();
|
|
8
|
+
|
|
9
|
+
ordersRouter.get('/', getOrders);
|
|
10
|
+
ordersRouter.post('/', validateRequest({ body: CreateOrderSchema }), createOrder);
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { registry } from '../../lib/openapi.js';
|
|
3
|
+
|
|
4
|
+
export const OrderSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
id: z.number().int().positive(),
|
|
7
|
+
item: z.string().min(1),
|
|
8
|
+
price: z.number().positive(),
|
|
9
|
+
})
|
|
10
|
+
.openapi('Order');
|
|
11
|
+
|
|
12
|
+
export const CreateOrderSchema = z
|
|
13
|
+
.object({
|
|
14
|
+
item: z.string().min(1),
|
|
15
|
+
price: z.number().positive(),
|
|
16
|
+
})
|
|
17
|
+
.openapi('CreateOrder');
|
|
18
|
+
|
|
19
|
+
registry.registerPath({
|
|
20
|
+
method: 'get',
|
|
21
|
+
path: '/api/orders',
|
|
22
|
+
tags: ['Orders'],
|
|
23
|
+
responses: {
|
|
24
|
+
200: {
|
|
25
|
+
description: 'List all orders',
|
|
26
|
+
content: {
|
|
27
|
+
'application/json': {
|
|
28
|
+
schema: z.array(OrderSchema),
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
registry.registerPath({
|
|
36
|
+
method: 'post',
|
|
37
|
+
path: '/api/orders',
|
|
38
|
+
tags: ['Orders'],
|
|
39
|
+
request: {
|
|
40
|
+
body: {
|
|
41
|
+
required: true,
|
|
42
|
+
content: {
|
|
43
|
+
'application/json': {
|
|
44
|
+
schema: CreateOrderSchema,
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
responses: {
|
|
50
|
+
201: {
|
|
51
|
+
description: 'Created order',
|
|
52
|
+
content: {
|
|
53
|
+
'application/json': {
|
|
54
|
+
schema: OrderSchema,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
400: {
|
|
59
|
+
description: 'Validation error',
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// example backend with ultimate-express
|
|
2
|
+
import 'dotenv/config';
|
|
3
|
+
import express from 'ultimate-express';
|
|
4
|
+
import type { Request, Response } from 'ultimate-express';
|
|
5
|
+
import cors from 'cors';
|
|
6
|
+
import { ordersRouter } from './features/orders/index.js';
|
|
7
|
+
import { healthRouter } from './features/health/index.js';
|
|
8
|
+
import { apiReference } from '@scalar/express-api-reference';
|
|
9
|
+
import { generateOpenApiDocument } from './lib/openapi.js';
|
|
10
|
+
|
|
11
|
+
const app = express();
|
|
12
|
+
|
|
13
|
+
app.use(cors());
|
|
14
|
+
app.use(express.json());
|
|
15
|
+
|
|
16
|
+
app.get('/', (req: Request, res: Response) => {
|
|
17
|
+
res.send('Hello, Ultimate Express!');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Mount feature routes
|
|
21
|
+
app.use('/api/orders', ordersRouter);
|
|
22
|
+
app.use('/api/health', healthRouter);
|
|
23
|
+
|
|
24
|
+
// API Documentation with Scalar
|
|
25
|
+
app.use(
|
|
26
|
+
'/api/docs',
|
|
27
|
+
apiReference({
|
|
28
|
+
spec: {
|
|
29
|
+
url: '/openapi.json',
|
|
30
|
+
},
|
|
31
|
+
}),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
// Example OpenAPI spec endpoint
|
|
35
|
+
app.get('/openapi.json', (req: Request, res: Response) => {
|
|
36
|
+
res.json(generateOpenApiDocument());
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const PORT = process.env.PORT || 3000;
|
|
40
|
+
app.listen(PORT, () => {
|
|
41
|
+
console.log(`Server is running on http://localhost:${PORT}`);
|
|
42
|
+
console.log(`API Documentation available at http://localhost:${PORT}/api/docs`);
|
|
43
|
+
});
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { OpenAPIRegistry, OpenApiGeneratorV3, extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
extendZodWithOpenApi(z);
|
|
5
|
+
|
|
6
|
+
export const registry = new OpenAPIRegistry();
|
|
7
|
+
|
|
8
|
+
export const generateOpenApiDocument = () => {
|
|
9
|
+
const generator = new OpenApiGeneratorV3(registry.definitions);
|
|
10
|
+
|
|
11
|
+
return generator.generateDocument({
|
|
12
|
+
openapi: '3.1.0',
|
|
13
|
+
info: {
|
|
14
|
+
title: 'Ultimate Express API',
|
|
15
|
+
version: '1.0.0',
|
|
16
|
+
description: 'API documentation generated from Zod schemas',
|
|
17
|
+
},
|
|
18
|
+
servers: [
|
|
19
|
+
{
|
|
20
|
+
url: `http://localhost:${process.env.PORT || 3000}`,
|
|
21
|
+
description: 'Development server',
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
});
|
|
25
|
+
};
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import type { NextFunction, Request, Response } from 'ultimate-express';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { validateRequest } from './validateRequest.js';
|
|
5
|
+
|
|
6
|
+
const createRes = () => {
|
|
7
|
+
const json = vi.fn();
|
|
8
|
+
const status = vi.fn().mockReturnValue({ json });
|
|
9
|
+
return { json, status } as unknown as Response;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
describe('validateRequest', () => {
|
|
13
|
+
it('parses and assigns validated data, then calls next', () => {
|
|
14
|
+
const middleware = validateRequest({
|
|
15
|
+
body: z.object({
|
|
16
|
+
id: z.coerce.number().int(),
|
|
17
|
+
name: z.string().transform((v) => v.trim()),
|
|
18
|
+
}),
|
|
19
|
+
query: z.object({
|
|
20
|
+
page: z.coerce.number().default(1),
|
|
21
|
+
}),
|
|
22
|
+
params: z.object({
|
|
23
|
+
slug: z.string().min(1),
|
|
24
|
+
}),
|
|
25
|
+
headers: z.object({
|
|
26
|
+
'x-trace': z.string().uuid(),
|
|
27
|
+
}),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const req = {
|
|
31
|
+
body: { id: '42', name: ' Alice ' },
|
|
32
|
+
query: {},
|
|
33
|
+
params: { slug: 'hello' },
|
|
34
|
+
headers: { 'x-trace': '550e8400-e29b-41d4-a716-446655440000' },
|
|
35
|
+
} as unknown as Request;
|
|
36
|
+
const res = createRes();
|
|
37
|
+
const next = vi.fn() as unknown as NextFunction;
|
|
38
|
+
|
|
39
|
+
middleware(req, res, next);
|
|
40
|
+
|
|
41
|
+
expect(next).toHaveBeenCalledTimes(1);
|
|
42
|
+
const validated = (req as any).validated;
|
|
43
|
+
expect(validated.body).toEqual({ id: 42, name: 'Alice' });
|
|
44
|
+
expect(validated.query).toEqual({ page: 1 });
|
|
45
|
+
expect(validated.params).toEqual({ slug: 'hello' });
|
|
46
|
+
expect(validated.headers).toEqual({ 'x-trace': '550e8400-e29b-41d4-a716-446655440000' });
|
|
47
|
+
|
|
48
|
+
expect(req.body).toEqual({ id: 42, name: 'Alice' });
|
|
49
|
+
expect(req.query).toEqual({ page: 1 });
|
|
50
|
+
expect(req.params).toEqual({ slug: 'hello' });
|
|
51
|
+
expect(req.headers).toEqual({ 'x-trace': '550e8400-e29b-41d4-a716-446655440000' });
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('returns 400 with flattened errors on validation failure', () => {
|
|
55
|
+
const middleware = validateRequest({
|
|
56
|
+
body: z.object({ id: z.number().int() }),
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const req = { body: { id: 'not-a-number' } } as unknown as Request;
|
|
60
|
+
const res = createRes();
|
|
61
|
+
const next = vi.fn() as unknown as NextFunction;
|
|
62
|
+
|
|
63
|
+
middleware(req, res, next);
|
|
64
|
+
|
|
65
|
+
expect(next).not.toHaveBeenCalled();
|
|
66
|
+
expect(res.status).toHaveBeenCalledWith(400);
|
|
67
|
+
const payload = (res.json as any).mock.calls[0][0] as { errors: unknown };
|
|
68
|
+
expect(payload).toHaveProperty('message', 'Validation error');
|
|
69
|
+
expect(payload.errors).toBeDefined();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('no-op when no schemas provided', () => {
|
|
73
|
+
const middleware = validateRequest({});
|
|
74
|
+
const req = {} as Request;
|
|
75
|
+
const res = createRes();
|
|
76
|
+
const next = vi.fn() as unknown as NextFunction;
|
|
77
|
+
|
|
78
|
+
middleware(req, res, next);
|
|
79
|
+
|
|
80
|
+
expect(next).toHaveBeenCalledTimes(1);
|
|
81
|
+
expect((res as any).status).not.toHaveBeenCalled();
|
|
82
|
+
expect((res as any).json).not.toHaveBeenCalled();
|
|
83
|
+
});
|
|
84
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { NextFunction, Request, Response } from 'ultimate-express';
|
|
2
|
+
import { z, type ZodType } from 'zod';
|
|
3
|
+
|
|
4
|
+
type RequestSchemas = {
|
|
5
|
+
body?: ZodType<unknown>;
|
|
6
|
+
query?: ZodType<unknown>;
|
|
7
|
+
params?: ZodType<unknown>;
|
|
8
|
+
headers?: ZodType<unknown>;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
type ParsedRequest<S extends RequestSchemas> = {
|
|
12
|
+
[K in keyof S]: S[K] extends ZodType<unknown> ? z.infer<S[K]> : never;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type ValidatedRequest<T> = Request & { validated: T };
|
|
16
|
+
|
|
17
|
+
export const validateRequest =
|
|
18
|
+
<S extends RequestSchemas>(schemas: S) =>
|
|
19
|
+
(req: Request, res: Response, next: NextFunction) => {
|
|
20
|
+
const shape: Record<string, ZodType<unknown>> = {};
|
|
21
|
+
const input: Record<string, unknown> = {};
|
|
22
|
+
|
|
23
|
+
if (schemas.body) {
|
|
24
|
+
shape.body = schemas.body;
|
|
25
|
+
input.body = req.body;
|
|
26
|
+
}
|
|
27
|
+
if (schemas.query) {
|
|
28
|
+
shape.query = schemas.query;
|
|
29
|
+
input.query = req.query;
|
|
30
|
+
}
|
|
31
|
+
if (schemas.params) {
|
|
32
|
+
shape.params = schemas.params;
|
|
33
|
+
input.params = req.params;
|
|
34
|
+
}
|
|
35
|
+
if (schemas.headers) {
|
|
36
|
+
shape.headers = schemas.headers;
|
|
37
|
+
input.headers = req.headers;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (Object.keys(shape).length === 0) {
|
|
41
|
+
next();
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const result = z.object(shape).safeParse(input);
|
|
46
|
+
|
|
47
|
+
if (!result.success) {
|
|
48
|
+
res.status(400).json({
|
|
49
|
+
message: 'Validation error',
|
|
50
|
+
errors: result.error.flatten((issue) => issue.message),
|
|
51
|
+
});
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const parsed = result.data as ParsedRequest<S>;
|
|
56
|
+
|
|
57
|
+
if (schemas.body) {
|
|
58
|
+
req.body = parsed.body as typeof req.body;
|
|
59
|
+
}
|
|
60
|
+
if (schemas.query) {
|
|
61
|
+
req.query = parsed.query as typeof req.query;
|
|
62
|
+
}
|
|
63
|
+
if (schemas.params) {
|
|
64
|
+
req.params = parsed.params as typeof req.params;
|
|
65
|
+
}
|
|
66
|
+
if (schemas.headers) {
|
|
67
|
+
req.headers = parsed.headers as typeof req.headers;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
(req as ValidatedRequest<ParsedRequest<S>>).validated = parsed;
|
|
71
|
+
next();
|
|
72
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"outDir": "./build",
|
|
4
|
+
"rootDir": "./",
|
|
5
|
+
"esModuleInterop": true,
|
|
6
|
+
"forceConsistentCasingInFileNames": true,
|
|
7
|
+
"lib": ["ESNext", "DOM"],
|
|
8
|
+
"target": "ESNext",
|
|
9
|
+
"module": "ESNext",
|
|
10
|
+
"moduleDetection": "force",
|
|
11
|
+
"allowJs": true,
|
|
12
|
+
"types": ["node", "vitest/globals"],
|
|
13
|
+
|
|
14
|
+
// Node module resolution
|
|
15
|
+
"moduleResolution": "node",
|
|
16
|
+
"noEmit": true,
|
|
17
|
+
|
|
18
|
+
// Best practices
|
|
19
|
+
"strict": true,
|
|
20
|
+
"skipLibCheck": true,
|
|
21
|
+
"noFallthroughCasesInSwitch": true,
|
|
22
|
+
|
|
23
|
+
// Some stricter flags (disabled by default)
|
|
24
|
+
"noUnusedLocals": false,
|
|
25
|
+
"noUnusedParameters": false,
|
|
26
|
+
"noPropertyAccessFromIndexSignature": false
|
|
27
|
+
},
|
|
28
|
+
"include": ["src/**/*", "scripts/**/*"],
|
|
29
|
+
"exclude": ["node_modules"],
|
|
30
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
test: {
|
|
5
|
+
globals: true,
|
|
6
|
+
environment: 'node',
|
|
7
|
+
include: ['tests/**/*.{test,spec}.{js,ts}', 'src/**/*.{test,spec}.{js,ts}'],
|
|
8
|
+
exclude: ['node_modules', 'build', 'src/generated/tests/**/*'],
|
|
9
|
+
coverage: {
|
|
10
|
+
provider: 'v8',
|
|
11
|
+
reporter: ['text', 'json', 'html'],
|
|
12
|
+
include: ['src/**/*.{ts,js}'],
|
|
13
|
+
exclude: [
|
|
14
|
+
'node_modules/',
|
|
15
|
+
'build/',
|
|
16
|
+
'tests/',
|
|
17
|
+
'*.config.*',
|
|
18
|
+
'src/**/schemas.ts',
|
|
19
|
+
'src/lib/openapi.ts',
|
|
20
|
+
'src/index.ts',
|
|
21
|
+
'src/**/index.ts',
|
|
22
|
+
'src/features/orders/**/*',
|
|
23
|
+
]
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
resolve: {
|
|
27
|
+
alias: {
|
|
28
|
+
'@': '/src',
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Use this agent when you need to create comprehensive test plan for a web application or website.
|
|
3
|
+
tools: ['edit/createFile', 'edit/createDirectory', 'search/fileSearch', 'search/textSearch', 'search/listDirectory', 'search/readFile', 'playwright-test/browser_click', 'playwright-test/browser_close', 'playwright-test/browser_console_messages', 'playwright-test/browser_drag', 'playwright-test/browser_evaluate', 'playwright-test/browser_file_upload', 'playwright-test/browser_handle_dialog', 'playwright-test/browser_hover', 'playwright-test/browser_navigate', 'playwright-test/browser_navigate_back', 'playwright-test/browser_network_requests', 'playwright-test/browser_press_key', 'playwright-test/browser_select_option', 'playwright-test/browser_snapshot', 'playwright-test/browser_take_screenshot', 'playwright-test/browser_type', 'playwright-test/browser_wait_for', 'playwright-test/planner_setup_page']
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are an expert web test planner with extensive experience in quality assurance, user experience testing, and test
|
|
7
|
+
scenario design. Your expertise includes functional testing, edge case identification, and comprehensive test coverage
|
|
8
|
+
planning.
|
|
9
|
+
|
|
10
|
+
You will:
|
|
11
|
+
|
|
12
|
+
1. **Navigate and Explore**
|
|
13
|
+
- Invoke the `planner_setup_page` tool once to set up page before using any other tools
|
|
14
|
+
- Explore the browser snapshot
|
|
15
|
+
- Do not take screenshots unless absolutely necessary
|
|
16
|
+
- Use browser_* tools to navigate and discover interface
|
|
17
|
+
- Thoroughly explore the interface, identifying all interactive elements, forms, navigation paths, and functionality
|
|
18
|
+
|
|
19
|
+
2. **Analyze User Flows**
|
|
20
|
+
- Map out the primary user journeys and identify critical paths through the application
|
|
21
|
+
- Consider different user types and their typical behaviors
|
|
22
|
+
|
|
23
|
+
3. **Design Comprehensive Scenarios**
|
|
24
|
+
|
|
25
|
+
Create detailed test scenarios that cover:
|
|
26
|
+
- Happy path scenarios (normal user behavior)
|
|
27
|
+
- Edge cases and boundary conditions
|
|
28
|
+
- Error handling and validation
|
|
29
|
+
|
|
30
|
+
4. **Structure Test Plans**
|
|
31
|
+
|
|
32
|
+
Each scenario must include:
|
|
33
|
+
- Clear, descriptive title
|
|
34
|
+
- Detailed step-by-step instructions
|
|
35
|
+
- Expected outcomes where appropriate
|
|
36
|
+
- Assumptions about starting state (always assume blank/fresh state)
|
|
37
|
+
- Success criteria and failure conditions
|
|
38
|
+
|
|
39
|
+
5. **Create Documentation**
|
|
40
|
+
|
|
41
|
+
Save your test plan as requested:
|
|
42
|
+
- Executive summary of the tested page/application
|
|
43
|
+
- Individual scenarios as separate sections
|
|
44
|
+
- Each scenario formatted with numbered steps
|
|
45
|
+
- Clear expected results for verification
|
|
46
|
+
|
|
47
|
+
<example-spec>
|
|
48
|
+
# TodoMVC Application - Comprehensive Test Plan
|
|
49
|
+
|
|
50
|
+
## Application Overview
|
|
51
|
+
|
|
52
|
+
The TodoMVC application is a React-based todo list manager that provides core task management functionality. The
|
|
53
|
+
application features:
|
|
54
|
+
|
|
55
|
+
- **Task Management**: Add, edit, complete, and delete individual todos
|
|
56
|
+
- **Bulk Operations**: Mark all todos as complete/incomplete and clear all completed todos
|
|
57
|
+
- **Filtering**: View todos by All, Active, or Completed status
|
|
58
|
+
- **URL Routing**: Support for direct navigation to filtered views via URLs
|
|
59
|
+
- **Counter Display**: Real-time count of active (incomplete) todos
|
|
60
|
+
- **Persistence**: State maintained during session (browser refresh behavior not tested)
|
|
61
|
+
|
|
62
|
+
## Test Scenarios
|
|
63
|
+
|
|
64
|
+
### 1. Adding New Todos
|
|
65
|
+
|
|
66
|
+
**Seed:** `tests/seed.spec.ts`
|
|
67
|
+
|
|
68
|
+
#### 1.1 Add Valid Todo
|
|
69
|
+
**Steps:**
|
|
70
|
+
1. Click in the "What needs to be done?" input field
|
|
71
|
+
2. Type "Buy groceries"
|
|
72
|
+
3. Press Enter key
|
|
73
|
+
|
|
74
|
+
**Expected Results:**
|
|
75
|
+
- Todo appears in the list with unchecked checkbox
|
|
76
|
+
- Counter shows "1 item left"
|
|
77
|
+
- Input field is cleared and ready for next entry
|
|
78
|
+
- Todo list controls become visible (Mark all as complete checkbox)
|
|
79
|
+
|
|
80
|
+
#### 1.2
|
|
81
|
+
...
|
|
82
|
+
</example-spec>
|
|
83
|
+
|
|
84
|
+
**Quality Standards**:
|
|
85
|
+
- Write steps that are specific enough for any tester to follow
|
|
86
|
+
- Include negative testing scenarios
|
|
87
|
+
- Ensure scenarios are independent and can be run in any order
|
|
88
|
+
|
|
89
|
+
**Output Format**: Always save the complete test plan as a markdown file with clear headings, numbered steps, and
|
|
90
|
+
professional formatting suitable for sharing with development and QA teams.
|
|
91
|
+
<example>Context: User wants to test a new e-commerce checkout flow. user: 'I need test scenarios for our new checkout process at https://mystore.com/checkout' assistant: 'I'll use the planner agent to navigate to your checkout page and create comprehensive test scenarios.' <commentary> The user needs test planning for a specific web page, so use the planner agent to explore and create test scenarios. </commentary></example>
|
|
92
|
+
<example>Context: User has deployed a new feature and wants thorough testing coverage. user: 'Can you help me test our new user dashboard at https://app.example.com/dashboard?' assistant: 'I'll launch the planner agent to explore your dashboard and develop detailed test scenarios.' <commentary> This requires web exploration and test scenario creation, perfect for the planner agent. </commentary></example>
|