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,580 @@
|
|
|
1
|
+
# LLD: [Service/Component Name]
|
|
2
|
+
|
|
3
|
+
**Status**: draft | review | approved | deprecated
|
|
4
|
+
**Author**: [Your Name]
|
|
5
|
+
**Created**: YYYY-MM-DD
|
|
6
|
+
**Last Updated**: YYYY-MM-DD
|
|
7
|
+
**Reviewers**: @tech-lead, @senior-engineer
|
|
8
|
+
|
|
9
|
+
**Related HLD**: [Link to HLD](hld-{system-name}.md)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Context
|
|
14
|
+
|
|
15
|
+
**Why does this component exist?**
|
|
16
|
+
|
|
17
|
+
Link to the high-level design and explain the context:
|
|
18
|
+
- **HLD**: [Link to HLD](hld-{system-name}.md)
|
|
19
|
+
- **Component Purpose**: What specific problem does this component solve?
|
|
20
|
+
- **Scope**: What is within and outside this component's responsibility?
|
|
21
|
+
|
|
22
|
+
## Component Overview (C4 Level 3)
|
|
23
|
+
|
|
24
|
+
**Internal structure of this service/component**
|
|
25
|
+
|
|
26
|
+
**Diagram File**: `lld-{component-name}.c4-component.mmd` (co-located with this file)
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
graph TB
|
|
30
|
+
subgraph "Auth Service Container"
|
|
31
|
+
Controller[Auth Controller]
|
|
32
|
+
Service[Auth Service]
|
|
33
|
+
Validator[Input Validator]
|
|
34
|
+
TokenManager[JWT Token Manager]
|
|
35
|
+
Repository[User Repository]
|
|
36
|
+
Cache[Cache Layer]
|
|
37
|
+
|
|
38
|
+
Controller -->|validate| Validator
|
|
39
|
+
Controller -->|authenticate| Service
|
|
40
|
+
Service -->|generateToken| TokenManager
|
|
41
|
+
Service -->|getUser| Repository
|
|
42
|
+
Repository -->|check cache| Cache
|
|
43
|
+
Repository -->|query| DB[(User Database)]
|
|
44
|
+
Cache -->|miss| DB
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
Client[External Client] -->|HTTP Request| Controller
|
|
48
|
+
Controller -->|Response| Client
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Component Responsibilities**:
|
|
52
|
+
- **Auth Controller**: HTTP request handling, input validation, response formatting
|
|
53
|
+
- **Auth Service**: Core authentication logic, orchestrates validation and token generation
|
|
54
|
+
- **Input Validator**: Request validation, sanitization, security checks
|
|
55
|
+
- **JWT Token Manager**: JWT token creation, validation, refresh
|
|
56
|
+
- **User Repository**: User data access, caching strategy
|
|
57
|
+
- **Cache Layer**: In-memory caching for frequently accessed user data
|
|
58
|
+
|
|
59
|
+
**Related Diagrams**:
|
|
60
|
+
- `lld-{component-name}.c4-component.mmd` - Component internal structure (this diagram)
|
|
61
|
+
- `lld-{component-name}.sequence-login.mmd` - Login flow sequence
|
|
62
|
+
- `lld-{component-name}.class.mmd` - Class diagram (if applicable)
|
|
63
|
+
|
|
64
|
+
**See**: [Diagram Conventions](../delivery/guides/diagram-conventions-comprehensive.md) for C4 diagram best practices.
|
|
65
|
+
|
|
66
|
+
## API / Interface Specification
|
|
67
|
+
|
|
68
|
+
### Public Interfaces
|
|
69
|
+
|
|
70
|
+
**Endpoints** (if HTTP service):
|
|
71
|
+
```
|
|
72
|
+
POST /auth/login
|
|
73
|
+
POST /auth/logout
|
|
74
|
+
POST /auth/refresh
|
|
75
|
+
GET /auth/validate
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
**Methods** (if library/module):
|
|
79
|
+
```typescript
|
|
80
|
+
interface AuthService {
|
|
81
|
+
login(credentials: Credentials): Promise<AuthToken>
|
|
82
|
+
logout(token: string): Promise<void>
|
|
83
|
+
refresh(refreshToken: string): Promise<AuthToken>
|
|
84
|
+
validate(token: string): Promise<User>
|
|
85
|
+
}
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Internal Interfaces
|
|
89
|
+
|
|
90
|
+
**Between components within this service**:
|
|
91
|
+
```typescript
|
|
92
|
+
interface UserRepository {
|
|
93
|
+
findByEmail(email: string): Promise<User | null>
|
|
94
|
+
findById(id: string): Promise<User | null>
|
|
95
|
+
updateLastLogin(userId: string): Promise<void>
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
interface TokenManager {
|
|
99
|
+
generate(user: User): Promise<AuthToken>
|
|
100
|
+
validate(token: string): Promise<TokenPayload>
|
|
101
|
+
refresh(refreshToken: string): Promise<AuthToken>
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Detailed Flow Diagrams
|
|
106
|
+
|
|
107
|
+
### Login Flow (Sequence Diagram)
|
|
108
|
+
|
|
109
|
+
**Diagram File**: `lld-{component-name}.sequence-login.mmd`
|
|
110
|
+
|
|
111
|
+
```mermaid
|
|
112
|
+
sequenceDiagram
|
|
113
|
+
participant Client
|
|
114
|
+
participant Controller as Auth Controller
|
|
115
|
+
participant Validator
|
|
116
|
+
participant Service as Auth Service
|
|
117
|
+
participant Repo as User Repository
|
|
118
|
+
participant Cache
|
|
119
|
+
participant DB as Database
|
|
120
|
+
participant TokenMgr as Token Manager
|
|
121
|
+
|
|
122
|
+
Client->>Controller: POST /auth/login {email, password}
|
|
123
|
+
Controller->>Validator: validate(request)
|
|
124
|
+
Validator-->>Controller: ValidationResult
|
|
125
|
+
|
|
126
|
+
alt validation failed
|
|
127
|
+
Controller-->>Client: 400 Bad Request
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
Controller->>Service: authenticate(email, password)
|
|
131
|
+
Service->>Repo: findByEmail(email)
|
|
132
|
+
Repo->>Cache: get(email)
|
|
133
|
+
|
|
134
|
+
alt cache hit
|
|
135
|
+
Cache-->>Repo: User data
|
|
136
|
+
else cache miss
|
|
137
|
+
Repo->>DB: SELECT * FROM users WHERE email=?
|
|
138
|
+
DB-->>Repo: User row
|
|
139
|
+
Repo->>Cache: set(email, user)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
Repo-->>Service: User | null
|
|
143
|
+
|
|
144
|
+
alt user not found
|
|
145
|
+
Service-->>Controller: AuthError(USER_NOT_FOUND)
|
|
146
|
+
Controller-->>Client: 401 Unauthorized
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
Service->>Service: verifyPassword(password, user.hash)
|
|
150
|
+
|
|
151
|
+
alt password invalid
|
|
152
|
+
Service-->>Controller: AuthError(INVALID_PASSWORD)
|
|
153
|
+
Controller-->>Client: 401 Unauthorized
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
Service->>TokenMgr: generate(user)
|
|
157
|
+
TokenMgr-->>Service: AuthToken
|
|
158
|
+
Service->>Repo: updateLastLogin(user.id)
|
|
159
|
+
Service-->>Controller: AuthToken
|
|
160
|
+
Controller-->>Client: 200 OK {token, refreshToken}
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
### Error Handling Flow
|
|
164
|
+
|
|
165
|
+
```mermaid
|
|
166
|
+
graph TB
|
|
167
|
+
Request[Incoming Request] --> Validator{Valid?}
|
|
168
|
+
Validator -->|No| BadRequest[400 Bad Request]
|
|
169
|
+
Validator -->|Yes| Auth{Authenticated?}
|
|
170
|
+
Auth -->|No| Unauthorized[401 Unauthorized]
|
|
171
|
+
Auth -->|Yes| Authorized{Authorized?}
|
|
172
|
+
Authorized -->|No| Forbidden[403 Forbidden]
|
|
173
|
+
Authorized -->|Yes| Process[Process Request]
|
|
174
|
+
Process --> DBError{DB Error?}
|
|
175
|
+
DBError -->|Yes| ServerError[500 Internal Error]
|
|
176
|
+
DBError -->|No| Success[200 OK]
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Data Models (Component-Specific)
|
|
180
|
+
|
|
181
|
+
### Internal Data Structures
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
// Domain entities (internal representation)
|
|
185
|
+
interface User {
|
|
186
|
+
id: string
|
|
187
|
+
email: string
|
|
188
|
+
passwordHash: string
|
|
189
|
+
salt: string
|
|
190
|
+
role: UserRole
|
|
191
|
+
mfaEnabled: boolean
|
|
192
|
+
mfaSecret?: string
|
|
193
|
+
lastLogin?: Date
|
|
194
|
+
createdAt: Date
|
|
195
|
+
updatedAt: Date
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
interface AuthToken {
|
|
199
|
+
accessToken: string
|
|
200
|
+
refreshToken: string
|
|
201
|
+
expiresIn: number
|
|
202
|
+
tokenType: 'Bearer'
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
interface TokenPayload {
|
|
206
|
+
userId: string
|
|
207
|
+
email: string
|
|
208
|
+
role: UserRole
|
|
209
|
+
iat: number
|
|
210
|
+
exp: number
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### Database Schema (if applicable)
|
|
215
|
+
|
|
216
|
+
```sql
|
|
217
|
+
CREATE TABLE users (
|
|
218
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
219
|
+
email VARCHAR(255) UNIQUE NOT NULL,
|
|
220
|
+
password_hash VARCHAR(255) NOT NULL,
|
|
221
|
+
salt VARCHAR(255) NOT NULL,
|
|
222
|
+
role VARCHAR(50) NOT NULL DEFAULT 'user',
|
|
223
|
+
mfa_enabled BOOLEAN DEFAULT FALSE,
|
|
224
|
+
mfa_secret VARCHAR(255),
|
|
225
|
+
last_login TIMESTAMP,
|
|
226
|
+
created_at TIMESTAMP DEFAULT NOW(),
|
|
227
|
+
updated_at TIMESTAMP DEFAULT NOW()
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
231
|
+
CREATE INDEX idx_users_last_login ON users(last_login);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Caching Strategy
|
|
235
|
+
|
|
236
|
+
```yaml
|
|
237
|
+
cache_keys:
|
|
238
|
+
user_by_email: "user:email:{email}"
|
|
239
|
+
user_by_id: "user:id:{id}"
|
|
240
|
+
token_blacklist: "token:blacklist:{jti}"
|
|
241
|
+
|
|
242
|
+
ttl:
|
|
243
|
+
user_data: 300 # 5 minutes
|
|
244
|
+
token_blacklist: 86400 # 24 hours (until token expires)
|
|
245
|
+
|
|
246
|
+
invalidation:
|
|
247
|
+
- On user update: Clear user:email:{email} and user:id:{id}
|
|
248
|
+
- On logout: Add token:blacklist:{jti}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
## Implementation Details
|
|
252
|
+
|
|
253
|
+
### Technology Stack (Component-Specific)
|
|
254
|
+
- **Language**: TypeScript / Node.js
|
|
255
|
+
- **Framework**: Express.js / Fastify / NestJS
|
|
256
|
+
- **ORM**: Prisma / TypeORM
|
|
257
|
+
- **Caching**: Redis
|
|
258
|
+
- **Authentication**: jsonwebtoken library
|
|
259
|
+
- **Validation**: Zod / Joi / class-validator
|
|
260
|
+
- **Password Hashing**: bcrypt / argon2
|
|
261
|
+
|
|
262
|
+
### Key Algorithms
|
|
263
|
+
|
|
264
|
+
**Password Verification**:
|
|
265
|
+
```typescript
|
|
266
|
+
async function verifyPassword(
|
|
267
|
+
plainPassword: string,
|
|
268
|
+
hash: string
|
|
269
|
+
): Promise<boolean> {
|
|
270
|
+
// Use constant-time comparison to prevent timing attacks
|
|
271
|
+
return await bcrypt.compare(plainPassword, hash)
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
**Token Generation**:
|
|
276
|
+
```typescript
|
|
277
|
+
function generateToken(user: User): AuthToken {
|
|
278
|
+
const payload: TokenPayload = {
|
|
279
|
+
userId: user.id,
|
|
280
|
+
email: user.email,
|
|
281
|
+
role: user.role,
|
|
282
|
+
iat: Math.floor(Date.now() / 1000),
|
|
283
|
+
exp: Math.floor(Date.now() / 1000) + (60 * 60) // 1 hour
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
const accessToken = jwt.sign(payload, SECRET_KEY, { algorithm: 'HS256' })
|
|
287
|
+
const refreshToken = jwt.sign({ userId: user.id }, REFRESH_SECRET, {
|
|
288
|
+
expiresIn: '7d'
|
|
289
|
+
})
|
|
290
|
+
|
|
291
|
+
return {
|
|
292
|
+
accessToken,
|
|
293
|
+
refreshToken,
|
|
294
|
+
expiresIn: 3600,
|
|
295
|
+
tokenType: 'Bearer'
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Configuration
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
interface AuthConfig {
|
|
304
|
+
jwt: {
|
|
305
|
+
secret: string
|
|
306
|
+
refreshSecret: string
|
|
307
|
+
algorithm: 'HS256' | 'RS256'
|
|
308
|
+
expiresIn: string
|
|
309
|
+
refreshExpiresIn: string
|
|
310
|
+
}
|
|
311
|
+
password: {
|
|
312
|
+
minLength: number
|
|
313
|
+
requireUppercase: boolean
|
|
314
|
+
requireLowercase: boolean
|
|
315
|
+
requireNumbers: boolean
|
|
316
|
+
requireSpecialChars: boolean
|
|
317
|
+
saltRounds: number
|
|
318
|
+
}
|
|
319
|
+
rateLimit: {
|
|
320
|
+
maxAttempts: number
|
|
321
|
+
windowMs: number
|
|
322
|
+
blockDurationMs: number
|
|
323
|
+
}
|
|
324
|
+
mfa: {
|
|
325
|
+
enabled: boolean
|
|
326
|
+
issuer: string
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
## Security Considerations (Component-Level)
|
|
332
|
+
|
|
333
|
+
### Input Validation
|
|
334
|
+
- **Email**: RFC 5322 compliant, max 255 chars
|
|
335
|
+
- **Password**: 8-128 chars, complexity requirements enforced
|
|
336
|
+
- **Sanitization**: Strip HTML/SQL injection attempts
|
|
337
|
+
- **Rate Limiting**: Max 5 login attempts per 15 minutes per IP
|
|
338
|
+
|
|
339
|
+
### Token Security
|
|
340
|
+
- **Algorithm**: HS256 (or RS256 for distributed systems)
|
|
341
|
+
- **Secret Rotation**: Rotate JWT secrets quarterly
|
|
342
|
+
- **Token Expiry**: Access token: 1 hour, Refresh token: 7 days
|
|
343
|
+
- **Blacklisting**: Store revoked tokens in Redis until expiry
|
|
344
|
+
|
|
345
|
+
### Password Security
|
|
346
|
+
- **Hashing**: bcrypt with cost factor 12 (or argon2id)
|
|
347
|
+
- **Salt**: Unique per-user salt (handled by bcrypt)
|
|
348
|
+
- **Storage**: Never log or transmit plaintext passwords
|
|
349
|
+
- **Complexity**: Enforced at validator level
|
|
350
|
+
|
|
351
|
+
### Sensitive Data Handling
|
|
352
|
+
- **Logging**: Never log passwords, tokens, or PII
|
|
353
|
+
- **Masking**: Mask sensitive fields in logs (e.g., email → e***@example.com)
|
|
354
|
+
- **Encryption at Rest**: Database column encryption for PII
|
|
355
|
+
|
|
356
|
+
## Performance Considerations
|
|
357
|
+
|
|
358
|
+
### Optimization Strategies
|
|
359
|
+
- **Caching**: Redis cache for user lookups (5 min TTL)
|
|
360
|
+
- **Database Indexes**: Index on email column for fast lookups
|
|
361
|
+
- **Connection Pooling**: Max 20 database connections
|
|
362
|
+
- **Async Operations**: All I/O operations are async/await
|
|
363
|
+
|
|
364
|
+
### Performance Targets (Component-Specific)
|
|
365
|
+
- **Login Latency**: p95 < 200ms, p99 < 500ms
|
|
366
|
+
- **Token Validation**: p95 < 50ms, p99 < 100ms
|
|
367
|
+
- **Throughput**: 500 req/sec per instance
|
|
368
|
+
- **Cache Hit Rate**: > 80% for user lookups
|
|
369
|
+
|
|
370
|
+
### Monitoring & Metrics
|
|
371
|
+
```typescript
|
|
372
|
+
metrics:
|
|
373
|
+
- auth.login.success_count
|
|
374
|
+
- auth.login.failure_count
|
|
375
|
+
- auth.login.duration_ms
|
|
376
|
+
- auth.token.validation.duration_ms
|
|
377
|
+
- auth.cache.hit_rate
|
|
378
|
+
- auth.cache.miss_count
|
|
379
|
+
- auth.db.query.duration_ms
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
## Error Handling
|
|
383
|
+
|
|
384
|
+
### Error Types
|
|
385
|
+
|
|
386
|
+
```typescript
|
|
387
|
+
enum AuthErrorCode {
|
|
388
|
+
INVALID_CREDENTIALS = 'INVALID_CREDENTIALS',
|
|
389
|
+
USER_NOT_FOUND = 'USER_NOT_FOUND',
|
|
390
|
+
INVALID_TOKEN = 'INVALID_TOKEN',
|
|
391
|
+
TOKEN_EXPIRED = 'TOKEN_EXPIRED',
|
|
392
|
+
RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED',
|
|
393
|
+
MFA_REQUIRED = 'MFA_REQUIRED',
|
|
394
|
+
MFA_INVALID = 'MFA_INVALID',
|
|
395
|
+
INTERNAL_ERROR = 'INTERNAL_ERROR'
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
class AuthError extends Error {
|
|
399
|
+
constructor(
|
|
400
|
+
public code: AuthErrorCode,
|
|
401
|
+
public httpStatus: number,
|
|
402
|
+
message: string
|
|
403
|
+
) {
|
|
404
|
+
super(message)
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
### Error Response Format
|
|
410
|
+
|
|
411
|
+
```json
|
|
412
|
+
{
|
|
413
|
+
"error": {
|
|
414
|
+
"code": "INVALID_CREDENTIALS",
|
|
415
|
+
"message": "Invalid email or password",
|
|
416
|
+
"statusCode": 401,
|
|
417
|
+
"timestamp": "2025-01-20T10:30:00Z",
|
|
418
|
+
"path": "/auth/login"
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Retry Strategy
|
|
424
|
+
- **Client Errors (4xx)**: Do not retry
|
|
425
|
+
- **Server Errors (5xx)**: Retry with exponential backoff (max 3 retries)
|
|
426
|
+
- **Database Errors**: Retry transient errors (connection timeout, deadlock)
|
|
427
|
+
|
|
428
|
+
## Testing Strategy
|
|
429
|
+
|
|
430
|
+
### Unit Tests
|
|
431
|
+
```typescript
|
|
432
|
+
describe('AuthService', () => {
|
|
433
|
+
describe('authenticate', () => {
|
|
434
|
+
test('should return token for valid credentials', async () => {
|
|
435
|
+
// Arrange
|
|
436
|
+
const credentials = { email: 'test@example.com', password: 'SecurePass123' }
|
|
437
|
+
|
|
438
|
+
// Act
|
|
439
|
+
const result = await authService.authenticate(credentials)
|
|
440
|
+
|
|
441
|
+
// Assert
|
|
442
|
+
expect(result).toHaveProperty('accessToken')
|
|
443
|
+
expect(result).toHaveProperty('refreshToken')
|
|
444
|
+
})
|
|
445
|
+
|
|
446
|
+
test('should throw error for invalid password', async () => {
|
|
447
|
+
// Arrange
|
|
448
|
+
const credentials = { email: 'test@example.com', password: 'WrongPass' }
|
|
449
|
+
|
|
450
|
+
// Act & Assert
|
|
451
|
+
await expect(authService.authenticate(credentials))
|
|
452
|
+
.rejects.toThrow(AuthError)
|
|
453
|
+
})
|
|
454
|
+
})
|
|
455
|
+
})
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### Integration Tests
|
|
459
|
+
```typescript
|
|
460
|
+
describe('Auth API Integration', () => {
|
|
461
|
+
test('POST /auth/login with valid credentials', async () => {
|
|
462
|
+
const response = await request(app)
|
|
463
|
+
.post('/auth/login')
|
|
464
|
+
.send({ email: 'test@example.com', password: 'SecurePass123' })
|
|
465
|
+
|
|
466
|
+
expect(response.status).toBe(200)
|
|
467
|
+
expect(response.body).toHaveProperty('accessToken')
|
|
468
|
+
})
|
|
469
|
+
})
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
### Component Tests
|
|
473
|
+
- Test all public interfaces
|
|
474
|
+
- Test error handling paths
|
|
475
|
+
- Test rate limiting
|
|
476
|
+
- Test token validation edge cases
|
|
477
|
+
- Test cache invalidation
|
|
478
|
+
|
|
479
|
+
**Test Coverage Target**: > 80% for critical paths
|
|
480
|
+
|
|
481
|
+
## Dependencies
|
|
482
|
+
|
|
483
|
+
### External Dependencies
|
|
484
|
+
```json
|
|
485
|
+
{
|
|
486
|
+
"dependencies": {
|
|
487
|
+
"express": "^4.18.0",
|
|
488
|
+
"jsonwebtoken": "^9.0.0",
|
|
489
|
+
"bcrypt": "^5.1.0",
|
|
490
|
+
"zod": "^3.22.0",
|
|
491
|
+
"redis": "^4.6.0"
|
|
492
|
+
},
|
|
493
|
+
"devDependencies": {
|
|
494
|
+
"@types/express": "^4.17.0",
|
|
495
|
+
"@types/jsonwebtoken": "^9.0.0",
|
|
496
|
+
"jest": "^29.0.0",
|
|
497
|
+
"supertest": "^6.3.0"
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
```
|
|
501
|
+
|
|
502
|
+
### Internal Dependencies
|
|
503
|
+
- **Database Module**: User data persistence
|
|
504
|
+
- **Logging Module**: Structured logging
|
|
505
|
+
- **Config Module**: Environment configuration
|
|
506
|
+
- **Metrics Module**: Performance monitoring
|
|
507
|
+
|
|
508
|
+
## Deployment Considerations
|
|
509
|
+
|
|
510
|
+
### Environment Variables
|
|
511
|
+
```bash
|
|
512
|
+
# JWT Configuration
|
|
513
|
+
JWT_SECRET=<secret-key>
|
|
514
|
+
JWT_REFRESH_SECRET=<refresh-secret>
|
|
515
|
+
JWT_EXPIRES_IN=1h
|
|
516
|
+
JWT_REFRESH_EXPIRES_IN=7d
|
|
517
|
+
|
|
518
|
+
# Database
|
|
519
|
+
DATABASE_URL=postgresql://user:pass@host:5432/db
|
|
520
|
+
|
|
521
|
+
# Redis
|
|
522
|
+
REDIS_URL=redis://localhost:6379
|
|
523
|
+
|
|
524
|
+
# Security
|
|
525
|
+
BCRYPT_ROUNDS=12
|
|
526
|
+
RATE_LIMIT_MAX_ATTEMPTS=5
|
|
527
|
+
RATE_LIMIT_WINDOW_MS=900000
|
|
528
|
+
```
|
|
529
|
+
|
|
530
|
+
### Health Checks
|
|
531
|
+
```typescript
|
|
532
|
+
GET /auth/health
|
|
533
|
+
|
|
534
|
+
Response:
|
|
535
|
+
{
|
|
536
|
+
"status": "healthy",
|
|
537
|
+
"checks": {
|
|
538
|
+
"database": "healthy",
|
|
539
|
+
"redis": "healthy",
|
|
540
|
+
"memory": "healthy"
|
|
541
|
+
},
|
|
542
|
+
"timestamp": "2025-01-20T10:30:00Z"
|
|
543
|
+
}
|
|
544
|
+
```
|
|
545
|
+
|
|
546
|
+
### Graceful Shutdown
|
|
547
|
+
1. Stop accepting new requests
|
|
548
|
+
2. Complete in-flight requests (max 30s timeout)
|
|
549
|
+
3. Close database connections
|
|
550
|
+
4. Close Redis connections
|
|
551
|
+
5. Exit process
|
|
552
|
+
|
|
553
|
+
## Open Questions / TODOs
|
|
554
|
+
|
|
555
|
+
- [ ] **Q1**: Should we support OAuth 2.0 providers (Google, GitHub)?
|
|
556
|
+
- **Owner**: @tech-lead
|
|
557
|
+
- **Due Date**: YYYY-MM-DD
|
|
558
|
+
|
|
559
|
+
- [ ] **Q2**: Should we implement passwordless login (magic links)?
|
|
560
|
+
- **Owner**: @product-manager
|
|
561
|
+
- **Due Date**: YYYY-MM-DD
|
|
562
|
+
|
|
563
|
+
- [ ] **TODO1**: Implement MFA support (TOTP)
|
|
564
|
+
- **Assignee**: @developer
|
|
565
|
+
- **Priority**: P2
|
|
566
|
+
|
|
567
|
+
## Related Documentation
|
|
568
|
+
|
|
569
|
+
- [HLD: System Architecture](hld-{system-name}.md)
|
|
570
|
+
- [ADR: Authentication Method](adr/0001-use-jwt-tokens.md)
|
|
571
|
+
- [RFC: Auth API Specification](rfc/0001-auth-api.md)
|
|
572
|
+
- [Runbook: Auth Service Operations](../operations/runbook-auth-service.md)
|
|
573
|
+
- [Diagram Conventions](../../DIAGRAM-CONVENTIONS.md) - C4 diagram best practices
|
|
574
|
+
|
|
575
|
+
---
|
|
576
|
+
|
|
577
|
+
**Approval**:
|
|
578
|
+
- [ ] Tech Lead: @name
|
|
579
|
+
- [ ] Senior Engineer: @name
|
|
580
|
+
- [ ] Security: @name
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# PRD: [Feature Name]
|
|
2
|
+
|
|
3
|
+
**Status**: draft | review | approved | deprecated
|
|
4
|
+
**Author**: [Your Name]
|
|
5
|
+
**Created**: YYYY-MM-DD
|
|
6
|
+
**Last Updated**: YYYY-MM-DD
|
|
7
|
+
**Reviewers**: @product-owner, @stakeholders
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Problem
|
|
12
|
+
|
|
13
|
+
**What problem are we solving?**
|
|
14
|
+
|
|
15
|
+
Describe the core problem or pain point. Be specific about:
|
|
16
|
+
- Who experiences this problem?
|
|
17
|
+
- How often does it occur?
|
|
18
|
+
- What is the impact if we don't solve it?
|
|
19
|
+
|
|
20
|
+
## Target Users
|
|
21
|
+
|
|
22
|
+
**Who is this for?**
|
|
23
|
+
|
|
24
|
+
Define the target audience:
|
|
25
|
+
- **Primary Users**: Who will use this most?
|
|
26
|
+
- **Secondary Users**: Who else benefits?
|
|
27
|
+
- **User Personas**: Link to user personas if available
|
|
28
|
+
|
|
29
|
+
## Desired Outcomes / Success Metrics
|
|
30
|
+
|
|
31
|
+
**How do we measure success?**
|
|
32
|
+
|
|
33
|
+
Define clear, measurable success criteria:
|
|
34
|
+
|
|
35
|
+
- **Business Metrics**:
|
|
36
|
+
- Revenue impact: $XXX increase
|
|
37
|
+
- User growth: XX% increase
|
|
38
|
+
- Cost reduction: $XXX savings
|
|
39
|
+
|
|
40
|
+
- **User Metrics**:
|
|
41
|
+
- Adoption: XX% of users adopt feature
|
|
42
|
+
- Engagement: XX% increase in usage
|
|
43
|
+
- Satisfaction: NPS score improvement
|
|
44
|
+
|
|
45
|
+
- **Technical Metrics**:
|
|
46
|
+
- Performance: <XXms latency
|
|
47
|
+
- Reliability: XX% uptime
|
|
48
|
+
- Scalability: Support XX concurrent users
|
|
49
|
+
|
|
50
|
+
## Scope (In / Out)
|
|
51
|
+
|
|
52
|
+
**What's included and excluded?**
|
|
53
|
+
|
|
54
|
+
### In Scope
|
|
55
|
+
- [ ] Feature 1: Description
|
|
56
|
+
- [ ] Feature 2: Description
|
|
57
|
+
- [ ] Feature 3: Description
|
|
58
|
+
|
|
59
|
+
### Out of Scope
|
|
60
|
+
- ❌ Feature A: Reason why it's excluded
|
|
61
|
+
- ❌ Feature B: Defer to future release
|
|
62
|
+
- ❌ Feature C: Not aligned with goals
|
|
63
|
+
|
|
64
|
+
## Assumptions & Risks
|
|
65
|
+
|
|
66
|
+
**What could go wrong?**
|
|
67
|
+
|
|
68
|
+
### Assumptions
|
|
69
|
+
- Assumption 1: We assume...
|
|
70
|
+
- Assumption 2: We assume...
|
|
71
|
+
- Assumption 3: We assume...
|
|
72
|
+
|
|
73
|
+
### Risks
|
|
74
|
+
- **Risk 1**: Description
|
|
75
|
+
- **Probability**: High | Medium | Low
|
|
76
|
+
- **Impact**: High | Medium | Low
|
|
77
|
+
- **Mitigation**: How we address it
|
|
78
|
+
|
|
79
|
+
- **Risk 2**: Description
|
|
80
|
+
- **Probability**: High | Medium | Low
|
|
81
|
+
- **Impact**: High | Medium | Low
|
|
82
|
+
- **Mitigation**: How we address it
|
|
83
|
+
|
|
84
|
+
## Alternatives Considered
|
|
85
|
+
|
|
86
|
+
**What else did we consider?**
|
|
87
|
+
|
|
88
|
+
### Alternative 1: [Name]
|
|
89
|
+
- **Description**: What is it?
|
|
90
|
+
- **Pros**: Benefits
|
|
91
|
+
- **Cons**: Drawbacks
|
|
92
|
+
- **Why not chosen**: Reason
|
|
93
|
+
|
|
94
|
+
### Alternative 2: [Name]
|
|
95
|
+
- **Description**: What is it?
|
|
96
|
+
- **Pros**: Benefits
|
|
97
|
+
- **Cons**: Drawbacks
|
|
98
|
+
- **Why not chosen**: Reason
|
|
99
|
+
|
|
100
|
+
## Milestones & Release Criteria
|
|
101
|
+
|
|
102
|
+
**When are we done?**
|
|
103
|
+
|
|
104
|
+
### Milestones
|
|
105
|
+
- **M1**: Milestone 1 - Date
|
|
106
|
+
- Deliverable 1
|
|
107
|
+
- Deliverable 2
|
|
108
|
+
- **M2**: Milestone 2 - Date
|
|
109
|
+
- Deliverable 3
|
|
110
|
+
- Deliverable 4
|
|
111
|
+
|
|
112
|
+
### Release Criteria
|
|
113
|
+
- [ ] All features implemented
|
|
114
|
+
- [ ] All tests passing (unit, integration, E2E)
|
|
115
|
+
- [ ] Performance benchmarks met
|
|
116
|
+
- [ ] Security review completed
|
|
117
|
+
- [ ] Documentation complete
|
|
118
|
+
- [ ] User acceptance testing passed
|
|
119
|
+
|
|
120
|
+
## Related Documentation
|
|
121
|
+
|
|
122
|
+
- [HLD: System Design](../architecture/hld-{feature}.md) - Technical design
|
|
123
|
+
- [ADR: Decision Records](../architecture/adr/) - Architecture decisions
|
|
124
|
+
- [RFC: API Design](../architecture/rfc/) - API specifications
|
|
125
|
+
- [Roadmap](../delivery/roadmap.md) - Feature timeline
|
|
126
|
+
|
|
127
|
+
---
|
|
128
|
+
|
|
129
|
+
**Approval**:
|
|
130
|
+
- [ ] Product Owner: @name
|
|
131
|
+
- [ ] Engineering Lead: @name
|
|
132
|
+
- [ ] Stakeholder: @name
|