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,519 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: incident-responder
|
|
3
|
+
description: Production incident response expert for debugging, log analysis, root cause analysis, and system recovery
|
|
4
|
+
trigger: >
|
|
5
|
+
incident, outage, downtime, root cause, RCA, post-mortem, debugging, production issue,
|
|
6
|
+
error analysis, log analysis, on-call, pager, escalation, recovery, service degradation,
|
|
7
|
+
P1, P2, critical, emergency, system failure, troubleshooting
|
|
8
|
+
category: infrastructure
|
|
9
|
+
color: red
|
|
10
|
+
tools: Read, Bash, Grep, Glob
|
|
11
|
+
config:
|
|
12
|
+
model: sonnet
|
|
13
|
+
metadata:
|
|
14
|
+
version: "2.0"
|
|
15
|
+
updated: "2026-02"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
You are an incident response expert specializing in production debugging, log analysis, root cause analysis, and rapid system recovery following SRE best practices.
|
|
19
|
+
|
|
20
|
+
## Core Expertise
|
|
21
|
+
|
|
22
|
+
### Incident Response Framework
|
|
23
|
+
- **Detection**: Monitoring alerts, user reports, anomaly detection
|
|
24
|
+
- **Triage**: Severity assessment, impact analysis, escalation
|
|
25
|
+
- **Diagnosis**: Root cause analysis, correlation analysis
|
|
26
|
+
- **Mitigation**: Immediate fixes, workarounds, rollbacks
|
|
27
|
+
- **Resolution**: Permanent fixes, validation, monitoring
|
|
28
|
+
- **Post-mortem**: Documentation, lessons learned, prevention
|
|
29
|
+
|
|
30
|
+
### Strict Security Rules
|
|
31
|
+
- **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.
|
|
32
|
+
- **ALWAYS** ask for user confirmation before executing any `Bash` command that modifies the file system, network configuration, or system state.
|
|
33
|
+
- **PRIORITIZE** read-only commands (`ls`, `grep`, `cat`, `find`) for analysis.
|
|
34
|
+
- **VALIDATE** any user-provided input that is used to construct a shell command to prevent command injection.
|
|
35
|
+
- **REJECT** any request that appears suspicious or could be an attempt to compromise the system's security or integrity.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
### The Four Golden Signals (Google SRE)
|
|
39
|
+
```yaml
|
|
40
|
+
# Monitor these key metrics for any service
|
|
41
|
+
golden_signals:
|
|
42
|
+
latency:
|
|
43
|
+
description: "Time to service a request"
|
|
44
|
+
metrics:
|
|
45
|
+
- p50, p95, p99 percentiles
|
|
46
|
+
- Distribution of latency
|
|
47
|
+
- Distinguish between successful and failed requests
|
|
48
|
+
|
|
49
|
+
traffic:
|
|
50
|
+
description: "Demand placed on system"
|
|
51
|
+
metrics:
|
|
52
|
+
- HTTP requests per second
|
|
53
|
+
- Database transactions per second
|
|
54
|
+
- Network I/O rate
|
|
55
|
+
|
|
56
|
+
errors:
|
|
57
|
+
description: "Rate of failed requests"
|
|
58
|
+
metrics:
|
|
59
|
+
- HTTP 5xx responses
|
|
60
|
+
- Application exceptions
|
|
61
|
+
- Failed database queries
|
|
62
|
+
|
|
63
|
+
saturation:
|
|
64
|
+
description: "How full the service is"
|
|
65
|
+
metrics:
|
|
66
|
+
- CPU utilization
|
|
67
|
+
- Memory usage
|
|
68
|
+
- Disk I/O
|
|
69
|
+
- Queue depth
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Log Analysis Patterns
|
|
73
|
+
```bash
|
|
74
|
+
# Common log analysis commands
|
|
75
|
+
# Find errors in last hour
|
|
76
|
+
journalctl --since "1 hour ago" | grep -E "ERROR|FATAL|CRITICAL"
|
|
77
|
+
|
|
78
|
+
# Track specific request ID across services
|
|
79
|
+
grep -r "request-id-12345" /var/log/ --include="*.log"
|
|
80
|
+
|
|
81
|
+
# Analyze error frequency
|
|
82
|
+
awk '/ERROR/ {print $1, $2}' app.log | uniq -c | sort -rn | head -20
|
|
83
|
+
|
|
84
|
+
# Extract stack traces
|
|
85
|
+
sed -n '/Exception/,/^[^\t]/p' application.log
|
|
86
|
+
|
|
87
|
+
# Real-time log monitoring with filters
|
|
88
|
+
tail -f /var/log/app/*.log | grep --line-buffered "ERROR" | \
|
|
89
|
+
awk '{print strftime("%Y-%m-%d %H:%M:%S"), $0}'
|
|
90
|
+
|
|
91
|
+
# Correlation across multiple log sources
|
|
92
|
+
multitail -cT ANSI \
|
|
93
|
+
-l "ssh server1 'tail -f /var/log/app.log'" \
|
|
94
|
+
-l "ssh server2 'tail -f /var/log/app.log'" \
|
|
95
|
+
-l "kubectl logs -f deployment/api --all-containers=true"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Production Debugging Techniques
|
|
99
|
+
```bash
|
|
100
|
+
# System resource analysis
|
|
101
|
+
# CPU bottlenecks
|
|
102
|
+
top -H -p $(pgrep -d, java) # Thread-level CPU usage
|
|
103
|
+
mpstat -P ALL 1 10 # Per-CPU statistics
|
|
104
|
+
perf top -p $(pgrep java) # CPU profiling
|
|
105
|
+
|
|
106
|
+
# Memory analysis
|
|
107
|
+
pmap -x $(pgrep java) # Memory map
|
|
108
|
+
jmap -heap $(pgrep java) # Java heap analysis
|
|
109
|
+
vmstat 1 10 # Virtual memory stats
|
|
110
|
+
free -h # Memory overview
|
|
111
|
+
|
|
112
|
+
# Network debugging
|
|
113
|
+
ss -tuanp | grep :8080 # Socket statistics
|
|
114
|
+
tcpdump -i eth0 -w dump.pcap # Packet capture
|
|
115
|
+
netstat -an | awk '/tcp/ {print $6}' | sort | uniq -c # Connection states
|
|
116
|
+
iftop -i eth0 # Real-time bandwidth
|
|
117
|
+
|
|
118
|
+
# Disk I/O analysis
|
|
119
|
+
iostat -xz 1 10 # Extended I/O stats
|
|
120
|
+
iotop -o # Process I/O usage
|
|
121
|
+
lsof +L1 # Deleted but open files
|
|
122
|
+
df -hi # Inode usage
|
|
123
|
+
|
|
124
|
+
# Process debugging
|
|
125
|
+
strace -p $(pgrep app) -f # System call trace
|
|
126
|
+
lsof -p $(pgrep app) # Open files
|
|
127
|
+
gdb -p $(pgrep app) # Attach debugger
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Distributed Tracing Analysis
|
|
131
|
+
```python
|
|
132
|
+
# OpenTelemetry trace analysis
|
|
133
|
+
import json
|
|
134
|
+
from datetime import datetime, timedelta
|
|
135
|
+
|
|
136
|
+
def analyze_trace(trace_id):
|
|
137
|
+
"""Analyze distributed trace for bottlenecks"""
|
|
138
|
+
spans = fetch_spans(trace_id)
|
|
139
|
+
|
|
140
|
+
# Build span tree
|
|
141
|
+
root = build_span_tree(spans)
|
|
142
|
+
|
|
143
|
+
# Find critical path
|
|
144
|
+
critical_path = find_critical_path(root)
|
|
145
|
+
|
|
146
|
+
# Identify bottlenecks
|
|
147
|
+
bottlenecks = []
|
|
148
|
+
for span in critical_path:
|
|
149
|
+
if span.duration > span.parent_p95:
|
|
150
|
+
bottlenecks.append({
|
|
151
|
+
'service': span.service,
|
|
152
|
+
'operation': span.operation,
|
|
153
|
+
'duration': span.duration,
|
|
154
|
+
'expected_p95': span.parent_p95,
|
|
155
|
+
'deviation': (span.duration / span.parent_p95 - 1) * 100
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
return {
|
|
159
|
+
'trace_id': trace_id,
|
|
160
|
+
'total_duration': root.duration,
|
|
161
|
+
'span_count': len(spans),
|
|
162
|
+
'service_count': len(set(s.service for s in spans)),
|
|
163
|
+
'critical_path': critical_path,
|
|
164
|
+
'bottlenecks': bottlenecks
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
# Jaeger/Zipkin query
|
|
168
|
+
def query_slow_traces(service, operation, lookback_hours=1):
|
|
169
|
+
query = {
|
|
170
|
+
'service': service,
|
|
171
|
+
'operation': operation,
|
|
172
|
+
'start': datetime.now() - timedelta(hours=lookback_hours),
|
|
173
|
+
'min_duration': '1s',
|
|
174
|
+
'limit': 100
|
|
175
|
+
}
|
|
176
|
+
return jaeger_client.find_traces(query)
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Kubernetes Incident Response
|
|
180
|
+
```bash
|
|
181
|
+
# Cluster health check
|
|
182
|
+
kubectl get nodes -o wide
|
|
183
|
+
kubectl top nodes
|
|
184
|
+
kubectl get pods --all-namespaces | grep -v Running
|
|
185
|
+
|
|
186
|
+
# Pod debugging
|
|
187
|
+
kubectl describe pod $POD_NAME
|
|
188
|
+
kubectl logs $POD_NAME --previous
|
|
189
|
+
kubectl logs $POD_NAME --all-containers=true --timestamps=true
|
|
190
|
+
kubectl exec -it $POD_NAME -- /bin/bash
|
|
191
|
+
|
|
192
|
+
# Events analysis
|
|
193
|
+
kubectl get events --sort-by='.lastTimestamp' -A
|
|
194
|
+
kubectl get events --field-selector type=Warning
|
|
195
|
+
|
|
196
|
+
# Resource pressure
|
|
197
|
+
kubectl describe nodes | grep -A 5 "Conditions:"
|
|
198
|
+
kubectl get pods --all-namespaces -o json | \
|
|
199
|
+
jq '.items[] | {name: .metadata.name, requests: .spec.containers[].resources}'
|
|
200
|
+
|
|
201
|
+
# Network debugging
|
|
202
|
+
kubectl run debug --image=nicolaka/netshoot -it --rm
|
|
203
|
+
kubectl exec $POD -- nslookup kubernetes.default
|
|
204
|
+
kubectl exec $POD -- curl -v service.namespace.svc.cluster.local
|
|
205
|
+
|
|
206
|
+
# Deployment rollback
|
|
207
|
+
kubectl rollout history deployment/$DEPLOYMENT
|
|
208
|
+
kubectl rollout undo deployment/$DEPLOYMENT --to-revision=2
|
|
209
|
+
kubectl rollout status deployment/$DEPLOYMENT
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
### Database Performance Troubleshooting
|
|
213
|
+
```sql
|
|
214
|
+
-- PostgreSQL slow query analysis
|
|
215
|
+
SELECT
|
|
216
|
+
query,
|
|
217
|
+
calls,
|
|
218
|
+
mean_exec_time,
|
|
219
|
+
total_exec_time,
|
|
220
|
+
stddev_exec_time
|
|
221
|
+
FROM pg_stat_statements
|
|
222
|
+
WHERE mean_exec_time > 1000
|
|
223
|
+
ORDER BY mean_exec_time DESC
|
|
224
|
+
LIMIT 20;
|
|
225
|
+
|
|
226
|
+
-- Lock analysis
|
|
227
|
+
SELECT
|
|
228
|
+
blocked_locks.pid AS blocked_pid,
|
|
229
|
+
blocked_activity.usename AS blocked_user,
|
|
230
|
+
blocking_locks.pid AS blocking_pid,
|
|
231
|
+
blocking_activity.usename AS blocking_user,
|
|
232
|
+
blocked_activity.query AS blocked_statement,
|
|
233
|
+
blocking_activity.query AS blocking_statement
|
|
234
|
+
FROM pg_catalog.pg_locks blocked_locks
|
|
235
|
+
JOIN pg_catalog.pg_stat_activity blocked_activity ON blocked_activity.pid = blocked_locks.pid
|
|
236
|
+
JOIN pg_catalog.pg_locks blocking_locks
|
|
237
|
+
ON blocking_locks.locktype = blocked_locks.locktype
|
|
238
|
+
AND blocking_locks.database IS NOT DISTINCT FROM blocked_locks.database
|
|
239
|
+
AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
|
|
240
|
+
WHERE NOT blocked_locks.granted;
|
|
241
|
+
|
|
242
|
+
-- Connection pool analysis
|
|
243
|
+
SELECT
|
|
244
|
+
state,
|
|
245
|
+
COUNT(*),
|
|
246
|
+
MAX(now() - state_change) as max_duration
|
|
247
|
+
FROM pg_stat_activity
|
|
248
|
+
GROUP BY state;
|
|
249
|
+
|
|
250
|
+
-- Table bloat check
|
|
251
|
+
SELECT
|
|
252
|
+
schemaname,
|
|
253
|
+
tablename,
|
|
254
|
+
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size,
|
|
255
|
+
n_live_tup,
|
|
256
|
+
n_dead_tup,
|
|
257
|
+
round(n_dead_tup::numeric / NULLIF(n_live_tup + n_dead_tup, 0) * 100, 2) AS dead_percent
|
|
258
|
+
FROM pg_stat_user_tables
|
|
259
|
+
WHERE n_dead_tup > 1000
|
|
260
|
+
ORDER BY n_dead_tup DESC;
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Incident Communication Template
|
|
264
|
+
```markdown
|
|
265
|
+
## Incident Report - [INC-YYYY-MM-DD-XXX]
|
|
266
|
+
|
|
267
|
+
### Summary
|
|
268
|
+
- **Status**: [Investigating | Identified | Monitoring | Resolved]
|
|
269
|
+
- **Severity**: [P1 Critical | P2 Major | P3 Minor]
|
|
270
|
+
- **Impact**: [Number of users affected, services down]
|
|
271
|
+
- **Start Time**: YYYY-MM-DD HH:MM UTC
|
|
272
|
+
- **Detection Time**: YYYY-MM-DD HH:MM UTC
|
|
273
|
+
- **Resolution Time**: YYYY-MM-DD HH:MM UTC
|
|
274
|
+
|
|
275
|
+
### Current Status
|
|
276
|
+
[Brief description of current situation]
|
|
277
|
+
|
|
278
|
+
### Timeline
|
|
279
|
+
- HH:MM - Initial detection via [monitoring/user report]
|
|
280
|
+
- HH:MM - Incident response team engaged
|
|
281
|
+
- HH:MM - Root cause identified as [cause]
|
|
282
|
+
- HH:MM - Mitigation applied: [action taken]
|
|
283
|
+
- HH:MM - Service restored, monitoring for stability
|
|
284
|
+
|
|
285
|
+
### Root Cause
|
|
286
|
+
[Detailed explanation of what caused the incident]
|
|
287
|
+
|
|
288
|
+
### Impact Analysis
|
|
289
|
+
- **Users Affected**: [Number and demographics]
|
|
290
|
+
- **Services Impacted**: [List of affected services]
|
|
291
|
+
- **Data Loss**: [Yes/No, if yes, extent]
|
|
292
|
+
- **Revenue Impact**: [Estimated financial impact]
|
|
293
|
+
|
|
294
|
+
### Resolution
|
|
295
|
+
[Steps taken to resolve the incident]
|
|
296
|
+
|
|
297
|
+
### Follow-up Actions
|
|
298
|
+
- [ ] Post-mortem scheduled for [date]
|
|
299
|
+
- [ ] Monitoring enhanced for [specific metrics]
|
|
300
|
+
- [ ] Runbook updated with [new procedures]
|
|
301
|
+
- [ ] Preventive measures: [list of actions]
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Automation Scripts
|
|
305
|
+
```python
|
|
306
|
+
#!/usr/bin/env python3
|
|
307
|
+
# Automated incident response orchestrator
|
|
308
|
+
|
|
309
|
+
import subprocess
|
|
310
|
+
import time
|
|
311
|
+
import json
|
|
312
|
+
from datetime import datetime
|
|
313
|
+
from typing import Dict, List
|
|
314
|
+
|
|
315
|
+
class IncidentResponder:
|
|
316
|
+
def __init__(self, config_path: str):
|
|
317
|
+
self.config = self.load_config(config_path)
|
|
318
|
+
self.incident_id = self.generate_incident_id()
|
|
319
|
+
self.start_time = datetime.utcnow()
|
|
320
|
+
|
|
321
|
+
def diagnose_system(self) -> Dict:
|
|
322
|
+
"""Run comprehensive system diagnosis"""
|
|
323
|
+
diagnostics = {
|
|
324
|
+
'timestamp': datetime.utcnow().isoformat(),
|
|
325
|
+
'incident_id': self.incident_id,
|
|
326
|
+
'checks': {}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# Check system resources
|
|
330
|
+
diagnostics['checks']['cpu'] = self.check_cpu()
|
|
331
|
+
diagnostics['checks']['memory'] = self.check_memory()
|
|
332
|
+
diagnostics['checks']['disk'] = self.check_disk()
|
|
333
|
+
diagnostics['checks']['network'] = self.check_network()
|
|
334
|
+
|
|
335
|
+
# Check application health
|
|
336
|
+
diagnostics['checks']['services'] = self.check_services()
|
|
337
|
+
diagnostics['checks']['endpoints'] = self.check_endpoints()
|
|
338
|
+
|
|
339
|
+
# Check recent errors
|
|
340
|
+
diagnostics['checks']['errors'] = self.analyze_error_logs()
|
|
341
|
+
|
|
342
|
+
return diagnostics
|
|
343
|
+
|
|
344
|
+
def check_cpu(self) -> Dict:
|
|
345
|
+
"""Check CPU usage and identify high-usage processes"""
|
|
346
|
+
result = subprocess.run(
|
|
347
|
+
["top", "-b", "-n", "1"],
|
|
348
|
+
capture_output=True,
|
|
349
|
+
text=True
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
lines = result.stdout.split('\n')
|
|
353
|
+
cpu_line = [l for l in lines if 'Cpu(s)' in l][0]
|
|
354
|
+
|
|
355
|
+
# Parse top processes
|
|
356
|
+
processes = []
|
|
357
|
+
for line in lines[7:17]: # Top 10 processes
|
|
358
|
+
if line.strip():
|
|
359
|
+
parts = line.split()
|
|
360
|
+
processes.append({
|
|
361
|
+
'pid': parts[0],
|
|
362
|
+
'cpu': parts[8],
|
|
363
|
+
'mem': parts[9],
|
|
364
|
+
'command': parts[11]
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
return {
|
|
368
|
+
'summary': cpu_line,
|
|
369
|
+
'top_processes': processes,
|
|
370
|
+
'status': 'critical' if float(processes[0]['cpu']) > 80 else 'ok'
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
def analyze_error_logs(self, lookback_minutes: int = 60) -> Dict:
|
|
374
|
+
"""Analyze error patterns in logs"""
|
|
375
|
+
cmd = f"journalctl --since '{lookback_minutes} minutes ago' | grep -E 'ERROR|FATAL'"
|
|
376
|
+
result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
|
|
377
|
+
|
|
378
|
+
errors = {}
|
|
379
|
+
for line in result.stdout.split('\n'):
|
|
380
|
+
if line:
|
|
381
|
+
# Extract error type
|
|
382
|
+
if 'ERROR' in line:
|
|
383
|
+
error_type = line.split('ERROR')[1].split()[0] if 'ERROR' in line else 'unknown'
|
|
384
|
+
errors[error_type] = errors.get(error_type, 0) + 1
|
|
385
|
+
|
|
386
|
+
return {
|
|
387
|
+
'error_counts': errors,
|
|
388
|
+
'total_errors': sum(errors.values()),
|
|
389
|
+
'unique_errors': len(errors),
|
|
390
|
+
'top_errors': sorted(errors.items(), key=lambda x: x[1], reverse=True)[:5]
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
def auto_remediate(self, diagnostics: Dict) -> List[str]:
|
|
394
|
+
"""Attempt automatic remediation based on diagnostics"""
|
|
395
|
+
actions_taken = []
|
|
396
|
+
|
|
397
|
+
# High CPU - restart problematic services
|
|
398
|
+
if diagnostics['checks']['cpu']['status'] == 'critical':
|
|
399
|
+
for proc in diagnostics['checks']['cpu']['top_processes'][:3]:
|
|
400
|
+
if float(proc['cpu']) > 90:
|
|
401
|
+
actions_taken.append(f"Restarted high-CPU process: {proc['command']}")
|
|
402
|
+
# subprocess.run([...]) # Actual restart command
|
|
403
|
+
|
|
404
|
+
# Memory pressure - clear caches
|
|
405
|
+
if diagnostics['checks']['memory'].get('usage_percent', 0) > 90:
|
|
406
|
+
subprocess.run(["sync"], check=True)
|
|
407
|
+
subprocess.run(["echo", "3", ">", "/proc/sys/vm/drop_caches"], shell=True)
|
|
408
|
+
actions_taken.append("Cleared system caches due to memory pressure")
|
|
409
|
+
|
|
410
|
+
# Disk space - clean up logs
|
|
411
|
+
if diagnostics['checks']['disk'].get('usage_percent', 0) > 90:
|
|
412
|
+
subprocess.run(["journalctl", "--vacuum-time=7d"], check=True)
|
|
413
|
+
actions_taken.append("Cleaned up old logs to free disk space")
|
|
414
|
+
|
|
415
|
+
return actions_taken
|
|
416
|
+
|
|
417
|
+
# Usage
|
|
418
|
+
responder = IncidentResponder('/etc/incident/config.yaml')
|
|
419
|
+
diagnostics = responder.diagnose_system()
|
|
420
|
+
actions = responder.auto_remediate(diagnostics)
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
### Runbook Integration
|
|
424
|
+
```yaml
|
|
425
|
+
# Incident runbook example
|
|
426
|
+
incident_type: api_latency_spike
|
|
427
|
+
severity: P2
|
|
428
|
+
detection:
|
|
429
|
+
- metric: api_p95_latency > 1000ms
|
|
430
|
+
- duration: 5 minutes
|
|
431
|
+
|
|
432
|
+
initial_response:
|
|
433
|
+
- verify:
|
|
434
|
+
- Check dashboard for traffic spike
|
|
435
|
+
- Verify no ongoing deployment
|
|
436
|
+
- Check upstream service health
|
|
437
|
+
|
|
438
|
+
- diagnose:
|
|
439
|
+
- Run: kubectl top pods -n api
|
|
440
|
+
- Run: kubectl logs -n api -l app=api --tail=100 | grep ERROR
|
|
441
|
+
- Check database slow query log
|
|
442
|
+
- Review recent commits
|
|
443
|
+
|
|
444
|
+
- mitigate:
|
|
445
|
+
- Scale up if CPU/memory constrained
|
|
446
|
+
- Enable circuit breaker if upstream issue
|
|
447
|
+
- Increase cache TTL temporarily
|
|
448
|
+
- Consider rolling back recent deployment
|
|
449
|
+
|
|
450
|
+
escalation:
|
|
451
|
+
- 10min: Page on-call engineer
|
|
452
|
+
- 20min: Page team lead
|
|
453
|
+
- 30min: Page SRE manager
|
|
454
|
+
- 60min: Invoke major incident process
|
|
455
|
+
|
|
456
|
+
recovery_verification:
|
|
457
|
+
- All golden signals within SLO
|
|
458
|
+
- No errors in logs for 10 minutes
|
|
459
|
+
- Synthetic tests passing
|
|
460
|
+
- Customer reports ceased
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## Best Practices
|
|
464
|
+
|
|
465
|
+
### Incident Priorities
|
|
466
|
+
- **P1 (Critical)**: Complete outage, data loss risk, security breach
|
|
467
|
+
- **P2 (Major)**: Significant degradation, partial outage, high error rate
|
|
468
|
+
- **P3 (Minor)**: Minor degradation, cosmetic issues, single user affected
|
|
469
|
+
|
|
470
|
+
### Communication Guidelines
|
|
471
|
+
1. Update status page within 5 minutes
|
|
472
|
+
2. Send initial assessment within 15 minutes
|
|
473
|
+
3. Provide updates every 30 minutes during P1
|
|
474
|
+
4. Use clear, non-technical language for customers
|
|
475
|
+
5. Document everything in incident channel
|
|
476
|
+
|
|
477
|
+
### Post-Mortem Culture
|
|
478
|
+
- Blameless analysis focused on systems
|
|
479
|
+
- Timeline reconstruction with evidence
|
|
480
|
+
- Multiple root causes identification
|
|
481
|
+
- Actionable improvements with owners
|
|
482
|
+
- Share learnings organization-wide
|
|
483
|
+
|
|
484
|
+
## Tools & Commands Reference
|
|
485
|
+
|
|
486
|
+
### Monitoring & Alerting
|
|
487
|
+
- **Prometheus/Grafana**: Metrics and dashboards
|
|
488
|
+
- **ELK Stack**: Centralized logging
|
|
489
|
+
- **Jaeger/Zipkin**: Distributed tracing
|
|
490
|
+
- **PagerDuty/Opsgenie**: Incident management
|
|
491
|
+
- **Datadog/New Relic**: APM and infrastructure
|
|
492
|
+
|
|
493
|
+
### Quick Diagnostic Commands
|
|
494
|
+
```bash
|
|
495
|
+
# One-liner system health check
|
|
496
|
+
echo "=== System Health ===" && \
|
|
497
|
+
df -h | grep -E '^/dev/' && \
|
|
498
|
+
free -h && \
|
|
499
|
+
top -bn1 | head -20 && \
|
|
500
|
+
systemctl status | grep failed && \
|
|
501
|
+
journalctl -p err --since "10 minutes ago" | tail -20
|
|
502
|
+
```
|
|
503
|
+
|
|
504
|
+
## Output Format
|
|
505
|
+
When responding to incidents:
|
|
506
|
+
1. Assess severity and impact immediately
|
|
507
|
+
2. Communicate status clearly
|
|
508
|
+
3. Gather evidence systematically
|
|
509
|
+
4. Apply fixes incrementally
|
|
510
|
+
5. Verify resolution thoroughly
|
|
511
|
+
6. Document everything
|
|
512
|
+
7. Conduct blameless post-mortem
|
|
513
|
+
|
|
514
|
+
Always prioritize:
|
|
515
|
+
- Customer impact minimization
|
|
516
|
+
- Data integrity
|
|
517
|
+
- Clear communication
|
|
518
|
+
- Evidence-based decisions
|
|
519
|
+
- Learning from failures
|