@dewtech/dare-cli 3.3.0 → 3.4.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 (582) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +764 -764
  3. package/dist/__tests__/confidence.test.js +13 -13
  4. package/dist/__tests__/dag-converter.test.js +56 -56
  5. package/dist/__tests__/mcp-server/server.test.js +3 -16
  6. package/dist/__tests__/mcp-server/server.test.js.map +1 -1
  7. package/dist/__tests__/project-generator.test.js +2 -2
  8. package/dist/__tests__/project-generator.test.js.map +1 -1
  9. package/dist/__tests__/refine.test.js +49 -49
  10. package/dist/__tests__/reverse-collection.test.js +6 -6
  11. package/dist/__tests__/review.test.js +38 -38
  12. package/dist/__tests__/security-hardening.test.d.ts +2 -0
  13. package/dist/__tests__/security-hardening.test.d.ts.map +1 -0
  14. package/dist/__tests__/security-hardening.test.js +101 -0
  15. package/dist/__tests__/security-hardening.test.js.map +1 -0
  16. package/dist/__tests__/validate.test.js +65 -65
  17. package/dist/bin/dare.js +0 -0
  18. package/dist/commands/__tests__/init-validation.test.d.ts +2 -0
  19. package/dist/commands/__tests__/init-validation.test.d.ts.map +1 -0
  20. package/dist/commands/__tests__/init-validation.test.js +81 -0
  21. package/dist/commands/__tests__/init-validation.test.js.map +1 -0
  22. package/dist/commands/__tests__/init.integration.spec.js +6 -4
  23. package/dist/commands/__tests__/init.integration.spec.js.map +1 -1
  24. package/dist/commands/__tests__/init.spec.d.ts +2 -0
  25. package/dist/commands/__tests__/init.spec.d.ts.map +1 -0
  26. package/dist/commands/__tests__/init.spec.js +88 -0
  27. package/dist/commands/__tests__/init.spec.js.map +1 -0
  28. package/dist/commands/blueprint.js +122 -122
  29. package/dist/commands/design.js +20 -20
  30. package/dist/commands/init-validation.d.ts +22 -0
  31. package/dist/commands/init-validation.d.ts.map +1 -0
  32. package/dist/commands/init-validation.js +54 -0
  33. package/dist/commands/init-validation.js.map +1 -0
  34. package/dist/commands/init.d.ts.map +1 -1
  35. package/dist/commands/init.js +26 -10
  36. package/dist/commands/init.js.map +1 -1
  37. package/dist/graphrag/graph-rag.js +24 -24
  38. package/dist/mcp-server/__tests__/auth.test.d.ts +2 -0
  39. package/dist/mcp-server/__tests__/auth.test.d.ts.map +1 -0
  40. package/dist/mcp-server/__tests__/auth.test.js +72 -0
  41. package/dist/mcp-server/__tests__/auth.test.js.map +1 -0
  42. package/dist/mcp-server/__tests__/boot-config.test.d.ts +2 -0
  43. package/dist/mcp-server/__tests__/boot-config.test.d.ts.map +1 -0
  44. package/dist/mcp-server/__tests__/boot-config.test.js +29 -0
  45. package/dist/mcp-server/__tests__/boot-config.test.js.map +1 -0
  46. package/dist/mcp-server/__tests__/error-sanitize.test.d.ts +2 -0
  47. package/dist/mcp-server/__tests__/error-sanitize.test.d.ts.map +1 -0
  48. package/dist/mcp-server/__tests__/error-sanitize.test.js +66 -0
  49. package/dist/mcp-server/__tests__/error-sanitize.test.js.map +1 -0
  50. package/dist/mcp-server/__tests__/path-confinement.test.d.ts +2 -0
  51. package/dist/mcp-server/__tests__/path-confinement.test.d.ts.map +1 -0
  52. package/dist/mcp-server/__tests__/path-confinement.test.js +135 -0
  53. package/dist/mcp-server/__tests__/path-confinement.test.js.map +1 -0
  54. package/dist/mcp-server/bin/server.js +18 -6
  55. package/dist/mcp-server/bin/server.js.map +1 -1
  56. package/dist/mcp-server/boot-config.d.ts +6 -0
  57. package/dist/mcp-server/boot-config.d.ts.map +1 -0
  58. package/dist/mcp-server/boot-config.js +17 -0
  59. package/dist/mcp-server/boot-config.js.map +1 -0
  60. package/dist/mcp-server/middleware/auth.d.ts +10 -0
  61. package/dist/mcp-server/middleware/auth.d.ts.map +1 -0
  62. package/dist/mcp-server/middleware/auth.js +44 -0
  63. package/dist/mcp-server/middleware/auth.js.map +1 -0
  64. package/dist/mcp-server/middleware/cors.d.ts +6 -0
  65. package/dist/mcp-server/middleware/cors.d.ts.map +1 -0
  66. package/dist/mcp-server/middleware/cors.js +30 -0
  67. package/dist/mcp-server/middleware/cors.js.map +1 -0
  68. package/dist/mcp-server/middleware/error-handler.d.ts +11 -0
  69. package/dist/mcp-server/middleware/error-handler.d.ts.map +1 -0
  70. package/dist/mcp-server/middleware/error-handler.js +14 -0
  71. package/dist/mcp-server/middleware/error-handler.js.map +1 -0
  72. package/dist/mcp-server/server.d.ts +7 -2
  73. package/dist/mcp-server/server.d.ts.map +1 -1
  74. package/dist/mcp-server/server.js +185 -105
  75. package/dist/mcp-server/server.js.map +1 -1
  76. package/dist/skills/registry-mock.json +109 -109
  77. package/dist/skills/tests/manifest.spec.js +20 -20
  78. package/dist/stacks/__tests__/dna-emitter.spec.js +6 -6
  79. package/dist/stacks/dna-emitter.js +69 -69
  80. package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
  81. package/dist/utils/project-generator.d.ts.map +1 -1
  82. package/dist/utils/project-generator.js +254 -252
  83. package/dist/utils/project-generator.js.map +1 -1
  84. package/dist/utils/stack-bootstrap.js +371 -371
  85. package/dist/utils/templates.js +394 -394
  86. package/dist/verification/__tests__/anti-tamper.test.js +13 -13
  87. package/package.json +96 -93
  88. package/templates/DARE-dag-example.yaml +280 -280
  89. package/templates/UPDATE-MANIFEST.json +68 -68
  90. package/templates/backend/node-nestjs/.env.example +9 -9
  91. package/templates/backend/node-nestjs/nest-cli.json +8 -8
  92. package/templates/backend/node-nestjs/package.json +50 -50
  93. package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
  94. package/templates/backend/node-nestjs/src/app.module.ts +15 -15
  95. package/templates/backend/node-nestjs/src/app.service.ts +8 -8
  96. package/templates/backend/node-nestjs/src/main.ts +24 -24
  97. package/templates/backend/node-nestjs/tsconfig.json +21 -21
  98. package/templates/backend/php-laravel/.env.example +22 -22
  99. package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
  100. package/templates/backend/php-laravel/composer.json +40 -40
  101. package/templates/backend/python-fastapi/.env.example +4 -4
  102. package/templates/backend/python-fastapi/app/api/router.py +8 -8
  103. package/templates/backend/python-fastapi/app/core/config.py +20 -20
  104. package/templates/backend/python-fastapi/main.py +35 -35
  105. package/templates/backend/python-fastapi/requirements.txt +13 -13
  106. package/templates/backend/rust-axum/.env.example +3 -3
  107. package/templates/backend/rust-axum/Cargo.toml +23 -23
  108. package/templates/backend/rust-axum/src/errors.rs +30 -30
  109. package/templates/backend/rust-axum/src/main.rs +32 -32
  110. package/templates/backend/rust-axum/src/routes.rs +6 -6
  111. package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
  112. package/templates/frontend/leptos-csr/Cargo.toml +16 -16
  113. package/templates/frontend/leptos-csr/Trunk.toml +10 -10
  114. package/templates/frontend/leptos-csr/index.html +11 -11
  115. package/templates/frontend/leptos-csr/src/lib.rs +20 -20
  116. package/templates/frontend/leptos-csr/style/main.scss +19 -19
  117. package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
  118. package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
  119. package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
  120. package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
  121. package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
  122. package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
  123. package/templates/frontend/react/index.html +12 -12
  124. package/templates/frontend/react/package.json +35 -35
  125. package/templates/frontend/react/src/App.tsx +25 -25
  126. package/templates/frontend/react/src/main.tsx +9 -9
  127. package/templates/frontend/vue/package.json +32 -32
  128. package/templates/frontend/vue/src/App.vue +7 -7
  129. package/templates/frontend/vue/src/main.ts +10 -10
  130. package/templates/frontend/vue/src/router/index.ts +14 -14
  131. package/templates/frontend/vue/src/views/HomeView.vue +6 -6
  132. package/templates/hooks/pre-commit-dare-validate +24 -24
  133. package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -152
  134. package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -21
  135. package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +368 -368
  136. package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -32
  137. package/templates/ide/antigravity/.agents/skills/dare-bugfix-design/SKILL.md +76 -76
  138. package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -32
  139. package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -154
  140. package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -130
  141. package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
  142. package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +180 -180
  143. package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -33
  144. package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -63
  145. package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -315
  146. package/templates/ide/antigravity/.agents/skills/dare-execute/SKILL.md +264 -264
  147. package/templates/ide/antigravity/.agents/skills/dare-feature-design/SKILL.md +74 -74
  148. package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -192
  149. package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -35
  150. package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -31
  151. package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -35
  152. package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -337
  153. package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -166
  154. package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -217
  155. package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -61
  156. package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -187
  157. package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -217
  158. package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
  159. package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -108
  160. package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
  161. package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -263
  162. package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
  163. package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -274
  164. package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -35
  165. package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
  166. package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -188
  167. package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -33
  168. package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -33
  169. package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -30
  170. package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -343
  171. package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -377
  172. package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -382
  173. package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -326
  174. package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -393
  175. package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
  176. package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
  177. package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
  178. package/templates/ide/antigravity/templates/TASKS-template.md +26 -26
  179. package/templates/ide/antigravity/templates/TELEMETRY-template.md +125 -125
  180. package/templates/ide/claude/.claude/commands/dare-ax.md +131 -131
  181. package/templates/ide/claude/.claude/commands/dare-bench.md +18 -18
  182. package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
  183. package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -27
  184. package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -119
  185. package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
  186. package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
  187. package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -117
  188. package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
  189. package/templates/ide/claude/.claude/commands/dare-dag.md +27 -27
  190. package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
  191. package/templates/ide/claude/.claude/commands/dare-discover.md +28 -28
  192. package/templates/ide/claude/.claude/commands/dare-dna.md +75 -75
  193. package/templates/ide/claude/.claude/commands/dare-docker.md +207 -207
  194. package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
  195. package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -147
  196. package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -149
  197. package/templates/ide/claude/.claude/commands/dare-graph.md +30 -30
  198. package/templates/ide/claude/.claude/commands/dare-info.md +26 -26
  199. package/templates/ide/claude/.claude/commands/dare-init.md +30 -30
  200. package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -211
  201. package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -124
  202. package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -148
  203. package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -72
  204. package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -166
  205. package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -159
  206. package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
  207. package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -139
  208. package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
  209. package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
  210. package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
  211. package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
  212. package/templates/ide/claude/.claude/commands/dare-skill.md +30 -30
  213. package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
  214. package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -132
  215. package/templates/ide/claude/.claude/commands/dare-update.md +28 -28
  216. package/templates/ide/claude/.claude/commands/dare-validate.md +28 -28
  217. package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -25
  218. package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -205
  219. package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -232
  220. package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -228
  221. package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -210
  222. package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -236
  223. package/templates/ide/claude/.claude/settings.example.json +35 -35
  224. package/templates/ide/claude/CLAUDE.md +146 -146
  225. package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
  226. package/templates/ide/claude/templates/DESIGN-template.md +129 -129
  227. package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
  228. package/templates/ide/claude/templates/TASKS-template.md +26 -26
  229. package/templates/ide/claude/templates/TELEMETRY-template.md +125 -125
  230. package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -18
  231. package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +86 -86
  232. package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -27
  233. package/templates/ide/cursor/.cursor/commands/dare-bugfix-design.md +64 -64
  234. package/templates/ide/cursor/.cursor/commands/dare-dag-run.md +110 -110
  235. package/templates/ide/cursor/.cursor/commands/dare-dag-viz.md +139 -139
  236. package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -27
  237. package/templates/ide/cursor/.cursor/commands/dare-design.md +35 -35
  238. package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -28
  239. package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -75
  240. package/templates/ide/cursor/.cursor/commands/dare-docker-compose.md +18 -18
  241. package/templates/ide/cursor/.cursor/commands/dare-dockerfile.md +17 -17
  242. package/templates/ide/cursor/.cursor/commands/dare-execute.md +19 -19
  243. package/templates/ide/cursor/.cursor/commands/dare-feature-design.md +64 -64
  244. package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -30
  245. package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -26
  246. package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -30
  247. package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -72
  248. package/templates/ide/cursor/.cursor/commands/dare-refine.md +107 -107
  249. package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -139
  250. package/templates/ide/cursor/.cursor/commands/dare-review.md +91 -91
  251. package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -30
  252. package/templates/ide/cursor/.cursor/commands/dare-tasks.md +184 -184
  253. package/templates/ide/cursor/.cursor/commands/dare-telemetry.md +42 -42
  254. package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -28
  255. package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -28
  256. package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -25
  257. package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -263
  258. package/templates/ide/cursor/.cursor/rules/skill-bugfix-design.mdc +51 -51
  259. package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -173
  260. package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -134
  261. package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
  262. package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -63
  263. package/templates/ide/cursor/.cursor/rules/skill-docker.mdc +33 -33
  264. package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -352
  265. package/templates/ide/cursor/.cursor/rules/skill-feature-design.mdc +43 -43
  266. package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -244
  267. package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -371
  268. package/templates/ide/cursor/.cursor/rules/skill-laravel-api.mdc +44 -44
  269. package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -266
  270. package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -295
  271. package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -367
  272. package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -58
  273. package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -346
  274. package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -248
  275. package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -400
  276. package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -262
  277. package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -107
  278. package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -281
  279. package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
  280. package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
  281. package/templates/ide/cursor/.cursor/rules/skill-telemetry.mdc +156 -156
  282. package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
  283. package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
  284. package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
  285. package/templates/ide/cursor/templates/TASKS-template.md +26 -26
  286. package/templates/ide/cursor/templates/TELEMETRY-template.md +125 -125
  287. package/templates/shared/docker-compose.yml +41 -41
  288. package/templates/stacks/go-gin/.dare/skills.yml +11 -11
  289. package/templates/stacks/go-gin/.env.example +24 -24
  290. package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -42
  291. package/templates/stacks/go-gin/README.md.tpl +38 -38
  292. package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -78
  293. package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -2
  294. package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -12
  295. package/templates/stacks/go-gin/db/queries/users.sql +23 -23
  296. package/templates/stacks/go-gin/gitignore +7 -7
  297. package/templates/stacks/go-gin/go.mod.tpl +17 -17
  298. package/templates/stacks/go-gin/internal/config/config.go +41 -41
  299. package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -25
  300. package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -72
  301. package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -72
  302. package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -37
  303. package/templates/stacks/go-gin/internal/llm/dummy.go +14 -14
  304. package/templates/stacks/go-gin/internal/llm/provider.go +8 -8
  305. package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -58
  306. package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -55
  307. package/templates/stacks/go-gin/internal/model/user.go +17 -17
  308. package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -79
  309. package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -55
  310. package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -53
  311. package/templates/stacks/go-gin/llms.txt.tpl +54 -54
  312. package/templates/stacks/go-gin/openapi.json.tpl +46 -46
  313. package/templates/stacks/go-gin/sqlc.yaml +14 -14
  314. package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -22
  315. package/templates/stacks/go-stdlib/.dare/skills.yml +11 -11
  316. package/templates/stacks/go-stdlib/.env.example +24 -24
  317. package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -42
  318. package/templates/stacks/go-stdlib/README.md.tpl +41 -41
  319. package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -82
  320. package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -2
  321. package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -12
  322. package/templates/stacks/go-stdlib/db/queries/users.sql +23 -23
  323. package/templates/stacks/go-stdlib/gitignore +6 -6
  324. package/templates/stacks/go-stdlib/go.mod.tpl +15 -15
  325. package/templates/stacks/go-stdlib/internal/config/config.go +41 -41
  326. package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -24
  327. package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -71
  328. package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -84
  329. package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -36
  330. package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -32
  331. package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -14
  332. package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -8
  333. package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -21
  334. package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -27
  335. package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -51
  336. package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -81
  337. package/templates/stacks/go-stdlib/internal/model/user.go +17 -17
  338. package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -75
  339. package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -55
  340. package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -53
  341. package/templates/stacks/go-stdlib/llms.txt.tpl +60 -60
  342. package/templates/stacks/go-stdlib/openapi.json.tpl +46 -46
  343. package/templates/stacks/go-stdlib/sqlc.yaml +14 -14
  344. package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -45
  345. package/templates/stacks/mcp-go/.dare/skills.yml +8 -8
  346. package/templates/stacks/mcp-go/.env.example +14 -14
  347. package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -42
  348. package/templates/stacks/mcp-go/README.md.tpl +50 -50
  349. package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -62
  350. package/templates/stacks/mcp-go/gitignore +6 -6
  351. package/templates/stacks/mcp-go/go.mod.tpl +9 -9
  352. package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -9
  353. package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -80
  354. package/templates/stacks/mcp-go/internal/tools/echo.go +15 -15
  355. package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -21
  356. package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -17
  357. package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -14
  358. package/templates/stacks/mcp-go/llms.txt.tpl +60 -60
  359. package/templates/stacks/mcp-go/openapi.json.tpl +31 -31
  360. package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -37
  361. package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -8
  362. package/templates/stacks/mcp-node-ts/.env.example +16 -16
  363. package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -54
  364. package/templates/stacks/mcp-node-ts/README.md.hbs +49 -49
  365. package/templates/stacks/mcp-node-ts/gitignore +7 -7
  366. package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -61
  367. package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -39
  368. package/templates/stacks/mcp-node-ts/package.json.hbs +35 -35
  369. package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -71
  370. package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -36
  371. package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -45
  372. package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -23
  373. package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -18
  374. package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -68
  375. package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -58
  376. package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -5
  377. package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -50
  378. package/templates/stacks/mcp-node-ts/tsconfig.json +17 -17
  379. package/templates/stacks/mcp-python/.dare/skills.yml +8 -8
  380. package/templates/stacks/mcp-python/.env.example +14 -14
  381. package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -42
  382. package/templates/stacks/mcp-python/README.md.j2 +49 -49
  383. package/templates/stacks/mcp-python/gitignore +12 -12
  384. package/templates/stacks/mcp-python/llms.txt.j2 +56 -56
  385. package/templates/stacks/mcp-python/openapi.json.j2 +33 -33
  386. package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -37
  387. package/templates/stacks/mcp-python/src/cli.py.j2 +68 -68
  388. package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -10
  389. package/templates/stacks/mcp-python/src/server.py.j2 +28 -28
  390. package/templates/stacks/mcp-python/src/tools/echo.py +12 -12
  391. package/templates/stacks/mcp-python/src/transports/http.py +12 -12
  392. package/templates/stacks/mcp-python/src/transports/sse.py +13 -13
  393. package/templates/stacks/mcp-python/src/transports/stdio.py +6 -6
  394. package/templates/stacks/mcp-python/tests/test_echo.py +28 -28
  395. package/templates/stacks/mcp-rust/.dare/skills.yml +8 -8
  396. package/templates/stacks/mcp-rust/.env.example +14 -14
  397. package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -38
  398. package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -35
  399. package/templates/stacks/mcp-rust/README.md.tera +50 -50
  400. package/templates/stacks/mcp-rust/gitignore +5 -5
  401. package/templates/stacks/mcp-rust/llms.txt.tera +60 -60
  402. package/templates/stacks/mcp-rust/openapi.json.tera +31 -31
  403. package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -33
  404. package/templates/stacks/mcp-rust/src/lib.rs +6 -6
  405. package/templates/stacks/mcp-rust/src/main.rs.tera +30 -30
  406. package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -1
  407. package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -5
  408. package/templates/stacks/mcp-rust/src/server.rs.tera +38 -38
  409. package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -18
  410. package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -22
  411. package/templates/stacks/mcp-rust/src/transports/http.rs +27 -27
  412. package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -3
  413. package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -33
  414. package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -14
  415. package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -27
  416. package/templates/stacks/node-nestjs/.dare/skills.yml +11 -11
  417. package/templates/stacks/node-nestjs/.env.example +21 -21
  418. package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -54
  419. package/templates/stacks/node-nestjs/README.md.hbs +35 -35
  420. package/templates/stacks/node-nestjs/gitignore +7 -7
  421. package/templates/stacks/node-nestjs/llms.txt.hbs +47 -47
  422. package/templates/stacks/node-nestjs/nest-cli.json +16 -16
  423. package/templates/stacks/node-nestjs/openapi.json.hbs +75 -75
  424. package/templates/stacks/node-nestjs/package.json.hbs +57 -57
  425. package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -25
  426. package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -25
  427. package/templates/stacks/node-nestjs/src/app.module.ts +39 -39
  428. package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -29
  429. package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -25
  430. package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -36
  431. package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -9
  432. package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -17
  433. package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -25
  434. package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -38
  435. package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -13
  436. package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -44
  437. package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -9
  438. package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -9
  439. package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -22
  440. package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -15
  441. package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -41
  442. package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -11
  443. package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -38
  444. package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -38
  445. package/templates/stacks/node-nestjs/tsconfig.build.json +4 -4
  446. package/templates/stacks/node-nestjs/tsconfig.json +28 -28
  447. package/templates/stacks/php-laravel/.dare/skills.yml +11 -11
  448. package/templates/stacks/php-laravel/.env.example +41 -41
  449. package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -43
  450. package/templates/stacks/php-laravel/README.md.hbs +36 -36
  451. package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -36
  452. package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -33
  453. package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -26
  454. package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -34
  455. package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -12
  456. package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -13
  457. package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -33
  458. package/templates/stacks/php-laravel/app/Models/User.php +44 -44
  459. package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -32
  460. package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -37
  461. package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -57
  462. package/templates/stacks/php-laravel/artisan +12 -12
  463. package/templates/stacks/php-laravel/bootstrap/app.php +29 -29
  464. package/templates/stacks/php-laravel/bootstrap/providers.php +5 -5
  465. package/templates/stacks/php-laravel/composer.json.hbs +58 -58
  466. package/templates/stacks/php-laravel/config/l5-swagger.php +41 -41
  467. package/templates/stacks/php-laravel/config/reverb.php +34 -34
  468. package/templates/stacks/php-laravel/config/sanctum.php +15 -15
  469. package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -27
  470. package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -21
  471. package/templates/stacks/php-laravel/gitignore +23 -23
  472. package/templates/stacks/php-laravel/llms.txt.hbs +53 -53
  473. package/templates/stacks/php-laravel/openapi.json.hbs +43 -43
  474. package/templates/stacks/php-laravel/phpstan.neon +9 -9
  475. package/templates/stacks/php-laravel/routes/api.php +13 -13
  476. package/templates/stacks/php-laravel/routes/channels.php +7 -7
  477. package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -35
  478. package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -30
  479. package/templates/stacks/php-laravel/tests/Pest.php +5 -5
  480. package/templates/stacks/python-fastapi/.dare/skills.yml +11 -11
  481. package/templates/stacks/python-fastapi/.env.example +21 -21
  482. package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -43
  483. package/templates/stacks/python-fastapi/README.md.j2 +35 -35
  484. package/templates/stacks/python-fastapi/alembic/env.py +46 -46
  485. package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -26
  486. package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -37
  487. package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -39
  488. package/templates/stacks/python-fastapi/app/core/config.py +24 -24
  489. package/templates/stacks/python-fastapi/app/core/security.py +34 -34
  490. package/templates/stacks/python-fastapi/app/db/session.py +22 -22
  491. package/templates/stacks/python-fastapi/app/main.py.j2 +36 -36
  492. package/templates/stacks/python-fastapi/app/models/__init__.py +3 -3
  493. package/templates/stacks/python-fastapi/app/models/user.py +30 -30
  494. package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -34
  495. package/templates/stacks/python-fastapi/app/routers/auth.py +37 -37
  496. package/templates/stacks/python-fastapi/app/routers/users.py +46 -46
  497. package/templates/stacks/python-fastapi/app/schemas/user.py +56 -56
  498. package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -22
  499. package/templates/stacks/python-fastapi/app/services/user_service.py +31 -31
  500. package/templates/stacks/python-fastapi/gitignore +12 -12
  501. package/templates/stacks/python-fastapi/llms.txt.j2 +53 -53
  502. package/templates/stacks/python-fastapi/openapi.json.j2 +43 -43
  503. package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -45
  504. package/templates/stacks/python-fastapi/tests/test_auth.py +22 -22
  505. package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -50
  506. package/templates/stacks/ruby-rails-8/.env.example +20 -20
  507. package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -112
  508. package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -61
  509. package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -11
  510. package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -34
  511. package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -18
  512. package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -23
  513. package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -44
  514. package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -93
  515. package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -33
  516. package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -68
  517. package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -44
  518. package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -54
  519. package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -12
  520. package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -35
  521. package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -67
  522. package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -62
  523. package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -82
  524. package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -21
  525. package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -52
  526. package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -36
  527. package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -48
  528. package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -57
  529. package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -73
  530. package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -67
  531. package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -53
  532. package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -57
  533. package/templates/stacks/ruby-rails-8/config/dare.yml +42 -42
  534. package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -31
  535. package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -64
  536. package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -12
  537. package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -159
  538. package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -69
  539. package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -56
  540. package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -72
  541. package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -61
  542. package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -56
  543. package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -27
  544. package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -88
  545. package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -31
  546. package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -88
  547. package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -142
  548. package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -73
  549. package/templates/stacks/rust-axum/.dare/skills.yml +11 -11
  550. package/templates/stacks/rust-axum/.env.example +26 -26
  551. package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -40
  552. package/templates/stacks/rust-axum/Cargo.toml.tera +53 -53
  553. package/templates/stacks/rust-axum/README.md.tera +37 -37
  554. package/templates/stacks/rust-axum/gitignore +5 -5
  555. package/templates/stacks/rust-axum/llms.txt.tera +54 -54
  556. package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -13
  557. package/templates/stacks/rust-axum/openapi.json.tera +46 -46
  558. package/templates/stacks/rust-axum/src/config.rs +45 -45
  559. package/templates/stacks/rust-axum/src/errors.rs +48 -48
  560. package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -48
  561. package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -3
  562. package/templates/stacks/rust-axum/src/handlers/users.rs +81 -81
  563. package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -24
  564. package/templates/stacks/rust-axum/src/lib.rs +19 -19
  565. package/templates/stacks/rust-axum/src/llm/mod.rs +1 -1
  566. package/templates/stacks/rust-axum/src/llm/provider.rs +48 -48
  567. package/templates/stacks/rust-axum/src/main.rs.tera +64 -64
  568. package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -20
  569. package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -2
  570. package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -27
  571. package/templates/stacks/rust-axum/src/models/mod.rs +1 -1
  572. package/templates/stacks/rust-axum/src/models/user.rs +13 -13
  573. package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -1
  574. package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -62
  575. package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -50
  576. package/templates/stacks/rust-axum/src/services/mod.rs +2 -2
  577. package/templates/stacks/rust-axum/src/services/user_service.rs +53 -53
  578. package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -13
  579. package/dist/commands/new.d.ts +0 -16
  580. package/dist/commands/new.d.ts.map +0 -1
  581. package/dist/commands/new.js +0 -104
  582. package/dist/commands/new.js.map +0 -1
