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,277 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ide-plugins
|
|
3
|
+
description: >
|
|
4
|
+
IDE plugin concepts. Extension points, Language Server Protocol, code completion, refactoring.
|
|
5
|
+
Trigger: IDE plugin, IntelliJ, VSCode extension, Eclipse plugin, LSP
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Grep
|
|
11
|
+
metadata:
|
|
12
|
+
author: apigen-team
|
|
13
|
+
version: "1.0"
|
|
14
|
+
tags: [ide, plugins, extensions, developer-tools]
|
|
15
|
+
scope: ["**/ide-plugins/**"]
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
# IDE Plugin Concepts
|
|
19
|
+
|
|
20
|
+
## Plugin Architectures
|
|
21
|
+
|
|
22
|
+
### IntelliJ Platform
|
|
23
|
+
```
|
|
24
|
+
Components:
|
|
25
|
+
- Actions: Menu items, toolbar buttons
|
|
26
|
+
- Services: Application/Project-level singletons
|
|
27
|
+
- Extensions: Plugin extension points
|
|
28
|
+
- PSI: Program Structure Interface (AST)
|
|
29
|
+
- VFS: Virtual File System
|
|
30
|
+
|
|
31
|
+
Lifecycle:
|
|
32
|
+
1. Plugin loading (lazy)
|
|
33
|
+
2. Component initialization
|
|
34
|
+
3. Extension registration
|
|
35
|
+
4. User interaction
|
|
36
|
+
5. Disposal
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### VSCode Extensions
|
|
40
|
+
```
|
|
41
|
+
Components:
|
|
42
|
+
- Activation Events: When to load
|
|
43
|
+
- Commands: User actions
|
|
44
|
+
- Views: Custom UI panels
|
|
45
|
+
- Language Support: Syntax, completion
|
|
46
|
+
- Webview: Custom HTML panels
|
|
47
|
+
|
|
48
|
+
API Types:
|
|
49
|
+
- VS Code API (editor, window, workspace)
|
|
50
|
+
- Language Server Protocol
|
|
51
|
+
- Debug Adapter Protocol
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Eclipse Plugins
|
|
55
|
+
```
|
|
56
|
+
Components:
|
|
57
|
+
- Extension Points: Plugin hooks
|
|
58
|
+
- Views: UI panels
|
|
59
|
+
- Editors: File editors
|
|
60
|
+
- Nature/Builder: Project configuration
|
|
61
|
+
- Commands: Actions
|
|
62
|
+
|
|
63
|
+
OSGi bundles for modular architecture
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Language Server Protocol (LSP)
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Standard protocol for IDE features:
|
|
70
|
+
|
|
71
|
+
Client (IDE) ←→ Server (Language-specific)
|
|
72
|
+
|
|
73
|
+
Features:
|
|
74
|
+
- Completion
|
|
75
|
+
- Hover
|
|
76
|
+
- Go to Definition
|
|
77
|
+
- Find References
|
|
78
|
+
- Rename
|
|
79
|
+
- Diagnostics
|
|
80
|
+
- Code Actions
|
|
81
|
+
- Formatting
|
|
82
|
+
|
|
83
|
+
Benefits:
|
|
84
|
+
- One server, multiple IDEs
|
|
85
|
+
- Language-agnostic
|
|
86
|
+
- Separate processes
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### LSP Message Types
|
|
90
|
+
```json
|
|
91
|
+
// Request: Client → Server
|
|
92
|
+
{
|
|
93
|
+
"jsonrpc": "2.0",
|
|
94
|
+
"id": 1,
|
|
95
|
+
"method": "textDocument/completion",
|
|
96
|
+
"params": {
|
|
97
|
+
"textDocument": {"uri": "file:///path/to/file.java"},
|
|
98
|
+
"position": {"line": 10, "character": 5}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Response: Server → Client
|
|
103
|
+
{
|
|
104
|
+
"jsonrpc": "2.0",
|
|
105
|
+
"id": 1,
|
|
106
|
+
"result": {
|
|
107
|
+
"items": [
|
|
108
|
+
{"label": "toString", "kind": 2, "detail": "String"},
|
|
109
|
+
{"label": "equals", "kind": 2, "detail": "boolean"}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Notification: Server → Client (no response)
|
|
115
|
+
{
|
|
116
|
+
"jsonrpc": "2.0",
|
|
117
|
+
"method": "textDocument/publishDiagnostics",
|
|
118
|
+
"params": {
|
|
119
|
+
"uri": "file:///path/to/file.java",
|
|
120
|
+
"diagnostics": [
|
|
121
|
+
{"range": {...}, "message": "Unused variable", "severity": 2}
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Common Plugin Features
|
|
128
|
+
|
|
129
|
+
### Code Completion
|
|
130
|
+
```
|
|
131
|
+
Types:
|
|
132
|
+
- Keyword completion
|
|
133
|
+
- Symbol completion (classes, methods)
|
|
134
|
+
- Snippet completion
|
|
135
|
+
- AI-powered completion
|
|
136
|
+
|
|
137
|
+
Trigger:
|
|
138
|
+
- After typing characters
|
|
139
|
+
- On explicit request (Ctrl+Space)
|
|
140
|
+
- After specific characters (., ::)
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### Code Navigation
|
|
144
|
+
```
|
|
145
|
+
Features:
|
|
146
|
+
- Go to Definition
|
|
147
|
+
- Go to Type Definition
|
|
148
|
+
- Go to Implementation
|
|
149
|
+
- Find All References
|
|
150
|
+
- Call Hierarchy
|
|
151
|
+
- Type Hierarchy
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Quick Fixes / Code Actions
|
|
155
|
+
```
|
|
156
|
+
Triggered by:
|
|
157
|
+
- Diagnostics (errors, warnings)
|
|
158
|
+
- Cursor position
|
|
159
|
+
- Selection
|
|
160
|
+
|
|
161
|
+
Examples:
|
|
162
|
+
- Add missing import
|
|
163
|
+
- Implement interface methods
|
|
164
|
+
- Extract method
|
|
165
|
+
- Rename symbol
|
|
166
|
+
- Convert to lambda
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Live Templates / Snippets
|
|
170
|
+
```
|
|
171
|
+
Template:
|
|
172
|
+
trigger: "sout"
|
|
173
|
+
body: "System.out.println($1);"
|
|
174
|
+
|
|
175
|
+
Variables:
|
|
176
|
+
- $1, $2: Tab stops
|
|
177
|
+
- ${1:default}: Default value
|
|
178
|
+
- ${TM_FILENAME}: Built-in variables
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### Inspections / Linting
|
|
182
|
+
```
|
|
183
|
+
Analyze code for:
|
|
184
|
+
- Errors: Syntax, type errors
|
|
185
|
+
- Warnings: Code smells
|
|
186
|
+
- Info: Suggestions
|
|
187
|
+
|
|
188
|
+
Display:
|
|
189
|
+
- Inline highlighting
|
|
190
|
+
- Problems panel
|
|
191
|
+
- Gutter icons
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## APiGen Plugin Features
|
|
195
|
+
|
|
196
|
+
### Entity Generation
|
|
197
|
+
```
|
|
198
|
+
Right-click on SQL file:
|
|
199
|
+
Generate > APiGen Entity
|
|
200
|
+
|
|
201
|
+
Wizard:
|
|
202
|
+
1. Select tables
|
|
203
|
+
2. Configure options (HATEOAS, soft delete)
|
|
204
|
+
3. Generate files
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Code Templates
|
|
208
|
+
```
|
|
209
|
+
Live templates for APiGen:
|
|
210
|
+
- apigen.controller: BaseController template
|
|
211
|
+
- apigen.service: BaseService template
|
|
212
|
+
- apigen.entity: Entity with auditing
|
|
213
|
+
- apigen.dto: DTO with validation
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Configuration Assistant
|
|
217
|
+
```
|
|
218
|
+
Smart completion for:
|
|
219
|
+
- application.yml (app.* properties)
|
|
220
|
+
- Spring Security configuration
|
|
221
|
+
- Database settings
|
|
222
|
+
|
|
223
|
+
Validation:
|
|
224
|
+
- Required properties
|
|
225
|
+
- Type checking
|
|
226
|
+
- Reference resolution
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## Development Best Practices
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
Performance:
|
|
233
|
+
✅ Lazy initialization
|
|
234
|
+
✅ Background processing
|
|
235
|
+
✅ Incremental updates
|
|
236
|
+
✅ Caching results
|
|
237
|
+
❌ Blocking UI thread
|
|
238
|
+
❌ Heavy startup tasks
|
|
239
|
+
|
|
240
|
+
UX:
|
|
241
|
+
✅ Progressive disclosure
|
|
242
|
+
✅ Keyboard shortcuts
|
|
243
|
+
✅ Consistent icons
|
|
244
|
+
✅ Clear error messages
|
|
245
|
+
❌ Modal dialogs (blocking)
|
|
246
|
+
|
|
247
|
+
Compatibility:
|
|
248
|
+
✅ Support multiple IDE versions
|
|
249
|
+
✅ Graceful degradation
|
|
250
|
+
✅ Platform-specific features
|
|
251
|
+
✅ Thorough testing
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Distribution
|
|
255
|
+
|
|
256
|
+
```
|
|
257
|
+
IntelliJ:
|
|
258
|
+
- JetBrains Marketplace
|
|
259
|
+
- Plugin repository URL
|
|
260
|
+
- Manual installation
|
|
261
|
+
|
|
262
|
+
VSCode:
|
|
263
|
+
- VS Code Marketplace
|
|
264
|
+
- VSIX file
|
|
265
|
+
|
|
266
|
+
Eclipse:
|
|
267
|
+
- Eclipse Marketplace
|
|
268
|
+
- Update site URL
|
|
269
|
+
- Dropins folder
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
## Related Skills
|
|
273
|
+
|
|
274
|
+
- `ide-plugins-intellij`: IntelliJ plugin implementation
|
|
275
|
+
- `apigen-architecture`: Overall system architecture
|
|
276
|
+
|
|
277
|
+
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ide-plugins-intellij
|
|
3
|
+
description: >
|
|
4
|
+
IntelliJ Platform plugin development. Actions, services, PSI, code generation.
|
|
5
|
+
Trigger: apigen-ide-plugins, IntelliJ plugin, PSI, AnAction, @Service
|
|
6
|
+
tools:
|
|
7
|
+
- Read
|
|
8
|
+
- Write
|
|
9
|
+
- Edit
|
|
10
|
+
- Bash
|
|
11
|
+
- Grep
|
|
12
|
+
metadata:
|
|
13
|
+
author: apigen-team
|
|
14
|
+
version: "1.0"
|
|
15
|
+
tags: [ide, intellij, plugin, java]
|
|
16
|
+
scope: ["apigen-ide-plugins/**"]
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# IntelliJ Plugin Development (apigen-ide-plugins)
|
|
20
|
+
|
|
21
|
+
## Project Setup
|
|
22
|
+
|
|
23
|
+
### build.gradle.kts
|
|
24
|
+
```kotlin
|
|
25
|
+
plugins {
|
|
26
|
+
id("java")
|
|
27
|
+
id("org.jetbrains.intellij.platform") version "2.2.0"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
intellijPlatform {
|
|
31
|
+
pluginConfiguration {
|
|
32
|
+
name = "APiGen Support"
|
|
33
|
+
version = "1.0.0"
|
|
34
|
+
ideaVersion {
|
|
35
|
+
sinceBuild = "243"
|
|
36
|
+
untilBuild = "243.*"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
repositories {
|
|
42
|
+
mavenCentral()
|
|
43
|
+
intellijPlatform {
|
|
44
|
+
defaultRepositories()
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
dependencies {
|
|
49
|
+
intellijPlatform {
|
|
50
|
+
intellijIdeaCommunity("2024.3")
|
|
51
|
+
bundledPlugin("com.intellij.java")
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### plugin.xml
|
|
57
|
+
```xml
|
|
58
|
+
<idea-plugin>
|
|
59
|
+
<id>com.jnzader.apigen</id>
|
|
60
|
+
<name>APiGen Support</name>
|
|
61
|
+
<vendor>APiGen Team</vendor>
|
|
62
|
+
|
|
63
|
+
<depends>com.intellij.modules.platform</depends>
|
|
64
|
+
<depends>com.intellij.modules.java</depends>
|
|
65
|
+
|
|
66
|
+
<extensions defaultExtensionNs="com.intellij">
|
|
67
|
+
<!-- File templates -->
|
|
68
|
+
<internalFileTemplate name="APiGen Controller"/>
|
|
69
|
+
<internalFileTemplate name="APiGen Service"/>
|
|
70
|
+
<internalFileTemplate name="APiGen Entity"/>
|
|
71
|
+
|
|
72
|
+
<!-- Completion contributor -->
|
|
73
|
+
<completion.contributor
|
|
74
|
+
language="yaml"
|
|
75
|
+
implementationClass="com.jnzader.apigen.ide.completion.YamlCompletionContributor"/>
|
|
76
|
+
|
|
77
|
+
<!-- Annotator for validation -->
|
|
78
|
+
<annotator
|
|
79
|
+
language="JAVA"
|
|
80
|
+
implementationClass="com.jnzader.apigen.ide.annotator.ApigenAnnotator"/>
|
|
81
|
+
|
|
82
|
+
<!-- Project service -->
|
|
83
|
+
<projectService
|
|
84
|
+
serviceImplementation="com.jnzader.apigen.ide.service.ApigenProjectService"/>
|
|
85
|
+
|
|
86
|
+
<!-- Tool window -->
|
|
87
|
+
<toolWindow
|
|
88
|
+
id="APiGen"
|
|
89
|
+
anchor="right"
|
|
90
|
+
factoryClass="com.jnzader.apigen.ide.toolwindow.ApigenToolWindowFactory"/>
|
|
91
|
+
</extensions>
|
|
92
|
+
|
|
93
|
+
<actions>
|
|
94
|
+
<group id="APiGen.GenerateGroup" text="APiGen" popup="true">
|
|
95
|
+
<add-to-group group-id="GenerateGroup" anchor="last"/>
|
|
96
|
+
<action id="APiGen.GenerateEntity"
|
|
97
|
+
class="com.jnzader.apigen.ide.action.GenerateEntityAction"
|
|
98
|
+
text="Entity from Table"
|
|
99
|
+
description="Generate entity from database table"/>
|
|
100
|
+
<action id="APiGen.GenerateCrud"
|
|
101
|
+
class="com.jnzader.apigen.ide.action.GenerateCrudAction"
|
|
102
|
+
text="CRUD Stack"
|
|
103
|
+
description="Generate controller, service, repository"/>
|
|
104
|
+
</group>
|
|
105
|
+
</actions>
|
|
106
|
+
</idea-plugin>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Actions
|
|
110
|
+
|
|
111
|
+
```java
|
|
112
|
+
public class GenerateEntityAction extends AnAction {
|
|
113
|
+
|
|
114
|
+
@Override
|
|
115
|
+
public void actionPerformed(@NotNull AnActionEvent e) {
|
|
116
|
+
Project project = e.getProject();
|
|
117
|
+
if (project == null) return;
|
|
118
|
+
|
|
119
|
+
// Show dialog
|
|
120
|
+
GenerateEntityDialog dialog = new GenerateEntityDialog(project);
|
|
121
|
+
if (!dialog.showAndGet()) return;
|
|
122
|
+
|
|
123
|
+
// Generate files
|
|
124
|
+
WriteCommandAction.runWriteCommandAction(project, () -> {
|
|
125
|
+
EntityGeneratorService generator =
|
|
126
|
+
project.getService(EntityGeneratorService.class);
|
|
127
|
+
|
|
128
|
+
generator.generateEntity(dialog.getTableDefinition(),
|
|
129
|
+
dialog.getOptions());
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@Override
|
|
134
|
+
public void update(@NotNull AnActionEvent e) {
|
|
135
|
+
// Only enable in Java project
|
|
136
|
+
Project project = e.getProject();
|
|
137
|
+
boolean enabled = project != null &&
|
|
138
|
+
ProjectRootManager.getInstance(project).getProjectSdk() != null;
|
|
139
|
+
e.getPresentation().setEnabledAndVisible(enabled);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
@Override
|
|
143
|
+
public @NotNull ActionUpdateThread getActionUpdateThread() {
|
|
144
|
+
return ActionUpdateThread.BGT;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Services
|
|
150
|
+
|
|
151
|
+
```java
|
|
152
|
+
@Service(Service.Level.PROJECT)
|
|
153
|
+
public final class ApigenProjectService {
|
|
154
|
+
|
|
155
|
+
private final Project project;
|
|
156
|
+
private final Map<String, ApigenModule> modules = new HashMap<>();
|
|
157
|
+
|
|
158
|
+
public ApigenProjectService(Project project) {
|
|
159
|
+
this.project = project;
|
|
160
|
+
loadConfiguration();
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private void loadConfiguration() {
|
|
164
|
+
// Find apigen configuration files
|
|
165
|
+
VirtualFile baseDir = project.getBaseDir();
|
|
166
|
+
VirtualFile configFile = baseDir.findFileByRelativePath(
|
|
167
|
+
"src/main/resources/application.yml");
|
|
168
|
+
|
|
169
|
+
if (configFile != null) {
|
|
170
|
+
parseConfiguration(configFile);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
public boolean isApigenProject() {
|
|
175
|
+
// Check for apigen dependencies in build.gradle
|
|
176
|
+
return modules.containsKey("apigen-core");
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
public List<String> getConfiguredEntities() {
|
|
180
|
+
return modules.values().stream()
|
|
181
|
+
.flatMap(m -> m.getEntities().stream())
|
|
182
|
+
.map(EntityConfig::getName)
|
|
183
|
+
.toList();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
## Code Completion
|
|
189
|
+
|
|
190
|
+
```java
|
|
191
|
+
public class YamlCompletionContributor extends CompletionContributor {
|
|
192
|
+
|
|
193
|
+
public YamlCompletionContributor() {
|
|
194
|
+
// Completion for app.* properties
|
|
195
|
+
extend(CompletionType.BASIC,
|
|
196
|
+
PlatformPatterns.psiElement()
|
|
197
|
+
.inside(YAMLKeyValue.class)
|
|
198
|
+
.withLanguage(YAMLLanguage.INSTANCE),
|
|
199
|
+
new ApigenYamlCompletionProvider());
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
private static class ApigenYamlCompletionProvider extends CompletionProvider<CompletionParameters> {
|
|
203
|
+
|
|
204
|
+
@Override
|
|
205
|
+
protected void addCompletions(@NotNull CompletionParameters parameters,
|
|
206
|
+
@NotNull ProcessingContext context,
|
|
207
|
+
@NotNull CompletionResultSet result) {
|
|
208
|
+
|
|
209
|
+
PsiElement position = parameters.getPosition();
|
|
210
|
+
String prefix = getPrefix(position);
|
|
211
|
+
|
|
212
|
+
if (prefix.startsWith("app.")) {
|
|
213
|
+
// Add apigen-core properties
|
|
214
|
+
addCoreProperties(result);
|
|
215
|
+
} else if (prefix.startsWith("apigen.security.")) {
|
|
216
|
+
// Add security properties
|
|
217
|
+
addSecurityProperties(result);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
private void addCoreProperties(CompletionResultSet result) {
|
|
222
|
+
result.addElement(LookupElementBuilder.create("app.cache.enabled")
|
|
223
|
+
.withTypeText("boolean")
|
|
224
|
+
.withTailText(" = true", true));
|
|
225
|
+
|
|
226
|
+
result.addElement(LookupElementBuilder.create("app.pagination.default-size")
|
|
227
|
+
.withTypeText("int")
|
|
228
|
+
.withTailText(" = 20", true));
|
|
229
|
+
|
|
230
|
+
result.addElement(LookupElementBuilder.create("app.rate-limit.enabled")
|
|
231
|
+
.withTypeText("boolean")
|
|
232
|
+
.withTailText(" = false", true));
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## PSI Annotator
|
|
239
|
+
|
|
240
|
+
```java
|
|
241
|
+
public class ApigenAnnotator implements Annotator {
|
|
242
|
+
|
|
243
|
+
@Override
|
|
244
|
+
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
|
|
245
|
+
if (!(element instanceof PsiClass psiClass)) return;
|
|
246
|
+
|
|
247
|
+
// Check if extends BaseService
|
|
248
|
+
PsiClass superClass = psiClass.getSuperClass();
|
|
249
|
+
if (superClass != null && "BaseService".equals(superClass.getName())) {
|
|
250
|
+
checkServiceImplementation(psiClass, holder);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Check Entity annotations
|
|
254
|
+
if (hasAnnotation(psiClass, "jakarta.persistence.Entity")) {
|
|
255
|
+
checkEntityConfiguration(psiClass, holder);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
private void checkServiceImplementation(PsiClass psiClass, AnnotationHolder holder) {
|
|
260
|
+
// Check for required methods
|
|
261
|
+
if (findMethod(psiClass, "getRepository") == null) {
|
|
262
|
+
holder.newAnnotation(HighlightSeverity.WARNING,
|
|
263
|
+
"BaseService subclass should implement getRepository()")
|
|
264
|
+
.range(psiClass.getNameIdentifier())
|
|
265
|
+
.withFix(new ImplementGetRepositoryFix(psiClass))
|
|
266
|
+
.create();
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
private void checkEntityConfiguration(PsiClass psiClass, AnnotationHolder holder) {
|
|
271
|
+
// Check for ID field
|
|
272
|
+
boolean hasId = Arrays.stream(psiClass.getFields())
|
|
273
|
+
.anyMatch(f -> hasAnnotation(f, "jakarta.persistence.Id"));
|
|
274
|
+
|
|
275
|
+
if (!hasId) {
|
|
276
|
+
holder.newAnnotation(HighlightSeverity.ERROR,
|
|
277
|
+
"Entity must have an @Id field")
|
|
278
|
+
.range(psiClass.getNameIdentifier())
|
|
279
|
+
.create();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
## Quick Fixes
|
|
286
|
+
|
|
287
|
+
```java
|
|
288
|
+
public class ImplementGetRepositoryFix implements LocalQuickFix {
|
|
289
|
+
|
|
290
|
+
private final PsiClass psiClass;
|
|
291
|
+
|
|
292
|
+
@Override
|
|
293
|
+
public @NotNull String getFamilyName() {
|
|
294
|
+
return "Implement getRepository() method";
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
@Override
|
|
298
|
+
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
|
|
299
|
+
WriteCommandAction.runWriteCommandAction(project, () -> {
|
|
300
|
+
PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
|
|
301
|
+
|
|
302
|
+
// Find entity type from generic parameter
|
|
303
|
+
String entityType = extractEntityType(psiClass);
|
|
304
|
+
|
|
305
|
+
String methodText = String.format("""
|
|
306
|
+
@Override
|
|
307
|
+
protected JpaRepository<%s, UUID> getRepository() {
|
|
308
|
+
return repository;
|
|
309
|
+
}
|
|
310
|
+
""", entityType);
|
|
311
|
+
|
|
312
|
+
PsiMethod method = factory.createMethodFromText(methodText, psiClass);
|
|
313
|
+
psiClass.add(method);
|
|
314
|
+
|
|
315
|
+
// Format and optimize imports
|
|
316
|
+
CodeStyleManager.getInstance(project).reformat(method);
|
|
317
|
+
JavaCodeStyleManager.getInstance(project).optimizeImports(psiClass.getContainingFile());
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
## Tool Window
|
|
324
|
+
|
|
325
|
+
```java
|
|
326
|
+
public class ApigenToolWindowFactory implements ToolWindowFactory {
|
|
327
|
+
|
|
328
|
+
@Override
|
|
329
|
+
public void createToolWindowContent(@NotNull Project project, @NotNull ToolWindow toolWindow) {
|
|
330
|
+
ApigenToolWindowPanel panel = new ApigenToolWindowPanel(project);
|
|
331
|
+
ContentFactory contentFactory = ContentFactory.getInstance();
|
|
332
|
+
Content content = contentFactory.createContent(panel, "Entities", false);
|
|
333
|
+
toolWindow.getContentManager().addContent(content);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
public class ApigenToolWindowPanel extends SimpleToolWindowPanel {
|
|
338
|
+
|
|
339
|
+
private final Tree entityTree;
|
|
340
|
+
|
|
341
|
+
public ApigenToolWindowPanel(Project project) {
|
|
342
|
+
super(true, true);
|
|
343
|
+
|
|
344
|
+
ApigenProjectService service = project.getService(ApigenProjectService.class);
|
|
345
|
+
|
|
346
|
+
// Build tree model
|
|
347
|
+
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Entities");
|
|
348
|
+
for (String entity : service.getConfiguredEntities()) {
|
|
349
|
+
root.add(new DefaultMutableTreeNode(entity));
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
entityTree = new Tree(new DefaultTreeModel(root));
|
|
353
|
+
setContent(ScrollPaneFactory.createScrollPane(entityTree));
|
|
354
|
+
|
|
355
|
+
// Add toolbar
|
|
356
|
+
ActionToolbar toolbar = ActionManager.getInstance()
|
|
357
|
+
.createActionToolbar("ApigenToolbar", createActionGroup(), true);
|
|
358
|
+
toolbar.setTargetComponent(this);
|
|
359
|
+
setToolbar(toolbar.getComponent());
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
private ActionGroup createActionGroup() {
|
|
363
|
+
DefaultActionGroup group = new DefaultActionGroup();
|
|
364
|
+
group.add(new RefreshAction());
|
|
365
|
+
group.add(new GenerateAction());
|
|
366
|
+
return group;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## File Templates
|
|
372
|
+
|
|
373
|
+
```java
|
|
374
|
+
// fileTemplates/internal/APiGen Controller.java.ft
|
|
375
|
+
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
|
|
376
|
+
|
|
377
|
+
import com.jnzader.apigen.core.web.BaseController;
|
|
378
|
+
import org.springframework.web.bind.annotation.*;
|
|
379
|
+
|
|
380
|
+
@RestController
|
|
381
|
+
@RequestMapping("/api/${ENTITY_PATH}")
|
|
382
|
+
public class ${NAME} extends BaseController<${ENTITY}, ${DTO}, ${ID_TYPE}> {
|
|
383
|
+
|
|
384
|
+
private final ${SERVICE} service;
|
|
385
|
+
|
|
386
|
+
public ${NAME}(${SERVICE} service) {
|
|
387
|
+
this.service = service;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
@Override
|
|
391
|
+
protected BaseService<${ENTITY}, ${DTO}, ${ID_TYPE}> getService() {
|
|
392
|
+
return service;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
```
|
|
396
|
+
|
|
397
|
+
## Testing
|
|
398
|
+
|
|
399
|
+
```java
|
|
400
|
+
public class ApigenAnnotatorTest extends LightJavaCodeInsightFixtureTestCase {
|
|
401
|
+
```
|