aios-core 4.2.15 → 4.4.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/.aios-core/cli/commands/validate/index.js +1 -1
- package/.aios-core/core/code-intel/code-intel-client.js +19 -5
- package/.aios-core/core/code-intel/helpers/creation-helper.js +183 -0
- package/.aios-core/core/code-intel/helpers/devops-helper.js +166 -0
- package/.aios-core/core/code-intel/helpers/planning-helper.js +248 -0
- package/.aios-core/core/code-intel/helpers/qa-helper.js +187 -0
- package/.aios-core/core/code-intel/helpers/story-helper.js +146 -0
- package/.aios-core/core/code-intel/hook-runtime.js +186 -0
- package/.aios-core/core/code-intel/index.js +2 -0
- package/.aios-core/core/code-intel/providers/code-graph-provider.js +8 -0
- package/.aios-core/core/code-intel/providers/provider-interface.js +9 -0
- package/.aios-core/core/code-intel/providers/registry-provider.js +515 -0
- package/.aios-core/core/config/schemas/framework-config.schema.json +155 -7
- package/.aios-core/core/config/schemas/project-config.schema.json +329 -15
- package/.aios-core/core/config/template-overrides.js +84 -0
- package/.aios-core/core/docs/troubleshooting-guide.md +1 -1
- package/.aios-core/core/doctor/checks/agent-memory.js +63 -0
- package/.aios-core/core/doctor/checks/claude-md.js +56 -0
- package/.aios-core/core/doctor/checks/code-intel.js +131 -0
- package/.aios-core/core/doctor/checks/commands-count.js +81 -0
- package/.aios-core/core/doctor/checks/core-config.js +53 -0
- package/.aios-core/core/doctor/checks/entity-registry.js +53 -0
- package/.aios-core/core/doctor/checks/git-hooks.js +50 -0
- package/.aios-core/core/doctor/checks/graph-dashboard.js +48 -0
- package/.aios-core/core/doctor/checks/hooks-claude-count.js +118 -0
- package/.aios-core/core/doctor/checks/ide-sync.js +85 -0
- package/.aios-core/core/doctor/checks/index.js +46 -0
- package/.aios-core/core/doctor/checks/node-version.js +33 -0
- package/.aios-core/core/doctor/checks/npm-packages.js +35 -0
- package/.aios-core/core/doctor/checks/rules-files.js +61 -0
- package/.aios-core/core/doctor/checks/settings-json.js +121 -0
- package/.aios-core/core/doctor/checks/skills-count.js +72 -0
- package/.aios-core/core/doctor/fix-handler.js +165 -0
- package/.aios-core/core/doctor/formatters/json.js +14 -0
- package/.aios-core/core/doctor/formatters/text.js +59 -0
- package/.aios-core/core/doctor/index.js +94 -0
- package/.aios-core/core/graph-dashboard/cli.js +361 -0
- package/.aios-core/core/graph-dashboard/data-sources/code-intel-source.js +234 -0
- package/.aios-core/core/graph-dashboard/data-sources/metrics-source.js +95 -0
- package/.aios-core/core/graph-dashboard/data-sources/registry-source.js +106 -0
- package/.aios-core/core/graph-dashboard/formatters/dot-formatter.js +45 -0
- package/.aios-core/core/graph-dashboard/formatters/html-formatter.js +1437 -0
- package/.aios-core/core/graph-dashboard/formatters/json-formatter.js +13 -0
- package/.aios-core/core/graph-dashboard/formatters/mermaid-formatter.js +59 -0
- package/.aios-core/core/graph-dashboard/index.js +21 -0
- package/.aios-core/core/graph-dashboard/renderers/stats-renderer.js +217 -0
- package/.aios-core/core/graph-dashboard/renderers/status-renderer.js +125 -0
- package/.aios-core/core/graph-dashboard/renderers/tree-renderer.js +119 -0
- package/.aios-core/core/health-check/base-check.js +1 -1
- package/.aios-core/core/health-check/check-registry.js +1 -1
- package/.aios-core/core/health-check/checks/deployment/build-config.js +1 -1
- package/.aios-core/core/health-check/checks/deployment/ci-config.js +1 -1
- package/.aios-core/core/health-check/checks/deployment/deployment-readiness.js +1 -1
- package/.aios-core/core/health-check/checks/deployment/docker-config.js +1 -1
- package/.aios-core/core/health-check/checks/deployment/env-file.js +1 -1
- package/.aios-core/core/health-check/checks/deployment/index.js +1 -1
- package/.aios-core/core/health-check/checks/index.js +1 -1
- package/.aios-core/core/health-check/checks/local/disk-space.js +1 -1
- package/.aios-core/core/health-check/checks/local/environment-vars.js +1 -1
- package/.aios-core/core/health-check/checks/local/git-install.js +1 -1
- package/.aios-core/core/health-check/checks/local/ide-detection.js +1 -1
- package/.aios-core/core/health-check/checks/local/index.js +1 -1
- package/.aios-core/core/health-check/checks/local/memory.js +1 -1
- package/.aios-core/core/health-check/checks/local/network.js +1 -1
- package/.aios-core/core/health-check/checks/local/npm-install.js +1 -1
- package/.aios-core/core/health-check/checks/local/shell-environment.js +1 -1
- package/.aios-core/core/health-check/checks/project/agent-config.js +1 -1
- package/.aios-core/core/health-check/checks/project/aios-directory.js +1 -1
- package/.aios-core/core/health-check/checks/project/dependencies.js +1 -1
- package/.aios-core/core/health-check/checks/project/framework-config.js +1 -1
- package/.aios-core/core/health-check/checks/project/index.js +1 -1
- package/.aios-core/core/health-check/checks/project/node-version.js +1 -1
- package/.aios-core/core/health-check/checks/project/package-json.js +1 -1
- package/.aios-core/core/health-check/checks/project/task-definitions.js +1 -1
- package/.aios-core/core/health-check/checks/project/workflow-dependencies.js +1 -1
- package/.aios-core/core/health-check/checks/repository/branch-protection.js +1 -1
- package/.aios-core/core/health-check/checks/repository/commit-history.js +1 -1
- package/.aios-core/core/health-check/checks/repository/conflicts.js +1 -1
- package/.aios-core/core/health-check/checks/repository/git-repo.js +1 -1
- package/.aios-core/core/health-check/checks/repository/git-status.js +1 -1
- package/.aios-core/core/health-check/checks/repository/gitignore.js +1 -1
- package/.aios-core/core/health-check/checks/repository/index.js +1 -1
- package/.aios-core/core/health-check/checks/repository/large-files.js +1 -1
- package/.aios-core/core/health-check/checks/repository/lockfile-integrity.js +1 -1
- package/.aios-core/core/health-check/checks/services/api-endpoints.js +1 -1
- package/.aios-core/core/health-check/checks/services/claude-code.js +1 -1
- package/.aios-core/core/health-check/checks/services/gemini-cli.js +1 -1
- package/.aios-core/core/health-check/checks/services/github-cli.js +1 -1
- package/.aios-core/core/health-check/checks/services/index.js +1 -1
- package/.aios-core/core/health-check/checks/services/mcp-integration.js +1 -1
- package/.aios-core/core/health-check/engine.js +1 -1
- package/.aios-core/core/health-check/healers/backup-manager.js +1 -1
- package/.aios-core/core/health-check/healers/index.js +1 -1
- package/.aios-core/core/health-check/index.js +9 -2
- package/.aios-core/core/health-check/reporters/console.js +1 -1
- package/.aios-core/core/health-check/reporters/index.js +1 -1
- package/.aios-core/core/health-check/reporters/json.js +1 -1
- package/.aios-core/core/health-check/reporters/markdown.js +1 -1
- package/.aios-core/core/ids/layer-classifier.js +65 -0
- package/.aios-core/core/ids/registry-updater.js +49 -0
- package/.aios-core/core/index.esm.js +1 -1
- package/.aios-core/core/index.js +1 -1
- package/.aios-core/core/session/context-detector.js +2 -7
- package/.aios-core/core/synapse/context/context-tracker.js +9 -1
- package/.aios-core/core/synapse/engine.js +33 -13
- package/.aios-core/core/synapse/memory/memory-bridge.js +17 -43
- package/.aios-core/core/synapse/memory/synapse-memory-provider.js +201 -0
- package/.aios-core/core/synapse/runtime/hook-runtime.js +40 -2
- package/.aios-core/core/synapse/session/session-manager.js +3 -2
- package/.aios-core/core/synapse/utils/atomic-write.js +79 -0
- package/.aios-core/core-config.yaml +34 -1
- package/.aios-core/data/aios-kb.md +2 -2
- package/.aios-core/data/capability-detection.js +290 -0
- package/.aios-core/data/entity-registry.yaml +10450 -2129
- package/.aios-core/data/mcp-discipline.js +166 -0
- package/.aios-core/data/mcp-tool-examples.yaml +215 -0
- package/.aios-core/data/tok2-validation.js +168 -0
- package/.aios-core/data/tok3-token-comparison.js +123 -0
- package/.aios-core/data/tool-registry.yaml +648 -0
- package/.aios-core/data/tool-search-validation.js +174 -0
- package/.aios-core/data/workflow-chains.yaml +156 -0
- package/.aios-core/development/agents/aios-master.md +17 -10
- package/.aios-core/development/agents/analyst/MEMORY.md +33 -0
- package/.aios-core/development/agents/analyst.md +17 -10
- package/.aios-core/development/agents/architect/MEMORY.md +39 -0
- package/.aios-core/development/agents/architect.md +17 -10
- package/.aios-core/development/agents/data-engineer/MEMORY.md +32 -0
- package/.aios-core/development/agents/data-engineer.md +17 -10
- package/.aios-core/development/agents/dev/MEMORY.md +46 -0
- package/.aios-core/development/agents/dev.md +18 -11
- package/.aios-core/development/agents/devops/MEMORY.md +39 -0
- package/.aios-core/development/agents/devops.md +44 -10
- package/.aios-core/development/agents/pm/MEMORY.md +38 -0
- package/.aios-core/development/agents/pm.md +17 -10
- package/.aios-core/development/agents/po/MEMORY.md +45 -0
- package/.aios-core/development/agents/po.md +17 -10
- package/.aios-core/development/agents/qa/MEMORY.md +42 -0
- package/.aios-core/development/agents/qa.md +18 -11
- package/.aios-core/development/agents/sm/MEMORY.md +31 -0
- package/.aios-core/development/agents/sm.md +17 -10
- package/.aios-core/development/agents/squad-creator.md +18 -9
- package/.aios-core/development/agents/ux/MEMORY.md +31 -0
- package/.aios-core/development/agents/ux-design-expert.md +16 -9
- package/.aios-core/development/checklists/issue-triage-checklist.md +35 -0
- package/.aios-core/development/checklists/memory-audit-checklist.md +53 -0
- package/.aios-core/development/scripts/issue-triage.js +171 -0
- package/.aios-core/development/scripts/populate-entity-registry.js +412 -19
- package/.aios-core/development/scripts/unified-activation-pipeline.js +31 -10
- package/.aios-core/development/tasks/analyze-project-structure.md +48 -0
- package/.aios-core/development/tasks/apply-qa-fixes.md +7 -0
- package/.aios-core/development/tasks/architect-analyze-impact.md +8 -1
- package/.aios-core/development/tasks/brownfield-create-epic.md +41 -0
- package/.aios-core/development/tasks/brownfield-create-story.md +7 -0
- package/.aios-core/development/tasks/build-autonomous.md +7 -0
- package/.aios-core/development/tasks/create-deep-research-prompt.md +7 -0
- package/.aios-core/development/tasks/create-doc.md +44 -0
- package/.aios-core/development/tasks/create-next-story.md +17 -0
- package/.aios-core/development/tasks/create-suite.md +7 -0
- package/.aios-core/development/tasks/dev-develop-story.md +9 -1
- package/.aios-core/development/tasks/execute-checklist.md +7 -0
- package/.aios-core/development/tasks/github-devops-github-pr-automation.md +56 -0
- package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +70 -0
- package/.aios-core/development/tasks/github-issue-triage.md +118 -0
- package/.aios-core/development/tasks/health-check.yaml +206 -171
- package/.aios-core/development/tasks/kb-mode-interaction.md +3 -3
- package/.aios-core/development/tasks/plan-create-context.md +47 -1
- package/.aios-core/development/tasks/plan-create-implementation.md +55 -0
- package/.aios-core/development/tasks/po-close-story.md +7 -0
- package/.aios-core/development/tasks/pr-automation.md +5 -5
- package/.aios-core/development/tasks/qa-create-fix-request.md +7 -0
- package/.aios-core/development/tasks/qa-fix-issues.md +7 -0
- package/.aios-core/development/tasks/qa-gate.md +56 -0
- package/.aios-core/development/tasks/qa-review-story.md +32 -1
- package/.aios-core/development/tasks/release-management.md +7 -0
- package/.aios-core/development/tasks/resolve-github-issue.md +608 -0
- package/.aios-core/development/tasks/review-contributor-pr.md +152 -0
- package/.aios-core/development/tasks/setup-llm-routing.md +1 -1
- package/.aios-core/development/tasks/spec-critique.md +8 -0
- package/.aios-core/development/tasks/spec-gather-requirements.md +7 -0
- package/.aios-core/development/tasks/spec-research-dependencies.md +4 -0
- package/.aios-core/development/tasks/spec-write-spec.md +5 -0
- package/.aios-core/development/tasks/triage-github-issues.md +356 -0
- package/.aios-core/development/tasks/validate-agents.md +4 -0
- package/.aios-core/development/tasks/validate-next-story.md +17 -0
- package/.aios-core/development/templates/agent-handoff-tmpl.yaml +48 -0
- package/.aios-core/development/templates/code-intel-integration-pattern.md +199 -0
- package/.aios-core/development/templates/ptc-entity-validation.md +113 -0
- package/.aios-core/development/templates/ptc-qa-gate.md +100 -0
- package/.aios-core/development/templates/ptc-research-aggregation.md +94 -0
- package/.aios-core/development/templates/service-template/README.md.hbs +158 -158
- package/.aios-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
- package/.aios-core/development/templates/service-template/client.ts.hbs +403 -403
- package/.aios-core/development/templates/service-template/errors.ts.hbs +182 -182
- package/.aios-core/development/templates/service-template/index.ts.hbs +120 -120
- package/.aios-core/development/templates/service-template/package.json.hbs +87 -87
- package/.aios-core/development/templates/service-template/types.ts.hbs +145 -145
- package/.aios-core/development/templates/squad/agent-template.md +11 -0
- package/.aios-core/development/templates/squad/task-template.md +21 -0
- package/.aios-core/development/templates/squad-template/LICENSE +21 -21
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +1 -1
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1 -1
- package/.aios-core/framework-config.yaml +8 -0
- package/.aios-core/index.esm.js +1 -1
- package/.aios-core/index.js +1 -1
- package/.aios-core/infrastructure/integrations/ai-providers/index.js +1 -1
- package/.aios-core/infrastructure/schemas/task-v3-schema.json +6 -0
- package/.aios-core/infrastructure/scripts/collect-tool-usage.js +311 -0
- package/.aios-core/infrastructure/scripts/generate-optimization-report.js +497 -0
- package/.aios-core/infrastructure/scripts/generate-settings-json.js +300 -0
- package/.aios-core/infrastructure/scripts/git-config-detector.js +65 -9
- package/.aios-core/infrastructure/scripts/ide-sync/index.js +3 -1
- package/.aios-core/infrastructure/scripts/ide-sync/transformers/github-copilot.js +184 -0
- package/.aios-core/infrastructure/scripts/repository-detector.js +3 -3
- package/.aios-core/infrastructure/templates/aios-sync.yaml.template +182 -182
- package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -279
- package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
- package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
- package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
- package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -63
- package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
- package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
- package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
- package/.aios-core/install-manifest.yaml +613 -305
- package/.aios-core/lib/build.json +1 -0
- package/.aios-core/local-config.yaml.template +71 -71
- package/.aios-core/monitor/hooks/lib/__init__.py +1 -1
- package/.aios-core/monitor/hooks/lib/enrich.py +58 -58
- package/.aios-core/monitor/hooks/lib/send_event.py +47 -47
- package/.aios-core/monitor/hooks/notification.py +29 -29
- package/.aios-core/monitor/hooks/post_tool_use.py +45 -45
- package/.aios-core/monitor/hooks/pre_compact.py +29 -29
- package/.aios-core/monitor/hooks/pre_tool_use.py +40 -40
- package/.aios-core/monitor/hooks/stop.py +29 -29
- package/.aios-core/monitor/hooks/subagent_stop.py +29 -29
- package/.aios-core/monitor/hooks/user_prompt_submit.py +38 -38
- package/.aios-core/product/templates/adr.hbs +125 -125
- package/.aios-core/product/templates/dbdr.hbs +241 -241
- package/.aios-core/product/templates/epic.hbs +212 -212
- package/.aios-core/product/templates/ide-rules/claude-rules.md +125 -0
- package/.aios-core/product/templates/pmdr.hbs +186 -186
- package/.aios-core/product/templates/prd-v2.0.hbs +216 -216
- package/.aios-core/product/templates/prd.hbs +201 -201
- package/.aios-core/product/templates/story.hbs +263 -263
- package/.aios-core/product/templates/task.hbs +170 -170
- package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -158
- package/.aios-core/product/templates/tmpl-migration-script.sql +91 -91
- package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
- package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
- package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -135
- package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -77
- package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -152
- package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -77
- package/.aios-core/product/templates/tmpl-seed-data.sql +140 -140
- package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -16
- package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
- package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -140
- package/.aios-core/product/templates/tmpl-trigger.sql +152 -152
- package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -133
- package/.aios-core/product/templates/tmpl-view.sql +177 -177
- package/.aios-core/scripts/pm.sh +0 -0
- package/.aios-core/user-guide.md +15 -15
- package/.aios-core/utils/filters/constants.js +10 -0
- package/.aios-core/utils/filters/content-filter.js +223 -0
- package/.aios-core/utils/filters/field-filter.js +126 -0
- package/.aios-core/utils/filters/index.js +180 -0
- package/.aios-core/utils/filters/schema-filter.js +157 -0
- package/.claude/CLAUDE.md +62 -0
- package/.claude/hooks/enforce-architecture-first.py +196 -196
- package/.claude/hooks/enforce-git-push-authority.sh +33 -0
- package/.claude/hooks/mind-clone-governance.py +192 -192
- package/.claude/hooks/read-protection.py +151 -151
- package/.claude/hooks/slug-validation.py +176 -176
- package/.claude/hooks/sql-governance.py +182 -182
- package/.claude/hooks/synapse-engine.cjs +28 -5
- package/.claude/hooks/write-path-validation.py +194 -194
- package/.claude/rules/agent-authority.md +105 -0
- package/.claude/rules/agent-handoff.md +97 -0
- package/.claude/rules/agent-memory-imports.md +15 -0
- package/.claude/rules/coderabbit-integration.md +101 -0
- package/.claude/rules/ids-principles.md +119 -0
- package/.claude/rules/story-lifecycle.md +145 -0
- package/.claude/rules/tool-examples.md +64 -0
- package/.claude/rules/tool-response-filtering.md +57 -0
- package/.claude/rules/workflow-execution.md +150 -0
- package/LICENSE +33 -33
- package/bin/aios-graph.js +9 -0
- package/bin/aios-init.js +2 -2
- package/bin/aios-minimal.js +0 -0
- package/bin/aios.js +17 -221
- package/bin/utils/detect-fsmonitor.js +70 -0
- package/bin/utils/framework-guard.js +238 -0
- package/bin/utils/validate-publish.js +108 -0
- package/package.json +6 -3
- package/packages/aios-install/bin/aios-install.js +0 -0
- package/packages/aios-install/bin/edmcp.js +0 -0
- package/packages/aios-pro-cli/bin/aios-pro.js +2 -0
- package/packages/installer/src/config/templates/core-config-template.js +25 -0
- package/packages/installer/src/installer/brownfield-upgrader.js +68 -5
- package/packages/installer/src/merger/index.js +3 -0
- package/packages/installer/src/merger/strategies/index.js +6 -0
- package/packages/installer/src/merger/strategies/yaml-merger.js +181 -0
- package/packages/installer/src/updater/index.js +4 -4
- package/packages/installer/src/wizard/i18n.js +321 -3
- package/packages/installer/src/wizard/ide-config-generator.js +173 -25
- package/packages/installer/src/wizard/index.js +119 -1
- package/packages/installer/src/wizard/pro-setup.js +137 -121
- package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +271 -0
- package/packages/installer/tests/unit/claude-md-template-v5/claude-md-template-v5.test.js +192 -0
- package/packages/installer/tests/unit/doctor/doctor-checks.test.js +610 -0
- package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +134 -0
- package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +186 -0
- package/packages/installer/tests/unit/generate-settings-json/generate-settings-json.test.js +309 -0
- package/packages/installer/tests/unit/ide-sync-integration/ide-sync-integration.test.js +230 -0
- package/packages/installer/tests/unit/merger/strategies.test.js +2 -2
- package/packages/installer/tests/unit/merger/yaml-merger.test.js +327 -0
- package/scripts/check-markdown-links.py +352 -352
- package/scripts/dashboard-parallel-dev.sh +0 -0
- package/scripts/dashboard-parallel-phase3.sh +0 -0
- package/scripts/dashboard-parallel-phase4.sh +0 -0
- package/scripts/install-monitor-hooks.sh +0 -0
- package/scripts/package-synapse.js +2 -1
- package/pro/README.md +0 -66
- package/pro/license/degradation.js +0 -220
- package/pro/license/errors.js +0 -450
- package/pro/license/feature-gate.js +0 -354
- package/pro/license/index.js +0 -181
- package/pro/license/license-api.js +0 -651
- package/pro/license/license-cache.js +0 -523
- package/pro/license/license-crypto.js +0 -303
|
@@ -0,0 +1,515 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
const { CodeIntelProvider } = require('./provider-interface');
|
|
6
|
+
|
|
7
|
+
// Layer priority for disambiguation (lower index = higher priority)
|
|
8
|
+
const LAYER_PRIORITY = { L1: 0, L2: 1, L3: 2, L4: 3 };
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* RegistryProvider — Native code intelligence provider using Entity Registry.
|
|
12
|
+
*
|
|
13
|
+
* Implements 5 of 8 primitives without requiring any MCP server.
|
|
14
|
+
* Data source: .aios-core/data/entity-registry.yaml (737+ entities, 14 categories).
|
|
15
|
+
*
|
|
16
|
+
* AST-only primitives (findCallers, findCallees, analyzeComplexity) return null.
|
|
17
|
+
*/
|
|
18
|
+
class RegistryProvider extends CodeIntelProvider {
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
super('registry', options);
|
|
21
|
+
|
|
22
|
+
this._registryPath = options.registryPath || null;
|
|
23
|
+
this._registry = null;
|
|
24
|
+
this._registryMtime = null;
|
|
25
|
+
|
|
26
|
+
// In-memory indexes (built on first load)
|
|
27
|
+
this._byName = null; // Map<string, Array<Entity>>
|
|
28
|
+
this._byPath = null; // Map<string, Entity>
|
|
29
|
+
this._byCategory = null; // Map<string, Array<Entity>>
|
|
30
|
+
this._byKeyword = null; // Map<string, Array<Entity>> (inverted index)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Check if this provider is available (registry loaded and non-empty).
|
|
35
|
+
* @returns {boolean}
|
|
36
|
+
*/
|
|
37
|
+
isAvailable() {
|
|
38
|
+
this._ensureLoaded();
|
|
39
|
+
return this._registry !== null && this._byName !== null && this._byName.size > 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// --- Lazy Loading ---
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Resolve the registry file path from options or default location.
|
|
46
|
+
* @returns {string|null}
|
|
47
|
+
* @private
|
|
48
|
+
*/
|
|
49
|
+
_resolveRegistryPath() {
|
|
50
|
+
if (this._registryPath) return this._registryPath;
|
|
51
|
+
|
|
52
|
+
// Default: resolve from project root
|
|
53
|
+
const projectRoot = this.options.projectRoot || process.cwd();
|
|
54
|
+
const defaultPath = path.join(projectRoot, '.aios-core', 'data', 'entity-registry.yaml');
|
|
55
|
+
|
|
56
|
+
if (fs.existsSync(defaultPath)) {
|
|
57
|
+
this._registryPath = defaultPath;
|
|
58
|
+
return defaultPath;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Ensure registry is loaded (lazy-load on first call).
|
|
66
|
+
* Reloads if file mtime has changed.
|
|
67
|
+
* @private
|
|
68
|
+
*/
|
|
69
|
+
_ensureLoaded() {
|
|
70
|
+
const filePath = this._resolveRegistryPath();
|
|
71
|
+
if (!filePath) return;
|
|
72
|
+
|
|
73
|
+
try {
|
|
74
|
+
const stat = fs.statSync(filePath);
|
|
75
|
+
const currentMtime = stat.mtimeMs;
|
|
76
|
+
|
|
77
|
+
// Already loaded and file hasn't changed
|
|
78
|
+
if (this._registry && this._registryMtime === currentMtime) return;
|
|
79
|
+
|
|
80
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
81
|
+
|
|
82
|
+
// Use js-yaml with JSON_SCHEMA for safe parsing (no arbitrary types)
|
|
83
|
+
let yaml;
|
|
84
|
+
try {
|
|
85
|
+
yaml = require('js-yaml');
|
|
86
|
+
} catch (_e) {
|
|
87
|
+
// Fallback to yaml package
|
|
88
|
+
yaml = require('yaml');
|
|
89
|
+
const parsed = yaml.parse(content);
|
|
90
|
+
this._buildIndexes(parsed);
|
|
91
|
+
this._registryMtime = currentMtime;
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const parsed = yaml.load(content, { schema: yaml.JSON_SCHEMA });
|
|
96
|
+
this._buildIndexes(parsed);
|
|
97
|
+
this._registryMtime = currentMtime;
|
|
98
|
+
} catch (_error) {
|
|
99
|
+
// Graceful degradation: if parse fails, provider returns null for all calls
|
|
100
|
+
this._registry = null;
|
|
101
|
+
this._byName = null;
|
|
102
|
+
this._byPath = null;
|
|
103
|
+
this._byCategory = null;
|
|
104
|
+
this._byKeyword = null;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Build in-memory indexes from parsed registry.
|
|
110
|
+
* @param {Object} parsed - Parsed YAML object
|
|
111
|
+
* @private
|
|
112
|
+
*/
|
|
113
|
+
_buildIndexes(parsed) {
|
|
114
|
+
if (!parsed || !parsed.entities) {
|
|
115
|
+
this._registry = null;
|
|
116
|
+
this._byName = null;
|
|
117
|
+
this._byPath = null;
|
|
118
|
+
this._byCategory = null;
|
|
119
|
+
this._byKeyword = null;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
this._registry = parsed;
|
|
124
|
+
this._byName = new Map();
|
|
125
|
+
this._byPath = new Map();
|
|
126
|
+
this._byCategory = new Map();
|
|
127
|
+
this._byKeyword = new Map();
|
|
128
|
+
|
|
129
|
+
const entities = parsed.entities;
|
|
130
|
+
|
|
131
|
+
for (const [category, categoryEntities] of Object.entries(entities)) {
|
|
132
|
+
if (!categoryEntities || typeof categoryEntities !== 'object') continue;
|
|
133
|
+
|
|
134
|
+
// byCategory
|
|
135
|
+
if (!this._byCategory.has(category)) {
|
|
136
|
+
this._byCategory.set(category, []);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
for (const [entityName, entityData] of Object.entries(categoryEntities)) {
|
|
140
|
+
if (!entityData || typeof entityData !== 'object') continue;
|
|
141
|
+
|
|
142
|
+
// Validate path: reject entries with '..' segments (defense-in-depth)
|
|
143
|
+
if (entityData.path && entityData.path.includes('..')) continue;
|
|
144
|
+
|
|
145
|
+
const entity = {
|
|
146
|
+
name: entityName,
|
|
147
|
+
category,
|
|
148
|
+
...entityData,
|
|
149
|
+
};
|
|
150
|
+
|
|
151
|
+
// byName — Map<string, Array<Entity>> to handle duplicates
|
|
152
|
+
if (!this._byName.has(entityName)) {
|
|
153
|
+
this._byName.set(entityName, []);
|
|
154
|
+
}
|
|
155
|
+
this._byName.get(entityName).push(entity);
|
|
156
|
+
|
|
157
|
+
// byPath
|
|
158
|
+
if (entityData.path) {
|
|
159
|
+
this._byPath.set(entityData.path, entity);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// byCategory
|
|
163
|
+
this._byCategory.get(category).push(entity);
|
|
164
|
+
|
|
165
|
+
// byKeyword (inverted index)
|
|
166
|
+
if (Array.isArray(entityData.keywords)) {
|
|
167
|
+
for (const keyword of entityData.keywords) {
|
|
168
|
+
const kw = String(keyword).toLowerCase();
|
|
169
|
+
if (!this._byKeyword.has(kw)) {
|
|
170
|
+
this._byKeyword.set(kw, []);
|
|
171
|
+
}
|
|
172
|
+
this._byKeyword.get(kw).push(entity);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// --- Disambiguation ---
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Score and rank candidates for a symbol lookup.
|
|
183
|
+
* Scoring: exact name+type > exact name > layer priority > alphabetical path.
|
|
184
|
+
* @param {Array<Object>} candidates - Array of entity objects
|
|
185
|
+
* @param {string} symbol - The search symbol
|
|
186
|
+
* @param {Object} [options] - Optional type/layer hints
|
|
187
|
+
* @returns {Array<Object>} Sorted candidates (best match first)
|
|
188
|
+
* @private
|
|
189
|
+
*/
|
|
190
|
+
_rankCandidates(candidates, symbol, options = {}) {
|
|
191
|
+
if (!candidates || candidates.length === 0) return [];
|
|
192
|
+
|
|
193
|
+
const symbolLower = symbol.toLowerCase();
|
|
194
|
+
|
|
195
|
+
return candidates
|
|
196
|
+
.map((entity) => {
|
|
197
|
+
let score = 0;
|
|
198
|
+
|
|
199
|
+
// Exact name match
|
|
200
|
+
if (entity.name === symbol) score += 100;
|
|
201
|
+
else if (entity.name.toLowerCase() === symbolLower) score += 90;
|
|
202
|
+
|
|
203
|
+
// Type hint match
|
|
204
|
+
if (options.type && entity.type === options.type) score += 50;
|
|
205
|
+
|
|
206
|
+
// Layer priority (L1=40, L2=30, L3=20, L4=10)
|
|
207
|
+
const layerPriority = LAYER_PRIORITY[entity.layer];
|
|
208
|
+
if (layerPriority !== undefined) {
|
|
209
|
+
score += (4 - layerPriority) * 10;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
return { entity, score };
|
|
213
|
+
})
|
|
214
|
+
.sort((a, b) => {
|
|
215
|
+
if (b.score !== a.score) return b.score - a.score;
|
|
216
|
+
// Tie-break: alphabetical path
|
|
217
|
+
const pathA = a.entity.path || '';
|
|
218
|
+
const pathB = b.entity.path || '';
|
|
219
|
+
return pathA.localeCompare(pathB);
|
|
220
|
+
})
|
|
221
|
+
.map((item) => item.entity);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// --- Fuzzy Matching ---
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Find entities matching a symbol using fuzzy matching.
|
|
228
|
+
* Order: exact name > path contains > keywords contains.
|
|
229
|
+
* @param {string} symbol - Symbol to search
|
|
230
|
+
* @param {Object} [options] - Search options
|
|
231
|
+
* @returns {Array<Object>} Matched entities sorted by relevance
|
|
232
|
+
* @private
|
|
233
|
+
*/
|
|
234
|
+
_fuzzyMatch(symbol, _options = {}) {
|
|
235
|
+
this._ensureLoaded();
|
|
236
|
+
if (!this._byName) return [];
|
|
237
|
+
|
|
238
|
+
const symbolLower = symbol.toLowerCase();
|
|
239
|
+
const results = [];
|
|
240
|
+
const seen = new Set();
|
|
241
|
+
|
|
242
|
+
// 1. Exact name match (may return multiple for duplicate names)
|
|
243
|
+
const exactMatches = this._byName.get(symbol) || this._byName.get(symbolLower) || [];
|
|
244
|
+
for (const entity of exactMatches) {
|
|
245
|
+
const key = `${entity.name}:${entity.category}:${entity.path}`;
|
|
246
|
+
if (!seen.has(key)) {
|
|
247
|
+
results.push({ entity, matchType: 'exact', score: 100 });
|
|
248
|
+
seen.add(key);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Also check case-insensitive
|
|
253
|
+
if (exactMatches.length === 0) {
|
|
254
|
+
for (const [name, entities] of this._byName) {
|
|
255
|
+
if (name.toLowerCase() === symbolLower) {
|
|
256
|
+
for (const entity of entities) {
|
|
257
|
+
const key = `${entity.name}:${entity.category}:${entity.path}`;
|
|
258
|
+
if (!seen.has(key)) {
|
|
259
|
+
results.push({ entity, matchType: 'exact-ci', score: 90 });
|
|
260
|
+
seen.add(key);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
// 2. Path contains
|
|
268
|
+
for (const [filePath, entity] of this._byPath) {
|
|
269
|
+
const key = `${entity.name}:${entity.category}:${entity.path}`;
|
|
270
|
+
if (seen.has(key)) continue;
|
|
271
|
+
if (filePath.toLowerCase().includes(symbolLower)) {
|
|
272
|
+
results.push({ entity, matchType: 'path', score: 60 });
|
|
273
|
+
seen.add(key);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// 3. Keywords contains
|
|
278
|
+
const keywordMatches = this._byKeyword.get(symbolLower) || [];
|
|
279
|
+
for (const entity of keywordMatches) {
|
|
280
|
+
const key = `${entity.name}:${entity.category}:${entity.path}`;
|
|
281
|
+
if (seen.has(key)) continue;
|
|
282
|
+
results.push({ entity, matchType: 'keyword', score: 40 });
|
|
283
|
+
seen.add(key);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Sort by score, then by layer priority, then alphabetical path
|
|
287
|
+
return results
|
|
288
|
+
.sort((a, b) => {
|
|
289
|
+
if (b.score !== a.score) return b.score - a.score;
|
|
290
|
+
const layerA = LAYER_PRIORITY[a.entity.layer] ?? 99;
|
|
291
|
+
const layerB = LAYER_PRIORITY[b.entity.layer] ?? 99;
|
|
292
|
+
if (layerA !== layerB) return layerA - layerB;
|
|
293
|
+
return (a.entity.path || '').localeCompare(b.entity.path || '');
|
|
294
|
+
})
|
|
295
|
+
.map((r) => r.entity);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// --- 5 Implemented Primitives ---
|
|
299
|
+
|
|
300
|
+
async findDefinition(symbol, options = {}) {
|
|
301
|
+
this._ensureLoaded();
|
|
302
|
+
if (!this._byName) return null;
|
|
303
|
+
|
|
304
|
+
const matches = this._fuzzyMatch(symbol, options);
|
|
305
|
+
if (matches.length === 0) return null;
|
|
306
|
+
|
|
307
|
+
const best = this._rankCandidates(matches, symbol, options)[0] || matches[0];
|
|
308
|
+
|
|
309
|
+
return {
|
|
310
|
+
file: best.path || null,
|
|
311
|
+
line: 1,
|
|
312
|
+
column: 0,
|
|
313
|
+
context: best.purpose || `${best.type} in ${best.category}`,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
async findReferences(symbol, _options = {}) {
|
|
318
|
+
this._ensureLoaded();
|
|
319
|
+
if (!this._byName) return null;
|
|
320
|
+
|
|
321
|
+
const references = [];
|
|
322
|
+
const symbolLower = symbol.toLowerCase();
|
|
323
|
+
|
|
324
|
+
// Search usedBy and dependencies fields across all entities
|
|
325
|
+
for (const [_category, categoryEntities] of Object.entries(this._registry.entities)) {
|
|
326
|
+
if (!categoryEntities || typeof categoryEntities !== 'object') continue;
|
|
327
|
+
|
|
328
|
+
for (const [_entityName, entityData] of Object.entries(categoryEntities)) {
|
|
329
|
+
if (!entityData || typeof entityData !== 'object') continue;
|
|
330
|
+
|
|
331
|
+
const usedBy = Array.isArray(entityData.usedBy) ? entityData.usedBy : [];
|
|
332
|
+
const deps = Array.isArray(entityData.dependencies) ? entityData.dependencies : [];
|
|
333
|
+
|
|
334
|
+
// Check if this entity references the symbol
|
|
335
|
+
const referencesSymbol =
|
|
336
|
+
usedBy.some((u) => String(u).toLowerCase() === symbolLower) ||
|
|
337
|
+
deps.some((d) => String(d).toLowerCase() === symbolLower);
|
|
338
|
+
|
|
339
|
+
if (referencesSymbol) {
|
|
340
|
+
references.push({
|
|
341
|
+
file: entityData.path || null,
|
|
342
|
+
line: 1,
|
|
343
|
+
context: entityData.purpose || `References ${symbol}`,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Also find entities that the symbol's usedBy/deps point to
|
|
350
|
+
const symbolEntities = this._byName.get(symbol) || [];
|
|
351
|
+
for (const entity of symbolEntities) {
|
|
352
|
+
if (Array.isArray(entity.usedBy)) {
|
|
353
|
+
for (const refName of entity.usedBy) {
|
|
354
|
+
const refEntities = this._byName.get(refName) || [];
|
|
355
|
+
for (const ref of refEntities) {
|
|
356
|
+
references.push({
|
|
357
|
+
file: ref.path || null,
|
|
358
|
+
line: 1,
|
|
359
|
+
context: `${ref.name} uses ${symbol}`,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
return references.length > 0 ? references : null;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
async analyzeDependencies(targetPath, options = {}) {
|
|
370
|
+
this._ensureLoaded();
|
|
371
|
+
if (!this._byName || !this._registry) return null;
|
|
372
|
+
|
|
373
|
+
const nodes = [];
|
|
374
|
+
const edges = [];
|
|
375
|
+
let unresolvedCount = 0;
|
|
376
|
+
const visited = new Set();
|
|
377
|
+
|
|
378
|
+
// Find entity by path or name
|
|
379
|
+
let rootEntities = [];
|
|
380
|
+
if (this._byPath.has(targetPath)) {
|
|
381
|
+
rootEntities = [this._byPath.get(targetPath)];
|
|
382
|
+
} else {
|
|
383
|
+
rootEntities = this._byName.get(targetPath) || [];
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
if (rootEntities.length === 0) {
|
|
387
|
+
// Try fuzzy match
|
|
388
|
+
const fuzzy = this._fuzzyMatch(targetPath, options);
|
|
389
|
+
if (fuzzy.length > 0) rootEntities = [fuzzy[0]];
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const queue = [...rootEntities];
|
|
393
|
+
|
|
394
|
+
while (queue.length > 0) {
|
|
395
|
+
const entity = queue.shift();
|
|
396
|
+
const entityKey = `${entity.name}:${entity.category}`;
|
|
397
|
+
|
|
398
|
+
if (visited.has(entityKey)) continue;
|
|
399
|
+
visited.add(entityKey);
|
|
400
|
+
|
|
401
|
+
nodes.push({
|
|
402
|
+
name: entity.name,
|
|
403
|
+
path: entity.path || null,
|
|
404
|
+
layer: entity.layer || null,
|
|
405
|
+
category: entity.category || null,
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
const deps = Array.isArray(entity.dependencies) ? entity.dependencies : [];
|
|
409
|
+
for (const depName of deps) {
|
|
410
|
+
const depEntities = this._byName.get(depName);
|
|
411
|
+
if (depEntities && depEntities.length > 0) {
|
|
412
|
+
const dep = depEntities[0]; // Take first match
|
|
413
|
+
edges.push({
|
|
414
|
+
from: entity.name,
|
|
415
|
+
to: dep.name,
|
|
416
|
+
resolved: true,
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
const depKey = `${dep.name}:${dep.category}`;
|
|
420
|
+
if (!visited.has(depKey)) {
|
|
421
|
+
queue.push(dep);
|
|
422
|
+
}
|
|
423
|
+
} else {
|
|
424
|
+
// Unresolved dependency
|
|
425
|
+
edges.push({
|
|
426
|
+
from: entity.name,
|
|
427
|
+
to: depName,
|
|
428
|
+
resolved: false,
|
|
429
|
+
});
|
|
430
|
+
unresolvedCount++;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
return {
|
|
436
|
+
nodes,
|
|
437
|
+
edges,
|
|
438
|
+
unresolvedCount,
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
async analyzeCodebase(targetPath, _options = {}) {
|
|
443
|
+
this._ensureLoaded();
|
|
444
|
+
if (!this._byCategory) return null;
|
|
445
|
+
|
|
446
|
+
const files = [];
|
|
447
|
+
const structure = {};
|
|
448
|
+
const patterns = [];
|
|
449
|
+
|
|
450
|
+
for (const [category, entities] of this._byCategory) {
|
|
451
|
+
structure[category] = {
|
|
452
|
+
count: entities.length,
|
|
453
|
+
layers: {},
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
for (const entity of entities) {
|
|
457
|
+
if (entity.path) files.push(entity.path);
|
|
458
|
+
|
|
459
|
+
const layer = entity.layer || 'unknown';
|
|
460
|
+
if (!structure[category].layers[layer]) {
|
|
461
|
+
structure[category].layers[layer] = 0;
|
|
462
|
+
}
|
|
463
|
+
structure[category].layers[layer]++;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
// Detect patterns from category
|
|
467
|
+
if (entities.length > 5) {
|
|
468
|
+
patterns.push({
|
|
469
|
+
name: `${category}-convention`,
|
|
470
|
+
description: `${entities.length} ${category} entities follow consistent structure`,
|
|
471
|
+
count: entities.length,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
return { files, structure, patterns };
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
async getProjectStats(_options = {}) {
|
|
480
|
+
this._ensureLoaded();
|
|
481
|
+
if (!this._byCategory || !this._byPath) return null;
|
|
482
|
+
|
|
483
|
+
const languages = {};
|
|
484
|
+
const layerCounts = { L1: 0, L2: 0, L3: 0, L4: 0 };
|
|
485
|
+
|
|
486
|
+
for (const [_path, entity] of this._byPath) {
|
|
487
|
+
// Count by layer
|
|
488
|
+
if (entity.layer && layerCounts[entity.layer] !== undefined) {
|
|
489
|
+
layerCounts[entity.layer]++;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Detect language from file extension
|
|
493
|
+
const ext = path.extname(entity.path || '').slice(1);
|
|
494
|
+
if (ext) {
|
|
495
|
+
languages[ext] = (languages[ext] || 0) + 1;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return {
|
|
500
|
+
files: this._byPath.size,
|
|
501
|
+
lines: 0, // Cannot determine without reading files
|
|
502
|
+
languages,
|
|
503
|
+
layers: layerCounts,
|
|
504
|
+
categories: this._byCategory.size,
|
|
505
|
+
totalEntities: this._byName
|
|
506
|
+
? Array.from(this._byName.values()).reduce((sum, arr) => sum + arr.length, 0)
|
|
507
|
+
: 0,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// --- 3 AST-only primitives inherit null from base class ---
|
|
512
|
+
// findCallers, findCallees, analyzeComplexity → return null (base class default)
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
module.exports = { RegistryProvider, LAYER_PRIORITY };
|
|
@@ -5,14 +5,162 @@
|
|
|
5
5
|
"description": "Read-only framework defaults shipped with the npm package",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
8
|
-
"
|
|
9
|
-
"type": "
|
|
10
|
-
"description": "Framework version"
|
|
8
|
+
"metadata": {
|
|
9
|
+
"type": "object",
|
|
10
|
+
"description": "Framework metadata — name and version",
|
|
11
|
+
"properties": {
|
|
12
|
+
"name": {
|
|
13
|
+
"type": "string",
|
|
14
|
+
"description": "Framework display name"
|
|
15
|
+
},
|
|
16
|
+
"framework_version": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Semantic version of the framework"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"required": ["name", "framework_version"],
|
|
22
|
+
"additionalProperties": false
|
|
11
23
|
},
|
|
12
|
-
"
|
|
13
|
-
"type": "
|
|
14
|
-
"description": "
|
|
24
|
+
"markdownExploder": {
|
|
25
|
+
"type": "boolean",
|
|
26
|
+
"description": "Enable markdown exploder for document processing",
|
|
27
|
+
"default": true
|
|
28
|
+
},
|
|
29
|
+
"resource_locations": {
|
|
30
|
+
"type": "object",
|
|
31
|
+
"description": "Default paths for framework resources",
|
|
32
|
+
"properties": {
|
|
33
|
+
"agents_dir": { "type": "string", "description": "Path to agent definitions" },
|
|
34
|
+
"tasks_dir": { "type": "string", "description": "Path to task definitions" },
|
|
35
|
+
"templates_dir": { "type": "string", "description": "Path to templates" },
|
|
36
|
+
"checklists_dir": { "type": "string", "description": "Path to checklists" },
|
|
37
|
+
"tools_dir": { "type": "string", "description": "Path to tools" },
|
|
38
|
+
"scripts": {
|
|
39
|
+
"type": "object",
|
|
40
|
+
"description": "Script directory paths by category",
|
|
41
|
+
"properties": {
|
|
42
|
+
"core": { "type": "string" },
|
|
43
|
+
"development": { "type": "string" },
|
|
44
|
+
"infrastructure": { "type": "string" },
|
|
45
|
+
"legacy": { "type": "string" }
|
|
46
|
+
},
|
|
47
|
+
"additionalProperties": false
|
|
48
|
+
},
|
|
49
|
+
"data_dir": { "type": "string", "description": "Path to data directory" },
|
|
50
|
+
"elicitation_dir": { "type": "string", "description": "Path to elicitation templates" },
|
|
51
|
+
"squads_template_dir": { "type": "string", "description": "Path to squad templates" },
|
|
52
|
+
"minds_dir": { "type": "string", "description": "Path to minds output" }
|
|
53
|
+
},
|
|
54
|
+
"additionalProperties": false
|
|
55
|
+
},
|
|
56
|
+
"performance_defaults": {
|
|
57
|
+
"type": "object",
|
|
58
|
+
"description": "Default performance tuning options",
|
|
59
|
+
"properties": {
|
|
60
|
+
"lazy_loading": {
|
|
61
|
+
"type": "object",
|
|
62
|
+
"properties": {
|
|
63
|
+
"enabled": { "type": "boolean", "default": true },
|
|
64
|
+
"heavy_sections": {
|
|
65
|
+
"type": "array",
|
|
66
|
+
"items": { "type": "string" },
|
|
67
|
+
"description": "Config sections loaded lazily"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"additionalProperties": false
|
|
71
|
+
},
|
|
72
|
+
"git": {
|
|
73
|
+
"type": "object",
|
|
74
|
+
"properties": {
|
|
75
|
+
"show_config_warning": { "type": "boolean", "default": true },
|
|
76
|
+
"cache_time_seconds": { "type": "integer", "minimum": 0 }
|
|
77
|
+
},
|
|
78
|
+
"additionalProperties": false
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"additionalProperties": false
|
|
82
|
+
},
|
|
83
|
+
"utility_scripts_registry": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"description": "Registry of utility scripts by category",
|
|
86
|
+
"properties": {
|
|
87
|
+
"helpers": {
|
|
88
|
+
"type": "array",
|
|
89
|
+
"items": { "type": "string" },
|
|
90
|
+
"description": "Agent helper utility names"
|
|
91
|
+
},
|
|
92
|
+
"executors": {
|
|
93
|
+
"type": "array",
|
|
94
|
+
"items": { "type": "string" },
|
|
95
|
+
"description": "Task execution utility names"
|
|
96
|
+
},
|
|
97
|
+
"framework": {
|
|
98
|
+
"type": "array",
|
|
99
|
+
"items": { "type": "string" },
|
|
100
|
+
"description": "Framework-level utility names"
|
|
101
|
+
}
|
|
102
|
+
},
|
|
103
|
+
"additionalProperties": false
|
|
104
|
+
},
|
|
105
|
+
"ide_sync_system": {
|
|
106
|
+
"type": "object",
|
|
107
|
+
"description": "IDE synchronization system for agent definitions",
|
|
108
|
+
"properties": {
|
|
109
|
+
"enabled": { "type": "boolean", "default": true },
|
|
110
|
+
"source": { "type": "string", "description": "Source directory for agent definitions" },
|
|
111
|
+
"targets": {
|
|
112
|
+
"type": "object",
|
|
113
|
+
"description": "IDE target configurations",
|
|
114
|
+
"additionalProperties": {
|
|
115
|
+
"type": "object",
|
|
116
|
+
"properties": {
|
|
117
|
+
"enabled": { "type": "boolean" },
|
|
118
|
+
"path": { "type": "string" },
|
|
119
|
+
"format": { "type": "string", "enum": ["full-markdown-yaml", "condensed-rules", "cursor-style"] }
|
|
120
|
+
},
|
|
121
|
+
"additionalProperties": false
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"redirects": { "type": "object", "additionalProperties": true },
|
|
125
|
+
"validation": {
|
|
126
|
+
"type": "object",
|
|
127
|
+
"properties": {
|
|
128
|
+
"strict_mode": { "type": "boolean" },
|
|
129
|
+
"fail_on_drift": { "type": "boolean" },
|
|
130
|
+
"fail_on_orphaned": { "type": "boolean" }
|
|
131
|
+
},
|
|
132
|
+
"additionalProperties": false
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"additionalProperties": false
|
|
136
|
+
},
|
|
137
|
+
"template_overrides": {
|
|
138
|
+
"type": "object",
|
|
139
|
+
"description": "Template customization defaults (override at L2)",
|
|
140
|
+
"properties": {
|
|
141
|
+
"story": {
|
|
142
|
+
"type": "object",
|
|
143
|
+
"properties": {
|
|
144
|
+
"sections_order": {
|
|
145
|
+
"oneOf": [
|
|
146
|
+
{ "type": "array", "items": { "type": "string" } },
|
|
147
|
+
{ "type": "null" }
|
|
148
|
+
],
|
|
149
|
+
"description": "Custom section order for story templates. null = use template default.",
|
|
150
|
+
"default": null
|
|
151
|
+
},
|
|
152
|
+
"optional_sections": {
|
|
153
|
+
"type": "array",
|
|
154
|
+
"items": { "type": "string" },
|
|
155
|
+
"description": "Section IDs that can be skipped in story templates",
|
|
156
|
+
"default": []
|
|
157
|
+
}
|
|
158
|
+
},
|
|
159
|
+
"additionalProperties": false
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"additionalProperties": false
|
|
15
163
|
}
|
|
16
164
|
},
|
|
17
|
-
"additionalProperties":
|
|
165
|
+
"additionalProperties": false
|
|
18
166
|
}
|