@cherishxn/agent-scaffold 0.0.0-stage → 1.1.0

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 (685) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -2
  3. package/THIRD_PARTY_NOTICES.md +18 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +105 -0
  6. package/dist/diagnostics.d.ts +10 -0
  7. package/dist/diagnostics.js +27 -0
  8. package/dist/generate.d.ts +55 -0
  9. package/dist/generate.js +159 -0
  10. package/dist/model.d.ts +33 -0
  11. package/dist/model.js +24 -0
  12. package/dist/verify.d.ts +67 -0
  13. package/dist/verify.js +278 -0
  14. package/package.json +52 -4
  15. package/schemas/manifest.json +171 -0
  16. package/schemas/plan.json +164 -0
  17. package/schemas/result.json +97 -0
  18. package/schemas/spec.json +50 -0
  19. package/skills/scaffold-use/SKILL.md +24 -0
  20. package/templates/catalog.json +37 -0
  21. package/templates/next-fullstack-antd/.agents/skills/design-contract/SKILL.md +23 -0
  22. package/templates/next-fullstack-antd/.agents/skills/project-work/SKILL.md +10 -0
  23. package/templates/next-fullstack-antd/.claude/skills/design-contract/SKILL.md +23 -0
  24. package/templates/next-fullstack-antd/.claude/skills/project-work/SKILL.md +10 -0
  25. package/templates/next-fullstack-antd/.dockerignore +18 -0
  26. package/templates/next-fullstack-antd/.env.example +13 -0
  27. package/templates/next-fullstack-antd/.grok/skills/design-contract/SKILL.md +23 -0
  28. package/templates/next-fullstack-antd/.grok/skills/project-work/SKILL.md +10 -0
  29. package/templates/next-fullstack-antd/.scaffold-checks.json +7 -0
  30. package/templates/next-fullstack-antd/AGENTS.md +11 -0
  31. package/templates/next-fullstack-antd/CLAUDE.md +1 -0
  32. package/templates/next-fullstack-antd/DESIGN.md +208 -0
  33. package/templates/next-fullstack-antd/LICENSE +21 -0
  34. package/templates/next-fullstack-antd/README.md +64 -0
  35. package/templates/next-fullstack-antd/THIRD_PARTY_NOTICES.md +18 -0
  36. package/templates/next-fullstack-antd/compose.yaml +18 -0
  37. package/templates/next-fullstack-antd/design/guide.md +61 -0
  38. package/templates/next-fullstack-antd/design/layout.css +6 -0
  39. package/templates/next-fullstack-antd/design/structure.json +107 -0
  40. package/templates/next-fullstack-antd/design/tokens.json +171 -0
  41. package/templates/next-fullstack-antd/design/widgets.css +30 -0
  42. package/templates/next-fullstack-antd/design/widgets.json +233 -0
  43. package/templates/next-fullstack-antd/docs/PROJECT.md +32 -0
  44. package/templates/next-fullstack-antd/docs/api.d.ts +544 -0
  45. package/templates/next-fullstack-antd/docs/openapi.json +461 -0
  46. package/templates/next-fullstack-antd/gitignore.template +19 -0
  47. package/templates/next-fullstack-antd/licenses/fastapi.txt +21 -0
  48. package/templates/next-fullstack-antd/licenses/nest.txt +22 -0
  49. package/templates/next-fullstack-antd/licenses/next.txt +21 -0
  50. package/templates/next-fullstack-antd/licenses/shadcn.txt +21 -0
  51. package/templates/next-fullstack-antd/licenses/sources.json +27 -0
  52. package/templates/next-fullstack-antd/licenses/spring.txt +202 -0
  53. package/templates/next-fullstack-antd/package-lock.json +494 -0
  54. package/templates/next-fullstack-antd/package.json +26 -0
  55. package/templates/next-fullstack-antd/playwright.config.ts +3 -0
  56. package/templates/next-fullstack-antd/project.json +8 -0
  57. package/templates/next-fullstack-antd/scripts/api-check.mjs +18 -0
  58. package/templates/next-fullstack-antd/scripts/api-contract.mjs +46 -0
  59. package/templates/next-fullstack-antd/scripts/design-coverage.mjs +20 -0
  60. package/templates/next-fullstack-antd/scripts/design-next-cleanup.mjs +13 -0
  61. package/templates/next-fullstack-antd/scripts/design-verify.mjs +154 -0
  62. package/templates/next-fullstack-antd/scripts/design.mjs +108 -0
  63. package/templates/next-fullstack-antd/scripts/project.mjs +120 -0
  64. package/templates/next-fullstack-antd/tests/contract-client.ts +20 -0
  65. package/templates/next-fullstack-antd/tests/contract.spec.ts +49 -0
  66. package/templates/next-fullstack-antd/tests/design/harness.tsx +63 -0
  67. package/templates/next-fullstack-antd/tests/ui.spec.ts +61 -0
  68. package/templates/next-fullstack-antd/web/Dockerfile +12 -0
  69. package/templates/next-fullstack-antd/web/app/api/auth/login/route.ts +1 -0
  70. package/templates/next-fullstack-antd/web/app/api/auth/logout/route.ts +1 -0
  71. package/templates/next-fullstack-antd/web/app/api/auth/me/route.ts +1 -0
  72. package/templates/next-fullstack-antd/web/app/api/health/route.ts +1 -0
  73. package/templates/next-fullstack-antd/web/app/api/records/[id]/route.ts +5 -0
  74. package/templates/next-fullstack-antd/web/app/api/records/route.ts +3 -0
  75. package/templates/next-fullstack-antd/web/app/layout.tsx +5 -0
  76. package/templates/next-fullstack-antd/web/app/page.tsx +2 -0
  77. package/templates/next-fullstack-antd/web/eslint.config.mjs +3 -0
  78. package/templates/next-fullstack-antd/web/lib/api.ts +35 -0
  79. package/templates/next-fullstack-antd/web/lib/auth.ts +10 -0
  80. package/templates/next-fullstack-antd/web/lib/db.ts +3 -0
  81. package/templates/next-fullstack-antd/web/lib/session.test.ts +15 -0
  82. package/templates/next-fullstack-antd/web/lib/validation.test.ts +3 -0
  83. package/templates/next-fullstack-antd/web/lib/validation.ts +5 -0
  84. package/templates/next-fullstack-antd/web/next-env.d.ts +7 -0
  85. package/templates/next-fullstack-antd/web/next.config.ts +3 -0
  86. package/templates/next-fullstack-antd/web/package.json +35 -0
  87. package/templates/next-fullstack-antd/web/pnpm-lock.yaml +3756 -0
  88. package/templates/next-fullstack-antd/web/pnpm-workspace.yaml +7 -0
  89. package/templates/next-fullstack-antd/web/prisma/migrations/202610190001_initial/migration.sql +99 -0
  90. package/templates/next-fullstack-antd/web/prisma/migrations/migration_lock.toml +1 -0
  91. package/templates/next-fullstack-antd/web/prisma/schema.prisma +72 -0
  92. package/templates/next-fullstack-antd/web/scripts/seed.ts +4 -0
  93. package/templates/next-fullstack-antd/web/src/App.tsx +29 -0
  94. package/templates/next-fullstack-antd/web/src/design-layout.css +7 -0
  95. package/templates/next-fullstack-antd/web/src/design-runtime.json +511 -0
  96. package/templates/next-fullstack-antd/web/src/design-tokens.css +168 -0
  97. package/templates/next-fullstack-antd/web/src/design-widgets.css +31 -0
  98. package/templates/next-fullstack-antd/web/src/structure-view.tsx +16 -0
  99. package/templates/next-fullstack-antd/web/src/styles.css +3 -0
  100. package/templates/next-fullstack-antd/web/src/ui.tsx +30 -0
  101. package/templates/next-fullstack-antd/web/src/widget-icon.tsx +5 -0
  102. package/templates/next-fullstack-antd/web/src/widget-types.ts +13 -0
  103. package/templates/next-fullstack-antd/web/src/workspace-model.ts +85 -0
  104. package/templates/next-fullstack-antd/web/tsconfig.json +42 -0
  105. package/templates/next-fullstack-antd/web/vitest.config.ts +2 -0
  106. package/templates/next-fullstack-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
  107. package/templates/next-fullstack-shadcn/.agents/skills/project-work/SKILL.md +10 -0
  108. package/templates/next-fullstack-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
  109. package/templates/next-fullstack-shadcn/.claude/skills/project-work/SKILL.md +10 -0
  110. package/templates/next-fullstack-shadcn/.dockerignore +18 -0
  111. package/templates/next-fullstack-shadcn/.env.example +13 -0
  112. package/templates/next-fullstack-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
  113. package/templates/next-fullstack-shadcn/.grok/skills/project-work/SKILL.md +10 -0
  114. package/templates/next-fullstack-shadcn/.scaffold-checks.json +7 -0
  115. package/templates/next-fullstack-shadcn/AGENTS.md +11 -0
  116. package/templates/next-fullstack-shadcn/CLAUDE.md +1 -0
  117. package/templates/next-fullstack-shadcn/DESIGN.md +208 -0
  118. package/templates/next-fullstack-shadcn/LICENSE +21 -0
  119. package/templates/next-fullstack-shadcn/README.md +64 -0
  120. package/templates/next-fullstack-shadcn/THIRD_PARTY_NOTICES.md +18 -0
  121. package/templates/next-fullstack-shadcn/compose.yaml +18 -0
  122. package/templates/next-fullstack-shadcn/design/guide.md +61 -0
  123. package/templates/next-fullstack-shadcn/design/layout.css +6 -0
  124. package/templates/next-fullstack-shadcn/design/structure.json +107 -0
  125. package/templates/next-fullstack-shadcn/design/tokens.json +171 -0
  126. package/templates/next-fullstack-shadcn/design/widgets.css +30 -0
  127. package/templates/next-fullstack-shadcn/design/widgets.json +233 -0
  128. package/templates/next-fullstack-shadcn/docs/PROJECT.md +32 -0
  129. package/templates/next-fullstack-shadcn/docs/api.d.ts +544 -0
  130. package/templates/next-fullstack-shadcn/docs/openapi.json +461 -0
  131. package/templates/next-fullstack-shadcn/gitignore.template +19 -0
  132. package/templates/next-fullstack-shadcn/licenses/fastapi.txt +21 -0
  133. package/templates/next-fullstack-shadcn/licenses/nest.txt +22 -0
  134. package/templates/next-fullstack-shadcn/licenses/next.txt +21 -0
  135. package/templates/next-fullstack-shadcn/licenses/shadcn.txt +21 -0
  136. package/templates/next-fullstack-shadcn/licenses/sources.json +27 -0
  137. package/templates/next-fullstack-shadcn/licenses/spring.txt +202 -0
  138. package/templates/next-fullstack-shadcn/package-lock.json +494 -0
  139. package/templates/next-fullstack-shadcn/package.json +26 -0
  140. package/templates/next-fullstack-shadcn/playwright.config.ts +3 -0
  141. package/templates/next-fullstack-shadcn/project.json +8 -0
  142. package/templates/next-fullstack-shadcn/scripts/api-check.mjs +18 -0
  143. package/templates/next-fullstack-shadcn/scripts/api-contract.mjs +46 -0
  144. package/templates/next-fullstack-shadcn/scripts/design-coverage.mjs +20 -0
  145. package/templates/next-fullstack-shadcn/scripts/design-next-cleanup.mjs +13 -0
  146. package/templates/next-fullstack-shadcn/scripts/design-verify.mjs +154 -0
  147. package/templates/next-fullstack-shadcn/scripts/design.mjs +108 -0
  148. package/templates/next-fullstack-shadcn/scripts/project.mjs +120 -0
  149. package/templates/next-fullstack-shadcn/tests/contract-client.ts +20 -0
  150. package/templates/next-fullstack-shadcn/tests/contract.spec.ts +49 -0
  151. package/templates/next-fullstack-shadcn/tests/design/harness.tsx +63 -0
  152. package/templates/next-fullstack-shadcn/tests/ui.spec.ts +61 -0
  153. package/templates/next-fullstack-shadcn/web/Dockerfile +12 -0
  154. package/templates/next-fullstack-shadcn/web/app/api/auth/login/route.ts +1 -0
  155. package/templates/next-fullstack-shadcn/web/app/api/auth/logout/route.ts +1 -0
  156. package/templates/next-fullstack-shadcn/web/app/api/auth/me/route.ts +1 -0
  157. package/templates/next-fullstack-shadcn/web/app/api/health/route.ts +1 -0
  158. package/templates/next-fullstack-shadcn/web/app/api/records/[id]/route.ts +5 -0
  159. package/templates/next-fullstack-shadcn/web/app/api/records/route.ts +3 -0
  160. package/templates/next-fullstack-shadcn/web/app/layout.tsx +4 -0
  161. package/templates/next-fullstack-shadcn/web/app/page.tsx +2 -0
  162. package/templates/next-fullstack-shadcn/web/eslint.config.mjs +3 -0
  163. package/templates/next-fullstack-shadcn/web/lib/api.ts +35 -0
  164. package/templates/next-fullstack-shadcn/web/lib/auth.ts +10 -0
  165. package/templates/next-fullstack-shadcn/web/lib/db.ts +3 -0
  166. package/templates/next-fullstack-shadcn/web/lib/session.test.ts +15 -0
  167. package/templates/next-fullstack-shadcn/web/lib/validation.test.ts +3 -0
  168. package/templates/next-fullstack-shadcn/web/lib/validation.ts +5 -0
  169. package/templates/next-fullstack-shadcn/web/next-env.d.ts +7 -0
  170. package/templates/next-fullstack-shadcn/web/next.config.ts +3 -0
  171. package/templates/next-fullstack-shadcn/web/package.json +39 -0
  172. package/templates/next-fullstack-shadcn/web/pnpm-lock.yaml +3286 -0
  173. package/templates/next-fullstack-shadcn/web/pnpm-workspace.yaml +7 -0
  174. package/templates/next-fullstack-shadcn/web/postcss.config.mjs +1 -0
  175. package/templates/next-fullstack-shadcn/web/prisma/migrations/202610190001_initial/migration.sql +99 -0
  176. package/templates/next-fullstack-shadcn/web/prisma/migrations/migration_lock.toml +1 -0
  177. package/templates/next-fullstack-shadcn/web/prisma/schema.prisma +72 -0
  178. package/templates/next-fullstack-shadcn/web/scripts/seed.ts +4 -0
  179. package/templates/next-fullstack-shadcn/web/src/App.tsx +30 -0
  180. package/templates/next-fullstack-shadcn/web/src/design-layout.css +7 -0
  181. package/templates/next-fullstack-shadcn/web/src/design-runtime.json +511 -0
  182. package/templates/next-fullstack-shadcn/web/src/design-tokens.css +168 -0
  183. package/templates/next-fullstack-shadcn/web/src/design-widgets.css +31 -0
  184. package/templates/next-fullstack-shadcn/web/src/structure-view.tsx +16 -0
  185. package/templates/next-fullstack-shadcn/web/src/styles.css +3 -0
  186. package/templates/next-fullstack-shadcn/web/src/tailwind.css +2 -0
  187. package/templates/next-fullstack-shadcn/web/src/ui.tsx +13 -0
  188. package/templates/next-fullstack-shadcn/web/src/widget-icon.tsx +5 -0
  189. package/templates/next-fullstack-shadcn/web/src/widget-types.ts +13 -0
  190. package/templates/next-fullstack-shadcn/web/src/workspace-model.ts +85 -0
  191. package/templates/next-fullstack-shadcn/web/tsconfig.json +42 -0
  192. package/templates/next-fullstack-shadcn/web/vitest.config.ts +2 -0
  193. package/templates/react-fastapi-antd/.agents/skills/design-contract/SKILL.md +23 -0
  194. package/templates/react-fastapi-antd/.agents/skills/project-work/SKILL.md +10 -0
  195. package/templates/react-fastapi-antd/.claude/skills/design-contract/SKILL.md +23 -0
  196. package/templates/react-fastapi-antd/.claude/skills/project-work/SKILL.md +10 -0
  197. package/templates/react-fastapi-antd/.dockerignore +18 -0
  198. package/templates/react-fastapi-antd/.env.example +13 -0
  199. package/templates/react-fastapi-antd/.grok/skills/design-contract/SKILL.md +23 -0
  200. package/templates/react-fastapi-antd/.grok/skills/project-work/SKILL.md +10 -0
  201. package/templates/react-fastapi-antd/.scaffold-checks.json +7 -0
  202. package/templates/react-fastapi-antd/AGENTS.md +11 -0
  203. package/templates/react-fastapi-antd/CLAUDE.md +1 -0
  204. package/templates/react-fastapi-antd/DESIGN.md +208 -0
  205. package/templates/react-fastapi-antd/LICENSE +21 -0
  206. package/templates/react-fastapi-antd/README.md +64 -0
  207. package/templates/react-fastapi-antd/THIRD_PARTY_NOTICES.md +18 -0
  208. package/templates/react-fastapi-antd/backend/.python-version +1 -0
  209. package/templates/react-fastapi-antd/backend/Dockerfile +10 -0
  210. package/templates/react-fastapi-antd/backend/alembic.ini +3 -0
  211. package/templates/react-fastapi-antd/backend/app/__init__.py +0 -0
  212. package/templates/react-fastapi-antd/backend/app/core/__init__.py +0 -0
  213. package/templates/react-fastapi-antd/backend/app/core/security.py +25 -0
  214. package/templates/react-fastapi-antd/backend/app/db.py +11 -0
  215. package/templates/react-fastapi-antd/backend/app/main.py +146 -0
  216. package/templates/react-fastapi-antd/backend/app/models.py +21 -0
  217. package/templates/react-fastapi-antd/backend/app/seed.py +21 -0
  218. package/templates/react-fastapi-antd/backend/migrations/env.py +9 -0
  219. package/templates/react-fastapi-antd/backend/migrations/versions/0001_initial.py +18 -0
  220. package/templates/react-fastapi-antd/backend/pyproject.toml +16 -0
  221. package/templates/react-fastapi-antd/backend/tests/test_api.py +27 -0
  222. package/templates/react-fastapi-antd/backend/uv.lock +1085 -0
  223. package/templates/react-fastapi-antd/compose.yaml +18 -0
  224. package/templates/react-fastapi-antd/design/guide.md +61 -0
  225. package/templates/react-fastapi-antd/design/layout.css +6 -0
  226. package/templates/react-fastapi-antd/design/structure.json +107 -0
  227. package/templates/react-fastapi-antd/design/tokens.json +171 -0
  228. package/templates/react-fastapi-antd/design/widgets.css +30 -0
  229. package/templates/react-fastapi-antd/design/widgets.json +233 -0
  230. package/templates/react-fastapi-antd/docs/PROJECT.md +32 -0
  231. package/templates/react-fastapi-antd/docs/api.d.ts +544 -0
  232. package/templates/react-fastapi-antd/docs/openapi.json +461 -0
  233. package/templates/react-fastapi-antd/gitignore.template +19 -0
  234. package/templates/react-fastapi-antd/licenses/fastapi.txt +21 -0
  235. package/templates/react-fastapi-antd/licenses/nest.txt +22 -0
  236. package/templates/react-fastapi-antd/licenses/next.txt +21 -0
  237. package/templates/react-fastapi-antd/licenses/shadcn.txt +21 -0
  238. package/templates/react-fastapi-antd/licenses/sources.json +27 -0
  239. package/templates/react-fastapi-antd/licenses/spring.txt +202 -0
  240. package/templates/react-fastapi-antd/package-lock.json +494 -0
  241. package/templates/react-fastapi-antd/package.json +26 -0
  242. package/templates/react-fastapi-antd/playwright.config.ts +3 -0
  243. package/templates/react-fastapi-antd/project.json +8 -0
  244. package/templates/react-fastapi-antd/scripts/api-check.mjs +18 -0
  245. package/templates/react-fastapi-antd/scripts/api-contract.mjs +46 -0
  246. package/templates/react-fastapi-antd/scripts/design-coverage.mjs +20 -0
  247. package/templates/react-fastapi-antd/scripts/design-next-cleanup.mjs +13 -0
  248. package/templates/react-fastapi-antd/scripts/design-verify.mjs +154 -0
  249. package/templates/react-fastapi-antd/scripts/design.mjs +108 -0
  250. package/templates/react-fastapi-antd/scripts/project.mjs +120 -0
  251. package/templates/react-fastapi-antd/tests/contract-client.ts +20 -0
  252. package/templates/react-fastapi-antd/tests/contract.spec.ts +49 -0
  253. package/templates/react-fastapi-antd/tests/design/harness.tsx +63 -0
  254. package/templates/react-fastapi-antd/tests/ui.spec.ts +61 -0
  255. package/templates/react-fastapi-antd/web/bun.lock +442 -0
  256. package/templates/react-fastapi-antd/web/eslint.config.mjs +3 -0
  257. package/templates/react-fastapi-antd/web/index.html +1 -0
  258. package/templates/react-fastapi-antd/web/package.json +28 -0
  259. package/templates/react-fastapi-antd/web/src/App.tsx +29 -0
  260. package/templates/react-fastapi-antd/web/src/design-layout.css +7 -0
  261. package/templates/react-fastapi-antd/web/src/design-runtime.json +511 -0
  262. package/templates/react-fastapi-antd/web/src/design-tokens.css +168 -0
  263. package/templates/react-fastapi-antd/web/src/design-widgets.css +31 -0
  264. package/templates/react-fastapi-antd/web/src/main.tsx +6 -0
  265. package/templates/react-fastapi-antd/web/src/structure-view.tsx +16 -0
  266. package/templates/react-fastapi-antd/web/src/styles.css +3 -0
  267. package/templates/react-fastapi-antd/web/src/ui.tsx +30 -0
  268. package/templates/react-fastapi-antd/web/src/widget-icon.tsx +5 -0
  269. package/templates/react-fastapi-antd/web/src/widget-types.ts +13 -0
  270. package/templates/react-fastapi-antd/web/src/workspace-model.ts +85 -0
  271. package/templates/react-fastapi-antd/web/tsconfig.json +22 -0
  272. package/templates/react-fastapi-antd/web/vite.config.ts +3 -0
  273. package/templates/react-fastapi-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
  274. package/templates/react-fastapi-shadcn/.agents/skills/project-work/SKILL.md +10 -0
  275. package/templates/react-fastapi-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
  276. package/templates/react-fastapi-shadcn/.claude/skills/project-work/SKILL.md +10 -0
  277. package/templates/react-fastapi-shadcn/.dockerignore +18 -0
  278. package/templates/react-fastapi-shadcn/.env.example +13 -0
  279. package/templates/react-fastapi-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
  280. package/templates/react-fastapi-shadcn/.grok/skills/project-work/SKILL.md +10 -0
  281. package/templates/react-fastapi-shadcn/.scaffold-checks.json +7 -0
  282. package/templates/react-fastapi-shadcn/AGENTS.md +11 -0
  283. package/templates/react-fastapi-shadcn/CLAUDE.md +1 -0
  284. package/templates/react-fastapi-shadcn/DESIGN.md +208 -0
  285. package/templates/react-fastapi-shadcn/LICENSE +21 -0
  286. package/templates/react-fastapi-shadcn/README.md +64 -0
  287. package/templates/react-fastapi-shadcn/THIRD_PARTY_NOTICES.md +18 -0
  288. package/templates/react-fastapi-shadcn/backend/.python-version +1 -0
  289. package/templates/react-fastapi-shadcn/backend/Dockerfile +10 -0
  290. package/templates/react-fastapi-shadcn/backend/alembic.ini +3 -0
  291. package/templates/react-fastapi-shadcn/backend/app/__init__.py +0 -0
  292. package/templates/react-fastapi-shadcn/backend/app/core/__init__.py +0 -0
  293. package/templates/react-fastapi-shadcn/backend/app/core/security.py +25 -0
  294. package/templates/react-fastapi-shadcn/backend/app/db.py +11 -0
  295. package/templates/react-fastapi-shadcn/backend/app/main.py +146 -0
  296. package/templates/react-fastapi-shadcn/backend/app/models.py +21 -0
  297. package/templates/react-fastapi-shadcn/backend/app/seed.py +21 -0
  298. package/templates/react-fastapi-shadcn/backend/migrations/env.py +9 -0
  299. package/templates/react-fastapi-shadcn/backend/migrations/versions/0001_initial.py +18 -0
  300. package/templates/react-fastapi-shadcn/backend/pyproject.toml +16 -0
  301. package/templates/react-fastapi-shadcn/backend/tests/test_api.py +27 -0
  302. package/templates/react-fastapi-shadcn/backend/uv.lock +1085 -0
  303. package/templates/react-fastapi-shadcn/compose.yaml +18 -0
  304. package/templates/react-fastapi-shadcn/design/guide.md +61 -0
  305. package/templates/react-fastapi-shadcn/design/layout.css +6 -0
  306. package/templates/react-fastapi-shadcn/design/structure.json +107 -0
  307. package/templates/react-fastapi-shadcn/design/tokens.json +171 -0
  308. package/templates/react-fastapi-shadcn/design/widgets.css +30 -0
  309. package/templates/react-fastapi-shadcn/design/widgets.json +233 -0
  310. package/templates/react-fastapi-shadcn/docs/PROJECT.md +32 -0
  311. package/templates/react-fastapi-shadcn/docs/api.d.ts +544 -0
  312. package/templates/react-fastapi-shadcn/docs/openapi.json +461 -0
  313. package/templates/react-fastapi-shadcn/gitignore.template +19 -0
  314. package/templates/react-fastapi-shadcn/licenses/fastapi.txt +21 -0
  315. package/templates/react-fastapi-shadcn/licenses/nest.txt +22 -0
  316. package/templates/react-fastapi-shadcn/licenses/next.txt +21 -0
  317. package/templates/react-fastapi-shadcn/licenses/shadcn.txt +21 -0
  318. package/templates/react-fastapi-shadcn/licenses/sources.json +27 -0
  319. package/templates/react-fastapi-shadcn/licenses/spring.txt +202 -0
  320. package/templates/react-fastapi-shadcn/package-lock.json +494 -0
  321. package/templates/react-fastapi-shadcn/package.json +26 -0
  322. package/templates/react-fastapi-shadcn/playwright.config.ts +3 -0
  323. package/templates/react-fastapi-shadcn/project.json +8 -0
  324. package/templates/react-fastapi-shadcn/scripts/api-check.mjs +18 -0
  325. package/templates/react-fastapi-shadcn/scripts/api-contract.mjs +46 -0
  326. package/templates/react-fastapi-shadcn/scripts/design-coverage.mjs +20 -0
  327. package/templates/react-fastapi-shadcn/scripts/design-next-cleanup.mjs +13 -0
  328. package/templates/react-fastapi-shadcn/scripts/design-verify.mjs +154 -0
  329. package/templates/react-fastapi-shadcn/scripts/design.mjs +108 -0
  330. package/templates/react-fastapi-shadcn/scripts/project.mjs +120 -0
  331. package/templates/react-fastapi-shadcn/tests/contract-client.ts +20 -0
  332. package/templates/react-fastapi-shadcn/tests/contract.spec.ts +49 -0
  333. package/templates/react-fastapi-shadcn/tests/design/harness.tsx +63 -0
  334. package/templates/react-fastapi-shadcn/tests/ui.spec.ts +61 -0
  335. package/templates/react-fastapi-shadcn/web/bun.lock +413 -0
  336. package/templates/react-fastapi-shadcn/web/eslint.config.mjs +3 -0
  337. package/templates/react-fastapi-shadcn/web/index.html +1 -0
  338. package/templates/react-fastapi-shadcn/web/package.json +33 -0
  339. package/templates/react-fastapi-shadcn/web/src/App.tsx +30 -0
  340. package/templates/react-fastapi-shadcn/web/src/design-layout.css +7 -0
  341. package/templates/react-fastapi-shadcn/web/src/design-runtime.json +511 -0
  342. package/templates/react-fastapi-shadcn/web/src/design-tokens.css +168 -0
  343. package/templates/react-fastapi-shadcn/web/src/design-widgets.css +31 -0
  344. package/templates/react-fastapi-shadcn/web/src/main.tsx +6 -0
  345. package/templates/react-fastapi-shadcn/web/src/structure-view.tsx +16 -0
  346. package/templates/react-fastapi-shadcn/web/src/styles.css +3 -0
  347. package/templates/react-fastapi-shadcn/web/src/tailwind.css +2 -0
  348. package/templates/react-fastapi-shadcn/web/src/ui.tsx +13 -0
  349. package/templates/react-fastapi-shadcn/web/src/widget-icon.tsx +5 -0
  350. package/templates/react-fastapi-shadcn/web/src/widget-types.ts +13 -0
  351. package/templates/react-fastapi-shadcn/web/src/workspace-model.ts +85 -0
  352. package/templates/react-fastapi-shadcn/web/tsconfig.json +22 -0
  353. package/templates/react-fastapi-shadcn/web/vite.config.ts +4 -0
  354. package/templates/react-nest-antd/.agents/skills/design-contract/SKILL.md +23 -0
  355. package/templates/react-nest-antd/.agents/skills/project-work/SKILL.md +10 -0
  356. package/templates/react-nest-antd/.claude/skills/design-contract/SKILL.md +23 -0
  357. package/templates/react-nest-antd/.claude/skills/project-work/SKILL.md +10 -0
  358. package/templates/react-nest-antd/.dockerignore +18 -0
  359. package/templates/react-nest-antd/.env.example +13 -0
  360. package/templates/react-nest-antd/.grok/skills/design-contract/SKILL.md +23 -0
  361. package/templates/react-nest-antd/.grok/skills/project-work/SKILL.md +10 -0
  362. package/templates/react-nest-antd/.scaffold-checks.json +7 -0
  363. package/templates/react-nest-antd/AGENTS.md +11 -0
  364. package/templates/react-nest-antd/CLAUDE.md +1 -0
  365. package/templates/react-nest-antd/DESIGN.md +208 -0
  366. package/templates/react-nest-antd/LICENSE +21 -0
  367. package/templates/react-nest-antd/README.md +64 -0
  368. package/templates/react-nest-antd/THIRD_PARTY_NOTICES.md +18 -0
  369. package/templates/react-nest-antd/backend/Dockerfile +12 -0
  370. package/templates/react-nest-antd/backend/eslint.config.mjs +3 -0
  371. package/templates/react-nest-antd/backend/jest.config.cjs +1 -0
  372. package/templates/react-nest-antd/backend/package.json +40 -0
  373. package/templates/react-nest-antd/backend/pnpm-lock.yaml +5165 -0
  374. package/templates/react-nest-antd/backend/pnpm-workspace.yaml +6 -0
  375. package/templates/react-nest-antd/backend/prisma/migrations/202610190001_initial/migration.sql +3 -0
  376. package/templates/react-nest-antd/backend/prisma/migrations/migration_lock.toml +1 -0
  377. package/templates/react-nest-antd/backend/prisma/schema.prisma +25 -0
  378. package/templates/react-nest-antd/backend/scripts/seed.ts +4 -0
  379. package/templates/react-nest-antd/backend/src/app.module.ts +43 -0
  380. package/templates/react-nest-antd/backend/src/main.ts +6 -0
  381. package/templates/react-nest-antd/backend/src/password.ts +3 -0
  382. package/templates/react-nest-antd/backend/src/validation.ts +7 -0
  383. package/templates/react-nest-antd/backend/test/api.test.ts +25 -0
  384. package/templates/react-nest-antd/backend/tsconfig.build.json +15 -0
  385. package/templates/react-nest-antd/backend/tsconfig.json +17 -0
  386. package/templates/react-nest-antd/compose.yaml +18 -0
  387. package/templates/react-nest-antd/design/guide.md +61 -0
  388. package/templates/react-nest-antd/design/layout.css +6 -0
  389. package/templates/react-nest-antd/design/structure.json +107 -0
  390. package/templates/react-nest-antd/design/tokens.json +171 -0
  391. package/templates/react-nest-antd/design/widgets.css +30 -0
  392. package/templates/react-nest-antd/design/widgets.json +233 -0
  393. package/templates/react-nest-antd/docs/PROJECT.md +32 -0
  394. package/templates/react-nest-antd/docs/api.d.ts +544 -0
  395. package/templates/react-nest-antd/docs/openapi.json +461 -0
  396. package/templates/react-nest-antd/gitignore.template +19 -0
  397. package/templates/react-nest-antd/licenses/fastapi.txt +21 -0
  398. package/templates/react-nest-antd/licenses/nest.txt +22 -0
  399. package/templates/react-nest-antd/licenses/next.txt +21 -0
  400. package/templates/react-nest-antd/licenses/shadcn.txt +21 -0
  401. package/templates/react-nest-antd/licenses/sources.json +27 -0
  402. package/templates/react-nest-antd/licenses/spring.txt +202 -0
  403. package/templates/react-nest-antd/package-lock.json +494 -0
  404. package/templates/react-nest-antd/package.json +26 -0
  405. package/templates/react-nest-antd/playwright.config.ts +3 -0
  406. package/templates/react-nest-antd/project.json +8 -0
  407. package/templates/react-nest-antd/scripts/api-check.mjs +18 -0
  408. package/templates/react-nest-antd/scripts/api-contract.mjs +46 -0
  409. package/templates/react-nest-antd/scripts/design-coverage.mjs +20 -0
  410. package/templates/react-nest-antd/scripts/design-next-cleanup.mjs +13 -0
  411. package/templates/react-nest-antd/scripts/design-verify.mjs +154 -0
  412. package/templates/react-nest-antd/scripts/design.mjs +108 -0
  413. package/templates/react-nest-antd/scripts/project.mjs +120 -0
  414. package/templates/react-nest-antd/tests/contract-client.ts +20 -0
  415. package/templates/react-nest-antd/tests/contract.spec.ts +49 -0
  416. package/templates/react-nest-antd/tests/design/harness.tsx +63 -0
  417. package/templates/react-nest-antd/tests/ui.spec.ts +61 -0
  418. package/templates/react-nest-antd/web/eslint.config.mjs +3 -0
  419. package/templates/react-nest-antd/web/index.html +1 -0
  420. package/templates/react-nest-antd/web/package.json +28 -0
  421. package/templates/react-nest-antd/web/pnpm-lock.yaml +2215 -0
  422. package/templates/react-nest-antd/web/src/App.tsx +29 -0
  423. package/templates/react-nest-antd/web/src/design-layout.css +7 -0
  424. package/templates/react-nest-antd/web/src/design-runtime.json +511 -0
  425. package/templates/react-nest-antd/web/src/design-tokens.css +168 -0
  426. package/templates/react-nest-antd/web/src/design-widgets.css +31 -0
  427. package/templates/react-nest-antd/web/src/main.tsx +6 -0
  428. package/templates/react-nest-antd/web/src/structure-view.tsx +16 -0
  429. package/templates/react-nest-antd/web/src/styles.css +3 -0
  430. package/templates/react-nest-antd/web/src/ui.tsx +30 -0
  431. package/templates/react-nest-antd/web/src/widget-icon.tsx +5 -0
  432. package/templates/react-nest-antd/web/src/widget-types.ts +13 -0
  433. package/templates/react-nest-antd/web/src/workspace-model.ts +85 -0
  434. package/templates/react-nest-antd/web/tsconfig.json +22 -0
  435. package/templates/react-nest-antd/web/vite.config.ts +3 -0
  436. package/templates/react-nest-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
  437. package/templates/react-nest-shadcn/.agents/skills/project-work/SKILL.md +10 -0
  438. package/templates/react-nest-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
  439. package/templates/react-nest-shadcn/.claude/skills/project-work/SKILL.md +10 -0
  440. package/templates/react-nest-shadcn/.dockerignore +18 -0
  441. package/templates/react-nest-shadcn/.env.example +13 -0
  442. package/templates/react-nest-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
  443. package/templates/react-nest-shadcn/.grok/skills/project-work/SKILL.md +10 -0
  444. package/templates/react-nest-shadcn/.scaffold-checks.json +7 -0
  445. package/templates/react-nest-shadcn/AGENTS.md +11 -0
  446. package/templates/react-nest-shadcn/CLAUDE.md +1 -0
  447. package/templates/react-nest-shadcn/DESIGN.md +208 -0
  448. package/templates/react-nest-shadcn/LICENSE +21 -0
  449. package/templates/react-nest-shadcn/README.md +64 -0
  450. package/templates/react-nest-shadcn/THIRD_PARTY_NOTICES.md +18 -0
  451. package/templates/react-nest-shadcn/backend/Dockerfile +12 -0
  452. package/templates/react-nest-shadcn/backend/eslint.config.mjs +3 -0
  453. package/templates/react-nest-shadcn/backend/jest.config.cjs +1 -0
  454. package/templates/react-nest-shadcn/backend/package.json +40 -0
  455. package/templates/react-nest-shadcn/backend/pnpm-lock.yaml +5165 -0
  456. package/templates/react-nest-shadcn/backend/pnpm-workspace.yaml +6 -0
  457. package/templates/react-nest-shadcn/backend/prisma/migrations/202610190001_initial/migration.sql +3 -0
  458. package/templates/react-nest-shadcn/backend/prisma/migrations/migration_lock.toml +1 -0
  459. package/templates/react-nest-shadcn/backend/prisma/schema.prisma +25 -0
  460. package/templates/react-nest-shadcn/backend/scripts/seed.ts +4 -0
  461. package/templates/react-nest-shadcn/backend/src/app.module.ts +43 -0
  462. package/templates/react-nest-shadcn/backend/src/main.ts +6 -0
  463. package/templates/react-nest-shadcn/backend/src/password.ts +3 -0
  464. package/templates/react-nest-shadcn/backend/src/validation.ts +7 -0
  465. package/templates/react-nest-shadcn/backend/test/api.test.ts +25 -0
  466. package/templates/react-nest-shadcn/backend/tsconfig.build.json +15 -0
  467. package/templates/react-nest-shadcn/backend/tsconfig.json +17 -0
  468. package/templates/react-nest-shadcn/compose.yaml +18 -0
  469. package/templates/react-nest-shadcn/design/guide.md +61 -0
  470. package/templates/react-nest-shadcn/design/layout.css +6 -0
  471. package/templates/react-nest-shadcn/design/structure.json +107 -0
  472. package/templates/react-nest-shadcn/design/tokens.json +171 -0
  473. package/templates/react-nest-shadcn/design/widgets.css +30 -0
  474. package/templates/react-nest-shadcn/design/widgets.json +233 -0
  475. package/templates/react-nest-shadcn/docs/PROJECT.md +32 -0
  476. package/templates/react-nest-shadcn/docs/api.d.ts +544 -0
  477. package/templates/react-nest-shadcn/docs/openapi.json +461 -0
  478. package/templates/react-nest-shadcn/gitignore.template +19 -0
  479. package/templates/react-nest-shadcn/licenses/fastapi.txt +21 -0
  480. package/templates/react-nest-shadcn/licenses/nest.txt +22 -0
  481. package/templates/react-nest-shadcn/licenses/next.txt +21 -0
  482. package/templates/react-nest-shadcn/licenses/shadcn.txt +21 -0
  483. package/templates/react-nest-shadcn/licenses/sources.json +27 -0
  484. package/templates/react-nest-shadcn/licenses/spring.txt +202 -0
  485. package/templates/react-nest-shadcn/package-lock.json +494 -0
  486. package/templates/react-nest-shadcn/package.json +26 -0
  487. package/templates/react-nest-shadcn/playwright.config.ts +3 -0
  488. package/templates/react-nest-shadcn/project.json +8 -0
  489. package/templates/react-nest-shadcn/scripts/api-check.mjs +18 -0
  490. package/templates/react-nest-shadcn/scripts/api-contract.mjs +46 -0
  491. package/templates/react-nest-shadcn/scripts/design-coverage.mjs +20 -0
  492. package/templates/react-nest-shadcn/scripts/design-next-cleanup.mjs +13 -0
  493. package/templates/react-nest-shadcn/scripts/design-verify.mjs +154 -0
  494. package/templates/react-nest-shadcn/scripts/design.mjs +108 -0
  495. package/templates/react-nest-shadcn/scripts/project.mjs +120 -0
  496. package/templates/react-nest-shadcn/tests/contract-client.ts +20 -0
  497. package/templates/react-nest-shadcn/tests/contract.spec.ts +49 -0
  498. package/templates/react-nest-shadcn/tests/design/harness.tsx +63 -0
  499. package/templates/react-nest-shadcn/tests/ui.spec.ts +61 -0
  500. package/templates/react-nest-shadcn/web/eslint.config.mjs +3 -0
  501. package/templates/react-nest-shadcn/web/index.html +1 -0
  502. package/templates/react-nest-shadcn/web/package.json +33 -0
  503. package/templates/react-nest-shadcn/web/pnpm-lock.yaml +1788 -0
  504. package/templates/react-nest-shadcn/web/src/App.tsx +30 -0
  505. package/templates/react-nest-shadcn/web/src/design-layout.css +7 -0
  506. package/templates/react-nest-shadcn/web/src/design-runtime.json +511 -0
  507. package/templates/react-nest-shadcn/web/src/design-tokens.css +168 -0
  508. package/templates/react-nest-shadcn/web/src/design-widgets.css +31 -0
  509. package/templates/react-nest-shadcn/web/src/main.tsx +6 -0
  510. package/templates/react-nest-shadcn/web/src/structure-view.tsx +16 -0
  511. package/templates/react-nest-shadcn/web/src/styles.css +3 -0
  512. package/templates/react-nest-shadcn/web/src/tailwind.css +2 -0
  513. package/templates/react-nest-shadcn/web/src/ui.tsx +13 -0
  514. package/templates/react-nest-shadcn/web/src/widget-icon.tsx +5 -0
  515. package/templates/react-nest-shadcn/web/src/widget-types.ts +13 -0
  516. package/templates/react-nest-shadcn/web/src/workspace-model.ts +85 -0
  517. package/templates/react-nest-shadcn/web/tsconfig.json +22 -0
  518. package/templates/react-nest-shadcn/web/vite.config.ts +4 -0
  519. package/templates/react-spring-antd/.agents/skills/design-contract/SKILL.md +23 -0
  520. package/templates/react-spring-antd/.agents/skills/project-work/SKILL.md +10 -0
  521. package/templates/react-spring-antd/.claude/skills/design-contract/SKILL.md +23 -0
  522. package/templates/react-spring-antd/.claude/skills/project-work/SKILL.md +10 -0
  523. package/templates/react-spring-antd/.dockerignore +18 -0
  524. package/templates/react-spring-antd/.env.example +13 -0
  525. package/templates/react-spring-antd/.grok/skills/design-contract/SKILL.md +23 -0
  526. package/templates/react-spring-antd/.grok/skills/project-work/SKILL.md +10 -0
  527. package/templates/react-spring-antd/.scaffold-checks.json +7 -0
  528. package/templates/react-spring-antd/AGENTS.md +11 -0
  529. package/templates/react-spring-antd/CLAUDE.md +1 -0
  530. package/templates/react-spring-antd/DESIGN.md +208 -0
  531. package/templates/react-spring-antd/LICENSE +21 -0
  532. package/templates/react-spring-antd/README.md +64 -0
  533. package/templates/react-spring-antd/THIRD_PARTY_NOTICES.md +18 -0
  534. package/templates/react-spring-antd/backend/.mvn/wrapper/maven-wrapper.properties +3 -0
  535. package/templates/react-spring-antd/backend/Dockerfile +11 -0
  536. package/templates/react-spring-antd/backend/mvnw +295 -0
  537. package/templates/react-spring-antd/backend/pom.xml +15 -0
  538. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Api.java +38 -0
  539. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/AppUser.java +11 -0
  540. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Application.java +7 -0
  541. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Errors.java +13 -0
  542. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/PersonalRecord.java +15 -0
  543. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Records.java +14 -0
  544. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Security.java +28 -0
  545. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Seed.java +13 -0
  546. package/templates/react-spring-antd/backend/src/main/java/dev/scaffold/app/Users.java +5 -0
  547. package/templates/react-spring-antd/backend/src/main/resources/application.properties +17 -0
  548. package/templates/react-spring-antd/backend/src/main/resources/db/migration/V1__initial.sql +3 -0
  549. package/templates/react-spring-antd/backend/src/main/resources/openapi.json +461 -0
  550. package/templates/react-spring-antd/backend/src/test/java/dev/scaffold/app/ApiTest.java +28 -0
  551. package/templates/react-spring-antd/backend/src/test/java/dev/scaffold/app/SessionExpiryTest.java +37 -0
  552. package/templates/react-spring-antd/compose.yaml +18 -0
  553. package/templates/react-spring-antd/design/guide.md +61 -0
  554. package/templates/react-spring-antd/design/layout.css +6 -0
  555. package/templates/react-spring-antd/design/structure.json +107 -0
  556. package/templates/react-spring-antd/design/tokens.json +171 -0
  557. package/templates/react-spring-antd/design/widgets.css +30 -0
  558. package/templates/react-spring-antd/design/widgets.json +233 -0
  559. package/templates/react-spring-antd/docs/PROJECT.md +32 -0
  560. package/templates/react-spring-antd/docs/api.d.ts +544 -0
  561. package/templates/react-spring-antd/docs/openapi.json +461 -0
  562. package/templates/react-spring-antd/gitignore.template +19 -0
  563. package/templates/react-spring-antd/licenses/fastapi.txt +21 -0
  564. package/templates/react-spring-antd/licenses/nest.txt +22 -0
  565. package/templates/react-spring-antd/licenses/next.txt +21 -0
  566. package/templates/react-spring-antd/licenses/shadcn.txt +21 -0
  567. package/templates/react-spring-antd/licenses/sources.json +27 -0
  568. package/templates/react-spring-antd/licenses/spring.txt +202 -0
  569. package/templates/react-spring-antd/package-lock.json +494 -0
  570. package/templates/react-spring-antd/package.json +26 -0
  571. package/templates/react-spring-antd/playwright.config.ts +3 -0
  572. package/templates/react-spring-antd/project.json +8 -0
  573. package/templates/react-spring-antd/scripts/api-check.mjs +18 -0
  574. package/templates/react-spring-antd/scripts/api-contract.mjs +46 -0
  575. package/templates/react-spring-antd/scripts/design-coverage.mjs +20 -0
  576. package/templates/react-spring-antd/scripts/design-next-cleanup.mjs +13 -0
  577. package/templates/react-spring-antd/scripts/design-verify.mjs +154 -0
  578. package/templates/react-spring-antd/scripts/design.mjs +108 -0
  579. package/templates/react-spring-antd/scripts/project.mjs +120 -0
  580. package/templates/react-spring-antd/tests/contract-client.ts +20 -0
  581. package/templates/react-spring-antd/tests/contract.spec.ts +49 -0
  582. package/templates/react-spring-antd/tests/design/harness.tsx +63 -0
  583. package/templates/react-spring-antd/tests/ui.spec.ts +61 -0
  584. package/templates/react-spring-antd/web/eslint.config.mjs +3 -0
  585. package/templates/react-spring-antd/web/index.html +1 -0
  586. package/templates/react-spring-antd/web/package.json +28 -0
  587. package/templates/react-spring-antd/web/pnpm-lock.yaml +2215 -0
  588. package/templates/react-spring-antd/web/src/App.tsx +29 -0
  589. package/templates/react-spring-antd/web/src/design-layout.css +7 -0
  590. package/templates/react-spring-antd/web/src/design-runtime.json +511 -0
  591. package/templates/react-spring-antd/web/src/design-tokens.css +168 -0
  592. package/templates/react-spring-antd/web/src/design-widgets.css +31 -0
  593. package/templates/react-spring-antd/web/src/main.tsx +6 -0
  594. package/templates/react-spring-antd/web/src/structure-view.tsx +16 -0
  595. package/templates/react-spring-antd/web/src/styles.css +3 -0
  596. package/templates/react-spring-antd/web/src/ui.tsx +30 -0
  597. package/templates/react-spring-antd/web/src/widget-icon.tsx +5 -0
  598. package/templates/react-spring-antd/web/src/widget-types.ts +13 -0
  599. package/templates/react-spring-antd/web/src/workspace-model.ts +85 -0
  600. package/templates/react-spring-antd/web/tsconfig.json +22 -0
  601. package/templates/react-spring-antd/web/vite.config.ts +3 -0
  602. package/templates/react-spring-shadcn/.agents/skills/design-contract/SKILL.md +23 -0
  603. package/templates/react-spring-shadcn/.agents/skills/project-work/SKILL.md +10 -0
  604. package/templates/react-spring-shadcn/.claude/skills/design-contract/SKILL.md +23 -0
  605. package/templates/react-spring-shadcn/.claude/skills/project-work/SKILL.md +10 -0
  606. package/templates/react-spring-shadcn/.dockerignore +18 -0
  607. package/templates/react-spring-shadcn/.env.example +13 -0
  608. package/templates/react-spring-shadcn/.grok/skills/design-contract/SKILL.md +23 -0
  609. package/templates/react-spring-shadcn/.grok/skills/project-work/SKILL.md +10 -0
  610. package/templates/react-spring-shadcn/.scaffold-checks.json +7 -0
  611. package/templates/react-spring-shadcn/AGENTS.md +11 -0
  612. package/templates/react-spring-shadcn/CLAUDE.md +1 -0
  613. package/templates/react-spring-shadcn/DESIGN.md +208 -0
  614. package/templates/react-spring-shadcn/LICENSE +21 -0
  615. package/templates/react-spring-shadcn/README.md +64 -0
  616. package/templates/react-spring-shadcn/THIRD_PARTY_NOTICES.md +18 -0
  617. package/templates/react-spring-shadcn/backend/.mvn/wrapper/maven-wrapper.properties +3 -0
  618. package/templates/react-spring-shadcn/backend/Dockerfile +11 -0
  619. package/templates/react-spring-shadcn/backend/mvnw +295 -0
  620. package/templates/react-spring-shadcn/backend/pom.xml +15 -0
  621. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Api.java +38 -0
  622. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/AppUser.java +11 -0
  623. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Application.java +7 -0
  624. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Errors.java +13 -0
  625. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/PersonalRecord.java +15 -0
  626. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Records.java +14 -0
  627. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Security.java +28 -0
  628. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Seed.java +13 -0
  629. package/templates/react-spring-shadcn/backend/src/main/java/dev/scaffold/app/Users.java +5 -0
  630. package/templates/react-spring-shadcn/backend/src/main/resources/application.properties +17 -0
  631. package/templates/react-spring-shadcn/backend/src/main/resources/db/migration/V1__initial.sql +3 -0
  632. package/templates/react-spring-shadcn/backend/src/main/resources/openapi.json +461 -0
  633. package/templates/react-spring-shadcn/backend/src/test/java/dev/scaffold/app/ApiTest.java +28 -0
  634. package/templates/react-spring-shadcn/backend/src/test/java/dev/scaffold/app/SessionExpiryTest.java +37 -0
  635. package/templates/react-spring-shadcn/compose.yaml +18 -0
  636. package/templates/react-spring-shadcn/design/guide.md +61 -0
  637. package/templates/react-spring-shadcn/design/layout.css +6 -0
  638. package/templates/react-spring-shadcn/design/structure.json +107 -0
  639. package/templates/react-spring-shadcn/design/tokens.json +171 -0
  640. package/templates/react-spring-shadcn/design/widgets.css +30 -0
  641. package/templates/react-spring-shadcn/design/widgets.json +233 -0
  642. package/templates/react-spring-shadcn/docs/PROJECT.md +32 -0
  643. package/templates/react-spring-shadcn/docs/api.d.ts +544 -0
  644. package/templates/react-spring-shadcn/docs/openapi.json +461 -0
  645. package/templates/react-spring-shadcn/gitignore.template +19 -0
  646. package/templates/react-spring-shadcn/licenses/fastapi.txt +21 -0
  647. package/templates/react-spring-shadcn/licenses/nest.txt +22 -0
  648. package/templates/react-spring-shadcn/licenses/next.txt +21 -0
  649. package/templates/react-spring-shadcn/licenses/shadcn.txt +21 -0
  650. package/templates/react-spring-shadcn/licenses/sources.json +27 -0
  651. package/templates/react-spring-shadcn/licenses/spring.txt +202 -0
  652. package/templates/react-spring-shadcn/package-lock.json +494 -0
  653. package/templates/react-spring-shadcn/package.json +26 -0
  654. package/templates/react-spring-shadcn/playwright.config.ts +3 -0
  655. package/templates/react-spring-shadcn/project.json +8 -0
  656. package/templates/react-spring-shadcn/scripts/api-check.mjs +18 -0
  657. package/templates/react-spring-shadcn/scripts/api-contract.mjs +46 -0
  658. package/templates/react-spring-shadcn/scripts/design-coverage.mjs +20 -0
  659. package/templates/react-spring-shadcn/scripts/design-next-cleanup.mjs +13 -0
  660. package/templates/react-spring-shadcn/scripts/design-verify.mjs +154 -0
  661. package/templates/react-spring-shadcn/scripts/design.mjs +108 -0
  662. package/templates/react-spring-shadcn/scripts/project.mjs +120 -0
  663. package/templates/react-spring-shadcn/tests/contract-client.ts +20 -0
  664. package/templates/react-spring-shadcn/tests/contract.spec.ts +49 -0
  665. package/templates/react-spring-shadcn/tests/design/harness.tsx +63 -0
  666. package/templates/react-spring-shadcn/tests/ui.spec.ts +61 -0
  667. package/templates/react-spring-shadcn/web/eslint.config.mjs +3 -0
  668. package/templates/react-spring-shadcn/web/index.html +1 -0
  669. package/templates/react-spring-shadcn/web/package.json +33 -0
  670. package/templates/react-spring-shadcn/web/pnpm-lock.yaml +1788 -0
  671. package/templates/react-spring-shadcn/web/src/App.tsx +30 -0
  672. package/templates/react-spring-shadcn/web/src/design-layout.css +7 -0
  673. package/templates/react-spring-shadcn/web/src/design-runtime.json +511 -0
  674. package/templates/react-spring-shadcn/web/src/design-tokens.css +168 -0
  675. package/templates/react-spring-shadcn/web/src/design-widgets.css +31 -0
  676. package/templates/react-spring-shadcn/web/src/main.tsx +6 -0
  677. package/templates/react-spring-shadcn/web/src/structure-view.tsx +16 -0
  678. package/templates/react-spring-shadcn/web/src/styles.css +3 -0
  679. package/templates/react-spring-shadcn/web/src/tailwind.css +2 -0
  680. package/templates/react-spring-shadcn/web/src/ui.tsx +13 -0
  681. package/templates/react-spring-shadcn/web/src/widget-icon.tsx +5 -0
  682. package/templates/react-spring-shadcn/web/src/widget-types.ts +13 -0
  683. package/templates/react-spring-shadcn/web/src/workspace-model.ts +85 -0
  684. package/templates/react-spring-shadcn/web/tsconfig.json +22 -0
  685. package/templates/react-spring-shadcn/web/vite.config.ts +4 -0
