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,423 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-ml
|
|
3
|
+
description: >
|
|
4
|
+
AI/ML patterns with FastAPI, LangChain, OpenAI/Anthropic, ONNX export, and model training pipelines.
|
|
5
|
+
Trigger: AI, ML, LangChain, OpenAI, Anthropic, ONNX, transformers, model training, LLM, agents, embeddings
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Bash
|
|
10
|
+
- Grep
|
|
11
|
+
metadata:
|
|
12
|
+
author: plataforma-industrial
|
|
13
|
+
version: "2.0"
|
|
14
|
+
tags: [ai, ml, fastapi, langchain, onnx, openai, anthropic, python]
|
|
15
|
+
updated: "2026-02"
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# AI/ML Development
|
|
19
|
+
|
|
20
|
+
AI service patterns with FastAPI, LangChain, and ONNX export.
|
|
21
|
+
|
|
22
|
+
## Stack
|
|
23
|
+
|
|
24
|
+
```toml
|
|
25
|
+
[project]
|
|
26
|
+
requires-python = ">=3.11"
|
|
27
|
+
dependencies = [
|
|
28
|
+
"fastapi==0.110.0",
|
|
29
|
+
"uvicorn[standard]==0.28.0",
|
|
30
|
+
"pydantic==2.6.3",
|
|
31
|
+
"pydantic-settings==2.2.1",
|
|
32
|
+
"openai==1.13.3",
|
|
33
|
+
"anthropic==0.18.1",
|
|
34
|
+
"langchain==0.1.11",
|
|
35
|
+
"langchain-openai==0.0.8",
|
|
36
|
+
"langchain-anthropic==0.1.4",
|
|
37
|
+
"sentence-transformers==2.5.1",
|
|
38
|
+
"torch==2.2.1",
|
|
39
|
+
"transformers==4.38.2",
|
|
40
|
+
"onnx==1.15.0",
|
|
41
|
+
"onnxruntime==1.17.1",
|
|
42
|
+
"structlog==24.1.0",
|
|
43
|
+
]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Project Structure
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
ai-service/
|
|
50
|
+
├── pyproject.toml
|
|
51
|
+
├── src/
|
|
52
|
+
│ └── ai_service/
|
|
53
|
+
│ ├── main.py
|
|
54
|
+
│ ├── config.py
|
|
55
|
+
│ ├── api/
|
|
56
|
+
│ │ ├── router.py
|
|
57
|
+
│ │ └── endpoints/
|
|
58
|
+
│ ├── agents/
|
|
59
|
+
│ │ ├── base.py
|
|
60
|
+
│ │ └── sql_agent.py
|
|
61
|
+
│ ├── chains/
|
|
62
|
+
│ │ └── intent_chain.py
|
|
63
|
+
│ ├── models/
|
|
64
|
+
│ │ └── chat.py
|
|
65
|
+
│ ├── services/
|
|
66
|
+
│ │ ├── llm_service.py
|
|
67
|
+
│ │ └── embedding_service.py
|
|
68
|
+
│ └── tools/
|
|
69
|
+
│ └── sql_tool.py
|
|
70
|
+
└── tests/
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## FastAPI Setup
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
# src/ai_service/main.py
|
|
77
|
+
from contextlib import asynccontextmanager
|
|
78
|
+
from fastapi import FastAPI
|
|
79
|
+
import structlog
|
|
80
|
+
|
|
81
|
+
from ai_service.config import settings
|
|
82
|
+
from ai_service.api.router import api_router
|
|
83
|
+
from ai_service.services.llm_service import LLMService
|
|
84
|
+
|
|
85
|
+
logger = structlog.get_logger()
|
|
86
|
+
|
|
87
|
+
@asynccontextmanager
|
|
88
|
+
async def lifespan(app: FastAPI):
|
|
89
|
+
app.state.llm_service = LLMService()
|
|
90
|
+
yield
|
|
91
|
+
|
|
92
|
+
def create_app() -> FastAPI:
|
|
93
|
+
app = FastAPI(
|
|
94
|
+
title="AI Service",
|
|
95
|
+
version=settings.version,
|
|
96
|
+
lifespan=lifespan,
|
|
97
|
+
)
|
|
98
|
+
app.include_router(api_router, prefix="/api/v1")
|
|
99
|
+
return app
|
|
100
|
+
|
|
101
|
+
app = create_app()
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## LLM Service Pattern
|
|
105
|
+
|
|
106
|
+
```python
|
|
107
|
+
# src/ai_service/services/llm_service.py
|
|
108
|
+
from abc import ABC, abstractmethod
|
|
109
|
+
from openai import AsyncOpenAI
|
|
110
|
+
from anthropic import AsyncAnthropic
|
|
111
|
+
from ai_service.config import settings
|
|
112
|
+
|
|
113
|
+
class BaseLLM(ABC):
|
|
114
|
+
@abstractmethod
|
|
115
|
+
async def generate(self, messages: list[dict], temperature: float = 0.7) -> str:
|
|
116
|
+
pass
|
|
117
|
+
|
|
118
|
+
class OpenAILLM(BaseLLM):
|
|
119
|
+
def __init__(self):
|
|
120
|
+
self.client = AsyncOpenAI(api_key=settings.openai_api_key)
|
|
121
|
+
self.model = settings.openai_model
|
|
122
|
+
|
|
123
|
+
async def generate(self, messages: list[dict], temperature: float = 0.7) -> str:
|
|
124
|
+
response = await self.client.chat.completions.create(
|
|
125
|
+
model=self.model,
|
|
126
|
+
messages=messages,
|
|
127
|
+
temperature=temperature,
|
|
128
|
+
)
|
|
129
|
+
return response.choices[0].message.content or ""
|
|
130
|
+
|
|
131
|
+
class AnthropicLLM(BaseLLM):
|
|
132
|
+
def __init__(self):
|
|
133
|
+
self.client = AsyncAnthropic(api_key=settings.anthropic_api_key)
|
|
134
|
+
self.model = settings.anthropic_model
|
|
135
|
+
|
|
136
|
+
async def generate(self, messages: list[dict], temperature: float = 0.7) -> str:
|
|
137
|
+
system = ""
|
|
138
|
+
user_messages = []
|
|
139
|
+
for msg in messages:
|
|
140
|
+
if msg["role"] == "system":
|
|
141
|
+
system = msg["content"]
|
|
142
|
+
else:
|
|
143
|
+
user_messages.append(msg)
|
|
144
|
+
|
|
145
|
+
response = await self.client.messages.create(
|
|
146
|
+
model=self.model,
|
|
147
|
+
max_tokens=1000,
|
|
148
|
+
system=system,
|
|
149
|
+
messages=user_messages,
|
|
150
|
+
temperature=temperature,
|
|
151
|
+
)
|
|
152
|
+
return response.content[0].text
|
|
153
|
+
|
|
154
|
+
class LLMService:
|
|
155
|
+
def __init__(self):
|
|
156
|
+
self._llms: dict[str, BaseLLM] = {}
|
|
157
|
+
|
|
158
|
+
def _get_llm(self, provider: str = "openai") -> BaseLLM:
|
|
159
|
+
if provider not in self._llms:
|
|
160
|
+
self._llms[provider] = OpenAILLM() if provider == "openai" else AnthropicLLM()
|
|
161
|
+
return self._llms[provider]
|
|
162
|
+
|
|
163
|
+
async def generate(self, messages: list[dict], provider: str = "openai") -> str:
|
|
164
|
+
return await self._get_llm(provider).generate(messages)
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## LangChain SQL Agent
|
|
168
|
+
|
|
169
|
+
```python
|
|
170
|
+
# src/ai_service/agents/sql_agent.py
|
|
171
|
+
from langchain.agents import AgentExecutor, create_openai_tools_agent
|
|
172
|
+
from langchain_openai import ChatOpenAI
|
|
173
|
+
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
|
|
174
|
+
from ai_service.tools.sql_tool import SQLQueryTool
|
|
175
|
+
|
|
176
|
+
SQL_SYSTEM_PROMPT = """You are an AI that queries a database.
|
|
177
|
+
Generate SELECT queries only. Never modify data."""
|
|
178
|
+
|
|
179
|
+
class SQLAgent:
|
|
180
|
+
def __init__(self, db_url: str):
|
|
181
|
+
self.llm = ChatOpenAI(model="gpt-4-turbo-preview", temperature=0)
|
|
182
|
+
self.sql_tool = SQLQueryTool(db_url)
|
|
183
|
+
self.agent = self._create_agent()
|
|
184
|
+
|
|
185
|
+
def _create_agent(self) -> AgentExecutor:
|
|
186
|
+
prompt = ChatPromptTemplate.from_messages([
|
|
187
|
+
("system", SQL_SYSTEM_PROMPT),
|
|
188
|
+
MessagesPlaceholder(variable_name="chat_history", optional=True),
|
|
189
|
+
("human", "{input}"),
|
|
190
|
+
MessagesPlaceholder(variable_name="agent_scratchpad"),
|
|
191
|
+
])
|
|
192
|
+
|
|
193
|
+
agent = create_openai_tools_agent(
|
|
194
|
+
llm=self.llm,
|
|
195
|
+
tools=[self.sql_tool],
|
|
196
|
+
prompt=prompt,
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
return AgentExecutor(agent=agent, tools=[self.sql_tool], max_iterations=3)
|
|
200
|
+
|
|
201
|
+
async def query(self, question: str) -> dict:
|
|
202
|
+
result = await self.agent.ainvoke({"input": question})
|
|
203
|
+
return {"answer": result["output"]}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
## LangChain Tool
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
# src/ai_service/tools/sql_tool.py
|
|
210
|
+
from typing import Type
|
|
211
|
+
from langchain.tools import BaseTool
|
|
212
|
+
from pydantic import BaseModel, Field
|
|
213
|
+
from sqlalchemy import create_engine, text
|
|
214
|
+
|
|
215
|
+
class SQLQueryInput(BaseModel):
|
|
216
|
+
query: str = Field(description="SELECT query to execute")
|
|
217
|
+
|
|
218
|
+
class SQLQueryTool(BaseTool):
|
|
219
|
+
name: str = "sql_query"
|
|
220
|
+
description: str = "Execute read-only SQL queries"
|
|
221
|
+
args_schema: Type[BaseModel] = SQLQueryInput
|
|
222
|
+
db_url: str
|
|
223
|
+
|
|
224
|
+
def __init__(self, db_url: str):
|
|
225
|
+
super().__init__(db_url=db_url)
|
|
226
|
+
self._engine = create_engine(db_url)
|
|
227
|
+
|
|
228
|
+
def _run(self, query: str) -> str:
|
|
229
|
+
if not query.strip().upper().startswith("SELECT"):
|
|
230
|
+
return "Error: Only SELECT allowed"
|
|
231
|
+
|
|
232
|
+
forbidden = ["INSERT", "UPDATE", "DELETE", "DROP", "ALTER"]
|
|
233
|
+
if any(kw in query.upper() for kw in forbidden):
|
|
234
|
+
return "Error: Forbidden operation"
|
|
235
|
+
|
|
236
|
+
with self._engine.connect() as conn:
|
|
237
|
+
result = conn.execute(text(query))
|
|
238
|
+
rows = result.fetchall()[:50]
|
|
239
|
+
return str([dict(zip(result.keys(), row)) for row in rows])
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Chat Endpoint
|
|
243
|
+
|
|
244
|
+
```python
|
|
245
|
+
# src/ai_service/api/endpoints/chat.py
|
|
246
|
+
import time
|
|
247
|
+
from uuid import uuid4
|
|
248
|
+
from fastapi import APIRouter, Depends
|
|
249
|
+
from ai_service.models.chat import ChatRequest, ChatResponse
|
|
250
|
+
from ai_service.services.llm_service import LLMService
|
|
251
|
+
|
|
252
|
+
router = APIRouter()
|
|
253
|
+
|
|
254
|
+
@router.post("/chat", response_model=ChatResponse)
|
|
255
|
+
async def chat(request: ChatRequest, llm_service: LLMService = Depends()):
|
|
256
|
+
start_time = time.time()
|
|
257
|
+
conversation_id = request.conversation_id or str(uuid4())
|
|
258
|
+
|
|
259
|
+
messages = [
|
|
260
|
+
{"role": "system", "content": "You are a helpful assistant."},
|
|
261
|
+
{"role": "user", "content": request.message},
|
|
262
|
+
]
|
|
263
|
+
|
|
264
|
+
response = await llm_service.generate(messages)
|
|
265
|
+
|
|
266
|
+
return ChatResponse(
|
|
267
|
+
message=response,
|
|
268
|
+
conversation_id=conversation_id,
|
|
269
|
+
processing_time_ms=int((time.time() - start_time) * 1000),
|
|
270
|
+
)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
## ONNX Export
|
|
274
|
+
|
|
275
|
+
```python
|
|
276
|
+
# scripts/export_onnx.py
|
|
277
|
+
from pathlib import Path
|
|
278
|
+
from transformers import AutoTokenizer, AutoModelForSequenceClassification
|
|
279
|
+
from optimum.onnxruntime import ORTModelForSequenceClassification
|
|
280
|
+
|
|
281
|
+
def export_model(model_path: str, output_path: str, quantize: bool = True):
|
|
282
|
+
tokenizer = AutoTokenizer.from_pretrained(model_path)
|
|
283
|
+
|
|
284
|
+
ort_model = ORTModelForSequenceClassification.from_pretrained(
|
|
285
|
+
model_path, export=True
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
output_dir = Path(output_path)
|
|
289
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
290
|
+
|
|
291
|
+
ort_model.save_pretrained(output_dir)
|
|
292
|
+
tokenizer.save_pretrained(output_dir)
|
|
293
|
+
|
|
294
|
+
if quantize:
|
|
295
|
+
from optimum.onnxruntime import ORTQuantizer
|
|
296
|
+
from optimum.onnxruntime.configuration import AutoQuantizationConfig
|
|
297
|
+
|
|
298
|
+
quantizer = ORTQuantizer.from_pretrained(output_dir)
|
|
299
|
+
qconfig = AutoQuantizationConfig.avx512_vnni(is_static=False)
|
|
300
|
+
quantizer.quantize(save_dir=output_dir / "quantized", quantization_config=qconfig)
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
## Training Pipeline
|
|
304
|
+
|
|
305
|
+
```python
|
|
306
|
+
# src/ai_training/trainer.py
|
|
307
|
+
from transformers import (
|
|
308
|
+
AutoTokenizer,
|
|
309
|
+
AutoModelForSequenceClassification,
|
|
310
|
+
TrainingArguments,
|
|
311
|
+
Trainer,
|
|
312
|
+
)
|
|
313
|
+
from datasets import load_dataset
|
|
314
|
+
|
|
315
|
+
class IntentClassifierTrainer:
|
|
316
|
+
def __init__(self, model_name: str = "distilbert-base-uncased", num_labels: int = 7):
|
|
317
|
+
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
|
|
318
|
+
self.model = AutoModelForSequenceClassification.from_pretrained(
|
|
319
|
+
model_name, num_labels=num_labels
|
|
320
|
+
)
|
|
321
|
+
|
|
322
|
+
def prepare_dataset(self, data_path: str):
|
|
323
|
+
dataset = load_dataset("json", data_files={
|
|
324
|
+
"train": f"{data_path}/train.json",
|
|
325
|
+
"validation": f"{data_path}/validation.json",
|
|
326
|
+
})
|
|
327
|
+
|
|
328
|
+
def tokenize(examples):
|
|
329
|
+
return self.tokenizer(
|
|
330
|
+
examples["text"],
|
|
331
|
+
padding="max_length",
|
|
332
|
+
truncation=True,
|
|
333
|
+
max_length=128,
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
return dataset.map(tokenize, batched=True)
|
|
337
|
+
|
|
338
|
+
def train(self, dataset, output_dir: str):
|
|
339
|
+
args = TrainingArguments(
|
|
340
|
+
output_dir=output_dir,
|
|
341
|
+
num_train_epochs=10,
|
|
342
|
+
per_device_train_batch_size=32,
|
|
343
|
+
learning_rate=2e-5,
|
|
344
|
+
evaluation_strategy="epoch",
|
|
345
|
+
save_strategy="epoch",
|
|
346
|
+
load_best_model_at_end=True,
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
trainer = Trainer(
|
|
350
|
+
model=self.model,
|
|
351
|
+
args=args,
|
|
352
|
+
train_dataset=dataset["train"],
|
|
353
|
+
eval_dataset=dataset["validation"],
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
trainer.train()
|
|
357
|
+
trainer.save_model()
|
|
358
|
+
self.tokenizer.save_pretrained(output_dir)
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## Pydantic Models
|
|
362
|
+
|
|
363
|
+
```python
|
|
364
|
+
# src/ai_service/models/chat.py
|
|
365
|
+
from pydantic import BaseModel, Field
|
|
366
|
+
|
|
367
|
+
class ChatRequest(BaseModel):
|
|
368
|
+
message: str = Field(..., min_length=1, max_length=4000)
|
|
369
|
+
conversation_id: str | None = None
|
|
370
|
+
context: dict | None = None
|
|
371
|
+
|
|
372
|
+
class ChatResponse(BaseModel):
|
|
373
|
+
message: str
|
|
374
|
+
conversation_id: str
|
|
375
|
+
intent: str | None = None
|
|
376
|
+
processing_time_ms: int
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Configuration
|
|
380
|
+
|
|
381
|
+
```python
|
|
382
|
+
# src/ai_service/config.py
|
|
383
|
+
from functools import lru_cache
|
|
384
|
+
from pydantic_settings import BaseSettings
|
|
385
|
+
|
|
386
|
+
class Settings(BaseSettings):
|
|
387
|
+
version: str = "0.1.0"
|
|
388
|
+
openai_api_key: str = ""
|
|
389
|
+
openai_model: str = "gpt-4-turbo-preview"
|
|
390
|
+
anthropic_api_key: str = ""
|
|
391
|
+
anthropic_model: str = "claude-3-sonnet-20240229"
|
|
392
|
+
database_url: str = "postgresql://user:pass@localhost/db"
|
|
393
|
+
redis_url: str = "redis://localhost:6379"
|
|
394
|
+
|
|
395
|
+
class Config:
|
|
396
|
+
env_file = ".env"
|
|
397
|
+
|
|
398
|
+
@lru_cache
|
|
399
|
+
def get_settings() -> Settings:
|
|
400
|
+
return Settings()
|
|
401
|
+
|
|
402
|
+
settings = get_settings()
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
## Conventions
|
|
406
|
+
|
|
407
|
+
| Element | Convention | Example |
|
|
408
|
+
|---------|------------|---------|
|
|
409
|
+
| Modules | snake_case | `llm_service.py` |
|
|
410
|
+
| Classes | PascalCase | `LLMService`, `SQLAgent` |
|
|
411
|
+
| Functions | snake_case | `generate()` |
|
|
412
|
+
| Constants | SCREAMING_SNAKE | `SQL_SYSTEM_PROMPT` |
|
|
413
|
+
| Pydantic models | PascalCase | `ChatRequest` |
|
|
414
|
+
| Test files | test_ prefix | `test_chat.py` |
|
|
415
|
+
|
|
416
|
+
## Related Skills
|
|
417
|
+
|
|
418
|
+
- `fastapi`: API serving patterns
|
|
419
|
+
- `langchain`: LLM chains and agents
|
|
420
|
+
- `onnx-inference`: Model deployment
|
|
421
|
+
- `pytorch`: Deep learning training
|
|
422
|
+
- `mlflow`: Experiment tracking
|
|
423
|
+
- `vector-db`: Embeddings storage
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: analytics-concepts
|
|
3
|
+
description: >
|
|
4
|
+
Product analytics concepts: event tracking, funnels, cohorts, user journeys.
|
|
5
|
+
Trigger: analytics, event tracking, funnel, cohort, user journey, metrics
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Grep
|
|
11
|
+
metadata:
|
|
12
|
+
author: apigen-team
|
|
13
|
+
version: "1.0"
|
|
14
|
+
tags: [analytics, tracking, metrics, product]
|
|
15
|
+
scope: ["**/analytics/**"]
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# Analytics Concepts
|
|
19
|
+
|
|
20
|
+
## Core Concepts
|
|
21
|
+
|
|
22
|
+
### Event Tracking
|
|
23
|
+
```
|
|
24
|
+
Events are discrete user actions:
|
|
25
|
+
- page_view, button_click, form_submit
|
|
26
|
+
- purchase, signup, login
|
|
27
|
+
- custom business events
|
|
28
|
+
|
|
29
|
+
Structure:
|
|
30
|
+
{
|
|
31
|
+
"event": "purchase_completed",
|
|
32
|
+
"userId": "user-123",
|
|
33
|
+
"timestamp": "2024-01-15T10:30:00Z",
|
|
34
|
+
"properties": {
|
|
35
|
+
"amount": 99.99,
|
|
36
|
+
"currency": "USD",
|
|
37
|
+
"items": ["product-1", "product-2"]
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### User Identification
|
|
43
|
+
```
|
|
44
|
+
Identify: Link anonymous → authenticated user
|
|
45
|
+
Alias: Merge multiple identities
|
|
46
|
+
|
|
47
|
+
Flow:
|
|
48
|
+
1. Anonymous visitor (device_id: abc123)
|
|
49
|
+
2. User signs up (user_id: user-456)
|
|
50
|
+
3. Identify call links abc123 → user-456
|
|
51
|
+
4. Historical events attributed to user-456
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Funnels
|
|
55
|
+
```
|
|
56
|
+
Conversion funnels track multi-step processes:
|
|
57
|
+
|
|
58
|
+
Signup Funnel:
|
|
59
|
+
Landing Page (1000 visitors)
|
|
60
|
+
↓ 60% conversion
|
|
61
|
+
Signup Form (600 started)
|
|
62
|
+
↓ 75% conversion
|
|
63
|
+
Email Verification (450 sent)
|
|
64
|
+
↓ 80% conversion
|
|
65
|
+
Profile Complete (360 completed)
|
|
66
|
+
|
|
67
|
+
Overall: 36% conversion rate
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Cohorts
|
|
71
|
+
```
|
|
72
|
+
Group users by shared characteristics:
|
|
73
|
+
|
|
74
|
+
Time-based:
|
|
75
|
+
- "January 2024 signups"
|
|
76
|
+
- "Users active in last 7 days"
|
|
77
|
+
|
|
78
|
+
Behavior-based:
|
|
79
|
+
- "Users who completed onboarding"
|
|
80
|
+
- "Power users (>10 sessions/week)"
|
|
81
|
+
|
|
82
|
+
Attribute-based:
|
|
83
|
+
- "Enterprise plan users"
|
|
84
|
+
- "Mobile-only users"
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### User Journeys
|
|
88
|
+
```
|
|
89
|
+
Session-based path analysis:
|
|
90
|
+
|
|
91
|
+
Typical Journey:
|
|
92
|
+
Homepage → Product List → Product Detail → Cart → Checkout → Confirmation
|
|
93
|
+
|
|
94
|
+
Touchpoints to track:
|
|
95
|
+
- Entry point (referrer, campaign)
|
|
96
|
+
- Pages visited (sequence, duration)
|
|
97
|
+
- Actions taken (clicks, scrolls)
|
|
98
|
+
- Exit point (conversion or drop-off)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Analytics Providers
|
|
102
|
+
|
|
103
|
+
### Provider Comparison
|
|
104
|
+
| Provider | Best For | Pricing |
|
|
105
|
+
|----------|----------|---------|
|
|
106
|
+
| Google Analytics | Free tier, SEO | Free / 360 |
|
|
107
|
+
| Mixpanel | Product analytics | Event-based |
|
|
108
|
+
| Amplitude | Behavioral analytics | MTU-based |
|
|
109
|
+
| Segment | CDP + routing | MTU-based |
|
|
110
|
+
|
|
111
|
+
### Provider Abstraction
|
|
112
|
+
```
|
|
113
|
+
// Provider-agnostic interface
|
|
114
|
+
interface AnalyticsProvider {
|
|
115
|
+
trackEvent(event, properties)
|
|
116
|
+
identifyUser(userId, traits)
|
|
117
|
+
aliasUser(previousId, newId)
|
|
118
|
+
setUserProperties(userId, properties)
|
|
119
|
+
flush() // Force send buffered events
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Multi-provider routing
|
|
123
|
+
analytics.track("purchase", {amount: 99})
|
|
124
|
+
→ Sends to GA4, Mixpanel, Amplitude simultaneously
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Metrics Framework
|
|
128
|
+
|
|
129
|
+
### AARRR Pirate Metrics
|
|
130
|
+
```
|
|
131
|
+
Acquisition: How do users find us?
|
|
132
|
+
- Traffic sources, campaign performance
|
|
133
|
+
|
|
134
|
+
Activation: Do users have a good first experience?
|
|
135
|
+
- Signup rate, onboarding completion
|
|
136
|
+
|
|
137
|
+
Retention: Do users come back?
|
|
138
|
+
- DAU/MAU, retention curves
|
|
139
|
+
|
|
140
|
+
Referral: Do users tell others?
|
|
141
|
+
- NPS, viral coefficient
|
|
142
|
+
|
|
143
|
+
Revenue: Do we make money?
|
|
144
|
+
- ARPU, LTV, conversion rate
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### Event Naming Conventions
|
|
148
|
+
```
|
|
149
|
+
Format: object_action (snake_case)
|
|
150
|
+
|
|
151
|
+
Good:
|
|
152
|
+
- user_signed_up
|
|
153
|
+
- product_viewed
|
|
154
|
+
- order_completed
|
|
155
|
+
- subscription_cancelled
|
|
156
|
+
|
|
157
|
+
Bad:
|
|
158
|
+
- SignUp (inconsistent)
|
|
159
|
+
- click (too generic)
|
|
160
|
+
- userDidSomething (unclear)
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## Implementation Patterns
|
|
164
|
+
|
|
165
|
+
### Event Schema
|
|
166
|
+
```
|
|
167
|
+
Standard properties (always include):
|
|
168
|
+
- timestamp: ISO 8601
|
|
169
|
+
- userId or anonymousId
|
|
170
|
+
- sessionId
|
|
171
|
+
- platform (web, ios, android)
|
|
172
|
+
- version (app version)
|
|
173
|
+
|
|
174
|
+
Event-specific properties:
|
|
175
|
+
- Relevant to the action
|
|
176
|
+
- No PII in event names
|
|
177
|
+
- Use IDs, not names for entities
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Privacy Considerations
|
|
181
|
+
```
|
|
182
|
+
GDPR/CCPA compliance:
|
|
183
|
+
1. User consent before tracking
|
|
184
|
+
2. Right to deletion (purge user data)
|
|
185
|
+
3. Data minimization (track only needed)
|
|
186
|
+
4. Anonymization options
|
|
187
|
+
5. Data retention policies
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
## Related Skills
|
|
191
|
+
|
|
192
|
+
- `analytics-spring`: Spring Boot analytics implementation
|
|
193
|
+
- `apigen-architecture`: Overall system architecture
|
|
194
|
+
|
|
195
|
+
|