@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.
Files changed (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/claude/_docs/workflows-optimizations.md +359 -0
  4. package/claude/agents/api-tester.md +634 -0
  5. package/claude/agents/architecture-supervisor.md +1351 -0
  6. package/claude/agents/backend-developer.md +997 -0
  7. package/claude/agents/backend-validator.md +417 -0
  8. package/claude/agents/bdd-docs-writer.md +737 -0
  9. package/claude/agents/block-developer.md +677 -0
  10. package/claude/agents/code-reviewer.md +1432 -0
  11. package/claude/agents/db-developer.md +721 -0
  12. package/claude/agents/db-validator.md +407 -0
  13. package/claude/agents/demo-video-generator.md +493 -0
  14. package/claude/agents/documentation-writer.md +1268 -0
  15. package/claude/agents/frontend-developer.md +1234 -0
  16. package/claude/agents/frontend-validator.md +777 -0
  17. package/claude/agents/functional-validator.md +630 -0
  18. package/claude/agents/mock-analyst.md +387 -0
  19. package/claude/agents/product-manager.md +963 -0
  20. package/claude/agents/qa-automation.md +1762 -0
  21. package/claude/agents/release-manager.md +634 -0
  22. package/claude/agents/selectors-translator.md +262 -0
  23. package/claude/agents/unit-test-writer.md +785 -0
  24. package/claude/agents/visual-comparator.md +329 -0
  25. package/claude/agents/workflow-maintainer.md +352 -0
  26. package/claude/commands/do/README.md +88 -0
  27. package/claude/commands/do/create-api.md +64 -0
  28. package/claude/commands/do/create-entity.md +66 -0
  29. package/claude/commands/do/create-migration.md +64 -0
  30. package/claude/commands/do/create-plugin.md +56 -0
  31. package/claude/commands/do/create-theme.md +70 -0
  32. package/claude/commands/do/mock-data.md +67 -0
  33. package/claude/commands/do/reset-db.md +71 -0
  34. package/claude/commands/do/setup-scheduled-action.md +75 -0
  35. package/claude/commands/do/sync-code-review.md +117 -0
  36. package/claude/commands/do/update-selectors.md +112 -0
  37. package/claude/commands/do/use-skills.md +90 -0
  38. package/claude/commands/do/validate-blocks.md +69 -0
  39. package/claude/commands/how-to/README.md +261 -0
  40. package/claude/commands/how-to/add-metadata.md +692 -0
  41. package/claude/commands/how-to/add-taxonomies.md +806 -0
  42. package/claude/commands/how-to/add-translations.md +571 -0
  43. package/claude/commands/how-to/create-api.md +577 -0
  44. package/claude/commands/how-to/create-block.md +575 -0
  45. package/claude/commands/how-to/create-child-entities.md +771 -0
  46. package/claude/commands/how-to/create-entity.md +597 -0
  47. package/claude/commands/how-to/create-migrations.md +605 -0
  48. package/claude/commands/how-to/create-plugin.md +654 -0
  49. package/claude/commands/how-to/customize-app.md +481 -0
  50. package/claude/commands/how-to/customize-dashboard.md +553 -0
  51. package/claude/commands/how-to/customize-theme.md +438 -0
  52. package/claude/commands/how-to/define-features-flows.md +632 -0
  53. package/claude/commands/how-to/deploy.md +507 -0
  54. package/claude/commands/how-to/handle-file-uploads.md +746 -0
  55. package/claude/commands/how-to/implement-search.md +1001 -0
  56. package/claude/commands/how-to/install-plugins.md +352 -0
  57. package/claude/commands/how-to/manage-test-coverage.md +984 -0
  58. package/claude/commands/how-to/run-tests.md +400 -0
  59. package/claude/commands/how-to/set-app-languages.md +601 -0
  60. package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
  61. package/claude/commands/how-to/set-scheduled-actions.md +527 -0
  62. package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
  63. package/claude/commands/how-to/setup-authentication.md +388 -0
  64. package/claude/commands/how-to/setup-claude-code.md +440 -0
  65. package/claude/commands/how-to/setup-database.md +274 -0
  66. package/claude/commands/how-to/setup-email-providers.md +598 -0
  67. package/claude/commands/how-to/setup-mobile-dev.md +627 -0
  68. package/claude/commands/how-to/start.md +500 -0
  69. package/claude/commands/how-to/use-devtools.md +639 -0
  70. package/claude/commands/how-to/use-superadmin.md +622 -0
  71. package/claude/commands/session/README.md +193 -0
  72. package/claude/commands/session/block-create.md +190 -0
  73. package/claude/commands/session/block-list.md +203 -0
  74. package/claude/commands/session/block-update.md +192 -0
  75. package/claude/commands/session/block-validate.md +218 -0
  76. package/claude/commands/session/changelog.md +115 -0
  77. package/claude/commands/session/close.md +225 -0
  78. package/claude/commands/session/commit.md +174 -0
  79. package/claude/commands/session/db-entity.md +206 -0
  80. package/claude/commands/session/db-fix.md +212 -0
  81. package/claude/commands/session/db-sample.md +206 -0
  82. package/claude/commands/session/demo.md +178 -0
  83. package/claude/commands/session/doc-bdd.md +207 -0
  84. package/claude/commands/session/doc-feature.md +218 -0
  85. package/claude/commands/session/doc-read.md +225 -0
  86. package/claude/commands/session/execute.md +204 -0
  87. package/claude/commands/session/explain.md +202 -0
  88. package/claude/commands/session/fix-bug.md +210 -0
  89. package/claude/commands/session/fix-build.md +182 -0
  90. package/claude/commands/session/fix-test.md +189 -0
  91. package/claude/commands/session/pending.md +232 -0
  92. package/claude/commands/session/refine.md +188 -0
  93. package/claude/commands/session/resume.md +192 -0
  94. package/claude/commands/session/review.md +192 -0
  95. package/claude/commands/session/scope-change.md +181 -0
  96. package/claude/commands/session/start-blocks.md +347 -0
  97. package/claude/commands/session/start.md +604 -0
  98. package/claude/commands/session/status.md +169 -0
  99. package/claude/commands/session/test-fix.md +221 -0
  100. package/claude/commands/session/test-run.md +203 -0
  101. package/claude/commands/session/test-write.md +242 -0
  102. package/claude/commands/session/validate.md +162 -0
  103. package/claude/config/context.json +40 -0
  104. package/claude/config/github.json +69 -0
  105. package/claude/config/github.schema.json +106 -0
  106. package/claude/config/team.json +46 -0
  107. package/claude/config/team.schema.json +106 -0
  108. package/claude/config/workspace.json +43 -0
  109. package/claude/config/workspace.schema.json +75 -0
  110. package/claude/skills/README.md +228 -0
  111. package/claude/skills/accessibility/SKILL.md +573 -0
  112. package/claude/skills/api-bypass-layers/SKILL.md +550 -0
  113. package/claude/skills/asana-integration/SKILL.md +499 -0
  114. package/claude/skills/better-auth/SKILL.md +666 -0
  115. package/claude/skills/billing-subscriptions/SKILL.md +660 -0
  116. package/claude/skills/block-decision-matrix/SKILL.md +359 -0
  117. package/claude/skills/clickup-integration/SKILL.md +434 -0
  118. package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
  119. package/claude/skills/create-plugin/SKILL.md +425 -0
  120. package/claude/skills/create-theme/SKILL.md +331 -0
  121. package/claude/skills/cypress-api/SKILL.md +511 -0
  122. package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
  123. package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
  124. package/claude/skills/cypress-e2e/SKILL.md +526 -0
  125. package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
  126. package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
  127. package/claude/skills/cypress-selectors/SKILL.md +309 -0
  128. package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
  129. package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
  130. package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
  131. package/claude/skills/database-migrations/SKILL.md +335 -0
  132. package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
  133. package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
  134. package/claude/skills/design-system/SKILL.md +682 -0
  135. package/claude/skills/documentation/SKILL.md +540 -0
  136. package/claude/skills/entity-api/SKILL.md +482 -0
  137. package/claude/skills/entity-system/SKILL.md +635 -0
  138. package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
  139. package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
  140. package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
  141. package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
  142. package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
  143. package/claude/skills/github/SKILL.md +467 -0
  144. package/claude/skills/i18n-nextintl/SKILL.md +302 -0
  145. package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
  146. package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
  147. package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
  148. package/claude/skills/impact-analysis/SKILL.md +203 -0
  149. package/claude/skills/jest-unit/SKILL.md +306 -0
  150. package/claude/skills/jest-unit/references/component-testing.md +371 -0
  151. package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
  152. package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
  153. package/claude/skills/jira-integration/SKILL.md +539 -0
  154. package/claude/skills/media-library/SKILL.md +743 -0
  155. package/claude/skills/mock-analysis/SKILL.md +276 -0
  156. package/claude/skills/monorepo-architecture/SKILL.md +162 -0
  157. package/claude/skills/nextjs-api-development/SKILL.md +364 -0
  158. package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
  159. package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
  160. package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
  161. package/claude/skills/notion-integration/SKILL.md +641 -0
  162. package/claude/skills/npm-development-workflow/SKILL.md +480 -0
  163. package/claude/skills/page-builder-blocks/SKILL.md +530 -0
  164. package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
  165. package/claude/skills/permissions-system/SKILL.md +619 -0
  166. package/claude/skills/plugins/SKILL.md +340 -0
  167. package/claude/skills/plugins/references/plugin-templates.md +414 -0
  168. package/claude/skills/plugins/references/plugin-testing.md +353 -0
  169. package/claude/skills/plugins/references/plugin-types.md +198 -0
  170. package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
  171. package/claude/skills/pom-patterns/SKILL.md +452 -0
  172. package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
  173. package/claude/skills/rate-limiting/SKILL.md +342 -0
  174. package/claude/skills/react-best-practices/AGENTS.md +2410 -0
  175. package/claude/skills/react-best-practices/README.md +123 -0
  176. package/claude/skills/react-best-practices/SKILL.md +125 -0
  177. package/claude/skills/react-best-practices/metadata.json +15 -0
  178. package/claude/skills/react-best-practices/rules/_sections.md +46 -0
  179. package/claude/skills/react-best-practices/rules/_template.md +28 -0
  180. package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  181. package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  182. package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
  183. package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
  184. package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
  185. package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
  186. package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  187. package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  188. package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  189. package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  190. package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  191. package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
  192. package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  193. package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  194. package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  195. package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  196. package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  197. package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  198. package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  199. package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  200. package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  201. package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
  202. package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  203. package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
  204. package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  205. package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  206. package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  207. package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  208. package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
  209. package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  210. package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  211. package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  212. package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  213. package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  214. package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  215. package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  216. package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  217. package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  218. package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  219. package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  220. package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
  221. package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  222. package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  223. package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  224. package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
  225. package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  226. package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
  227. package/claude/skills/react-patterns/SKILL.md +688 -0
  228. package/claude/skills/registry-system/SKILL.md +331 -0
  229. package/claude/skills/scheduled-actions/SKILL.md +671 -0
  230. package/claude/skills/scope-enforcement/SKILL.md +542 -0
  231. package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
  232. package/claude/skills/server-actions/SKILL.md +493 -0
  233. package/claude/skills/service-layer/SKILL.md +587 -0
  234. package/claude/skills/session-management/SKILL.md +266 -0
  235. package/claude/skills/session-management/scripts/create-session.py +166 -0
  236. package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
  237. package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
  238. package/claude/skills/session-management/scripts/session-archive.sh +87 -0
  239. package/claude/skills/session-management/scripts/session-close.sh +133 -0
  240. package/claude/skills/session-management/scripts/session-init.sh +225 -0
  241. package/claude/skills/session-management/scripts/session-list.sh +163 -0
  242. package/claude/skills/session-management/scripts/split-plan.sh +116 -0
  243. package/claude/skills/shadcn-components/SKILL.md +586 -0
  244. package/claude/skills/shadcn-theming/SKILL.md +446 -0
  245. package/claude/skills/suspense-loading/SKILL.md +280 -0
  246. package/claude/skills/tailwind-theming/SKILL.md +507 -0
  247. package/claude/skills/tanstack-query/SKILL.md +608 -0
  248. package/claude/skills/test-coverage/SKILL.md +239 -0
  249. package/claude/skills/web-design-guidelines/SKILL.md +39 -0
  250. package/claude/skills/zod-validation/SKILL.md +537 -0
  251. package/claude/templates/blocks/progress.md +86 -0
  252. package/claude/templates/iteration/changes.md +61 -0
  253. package/claude/templates/iteration/progress.md +55 -0
  254. package/claude/templates/log.md +31 -0
  255. package/claude/templates/story/context.md +77 -0
  256. package/claude/templates/story/pendings.md +37 -0
  257. package/claude/templates/story/plan.md +299 -0
  258. package/claude/templates/story/requirements.md +109 -0
  259. package/claude/templates/story/scope.json +10 -0
  260. package/claude/templates/story/tests.md +91 -0
  261. package/claude/templates/task/progress.md +58 -0
  262. package/claude/templates/task/requirements.md +54 -0
  263. package/claude/workflows/README.md +154 -0
  264. package/claude/workflows/blocks.md +614 -0
  265. package/claude/workflows/story.md +1207 -0
  266. package/claude/workflows/task.md +927 -0
  267. package/claude/workflows/tweak.md +527 -0
  268. package/cursor/.gitkeep +0 -0
  269. package/package.json +35 -0
  270. package/scripts/postinstall.mjs +198 -0
  271. package/scripts/setup.mjs +282 -0
  272. 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())