@@ -0,0 +1,31 @@
1
+ /* Generated by design:sync. Edit design/widgets.css. */
2
+ /* These semantic hooks belong to the widget contract, never to a library. */
3
+ [data-widget]{box-sizing:border-box!important;font-family:var(--design-typography-body-font-family)!important;letter-spacing:normal!important;text-transform:none!important;box-shadow:none!important}
4
+ [data-widget="button"]{display:inline-flex!important;align-items:center!important;justify-content:center!important;gap:8px!important;vertical-align:middle!important;position:relative!important;min-width:0!important;height:var(--design-widgets-button-height)!important;min-height:var(--design-widgets-button-height)!important;padding:var(--design-widgets-button-padding-y) var(--design-widgets-button-padding-x)!important;margin:0!important;border:var(--design-widgets-button-border-width) solid transparent!important;border-radius:var(--design-widgets-button-radius)!important;font-size:var(--design-widgets-button-font-size)!important;font-weight:var(--design-widgets-button-font-weight)!important;line-height:var(--design-widgets-button-line-height)!important;cursor:pointer!important;text-align:center!important;white-space:nowrap!important;transition:background-color 180ms,border-color 180ms,color 180ms!important}
5
+ [data-widget="button"] [data-part="label"]{display:inline!important;margin:0!important;padding:0!important;font:inherit!important;line-height:inherit!important;color:inherit!important}
6
+ [data-widget="button"][data-variant="primary"]{background:var(--design-colors-primary)!important;color:var(--design-colors-primary-text)!important}
7
+ [data-widget="button"][data-variant="primary"]:hover{background:var(--design-colors-primary-hover)!important}
8
+ [data-widget="button"][data-variant="primary"]:active{background:var(--design-colors-primary-active)!important}
9
+ [data-widget="button"][data-variant="secondary"]{background:var(--design-colors-control-background)!important;color:var(--design-colors-secondary-text)!important;border-color:var(--design-colors-secondary-border)!important}
10
+ [data-widget="button"][data-variant="secondary"]:hover,[data-widget="button"][data-variant="secondary"]:active{background:var(--design-colors-secondary-hover)!important}
11
+ [data-widget="button"][data-variant="danger"]{background:var(--design-colors-danger-background)!important;color:var(--design-colors-danger-text)!important;border-color:var(--design-colors-danger-border)!important}
12
+ [data-widget="button"][data-variant="danger"]:hover,[data-widget="button"][data-variant="danger"]:active{background:var(--design-colors-danger-hover)!important}
13
+ [data-widget="button"]:disabled{opacity:.5!important;cursor:not-allowed!important;pointer-events:none!important}
14
+ [data-widget="input"],[data-widget="textarea"]{display:block!important;width:100%!important;min-width:0!important;margin:0!important;padding:var(--design-widgets-input-padding-y) var(--design-widgets-input-padding-x)!important;border:var(--design-widgets-input-border-width) solid var(--design-colors-control-border)!important;border-radius:var(--design-widgets-input-radius)!important;background:var(--design-colors-control-background)!important;color:var(--design-colors-text)!important;font-size:var(--design-widgets-input-font-size)!important;font-weight:400!important;line-height:var(--design-widgets-input-line-height)!important;outline:none!important;transition:border-color 180ms!important}
15
+ [data-widget="input"]{height:var(--design-widgets-input-height)!important;min-height:var(--design-widgets-input-height)!important}
16
+ [data-widget="textarea"]{padding:var(--design-widgets-textarea-padding-y) var(--design-widgets-textarea-padding-x)!important;border-width:var(--design-widgets-textarea-border-width)!important;border-radius:var(--design-widgets-textarea-radius)!important;font-size:var(--design-widgets-textarea-font-size)!important;line-height:var(--design-widgets-textarea-line-height)!important;resize:vertical!important;min-height:0!important}
17
+ [data-widget="input"]::placeholder,[data-widget="textarea"]::placeholder{color:var(--design-colors-muted)!important;opacity:1!important}
18
+ [data-widget="input"]:hover,[data-widget="textarea"]:hover{border-color:var(--design-colors-control-focus)!important}
19
+ [data-widget="input"][aria-invalid="true"],[data-widget="textarea"][aria-invalid="true"]{border-color:var(--design-colors-error-border)!important}
20
+ [data-widget="input"]:disabled,[data-widget="textarea"]:disabled{opacity:.5!important;cursor:not-allowed!important}
21
+ [data-widget="button"]:focus-visible,[data-widget="input"]:focus,[data-widget="textarea"]:focus{outline:2px solid var(--design-colors-control-focus)!important;outline-offset:2px!important}
22
+ [data-widget="alert"]{display:flex!important;align-items:flex-start!important;gap:var(--design-widgets-alert-gap)!important;margin:16px 0!important;padding:var(--design-widgets-alert-padding-y) var(--design-widgets-alert-padding-x)!important;border:var(--design-widgets-alert-border-width) solid var(--design-colors-error-border)!important;border-radius:var(--design-widgets-alert-radius)!important;background:var(--design-colors-error-background)!important;color:var(--design-colors-error-text)!important;font-size:var(--design-widgets-alert-font-size)!important;font-weight:400!important;line-height:var(--design-widgets-alert-line-height)!important}
23
+ [data-widget="alert"][data-variant="success"]{background:var(--design-colors-success-background)!important;color:var(--design-colors-success-text)!important;border-color:var(--design-colors-success-border)!important}
24
+ [data-widget="alert"] [data-part="icon"]{display:block!important;width:var(--design-widgets-alert-icon-size)!important;height:var(--design-widgets-alert-icon-size)!important;flex:none!important;margin:3px 0 0!important;color:inherit!important}
25
+ [data-widget="alert"] [data-part="message"]{display:block!important;margin:0!important;padding:0!important;font:inherit!important;line-height:inherit!important;color:inherit!important;overflow-wrap:anywhere}
26
+ [data-widget="badge"]{display:inline-flex!important;align-items:center!important;vertical-align:middle!important;white-space:nowrap!important;margin:0!important;padding:var(--design-widgets-badge-padding-y) var(--design-widgets-badge-padding-x)!important;border:var(--design-widgets-badge-border-width) solid var(--design-colors-badge-border)!important;border-radius:var(--design-widgets-badge-radius)!important;background:transparent!important;color:var(--design-colors-badge-text)!important;font-size:var(--design-widgets-badge-font-size)!important;font-weight:400!important;line-height:var(--design-widgets-badge-line-height)!important}
27
+ [data-widget="panel"]{background:var(--design-colors-surface)!important;border:var(--design-widgets-panel-border-width) solid var(--design-colors-panel-border)!important;border-radius:var(--design-widgets-panel-radius)!important;padding:var(--design-widgets-panel-padding)!important;box-shadow:var(--design-effects-panel-shadow)!important}
28
+ [data-widget="field"]{display:flex!important;flex-direction:column!important;gap:var(--design-widgets-field-gap)!important;margin:var(--design-widgets-field-margin-y) 0!important}
29
+ [data-widget="field"]>[data-part="label"]{font-size:var(--design-widgets-field-font-size)!important;font-weight:var(--design-widgets-field-font-weight)!important;line-height:var(--design-widgets-field-line-height)!important}
30
+ @media(max-width:760px){[data-widget="panel"]{padding:var(--design-spacing-s20)!important}}
31
+ @media(prefers-reduced-motion:reduce){[data-widget]{transition-duration:0.01ms!important}}
@@ -0,0 +1,16 @@
1
+ import {createElement,Fragment,type ReactNode} from 'react';
2
+ import design from './design-runtime.json';
3
+ import type {WidgetSet} from './widget-types';
4
+ type Node={element:string;region:string;slot?:string;children?:Node[]};
5
+ export function Structure({name,slots,widgets}:{widgets:WidgetSet;name:'root'|'checking'|'login'|'workspace';slots:Record<string,ReactNode>}) {
6
+ const {Panel}=widgets;
7
+ const node:Node=name==='root'?design.structure.root:design.structure.pages[name];
8
+ function render(item:Node):ReactNode {
9
+ const children=item.slot?slots[item.slot]:item.children?.map(render);
10
+ if(item.element==='slot')return <Fragment key={item.region}>{children}</Fragment>;
11
+ if(item.slot&&children==null)return null;
12
+ const props={className:item.region,'data-region':item.region,...(item.element==='a'?{href:'/'}:{})};
13
+ return item.element==='panel'?<Panel key={item.region} {...props}>{children}</Panel>:createElement(item.element,{key:item.region,...props},children);
14
+ }
15
+ return render(node);
16
+ }
@@ -0,0 +1,3 @@
1
+ @import "./design-tokens.css";
2
+ @import "./design-layout.css";
3
+ @import "./design-widgets.css";
@@ -0,0 +1,30 @@
1
+ import type * as React from 'react';
2
+ import {Alert as AntAlert,Button as AntButton,ConfigProvider,Input as AntInput,Tag,theme} from 'antd';
3
+ import design from './design-runtime.json';
4
+ import {WidgetIcon} from './widget-icon';
5
+ import type {AlertProps,ButtonProps,FieldProps,InputProps,PanelProps,TextAreaProps} from './widget-types';
6
+ const {tokens,widgets}=design;
7
+ const pixels=(value:string)=>Number.parseFloat(value);
8
+ // Library spellings and DOM corrections live only in this adapter.
9
+ const adapterTheme={algorithm:theme.darkAlgorithm,token:{
10
+ colorPrimary:tokens.colors.primary,colorPrimaryHover:tokens.colors['primary-hover'],colorPrimaryActive:tokens.colors['primary-active'],
11
+ colorBgBase:tokens.colors.background,colorBgContainer:tokens.colors['control-background'],colorBgElevated:tokens.colors.surface,
12
+ colorText:tokens.colors.text,colorTextSecondary:tokens.colors.muted,colorTextPlaceholder:tokens.colors.muted,colorBorder:tokens.colors['control-border'],
13
+ fontFamily:tokens.typography.body.fontFamily,fontSize:pixels(tokens.typography.body.fontSize),borderRadius:pixels(tokens.rounded.md),borderRadiusLG:pixels(tokens.rounded.md),
14
+ controlHeight:pixels(widgets.widgets.button.styles.height)
15
+ },components:{Button:{fontWeight:widgets.widgets.button.styles.fontWeight,contentFontSize:pixels(widgets.widgets.button.styles.fontSize),contentFontSizeLG:pixels(widgets.widgets.button.styles.fontSize),primaryColor:tokens.colors['primary-text']},Input:{activeBg:tokens.colors['control-background'],hoverBg:tokens.colors['control-background'],activeShadow:'none'}}};
16
+ const adapterCss=`
17
+ [data-widget="button"].ant-btn::before,[data-widget="button"].ant-btn::after{display:none!important}
18
+ [data-widget="alert"].ant-alert .ant-alert-section{min-width:0;flex:0 1 auto}
19
+ [data-widget="alert"].ant-alert .ant-alert-title{display:block;margin:0;padding:0;font:inherit;color:inherit;line-height:inherit}
20
+ [data-widget="alert"].ant-alert .ant-alert-icon{margin-inline-end:0;color:inherit!important;line-height:inherit!important}
21
+ [data-widget="alert"].ant-alert [data-part="message"]{display:block}
22
+ `;
23
+ export function Button({children,variant='primary',loading=false,disabled,type='button',...props}:ButtonProps){return <AntButton {...props} htmlType={type} type={variant==='primary'?'primary':'default'} danger={variant==='danger'} autoInsertSpace={false} data-widget="button" data-variant={variant} aria-busy={loading||undefined} disabled={disabled||loading}><span data-part="label">{children}</span></AntButton>;}
24
+ export function Input({invalid,...props}:InputProps){return <AntInput {...props} data-widget="input" aria-invalid={invalid||undefined}/>;}
25
+ export function TextArea({invalid,...props}:TextAreaProps){return <AntInput.TextArea {...props} data-widget="textarea" aria-invalid={invalid||undefined}/>;}
26
+ export function Panel({children,className='',...props}:PanelProps){return <section {...props} data-widget="panel" className={`panel ${className}`}>{children}</section>;}
27
+ export function Field({children,label,htmlFor}:FieldProps){return <div data-widget="field" className="field"><label data-part="label" htmlFor={htmlFor}>{label}</label><div data-part="control">{children}</div></div>;}
28
+ export function Alert({children,variant='error'}:AlertProps){return <AntAlert data-widget="alert" data-variant={variant} role={variant==='error'?'alert':'status'} type={variant} showIcon icon={<WidgetIcon kind={variant}/>} title={<span data-part="message">{children}</span>}/>;}
29
+ export function Badge({children}:{children:React.ReactNode}){return <Tag data-widget="badge" className="badge"><span data-part="label">{children}</span></Tag>;}
30
+ export function Theme({children}:{children:React.ReactNode}){return <ConfigProvider wave={{disabled:true}} theme={adapterTheme}><style>{adapterCss}</style>{children}</ConfigProvider>;}
@@ -0,0 +1,5 @@
1
+ import design from './design-runtime.json';
2
+ export function WidgetIcon({kind}:{kind:'error'|'success'}) {
3
+ const icon=design.widgets.icons[kind];
4
+ return <svg data-part="icon" aria-hidden="true" viewBox={icon.viewBox} fill="none" stroke="currentColor" strokeWidth={icon.strokeWidth} strokeLinecap="round" strokeLinejoin="round">{icon.paths.map((path,index)=><path key={index} d={path}/>)}</svg>;
5
+ }
@@ -0,0 +1,13 @@
1
+ import type * as React from 'react';
2
+ export type ButtonProps=Omit<React.ButtonHTMLAttributes<HTMLButtonElement>,'color'>&{variant?:'primary'|'secondary'|'danger';loading?:boolean};
3
+ export type InputProps=Omit<React.InputHTMLAttributes<HTMLInputElement>,'size'>&{invalid?:boolean};
4
+ export type TextAreaProps=React.TextareaHTMLAttributes<HTMLTextAreaElement>&{invalid?:boolean};
5
+ export type AlertProps={children:React.ReactNode;variant?:'error'|'success'};
6
+ export type PanelProps=React.HTMLAttributes<HTMLElement>;
7
+ export type FieldProps={children:React.ReactNode;label:string;htmlFor:string};
8
+
9
+ export type WidgetSet={
10
+ Button:React.ComponentType<ButtonProps>;Input:React.ComponentType<InputProps>;TextArea:React.ComponentType<TextAreaProps>;
11
+ Alert:React.ComponentType<AlertProps>;Panel:React.ComponentType<PanelProps>;Field:React.ComponentType<FieldProps>;
12
+ Badge:React.ComponentType<{children:React.ReactNode}>;Theme:React.ComponentType<{children:React.ReactNode}>;
13
+ };
@@ -0,0 +1,85 @@
1
+ export type User={id:string;email:string};
2
+ export type RecordItem={id:string;title:string;content:string;created_at:string;updated_at:string};
3
+ export type RecordPage={items:RecordItem[];total:number;page:number;pageSize:number};
4
+ export type WorkspaceState={user:User|null;checking:boolean;email:string;password:string;list:RecordPage;page:number;selected:string|null;title:string;content:string;editing:boolean;busy:boolean;loading:boolean;error:string;notice:string};
5
+ const emptyList=():RecordPage=>({items:[],total:0,page:1,pageSize:10});
6
+ export const initialWorkspaceState=():WorkspaceState=>({user:null,checking:true,email:'',password:'',list:emptyList(),page:1,selected:null,title:'',content:'',editing:false,busy:false,loading:false,error:'',notice:''});
7
+ class StaleRequest extends Error {}
8
+ class ApiError extends Error {constructor(message:string,public status:number){super(message);}}
9
+ export function validateRecord(title:string,content:string):string {
10
+ const length=Array.from(title.trim()).length;
11
+ if(length<1||length>120)return '标题需为 1–120 个字符。';
12
+ if(Array.from(content).length>10000)return '正文最多 10,000 个字符。';
13
+ return '';
14
+ }
15
+ /** Framework-neutral business model. Views subscribe and forward user intent. */
16
+ export function createWorkspaceModel(request:typeof fetch=fetch) {
17
+ let state=initialWorkspaceState(),token:string|null=null;
18
+ let identityEpoch=0,refreshSequence=0,busySequence=0,lifecycle=0;
19
+ const requests=new Set<AbortController>(),listeners=new Set<()=>void>();
20
+ const patch=(value:Partial<WorkspaceState>)=>{state={...state,...value};for(const listener of listeners)listener();};
21
+ function cancelRequests(){for(const controller of requests)controller.abort();requests.clear();}
22
+ function clearIdentity(){
23
+ identityEpoch++;refreshSequence++;busySequence++;cancelRequests();token=null;
24
+ patch({user:null,list:emptyList(),page:1,selected:null,title:'',content:'',editing:false,notice:'',error:'',password:'',busy:false,loading:false});
25
+ }
26
+ async function api<T>(path:string,method='GET',body?:unknown):Promise<T> {
27
+ const epoch=identityEpoch,controller=new AbortController();requests.add(controller);
28
+ const timer=setTimeout(()=>controller.abort(),15000);
29
+ try{
30
+ const response=await request(`/api${path}`,{method,credentials:'same-origin',headers:{...(body===undefined?{}:{'Content-Type':'application/json'}),...(token?{Authorization:`Bearer ${token}`}:{})},...(body===undefined?{}:{body:JSON.stringify(body)}),signal:controller.signal});
31
+ if(epoch!==identityEpoch)throw new StaleRequest();
32
+ if(response.status===204)return undefined as T;
33
+ const data=await response.json();
34
+ if(epoch!==identityEpoch)throw new StaleRequest();
35
+ if(!response.ok){if(response.status===401)clearIdentity();throw new ApiError(data.error?.message||'请求失败,请检查输入后重试。',response.status);}
36
+ return data as T;
37
+ }catch(error){
38
+ if(error instanceof ApiError||error instanceof StaleRequest)throw error;
39
+ if(epoch!==identityEpoch)throw new StaleRequest();
40
+ throw new Error('请求失败或超时,输入已保留。请先查看记录,确认结果后再操作。',{cause:error});
41
+ }finally{clearTimeout(timer);requests.delete(controller);}
42
+ }
43
+ const report=(error:unknown)=>{if(!(error instanceof StaleRequest))patch({error:(error as Error).message});};
44
+ function busy(){const sequence=++busySequence;patch({busy:true,error:''});return ()=>{if(sequence===busySequence)patch({busy:false});};}
45
+ async function refresh(){
46
+ const sequence=++refreshSequence;patch({loading:true});
47
+ try{const list=await api<RecordPage>(`/records?page=${state.page}&pageSize=10`);if(sequence===refreshSequence)patch({list});}
48
+ catch(error){if(sequence===refreshSequence)report(error);}
49
+ finally{if(sequence===refreshSequence)patch({loading:false});}
50
+ }
51
+ async function start(){
52
+ const current=++lifecycle;patch({checking:true});
53
+ try{const data=await api<{user:User}>('/auth/me');if(current===lifecycle){patch({user:data.user});await refresh();}}
54
+ catch(error){if(current===lifecycle&&!(error instanceof ApiError&&error.status===401))report(error);}
55
+ finally{if(current===lifecycle)patch({checking:false});}
56
+ }
57
+ function stop(){lifecycle++;identityEpoch++;refreshSequence++;busySequence++;cancelRequests();}
58
+ async function login(){
59
+ const done=busy();
60
+ try{const data=await api<{user:User;token?:string}>('/auth/login','POST',{email:state.email,password:state.password});clearIdentity();token=data.token??null;patch({user:data.user,password:'',notice:''});await refresh();}
61
+ catch(error){report(error);}finally{done();}
62
+ }
63
+ async function logout(){const done=busy();try{await api('/auth/logout','POST',{});clearIdentity();}catch(error){report(error);}finally{done();}}
64
+ function create(){patch({selected:null,title:'',content:'',editing:true,error:'',notice:''});}
65
+ async function open(id:string){
66
+ const done=busy();patch({notice:''});
67
+ try{const data=await api<RecordItem>(`/records/${id}`);patch({selected:data.id,title:data.title,content:data.content,editing:true});}
68
+ catch(error){report(error);}finally{done();}
69
+ }
70
+ async function save(){
71
+ const error=validateRecord(state.title,state.content);patch({error,notice:''});if(error)return;
72
+ const done=busy();
73
+ try{const data=await api<RecordItem>(state.selected?`/records/${state.selected}`:'/records',state.selected?'PUT':'POST',{title:state.title,content:state.content});patch({selected:data.id,title:data.title,content:data.content,notice:'已保存'});await refresh();}
74
+ catch(error){report(error);}finally{done();}
75
+ }
76
+ async function remove(confirmed:boolean){
77
+ if(!state.selected||!confirmed)return;
78
+ const done=busy();patch({notice:''});
79
+ try{await api(`/records/${state.selected}`,'DELETE');patch({editing:false,selected:null,title:'',content:'',notice:'已删除',...(state.page>1&&state.list.items.length===1?{page:state.page-1}:{})});await refresh();}
80
+ catch(error){report(error);}finally{done();}
81
+ }
82
+ async function changePage(page:number){if(page<1||!Number.isInteger(page))return;patch({page});await refresh();}
83
+ return {getSnapshot:()=>state,subscribe:(listener:()=>void)=>{listeners.add(listener);return ()=>{listeners.delete(listener);};},start,stop,login,logout,create,open,save,remove,changePage,setField:(field:'email'|'password'|'title'|'content',value:string)=>patch({[field]:value})};
84
+ }
85
+ export type WorkspaceModel=ReturnType<typeof createWorkspaceModel>;
@@ -0,0 +1,42 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2017",
4
+ "lib": [
5
+ "dom",
6
+ "dom.iterable",
7
+ "esnext"
8
+ ],
9
+ "allowJs": true,
10
+ "skipLibCheck": true,
11
+ "strict": true,
12
+ "noEmit": true,
13
+ "esModuleInterop": true,
14
+ "module": "esnext",
15
+ "moduleResolution": "bundler",
16
+ "resolveJsonModule": true,
17
+ "isolatedModules": true,
18
+ "jsx": "react-jsx",
19
+ "incremental": false,
20
+ "plugins": [
21
+ {
22
+ "name": "next"
23
+ }
24
+ ],
25
+ "paths": {
26
+ "@/*": [
27
+ "./*"
28
+ ]
29
+ }
30
+ },
31
+ "include": [
32
+ "next-env.d.ts",
33
+ "**/*.ts",
34
+ "**/*.tsx",
35
+ ".next/types/**/*.ts",
36
+ ".next/dev/types/**/*.ts",
37
+ "**/*.mts"
38
+ ],
39
+ "exclude": [
40
+ "node_modules"
41
+ ]
42
+ }
@@ -0,0 +1,2 @@
1
+ import {defineConfig} from 'vitest/config';
2
+ export default defineConfig({test:{include:['lib/**/*.test.ts'],reporters:['default','junit'],outputFile:{junit:(process.env.SCAFFOLD_REPORT_DIR||'../reports')+'/native.xml'}}});
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: design-contract
3
+ description: Implement or change UI from this project's design contract, adapt its component library, and verify every declared widget state and page scenario. Use for UI implementation, design-token changes, library adaptation, or design drift.
4
+ ---
5
+
6
+ Read root DESIGN.md, design/widgets.json, and design/structure.json before UI work. The shared design source is design/tokens.json plus the framework-neutral layout/widget styles and guide. Generated files are outputs, never the edit target.
7
+
8
+ Keep these boundaries:
9
+ - Design decisions belong in the design source only when the user requests a design change. A library default is not a reason to change the contract.
10
+ - Widget anatomy, variants, states, geometry and icon paths belong in widgets.json. A new state needs a fixture; do not silently skip unsupported states.
11
+ - Page regions and nesting belong in structure.json; framework views bind those slots to content.
12
+ - Business state, validation and identity/request isolation belong in web/src/workspace-model.ts, which has no framework or component-library imports.
13
+ - Library API names, DOM fixes and theme translation belong in web/src/ui.tsx. Use the canonical icon geometry; never silently substitute a similar library icon.
14
+
15
+ After changes, run `npm run design:sync`, `npm run design:check`, then `npm run design:verify`. Run the affected business checks from README as well. Design verification starts a local, temporary fixture server, compares the selected adapter with the independent semantic HTML reference, and cleans its own fixture files. Dependencies and the Playwright Chromium browser must already be installed with the project's documented install command.
16
+
17
+ The checker enumerates every variant/state in widgets.json and every page scenario in structure.json at every declared viewport. Position tolerance is 0.6 CSS px; computed colors, radii and SVG geometry must be identical. Keep browser, font availability, DPR, locale and content fixed. A screenshot is supporting evidence, not the pass criterion. Missing fixtures, TODOs, errors or incomplete coverage mean FAIL/NOT RUN, never PASS.
18
+
19
+ For scaffold maintainers, root `npm run design:verify` regenerates and checks all eight stack/UI combinations and compares their actual measurements. A generated project's command covers its selected adapter against the reference; it does not claim that uninstalled libraries or other platforms were tested. A new framework needs its view binding; adding a library also requires dependency/lockfile registration, without changing design or business intent.
20
+
21
+ When extracting a new website reference, inspect rendered desktop/mobile pages and computed styles. Separate observed values from approved adaptations. Record source limitations; do not infer exact values from screenshots or convert brand-specific content into a product requirement. Useful upstream approaches: [create-design-md](https://github.com/ibelick/ui-skills/blob/main/skills/create-design-md/SKILL.md) for evidence-based extraction and [Impeccable](https://github.com/pbakaus/impeccable) for targeted refinement. They are optional references, not runtime dependencies or authorization to install tools.
22
+
23
+ Report the changed layer, exact commands, coverage and result.json path. Fix adapter deviations rather than weakening tolerances, dropping cases, accepting a new baseline, or changing the shared design to fit one library.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: project-work
3
+ description: Implement features, fix defects, or change API/data/UI behavior in this generated project, using its task map and real validation commands.
4
+ ---
5
+
6
+ 1. Read AGENTS.md, README.md and the task map in docs/PROJECT.md. Check project.json for the selected stack and inspect the current Git changes.
7
+ 2. State the requested observable behavior and failure cases. Follow the task map to the implementation and callers; use existing interfaces and test conventions.
8
+ 3. Implement the requested change. API or data changes include the contract, a new migration when needed, and affected authorization tests. Run `npm run api:generate` after changing OpenAPI; `npm run api:check` detects stale types without modifying source, and HTTP tests validate response schemas. UI changes first read DESIGN.md and use design-contract for source, sync and browser checks.
9
+ 4. Run the affected checks, then `npm run check` for type/lint/build feedback. For API, data, auth or complete delivery, follow README's isolated `verify` command; UI work also needs design:check and design:verify. Check both exit status and the report's overallStatus/validity.
10
+ 5. Inspect the final diff. Report the behavior, actual commands/results and remaining limits. A quick check, doctor, historical report or generated file is not a current business pass. Keep credentials and raw runtime data local; apply the user's existing authorization to external writes.
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: design-contract
3
+ description: Implement or change UI from this project's design contract, adapt its component library, and verify every declared widget state and page scenario. Use for UI implementation, design-token changes, library adaptation, or design drift.
4
+ ---
5
+
6
+ Read root DESIGN.md, design/widgets.json, and design/structure.json before UI work. The shared design source is design/tokens.json plus the framework-neutral layout/widget styles and guide. Generated files are outputs, never the edit target.
7
+
8
+ Keep these boundaries:
9
+ - Design decisions belong in the design source only when the user requests a design change. A library default is not a reason to change the contract.
10
+ - Widget anatomy, variants, states, geometry and icon paths belong in widgets.json. A new state needs a fixture; do not silently skip unsupported states.
11
+ - Page regions and nesting belong in structure.json; framework views bind those slots to content.
12
+ - Business state, validation and identity/request isolation belong in web/src/workspace-model.ts, which has no framework or component-library imports.
13
+ - Library API names, DOM fixes and theme translation belong in web/src/ui.tsx. Use the canonical icon geometry; never silently substitute a similar library icon.
14
+
15
+ After changes, run `npm run design:sync`, `npm run design:check`, then `npm run design:verify`. Run the affected business checks from README as well. Design verification starts a local, temporary fixture server, compares the selected adapter with the independent semantic HTML reference, and cleans its own fixture files. Dependencies and the Playwright Chromium browser must already be installed with the project's documented install command.
16
+
17
+ The checker enumerates every variant/state in widgets.json and every page scenario in structure.json at every declared viewport. Position tolerance is 0.6 CSS px; computed colors, radii and SVG geometry must be identical. Keep browser, font availability, DPR, locale and content fixed. A screenshot is supporting evidence, not the pass criterion. Missing fixtures, TODOs, errors or incomplete coverage mean FAIL/NOT RUN, never PASS.
18
+
19
+ For scaffold maintainers, root `npm run design:verify` regenerates and checks all eight stack/UI combinations and compares their actual measurements. A generated project's command covers its selected adapter against the reference; it does not claim that uninstalled libraries or other platforms were tested. A new framework needs its view binding; adding a library also requires dependency/lockfile registration, without changing design or business intent.
20
+
21
+ When extracting a new website reference, inspect rendered desktop/mobile pages and computed styles. Separate observed values from approved adaptations. Record source limitations; do not infer exact values from screenshots or convert brand-specific content into a product requirement. Useful upstream approaches: [create-design-md](https://github.com/ibelick/ui-skills/blob/main/skills/create-design-md/SKILL.md) for evidence-based extraction and [Impeccable](https://github.com/pbakaus/impeccable) for targeted refinement. They are optional references, not runtime dependencies or authorization to install tools.
22
+
23
+ Report the changed layer, exact commands, coverage and result.json path. Fix adapter deviations rather than weakening tolerances, dropping cases, accepting a new baseline, or changing the shared design to fit one library.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: project-work
3
+ description: Implement features, fix defects, or change API/data/UI behavior in this generated project, using its task map and real validation commands.
4
+ ---
5
+
6
+ 1. Read AGENTS.md, README.md and the task map in docs/PROJECT.md. Check project.json for the selected stack and inspect the current Git changes.
7
+ 2. State the requested observable behavior and failure cases. Follow the task map to the implementation and callers; use existing interfaces and test conventions.
8
+ 3. Implement the requested change. API or data changes include the contract, a new migration when needed, and affected authorization tests. Run `npm run api:generate` after changing OpenAPI; `npm run api:check` detects stale types without modifying source, and HTTP tests validate response schemas. UI changes first read DESIGN.md and use design-contract for source, sync and browser checks.
9
+ 4. Run the affected checks, then `npm run check` for type/lint/build feedback. For API, data, auth or complete delivery, follow README's isolated `verify` command; UI work also needs design:check and design:verify. Check both exit status and the report's overallStatus/validity.
10
+ 5. Inspect the final diff. Report the behavior, actual commands/results and remaining limits. A quick check, doctor, historical report or generated file is not a current business pass. Keep credentials and raw runtime data local; apply the user's existing authorization to external writes.
@@ -0,0 +1,18 @@
1
+ **/node_modules
2
+ **/.venv
3
+ **/.next
4
+ **/target
5
+ **/dist
6
+ **/__pycache__
7
+ .git
8
+ .env
9
+ .env.*
10
+ .scaffold-local-credentials
11
+ .scaffold-runs
12
+ reports
13
+
14
+ **/test-results
15
+ **/playwright-report
16
+ **/.env
17
+ **/.env.*
18
+ !**/.env.example
@@ -0,0 +1,13 @@
1
+ # Copy only for explicit local development. Never use production credentials in verify.
2
+ APP_ORIGIN=http://localhost:5173
3
+ PORT=8000
4
+ WEB_PORT=5173
5
+ POSTGRES_PORT=54329
6
+ POSTGRES_USER=app
7
+ POSTGRES_PASSWORD=replace-with-local-random-password
8
+ POSTGRES_DB=app
9
+ DATABASE_URL=postgresql://app:replace-with-local-random-password@localhost:54329/app
10
+ AUTH_SECRET=replace-with-at-least-32-random-characters
11
+ SEED_A_EMAIL=alice@example.test
12
+ SEED_B_EMAIL=bob@example.test
13
+ SEED_PASSWORD=replace-with-local-random-password
@@ -0,0 +1,23 @@
1
+ ---
2
+ name: design-contract
3
+ description: Implement or change UI from this project's design contract, adapt its component library, and verify every declared widget state and page scenario. Use for UI implementation, design-token changes, library adaptation, or design drift.
4
+ ---
5
+
6
+ Read root DESIGN.md, design/widgets.json, and design/structure.json before UI work. The shared design source is design/tokens.json plus the framework-neutral layout/widget styles and guide. Generated files are outputs, never the edit target.
7
+
8
+ Keep these boundaries:
9
+ - Design decisions belong in the design source only when the user requests a design change. A library default is not a reason to change the contract.
10
+ - Widget anatomy, variants, states, geometry and icon paths belong in widgets.json. A new state needs a fixture; do not silently skip unsupported states.
11
+ - Page regions and nesting belong in structure.json; framework views bind those slots to content.
12
+ - Business state, validation and identity/request isolation belong in web/src/workspace-model.ts, which has no framework or component-library imports.
13
+ - Library API names, DOM fixes and theme translation belong in web/src/ui.tsx. Use the canonical icon geometry; never silently substitute a similar library icon.
14
+
15
+ After changes, run `npm run design:sync`, `npm run design:check`, then `npm run design:verify`. Run the affected business checks from README as well. Design verification starts a local, temporary fixture server, compares the selected adapter with the independent semantic HTML reference, and cleans its own fixture files. Dependencies and the Playwright Chromium browser must already be installed with the project's documented install command.
16
+
17
+ The checker enumerates every variant/state in widgets.json and every page scenario in structure.json at every declared viewport. Position tolerance is 0.6 CSS px; computed colors, radii and SVG geometry must be identical. Keep browser, font availability, DPR, locale and content fixed. A screenshot is supporting evidence, not the pass criterion. Missing fixtures, TODOs, errors or incomplete coverage mean FAIL/NOT RUN, never PASS.
18
+
19
+ For scaffold maintainers, root `npm run design:verify` regenerates and checks all eight stack/UI combinations and compares their actual measurements. A generated project's command covers its selected adapter against the reference; it does not claim that uninstalled libraries or other platforms were tested. A new framework needs its view binding; adding a library also requires dependency/lockfile registration, without changing design or business intent.
20
+
21
+ When extracting a new website reference, inspect rendered desktop/mobile pages and computed styles. Separate observed values from approved adaptations. Record source limitations; do not infer exact values from screenshots or convert brand-specific content into a product requirement. Useful upstream approaches: [create-design-md](https://github.com/ibelick/ui-skills/blob/main/skills/create-design-md/SKILL.md) for evidence-based extraction and [Impeccable](https://github.com/pbakaus/impeccable) for targeted refinement. They are optional references, not runtime dependencies or authorization to install tools.
22
+
23
+ Report the changed layer, exact commands, coverage and result.json path. Fix adapter deviations rather than weakening tolerances, dropping cases, accepting a new baseline, or changing the shared design to fit one library.
@@ -0,0 +1,10 @@
1
+ ---
2
+ name: project-work
3
+ description: Implement features, fix defects, or change API/data/UI behavior in this generated project, using its task map and real validation commands.
4
+ ---
5
+
6
+ 1. Read AGENTS.md, README.md and the task map in docs/PROJECT.md. Check project.json for the selected stack and inspect the current Git changes.
7
+ 2. State the requested observable behavior and failure cases. Follow the task map to the implementation and callers; use existing interfaces and test conventions.
8
+ 3. Implement the requested change. API or data changes include the contract, a new migration when needed, and affected authorization tests. Run `npm run api:generate` after changing OpenAPI; `npm run api:check` detects stale types without modifying source, and HTTP tests validate response schemas. UI changes first read DESIGN.md and use design-contract for source, sync and browser checks.
9
+ 4. Run the affected checks, then `npm run check` for type/lint/build feedback. For API, data, auth or complete delivery, follow README's isolated `verify` command; UI work also needs design:check and design:verify. Check both exit status and the report's overallStatus/validity.
10
+ 5. Inspect the final diff. Report the behavior, actual commands/results and remaining limits. A quick check, doctor, historical report or generated file is not a current business pass. Keep credentials and raw runtime data local; apply the user's existing authorization to external writes.
@@ -0,0 +1,7 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "template": "next-fullstack",
4
+ "ui": "shadcn",
5
+ "port": 3000,
6
+ "backend": false
7
+ }
@@ -0,0 +1,11 @@
1
+ # 项目规则
2
+
3
+ 先读 README.md 的实际命令与 docs/PROJECT.md 的需求和架构。project.json 记录项目基本信息,个人记录是基础示例,简介不代表额外功能已经实现。
4
+
5
+ 按需求实现并运行相关检查:安装、启动、构建成功;登录和增删改查真实持久化;用户 A 无法访问用户 B 的记录。自查差异,允许合理更新测试,不以删除断言、跳过检查或关闭类型校验掩盖失败。交付实际文件、命令、结果,未运行明确说明。
6
+
7
+ 仅修改任务范围,保留其他改动。秘密只放本地环境,不提交或打印;模板 verify 使用隔离数据库。推送、发布和外部写入依任务授权执行。
8
+
9
+ 实现功能、修复缺陷时使用 project-work Skill;先按 docs/PROJECT.md 的任务表定位实现、迁移和测试入口。未自动发现 Skill 时按该表和 README 执行。
10
+
11
+ 修改 UI 前先读根目录 DESIGN.md。使用 design-contract Skill;设计源、同步命令和一致性检查以该文件为准。交付前运行 design:check 与 design:verify,报告实际覆盖范围。
@@ -0,0 +1 @@
1
+ @AGENTS.md