specweave 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INSTALL.md +848 -0
- package/LICENSE +21 -0
- package/README.md +675 -0
- package/SPECWEAVE.md +665 -0
- package/bin/install-agents.sh +57 -0
- package/bin/install-all.sh +49 -0
- package/bin/install-commands.sh +56 -0
- package/bin/install-skills.sh +57 -0
- package/bin/specweave.js +81 -0
- package/dist/adapters/adapter-base.d.ts +50 -0
- package/dist/adapters/adapter-base.d.ts.map +1 -0
- package/dist/adapters/adapter-base.js +146 -0
- package/dist/adapters/adapter-base.js.map +1 -0
- package/dist/adapters/adapter-interface.d.ts +108 -0
- package/dist/adapters/adapter-interface.d.ts.map +1 -0
- package/dist/adapters/adapter-interface.js +9 -0
- package/dist/adapters/adapter-interface.js.map +1 -0
- package/dist/adapters/claude/adapter.d.ts +54 -0
- package/dist/adapters/claude/adapter.d.ts.map +1 -0
- package/dist/adapters/claude/adapter.js +184 -0
- package/dist/adapters/claude/adapter.js.map +1 -0
- package/dist/adapters/copilot/adapter.d.ts +42 -0
- package/dist/adapters/copilot/adapter.d.ts.map +1 -0
- package/dist/adapters/copilot/adapter.js +239 -0
- package/dist/adapters/copilot/adapter.js.map +1 -0
- package/dist/adapters/cursor/adapter.d.ts +42 -0
- package/dist/adapters/cursor/adapter.d.ts.map +1 -0
- package/dist/adapters/cursor/adapter.js +297 -0
- package/dist/adapters/cursor/adapter.js.map +1 -0
- package/dist/adapters/generic/adapter.d.ts +40 -0
- package/dist/adapters/generic/adapter.d.ts.map +1 -0
- package/dist/adapters/generic/adapter.js +155 -0
- package/dist/adapters/generic/adapter.js.map +1 -0
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +247 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/install.d.ts +7 -0
- package/dist/cli/commands/install.d.ts.map +1 -0
- package/dist/cli/commands/install.js +160 -0
- package/dist/cli/commands/install.js.map +1 -0
- package/dist/cli/commands/list.d.ts +6 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +154 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/package.json +90 -0
- package/src/adapters/README.md +312 -0
- package/src/adapters/adapter-base.ts +146 -0
- package/src/adapters/adapter-interface.ts +120 -0
- package/src/adapters/claude/README.md +241 -0
- package/src/adapters/claude/adapter.ts +157 -0
- package/src/adapters/copilot/.github/copilot/instructions.md +376 -0
- package/src/adapters/copilot/README.md +200 -0
- package/src/adapters/copilot/adapter.ts +210 -0
- package/src/adapters/cursor/.cursor/context/docs-context.md +62 -0
- package/src/adapters/cursor/.cursor/context/increments-context.md +71 -0
- package/src/adapters/cursor/.cursor/context/strategy-context.md +73 -0
- package/src/adapters/cursor/.cursor/context/tests-context.md +89 -0
- package/src/adapters/cursor/.cursorrules +325 -0
- package/src/adapters/cursor/README.md +243 -0
- package/src/adapters/cursor/adapter.ts +268 -0
- package/src/adapters/generic/README.md +277 -0
- package/src/adapters/generic/SPECWEAVE-MANUAL.md +676 -0
- package/src/adapters/generic/adapter.ts +159 -0
- package/src/adapters/registry.yaml +126 -0
- package/src/agents/architect/AGENT.md +416 -0
- package/src/agents/devops/AGENT.md +1738 -0
- package/src/agents/docs-writer/AGENT.md +239 -0
- package/src/agents/performance/AGENT.md +228 -0
- package/src/agents/pm/AGENT.md +751 -0
- package/src/agents/qa-lead/AGENT.md +150 -0
- package/src/agents/security/AGENT.md +179 -0
- package/src/agents/sre/AGENT.md +582 -0
- package/src/agents/sre/modules/backend-diagnostics.md +481 -0
- package/src/agents/sre/modules/database-diagnostics.md +509 -0
- package/src/agents/sre/modules/infrastructure.md +561 -0
- package/src/agents/sre/modules/monitoring.md +439 -0
- package/src/agents/sre/modules/security-incidents.md +421 -0
- package/src/agents/sre/modules/ui-diagnostics.md +302 -0
- package/src/agents/sre/playbooks/01-high-cpu-usage.md +204 -0
- package/src/agents/sre/playbooks/02-database-deadlock.md +241 -0
- package/src/agents/sre/playbooks/03-memory-leak.md +252 -0
- package/src/agents/sre/playbooks/04-slow-api-response.md +269 -0
- package/src/agents/sre/playbooks/05-ddos-attack.md +293 -0
- package/src/agents/sre/playbooks/06-disk-full.md +314 -0
- package/src/agents/sre/playbooks/07-service-down.md +333 -0
- package/src/agents/sre/playbooks/08-data-corruption.md +337 -0
- package/src/agents/sre/playbooks/09-cascade-failure.md +430 -0
- package/src/agents/sre/playbooks/10-rate-limit-exceeded.md +464 -0
- package/src/agents/sre/scripts/health-check.sh +230 -0
- package/src/agents/sre/scripts/log-analyzer.py +213 -0
- package/src/agents/sre/scripts/metrics-collector.sh +294 -0
- package/src/agents/sre/scripts/trace-analyzer.js +257 -0
- package/src/agents/sre/templates/incident-report.md +249 -0
- package/src/agents/sre/templates/mitigation-plan.md +375 -0
- package/src/agents/sre/templates/post-mortem.md +418 -0
- package/src/agents/sre/templates/runbook-template.md +412 -0
- package/src/agents/tech-lead/AGENT.md +263 -0
- package/src/commands/add-tasks.md +176 -0
- package/src/commands/close-increment.md +347 -0
- package/src/commands/create-increment.md +223 -0
- package/src/commands/create-project.md +528 -0
- package/src/commands/generate-docs.md +623 -0
- package/src/commands/list-increments.md +180 -0
- package/src/commands/review-docs.md +331 -0
- package/src/commands/start-increment.md +139 -0
- package/src/commands/sync-github.md +115 -0
- package/src/commands/validate-increment.md +800 -0
- package/src/hooks/README.md +252 -0
- package/src/hooks/docs-changed.sh +59 -0
- package/src/hooks/human-input-required.sh +55 -0
- package/src/hooks/post-task-completion.sh +57 -0
- package/src/hooks/pre-implementation.sh +47 -0
- package/src/skills/ado-sync/README.md +449 -0
- package/src/skills/ado-sync/SKILL.md +245 -0
- package/src/skills/ado-sync/test-cases/test-1.yaml +9 -0
- package/src/skills/ado-sync/test-cases/test-2.yaml +8 -0
- package/src/skills/ado-sync/test-cases/test-3.yaml +9 -0
- package/src/skills/bmad-method-expert/SKILL.md +628 -0
- package/src/skills/bmad-method-expert/scripts/analyze-project.js +318 -0
- package/src/skills/bmad-method-expert/scripts/check-setup.js +208 -0
- package/src/skills/bmad-method-expert/scripts/generate-template.js +1149 -0
- package/src/skills/bmad-method-expert/scripts/validate-documents.js +340 -0
- package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/brownfield-analyzer/SKILL.md +523 -0
- package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +48 -0
- package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/SKILL.md +625 -0
- package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/context-loader/SKILL.md +734 -0
- package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +39 -0
- package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +44 -0
- package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +45 -0
- package/src/skills/context-optimizer/SKILL.md +618 -0
- package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +97 -0
- package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +109 -0
- package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +98 -0
- package/src/skills/cost-optimizer/SKILL.md +190 -0
- package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +75 -0
- package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +52 -0
- package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +63 -0
- package/src/skills/cost-optimizer/test-results/README.md +46 -0
- package/src/skills/design-system-architect/SKILL.md +107 -0
- package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +23 -0
- package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +24 -0
- package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +23 -0
- package/src/skills/diagrams-architect/SKILL.md +763 -0
- package/src/skills/diagrams-generator/SKILL.md +25 -0
- package/src/skills/diagrams-generator/test-cases/test-1.yaml +9 -0
- package/src/skills/diagrams-generator/test-cases/test-2.yaml +9 -0
- package/src/skills/diagrams-generator/test-cases/test-3.yaml +8 -0
- package/src/skills/docs-updater/README.md +48 -0
- package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/dotnet-backend/SKILL.md +250 -0
- package/src/skills/e2e-playwright/README.md +506 -0
- package/src/skills/e2e-playwright/SKILL.md +457 -0
- package/src/skills/e2e-playwright/execute.js +373 -0
- package/src/skills/e2e-playwright/lib/utils.js +514 -0
- package/src/skills/e2e-playwright/package.json +33 -0
- package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +54 -0
- package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +64 -0
- package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +74 -0
- package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +98 -0
- package/src/skills/figma-designer/SKILL.md +149 -0
- package/src/skills/figma-implementer/SKILL.md +148 -0
- package/src/skills/figma-mcp-connector/SKILL.md +136 -0
- package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +22 -0
- package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +21 -0
- package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +18 -0
- package/src/skills/figma-to-code/SKILL.md +128 -0
- package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +29 -0
- package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +27 -0
- package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +28 -0
- package/src/skills/frontend/SKILL.md +177 -0
- package/src/skills/github-sync/SKILL.md +252 -0
- package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/hetzner-provisioner/README.md +308 -0
- package/src/skills/hetzner-provisioner/SKILL.md +251 -0
- package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +71 -0
- package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +85 -0
- package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +126 -0
- package/src/skills/hetzner-provisioner/test-results/README.md +259 -0
- package/src/skills/increment-planner/SKILL.md +889 -0
- package/src/skills/increment-planner/scripts/feature-utils.js +250 -0
- package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +27 -0
- package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +30 -0
- package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +24 -0
- package/src/skills/increment-quality-judge/SKILL.md +566 -0
- package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +95 -0
- package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +108 -0
- package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +87 -0
- package/src/skills/jira-sync/README.md +328 -0
- package/src/skills/jira-sync/SKILL.md +209 -0
- package/src/skills/jira-sync/test-cases/test-1.yaml +9 -0
- package/src/skills/jira-sync/test-cases/test-2.yaml +9 -0
- package/src/skills/jira-sync/test-cases/test-3.yaml +10 -0
- package/src/skills/nextjs/SKILL.md +176 -0
- package/src/skills/nodejs-backend/SKILL.md +181 -0
- package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/python-backend/SKILL.md +226 -0
- package/src/skills/role-orchestrator/README.md +197 -0
- package/src/skills/role-orchestrator/SKILL.md +1184 -0
- package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +98 -0
- package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +73 -0
- package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +121 -0
- package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +145 -0
- package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +149 -0
- package/src/skills/skill-creator/LICENSE.txt +202 -0
- package/src/skills/skill-creator/SKILL.md +209 -0
- package/src/skills/skill-creator/scripts/init_skill.py +303 -0
- package/src/skills/skill-creator/scripts/package_skill.py +110 -0
- package/src/skills/skill-creator/scripts/quick_validate.py +65 -0
- package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/skill-router/SKILL.md +497 -0
- package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +33 -0
- package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +42 -0
- package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +50 -0
- package/src/skills/spec-driven-brainstorming/README.md +264 -0
- package/src/skills/spec-driven-brainstorming/SKILL.md +439 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +148 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +190 -0
- package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +233 -0
- package/src/skills/spec-driven-debugging/README.md +479 -0
- package/src/skills/spec-driven-debugging/SKILL.md +652 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +212 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +461 -0
- package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +366 -0
- package/src/skills/spec-kit-expert/SKILL.md +1012 -0
- package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/specweave-ado-mapper/SKILL.md +501 -0
- package/src/skills/specweave-detector/SKILL.md +420 -0
- package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +37 -0
- package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +37 -0
- package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +34 -0
- package/src/skills/specweave-jira-mapper/SKILL.md +500 -0
- package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +12 -0
- package/src/skills/task-builder/README.md +90 -0
- package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +12 -0
- package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +12 -0
- package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +12 -0
- package/src/templates/.env.example +144 -0
- package/src/templates/.gitignore.template +81 -0
- package/src/templates/CLAUDE.md.template +383 -0
- package/src/templates/README.md.template +240 -0
- package/src/templates/config.yaml +333 -0
- package/src/templates/docs/README.md +124 -0
- package/src/templates/docs/adr-template.md +118 -0
- package/src/templates/docs/hld-template.md +220 -0
- package/src/templates/docs/lld-template.md +580 -0
- package/src/templates/docs/prd-template.md +132 -0
- package/src/templates/docs/rfc-template.md +229 -0
- package/src/templates/docs/runbook-template.md +298 -0
- package/src/templates/environments/minimal/.env.production +16 -0
- package/src/templates/environments/minimal/README.md +54 -0
- package/src/templates/environments/minimal/deploy-production.yml +52 -0
- package/src/templates/environments/progressive/.env.qa +28 -0
- package/src/templates/environments/progressive/README.md +129 -0
- package/src/templates/environments/progressive/deploy-production.yml +93 -0
- package/src/templates/environments/progressive/deploy-qa.yml +62 -0
- package/src/templates/environments/progressive/deploy-staging.yml +67 -0
- package/src/templates/environments/standard/.env.development +20 -0
- package/src/templates/environments/standard/.env.production +30 -0
- package/src/templates/environments/standard/.env.staging +23 -0
- package/src/templates/environments/standard/README.md +97 -0
- package/src/templates/environments/standard/deploy-production.yml +68 -0
- package/src/templates/environments/standard/deploy-staging.yml +61 -0
- package/src/templates/environments/standard/docker-compose.yml +43 -0
- package/src/templates/increment-metadata-template.yaml +138 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: diagrams-generator
|
|
3
|
+
description: Generate Mermaid diagrams following C4 conventions. Activates for create diagram, system diagram, architecture diagram, C4 diagram, sequence diagram, ER diagram, data model. Coordinates with diagrams-architect agent.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Task
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Diagrams Generator Skill
|
|
8
|
+
|
|
9
|
+
Coordinates diagram generation by delegating to `diagrams-architect` agent.
|
|
10
|
+
|
|
11
|
+
## Responsibilities
|
|
12
|
+
|
|
13
|
+
1. Detect diagram requests (C4, sequence, ER, deployment)
|
|
14
|
+
2. Load source documentation
|
|
15
|
+
3. Invoke `diagrams-architect` agent
|
|
16
|
+
4. Save diagrams to correct locations
|
|
17
|
+
|
|
18
|
+
## Usage
|
|
19
|
+
|
|
20
|
+
**C4 Context**: "Create C4 context diagram"
|
|
21
|
+
**C4 Component** (LLD): "Create component diagram for Auth Service"
|
|
22
|
+
**Sequence**: "Create login flow diagram"
|
|
23
|
+
**ER Diagram**: "Create data model for auth module"
|
|
24
|
+
|
|
25
|
+
All diagram logic is handled by the `diagrams-architect` agent.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Detect C4 Level 3 (LLD)"
|
|
3
|
+
description: "Tests if diagrams-generator correctly identifies LLD component diagrams"
|
|
4
|
+
input:
|
|
5
|
+
prompt: "Create component diagram for Auth Service"
|
|
6
|
+
expected_output:
|
|
7
|
+
diagram_type: "C4Component"
|
|
8
|
+
document_type: "LLD"
|
|
9
|
+
---
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Save to Correct Location"
|
|
3
|
+
description: "Tests if diagrams are saved to correct paths (HLD vs LLD)"
|
|
4
|
+
input:
|
|
5
|
+
prompt: "Create component diagram for Payment Service"
|
|
6
|
+
expected_output:
|
|
7
|
+
file_location: ".specweave/docs/internal/architecture/diagrams/payments/component-payment-service.mmd"
|
|
8
|
+
---
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# docs-updater Skill
|
|
2
|
+
|
|
3
|
+
**Status**: To be developed
|
|
4
|
+
**Priority**: High
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Updates product documentation (.specweave/docs/) during implementation
|
|
9
|
+
|
|
10
|
+
## When It Activates
|
|
11
|
+
|
|
12
|
+
- When tasks.md specifies documentation updates
|
|
13
|
+
- During implementation of tasks
|
|
14
|
+
- When feature is completed
|
|
15
|
+
- User says "update documentation"
|
|
16
|
+
|
|
17
|
+
## What It Does
|
|
18
|
+
|
|
19
|
+
1. **Reads task requirements**: Understands what was implemented
|
|
20
|
+
2. **Updates docs**: Modifies .specweave/docs/ files
|
|
21
|
+
3. **Status tracking**: Changes [DRAFT] → [COMPLETE]
|
|
22
|
+
4. **Bi-directional links**: Maintains links between docs and increments
|
|
23
|
+
5. **Format adaptation**: Matches existing doc structure (features/ or modules/)
|
|
24
|
+
|
|
25
|
+
## Example
|
|
26
|
+
|
|
27
|
+
```markdown
|
|
28
|
+
# Task says:
|
|
29
|
+
**Documentation Updates**:
|
|
30
|
+
- [ ] .specweave/docs/features/payment.md [DRAFT]
|
|
31
|
+
- [ ] .specweave/docs/api/payments.md [DRAFT]
|
|
32
|
+
|
|
33
|
+
# docs-updater:
|
|
34
|
+
1. Reads implementation
|
|
35
|
+
2. Updates payment.md with actual code examples
|
|
36
|
+
3. Updates API docs with real endpoints
|
|
37
|
+
4. Changes status to [COMPLETE]
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## Integration
|
|
41
|
+
|
|
42
|
+
- Called by: task-builder (when tasks need doc updates)
|
|
43
|
+
- Calls: None (updates files directly)
|
|
44
|
+
- Updates: .specweave/docs/**/*.md
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
**To implement**: See task in .specweave/increments/
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dotnet-backend
|
|
3
|
+
description: .NET/C# backend developer for ASP.NET Core APIs with Entity Framework Core. Builds REST APIs, minimal APIs, gRPC services, authentication with Identity/JWT, authorization, database operations, background services, SignalR real-time features. Activates for: .NET, C#, ASP.NET Core, Entity Framework Core, EF Core, .NET Core, minimal API, Web API, gRPC, authentication .NET, Identity, JWT .NET, authorization, LINQ, async/await C#, background service, IHostedService, SignalR, SQL Server, PostgreSQL .NET, dependency injection, middleware .NET.
|
|
4
|
+
tools: Read, Write, Edit, Bash
|
|
5
|
+
model: claude-sonnet-4-5-20250929
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# .NET Backend Agent - ASP.NET Core & Enterprise API Expert
|
|
9
|
+
|
|
10
|
+
You are an expert .NET/C# backend developer with 8+ years of experience building enterprise-grade APIs and services.
|
|
11
|
+
|
|
12
|
+
## Your Expertise
|
|
13
|
+
|
|
14
|
+
- **Frameworks**: ASP.NET Core 8+, Minimal APIs, Web API
|
|
15
|
+
- **ORM**: Entity Framework Core 8+, Dapper
|
|
16
|
+
- **Databases**: SQL Server, PostgreSQL, MySQL
|
|
17
|
+
- **Authentication**: ASP.NET Core Identity, JWT, OAuth 2.0, Azure AD
|
|
18
|
+
- **Authorization**: Policy-based, role-based, claims-based
|
|
19
|
+
- **API Patterns**: RESTful, gRPC, GraphQL (HotChocolate)
|
|
20
|
+
- **Background**: IHostedService, BackgroundService, Hangfire
|
|
21
|
+
- **Real-time**: SignalR
|
|
22
|
+
- **Testing**: xUnit, NUnit, Moq, FluentAssertions
|
|
23
|
+
- **Dependency Injection**: Built-in DI container
|
|
24
|
+
- **Validation**: FluentValidation, Data Annotations
|
|
25
|
+
|
|
26
|
+
## Your Responsibilities
|
|
27
|
+
|
|
28
|
+
1. **Build ASP.NET Core APIs**
|
|
29
|
+
- RESTful controllers or Minimal APIs
|
|
30
|
+
- Model validation
|
|
31
|
+
- Exception handling middleware
|
|
32
|
+
- CORS configuration
|
|
33
|
+
- Response compression
|
|
34
|
+
|
|
35
|
+
2. **Entity Framework Core**
|
|
36
|
+
- DbContext configuration
|
|
37
|
+
- Code-first migrations
|
|
38
|
+
- Query optimization
|
|
39
|
+
- Include/ThenInclude for eager loading
|
|
40
|
+
- AsNoTracking for read-only queries
|
|
41
|
+
|
|
42
|
+
3. **Authentication & Authorization**
|
|
43
|
+
- JWT token generation/validation
|
|
44
|
+
- ASP.NET Core Identity integration
|
|
45
|
+
- Policy-based authorization
|
|
46
|
+
- Custom authorization handlers
|
|
47
|
+
|
|
48
|
+
4. **Background Services**
|
|
49
|
+
- IHostedService for long-running tasks
|
|
50
|
+
- Scoped services in background workers
|
|
51
|
+
- Scheduled jobs with Hangfire/Quartz.NET
|
|
52
|
+
|
|
53
|
+
5. **Performance**
|
|
54
|
+
- Async/await throughout
|
|
55
|
+
- Connection pooling
|
|
56
|
+
- Response caching
|
|
57
|
+
- Output caching (.NET 8+)
|
|
58
|
+
|
|
59
|
+
## Code Patterns You Follow
|
|
60
|
+
|
|
61
|
+
### Minimal API with EF Core
|
|
62
|
+
```csharp
|
|
63
|
+
using Microsoft.EntityFrameworkCore;
|
|
64
|
+
|
|
65
|
+
var builder = WebApplication.CreateBuilder(args);
|
|
66
|
+
|
|
67
|
+
// Services
|
|
68
|
+
builder.Services.AddDbContext<AppDbContext>(options =>
|
|
69
|
+
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
|
|
70
|
+
|
|
71
|
+
builder.Services.AddAuthentication().AddJwtBearer();
|
|
72
|
+
builder.Services.AddAuthorization();
|
|
73
|
+
|
|
74
|
+
var app = builder.Build();
|
|
75
|
+
|
|
76
|
+
// Create user endpoint
|
|
77
|
+
app.MapPost("/api/users", async (CreateUserRequest request, AppDbContext db) =>
|
|
78
|
+
{
|
|
79
|
+
// Validate
|
|
80
|
+
if (string.IsNullOrEmpty(request.Email))
|
|
81
|
+
return Results.BadRequest("Email is required");
|
|
82
|
+
|
|
83
|
+
// Hash password
|
|
84
|
+
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(request.Password);
|
|
85
|
+
|
|
86
|
+
// Create user
|
|
87
|
+
var user = new User
|
|
88
|
+
{
|
|
89
|
+
Email = request.Email,
|
|
90
|
+
PasswordHash = hashedPassword,
|
|
91
|
+
Name = request.Name
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
db.Users.Add(user);
|
|
95
|
+
await db.SaveChangesAsync();
|
|
96
|
+
|
|
97
|
+
return Results.Created($"/api/users/{user.Id}", new UserResponse(user));
|
|
98
|
+
})
|
|
99
|
+
.WithName("CreateUser")
|
|
100
|
+
.WithOpenApi();
|
|
101
|
+
|
|
102
|
+
app.Run();
|
|
103
|
+
|
|
104
|
+
record CreateUserRequest(string Email, string Password, string Name);
|
|
105
|
+
record UserResponse(int Id, string Email, string Name);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Controller-based API
|
|
109
|
+
```csharp
|
|
110
|
+
[ApiController]
|
|
111
|
+
[Route("api/[controller]")]
|
|
112
|
+
public class UsersController : ControllerBase
|
|
113
|
+
{
|
|
114
|
+
private readonly AppDbContext _db;
|
|
115
|
+
private readonly ILogger<UsersController> _logger;
|
|
116
|
+
|
|
117
|
+
public UsersController(AppDbContext db, ILogger<UsersController> logger)
|
|
118
|
+
{
|
|
119
|
+
_db = db;
|
|
120
|
+
_logger = logger;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
[HttpGet]
|
|
124
|
+
public async Task<ActionResult<List<UserDto>>> GetUsers()
|
|
125
|
+
{
|
|
126
|
+
var users = await _db.Users
|
|
127
|
+
.AsNoTracking()
|
|
128
|
+
.Select(u => new UserDto(u.Id, u.Email, u.Name))
|
|
129
|
+
.ToListAsync();
|
|
130
|
+
|
|
131
|
+
return Ok(users);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
[HttpPost]
|
|
135
|
+
public async Task<ActionResult<UserDto>> CreateUser(CreateUserDto dto)
|
|
136
|
+
{
|
|
137
|
+
var user = new User
|
|
138
|
+
{
|
|
139
|
+
Email = dto.Email,
|
|
140
|
+
PasswordHash = BCrypt.Net.BCrypt.HashPassword(dto.Password),
|
|
141
|
+
Name = dto.Name
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
_db.Users.Add(user);
|
|
145
|
+
await _db.SaveChangesAsync();
|
|
146
|
+
|
|
147
|
+
return CreatedAtAction(nameof(GetUser), new { id = user.Id }, new UserDto(user));
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### JWT Authentication
|
|
153
|
+
```csharp
|
|
154
|
+
using Microsoft.IdentityModel.Tokens;
|
|
155
|
+
using System.IdentityModel.Tokens.Jwt;
|
|
156
|
+
using System.Security.Claims;
|
|
157
|
+
using System.Text;
|
|
158
|
+
|
|
159
|
+
public class TokenService
|
|
160
|
+
{
|
|
161
|
+
private readonly IConfiguration _config;
|
|
162
|
+
|
|
163
|
+
public TokenService(IConfiguration config) => _config = config;
|
|
164
|
+
|
|
165
|
+
public string GenerateToken(User user)
|
|
166
|
+
{
|
|
167
|
+
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]!));
|
|
168
|
+
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|
169
|
+
|
|
170
|
+
var claims = new[]
|
|
171
|
+
{
|
|
172
|
+
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
|
|
173
|
+
new Claim(ClaimTypes.Email, user.Email),
|
|
174
|
+
new Claim(ClaimTypes.Name, user.Name)
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
var token = new JwtSecurityToken(
|
|
178
|
+
issuer: _config["Jwt:Issuer"],
|
|
179
|
+
audience: _config["Jwt:Audience"],
|
|
180
|
+
claims: claims,
|
|
181
|
+
expires: DateTime.UtcNow.AddHours(1),
|
|
182
|
+
signingCredentials: credentials
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
return new JwtSecurityTokenHandler().WriteToken(token);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Background Service
|
|
191
|
+
```csharp
|
|
192
|
+
public class EmailSenderService : BackgroundService
|
|
193
|
+
{
|
|
194
|
+
private readonly ILogger<EmailSenderService> _logger;
|
|
195
|
+
private readonly IServiceProvider _services;
|
|
196
|
+
|
|
197
|
+
public EmailSenderService(ILogger<EmailSenderService> logger, IServiceProvider services)
|
|
198
|
+
{
|
|
199
|
+
_logger = logger;
|
|
200
|
+
_services = services;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
|
204
|
+
{
|
|
205
|
+
while (!stoppingToken.IsCancellationRequested)
|
|
206
|
+
{
|
|
207
|
+
using var scope = _services.CreateScope();
|
|
208
|
+
var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
|
|
209
|
+
|
|
210
|
+
var pendingEmails = await db.PendingEmails
|
|
211
|
+
.Where(e => !e.Sent)
|
|
212
|
+
.Take(10)
|
|
213
|
+
.ToListAsync(stoppingToken);
|
|
214
|
+
|
|
215
|
+
foreach (var email in pendingEmails)
|
|
216
|
+
{
|
|
217
|
+
await SendEmailAsync(email);
|
|
218
|
+
email.Sent = true;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
await db.SaveChangesAsync(stoppingToken);
|
|
222
|
+
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
private async Task SendEmailAsync(PendingEmail email)
|
|
227
|
+
{
|
|
228
|
+
// Send email logic
|
|
229
|
+
_logger.LogInformation("Sending email to {Email}", email.To);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## Best Practices You Follow
|
|
235
|
+
|
|
236
|
+
- ✅ Async/await for all I/O operations
|
|
237
|
+
- ✅ Dependency Injection for all services
|
|
238
|
+
- ✅ appsettings.json for configuration
|
|
239
|
+
- ✅ User Secrets for local development
|
|
240
|
+
- ✅ Entity Framework migrations (Add-Migration, Update-Database)
|
|
241
|
+
- ✅ Global exception handling middleware
|
|
242
|
+
- ✅ FluentValidation for complex validation
|
|
243
|
+
- ✅ Serilog for structured logging
|
|
244
|
+
- ✅ Health checks (AddHealthChecks)
|
|
245
|
+
- ✅ API versioning
|
|
246
|
+
- ✅ Swagger/OpenAPI documentation
|
|
247
|
+
- ✅ AutoMapper for DTO mapping
|
|
248
|
+
- ✅ CQRS with MediatR (for complex domains)
|
|
249
|
+
|
|
250
|
+
You build robust, enterprise-grade .NET backend services for mission-critical applications.
|