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
|
@@ -6,6 +6,7 @@ const path = require('path');
|
|
|
6
6
|
const yaml = require('js-yaml');
|
|
7
7
|
const fg = require('fast-glob');
|
|
8
8
|
const crypto = require('crypto');
|
|
9
|
+
const { classifyLayer } = require('../../core/ids/layer-classifier');
|
|
9
10
|
|
|
10
11
|
const REPO_ROOT = path.resolve(__dirname, '../../..');
|
|
11
12
|
const REGISTRY_PATH = path.resolve(__dirname, '../../data/entity-registry.yaml');
|
|
@@ -17,7 +18,14 @@ const SCAN_CONFIG = [
|
|
|
17
18
|
{ category: 'modules', basePath: '.aios-core/core', glob: '**/*.{js,mjs}', type: 'module' },
|
|
18
19
|
{ category: 'agents', basePath: '.aios-core/development/agents', glob: '**/*.{md,yaml,yml}', type: 'agent' },
|
|
19
20
|
{ category: 'checklists', basePath: '.aios-core/development/checklists', glob: '**/*.md', type: 'checklist' },
|
|
20
|
-
{ category: 'data', basePath: '.aios-core/data', glob: '**/*.{yaml,yml,md}', type: 'data' }
|
|
21
|
+
{ category: 'data', basePath: '.aios-core/data', glob: '**/*.{yaml,yml,md}', type: 'data' },
|
|
22
|
+
{ category: 'workflows', basePath: '.aios-core/development/workflows', glob: '**/*.{yaml,yml}', type: 'workflow' },
|
|
23
|
+
{ category: 'utils', basePath: '.aios-core/core/utils', glob: '**/*.js', type: 'util' },
|
|
24
|
+
{ category: 'tools', basePath: '.aios-core/development/tools', glob: '**/*.{md,js,sh}', type: 'tool' },
|
|
25
|
+
{ category: 'infra-scripts', basePath: '.aios-core/infrastructure/scripts', glob: '**/*.js', type: 'script' },
|
|
26
|
+
{ category: 'infra-tools', basePath: '.aios-core/infrastructure/tools', glob: '**/*.{yaml,yml,md}', type: 'tool' },
|
|
27
|
+
{ category: 'product-checklists', basePath: '.aios-core/product/checklists', glob: '**/*.md', type: 'checklist' },
|
|
28
|
+
{ category: 'product-data', basePath: '.aios-core/product/data', glob: '**/*.{yaml,yml,md}', type: 'data' }
|
|
21
29
|
];
|
|
22
30
|
|
|
23
31
|
const ADAPTABILITY_DEFAULTS = {
|
|
@@ -27,9 +35,38 @@ const ADAPTABILITY_DEFAULTS = {
|
|
|
27
35
|
checklist: 0.6,
|
|
28
36
|
data: 0.5,
|
|
29
37
|
script: 0.7,
|
|
30
|
-
task: 0.8
|
|
38
|
+
task: 0.8,
|
|
39
|
+
workflow: 0.4,
|
|
40
|
+
util: 0.6,
|
|
41
|
+
tool: 0.7
|
|
31
42
|
};
|
|
32
43
|
|
|
44
|
+
const EXTERNAL_TOOLS = new Set([
|
|
45
|
+
'coderabbit', 'git', 'github-cli', 'docker', 'supabase', 'browser',
|
|
46
|
+
'ffmpeg', 'n8n', 'context7', 'playwright', 'apify', 'clickup',
|
|
47
|
+
'jira', 'slack', 'exa', 'eslint', 'jest', 'npm', 'node',
|
|
48
|
+
'docker-gateway', 'desktop-commander', 'railway'
|
|
49
|
+
]);
|
|
50
|
+
|
|
51
|
+
const DEPRECATED_PATTERNS = [/^old[-_]/, /^backup[-_]/, /deprecated/i, /^legacy[-_]/];
|
|
52
|
+
|
|
53
|
+
const SENTINEL_VALUES = new Set(['n/a', 'na', 'none', 'tbd', 'todo', '-', '']);
|
|
54
|
+
|
|
55
|
+
function isSentinel(value) {
|
|
56
|
+
return SENTINEL_VALUES.has(value.toLowerCase().trim());
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function isNoise(value) {
|
|
60
|
+
const trimmed = value.trim();
|
|
61
|
+
// Very short fragments (1-2 chars) unless they are known agent refs
|
|
62
|
+
if (trimmed.length <= 2 && !KNOWN_AGENTS.includes(trimmed)) return true;
|
|
63
|
+
// Natural language fragments (contains spaces and > 2 words)
|
|
64
|
+
if (trimmed.includes(' ') && trimmed.split(/\s+/).length > 2) return true;
|
|
65
|
+
// Template placeholders
|
|
66
|
+
if (trimmed.includes('{{') || trimmed.includes('${')) return true;
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
|
|
33
70
|
function computeChecksum(filePath) {
|
|
34
71
|
const content = fs.readFileSync(filePath);
|
|
35
72
|
return 'sha256:' + crypto.createHash('sha256').update(content).digest('hex');
|
|
@@ -74,7 +111,163 @@ function extractPurpose(content, filePath) {
|
|
|
74
111
|
return `Entity at ${path.relative(REPO_ROOT, filePath)}`;
|
|
75
112
|
}
|
|
76
113
|
|
|
77
|
-
|
|
114
|
+
const YAML_DEP_FIELDS = {
|
|
115
|
+
agent: {
|
|
116
|
+
nested: ['tasks', 'templates', 'checklists', 'tools', 'scripts'],
|
|
117
|
+
arrayFields: [
|
|
118
|
+
{ arrayPath: 'commands', field: 'task' },
|
|
119
|
+
],
|
|
120
|
+
},
|
|
121
|
+
workflow: {
|
|
122
|
+
nested: [],
|
|
123
|
+
arrayFields: [
|
|
124
|
+
{ arrayPath: 'phases', field: 'task' },
|
|
125
|
+
{ arrayPath: 'phases', field: 'agent' },
|
|
126
|
+
{ arrayPath: 'sequence', field: 'agent' },
|
|
127
|
+
{ arrayPath: 'steps', field: 'task' },
|
|
128
|
+
{ arrayPath: 'steps', field: 'uses' },
|
|
129
|
+
],
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const KNOWN_AGENTS = [
|
|
134
|
+
'dev', 'qa', 'pm', 'po', 'sm', 'architect', 'devops',
|
|
135
|
+
'analyst', 'data-engineer', 'ux-design-expert', 'aios-master'
|
|
136
|
+
];
|
|
137
|
+
|
|
138
|
+
// Pattern A: YAML dependency block items (- name.md)
|
|
139
|
+
const YAML_BLOCK_RE = /^\s*[-*]\s+([\w.-]+\.(?:md|yaml|js))\s*$/gm;
|
|
140
|
+
// Pattern B: Label list (- **Tasks:** a.md, b.md)
|
|
141
|
+
const LABEL_LIST_RE = /^\s*[-*]\s+\*\*[\w\s]+:\*\*\s+(.+)$/gm;
|
|
142
|
+
// Pattern C: Markdown links to entity files
|
|
143
|
+
const MD_LINK_RE = /\[([^\]]+)\]\(([^)]+\.(?:md|yaml|js))\)/g;
|
|
144
|
+
// Pattern D: Agent references
|
|
145
|
+
const AGENT_REF_RE = new RegExp('@(' + KNOWN_AGENTS.join('|') + ')\\b', 'g');
|
|
146
|
+
|
|
147
|
+
function extractYamlDependencies(filePath, entityType, verbose = false) {
|
|
148
|
+
const deps = new Set();
|
|
149
|
+
const fieldMap = YAML_DEP_FIELDS[entityType];
|
|
150
|
+
if (!fieldMap) return [];
|
|
151
|
+
|
|
152
|
+
let content;
|
|
153
|
+
try {
|
|
154
|
+
content = fs.readFileSync(filePath, 'utf8');
|
|
155
|
+
} catch {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
let doc;
|
|
160
|
+
// For MD files, extract YAML from code blocks instead of parsing the whole file
|
|
161
|
+
if (path.extname(filePath) === '.md') {
|
|
162
|
+
const yamlBlockMatch = content.match(/```yaml\n([\s\S]*?)```/);
|
|
163
|
+
if (!yamlBlockMatch) return [];
|
|
164
|
+
try {
|
|
165
|
+
doc = yaml.load(yamlBlockMatch[1]);
|
|
166
|
+
} catch {
|
|
167
|
+
console.warn(`[IDS] YAML parse warning (embedded block): ${filePath} — skipping`);
|
|
168
|
+
return [];
|
|
169
|
+
}
|
|
170
|
+
} else {
|
|
171
|
+
try {
|
|
172
|
+
doc = yaml.load(content);
|
|
173
|
+
} catch {
|
|
174
|
+
console.warn(`[IDS] YAML parse warning: ${filePath} — skipping YAML extraction`);
|
|
175
|
+
return [];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (!doc || typeof doc !== 'object') return [];
|
|
180
|
+
|
|
181
|
+
// Extract nested dependency fields (e.g., doc.dependencies.tasks)
|
|
182
|
+
const depsSection = doc.dependencies || {};
|
|
183
|
+
for (const field of fieldMap.nested) {
|
|
184
|
+
const items = depsSection[field];
|
|
185
|
+
if (Array.isArray(items)) {
|
|
186
|
+
for (const item of items) {
|
|
187
|
+
if (typeof item === 'string') {
|
|
188
|
+
const cleaned = item.replace(/#.*$/, '').trim().replace(/\.md$/, '');
|
|
189
|
+
if (!cleaned) continue;
|
|
190
|
+
if (isSentinel(cleaned)) {
|
|
191
|
+
if (verbose) console.log(`[IDS] Filtered sentinel "${cleaned}" from YAML deps in "${filePath}"`);
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (isNoise(cleaned)) {
|
|
195
|
+
if (verbose) console.log(`[IDS] Filtered noise "${cleaned}" from YAML deps in "${filePath}"`);
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
deps.add(cleaned);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Extract array fields (e.g., doc.commands[].task, doc.sequence[].agent)
|
|
205
|
+
for (const { arrayPath, field } of fieldMap.arrayFields) {
|
|
206
|
+
const arr = doc[arrayPath] || doc.workflow?.[arrayPath] || [];
|
|
207
|
+
if (Array.isArray(arr)) {
|
|
208
|
+
for (const item of arr) {
|
|
209
|
+
if (item && typeof item === 'object') {
|
|
210
|
+
const val = item[field];
|
|
211
|
+
if (typeof val === 'string' && val.trim()) {
|
|
212
|
+
deps.add(val.trim().replace(/\.md$/, ''));
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return [...deps];
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function extractMarkdownCrossReferences(content, entityId, verbose = false) {
|
|
223
|
+
const deps = new Set();
|
|
224
|
+
|
|
225
|
+
const addDep = (ref) => {
|
|
226
|
+
if (ref === entityId) return;
|
|
227
|
+
if (isSentinel(ref)) {
|
|
228
|
+
if (verbose) console.log(`[IDS] Filtered sentinel "${ref}" from MD cross-refs in "${entityId}"`);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (isNoise(ref)) {
|
|
232
|
+
if (verbose) console.log(`[IDS] Filtered noise "${ref}" from MD cross-refs in "${entityId}"`);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
deps.add(ref);
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
// Pattern A: YAML block items (- filename.md)
|
|
239
|
+
let match;
|
|
240
|
+
while ((match = YAML_BLOCK_RE.exec(content)) !== null) {
|
|
241
|
+
addDep(match[1].replace(/\.md$/, ''));
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Pattern B: Label lists (- **Tasks:** a.md, b.md)
|
|
245
|
+
while ((match = LABEL_LIST_RE.exec(content)) !== null) {
|
|
246
|
+
const items = match[1].split(/[,;]\s*/);
|
|
247
|
+
for (const item of items) {
|
|
248
|
+
const fileMatch = item.trim().match(/([\w.-]+\.(?:md|yaml|js))/);
|
|
249
|
+
if (fileMatch) {
|
|
250
|
+
addDep(fileMatch[1].replace(/\.md$/, ''));
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// Pattern C: Markdown links to entity files
|
|
256
|
+
while ((match = MD_LINK_RE.exec(content)) !== null) {
|
|
257
|
+
const linkPath = match[2];
|
|
258
|
+
const basename = path.basename(linkPath, path.extname(linkPath));
|
|
259
|
+
addDep(basename);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Pattern D: Agent references (@dev, @qa, etc.)
|
|
263
|
+
while ((match = AGENT_REF_RE.exec(content)) !== null) {
|
|
264
|
+
deps.add(match[1]);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return [...deps];
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function detectDependencies(content, entityId, verbose = false) {
|
|
78
271
|
const deps = new Set();
|
|
79
272
|
|
|
80
273
|
const requireMatches = content.matchAll(/require\s*\(\s*['"]([^'"]+)['"]\s*\)/g);
|
|
@@ -100,14 +293,23 @@ function detectDependencies(content, entityId) {
|
|
|
100
293
|
const items = depListMatch[1].matchAll(/-\s+(.+)/g);
|
|
101
294
|
for (const item of items) {
|
|
102
295
|
const dep = item[1].trim().replace(/\.md$/, '');
|
|
103
|
-
if (dep
|
|
296
|
+
if (dep === entityId) continue;
|
|
297
|
+
if (isSentinel(dep)) {
|
|
298
|
+
if (verbose) console.log(`[IDS] Filtered sentinel "${dep}" from "${entityId}"`);
|
|
299
|
+
continue;
|
|
300
|
+
}
|
|
301
|
+
if (isNoise(dep)) {
|
|
302
|
+
if (verbose) console.log(`[IDS] Filtered noise "${dep}" from "${entityId}"`);
|
|
303
|
+
continue;
|
|
304
|
+
}
|
|
305
|
+
deps.add(dep);
|
|
104
306
|
}
|
|
105
307
|
}
|
|
106
308
|
|
|
107
309
|
return [...deps];
|
|
108
310
|
}
|
|
109
311
|
|
|
110
|
-
function scanCategory(config) {
|
|
312
|
+
function scanCategory(config, verbose = false) {
|
|
111
313
|
const absBase = path.resolve(REPO_ROOT, config.basePath);
|
|
112
314
|
|
|
113
315
|
if (!fs.existsSync(absBase)) {
|
|
@@ -141,17 +343,56 @@ function scanCategory(config) {
|
|
|
141
343
|
const relPath = path.relative(REPO_ROOT, filePath).replace(/\\/g, '/');
|
|
142
344
|
const keywords = extractKeywords(filePath, content);
|
|
143
345
|
const purpose = extractPurpose(content, filePath);
|
|
144
|
-
const
|
|
346
|
+
const baseDeps = detectDependencies(content, entityId, verbose);
|
|
347
|
+
|
|
348
|
+
// Semantic YAML extraction for agents and workflows
|
|
349
|
+
const yamlCategories = ['agents', 'workflows'];
|
|
350
|
+
const yamlDeps = yamlCategories.includes(config.category)
|
|
351
|
+
? extractYamlDependencies(filePath, config.type, verbose)
|
|
352
|
+
: [];
|
|
353
|
+
|
|
354
|
+
// Markdown cross-reference extraction for tasks, checklists, templates, product-checklists
|
|
355
|
+
const mdCategories = ['tasks', 'checklists', 'templates', 'product-checklists'];
|
|
356
|
+
const mdDeps = mdCategories.includes(config.category)
|
|
357
|
+
? extractMarkdownCrossReferences(content, entityId, verbose)
|
|
358
|
+
: [];
|
|
359
|
+
|
|
360
|
+
// Merge all dependencies (deduplicated — each extractor already filters sentinel/noise)
|
|
361
|
+
const dependencies = [...new Set([...baseDeps, ...yamlDeps, ...mdDeps])];
|
|
362
|
+
|
|
363
|
+
// Extract lifecycle override from YAML frontmatter or metadata (NOG-16B AC5)
|
|
364
|
+
let lifecycleOverride = null;
|
|
365
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
366
|
+
if (frontmatterMatch) {
|
|
367
|
+
const lfMatch = frontmatterMatch[1].match(/^lifecycle:\s*(.+)$/m);
|
|
368
|
+
if (lfMatch) lifecycleOverride = lfMatch[1].trim();
|
|
369
|
+
}
|
|
370
|
+
if (!lifecycleOverride) {
|
|
371
|
+
const yamlBlockMatch = content.match(/```yaml\n([\s\S]*?)```/);
|
|
372
|
+
if (yamlBlockMatch) {
|
|
373
|
+
const lfMatch = yamlBlockMatch[1].match(/^lifecycle:\s*(.+)$/m);
|
|
374
|
+
if (lfMatch) lifecycleOverride = lfMatch[1].trim();
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
if (!lifecycleOverride) {
|
|
378
|
+
const inlineMatch = content.match(/^lifecycle:\s*(.+)$/m);
|
|
379
|
+
if (inlineMatch) lifecycleOverride = inlineMatch[1].trim();
|
|
380
|
+
}
|
|
381
|
+
|
|
145
382
|
const checksum = computeChecksum(filePath);
|
|
146
383
|
const defaultScore = ADAPTABILITY_DEFAULTS[config.type] || 0.5;
|
|
147
384
|
|
|
148
|
-
|
|
385
|
+
const entity = {
|
|
149
386
|
path: relPath,
|
|
387
|
+
layer: classifyLayer(relPath),
|
|
150
388
|
type: config.type,
|
|
151
389
|
purpose,
|
|
152
390
|
keywords,
|
|
153
391
|
usedBy: [],
|
|
154
392
|
dependencies,
|
|
393
|
+
externalDeps: [],
|
|
394
|
+
plannedDeps: [],
|
|
395
|
+
lifecycle: 'experimental',
|
|
155
396
|
adaptability: {
|
|
156
397
|
score: defaultScore,
|
|
157
398
|
constraints: [],
|
|
@@ -160,25 +401,68 @@ function scanCategory(config) {
|
|
|
160
401
|
checksum,
|
|
161
402
|
lastVerified: new Date().toISOString()
|
|
162
403
|
};
|
|
404
|
+
|
|
405
|
+
if (lifecycleOverride) {
|
|
406
|
+
entity._lifecycleOverride = lifecycleOverride;
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
entities[entityId] = entity;
|
|
163
410
|
}
|
|
164
411
|
|
|
165
412
|
return entities;
|
|
166
413
|
}
|
|
167
414
|
|
|
168
|
-
function
|
|
169
|
-
const
|
|
415
|
+
function buildNameIndex(allEntities) {
|
|
416
|
+
const nameIndex = new Map();
|
|
170
417
|
for (const [category, entities] of Object.entries(allEntities)) {
|
|
171
|
-
for (const id of Object.
|
|
172
|
-
|
|
418
|
+
for (const [id, entity] of Object.entries(entities)) {
|
|
419
|
+
nameIndex.set(id, { category, id });
|
|
420
|
+
if (entity.path) {
|
|
421
|
+
const filename = entity.path.split('/').pop();
|
|
422
|
+
if (!nameIndex.has(filename)) {
|
|
423
|
+
nameIndex.set(filename, { category, id });
|
|
424
|
+
}
|
|
425
|
+
const basename = filename.replace(/\.[^.]+$/, '');
|
|
426
|
+
if (!nameIndex.has(basename)) {
|
|
427
|
+
nameIndex.set(basename, { category, id });
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
return nameIndex;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
function countResolution(allEntities, nameIndex) {
|
|
436
|
+
let total = 0;
|
|
437
|
+
let resolved = 0;
|
|
438
|
+
for (const entities of Object.values(allEntities)) {
|
|
439
|
+
for (const entity of Object.values(entities)) {
|
|
440
|
+
for (const dep of entity.dependencies) {
|
|
441
|
+
total++;
|
|
442
|
+
if (nameIndex.has(dep)) resolved++;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
return { total, resolved, unresolved: total - resolved };
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
function resolveUsedBy(allEntities) {
|
|
450
|
+
const nameIndex = buildNameIndex(allEntities);
|
|
451
|
+
|
|
452
|
+
// Reset usedBy to avoid duplicates on re-scan
|
|
453
|
+
for (const entities of Object.values(allEntities)) {
|
|
454
|
+
for (const entity of Object.values(entities)) {
|
|
455
|
+
entity.usedBy = [];
|
|
173
456
|
}
|
|
174
457
|
}
|
|
175
458
|
|
|
459
|
+
// Build reverse references
|
|
176
460
|
for (const [category, entities] of Object.entries(allEntities)) {
|
|
177
461
|
for (const [entityId, entity] of Object.entries(entities)) {
|
|
178
|
-
for (const
|
|
179
|
-
const
|
|
180
|
-
if (
|
|
181
|
-
const usedBy = allEntities[
|
|
462
|
+
for (const depRef of entity.dependencies) {
|
|
463
|
+
const target = nameIndex.get(depRef);
|
|
464
|
+
if (target && allEntities[target.category] && allEntities[target.category][target.id]) {
|
|
465
|
+
const usedBy = allEntities[target.category][target.id].usedBy;
|
|
182
466
|
if (!usedBy.includes(entityId)) {
|
|
183
467
|
usedBy.push(entityId);
|
|
184
468
|
}
|
|
@@ -188,7 +472,57 @@ function resolveUsedBy(allEntities) {
|
|
|
188
472
|
}
|
|
189
473
|
}
|
|
190
474
|
|
|
191
|
-
function
|
|
475
|
+
function classifyDependencies(allEntities, nameIndex) {
|
|
476
|
+
for (const entities of Object.values(allEntities)) {
|
|
477
|
+
for (const entity of Object.values(entities)) {
|
|
478
|
+
const internal = [];
|
|
479
|
+
const external = [];
|
|
480
|
+
const planned = [];
|
|
481
|
+
for (const dep of entity.dependencies) {
|
|
482
|
+
if (nameIndex.has(dep)) {
|
|
483
|
+
internal.push(dep);
|
|
484
|
+
} else if (EXTERNAL_TOOLS.has(dep.toLowerCase())) {
|
|
485
|
+
external.push(dep);
|
|
486
|
+
} else {
|
|
487
|
+
planned.push(dep);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
entity.dependencies = internal;
|
|
491
|
+
entity.externalDeps = external;
|
|
492
|
+
entity.plannedDeps = planned;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
function detectLifecycle(entityId, entity) {
|
|
498
|
+
if (entity._lifecycleOverride) {
|
|
499
|
+
const val = entity._lifecycleOverride;
|
|
500
|
+
delete entity._lifecycleOverride;
|
|
501
|
+
return val;
|
|
502
|
+
}
|
|
503
|
+
for (const pat of DEPRECATED_PATTERNS) {
|
|
504
|
+
if (pat.test(entityId)) return 'deprecated';
|
|
505
|
+
}
|
|
506
|
+
const hasDeps = entity.dependencies.length > 0 ||
|
|
507
|
+
(entity.externalDeps && entity.externalDeps.length > 0) ||
|
|
508
|
+
(entity.plannedDeps && entity.plannedDeps.length > 0);
|
|
509
|
+
const hasUsedBy = entity.usedBy.length > 0;
|
|
510
|
+
if (!hasDeps && !hasUsedBy) return 'orphan';
|
|
511
|
+
if (hasUsedBy) return 'production';
|
|
512
|
+
return 'experimental';
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
function assignLifecycles(allEntities) {
|
|
516
|
+
for (const [, entities] of Object.entries(allEntities)) {
|
|
517
|
+
for (const [entityId, entity] of Object.entries(entities)) {
|
|
518
|
+
entity.lifecycle = detectLifecycle(entityId, entity);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
function populate(options = {}) {
|
|
524
|
+
const verbose = options.verbose || process.argv.includes('--verbose') || process.env.AIOS_DEBUG === 'true';
|
|
525
|
+
|
|
192
526
|
console.log('[IDS] Starting entity registry population...');
|
|
193
527
|
|
|
194
528
|
const allEntities = {};
|
|
@@ -196,16 +530,53 @@ function populate() {
|
|
|
196
530
|
|
|
197
531
|
for (const config of SCAN_CONFIG) {
|
|
198
532
|
console.log(`[IDS] Scanning ${config.category} in ${config.basePath}...`);
|
|
199
|
-
const entities = scanCategory(config);
|
|
533
|
+
const entities = scanCategory(config, verbose);
|
|
200
534
|
const count = Object.keys(entities).length;
|
|
201
535
|
allEntities[config.category] = entities;
|
|
202
536
|
totalCount += count;
|
|
203
537
|
console.log(`[IDS] Found ${count} ${config.category}`);
|
|
204
538
|
}
|
|
205
539
|
|
|
540
|
+
// Preserve invocationExamples from existing registry (TOK-4B)
|
|
541
|
+
// invocationExamples are manually curated and must survive re-population.
|
|
542
|
+
// Limits: max 3 examples per entity, max 200 tokens per example (ADR-5).
|
|
543
|
+
try {
|
|
544
|
+
const existingYaml = fs.readFileSync(REGISTRY_PATH, 'utf8');
|
|
545
|
+
const existingRegistry = yaml.load(existingYaml);
|
|
546
|
+
if (existingRegistry && existingRegistry.entities) {
|
|
547
|
+
for (const [category, entities] of Object.entries(existingRegistry.entities)) {
|
|
548
|
+
if (!allEntities[category]) continue;
|
|
549
|
+
for (const [entityId, entity] of Object.entries(entities)) {
|
|
550
|
+
if (entity.invocationExamples && Array.isArray(entity.invocationExamples) && allEntities[category][entityId]) {
|
|
551
|
+
// Enforce limits: max 3 examples, each max 200 chars
|
|
552
|
+
const examples = entity.invocationExamples.slice(0, 3).map((e) => String(e).slice(0, 200));
|
|
553
|
+
allEntities[category][entityId].invocationExamples = examples;
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
console.log('[IDS] Preserved invocationExamples from existing registry');
|
|
558
|
+
}
|
|
559
|
+
} catch {
|
|
560
|
+
// No existing registry or parse error — skip preservation
|
|
561
|
+
}
|
|
562
|
+
|
|
206
563
|
console.log('[IDS] Resolving usedBy relationships...');
|
|
207
564
|
resolveUsedBy(allEntities);
|
|
208
565
|
|
|
566
|
+
// Classify dependencies into internal, external, planned (NOG-16B)
|
|
567
|
+
const nameIndex = buildNameIndex(allEntities);
|
|
568
|
+
console.log('[IDS] Classifying dependencies (internal/external/planned)...');
|
|
569
|
+
classifyDependencies(allEntities, nameIndex);
|
|
570
|
+
|
|
571
|
+
// Assign lifecycle states (NOG-16B)
|
|
572
|
+
console.log('[IDS] Detecting entity lifecycle states...');
|
|
573
|
+
assignLifecycles(allEntities);
|
|
574
|
+
|
|
575
|
+
// Resolution rate metric (uses internal deps only after classification)
|
|
576
|
+
const { total, resolved, unresolved } = countResolution(allEntities, nameIndex);
|
|
577
|
+
const rate = total > 0 ? Math.round(resolved / total * 100) : 0;
|
|
578
|
+
console.log(`[IDS] Resolution rate: ${rate}% (${resolved}/${total} deps resolved, ${unresolved} unresolved)`);
|
|
579
|
+
|
|
209
580
|
const categories = SCAN_CONFIG.map((c) => ({
|
|
210
581
|
id: c.category,
|
|
211
582
|
description: getCategoryDescription(c.category),
|
|
@@ -217,7 +588,8 @@ function populate() {
|
|
|
217
588
|
version: '1.0.0',
|
|
218
589
|
lastUpdated: new Date().toISOString(),
|
|
219
590
|
entityCount: totalCount,
|
|
220
|
-
checksumAlgorithm: 'sha256'
|
|
591
|
+
checksumAlgorithm: 'sha256',
|
|
592
|
+
resolutionRate: rate
|
|
221
593
|
},
|
|
222
594
|
entities: allEntities,
|
|
223
595
|
categories
|
|
@@ -248,7 +620,14 @@ function getCategoryDescription(category) {
|
|
|
248
620
|
modules: 'Core framework modules and libraries',
|
|
249
621
|
agents: 'Agent persona definitions and configurations',
|
|
250
622
|
checklists: 'Validation and review checklists',
|
|
251
|
-
data: 'Configuration and reference data files'
|
|
623
|
+
data: 'Configuration and reference data files',
|
|
624
|
+
workflows: 'Multi-phase orchestration workflows',
|
|
625
|
+
utils: 'Shared utility libraries and helpers',
|
|
626
|
+
tools: 'Development tool definitions and configurations',
|
|
627
|
+
'infra-scripts': 'Infrastructure automation and utility scripts',
|
|
628
|
+
'infra-tools': 'Infrastructure tool definitions and configurations',
|
|
629
|
+
'product-checklists': 'Product validation and review checklists',
|
|
630
|
+
'product-data': 'Product reference data and configuration files'
|
|
252
631
|
};
|
|
253
632
|
return descriptions[category] || category;
|
|
254
633
|
}
|
|
@@ -271,10 +650,24 @@ module.exports = {
|
|
|
271
650
|
extractKeywords,
|
|
272
651
|
extractPurpose,
|
|
273
652
|
detectDependencies,
|
|
653
|
+
extractYamlDependencies,
|
|
654
|
+
extractMarkdownCrossReferences,
|
|
274
655
|
computeChecksum,
|
|
275
656
|
resolveUsedBy,
|
|
657
|
+
buildNameIndex,
|
|
658
|
+
countResolution,
|
|
659
|
+
classifyDependencies,
|
|
660
|
+
detectLifecycle,
|
|
661
|
+
assignLifecycles,
|
|
662
|
+
isSentinel,
|
|
663
|
+
isNoise,
|
|
276
664
|
SCAN_CONFIG,
|
|
277
665
|
ADAPTABILITY_DEFAULTS,
|
|
666
|
+
SENTINEL_VALUES,
|
|
667
|
+
YAML_DEP_FIELDS,
|
|
668
|
+
KNOWN_AGENTS,
|
|
669
|
+
EXTERNAL_TOOLS,
|
|
670
|
+
DEPRECATED_PATTERNS,
|
|
278
671
|
REPO_ROOT,
|
|
279
672
|
REGISTRY_PATH
|
|
280
673
|
};
|
|
@@ -47,12 +47,14 @@ const yaml = require('js-yaml');
|
|
|
47
47
|
const GreetingBuilder = require('./greeting-builder');
|
|
48
48
|
const { AgentConfigLoader } = require('./agent-config-loader');
|
|
49
49
|
const SessionContextLoader = require('../../core/session/context-loader');
|
|
50
|
-
|
|
50
|
+
// NOG-18: loadProjectStatus removed — gitStatus is native in Claude Code system prompt.
|
|
51
|
+
// const { loadProjectStatus } = require('../../infrastructure/scripts/project-status-loader');
|
|
51
52
|
const GitConfigDetector = require('../../infrastructure/scripts/git-config-detector');
|
|
52
53
|
const { PermissionMode } = require('../../core/permissions');
|
|
53
54
|
const GreetingPreferenceManager = require('./greeting-preference-manager');
|
|
54
55
|
const ContextDetector = require('../../core/session/context-detector');
|
|
55
56
|
const WorkflowNavigator = require('./workflow-navigator');
|
|
57
|
+
const { atomicWriteSync } = require('../../core/synapse/utils/atomic-write');
|
|
56
58
|
// BUG-1 fix (INS-1): Graceful degradation when pro-detector is not available
|
|
57
59
|
// In installed projects, bin/utils/pro-detector.js does not exist
|
|
58
60
|
let isProAvailable, loadProModule;
|
|
@@ -82,9 +84,9 @@ const LOADER_TIERS = {
|
|
|
82
84
|
description: 'Permission badge + branch name — visually degraded without these',
|
|
83
85
|
},
|
|
84
86
|
bestEffort: {
|
|
85
|
-
loaders: ['sessionContext'
|
|
87
|
+
loaders: ['sessionContext'],
|
|
86
88
|
timeout: 180,
|
|
87
|
-
description: 'Session awareness
|
|
89
|
+
description: 'Session awareness — greeting works fine without this. NOG-18: projectStatus removed (native gitStatus)',
|
|
88
90
|
},
|
|
89
91
|
};
|
|
90
92
|
|
|
@@ -279,15 +281,16 @@ class UnifiedActivationPipeline {
|
|
|
279
281
|
const elapsedAfterT2 = Date.now() - pipelineStart;
|
|
280
282
|
const tier3Remaining = Math.max(tier3Budget - elapsedAfterT2, 20);
|
|
281
283
|
|
|
282
|
-
|
|
284
|
+
// NOG-18: projectStatus loader removed — gitStatus is native in Claude Code system prompt.
|
|
285
|
+
// The loadProjectStatus() function ran 5+ git commands (~76ms) duplicating native features.
|
|
286
|
+
// GreetingBuilder handles projectStatus: null gracefully (null-checks everywhere).
|
|
287
|
+
const [sessionContext] = await Promise.all([
|
|
283
288
|
this._profileLoader('sessionContext', metrics, tier3Remaining, () => {
|
|
284
289
|
const loader = new SessionContextLoader();
|
|
285
290
|
return loader.loadContext(agentId);
|
|
286
291
|
}),
|
|
287
|
-
this._profileLoader('projectStatus', metrics, tier3Remaining, () => {
|
|
288
|
-
return loadProjectStatus();
|
|
289
|
-
}),
|
|
290
292
|
]);
|
|
293
|
+
const projectStatus = null;
|
|
291
294
|
|
|
292
295
|
// --- Sequential steps with data dependencies ---
|
|
293
296
|
|
|
@@ -710,7 +713,7 @@ class UnifiedActivationPipeline {
|
|
|
710
713
|
};
|
|
711
714
|
|
|
712
715
|
const bridgePath = path.join(sessionsDir, '_active-agent.json');
|
|
713
|
-
|
|
716
|
+
atomicWriteSync(bridgePath, JSON.stringify(bridgeData, null, 2));
|
|
714
717
|
|
|
715
718
|
const duration = Date.now() - start;
|
|
716
719
|
metrics.loaders.synapseSession = { duration, status: 'ok', start, end: start + duration };
|
|
@@ -756,9 +759,9 @@ class UnifiedActivationPipeline {
|
|
|
756
759
|
status: info.status || 'unknown',
|
|
757
760
|
};
|
|
758
761
|
}
|
|
759
|
-
|
|
762
|
+
atomicWriteSync(
|
|
760
763
|
path.join(metricsDir, 'uap-metrics.json'),
|
|
761
|
-
JSON.stringify(data, null, 2),
|
|
764
|
+
JSON.stringify(data, null, 2),
|
|
762
765
|
);
|
|
763
766
|
} catch {
|
|
764
767
|
// Fire-and-forget: never block the activation pipeline
|
|
@@ -792,3 +795,21 @@ module.exports = {
|
|
|
792
795
|
// ACT-12: Single English fallback (language delegated to Claude Code settings.json)
|
|
793
796
|
FALLBACK_PHRASE,
|
|
794
797
|
};
|
|
798
|
+
|
|
799
|
+
// CLI entrypoint: `node unified-activation-pipeline.js <agentId>`
|
|
800
|
+
if (require.main === module) {
|
|
801
|
+
const agentId = process.argv[2];
|
|
802
|
+
if (!agentId || !ALL_AGENT_IDS.includes(agentId)) {
|
|
803
|
+
console.error(`Usage: node unified-activation-pipeline.js <agentId>\nValid agents: ${ALL_AGENT_IDS.join(', ')}`);
|
|
804
|
+
process.exit(1);
|
|
805
|
+
}
|
|
806
|
+
UnifiedActivationPipeline.activate(agentId)
|
|
807
|
+
.then(result => {
|
|
808
|
+
console.log(result.greeting);
|
|
809
|
+
process.exit(0);
|
|
810
|
+
})
|
|
811
|
+
.catch(err => {
|
|
812
|
+
console.error(`Activation error: ${err.message}`);
|
|
813
|
+
process.exit(1);
|
|
814
|
+
});
|
|
815
|
+
}
|