@@ -333,73 +333,73 @@ async function bootstrapGoGin(dir, projectName, mode) {
333
333
  await fs.ensureDir(path.join(dir, 'cmd', 'api'));
334
334
  await fs.ensureDir(path.join(dir, 'internal', 'handlers'));
335
335
  await fs.ensureDir(path.join(dir, 'internal', 'middleware'));
336
- await fs.writeFile(path.join(dir, 'cmd', 'api', 'main.go'), `package main
337
-
338
- import (
339
- \t"log"
340
- \t"os"
341
-
342
- \t"github.com/gin-gonic/gin"
343
- \t"${moduleName}/internal/handlers"
344
- )
345
-
346
- func main() {
347
- \tr := gin.Default()
348
-
349
- \tr.GET("/healthz", handlers.Health)
350
-
351
- \tv1 := r.Group("/api/v1")
352
- \t{
353
- \t\tv1.GET("/", func(c *gin.Context) {
354
- \t\t\tc.JSON(200, gin.H{"message": "API v1"})
355
- \t\t})
356
- \t}
357
-
358
- \tport := os.Getenv("PORT")
359
- \tif port == "" {
360
- \t\tport = "8080"
361
- \t}
362
- \tif err := r.Run(":" + port); err != nil {
363
- \t\tlog.Fatal(err)
364
- \t}
365
- }
336
+ await fs.writeFile(path.join(dir, 'cmd', 'api', 'main.go'), `package main
337
+
338
+ import (
339
+ \t"log"
340
+ \t"os"
341
+
342
+ \t"github.com/gin-gonic/gin"
343
+ \t"${moduleName}/internal/handlers"
344
+ )
345
+
346
+ func main() {
347
+ \tr := gin.Default()
348
+
349
+ \tr.GET("/healthz", handlers.Health)
350
+
351
+ \tv1 := r.Group("/api/v1")
352
+ \t{
353
+ \t\tv1.GET("/", func(c *gin.Context) {
354
+ \t\t\tc.JSON(200, gin.H{"message": "API v1"})
355
+ \t\t})
356
+ \t}
357
+
358
+ \tport := os.Getenv("PORT")
359
+ \tif port == "" {
360
+ \t\tport = "8080"
361
+ \t}
362
+ \tif err := r.Run(":" + port); err != nil {
363
+ \t\tlog.Fatal(err)
364
+ \t}
365
+ }
366
366
  `);
367
- await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health.go'), `package handlers
368
-
369
- import (
370
- \t"net/http"
371
-
372
- \t"github.com/gin-gonic/gin"
373
- )
374
-
375
- // Health returns 200 with a small status payload.
376
- func Health(c *gin.Context) {
377
- \tc.JSON(http.StatusOK, gin.H{"status": "ok"})
378
- }
367
+ await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health.go'), `package handlers
368
+
369
+ import (
370
+ \t"net/http"
371
+
372
+ \t"github.com/gin-gonic/gin"
373
+ )
374
+
375
+ // Health returns 200 with a small status payload.
376
+ func Health(c *gin.Context) {
377
+ \tc.JSON(http.StatusOK, gin.H{"status": "ok"})
378
+ }
379
379
  `);
380
- await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health_test.go'), `package handlers
381
-
382
- import (
383
- \t"net/http"
384
- \t"net/http/httptest"
385
- \t"testing"
386
-
387
- \t"github.com/gin-gonic/gin"
388
- )
389
-
390
- func TestHealth(t *testing.T) {
391
- \tgin.SetMode(gin.TestMode)
392
- \tr := gin.New()
393
- \tr.GET("/healthz", Health)
394
-
395
- \treq := httptest.NewRequest(http.MethodGet, "/healthz", nil)
396
- \trec := httptest.NewRecorder()
397
- \tr.ServeHTTP(rec, req)
398
-
399
- \tif rec.Code != http.StatusOK {
400
- \t\tt.Fatalf("expected 200, got %d", rec.Code)
401
- \t}
402
- }
380
+ await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health_test.go'), `package handlers
381
+
382
+ import (
383
+ \t"net/http"
384
+ \t"net/http/httptest"
385
+ \t"testing"
386
+
387
+ \t"github.com/gin-gonic/gin"
388
+ )
389
+
390
+ func TestHealth(t *testing.T) {
391
+ \tgin.SetMode(gin.TestMode)
392
+ \tr := gin.New()
393
+ \tr.GET("/healthz", Health)
394
+
395
+ \treq := httptest.NewRequest(http.MethodGet, "/healthz", nil)
396
+ \trec := httptest.NewRecorder()
397
+ \tr.ServeHTTP(rec, req)
398
+
399
+ \tif rec.Code != http.StatusOK {
400
+ \t\tt.Fatalf("expected 200, got %d", rec.Code)
401
+ \t}
402
+ }
403
403
  `);
404
404
  await go.run(['mod', 'tidy']);
405
405
  }
@@ -426,149 +426,149 @@ async function bootstrapGoStdlib(dir, projectName, mode) {
426
426
  await fs.ensureDir(path.join(dir, 'internal', 'middleware'));
427
427
  // cmd/api/main.go — http.NewServeMux with the Go 1.22+ pattern syntax,
428
428
  // wired through a logging + recover middleware chain.
429
- await fs.writeFile(path.join(dir, 'cmd', 'api', 'main.go'), `package main
430
-
431
- import (
432
- \t"log"
433
- \t"log/slog"
434
- \t"net/http"
435
- \t"os"
436
-
437
- \t"${moduleName}/internal/handlers"
438
- \t"${moduleName}/internal/middleware"
439
- )
440
-
441
- func main() {
442
- \tlogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
443
- \tslog.SetDefault(logger)
444
-
445
- \tmux := http.NewServeMux()
446
-
447
- \tmux.HandleFunc("GET /healthz", handlers.Health)
448
-
449
- \t// Example resource — replace with real routes per BLUEPRINT.md.
450
- \tmux.HandleFunc("GET /api/v1/", handlers.RootV1)
451
-
452
- \thandler := middleware.Recover(middleware.Logger(mux))
453
-
454
- \tport := os.Getenv("PORT")
455
- \tif port == "" {
456
- \t\tport = "8080"
457
- \t}
458
- \tslog.Info("server starting", "addr", ":"+port)
459
- \tif err := http.ListenAndServe(":"+port, handler); err != nil {
460
- \t\tlog.Fatal(err)
461
- \t}
462
- }
429
+ await fs.writeFile(path.join(dir, 'cmd', 'api', 'main.go'), `package main
430
+
431
+ import (
432
+ \t"log"
433
+ \t"log/slog"
434
+ \t"net/http"
435
+ \t"os"
436
+
437
+ \t"${moduleName}/internal/handlers"
438
+ \t"${moduleName}/internal/middleware"
439
+ )
440
+
441
+ func main() {
442
+ \tlogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
443
+ \tslog.SetDefault(logger)
444
+
445
+ \tmux := http.NewServeMux()
446
+
447
+ \tmux.HandleFunc("GET /healthz", handlers.Health)
448
+
449
+ \t// Example resource — replace with real routes per BLUEPRINT.md.
450
+ \tmux.HandleFunc("GET /api/v1/", handlers.RootV1)
451
+
452
+ \thandler := middleware.Recover(middleware.Logger(mux))
453
+
454
+ \tport := os.Getenv("PORT")
455
+ \tif port == "" {
456
+ \t\tport = "8080"
457
+ \t}
458
+ \tslog.Info("server starting", "addr", ":"+port)
459
+ \tif err := http.ListenAndServe(":"+port, handler); err != nil {
460
+ \t\tlog.Fatal(err)
461
+ \t}
462
+ }
463
463
  `);
464
464
  // internal/handlers/health.go
465
- await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health.go'), `package handlers
466
-
467
- import (
468
- \t"encoding/json"
469
- \t"net/http"
470
- )
471
-
472
- // Health returns 200 with a small JSON status payload.
473
- func Health(w http.ResponseWriter, r *http.Request) {
474
- \twriteJSON(w, http.StatusOK, map[string]string{"status": "ok"})
475
- }
476
-
477
- // RootV1 is a placeholder for the v1 root handler — replace per BLUEPRINT.
478
- func RootV1(w http.ResponseWriter, r *http.Request) {
479
- \twriteJSON(w, http.StatusOK, map[string]string{"message": "API v1"})
480
- }
481
-
482
- func writeJSON(w http.ResponseWriter, status int, body any) {
483
- \tw.Header().Set("Content-Type", "application/json")
484
- \tw.WriteHeader(status)
485
- \t_ = json.NewEncoder(w).Encode(body)
486
- }
465
+ await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health.go'), `package handlers
466
+
467
+ import (
468
+ \t"encoding/json"
469
+ \t"net/http"
470
+ )
471
+
472
+ // Health returns 200 with a small JSON status payload.
473
+ func Health(w http.ResponseWriter, r *http.Request) {
474
+ \twriteJSON(w, http.StatusOK, map[string]string{"status": "ok"})
475
+ }
476
+
477
+ // RootV1 is a placeholder for the v1 root handler — replace per BLUEPRINT.
478
+ func RootV1(w http.ResponseWriter, r *http.Request) {
479
+ \twriteJSON(w, http.StatusOK, map[string]string{"message": "API v1"})
480
+ }
481
+
482
+ func writeJSON(w http.ResponseWriter, status int, body any) {
483
+ \tw.Header().Set("Content-Type", "application/json")
484
+ \tw.WriteHeader(status)
485
+ \t_ = json.NewEncoder(w).Encode(body)
486
+ }
487
487
  `);
488
488
  // internal/handlers/health_test.go — uses net/http/httptest from stdlib.
489
- await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health_test.go'), `package handlers
490
-
491
- import (
492
- \t"encoding/json"
493
- \t"net/http"
494
- \t"net/http/httptest"
495
- \t"testing"
496
- )
497
-
498
- func TestHealth(t *testing.T) {
499
- \treq := httptest.NewRequest(http.MethodGet, "/healthz", nil)
500
- \trec := httptest.NewRecorder()
501
-
502
- \tHealth(rec, req)
503
-
504
- \tif rec.Code != http.StatusOK {
505
- \t\tt.Fatalf("expected 200, got %d", rec.Code)
506
- \t}
507
-
508
- \tvar body map[string]string
509
- \tif err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil {
510
- \t\tt.Fatalf("invalid JSON: %v", err)
511
- \t}
512
- \tif body["status"] != "ok" {
513
- \t\tt.Fatalf("expected status=ok, got %q", body["status"])
514
- \t}
515
- }
489
+ await fs.writeFile(path.join(dir, 'internal', 'handlers', 'health_test.go'), `package handlers
490
+
491
+ import (
492
+ \t"encoding/json"
493
+ \t"net/http"
494
+ \t"net/http/httptest"
495
+ \t"testing"
496
+ )
497
+
498
+ func TestHealth(t *testing.T) {
499
+ \treq := httptest.NewRequest(http.MethodGet, "/healthz", nil)
500
+ \trec := httptest.NewRecorder()
501
+
502
+ \tHealth(rec, req)
503
+
504
+ \tif rec.Code != http.StatusOK {
505
+ \t\tt.Fatalf("expected 200, got %d", rec.Code)
506
+ \t}
507
+
508
+ \tvar body map[string]string
509
+ \tif err := json.Unmarshal(rec.Body.Bytes(), &body); err != nil {
510
+ \t\tt.Fatalf("invalid JSON: %v", err)
511
+ \t}
512
+ \tif body["status"] != "ok" {
513
+ \t\tt.Fatalf("expected status=ok, got %q", body["status"])
514
+ \t}
515
+ }
516
516
  `);
517
517
  // internal/middleware/logger.go
518
- await fs.writeFile(path.join(dir, 'internal', 'middleware', 'logger.go'), `package middleware
519
-
520
- import (
521
- \t"log/slog"
522
- \t"net/http"
523
- \t"time"
524
- )
525
-
526
- // Logger emits a structured log line per request: method, path, status, duration.
527
- func Logger(next http.Handler) http.Handler {
528
- \treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
529
- \t\tstart := time.Now()
530
- \t\tsr := &statusRecorder{ResponseWriter: w, status: http.StatusOK}
531
- \t\tnext.ServeHTTP(sr, r)
532
- \t\tslog.Info("http",
533
- \t\t\t"method", r.Method,
534
- \t\t\t"path", r.URL.Path,
535
- \t\t\t"status", sr.status,
536
- \t\t\t"duration_ms", time.Since(start).Milliseconds(),
537
- \t\t)
538
- \t})
539
- }
540
-
541
- type statusRecorder struct {
542
- \thttp.ResponseWriter
543
- \tstatus int
544
- }
545
-
546
- func (s *statusRecorder) WriteHeader(code int) {
547
- \ts.status = code
548
- \ts.ResponseWriter.WriteHeader(code)
549
- }
518
+ await fs.writeFile(path.join(dir, 'internal', 'middleware', 'logger.go'), `package middleware
519
+
520
+ import (
521
+ \t"log/slog"
522
+ \t"net/http"
523
+ \t"time"
524
+ )
525
+
526
+ // Logger emits a structured log line per request: method, path, status, duration.
527
+ func Logger(next http.Handler) http.Handler {
528
+ \treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
529
+ \t\tstart := time.Now()
530
+ \t\tsr := &statusRecorder{ResponseWriter: w, status: http.StatusOK}
531
+ \t\tnext.ServeHTTP(sr, r)
532
+ \t\tslog.Info("http",
533
+ \t\t\t"method", r.Method,
534
+ \t\t\t"path", r.URL.Path,
535
+ \t\t\t"status", sr.status,
536
+ \t\t\t"duration_ms", time.Since(start).Milliseconds(),
537
+ \t\t)
538
+ \t})
539
+ }
540
+
541
+ type statusRecorder struct {
542
+ \thttp.ResponseWriter
543
+ \tstatus int
544
+ }
545
+
546
+ func (s *statusRecorder) WriteHeader(code int) {
547
+ \ts.status = code
548
+ \ts.ResponseWriter.WriteHeader(code)
549
+ }
550
550
  `);
551
551
  // internal/middleware/recover.go
552
- await fs.writeFile(path.join(dir, 'internal', 'middleware', 'recover.go'), `package middleware
553
-
554
- import (
555
- \t"log/slog"
556
- \t"net/http"
557
- )
558
-
559
- // Recover intercepts panics in handlers and turns them into 500 responses
560
- // instead of letting the goroutine crash the server.
561
- func Recover(next http.Handler) http.Handler {
562
- \treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
563
- \t\tdefer func() {
564
- \t\t\tif rec := recover(); rec != nil {
565
- \t\t\t\tslog.Error("panic recovered", "value", rec, "path", r.URL.Path)
566
- \t\t\t\thttp.Error(w, "internal server error", http.StatusInternalServerError)
567
- \t\t\t}
568
- \t\t}()
569
- \t\tnext.ServeHTTP(w, r)
570
- \t})
571
- }
552
+ await fs.writeFile(path.join(dir, 'internal', 'middleware', 'recover.go'), `package middleware
553
+
554
+ import (
555
+ \t"log/slog"
556
+ \t"net/http"
557
+ )
558
+
559
+ // Recover intercepts panics in handlers and turns them into 500 responses
560
+ // instead of letting the goroutine crash the server.
561
+ func Recover(next http.Handler) http.Handler {
562
+ \treturn http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
563
+ \t\tdefer func() {
564
+ \t\t\tif rec := recover(); rec != nil {
565
+ \t\t\t\tslog.Error("panic recovered", "value", rec, "path", r.URL.Path)
566
+ \t\t\t\thttp.Error(w, "internal server error", http.StatusInternalServerError)
567
+ \t\t\t}
568
+ \t\t}()
569
+ \t\tnext.ServeHTTP(w, r)
570
+ \t})
571
+ }
572
572
  `);
