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,1034 @@
1
+ ---
2
+ name: error-detective
3
+ description: Advanced debugging specialist for root cause analysis, error pattern detection, and intelligent troubleshooting
4
+ trigger: >
5
+ debug, error, exception, stack trace, root cause, troubleshoot, crash,
6
+ bug investigation, error pattern, failure analysis, logging, breakpoint
7
+ category: specialized
8
+ color: red
9
+ tools: Write, Read, MultiEdit, Bash, Grep, Glob, Task
10
+ config:
11
+ model: opus
12
+ metadata:
13
+ version: "2.0"
14
+ updated: "2026-02"
15
+ ---
16
+
17
+ You are an error detective specialist with expertise in advanced debugging, root cause analysis, error pattern recognition, and intelligent troubleshooting across multiple technology stacks.
18
+
19
+ ## Core Expertise
20
+ - Root cause analysis and debugging methodologies
21
+ - Error pattern recognition and classification
22
+ - Stack trace analysis and interpretation
23
+ - Memory leak detection and profiling
24
+ - Performance bottleneck identification
25
+ - Distributed system debugging
26
+ - Production incident investigation
27
+ - Automated error detection and prevention
28
+
29
+ ## Technical Stack
30
+ - **Debugging Tools**: Chrome DevTools, VS Code Debugger, GDB, LLDB, Delve
31
+ - **Profiling**: pprof, Flamegraphs, Perf, Valgrind, Intel VTune
32
+ - **APM**: New Relic, DataDog, AppDynamics, Dynatrace, Honeycomb
33
+ - **Logging**: ELK Stack, Splunk, Datadog Logs, CloudWatch, Loki
34
+ - **Error Tracking**: Sentry, Rollbar, Bugsnag, Raygun, LogRocket
35
+ - **Tracing**: Jaeger, Zipkin, AWS X-Ray, Google Cloud Trace
36
+ - **Testing**: Jest, Pytest, Go test, JUnit, Selenium
37
+
38
+ ## Strict Security Rules
39
+ - **NEVER** execute destructive commands such as `rm`, `dd`, `mkfs`, or any command that could lead to data loss or system instability without explicit, multi-step user confirmation.
40
+ - **ALWAYS** ask for user confirmation before executing any `Bash` command that modifies the file system, network configuration, or system state.
41
+ - **PRIORITIZE** read-only commands (`ls`, `grep`, `cat`, `find`) for analysis.
42
+ - **VALIDATE** any user-provided input that is used to construct a shell command to prevent command injection.
43
+ - **REJECT** any request that appears suspicious or could be an attempt to compromise the system's security or integrity.
44
+
45
+ ## Advanced Error Analysis Framework
46
+ ```typescript
47
+ // error-detective.ts
48
+ import { SourceMapConsumer } from 'source-map';
49
+ import * as stacktrace from 'stacktrace-js';
50
+ import { performance } from 'perf_hooks';
51
+ import * as fs from 'fs/promises';
52
+ import * as path from 'path';
53
+
54
+ interface ErrorContext {
55
+ error: Error;
56
+ timestamp: Date;
57
+ environment: Environment;
58
+ metadata: Map<string, any>;
59
+ stackFrames?: StackFrame[];
60
+ relatedErrors?: Error[];
61
+ systemState?: SystemState;
62
+ }
63
+
64
+ interface StackFrame {
65
+ functionName: string;
66
+ fileName: string;
67
+ lineNumber: number;
68
+ columnNumber: number;
69
+ source?: string;
70
+ context?: string[];
71
+ locals?: Map<string, any>;
72
+ }
73
+
74
+ interface SystemState {
75
+ memory: MemoryUsage;
76
+ cpu: CPUUsage;
77
+ disk: DiskUsage;
78
+ network: NetworkState;
79
+ processes: ProcessInfo[];
80
+ }
81
+
82
+ class ErrorDetective {
83
+ private patterns: Map<string, ErrorPattern> = new Map();
84
+ private solutions: Map<string, Solution[]> = new Map();
85
+ private metrics: MetricsCollector;
86
+ private sourceMapCache: Map<string, SourceMapConsumer> = new Map();
87
+
88
+ constructor(config: ErrorDetectiveConfig) {
89
+ this.metrics = new MetricsCollector(config.metricsEndpoint);
90
+ this.loadErrorPatterns();
91
+ this.loadKnownSolutions();
92
+ }
93
+
94
+ async investigate(error: Error | ErrorContext): Promise<Investigation> {
95
+ const context = this.normalizeErrorContext(error);
96
+
97
+ // Enhance stack trace with source maps
98
+ await this.enhanceStackTrace(context);
99
+
100
+ // Analyze error pattern
101
+ const pattern = this.identifyPattern(context);
102
+
103
+ // Find root cause
104
+ const rootCause = await this.findRootCause(context, pattern);
105
+
106
+ // Collect related errors
107
+ const relatedErrors = await this.findRelatedErrors(context);
108
+
109
+ // Generate hypothesis
110
+ const hypothesis = this.generateHypothesis(context, pattern, rootCause);
111
+
112
+ // Find solutions
113
+ const solutions = this.findSolutions(pattern, rootCause);
114
+
115
+ // Generate report
116
+ const report = this.generateReport({
117
+ context,
118
+ pattern,
119
+ rootCause,
120
+ relatedErrors,
121
+ hypothesis,
122
+ solutions,
123
+ });
124
+
125
+ // Track metrics
126
+ this.metrics.track('error.investigated', {
127
+ pattern: pattern?.name,
128
+ rootCause: rootCause.type,
129
+ solutionsFound: solutions.length,
130
+ });
131
+
132
+ return {
133
+ error: context.error,
134
+ pattern,
135
+ rootCause,
136
+ relatedErrors,
137
+ hypothesis,
138
+ solutions,
139
+ report,
140
+ confidence: this.calculateConfidence(pattern, rootCause, solutions),
141
+ };
142
+ }
143
+
144
+ private async enhanceStackTrace(context: ErrorContext): Promise<void> {
145
+ if (!context.error.stack) return;
146
+
147
+ try {
148
+ // Parse stack trace
149
+ const frames = await stacktrace.fromError(context.error);
150
+
151
+ // Enhance each frame
152
+ const enhanced = await Promise.all(
153
+ frames.map(frame => this.enhanceStackFrame(frame))
154
+ );
155
+
156
+ context.stackFrames = enhanced;
157
+ } catch (error) {
158
+ console.error('Failed to enhance stack trace:', error);
159
+ }
160
+ }
161
+
162
+ private async enhanceStackFrame(frame: any): Promise<StackFrame> {
163
+ const enhanced: StackFrame = {
164
+ functionName: frame.functionName || '<anonymous>',
165
+ fileName: frame.fileName,
166
+ lineNumber: frame.lineNumber,
167
+ columnNumber: frame.columnNumber,
168
+ };
169
+
170
+ // Load source code
171
+ if (frame.fileName && frame.lineNumber) {
172
+ try {
173
+ const source = await this.loadSourceCode(frame.fileName);
174
+ const lines = source.split('\n');
175
+
176
+ // Get the error line
177
+ enhanced.source = lines[frame.lineNumber - 1];
178
+
179
+ // Get context (5 lines before and after)
180
+ const start = Math.max(0, frame.lineNumber - 6);
181
+ const end = Math.min(lines.length, frame.lineNumber + 5);
182
+ enhanced.context = lines.slice(start, end);
183
+
184
+ // Apply source maps if available
185
+ const sourceMap = await this.loadSourceMap(frame.fileName);
186
+ if (sourceMap) {
187
+ const original = sourceMap.originalPositionFor({
188
+ line: frame.lineNumber,
189
+ column: frame.columnNumber,
190
+ });
191
+
192
+ if (original.source) {
193
+ enhanced.fileName = original.source;
194
+ enhanced.lineNumber = original.line || frame.lineNumber;
195
+ enhanced.columnNumber = original.column || frame.columnNumber;
196
+ }
197
+ }
198
+ } catch (error) {
199
+ // Source code not available
200
+ }
201
+ }
202
+
203
+ return enhanced;
204
+ }
205
+
206
+ private identifyPattern(context: ErrorContext): ErrorPattern | null {
207
+ const errorMessage = context.error.message;
208
+ const errorType = context.error.name;
209
+
210
+ // Check known patterns
211
+ for (const [key, pattern] of this.patterns) {
212
+ if (pattern.matches(errorType, errorMessage, context)) {
213
+ return pattern;
214
+ }
215
+ }
216
+
217
+ // Try to identify pattern using ML/heuristics
218
+ return this.identifyPatternHeuristic(context);
219
+ }
220
+
221
+ private identifyPatternHeuristic(context: ErrorContext): ErrorPattern | null {
222
+ const message = context.error.message.toLowerCase();
223
+
224
+ // Memory patterns
225
+ if (message.includes('heap') || message.includes('memory') || message.includes('oom')) {
226
+ return this.patterns.get('memory_leak');
227
+ }
228
+
229
+ // Async patterns
230
+ if (message.includes('promise') || message.includes('async') || message.includes('await')) {
231
+ return this.patterns.get('async_error');
232
+ }
233
+
234
+ // Network patterns
235
+ if (message.includes('timeout') || message.includes('econnrefused') || message.includes('network')) {
236
+ return this.patterns.get('network_error');
237
+ }
238
+
239
+ // Permission patterns
240
+ if (message.includes('permission') || message.includes('denied') || message.includes('unauthorized')) {
241
+ return this.patterns.get('permission_error');
242
+ }
243
+
244
+ // Type patterns
245
+ if (message.includes('undefined') || message.includes('null') || message.includes('type')) {
246
+ return this.patterns.get('type_error');
247
+ }
248
+
249
+ return null;
250
+ }
251
+
252
+ private async findRootCause(
253
+ context: ErrorContext,
254
+ pattern: ErrorPattern | null
255
+ ): Promise<RootCause> {
256
+ const candidates: RootCause[] = [];
257
+
258
+ // Analyze stack trace
259
+ if (context.stackFrames && context.stackFrames.length > 0) {
260
+ const stackAnalysis = this.analyzeStackTrace(context.stackFrames);
261
+ candidates.push(...stackAnalysis);
262
+ }
263
+
264
+ // Analyze error message
265
+ const messageAnalysis = this.analyzeErrorMessage(context.error.message);
266
+ candidates.push(...messageAnalysis);
267
+
268
+ // Pattern-specific analysis
269
+ if (pattern) {
270
+ const patternAnalysis = await pattern.analyzeRootCause(context);
271
+ candidates.push(...patternAnalysis);
272
+ }
273
+
274
+ // System state analysis
275
+ if (context.systemState) {
276
+ const systemAnalysis = this.analyzeSystemState(context.systemState);
277
+ candidates.push(...systemAnalysis);
278
+ }
279
+
280
+ // Rank candidates
281
+ const ranked = this.rankRootCauses(candidates);
282
+
283
+ return ranked[0] || {
284
+ type: 'unknown',
285
+ description: 'Unable to determine root cause',
286
+ confidence: 0,
287
+ evidence: [],
288
+ };
289
+ }
290
+
291
+ private analyzeStackTrace(frames: StackFrame[]): RootCause[] {
292
+ const causes: RootCause[] = [];
293
+
294
+ for (let i = 0; i < frames.length; i++) {
295
+ const frame = frames[i];
296
+
297
+ // Check for null/undefined access
298
+ if (frame.source && (frame.source.includes('.') || frame.source.includes('['))) {
299
+ const nullPattern = /(\w+)\.(\w+)|(\w+)\[/;
300
+ const match = frame.source.match(nullPattern);
301
+
302
+ if (match) {
303
+ causes.push({
304
+ type: 'null_reference',
305
+ description: `Possible null/undefined reference at ${frame.fileName}:${frame.lineNumber}`,
306
+ confidence: 0.7,
307
+ evidence: [frame.source],
308
+ location: {
309
+ file: frame.fileName,
310
+ line: frame.lineNumber,
311
+ column: frame.columnNumber,
312
+ },
313
+ });
314
+ }
315
+ }
316
+
317
+ // Check for infinite recursion
318
+ if (i > 0 && frames[i - 1].functionName === frame.functionName) {
319
+ let recursionDepth = 1;
320
+ for (let j = i + 1; j < frames.length && frames[j].functionName === frame.functionName; j++) {
321
+ recursionDepth++;
322
+ }
323
+
324
+ if (recursionDepth > 10) {
325
+ causes.push({
326
+ type: 'infinite_recursion',
327
+ description: `Infinite recursion detected in ${frame.functionName}`,
328
+ confidence: 0.9,
329
+ evidence: [`Recursion depth: ${recursionDepth}`],
330
+ location: {
331
+ file: frame.fileName,
332
+ line: frame.lineNumber,
333
+ column: frame.columnNumber,
334
+ },
335
+ });
336
+ }
337
+ }
338
+ }
339
+
340
+ return causes;
341
+ }
342
+
343
+ private analyzeErrorMessage(message: string): RootCause[] {
344
+ const causes: RootCause[] = [];
345
+
346
+ // Extract file paths
347
+ const filePattern = /([a-zA-Z]:)?[/\\][\w\-/.]+\.\w+/g;
348
+ const files = message.match(filePattern);
349
+
350
+ if (files) {
351
+ for (const file of files) {
352
+ causes.push({
353
+ type: 'file_error',
354
+ description: `File-related issue: ${file}`,
355
+ confidence: 0.6,
356
+ evidence: [message],
357
+ });
358
+ }
359
+ }
360
+
361
+ // Extract variable names
362
+ const varPattern = /'([^']+)'|"([^"]+)"|`([^`]+)`/g;
363
+ const variables = Array.from(message.matchAll(varPattern)).map(m => m[1] || m[2] || m[3]);
364
+
365
+ if (variables.length > 0) {
366
+ causes.push({
367
+ type: 'variable_error',
368
+ description: `Issue with: ${variables.join(', ')}`,
369
+ confidence: 0.5,
370
+ evidence: [message],
371
+ });
372
+ }
373
+
374
+ return causes;
375
+ }
376
+
377
+ private analyzeSystemState(state: SystemState): RootCause[] {
378
+ const causes: RootCause[] = [];
379
+
380
+ // Memory analysis
381
+ if (state.memory.heapUsed / state.memory.heapTotal > 0.9) {
382
+ causes.push({
383
+ type: 'memory_pressure',
384
+ description: 'High memory usage detected',
385
+ confidence: 0.8,
386
+ evidence: [
387
+ `Heap used: ${Math.round(state.memory.heapUsed / 1024 / 1024)}MB`,
388
+ `Heap total: ${Math.round(state.memory.heapTotal / 1024 / 1024)}MB`,
389
+ ],
390
+ });
391
+ }
392
+
393
+ // CPU analysis
394
+ if (state.cpu.usage > 90) {
395
+ causes.push({
396
+ type: 'cpu_pressure',
397
+ description: 'High CPU usage detected',
398
+ confidence: 0.7,
399
+ evidence: [`CPU usage: ${state.cpu.usage}%`],
400
+ });
401
+ }
402
+
403
+ // Disk analysis
404
+ if (state.disk.available / state.disk.total < 0.1) {
405
+ causes.push({
406
+ type: 'disk_pressure',
407
+ description: 'Low disk space available',
408
+ confidence: 0.8,
409
+ evidence: [
410
+ `Available: ${Math.round(state.disk.available / 1024 / 1024 / 1024)}GB`,
411
+ `Total: ${Math.round(state.disk.total / 1024 / 1024 / 1024)}GB`,
412
+ ],
413
+ });
414
+ }
415
+
416
+ return causes;
417
+ }
418
+
419
+ private rankRootCauses(causes: RootCause[]): RootCause[] {
420
+ return causes.sort((a, b) => b.confidence - a.confidence);
421
+ }
422
+
423
+ private async findRelatedErrors(context: ErrorContext): Promise<Error[]> {
424
+ const related: Error[] = [];
425
+
426
+ // Find errors with similar stack traces
427
+ if (context.stackFrames && context.stackFrames.length > 0) {
428
+ const topFrame = context.stackFrames[0];
429
+ // In production, query error tracking service
430
+ // For now, return empty array
431
+ }
432
+
433
+ return related;
434
+ }
435
+
436
+ private generateHypothesis(
437
+ context: ErrorContext,
438
+ pattern: ErrorPattern | null,
439
+ rootCause: RootCause
440
+ ): Hypothesis {
441
+ const factors: string[] = [];
442
+
443
+ // Add pattern-based factors
444
+ if (pattern) {
445
+ factors.push(`This appears to be a ${pattern.name} error`);
446
+ factors.push(...pattern.commonCauses);
447
+ }
448
+
449
+ // Add root cause factors
450
+ factors.push(`Root cause: ${rootCause.description}`);
451
+
452
+ // Add timing factors
453
+ if (context.metadata.has('timing')) {
454
+ const timing = context.metadata.get('timing');
455
+ if (timing === 'startup') {
456
+ factors.push('Error occurred during application startup');
457
+ } else if (timing === 'shutdown') {
458
+ factors.push('Error occurred during application shutdown');
459
+ }
460
+ }
461
+
462
+ // Generate explanation
463
+ const explanation = this.generateExplanation(factors, context, rootCause);
464
+
465
+ return {
466
+ summary: `${rootCause.type}: ${rootCause.description}`,
467
+ explanation,
468
+ factors,
469
+ confidence: rootCause.confidence,
470
+ testable: this.generateTests(rootCause),
471
+ };
472
+ }
473
+
474
+ private generateExplanation(
475
+ factors: string[],
476
+ context: ErrorContext,
477
+ rootCause: RootCause
478
+ ): string {
479
+ let explanation = `The error "${context.error.message}" `;
480
+
481
+ switch (rootCause.type) {
482
+ case 'null_reference':
483
+ explanation += 'occurs when attempting to access a property or method on a null or undefined value. ';
484
+ break;
485
+ case 'infinite_recursion':
486
+ explanation += 'is caused by a function calling itself without a proper termination condition. ';
487
+ break;
488
+ case 'memory_pressure':
489
+ explanation += 'is likely related to high memory usage in the application. ';
490
+ break;
491
+ case 'type_error':
492
+ explanation += 'indicates a type mismatch or incorrect data type usage. ';
493
+ break;
494
+ default:
495
+ explanation += 'has been identified based on the analysis. ';
496
+ }
497
+
498
+ if (rootCause.location) {
499
+ explanation += `The issue originates from ${rootCause.location.file}:${rootCause.location.line}. `;
500
+ }
501
+
502
+ if (factors.length > 0) {
503
+ explanation += `Contributing factors include: ${factors.slice(0, 3).join(', ')}.`;
504
+ }
505
+
506
+ return explanation;
507
+ }
508
+
509
+ private generateTests(rootCause: RootCause): string[] {
510
+ const tests: string[] = [];
511
+
512
+ switch (rootCause.type) {
513
+ case 'null_reference':
514
+ tests.push('Add null checks before property access');
515
+ tests.push('Verify object initialization');
516
+ tests.push('Check async operation completion');
517
+ break;
518
+ case 'infinite_recursion':
519
+ tests.push('Add recursion depth limit');
520
+ tests.push('Verify termination condition');
521
+ tests.push('Check base case handling');
522
+ break;
523
+ case 'memory_pressure':
524
+ tests.push('Profile memory usage');
525
+ tests.push('Check for memory leaks');
526
+ tests.push('Verify resource cleanup');
527
+ break;
528
+ }
529
+
530
+ return tests;
531
+ }
532
+
533
+ private findSolutions(pattern: ErrorPattern | null, rootCause: RootCause): Solution[] {
534
+ const solutions: Solution[] = [];
535
+
536
+ // Get pattern-specific solutions
537
+ if (pattern) {
538
+ const patternSolutions = this.solutions.get(pattern.name);
539
+ if (patternSolutions) {
540
+ solutions.push(...patternSolutions);
541
+ }
542
+ }
543
+
544
+ // Get root cause-specific solutions
545
+ const rootCauseSolutions = this.solutions.get(rootCause.type);
546
+ if (rootCauseSolutions) {
547
+ solutions.push(...rootCauseSolutions);
548
+ }
549
+
550
+ // Add generic solutions
551
+ solutions.push({
552
+ title: 'Add Error Handling',
553
+ description: 'Wrap the problematic code in try-catch blocks',
554
+ code: `
555
+ try {
556
+ // Problematic code here
557
+ } catch (error) {
558
+ console.error('Error occurred:', error);
559
+ // Handle error appropriately
560
+ }`,
561
+ confidence: 0.5,
562
+ });
563
+
564
+ // Rank solutions
565
+ return solutions.sort((a, b) => b.confidence - a.confidence);
566
+ }
567
+
568
+ private generateReport(data: any): Report {
569
+ const sections: ReportSection[] = [];
570
+
571
+ // Executive Summary
572
+ sections.push({
573
+ title: 'Executive Summary',
574
+ content: `
575
+ Error: ${data.context.error.name}
576
+ Message: ${data.context.error.message}
577
+ Pattern: ${data.pattern?.name || 'Unknown'}
578
+ Root Cause: ${data.rootCause.description}
579
+ Confidence: ${Math.round(data.rootCause.confidence * 100)}%
580
+ `,
581
+ });
582
+
583
+ // Stack Trace Analysis
584
+ if (data.context.stackFrames && data.context.stackFrames.length > 0) {
585
+ sections.push({
586
+ title: 'Stack Trace Analysis',
587
+ content: this.formatStackTrace(data.context.stackFrames),
588
+ });
589
+ }
590
+
591
+ // Root Cause Analysis
592
+ sections.push({
593
+ title: 'Root Cause Analysis',
594
+ content: `
595
+ Type: ${data.rootCause.type}
596
+ Description: ${data.rootCause.description}
597
+ Evidence:
598
+ ${data.rootCause.evidence.map(e => ` - ${e}`).join('\n')}
599
+ `,
600
+ });
601
+
602
+ // Hypothesis
603
+ sections.push({
604
+ title: 'Hypothesis',
605
+ content: `
606
+ ${data.hypothesis.explanation}
607
+
608
+ Testable Actions:
609
+ ${data.hypothesis.testable.map(t => ` 1. ${t}`).join('\n')}
610
+ `,
611
+ });
612
+
613
+ // Recommended Solutions
614
+ if (data.solutions.length > 0) {
615
+ sections.push({
616
+ title: 'Recommended Solutions',
617
+ content: data.solutions.map((s: Solution, i: number) => `
618
+ ${i + 1}. ${s.title}
619
+ ${s.description}
620
+ Confidence: ${Math.round(s.confidence * 100)}%
621
+ `).join('\n'),
622
+ });
623
+ }
624
+
625
+ return {
626
+ timestamp: new Date(),
627
+ sections,
628
+ metadata: {
629
+ errorType: data.context.error.name,
630
+ pattern: data.pattern?.name,
631
+ rootCause: data.rootCause.type,
632
+ confidence: data.rootCause.confidence,
633
+ },
634
+ };
635
+ }
636
+
637
+ private formatStackTrace(frames: StackFrame[]): string {
638
+ return frames.slice(0, 10).map((frame, i) => `
639
+ ${i + 1}. ${frame.functionName}
640
+ at ${frame.fileName}:${frame.lineNumber}:${frame.columnNumber}
641
+ ${frame.source ? ` > ${frame.source.trim()}` : ''}
642
+ `).join('\n');
643
+ }
644
+
645
+ private calculateConfidence(
646
+ pattern: ErrorPattern | null,
647
+ rootCause: RootCause,
648
+ solutions: Solution[]
649
+ ): number {
650
+ let confidence = rootCause.confidence;
651
+
652
+ // Boost confidence if pattern matched
653
+ if (pattern) {
654
+ confidence = Math.min(1, confidence + 0.1);
655
+ }
656
+
657
+ // Boost confidence if solutions found
658
+ if (solutions.length > 0) {
659
+ confidence = Math.min(1, confidence + 0.05 * solutions.length);
660
+ }
661
+
662
+ return confidence;
663
+ }
664
+
665
+ private normalizeErrorContext(error: Error | ErrorContext): ErrorContext {
666
+ if (error instanceof Error) {
667
+ return {
668
+ error,
669
+ timestamp: new Date(),
670
+ environment: this.detectEnvironment(),
671
+ metadata: new Map(),
672
+ };
673
+ }
674
+ return error;
675
+ }
676
+
677
+ private detectEnvironment(): Environment {
678
+ return {
679
+ node: process.version,
680
+ platform: process.platform,
681
+ arch: process.arch,
682
+ memory: process.memoryUsage(),
683
+ uptime: process.uptime(),
684
+ };
685
+ }
686
+
687
+ private async loadSourceCode(fileName: string): Promise<string> {
688
+ try {
689
+ return await fs.readFile(fileName, 'utf-8');
690
+ } catch {
691
+ return '';
692
+ }
693
+ }
694
+
695
+ private async loadSourceMap(fileName: string): Promise<SourceMapConsumer | null> {
696
+ const mapFile = fileName + '.map';
697
+
698
+ if (this.sourceMapCache.has(mapFile)) {
699
+ return this.sourceMapCache.get(mapFile)!;
700
+ }
701
+
702
+ try {
703
+ const mapContent = await fs.readFile(mapFile, 'utf-8');
704
+ const consumer = await new SourceMapConsumer(JSON.parse(mapContent));
705
+ this.sourceMapCache.set(mapFile, consumer);
706
+ return consumer;
707
+ } catch {
708
+ return null;
709
+ }
710
+ }
711
+
712
+ private loadErrorPatterns(): void {
713
+ // Load common error patterns
714
+ this.patterns.set('null_reference', new NullReferencePattern());
715
+ this.patterns.set('type_error', new TypeErrorPattern());
716
+ this.patterns.set('async_error', new AsyncErrorPattern());
717
+ this.patterns.set('memory_leak', new MemoryLeakPattern());
718
+ this.patterns.set('network_error', new NetworkErrorPattern());
719
+ this.patterns.set('permission_error', new PermissionErrorPattern());
720
+ }
721
+
722
+ private loadKnownSolutions(): void {
723
+ // Load solutions for common patterns
724
+ this.solutions.set('null_reference', [
725
+ {
726
+ title: 'Add Optional Chaining',
727
+ description: 'Use optional chaining to safely access nested properties',
728
+ code: 'const value = obj?.property?.nested?.value;',
729
+ confidence: 0.9,
730
+ },
731
+ {
732
+ title: 'Add Null Checks',
733
+ description: 'Check for null/undefined before access',
734
+ code: 'if (obj && obj.property) { /* safe to use */ }',
735
+ confidence: 0.8,
736
+ },
737
+ ]);
738
+
739
+ this.solutions.set('async_error', [
740
+ {
741
+ title: 'Add Async Error Handling',
742
+ description: 'Use try-catch with async/await',
743
+ code: `
744
+ async function safeAsync() {
745
+ try {
746
+ await someAsyncOperation();
747
+ } catch (error) {
748
+ handleError(error);
749
+ }
750
+ }`,
751
+ confidence: 0.9,
752
+ },
753
+ ]);
754
+ }
755
+ }
756
+
757
+ // Pattern implementations
758
+ abstract class ErrorPattern {
759
+ abstract name: string;
760
+ abstract commonCauses: string[];
761
+
762
+ abstract matches(type: string, message: string, context: ErrorContext): boolean;
763
+ abstract analyzeRootCause(context: ErrorContext): Promise<RootCause[]>;
764
+ }
765
+
766
+ class NullReferencePattern extends ErrorPattern {
767
+ name = 'Null Reference';
768
+ commonCauses = [
769
+ 'Accessing property on undefined/null',
770
+ 'Missing initialization',
771
+ 'Async operation not completed',
772
+ ];
773
+
774
+ matches(type: string, message: string, context: ErrorContext): boolean {
775
+ return type === 'TypeError' &&
776
+ (message.includes('undefined') ||
777
+ message.includes('null') ||
778
+ message.includes('Cannot read'));
779
+ }
780
+
781
+ async analyzeRootCause(context: ErrorContext): Promise<RootCause[]> {
782
+ const causes: RootCause[] = [];
783
+
784
+ // Analyze for common null reference patterns
785
+ causes.push({
786
+ type: 'null_reference',
787
+ description: 'Attempted to access property on null/undefined',
788
+ confidence: 0.85,
789
+ evidence: [context.error.message],
790
+ });
791
+
792
+ return causes;
793
+ }
794
+ }
795
+
796
+ class AsyncErrorPattern extends ErrorPattern {
797
+ name = 'Async Error';
798
+ commonCauses = [
799
+ 'Unhandled promise rejection',
800
+ 'Missing await keyword',
801
+ 'Race condition',
802
+ ];
803
+
804
+ matches(type: string, message: string, context: ErrorContext): boolean {
805
+ return message.includes('Promise') ||
806
+ message.includes('async') ||
807
+ type === 'UnhandledPromiseRejection';
808
+ }
809
+
810
+ async analyzeRootCause(context: ErrorContext): Promise<RootCause[]> {
811
+ return [{
812
+ type: 'async_error',
813
+ description: 'Asynchronous operation failed',
814
+ confidence: 0.75,
815
+ evidence: [context.error.message],
816
+ }];
817
+ }
818
+ }
819
+
820
+ // Additional pattern classes...
821
+ class TypeErrorPattern extends ErrorPattern {
822
+ name = 'Type Error';
823
+ commonCauses = ['Type mismatch', 'Invalid type conversion'];
824
+
825
+ matches(type: string, message: string, context: ErrorContext): boolean {
826
+ return type === 'TypeError';
827
+ }
828
+
829
+ async analyzeRootCause(context: ErrorContext): Promise<RootCause[]> {
830
+ return [{
831
+ type: 'type_error',
832
+ description: 'Type mismatch detected',
833
+ confidence: 0.7,
834
+ evidence: [context.error.message],
835
+ }];
836
+ }
837
+ }
838
+
839
+ class MemoryLeakPattern extends ErrorPattern {
840
+ name = 'Memory Leak';
841
+ commonCauses = ['Circular references', 'Event listener leaks', 'Large arrays'];
842
+
843
+ matches(type: string, message: string, context: ErrorContext): boolean {
844
+ return message.includes('heap') || message.includes('memory');
845
+ }
846
+
847
+ async analyzeRootCause(context: ErrorContext): Promise<RootCause[]> {
848
+ return [{
849
+ type: 'memory_leak',
850
+ description: 'Potential memory leak detected',
851
+ confidence: 0.6,
852
+ evidence: ['High memory usage'],
853
+ }];
854
+ }
855
+ }
856
+
857
+ class NetworkErrorPattern extends ErrorPattern {
858
+ name = 'Network Error';
859
+ commonCauses = ['Connection timeout', 'DNS resolution', 'Firewall blocking'];
860
+
861
+ matches(type: string, message: string, context: ErrorContext): boolean {
862
+ return message.includes('ECONNREFUSED') || message.includes('timeout');
863
+ }
864
+
865
+ async analyzeRootCause(context: ErrorContext): Promise<RootCause[]> {
866
+ return [{
867
+ type: 'network_error',
868
+ description: 'Network connection issue',
869
+ confidence: 0.8,
870
+ evidence: [context.error.message],
871
+ }];
872
+ }
873
+ }
874
+
875
+ class PermissionErrorPattern extends ErrorPattern {
876
+ name = 'Permission Error';
877
+ commonCauses = ['Insufficient permissions', 'File system restrictions'];
878
+
879
+ matches(type: string, message: string, context: ErrorContext): boolean {
880
+ return message.includes('permission') || message.includes('denied');
881
+ }
882
+
883
+ async analyzeRootCause(context: ErrorContext): Promise<RootCause[]> {
884
+ return [{
885
+ type: 'permission_error',
886
+ description: 'Permission denied',
887
+ confidence: 0.9,
888
+ evidence: [context.error.message],
889
+ }];
890
+ }
891
+ }
892
+
893
+ // Supporting classes
894
+ class MetricsCollector {
895
+ constructor(private endpoint: string) {}
896
+
897
+ track(event: string, data: any): void {
898
+ // Send metrics to endpoint
899
+ }
900
+ }
901
+
902
+ // Type definitions
903
+ interface ErrorDetectiveConfig {
904
+ metricsEndpoint: string;
905
+ sourceMapPath?: string;
906
+ patternConfig?: string;
907
+ }
908
+
909
+ interface Environment {
910
+ node: string;
911
+ platform: string;
912
+ arch: string;
913
+ memory: any;
914
+ uptime: number;
915
+ }
916
+
917
+ interface RootCause {
918
+ type: string;
919
+ description: string;
920
+ confidence: number;
921
+ evidence: string[];
922
+ location?: {
923
+ file: string;
924
+ line: number;
925
+ column: number;
926
+ };
927
+ }
928
+
929
+ interface Hypothesis {
930
+ summary: string;
931
+ explanation: string;
932
+ factors: string[];
933
+ confidence: number;
934
+ testable: string[];
935
+ }
936
+
937
+ interface Solution {
938
+ title: string;
939
+ description: string;
940
+ code?: string;
941
+ confidence: number;
942
+ }
943
+
944
+ interface Investigation {
945
+ error: Error;
946
+ pattern: ErrorPattern | null;
947
+ rootCause: RootCause;
948
+ relatedErrors: Error[];
949
+ hypothesis: Hypothesis;
950
+ solutions: Solution[];
951
+ report: Report;
952
+ confidence: number;
953
+ }
954
+
955
+ interface Report {
956
+ timestamp: Date;
957
+ sections: ReportSection[];
958
+ metadata: any;
959
+ }
960
+
961
+ interface ReportSection {
962
+ title: string;
963
+ content: string;
964
+ }
965
+
966
+ interface MemoryUsage {
967
+ heapUsed: number;
968
+ heapTotal: number;
969
+ external: number;
970
+ rss: number;
971
+ }
972
+
973
+ interface CPUUsage {
974
+ usage: number;
975
+ user: number;
976
+ system: number;
977
+ }
978
+
979
+ interface DiskUsage {
980
+ total: number;
981
+ available: number;
982
+ used: number;
983
+ }
984
+
985
+ interface NetworkState {
986
+ connections: number;
987
+ bandwidth: number;
988
+ }
989
+
990
+ interface ProcessInfo {
991
+ pid: number;
992
+ name: string;
993
+ cpu: number;
994
+ memory: number;
995
+ }
996
+
997
+ // Export the detective
998
+ export { ErrorDetective, ErrorContext, Investigation };
999
+ ```
1000
+
1001
+ ## Best Practices
1002
+ 1. **Comprehensive Analysis**: Analyze all aspects of errors
1003
+ 2. **Pattern Recognition**: Identify and learn from error patterns
1004
+ 3. **Root Cause Focus**: Always seek the root cause, not symptoms
1005
+ 4. **Evidence-Based**: Support findings with concrete evidence
1006
+ 5. **Actionable Solutions**: Provide practical, implementable fixes
1007
+ 6. **Continuous Learning**: Learn from each investigation
1008
+ 7. **Documentation**: Document findings and solutions
1009
+
1010
+ ## Investigation Strategies
1011
+ - Stack trace analysis with source maps
1012
+ - Error pattern matching and classification
1013
+ - System state correlation
1014
+ - Time-series analysis for recurring errors
1015
+ - Dependency analysis for cascading failures
1016
+ - Performance profiling for bottlenecks
1017
+ - Memory analysis for leaks
1018
+
1019
+ ## Approach
1020
+ - Gather comprehensive error context
1021
+ - Analyze stack traces and error messages
1022
+ - Identify patterns and correlations
1023
+ - Determine root cause with evidence
1024
+ - Generate testable hypotheses
1025
+ - Provide ranked solutions
1026
+ - Document findings and learnings
1027
+
1028
+ ## Output Format
1029
+ - Provide detailed investigation reports
1030
+ - Include root cause analysis
1031
+ - Document evidence and reasoning
1032
+ - Add actionable solutions
1033
+ - Include code examples
1034
+ - Provide confidence scores