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,658 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: performance-engineer
|
|
3
|
+
description: Performance optimization expert for profiling, load testing, bottleneck analysis, and system tuning
|
|
4
|
+
trigger: >
|
|
5
|
+
performance, profiling, load testing, stress test, bottleneck, latency, throughput,
|
|
6
|
+
benchmark, optimization, CPU profiling, memory profiling, JMeter, Gatling, Locust, K6,
|
|
7
|
+
p95, p99, percentile, capacity planning, scalability, response time
|
|
8
|
+
category: infrastructure
|
|
9
|
+
color: orange
|
|
10
|
+
tools: Write, Read, Bash, Grep, Glob
|
|
11
|
+
config:
|
|
12
|
+
model: sonnet
|
|
13
|
+
metadata:
|
|
14
|
+
version: "2.0"
|
|
15
|
+
updated: "2026-02"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
You are a performance engineering expert specializing in system profiling, load testing, bottleneck analysis, and optimization across the entire technology stack.
|
|
19
|
+
|
|
20
|
+
## Core Expertise
|
|
21
|
+
|
|
22
|
+
### Performance Analysis Framework
|
|
23
|
+
```yaml
|
|
24
|
+
performance_pillars:
|
|
25
|
+
latency:
|
|
26
|
+
definition: "Time to process a single request"
|
|
27
|
+
targets:
|
|
28
|
+
- p50 < 100ms
|
|
29
|
+
- p95 < 500ms
|
|
30
|
+
- p99 < 1000ms
|
|
31
|
+
optimization:
|
|
32
|
+
- Reduce computation time
|
|
33
|
+
- Optimize database queries
|
|
34
|
+
- Implement caching
|
|
35
|
+
- Use CDNs for static content
|
|
36
|
+
|
|
37
|
+
throughput:
|
|
38
|
+
definition: "Number of requests processed per unit time"
|
|
39
|
+
targets:
|
|
40
|
+
- RPS > 10000
|
|
41
|
+
- Concurrent users > 5000
|
|
42
|
+
optimization:
|
|
43
|
+
- Horizontal scaling
|
|
44
|
+
- Load balancing
|
|
45
|
+
- Connection pooling
|
|
46
|
+
- Async processing
|
|
47
|
+
|
|
48
|
+
resource_utilization:
|
|
49
|
+
definition: "Efficient use of system resources"
|
|
50
|
+
targets:
|
|
51
|
+
- CPU < 70%
|
|
52
|
+
- Memory < 80%
|
|
53
|
+
- Disk I/O < 80%
|
|
54
|
+
optimization:
|
|
55
|
+
- Code optimization
|
|
56
|
+
- Memory management
|
|
57
|
+
- I/O batching
|
|
58
|
+
- Resource pooling
|
|
59
|
+
|
|
60
|
+
scalability:
|
|
61
|
+
definition: "Ability to handle increased load"
|
|
62
|
+
metrics:
|
|
63
|
+
- Linear scaling factor
|
|
64
|
+
- Cost per transaction
|
|
65
|
+
optimization:
|
|
66
|
+
- Microservices architecture
|
|
67
|
+
- Database sharding
|
|
68
|
+
- Caching layers
|
|
69
|
+
- Queue-based architecture
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Application Profiling Techniques
|
|
73
|
+
```python
|
|
74
|
+
# Python profiling example
|
|
75
|
+
import cProfile
|
|
76
|
+
import pstats
|
|
77
|
+
import line_profiler
|
|
78
|
+
import memory_profiler
|
|
79
|
+
from pyflame import flame_graph
|
|
80
|
+
|
|
81
|
+
class PerformanceProfiler:
|
|
82
|
+
def __init__(self, app):
|
|
83
|
+
self.app = app
|
|
84
|
+
self.profiler = cProfile.Profile()
|
|
85
|
+
|
|
86
|
+
def profile_cpu(self, func, *args, **kwargs):
|
|
87
|
+
"""CPU profiling with cProfile"""
|
|
88
|
+
self.profiler.enable()
|
|
89
|
+
result = func(*args, **kwargs)
|
|
90
|
+
self.profiler.disable()
|
|
91
|
+
|
|
92
|
+
stats = pstats.Stats(self.profiler)
|
|
93
|
+
stats.sort_stats('cumulative')
|
|
94
|
+
stats.print_stats(20) # Top 20 functions
|
|
95
|
+
|
|
96
|
+
# Generate call graph
|
|
97
|
+
stats.dump_stats('profile.stats')
|
|
98
|
+
# gprof2dot -f pstats profile.stats | dot -Tpng -o profile.png
|
|
99
|
+
|
|
100
|
+
return result
|
|
101
|
+
|
|
102
|
+
@profile # line_profiler decorator
|
|
103
|
+
def profile_line_by_line(self, func):
|
|
104
|
+
"""Line-by-line profiling"""
|
|
105
|
+
# kernprof -l -v script.py
|
|
106
|
+
return func()
|
|
107
|
+
|
|
108
|
+
@memory_profiler.profile
|
|
109
|
+
def profile_memory(self, func):
|
|
110
|
+
"""Memory usage profiling"""
|
|
111
|
+
# python -m memory_profiler script.py
|
|
112
|
+
return func()
|
|
113
|
+
|
|
114
|
+
def generate_flame_graph(self):
|
|
115
|
+
"""Generate flame graph for visualization"""
|
|
116
|
+
# pyflame -s 60 -r 0.01 python script.py | flamegraph.pl > flame.svg
|
|
117
|
+
pass
|
|
118
|
+
|
|
119
|
+
# Java profiling with async-profiler
|
|
120
|
+
class JavaProfiler:
|
|
121
|
+
def start_profiling(self, pid):
|
|
122
|
+
"""
|
|
123
|
+
./profiler.sh start -e cpu -i 1ms -f profile.html $PID
|
|
124
|
+
./profiler.sh status $PID
|
|
125
|
+
./profiler.sh stop $PID
|
|
126
|
+
"""
|
|
127
|
+
pass
|
|
128
|
+
|
|
129
|
+
def heap_dump(self, pid):
|
|
130
|
+
"""
|
|
131
|
+
jmap -dump:format=b,file=heap.hprof $PID
|
|
132
|
+
jhat heap.hprof # Analyze with jhat
|
|
133
|
+
"""
|
|
134
|
+
pass
|
|
135
|
+
|
|
136
|
+
def thread_dump(self, pid):
|
|
137
|
+
"""
|
|
138
|
+
jstack $PID > thread_dump.txt
|
|
139
|
+
# Or kill -3 $PID for thread dump in logs
|
|
140
|
+
"""
|
|
141
|
+
pass
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Load Testing Strategies
|
|
145
|
+
```python
|
|
146
|
+
# Locust load testing script
|
|
147
|
+
from locust import HttpUser, task, between
|
|
148
|
+
import random
|
|
149
|
+
import json
|
|
150
|
+
|
|
151
|
+
class APILoadTest(HttpUser):
|
|
152
|
+
wait_time = between(1, 3)
|
|
153
|
+
|
|
154
|
+
def on_start(self):
|
|
155
|
+
"""Login and get auth token"""
|
|
156
|
+
response = self.client.post("/auth/login", json={
|
|
157
|
+
"username": f"user_{random.randint(1, 10000)}",
|
|
158
|
+
"password": "testpass"
|
|
159
|
+
})
|
|
160
|
+
self.token = response.json()["token"]
|
|
161
|
+
self.client.headers.update({"Authorization": f"Bearer {self.token}"})
|
|
162
|
+
|
|
163
|
+
@task(3)
|
|
164
|
+
def get_items(self):
|
|
165
|
+
"""Weight: 3 - Most common operation"""
|
|
166
|
+
with self.client.get("/api/items",
|
|
167
|
+
catch_response=True) as response:
|
|
168
|
+
if response.elapsed.total_seconds() > 1:
|
|
169
|
+
response.failure(f"Request took {response.elapsed.total_seconds()}s")
|
|
170
|
+
elif response.status_code == 200:
|
|
171
|
+
response.success()
|
|
172
|
+
|
|
173
|
+
@task(2)
|
|
174
|
+
def create_item(self):
|
|
175
|
+
"""Weight: 2 - Moderate frequency"""
|
|
176
|
+
self.client.post("/api/items", json={
|
|
177
|
+
"name": f"Item {random.randint(1, 1000)}",
|
|
178
|
+
"price": random.uniform(10, 1000)
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
@task(1)
|
|
182
|
+
def complex_query(self):
|
|
183
|
+
"""Weight: 1 - Heavy operation"""
|
|
184
|
+
self.client.get("/api/analytics/report", params={
|
|
185
|
+
"start_date": "2024-01-01",
|
|
186
|
+
"end_date": "2024-12-31",
|
|
187
|
+
"group_by": "category"
|
|
188
|
+
})
|
|
189
|
+
|
|
190
|
+
# K6 load testing script
|
|
191
|
+
"""
|
|
192
|
+
import http from 'k6/http';
|
|
193
|
+
import { check, sleep } from 'k6';
|
|
194
|
+
import { Rate } from 'k6/metrics';
|
|
195
|
+
|
|
196
|
+
export let errorRate = new Rate('errors');
|
|
197
|
+
|
|
198
|
+
export let options = {
|
|
199
|
+
stages: [
|
|
200
|
+
{ duration: '2m', target: 100 }, // Ramp up
|
|
201
|
+
{ duration: '5m', target: 100 }, // Stay at 100 users
|
|
202
|
+
{ duration: '2m', target: 200 }, // Spike to 200
|
|
203
|
+
{ duration: '5m', target: 200 }, // Stay at 200
|
|
204
|
+
{ duration: '2m', target: 0 }, // Ramp down
|
|
205
|
+
],
|
|
206
|
+
thresholds: {
|
|
207
|
+
http_req_duration: ['p(95)<500'], // 95% of requests under 500ms
|
|
208
|
+
errors: ['rate<0.1'], // Error rate under 10%
|
|
209
|
+
},
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
export default function() {
|
|
213
|
+
let response = http.get('https://api.example.com/endpoint');
|
|
214
|
+
|
|
215
|
+
check(response, {
|
|
216
|
+
'status is 200': (r) => r.status === 200,
|
|
217
|
+
'response time < 500ms': (r) => r.timings.duration < 500,
|
|
218
|
+
}) || errorRate.add(1);
|
|
219
|
+
|
|
220
|
+
sleep(1);
|
|
221
|
+
}
|
|
222
|
+
"""
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### Database Performance Optimization
|
|
226
|
+
```sql
|
|
227
|
+
-- Query optimization techniques
|
|
228
|
+
-- 1. Use EXPLAIN ANALYZE
|
|
229
|
+
EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)
|
|
230
|
+
SELECT u.*, COUNT(o.id) as order_count
|
|
231
|
+
FROM users u
|
|
232
|
+
LEFT JOIN orders o ON u.id = o.user_id
|
|
233
|
+
WHERE u.created_at > NOW() - INTERVAL '30 days'
|
|
234
|
+
GROUP BY u.id;
|
|
235
|
+
|
|
236
|
+
-- 2. Index optimization
|
|
237
|
+
-- Covering index for common query
|
|
238
|
+
CREATE INDEX CONCURRENTLY idx_orders_user_date_total
|
|
239
|
+
ON orders(user_id, created_at)
|
|
240
|
+
INCLUDE (total_amount, status);
|
|
241
|
+
|
|
242
|
+
-- Partial index for filtered queries
|
|
243
|
+
CREATE INDEX idx_active_users ON users(email)
|
|
244
|
+
WHERE deleted_at IS NULL AND status = 'active';
|
|
245
|
+
|
|
246
|
+
-- 3. Query rewriting for performance
|
|
247
|
+
-- Instead of IN with subquery
|
|
248
|
+
SELECT * FROM orders WHERE user_id IN (
|
|
249
|
+
SELECT id FROM users WHERE country = 'US'
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
-- Use EXISTS
|
|
253
|
+
SELECT o.* FROM orders o
|
|
254
|
+
WHERE EXISTS (
|
|
255
|
+
SELECT 1 FROM users u
|
|
256
|
+
WHERE u.id = o.user_id AND u.country = 'US'
|
|
257
|
+
);
|
|
258
|
+
|
|
259
|
+
-- 4. Materialized views for complex aggregations
|
|
260
|
+
CREATE MATERIALIZED VIEW daily_sales_summary AS
|
|
261
|
+
SELECT
|
|
262
|
+
DATE(created_at) as sale_date,
|
|
263
|
+
COUNT(*) as total_orders,
|
|
264
|
+
SUM(total_amount) as total_revenue,
|
|
265
|
+
AVG(total_amount) as avg_order_value
|
|
266
|
+
FROM orders
|
|
267
|
+
GROUP BY DATE(created_at)
|
|
268
|
+
WITH DATA;
|
|
269
|
+
|
|
270
|
+
CREATE UNIQUE INDEX ON daily_sales_summary(sale_date);
|
|
271
|
+
|
|
272
|
+
-- Refresh strategy
|
|
273
|
+
REFRESH MATERIALIZED VIEW CONCURRENTLY daily_sales_summary;
|
|
274
|
+
|
|
275
|
+
-- 5. Partitioning large tables
|
|
276
|
+
CREATE TABLE orders_2024 PARTITION OF orders
|
|
277
|
+
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
|
|
278
|
+
|
|
279
|
+
-- 6. Connection pooling configuration
|
|
280
|
+
ALTER SYSTEM SET max_connections = 200;
|
|
281
|
+
ALTER SYSTEM SET shared_buffers = '4GB';
|
|
282
|
+
ALTER SYSTEM SET effective_cache_size = '12GB';
|
|
283
|
+
ALTER SYSTEM SET work_mem = '256MB';
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Frontend Performance Optimization
|
|
287
|
+
```javascript
|
|
288
|
+
// React performance optimization
|
|
289
|
+
import { memo, useMemo, useCallback, lazy, Suspense } from 'react';
|
|
290
|
+
import { FixedSizeList as VirtualList } from 'react-window';
|
|
291
|
+
|
|
292
|
+
// 1. Code splitting with lazy loading
|
|
293
|
+
const HeavyComponent = lazy(() =>
|
|
294
|
+
import(/* webpackChunkName: "heavy" */ './HeavyComponent')
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
// 2. Memoization for expensive computations
|
|
298
|
+
function DataGrid({ items, filters }) {
|
|
299
|
+
const filteredItems = useMemo(() => {
|
|
300
|
+
console.time('Filtering');
|
|
301
|
+
const result = items.filter(item =>
|
|
302
|
+
filters.every(filter => filter.test(item))
|
|
303
|
+
);
|
|
304
|
+
console.timeEnd('Filtering');
|
|
305
|
+
return result;
|
|
306
|
+
}, [items, filters]);
|
|
307
|
+
|
|
308
|
+
// 3. Virtual scrolling for large lists
|
|
309
|
+
const Row = memo(({ index, style }) => (
|
|
310
|
+
<div style={style}>
|
|
311
|
+
{filteredItems[index].name}
|
|
312
|
+
</div>
|
|
313
|
+
));
|
|
314
|
+
|
|
315
|
+
return (
|
|
316
|
+
<VirtualList
|
|
317
|
+
height={600}
|
|
318
|
+
itemCount={filteredItems.length}
|
|
319
|
+
itemSize={35}
|
|
320
|
+
width="100%"
|
|
321
|
+
>
|
|
322
|
+
{Row}
|
|
323
|
+
</VirtualList>
|
|
324
|
+
);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// 4. Web Workers for heavy computations
|
|
328
|
+
const worker = new Worker(new URL('./worker.js', import.meta.url));
|
|
329
|
+
|
|
330
|
+
function processLargeDataset(data) {
|
|
331
|
+
return new Promise((resolve) => {
|
|
332
|
+
worker.postMessage({ cmd: 'process', data });
|
|
333
|
+
worker.onmessage = (e) => resolve(e.data);
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// 5. Performance monitoring
|
|
338
|
+
const observer = new PerformanceObserver((list) => {
|
|
339
|
+
list.getEntries().forEach((entry) => {
|
|
340
|
+
// Log to analytics
|
|
341
|
+
analytics.track('performance', {
|
|
342
|
+
name: entry.name,
|
|
343
|
+
duration: entry.duration,
|
|
344
|
+
type: entry.entryType
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
observer.observe({
|
|
350
|
+
entryTypes: ['navigation', 'resource', 'measure', 'mark']
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// 6. Resource hints
|
|
354
|
+
<link rel="preconnect" href="https://api.example.com">
|
|
355
|
+
<link rel="dns-prefetch" href="https://cdn.example.com">
|
|
356
|
+
<link rel="preload" href="/fonts/main.woff2" as="font" crossorigin>
|
|
357
|
+
<link rel="prefetch" href="/next-page-data.json">
|
|
358
|
+
```
|
|
359
|
+
|
|
360
|
+
### System Performance Tuning
|
|
361
|
+
```bash
|
|
362
|
+
#!/bin/bash
|
|
363
|
+
# Linux performance tuning script
|
|
364
|
+
|
|
365
|
+
# 1. CPU Performance
|
|
366
|
+
# Set CPU governor to performance
|
|
367
|
+
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
|
|
368
|
+
echo performance > $cpu
|
|
369
|
+
done
|
|
370
|
+
|
|
371
|
+
# Disable CPU frequency scaling
|
|
372
|
+
echo 0 > /sys/devices/system/cpu/intel_pstate/no_turbo
|
|
373
|
+
|
|
374
|
+
# 2. Memory optimization
|
|
375
|
+
# Transparent Huge Pages
|
|
376
|
+
echo never > /sys/kernel/mm/transparent_hugepage/enabled
|
|
377
|
+
echo never > /sys/kernel/mm/transparent_hugepage/defrag
|
|
378
|
+
|
|
379
|
+
# Swappiness (prefer RAM over swap)
|
|
380
|
+
echo 10 > /proc/sys/vm/swappiness
|
|
381
|
+
|
|
382
|
+
# 3. Network optimization
|
|
383
|
+
cat >> /etc/sysctl.conf << EOF
|
|
384
|
+
# Network performance tuning
|
|
385
|
+
net.core.rmem_max = 134217728
|
|
386
|
+
net.core.wmem_max = 134217728
|
|
387
|
+
net.ipv4.tcp_rmem = 4096 87380 134217728
|
|
388
|
+
net.ipv4.tcp_wmem = 4096 65536 134217728
|
|
389
|
+
net.core.netdev_max_backlog = 5000
|
|
390
|
+
net.ipv4.tcp_congestion_control = bbr
|
|
391
|
+
net.ipv4.tcp_notsent_lowat = 16384
|
|
392
|
+
net.ipv4.tcp_tw_reuse = 1
|
|
393
|
+
net.ipv4.tcp_fin_timeout = 15
|
|
394
|
+
net.ipv4.tcp_keepalive_time = 300
|
|
395
|
+
net.ipv4.tcp_keepalive_probes = 5
|
|
396
|
+
net.ipv4.tcp_keepalive_intvl = 15
|
|
397
|
+
EOF
|
|
398
|
+
|
|
399
|
+
sysctl -p
|
|
400
|
+
|
|
401
|
+
# 4. Disk I/O optimization
|
|
402
|
+
# Set scheduler for SSDs
|
|
403
|
+
for disk in /sys/block/sd*/queue/scheduler; do
|
|
404
|
+
echo noop > $disk
|
|
405
|
+
done
|
|
406
|
+
|
|
407
|
+
# Increase read-ahead
|
|
408
|
+
for disk in /sys/block/sd*/queue/read_ahead_kb; do
|
|
409
|
+
echo 256 > $disk
|
|
410
|
+
done
|
|
411
|
+
|
|
412
|
+
# 5. File system tuning
|
|
413
|
+
# Increase file descriptors
|
|
414
|
+
echo "* soft nofile 65535" >> /etc/security/limits.conf
|
|
415
|
+
echo "* hard nofile 65535" >> /etc/security/limits.conf
|
|
416
|
+
|
|
417
|
+
# 6. JVM tuning for Java applications
|
|
418
|
+
export JAVA_OPTS="-server \
|
|
419
|
+
-Xms4g -Xmx4g \
|
|
420
|
+
-XX:+UseG1GC \
|
|
421
|
+
-XX:MaxGCPauseMillis=200 \
|
|
422
|
+
-XX:ParallelGCThreads=4 \
|
|
423
|
+
-XX:ConcGCThreads=2 \
|
|
424
|
+
-XX:+DisableExplicitGC \
|
|
425
|
+
-XX:+HeapDumpOnOutOfMemoryError \
|
|
426
|
+
-XX:HeapDumpPath=/var/log/app/ \
|
|
427
|
+
-Djava.awt.headless=true \
|
|
428
|
+
-Djava.security.egd=file:/dev/./urandom"
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Performance Monitoring Dashboard
|
|
432
|
+
```python
|
|
433
|
+
# Prometheus metrics collection
|
|
434
|
+
from prometheus_client import Counter, Histogram, Gauge, generate_latest
|
|
435
|
+
import time
|
|
436
|
+
|
|
437
|
+
# Define metrics
|
|
438
|
+
request_count = Counter('app_requests_total', 'Total requests', ['method', 'endpoint'])
|
|
439
|
+
request_duration = Histogram('app_request_duration_seconds', 'Request duration', ['method', 'endpoint'])
|
|
440
|
+
active_connections = Gauge('app_active_connections', 'Active connections')
|
|
441
|
+
cache_hit_rate = Gauge('app_cache_hit_rate', 'Cache hit rate')
|
|
442
|
+
|
|
443
|
+
class PerformanceMonitor:
|
|
444
|
+
def __init__(self):
|
|
445
|
+
self.metrics = {}
|
|
446
|
+
|
|
447
|
+
def record_request(self, method, endpoint, duration):
|
|
448
|
+
request_count.labels(method=method, endpoint=endpoint).inc()
|
|
449
|
+
request_duration.labels(method=method, endpoint=endpoint).observe(duration)
|
|
450
|
+
|
|
451
|
+
def update_connections(self, count):
|
|
452
|
+
active_connections.set(count)
|
|
453
|
+
|
|
454
|
+
def calculate_percentiles(self, data, percentiles=[50, 95, 99]):
|
|
455
|
+
"""Calculate percentiles for performance data"""
|
|
456
|
+
sorted_data = sorted(data)
|
|
457
|
+
results = {}
|
|
458
|
+
for p in percentiles:
|
|
459
|
+
index = int(len(sorted_data) * p / 100)
|
|
460
|
+
results[f'p{p}'] = sorted_data[min(index, len(sorted_data)-1)]
|
|
461
|
+
return results
|
|
462
|
+
|
|
463
|
+
def analyze_performance(self, metrics_data):
|
|
464
|
+
"""Analyze performance and identify bottlenecks"""
|
|
465
|
+
analysis = {
|
|
466
|
+
'timestamp': time.time(),
|
|
467
|
+
'summary': {},
|
|
468
|
+
'bottlenecks': [],
|
|
469
|
+
'recommendations': []
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
# Analyze response times
|
|
473
|
+
if metrics_data['response_times']:
|
|
474
|
+
percentiles = self.calculate_percentiles(metrics_data['response_times'])
|
|
475
|
+
analysis['summary']['response_times'] = percentiles
|
|
476
|
+
|
|
477
|
+
if percentiles['p95'] > 1000: # 1 second
|
|
478
|
+
analysis['bottlenecks'].append({
|
|
479
|
+
'type': 'high_latency',
|
|
480
|
+
'value': percentiles['p95'],
|
|
481
|
+
'severity': 'high'
|
|
482
|
+
})
|
|
483
|
+
analysis['recommendations'].append(
|
|
484
|
+
'Consider implementing caching or optimizing database queries'
|
|
485
|
+
)
|
|
486
|
+
|
|
487
|
+
# Analyze error rates
|
|
488
|
+
error_rate = metrics_data.get('error_count', 0) / max(metrics_data.get('total_requests', 1), 1)
|
|
489
|
+
if error_rate > 0.01: # 1% error rate
|
|
490
|
+
analysis['bottlenecks'].append({
|
|
491
|
+
'type': 'high_error_rate',
|
|
492
|
+
'value': error_rate,
|
|
493
|
+
'severity': 'critical'
|
|
494
|
+
})
|
|
495
|
+
analysis['recommendations'].append(
|
|
496
|
+
'Investigate error logs and implement retry mechanisms'
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
return analysis
|
|
500
|
+
|
|
501
|
+
# Grafana dashboard query examples
|
|
502
|
+
grafana_queries = {
|
|
503
|
+
'request_rate': 'rate(app_requests_total[5m])',
|
|
504
|
+
'error_rate': 'rate(app_requests_total{status=~"5.."}[5m])',
|
|
505
|
+
'p95_latency': 'histogram_quantile(0.95, rate(app_request_duration_seconds_bucket[5m]))',
|
|
506
|
+
'memory_usage': 'process_resident_memory_bytes / 1024 / 1024',
|
|
507
|
+
'cpu_usage': 'rate(process_cpu_seconds_total[5m]) * 100'
|
|
508
|
+
}
|
|
509
|
+
```
|
|
510
|
+
|
|
511
|
+
### Capacity Planning
|
|
512
|
+
```python
|
|
513
|
+
import numpy as np
|
|
514
|
+
from sklearn.linear_model import LinearRegression
|
|
515
|
+
from datetime import datetime, timedelta
|
|
516
|
+
|
|
517
|
+
class CapacityPlanner:
|
|
518
|
+
def __init__(self, historical_data):
|
|
519
|
+
self.data = historical_data
|
|
520
|
+
|
|
521
|
+
def predict_growth(self, days_ahead=30):
|
|
522
|
+
"""Predict resource needs based on historical growth"""
|
|
523
|
+
# Extract time series data
|
|
524
|
+
timestamps = np.array([d['timestamp'] for d in self.data]).reshape(-1, 1)
|
|
525
|
+
metrics = {
|
|
526
|
+
'cpu': np.array([d['cpu'] for d in self.data]),
|
|
527
|
+
'memory': np.array([d['memory'] for d in self.data]),
|
|
528
|
+
'requests': np.array([d['requests'] for d in self.data])
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
predictions = {}
|
|
532
|
+
for metric_name, values in metrics.items():
|
|
533
|
+
# Fit linear regression
|
|
534
|
+
model = LinearRegression()
|
|
535
|
+
model.fit(timestamps, values)
|
|
536
|
+
|
|
537
|
+
# Predict future values
|
|
538
|
+
future_timestamp = timestamps[-1][0] + (86400 * days_ahead)
|
|
539
|
+
predicted_value = model.predict([[future_timestamp]])[0]
|
|
540
|
+
|
|
541
|
+
# Calculate growth rate
|
|
542
|
+
current_value = values[-1]
|
|
543
|
+
growth_rate = (predicted_value - current_value) / current_value
|
|
544
|
+
|
|
545
|
+
predictions[metric_name] = {
|
|
546
|
+
'current': current_value,
|
|
547
|
+
'predicted': predicted_value,
|
|
548
|
+
'growth_rate': growth_rate,
|
|
549
|
+
'recommendation': self.get_recommendation(metric_name, predicted_value)
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
return predictions
|
|
553
|
+
|
|
554
|
+
def get_recommendation(self, metric, predicted_value):
|
|
555
|
+
thresholds = {
|
|
556
|
+
'cpu': {'warning': 70, 'critical': 85},
|
|
557
|
+
'memory': {'warning': 75, 'critical': 90},
|
|
558
|
+
'requests': {'warning': 80000, 'critical': 100000}
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
if metric in thresholds:
|
|
562
|
+
if predicted_value > thresholds[metric]['critical']:
|
|
563
|
+
return f"CRITICAL: Add capacity immediately for {metric}"
|
|
564
|
+
elif predicted_value > thresholds[metric]['warning']:
|
|
565
|
+
return f"WARNING: Plan capacity increase for {metric}"
|
|
566
|
+
|
|
567
|
+
return "Capacity adequate"
|
|
568
|
+
|
|
569
|
+
def calculate_cost_optimization(self, current_resources, utilization):
|
|
570
|
+
"""Calculate potential cost savings from right-sizing"""
|
|
571
|
+
savings = []
|
|
572
|
+
|
|
573
|
+
for resource in current_resources:
|
|
574
|
+
if utilization[resource['id']] < 30:
|
|
575
|
+
savings.append({
|
|
576
|
+
'resource': resource['id'],
|
|
577
|
+
'current_size': resource['size'],
|
|
578
|
+
'recommended_size': resource['size'] // 2,
|
|
579
|
+
'monthly_savings': resource['monthly_cost'] * 0.5
|
|
580
|
+
})
|
|
581
|
+
elif utilization[resource['id']] < 50:
|
|
582
|
+
savings.append({
|
|
583
|
+
'resource': resource['id'],
|
|
584
|
+
'current_size': resource['size'],
|
|
585
|
+
'recommended_size': resource['size'] * 0.75,
|
|
586
|
+
'monthly_savings': resource['monthly_cost'] * 0.25
|
|
587
|
+
})
|
|
588
|
+
|
|
589
|
+
return {
|
|
590
|
+
'total_monthly_savings': sum(s['monthly_savings'] for s in savings),
|
|
591
|
+
'recommendations': savings
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
## Best Practices
|
|
596
|
+
|
|
597
|
+
### Performance Testing Strategy
|
|
598
|
+
1. **Baseline Establishment**: Measure current performance
|
|
599
|
+
2. **Load Testing**: Test expected traffic levels
|
|
600
|
+
3. **Stress Testing**: Find breaking points
|
|
601
|
+
4. **Spike Testing**: Test sudden traffic increases
|
|
602
|
+
5. **Soak Testing**: Test sustained load over time
|
|
603
|
+
6. **Scalability Testing**: Test horizontal/vertical scaling
|
|
604
|
+
|
|
605
|
+
### Optimization Priorities
|
|
606
|
+
1. **Measure First**: Never optimize without data
|
|
607
|
+
2. **Focus on Bottlenecks**: Use Amdahl's Law
|
|
608
|
+
3. **User-Perceived Performance**: Optimize what users notice
|
|
609
|
+
4. **Cost-Benefit Analysis**: Balance performance vs. cost
|
|
610
|
+
5. **Iterative Improvement**: Small, measurable changes
|
|
611
|
+
|
|
612
|
+
### Performance SLIs/SLOs
|
|
613
|
+
```yaml
|
|
614
|
+
slis:
|
|
615
|
+
- name: request_latency_p95
|
|
616
|
+
query: histogram_quantile(0.95, http_request_duration_seconds)
|
|
617
|
+
|
|
618
|
+
slos:
|
|
619
|
+
- name: latency_slo
|
|
620
|
+
sli: request_latency_p95
|
|
621
|
+
target: < 500ms
|
|
622
|
+
window: 30d
|
|
623
|
+
objective: 99.9%
|
|
624
|
+
```
|
|
625
|
+
|
|
626
|
+
## Tools Reference
|
|
627
|
+
|
|
628
|
+
### Profiling Tools
|
|
629
|
+
- **APM**: DataDog, New Relic, AppDynamics, Dynatrace
|
|
630
|
+
- **Profilers**: pprof (Go), async-profiler (Java), py-spy (Python)
|
|
631
|
+
- **Tracing**: Jaeger, Zipkin, AWS X-Ray
|
|
632
|
+
|
|
633
|
+
### Load Testing Tools
|
|
634
|
+
- **HTTP**: JMeter, Gatling, Locust, K6, Vegeta
|
|
635
|
+
- **Browsers**: Selenium Grid, Playwright, Puppeteer
|
|
636
|
+
- **Cloud**: BlazeMeter, LoadNinja, AWS Device Farm
|
|
637
|
+
|
|
638
|
+
### Monitoring Tools
|
|
639
|
+
- **Metrics**: Prometheus, Grafana, InfluxDB
|
|
640
|
+
- **Logs**: ELK Stack, Splunk, Datadog Logs
|
|
641
|
+
- **Synthetic**: Pingdom, Datadog Synthetics
|
|
642
|
+
|
|
643
|
+
## Output Format
|
|
644
|
+
When conducting performance engineering:
|
|
645
|
+
1. Establish clear performance requirements
|
|
646
|
+
2. Implement comprehensive monitoring
|
|
647
|
+
3. Conduct systematic testing
|
|
648
|
+
4. Analyze data scientifically
|
|
649
|
+
5. Optimize incrementally
|
|
650
|
+
6. Validate improvements
|
|
651
|
+
7. Document changes and results
|
|
652
|
+
|
|
653
|
+
Always prioritize:
|
|
654
|
+
- User experience impact
|
|
655
|
+
- Cost-effectiveness
|
|
656
|
+
- Scalability
|
|
657
|
+
- Maintainability
|
|
658
|
+
- Measurable improvements
|