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,320 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: timescaledb
|
|
3
|
+
description: >
|
|
4
|
+
TimescaleDB time-series database patterns with hypertables, continuous aggregates, and compression.
|
|
5
|
+
Trigger: TimescaleDB, time-series, hypertable, continuous aggregate, time bucket, PostgreSQL time-series
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Bash
|
|
10
|
+
metadata:
|
|
11
|
+
author: plataforma-industrial
|
|
12
|
+
version: "2.0"
|
|
13
|
+
tags: [timescaledb, postgresql, time-series, database, iot]
|
|
14
|
+
updated: "2026-02"
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# TimescaleDB Time-Series Database
|
|
18
|
+
|
|
19
|
+
Patterns for time-series data with TimescaleDB.
|
|
20
|
+
|
|
21
|
+
## Stack
|
|
22
|
+
|
|
23
|
+
```yaml
|
|
24
|
+
TimescaleDB: 2.14+
|
|
25
|
+
PostgreSQL: 16+
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Docker Setup
|
|
29
|
+
|
|
30
|
+
```yaml
|
|
31
|
+
services:
|
|
32
|
+
timescaledb:
|
|
33
|
+
image: timescale/timescaledb:latest-pg16
|
|
34
|
+
environment:
|
|
35
|
+
POSTGRES_USER: app
|
|
36
|
+
POSTGRES_PASSWORD: app
|
|
37
|
+
POSTGRES_DB: app
|
|
38
|
+
ports:
|
|
39
|
+
- "5432:5432"
|
|
40
|
+
volumes:
|
|
41
|
+
- timescale_data:/var/lib/postgresql/data
|
|
42
|
+
command: >
|
|
43
|
+
postgres
|
|
44
|
+
-c shared_preload_libraries=timescaledb
|
|
45
|
+
-c timescaledb.max_background_workers=8
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Hypertable Creation
|
|
49
|
+
|
|
50
|
+
```sql
|
|
51
|
+
-- Enable extension
|
|
52
|
+
CREATE EXTENSION IF NOT EXISTS timescaledb;
|
|
53
|
+
|
|
54
|
+
-- Create table
|
|
55
|
+
CREATE TABLE readings (
|
|
56
|
+
time TIMESTAMPTZ NOT NULL,
|
|
57
|
+
sensor_id UUID NOT NULL,
|
|
58
|
+
tenant_id UUID NOT NULL,
|
|
59
|
+
value DOUBLE PRECISION NOT NULL,
|
|
60
|
+
quality SMALLINT DEFAULT 192
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
-- Convert to hypertable
|
|
64
|
+
SELECT create_hypertable(
|
|
65
|
+
'readings',
|
|
66
|
+
'time',
|
|
67
|
+
chunk_time_interval => INTERVAL '1 day',
|
|
68
|
+
if_not_exists => TRUE
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
-- Add space partitioning for multi-tenant
|
|
72
|
+
SELECT add_dimension('readings', 'tenant_id', number_partitions => 4);
|
|
73
|
+
|
|
74
|
+
-- Create indexes
|
|
75
|
+
CREATE INDEX idx_readings_sensor_time ON readings (sensor_id, time DESC);
|
|
76
|
+
CREATE INDEX idx_readings_tenant_time ON readings (tenant_id, time DESC);
|
|
77
|
+
|
|
78
|
+
-- Enable compression
|
|
79
|
+
ALTER TABLE readings SET (
|
|
80
|
+
timescaledb.compress,
|
|
81
|
+
timescaledb.compress_segmentby = 'sensor_id, tenant_id',
|
|
82
|
+
timescaledb.compress_orderby = 'time DESC'
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
-- Add compression policy
|
|
86
|
+
SELECT add_compression_policy('readings', INTERVAL '7 days');
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Continuous Aggregates
|
|
90
|
+
|
|
91
|
+
### Hourly Aggregates
|
|
92
|
+
|
|
93
|
+
```sql
|
|
94
|
+
CREATE MATERIALIZED VIEW readings_hourly
|
|
95
|
+
WITH (timescaledb.continuous) AS
|
|
96
|
+
SELECT
|
|
97
|
+
time_bucket('1 hour', time) AS bucket,
|
|
98
|
+
sensor_id,
|
|
99
|
+
tenant_id,
|
|
100
|
+
AVG(value) AS avg_value,
|
|
101
|
+
MIN(value) AS min_value,
|
|
102
|
+
MAX(value) AS max_value,
|
|
103
|
+
COUNT(*) AS count,
|
|
104
|
+
PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY value) AS median
|
|
105
|
+
FROM readings
|
|
106
|
+
GROUP BY bucket, sensor_id, tenant_id
|
|
107
|
+
WITH NO DATA;
|
|
108
|
+
|
|
109
|
+
-- Refresh policy
|
|
110
|
+
SELECT add_continuous_aggregate_policy('readings_hourly',
|
|
111
|
+
start_offset => INTERVAL '2 hours',
|
|
112
|
+
end_offset => INTERVAL '1 hour',
|
|
113
|
+
schedule_interval => INTERVAL '1 hour'
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
-- Enable real-time aggregation
|
|
117
|
+
ALTER MATERIALIZED VIEW readings_hourly SET (
|
|
118
|
+
timescaledb.materialized_only = false
|
|
119
|
+
);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Daily Aggregates
|
|
123
|
+
|
|
124
|
+
```sql
|
|
125
|
+
CREATE MATERIALIZED VIEW readings_daily
|
|
126
|
+
WITH (timescaledb.continuous) AS
|
|
127
|
+
SELECT
|
|
128
|
+
time_bucket('1 day', time) AS bucket,
|
|
129
|
+
sensor_id,
|
|
130
|
+
tenant_id,
|
|
131
|
+
AVG(value) AS avg_value,
|
|
132
|
+
MIN(value) AS min_value,
|
|
133
|
+
MAX(value) AS max_value,
|
|
134
|
+
COUNT(*) AS count
|
|
135
|
+
FROM readings
|
|
136
|
+
GROUP BY bucket, sensor_id, tenant_id
|
|
137
|
+
WITH NO DATA;
|
|
138
|
+
|
|
139
|
+
SELECT add_continuous_aggregate_policy('readings_daily',
|
|
140
|
+
start_offset => INTERVAL '3 days',
|
|
141
|
+
end_offset => INTERVAL '1 day',
|
|
142
|
+
schedule_interval => INTERVAL '1 day'
|
|
143
|
+
);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Time-Series Queries
|
|
147
|
+
|
|
148
|
+
### Time Bucket
|
|
149
|
+
|
|
150
|
+
```sql
|
|
151
|
+
SELECT
|
|
152
|
+
time_bucket('15 minutes', time) AS period,
|
|
153
|
+
sensor_id,
|
|
154
|
+
AVG(value) AS avg_value,
|
|
155
|
+
COUNT(*) AS readings
|
|
156
|
+
FROM readings
|
|
157
|
+
WHERE sensor_id = $1 AND time > NOW() - INTERVAL '24 hours'
|
|
158
|
+
GROUP BY period, sensor_id
|
|
159
|
+
ORDER BY period DESC;
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Gap Filling
|
|
163
|
+
|
|
164
|
+
```sql
|
|
165
|
+
SELECT
|
|
166
|
+
time_bucket_gapfill('1 hour', time) AS period,
|
|
167
|
+
sensor_id,
|
|
168
|
+
COALESCE(AVG(value), interpolate(AVG(value))) AS value,
|
|
169
|
+
locf(AVG(value)) AS last_known
|
|
170
|
+
FROM readings
|
|
171
|
+
WHERE sensor_id = $1 AND time BETWEEN '2024-01-01' AND '2024-01-02'
|
|
172
|
+
GROUP BY period, sensor_id
|
|
173
|
+
ORDER BY period;
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### Latest Per Sensor
|
|
177
|
+
|
|
178
|
+
```sql
|
|
179
|
+
SELECT DISTINCT ON (sensor_id)
|
|
180
|
+
sensor_id,
|
|
181
|
+
time AS last_time,
|
|
182
|
+
value AS last_value
|
|
183
|
+
FROM readings
|
|
184
|
+
WHERE tenant_id = $1
|
|
185
|
+
ORDER BY sensor_id, time DESC;
|
|
186
|
+
|
|
187
|
+
-- Or using first/last
|
|
188
|
+
SELECT
|
|
189
|
+
sensor_id,
|
|
190
|
+
last(value, time) AS last_value,
|
|
191
|
+
last(time, time) AS last_time
|
|
192
|
+
FROM readings
|
|
193
|
+
WHERE tenant_id = $1 AND time > NOW() - INTERVAL '1 hour'
|
|
194
|
+
GROUP BY sensor_id;
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Change Detection
|
|
198
|
+
|
|
199
|
+
```sql
|
|
200
|
+
WITH delta AS (
|
|
201
|
+
SELECT
|
|
202
|
+
time,
|
|
203
|
+
sensor_id,
|
|
204
|
+
value,
|
|
205
|
+
value - LAG(value) OVER (PARTITION BY sensor_id ORDER BY time) AS change,
|
|
206
|
+
ABS(value - LAG(value) OVER (PARTITION BY sensor_id ORDER BY time))
|
|
207
|
+
/ NULLIF(LAG(value) OVER (PARTITION BY sensor_id ORDER BY time), 0) * 100 AS pct_change
|
|
208
|
+
FROM readings
|
|
209
|
+
WHERE sensor_id = $1
|
|
210
|
+
)
|
|
211
|
+
SELECT * FROM delta WHERE ABS(pct_change) > 10
|
|
212
|
+
ORDER BY time DESC;
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Retention Policies
|
|
216
|
+
|
|
217
|
+
```sql
|
|
218
|
+
-- Raw data: 90 days
|
|
219
|
+
SELECT add_retention_policy('readings', INTERVAL '90 days');
|
|
220
|
+
|
|
221
|
+
-- Aggregates: longer
|
|
222
|
+
SELECT add_retention_policy('readings_hourly', INTERVAL '2 years');
|
|
223
|
+
SELECT add_retention_policy('readings_daily', INTERVAL '5 years');
|
|
224
|
+
|
|
225
|
+
-- View policies
|
|
226
|
+
SELECT * FROM timescaledb_information.jobs WHERE proc_name = 'policy_retention';
|
|
227
|
+
|
|
228
|
+
-- Manual drop
|
|
229
|
+
SELECT drop_chunks('readings', older_than => INTERVAL '90 days');
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
## Go Integration
|
|
233
|
+
|
|
234
|
+
```go
|
|
235
|
+
type Reading struct {
|
|
236
|
+
Time time.Time `db:"time"`
|
|
237
|
+
SensorID string `db:"sensor_id"`
|
|
238
|
+
TenantID string `db:"tenant_id"`
|
|
239
|
+
Value float64 `db:"value"`
|
|
240
|
+
Quality int16 `db:"quality"`
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Batch insert with COPY
|
|
244
|
+
func (r *Repository) InsertBatch(ctx context.Context, readings []Reading) error {
|
|
245
|
+
_, err := r.pool.CopyFrom(
|
|
246
|
+
ctx,
|
|
247
|
+
pgx.Identifier{"readings"},
|
|
248
|
+
[]string{"time", "sensor_id", "tenant_id", "value", "quality"},
|
|
249
|
+
pgx.CopyFromSlice(len(readings), func(i int) ([]any, error) {
|
|
250
|
+
return []any{
|
|
251
|
+
readings[i].Time,
|
|
252
|
+
readings[i].SensorID,
|
|
253
|
+
readings[i].TenantID,
|
|
254
|
+
readings[i].Value,
|
|
255
|
+
readings[i].Quality,
|
|
256
|
+
}, nil
|
|
257
|
+
}),
|
|
258
|
+
)
|
|
259
|
+
return err
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Aggregated query
|
|
263
|
+
func (r *Repository) GetAggregated(ctx context.Context, sensorID string, start, end time.Time, bucket string) ([]Aggregate, error) {
|
|
264
|
+
query := `
|
|
265
|
+
SELECT time_bucket($1, time) AS bucket, AVG(value), MIN(value), MAX(value), COUNT(*)
|
|
266
|
+
FROM readings
|
|
267
|
+
WHERE sensor_id = $2 AND time BETWEEN $3 AND $4
|
|
268
|
+
GROUP BY bucket ORDER BY bucket DESC
|
|
269
|
+
`
|
|
270
|
+
rows, err := r.pool.Query(ctx, query, bucket, sensorID, start, end)
|
|
271
|
+
// ...
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Python Integration
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
async def insert_readings(pool, readings: list[Reading]) -> None:
|
|
279
|
+
async with pool.acquire() as conn:
|
|
280
|
+
await conn.copy_records_to_table(
|
|
281
|
+
'readings',
|
|
282
|
+
records=[(r.time, r.sensor_id, r.tenant_id, r.value, r.quality) for r in readings],
|
|
283
|
+
columns=['time', 'sensor_id', 'tenant_id', 'value', 'quality']
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
async def get_aggregated(pool, sensor_id: str, start: datetime, end: datetime, bucket: str = '1 hour'):
|
|
287
|
+
query = """
|
|
288
|
+
SELECT time_bucket($1::interval, time) AS bucket, AVG(value), MIN(value), MAX(value), COUNT(*)
|
|
289
|
+
FROM readings WHERE sensor_id = $2 AND time BETWEEN $3 AND $4
|
|
290
|
+
GROUP BY bucket ORDER BY bucket DESC
|
|
291
|
+
"""
|
|
292
|
+
async with pool.acquire() as conn:
|
|
293
|
+
return await conn.fetch(query, bucket, sensor_id, start, end)
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
## Performance Tips
|
|
297
|
+
|
|
298
|
+
1. **Use COPY for bulk inserts** - Much faster than INSERT
|
|
299
|
+
2. **Tune chunk size** - Based on data volume
|
|
300
|
+
3. **Use continuous aggregates** - For dashboards
|
|
301
|
+
4. **Compression** - Enable after data stabilizes
|
|
302
|
+
5. **Partial indexes** - For recent data queries
|
|
303
|
+
|
|
304
|
+
```sql
|
|
305
|
+
-- Partial index for recent data
|
|
306
|
+
CREATE INDEX idx_recent ON readings (sensor_id, time DESC)
|
|
307
|
+
WHERE time > NOW() - INTERVAL '7 days';
|
|
308
|
+
|
|
309
|
+
-- Check compression stats
|
|
310
|
+
SELECT hypertable_name, before_compression_total_bytes, after_compression_total_bytes,
|
|
311
|
+
(1 - after_compression_total_bytes::float / before_compression_total_bytes) * 100 AS ratio
|
|
312
|
+
FROM chunk_compression_stats('readings');
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Related Skills
|
|
316
|
+
|
|
317
|
+
- `pgx-postgres`: PostgreSQL driver patterns
|
|
318
|
+
- `redis-cache`: Hot data caching
|
|
319
|
+
- `duckdb-analytics`: Analytics queries
|
|
320
|
+
- `opentelemetry`: Metrics storage
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: api-documentation
|
|
3
|
+
description: >
|
|
4
|
+
API documentation concepts. OpenAPI/Swagger, interactive docs, versioning, examples.
|
|
5
|
+
Trigger: API docs, OpenAPI, Swagger, Redoc, documentation, API reference
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Grep
|
|
11
|
+
metadata:
|
|
12
|
+
author: apigen-team
|
|
13
|
+
version: "1.0"
|
|
14
|
+
tags: [documentation, openapi, swagger, api]
|
|
15
|
+
scope: ["**/docs/**"]
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# API Documentation Concepts
|
|
19
|
+
|
|
20
|
+
## OpenAPI Specification (OAS)
|
|
21
|
+
|
|
22
|
+
### Structure
|
|
23
|
+
```yaml
|
|
24
|
+
openapi: 3.1.0
|
|
25
|
+
info:
|
|
26
|
+
title: My API
|
|
27
|
+
version: 1.0.0
|
|
28
|
+
description: API description with **markdown** support
|
|
29
|
+
|
|
30
|
+
servers:
|
|
31
|
+
- url: https://api.example.com/v1
|
|
32
|
+
description: Production
|
|
33
|
+
- url: https://staging-api.example.com/v1
|
|
34
|
+
description: Staging
|
|
35
|
+
|
|
36
|
+
paths:
|
|
37
|
+
/users:
|
|
38
|
+
get:
|
|
39
|
+
summary: List users
|
|
40
|
+
operationId: listUsers
|
|
41
|
+
tags: [Users]
|
|
42
|
+
parameters:
|
|
43
|
+
- name: page
|
|
44
|
+
in: query
|
|
45
|
+
schema:
|
|
46
|
+
type: integer
|
|
47
|
+
default: 1
|
|
48
|
+
responses:
|
|
49
|
+
'200':
|
|
50
|
+
description: Successful response
|
|
51
|
+
content:
|
|
52
|
+
application/json:
|
|
53
|
+
schema:
|
|
54
|
+
$ref: '#/components/schemas/UserList'
|
|
55
|
+
|
|
56
|
+
components:
|
|
57
|
+
schemas:
|
|
58
|
+
User:
|
|
59
|
+
type: object
|
|
60
|
+
required: [id, email]
|
|
61
|
+
properties:
|
|
62
|
+
id:
|
|
63
|
+
type: string
|
|
64
|
+
format: uuid
|
|
65
|
+
email:
|
|
66
|
+
type: string
|
|
67
|
+
format: email
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Key Elements
|
|
71
|
+
```
|
|
72
|
+
Info: API metadata, contact, license
|
|
73
|
+
Servers: Base URLs for environments
|
|
74
|
+
Paths: Endpoints and operations
|
|
75
|
+
Components: Reusable schemas, parameters, responses
|
|
76
|
+
Tags: Logical grouping of operations
|
|
77
|
+
Security: Authentication schemes
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Documentation Tools
|
|
81
|
+
|
|
82
|
+
### Swagger UI
|
|
83
|
+
```
|
|
84
|
+
Features:
|
|
85
|
+
- Interactive API explorer
|
|
86
|
+
- Try it out functionality
|
|
87
|
+
- Authorization support
|
|
88
|
+
- Request/response examples
|
|
89
|
+
|
|
90
|
+
Best for:
|
|
91
|
+
- Developer testing
|
|
92
|
+
- Internal documentation
|
|
93
|
+
- Quick prototyping
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Redoc
|
|
97
|
+
```
|
|
98
|
+
Features:
|
|
99
|
+
- Clean, professional look
|
|
100
|
+
- Three-panel layout
|
|
101
|
+
- Search functionality
|
|
102
|
+
- No interactivity (reference only)
|
|
103
|
+
|
|
104
|
+
Best for:
|
|
105
|
+
- Public API documentation
|
|
106
|
+
- Customer-facing docs
|
|
107
|
+
- Embedded in websites
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Stoplight
|
|
111
|
+
```
|
|
112
|
+
Features:
|
|
113
|
+
- Design-first approach
|
|
114
|
+
- Mock servers
|
|
115
|
+
- Style guides
|
|
116
|
+
- Git integration
|
|
117
|
+
|
|
118
|
+
Best for:
|
|
119
|
+
- API design
|
|
120
|
+
- Enterprise documentation
|
|
121
|
+
- Team collaboration
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Documentation Best Practices
|
|
125
|
+
|
|
126
|
+
### Descriptions
|
|
127
|
+
```yaml
|
|
128
|
+
# Good: Explains purpose and context
|
|
129
|
+
description: |
|
|
130
|
+
Retrieves a paginated list of users in the organization.
|
|
131
|
+
Results are sorted by creation date, newest first.
|
|
132
|
+
|
|
133
|
+
**Note:** Requires `users:read` permission.
|
|
134
|
+
|
|
135
|
+
# Bad: States the obvious
|
|
136
|
+
description: Gets users
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Examples
|
|
140
|
+
```yaml
|
|
141
|
+
# Provide realistic examples
|
|
142
|
+
schema:
|
|
143
|
+
type: object
|
|
144
|
+
properties:
|
|
145
|
+
email:
|
|
146
|
+
type: string
|
|
147
|
+
format: email
|
|
148
|
+
example: john.doe@example.com
|
|
149
|
+
createdAt:
|
|
150
|
+
type: string
|
|
151
|
+
format: date-time
|
|
152
|
+
example: "2024-01-15T10:30:00Z"
|
|
153
|
+
|
|
154
|
+
# Multiple examples for different scenarios
|
|
155
|
+
examples:
|
|
156
|
+
admin:
|
|
157
|
+
summary: Admin user
|
|
158
|
+
value:
|
|
159
|
+
id: "123"
|
|
160
|
+
email: "admin@example.com"
|
|
161
|
+
role: "admin"
|
|
162
|
+
regular:
|
|
163
|
+
summary: Regular user
|
|
164
|
+
value:
|
|
165
|
+
id: "456"
|
|
166
|
+
email: "user@example.com"
|
|
167
|
+
role: "user"
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### Error Responses
|
|
171
|
+
```yaml
|
|
172
|
+
responses:
|
|
173
|
+
'400':
|
|
174
|
+
description: Validation error
|
|
175
|
+
content:
|
|
176
|
+
application/problem+json:
|
|
177
|
+
schema:
|
|
178
|
+
$ref: '#/components/schemas/ProblemDetail'
|
|
179
|
+
examples:
|
|
180
|
+
invalidEmail:
|
|
181
|
+
summary: Invalid email format
|
|
182
|
+
value:
|
|
183
|
+
type: "https://api.example.com/errors/validation"
|
|
184
|
+
title: "Validation Error"
|
|
185
|
+
status: 400
|
|
186
|
+
detail: "Invalid email format"
|
|
187
|
+
errors:
|
|
188
|
+
- field: "email"
|
|
189
|
+
message: "Must be a valid email address"
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## API Versioning Documentation
|
|
193
|
+
|
|
194
|
+
### URL Versioning
|
|
195
|
+
```yaml
|
|
196
|
+
servers:
|
|
197
|
+
- url: https://api.example.com/v1
|
|
198
|
+
- url: https://api.example.com/v2
|
|
199
|
+
|
|
200
|
+
paths:
|
|
201
|
+
/v1/users:
|
|
202
|
+
deprecated: true
|
|
203
|
+
x-deprecation-date: 2024-06-01
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Header Versioning
|
|
207
|
+
```yaml
|
|
208
|
+
parameters:
|
|
209
|
+
- name: API-Version
|
|
210
|
+
in: header
|
|
211
|
+
required: false
|
|
212
|
+
schema:
|
|
213
|
+
type: string
|
|
214
|
+
default: "2024-01-01"
|
|
215
|
+
enum:
|
|
216
|
+
- "2024-01-01"
|
|
217
|
+
- "2023-06-01"
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
## Authentication Documentation
|
|
221
|
+
|
|
222
|
+
```yaml
|
|
223
|
+
components:
|
|
224
|
+
securitySchemes:
|
|
225
|
+
bearerAuth:
|
|
226
|
+
type: http
|
|
227
|
+
scheme: bearer
|
|
228
|
+
bearerFormat: JWT
|
|
229
|
+
description: |
|
|
230
|
+
JWT token obtained from `/auth/login`.
|
|
231
|
+
Token expires after 1 hour.
|
|
232
|
+
|
|
233
|
+
apiKey:
|
|
234
|
+
type: apiKey
|
|
235
|
+
in: header
|
|
236
|
+
name: X-API-Key
|
|
237
|
+
description: |
|
|
238
|
+
API key for server-to-server communication.
|
|
239
|
+
Contact support to obtain a key.
|
|
240
|
+
|
|
241
|
+
oauth2:
|
|
242
|
+
type: oauth2
|
|
243
|
+
flows:
|
|
244
|
+
authorizationCode:
|
|
245
|
+
authorizationUrl: https://auth.example.com/authorize
|
|
246
|
+
tokenUrl: https://auth.example.com/token
|
|
247
|
+
scopes:
|
|
248
|
+
users:read: Read user information
|
|
249
|
+
users:write: Create and update users
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Changelog & Migration
|
|
253
|
+
|
|
254
|
+
```markdown
|
|
255
|
+
## API Changelog
|
|
256
|
+
|
|
257
|
+
### v2.0.0 (2024-01-15)
|
|
258
|
+
#### Breaking Changes
|
|
259
|
+
- `GET /users` now returns paginated response
|
|
260
|
+
- `email` field renamed to `emailAddress`
|
|
261
|
+
|
|
262
|
+
#### New Features
|
|
263
|
+
- Added `GET /users/{id}/preferences`
|
|
264
|
+
- Added filtering by `status` parameter
|
|
265
|
+
|
|
266
|
+
### v1.5.0 (2023-12-01)
|
|
267
|
+
#### Deprecations
|
|
268
|
+
- `GET /users/all` deprecated, use `GET /users` with pagination
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Documentation-as-Code
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
Benefits:
|
|
275
|
+
- Version controlled
|
|
276
|
+
- Review process
|
|
277
|
+
- CI/CD integration
|
|
278
|
+
- Single source of truth
|
|
279
|
+
|
|
280
|
+
Workflow:
|
|
281
|
+
1. Write OpenAPI spec (YAML/JSON)
|
|
282
|
+
2. Review changes via PR
|
|
283
|
+
3. Generate docs on merge
|
|
284
|
+
4. Deploy to documentation site
|
|
285
|
+
5. Generate SDKs from spec
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
## Related Skills
|
|
289
|
+
|
|
290
|
+
- `docs-spring`: Spring Boot API documentation
|
|
291
|
+
- `apigen-architecture`: Overall system architecture
|
|
292
|
+
|
|
293
|
+
|