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.
- package/.gitignore.template +105 -0
- package/.releaserc +44 -0
- package/README.md +45 -0
- package/ai-config/.skillignore +15 -0
- package/ai-config/AUTO_INVOKE.md +300 -0
- package/ai-config/agents/_TEMPLATE.md +93 -0
- package/ai-config/agents/business/api-designer.md +1657 -0
- package/ai-config/agents/business/business-analyst.md +1331 -0
- package/ai-config/agents/business/product-strategist.md +206 -0
- package/ai-config/agents/business/project-manager.md +178 -0
- package/ai-config/agents/business/requirements-analyst.md +1277 -0
- package/ai-config/agents/business/technical-writer.md +1679 -0
- package/ai-config/agents/creative/ux-designer.md +205 -0
- package/ai-config/agents/data-ai/ai-engineer.md +487 -0
- package/ai-config/agents/data-ai/analytics-engineer.md +953 -0
- package/ai-config/agents/data-ai/data-engineer.md +173 -0
- package/ai-config/agents/data-ai/data-scientist.md +672 -0
- package/ai-config/agents/data-ai/mlops-engineer.md +814 -0
- package/ai-config/agents/data-ai/prompt-engineer.md +772 -0
- package/ai-config/agents/development/angular-expert.md +620 -0
- package/ai-config/agents/development/backend-architect.md +795 -0
- package/ai-config/agents/development/database-specialist.md +212 -0
- package/ai-config/agents/development/frontend-specialist.md +686 -0
- package/ai-config/agents/development/fullstack-engineer.md +668 -0
- package/ai-config/agents/development/golang-pro.md +338 -0
- package/ai-config/agents/development/java-enterprise.md +400 -0
- package/ai-config/agents/development/javascript-pro.md +422 -0
- package/ai-config/agents/development/nextjs-pro.md +474 -0
- package/ai-config/agents/development/python-pro.md +570 -0
- package/ai-config/agents/development/react-pro.md +487 -0
- package/ai-config/agents/development/rust-pro.md +246 -0
- package/ai-config/agents/development/spring-boot-4-expert.md +326 -0
- package/ai-config/agents/development/typescript-pro.md +336 -0
- package/ai-config/agents/development/vue-specialist.md +605 -0
- package/ai-config/agents/infrastructure/cloud-architect.md +472 -0
- package/ai-config/agents/infrastructure/deployment-manager.md +358 -0
- package/ai-config/agents/infrastructure/devops-engineer.md +455 -0
- package/ai-config/agents/infrastructure/incident-responder.md +519 -0
- package/ai-config/agents/infrastructure/kubernetes-expert.md +705 -0
- package/ai-config/agents/infrastructure/monitoring-specialist.md +674 -0
- package/ai-config/agents/infrastructure/performance-engineer.md +658 -0
- package/ai-config/agents/orchestrator.md +241 -0
- package/ai-config/agents/quality/accessibility-auditor.md +1204 -0
- package/ai-config/agents/quality/code-reviewer-compact.md +123 -0
- package/ai-config/agents/quality/code-reviewer.md +363 -0
- package/ai-config/agents/quality/dependency-manager.md +743 -0
- package/ai-config/agents/quality/e2e-test-specialist.md +1005 -0
- package/ai-config/agents/quality/performance-tester.md +1086 -0
- package/ai-config/agents/quality/security-auditor.md +133 -0
- package/ai-config/agents/quality/test-engineer.md +453 -0
- package/ai-config/agents/specialists/api-designer.md +87 -0
- package/ai-config/agents/specialists/backend-architect.md +73 -0
- package/ai-config/agents/specialists/code-reviewer.md +77 -0
- package/ai-config/agents/specialists/db-optimizer.md +75 -0
- package/ai-config/agents/specialists/devops-engineer.md +83 -0
- package/ai-config/agents/specialists/documentation-writer.md +78 -0
- package/ai-config/agents/specialists/frontend-developer.md +75 -0
- package/ai-config/agents/specialists/performance-analyst.md +82 -0
- package/ai-config/agents/specialists/refactor-specialist.md +74 -0
- package/ai-config/agents/specialists/security-auditor.md +74 -0
- package/ai-config/agents/specialists/test-engineer.md +81 -0
- package/ai-config/agents/specialists/ux-consultant.md +76 -0
- package/ai-config/agents/specialized/agent-generator.md +1190 -0
- package/ai-config/agents/specialized/blockchain-developer.md +149 -0
- package/ai-config/agents/specialized/code-migrator.md +892 -0
- package/ai-config/agents/specialized/context-manager.md +978 -0
- package/ai-config/agents/specialized/documentation-writer.md +1078 -0
- package/ai-config/agents/specialized/ecommerce-expert.md +1756 -0
- package/ai-config/agents/specialized/embedded-engineer.md +1714 -0
- package/ai-config/agents/specialized/error-detective.md +1034 -0
- package/ai-config/agents/specialized/fintech-specialist.md +1659 -0
- package/ai-config/agents/specialized/freelance-project-planner-v2.md +1988 -0
- package/ai-config/agents/specialized/freelance-project-planner-v3.md +2136 -0
- package/ai-config/agents/specialized/freelance-project-planner-v4.md +4503 -0
- package/ai-config/agents/specialized/freelance-project-planner.md +722 -0
- package/ai-config/agents/specialized/game-developer.md +1963 -0
- package/ai-config/agents/specialized/healthcare-dev.md +1620 -0
- package/ai-config/agents/specialized/mobile-developer.md +188 -0
- package/ai-config/agents/specialized/parallel-plan-executor.md +506 -0
- package/ai-config/agents/specialized/plan-executor.md +485 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/00-INDEX.md +485 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/01-CORE.md +3493 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/02-SELF-CORRECTION.md +778 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/03-PROGRESSIVE-SETUP.md +918 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/04-DEPLOYMENT.md +1537 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/05-TESTING.md +2633 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/06-OPERATIONS.md +5610 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/INSTALL.md +335 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/QUICK-REFERENCE.txt +215 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/README.md +260 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/START-HERE.md +379 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/WORKFLOW-DIAGRAM.md +355 -0
- package/ai-config/agents/specialized/solo-dev-planner-modular/solo-dev-planner.md +279 -0
- package/ai-config/agents/specialized/template-writer.md +347 -0
- package/ai-config/agents/specialized/test-runner.md +99 -0
- package/ai-config/agents/specialized/vibekanban-smart-worker.md +244 -0
- package/ai-config/agents/specialized/wave-executor.md +138 -0
- package/ai-config/agents/specialized/workflow-optimizer.md +1114 -0
- package/ai-config/commands/git/changelog.md +32 -0
- package/ai-config/commands/git/ci-local.md +70 -0
- package/ai-config/commands/git/commit.md +35 -0
- package/ai-config/commands/git/fix-issue.md +23 -0
- package/ai-config/commands/git/pr-create.md +42 -0
- package/ai-config/commands/git/pr-review.md +50 -0
- package/ai-config/commands/git/worktree.md +39 -0
- package/ai-config/commands/refactoring/cleanup.md +24 -0
- package/ai-config/commands/refactoring/dead-code.md +40 -0
- package/ai-config/commands/refactoring/extract.md +31 -0
- package/ai-config/commands/testing/e2e.md +30 -0
- package/ai-config/commands/testing/tdd.md +36 -0
- package/ai-config/commands/testing/test-coverage.md +30 -0
- package/ai-config/commands/testing/test-fix.md +24 -0
- package/ai-config/commands/workflow/generate-agents-md.md +85 -0
- package/ai-config/commands/workflow/planning.md +47 -0
- package/ai-config/commands/workflows/compound.md +89 -0
- package/ai-config/commands/workflows/plan.md +77 -0
- package/ai-config/commands/workflows/review.md +78 -0
- package/ai-config/commands/workflows/work.md +75 -0
- package/ai-config/config.yaml +18 -0
- package/ai-config/hooks/_TEMPLATE.md +96 -0
- package/ai-config/hooks/block-dangerous-commands.md +75 -0
- package/ai-config/hooks/commit-guard.md +90 -0
- package/ai-config/hooks/context-loader.md +73 -0
- package/ai-config/hooks/improve-prompt.md +91 -0
- package/ai-config/hooks/learning-log.md +72 -0
- package/ai-config/hooks/model-router.md +86 -0
- package/ai-config/hooks/secret-scanner.md +64 -0
- package/ai-config/hooks/skill-validator.md +102 -0
- package/ai-config/hooks/task-artifact.md +114 -0
- package/ai-config/hooks/validate-workflow.md +100 -0
- package/ai-config/prompts/base.md +71 -0
- package/ai-config/prompts/modes/debug.md +34 -0
- package/ai-config/prompts/modes/deploy.md +40 -0
- package/ai-config/prompts/modes/research.md +32 -0
- package/ai-config/prompts/modes/review.md +33 -0
- package/ai-config/prompts/review-policy.md +79 -0
- package/ai-config/skills/_TEMPLATE.md +157 -0
- package/ai-config/skills/backend/api-gateway/SKILL.md +254 -0
- package/ai-config/skills/backend/bff-concepts/SKILL.md +239 -0
- package/ai-config/skills/backend/bff-spring/SKILL.md +364 -0
- package/ai-config/skills/backend/chi-router/SKILL.md +396 -0
- package/ai-config/skills/backend/error-handling/SKILL.md +255 -0
- package/ai-config/skills/backend/exceptions-spring/SKILL.md +323 -0
- package/ai-config/skills/backend/fastapi/SKILL.md +302 -0
- package/ai-config/skills/backend/gateway-spring/SKILL.md +390 -0
- package/ai-config/skills/backend/go-backend/SKILL.md +457 -0
- package/ai-config/skills/backend/gradle-multimodule/SKILL.md +274 -0
- package/ai-config/skills/backend/graphql-concepts/SKILL.md +352 -0
- package/ai-config/skills/backend/graphql-spring/SKILL.md +398 -0
- package/ai-config/skills/backend/grpc-concepts/SKILL.md +283 -0
- package/ai-config/skills/backend/grpc-spring/SKILL.md +445 -0
- package/ai-config/skills/backend/jwt-auth/SKILL.md +412 -0
- package/ai-config/skills/backend/notifications-concepts/SKILL.md +259 -0
- package/ai-config/skills/backend/recommendations-concepts/SKILL.md +261 -0
- package/ai-config/skills/backend/search-concepts/SKILL.md +263 -0
- package/ai-config/skills/backend/search-spring/SKILL.md +375 -0
- package/ai-config/skills/backend/spring-boot-4/SKILL.md +172 -0
- package/ai-config/skills/backend/websockets/SKILL.md +532 -0
- package/ai-config/skills/data-ai/ai-ml/SKILL.md +423 -0
- package/ai-config/skills/data-ai/analytics-concepts/SKILL.md +195 -0
- package/ai-config/skills/data-ai/analytics-spring/SKILL.md +340 -0
- package/ai-config/skills/data-ai/duckdb-analytics/SKILL.md +440 -0
- package/ai-config/skills/data-ai/langchain/SKILL.md +238 -0
- package/ai-config/skills/data-ai/mlflow/SKILL.md +302 -0
- package/ai-config/skills/data-ai/onnx-inference/SKILL.md +290 -0
- package/ai-config/skills/data-ai/powerbi/SKILL.md +352 -0
- package/ai-config/skills/data-ai/pytorch/SKILL.md +274 -0
- package/ai-config/skills/data-ai/scikit-learn/SKILL.md +321 -0
- package/ai-config/skills/data-ai/vector-db/SKILL.md +301 -0
- package/ai-config/skills/database/graph-databases/SKILL.md +218 -0
- package/ai-config/skills/database/graph-spring/SKILL.md +361 -0
- package/ai-config/skills/database/pgx-postgres/SKILL.md +512 -0
- package/ai-config/skills/database/redis-cache/SKILL.md +343 -0
- package/ai-config/skills/database/sqlite-embedded/SKILL.md +388 -0
- package/ai-config/skills/database/timescaledb/SKILL.md +320 -0
- package/ai-config/skills/docs/api-documentation/SKILL.md +293 -0
- package/ai-config/skills/docs/docs-spring/SKILL.md +377 -0
- package/ai-config/skills/docs/mustache-templates/SKILL.md +190 -0
- package/ai-config/skills/docs/technical-docs/SKILL.md +447 -0
- package/ai-config/skills/frontend/astro-ssr/SKILL.md +441 -0
- package/ai-config/skills/frontend/frontend-design/SKILL.md +54 -0
- package/ai-config/skills/frontend/frontend-web/SKILL.md +368 -0
- package/ai-config/skills/frontend/mantine-ui/SKILL.md +396 -0
- package/ai-config/skills/frontend/tanstack-query/SKILL.md +439 -0
- package/ai-config/skills/frontend/zod-validation/SKILL.md +417 -0
- package/ai-config/skills/frontend/zustand-state/SKILL.md +350 -0
- package/ai-config/skills/infrastructure/chaos-engineering/SKILL.md +244 -0
- package/ai-config/skills/infrastructure/chaos-spring/SKILL.md +378 -0
- package/ai-config/skills/infrastructure/devops-infra/SKILL.md +435 -0
- package/ai-config/skills/infrastructure/docker-containers/SKILL.md +420 -0
- package/ai-config/skills/infrastructure/kubernetes/SKILL.md +456 -0
- package/ai-config/skills/infrastructure/opentelemetry/SKILL.md +546 -0
- package/ai-config/skills/infrastructure/traefik-proxy/SKILL.md +474 -0
- package/ai-config/skills/infrastructure/woodpecker-ci/SKILL.md +315 -0
- package/ai-config/skills/mobile/ionic-capacitor/SKILL.md +504 -0
- package/ai-config/skills/mobile/mobile-ionic/SKILL.md +448 -0
- package/ai-config/skills/prompt-improver/SKILL.md +125 -0
- package/ai-config/skills/quality/ghagga-review/SKILL.md +216 -0
- package/ai-config/skills/references/hooks-patterns/SKILL.md +238 -0
- package/ai-config/skills/references/mcp-servers/SKILL.md +275 -0
- package/ai-config/skills/references/plugins-reference/SKILL.md +110 -0
- package/ai-config/skills/references/skills-reference/SKILL.md +420 -0
- package/ai-config/skills/references/subagent-templates/SKILL.md +193 -0
- package/ai-config/skills/systems-iot/modbus-protocol/SKILL.md +410 -0
- package/ai-config/skills/systems-iot/mqtt-rumqttc/SKILL.md +408 -0
- package/ai-config/skills/systems-iot/rust-systems/SKILL.md +386 -0
- package/ai-config/skills/systems-iot/tokio-async/SKILL.md +324 -0
- package/ai-config/skills/testing/playwright-e2e/SKILL.md +289 -0
- package/ai-config/skills/testing/testcontainers/SKILL.md +299 -0
- package/ai-config/skills/testing/vitest-testing/SKILL.md +381 -0
- package/ai-config/skills/workflow/ci-local-guide/SKILL.md +118 -0
- package/ai-config/skills/workflow/claude-automation-recommender/SKILL.md +299 -0
- package/ai-config/skills/workflow/claude-md-improver/SKILL.md +158 -0
- package/ai-config/skills/workflow/finishing-a-development-branch/SKILL.md +117 -0
- package/ai-config/skills/workflow/git-github/SKILL.md +334 -0
- package/ai-config/skills/workflow/git-github/references/examples.md +160 -0
- package/ai-config/skills/workflow/git-workflow/SKILL.md +214 -0
- package/ai-config/skills/workflow/ide-plugins/SKILL.md +277 -0
- package/ai-config/skills/workflow/ide-plugins-intellij/SKILL.md +401 -0
- package/ai-config/skills/workflow/obsidian-brain-workflow/SKILL.md +199 -0
- package/ai-config/skills/workflow/using-git-worktrees/SKILL.md +100 -0
- package/ai-config/skills/workflow/verification-before-completion/SKILL.md +73 -0
- package/ai-config/skills/workflow/wave-workflow/SKILL.md +178 -0
- package/ci-local/README.md +170 -0
- package/ci-local/ci-local.sh +297 -0
- package/ci-local/hooks/commit-msg +74 -0
- package/ci-local/hooks/pre-commit +162 -0
- package/ci-local/hooks/pre-push +41 -0
- package/ci-local/install.sh +49 -0
- package/ci-local/semgrep.yml +214 -0
- package/dist/commands/analyze.d.ts +9 -0
- package/dist/commands/analyze.d.ts.map +1 -0
- package/dist/commands/analyze.js +55 -0
- package/dist/commands/analyze.js.map +1 -0
- package/dist/commands/analyze.test.d.ts +2 -0
- package/dist/commands/analyze.test.d.ts.map +1 -0
- package/dist/commands/analyze.test.js +145 -0
- package/dist/commands/analyze.test.js.map +1 -0
- package/dist/commands/doctor.d.ts +7 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +158 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/doctor.test.d.ts +2 -0
- package/dist/commands/doctor.test.d.ts.map +1 -0
- package/dist/commands/doctor.test.js +200 -0
- package/dist/commands/doctor.test.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +283 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +2 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +271 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/sync.d.ts +8 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +201 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +57 -0
- package/dist/constants.js.map +1 -0
- package/dist/e2e/aggressive.e2e.test.d.ts +2 -0
- package/dist/e2e/aggressive.e2e.test.d.ts.map +1 -0
- package/dist/e2e/aggressive.e2e.test.js +350 -0
- package/dist/e2e/aggressive.e2e.test.js.map +1 -0
- package/dist/e2e/commands.e2e.test.d.ts +2 -0
- package/dist/e2e/commands.e2e.test.d.ts.map +1 -0
- package/dist/e2e/commands.e2e.test.js +213 -0
- package/dist/e2e/commands.e2e.test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/common.d.ts +17 -0
- package/dist/lib/common.d.ts.map +1 -0
- package/dist/lib/common.js +111 -0
- package/dist/lib/common.js.map +1 -0
- package/dist/lib/common.test.d.ts +2 -0
- package/dist/lib/common.test.d.ts.map +1 -0
- package/dist/lib/common.test.js +316 -0
- package/dist/lib/common.test.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +18 -0
- package/dist/lib/frontmatter.d.ts.map +1 -0
- package/dist/lib/frontmatter.js +61 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/frontmatter.test.d.ts +2 -0
- package/dist/lib/frontmatter.test.d.ts.map +1 -0
- package/dist/lib/frontmatter.test.js +257 -0
- package/dist/lib/frontmatter.test.js.map +1 -0
- package/dist/lib/template.d.ts +24 -0
- package/dist/lib/template.d.ts.map +1 -0
- package/dist/lib/template.js +78 -0
- package/dist/lib/template.js.map +1 -0
- package/dist/lib/template.test.d.ts +2 -0
- package/dist/lib/template.test.d.ts.map +1 -0
- package/dist/lib/template.test.js +201 -0
- package/dist/lib/template.test.js.map +1 -0
- package/dist/types/index.d.ts +48 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/ui/AnalyzeUI.d.ts +7 -0
- package/dist/ui/AnalyzeUI.d.ts.map +1 -0
- package/dist/ui/AnalyzeUI.js +100 -0
- package/dist/ui/AnalyzeUI.js.map +1 -0
- package/dist/ui/App.d.ts +13 -0
- package/dist/ui/App.d.ts.map +1 -0
- package/dist/ui/App.js +100 -0
- package/dist/ui/App.js.map +1 -0
- package/dist/ui/CIContext.d.ts +9 -0
- package/dist/ui/CIContext.d.ts.map +1 -0
- package/dist/ui/CIContext.js +9 -0
- package/dist/ui/CIContext.js.map +1 -0
- package/dist/ui/CISelector.d.ts +8 -0
- package/dist/ui/CISelector.d.ts.map +1 -0
- package/dist/ui/CISelector.js +45 -0
- package/dist/ui/CISelector.js.map +1 -0
- package/dist/ui/Doctor.d.ts +3 -0
- package/dist/ui/Doctor.d.ts.map +1 -0
- package/dist/ui/Doctor.js +89 -0
- package/dist/ui/Doctor.js.map +1 -0
- package/dist/ui/Header.d.ts +8 -0
- package/dist/ui/Header.d.ts.map +1 -0
- package/dist/ui/Header.js +30 -0
- package/dist/ui/Header.js.map +1 -0
- package/dist/ui/MemorySelector.d.ts +8 -0
- package/dist/ui/MemorySelector.d.ts.map +1 -0
- package/dist/ui/MemorySelector.js +46 -0
- package/dist/ui/MemorySelector.js.map +1 -0
- package/dist/ui/NameInput.d.ts +8 -0
- package/dist/ui/NameInput.d.ts.map +1 -0
- package/dist/ui/NameInput.js +69 -0
- package/dist/ui/NameInput.js.map +1 -0
- package/dist/ui/OptionSelector.d.ts +12 -0
- package/dist/ui/OptionSelector.d.ts.map +1 -0
- package/dist/ui/OptionSelector.js +69 -0
- package/dist/ui/OptionSelector.js.map +1 -0
- package/dist/ui/Progress.d.ts +11 -0
- package/dist/ui/Progress.d.ts.map +1 -0
- package/dist/ui/Progress.js +58 -0
- package/dist/ui/Progress.js.map +1 -0
- package/dist/ui/StackSelector.d.ts +9 -0
- package/dist/ui/StackSelector.d.ts.map +1 -0
- package/dist/ui/StackSelector.js +65 -0
- package/dist/ui/StackSelector.js.map +1 -0
- package/dist/ui/Summary.d.ts +12 -0
- package/dist/ui/Summary.d.ts.map +1 -0
- package/dist/ui/Summary.js +114 -0
- package/dist/ui/Summary.js.map +1 -0
- package/dist/ui/SyncUI.d.ts +10 -0
- package/dist/ui/SyncUI.d.ts.map +1 -0
- package/dist/ui/SyncUI.js +64 -0
- package/dist/ui/SyncUI.js.map +1 -0
- package/dist/ui/Welcome.d.ts +7 -0
- package/dist/ui/Welcome.d.ts.map +1 -0
- package/dist/ui/Welcome.js +45 -0
- package/dist/ui/Welcome.js.map +1 -0
- package/dist/ui/theme.d.ts +10 -0
- package/dist/ui/theme.d.ts.map +1 -0
- package/dist/ui/theme.js +9 -0
- package/dist/ui/theme.js.map +1 -0
- package/modules/engram/.gitignore-snippet.txt +6 -0
- package/modules/engram/.mcp-config-snippet.json +11 -0
- package/modules/engram/README.md +146 -0
- package/modules/engram/install-engram.sh +216 -0
- package/modules/ghagga/.env.example +43 -0
- package/modules/ghagga/README.md +153 -0
- package/modules/ghagga/docker-compose.yml +80 -0
- package/modules/ghagga/setup-ghagga.sh +139 -0
- package/modules/memory-simple/.project/NOTES.md +22 -0
- package/modules/memory-simple/README.md +23 -0
- package/modules/obsidian-brain/.obsidian/app.json +23 -0
- package/modules/obsidian-brain/.obsidian/appearance.json +5 -0
- package/modules/obsidian-brain/.obsidian/bookmarks.json +34 -0
- package/modules/obsidian-brain/.obsidian/community-plugins.json +1 -0
- package/modules/obsidian-brain/.obsidian/core-plugins-migration.json +21 -0
- package/modules/obsidian-brain/.obsidian/core-plugins.json +18 -0
- package/modules/obsidian-brain/.obsidian/daily-notes.json +5 -0
- package/modules/obsidian-brain/.obsidian/graph.json +37 -0
- package/modules/obsidian-brain/.obsidian/hotkeys.json +14 -0
- package/modules/obsidian-brain/.obsidian/plugins/dataview/data.json +25 -0
- package/modules/obsidian-brain/.obsidian/plugins/obsidian-kanban/data.json +29 -0
- package/modules/obsidian-brain/.obsidian/plugins/templater-obsidian/data.json +18 -0
- package/modules/obsidian-brain/.obsidian/snippets/project-memory.css +71 -0
- package/modules/obsidian-brain/.obsidian-gitignore-snippet.txt +8 -0
- package/modules/obsidian-brain/.project/Attachments/.gitkeep +0 -0
- package/modules/obsidian-brain/.project/Memory/BLOCKERS.md +78 -0
- package/modules/obsidian-brain/.project/Memory/CONTEXT.md +102 -0
- package/modules/obsidian-brain/.project/Memory/DASHBOARD.md +73 -0
- package/modules/obsidian-brain/.project/Memory/DECISIONS.md +87 -0
- package/modules/obsidian-brain/.project/Memory/KANBAN.md +15 -0
- package/modules/obsidian-brain/.project/Memory/README.md +61 -0
- package/modules/obsidian-brain/.project/Memory/WAVES.md +78 -0
- package/modules/obsidian-brain/.project/Sessions/TEMPLATE.md +99 -0
- package/modules/obsidian-brain/.project/Templates/ADR.md +33 -0
- package/modules/obsidian-brain/.project/Templates/Blocker.md +21 -0
- package/modules/obsidian-brain/.project/Templates/Session.md +88 -0
- package/modules/obsidian-brain/README.md +268 -0
- package/modules/obsidian-brain/new-wave.sh +182 -0
- package/package.json +51 -0
- package/schemas/agent.schema.json +34 -0
- package/schemas/ai-config.schema.json +28 -0
- package/schemas/skill.schema.json +44 -0
- package/src/commands/analyze.test.ts +145 -0
- package/src/commands/analyze.ts +69 -0
- package/src/commands/doctor.test.ts +208 -0
- package/src/commands/doctor.ts +163 -0
- package/src/commands/init.test.ts +298 -0
- package/src/commands/init.ts +285 -0
- package/src/constants.ts +69 -0
- package/src/e2e/aggressive.e2e.test.ts +557 -0
- package/src/e2e/commands.e2e.test.ts +298 -0
- package/src/index.tsx +106 -0
- package/src/lib/common.test.ts +318 -0
- package/src/lib/common.ts +127 -0
- package/src/lib/frontmatter.test.ts +291 -0
- package/src/lib/frontmatter.ts +77 -0
- package/src/lib/template.test.ts +226 -0
- package/src/lib/template.ts +99 -0
- package/src/types/index.ts +53 -0
- package/src/ui/AnalyzeUI.tsx +133 -0
- package/src/ui/App.tsx +175 -0
- package/src/ui/CIContext.tsx +25 -0
- package/src/ui/CISelector.tsx +72 -0
- package/src/ui/Doctor.tsx +122 -0
- package/src/ui/Header.tsx +48 -0
- package/src/ui/MemorySelector.tsx +73 -0
- package/src/ui/NameInput.tsx +82 -0
- package/src/ui/OptionSelector.tsx +100 -0
- package/src/ui/Progress.tsx +88 -0
- package/src/ui/StackSelector.tsx +101 -0
- package/src/ui/Summary.tsx +134 -0
- package/src/ui/Welcome.tsx +54 -0
- package/src/ui/theme.ts +10 -0
- package/stryker.config.json +19 -0
- package/tasks/_TEMPLATE/files-edited.md +3 -0
- package/tasks/_TEMPLATE/plan.md +3 -0
- package/tasks/_TEMPLATE/research.md +3 -0
- package/tasks/_TEMPLATE/verification.md +5 -0
- package/templates/common/dependabot/cargo.yml +11 -0
- package/templates/common/dependabot/github-actions.yml +16 -0
- package/templates/common/dependabot/gomod.yml +15 -0
- package/templates/common/dependabot/gradle.yml +15 -0
- package/templates/common/dependabot/header.yml +3 -0
- package/templates/common/dependabot/maven.yml +15 -0
- package/templates/common/dependabot/npm.yml +20 -0
- package/templates/common/dependabot/pip.yml +11 -0
- package/templates/dependabot.yml +162 -0
- package/templates/github/ci-go.yml +41 -0
- package/templates/github/ci-java.yml +45 -0
- package/templates/github/ci-monorepo.yml +150 -0
- package/templates/github/ci-node.yml +42 -0
- package/templates/github/ci-python.yml +42 -0
- package/templates/github/ci-rust.yml +42 -0
- package/templates/github/dependabot-automerge.yml +40 -0
- package/templates/gitlab/gitlab-ci-go.yml +88 -0
- package/templates/gitlab/gitlab-ci-java.yml +79 -0
- package/templates/gitlab/gitlab-ci-monorepo.yml +126 -0
- package/templates/gitlab/gitlab-ci-node.yml +63 -0
- package/templates/gitlab/gitlab-ci-python.yml +147 -0
- package/templates/gitlab/gitlab-ci-rust.yml +67 -0
- package/templates/global/claude-settings.json +98 -0
- package/templates/global/codex-config.toml +8 -0
- package/templates/global/copilot-instructions/base-rules.instructions.md +13 -0
- package/templates/global/copilot-instructions/sdd-orchestrator.instructions.md +37 -0
- package/templates/global/gemini-commands/cleanup.toml +20 -0
- package/templates/global/gemini-commands/commit.toml +15 -0
- package/templates/global/gemini-commands/dead-code.toml +22 -0
- package/templates/global/gemini-commands/plan.toml +30 -0
- package/templates/global/gemini-commands/review.toml +17 -0
- package/templates/global/gemini-commands/sdd-apply.toml +22 -0
- package/templates/global/gemini-commands/sdd-ff.toml +14 -0
- package/templates/global/gemini-commands/sdd-new.toml +21 -0
- package/templates/global/gemini-commands/sdd-verify.toml +21 -0
- package/templates/global/gemini-commands/tdd.toml +26 -0
- package/templates/global/gemini-settings.json +8 -0
- package/templates/global/opencode-config.json +44 -0
- package/templates/global/sdd-instructions.md +47 -0
- package/templates/global/sdd-orchestrator-claude.md +46 -0
- package/templates/global/sdd-orchestrator-copilot.md +34 -0
- package/templates/renovate.json +69 -0
- package/templates/woodpecker/monorepo/backend.yml +34 -0
- package/templates/woodpecker/monorepo/frontend.yml +34 -0
- package/templates/woodpecker/monorepo/summary.yml +25 -0
- package/templates/woodpecker/woodpecker-go.yml +51 -0
- package/templates/woodpecker/woodpecker-java.yml +67 -0
- package/templates/woodpecker/woodpecker-node.yml +47 -0
- package/templates/woodpecker/woodpecker-python.yml +108 -0
- package/templates/woodpecker/woodpecker-rust.yml +57 -0
- package/tsconfig.json +19 -0
- package/vitest.config.ts +16 -0
- package/workflows/reusable-build-go.yml +111 -0
- package/workflows/reusable-build-java.yml +120 -0
- package/workflows/reusable-build-node.yml +145 -0
- package/workflows/reusable-build-python.yml +159 -0
- package/workflows/reusable-build-rust.yml +135 -0
- package/workflows/reusable-docker.yml +120 -0
- package/workflows/reusable-ghagga-review.yml +165 -0
- 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
|