573
573
  await go.run(['mod', 'tidy']);
574
574
  }
@@ -653,126 +653,126 @@ async function bootstrapLeptosFullstack(dir, projectName, mode, isMonorepo) {
653
653
  ``,
654
654
  ].join('\n'));
655
655
  // src/lib.rs — shared App component + hydrate entry for WASM
656
- await fs.writeFile(path.join(dir, 'src', 'lib.rs'), `pub mod app;
657
-
658
- #[cfg(feature = "hydrate")]
659
- #[wasm_bindgen::prelude::wasm_bindgen]
660
- pub fn hydrate() {
661
- use app::App;
662
- console_error_panic_hook::set_once();
663
- leptos::mount::hydrate_body(App);
664
- }
656
+ await fs.writeFile(path.join(dir, 'src', 'lib.rs'), `pub mod app;
657
+
658
+ #[cfg(feature = "hydrate")]
659
+ #[wasm_bindgen::prelude::wasm_bindgen]
660
+ pub fn hydrate() {
661
+ use app::App;
662
+ console_error_panic_hook::set_once();
663
+ leptos::mount::hydrate_body(App);
664
+ }
665
665
  `);
666
666
  // src/app.rs — App component with basic router
667
- await fs.writeFile(path.join(dir, 'src', 'app.rs'), `use leptos::prelude::*;
668
- use leptos_meta::*;
669
- use leptos_router::{components::Router, path};
670
-
671
- pub fn shell(options: LeptosOptions) -> impl IntoView {
672
- view! {
673
- <!DOCTYPE html>
674
- <html lang="en">
675
- <head>
676
- <meta charset="UTF-8"/>
677
- <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
678
- <AutoReload options=options.clone()/>
679
- <HydrationScripts options=options.clone()/>
680
- <MetaTags/>
681
- </head>
682
- <body>
683
- <App/>
684
- </body>
685
- </html>
686
- }
687
- }
688
-
689
- #[component]
690
- pub fn App() -> impl IntoView {
691
- provide_meta_context();
692
-
693
- view! {
694
- <Title text="${projectName}"/>
695
- <Router>
696
- <main>
697
- <Routes fallback=|| view! { <p>"Not found."</p> }>
698
- <Route path=path!("/") view=HomePage/>
699
- </Routes>
700
- </main>
701
- </Router>
702
- }
703
- }
704
-
705
- #[component]
706
- fn HomePage() -> impl IntoView {
707
- let (count, set_count) = signal(0);
708
-
709
- view! {
710
- <h1>"${projectName}"</h1>
711
- <button on:click=move |_| set_count.update(|n| *n += 1)>
712
- "Count: " {count}
713
- </button>
714
- }
715
- }
667
+ await fs.writeFile(path.join(dir, 'src', 'app.rs'), `use leptos::prelude::*;
668
+ use leptos_meta::*;
669
+ use leptos_router::{components::Router, path};
670
+
671
+ pub fn shell(options: LeptosOptions) -> impl IntoView {
672
+ view! {
673
+ <!DOCTYPE html>
674
+ <html lang="en">
675
+ <head>
676
+ <meta charset="UTF-8"/>
677
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
678
+ <AutoReload options=options.clone()/>
679
+ <HydrationScripts options=options.clone()/>
680
+ <MetaTags/>
681
+ </head>
682
+ <body>
683
+ <App/>
684
+ </body>
685
+ </html>
686
+ }
687
+ }
688
+
689
+ #[component]
690
+ pub fn App() -> impl IntoView {
691
+ provide_meta_context();
692
+
693
+ view! {
694
+ <Title text="${projectName}"/>
695
+ <Router>
696
+ <main>
697
+ <Routes fallback=|| view! { <p>"Not found."</p> }>
698
+ <Route path=path!("/") view=HomePage/>
699
+ </Routes>
700
+ </main>
701
+ </Router>
702
+ }
703
+ }
704
+
705
+ #[component]
706
+ fn HomePage() -> impl IntoView {
707
+ let (count, set_count) = signal(0);
708
+
709
+ view! {
710
+ <h1>"${projectName}"</h1>
711
+ <button on:click=move |_| set_count.update(|n| *n += 1)>
712
+ "Count: " {count}
713
+ </button>
714
+ }
715
+ }
716
716
  `.replace(/\${projectName}/g, projectName));
717
717
  // src/main.rs — SSR server entry (Axum + leptos_axum)
718
- await fs.writeFile(path.join(dir, 'src', 'main.rs'), `#[cfg(feature = "ssr")]
719
- #[tokio::main]
720
- async fn main() {
721
- use axum::Router;
722
- use leptos::prelude::*;
723
- use leptos_axum::{generate_route_list, LeptosRoutes};
724
- use ${crateIdent}::app::{shell, App};
725
-
726
- let conf = get_configuration(None).unwrap();
727
- let leptos_options = conf.leptos_options;
728
- let addr = leptos_options.site_addr;
729
- let routes = generate_route_list(App);
730
-
731
- let app = Router::new()
732
- .leptos_routes(&leptos_options, routes, {
733
- let leptos_options = leptos_options.clone();
734
- move || shell(leptos_options.clone())
735
- })
736
- .fallback(leptos_axum::file_and_error_handler(shell))
737
- .with_state(leptos_options);
738
-
739
- println!("Listening on http://{}", addr);
740
- let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
741
- axum::serve(listener, app).await.unwrap();
742
- }
743
-
744
- #[cfg(not(feature = "ssr"))]
745
- pub fn main() {}
718
+ await fs.writeFile(path.join(dir, 'src', 'main.rs'), `#[cfg(feature = "ssr")]
719
+ #[tokio::main]
720
+ async fn main() {
721
+ use axum::Router;
722
+ use leptos::prelude::*;
723
+ use leptos_axum::{generate_route_list, LeptosRoutes};
724
+ use ${crateIdent}::app::{shell, App};
725
+
726
+ let conf = get_configuration(None).unwrap();
727
+ let leptos_options = conf.leptos_options;
728
+ let addr = leptos_options.site_addr;
729
+ let routes = generate_route_list(App);
730
+
731
+ let app = Router::new()
732
+ .leptos_routes(&leptos_options, routes, {
733
+ let leptos_options = leptos_options.clone();
734
+ move || shell(leptos_options.clone())
735
+ })
736
+ .fallback(leptos_axum::file_and_error_handler(shell))
737
+ .with_state(leptos_options);
738
+
739
+ println!("Listening on http://{}", addr);
740
+ let listener = tokio::net::TcpListener::bind(&addr).await.unwrap();
741
+ axum::serve(listener, app).await.unwrap();
742
+ }
743
+
744
+ #[cfg(not(feature = "ssr"))]
745
+ pub fn main() {}
746
746
  `);
747
747
  // style/main.scss
748
- await fs.writeFile(path.join(dir, 'style', 'main.scss'), `:root {
749
- font-family: system-ui, sans-serif;
750
- }
751
-
752
- body {
753
- max-width: 800px;
754
- margin: 0 auto;
755
- padding: 2rem;
756
- }
757
-
758
- h1 {
759
- color: #b7410e;
760
- }
761
-
762
- button {
763
- padding: 0.5rem 1rem;
764
- font-size: 1rem;
765
- cursor: pointer;
766
- }
748
+ await fs.writeFile(path.join(dir, 'style', 'main.scss'), `:root {
749
+ font-family: system-ui, sans-serif;
750
+ }
751
+
752
+ body {
753
+ max-width: 800px;
754
+ margin: 0 auto;
755
+ padding: 2rem;
756
+ }
757
+
758
+ h1 {
759
+ color: #b7410e;
760
+ }
761
+
762
+ button {
763
+ padding: 0.5rem 1rem;
764
+ font-size: 1rem;
765
+ cursor: pointer;
766
+ }
767
767
  `);
768
768
  // .cargo/config.toml — only needed when this crate is the workspace root.
769
769
  // In a monorepo the root Cargo workspace already has this file; writing it
770
770
  // inside the frontend/ member dir is redundant and can confuse tooling.
771
771
  if (!isMonorepo) {
772
- await fs.writeFile(path.join(dir, '.cargo', 'config.toml'), `# DARE: Do NOT add a global [build] target here.
773
- # Mixed workspaces (Leptos WASM + native crates like napi-rs or aya) will break
774
- # if cargo tries to compile all crates for the same target.
775
- # cargo-leptos manages wasm32-unknown-unknown target per-crate automatically.
772
+ await fs.writeFile(path.join(dir, '.cargo', 'config.toml'), `# DARE: Do NOT add a global [build] target here.
773
+ # Mixed workspaces (Leptos WASM + native crates like napi-rs or aya) will break
774
+ # if cargo tries to compile all crates for the same target.
775
+ # cargo-leptos manages wasm32-unknown-unknown target per-crate automatically.
776
776
  `);
777
777
  }
778
778
  await cargo.run(['fetch']);
@@ -821,77 +821,77 @@ async function bootstrapLeptosCsr(dir, projectName, mode, isMonorepo) {
821
821
  ``,
822
822
  ].join('\n'));
823
823
  // src/lib.rs — App component, mount entry for trunk
824
- await fs.writeFile(path.join(dir, 'src', 'lib.rs'), `use leptos::prelude::*;
825
-
826
- pub fn main() {
827
- console_error_panic_hook::set_once();
828
- leptos::mount::mount_to_body(App);
829
- }
830
-
831
- #[component]
832
- pub fn App() -> impl IntoView {
833
- let (count, set_count) = signal(0);
834
-
835
- view! {
836
- <main>
837
- <h1>"${projectName}"</h1>
838
- <button on:click=move |_| set_count.update(|n| *n += 1)>
839
- "Count: " {count}
840
- </button>
841
- </main>
842
- }
843
- }
824
+ await fs.writeFile(path.join(dir, 'src', 'lib.rs'), `use leptos::prelude::*;
825
+
826
+ pub fn main() {
827
+ console_error_panic_hook::set_once();
828
+ leptos::mount::mount_to_body(App);
829
+ }
830
+
831
+ #[component]
832
+ pub fn App() -> impl IntoView {
833
+ let (count, set_count) = signal(0);
834
+
835
+ view! {
836
+ <main>
837
+ <h1>"${projectName}"</h1>
838
+ <button on:click=move |_| set_count.update(|n| *n += 1)>
839
+ "Count: " {count}
840
+ </button>
841
+ </main>
842
+ }
843
+ }
844
844
  `.replace('${projectName}', projectName));
845
845
  // index.html — trunk entry point (data-trunk attributes tell trunk what to bundle)
846
- await fs.writeFile(path.join(dir, 'index.html'), `<!doctype html>
847
- <html lang="en">
848
- <head>
849
- <meta charset="UTF-8" />
850
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
851
- <title>${projectName}</title>
852
- <link data-trunk rel="scss" href="style/main.scss" />
853
- <link data-trunk rel="rust" href="Cargo.toml" data-wasm-opt="z" />
854
- </head>
855
- <body></body>
856
- </html>
846
+ await fs.writeFile(path.join(dir, 'index.html'), `<!doctype html>
847
+ <html lang="en">
848
+ <head>
849
+ <meta charset="UTF-8" />
850
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
851
+ <title>${projectName}</title>
852
+ <link data-trunk rel="scss" href="style/main.scss" />
853
+ <link data-trunk rel="rust" href="Cargo.toml" data-wasm-opt="z" />
854
+ </head>
855
+ <body></body>
856
+ </html>
857
857
  `.replace(/\${projectName}/g, projectName));
858
858
  // Trunk.toml
859
- await fs.writeFile(path.join(dir, 'Trunk.toml'), `[build]
860
- target = "index.html"
861
- dist = "dist"
862
-
863
- [watch]
864
- ignore = ["./dist"]
865
-
866
- [serve]
867
- port = 3001
868
- open = false
859
+ await fs.writeFile(path.join(dir, 'Trunk.toml'), `[build]
860
+ target = "index.html"
861
+ dist = "dist"
862
+
863
+ [watch]
864
+ ignore = ["./dist"]
865
+
866
+ [serve]
867
+ port = 3001
868
+ open = false
869
869
  `);
870
870
  // style/main.scss
871
- await fs.writeFile(path.join(dir, 'style', 'main.scss'), `:root {
872
- font-family: system-ui, sans-serif;
873
- }
874
-
875
- body {
876
- max-width: 800px;
877
- margin: 0 auto;
878
- padding: 2rem;
879
- }
880
-
881
- h1 {
882
- color: #b7410e;
883
- }
884
-
885
- button {
886
- padding: 0.5rem 1rem;
887
- font-size: 1rem;
888
- cursor: pointer;
889
- }
871
+ await fs.writeFile(path.join(dir, 'style', 'main.scss'), `:root {
872
+ font-family: system-ui, sans-serif;
873
+ }
874
+
875
+ body {
876
+ max-width: 800px;
877
+ margin: 0 auto;
878
+ padding: 2rem;
879
+ }
880
+
881
+ h1 {
882
+ color: #b7410e;
883
+ }
884
+
885
+ button {
886
+ padding: 0.5rem 1rem;
887
+ font-size: 1rem;
888
+ cursor: pointer;
889
+ }
890
890
  `);
891
891
  // .cargo/config.toml — omit when inside a Cargo workspace (root already has it)
892
892
  if (!isMonorepo) {
893
- await fs.writeFile(path.join(dir, '.cargo', 'config.toml'), `# DARE: Do NOT add a global [build] target here.
894
- # trunk manages wasm32-unknown-unknown target automatically via its own build pipeline.
893
+ await fs.writeFile(path.join(dir, '.cargo', 'config.toml'), `# DARE: Do NOT add a global [build] target here.
894
+ # trunk manages wasm32-unknown-unknown target automatically via its own build pipeline.
895
895
  `);
896
896
  }
897
897
  await cargo.run(['fetch']);