@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,329 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Generate API Controller Script
|
|
4
|
+
|
|
5
|
+
Generates an API controller for a Cypress entity.
|
|
6
|
+
|
|
7
|
+
Usage:
|
|
8
|
+
python generate-api-controller.py --entity ENTITY [--theme THEME] [--session SESSION]
|
|
9
|
+
|
|
10
|
+
Options:
|
|
11
|
+
--entity ENTITY Entity name (e.g., tasks, customers)
|
|
12
|
+
--theme THEME Theme name (default: default)
|
|
13
|
+
--session SESSION Session name for comments
|
|
14
|
+
--dry-run Preview without writing to file
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import os
|
|
18
|
+
import sys
|
|
19
|
+
import re
|
|
20
|
+
import argparse
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from datetime import datetime
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def to_pascal_case(name: str) -> str:
|
|
26
|
+
"""Convert kebab-case/snake_case to PascalCase."""
|
|
27
|
+
return ''.join(x.title() for x in re.split(r'[-_]', name))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def to_singular(name: str) -> str:
|
|
31
|
+
"""Convert plural to singular (simple English rules)."""
|
|
32
|
+
if name.endswith('ies'):
|
|
33
|
+
return name[:-3] + 'y'
|
|
34
|
+
elif name.endswith('es'):
|
|
35
|
+
return name[:-2]
|
|
36
|
+
elif name.endswith('s'):
|
|
37
|
+
return name[:-1]
|
|
38
|
+
return name
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def generate_controller_content(
|
|
42
|
+
entity: str,
|
|
43
|
+
theme: str,
|
|
44
|
+
session: str = None
|
|
45
|
+
) -> str:
|
|
46
|
+
"""Generate the API controller file content."""
|
|
47
|
+
singular = to_singular(entity)
|
|
48
|
+
pascal_singular = to_pascal_case(singular)
|
|
49
|
+
pascal_plural = to_pascal_case(entity)
|
|
50
|
+
timestamp = datetime.now().strftime('%Y-%m-%d')
|
|
51
|
+
session_name = session or 'manual'
|
|
52
|
+
|
|
53
|
+
return f'''/**
|
|
54
|
+
* {pascal_plural}APIController - Controller for interacting with the {entity} API
|
|
55
|
+
* Encapsulates all CRUD operations for /api/v1/{entity} endpoints
|
|
56
|
+
*
|
|
57
|
+
* Generated: {timestamp}
|
|
58
|
+
* Session: {session_name}
|
|
59
|
+
*
|
|
60
|
+
* Requires:
|
|
61
|
+
* - API Key with {entity}:read, {entity}:write scopes (or superadmin with *)
|
|
62
|
+
* - x-team-id header for team context
|
|
63
|
+
*/
|
|
64
|
+
const BaseAPIController = require('./BaseAPIController')
|
|
65
|
+
const entitiesConfig = require('../fixtures/entities.json')
|
|
66
|
+
|
|
67
|
+
const {{ slug }} = entitiesConfig.entities.{entity}
|
|
68
|
+
|
|
69
|
+
class {pascal_plural}APIController extends BaseAPIController {{
|
|
70
|
+
/**
|
|
71
|
+
* @param {{string}} baseUrl - Base URL for API requests
|
|
72
|
+
* @param {{string|null}} apiKey - API key for authentication
|
|
73
|
+
* @param {{string|null}} teamId - Team ID for x-team-id header
|
|
74
|
+
*/
|
|
75
|
+
constructor(baseUrl = 'http://localhost:5173', apiKey = null, teamId = null) {{
|
|
76
|
+
super(baseUrl, apiKey, teamId, {{ slug }})
|
|
77
|
+
}}
|
|
78
|
+
|
|
79
|
+
// ============================================================
|
|
80
|
+
// SEMANTIC ALIASES (for backward compatibility)
|
|
81
|
+
// ============================================================
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* GET /api/v1/{entity} - Get list of {entity}
|
|
85
|
+
* @param {{Object}} options - Query options
|
|
86
|
+
* @param {{number}} [options.page] - Page number
|
|
87
|
+
* @param {{number}} [options.limit] - Results per page
|
|
88
|
+
* @param {{string}} [options.metas] - Metadata parameter ('all', 'key1,key2', etc.)
|
|
89
|
+
* @param {{string}} [options.search] - Search in searchable fields
|
|
90
|
+
* @param {{Object}} [options.headers] - Additional headers
|
|
91
|
+
* @returns {{Cypress.Chainable}} Cypress response
|
|
92
|
+
*/
|
|
93
|
+
get{pascal_plural}(options = {{}}) {{
|
|
94
|
+
return this.list(options)
|
|
95
|
+
}}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* GET /api/v1/{entity}/{{id}} - Get specific {singular} by ID
|
|
99
|
+
* @param {{string}} id - {pascal_singular} ID
|
|
100
|
+
* @param {{Object}} options - Additional options
|
|
101
|
+
* @returns {{Cypress.Chainable}} Cypress response
|
|
102
|
+
*/
|
|
103
|
+
get{pascal_singular}ById(id, options = {{}}) {{
|
|
104
|
+
return this.getById(id, options)
|
|
105
|
+
}}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* POST /api/v1/{entity} - Create new {singular}
|
|
109
|
+
* @param {{Object}} data - {pascal_singular} data
|
|
110
|
+
* @param {{Object}} options - Additional options
|
|
111
|
+
* @returns {{Cypress.Chainable}} Cypress response
|
|
112
|
+
*/
|
|
113
|
+
create{pascal_singular}(data, options = {{}}) {{
|
|
114
|
+
return this.create(data, options)
|
|
115
|
+
}}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* PATCH /api/v1/{entity}/{{id}} - Update {singular}
|
|
119
|
+
* @param {{string}} id - {pascal_singular} ID
|
|
120
|
+
* @param {{Object}} updateData - Data to update
|
|
121
|
+
* @param {{Object}} options - Additional options
|
|
122
|
+
* @returns {{Cypress.Chainable}} Cypress response
|
|
123
|
+
*/
|
|
124
|
+
update{pascal_singular}(id, updateData, options = {{}}) {{
|
|
125
|
+
return this.update(id, updateData, options)
|
|
126
|
+
}}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* DELETE /api/v1/{entity}/{{id}} - Delete {singular}
|
|
130
|
+
* @param {{string}} id - {pascal_singular} ID
|
|
131
|
+
* @param {{Object}} options - Additional options
|
|
132
|
+
* @returns {{Cypress.Chainable}} Cypress response
|
|
133
|
+
*/
|
|
134
|
+
delete{pascal_singular}(id, options = {{}}) {{
|
|
135
|
+
return this.delete(id, options)
|
|
136
|
+
}}
|
|
137
|
+
|
|
138
|
+
// ============================================================
|
|
139
|
+
// DATA GENERATORS
|
|
140
|
+
// ============================================================
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Generate random {singular} data for testing
|
|
144
|
+
* @param {{Object}} overrides - Specific data to override
|
|
145
|
+
* @returns {{Object}} Generated {singular} data
|
|
146
|
+
*/
|
|
147
|
+
generateRandomData(overrides = {{}}) {{
|
|
148
|
+
return this.generateRandom{pascal_singular}Data(overrides)
|
|
149
|
+
}}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Generate random {singular} data for testing
|
|
153
|
+
*
|
|
154
|
+
* TODO: Implement based on entity schema
|
|
155
|
+
*
|
|
156
|
+
* @param {{Object}} overrides - Specific data to override
|
|
157
|
+
* @returns {{Object}} Generated {singular} data
|
|
158
|
+
*/
|
|
159
|
+
generateRandom{pascal_singular}Data(overrides = {{}}) {{
|
|
160
|
+
const timestamp = Date.now()
|
|
161
|
+
const randomId = Math.random().toString(36).substring(2, 8)
|
|
162
|
+
|
|
163
|
+
// TODO: Customize based on your entity's required/optional fields
|
|
164
|
+
return {{
|
|
165
|
+
// Example fields - customize based on your entity:
|
|
166
|
+
// title: `Test {pascal_singular} ${{randomId}} - ${{timestamp}}`,
|
|
167
|
+
// description: `Description for test {singular} created at ${{new Date().toISOString()}}`,
|
|
168
|
+
// status: 'active',
|
|
169
|
+
...overrides
|
|
170
|
+
}}
|
|
171
|
+
}}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Create a test {singular} and return its data
|
|
175
|
+
* @param {{Object}} data - {pascal_singular} data (optional)
|
|
176
|
+
* @returns {{Cypress.Chainable}} Promise resolving with created {singular} data
|
|
177
|
+
*/
|
|
178
|
+
createTest{pascal_singular}(data = {{}}) {{
|
|
179
|
+
return this.createTestEntity(data)
|
|
180
|
+
}}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Clean up a test {singular} (delete it)
|
|
184
|
+
* @param {{string}} id - {pascal_singular} ID
|
|
185
|
+
* @returns {{Cypress.Chainable}} Delete response
|
|
186
|
+
*/
|
|
187
|
+
cleanupTest{pascal_singular}(id) {{
|
|
188
|
+
return this.cleanup(id)
|
|
189
|
+
}}
|
|
190
|
+
|
|
191
|
+
// ============================================================
|
|
192
|
+
// ENTITY-SPECIFIC VALIDATORS
|
|
193
|
+
// ============================================================
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Validate {singular} object structure
|
|
197
|
+
*
|
|
198
|
+
* TODO: Implement validation based on entity schema
|
|
199
|
+
*
|
|
200
|
+
* @param {{Object}} entity - {pascal_singular} object
|
|
201
|
+
* @param {{boolean}} allowMetas - If metas property is allowed
|
|
202
|
+
*/
|
|
203
|
+
validate{pascal_singular}Object(entity, allowMetas = false) {{
|
|
204
|
+
// Base fields (id, createdAt, updatedAt, teamId)
|
|
205
|
+
this.validateBaseEntityFields(entity)
|
|
206
|
+
|
|
207
|
+
// TODO: Add entity-specific field validations
|
|
208
|
+
// Example:
|
|
209
|
+
// expect(entity).to.have.property('title')
|
|
210
|
+
// expect(entity.title).to.be.a('string')
|
|
211
|
+
//
|
|
212
|
+
// expect(entity).to.have.property('status')
|
|
213
|
+
// expect(entity.status).to.be.oneOf(['active', 'inactive', 'archived'])
|
|
214
|
+
|
|
215
|
+
// Validate metas if present
|
|
216
|
+
if (allowMetas && entity.hasOwnProperty('metas')) {{
|
|
217
|
+
expect(entity.metas).to.be.an('object')
|
|
218
|
+
}}
|
|
219
|
+
}}
|
|
220
|
+
|
|
221
|
+
// ============================================================
|
|
222
|
+
// METADATA HELPERS (optional)
|
|
223
|
+
// ============================================================
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Generate sample metadata for testing
|
|
227
|
+
*
|
|
228
|
+
* TODO: Customize based on your entity's metadata needs
|
|
229
|
+
*
|
|
230
|
+
* @param {{string}} type - Type of metadata
|
|
231
|
+
* @returns {{Object}} Sample metadata
|
|
232
|
+
*/
|
|
233
|
+
generateSampleMetadata(type = 'uiPreferences') {{
|
|
234
|
+
const sampleMetas = {{
|
|
235
|
+
uiPreferences: {{
|
|
236
|
+
colorLabel: 'blue',
|
|
237
|
+
collapsed: false,
|
|
238
|
+
customIcon: 'star'
|
|
239
|
+
}},
|
|
240
|
+
customFields: {{
|
|
241
|
+
// Add custom metadata fields here
|
|
242
|
+
}}
|
|
243
|
+
}}
|
|
244
|
+
|
|
245
|
+
return {{ [type]: sampleMetas[type] || sampleMetas.uiPreferences }}
|
|
246
|
+
}}
|
|
247
|
+
}}
|
|
248
|
+
|
|
249
|
+
// Export class for use in tests
|
|
250
|
+
module.exports = {pascal_plural}APIController
|
|
251
|
+
|
|
252
|
+
// For global use in Cypress
|
|
253
|
+
if (typeof window !== 'undefined') {{
|
|
254
|
+
window.{pascal_plural}APIController = {pascal_plural}APIController
|
|
255
|
+
}}
|
|
256
|
+
'''
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def main():
|
|
260
|
+
parser = argparse.ArgumentParser(description='Generate API controller')
|
|
261
|
+
parser.add_argument('--entity', required=True, help='Entity name (e.g., tasks)')
|
|
262
|
+
parser.add_argument('--theme', default='default', help='Theme name')
|
|
263
|
+
parser.add_argument('--session', default=None, help='Session name for comments')
|
|
264
|
+
parser.add_argument('--dry-run', action='store_true', help='Preview without writing')
|
|
265
|
+
parser.add_argument('--output', default=None, help='Output file path')
|
|
266
|
+
|
|
267
|
+
args = parser.parse_args()
|
|
268
|
+
|
|
269
|
+
entity = args.entity.lower()
|
|
270
|
+
theme = args.theme
|
|
271
|
+
pascal_plural = to_pascal_case(entity)
|
|
272
|
+
|
|
273
|
+
print(f"\n{'=' * 60}")
|
|
274
|
+
print("GENERATING API CONTROLLER")
|
|
275
|
+
print(f"{'=' * 60}")
|
|
276
|
+
print(f"Entity: {entity}")
|
|
277
|
+
print(f"Theme: {theme}")
|
|
278
|
+
print(f"Session: {args.session or '(none)'}")
|
|
279
|
+
print(f"{'=' * 60}\n")
|
|
280
|
+
|
|
281
|
+
# Generate content
|
|
282
|
+
content = generate_controller_content(entity, theme, args.session)
|
|
283
|
+
|
|
284
|
+
if args.dry_run:
|
|
285
|
+
print("DRY RUN - Generated content:\n")
|
|
286
|
+
print("-" * 60)
|
|
287
|
+
print(content[:2000] + "\n... (truncated)")
|
|
288
|
+
print("-" * 60)
|
|
289
|
+
print("\nRun without --dry-run to write file.")
|
|
290
|
+
return 0
|
|
291
|
+
|
|
292
|
+
# Determine output path
|
|
293
|
+
if args.output:
|
|
294
|
+
output_path = Path(args.output)
|
|
295
|
+
else:
|
|
296
|
+
output_path = Path(f'contents/themes/{theme}/tests/cypress/src/controllers/{pascal_plural}APIController.js')
|
|
297
|
+
|
|
298
|
+
# Check if file already exists
|
|
299
|
+
if output_path.exists():
|
|
300
|
+
print(f"WARNING: File already exists: {output_path}")
|
|
301
|
+
print("Use --output to specify a different path or remove the existing file.")
|
|
302
|
+
return 1
|
|
303
|
+
|
|
304
|
+
# Create parent directories
|
|
305
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
306
|
+
|
|
307
|
+
# Write file
|
|
308
|
+
with open(output_path, 'w', encoding='utf-8') as f:
|
|
309
|
+
f.write(content)
|
|
310
|
+
|
|
311
|
+
print(f"API Controller generated: {output_path}")
|
|
312
|
+
print(f"\n{'=' * 60}")
|
|
313
|
+
print("NEXT STEPS:")
|
|
314
|
+
print("=" * 60)
|
|
315
|
+
print(f"1. Review generated file: {output_path}")
|
|
316
|
+
print(f"2. Customize generateRandom{to_pascal_case(to_singular(entity))}Data() with entity fields")
|
|
317
|
+
print(f"3. Implement validate{to_pascal_case(to_singular(entity))}Object() validations")
|
|
318
|
+
print(f"4. Import and use in tests:")
|
|
319
|
+
print(f"")
|
|
320
|
+
print(f" const {pascal_plural}APIController = require('../controllers/{pascal_plural}APIController.js')")
|
|
321
|
+
print(f"")
|
|
322
|
+
print(f" const api = new {pascal_plural}APIController(BASE_URL, API_KEY, TEAM_ID)")
|
|
323
|
+
print("=" * 60 + "\n")
|
|
324
|
+
|
|
325
|
+
return 0
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
if __name__ == '__main__':
|
|
329
|
+
sys.exit(main())
|