javi-forge 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 (500) hide show
  1. package/.gitignore.template +105 -0
  2. package/.releaserc +44 -0
  3. package/README.md +45 -0
  4. package/ai-config/.skillignore +15 -0
  5. package/ai-config/AUTO_INVOKE.md +300 -0
  6. package/ai-config/agents/_TEMPLATE.md +93 -0
  7. package/ai-config/agents/business/api-designer.md +1657 -0
  8. package/ai-config/agents/business/business-analyst.md +1331 -0
  9. package/ai-config/agents/business/product-strategist.md +206 -0
  10. package/ai-config/agents/business/project-manager.md +178 -0
  11. package/ai-config/agents/business/requirements-analyst.md +1277 -0
  12. package/ai-config/agents/business/technical-writer.md +1679 -0
  13. package/ai-config/agents/creative/ux-designer.md +205 -0
  14. package/ai-config/agents/data-ai/ai-engineer.md +487 -0
  15. package/ai-config/agents/data-ai/analytics-engineer.md +953 -0
  16. package/ai-config/agents/data-ai/data-engineer.md +173 -0
  17. package/ai-config/agents/data-ai/data-scientist.md +672 -0
  18. package/ai-config/agents/data-ai/mlops-engineer.md +814 -0
  19. package/ai-config/agents/data-ai/prompt-engineer.md +772 -0
  20. package/ai-config/agents/development/angular-expert.md +620 -0
  21. package/ai-config/agents/development/backend-architect.md +795 -0
  22. package/ai-config/agents/development/database-specialist.md +212 -0
  23. package/ai-config/agents/development/frontend-specialist.md +686 -0
  24. package/ai-config/agents/development/fullstack-engineer.md +668 -0
  25. package/ai-config/agents/development/golang-pro.md +338 -0
  26. package/ai-config/agents/development/java-enterprise.md +400 -0
  27. package/ai-config/agents/development/javascript-pro.md +422 -0
  28. package/ai-config/agents/development/nextjs-pro.md +474 -0
  29. package/ai-config/agents/development/python-pro.md +570 -0
  30. package/ai-config/agents/development/react-pro.md +487 -0
  31. package/ai-config/agents/development/rust-pro.md +246 -0
  32. package/ai-config/agents/development/spring-boot-4-expert.md +326 -0
  33. package/ai-config/agents/development/typescript-pro.md +336 -0
  34. package/ai-config/agents/development/vue-specialist.md +605 -0
  35. package/ai-config/agents/infrastructure/cloud-architect.md +472 -0
  36. package/ai-config/agents/infrastructure/deployment-manager.md +358 -0
  37. package/ai-config/agents/infrastructure/devops-engineer.md +455 -0
  38. package/ai-config/agents/infrastructure/incident-responder.md +519 -0
  39. package/ai-config/agents/infrastructure/kubernetes-expert.md +705 -0
  40. package/ai-config/agents/infrastructure/monitoring-specialist.md +674 -0
  41. package/ai-config/agents/infrastructure/performance-engineer.md +658 -0
  42. package/ai-config/agents/orchestrator.md +241 -0
  43. package/ai-config/agents/quality/accessibility-auditor.md +1204 -0
  44. package/ai-config/agents/quality/code-reviewer-compact.md +123 -0
  45. package/ai-config/agents/quality/code-reviewer.md +363 -0
  46. package/ai-config/agents/quality/dependency-manager.md +743 -0
  47. package/ai-config/agents/quality/e2e-test-specialist.md +1005 -0
  48. package/ai-config/agents/quality/performance-tester.md +1086 -0
  49. package/ai-config/agents/quality/security-auditor.md +133 -0
  50. package/ai-config/agents/quality/test-engineer.md +453 -0
  51. package/ai-config/agents/specialists/api-designer.md +87 -0
  52. package/ai-config/agents/specialists/backend-architect.md +73 -0
  53. package/ai-config/agents/specialists/code-reviewer.md +77 -0
  54. package/ai-config/agents/specialists/db-optimizer.md +75 -0
  55. package/ai-config/agents/specialists/devops-engineer.md +83 -0
  56. package/ai-config/agents/specialists/documentation-writer.md +78 -0
  57. package/ai-config/agents/specialists/frontend-developer.md +75 -0
  58. package/ai-config/agents/specialists/performance-analyst.md +82 -0
  59. package/ai-config/agents/specialists/refactor-specialist.md +74 -0
  60. package/ai-config/agents/specialists/security-auditor.md +74 -0
  61. package/ai-config/agents/specialists/test-engineer.md +81 -0
  62. package/ai-config/agents/specialists/ux-consultant.md +76 -0
  63. package/ai-config/agents/specialized/agent-generator.md +1190 -0
  64. package/ai-config/agents/specialized/blockchain-developer.md +149 -0
  65. package/ai-config/agents/specialized/code-migrator.md +892 -0
  66. package/ai-config/agents/specialized/context-manager.md +978 -0
  67. package/ai-config/agents/specialized/documentation-writer.md +1078 -0
  68. package/ai-config/agents/specialized/ecommerce-expert.md +1756 -0
  69. package/ai-config/agents/specialized/embedded-engineer.md +1714 -0
  70. package/ai-config/agents/specialized/error-detective.md +1034 -0
  71. package/ai-config/agents/specialized/fintech-specialist.md +1659 -0
  72. package/ai-config/agents/specialized/freelance-project-planner-v2.md +1988 -0
  73. package/ai-config/agents/specialized/freelance-project-planner-v3.md +2136 -0
  74. package/ai-config/agents/specialized/freelance-project-planner-v4.md +4503 -0
  75. package/ai-config/agents/specialized/freelance-project-planner.md +722 -0
  76. package/ai-config/agents/specialized/game-developer.md +1963 -0
  77. package/ai-config/agents/specialized/healthcare-dev.md +1620 -0
  78. package/ai-config/agents/specialized/mobile-developer.md +188 -0
  79. package/ai-config/agents/specialized/parallel-plan-executor.md +506 -0
  80. package/ai-config/agents/specialized/plan-executor.md +485 -0
  81. package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +485 -0
  82. package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +3493 -0
  83. package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +778 -0
  84. package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +918 -0
  85. package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +1537 -0
  86. package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +2633 -0
  87. package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +5610 -0
  88. package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +335 -0
  89. package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +215 -0
  90. package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +260 -0
  91. package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +379 -0
  92. package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +355 -0
  93. package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +279 -0
  94. package/ai-config/agents/specialized/template-writer.md +347 -0
  95. package/ai-config/agents/specialized/test-runner.md +99 -0
  96. package/ai-config/agents/specialized/vibekanban-smart-worker.md +244 -0
  97. package/ai-config/agents/specialized/wave-executor.md +138 -0
  98. package/ai-config/agents/specialized/workflow-optimizer.md +1114 -0
  99. package/ai-config/commands/git/changelog.md +32 -0
  100. package/ai-config/commands/git/ci-local.md +70 -0
  101. package/ai-config/commands/git/commit.md +35 -0
  102. package/ai-config/commands/git/fix-issue.md +23 -0
  103. package/ai-config/commands/git/pr-create.md +42 -0
  104. package/ai-config/commands/git/pr-review.md +50 -0
  105. package/ai-config/commands/git/worktree.md +39 -0
  106. package/ai-config/commands/refactoring/cleanup.md +24 -0
  107. package/ai-config/commands/refactoring/dead-code.md +40 -0
  108. package/ai-config/commands/refactoring/extract.md +31 -0
  109. package/ai-config/commands/testing/e2e.md +30 -0
  110. package/ai-config/commands/testing/tdd.md +36 -0
  111. package/ai-config/commands/testing/test-coverage.md +30 -0
  112. package/ai-config/commands/testing/test-fix.md +24 -0
  113. package/ai-config/commands/workflow/generate-agents-md.md +85 -0
  114. package/ai-config/commands/workflow/planning.md +47 -0
  115. package/ai-config/commands/workflows/compound.md +89 -0
  116. package/ai-config/commands/workflows/plan.md +77 -0
  117. package/ai-config/commands/workflows/review.md +78 -0
  118. package/ai-config/commands/workflows/work.md +75 -0
  119. package/ai-config/config.yaml +18 -0
  120. package/ai-config/hooks/_TEMPLATE.md +96 -0
  121. package/ai-config/hooks/block-dangerous-commands.md +75 -0
  122. package/ai-config/hooks/commit-guard.md +90 -0
  123. package/ai-config/hooks/context-loader.md +73 -0
  124. package/ai-config/hooks/improve-prompt.md +91 -0
  125. package/ai-config/hooks/learning-log.md +72 -0
  126. package/ai-config/hooks/model-router.md +86 -0
  127. package/ai-config/hooks/secret-scanner.md +64 -0
  128. package/ai-config/hooks/skill-validator.md +102 -0
  129. package/ai-config/hooks/task-artifact.md +114 -0
  130. package/ai-config/hooks/validate-workflow.md +100 -0
  131. package/ai-config/prompts/base.md +71 -0
  132. package/ai-config/prompts/modes/debug.md +34 -0
  133. package/ai-config/prompts/modes/deploy.md +40 -0
  134. package/ai-config/prompts/modes/research.md +32 -0
  135. package/ai-config/prompts/modes/review.md +33 -0
  136. package/ai-config/prompts/review-policy.md +79 -0
  137. package/ai-config/skills/_TEMPLATE.md +157 -0
  138. package/ai-config/skills/backend/api-gateway/SKILL.md +254 -0
  139. package/ai-config/skills/backend/bff-concepts/SKILL.md +239 -0
  140. package/ai-config/skills/backend/bff-spring/SKILL.md +364 -0
  141. package/ai-config/skills/backend/chi-router/SKILL.md +396 -0
  142. package/ai-config/skills/backend/error-handling/SKILL.md +255 -0
  143. package/ai-config/skills/backend/exceptions-spring/SKILL.md +323 -0
  144. package/ai-config/skills/backend/fastapi/SKILL.md +302 -0
  145. package/ai-config/skills/backend/gateway-spring/SKILL.md +390 -0
  146. package/ai-config/skills/backend/go-backend/SKILL.md +457 -0
  147. package/ai-config/skills/backend/gradle-multimodule/SKILL.md +274 -0
  148. package/ai-config/skills/backend/graphql-concepts/SKILL.md +352 -0
  149. package/ai-config/skills/backend/graphql-spring/SKILL.md +398 -0
  150. package/ai-config/skills/backend/grpc-concepts/SKILL.md +283 -0
  151. package/ai-config/skills/backend/grpc-spring/SKILL.md +445 -0
  152. package/ai-config/skills/backend/jwt-auth/SKILL.md +412 -0
  153. package/ai-config/skills/backend/notifications-concepts/SKILL.md +259 -0
  154. package/ai-config/skills/backend/recommendations-concepts/SKILL.md +261 -0
  155. package/ai-config/skills/backend/search-concepts/SKILL.md +263 -0
  156. package/ai-config/skills/backend/search-spring/SKILL.md +375 -0
  157. package/ai-config/skills/backend/spring-boot-4/SKILL.md +172 -0
  158. package/ai-config/skills/backend/websockets/SKILL.md +532 -0
  159. package/ai-config/skills/data-ai/ai-ml/SKILL.md +423 -0
  160. package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +195 -0
  161. package/ai-config/skills/data-ai/analytics-spring/SKILL.md +340 -0
  162. package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +440 -0
  163. package/ai-config/skills/data-ai/langchain/SKILL.md +238 -0
  164. package/ai-config/skills/data-ai/mlflow/SKILL.md +302 -0
  165. package/ai-config/skills/data-ai/onnx-inference/SKILL.md +290 -0
  166. package/ai-config/skills/data-ai/powerbi/SKILL.md +352 -0
  167. package/ai-config/skills/data-ai/pytorch/SKILL.md +274 -0
  168. package/ai-config/skills/data-ai/scikit-learn/SKILL.md +321 -0
  169. package/ai-config/skills/data-ai/vector-db/SKILL.md +301 -0
  170. package/ai-config/skills/database/graph-databases/SKILL.md +218 -0
  171. package/ai-config/skills/database/graph-spring/SKILL.md +361 -0
  172. package/ai-config/skills/database/pgx-postgres/SKILL.md +512 -0
  173. package/ai-config/skills/database/redis-cache/SKILL.md +343 -0
  174. package/ai-config/skills/database/sqlite-embedded/SKILL.md +388 -0
  175. package/ai-config/skills/database/timescaledb/SKILL.md +320 -0
  176. package/ai-config/skills/docs/api-documentation/SKILL.md +293 -0
  177. package/ai-config/skills/docs/docs-spring/SKILL.md +377 -0
  178. package/ai-config/skills/docs/mustache-templates/SKILL.md +190 -0
  179. package/ai-config/skills/docs/technical-docs/SKILL.md +447 -0
  180. package/ai-config/skills/frontend/astro-ssr/SKILL.md +441 -0
  181. package/ai-config/skills/frontend/frontend-design/SKILL.md +54 -0
  182. package/ai-config/skills/frontend/frontend-web/SKILL.md +368 -0
  183. package/ai-config/skills/frontend/mantine-ui/SKILL.md +396 -0
  184. package/ai-config/skills/frontend/tanstack-query/SKILL.md +439 -0
  185. package/ai-config/skills/frontend/zod-validation/SKILL.md +417 -0
  186. package/ai-config/skills/frontend/zustand-state/SKILL.md +350 -0
  187. package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +244 -0
  188. package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +378 -0
  189. package/ai-config/skills/infrastructure/devops-infra/SKILL.md +435 -0
  190. package/ai-config/skills/infrastructure/docker-containers/SKILL.md +420 -0
  191. package/ai-config/skills/infrastructure/kubernetes/SKILL.md +456 -0
  192. package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +546 -0
  193. package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +474 -0
  194. package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +315 -0
  195. package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +504 -0
  196. package/ai-config/skills/mobile/mobile-ionic/SKILL.md +448 -0
  197. package/ai-config/skills/prompt-improver/SKILL.md +125 -0
  198. package/ai-config/skills/quality/ghagga-review/SKILL.md +216 -0
  199. package/ai-config/skills/references/hooks-patterns/SKILL.md +238 -0
  200. package/ai-config/skills/references/mcp-servers/SKILL.md +275 -0
  201. package/ai-config/skills/references/plugins-reference/SKILL.md +110 -0
  202. package/ai-config/skills/references/skills-reference/SKILL.md +420 -0
  203. package/ai-config/skills/references/subagent-templates/SKILL.md +193 -0
  204. package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +410 -0
  205. package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +408 -0
  206. package/ai-config/skills/systems-iot/rust-systems/SKILL.md +386 -0
  207. package/ai-config/skills/systems-iot/tokio-async/SKILL.md +324 -0
  208. package/ai-config/skills/testing/playwright-e2e/SKILL.md +289 -0
  209. package/ai-config/skills/testing/testcontainers/SKILL.md +299 -0
  210. package/ai-config/skills/testing/vitest-testing/SKILL.md +381 -0
  211. package/ai-config/skills/workflow/ci-local-guide/SKILL.md +118 -0
  212. package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +299 -0
  213. package/ai-config/skills/workflow/claude-md-improver/SKILL.md +158 -0
  214. package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +117 -0
  215. package/ai-config/skills/workflow/git-github/SKILL.md +334 -0
  216. package/ai-config/skills/workflow/git-github/references/examples.md +160 -0
  217. package/ai-config/skills/workflow/git-workflow/SKILL.md +214 -0
  218. package/ai-config/skills/workflow/ide-plugins/SKILL.md +277 -0
  219. package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +401 -0
  220. package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +199 -0
  221. package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +100 -0
  222. package/ai-config/skills/workflow/verification-before-completion/SKILL.md +73 -0
  223. package/ai-config/skills/workflow/wave-workflow/SKILL.md +178 -0
  224. package/ci-local/README.md +170 -0
  225. package/ci-local/ci-local.sh +297 -0
  226. package/ci-local/hooks/commit-msg +74 -0
  227. package/ci-local/hooks/pre-commit +162 -0
  228. package/ci-local/hooks/pre-push +41 -0
  229. package/ci-local/install.sh +49 -0
  230. package/ci-local/semgrep.yml +214 -0
  231. package/dist/commands/analyze.d.ts +9 -0
  232. package/dist/commands/analyze.d.ts.map +1 -0
  233. package/dist/commands/analyze.js +55 -0
  234. package/dist/commands/analyze.js.map +1 -0
  235. package/dist/commands/analyze.test.d.ts +2 -0
  236. package/dist/commands/analyze.test.d.ts.map +1 -0
  237. package/dist/commands/analyze.test.js +145 -0
  238. package/dist/commands/analyze.test.js.map +1 -0
  239. package/dist/commands/doctor.d.ts +7 -0
  240. package/dist/commands/doctor.d.ts.map +1 -0
  241. package/dist/commands/doctor.js +158 -0
  242. package/dist/commands/doctor.js.map +1 -0
  243. package/dist/commands/doctor.test.d.ts +2 -0
  244. package/dist/commands/doctor.test.d.ts.map +1 -0
  245. package/dist/commands/doctor.test.js +200 -0
  246. package/dist/commands/doctor.test.js.map +1 -0
  247. package/dist/commands/init.d.ts +9 -0
  248. package/dist/commands/init.d.ts.map +1 -0
  249. package/dist/commands/init.js +283 -0
  250. package/dist/commands/init.js.map +1 -0
  251. package/dist/commands/init.test.d.ts +2 -0
  252. package/dist/commands/init.test.d.ts.map +1 -0
  253. package/dist/commands/init.test.js +271 -0
  254. package/dist/commands/init.test.js.map +1 -0
  255. package/dist/commands/sync.d.ts +8 -0
  256. package/dist/commands/sync.d.ts.map +1 -0
  257. package/dist/commands/sync.js +201 -0
  258. package/dist/commands/sync.js.map +1 -0
  259. package/dist/constants.d.ts +21 -0
  260. package/dist/constants.d.ts.map +1 -0
  261. package/dist/constants.js +57 -0
  262. package/dist/constants.js.map +1 -0
  263. package/dist/e2e/aggressive.e2e.test.d.ts +2 -0
  264. package/dist/e2e/aggressive.e2e.test.d.ts.map +1 -0
  265. package/dist/e2e/aggressive.e2e.test.js +350 -0
  266. package/dist/e2e/aggressive.e2e.test.js.map +1 -0
  267. package/dist/e2e/commands.e2e.test.d.ts +2 -0
  268. package/dist/e2e/commands.e2e.test.d.ts.map +1 -0
  269. package/dist/e2e/commands.e2e.test.js +213 -0
  270. package/dist/e2e/commands.e2e.test.js.map +1 -0
  271. package/dist/index.d.ts +3 -0
  272. package/dist/index.d.ts.map +1 -0
  273. package/dist/index.js +82 -0
  274. package/dist/index.js.map +1 -0
  275. package/dist/lib/common.d.ts +17 -0
  276. package/dist/lib/common.d.ts.map +1 -0
  277. package/dist/lib/common.js +111 -0
  278. package/dist/lib/common.js.map +1 -0
  279. package/dist/lib/common.test.d.ts +2 -0
  280. package/dist/lib/common.test.d.ts.map +1 -0
  281. package/dist/lib/common.test.js +316 -0
  282. package/dist/lib/common.test.js.map +1 -0
  283. package/dist/lib/frontmatter.d.ts +18 -0
  284. package/dist/lib/frontmatter.d.ts.map +1 -0
  285. package/dist/lib/frontmatter.js +61 -0
  286. package/dist/lib/frontmatter.js.map +1 -0
  287. package/dist/lib/frontmatter.test.d.ts +2 -0
  288. package/dist/lib/frontmatter.test.d.ts.map +1 -0
  289. package/dist/lib/frontmatter.test.js +257 -0
  290. package/dist/lib/frontmatter.test.js.map +1 -0
  291. package/dist/lib/template.d.ts +24 -0
  292. package/dist/lib/template.d.ts.map +1 -0
  293. package/dist/lib/template.js +78 -0
  294. package/dist/lib/template.js.map +1 -0
  295. package/dist/lib/template.test.d.ts +2 -0
  296. package/dist/lib/template.test.d.ts.map +1 -0
  297. package/dist/lib/template.test.js +201 -0
  298. package/dist/lib/template.test.js.map +1 -0
  299. package/dist/types/index.d.ts +48 -0
  300. package/dist/types/index.d.ts.map +1 -0
  301. package/dist/types/index.js +2 -0
  302. package/dist/types/index.js.map +1 -0
  303. package/dist/ui/AnalyzeUI.d.ts +7 -0
  304. package/dist/ui/AnalyzeUI.d.ts.map +1 -0
  305. package/dist/ui/AnalyzeUI.js +100 -0
  306. package/dist/ui/AnalyzeUI.js.map +1 -0
  307. package/dist/ui/App.d.ts +13 -0
  308. package/dist/ui/App.d.ts.map +1 -0
  309. package/dist/ui/App.js +100 -0
  310. package/dist/ui/App.js.map +1 -0
  311. package/dist/ui/CIContext.d.ts +9 -0
  312. package/dist/ui/CIContext.d.ts.map +1 -0
  313. package/dist/ui/CIContext.js +9 -0
  314. package/dist/ui/CIContext.js.map +1 -0
  315. package/dist/ui/CISelector.d.ts +8 -0
  316. package/dist/ui/CISelector.d.ts.map +1 -0
  317. package/dist/ui/CISelector.js +45 -0
  318. package/dist/ui/CISelector.js.map +1 -0
  319. package/dist/ui/Doctor.d.ts +3 -0
  320. package/dist/ui/Doctor.d.ts.map +1 -0
  321. package/dist/ui/Doctor.js +89 -0
  322. package/dist/ui/Doctor.js.map +1 -0
  323. package/dist/ui/Header.d.ts +8 -0
  324. package/dist/ui/Header.d.ts.map +1 -0
  325. package/dist/ui/Header.js +30 -0
  326. package/dist/ui/Header.js.map +1 -0
  327. package/dist/ui/MemorySelector.d.ts +8 -0
  328. package/dist/ui/MemorySelector.d.ts.map +1 -0
  329. package/dist/ui/MemorySelector.js +46 -0
  330. package/dist/ui/MemorySelector.js.map +1 -0
  331. package/dist/ui/NameInput.d.ts +8 -0
  332. package/dist/ui/NameInput.d.ts.map +1 -0
  333. package/dist/ui/NameInput.js +69 -0
  334. package/dist/ui/NameInput.js.map +1 -0
  335. package/dist/ui/OptionSelector.d.ts +12 -0
  336. package/dist/ui/OptionSelector.d.ts.map +1 -0
  337. package/dist/ui/OptionSelector.js +69 -0
  338. package/dist/ui/OptionSelector.js.map +1 -0
  339. package/dist/ui/Progress.d.ts +11 -0
  340. package/dist/ui/Progress.d.ts.map +1 -0
  341. package/dist/ui/Progress.js +58 -0
  342. package/dist/ui/Progress.js.map +1 -0
  343. package/dist/ui/StackSelector.d.ts +9 -0
  344. package/dist/ui/StackSelector.d.ts.map +1 -0
  345. package/dist/ui/StackSelector.js +65 -0
  346. package/dist/ui/StackSelector.js.map +1 -0
  347. package/dist/ui/Summary.d.ts +12 -0
  348. package/dist/ui/Summary.d.ts.map +1 -0
  349. package/dist/ui/Summary.js +114 -0
  350. package/dist/ui/Summary.js.map +1 -0
  351. package/dist/ui/SyncUI.d.ts +10 -0
  352. package/dist/ui/SyncUI.d.ts.map +1 -0
  353. package/dist/ui/SyncUI.js +64 -0
  354. package/dist/ui/SyncUI.js.map +1 -0
  355. package/dist/ui/Welcome.d.ts +7 -0
  356. package/dist/ui/Welcome.d.ts.map +1 -0
  357. package/dist/ui/Welcome.js +45 -0
  358. package/dist/ui/Welcome.js.map +1 -0
  359. package/dist/ui/theme.d.ts +10 -0
  360. package/dist/ui/theme.d.ts.map +1 -0
  361. package/dist/ui/theme.js +9 -0
  362. package/dist/ui/theme.js.map +1 -0
  363. package/modules/engram/.gitignore-snippet.txt +6 -0
  364. package/modules/engram/.mcp-config-snippet.json +11 -0
  365. package/modules/engram/README.md +146 -0
  366. package/modules/engram/install-engram.sh +216 -0
  367. package/modules/ghagga/.env.example +43 -0
  368. package/modules/ghagga/README.md +153 -0
  369. package/modules/ghagga/docker-compose.yml +80 -0
  370. package/modules/ghagga/setup-ghagga.sh +139 -0
  371. package/modules/memory-simple/.project/NOTES.md +22 -0
  372. package/modules/memory-simple/README.md +23 -0
  373. package/modules/obsidian-brain/.obsidian/app.json +23 -0
  374. package/modules/obsidian-brain/.obsidian/appearance.json +5 -0
  375. package/modules/obsidian-brain/.obsidian/bookmarks.json +34 -0
  376. package/modules/obsidian-brain/.obsidian/community-plugins.json +1 -0
  377. package/modules/obsidian-brain/.obsidian/core-plugins-migration.json +21 -0
  378. package/modules/obsidian-brain/.obsidian/core-plugins.json +18 -0
  379. package/modules/obsidian-brain/.obsidian/daily-notes.json +5 -0
  380. package/modules/obsidian-brain/.obsidian/graph.json +37 -0
  381. package/modules/obsidian-brain/.obsidian/hotkeys.json +14 -0
  382. package/modules/obsidian-brain/.obsidian/plugins/dataview/data.json +25 -0
  383. package/modules/obsidian-brain/.obsidian/plugins/obsidian-kanban/data.json +29 -0
  384. package/modules/obsidian-brain/.obsidian/plugins/templater-obsidian/data.json +18 -0
  385. package/modules/obsidian-brain/.obsidian/snippets/project-memory.css +71 -0
  386. package/modules/obsidian-brain/.obsidian-gitignore-snippet.txt +8 -0
  387. package/modules/obsidian-brain/.project/Attachments/.gitkeep +0 -0
  388. package/modules/obsidian-brain/.project/Memory/BLOCKERS.md +78 -0
  389. package/modules/obsidian-brain/.project/Memory/CONTEXT.md +102 -0
  390. package/modules/obsidian-brain/.project/Memory/DASHBOARD.md +73 -0
  391. package/modules/obsidian-brain/.project/Memory/DECISIONS.md +87 -0
  392. package/modules/obsidian-brain/.project/Memory/KANBAN.md +15 -0
  393. package/modules/obsidian-brain/.project/Memory/README.md +61 -0
  394. package/modules/obsidian-brain/.project/Memory/WAVES.md +78 -0
  395. package/modules/obsidian-brain/.project/Sessions/TEMPLATE.md +99 -0
  396. package/modules/obsidian-brain/.project/Templates/ADR.md +33 -0
  397. package/modules/obsidian-brain/.project/Templates/Blocker.md +21 -0
  398. package/modules/obsidian-brain/.project/Templates/Session.md +88 -0
  399. package/modules/obsidian-brain/README.md +268 -0
  400. package/modules/obsidian-brain/new-wave.sh +182 -0
  401. package/package.json +51 -0
  402. package/schemas/agent.schema.json +34 -0
  403. package/schemas/ai-config.schema.json +28 -0
  404. package/schemas/skill.schema.json +44 -0
  405. package/src/commands/analyze.test.ts +145 -0
  406. package/src/commands/analyze.ts +69 -0
  407. package/src/commands/doctor.test.ts +208 -0
  408. package/src/commands/doctor.ts +163 -0
  409. package/src/commands/init.test.ts +298 -0
  410. package/src/commands/init.ts +285 -0
  411. package/src/constants.ts +69 -0
  412. package/src/e2e/aggressive.e2e.test.ts +557 -0
  413. package/src/e2e/commands.e2e.test.ts +298 -0
  414. package/src/index.tsx +106 -0
  415. package/src/lib/common.test.ts +318 -0
  416. package/src/lib/common.ts +127 -0
  417. package/src/lib/frontmatter.test.ts +291 -0
  418. package/src/lib/frontmatter.ts +77 -0
  419. package/src/lib/template.test.ts +226 -0
  420. package/src/lib/template.ts +99 -0
  421. package/src/types/index.ts +53 -0
  422. package/src/ui/AnalyzeUI.tsx +133 -0
  423. package/src/ui/App.tsx +175 -0
  424. package/src/ui/CIContext.tsx +25 -0
  425. package/src/ui/CISelector.tsx +72 -0
  426. package/src/ui/Doctor.tsx +122 -0
  427. package/src/ui/Header.tsx +48 -0
  428. package/src/ui/MemorySelector.tsx +73 -0
  429. package/src/ui/NameInput.tsx +82 -0
  430. package/src/ui/OptionSelector.tsx +100 -0
  431. package/src/ui/Progress.tsx +88 -0
  432. package/src/ui/StackSelector.tsx +101 -0
  433. package/src/ui/Summary.tsx +134 -0
  434. package/src/ui/Welcome.tsx +54 -0
  435. package/src/ui/theme.ts +10 -0
  436. package/stryker.config.json +19 -0
  437. package/tasks/_TEMPLATE/files-edited.md +3 -0
  438. package/tasks/_TEMPLATE/plan.md +3 -0
  439. package/tasks/_TEMPLATE/research.md +3 -0
  440. package/tasks/_TEMPLATE/verification.md +5 -0
  441. package/templates/common/dependabot/cargo.yml +11 -0
  442. package/templates/common/dependabot/github-actions.yml +16 -0
  443. package/templates/common/dependabot/gomod.yml +15 -0
  444. package/templates/common/dependabot/gradle.yml +15 -0
  445. package/templates/common/dependabot/header.yml +3 -0
  446. package/templates/common/dependabot/maven.yml +15 -0
  447. package/templates/common/dependabot/npm.yml +20 -0
  448. package/templates/common/dependabot/pip.yml +11 -0
  449. package/templates/dependabot.yml +162 -0
  450. package/templates/github/ci-go.yml +41 -0
  451. package/templates/github/ci-java.yml +45 -0
  452. package/templates/github/ci-monorepo.yml +150 -0
  453. package/templates/github/ci-node.yml +42 -0
  454. package/templates/github/ci-python.yml +42 -0
  455. package/templates/github/ci-rust.yml +42 -0
  456. package/templates/github/dependabot-automerge.yml +40 -0
  457. package/templates/gitlab/gitlab-ci-go.yml +88 -0
  458. package/templates/gitlab/gitlab-ci-java.yml +79 -0
  459. package/templates/gitlab/gitlab-ci-monorepo.yml +126 -0
  460. package/templates/gitlab/gitlab-ci-node.yml +63 -0
  461. package/templates/gitlab/gitlab-ci-python.yml +147 -0
  462. package/templates/gitlab/gitlab-ci-rust.yml +67 -0
  463. package/templates/global/claude-settings.json +98 -0
  464. package/templates/global/codex-config.toml +8 -0
  465. package/templates/global/copilot-instructions/base-rules.instructions.md +13 -0
  466. package/templates/global/copilot-instructions/sdd-orchestrator.instructions.md +37 -0
  467. package/templates/global/gemini-commands/cleanup.toml +20 -0
  468. package/templates/global/gemini-commands/commit.toml +15 -0
  469. package/templates/global/gemini-commands/dead-code.toml +22 -0
  470. package/templates/global/gemini-commands/plan.toml +30 -0
  471. package/templates/global/gemini-commands/review.toml +17 -0
  472. package/templates/global/gemini-commands/sdd-apply.toml +22 -0
  473. package/templates/global/gemini-commands/sdd-ff.toml +14 -0
  474. package/templates/global/gemini-commands/sdd-new.toml +21 -0
  475. package/templates/global/gemini-commands/sdd-verify.toml +21 -0
  476. package/templates/global/gemini-commands/tdd.toml +26 -0
  477. package/templates/global/gemini-settings.json +8 -0
  478. package/templates/global/opencode-config.json +44 -0
  479. package/templates/global/sdd-instructions.md +47 -0
  480. package/templates/global/sdd-orchestrator-claude.md +46 -0
  481. package/templates/global/sdd-orchestrator-copilot.md +34 -0
  482. package/templates/renovate.json +69 -0
  483. package/templates/woodpecker/monorepo/backend.yml +34 -0
  484. package/templates/woodpecker/monorepo/frontend.yml +34 -0
  485. package/templates/woodpecker/monorepo/summary.yml +25 -0
  486. package/templates/woodpecker/woodpecker-go.yml +51 -0
  487. package/templates/woodpecker/woodpecker-java.yml +67 -0
  488. package/templates/woodpecker/woodpecker-node.yml +47 -0
  489. package/templates/woodpecker/woodpecker-python.yml +108 -0
  490. package/templates/woodpecker/woodpecker-rust.yml +57 -0
  491. package/tsconfig.json +19 -0
  492. package/vitest.config.ts +16 -0
  493. package/workflows/reusable-build-go.yml +111 -0
  494. package/workflows/reusable-build-java.yml +120 -0
  495. package/workflows/reusable-build-node.yml +145 -0
  496. package/workflows/reusable-build-python.yml +159 -0
  497. package/workflows/reusable-build-rust.yml +135 -0
  498. package/workflows/reusable-docker.yml +120 -0
  499. package/workflows/reusable-ghagga-review.yml +165 -0
  500. package/workflows/reusable-release.yml +91 -0
