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,350 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: zustand-state
|
|
3
|
+
description: >
|
|
4
|
+
Zustand state management patterns with immer, persist middleware, and React integration.
|
|
5
|
+
Trigger: Zustand, state management, store, React state, immer, persist, global state
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Grep
|
|
10
|
+
metadata:
|
|
11
|
+
author: plataforma-industrial
|
|
12
|
+
version: "2.0"
|
|
13
|
+
tags: [zustand, state-management, react, immer, typescript]
|
|
14
|
+
updated: "2026-02"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# Zustand State Management
|
|
18
|
+
|
|
19
|
+
Modern state management patterns with Zustand 4.5+.
|
|
20
|
+
|
|
21
|
+
## Stack
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"zustand": "4.5.2",
|
|
26
|
+
"immer": "10.0.3"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Basic Store
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
// src/stores/ui.ts
|
|
34
|
+
import { create } from 'zustand';
|
|
35
|
+
|
|
36
|
+
interface UIState {
|
|
37
|
+
sidebarOpen: boolean;
|
|
38
|
+
theme: 'light' | 'dark' | 'auto';
|
|
39
|
+
toggleSidebar: () => void;
|
|
40
|
+
setTheme: (theme: 'light' | 'dark' | 'auto') => void;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const useUIStore = create<UIState>((set) => ({
|
|
44
|
+
sidebarOpen: true,
|
|
45
|
+
theme: 'auto',
|
|
46
|
+
toggleSidebar: () => set((state) => ({ sidebarOpen: !state.sidebarOpen })),
|
|
47
|
+
setTheme: (theme) => set({ theme }),
|
|
48
|
+
}));
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Auth Store with Persist
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
// src/stores/auth.ts
|
|
55
|
+
import { create } from 'zustand';
|
|
56
|
+
import { persist, createJSONStorage } from 'zustand/middleware';
|
|
57
|
+
|
|
58
|
+
interface User {
|
|
59
|
+
id: string;
|
|
60
|
+
email: string;
|
|
61
|
+
name: string;
|
|
62
|
+
role: 'admin' | 'user';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
interface AuthState {
|
|
66
|
+
user: User | null;
|
|
67
|
+
token: string | null;
|
|
68
|
+
isAuthenticated: boolean;
|
|
69
|
+
login: (user: User, token: string) => void;
|
|
70
|
+
logout: () => void;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export const useAuthStore = create<AuthState>()(
|
|
74
|
+
persist(
|
|
75
|
+
(set) => ({
|
|
76
|
+
user: null,
|
|
77
|
+
token: null,
|
|
78
|
+
isAuthenticated: false,
|
|
79
|
+
login: (user, token) => set({ user, token, isAuthenticated: true }),
|
|
80
|
+
logout: () => set({ user: null, token: null, isAuthenticated: false }),
|
|
81
|
+
}),
|
|
82
|
+
{
|
|
83
|
+
name: 'auth-storage',
|
|
84
|
+
storage: createJSONStorage(() => localStorage),
|
|
85
|
+
partialize: (state) => ({
|
|
86
|
+
user: state.user,
|
|
87
|
+
token: state.token,
|
|
88
|
+
isAuthenticated: state.isAuthenticated,
|
|
89
|
+
}),
|
|
90
|
+
}
|
|
91
|
+
)
|
|
92
|
+
);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Complex Store with Immer
|
|
96
|
+
|
|
97
|
+
```typescript
|
|
98
|
+
// src/stores/items.ts
|
|
99
|
+
import { create } from 'zustand';
|
|
100
|
+
import { immer } from 'zustand/middleware/immer';
|
|
101
|
+
import { subscribeWithSelector } from 'zustand/middleware';
|
|
102
|
+
|
|
103
|
+
interface Item {
|
|
104
|
+
id: string;
|
|
105
|
+
name: string;
|
|
106
|
+
value: number;
|
|
107
|
+
status: 'active' | 'inactive';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
interface ItemsState {
|
|
111
|
+
items: Record<string, Item>;
|
|
112
|
+
selectedId: string | null;
|
|
113
|
+
filters: { status?: string; search?: string };
|
|
114
|
+
|
|
115
|
+
setItems: (items: Item[]) => void;
|
|
116
|
+
updateItem: (id: string, updates: Partial<Item>) => void;
|
|
117
|
+
selectItem: (id: string | null) => void;
|
|
118
|
+
setFilters: (filters: Partial<ItemsState['filters']>) => void;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export const useItemsStore = create<ItemsState>()(
|
|
122
|
+
subscribeWithSelector(
|
|
123
|
+
immer((set) => ({
|
|
124
|
+
items: {},
|
|
125
|
+
selectedId: null,
|
|
126
|
+
filters: {},
|
|
127
|
+
|
|
128
|
+
setItems: (items) =>
|
|
129
|
+
set((state) => {
|
|
130
|
+
state.items = items.reduce((acc, item) => {
|
|
131
|
+
acc[item.id] = item;
|
|
132
|
+
return acc;
|
|
133
|
+
}, {} as Record<string, Item>);
|
|
134
|
+
}),
|
|
135
|
+
|
|
136
|
+
updateItem: (id, updates) =>
|
|
137
|
+
set((state) => {
|
|
138
|
+
if (state.items[id]) {
|
|
139
|
+
Object.assign(state.items[id], updates);
|
|
140
|
+
}
|
|
141
|
+
}),
|
|
142
|
+
|
|
143
|
+
selectItem: (id) =>
|
|
144
|
+
set((state) => {
|
|
145
|
+
state.selectedId = id;
|
|
146
|
+
}),
|
|
147
|
+
|
|
148
|
+
setFilters: (filters) =>
|
|
149
|
+
set((state) => {
|
|
150
|
+
Object.assign(state.filters, filters);
|
|
151
|
+
}),
|
|
152
|
+
}))
|
|
153
|
+
)
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// Selectors
|
|
157
|
+
export const selectItemsList = (state: ItemsState) => Object.values(state.items);
|
|
158
|
+
|
|
159
|
+
export const selectFilteredItems = (state: ItemsState) => {
|
|
160
|
+
const items = Object.values(state.items);
|
|
161
|
+
const { status, search } = state.filters;
|
|
162
|
+
|
|
163
|
+
return items.filter((item) => {
|
|
164
|
+
if (status && item.status !== status) return false;
|
|
165
|
+
if (search && !item.name.toLowerCase().includes(search.toLowerCase())) return false;
|
|
166
|
+
return true;
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Alerts Store
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
// src/stores/alerts.ts
|
|
175
|
+
import { create } from 'zustand';
|
|
176
|
+
import { immer } from 'zustand/middleware/immer';
|
|
177
|
+
|
|
178
|
+
interface Alert {
|
|
179
|
+
id: string;
|
|
180
|
+
type: 'warning' | 'error' | 'info';
|
|
181
|
+
message: string;
|
|
182
|
+
acknowledged: boolean;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
interface AlertsState {
|
|
186
|
+
alerts: Alert[];
|
|
187
|
+
unreadCount: number;
|
|
188
|
+
addAlert: (alert: Alert) => void;
|
|
189
|
+
acknowledgeAlert: (id: string) => void;
|
|
190
|
+
acknowledgeAll: () => void;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export const useAlertsStore = create<AlertsState>()(
|
|
194
|
+
immer((set) => ({
|
|
195
|
+
alerts: [],
|
|
196
|
+
unreadCount: 0,
|
|
197
|
+
|
|
198
|
+
addAlert: (alert) =>
|
|
199
|
+
set((state) => {
|
|
200
|
+
state.alerts.unshift(alert);
|
|
201
|
+
if (!alert.acknowledged) state.unreadCount++;
|
|
202
|
+
}),
|
|
203
|
+
|
|
204
|
+
acknowledgeAlert: (id) =>
|
|
205
|
+
set((state) => {
|
|
206
|
+
const alert = state.alerts.find((a) => a.id === id);
|
|
207
|
+
if (alert && !alert.acknowledged) {
|
|
208
|
+
alert.acknowledged = true;
|
|
209
|
+
state.unreadCount = Math.max(0, state.unreadCount - 1);
|
|
210
|
+
}
|
|
211
|
+
}),
|
|
212
|
+
|
|
213
|
+
acknowledgeAll: () =>
|
|
214
|
+
set((state) => {
|
|
215
|
+
state.alerts.forEach((a) => (a.acknowledged = true));
|
|
216
|
+
state.unreadCount = 0;
|
|
217
|
+
}),
|
|
218
|
+
}))
|
|
219
|
+
);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## React Patterns
|
|
223
|
+
|
|
224
|
+
### Selector Hook
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
export function useItemById(id: string) {
|
|
228
|
+
return useItemsStore(useCallback((state) => state.items[id], [id]));
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Shallow Compare
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
import { shallow } from 'zustand/shallow';
|
|
236
|
+
|
|
237
|
+
function ItemFilters() {
|
|
238
|
+
const { filters, setFilters } = useItemsStore(
|
|
239
|
+
(state) => ({
|
|
240
|
+
filters: state.filters,
|
|
241
|
+
setFilters: state.setFilters,
|
|
242
|
+
}),
|
|
243
|
+
shallow
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Actions Outside Components
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// Access store outside React
|
|
252
|
+
const currentUser = useAuthStore.getState().user;
|
|
253
|
+
|
|
254
|
+
// Execute action outside React
|
|
255
|
+
useAlertsStore.getState().addAlert(newAlert);
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Subscribe to Changes
|
|
259
|
+
|
|
260
|
+
```typescript
|
|
261
|
+
const unsubscribe = useItemsStore.subscribe(
|
|
262
|
+
(state) => state.selectedId,
|
|
263
|
+
(selectedId) => {
|
|
264
|
+
console.log('Selected:', selectedId);
|
|
265
|
+
}
|
|
266
|
+
);
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
## Slice Pattern (Large Apps)
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
// src/stores/slices/userSlice.ts
|
|
273
|
+
import { StateCreator } from 'zustand';
|
|
274
|
+
|
|
275
|
+
export interface UserSlice {
|
|
276
|
+
user: User | null;
|
|
277
|
+
setUser: (user: User | null) => void;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export const createUserSlice: StateCreator<UserSlice & OtherSlice, [], [], UserSlice> = (
|
|
281
|
+
set
|
|
282
|
+
) => ({
|
|
283
|
+
user: null,
|
|
284
|
+
setUser: (user) => set({ user }),
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
// src/stores/index.ts
|
|
290
|
+
import { create } from 'zustand';
|
|
291
|
+
import { createUserSlice, UserSlice } from './slices/userSlice';
|
|
292
|
+
import { createItemSlice, ItemSlice } from './slices/itemSlice';
|
|
293
|
+
|
|
294
|
+
type AppStore = UserSlice & ItemSlice;
|
|
295
|
+
|
|
296
|
+
export const useAppStore = create<AppStore>()((...a) => ({
|
|
297
|
+
...createUserSlice(...a),
|
|
298
|
+
...createItemSlice(...a),
|
|
299
|
+
}));
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## DevTools
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
import { devtools } from 'zustand/middleware';
|
|
306
|
+
|
|
307
|
+
export const useItemsStore = create<ItemsState>()(
|
|
308
|
+
devtools(
|
|
309
|
+
immer((set) => ({
|
|
310
|
+
// ...
|
|
311
|
+
})),
|
|
312
|
+
{ name: 'items-store' }
|
|
313
|
+
)
|
|
314
|
+
);
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Testing
|
|
318
|
+
|
|
319
|
+
```typescript
|
|
320
|
+
import { useAuthStore } from '../auth';
|
|
321
|
+
|
|
322
|
+
describe('AuthStore', () => {
|
|
323
|
+
beforeEach(() => {
|
|
324
|
+
useAuthStore.setState({ user: null, token: null, isAuthenticated: false });
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it('should login user', () => {
|
|
328
|
+
const user = { id: '1', email: 'test@test.com', name: 'Test', role: 'user' };
|
|
329
|
+
|
|
330
|
+
useAuthStore.getState().login(user, 'token');
|
|
331
|
+
|
|
332
|
+
expect(useAuthStore.getState().user).toEqual(user);
|
|
333
|
+
expect(useAuthStore.getState().isAuthenticated).toBe(true);
|
|
334
|
+
});
|
|
335
|
+
});
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
## Best Practices
|
|
339
|
+
|
|
340
|
+
1. **One store per domain** - Separate stores for auth, items, alerts, UI
|
|
341
|
+
2. **Specific selectors** - `state.user?.name` not entire state
|
|
342
|
+
3. **Actions in store** - Logic inside store, not components
|
|
343
|
+
4. **Use immer for complex updates** - Direct mutation syntax
|
|
344
|
+
5. **Shallow compare for objects** - Prevent unnecessary re-renders
|
|
345
|
+
|
|
346
|
+
## Related Skills
|
|
347
|
+
|
|
348
|
+
- `frontend-web`: Full frontend integration
|
|
349
|
+
- `tanstack-query`: Server state complement
|
|
350
|
+
- `mantine-ui`: UI state binding
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: chaos-engineering
|
|
3
|
+
description: >
|
|
4
|
+
Chaos engineering principles. Fault injection, resilience testing, game days.
|
|
5
|
+
Trigger: chaos, fault injection, resilience, chaos monkey, failure testing
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Grep
|
|
11
|
+
metadata:
|
|
12
|
+
author: apigen-team
|
|
13
|
+
version: "1.0"
|
|
14
|
+
tags: [chaos, testing, resilience, sre]
|
|
15
|
+
scope: ["**/chaos/**"]
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Chaos Engineering Concepts
|
|
19
|
+
|
|
20
|
+
## Core Principles
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Chaos Engineering: Discipline of experimenting on a system
|
|
24
|
+
to build confidence in its ability to withstand turbulent
|
|
25
|
+
conditions in production.
|
|
26
|
+
|
|
27
|
+
Key Principles:
|
|
28
|
+
1. Build hypothesis around steady state behavior
|
|
29
|
+
2. Vary real-world events (failures, traffic spikes)
|
|
30
|
+
3. Run experiments in production (safely)
|
|
31
|
+
4. Automate experiments for continuous validation
|
|
32
|
+
5. Minimize blast radius
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Steady State Hypothesis
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
Define "normal" before breaking things:
|
|
39
|
+
|
|
40
|
+
Metrics to establish:
|
|
41
|
+
- Response time P99 < 200ms
|
|
42
|
+
- Error rate < 0.1%
|
|
43
|
+
- Throughput > 1000 RPS
|
|
44
|
+
- CPU utilization < 70%
|
|
45
|
+
|
|
46
|
+
Hypothesis example:
|
|
47
|
+
"When the payment service fails, orders should still
|
|
48
|
+
be accepted and queued for later processing.
|
|
49
|
+
Response time may increase by 50% but stay under 500ms."
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Fault Types
|
|
53
|
+
|
|
54
|
+
### Network Faults
|
|
55
|
+
```
|
|
56
|
+
Latency injection:
|
|
57
|
+
- Add 100-500ms delay to service calls
|
|
58
|
+
- Simulate cross-region communication
|
|
59
|
+
- Test timeout configurations
|
|
60
|
+
|
|
61
|
+
Packet loss:
|
|
62
|
+
- Drop 5-10% of packets
|
|
63
|
+
- Test retry mechanisms
|
|
64
|
+
- Validate idempotency
|
|
65
|
+
|
|
66
|
+
DNS failures:
|
|
67
|
+
- Simulate DNS resolution failures
|
|
68
|
+
- Test fallback configurations
|
|
69
|
+
- Validate service discovery resilience
|
|
70
|
+
|
|
71
|
+
Connection limits:
|
|
72
|
+
- Exhaust connection pools
|
|
73
|
+
- Test circuit breaker activation
|
|
74
|
+
- Validate graceful degradation
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Service Faults
|
|
78
|
+
```
|
|
79
|
+
Service unavailability:
|
|
80
|
+
- Kill service instances
|
|
81
|
+
- Test load balancer failover
|
|
82
|
+
- Validate health check accuracy
|
|
83
|
+
|
|
84
|
+
Slow responses:
|
|
85
|
+
- Inject delays before response
|
|
86
|
+
- Test client timeouts
|
|
87
|
+
- Validate async processing
|
|
88
|
+
|
|
89
|
+
Error responses:
|
|
90
|
+
- Return 500/503 errors
|
|
91
|
+
- Test retry with backoff
|
|
92
|
+
- Validate error handling
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Database Faults
|
|
96
|
+
```
|
|
97
|
+
Connection failures:
|
|
98
|
+
- Drop database connections
|
|
99
|
+
- Test connection pool recovery
|
|
100
|
+
- Validate transaction rollback
|
|
101
|
+
|
|
102
|
+
Slow queries:
|
|
103
|
+
- Inject query delays
|
|
104
|
+
- Test query timeouts
|
|
105
|
+
- Validate read replica failover
|
|
106
|
+
|
|
107
|
+
Data corruption (controlled):
|
|
108
|
+
- Inject invalid data
|
|
109
|
+
- Test validation layers
|
|
110
|
+
- Validate data integrity checks
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Resource Faults
|
|
114
|
+
```
|
|
115
|
+
CPU stress:
|
|
116
|
+
- Consume CPU cycles
|
|
117
|
+
- Test autoscaling triggers
|
|
118
|
+
- Validate performance degradation
|
|
119
|
+
|
|
120
|
+
Memory pressure:
|
|
121
|
+
- Consume available memory
|
|
122
|
+
- Test OOM handling
|
|
123
|
+
- Validate garbage collection
|
|
124
|
+
|
|
125
|
+
Disk I/O:
|
|
126
|
+
- Slow disk operations
|
|
127
|
+
- Fill disk space
|
|
128
|
+
- Test log rotation
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
## Experiment Design
|
|
132
|
+
|
|
133
|
+
```
|
|
134
|
+
1. Define Scope
|
|
135
|
+
- Which service(s)?
|
|
136
|
+
- Which environment?
|
|
137
|
+
- What time window?
|
|
138
|
+
|
|
139
|
+
2. Set Hypothesis
|
|
140
|
+
- Expected behavior under fault
|
|
141
|
+
- Acceptable degradation limits
|
|
142
|
+
- Recovery time expectations
|
|
143
|
+
|
|
144
|
+
3. Design Fault
|
|
145
|
+
- Type of failure
|
|
146
|
+
- Duration and intensity
|
|
147
|
+
- Rollback mechanism
|
|
148
|
+
|
|
149
|
+
4. Define Metrics
|
|
150
|
+
- What to measure
|
|
151
|
+
- Baseline values
|
|
152
|
+
- Alert thresholds
|
|
153
|
+
|
|
154
|
+
5. Execute & Observe
|
|
155
|
+
- Start with small blast radius
|
|
156
|
+
- Monitor dashboards
|
|
157
|
+
- Ready to abort
|
|
158
|
+
|
|
159
|
+
6. Analyze & Report
|
|
160
|
+
- Did hypothesis hold?
|
|
161
|
+
- What broke unexpectedly?
|
|
162
|
+
- Action items for improvement
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Blast Radius Control
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
Start small, expand gradually:
|
|
169
|
+
|
|
170
|
+
Phase 1: Development
|
|
171
|
+
- Local development environment
|
|
172
|
+
- Single service instance
|
|
173
|
+
- Synthetic traffic
|
|
174
|
+
|
|
175
|
+
Phase 2: Staging
|
|
176
|
+
- Staging/pre-prod environment
|
|
177
|
+
- Full service mesh
|
|
178
|
+
- Replayed production traffic
|
|
179
|
+
|
|
180
|
+
Phase 3: Production (canary)
|
|
181
|
+
- Single production instance
|
|
182
|
+
- < 1% of traffic
|
|
183
|
+
- Immediate abort capability
|
|
184
|
+
|
|
185
|
+
Phase 4: Production (expanded)
|
|
186
|
+
- Multiple instances
|
|
187
|
+
- 5-10% of traffic
|
|
188
|
+
- Automated rollback
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## Game Days
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
Planned chaos exercises with team participation:
|
|
195
|
+
|
|
196
|
+
Preparation:
|
|
197
|
+
- Schedule 2-4 hours
|
|
198
|
+
- Notify stakeholders
|
|
199
|
+
- Prepare runbooks
|
|
200
|
+
- Set up monitoring dashboards
|
|
201
|
+
|
|
202
|
+
Execution:
|
|
203
|
+
- Inject failures per plan
|
|
204
|
+
- Observe and document
|
|
205
|
+
- Practice incident response
|
|
206
|
+
- Test communication channels
|
|
207
|
+
|
|
208
|
+
Post-mortem:
|
|
209
|
+
- Review what worked/failed
|
|
210
|
+
- Update runbooks
|
|
211
|
+
- Create improvement tickets
|
|
212
|
+
- Share learnings
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Tools Landscape
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
| Tool | Best For |
|
|
219
|
+
|------|----------|
|
|
220
|
+
| Chaos Monkey | Random instance termination |
|
|
221
|
+
| Gremlin | Comprehensive fault injection |
|
|
222
|
+
| Litmus | Kubernetes-native chaos |
|
|
223
|
+
| Toxiproxy | Network fault simulation |
|
|
224
|
+
| Chaos Mesh | K8s chaos orchestration |
|
|
225
|
+
| AWS FIS | AWS service faults |
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## Anti-patterns
|
|
229
|
+
|
|
230
|
+
```
|
|
231
|
+
❌ Starting in production without staging tests
|
|
232
|
+
❌ No abort mechanism or kill switch
|
|
233
|
+
❌ Chaos without monitoring
|
|
234
|
+
❌ No hypothesis before experiment
|
|
235
|
+
❌ Blaming instead of learning
|
|
236
|
+
❌ One-time exercises (should be continuous)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## Related Skills
|
|
240
|
+
|
|
241
|
+
- `chaos-spring`: Spring Boot chaos implementation
|
|
242
|
+
- `apigen-architecture`: Overall system architecture
|
|
243
|
+
|
|
244
|
+
|