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,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Code Intelligence
|
|
3
|
+
*
|
|
4
|
+
* Validates code-intel provider status by actually testing provider detection.
|
|
5
|
+
* Checks: module exists → registry-provider available → primitives work.
|
|
6
|
+
*
|
|
7
|
+
* @module aios-core/doctor/checks/code-intel
|
|
8
|
+
* @story INS-4.1, CODEINTEL-RP-001
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
const name = 'code-intel';
|
|
15
|
+
|
|
16
|
+
async function run(context) {
|
|
17
|
+
const codeIntelDir = path.join(context.projectRoot, '.aios-core', 'core', 'code-intel');
|
|
18
|
+
|
|
19
|
+
// Check 1: Module exists
|
|
20
|
+
if (!fs.existsSync(codeIntelDir)) {
|
|
21
|
+
return {
|
|
22
|
+
check: name,
|
|
23
|
+
status: 'INFO',
|
|
24
|
+
message: 'Code-intel module not found (optional)',
|
|
25
|
+
fixCommand: null,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Check 2: Try to load and detect provider
|
|
30
|
+
try {
|
|
31
|
+
const indexPath = path.join(codeIntelDir, 'index.js');
|
|
32
|
+
if (!fs.existsSync(indexPath)) {
|
|
33
|
+
return {
|
|
34
|
+
check: name,
|
|
35
|
+
status: 'WARN',
|
|
36
|
+
message: 'Code-intel index.js not found',
|
|
37
|
+
fixCommand: null,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Clear require cache to get fresh state
|
|
42
|
+
const resolvedIndex = require.resolve(indexPath);
|
|
43
|
+
delete require.cache[resolvedIndex];
|
|
44
|
+
|
|
45
|
+
const { getClient, isCodeIntelAvailable, _resetForTesting } = require(indexPath);
|
|
46
|
+
|
|
47
|
+
// Reset singleton to test fresh detection
|
|
48
|
+
_resetForTesting();
|
|
49
|
+
|
|
50
|
+
// Initialize client (triggers provider auto-detection)
|
|
51
|
+
const client = getClient({ projectRoot: context.projectRoot });
|
|
52
|
+
const available = isCodeIntelAvailable();
|
|
53
|
+
const metrics = client.getMetrics();
|
|
54
|
+
|
|
55
|
+
// Clean up singleton after test
|
|
56
|
+
_resetForTesting();
|
|
57
|
+
|
|
58
|
+
if (!available) {
|
|
59
|
+
// Check if entity-registry.yaml exists but provider still failed
|
|
60
|
+
const registryPath = path.join(context.projectRoot, '.aios-core', 'data', 'entity-registry.yaml');
|
|
61
|
+
if (fs.existsSync(registryPath)) {
|
|
62
|
+
const stat = fs.statSync(registryPath);
|
|
63
|
+
const sizeKB = Math.round(stat.size / 1024);
|
|
64
|
+
return {
|
|
65
|
+
check: name,
|
|
66
|
+
status: 'WARN',
|
|
67
|
+
message: `Registry exists (${sizeKB}KB) but provider detection failed — may be empty or malformed`,
|
|
68
|
+
fixCommand: 'node .aios-core/development/scripts/populate-entity-registry.js',
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return {
|
|
73
|
+
check: name,
|
|
74
|
+
status: 'INFO',
|
|
75
|
+
message: 'No provider available (no registry, no MCP) — graceful fallback active',
|
|
76
|
+
fixCommand: 'node .aios-core/development/scripts/populate-entity-registry.js',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Provider is available — report details
|
|
81
|
+
const provider = metrics.activeProvider;
|
|
82
|
+
const cbState = metrics.circuitBreakerState;
|
|
83
|
+
|
|
84
|
+
if (provider === 'registry') {
|
|
85
|
+
// Read entity count from registry metadata
|
|
86
|
+
const registryPath = path.join(context.projectRoot, '.aios-core', 'data', 'entity-registry.yaml');
|
|
87
|
+
let entityInfo = '';
|
|
88
|
+
if (fs.existsSync(registryPath)) {
|
|
89
|
+
const content = fs.readFileSync(registryPath, 'utf8');
|
|
90
|
+
const sizeKB = Math.round(fs.statSync(registryPath).size / 1024);
|
|
91
|
+
// Extract entityCount from metadata header (avoids full YAML parse)
|
|
92
|
+
const countMatch = content.match(/entityCount:\s*(\d+)/);
|
|
93
|
+
const entityCount = countMatch ? countMatch[1] : '?';
|
|
94
|
+
entityInfo = `, ${entityCount} entities, ${sizeKB}KB`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
check: name,
|
|
99
|
+
status: 'PASS',
|
|
100
|
+
message: `RegistryProvider (T1) active, 5/8 primitives${entityInfo}, CB: ${cbState}`,
|
|
101
|
+
fixCommand: null,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
if (provider === 'code-graph') {
|
|
106
|
+
return {
|
|
107
|
+
check: name,
|
|
108
|
+
status: 'PASS',
|
|
109
|
+
message: `CodeGraphProvider (T3/MCP) active, 8/8 primitives, CB: ${cbState}`,
|
|
110
|
+
fixCommand: null,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Unknown provider (custom)
|
|
115
|
+
return {
|
|
116
|
+
check: name,
|
|
117
|
+
status: 'PASS',
|
|
118
|
+
message: `Provider '${provider}' active, CB: ${cbState}`,
|
|
119
|
+
fixCommand: null,
|
|
120
|
+
};
|
|
121
|
+
} catch (error) {
|
|
122
|
+
return {
|
|
123
|
+
check: name,
|
|
124
|
+
status: 'WARN',
|
|
125
|
+
message: `Provider detection error: ${error.message}`,
|
|
126
|
+
fixCommand: null,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Commands Count
|
|
3
|
+
*
|
|
4
|
+
* Counts .md files in .claude/commands/ recursively.
|
|
5
|
+
* PASS: >=20, WARN: 12-19, FAIL: <12.
|
|
6
|
+
*
|
|
7
|
+
* @module aios-core/doctor/checks/commands-count
|
|
8
|
+
* @story INS-4.8
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
const name = 'commands-count';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Recursively count .md files in a directory.
|
|
18
|
+
*/
|
|
19
|
+
function countMdFiles(dir) {
|
|
20
|
+
let count = 0;
|
|
21
|
+
let entries;
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
25
|
+
} catch {
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
for (const entry of entries) {
|
|
30
|
+
const fullPath = path.join(dir, entry.name);
|
|
31
|
+
if (entry.isDirectory()) {
|
|
32
|
+
count += countMdFiles(fullPath);
|
|
33
|
+
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
34
|
+
count++;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return count;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async function run(context) {
|
|
42
|
+
const commandsDir = path.join(context.projectRoot, '.claude', 'commands');
|
|
43
|
+
|
|
44
|
+
if (!fs.existsSync(commandsDir)) {
|
|
45
|
+
return {
|
|
46
|
+
check: name,
|
|
47
|
+
status: 'FAIL',
|
|
48
|
+
message: 'Commands directory not found (.claude/commands/)',
|
|
49
|
+
fixCommand: 'npx aios-core install --force',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const count = countMdFiles(commandsDir);
|
|
54
|
+
|
|
55
|
+
if (count >= 20) {
|
|
56
|
+
return {
|
|
57
|
+
check: name,
|
|
58
|
+
status: 'PASS',
|
|
59
|
+
message: `${count} command files found`,
|
|
60
|
+
fixCommand: null,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (count >= 12) {
|
|
65
|
+
return {
|
|
66
|
+
check: name,
|
|
67
|
+
status: 'WARN',
|
|
68
|
+
message: `${count}/20 command files found (agents only, no extras)`,
|
|
69
|
+
fixCommand: 'npx aios-core install --force',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
check: name,
|
|
75
|
+
status: 'FAIL',
|
|
76
|
+
message: `Only ${count} command files found (expected >=12)`,
|
|
77
|
+
fixCommand: 'npx aios-core install --force',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Core Config
|
|
3
|
+
*
|
|
4
|
+
* Validates core-config.yaml exists and has required keys:
|
|
5
|
+
* boundary, project, ide.
|
|
6
|
+
*
|
|
7
|
+
* @module aios-core/doctor/checks/core-config
|
|
8
|
+
* @story INS-4.1
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
const name = 'core-config';
|
|
15
|
+
|
|
16
|
+
const REQUIRED_SECTIONS = ['boundary', 'project', 'ide'];
|
|
17
|
+
|
|
18
|
+
async function run(context) {
|
|
19
|
+
const configPath = path.join(context.projectRoot, '.aios-core', 'core-config.yaml');
|
|
20
|
+
|
|
21
|
+
if (!fs.existsSync(configPath)) {
|
|
22
|
+
return {
|
|
23
|
+
check: name,
|
|
24
|
+
status: 'FAIL',
|
|
25
|
+
message: 'core-config.yaml not found',
|
|
26
|
+
fixCommand: 'npx aios-core install --force',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
31
|
+
|
|
32
|
+
const missingSections = REQUIRED_SECTIONS.filter(
|
|
33
|
+
(section) => !content.includes(`${section}:`),
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
if (missingSections.length === 0) {
|
|
37
|
+
return {
|
|
38
|
+
check: name,
|
|
39
|
+
status: 'PASS',
|
|
40
|
+
message: 'Schema valid, boundary section present',
|
|
41
|
+
fixCommand: null,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
check: name,
|
|
47
|
+
status: 'FAIL',
|
|
48
|
+
message: `Missing sections: ${missingSections.join(', ')}`,
|
|
49
|
+
fixCommand: 'npx aios-core install --force',
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Entity Registry
|
|
3
|
+
*
|
|
4
|
+
* Validates .aios-core/data/entity-registry.yaml exists and mtime < 48h.
|
|
5
|
+
*
|
|
6
|
+
* @module aios-core/doctor/checks/entity-registry
|
|
7
|
+
* @story INS-4.1
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
|
|
13
|
+
const name = 'entity-registry';
|
|
14
|
+
|
|
15
|
+
const MAX_AGE_MS = 48 * 60 * 60 * 1000; // 48 hours
|
|
16
|
+
|
|
17
|
+
async function run(context) {
|
|
18
|
+
const registryPath = path.join(context.projectRoot, '.aios-core', 'data', 'entity-registry.yaml');
|
|
19
|
+
|
|
20
|
+
if (!fs.existsSync(registryPath)) {
|
|
21
|
+
return {
|
|
22
|
+
check: name,
|
|
23
|
+
status: 'FAIL',
|
|
24
|
+
message: 'entity-registry.yaml not found',
|
|
25
|
+
fixCommand: 'npx aios-core install --force',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const stat = fs.statSync(registryPath);
|
|
30
|
+
const ageMs = Date.now() - stat.mtimeMs;
|
|
31
|
+
const ageHours = Math.round(ageMs / (60 * 60 * 1000));
|
|
32
|
+
|
|
33
|
+
const content = fs.readFileSync(registryPath, 'utf8');
|
|
34
|
+
const lineCount = content.split('\n').length;
|
|
35
|
+
|
|
36
|
+
if (ageMs > MAX_AGE_MS) {
|
|
37
|
+
return {
|
|
38
|
+
check: name,
|
|
39
|
+
status: 'WARN',
|
|
40
|
+
message: `entity-registry.yaml is ${ageHours}h old (threshold: 48h), ~${lineCount} lines`,
|
|
41
|
+
fixCommand: 'npx aios-core install --force',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
check: name,
|
|
47
|
+
status: 'PASS',
|
|
48
|
+
message: `~${lineCount} lines, updated ${ageHours}h ago`,
|
|
49
|
+
fixCommand: null,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Git Hooks
|
|
3
|
+
*
|
|
4
|
+
* Validates .husky/pre-commit and .husky/pre-push exist.
|
|
5
|
+
*
|
|
6
|
+
* @module aios-core/doctor/checks/git-hooks
|
|
7
|
+
* @story INS-4.1
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
|
|
13
|
+
const name = 'git-hooks';
|
|
14
|
+
|
|
15
|
+
const EXPECTED_HOOKS = ['pre-commit', 'pre-push'];
|
|
16
|
+
|
|
17
|
+
async function run(context) {
|
|
18
|
+
const huskyDir = path.join(context.projectRoot, '.husky');
|
|
19
|
+
|
|
20
|
+
if (!fs.existsSync(huskyDir)) {
|
|
21
|
+
return {
|
|
22
|
+
check: name,
|
|
23
|
+
status: 'WARN',
|
|
24
|
+
message: '.husky directory not found',
|
|
25
|
+
fixCommand: 'npx husky init',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const missing = EXPECTED_HOOKS.filter(
|
|
30
|
+
(hook) => !fs.existsSync(path.join(huskyDir, hook)),
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (missing.length === 0) {
|
|
34
|
+
return {
|
|
35
|
+
check: name,
|
|
36
|
+
status: 'PASS',
|
|
37
|
+
message: `${EXPECTED_HOOKS.join(' + ')} installed`,
|
|
38
|
+
fixCommand: null,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
check: name,
|
|
44
|
+
status: 'WARN',
|
|
45
|
+
message: `Missing hooks: ${missing.join(', ')}`,
|
|
46
|
+
fixCommand: 'npx husky init',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Graph Dashboard
|
|
3
|
+
*
|
|
4
|
+
* Validates .aios-core/core/graph-dashboard/ directory exists
|
|
5
|
+
* with at least 1 .js file.
|
|
6
|
+
*
|
|
7
|
+
* @module aios-core/doctor/checks/graph-dashboard
|
|
8
|
+
* @story INS-4.1
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
const name = 'graph-dashboard';
|
|
15
|
+
|
|
16
|
+
async function run(context) {
|
|
17
|
+
const dashboardDir = path.join(context.projectRoot, '.aios-core', 'core', 'graph-dashboard');
|
|
18
|
+
|
|
19
|
+
if (!fs.existsSync(dashboardDir)) {
|
|
20
|
+
return {
|
|
21
|
+
check: name,
|
|
22
|
+
status: 'WARN',
|
|
23
|
+
message: 'graph-dashboard directory not found',
|
|
24
|
+
fixCommand: 'npx aios-core install --force',
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const jsFiles = fs.readdirSync(dashboardDir)
|
|
29
|
+
.filter((f) => f.endsWith('.js'));
|
|
30
|
+
|
|
31
|
+
if (jsFiles.length === 0) {
|
|
32
|
+
return {
|
|
33
|
+
check: name,
|
|
34
|
+
status: 'WARN',
|
|
35
|
+
message: 'graph-dashboard directory empty (no .js files)',
|
|
36
|
+
fixCommand: 'npx aios-core install --force',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
check: name,
|
|
42
|
+
status: 'PASS',
|
|
43
|
+
message: `All modules present (${jsFiles.length} files)`,
|
|
44
|
+
fixCommand: null,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Hooks Claude Count
|
|
3
|
+
*
|
|
4
|
+
* Counts .cjs files in .claude/hooks/ and verifies registration
|
|
5
|
+
* in settings.local.json.
|
|
6
|
+
* PASS: >=2 + all registered, WARN: files present but not registered or <2,
|
|
7
|
+
* FAIL: 0 or directory missing.
|
|
8
|
+
*
|
|
9
|
+
* @module aios-core/doctor/checks/hooks-claude-count
|
|
10
|
+
* @story INS-4.8
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const fs = require('fs');
|
|
15
|
+
|
|
16
|
+
const name = 'hooks-claude-count';
|
|
17
|
+
|
|
18
|
+
async function run(context) {
|
|
19
|
+
const hooksDir = path.join(context.projectRoot, '.claude', 'hooks');
|
|
20
|
+
|
|
21
|
+
if (!fs.existsSync(hooksDir)) {
|
|
22
|
+
return {
|
|
23
|
+
check: name,
|
|
24
|
+
status: 'FAIL',
|
|
25
|
+
message: 'Hooks directory not found (.claude/hooks/)',
|
|
26
|
+
fixCommand: 'npx aios-core install --force',
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let entries;
|
|
31
|
+
try {
|
|
32
|
+
entries = fs.readdirSync(hooksDir, { withFileTypes: true });
|
|
33
|
+
} catch {
|
|
34
|
+
return {
|
|
35
|
+
check: name,
|
|
36
|
+
status: 'FAIL',
|
|
37
|
+
message: 'Cannot read hooks directory',
|
|
38
|
+
fixCommand: 'npx aios-core install --force',
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const hookFiles = entries.filter(
|
|
43
|
+
(e) => e.isFile() && e.name.endsWith('.cjs'),
|
|
44
|
+
);
|
|
45
|
+
const hookCount = hookFiles.length;
|
|
46
|
+
|
|
47
|
+
if (hookCount === 0) {
|
|
48
|
+
return {
|
|
49
|
+
check: name,
|
|
50
|
+
status: 'FAIL',
|
|
51
|
+
message: 'No hook files found (.cjs)',
|
|
52
|
+
fixCommand: 'npx aios-core install --force',
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Check registration in settings.local.json
|
|
57
|
+
const settingsLocalPath = path.join(context.projectRoot, '.claude', 'settings.local.json');
|
|
58
|
+
let registered = false;
|
|
59
|
+
|
|
60
|
+
if (fs.existsSync(settingsLocalPath)) {
|
|
61
|
+
try {
|
|
62
|
+
const settingsLocal = JSON.parse(fs.readFileSync(settingsLocalPath, 'utf8'));
|
|
63
|
+
const hooks = settingsLocal.hooks || {};
|
|
64
|
+
// Claude Code hooks schema: { EventName: [{ matcher, hooks: [{ type, command }] }] }
|
|
65
|
+
const allHookCommands = [];
|
|
66
|
+
for (const entries of Object.values(hooks)) {
|
|
67
|
+
if (!Array.isArray(entries)) continue;
|
|
68
|
+
for (const entry of entries) {
|
|
69
|
+
if (entry && Array.isArray(entry.hooks)) {
|
|
70
|
+
for (const h of entry.hooks) {
|
|
71
|
+
if (h && h.command) allHookCommands.push(h.command);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
// Fallback: flat string or direct command
|
|
75
|
+
if (typeof entry === 'string') allHookCommands.push(entry);
|
|
76
|
+
if (entry && typeof entry.command === 'string') allHookCommands.push(entry.command);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
const hooksStr = allHookCommands.join('\n');
|
|
80
|
+
|
|
81
|
+
// Check if at least some hook files are referenced in settings
|
|
82
|
+
const referencedCount = hookFiles.filter(
|
|
83
|
+
(f) => hooksStr.includes(f.name) || hooksStr.includes(f.name.replace('.cjs', '')),
|
|
84
|
+
).length;
|
|
85
|
+
|
|
86
|
+
registered = referencedCount > 0;
|
|
87
|
+
} catch {
|
|
88
|
+
registered = false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (hookCount >= 2 && registered) {
|
|
93
|
+
return {
|
|
94
|
+
check: name,
|
|
95
|
+
status: 'PASS',
|
|
96
|
+
message: `${hookCount} hook files found and registered`,
|
|
97
|
+
fixCommand: null,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (hookCount >= 2 && !registered) {
|
|
102
|
+
return {
|
|
103
|
+
check: name,
|
|
104
|
+
status: 'WARN',
|
|
105
|
+
message: `${hookCount} hook files found but not registered in settings.local.json`,
|
|
106
|
+
fixCommand: 'npx aios-core install --force',
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
return {
|
|
111
|
+
check: name,
|
|
112
|
+
status: 'WARN',
|
|
113
|
+
message: `Only ${hookCount}/2 hook files found`,
|
|
114
|
+
fixCommand: 'npx aios-core install --force',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: IDE Sync
|
|
3
|
+
*
|
|
4
|
+
* Validates agents in .claude/commands/AIOS/agents/ match
|
|
5
|
+
* .aios-core/development/agents/ (count and names).
|
|
6
|
+
*
|
|
7
|
+
* @module aios-core/doctor/checks/ide-sync
|
|
8
|
+
* @story INS-4.1
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
|
|
14
|
+
const name = 'ide-sync';
|
|
15
|
+
|
|
16
|
+
async function run(context) {
|
|
17
|
+
const agentsSourceDir = path.join(context.projectRoot, '.aios-core', 'development', 'agents');
|
|
18
|
+
const agentsIdeDir = path.join(context.projectRoot, '.claude', 'commands', 'AIOS', 'agents');
|
|
19
|
+
|
|
20
|
+
if (!fs.existsSync(agentsSourceDir)) {
|
|
21
|
+
return {
|
|
22
|
+
check: name,
|
|
23
|
+
status: 'FAIL',
|
|
24
|
+
message: 'Source agents directory not found',
|
|
25
|
+
fixCommand: 'npx aios-core install --force',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (!fs.existsSync(agentsIdeDir)) {
|
|
30
|
+
return {
|
|
31
|
+
check: name,
|
|
32
|
+
status: 'WARN',
|
|
33
|
+
message: 'IDE agents directory not found (.claude/commands/AIOS/agents/)',
|
|
34
|
+
fixCommand: 'npx aios-core install --force',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let sourceAgents, ideFiles;
|
|
39
|
+
try {
|
|
40
|
+
sourceAgents = fs.readdirSync(agentsSourceDir)
|
|
41
|
+
.filter((f) => f.endsWith('.md'))
|
|
42
|
+
.map((f) => f.replace('.md', ''));
|
|
43
|
+
} catch (_err) {
|
|
44
|
+
return {
|
|
45
|
+
check: name,
|
|
46
|
+
status: 'FAIL',
|
|
47
|
+
message: 'Cannot read source agents directory',
|
|
48
|
+
fixCommand: 'npx aios-core install --force',
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
ideFiles = fs.readdirSync(agentsIdeDir)
|
|
54
|
+
.filter((f) => f.endsWith('.md'));
|
|
55
|
+
} catch (_err) {
|
|
56
|
+
return {
|
|
57
|
+
check: name,
|
|
58
|
+
status: 'WARN',
|
|
59
|
+
message: 'Cannot read IDE agents directory',
|
|
60
|
+
fixCommand: 'npx aios-core install --force',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const ideAgents = ideFiles.map((f) => f.replace('.md', ''));
|
|
65
|
+
const sourceCount = sourceAgents.length;
|
|
66
|
+
const ideCount = ideAgents.length;
|
|
67
|
+
|
|
68
|
+
if (sourceCount === ideCount) {
|
|
69
|
+
return {
|
|
70
|
+
check: name,
|
|
71
|
+
status: 'PASS',
|
|
72
|
+
message: `${ideCount}/${sourceCount} agents synced`,
|
|
73
|
+
fixCommand: null,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
check: name,
|
|
79
|
+
status: 'WARN',
|
|
80
|
+
message: `IDE has ${ideCount} agents, source has ${sourceCount}`,
|
|
81
|
+
fixCommand: 'npx aios-core install --force',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
module.exports = { name, run };
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check Registry
|
|
3
|
+
*
|
|
4
|
+
* Exports all 15 check modules in execution order.
|
|
5
|
+
*
|
|
6
|
+
* @module aios-core/doctor/checks
|
|
7
|
+
* @story INS-4.1, INS-4.8
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const settingsJson = require('./settings-json');
|
|
11
|
+
const rulesFiles = require('./rules-files');
|
|
12
|
+
const agentMemory = require('./agent-memory');
|
|
13
|
+
const entityRegistry = require('./entity-registry');
|
|
14
|
+
const gitHooks = require('./git-hooks');
|
|
15
|
+
const coreConfig = require('./core-config');
|
|
16
|
+
const claudeMd = require('./claude-md');
|
|
17
|
+
const ideSync = require('./ide-sync');
|
|
18
|
+
const graphDashboard = require('./graph-dashboard');
|
|
19
|
+
const codeIntel = require('./code-intel');
|
|
20
|
+
const nodeVersion = require('./node-version');
|
|
21
|
+
const npmPackages = require('./npm-packages');
|
|
22
|
+
const skillsCount = require('./skills-count');
|
|
23
|
+
const commandsCount = require('./commands-count');
|
|
24
|
+
const hooksClaudeCount = require('./hooks-claude-count');
|
|
25
|
+
|
|
26
|
+
function loadChecks() {
|
|
27
|
+
return [
|
|
28
|
+
settingsJson,
|
|
29
|
+
rulesFiles,
|
|
30
|
+
agentMemory,
|
|
31
|
+
entityRegistry,
|
|
32
|
+
gitHooks,
|
|
33
|
+
coreConfig,
|
|
34
|
+
claudeMd,
|
|
35
|
+
ideSync,
|
|
36
|
+
graphDashboard,
|
|
37
|
+
codeIntel,
|
|
38
|
+
nodeVersion,
|
|
39
|
+
npmPackages,
|
|
40
|
+
skillsCount,
|
|
41
|
+
commandsCount,
|
|
42
|
+
hooksClaudeCount,
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
module.exports = { loadChecks };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor Check: Node.js Version
|
|
3
|
+
*
|
|
4
|
+
* Validates Node.js >= 18 via process.version.
|
|
5
|
+
*
|
|
6
|
+
* @module aios-core/doctor/checks/node-version
|
|
7
|
+
* @story INS-4.1
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
const name = 'node-version';
|
|
11
|
+
|
|
12
|
+
async function run() {
|
|
13
|
+
const version = process.version.replace('v', '');
|
|
14
|
+
const [major] = version.split('.').map(Number);
|
|
15
|
+
|
|
16
|
+
if (major >= 18) {
|
|
17
|
+
return {
|
|
18
|
+
check: name,
|
|
19
|
+
status: 'PASS',
|
|
20
|
+
message: `Node.js ${process.version}`,
|
|
21
|
+
fixCommand: null,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
check: name,
|
|
27
|
+
status: 'FAIL',
|
|
28
|
+
message: `Node.js ${process.version} (requires >= 18.0.0)`,
|
|
29
|
+
fixCommand: 'nvm install 20 && nvm use 20',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
module.exports = { name, run };
|