@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
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/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extension Registry
|
|
3
|
+
*
|
|
4
|
+
* Provides efficient storage, indexing, and retrieval of AIWG extensions.
|
|
5
|
+
* Supports O(1) lookup by ID, type-based indexing, and command alias resolution.
|
|
6
|
+
*
|
|
7
|
+
* @architecture @.aiwg/architecture/unified-extension-schema.md
|
|
8
|
+
* @tests @test/unit/extensions/registry.test.ts
|
|
9
|
+
* @version 1.0.0
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Extension registry for storing and querying extensions
|
|
13
|
+
*
|
|
14
|
+
* Maintains multiple indexes for efficient lookup:
|
|
15
|
+
* - Primary storage: Map<id, Extension> for O(1) lookup by ID
|
|
16
|
+
* - Type index: Map<type, Set<id>> for filtering by type
|
|
17
|
+
* - Alias map: Map<alias, id> for command resolution
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const registry = new ExtensionRegistry();
|
|
22
|
+
*
|
|
23
|
+
* // Register an extension
|
|
24
|
+
* registry.register(myExtension);
|
|
25
|
+
*
|
|
26
|
+
* // Lookup by ID (O(1))
|
|
27
|
+
* const ext = registry.get('mention-wire');
|
|
28
|
+
*
|
|
29
|
+
* // Get all commands
|
|
30
|
+
* const commands = registry.getByType('command');
|
|
31
|
+
*
|
|
32
|
+
* // Resolve command alias
|
|
33
|
+
* const id = registry.resolveCommand('wire'); // Returns 'mention-wire'
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export class ExtensionRegistry {
|
|
37
|
+
/**
|
|
38
|
+
* Primary storage: extension ID to Extension
|
|
39
|
+
*
|
|
40
|
+
* Provides O(1) lookup by ID.
|
|
41
|
+
*/
|
|
42
|
+
extensions = new Map();
|
|
43
|
+
/**
|
|
44
|
+
* Type index: extension type to Set of extension IDs
|
|
45
|
+
*
|
|
46
|
+
* Enables efficient filtering by type.
|
|
47
|
+
*/
|
|
48
|
+
byType = new Map();
|
|
49
|
+
/**
|
|
50
|
+
* Alias map: command alias to extension ID
|
|
51
|
+
*
|
|
52
|
+
* Enables O(1) command resolution by name or alias.
|
|
53
|
+
*/
|
|
54
|
+
aliasMap = new Map();
|
|
55
|
+
/**
|
|
56
|
+
* Qualified name map: `{namespace}-{id}` to extension ID
|
|
57
|
+
*
|
|
58
|
+
* Enables lookup by canonical namespaced slug (e.g. `aiwg-sync` → `sync`).
|
|
59
|
+
* Only populated for skills/commands that carry a `namespace` field.
|
|
60
|
+
*/
|
|
61
|
+
qualifiedNameMap = new Map();
|
|
62
|
+
/**
|
|
63
|
+
* Register an extension in the registry
|
|
64
|
+
*
|
|
65
|
+
* If an extension with the same ID already exists, it will be replaced.
|
|
66
|
+
* Automatically updates type index and registers command aliases.
|
|
67
|
+
*
|
|
68
|
+
* @param extension - Extension to register
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* registry.register({
|
|
73
|
+
* id: 'mention-wire',
|
|
74
|
+
* type: 'command',
|
|
75
|
+
* name: 'Mention Wire',
|
|
76
|
+
* // ... other fields
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
register(extension) {
|
|
81
|
+
const { id } = extension;
|
|
82
|
+
// If extension already exists, remove it from old type index
|
|
83
|
+
const existing = this.extensions.get(id);
|
|
84
|
+
if (existing) {
|
|
85
|
+
this.removeFromTypeIndex(existing);
|
|
86
|
+
}
|
|
87
|
+
// Store extension
|
|
88
|
+
this.extensions.set(id, extension);
|
|
89
|
+
// Add to type index
|
|
90
|
+
this.addToTypeIndex(extension);
|
|
91
|
+
// Register command aliases if present
|
|
92
|
+
if ((extension.type === 'command' || extension.type === 'skill') && 'aliases' in extension.metadata) {
|
|
93
|
+
const aliases = extension.metadata.aliases;
|
|
94
|
+
if (Array.isArray(aliases)) {
|
|
95
|
+
aliases.forEach((alias) => {
|
|
96
|
+
this.registerAlias(alias, id);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Register primary command/skill name
|
|
101
|
+
if (extension.type === 'command' || extension.type === 'skill') {
|
|
102
|
+
this.aliasMap.set(id, id);
|
|
103
|
+
}
|
|
104
|
+
// Register qualified name for namespaced skills/commands
|
|
105
|
+
if ((extension.type === 'skill' || extension.type === 'command') && 'namespace' in extension.metadata) {
|
|
106
|
+
const namespace = extension.metadata.namespace;
|
|
107
|
+
if (namespace) {
|
|
108
|
+
const prefix = `${namespace}-`;
|
|
109
|
+
const qualifiedName = id.startsWith(prefix) ? id : `${prefix}${id}`;
|
|
110
|
+
this.qualifiedNameMap.set(qualifiedName, id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Get extension by ID
|
|
116
|
+
*
|
|
117
|
+
* O(1) lookup via Map.
|
|
118
|
+
*
|
|
119
|
+
* @param id - Extension ID
|
|
120
|
+
* @returns Extension if found, undefined otherwise
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```typescript
|
|
124
|
+
* const ext = registry.get('mention-wire');
|
|
125
|
+
* if (ext) {
|
|
126
|
+
* console.log(ext.name);
|
|
127
|
+
* }
|
|
128
|
+
* ```
|
|
129
|
+
*/
|
|
130
|
+
get(id) {
|
|
131
|
+
return this.extensions.get(id);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get all extensions of a specific type
|
|
135
|
+
*
|
|
136
|
+
* Uses type index for efficient filtering.
|
|
137
|
+
*
|
|
138
|
+
* @param type - Extension type to filter by
|
|
139
|
+
* @returns Array of extensions of the specified type
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```typescript
|
|
143
|
+
* const commands = registry.getByType('command');
|
|
144
|
+
* const agents = registry.getByType('agent');
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
getByType(type) {
|
|
148
|
+
const ids = this.byType.get(type);
|
|
149
|
+
if (!ids || ids.size === 0) {
|
|
150
|
+
return [];
|
|
151
|
+
}
|
|
152
|
+
const extensions = [];
|
|
153
|
+
for (const id of ids) {
|
|
154
|
+
const ext = this.extensions.get(id);
|
|
155
|
+
if (ext) {
|
|
156
|
+
extensions.push(ext);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return extensions;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Resolve a command name or alias to extension ID
|
|
163
|
+
*
|
|
164
|
+
* O(1) lookup via Map.
|
|
165
|
+
*
|
|
166
|
+
* @param command - Command name or alias
|
|
167
|
+
* @returns Extension ID if found, undefined otherwise
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```typescript
|
|
171
|
+
* const id = registry.resolveCommand('wire'); // 'mention-wire'
|
|
172
|
+
* const ext = registry.get(id);
|
|
173
|
+
* ```
|
|
174
|
+
*/
|
|
175
|
+
resolveCommand(command) {
|
|
176
|
+
return this.aliasMap.get(command);
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Register a command alias
|
|
180
|
+
*
|
|
181
|
+
* Associates an alias with an extension ID. The extension does not
|
|
182
|
+
* need to be registered first.
|
|
183
|
+
*
|
|
184
|
+
* @param alias - Command alias
|
|
185
|
+
* @param extensionId - Target extension ID
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* registry.registerAlias('wire', 'mention-wire');
|
|
190
|
+
* registry.registerAlias('w', 'mention-wire');
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
registerAlias(alias, extensionId) {
|
|
194
|
+
this.aliasMap.set(alias, extensionId);
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Resolve a qualified namespaced name to an extension ID.
|
|
198
|
+
*
|
|
199
|
+
* Accepts either the canonical qualified slug (`aiwg-sync`) or the bare ID (`sync`).
|
|
200
|
+
* Falls back to bare ID lookup when no qualified name match is found.
|
|
201
|
+
*
|
|
202
|
+
* @param qualifiedName - Qualified skill name (e.g. `aiwg-sync`) or bare ID
|
|
203
|
+
* @returns Extension ID if found, undefined otherwise
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```typescript
|
|
207
|
+
* const id = registry.resolveQualifiedName('aiwg-sync'); // 'sync'
|
|
208
|
+
* const ext = registry.get(id);
|
|
209
|
+
* ```
|
|
210
|
+
*/
|
|
211
|
+
resolveQualifiedName(qualifiedName) {
|
|
212
|
+
return this.qualifiedNameMap.get(qualifiedName) ?? this.extensions.get(qualifiedName)?.id;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get all registered extensions
|
|
216
|
+
*
|
|
217
|
+
* Returns a new array containing all extensions. Modifications to the
|
|
218
|
+
* returned array will not affect the registry.
|
|
219
|
+
*
|
|
220
|
+
* @returns Array of all extensions
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```typescript
|
|
224
|
+
* const all = registry.getAll();
|
|
225
|
+
* console.log(`Registry contains ${all.length} extensions`);
|
|
226
|
+
* ```
|
|
227
|
+
*/
|
|
228
|
+
getAll() {
|
|
229
|
+
return Array.from(this.extensions.values());
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Get count of registered extensions
|
|
233
|
+
*
|
|
234
|
+
* @returns Number of extensions in the registry
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* console.log(`${registry.size} extensions registered`);
|
|
239
|
+
* ```
|
|
240
|
+
*/
|
|
241
|
+
get size() {
|
|
242
|
+
return this.extensions.size;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Check if extension exists in registry
|
|
246
|
+
*
|
|
247
|
+
* O(1) lookup via Map.
|
|
248
|
+
*
|
|
249
|
+
* @param id - Extension ID to check
|
|
250
|
+
* @returns True if extension exists, false otherwise
|
|
251
|
+
*
|
|
252
|
+
* @example
|
|
253
|
+
* ```typescript
|
|
254
|
+
* if (registry.has('mention-wire')) {
|
|
255
|
+
* console.log('Extension is registered');
|
|
256
|
+
* }
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
has(id) {
|
|
260
|
+
return this.extensions.has(id);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Clear the registry
|
|
264
|
+
*
|
|
265
|
+
* Removes all extensions, type index entries, and aliases.
|
|
266
|
+
*
|
|
267
|
+
* @example
|
|
268
|
+
* ```typescript
|
|
269
|
+
* registry.clear();
|
|
270
|
+
* console.log(registry.size); // 0
|
|
271
|
+
* ```
|
|
272
|
+
*/
|
|
273
|
+
clear() {
|
|
274
|
+
this.extensions.clear();
|
|
275
|
+
this.byType.clear();
|
|
276
|
+
this.aliasMap.clear();
|
|
277
|
+
this.qualifiedNameMap.clear();
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Add extension to type index
|
|
281
|
+
*
|
|
282
|
+
* @private
|
|
283
|
+
* @param extension - Extension to index
|
|
284
|
+
*/
|
|
285
|
+
addToTypeIndex(extension) {
|
|
286
|
+
const { id, type } = extension;
|
|
287
|
+
let typeSet = this.byType.get(type);
|
|
288
|
+
if (!typeSet) {
|
|
289
|
+
typeSet = new Set();
|
|
290
|
+
this.byType.set(type, typeSet);
|
|
291
|
+
}
|
|
292
|
+
typeSet.add(id);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Remove extension from type index
|
|
296
|
+
*
|
|
297
|
+
* @private
|
|
298
|
+
* @param extension - Extension to remove from index
|
|
299
|
+
*/
|
|
300
|
+
removeFromTypeIndex(extension) {
|
|
301
|
+
const { id, type } = extension;
|
|
302
|
+
const typeSet = this.byType.get(type);
|
|
303
|
+
if (typeSet) {
|
|
304
|
+
typeSet.delete(id);
|
|
305
|
+
// Clean up empty sets
|
|
306
|
+
if (typeSet.size === 0) {
|
|
307
|
+
this.byType.delete(type);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
// ============================================
|
|
313
|
+
// Singleton Instance
|
|
314
|
+
// ============================================
|
|
315
|
+
/**
|
|
316
|
+
* Global registry instance
|
|
317
|
+
*
|
|
318
|
+
* Singleton instance shared across all calls to getRegistry().
|
|
319
|
+
*/
|
|
320
|
+
let globalRegistry = null;
|
|
321
|
+
/**
|
|
322
|
+
* Get the global registry instance
|
|
323
|
+
*
|
|
324
|
+
* Returns a singleton ExtensionRegistry instance. All calls to this
|
|
325
|
+
* function return the same instance, allowing state to be shared
|
|
326
|
+
* across the application.
|
|
327
|
+
*
|
|
328
|
+
* @returns Global ExtensionRegistry instance
|
|
329
|
+
*
|
|
330
|
+
* @example
|
|
331
|
+
* ```typescript
|
|
332
|
+
* import { getRegistry } from './registry.js';
|
|
333
|
+
*
|
|
334
|
+
* const registry = getRegistry();
|
|
335
|
+
* registry.register(myExtension);
|
|
336
|
+
*
|
|
337
|
+
* // Later, in another module
|
|
338
|
+
* const sameRegistry = getRegistry();
|
|
339
|
+
* console.log(sameRegistry.has('my-extension')); // true
|
|
340
|
+
* ```
|
|
341
|
+
*/
|
|
342
|
+
export function getRegistry() {
|
|
343
|
+
if (!globalRegistry) {
|
|
344
|
+
globalRegistry = new ExtensionRegistry();
|
|
345
|
+
}
|
|
346
|
+
return globalRegistry;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Create a new registry instance
|
|
350
|
+
*
|
|
351
|
+
* Returns a new, independent ExtensionRegistry instance. Use this when
|
|
352
|
+
* you need an isolated registry for testing or scoped operations.
|
|
353
|
+
*
|
|
354
|
+
* @returns New ExtensionRegistry instance
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```typescript
|
|
358
|
+
* import { createRegistry } from './registry.js';
|
|
359
|
+
*
|
|
360
|
+
* const testRegistry = createRegistry();
|
|
361
|
+
* testRegistry.register(testExtension);
|
|
362
|
+
* // testRegistry is independent of global registry
|
|
363
|
+
* ```
|
|
364
|
+
*/
|
|
365
|
+
export function createRegistry() {
|
|
366
|
+
return new ExtensionRegistry();
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shadow Resolver
|
|
3
|
+
*
|
|
4
|
+
* Implements the override / shadow-resolution policy from
|
|
5
|
+
* `.aiwg/architecture/adr-override-shadow-policy.md` (#1041) for project-local
|
|
6
|
+
* artifact bundles deployed via `aiwg use` / `aiwg refresh`.
|
|
7
|
+
*
|
|
8
|
+
* Resolves the seven cases from ADR §4:
|
|
9
|
+
*
|
|
10
|
+
* 1. No collision — deploy normally
|
|
11
|
+
* 2. Non-safety-critical shadow — deploy + warn
|
|
12
|
+
* 3. Safety-critical shadow with `overrides:` declaration — deploy + prominent warn
|
|
13
|
+
* 4. Safety-critical shadow without `overrides:` — REFUSE
|
|
14
|
+
* 5. Phantom override (declared override has no upstream match) — REFUSE
|
|
15
|
+
* 6. Two project-local bundles export the same id — REFUSE both
|
|
16
|
+
* 7. git-installed source collides with project-local — same as 2/3/4 against cache
|
|
17
|
+
*
|
|
18
|
+
* Inputs: the project-local bundles (from `discoverProjectLocalBundles`) and
|
|
19
|
+
* an upstream registry (from `buildUpstreamRegistry`). Outputs a per-artifact
|
|
20
|
+
* verdict that the deployment pipeline consumes to decide what to write to
|
|
21
|
+
* provider paths.
|
|
22
|
+
*
|
|
23
|
+
* @implements #1036
|
|
24
|
+
*/
|
|
25
|
+
import { readdir, readFile, stat } from 'fs/promises';
|
|
26
|
+
import { join, basename } from 'path';
|
|
27
|
+
const ARTIFACT_DIRS = {
|
|
28
|
+
agents: 'agent',
|
|
29
|
+
skills: 'skill',
|
|
30
|
+
rules: 'rule',
|
|
31
|
+
commands: 'command',
|
|
32
|
+
};
|
|
33
|
+
const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---/;
|
|
34
|
+
const ID_LINE_RE = /^id\s*:\s*['"]?([^'"\n]+?)['"]?\s*$/m;
|
|
35
|
+
const NAME_LINE_RE = /^name\s*:\s*['"]?([^'"\n]+?)['"]?\s*$/m;
|
|
36
|
+
function parseId(raw) {
|
|
37
|
+
const m = FRONTMATTER_RE.exec(raw);
|
|
38
|
+
if (!m)
|
|
39
|
+
return {};
|
|
40
|
+
return {
|
|
41
|
+
id: ID_LINE_RE.exec(m[1])?.[1]?.trim(),
|
|
42
|
+
name: NAME_LINE_RE.exec(m[1])?.[1]?.trim(),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/** Enumerate the artifacts a project-local bundle would deploy by walking its
|
|
46
|
+
* source `agents/`, `skills/`, `rules/`, `commands/` subdirs — same pattern as
|
|
47
|
+
* `deployOneProjectLocalBundle` and `countBundleSourceArtifacts` in use.ts. */
|
|
48
|
+
export async function enumerateBundleArtifacts(bundlePath) {
|
|
49
|
+
const out = [];
|
|
50
|
+
for (const [dirName, type] of Object.entries(ARTIFACT_DIRS)) {
|
|
51
|
+
const artifactDir = join(bundlePath, dirName);
|
|
52
|
+
let entries;
|
|
53
|
+
try {
|
|
54
|
+
entries = await readdir(artifactDir);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (type === 'skill') {
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const skillDir = join(artifactDir, entry);
|
|
62
|
+
try {
|
|
63
|
+
const st = await stat(skillDir);
|
|
64
|
+
if (!st.isDirectory())
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
let id = entry;
|
|
71
|
+
try {
|
|
72
|
+
const skillMd = await readFile(join(skillDir, 'SKILL.md'), 'utf-8');
|
|
73
|
+
const fm = parseId(skillMd);
|
|
74
|
+
id = fm.name ?? fm.id ?? entry;
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// No SKILL.md — fall back to dir name
|
|
78
|
+
}
|
|
79
|
+
out.push({ id, type, sourcePath: skillDir });
|
|
80
|
+
}
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
for (const entry of entries) {
|
|
84
|
+
if (!entry.endsWith('.md'))
|
|
85
|
+
continue;
|
|
86
|
+
if (entry === 'README.md' || entry === 'RULES-INDEX.md' || entry === 'INDEX.md')
|
|
87
|
+
continue;
|
|
88
|
+
const filePath = join(artifactDir, entry);
|
|
89
|
+
let id = basename(entry, '.md');
|
|
90
|
+
try {
|
|
91
|
+
const raw = await readFile(filePath, 'utf-8');
|
|
92
|
+
const fm = parseId(raw);
|
|
93
|
+
id = fm.id ?? fm.name ?? id;
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Read failure — fall back to filename
|
|
97
|
+
}
|
|
98
|
+
out.push({ id, type, sourcePath: filePath });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return out;
|
|
102
|
+
}
|
|
103
|
+
/** Resolve overrides + shadows for a set of project-local bundles against an
|
|
104
|
+
* upstream registry. Pure function — no filesystem side effects beyond reading
|
|
105
|
+
* the bundle artifact files for id extraction. */
|
|
106
|
+
export async function resolveShadows(bundles, upstream, options = {}) {
|
|
107
|
+
const strictPhantomOverrides = options.strictPhantomOverrides ?? true;
|
|
108
|
+
const resolutions = [];
|
|
109
|
+
const blockedBundleIds = new Set();
|
|
110
|
+
// Pre-pass: case 6 — duplicate project-local bundle ids (cross-bundle, by
|
|
111
|
+
// artifact id+type). Discovery already rejects same-type duplicate bundle
|
|
112
|
+
// ids (#1041 §4 case 6 at the bundle level); here we additionally guard
|
|
113
|
+
// against two distinct bundles exporting an artifact with the same id+type.
|
|
114
|
+
const projectLocalArtifacts = new Map();
|
|
115
|
+
// Enumerate every artifact in every bundle once.
|
|
116
|
+
const enumerated = [];
|
|
117
|
+
for (const bundle of bundles) {
|
|
118
|
+
const arts = await enumerateBundleArtifacts(bundle.bundlePath);
|
|
119
|
+
enumerated.push({ bundle, arts });
|
|
120
|
+
for (const art of arts) {
|
|
121
|
+
const key = `${art.type}:${art.id}`;
|
|
122
|
+
const list = projectLocalArtifacts.get(key) ?? [];
|
|
123
|
+
list.push({ bundle, art });
|
|
124
|
+
projectLocalArtifacts.set(key, list);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const { bundle, arts } of enumerated) {
|
|
128
|
+
const declaredOverrides = new Set(bundle.manifest.overrides ?? []);
|
|
129
|
+
// Case 5 pre-pass: validate every declared override resolves to *some*
|
|
130
|
+
// upstream artifact (any type). Phantom overrides refuse the bundle.
|
|
131
|
+
for (const overrideId of declaredOverrides) {
|
|
132
|
+
if (!upstream.byId.has(overrideId)) {
|
|
133
|
+
resolutions.push({
|
|
134
|
+
bundleId: bundle.id,
|
|
135
|
+
bundleLocalPath: bundle.localPath,
|
|
136
|
+
artifactId: overrideId,
|
|
137
|
+
artifactType: 'rule', // unknown — picked nominal type for surface
|
|
138
|
+
artifactSourcePath: bundle.manifestPath,
|
|
139
|
+
verdict: 'refuse-phantom',
|
|
140
|
+
message: `Phantom override: '${overrideId}' declared in ${bundle.manifestPath} but no upstream artifact has that id.`,
|
|
141
|
+
blocking: strictPhantomOverrides,
|
|
142
|
+
prominent: false,
|
|
143
|
+
});
|
|
144
|
+
if (strictPhantomOverrides)
|
|
145
|
+
blockedBundleIds.add(bundle.id);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
for (const art of arts) {
|
|
149
|
+
const key = `${art.type}:${art.id}`;
|
|
150
|
+
// Case 6 — duplicate project-local artifact id+type across bundles
|
|
151
|
+
const projectLocalGroup = projectLocalArtifacts.get(key) ?? [];
|
|
152
|
+
if (projectLocalGroup.length > 1) {
|
|
153
|
+
const others = projectLocalGroup
|
|
154
|
+
.filter((p) => p.bundle.id !== bundle.id)
|
|
155
|
+
.map((p) => p.bundle.localPath);
|
|
156
|
+
resolutions.push({
|
|
157
|
+
bundleId: bundle.id,
|
|
158
|
+
bundleLocalPath: bundle.localPath,
|
|
159
|
+
artifactId: art.id,
|
|
160
|
+
artifactType: art.type,
|
|
161
|
+
artifactSourcePath: art.sourcePath,
|
|
162
|
+
verdict: 'refuse-duplicate',
|
|
163
|
+
message: `Duplicate project-local ${art.type} '${art.id}' also exported by: ${others.join(', ')}`,
|
|
164
|
+
blocking: true,
|
|
165
|
+
prominent: false,
|
|
166
|
+
});
|
|
167
|
+
blockedBundleIds.add(bundle.id);
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
const upstreamMatch = upstream.byKey.get(key);
|
|
171
|
+
// Case 1 — no collision
|
|
172
|
+
if (!upstreamMatch) {
|
|
173
|
+
resolutions.push({
|
|
174
|
+
bundleId: bundle.id,
|
|
175
|
+
bundleLocalPath: bundle.localPath,
|
|
176
|
+
artifactId: art.id,
|
|
177
|
+
artifactType: art.type,
|
|
178
|
+
artifactSourcePath: art.sourcePath,
|
|
179
|
+
verdict: 'deploy',
|
|
180
|
+
message: '',
|
|
181
|
+
blocking: false,
|
|
182
|
+
prominent: false,
|
|
183
|
+
});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
const acknowledged = declaredOverrides.has(art.id);
|
|
187
|
+
if (upstreamMatch.safetyCritical) {
|
|
188
|
+
if (acknowledged) {
|
|
189
|
+
// Case 3 — safety-critical with explicit override
|
|
190
|
+
resolutions.push({
|
|
191
|
+
bundleId: bundle.id,
|
|
192
|
+
bundleLocalPath: bundle.localPath,
|
|
193
|
+
artifactId: art.id,
|
|
194
|
+
artifactType: art.type,
|
|
195
|
+
artifactSourcePath: art.sourcePath,
|
|
196
|
+
upstream: upstreamMatch,
|
|
197
|
+
verdict: 'deploy-acknowledged',
|
|
198
|
+
message: `SAFETY-CRITICAL SHADOW: ${art.type} '${art.id}' overridden by ${art.sourcePath}.\n` +
|
|
199
|
+
` Acknowledge: this disables upstream safeguard at ${upstreamMatch.sourcePath}.\n` +
|
|
200
|
+
` Use 'aiwg doctor' to review all active shadows.`,
|
|
201
|
+
blocking: false,
|
|
202
|
+
prominent: true,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
// Case 4 — refuse
|
|
207
|
+
resolutions.push({
|
|
208
|
+
bundleId: bundle.id,
|
|
209
|
+
bundleLocalPath: bundle.localPath,
|
|
210
|
+
artifactId: art.id,
|
|
211
|
+
artifactType: art.type,
|
|
212
|
+
artifactSourcePath: art.sourcePath,
|
|
213
|
+
upstream: upstreamMatch,
|
|
214
|
+
verdict: 'refuse-unsafe',
|
|
215
|
+
message: `Refused to shadow safety-critical upstream ${art.type} '${art.id}'. ` +
|
|
216
|
+
`Add 'overrides: ["${art.id}"]' to ${bundle.manifestPath} to authorize the override.`,
|
|
217
|
+
blocking: true,
|
|
218
|
+
prominent: true,
|
|
219
|
+
});
|
|
220
|
+
blockedBundleIds.add(bundle.id);
|
|
221
|
+
}
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
// Case 2 — non-safety shadow
|
|
225
|
+
const sourceLabel = upstreamMatch.source === 'cache' ? 'git-installed' : 'bundled';
|
|
226
|
+
resolutions.push({
|
|
227
|
+
bundleId: bundle.id,
|
|
228
|
+
bundleLocalPath: bundle.localPath,
|
|
229
|
+
artifactId: art.id,
|
|
230
|
+
artifactType: art.type,
|
|
231
|
+
artifactSourcePath: art.sourcePath,
|
|
232
|
+
upstream: upstreamMatch,
|
|
233
|
+
verdict: 'deploy-with-warning',
|
|
234
|
+
message: `Shadow: ${art.type} '${art.id}' — project-local at ${art.sourcePath} ` +
|
|
235
|
+
`overrides ${sourceLabel} at ${upstreamMatch.sourcePath}`,
|
|
236
|
+
blocking: false,
|
|
237
|
+
prominent: false,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
const shadows = resolutions.filter((r) => r.upstream !== undefined);
|
|
242
|
+
return { resolutions, blockedBundleIds, shadows };
|
|
243
|
+
}
|
|
244
|
+
/** Format a multi-resolution summary suitable for stderr or doctor output. */
|
|
245
|
+
export function formatShadowReport(result) {
|
|
246
|
+
if (result.resolutions.length === 0)
|
|
247
|
+
return '';
|
|
248
|
+
const lines = [];
|
|
249
|
+
const blockers = result.resolutions.filter((r) => r.blocking);
|
|
250
|
+
const warnings = result.resolutions.filter((r) => !r.blocking && (r.verdict === 'deploy-with-warning' || r.verdict === 'deploy-acknowledged'));
|
|
251
|
+
if (blockers.length > 0) {
|
|
252
|
+
lines.push('── Project-local shadow resolution: blocked artifacts ──');
|
|
253
|
+
for (const r of blockers) {
|
|
254
|
+
lines.push(` ✗ [${r.verdict}] ${r.bundleId} :: ${r.artifactType}/${r.artifactId}`);
|
|
255
|
+
for (const ml of r.message.split('\n'))
|
|
256
|
+
lines.push(` ${ml}`);
|
|
257
|
+
}
|
|
258
|
+
lines.push('');
|
|
259
|
+
}
|
|
260
|
+
if (warnings.length > 0) {
|
|
261
|
+
lines.push('── Project-local shadows ──');
|
|
262
|
+
for (const r of warnings) {
|
|
263
|
+
const marker = r.prominent ? '!!' : '⚠';
|
|
264
|
+
lines.push(` ${marker} [${r.verdict}] ${r.bundleId} :: ${r.artifactType}/${r.artifactId}`);
|
|
265
|
+
for (const ml of r.message.split('\n'))
|
|
266
|
+
lines.push(` ${ml}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return lines.join('\n');
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=shadow-resolver.js.map
|