@nextsparkjs/ai-workflow 0.1.0-beta.100
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 +21 -0
- package/README.md +115 -0
- package/claude/_docs/workflows-optimizations.md +359 -0
- package/claude/agents/api-tester.md +634 -0
- package/claude/agents/architecture-supervisor.md +1351 -0
- package/claude/agents/backend-developer.md +997 -0
- package/claude/agents/backend-validator.md +417 -0
- package/claude/agents/bdd-docs-writer.md +737 -0
- package/claude/agents/block-developer.md +677 -0
- package/claude/agents/code-reviewer.md +1432 -0
- package/claude/agents/db-developer.md +721 -0
- package/claude/agents/db-validator.md +407 -0
- package/claude/agents/demo-video-generator.md +493 -0
- package/claude/agents/documentation-writer.md +1268 -0
- package/claude/agents/frontend-developer.md +1234 -0
- package/claude/agents/frontend-validator.md +777 -0
- package/claude/agents/functional-validator.md +630 -0
- package/claude/agents/mock-analyst.md +387 -0
- package/claude/agents/product-manager.md +963 -0
- package/claude/agents/qa-automation.md +1762 -0
- package/claude/agents/release-manager.md +634 -0
- package/claude/agents/selectors-translator.md +262 -0
- package/claude/agents/unit-test-writer.md +785 -0
- package/claude/agents/visual-comparator.md +329 -0
- package/claude/agents/workflow-maintainer.md +352 -0
- package/claude/commands/do/README.md +88 -0
- package/claude/commands/do/create-api.md +64 -0
- package/claude/commands/do/create-entity.md +66 -0
- package/claude/commands/do/create-migration.md +64 -0
- package/claude/commands/do/create-plugin.md +56 -0
- package/claude/commands/do/create-theme.md +70 -0
- package/claude/commands/do/mock-data.md +67 -0
- package/claude/commands/do/reset-db.md +71 -0
- package/claude/commands/do/setup-scheduled-action.md +75 -0
- package/claude/commands/do/sync-code-review.md +117 -0
- package/claude/commands/do/update-selectors.md +112 -0
- package/claude/commands/do/use-skills.md +90 -0
- package/claude/commands/do/validate-blocks.md +69 -0
- package/claude/commands/how-to/README.md +261 -0
- package/claude/commands/how-to/add-metadata.md +692 -0
- package/claude/commands/how-to/add-taxonomies.md +806 -0
- package/claude/commands/how-to/add-translations.md +571 -0
- package/claude/commands/how-to/create-api.md +577 -0
- package/claude/commands/how-to/create-block.md +575 -0
- package/claude/commands/how-to/create-child-entities.md +771 -0
- package/claude/commands/how-to/create-entity.md +597 -0
- package/claude/commands/how-to/create-migrations.md +605 -0
- package/claude/commands/how-to/create-plugin.md +654 -0
- package/claude/commands/how-to/customize-app.md +481 -0
- package/claude/commands/how-to/customize-dashboard.md +553 -0
- package/claude/commands/how-to/customize-theme.md +438 -0
- package/claude/commands/how-to/define-features-flows.md +632 -0
- package/claude/commands/how-to/deploy.md +507 -0
- package/claude/commands/how-to/handle-file-uploads.md +746 -0
- package/claude/commands/how-to/implement-search.md +1001 -0
- package/claude/commands/how-to/install-plugins.md +352 -0
- package/claude/commands/how-to/manage-test-coverage.md +984 -0
- package/claude/commands/how-to/run-tests.md +400 -0
- package/claude/commands/how-to/set-app-languages.md +601 -0
- package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
- package/claude/commands/how-to/set-scheduled-actions.md +527 -0
- package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
- package/claude/commands/how-to/setup-authentication.md +388 -0
- package/claude/commands/how-to/setup-claude-code.md +440 -0
- package/claude/commands/how-to/setup-database.md +274 -0
- package/claude/commands/how-to/setup-email-providers.md +598 -0
- package/claude/commands/how-to/setup-mobile-dev.md +627 -0
- package/claude/commands/how-to/start.md +500 -0
- package/claude/commands/how-to/use-devtools.md +639 -0
- package/claude/commands/how-to/use-superadmin.md +622 -0
- package/claude/commands/session/README.md +193 -0
- package/claude/commands/session/block-create.md +190 -0
- package/claude/commands/session/block-list.md +203 -0
- package/claude/commands/session/block-update.md +192 -0
- package/claude/commands/session/block-validate.md +218 -0
- package/claude/commands/session/changelog.md +115 -0
- package/claude/commands/session/close.md +225 -0
- package/claude/commands/session/commit.md +174 -0
- package/claude/commands/session/db-entity.md +206 -0
- package/claude/commands/session/db-fix.md +212 -0
- package/claude/commands/session/db-sample.md +206 -0
- package/claude/commands/session/demo.md +178 -0
- package/claude/commands/session/doc-bdd.md +207 -0
- package/claude/commands/session/doc-feature.md +218 -0
- package/claude/commands/session/doc-read.md +225 -0
- package/claude/commands/session/execute.md +204 -0
- package/claude/commands/session/explain.md +202 -0
- package/claude/commands/session/fix-bug.md +210 -0
- package/claude/commands/session/fix-build.md +182 -0
- package/claude/commands/session/fix-test.md +189 -0
- package/claude/commands/session/pending.md +232 -0
- package/claude/commands/session/refine.md +188 -0
- package/claude/commands/session/resume.md +192 -0
- package/claude/commands/session/review.md +192 -0
- package/claude/commands/session/scope-change.md +181 -0
- package/claude/commands/session/start-blocks.md +347 -0
- package/claude/commands/session/start.md +604 -0
- package/claude/commands/session/status.md +169 -0
- package/claude/commands/session/test-fix.md +221 -0
- package/claude/commands/session/test-run.md +203 -0
- package/claude/commands/session/test-write.md +242 -0
- package/claude/commands/session/validate.md +162 -0
- package/claude/config/context.json +40 -0
- package/claude/config/github.json +69 -0
- package/claude/config/github.schema.json +106 -0
- package/claude/config/team.json +46 -0
- package/claude/config/team.schema.json +106 -0
- package/claude/config/workspace.json +43 -0
- package/claude/config/workspace.schema.json +75 -0
- package/claude/skills/README.md +228 -0
- package/claude/skills/accessibility/SKILL.md +573 -0
- package/claude/skills/api-bypass-layers/SKILL.md +550 -0
- package/claude/skills/asana-integration/SKILL.md +499 -0
- package/claude/skills/better-auth/SKILL.md +666 -0
- package/claude/skills/billing-subscriptions/SKILL.md +660 -0
- package/claude/skills/block-decision-matrix/SKILL.md +359 -0
- package/claude/skills/clickup-integration/SKILL.md +434 -0
- package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
- package/claude/skills/create-plugin/SKILL.md +425 -0
- package/claude/skills/create-theme/SKILL.md +331 -0
- package/claude/skills/cypress-api/SKILL.md +511 -0
- package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
- package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
- package/claude/skills/cypress-e2e/SKILL.md +526 -0
- package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
- package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
- package/claude/skills/cypress-selectors/SKILL.md +309 -0
- package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
- package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
- package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
- package/claude/skills/database-migrations/SKILL.md +335 -0
- package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
- package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
- package/claude/skills/design-system/SKILL.md +682 -0
- package/claude/skills/documentation/SKILL.md +540 -0
- package/claude/skills/entity-api/SKILL.md +482 -0
- package/claude/skills/entity-system/SKILL.md +635 -0
- package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
- package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
- package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
- package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
- package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
- package/claude/skills/github/SKILL.md +467 -0
- package/claude/skills/i18n-nextintl/SKILL.md +302 -0
- package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
- package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
- package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
- package/claude/skills/impact-analysis/SKILL.md +203 -0
- package/claude/skills/jest-unit/SKILL.md +306 -0
- package/claude/skills/jest-unit/references/component-testing.md +371 -0
- package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
- package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
- package/claude/skills/jira-integration/SKILL.md +539 -0
- package/claude/skills/media-library/SKILL.md +743 -0
- package/claude/skills/mock-analysis/SKILL.md +276 -0
- package/claude/skills/monorepo-architecture/SKILL.md +162 -0
- package/claude/skills/nextjs-api-development/SKILL.md +364 -0
- package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
- package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
- package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
- package/claude/skills/notion-integration/SKILL.md +641 -0
- package/claude/skills/npm-development-workflow/SKILL.md +480 -0
- package/claude/skills/page-builder-blocks/SKILL.md +530 -0
- package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
- package/claude/skills/permissions-system/SKILL.md +619 -0
- package/claude/skills/plugins/SKILL.md +340 -0
- package/claude/skills/plugins/references/plugin-templates.md +414 -0
- package/claude/skills/plugins/references/plugin-testing.md +353 -0
- package/claude/skills/plugins/references/plugin-types.md +198 -0
- package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
- package/claude/skills/pom-patterns/SKILL.md +452 -0
- package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
- package/claude/skills/rate-limiting/SKILL.md +342 -0
- package/claude/skills/react-best-practices/AGENTS.md +2410 -0
- package/claude/skills/react-best-practices/README.md +123 -0
- package/claude/skills/react-best-practices/SKILL.md +125 -0
- package/claude/skills/react-best-practices/metadata.json +15 -0
- package/claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/claude/skills/react-best-practices/rules/_template.md +28 -0
- package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/claude/skills/react-patterns/SKILL.md +688 -0
- package/claude/skills/registry-system/SKILL.md +331 -0
- package/claude/skills/scheduled-actions/SKILL.md +671 -0
- package/claude/skills/scope-enforcement/SKILL.md +542 -0
- package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
- package/claude/skills/server-actions/SKILL.md +493 -0
- package/claude/skills/service-layer/SKILL.md +587 -0
- package/claude/skills/session-management/SKILL.md +266 -0
- package/claude/skills/session-management/scripts/create-session.py +166 -0
- package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
- package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
- package/claude/skills/session-management/scripts/session-archive.sh +87 -0
- package/claude/skills/session-management/scripts/session-close.sh +133 -0
- package/claude/skills/session-management/scripts/session-init.sh +225 -0
- package/claude/skills/session-management/scripts/session-list.sh +163 -0
- package/claude/skills/session-management/scripts/split-plan.sh +116 -0
- package/claude/skills/shadcn-components/SKILL.md +586 -0
- package/claude/skills/shadcn-theming/SKILL.md +446 -0
- package/claude/skills/suspense-loading/SKILL.md +280 -0
- package/claude/skills/tailwind-theming/SKILL.md +507 -0
- package/claude/skills/tanstack-query/SKILL.md +608 -0
- package/claude/skills/test-coverage/SKILL.md +239 -0
- package/claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/claude/skills/zod-validation/SKILL.md +537 -0
- package/claude/templates/blocks/progress.md +86 -0
- package/claude/templates/iteration/changes.md +61 -0
- package/claude/templates/iteration/progress.md +55 -0
- package/claude/templates/log.md +31 -0
- package/claude/templates/story/context.md +77 -0
- package/claude/templates/story/pendings.md +37 -0
- package/claude/templates/story/plan.md +299 -0
- package/claude/templates/story/requirements.md +109 -0
- package/claude/templates/story/scope.json +10 -0
- package/claude/templates/story/tests.md +91 -0
- package/claude/templates/task/progress.md +58 -0
- package/claude/templates/task/requirements.md +54 -0
- package/claude/workflows/README.md +154 -0
- package/claude/workflows/blocks.md +614 -0
- package/claude/workflows/story.md +1207 -0
- package/claude/workflows/task.md +927 -0
- package/claude/workflows/tweak.md +527 -0
- package/cursor/.gitkeep +0 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +198 -0
- package/scripts/setup.mjs +282 -0
- package/scripts/sync.mjs +209 -0
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cypress-e2e
|
|
3
|
+
description: |
|
|
4
|
+
End-to-End testing patterns with Cypress for UAT tests.
|
|
5
|
+
Covers test structure, cy.session(), batch execution, tags, POMs, and BDD documentation.
|
|
6
|
+
Use this skill when writing UAT tests or creating new entity test files.
|
|
7
|
+
allowed-tools: Read, Glob, Grep, Bash(python:*), Bash(pnpm cy:run:*)
|
|
8
|
+
version: 1.0.0
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Cypress E2E Testing Skill
|
|
12
|
+
|
|
13
|
+
Patterns and tools for writing End-to-End UAT tests with Cypress.
|
|
14
|
+
|
|
15
|
+
## Architecture Overview
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
contents/themes/{theme}/tests/cypress/
|
|
19
|
+
├── e2e/
|
|
20
|
+
│ ├── api/ # API tests (see cypress-api skill)
|
|
21
|
+
│ │ └── entities/
|
|
22
|
+
│ │ └── {entity}-crud.cy.ts
|
|
23
|
+
│ ├── uat/ # UAT tests (this skill)
|
|
24
|
+
│ │ ├── {entity}/
|
|
25
|
+
│ │ │ ├── {entity}-owner.cy.ts
|
|
26
|
+
│ │ │ ├── {entity}-owner.bdd.md # BDD documentation
|
|
27
|
+
│ │ │ └── {entity}-member.cy.ts
|
|
28
|
+
│ │ └── {feature}/
|
|
29
|
+
│ │ └── {feature}.cy.ts
|
|
30
|
+
│ └── _selectors/ # Selector validation tests
|
|
31
|
+
│ └── {feature}-selectors.cy.ts
|
|
32
|
+
├── src/
|
|
33
|
+
│ ├── core/ # Base classes (DO NOT MODIFY)
|
|
34
|
+
│ │ ├── BasePOM.ts
|
|
35
|
+
│ │ ├── DashboardEntityPOM.ts
|
|
36
|
+
│ │ └── AuthPOM.ts
|
|
37
|
+
│ ├── entities/ # Entity POMs
|
|
38
|
+
│ │ └── {Entity}POM.ts
|
|
39
|
+
│ ├── features/ # Feature POMs
|
|
40
|
+
│ │ └── {Feature}POM.ts
|
|
41
|
+
│ ├── controllers/ # API controllers
|
|
42
|
+
│ │ └── {Entity}APIController.js
|
|
43
|
+
│ ├── helpers/
|
|
44
|
+
│ │ └── ApiInterceptor.ts
|
|
45
|
+
│ ├── session-helpers.ts # Login functions
|
|
46
|
+
│ └── selectors.ts # Theme selectors
|
|
47
|
+
└── fixtures/
|
|
48
|
+
└── entities.json # AUTO-GENERATED entity config
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## When to Use This Skill
|
|
52
|
+
|
|
53
|
+
- Writing UAT tests for entity CRUD operations
|
|
54
|
+
- Creating role-based test suites (owner, member, viewer)
|
|
55
|
+
- Implementing cy.session() for cached authentication
|
|
56
|
+
- Using Page Object Model pattern
|
|
57
|
+
- Generating BDD documentation
|
|
58
|
+
|
|
59
|
+
## Test Tag System
|
|
60
|
+
|
|
61
|
+
### Permanent Tags (COMMIT)
|
|
62
|
+
|
|
63
|
+
| Tag | Purpose | When to Use |
|
|
64
|
+
|-----|---------|-------------|
|
|
65
|
+
| `@api` | API tests | Tests in `e2e/api/` |
|
|
66
|
+
| `@uat` | UAT tests | Tests in `e2e/uat/` |
|
|
67
|
+
| `@smoke` | Critical path tests | Must-pass tests |
|
|
68
|
+
| `@regression` | Full test suite | All tests |
|
|
69
|
+
| `@feat-{entity}` | Entity-specific | `@feat-tasks`, `@feat-customers` |
|
|
70
|
+
| `@role-{role}` | Role-based tests | `@role-owner`, `@role-member` |
|
|
71
|
+
| `@crud` | CRUD operations | Tests covering Create/Read/Update/Delete |
|
|
72
|
+
|
|
73
|
+
### Temporary Tags (NEVER COMMIT)
|
|
74
|
+
|
|
75
|
+
| Tag | Purpose | When to Use |
|
|
76
|
+
|-----|---------|-------------|
|
|
77
|
+
| `@in-develop` | Tests being fixed | During iteration loop |
|
|
78
|
+
| `@scope-{session}` | Session tests | All tests for current session |
|
|
79
|
+
|
|
80
|
+
**CRITICAL:** code-reviewer (Phase 16) BLOCKS if temporary tags remain.
|
|
81
|
+
|
|
82
|
+
## Test ID Convention
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
{ROLE}_{ENTITY_SLUG_UPPER}_{ACTION}_{NUMBER}
|
|
86
|
+
|
|
87
|
+
Examples:
|
|
88
|
+
- OWNER_TASK_CREATE_001
|
|
89
|
+
- MEMBER_CUSTOMER_READ_001
|
|
90
|
+
- ADMIN_POST_DELETE_001
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Session Helpers (cy.session)
|
|
94
|
+
|
|
95
|
+
### Available Login Functions
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
import {
|
|
99
|
+
loginAsOwner,
|
|
100
|
+
loginAsAdmin,
|
|
101
|
+
loginAsMember,
|
|
102
|
+
loginAsEditor,
|
|
103
|
+
loginAsViewer,
|
|
104
|
+
loginAsSuperadmin,
|
|
105
|
+
loginAsDeveloper
|
|
106
|
+
} from '../session-helpers'
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Test Users
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
// Team-based users (password: 'Test1234')
|
|
113
|
+
DEFAULT_THEME_USERS = {
|
|
114
|
+
OWNER: 'carlos.mendoza@tmt.dev', // Everpoint Labs (owner)
|
|
115
|
+
ADMIN: 'james.wilson@tmt.dev', // Everpoint Labs (admin)
|
|
116
|
+
MEMBER: 'emily.johnson@tmt.dev', // Everpoint (member)
|
|
117
|
+
EDITOR: 'diego.ramirez@tmt.dev', // Everpoint Labs (editor)
|
|
118
|
+
VIEWER: 'sarah.davis@tmt.dev', // Ironvale Global (viewer)
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Core system users (password: 'Pandora1234')
|
|
122
|
+
CORE_USERS = {
|
|
123
|
+
SUPERADMIN: 'superadmin@tmt.dev', // Global superadmin
|
|
124
|
+
DEVELOPER: 'developer@tmt.dev', // Global developer
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Session Pattern
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
describe('Entity CRUD - Owner Role', {
|
|
132
|
+
tags: ['@uat', '@feat-tasks', '@role-owner', '@regression']
|
|
133
|
+
}, () => {
|
|
134
|
+
const pom = TasksPOM.create()
|
|
135
|
+
|
|
136
|
+
beforeEach(() => {
|
|
137
|
+
// cy.session() handles caching automatically
|
|
138
|
+
loginAsOwner()
|
|
139
|
+
|
|
140
|
+
// Setup API intercepts BEFORE navigation
|
|
141
|
+
pom.setupApiIntercepts()
|
|
142
|
+
|
|
143
|
+
// Navigate with API wait
|
|
144
|
+
pom.visitList()
|
|
145
|
+
pom.api.waitForList()
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
it('OWNER_TASK_CREATE_001: should create new task', () => {
|
|
149
|
+
// Test implementation
|
|
150
|
+
})
|
|
151
|
+
})
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Page Object Model (POM) Pattern
|
|
155
|
+
|
|
156
|
+
### Entity POM Structure
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import { DashboardEntityPOM } from '../core/DashboardEntityPOM'
|
|
160
|
+
import entitiesConfig from '../../fixtures/entities.json'
|
|
161
|
+
|
|
162
|
+
export interface TaskFormData {
|
|
163
|
+
title?: string
|
|
164
|
+
description?: string
|
|
165
|
+
priority?: string
|
|
166
|
+
status?: string
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export class TasksPOM extends DashboardEntityPOM {
|
|
170
|
+
constructor() {
|
|
171
|
+
// NEVER hardcode slugs - always from entities.json
|
|
172
|
+
super(entitiesConfig.entities.tasks.slug)
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// Factory pattern (MANDATORY)
|
|
176
|
+
static create(): TasksPOM {
|
|
177
|
+
return new TasksPOM()
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Entity-specific form filling
|
|
181
|
+
fillTaskForm(data: TaskFormData): this {
|
|
182
|
+
if (data.title) this.fillField('title', data.title)
|
|
183
|
+
if (data.description) this.fillTextarea('description', data.description)
|
|
184
|
+
if (data.priority) this.selectOption('priority', data.priority)
|
|
185
|
+
return this
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Entity-specific workflows
|
|
189
|
+
createTaskWithApiWait(data: TaskFormData): this {
|
|
190
|
+
this.setupApiIntercepts()
|
|
191
|
+
this.clickAdd()
|
|
192
|
+
this.waitForForm()
|
|
193
|
+
this.fillTaskForm(data)
|
|
194
|
+
this.submitForm()
|
|
195
|
+
this.api.waitForCreate()
|
|
196
|
+
return this
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### DashboardEntityPOM Methods
|
|
202
|
+
|
|
203
|
+
| Method | Description |
|
|
204
|
+
|--------|-------------|
|
|
205
|
+
| `visitList()` | Navigate to entity list page |
|
|
206
|
+
| `visitCreate()` | Navigate to create form |
|
|
207
|
+
| `visitEdit(id)` | Navigate to edit form |
|
|
208
|
+
| `visitDetail(id)` | Navigate to detail page |
|
|
209
|
+
| `clickAdd()` | Click add button |
|
|
210
|
+
| `submitForm()` | Submit current form |
|
|
211
|
+
| `waitForList()` | Wait for list to load |
|
|
212
|
+
| `waitForForm()` | Wait for form to load |
|
|
213
|
+
| `waitForDetail()` | Wait for detail to load |
|
|
214
|
+
| `assertInList(text)` | Assert text in list |
|
|
215
|
+
| `assertNotInList(text)` | Assert text not in list |
|
|
216
|
+
| `assertTableVisible()` | Assert table is visible |
|
|
217
|
+
|
|
218
|
+
### ApiInterceptor Methods
|
|
219
|
+
|
|
220
|
+
| Method | Description |
|
|
221
|
+
|--------|-------------|
|
|
222
|
+
| `setupApiIntercepts()` | Setup all intercepts |
|
|
223
|
+
| `api.waitForList()` | Wait for GET list |
|
|
224
|
+
| `api.waitForCreate()` | Wait for POST create |
|
|
225
|
+
| `api.waitForUpdate()` | Wait for PATCH update |
|
|
226
|
+
| `api.waitForDelete()` | Wait for DELETE |
|
|
227
|
+
|
|
228
|
+
## Batch Execution Strategy
|
|
229
|
+
|
|
230
|
+
### Configuration
|
|
231
|
+
|
|
232
|
+
| Setting | Default | Description |
|
|
233
|
+
|---------|---------|-------------|
|
|
234
|
+
| `BATCH_SIZE` | 5 | Tests per batch |
|
|
235
|
+
| `SUCCESS_THRESHOLD` | 0.9 | Minimum pass rate (90%) |
|
|
236
|
+
| `MAX_BATCH_RETRIES` | 3 | Max retries per batch |
|
|
237
|
+
|
|
238
|
+
### Workflow
|
|
239
|
+
|
|
240
|
+
```
|
|
241
|
+
1. PLAN: Document tests in tests.md
|
|
242
|
+
2. BATCH: Group into batches of 5
|
|
243
|
+
3. FOR EACH BATCH:
|
|
244
|
+
a. TAG: Add @in-develop + @scope-{session}
|
|
245
|
+
b. RUN: Execute with --env grepTags="@in-develop"
|
|
246
|
+
c. FIX: Address failures
|
|
247
|
+
d. RETRY: Until batch passes (max 3)
|
|
248
|
+
e. UNTAG: Remove @in-develop (keep @scope)
|
|
249
|
+
4. FINAL: Run all with --env grepTags="@scope-{session}"
|
|
250
|
+
5. EVALUATE: Calculate pass rate
|
|
251
|
+
6. CLEANUP: Remove ALL temporary tags
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Pass Rate Thresholds
|
|
255
|
+
|
|
256
|
+
| Rate | Status | Action |
|
|
257
|
+
|------|--------|--------|
|
|
258
|
+
| 100% | GATE_PASSED | Continue to code-review |
|
|
259
|
+
| 90-99% | GATE_PASSED_WITH_WARNINGS | Document in pendings.md |
|
|
260
|
+
| <90% | GATE_FAILED | Block workflow |
|
|
261
|
+
|
|
262
|
+
## BDD Documentation Format
|
|
263
|
+
|
|
264
|
+
Each test file should have a corresponding `.bdd.md` file with bilingual documentation.
|
|
265
|
+
|
|
266
|
+
### UAT BDD Format
|
|
267
|
+
|
|
268
|
+
```markdown
|
|
269
|
+
# {Entity} UI - {Role} Role (Format: BDD/Gherkin - Bilingual)
|
|
270
|
+
|
|
271
|
+
> **Test File:** `{entity}-{role}.cy.ts`
|
|
272
|
+
> **Format:** Behavior-Driven Development (BDD) with Given/When/Then
|
|
273
|
+
> **Languages:** English / Spanish (side-by-side)
|
|
274
|
+
> **Total Tests:** N
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Feature: {Entity} Management - {Role} Role (Access Level)
|
|
279
|
+
|
|
280
|
+
<table>
|
|
281
|
+
<tr>
|
|
282
|
+
<th width="50%">English</th>
|
|
283
|
+
<th width="50%">Espanol</th>
|
|
284
|
+
</tr>
|
|
285
|
+
<tr>
|
|
286
|
+
<td>
|
|
287
|
+
|
|
288
|
+
As a **{Role}**
|
|
289
|
+
I want to **manage {entities} through the dashboard UI**
|
|
290
|
+
So that **I can perform operations for my team**
|
|
291
|
+
|
|
292
|
+
</td>
|
|
293
|
+
<td>
|
|
294
|
+
|
|
295
|
+
Como **{Role}**
|
|
296
|
+
Quiero **gestionar {entidades} a traves del dashboard**
|
|
297
|
+
Para **realizar operaciones para mi equipo**
|
|
298
|
+
|
|
299
|
+
</td>
|
|
300
|
+
</tr>
|
|
301
|
+
</table>
|
|
302
|
+
|
|
303
|
+
### Background
|
|
304
|
+
|
|
305
|
+
<table>
|
|
306
|
+
<tr>
|
|
307
|
+
<th width="50%">English</th>
|
|
308
|
+
<th width="50%">Espanol</th>
|
|
309
|
+
</tr>
|
|
310
|
+
<tr>
|
|
311
|
+
<td>
|
|
312
|
+
|
|
313
|
+
```gherkin
|
|
314
|
+
Given I am logged in as {Role} ({email})
|
|
315
|
+
And I have navigated to the {Entity} dashboard
|
|
316
|
+
And the list has loaded successfully
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
</td>
|
|
320
|
+
<td>
|
|
321
|
+
|
|
322
|
+
```gherkin
|
|
323
|
+
Given estoy logueado como {Role} ({email})
|
|
324
|
+
And he navegado al dashboard de {Entidad}
|
|
325
|
+
And la lista ha cargado exitosamente
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
</td>
|
|
329
|
+
</tr>
|
|
330
|
+
</table>
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## CREATE - {Role} can create {entities}
|
|
335
|
+
|
|
336
|
+
### {ROLE}_{ENTITY}_CREATE_001: Create new {entity} successfully `@smoke` `@critical`
|
|
337
|
+
|
|
338
|
+
<table>
|
|
339
|
+
<tr>
|
|
340
|
+
<th width="50%">English</th>
|
|
341
|
+
<th width="50%">Espanol</th>
|
|
342
|
+
</tr>
|
|
343
|
+
<tr>
|
|
344
|
+
<td>
|
|
345
|
+
|
|
346
|
+
```gherkin
|
|
347
|
+
Scenario: {Role} creates a simple {entity}
|
|
348
|
+
|
|
349
|
+
Given I am logged in as {Role}
|
|
350
|
+
And I am on the {Entity} list page
|
|
351
|
+
When I click the "Add" button
|
|
352
|
+
Then the creation form should appear
|
|
353
|
+
|
|
354
|
+
When I enter "Test {Entity}" in the Title field
|
|
355
|
+
And I click the "Save" button
|
|
356
|
+
Then the form should submit successfully
|
|
357
|
+
And I should see a success message
|
|
358
|
+
And I should be redirected to the list
|
|
359
|
+
And I should see "Test {Entity}" in the list
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
</td>
|
|
363
|
+
<td>
|
|
364
|
+
|
|
365
|
+
```gherkin
|
|
366
|
+
Scenario: {Role} crea un/a {entidad} simple
|
|
367
|
+
|
|
368
|
+
Given estoy logueado como {Role}
|
|
369
|
+
And estoy en la pagina de lista de {Entidades}
|
|
370
|
+
When hago clic en el boton "Agregar"
|
|
371
|
+
Then deberia aparecer el formulario de creacion
|
|
372
|
+
|
|
373
|
+
When ingreso "Test {Entidad}" en el campo Titulo
|
|
374
|
+
And hago clic en el boton "Guardar"
|
|
375
|
+
Then el formulario deberia enviarse exitosamente
|
|
376
|
+
And deberia ver un mensaje de exito
|
|
377
|
+
And deberia ser redirigido a la lista
|
|
378
|
+
And deberia ver "Test {Entidad}" en la lista
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
</td>
|
|
382
|
+
</tr>
|
|
383
|
+
</table>
|
|
384
|
+
|
|
385
|
+
**Visual Flow:**
|
|
386
|
+
```
|
|
387
|
+
[List Page] → [Click Add] → [Form] → [Fill Fields] → [Save] → [List with new item]
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Summary
|
|
393
|
+
|
|
394
|
+
| Test ID | Operation | Description | Tags |
|
|
395
|
+
|---------|-----------|-------------|------|
|
|
396
|
+
| {ROLE}_{ENTITY}_CREATE_001 | CREATE | Create with title | `@smoke` `@critical` |
|
|
397
|
+
| {ROLE}_{ENTITY}_READ_001 | READ | View list | `@smoke` |
|
|
398
|
+
| {ROLE}_{ENTITY}_UPDATE_001 | UPDATE | Edit existing | |
|
|
399
|
+
| {ROLE}_{ENTITY}_DELETE_001 | DELETE | Delete | `@critical` |
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
## Scripts
|
|
403
|
+
|
|
404
|
+
### Generate UAT Test
|
|
405
|
+
|
|
406
|
+
```bash
|
|
407
|
+
# Generate test file + BDD documentation
|
|
408
|
+
python3 .claude/skills/cypress-e2e/scripts/generate-uat-test.py \
|
|
409
|
+
--entity tasks \
|
|
410
|
+
--theme default \
|
|
411
|
+
--role owner \
|
|
412
|
+
--with-bdd
|
|
413
|
+
|
|
414
|
+
# Preview without writing
|
|
415
|
+
python3 .claude/skills/cypress-e2e/scripts/generate-uat-test.py \
|
|
416
|
+
--entity tasks \
|
|
417
|
+
--theme default \
|
|
418
|
+
--role owner \
|
|
419
|
+
--with-bdd \
|
|
420
|
+
--dry-run
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Generate Entity POM
|
|
424
|
+
|
|
425
|
+
Uses the `pom-patterns` skill script (shared, not duplicated):
|
|
426
|
+
|
|
427
|
+
```bash
|
|
428
|
+
# Generate POM from template
|
|
429
|
+
python3 .claude/skills/pom-patterns/scripts/generate-pom.py \
|
|
430
|
+
--entity tasks \
|
|
431
|
+
--theme default
|
|
432
|
+
|
|
433
|
+
# With custom fields
|
|
434
|
+
python3 .claude/skills/pom-patterns/scripts/generate-pom.py \
|
|
435
|
+
--entity products \
|
|
436
|
+
--theme default \
|
|
437
|
+
--fields "name,description,price,category,status"
|
|
438
|
+
```
|
|
439
|
+
|
|
440
|
+
See `pom-patterns` skill for full documentation.
|
|
441
|
+
|
|
442
|
+
### Extract Selectors
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
# Scan component for data-cy attributes
|
|
446
|
+
python3 .claude/skills/cypress-e2e/scripts/extract-selectors.py \
|
|
447
|
+
--component contents/themes/default/components/TaskList.tsx
|
|
448
|
+
```
|
|
449
|
+
|
|
450
|
+
## Test Execution Commands
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
# Run specific test file
|
|
454
|
+
pnpm cy:run --spec "contents/themes/default/tests/cypress/e2e/uat/tasks/tasks-owner.cy.ts"
|
|
455
|
+
|
|
456
|
+
# Run by tag
|
|
457
|
+
pnpm cy:run --env grepTags="@feat-tasks"
|
|
458
|
+
pnpm cy:run --env grepTags="@smoke"
|
|
459
|
+
pnpm cy:run --env grepTags="@role-owner"
|
|
460
|
+
|
|
461
|
+
# Run @in-develop tests only (during iteration)
|
|
462
|
+
pnpm cy:run --env grepTags="@in-develop"
|
|
463
|
+
|
|
464
|
+
# Run all session tests
|
|
465
|
+
pnpm cy:run --env grepTags="@scope-2025-12-30-tasks-v1"
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
## Anti-Patterns
|
|
469
|
+
|
|
470
|
+
```typescript
|
|
471
|
+
// NEVER: Hardcoded selectors
|
|
472
|
+
cy.get('[data-cy="task-title"]')
|
|
473
|
+
|
|
474
|
+
// CORRECT: Use cySelector from selectors.ts
|
|
475
|
+
import { cySelector } from '../selectors'
|
|
476
|
+
cy.get(cySelector('entities.form.field', { slug: 'tasks', name: 'title' }))
|
|
477
|
+
|
|
478
|
+
// NEVER: Fixed timeouts
|
|
479
|
+
cy.wait(3000)
|
|
480
|
+
|
|
481
|
+
// CORRECT: Use API interceptors
|
|
482
|
+
pom.api.waitForCreate()
|
|
483
|
+
|
|
484
|
+
// NEVER: Hardcoded entity slugs
|
|
485
|
+
super('tasks')
|
|
486
|
+
|
|
487
|
+
// CORRECT: From entities.json
|
|
488
|
+
super(entitiesConfig.entities.tasks.slug)
|
|
489
|
+
|
|
490
|
+
// NEVER: Login in every test
|
|
491
|
+
beforeEach(() => {
|
|
492
|
+
cy.visit('/login')
|
|
493
|
+
cy.get('[data-cy="email"]').type('user@test.com')
|
|
494
|
+
// ...
|
|
495
|
+
})
|
|
496
|
+
|
|
497
|
+
// CORRECT: Use cy.session() via helpers
|
|
498
|
+
beforeEach(() => {
|
|
499
|
+
loginAsOwner() // Session is cached
|
|
500
|
+
})
|
|
501
|
+
|
|
502
|
+
// NEVER: Commit temporary tags
|
|
503
|
+
{ tags: ['@in-develop', '@scope-2025-12-30-tasks-v1'] }
|
|
504
|
+
|
|
505
|
+
// CORRECT: Remove before commit
|
|
506
|
+
{ tags: ['@uat', '@feat-tasks', '@role-owner', '@regression'] }
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
## Checklist
|
|
510
|
+
|
|
511
|
+
Before finalizing UAT tests:
|
|
512
|
+
|
|
513
|
+
- [ ] Uses session helpers (`loginAsOwner()`, etc.)
|
|
514
|
+
- [ ] Uses POM pattern (extends DashboardEntityPOM)
|
|
515
|
+
- [ ] Uses API interceptors for deterministic waits
|
|
516
|
+
- [ ] Follows test ID convention (`{ROLE}_{ENTITY}_{ACTION}_{NUMBER}`)
|
|
517
|
+
- [ ] Includes permanent tags (`@uat`, `@feat-{entity}`, `@role-{role}`)
|
|
518
|
+
- [ ] NO temporary tags (`@in-develop`, `@scope-{session}`)
|
|
519
|
+
- [ ] Has corresponding `.bdd.md` documentation file
|
|
520
|
+
- [ ] BDD is bilingual (English/Spanish)
|
|
521
|
+
|
|
522
|
+
## Related Skills
|
|
523
|
+
|
|
524
|
+
- `cypress-api` - API testing patterns
|
|
525
|
+
- `cypress-selectors` - Selector architecture
|
|
526
|
+
- `pom-patterns` - Page Object Model patterns
|