@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.
- package/LICENSE +21 -0
- package/README.md +764 -764
- package/dist/__tests__/confidence.test.js +13 -13
- package/dist/__tests__/dag-converter.test.js +56 -56
- package/dist/__tests__/mcp-server/server.test.js +3 -16
- package/dist/__tests__/mcp-server/server.test.js.map +1 -1
- package/dist/__tests__/project-generator.test.js +2 -2
- package/dist/__tests__/project-generator.test.js.map +1 -1
- package/dist/__tests__/refine.test.js +49 -49
- package/dist/__tests__/reverse-collection.test.js +6 -6
- package/dist/__tests__/review.test.js +38 -38
- package/dist/__tests__/security-hardening.test.d.ts +2 -0
- package/dist/__tests__/security-hardening.test.d.ts.map +1 -0
- package/dist/__tests__/security-hardening.test.js +101 -0
- package/dist/__tests__/security-hardening.test.js.map +1 -0
- package/dist/__tests__/validate.test.js +65 -65
- package/dist/bin/dare.js +0 -0
- package/dist/commands/__tests__/init-validation.test.d.ts +2 -0
- package/dist/commands/__tests__/init-validation.test.d.ts.map +1 -0
- package/dist/commands/__tests__/init-validation.test.js +81 -0
- package/dist/commands/__tests__/init-validation.test.js.map +1 -0
- package/dist/commands/__tests__/init.integration.spec.js +6 -4
- package/dist/commands/__tests__/init.integration.spec.js.map +1 -1
- package/dist/commands/__tests__/init.spec.d.ts +2 -0
- package/dist/commands/__tests__/init.spec.d.ts.map +1 -0
- package/dist/commands/__tests__/init.spec.js +88 -0
- package/dist/commands/__tests__/init.spec.js.map +1 -0
- package/dist/commands/blueprint.js +122 -122
- package/dist/commands/design.js +20 -20
- package/dist/commands/init-validation.d.ts +22 -0
- package/dist/commands/init-validation.d.ts.map +1 -0
- package/dist/commands/init-validation.js +54 -0
- package/dist/commands/init-validation.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +26 -10
- package/dist/commands/init.js.map +1 -1
- package/dist/graphrag/graph-rag.js +24 -24
- package/dist/mcp-server/__tests__/auth.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/auth.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/auth.test.js +72 -0
- package/dist/mcp-server/__tests__/auth.test.js.map +1 -0
- package/dist/mcp-server/__tests__/boot-config.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/boot-config.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/boot-config.test.js +29 -0
- package/dist/mcp-server/__tests__/boot-config.test.js.map +1 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.js +66 -0
- package/dist/mcp-server/__tests__/error-sanitize.test.js.map +1 -0
- package/dist/mcp-server/__tests__/path-confinement.test.d.ts +2 -0
- package/dist/mcp-server/__tests__/path-confinement.test.d.ts.map +1 -0
- package/dist/mcp-server/__tests__/path-confinement.test.js +135 -0
- package/dist/mcp-server/__tests__/path-confinement.test.js.map +1 -0
- package/dist/mcp-server/bin/server.js +18 -6
- package/dist/mcp-server/bin/server.js.map +1 -1
- package/dist/mcp-server/boot-config.d.ts +6 -0
- package/dist/mcp-server/boot-config.d.ts.map +1 -0
- package/dist/mcp-server/boot-config.js +17 -0
- package/dist/mcp-server/boot-config.js.map +1 -0
- package/dist/mcp-server/middleware/auth.d.ts +10 -0
- package/dist/mcp-server/middleware/auth.d.ts.map +1 -0
- package/dist/mcp-server/middleware/auth.js +44 -0
- package/dist/mcp-server/middleware/auth.js.map +1 -0
- package/dist/mcp-server/middleware/cors.d.ts +6 -0
- package/dist/mcp-server/middleware/cors.d.ts.map +1 -0
- package/dist/mcp-server/middleware/cors.js +30 -0
- package/dist/mcp-server/middleware/cors.js.map +1 -0
- package/dist/mcp-server/middleware/error-handler.d.ts +11 -0
- package/dist/mcp-server/middleware/error-handler.d.ts.map +1 -0
- package/dist/mcp-server/middleware/error-handler.js +14 -0
- package/dist/mcp-server/middleware/error-handler.js.map +1 -0
- package/dist/mcp-server/server.d.ts +7 -2
- package/dist/mcp-server/server.d.ts.map +1 -1
- package/dist/mcp-server/server.js +185 -105
- package/dist/mcp-server/server.js.map +1 -1
- package/dist/skills/registry-mock.json +109 -109
- package/dist/skills/tests/manifest.spec.js +20 -20
- package/dist/stacks/__tests__/dna-emitter.spec.js +6 -6
- package/dist/stacks/dna-emitter.js +69 -69
- package/dist/stacks/ruby-rails-8/scaffold.js +15 -15
- package/dist/utils/project-generator.d.ts.map +1 -1
- package/dist/utils/project-generator.js +254 -252
- package/dist/utils/project-generator.js.map +1 -1
- package/dist/utils/stack-bootstrap.js +371 -371
- package/dist/utils/templates.js +394 -394
- package/dist/verification/__tests__/anti-tamper.test.js +13 -13
- package/package.json +96 -93
- package/templates/DARE-dag-example.yaml +280 -280
- package/templates/UPDATE-MANIFEST.json +68 -68
- package/templates/backend/node-nestjs/.env.example +9 -9
- package/templates/backend/node-nestjs/nest-cli.json +8 -8
- package/templates/backend/node-nestjs/package.json +50 -50
- package/templates/backend/node-nestjs/src/app.controller.ts +12 -12
- package/templates/backend/node-nestjs/src/app.module.ts +15 -15
- package/templates/backend/node-nestjs/src/app.service.ts +8 -8
- package/templates/backend/node-nestjs/src/main.ts +24 -24
- package/templates/backend/node-nestjs/tsconfig.json +21 -21
- package/templates/backend/php-laravel/.env.example +22 -22
- package/templates/backend/php-laravel/app/Http/Controllers/HealthController.php +15 -15
- package/templates/backend/php-laravel/composer.json +40 -40
- package/templates/backend/python-fastapi/.env.example +4 -4
- package/templates/backend/python-fastapi/app/api/router.py +8 -8
- package/templates/backend/python-fastapi/app/core/config.py +20 -20
- package/templates/backend/python-fastapi/main.py +35 -35
- package/templates/backend/python-fastapi/requirements.txt +13 -13
- package/templates/backend/rust-axum/.env.example +3 -3
- package/templates/backend/rust-axum/Cargo.toml +23 -23
- package/templates/backend/rust-axum/src/errors.rs +30 -30
- package/templates/backend/rust-axum/src/main.rs +32 -32
- package/templates/backend/rust-axum/src/routes.rs +6 -6
- package/templates/frontend/leptos-csr/.cargo/config.toml +2 -2
- package/templates/frontend/leptos-csr/Cargo.toml +16 -16
- package/templates/frontend/leptos-csr/Trunk.toml +10 -10
- package/templates/frontend/leptos-csr/index.html +11 -11
- package/templates/frontend/leptos-csr/src/lib.rs +20 -20
- package/templates/frontend/leptos-csr/style/main.scss +19 -19
- package/templates/frontend/leptos-fullstack/.cargo/config.toml +4 -4
- package/templates/frontend/leptos-fullstack/Cargo.toml +56 -56
- package/templates/frontend/leptos-fullstack/src/app.rs +49 -49
- package/templates/frontend/leptos-fullstack/src/lib.rs +9 -9
- package/templates/frontend/leptos-fullstack/src/main.rs +29 -29
- package/templates/frontend/leptos-fullstack/style/main.scss +19 -19
- package/templates/frontend/react/index.html +12 -12
- package/templates/frontend/react/package.json +35 -35
- package/templates/frontend/react/src/App.tsx +25 -25
- package/templates/frontend/react/src/main.tsx +9 -9
- package/templates/frontend/vue/package.json +32 -32
- package/templates/frontend/vue/src/App.vue +7 -7
- package/templates/frontend/vue/src/main.ts +10 -10
- package/templates/frontend/vue/src/router/index.ts +14 -14
- package/templates/frontend/vue/src/views/HomeView.vue +6 -6
- package/templates/hooks/pre-commit-dare-validate +24 -24
- package/templates/ide/antigravity/.agents/skills/dare-ax/SKILL.md +152 -152
- package/templates/ide/antigravity/.agents/skills/dare-bench/SKILL.md +21 -21
- package/templates/ide/antigravity/.agents/skills/dare-blueprint/SKILL.md +368 -368
- package/templates/ide/antigravity/.agents/skills/dare-bootstrap/SKILL.md +32 -32
- package/templates/ide/antigravity/.agents/skills/dare-bugfix-design/SKILL.md +76 -76
- package/templates/ide/antigravity/.agents/skills/dare-dag/SKILL.md +32 -32
- package/templates/ide/antigravity/.agents/skills/dare-dag-build/SKILL.md +154 -154
- package/templates/ide/antigravity/.agents/skills/dare-dag-run/SKILL.md +130 -130
- package/templates/ide/antigravity/.agents/skills/dare-dag-runner/SKILL.md +203 -203
- package/templates/ide/antigravity/.agents/skills/dare-design/SKILL.md +180 -180
- package/templates/ide/antigravity/.agents/skills/dare-discover/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-dna/SKILL.md +63 -63
- package/templates/ide/antigravity/.agents/skills/dare-docker/SKILL.md +315 -315
- package/templates/ide/antigravity/.agents/skills/dare-execute/SKILL.md +264 -264
- package/templates/ide/antigravity/.agents/skills/dare-feature-design/SKILL.md +74 -74
- package/templates/ide/antigravity/.agents/skills/dare-frontend-design/SKILL.md +192 -192
- package/templates/ide/antigravity/.agents/skills/dare-graph/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-info/SKILL.md +31 -31
- package/templates/ide/antigravity/.agents/skills/dare-init/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-laravel-api/SKILL.md +337 -337
- package/templates/ide/antigravity/.agents/skills/dare-layered-design/SKILL.md +166 -166
- package/templates/ide/antigravity/.agents/skills/dare-llm-integration/SKILL.md +217 -217
- package/templates/ide/antigravity/.agents/skills/dare-migrate/SKILL.md +61 -61
- package/templates/ide/antigravity/.agents/skills/dare-quality-telemetry/SKILL.md +187 -187
- package/templates/ide/antigravity/.agents/skills/dare-realtime/SKILL.md +217 -217
- package/templates/ide/antigravity/.agents/skills/dare-refine/SKILL.md +114 -114
- package/templates/ide/antigravity/.agents/skills/dare-reverse/SKILL.md +108 -108
- package/templates/ide/antigravity/.agents/skills/dare-review/SKILL.md +111 -111
- package/templates/ide/antigravity/.agents/skills/dare-rust-leptos/SKILL.md +263 -263
- package/templates/ide/antigravity/.agents/skills/dare-rust-workspace/SKILL.md +275 -275
- package/templates/ide/antigravity/.agents/skills/dare-security/SKILL.md +274 -274
- package/templates/ide/antigravity/.agents/skills/dare-skill/SKILL.md +35 -35
- package/templates/ide/antigravity/.agents/skills/dare-tasks/SKILL.md +265 -265
- package/templates/ide/antigravity/.agents/skills/dare-telemetry/SKILL.md +188 -188
- package/templates/ide/antigravity/.agents/skills/dare-update/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-validate/SKILL.md +33 -33
- package/templates/ide/antigravity/.agents/skills/dare-welcome/SKILL.md +30 -30
- package/templates/ide/antigravity/.agents/skills/skill-fastapi-api/SKILL.md +343 -343
- package/templates/ide/antigravity/.agents/skills/skill-go-gin-api/SKILL.md +377 -377
- package/templates/ide/antigravity/.agents/skills/skill-mcp-server/SKILL.md +382 -382
- package/templates/ide/antigravity/.agents/skills/skill-nestjs-api/SKILL.md +326 -326
- package/templates/ide/antigravity/.agents/skills/skill-rails-api/SKILL.md +393 -393
- package/templates/ide/antigravity/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/antigravity/templates/DESIGN-template.md +129 -129
- package/templates/ide/antigravity/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/antigravity/templates/TASKS-template.md +26 -26
- package/templates/ide/antigravity/templates/TELEMETRY-template.md +125 -125
- package/templates/ide/claude/.claude/commands/dare-ax.md +131 -131
- package/templates/ide/claude/.claude/commands/dare-bench.md +18 -18
- package/templates/ide/claude/.claude/commands/dare-blueprint.md +134 -134
- package/templates/ide/claude/.claude/commands/dare-bootstrap.md +27 -27
- package/templates/ide/claude/.claude/commands/dare-bugfix-design.md +119 -119
- package/templates/ide/claude/.claude/commands/dare-dag-build.md +151 -151
- package/templates/ide/claude/.claude/commands/dare-dag-run.md +109 -109
- package/templates/ide/claude/.claude/commands/dare-dag-runner.md +117 -117
- package/templates/ide/claude/.claude/commands/dare-dag-viz.md +197 -197
- package/templates/ide/claude/.claude/commands/dare-dag.md +27 -27
- package/templates/ide/claude/.claude/commands/dare-design.md +69 -69
- package/templates/ide/claude/.claude/commands/dare-discover.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-dna.md +75 -75
- package/templates/ide/claude/.claude/commands/dare-docker.md +207 -207
- package/templates/ide/claude/.claude/commands/dare-execute.md +152 -152
- package/templates/ide/claude/.claude/commands/dare-feature-design.md +147 -147
- package/templates/ide/claude/.claude/commands/dare-frontend-design.md +149 -149
- package/templates/ide/claude/.claude/commands/dare-graph.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-info.md +26 -26
- package/templates/ide/claude/.claude/commands/dare-init.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-laravel-api.md +211 -211
- package/templates/ide/claude/.claude/commands/dare-layered-design.md +124 -124
- package/templates/ide/claude/.claude/commands/dare-llm-integration.md +148 -148
- package/templates/ide/claude/.claude/commands/dare-migrate.md +72 -72
- package/templates/ide/claude/.claude/commands/dare-quality-telemetry.md +166 -166
- package/templates/ide/claude/.claude/commands/dare-realtime.md +159 -159
- package/templates/ide/claude/.claude/commands/dare-refine.md +145 -145
- package/templates/ide/claude/.claude/commands/dare-reverse.md +139 -139
- package/templates/ide/claude/.claude/commands/dare-review.md +113 -113
- package/templates/ide/claude/.claude/commands/dare-rust-leptos.md +269 -269
- package/templates/ide/claude/.claude/commands/dare-rust-workspace.md +209 -209
- package/templates/ide/claude/.claude/commands/dare-security.md +232 -232
- package/templates/ide/claude/.claude/commands/dare-skill.md +30 -30
- package/templates/ide/claude/.claude/commands/dare-tasks.md +70 -70
- package/templates/ide/claude/.claude/commands/dare-telemetry.md +132 -132
- package/templates/ide/claude/.claude/commands/dare-update.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-validate.md +28 -28
- package/templates/ide/claude/.claude/commands/dare-welcome.md +25 -25
- package/templates/ide/claude/.claude/commands/skill-fastapi-api.md +205 -205
- package/templates/ide/claude/.claude/commands/skill-go-gin-api.md +232 -232
- package/templates/ide/claude/.claude/commands/skill-mcp-server.md +228 -228
- package/templates/ide/claude/.claude/commands/skill-nestjs-api.md +210 -210
- package/templates/ide/claude/.claude/commands/skill-rails-api.md +236 -236
- package/templates/ide/claude/.claude/settings.example.json +35 -35
- package/templates/ide/claude/CLAUDE.md +146 -146
- package/templates/ide/claude/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/claude/templates/DESIGN-template.md +129 -129
- package/templates/ide/claude/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/claude/templates/TASKS-template.md +26 -26
- package/templates/ide/claude/templates/TELEMETRY-template.md +125 -125
- package/templates/ide/cursor/.cursor/commands/dare-bench.md +18 -18
- package/templates/ide/cursor/.cursor/commands/dare-blueprint.md +86 -86
- package/templates/ide/cursor/.cursor/commands/dare-bootstrap.md +27 -27
- package/templates/ide/cursor/.cursor/commands/dare-bugfix-design.md +64 -64
- package/templates/ide/cursor/.cursor/commands/dare-dag-run.md +110 -110
- package/templates/ide/cursor/.cursor/commands/dare-dag-viz.md +139 -139
- package/templates/ide/cursor/.cursor/commands/dare-dag.md +27 -27
- package/templates/ide/cursor/.cursor/commands/dare-design.md +35 -35
- package/templates/ide/cursor/.cursor/commands/dare-discover.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-dna.md +75 -75
- package/templates/ide/cursor/.cursor/commands/dare-docker-compose.md +18 -18
- package/templates/ide/cursor/.cursor/commands/dare-dockerfile.md +17 -17
- package/templates/ide/cursor/.cursor/commands/dare-execute.md +19 -19
- package/templates/ide/cursor/.cursor/commands/dare-feature-design.md +64 -64
- package/templates/ide/cursor/.cursor/commands/dare-graph.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-info.md +26 -26
- package/templates/ide/cursor/.cursor/commands/dare-init.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-migrate.md +72 -72
- package/templates/ide/cursor/.cursor/commands/dare-refine.md +107 -107
- package/templates/ide/cursor/.cursor/commands/dare-reverse.md +139 -139
- package/templates/ide/cursor/.cursor/commands/dare-review.md +91 -91
- package/templates/ide/cursor/.cursor/commands/dare-skill.md +30 -30
- package/templates/ide/cursor/.cursor/commands/dare-tasks.md +184 -184
- package/templates/ide/cursor/.cursor/commands/dare-telemetry.md +42 -42
- package/templates/ide/cursor/.cursor/commands/dare-update.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-validate.md +28 -28
- package/templates/ide/cursor/.cursor/commands/dare-welcome.md +25 -25
- package/templates/ide/cursor/.cursor/rules/skill-ax.mdc +263 -263
- package/templates/ide/cursor/.cursor/rules/skill-bugfix-design.mdc +51 -51
- package/templates/ide/cursor/.cursor/rules/skill-dag-build.mdc +173 -173
- package/templates/ide/cursor/.cursor/rules/skill-dag-run.mdc +134 -134
- package/templates/ide/cursor/.cursor/rules/skill-dag-runner.mdc +221 -221
- package/templates/ide/cursor/.cursor/rules/skill-dna.mdc +63 -63
- package/templates/ide/cursor/.cursor/rules/skill-docker.mdc +33 -33
- package/templates/ide/cursor/.cursor/rules/skill-fastapi-api.mdc +352 -352
- package/templates/ide/cursor/.cursor/rules/skill-feature-design.mdc +43 -43
- package/templates/ide/cursor/.cursor/rules/skill-frontend-design.mdc +244 -244
- package/templates/ide/cursor/.cursor/rules/skill-go-gin-api.mdc +371 -371
- package/templates/ide/cursor/.cursor/rules/skill-laravel-api.mdc +44 -44
- package/templates/ide/cursor/.cursor/rules/skill-layered-design.mdc +266 -266
- package/templates/ide/cursor/.cursor/rules/skill-llm-integration.mdc +295 -295
- package/templates/ide/cursor/.cursor/rules/skill-mcp-server.mdc +367 -367
- package/templates/ide/cursor/.cursor/rules/skill-migrate.mdc +58 -58
- package/templates/ide/cursor/.cursor/rules/skill-nestjs-api.mdc +346 -346
- package/templates/ide/cursor/.cursor/rules/skill-quality-telemetry.mdc +248 -248
- package/templates/ide/cursor/.cursor/rules/skill-rails-api.mdc +400 -400
- package/templates/ide/cursor/.cursor/rules/skill-realtime.mdc +262 -262
- package/templates/ide/cursor/.cursor/rules/skill-reverse.mdc +107 -107
- package/templates/ide/cursor/.cursor/rules/skill-rust-leptos.mdc +281 -281
- package/templates/ide/cursor/.cursor/rules/skill-rust-workspace.mdc +312 -312
- package/templates/ide/cursor/.cursor/rules/skill-security.mdc +245 -245
- package/templates/ide/cursor/.cursor/rules/skill-telemetry.mdc +156 -156
- package/templates/ide/cursor/templates/BLUEPRINT-template.md +193 -193
- package/templates/ide/cursor/templates/DESIGN-template.md +129 -129
- package/templates/ide/cursor/templates/TASK-SPEC-template.md +141 -141
- package/templates/ide/cursor/templates/TASKS-template.md +26 -26
- package/templates/ide/cursor/templates/TELEMETRY-template.md +125 -125
- package/templates/shared/docker-compose.yml +41 -41
- package/templates/stacks/go-gin/.dare/skills.yml +11 -11
- package/templates/stacks/go-gin/.env.example +24 -24
- package/templates/stacks/go-gin/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/go-gin/README.md.tpl +38 -38
- package/templates/stacks/go-gin/cmd/server/main.go.tpl +78 -78
- package/templates/stacks/go-gin/db/migrations/0001_create_users.down.sql +2 -2
- package/templates/stacks/go-gin/db/migrations/0001_create_users.up.sql +12 -12
- package/templates/stacks/go-gin/db/queries/users.sql +23 -23
- package/templates/stacks/go-gin/gitignore +7 -7
- package/templates/stacks/go-gin/go.mod.tpl +17 -17
- package/templates/stacks/go-gin/internal/config/config.go +41 -41
- package/templates/stacks/go-gin/internal/db/postgres.go.tpl +25 -25
- package/templates/stacks/go-gin/internal/handler/auth_handler.go.tpl +72 -72
- package/templates/stacks/go-gin/internal/handler/users_handler.go.tpl +72 -72
- package/templates/stacks/go-gin/internal/handler/ws_handler.go +37 -37
- package/templates/stacks/go-gin/internal/llm/dummy.go +14 -14
- package/templates/stacks/go-gin/internal/llm/provider.go +8 -8
- package/templates/stacks/go-gin/internal/middleware/jwt.go.tpl +58 -58
- package/templates/stacks/go-gin/internal/middleware/rate_limit.go +55 -55
- package/templates/stacks/go-gin/internal/model/user.go +17 -17
- package/templates/stacks/go-gin/internal/repository/users_repository.go.tpl +79 -79
- package/templates/stacks/go-gin/internal/service/auth_service.go.tpl +55 -55
- package/templates/stacks/go-gin/internal/service/users_service.go.tpl +53 -53
- package/templates/stacks/go-gin/llms.txt.tpl +54 -54
- package/templates/stacks/go-gin/openapi.json.tpl +46 -46
- package/templates/stacks/go-gin/sqlc.yaml +14 -14
- package/templates/stacks/go-gin/tests/smoke_test.go.tpl +22 -22
- package/templates/stacks/go-stdlib/.dare/skills.yml +11 -11
- package/templates/stacks/go-stdlib/.env.example +24 -24
- package/templates/stacks/go-stdlib/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/go-stdlib/README.md.tpl +41 -41
- package/templates/stacks/go-stdlib/cmd/server/main.go.tpl +82 -82
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.down.sql +2 -2
- package/templates/stacks/go-stdlib/db/migrations/0001_create_users.up.sql +12 -12
- package/templates/stacks/go-stdlib/db/queries/users.sql +23 -23
- package/templates/stacks/go-stdlib/gitignore +6 -6
- package/templates/stacks/go-stdlib/go.mod.tpl +15 -15
- package/templates/stacks/go-stdlib/internal/config/config.go +41 -41
- package/templates/stacks/go-stdlib/internal/db/postgres.go.tpl +24 -24
- package/templates/stacks/go-stdlib/internal/handler/auth_handler.go.tpl +71 -71
- package/templates/stacks/go-stdlib/internal/handler/users_handler.go.tpl +84 -84
- package/templates/stacks/go-stdlib/internal/handler/ws_handler.go +36 -36
- package/templates/stacks/go-stdlib/internal/httpx/json.go +32 -32
- package/templates/stacks/go-stdlib/internal/llm/dummy.go +14 -14
- package/templates/stacks/go-stdlib/internal/llm/provider.go +8 -8
- package/templates/stacks/go-stdlib/internal/middleware/chain.go +21 -21
- package/templates/stacks/go-stdlib/internal/middleware/cors.go +27 -27
- package/templates/stacks/go-stdlib/internal/middleware/jwt.go.tpl +51 -51
- package/templates/stacks/go-stdlib/internal/middleware/rate_limit.go +81 -81
- package/templates/stacks/go-stdlib/internal/model/user.go +17 -17
- package/templates/stacks/go-stdlib/internal/repository/users_repository.go.tpl +75 -75
- package/templates/stacks/go-stdlib/internal/service/auth_service.go.tpl +55 -55
- package/templates/stacks/go-stdlib/internal/service/users_service.go.tpl +53 -53
- package/templates/stacks/go-stdlib/llms.txt.tpl +60 -60
- package/templates/stacks/go-stdlib/openapi.json.tpl +46 -46
- package/templates/stacks/go-stdlib/sqlc.yaml +14 -14
- package/templates/stacks/go-stdlib/tests/smoke_test.go.tpl +45 -45
- package/templates/stacks/mcp-go/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-go/.env.example +14 -14
- package/templates/stacks/mcp-go/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/mcp-go/README.md.tpl +50 -50
- package/templates/stacks/mcp-go/cmd/server/main.go.tpl +62 -62
- package/templates/stacks/mcp-go/gitignore +6 -6
- package/templates/stacks/mcp-go/go.mod.tpl +9 -9
- package/templates/stacks/mcp-go/internal/prompts/summarize.go +9 -9
- package/templates/stacks/mcp-go/internal/server/server.go.tpl +80 -80
- package/templates/stacks/mcp-go/internal/tools/echo.go +15 -15
- package/templates/stacks/mcp-go/internal/transports/http.go.tpl +21 -21
- package/templates/stacks/mcp-go/internal/transports/sse.go.tpl +17 -17
- package/templates/stacks/mcp-go/internal/transports/stdio.go.tpl +14 -14
- package/templates/stacks/mcp-go/llms.txt.tpl +60 -60
- package/templates/stacks/mcp-go/openapi.json.tpl +31 -31
- package/templates/stacks/mcp-go/tests/echo_test.go.tpl +37 -37
- package/templates/stacks/mcp-node-ts/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-node-ts/.env.example +16 -16
- package/templates/stacks/mcp-node-ts/.github/workflows/dare-ci.yml +54 -54
- package/templates/stacks/mcp-node-ts/README.md.hbs +49 -49
- package/templates/stacks/mcp-node-ts/gitignore +7 -7
- package/templates/stacks/mcp-node-ts/llms.txt.hbs +61 -61
- package/templates/stacks/mcp-node-ts/openapi.json.hbs +39 -39
- package/templates/stacks/mcp-node-ts/package.json.hbs +35 -35
- package/templates/stacks/mcp-node-ts/src/cli.ts.hbs +71 -71
- package/templates/stacks/mcp-node-ts/src/prompts/index.ts +36 -36
- package/templates/stacks/mcp-node-ts/src/server.ts.hbs +45 -45
- package/templates/stacks/mcp-node-ts/src/tools/echo.ts +23 -23
- package/templates/stacks/mcp-node-ts/src/tools/index.ts +18 -18
- package/templates/stacks/mcp-node-ts/src/transports/http.ts +68 -68
- package/templates/stacks/mcp-node-ts/src/transports/sse.ts +58 -58
- package/templates/stacks/mcp-node-ts/src/transports/stdio.ts +5 -5
- package/templates/stacks/mcp-node-ts/tests/echo.test.ts +50 -50
- package/templates/stacks/mcp-node-ts/tsconfig.json +17 -17
- package/templates/stacks/mcp-python/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-python/.env.example +14 -14
- package/templates/stacks/mcp-python/.github/workflows/dare-ci.yml +42 -42
- package/templates/stacks/mcp-python/README.md.j2 +49 -49
- package/templates/stacks/mcp-python/gitignore +12 -12
- package/templates/stacks/mcp-python/llms.txt.j2 +56 -56
- package/templates/stacks/mcp-python/openapi.json.j2 +33 -33
- package/templates/stacks/mcp-python/pyproject.toml.j2 +37 -37
- package/templates/stacks/mcp-python/src/cli.py.j2 +68 -68
- package/templates/stacks/mcp-python/src/prompts/summarize.py +10 -10
- package/templates/stacks/mcp-python/src/server.py.j2 +28 -28
- package/templates/stacks/mcp-python/src/tools/echo.py +12 -12
- package/templates/stacks/mcp-python/src/transports/http.py +12 -12
- package/templates/stacks/mcp-python/src/transports/sse.py +13 -13
- package/templates/stacks/mcp-python/src/transports/stdio.py +6 -6
- package/templates/stacks/mcp-python/tests/test_echo.py +28 -28
- package/templates/stacks/mcp-rust/.dare/skills.yml +8 -8
- package/templates/stacks/mcp-rust/.env.example +14 -14
- package/templates/stacks/mcp-rust/.github/workflows/dare-ci.yml +38 -38
- package/templates/stacks/mcp-rust/Cargo.toml.tera +35 -35
- package/templates/stacks/mcp-rust/README.md.tera +50 -50
- package/templates/stacks/mcp-rust/gitignore +5 -5
- package/templates/stacks/mcp-rust/llms.txt.tera +60 -60
- package/templates/stacks/mcp-rust/openapi.json.tera +31 -31
- package/templates/stacks/mcp-rust/src/cli.rs.tera +33 -33
- package/templates/stacks/mcp-rust/src/lib.rs +6 -6
- package/templates/stacks/mcp-rust/src/main.rs.tera +30 -30
- package/templates/stacks/mcp-rust/src/prompts/mod.rs +1 -1
- package/templates/stacks/mcp-rust/src/prompts/summarize.rs +5 -5
- package/templates/stacks/mcp-rust/src/server.rs.tera +38 -38
- package/templates/stacks/mcp-rust/src/tools/echo.rs +18 -18
- package/templates/stacks/mcp-rust/src/tools/mod.rs +22 -22
- package/templates/stacks/mcp-rust/src/transports/http.rs +27 -27
- package/templates/stacks/mcp-rust/src/transports/mod.rs +3 -3
- package/templates/stacks/mcp-rust/src/transports/sse.rs +33 -33
- package/templates/stacks/mcp-rust/src/transports/stdio.rs +14 -14
- package/templates/stacks/mcp-rust/tests/echo_test.rs.tera +27 -27
- package/templates/stacks/node-nestjs/.dare/skills.yml +11 -11
- package/templates/stacks/node-nestjs/.env.example +21 -21
- package/templates/stacks/node-nestjs/.github/workflows/dare-ci.yml +54 -54
- package/templates/stacks/node-nestjs/README.md.hbs +35 -35
- package/templates/stacks/node-nestjs/gitignore +7 -7
- package/templates/stacks/node-nestjs/llms.txt.hbs +47 -47
- package/templates/stacks/node-nestjs/nest-cli.json +16 -16
- package/templates/stacks/node-nestjs/openapi.json.hbs +75 -75
- package/templates/stacks/node-nestjs/package.json.hbs +57 -57
- package/templates/stacks/node-nestjs/prisma/schema.prisma +25 -25
- package/templates/stacks/node-nestjs/prisma/seed.ts.hbs +25 -25
- package/templates/stacks/node-nestjs/src/app.module.ts +39 -39
- package/templates/stacks/node-nestjs/src/auth/auth.controller.ts +29 -29
- package/templates/stacks/node-nestjs/src/auth/auth.module.ts +25 -25
- package/templates/stacks/node-nestjs/src/auth/auth.service.ts +36 -36
- package/templates/stacks/node-nestjs/src/auth/dto/login-response.dto.ts +9 -9
- package/templates/stacks/node-nestjs/src/auth/dto/login.dto.ts +17 -17
- package/templates/stacks/node-nestjs/src/auth/jwt.strategy.ts +25 -25
- package/templates/stacks/node-nestjs/src/common/filters/problem-details.filter.ts +38 -38
- package/templates/stacks/node-nestjs/src/common/interceptors/json-response.interceptor.ts +13 -13
- package/templates/stacks/node-nestjs/src/main.ts.hbs +44 -44
- package/templates/stacks/node-nestjs/src/prisma/prisma.module.ts +9 -9
- package/templates/stacks/node-nestjs/src/prisma/prisma.service.ts +9 -9
- package/templates/stacks/node-nestjs/src/users/dto/create-user.dto.ts +22 -22
- package/templates/stacks/node-nestjs/src/users/dto/user.dto.ts +15 -15
- package/templates/stacks/node-nestjs/src/users/users.controller.ts +41 -41
- package/templates/stacks/node-nestjs/src/users/users.module.ts +11 -11
- package/templates/stacks/node-nestjs/src/users/users.repository.ts +38 -38
- package/templates/stacks/node-nestjs/src/users/users.service.ts +38 -38
- package/templates/stacks/node-nestjs/tsconfig.build.json +4 -4
- package/templates/stacks/node-nestjs/tsconfig.json +28 -28
- package/templates/stacks/php-laravel/.dare/skills.yml +11 -11
- package/templates/stacks/php-laravel/.env.example +41 -41
- package/templates/stacks/php-laravel/.github/workflows/dare-ci.yml +43 -43
- package/templates/stacks/php-laravel/README.md.hbs +36 -36
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/AuthController.php +36 -36
- package/templates/stacks/php-laravel/app/Http/Controllers/Api/UsersController.php +33 -33
- package/templates/stacks/php-laravel/app/Http/Requests/CreateUserRequest.php +26 -26
- package/templates/stacks/php-laravel/app/Http/Requests/LoginRequest.php +34 -34
- package/templates/stacks/php-laravel/app/Llm/Contracts/LlmProvider.php +12 -12
- package/templates/stacks/php-laravel/app/Llm/Providers/DummyProvider.php +13 -13
- package/templates/stacks/php-laravel/app/Llm/Providers/OpenAiProvider.php +33 -33
- package/templates/stacks/php-laravel/app/Models/User.php +44 -44
- package/templates/stacks/php-laravel/app/Repositories/UsersRepository.php +32 -32
- package/templates/stacks/php-laravel/app/Services/AuthService.php +37 -37
- package/templates/stacks/php-laravel/app/Services/UsersService.php +57 -57
- package/templates/stacks/php-laravel/artisan +12 -12
- package/templates/stacks/php-laravel/bootstrap/app.php +29 -29
- package/templates/stacks/php-laravel/bootstrap/providers.php +5 -5
- package/templates/stacks/php-laravel/composer.json.hbs +58 -58
- package/templates/stacks/php-laravel/config/l5-swagger.php +41 -41
- package/templates/stacks/php-laravel/config/reverb.php +34 -34
- package/templates/stacks/php-laravel/config/sanctum.php +15 -15
- package/templates/stacks/php-laravel/database/migrations/2026_06_01_000001_create_users_table.php +27 -27
- package/templates/stacks/php-laravel/database/seeders/DatabaseSeeder.php +21 -21
- package/templates/stacks/php-laravel/gitignore +23 -23
- package/templates/stacks/php-laravel/llms.txt.hbs +53 -53
- package/templates/stacks/php-laravel/openapi.json.hbs +43 -43
- package/templates/stacks/php-laravel/phpstan.neon +9 -9
- package/templates/stacks/php-laravel/routes/api.php +13 -13
- package/templates/stacks/php-laravel/routes/channels.php +7 -7
- package/templates/stacks/php-laravel/tests/Feature/AuthTest.php +35 -35
- package/templates/stacks/php-laravel/tests/Feature/UsersTest.php +30 -30
- package/templates/stacks/php-laravel/tests/Pest.php +5 -5
- package/templates/stacks/python-fastapi/.dare/skills.yml +11 -11
- package/templates/stacks/python-fastapi/.env.example +21 -21
- package/templates/stacks/python-fastapi/.github/workflows/dare-ci.yml +43 -43
- package/templates/stacks/python-fastapi/README.md.j2 +35 -35
- package/templates/stacks/python-fastapi/alembic/env.py +46 -46
- package/templates/stacks/python-fastapi/alembic/script.py.mako +26 -26
- package/templates/stacks/python-fastapi/alembic/versions/0001_create_users.py.j2 +37 -37
- package/templates/stacks/python-fastapi/alembic.ini.j2 +39 -39
- package/templates/stacks/python-fastapi/app/core/config.py +24 -24
- package/templates/stacks/python-fastapi/app/core/security.py +34 -34
- package/templates/stacks/python-fastapi/app/db/session.py +22 -22
- package/templates/stacks/python-fastapi/app/main.py.j2 +36 -36
- package/templates/stacks/python-fastapi/app/models/__init__.py +3 -3
- package/templates/stacks/python-fastapi/app/models/user.py +30 -30
- package/templates/stacks/python-fastapi/app/repositories/user_repository.py +34 -34
- package/templates/stacks/python-fastapi/app/routers/auth.py +37 -37
- package/templates/stacks/python-fastapi/app/routers/users.py +46 -46
- package/templates/stacks/python-fastapi/app/schemas/user.py +56 -56
- package/templates/stacks/python-fastapi/app/services/auth_service.py +22 -22
- package/templates/stacks/python-fastapi/app/services/user_service.py +31 -31
- package/templates/stacks/python-fastapi/gitignore +12 -12
- package/templates/stacks/python-fastapi/llms.txt.j2 +53 -53
- package/templates/stacks/python-fastapi/openapi.json.j2 +43 -43
- package/templates/stacks/python-fastapi/pyproject.toml.j2 +45 -45
- package/templates/stacks/python-fastapi/tests/test_auth.py +22 -22
- package/templates/stacks/ruby-rails-8/.dare/skills.yml +50 -50
- package/templates/stacks/ruby-rails-8/.env.example +20 -20
- package/templates/stacks/ruby-rails-8/.github/workflows/dare-ci.yml +112 -112
- package/templates/stacks/ruby-rails-8/Gemfile.erb +61 -61
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/channel.rb +11 -11
- package/templates/stacks/ruby-rails-8/app/channels/application_cable/connection.rb +34 -34
- package/templates/stacks/ruby-rails-8/app/channels/dare_updates_channel.rb +18 -18
- package/templates/stacks/ruby-rails-8/app/channels/user_updates_channel.rb +23 -23
- package/templates/stacks/ruby-rails-8/app/controllers/application_controller.rb +44 -44
- package/templates/stacks/ruby-rails-8/app/controllers/concerns/problem_details.rb +93 -93
- package/templates/stacks/ruby-rails-8/app/handlers/summarize_handler.rb +33 -33
- package/templates/stacks/ruby-rails-8/app/handlers/users_handler.rb +68 -68
- package/templates/stacks/ruby-rails-8/app/llm/cache/llm_cache.rb +44 -44
- package/templates/stacks/ruby-rails-8/app/llm/prompts/prompt_loader.rb +54 -54
- package/templates/stacks/ruby-rails-8/app/llm/prompts/summarize_v1.jinja2 +12 -12
- package/templates/stacks/ruby-rails-8/app/llm/providers/dummy_provider.rb +35 -35
- package/templates/stacks/ruby-rails-8/app/llm/providers/llm_provider.rb +67 -67
- package/templates/stacks/ruby-rails-8/app/llm/providers/openai_provider.rb +62 -62
- package/templates/stacks/ruby-rails-8/app/llm/rate_limit/token_bucket.rb +82 -82
- package/templates/stacks/ruby-rails-8/app/llm/validators/summarize_output_schema.json +21 -21
- package/templates/stacks/ruby-rails-8/app/llm/validators/validator.rb +52 -52
- package/templates/stacks/ruby-rails-8/app/models/user.rb +36 -36
- package/templates/stacks/ruby-rails-8/app/presenters/user_presenter.rb +48 -48
- package/templates/stacks/ruby-rails-8/app/repositories/document_repository.rb +57 -57
- package/templates/stacks/ruby-rails-8/app/repositories/user_repository.rb +73 -73
- package/templates/stacks/ruby-rails-8/app/services/create_user_service.rb +67 -67
- package/templates/stacks/ruby-rails-8/app/services/realtime_service.rb +53 -53
- package/templates/stacks/ruby-rails-8/app/services/summarize_document_service.rb +57 -57
- package/templates/stacks/ruby-rails-8/config/dare.yml +42 -42
- package/templates/stacks/ruby-rails-8/config/initializers/dare.rb +31 -31
- package/templates/stacks/ruby-rails-8/config/initializers/rack_attack.rb +64 -64
- package/templates/stacks/ruby-rails-8/config/initializers/rswag_api.rb +12 -12
- package/templates/stacks/ruby-rails-8/lib/tasks/dare.rake +159 -159
- package/templates/stacks/ruby-rails-8/llms.txt.erb +69 -69
- package/templates/stacks/ruby-rails-8/spec/api/summarize_spec.rb +56 -56
- package/templates/stacks/ruby-rails-8/spec/api/users_spec.rb +72 -72
- package/templates/stacks/ruby-rails-8/spec/channels/dare_updates_channel_spec.rb +61 -61
- package/templates/stacks/ruby-rails-8/spec/channels/user_updates_channel_spec.rb +56 -56
- package/templates/stacks/ruby-rails-8/spec/factories/users.rb +27 -27
- package/templates/stacks/ruby-rails-8/spec/handlers/users_handler_spec.rb +88 -88
- package/templates/stacks/ruby-rails-8/spec/rails_helper.rb +31 -31
- package/templates/stacks/ruby-rails-8/spec/services/create_user_service_spec.rb +88 -88
- package/templates/stacks/ruby-rails-8/spec/services/summarize_document_service_spec.rb +142 -142
- package/templates/stacks/ruby-rails-8/spec/swagger_helper.rb +73 -73
- package/templates/stacks/rust-axum/.dare/skills.yml +11 -11
- package/templates/stacks/rust-axum/.env.example +26 -26
- package/templates/stacks/rust-axum/.github/workflows/dare-ci.yml +40 -40
- package/templates/stacks/rust-axum/Cargo.toml.tera +53 -53
- package/templates/stacks/rust-axum/README.md.tera +37 -37
- package/templates/stacks/rust-axum/gitignore +5 -5
- package/templates/stacks/rust-axum/llms.txt.tera +54 -54
- package/templates/stacks/rust-axum/migrations/0001_create_users.sql +13 -13
- package/templates/stacks/rust-axum/openapi.json.tera +46 -46
- package/templates/stacks/rust-axum/src/config.rs +45 -45
- package/templates/stacks/rust-axum/src/errors.rs +48 -48
- package/templates/stacks/rust-axum/src/handlers/auth.rs +48 -48
- package/templates/stacks/rust-axum/src/handlers/mod.rs +3 -3
- package/templates/stacks/rust-axum/src/handlers/users.rs +81 -81
- package/templates/stacks/rust-axum/src/handlers/ws.rs +24 -24
- package/templates/stacks/rust-axum/src/lib.rs +19 -19
- package/templates/stacks/rust-axum/src/llm/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/llm/provider.rs +48 -48
- package/templates/stacks/rust-axum/src/main.rs.tera +64 -64
- package/templates/stacks/rust-axum/src/middleware/auth.rs +20 -20
- package/templates/stacks/rust-axum/src/middleware/mod.rs +2 -2
- package/templates/stacks/rust-axum/src/middleware/rate_limit.rs +27 -27
- package/templates/stacks/rust-axum/src/models/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/models/user.rs +13 -13
- package/templates/stacks/rust-axum/src/repositories/mod.rs +1 -1
- package/templates/stacks/rust-axum/src/repositories/user_repository.rs +62 -62
- package/templates/stacks/rust-axum/src/services/auth_service.rs +50 -50
- package/templates/stacks/rust-axum/src/services/mod.rs +2 -2
- package/templates/stacks/rust-axum/src/services/user_service.rs +53 -53
- package/templates/stacks/rust-axum/tests/integration_test.rs.tera +13 -13
- package/dist/commands/new.d.ts +0 -16
- package/dist/commands/new.d.ts.map +0 -1
- package/dist/commands/new.js +0 -104
- package/dist/commands/new.js.map +0 -1
|
@@ -11,8 +11,10 @@ function getFrameworkVersion() {
|
|
|
11
11
|
import { generateCursorRules, generateAntigravityRules, generateSharedConfig, generateMcpCursorRules, generateMcpAntigravityRules, generateClaudeCodeRules, generateMcpClaudeCodeRules, generateClaudeCommands, generateClaudeSettings, } from './templates.js';
|
|
12
12
|
import { bootstrapBackend, bootstrapFrontend, bootstrapMcp, } from './stack-bootstrap.js';
|
|
13
13
|
import { defaultVerificationConfigForProject } from '../verification/config.js';
|
|
14
|
+
import { assertWithinCwd } from '../commands/init-validation.js';
|
|
14
15
|
export async function generateProjectStructure(config) {
|
|
15
16
|
const { outputDir, name, structure, backend, frontend, ide, graphrag, mcp } = config;
|
|
17
|
+
assertWithinCwd(process.cwd(), path.resolve(outputDir));
|
|
16
18
|
await fs.ensureDir(outputDir);
|
|
17
19
|
// 0) Run the official scaffold for the chosen stack BEFORE laying down DARE
|
|
18
20
|
// artifacts. The scaffold needs an empty (or near-empty) directory.
|
|
@@ -266,94 +268,94 @@ async function generateMcpTemplate(dir, config) {
|
|
|
266
268
|
const transportSetup = mcpTransport === 'stdio'
|
|
267
269
|
? `const transport = new StdioServerTransport();\nawait server.connect(transport);`
|
|
268
270
|
: `const app = express();\napp.get('/sse', async (req, res) => {\n const transport = new SSEServerTransport('/messages', res);\n await server.connect(transport);\n});\napp.post('/messages', express.json(), (req, res) => { /* message handler */ });\napp.listen(3000, () => console.error('MCP SSE server running on :3000'));`;
|
|
269
|
-
const resourceSection = hasResources ? `
|
|
270
|
-
import {
|
|
271
|
-
ListResourcesRequestSchema,
|
|
272
|
-
ReadResourceRequestSchema,
|
|
273
|
-
} from '@modelcontextprotocol/sdk/types.js';
|
|
274
|
-
|
|
275
|
-
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
276
|
-
resources: [
|
|
277
|
-
{
|
|
278
|
-
uri: 'resource://example',
|
|
279
|
-
name: 'Example Resource',
|
|
280
|
-
description: 'An example resource',
|
|
281
|
-
mimeType: 'text/plain',
|
|
282
|
-
},
|
|
283
|
-
],
|
|
284
|
-
}));
|
|
285
|
-
|
|
286
|
-
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
287
|
-
if (request.params.uri === 'resource://example') {
|
|
288
|
-
return { contents: [{ uri: request.params.uri, mimeType: 'text/plain', text: 'Example content' }] };
|
|
289
|
-
}
|
|
290
|
-
throw new Error(\`Unknown resource: \${request.params.uri}\`);
|
|
291
|
-
});
|
|
271
|
+
const resourceSection = hasResources ? `
|
|
272
|
+
import {
|
|
273
|
+
ListResourcesRequestSchema,
|
|
274
|
+
ReadResourceRequestSchema,
|
|
275
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
276
|
+
|
|
277
|
+
server.setRequestHandler(ListResourcesRequestSchema, async () => ({
|
|
278
|
+
resources: [
|
|
279
|
+
{
|
|
280
|
+
uri: 'resource://example',
|
|
281
|
+
name: 'Example Resource',
|
|
282
|
+
description: 'An example resource',
|
|
283
|
+
mimeType: 'text/plain',
|
|
284
|
+
},
|
|
285
|
+
],
|
|
286
|
+
}));
|
|
287
|
+
|
|
288
|
+
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
|
|
289
|
+
if (request.params.uri === 'resource://example') {
|
|
290
|
+
return { contents: [{ uri: request.params.uri, mimeType: 'text/plain', text: 'Example content' }] };
|
|
291
|
+
}
|
|
292
|
+
throw new Error(\`Unknown resource: \${request.params.uri}\`);
|
|
293
|
+
});
|
|
292
294
|
` : '';
|
|
293
|
-
const promptSection = hasPrompts ? `
|
|
294
|
-
import {
|
|
295
|
-
ListPromptsRequestSchema,
|
|
296
|
-
GetPromptRequestSchema,
|
|
297
|
-
} from '@modelcontextprotocol/sdk/types.js';
|
|
298
|
-
|
|
299
|
-
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
300
|
-
prompts: [
|
|
301
|
-
{
|
|
302
|
-
name: 'example-prompt',
|
|
303
|
-
description: 'An example prompt template',
|
|
304
|
-
arguments: [{ name: 'topic', description: 'Topic to write about', required: true }],
|
|
305
|
-
},
|
|
306
|
-
],
|
|
307
|
-
}));
|
|
308
|
-
|
|
309
|
-
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
310
|
-
if (request.params.name === 'example-prompt') {
|
|
311
|
-
const topic = request.params.arguments?.topic ?? 'general';
|
|
312
|
-
return {
|
|
313
|
-
description: 'Example prompt',
|
|
314
|
-
messages: [{ role: 'user', content: { type: 'text', text: \`Write about: \${topic}\` } }],
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
throw new Error(\`Unknown prompt: \${request.params.name}\`);
|
|
318
|
-
});
|
|
295
|
+
const promptSection = hasPrompts ? `
|
|
296
|
+
import {
|
|
297
|
+
ListPromptsRequestSchema,
|
|
298
|
+
GetPromptRequestSchema,
|
|
299
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
300
|
+
|
|
301
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => ({
|
|
302
|
+
prompts: [
|
|
303
|
+
{
|
|
304
|
+
name: 'example-prompt',
|
|
305
|
+
description: 'An example prompt template',
|
|
306
|
+
arguments: [{ name: 'topic', description: 'Topic to write about', required: true }],
|
|
307
|
+
},
|
|
308
|
+
],
|
|
309
|
+
}));
|
|
310
|
+
|
|
311
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
312
|
+
if (request.params.name === 'example-prompt') {
|
|
313
|
+
const topic = request.params.arguments?.topic ?? 'general';
|
|
314
|
+
return {
|
|
315
|
+
description: 'Example prompt',
|
|
316
|
+
messages: [{ role: 'user', content: { type: 'text', text: \`Write about: \${topic}\` } }],
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
throw new Error(\`Unknown prompt: \${request.params.name}\`);
|
|
320
|
+
});
|
|
319
321
|
` : '';
|
|
320
|
-
const indexContent = `import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
321
|
-
${transportImport}
|
|
322
|
-
import {
|
|
323
|
-
CallToolRequestSchema,
|
|
324
|
-
ListToolsRequestSchema,
|
|
325
|
-
} from '@modelcontextprotocol/sdk/types.js';
|
|
326
|
-
|
|
327
|
-
const server = new Server(
|
|
328
|
-
{ name: '${config.name}', version: '0.1.0' },
|
|
329
|
-
{ capabilities: { ${capabilities.join(', ')} } }
|
|
330
|
-
);
|
|
331
|
-
|
|
332
|
-
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
333
|
-
tools: [
|
|
334
|
-
{
|
|
335
|
-
name: 'hello',
|
|
336
|
-
description: 'Says hello to a given name',
|
|
337
|
-
inputSchema: {
|
|
338
|
-
type: 'object',
|
|
339
|
-
properties: {
|
|
340
|
-
name: { type: 'string', description: 'Name to greet' },
|
|
341
|
-
},
|
|
342
|
-
required: ['name'],
|
|
343
|
-
},
|
|
344
|
-
},
|
|
345
|
-
],
|
|
346
|
-
}));
|
|
347
|
-
|
|
348
|
-
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
349
|
-
if (request.params.name === 'hello') {
|
|
350
|
-
const { name } = request.params.arguments as { name: string };
|
|
351
|
-
return { content: [{ type: 'text', text: \`Hello, \${name}!\` }] };
|
|
352
|
-
}
|
|
353
|
-
throw new Error(\`Unknown tool: \${request.params.name}\`);
|
|
354
|
-
});
|
|
355
|
-
${resourceSection}${promptSection}
|
|
356
|
-
${transportSetup}
|
|
322
|
+
const indexContent = `import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
323
|
+
${transportImport}
|
|
324
|
+
import {
|
|
325
|
+
CallToolRequestSchema,
|
|
326
|
+
ListToolsRequestSchema,
|
|
327
|
+
} from '@modelcontextprotocol/sdk/types.js';
|
|
328
|
+
|
|
329
|
+
const server = new Server(
|
|
330
|
+
{ name: '${config.name}', version: '0.1.0' },
|
|
331
|
+
{ capabilities: { ${capabilities.join(', ')} } }
|
|
332
|
+
);
|
|
333
|
+
|
|
334
|
+
server.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
335
|
+
tools: [
|
|
336
|
+
{
|
|
337
|
+
name: 'hello',
|
|
338
|
+
description: 'Says hello to a given name',
|
|
339
|
+
inputSchema: {
|
|
340
|
+
type: 'object',
|
|
341
|
+
properties: {
|
|
342
|
+
name: { type: 'string', description: 'Name to greet' },
|
|
343
|
+
},
|
|
344
|
+
required: ['name'],
|
|
345
|
+
},
|
|
346
|
+
},
|
|
347
|
+
],
|
|
348
|
+
}));
|
|
349
|
+
|
|
350
|
+
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
351
|
+
if (request.params.name === 'hello') {
|
|
352
|
+
const { name } = request.params.arguments as { name: string };
|
|
353
|
+
return { content: [{ type: 'text', text: \`Hello, \${name}!\` }] };
|
|
354
|
+
}
|
|
355
|
+
throw new Error(\`Unknown tool: \${request.params.name}\`);
|
|
356
|
+
});
|
|
357
|
+
${resourceSection}${promptSection}
|
|
358
|
+
${transportSetup}
|
|
357
359
|
`;
|
|
358
360
|
await fs.writeFile(path.join(dir, 'src', 'index.ts'), indexContent);
|
|
359
361
|
const extraDeps = mcpTransport !== 'stdio' ? { express: '^4.18.0' } : {};
|
|
@@ -399,45 +401,45 @@ ${transportSetup}
|
|
|
399
401
|
// Python MCP
|
|
400
402
|
const hasResources = mcpFeatures.includes('resources');
|
|
401
403
|
const hasPrompts = mcpFeatures.includes('prompts');
|
|
402
|
-
const resourceSection = hasResources ? `
|
|
403
|
-
|
|
404
|
-
@mcp.resource("resource://example")
|
|
405
|
-
def example_resource() -> str:
|
|
406
|
-
"""An example resource."""
|
|
407
|
-
return "Example content"
|
|
404
|
+
const resourceSection = hasResources ? `
|
|
405
|
+
|
|
406
|
+
@mcp.resource("resource://example")
|
|
407
|
+
def example_resource() -> str:
|
|
408
|
+
"""An example resource."""
|
|
409
|
+
return "Example content"
|
|
408
410
|
` : '';
|
|
409
|
-
const promptSection = hasPrompts ? `
|
|
410
|
-
|
|
411
|
-
@mcp.prompt()
|
|
412
|
-
def example_prompt(topic: str) -> str:
|
|
413
|
-
"""An example prompt template."""
|
|
414
|
-
return f"Write about: {topic}"
|
|
411
|
+
const promptSection = hasPrompts ? `
|
|
412
|
+
|
|
413
|
+
@mcp.prompt()
|
|
414
|
+
def example_prompt(topic: str) -> str:
|
|
415
|
+
"""An example prompt template."""
|
|
416
|
+
return f"Write about: {topic}"
|
|
415
417
|
` : '';
|
|
416
418
|
const transportLine = mcpTransport === 'stdio' ? '' : '\n# For SSE transport:\n# mcp.run(transport="sse", host="0.0.0.0", port=8000)\n';
|
|
417
|
-
await fs.writeFile(path.join(dir, 'main.py'), `from mcp.server.fastmcp import FastMCP
|
|
418
|
-
|
|
419
|
-
mcp = FastMCP("${config.name}")
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
@mcp.tool()
|
|
423
|
-
def hello(name: str) -> str:
|
|
424
|
-
"""Says hello to a given name."""
|
|
425
|
-
return f"Hello, {name}!"
|
|
426
|
-
${resourceSection}${promptSection}
|
|
427
|
-
|
|
428
|
-
if __name__ == "__main__":
|
|
429
|
-
mcp.run()${transportLine}
|
|
419
|
+
await fs.writeFile(path.join(dir, 'main.py'), `from mcp.server.fastmcp import FastMCP
|
|
420
|
+
|
|
421
|
+
mcp = FastMCP("${config.name}")
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
@mcp.tool()
|
|
425
|
+
def hello(name: str) -> str:
|
|
426
|
+
"""Says hello to a given name."""
|
|
427
|
+
return f"Hello, {name}!"
|
|
428
|
+
${resourceSection}${promptSection}
|
|
429
|
+
|
|
430
|
+
if __name__ == "__main__":
|
|
431
|
+
mcp.run()${transportLine}
|
|
430
432
|
`);
|
|
431
433
|
await fs.writeFile(path.join(dir, 'requirements.txt'), `mcp>=1.0.0\n`);
|
|
432
|
-
await fs.writeFile(path.join(dir, 'pyproject.toml'), `[project]
|
|
433
|
-
name = "${config.name}"
|
|
434
|
-
version = "0.1.0"
|
|
435
|
-
requires-python = ">=3.11"
|
|
436
|
-
dependencies = ["mcp>=1.0.0"]
|
|
437
|
-
|
|
438
|
-
[build-system]
|
|
439
|
-
requires = ["hatchling"]
|
|
440
|
-
build-backend = "hatchling.build"
|
|
434
|
+
await fs.writeFile(path.join(dir, 'pyproject.toml'), `[project]
|
|
435
|
+
name = "${config.name}"
|
|
436
|
+
version = "0.1.0"
|
|
437
|
+
requires-python = ">=3.11"
|
|
438
|
+
dependencies = ["mcp>=1.0.0"]
|
|
439
|
+
|
|
440
|
+
[build-system]
|
|
441
|
+
requires = ["hatchling"]
|
|
442
|
+
build-backend = "hatchling.build"
|
|
441
443
|
`);
|
|
442
444
|
}
|
|
443
445
|
}
|
|
@@ -507,92 +509,92 @@ async function writeGraphragConfig(dir, config) {
|
|
|
507
509
|
const { graphrag } = config;
|
|
508
510
|
let content;
|
|
509
511
|
if (graphrag === 'sqlite') {
|
|
510
|
-
content = `# DARE Knowledge Graph — SQLite
|
|
511
|
-
backend: sqlite
|
|
512
|
-
|
|
513
|
-
sqlite:
|
|
514
|
-
path: .dare/graph.db
|
|
515
|
-
|
|
516
|
-
# Node types tracked in the graph
|
|
517
|
-
nodes:
|
|
518
|
-
- task
|
|
519
|
-
- file
|
|
520
|
-
- schema
|
|
521
|
-
- endpoint
|
|
522
|
-
- component
|
|
523
|
-
- entity
|
|
524
|
-
- concept
|
|
525
|
-
|
|
526
|
-
# Relationship types
|
|
527
|
-
edges:
|
|
528
|
-
- depends_on
|
|
529
|
-
- implements
|
|
530
|
-
- uses
|
|
531
|
-
- references
|
|
532
|
-
- related_to
|
|
533
|
-
- contains
|
|
534
|
-
- extends
|
|
512
|
+
content = `# DARE Knowledge Graph — SQLite
|
|
513
|
+
backend: sqlite
|
|
514
|
+
|
|
515
|
+
sqlite:
|
|
516
|
+
path: .dare/graph.db
|
|
517
|
+
|
|
518
|
+
# Node types tracked in the graph
|
|
519
|
+
nodes:
|
|
520
|
+
- task
|
|
521
|
+
- file
|
|
522
|
+
- schema
|
|
523
|
+
- endpoint
|
|
524
|
+
- component
|
|
525
|
+
- entity
|
|
526
|
+
- concept
|
|
527
|
+
|
|
528
|
+
# Relationship types
|
|
529
|
+
edges:
|
|
530
|
+
- depends_on
|
|
531
|
+
- implements
|
|
532
|
+
- uses
|
|
533
|
+
- references
|
|
534
|
+
- related_to
|
|
535
|
+
- contains
|
|
536
|
+
- extends
|
|
535
537
|
`;
|
|
536
538
|
}
|
|
537
539
|
else if (graphrag === 'neo4j') {
|
|
538
|
-
content = `# DARE Knowledge Graph — Neo4j
|
|
539
|
-
backend: neo4j
|
|
540
|
-
|
|
541
|
-
neo4j:
|
|
542
|
-
url: http://localhost:7474 # Neo4j HTTP API endpoint (not Bolt)
|
|
543
|
-
database: dare # database name
|
|
544
|
-
username: neo4j
|
|
545
|
-
password: password
|
|
546
|
-
# auth: "Bearer <token>" # alternative to username/password
|
|
547
|
-
|
|
548
|
-
# Node types tracked in the graph
|
|
549
|
-
nodes:
|
|
550
|
-
- task
|
|
551
|
-
- file
|
|
552
|
-
- schema
|
|
553
|
-
- endpoint
|
|
554
|
-
- component
|
|
555
|
-
- entity
|
|
556
|
-
- concept
|
|
557
|
-
|
|
558
|
-
# Relationship types
|
|
559
|
-
edges:
|
|
560
|
-
- depends_on
|
|
561
|
-
- implements
|
|
562
|
-
- uses
|
|
563
|
-
- references
|
|
564
|
-
- related_to
|
|
565
|
-
- contains
|
|
566
|
-
- extends
|
|
540
|
+
content = `# DARE Knowledge Graph — Neo4j
|
|
541
|
+
backend: neo4j
|
|
542
|
+
|
|
543
|
+
neo4j:
|
|
544
|
+
url: http://localhost:7474 # Neo4j HTTP API endpoint (not Bolt)
|
|
545
|
+
database: dare # database name
|
|
546
|
+
username: neo4j
|
|
547
|
+
password: password
|
|
548
|
+
# auth: "Bearer <token>" # alternative to username/password
|
|
549
|
+
|
|
550
|
+
# Node types tracked in the graph
|
|
551
|
+
nodes:
|
|
552
|
+
- task
|
|
553
|
+
- file
|
|
554
|
+
- schema
|
|
555
|
+
- endpoint
|
|
556
|
+
- component
|
|
557
|
+
- entity
|
|
558
|
+
- concept
|
|
559
|
+
|
|
560
|
+
# Relationship types
|
|
561
|
+
edges:
|
|
562
|
+
- depends_on
|
|
563
|
+
- implements
|
|
564
|
+
- uses
|
|
565
|
+
- references
|
|
566
|
+
- related_to
|
|
567
|
+
- contains
|
|
568
|
+
- extends
|
|
567
569
|
`;
|
|
568
570
|
}
|
|
569
571
|
else {
|
|
570
572
|
// json
|
|
571
|
-
content = `# DARE Knowledge Graph — JSON
|
|
572
|
-
backend: json
|
|
573
|
-
|
|
574
|
-
json:
|
|
575
|
-
path: .dare/graph.json
|
|
576
|
-
|
|
577
|
-
# Node types tracked in the graph
|
|
578
|
-
nodes:
|
|
579
|
-
- task
|
|
580
|
-
- file
|
|
581
|
-
- schema
|
|
582
|
-
- endpoint
|
|
583
|
-
- component
|
|
584
|
-
- entity
|
|
585
|
-
- concept
|
|
586
|
-
|
|
587
|
-
# Relationship types
|
|
588
|
-
edges:
|
|
589
|
-
- depends_on
|
|
590
|
-
- implements
|
|
591
|
-
- uses
|
|
592
|
-
- references
|
|
593
|
-
- related_to
|
|
594
|
-
- contains
|
|
595
|
-
- extends
|
|
573
|
+
content = `# DARE Knowledge Graph — JSON
|
|
574
|
+
backend: json
|
|
575
|
+
|
|
576
|
+
json:
|
|
577
|
+
path: .dare/graph.json
|
|
578
|
+
|
|
579
|
+
# Node types tracked in the graph
|
|
580
|
+
nodes:
|
|
581
|
+
- task
|
|
582
|
+
- file
|
|
583
|
+
- schema
|
|
584
|
+
- endpoint
|
|
585
|
+
- component
|
|
586
|
+
- entity
|
|
587
|
+
- concept
|
|
588
|
+
|
|
589
|
+
# Relationship types
|
|
590
|
+
edges:
|
|
591
|
+
- depends_on
|
|
592
|
+
- implements
|
|
593
|
+
- uses
|
|
594
|
+
- references
|
|
595
|
+
- related_to
|
|
596
|
+
- contains
|
|
597
|
+
- extends
|
|
596
598
|
`;
|
|
597
599
|
}
|
|
598
600
|
const destPath = path.join(dir, 'dare-graph.yml');
|
|
@@ -714,27 +716,27 @@ async function generateFrontendTemplate(dir, stack, projectName = 'frontend') {
|
|
|
714
716
|
}
|
|
715
717
|
function generateMcpStackSkill(language) {
|
|
716
718
|
if (language === 'python') {
|
|
717
|
-
return `---
|
|
718
|
-
description: Python MCP server development skill
|
|
719
|
-
---
|
|
720
|
-
# Python MCP Skill
|
|
721
|
-
- Use FastMCP for rapid server development
|
|
722
|
-
- Decorate tools with @mcp.tool(), resources with @mcp.resource(), prompts with @mcp.prompt()
|
|
723
|
-
- Use type hints — FastMCP derives the JSON schema automatically
|
|
724
|
-
- Test with: npx @modelcontextprotocol/inspector python main.py
|
|
725
|
-
- Use mcp.run() for stdio, mcp.run(transport="sse") for SSE
|
|
719
|
+
return `---
|
|
720
|
+
description: Python MCP server development skill
|
|
721
|
+
---
|
|
722
|
+
# Python MCP Skill
|
|
723
|
+
- Use FastMCP for rapid server development
|
|
724
|
+
- Decorate tools with @mcp.tool(), resources with @mcp.resource(), prompts with @mcp.prompt()
|
|
725
|
+
- Use type hints — FastMCP derives the JSON schema automatically
|
|
726
|
+
- Test with: npx @modelcontextprotocol/inspector python main.py
|
|
727
|
+
- Use mcp.run() for stdio, mcp.run(transport="sse") for SSE
|
|
726
728
|
`;
|
|
727
729
|
}
|
|
728
|
-
return `---
|
|
729
|
-
description: Node.js/TypeScript MCP server development skill
|
|
730
|
-
---
|
|
731
|
-
# TypeScript MCP Skill
|
|
732
|
-
- Import Server from @modelcontextprotocol/sdk/server/index.js
|
|
733
|
-
- Use StdioServerTransport for CLI tools, SSEServerTransport for web integrations
|
|
734
|
-
- Define tools with ListToolsRequestSchema + CallToolRequestSchema handlers
|
|
735
|
-
- Keep inputSchema strict — Claude uses it to call your tools correctly
|
|
736
|
-
- Test with: npm run inspect (uses @modelcontextprotocol/inspector)
|
|
737
|
-
- Build before shipping: npm run build
|
|
730
|
+
return `---
|
|
731
|
+
description: Node.js/TypeScript MCP server development skill
|
|
732
|
+
---
|
|
733
|
+
# TypeScript MCP Skill
|
|
734
|
+
- Import Server from @modelcontextprotocol/sdk/server/index.js
|
|
735
|
+
- Use StdioServerTransport for CLI tools, SSEServerTransport for web integrations
|
|
736
|
+
- Define tools with ListToolsRequestSchema + CallToolRequestSchema handlers
|
|
737
|
+
- Keep inputSchema strict — Claude uses it to call your tools correctly
|
|
738
|
+
- Test with: npm run inspect (uses @modelcontextprotocol/inspector)
|
|
739
|
+
- Build before shipping: npm run build
|
|
738
740
|
`;
|
|
739
741
|
}
|
|
740
742
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
@@ -918,9 +920,9 @@ async function createRustFullstackWorkspace(outputDir, projectName, layout, fron
|
|
|
918
920
|
].join('\n'));
|
|
919
921
|
// Root .cargo/config.toml guard
|
|
920
922
|
await fs.ensureDir(path.join(outputDir, '.cargo'));
|
|
921
|
-
await fs.writeFile(path.join(outputDir, '.cargo', 'config.toml'), `# DARE: Do NOT add a global [build] target here.
|
|
922
|
-
# This workspace mixes Leptos WASM crates with native Axum crates.
|
|
923
|
-
# A global target breaks one or the other — cargo-leptos manages wasm32 internally.
|
|
923
|
+
await fs.writeFile(path.join(outputDir, '.cargo', 'config.toml'), `# DARE: Do NOT add a global [build] target here.
|
|
924
|
+
# This workspace mixes Leptos WASM crates with native Axum crates.
|
|
925
|
+
# A global target breaks one or the other — cargo-leptos manages wasm32 internally.
|
|
924
926
|
`);
|
|
925
927
|
// Multi-crate: create core and cli scaffold crates
|
|
926
928
|
if (layout === 'multi') {
|
|
@@ -1001,38 +1003,38 @@ async function createCliCrate(outputDir, slug) {
|
|
|
1001
1003
|
}
|
|
1002
1004
|
function generateStackSkill(stack) {
|
|
1003
1005
|
const skills = {
|
|
1004
|
-
'rust-leptos': `---
|
|
1005
|
-
description: Leptos fullstack (SSR + WASM) development skill
|
|
1006
|
-
---
|
|
1007
|
-
# Leptos Fullstack Skill
|
|
1008
|
-
- Use \`#[component]\` macro for all components — no class components
|
|
1009
|
-
- State: \`signal()\` (RwSignal), \`ReadSignal\`/\`WriteSignal\` — fine-grained reactivity
|
|
1010
|
-
- Async data: \`Resource\` for fetching, never \`Effect\` that calls fetch
|
|
1011
|
-
- Mutations: \`Action\` for server calls (forms, submits)
|
|
1012
|
-
- Loading states: \`Suspense\` and \`Transition\` — never block the render
|
|
1013
|
-
- Conditionals: \`Show\`, \`For\` components — not if/for in view!
|
|
1014
|
-
- Server functions: \`#[server]\` macro — only available with \`ssr\` feature
|
|
1015
|
-
- Shared types (server + WASM): use \`#[cfg_attr(feature = "ssr", derive(sqlx::FromRow))]\`
|
|
1016
|
-
- Avoid: \`tokio::spawn\` on client (no async runtime in WASM), \`panic!\` in components, \`wasm_bindgen\` direct
|
|
1017
|
-
- Build: \`cargo leptos build\` (not \`cargo build\`)
|
|
1018
|
-
- Test: \`cargo test --workspace\` (not \`cargo leptos test\` — that doesn't exist)
|
|
1019
|
-
- Lint: \`cargo clippy --all-targets --all-features -- -D warnings && cargo fmt --check\`
|
|
1020
|
-
- Dev server: \`cargo leptos watch\` (port 3000 + hot reload on port 3001)
|
|
1006
|
+
'rust-leptos': `---
|
|
1007
|
+
description: Leptos fullstack (SSR + WASM) development skill
|
|
1008
|
+
---
|
|
1009
|
+
# Leptos Fullstack Skill
|
|
1010
|
+
- Use \`#[component]\` macro for all components — no class components
|
|
1011
|
+
- State: \`signal()\` (RwSignal), \`ReadSignal\`/\`WriteSignal\` — fine-grained reactivity
|
|
1012
|
+
- Async data: \`Resource\` for fetching, never \`Effect\` that calls fetch
|
|
1013
|
+
- Mutations: \`Action\` for server calls (forms, submits)
|
|
1014
|
+
- Loading states: \`Suspense\` and \`Transition\` — never block the render
|
|
1015
|
+
- Conditionals: \`Show\`, \`For\` components — not if/for in view!
|
|
1016
|
+
- Server functions: \`#[server]\` macro — only available with \`ssr\` feature
|
|
1017
|
+
- Shared types (server + WASM): use \`#[cfg_attr(feature = "ssr", derive(sqlx::FromRow))]\`
|
|
1018
|
+
- Avoid: \`tokio::spawn\` on client (no async runtime in WASM), \`panic!\` in components, \`wasm_bindgen\` direct
|
|
1019
|
+
- Build: \`cargo leptos build\` (not \`cargo build\`)
|
|
1020
|
+
- Test: \`cargo test --workspace\` (not \`cargo leptos test\` — that doesn't exist)
|
|
1021
|
+
- Lint: \`cargo clippy --all-targets --all-features -- -D warnings && cargo fmt --check\`
|
|
1022
|
+
- Dev server: \`cargo leptos watch\` (port 3000 + hot reload on port 3001)
|
|
1021
1023
|
`,
|
|
1022
|
-
'rust-leptos-csr': `---
|
|
1023
|
-
description: Leptos CSR (WASM + trunk) development skill
|
|
1024
|
-
---
|
|
1025
|
-
# Leptos CSR Skill
|
|
1026
|
-
- Pure client-side WASM — no server rendering, no \`#[server]\` functions
|
|
1027
|
-
- Use \`#[component]\` macro for all components
|
|
1028
|
-
- State: \`signal()\`, \`create_memo()\` for derived state
|
|
1029
|
-
- Async data: \`Resource\` — never \`Effect\` that calls fetch
|
|
1030
|
-
- Entry point: \`leptos::mount::mount_to_body(App)\` called from \`main()\`
|
|
1031
|
-
- Build tool: \`trunk build\` (NOT \`cargo leptos build\` — wrong tool for CSR)
|
|
1032
|
-
- Dev server: \`trunk serve\` (port 3001 by default, configured in Trunk.toml)
|
|
1033
|
-
- Test: \`cargo test --workspace\`
|
|
1034
|
-
- Lint: \`cargo clippy --all-targets --all-features -- -D warnings && cargo fmt --check\`
|
|
1035
|
-
- Deploy: \`trunk build --release\` produces \`dist/\` — static files, deployable to any CDN
|
|
1024
|
+
'rust-leptos-csr': `---
|
|
1025
|
+
description: Leptos CSR (WASM + trunk) development skill
|
|
1026
|
+
---
|
|
1027
|
+
# Leptos CSR Skill
|
|
1028
|
+
- Pure client-side WASM — no server rendering, no \`#[server]\` functions
|
|
1029
|
+
- Use \`#[component]\` macro for all components
|
|
1030
|
+
- State: \`signal()\`, \`create_memo()\` for derived state
|
|
1031
|
+
- Async data: \`Resource\` — never \`Effect\` that calls fetch
|
|
1032
|
+
- Entry point: \`leptos::mount::mount_to_body(App)\` called from \`main()\`
|
|
1033
|
+
- Build tool: \`trunk build\` (NOT \`cargo leptos build\` — wrong tool for CSR)
|
|
1034
|
+
- Dev server: \`trunk serve\` (port 3001 by default, configured in Trunk.toml)
|
|
1035
|
+
- Test: \`cargo test --workspace\`
|
|
1036
|
+
- Lint: \`cargo clippy --all-targets --all-features -- -D warnings && cargo fmt --check\`
|
|
1037
|
+
- Deploy: \`trunk build --release\` produces \`dist/\` — static files, deployable to any CDN
|
|
1036
1038
|
`,
|
|
1037
1039
|
'rust-axum': `---\ndescription: Rust/Axum API development skill\n---\n# Rust/Axum Skill\n- Use Axum for HTTP routing\n- Use Tokio for async runtime\n- Use SQLx for database\n- Run clippy and cargo test\n`,
|
|
1038
1040
|
'go-gin': `---\ndescription: Go/Gin API development skill\n---\n# Go + Gin Skill\n- Use Gin for HTTP routing (github.com/gin-gonic/gin)\n- Project layout: cmd/api/main.go (entrypoint), internal/handlers, internal/middleware, internal/services, internal/repository\n- Use context.Context propagation in every handler/service\n- Use struct tags for binding/validation (binding:"required" on DTOs)\n- For SQL: prefer database/sql + sqlx, parametrize ALL queries, no string concat\n- Errors: return wrapped errors (fmt.Errorf("...: %w", err)), not panics\n- Tests: use net/http/httptest + table-driven tests; place *_test.go alongside the package\n- Ralph Loop: \`go build ./...\`, \`go test ./...\`, \`go vet ./...\`\n`,
|