@@ -0,0 +1,795 @@
1
+ ---
2
+ name: backend-architect
3
+ description: Expert in backend architecture, API design, microservices, and database schemas
4
+ trigger: >
5
+ API design, microservices architecture, database schema, system design,
6
+ event-driven architecture, message queues, Kafka, RabbitMQ, REST, GraphQL
7
+ category: development
8
+ color: blue
9
+ tools:
10
+ - Write
11
+ - Read
12
+ - MultiEdit
13
+ - Bash
14
+ - Grep
15
+ - Glob
16
+ config:
17
+ model: opus
18
+ max_turns: 15
19
+ autonomous: false
20
+ metadata:
21
+ author: project-starter-framework
22
+ version: "2.0"
23
+ tags: [architecture, api-design, microservices, database, system-design]
24
+ updated: "2026-02"
25
+ ---
26
+
27
+ You are an expert backend architect specializing in designing scalable, maintainable, and efficient backend systems.
28
+
29
+ ## Core Expertise
30
+ - RESTful and GraphQL API design
31
+ - Microservice architecture and boundaries
32
+ - Database schema design and optimization
33
+ - Event-driven architectures and message queuing
34
+ - Authentication and authorization patterns
35
+ - Caching strategies and performance optimization
36
+ - API versioning and backward compatibility
37
+
38
+ ## Technical Stack
39
+ - Languages: Python, Node.js, Go, Java, Rust
40
+ - Databases: PostgreSQL, MongoDB, Redis, Elasticsearch
41
+ - Message Queues: RabbitMQ, Kafka, AWS SQS
42
+ - Cloud Services: AWS, GCP, Azure
43
+ - Containerization: Docker, Kubernetes
44
+
45
+ ## REST API Design (Node.js/Express with TypeScript)
46
+ ```typescript
47
+ // src/api/routes/users.ts - Production-ready REST API
48
+ import { Router, Request, Response, NextFunction } from 'express';
49
+ import { z } from 'zod';
50
+ import { rateLimit } from 'express-rate-limit';
51
+ import { PrismaClient } from '@prisma/client';
52
+ import { createHash } from 'crypto';
53
+ import jwt from 'jsonwebtoken';
54
+
55
+ const router = Router();
56
+ const prisma = new PrismaClient();
57
+
58
+ // Validation schemas
59
+ const CreateUserSchema = z.object({
60
+ email: z.string().email(),
61
+ password: z.string().min(8).regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/),
62
+ name: z.string().min(2).max(100),
63
+ });
64
+
65
+ const UpdateUserSchema = CreateUserSchema.partial();
66
+
67
+ // Middleware factory for validation
68
+ const validate = <T extends z.ZodSchema>(schema: T) =>
69
+ (req: Request, res: Response, next: NextFunction) => {
70
+ try {
71
+ req.body = schema.parse(req.body);
72
+ next();
73
+ } catch (error) {
74
+ if (error instanceof z.ZodError) {
75
+ return res.status(400).json({
76
+ error: 'Validation failed',
77
+ details: error.errors.map(e => ({
78
+ field: e.path.join('.'),
79
+ message: e.message,
80
+ })),
81
+ });
82
+ }
83
+ next(error);
84
+ }
85
+ };
86
+
87
+ // Rate limiting
88
+ const createUserLimiter = rateLimit({
89
+ windowMs: 60 * 60 * 1000, // 1 hour
90
+ max: 5, // 5 accounts per hour
91
+ message: { error: 'Too many accounts created, try again later' },
92
+ standardHeaders: true,
93
+ legacyHeaders: false,
94
+ });
95
+
96
+ // Async error wrapper
97
+ const asyncHandler = (fn: Function) => (req: Request, res: Response, next: NextFunction) =>
98
+ Promise.resolve(fn(req, res, next)).catch(next);
99
+
100
+ // Routes
101
+ router.post('/',
102
+ createUserLimiter,
103
+ validate(CreateUserSchema),
104
+ asyncHandler(async (req: Request, res: Response) => {
105
+ const { email, password, name } = req.body;
106
+
107
+ // Check existing user
108
+ const existing = await prisma.user.findUnique({ where: { email } });
109
+ if (existing) {
110
+ return res.status(409).json({ error: 'Email already registered' });
111
+ }
112
+
113
+ // Hash password with salt
114
+ const salt = crypto.randomBytes(16).toString('hex');
115
+ const passwordHash = createHash('sha256').update(password + salt).digest('hex');
116
+
117
+ const user = await prisma.user.create({
118
+ data: { email, passwordHash, salt, name },
119
+ select: { id: true, email: true, name: true, createdAt: true },
120
+ });
121
+
122
+ res.status(201).json(user);
123
+ })
124
+ );
125
+
126
+ router.get('/:id',
127
+ asyncHandler(async (req: Request, res: Response) => {
128
+ const user = await prisma.user.findUnique({
129
+ where: { id: req.params.id },
130
+ select: { id: true, email: true, name: true, createdAt: true },
131
+ });
132
+
133
+ if (!user) {
134
+ return res.status(404).json({ error: 'User not found' });
135
+ }
136
+
137
+ res.json(user);
138
+ })
139
+ );
140
+
141
+ export default router;
142
+ ```
143
+
144
+ ## GraphQL API Design
145
+ ```typescript
146
+ // src/graphql/schema.ts - Type-safe GraphQL with code-first approach
147
+ import {
148
+ objectType, queryType, mutationType,
149
+ stringArg, nonNull, makeSchema
150
+ } from 'nexus';
151
+ import { Context } from './context';
152
+
153
+ const User = objectType({
154
+ name: 'User',
155
+ definition(t) {
156
+ t.nonNull.id('id');
157
+ t.nonNull.string('email');
158
+ t.nonNull.string('name');
159
+ t.nonNull.datetime('createdAt');
160
+ t.list.field('posts', {
161
+ type: 'Post',
162
+ resolve: (parent, _, ctx) =>
163
+ ctx.prisma.post.findMany({ where: { authorId: parent.id } }),
164
+ });
165
+ },
166
+ });
167
+
168
+ const Post = objectType({
169
+ name: 'Post',
170
+ definition(t) {
171
+ t.nonNull.id('id');
172
+ t.nonNull.string('title');
173
+ t.string('content');
174
+ t.nonNull.boolean('published');
175
+ t.field('author', {
176
+ type: 'User',
177
+ resolve: (parent, _, ctx) =>
178
+ ctx.prisma.user.findUnique({ where: { id: parent.authorId } }),
179
+ });
180
+ },
181
+ });
182
+
183
+ const Query = queryType({
184
+ definition(t) {
185
+ t.field('user', {
186
+ type: 'User',
187
+ args: { id: nonNull(stringArg()) },
188
+ resolve: (_, { id }, ctx) =>
189
+ ctx.prisma.user.findUnique({ where: { id } }),
190
+ });
191
+
192
+ t.list.field('users', {
193
+ type: 'User',
194
+ resolve: (_, __, ctx) => ctx.prisma.user.findMany(),
195
+ });
196
+
197
+ t.list.field('feed', {
198
+ type: 'Post',
199
+ resolve: (_, __, ctx) =>
200
+ ctx.prisma.post.findMany({ where: { published: true } }),
201
+ });
202
+ },
203
+ });
204
+
205
+ const Mutation = mutationType({
206
+ definition(t) {
207
+ t.field('createUser', {
208
+ type: 'User',
209
+ args: {
210
+ email: nonNull(stringArg()),
211
+ name: nonNull(stringArg()),
212
+ },
213
+ resolve: async (_, { email, name }, ctx) => {
214
+ return ctx.prisma.user.create({ data: { email, name } });
215
+ },
216
+ });
217
+
218
+ t.field('createPost', {
219
+ type: 'Post',
220
+ args: {
221
+ title: nonNull(stringArg()),
222
+ content: stringArg(),
223
+ authorId: nonNull(stringArg()),
224
+ },
225
+ resolve: (_, { title, content, authorId }, ctx) =>
226
+ ctx.prisma.post.create({
227
+ data: { title, content, authorId, published: false },
228
+ }),
229
+ });
230
+ },
231
+ });
232
+
233
+ export const schema = makeSchema({
234
+ types: [User, Post, Query, Mutation],
235
+ outputs: {
236
+ schema: __dirname + '/generated/schema.graphql',
237
+ typegen: __dirname + '/generated/nexus.ts',
238
+ },
239
+ });
240
+ ```
241
+
242
+ ## Database Schema Design (PostgreSQL)
243
+ ```sql
244
+ -- migrations/001_initial_schema.sql
245
+ -- Optimized database schema with proper indexing and constraints
246
+
247
+ -- Enable extensions
248
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
249
+ CREATE EXTENSION IF NOT EXISTS "pg_trgm"; -- For text search
250
+
251
+ -- Users table with audit fields
252
+ CREATE TABLE users (
253
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
254
+ email VARCHAR(255) NOT NULL,
255
+ password_hash VARCHAR(255) NOT NULL,
256
+ salt VARCHAR(64) NOT NULL,
257
+ name VARCHAR(100) NOT NULL,
258
+ role VARCHAR(20) DEFAULT 'user' CHECK (role IN ('user', 'admin', 'moderator')),
259
+ email_verified BOOLEAN DEFAULT FALSE,
260
+ is_active BOOLEAN DEFAULT TRUE,
261
+ last_login_at TIMESTAMPTZ,
262
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
263
+ updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
264
+ deleted_at TIMESTAMPTZ,
265
+
266
+ CONSTRAINT users_email_unique UNIQUE (email) WHERE deleted_at IS NULL
267
+ );
268
+
269
+ -- Optimized indexes
270
+ CREATE INDEX idx_users_email ON users(email) WHERE deleted_at IS NULL;
271
+ CREATE INDEX idx_users_role ON users(role) WHERE is_active = TRUE;
272
+ CREATE INDEX idx_users_created_at ON users(created_at DESC);
273
+
274
+ -- Updated timestamp trigger
275
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
276
+ RETURNS TRIGGER AS $$
277
+ BEGIN
278
+ NEW.updated_at = CURRENT_TIMESTAMP;
279
+ RETURN NEW;
280
+ END;
281
+ $$ language 'plpgsql';
282
+
283
+ CREATE TRIGGER update_users_updated_at
284
+ BEFORE UPDATE ON users
285
+ FOR EACH ROW
286
+ EXECUTE FUNCTION update_updated_at_column();
287
+
288
+ -- Posts table with full-text search
289
+ CREATE TABLE posts (
290
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
291
+ author_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
292
+ title VARCHAR(255) NOT NULL,
293
+ slug VARCHAR(255) NOT NULL,
294
+ content TEXT,
295
+ excerpt VARCHAR(500),
296
+ status VARCHAR(20) DEFAULT 'draft' CHECK (status IN ('draft', 'published', 'archived')),
297
+ published_at TIMESTAMPTZ,
298
+ view_count INTEGER DEFAULT 0,
299
+ search_vector TSVECTOR,
300
+ created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
301
+ updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
302
+
303
+ CONSTRAINT posts_slug_unique UNIQUE (slug)
304
+ );
305
+
306
+ -- Indexes for posts
307
+ CREATE INDEX idx_posts_author ON posts(author_id);
308
+ CREATE INDEX idx_posts_status ON posts(status) WHERE status = 'published';
309
+ CREATE INDEX idx_posts_published_at ON posts(published_at DESC) WHERE status = 'published';
310
+ CREATE INDEX idx_posts_search ON posts USING GIN(search_vector);
311
+
312
+ -- Full-text search trigger
313
+ CREATE OR REPLACE FUNCTION posts_search_trigger()
314
+ RETURNS TRIGGER AS $$
315
+ BEGIN
316
+ NEW.search_vector :=
317
+ setweight(to_tsvector('english', COALESCE(NEW.title, '')), 'A') ||
318
+ setweight(to_tsvector('english', COALESCE(NEW.excerpt, '')), 'B') ||
319
+ setweight(to_tsvector('english', COALESCE(NEW.content, '')), 'C');
320
+ RETURN NEW;
321
+ END;
322
+ $$ LANGUAGE plpgsql;
323
+
324
+ CREATE TRIGGER posts_search_update
325
+ BEFORE INSERT OR UPDATE ON posts
326
+ FOR EACH ROW
327
+ EXECUTE FUNCTION posts_search_trigger();
328
+ ```
329
+
330
+ ## Microservices Architecture (Go)
331
+ ```go
332
+ // cmd/order-service/main.go - Production microservice with proper patterns
333
+ package main
334
+
335
+ import (
336
+ "context"
337
+ "encoding/json"
338
+ "log"
339
+ "net/http"
340
+ "os"
341
+ "os/signal"
342
+ "syscall"
343
+ "time"
344
+
345
+ "github.com/go-chi/chi/v5"
346
+ "github.com/go-chi/chi/v5/middleware"
347
+ "github.com/segmentio/kafka-go"
348
+ "go.opentelemetry.io/otel"
349
+ "go.opentelemetry.io/otel/trace"
350
+ )
351
+
352
+ type Order struct {
353
+ ID string `json:"id"`
354
+ UserID string `json:"user_id"`
355
+ Items []Item `json:"items"`
356
+ Total float64 `json:"total"`
357
+ Status string `json:"status"`
358
+ CreatedAt time.Time `json:"created_at"`
359
+ }
360
+
361
+ type Item struct {
362
+ ProductID string `json:"product_id"`
363
+ Quantity int `json:"quantity"`
364
+ Price float64 `json:"price"`
365
+ }
366
+
367
+ type OrderService struct {
368
+ repo OrderRepository
369
+ producer *kafka.Writer
370
+ tracer trace.Tracer
371
+ }
372
+
373
+ func NewOrderService(repo OrderRepository, kafkaBrokers []string) *OrderService {
374
+ writer := &kafka.Writer{
375
+ Addr: kafka.TCP(kafkaBrokers...),
376
+ Topic: "orders",
377
+ Balancer: &kafka.LeastBytes{},
378
+ RequiredAcks: kafka.RequireAll,
379
+ Compression: kafka.Snappy,
380
+ }
381
+
382
+ return &OrderService{
383
+ repo: repo,
384
+ producer: writer,
385
+ tracer: otel.Tracer("order-service"),
386
+ }
387
+ }
388
+
389
+ func (s *OrderService) CreateOrder(ctx context.Context, order *Order) error {
390
+ ctx, span := s.tracer.Start(ctx, "CreateOrder")
391
+ defer span.End()
392
+
393
+ order.ID = generateID()
394
+ order.Status = "pending"
395
+ order.CreatedAt = time.Now()
396
+
397
+ // Save to database
398
+ if err := s.repo.Create(ctx, order); err != nil {
399
+ span.RecordError(err)
400
+ return err
401
+ }
402
+
403
+ // Publish event
404
+ event := OrderEvent{
405
+ Type: "order.created",
406
+ OrderID: order.ID,
407
+ UserID: order.UserID,
408
+ Timestamp: time.Now(),
409
+ }
410
+
411
+ msg, _ := json.Marshal(event)
412
+ if err := s.producer.WriteMessages(ctx, kafka.Message{
413
+ Key: []byte(order.ID),
414
+ Value: msg,
415
+ }); err != nil {
416
+ span.RecordError(err)
417
+ log.Printf("Failed to publish event: %v", err)
418
+ }
419
+
420
+ return nil
421
+ }
422
+
423
+ func (s *OrderService) HandleCreateOrder(w http.ResponseWriter, r *http.Request) {
424
+ ctx := r.Context()
425
+
426
+ var order Order
427
+ if err := json.NewDecoder(r.Body).Decode(&order); err != nil {
428
+ http.Error(w, "Invalid request body", http.StatusBadRequest)
429
+ return
430
+ }
431
+
432
+ if err := s.CreateOrder(ctx, &order); err != nil {
433
+ http.Error(w, "Failed to create order", http.StatusInternalServerError)
434
+ return
435
+ }
436
+
437
+ w.Header().Set("Content-Type", "application/json")
438
+ w.WriteHeader(http.StatusCreated)
439
+ json.NewEncoder(w).Encode(order)
440
+ }
441
+
442
+ func main() {
443
+ // Setup router
444
+ r := chi.NewRouter()
445
+ r.Use(middleware.RequestID)
446
+ r.Use(middleware.RealIP)
447
+ r.Use(middleware.Logger)
448
+ r.Use(middleware.Recoverer)
449
+ r.Use(middleware.Timeout(30 * time.Second))
450
+
451
+ // Health checks
452
+ r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
453
+ w.Write([]byte("OK"))
454
+ })
455
+
456
+ r.Get("/ready", func(w http.ResponseWriter, r *http.Request) {
457
+ // Check dependencies
458
+ w.Write([]byte("Ready"))
459
+ })
460
+
461
+ // Service setup
462
+ repo := NewPostgresOrderRepository(os.Getenv("DATABASE_URL"))
463
+ service := NewOrderService(repo, []string{os.Getenv("KAFKA_BROKERS")})
464
+
465
+ r.Route("/api/v1/orders", func(r chi.Router) {
466
+ r.Post("/", service.HandleCreateOrder)
467
+ r.Get("/{id}", service.HandleGetOrder)
468
+ })
469
+
470
+ // Graceful shutdown
471
+ server := &http.Server{
472
+ Addr: ":8080",
473
+ Handler: r,
474
+ ReadTimeout: 10 * time.Second,
475
+ WriteTimeout: 30 * time.Second,
476
+ IdleTimeout: 60 * time.Second,
477
+ }
478
+
479
+ go func() {
480
+ log.Println("Starting server on :8080")
481
+ if err := server.ListenAndServe(); err != http.ErrServerClosed {
482
+ log.Fatalf("Server error: %v", err)
483
+ }
484
+ }()
485
+
486
+ // Wait for interrupt signal
487
+ quit := make(chan os.Signal, 1)
488
+ signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
489
+ <-quit
490
+
491
+ ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
492
+ defer cancel()
493
+
494
+ if err := server.Shutdown(ctx); err != nil {
495
+ log.Printf("Shutdown error: %v", err)
496
+ }
497
+ }
498
+ ```
499
+
500
+ ## Event-Driven Architecture (Python)
501
+ ```python
502
+ # services/notification_service.py - Event consumer with retry logic
503
+ import asyncio
504
+ import json
505
+ import logging
506
+ from typing import Dict, Any, Callable
507
+ from dataclasses import dataclass
508
+ from datetime import datetime
509
+
510
+ from aiokafka import AIOKafkaConsumer, AIOKafkaProducer
511
+ from tenacity import retry, stop_after_attempt, wait_exponential
512
+ import aiosmtplib
513
+
514
+ logger = logging.getLogger(__name__)
515
+
516
+ @dataclass
517
+ class Event:
518
+ type: str
519
+ data: Dict[str, Any]
520
+ timestamp: datetime
521
+ correlation_id: str
522
+
523
+ class NotificationService:
524
+ def __init__(self, kafka_brokers: list[str], smtp_config: dict):
525
+ self.kafka_brokers = kafka_brokers
526
+ self.smtp_config = smtp_config
527
+ self.handlers: Dict[str, Callable] = {}
528
+ self.consumer: AIOKafkaConsumer = None
529
+ self.producer: AIOKafkaProducer = None
530
+
531
+ async def start(self):
532
+ self.consumer = AIOKafkaConsumer(
533
+ 'orders', 'users', 'payments',
534
+ bootstrap_servers=self.kafka_brokers,
535
+ group_id='notification-service',
536
+ auto_offset_reset='earliest',
537
+ enable_auto_commit=False,
538
+ value_deserializer=lambda m: json.loads(m.decode('utf-8'))
539
+ )
540
+
541
+ self.producer = AIOKafkaProducer(
542
+ bootstrap_servers=self.kafka_brokers,
543
+ value_serializer=lambda v: json.dumps(v).encode('utf-8')
544
+ )
545
+
546
+ await self.consumer.start()
547
+ await self.producer.start()
548
+
549
+ # Register handlers
550
+ self.handlers = {
551
+ 'order.created': self.handle_order_created,
552
+ 'order.completed': self.handle_order_completed,
553
+ 'user.registered': self.handle_user_registered,
554
+ 'payment.failed': self.handle_payment_failed,
555
+ }
556
+
557
+ logger.info("Notification service started")
558
+
559
+ async def process_events(self):
560
+ async for msg in self.consumer:
561
+ try:
562
+ event = Event(
563
+ type=msg.value.get('type'),
564
+ data=msg.value.get('data', {}),
565
+ timestamp=datetime.fromisoformat(msg.value.get('timestamp')),
566
+ correlation_id=msg.value.get('correlation_id', '')
567
+ )
568
+
569
+ handler = self.handlers.get(event.type)
570
+ if handler:
571
+ await handler(event)
572
+ await self.consumer.commit()
573
+ else:
574
+ logger.warning(f"No handler for event type: {event.type}")
575
+
576
+ except Exception as e:
577
+ logger.error(f"Error processing event: {e}")
578
+ await self.send_to_dlq(msg.value)
579
+ await self.consumer.commit()
580
+
581
+ @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, max=10))
582
+ async def send_email(self, to: str, subject: str, body: str):
583
+ async with aiosmtplib.SMTP(
584
+ hostname=self.smtp_config['host'],
585
+ port=self.smtp_config['port'],
586
+ use_tls=True
587
+ ) as smtp:
588
+ await smtp.login(self.smtp_config['user'], self.smtp_config['password'])
589
+ await smtp.sendmail(
590
+ self.smtp_config['from'],
591
+ to,
592
+ f"Subject: {subject}\n\n{body}"
593
+ )
594
+
595
+ async def handle_order_created(self, event: Event):
596
+ user_email = event.data.get('user_email')
597
+ order_id = event.data.get('order_id')
598
+
599
+ await self.send_email(
600
+ to=user_email,
601
+ subject=f"Order Confirmation - {order_id}",
602
+ body=f"Your order {order_id} has been received and is being processed."
603
+ )
604
+
605
+ logger.info(f"Sent order confirmation for {order_id}")
606
+
607
+ async def handle_payment_failed(self, event: Event):
608
+ user_email = event.data.get('user_email')
609
+ order_id = event.data.get('order_id')
610
+
611
+ await self.send_email(
612
+ to=user_email,
613
+ subject=f"Payment Failed - Order {order_id}",
614
+ body="Your payment could not be processed. Please update your payment method."
615
+ )
616
+
617
+ # Also notify support team
618
+ await self.producer.send('alerts', {
619
+ 'type': 'payment.failure.alert',
620
+ 'data': {'order_id': order_id},
621
+ 'timestamp': datetime.utcnow().isoformat()
622
+ })
623
+
624
+ async def send_to_dlq(self, message: dict):
625
+ await self.producer.send('notification-dlq', {
626
+ 'original_message': message,
627
+ 'failed_at': datetime.utcnow().isoformat(),
628
+ 'service': 'notification-service'
629
+ })
630
+
631
+ async def main():
632
+ service = NotificationService(
633
+ kafka_brokers=['localhost:9092'],
634
+ smtp_config={
635
+ 'host': 'smtp.example.com',
636
+ 'port': 587,
637
+ 'user': 'notifications@example.com',
638
+ 'password': 'secret',
639
+ 'from': 'noreply@example.com'
640
+ }
641
+ )
642
+
643
+ await service.start()
644
+ await service.process_events()
645
+
646
+ if __name__ == '__main__':
647
+ asyncio.run(main())
648
+ ```
649
+
650
+ ## Authentication & Authorization
651
+ ```typescript
652
+ // src/auth/jwt.service.ts - Secure JWT implementation
653
+ import jwt from 'jsonwebtoken';
654
+ import { createHash, randomBytes } from 'crypto';
655
+ import { Redis } from 'ioredis';
656
+
657
+ interface TokenPayload {
658
+ userId: string;
659
+ role: string;
660
+ permissions: string[];
661
+ sessionId: string;
662
+ }
663
+
664
+ interface TokenPair {
665
+ accessToken: string;
666
+ refreshToken: string;
667
+ expiresIn: number;
668
+ }
669
+
670
+ export class JWTService {
671
+ private readonly accessSecret: string;
672
+ private readonly refreshSecret: string;
673
+ private readonly redis: Redis;
674
+
675
+ constructor(redis: Redis) {
676
+ this.accessSecret = process.env.JWT_ACCESS_SECRET!;
677
+ this.refreshSecret = process.env.JWT_REFRESH_SECRET!;
678
+ this.redis = redis;
679
+ }
680
+
681
+ async generateTokenPair(payload: Omit<TokenPayload, 'sessionId'>): Promise<TokenPair> {
682
+ const sessionId = randomBytes(32).toString('hex');
683
+
684
+ const tokenPayload: TokenPayload = {
685
+ ...payload,
686
+ sessionId,
687
+ };
688
+
689
+ const accessToken = jwt.sign(tokenPayload, this.accessSecret, {
690
+ expiresIn: '15m',
691
+ algorithm: 'HS256',
692
+ });
693
+
694
+ const refreshToken = jwt.sign({ sessionId, userId: payload.userId }, this.refreshSecret, {
695
+ expiresIn: '7d',
696
+ algorithm: 'HS256',
697
+ });
698
+
699
+ // Store session in Redis
700
+ await this.redis.setex(
701
+ `session:${sessionId}`,
702
+ 7 * 24 * 60 * 60, // 7 days
703
+ JSON.stringify({ userId: payload.userId, role: payload.role })
704
+ );
705
+
706
+ return {
707
+ accessToken,
708
+ refreshToken,
709
+ expiresIn: 900, // 15 minutes in seconds
710
+ };
711
+ }
712
+
713
+ async verifyAccessToken(token: string): Promise<TokenPayload | null> {
714
+ try {
715
+ const payload = jwt.verify(token, this.accessSecret) as TokenPayload;
716
+
717
+ // Check if session is still valid
718
+ const session = await this.redis.get(`session:${payload.sessionId}`);
719
+ if (!session) {
720
+ return null; // Session revoked
721
+ }
722
+
723
+ return payload;
724
+ } catch {
725
+ return null;
726
+ }
727
+ }
728
+
729
+ async refreshTokens(refreshToken: string): Promise<TokenPair | null> {
730
+ try {
731
+ const { sessionId, userId } = jwt.verify(refreshToken, this.refreshSecret) as any;
732
+
733
+ const sessionData = await this.redis.get(`session:${sessionId}`);
734
+ if (!sessionData) {
735
+ return null;
736
+ }
737
+
738
+ const { role, permissions } = JSON.parse(sessionData);
739
+
740
+ // Revoke old session
741
+ await this.redis.del(`session:${sessionId}`);
742
+
743
+ // Generate new token pair
744
+ return this.generateTokenPair({ userId, role, permissions });
745
+ } catch {
746
+ return null;
747
+ }
748
+ }
749
+
750
+ async revokeSession(sessionId: string): Promise<void> {
751
+ await this.redis.del(`session:${sessionId}`);
752
+ }
753
+
754
+ async revokeAllUserSessions(userId: string): Promise<void> {
755
+ const keys = await this.redis.keys(`session:*`);
756
+ for (const key of keys) {
757
+ const session = await this.redis.get(key);
758
+ if (session && JSON.parse(session).userId === userId) {
759
+ await this.redis.del(key);
760
+ }
761
+ }
762
+ }
763
+ }
764
+ ```
765
+
766
+ ## Strict Security Rules
767
+ - **NEVER** expose database credentials or API keys in code or logs.
768
+ - **ALWAYS** use parameterized queries to prevent SQL injection.
769
+ - **VALIDATE** all user input at API boundaries.
770
+ - **IMPLEMENT** rate limiting on all public endpoints.
771
+ - **USE** HTTPS for all communications.
772
+ - **HASH** passwords with strong algorithms (bcrypt, argon2).
773
+ - **LOG** security events for audit trails.
774
+ - **REJECT** any request that could expose sensitive data.
775
+
776
+ ## Approach
777
+ 1. Analyze requirements and constraints
778
+ 2. Design scalable architecture patterns
779
+ 3. Define clear API contracts and interfaces
780
+ 4. Implement robust error handling and logging
781
+ 5. Ensure security best practices
782
+ 6. Optimize for performance and maintainability
783
+
784
+ ## Output Format
785
+ - Provide architectural diagrams when relevant
786
+ - Include code examples with best practices
787
+ - Document API endpoints with clear specifications
788
+ - Suggest testing strategies for each component
789
+
790
+ When designing systems, always consider:
791
+ - Scalability and horizontal scaling
792
+ - Data consistency and transaction management
793
+ - Security implications and threat modeling
794
+ - Monitoring and observability
795
+ - Deployment and rollback strategies