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.
Files changed (288) hide show
  1. package/INSTALL.md +848 -0
  2. package/LICENSE +21 -0
  3. package/README.md +675 -0
  4. package/SPECWEAVE.md +665 -0
  5. package/bin/install-agents.sh +57 -0
  6. package/bin/install-all.sh +49 -0
  7. package/bin/install-commands.sh +56 -0
  8. package/bin/install-skills.sh +57 -0
  9. package/bin/specweave.js +81 -0
  10. package/dist/adapters/adapter-base.d.ts +50 -0
  11. package/dist/adapters/adapter-base.d.ts.map +1 -0
  12. package/dist/adapters/adapter-base.js +146 -0
  13. package/dist/adapters/adapter-base.js.map +1 -0
  14. package/dist/adapters/adapter-interface.d.ts +108 -0
  15. package/dist/adapters/adapter-interface.d.ts.map +1 -0
  16. package/dist/adapters/adapter-interface.js +9 -0
  17. package/dist/adapters/adapter-interface.js.map +1 -0
  18. package/dist/adapters/claude/adapter.d.ts +54 -0
  19. package/dist/adapters/claude/adapter.d.ts.map +1 -0
  20. package/dist/adapters/claude/adapter.js +184 -0
  21. package/dist/adapters/claude/adapter.js.map +1 -0
  22. package/dist/adapters/copilot/adapter.d.ts +42 -0
  23. package/dist/adapters/copilot/adapter.d.ts.map +1 -0
  24. package/dist/adapters/copilot/adapter.js +239 -0
  25. package/dist/adapters/copilot/adapter.js.map +1 -0
  26. package/dist/adapters/cursor/adapter.d.ts +42 -0
  27. package/dist/adapters/cursor/adapter.d.ts.map +1 -0
  28. package/dist/adapters/cursor/adapter.js +297 -0
  29. package/dist/adapters/cursor/adapter.js.map +1 -0
  30. package/dist/adapters/generic/adapter.d.ts +40 -0
  31. package/dist/adapters/generic/adapter.d.ts.map +1 -0
  32. package/dist/adapters/generic/adapter.js +155 -0
  33. package/dist/adapters/generic/adapter.js.map +1 -0
  34. package/dist/cli/commands/init.d.ts +6 -0
  35. package/dist/cli/commands/init.d.ts.map +1 -0
  36. package/dist/cli/commands/init.js +247 -0
  37. package/dist/cli/commands/init.js.map +1 -0
  38. package/dist/cli/commands/install.d.ts +7 -0
  39. package/dist/cli/commands/install.d.ts.map +1 -0
  40. package/dist/cli/commands/install.js +160 -0
  41. package/dist/cli/commands/install.js.map +1 -0
  42. package/dist/cli/commands/list.d.ts +6 -0
  43. package/dist/cli/commands/list.d.ts.map +1 -0
  44. package/dist/cli/commands/list.js +154 -0
  45. package/dist/cli/commands/list.js.map +1 -0
  46. package/package.json +90 -0
  47. package/src/adapters/README.md +312 -0
  48. package/src/adapters/adapter-base.ts +146 -0
  49. package/src/adapters/adapter-interface.ts +120 -0
  50. package/src/adapters/claude/README.md +241 -0
  51. package/src/adapters/claude/adapter.ts +157 -0
  52. package/src/adapters/copilot/.github/copilot/instructions.md +376 -0
  53. package/src/adapters/copilot/README.md +200 -0
  54. package/src/adapters/copilot/adapter.ts +210 -0
  55. package/src/adapters/cursor/.cursor/context/docs-context.md +62 -0
  56. package/src/adapters/cursor/.cursor/context/increments-context.md +71 -0
  57. package/src/adapters/cursor/.cursor/context/strategy-context.md +73 -0
  58. package/src/adapters/cursor/.cursor/context/tests-context.md +89 -0
  59. package/src/adapters/cursor/.cursorrules +325 -0
  60. package/src/adapters/cursor/README.md +243 -0
  61. package/src/adapters/cursor/adapter.ts +268 -0
  62. package/src/adapters/generic/README.md +277 -0
  63. package/src/adapters/generic/SPECWEAVE-MANUAL.md +676 -0
  64. package/src/adapters/generic/adapter.ts +159 -0
  65. package/src/adapters/registry.yaml +126 -0
  66. package/src/agents/architect/AGENT.md +416 -0
  67. package/src/agents/devops/AGENT.md +1738 -0
  68. package/src/agents/docs-writer/AGENT.md +239 -0
  69. package/src/agents/performance/AGENT.md +228 -0
  70. package/src/agents/pm/AGENT.md +751 -0
  71. package/src/agents/qa-lead/AGENT.md +150 -0
  72. package/src/agents/security/AGENT.md +179 -0
  73. package/src/agents/sre/AGENT.md +582 -0
  74. package/src/agents/sre/modules/backend-diagnostics.md +481 -0
  75. package/src/agents/sre/modules/database-diagnostics.md +509 -0
  76. package/src/agents/sre/modules/infrastructure.md +561 -0
  77. package/src/agents/sre/modules/monitoring.md +439 -0
  78. package/src/agents/sre/modules/security-incidents.md +421 -0
  79. package/src/agents/sre/modules/ui-diagnostics.md +302 -0
  80. package/src/agents/sre/playbooks/01-high-cpu-usage.md +204 -0
  81. package/src/agents/sre/playbooks/02-database-deadlock.md +241 -0
  82. package/src/agents/sre/playbooks/03-memory-leak.md +252 -0
  83. package/src/agents/sre/playbooks/04-slow-api-response.md +269 -0
  84. package/src/agents/sre/playbooks/05-ddos-attack.md +293 -0
  85. package/src/agents/sre/playbooks/06-disk-full.md +314 -0
  86. package/src/agents/sre/playbooks/07-service-down.md +333 -0
  87. package/src/agents/sre/playbooks/08-data-corruption.md +337 -0
  88. package/src/agents/sre/playbooks/09-cascade-failure.md +430 -0
  89. package/src/agents/sre/playbooks/10-rate-limit-exceeded.md +464 -0
  90. package/src/agents/sre/scripts/health-check.sh +230 -0
  91. package/src/agents/sre/scripts/log-analyzer.py +213 -0
  92. package/src/agents/sre/scripts/metrics-collector.sh +294 -0
  93. package/src/agents/sre/scripts/trace-analyzer.js +257 -0
  94. package/src/agents/sre/templates/incident-report.md +249 -0
  95. package/src/agents/sre/templates/mitigation-plan.md +375 -0
  96. package/src/agents/sre/templates/post-mortem.md +418 -0
  97. package/src/agents/sre/templates/runbook-template.md +412 -0
  98. package/src/agents/tech-lead/AGENT.md +263 -0
  99. package/src/commands/add-tasks.md +176 -0
  100. package/src/commands/close-increment.md +347 -0
  101. package/src/commands/create-increment.md +223 -0
  102. package/src/commands/create-project.md +528 -0
  103. package/src/commands/generate-docs.md +623 -0
  104. package/src/commands/list-increments.md +180 -0
  105. package/src/commands/review-docs.md +331 -0
  106. package/src/commands/start-increment.md +139 -0
  107. package/src/commands/sync-github.md +115 -0
  108. package/src/commands/validate-increment.md +800 -0
  109. package/src/hooks/README.md +252 -0
  110. package/src/hooks/docs-changed.sh +59 -0
  111. package/src/hooks/human-input-required.sh +55 -0
  112. package/src/hooks/post-task-completion.sh +57 -0
  113. package/src/hooks/pre-implementation.sh +47 -0
  114. package/src/skills/ado-sync/README.md +449 -0
  115. package/src/skills/ado-sync/SKILL.md +245 -0
  116. package/src/skills/ado-sync/test-cases/test-1.yaml +9 -0
  117. package/src/skills/ado-sync/test-cases/test-2.yaml +8 -0
  118. package/src/skills/ado-sync/test-cases/test-3.yaml +9 -0
  119. package/src/skills/bmad-method-expert/SKILL.md +628 -0
  120. package/src/skills/bmad-method-expert/scripts/analyze-project.js +318 -0
  121. package/src/skills/bmad-method-expert/scripts/check-setup.js +208 -0
  122. package/src/skills/bmad-method-expert/scripts/generate-template.js +1149 -0
  123. package/src/skills/bmad-method-expert/scripts/validate-documents.js +340 -0
  124. package/src/skills/bmad-method-expert/test-cases/test-1-placeholder.yaml +12 -0
  125. package/src/skills/bmad-method-expert/test-cases/test-2-placeholder.yaml +12 -0
  126. package/src/skills/bmad-method-expert/test-cases/test-3-placeholder.yaml +12 -0
  127. package/src/skills/brownfield-analyzer/SKILL.md +523 -0
  128. package/src/skills/brownfield-analyzer/test-cases/test-1-basic-analysis.yaml +48 -0
  129. package/src/skills/brownfield-analyzer/test-cases/test-2-placeholder.yaml +12 -0
  130. package/src/skills/brownfield-analyzer/test-cases/test-3-placeholder.yaml +12 -0
  131. package/src/skills/brownfield-onboarder/SKILL.md +625 -0
  132. package/src/skills/brownfield-onboarder/test-cases/test-1-placeholder.yaml +12 -0
  133. package/src/skills/brownfield-onboarder/test-cases/test-2-placeholder.yaml +12 -0
  134. package/src/skills/brownfield-onboarder/test-cases/test-3-placeholder.yaml +12 -0
  135. package/src/skills/calendar-system/test-cases/test-1-placeholder.yaml +12 -0
  136. package/src/skills/calendar-system/test-cases/test-2-placeholder.yaml +12 -0
  137. package/src/skills/calendar-system/test-cases/test-3-placeholder.yaml +12 -0
  138. package/src/skills/context-loader/SKILL.md +734 -0
  139. package/src/skills/context-loader/test-cases/test-1-basic-loading.yaml +39 -0
  140. package/src/skills/context-loader/test-cases/test-2-token-budget-exceeded.yaml +44 -0
  141. package/src/skills/context-loader/test-cases/test-3-section-anchors.yaml +45 -0
  142. package/src/skills/context-optimizer/SKILL.md +618 -0
  143. package/src/skills/context-optimizer/test-cases/test-1-bug-fix-narrow.yaml +97 -0
  144. package/src/skills/context-optimizer/test-cases/test-2-feature-focused.yaml +109 -0
  145. package/src/skills/context-optimizer/test-cases/test-3-architecture-broad.yaml +98 -0
  146. package/src/skills/cost-optimizer/SKILL.md +190 -0
  147. package/src/skills/cost-optimizer/test-cases/test-1-basic-comparison.yaml +75 -0
  148. package/src/skills/cost-optimizer/test-cases/test-2-budget-constraint.yaml +52 -0
  149. package/src/skills/cost-optimizer/test-cases/test-3-scale-requirement.yaml +63 -0
  150. package/src/skills/cost-optimizer/test-results/README.md +46 -0
  151. package/src/skills/design-system-architect/SKILL.md +107 -0
  152. package/src/skills/design-system-architect/test-cases/test-1-token-structure.yaml +23 -0
  153. package/src/skills/design-system-architect/test-cases/test-2-component-hierarchy.yaml +24 -0
  154. package/src/skills/design-system-architect/test-cases/test-3-accessibility-checklist.yaml +23 -0
  155. package/src/skills/diagrams-architect/SKILL.md +763 -0
  156. package/src/skills/diagrams-generator/SKILL.md +25 -0
  157. package/src/skills/diagrams-generator/test-cases/test-1.yaml +9 -0
  158. package/src/skills/diagrams-generator/test-cases/test-2.yaml +9 -0
  159. package/src/skills/diagrams-generator/test-cases/test-3.yaml +8 -0
  160. package/src/skills/docs-updater/README.md +48 -0
  161. package/src/skills/docs-updater/test-cases/test-1-placeholder.yaml +12 -0
  162. package/src/skills/docs-updater/test-cases/test-2-placeholder.yaml +12 -0
  163. package/src/skills/docs-updater/test-cases/test-3-placeholder.yaml +12 -0
  164. package/src/skills/dotnet-backend/SKILL.md +250 -0
  165. package/src/skills/e2e-playwright/README.md +506 -0
  166. package/src/skills/e2e-playwright/SKILL.md +457 -0
  167. package/src/skills/e2e-playwright/execute.js +373 -0
  168. package/src/skills/e2e-playwright/lib/utils.js +514 -0
  169. package/src/skills/e2e-playwright/package.json +33 -0
  170. package/src/skills/e2e-playwright/test-cases/TC-001-basic-navigation.yaml +54 -0
  171. package/src/skills/e2e-playwright/test-cases/TC-002-form-interaction.yaml +64 -0
  172. package/src/skills/e2e-playwright/test-cases/TC-003-specweave-integration.yaml +74 -0
  173. package/src/skills/e2e-playwright/test-cases/TC-004-accessibility-check.yaml +98 -0
  174. package/src/skills/figma-designer/SKILL.md +149 -0
  175. package/src/skills/figma-implementer/SKILL.md +148 -0
  176. package/src/skills/figma-mcp-connector/SKILL.md +136 -0
  177. package/src/skills/figma-mcp-connector/test-cases/test-1-read-file-desktop.yaml +22 -0
  178. package/src/skills/figma-mcp-connector/test-cases/test-2-read-file-framelink.yaml +21 -0
  179. package/src/skills/figma-mcp-connector/test-cases/test-3-error-handling.yaml +18 -0
  180. package/src/skills/figma-to-code/SKILL.md +128 -0
  181. package/src/skills/figma-to-code/test-cases/test-1-token-generation.yaml +29 -0
  182. package/src/skills/figma-to-code/test-cases/test-2-component-generation.yaml +27 -0
  183. package/src/skills/figma-to-code/test-cases/test-3-typescript-generation.yaml +28 -0
  184. package/src/skills/frontend/SKILL.md +177 -0
  185. package/src/skills/github-sync/SKILL.md +252 -0
  186. package/src/skills/github-sync/test-cases/test-1-placeholder.yaml +12 -0
  187. package/src/skills/github-sync/test-cases/test-2-placeholder.yaml +12 -0
  188. package/src/skills/github-sync/test-cases/test-3-placeholder.yaml +12 -0
  189. package/src/skills/hetzner-provisioner/README.md +308 -0
  190. package/src/skills/hetzner-provisioner/SKILL.md +251 -0
  191. package/src/skills/hetzner-provisioner/test-cases/test-1-basic-provision.yaml +71 -0
  192. package/src/skills/hetzner-provisioner/test-cases/test-2-postgres-provision.yaml +85 -0
  193. package/src/skills/hetzner-provisioner/test-cases/test-3-ssl-config.yaml +126 -0
  194. package/src/skills/hetzner-provisioner/test-results/README.md +259 -0
  195. package/src/skills/increment-planner/SKILL.md +889 -0
  196. package/src/skills/increment-planner/scripts/feature-utils.js +250 -0
  197. package/src/skills/increment-planner/test-cases/test-1-basic-feature.yaml +27 -0
  198. package/src/skills/increment-planner/test-cases/test-2-complex-feature.yaml +30 -0
  199. package/src/skills/increment-planner/test-cases/test-3-auto-numbering.yaml +24 -0
  200. package/src/skills/increment-quality-judge/SKILL.md +566 -0
  201. package/src/skills/increment-quality-judge/test-cases/test-1-good-spec.yaml +95 -0
  202. package/src/skills/increment-quality-judge/test-cases/test-2-poor-spec.yaml +108 -0
  203. package/src/skills/increment-quality-judge/test-cases/test-3-export-suggestions.yaml +87 -0
  204. package/src/skills/jira-sync/README.md +328 -0
  205. package/src/skills/jira-sync/SKILL.md +209 -0
  206. package/src/skills/jira-sync/test-cases/test-1.yaml +9 -0
  207. package/src/skills/jira-sync/test-cases/test-2.yaml +9 -0
  208. package/src/skills/jira-sync/test-cases/test-3.yaml +10 -0
  209. package/src/skills/nextjs/SKILL.md +176 -0
  210. package/src/skills/nodejs-backend/SKILL.md +181 -0
  211. package/src/skills/notification-system/test-cases/test-1-placeholder.yaml +12 -0
  212. package/src/skills/notification-system/test-cases/test-2-placeholder.yaml +12 -0
  213. package/src/skills/notification-system/test-cases/test-3-placeholder.yaml +12 -0
  214. package/src/skills/python-backend/SKILL.md +226 -0
  215. package/src/skills/role-orchestrator/README.md +197 -0
  216. package/src/skills/role-orchestrator/SKILL.md +1184 -0
  217. package/src/skills/role-orchestrator/test-cases/test-1-simple-product.yaml +98 -0
  218. package/src/skills/role-orchestrator/test-cases/test-2-quality-gate-failure.yaml +73 -0
  219. package/src/skills/role-orchestrator/test-cases/test-3-security-workflow.yaml +121 -0
  220. package/src/skills/role-orchestrator/test-cases/test-4-parallel-execution.yaml +145 -0
  221. package/src/skills/role-orchestrator/test-cases/test-5-feedback-loops.yaml +149 -0
  222. package/src/skills/skill-creator/LICENSE.txt +202 -0
  223. package/src/skills/skill-creator/SKILL.md +209 -0
  224. package/src/skills/skill-creator/scripts/init_skill.py +303 -0
  225. package/src/skills/skill-creator/scripts/package_skill.py +110 -0
  226. package/src/skills/skill-creator/scripts/quick_validate.py +65 -0
  227. package/src/skills/skill-creator/test-cases/test-1-placeholder.yaml +12 -0
  228. package/src/skills/skill-creator/test-cases/test-2-placeholder.yaml +12 -0
  229. package/src/skills/skill-creator/test-cases/test-3-placeholder.yaml +12 -0
  230. package/src/skills/skill-router/SKILL.md +497 -0
  231. package/src/skills/skill-router/test-cases/test-1-basic-routing.yaml +33 -0
  232. package/src/skills/skill-router/test-cases/test-2-ambiguous-request.yaml +42 -0
  233. package/src/skills/skill-router/test-cases/test-3-nested-orchestration.yaml +50 -0
  234. package/src/skills/spec-driven-brainstorming/README.md +264 -0
  235. package/src/skills/spec-driven-brainstorming/SKILL.md +439 -0
  236. package/src/skills/spec-driven-brainstorming/test-cases/TC-001-simple-idea-to-design.yaml +148 -0
  237. package/src/skills/spec-driven-brainstorming/test-cases/TC-002-complex-ultrathink-design.yaml +190 -0
  238. package/src/skills/spec-driven-brainstorming/test-cases/TC-003-unclear-requirements-socratic.yaml +233 -0
  239. package/src/skills/spec-driven-debugging/README.md +479 -0
  240. package/src/skills/spec-driven-debugging/SKILL.md +652 -0
  241. package/src/skills/spec-driven-debugging/test-cases/TC-001-simple-auth-bug.yaml +212 -0
  242. package/src/skills/spec-driven-debugging/test-cases/TC-002-race-condition-ultrathink.yaml +461 -0
  243. package/src/skills/spec-driven-debugging/test-cases/TC-003-brownfield-missing-spec.yaml +366 -0
  244. package/src/skills/spec-kit-expert/SKILL.md +1012 -0
  245. package/src/skills/spec-kit-expert/test-cases/test-1-placeholder.yaml +12 -0
  246. package/src/skills/spec-kit-expert/test-cases/test-2-placeholder.yaml +12 -0
  247. package/src/skills/spec-kit-expert/test-cases/test-3-placeholder.yaml +12 -0
  248. package/src/skills/specweave-ado-mapper/SKILL.md +501 -0
  249. package/src/skills/specweave-detector/SKILL.md +420 -0
  250. package/src/skills/specweave-detector/test-cases/test-1-basic-detection.yaml +37 -0
  251. package/src/skills/specweave-detector/test-cases/test-2-missing-config.yaml +37 -0
  252. package/src/skills/specweave-detector/test-cases/test-3-non-specweave-project.yaml +34 -0
  253. package/src/skills/specweave-jira-mapper/SKILL.md +500 -0
  254. package/src/skills/stripe-integrator/test-cases/test-1-placeholder.yaml +12 -0
  255. package/src/skills/stripe-integrator/test-cases/test-2-placeholder.yaml +12 -0
  256. package/src/skills/stripe-integrator/test-cases/test-3-placeholder.yaml +12 -0
  257. package/src/skills/task-builder/README.md +90 -0
  258. package/src/skills/task-builder/test-cases/test-1-placeholder.yaml +12 -0
  259. package/src/skills/task-builder/test-cases/test-2-placeholder.yaml +12 -0
  260. package/src/skills/task-builder/test-cases/test-3-placeholder.yaml +12 -0
  261. package/src/templates/.env.example +144 -0
  262. package/src/templates/.gitignore.template +81 -0
  263. package/src/templates/CLAUDE.md.template +383 -0
  264. package/src/templates/README.md.template +240 -0
  265. package/src/templates/config.yaml +333 -0
  266. package/src/templates/docs/README.md +124 -0
  267. package/src/templates/docs/adr-template.md +118 -0
  268. package/src/templates/docs/hld-template.md +220 -0
  269. package/src/templates/docs/lld-template.md +580 -0
  270. package/src/templates/docs/prd-template.md +132 -0
  271. package/src/templates/docs/rfc-template.md +229 -0
  272. package/src/templates/docs/runbook-template.md +298 -0
  273. package/src/templates/environments/minimal/.env.production +16 -0
  274. package/src/templates/environments/minimal/README.md +54 -0
  275. package/src/templates/environments/minimal/deploy-production.yml +52 -0
  276. package/src/templates/environments/progressive/.env.qa +28 -0
  277. package/src/templates/environments/progressive/README.md +129 -0
  278. package/src/templates/environments/progressive/deploy-production.yml +93 -0
  279. package/src/templates/environments/progressive/deploy-qa.yml +62 -0
  280. package/src/templates/environments/progressive/deploy-staging.yml +67 -0
  281. package/src/templates/environments/standard/.env.development +20 -0
  282. package/src/templates/environments/standard/.env.production +30 -0
  283. package/src/templates/environments/standard/.env.staging +23 -0
  284. package/src/templates/environments/standard/README.md +97 -0
  285. package/src/templates/environments/standard/deploy-production.yml +68 -0
  286. package/src/templates/environments/standard/deploy-staging.yml +61 -0
  287. package/src/templates/environments/standard/docker-compose.yml +43 -0
  288. 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