@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,703 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility Command Handlers
|
|
3
|
+
*
|
|
4
|
+
* Handlers for utility commands including card prefilling, contribution workflow,
|
|
5
|
+
* metadata validation, health diagnostics, and update checking.
|
|
6
|
+
*
|
|
7
|
+
* @implements @.aiwg/architecture/decisions/ADR-001-unified-extension-system.md
|
|
8
|
+
* @source @src/cli/router.ts
|
|
9
|
+
* @tests @test/unit/cli/handlers/utilities.test.ts
|
|
10
|
+
* @issue #33, #342
|
|
11
|
+
*/
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
import fsp from 'fs/promises';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { createScriptRunner } from './script-runner.js';
|
|
16
|
+
import { getFrameworkRoot } from '../../channel/manager.mjs';
|
|
17
|
+
import { forceUpdateCheck } from '../../update/checker.mjs';
|
|
18
|
+
import { useHandler as useFrameworkHandler } from './use.js';
|
|
19
|
+
import { projectAiwgPath } from '../../config/project-artifacts.js';
|
|
20
|
+
import { checkCollisions, } from '../../smiths/skillsmith/collision-detector.js';
|
|
21
|
+
/**
|
|
22
|
+
* Maps framework registry IDs (e.g. 'sdlc-complete') to `aiwg use` names (e.g. 'sdlc').
|
|
23
|
+
*/
|
|
24
|
+
const REGISTRY_ID_TO_USE_NAME = {
|
|
25
|
+
'sdlc-complete': 'sdlc',
|
|
26
|
+
'media-marketing-kit': 'marketing',
|
|
27
|
+
'media-curator': 'media-curator',
|
|
28
|
+
'research-complete': 'research',
|
|
29
|
+
'forensics-complete': 'forensics',
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Read the installed frameworks from the on-disk registry.
|
|
33
|
+
*/
|
|
34
|
+
function readFrameworkRegistry(cwd) {
|
|
35
|
+
const registryPath = projectAiwgPath(cwd, 'frameworks', 'registry.json');
|
|
36
|
+
if (!fs.existsSync(registryPath)) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
return JSON.parse(fs.readFileSync(registryPath, 'utf8'));
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Handler for prefill-cards command
|
|
48
|
+
*
|
|
49
|
+
* Prefills kanban cards with template data for project planning.
|
|
50
|
+
*
|
|
51
|
+
* Usage:
|
|
52
|
+
* aiwg -prefill-cards
|
|
53
|
+
* aiwg --prefill-cards
|
|
54
|
+
* aiwg -prefill-cards --board <board-name>
|
|
55
|
+
*/
|
|
56
|
+
export const prefillCardsHandler = {
|
|
57
|
+
id: 'prefill-cards',
|
|
58
|
+
name: 'Prefill Cards',
|
|
59
|
+
description: 'Prefill kanban cards with template data',
|
|
60
|
+
category: 'utility',
|
|
61
|
+
aliases: ['-prefill-cards', '--prefill-cards'],
|
|
62
|
+
async execute(ctx) {
|
|
63
|
+
const frameworkRoot = await getFrameworkRoot();
|
|
64
|
+
const runner = createScriptRunner(frameworkRoot);
|
|
65
|
+
return runner.run('tools/cards/prefill-cards.mjs', ctx.args, {
|
|
66
|
+
cwd: ctx.cwd,
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Handler for contribute-start command
|
|
72
|
+
*
|
|
73
|
+
* Starts a contribution workflow with issue tracking and branching.
|
|
74
|
+
*
|
|
75
|
+
* Usage:
|
|
76
|
+
* aiwg -contribute-start
|
|
77
|
+
* aiwg --contribute-start
|
|
78
|
+
* aiwg -contribute-start --issue <issue-number>
|
|
79
|
+
*/
|
|
80
|
+
export const contributeStartHandler = {
|
|
81
|
+
id: 'contribute-start',
|
|
82
|
+
name: 'Start Contribution',
|
|
83
|
+
description: 'Start a contribution workflow',
|
|
84
|
+
category: 'utility',
|
|
85
|
+
aliases: ['-contribute-start', '--contribute-start'],
|
|
86
|
+
async execute(ctx) {
|
|
87
|
+
const frameworkRoot = await getFrameworkRoot();
|
|
88
|
+
const runner = createScriptRunner(frameworkRoot);
|
|
89
|
+
return runner.run('tools/contrib/start-contribution.mjs', ctx.args, {
|
|
90
|
+
cwd: ctx.cwd,
|
|
91
|
+
});
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Handler for validate-metadata command
|
|
96
|
+
*
|
|
97
|
+
* Validates metadata across framework components and artifacts.
|
|
98
|
+
*
|
|
99
|
+
* Usage:
|
|
100
|
+
* aiwg validate-metadata
|
|
101
|
+
* aiwg validate-metadata --strict
|
|
102
|
+
* aiwg validate-metadata --recursive agentic/code/frameworks/security-engineering/skills
|
|
103
|
+
*/
|
|
104
|
+
/** Namespace field regex for SKILL.md frontmatter */
|
|
105
|
+
const NAMESPACE_RE = /^namespace:\s*(\S+)/m;
|
|
106
|
+
/** Description field regex (single-line + multi-line `>` and `|` block scalars) */
|
|
107
|
+
const DESCRIPTION_RE = /^description:\s*([>|]?)\s*\n?([\s\S]*?)(?=\n\w+:|\n---|$)/m;
|
|
108
|
+
/**
|
|
109
|
+
* Count complete sentences in a description string. A sentence is delimited
|
|
110
|
+
* by `.`, `?`, or `!` followed by whitespace or end-of-string.
|
|
111
|
+
*
|
|
112
|
+
* Per the oz-skills two-sentence discipline (PUW-030 / #1131): skills
|
|
113
|
+
* should describe themselves in 1-2 sentences. Longer descriptions are
|
|
114
|
+
* generally a sign that the skill is doing too much (god-session) or that
|
|
115
|
+
* detail belongs in the body, not the frontmatter. Lint-only — does not
|
|
116
|
+
* block deploy.
|
|
117
|
+
*/
|
|
118
|
+
function countSentences(s) {
|
|
119
|
+
if (!s)
|
|
120
|
+
return 0;
|
|
121
|
+
const trimmed = s.trim();
|
|
122
|
+
if (trimmed.length === 0)
|
|
123
|
+
return 0;
|
|
124
|
+
const matches = trimmed.match(/[.!?]+(?:\s|$)/g);
|
|
125
|
+
if (!matches)
|
|
126
|
+
return 1; // No terminator — treat as one bare sentence
|
|
127
|
+
// Trailing terminator counted; if no trailing terminator, the unterminated
|
|
128
|
+
// text is also a sentence.
|
|
129
|
+
const endsWithTerminator = /[.!?][)\]"'\s]*$/.test(trimmed);
|
|
130
|
+
return matches.length + (endsWithTerminator ? 0 : 1);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Scan source SKILL.md files in `agentic/code/` for namespace issues:
|
|
134
|
+
* - Missing `namespace: aiwg`
|
|
135
|
+
* - Slug (`aiwg-{name}`) that would shadow an AIWG CLI command
|
|
136
|
+
*
|
|
137
|
+
* Returns lines suitable for console output, or empty array if clean.
|
|
138
|
+
*/
|
|
139
|
+
async function scanSourceNamespaceIssues(frameworkRoot) {
|
|
140
|
+
const issues = [];
|
|
141
|
+
const sourceRoot = path.join(frameworkRoot, 'agentic/code');
|
|
142
|
+
async function walk(dir) {
|
|
143
|
+
let entries;
|
|
144
|
+
try {
|
|
145
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
for (const e of entries) {
|
|
151
|
+
const full = path.join(dir, e.name);
|
|
152
|
+
if (e.isDirectory()) {
|
|
153
|
+
await walk(full);
|
|
154
|
+
}
|
|
155
|
+
else if (e.name === 'SKILL.md') {
|
|
156
|
+
try {
|
|
157
|
+
const content = fs.readFileSync(full, 'utf-8');
|
|
158
|
+
const nsMatch = content.match(NAMESPACE_RE);
|
|
159
|
+
if (!nsMatch) {
|
|
160
|
+
const rel = path.relative(frameworkRoot, full);
|
|
161
|
+
issues.push(` WARN missing namespace field: ${rel}`);
|
|
162
|
+
}
|
|
163
|
+
// PUW-030 (#1131) — two-sentence skill description discipline.
|
|
164
|
+
// Lint-only. We extract the description block (handles single-line
|
|
165
|
+
// and YAML block scalars) and count sentence terminators.
|
|
166
|
+
const fmEnd = content.indexOf('\n---', 4);
|
|
167
|
+
const fm = fmEnd > 0 ? content.slice(0, fmEnd) : content;
|
|
168
|
+
const descMatch = fm.match(DESCRIPTION_RE);
|
|
169
|
+
if (descMatch) {
|
|
170
|
+
const desc = (descMatch[2] || '').trim().replace(/\n+/g, ' ');
|
|
171
|
+
const sentenceCount = countSentences(desc);
|
|
172
|
+
if (sentenceCount > 3) {
|
|
173
|
+
const rel = path.relative(frameworkRoot, full);
|
|
174
|
+
issues.push(` WARN description too long (${sentenceCount} sentences; oz-skills convention is 1-2): ${rel}`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
// unreadable
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
await walk(sourceRoot);
|
|
185
|
+
return issues;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Scan every `<framework>/<kind>/contributor.md` under `agentic/code/` and
|
|
189
|
+
* validate its frontmatter against the registered schema for its kind.
|
|
190
|
+
* Returns a list of human-readable issue lines for output, plus a count of
|
|
191
|
+
* problems found. Per ADR-023 §Schema validation, malformed contributors
|
|
192
|
+
* fail strict validation.
|
|
193
|
+
*/
|
|
194
|
+
async function scanContributorIssues(frameworkRoot) {
|
|
195
|
+
// Lazy-imported so the validate-metadata path stays fast when there are
|
|
196
|
+
// no contributors yet; also avoids an upfront dep load when zod is unused.
|
|
197
|
+
const [{ parseFrontmatter }, { validateContributor, getRegisteredKinds }] = await Promise.all([
|
|
198
|
+
import('../../artifacts/index-builder.js'),
|
|
199
|
+
import('../../contributors/validation.js'),
|
|
200
|
+
]);
|
|
201
|
+
const kinds = new Set(getRegisteredKinds());
|
|
202
|
+
const sourceRoot = path.join(frameworkRoot, 'agentic/code');
|
|
203
|
+
const lines = [];
|
|
204
|
+
let count = 0;
|
|
205
|
+
async function walk(dir) {
|
|
206
|
+
let entries;
|
|
207
|
+
try {
|
|
208
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
for (const e of entries) {
|
|
214
|
+
const full = path.join(dir, e.name);
|
|
215
|
+
if (e.isDirectory()) {
|
|
216
|
+
await walk(full);
|
|
217
|
+
}
|
|
218
|
+
else if (e.name === 'contributor.md') {
|
|
219
|
+
// Only validate if the parent directory name is a registered kind.
|
|
220
|
+
// Avoids treating unrelated files named `contributor.md` as contributors.
|
|
221
|
+
const parent = path.basename(path.dirname(full));
|
|
222
|
+
if (!kinds.has(parent))
|
|
223
|
+
continue;
|
|
224
|
+
try {
|
|
225
|
+
const content = fs.readFileSync(full, 'utf-8');
|
|
226
|
+
const { data } = parseFrontmatter(content);
|
|
227
|
+
const validation = validateContributor(data);
|
|
228
|
+
if (!validation.ok) {
|
|
229
|
+
const rel = path.relative(frameworkRoot, full);
|
|
230
|
+
lines.push(` ERROR ${rel}`);
|
|
231
|
+
for (const err of validation.errors) {
|
|
232
|
+
lines.push(` ${err}`);
|
|
233
|
+
}
|
|
234
|
+
count++;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
const rel = path.relative(frameworkRoot, full);
|
|
239
|
+
lines.push(` ERROR ${rel}: ${err.message}`);
|
|
240
|
+
count++;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
await walk(sourceRoot);
|
|
246
|
+
return { lines, count };
|
|
247
|
+
}
|
|
248
|
+
export const validateMetadataHandler = {
|
|
249
|
+
id: 'validate-metadata',
|
|
250
|
+
name: 'Validate Metadata',
|
|
251
|
+
description: 'Validate metadata across components',
|
|
252
|
+
category: 'utility',
|
|
253
|
+
aliases: ['-validate-metadata', '--validate-metadata'],
|
|
254
|
+
async execute(ctx) {
|
|
255
|
+
const frameworkRoot = await getFrameworkRoot();
|
|
256
|
+
const runner = createScriptRunner(frameworkRoot);
|
|
257
|
+
const hasPathArg = ctx.args.some(arg => !arg.startsWith('-'));
|
|
258
|
+
const wantsHelp = ctx.args.includes('--help') || ctx.args.includes('-h');
|
|
259
|
+
const scriptArgs = wantsHelp || hasPathArg
|
|
260
|
+
? ctx.args
|
|
261
|
+
: ['--recursive', 'agentic/code'];
|
|
262
|
+
// Run the core metadata validation script
|
|
263
|
+
const result = await runner.run('tools/cli/validate-metadata.mjs', scriptArgs, {
|
|
264
|
+
cwd: ctx.cwd,
|
|
265
|
+
});
|
|
266
|
+
// Append namespace validation: scan source SKILL.md files
|
|
267
|
+
try {
|
|
268
|
+
const issues = await scanSourceNamespaceIssues(frameworkRoot);
|
|
269
|
+
if (issues.length > 0) {
|
|
270
|
+
console.log('\n── Namespace validation ──');
|
|
271
|
+
console.log(` ${issues.length} skill(s) missing namespace field:`);
|
|
272
|
+
// Show first 20 to avoid flooding output
|
|
273
|
+
issues.slice(0, 20).forEach(l => console.log(l));
|
|
274
|
+
if (issues.length > 20) {
|
|
275
|
+
console.log(` ... and ${issues.length - 20} more`);
|
|
276
|
+
}
|
|
277
|
+
// Non-zero exit only in strict mode
|
|
278
|
+
if (ctx.args.includes('--strict') && result.exitCode === 0) {
|
|
279
|
+
return { exitCode: 1, message: `Namespace validation failed: ${issues.length} skill(s) missing namespace field` };
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
console.log('\n── Namespace validation: all skills have namespace field ✓');
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
catch {
|
|
287
|
+
// Namespace scan is non-fatal
|
|
288
|
+
}
|
|
289
|
+
// Append contributor validation: walk source contributor.md files and
|
|
290
|
+
// validate their frontmatter against the kind's zod schema (ADR-023).
|
|
291
|
+
try {
|
|
292
|
+
const { lines, count } = await scanContributorIssues(frameworkRoot);
|
|
293
|
+
if (count > 0) {
|
|
294
|
+
console.log('\n── Contributor validation ──');
|
|
295
|
+
console.log(` ${count} contributor file(s) failed schema validation:`);
|
|
296
|
+
lines.slice(0, 40).forEach(l => console.log(l));
|
|
297
|
+
if (lines.length > 40) {
|
|
298
|
+
console.log(` ... and ${lines.length - 40} more lines`);
|
|
299
|
+
}
|
|
300
|
+
// Strict mode escalates to a non-zero exit so CI catches drift.
|
|
301
|
+
if (ctx.args.includes('--strict') && result.exitCode === 0) {
|
|
302
|
+
return {
|
|
303
|
+
exitCode: 1,
|
|
304
|
+
message: `Contributor validation failed: ${count} file(s) violated schema`,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
console.log('\n── Contributor validation: all contributor.md files conform to schema ✓');
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
catch {
|
|
313
|
+
// Contributor scan is non-fatal — never break validate-metadata if zod
|
|
314
|
+
// import or filesystem walk hits an unexpected condition.
|
|
315
|
+
}
|
|
316
|
+
return result;
|
|
317
|
+
},
|
|
318
|
+
};
|
|
319
|
+
/**
|
|
320
|
+
* #1156 Phase 1 — Validate the per-user registry at `~/.aiwg/installed.json`.
|
|
321
|
+
*
|
|
322
|
+
* Checks each registered framework+provider deploy:
|
|
323
|
+
* - Registry entry parses correctly
|
|
324
|
+
* - Recorded artifact entries (Cycle 3 mirrors) still exist on disk
|
|
325
|
+
* - Per-artifact-type counts match the actual entry-name list length
|
|
326
|
+
* - Pre-Cycle-3 entries (no `entries` snapshot) are surfaced as "limited
|
|
327
|
+
* drift detection" rather than failures
|
|
328
|
+
*
|
|
329
|
+
* Returns exit 1 when drift is detected, exit 0 otherwise. Output is plain
|
|
330
|
+
* text suitable for terminal consumption.
|
|
331
|
+
*/
|
|
332
|
+
async function runUserScopeDoctor(verbose) {
|
|
333
|
+
const { readUserRegistry, userRegistryPath } = await import('../../config/user-registry.js');
|
|
334
|
+
const { USER_SCOPE_PATHS } = await import('../scope-resolver.js');
|
|
335
|
+
const fsp2 = await import('node:fs/promises');
|
|
336
|
+
const path2 = await import('node:path');
|
|
337
|
+
const registry = await readUserRegistry();
|
|
338
|
+
const frameworks = Object.entries(registry.installed);
|
|
339
|
+
const lines = [];
|
|
340
|
+
lines.push('');
|
|
341
|
+
lines.push('── User-scope registry validation ──');
|
|
342
|
+
lines.push(`Registry path: ${userRegistryPath()}`);
|
|
343
|
+
lines.push('');
|
|
344
|
+
if (frameworks.length === 0) {
|
|
345
|
+
lines.push('No frameworks deployed at user scope. Run `aiwg use <fw> --scope user` to install.');
|
|
346
|
+
return { exitCode: 0, message: lines.join('\n') + '\n' };
|
|
347
|
+
}
|
|
348
|
+
let driftCount = 0;
|
|
349
|
+
let limitedCount = 0;
|
|
350
|
+
for (const [name, entry] of frameworks) {
|
|
351
|
+
lines.push(`▸ ${name} v${entry.version} [${entry.source}]`);
|
|
352
|
+
for (const [provider, providerDeployRaw] of Object.entries(entry.deployedTo)) {
|
|
353
|
+
// Cast through unknown for the optional `entries` snapshot.
|
|
354
|
+
const providerDeploy = providerDeployRaw;
|
|
355
|
+
const userPaths = USER_SCOPE_PATHS[provider];
|
|
356
|
+
if (!userPaths) {
|
|
357
|
+
lines.push(` ${provider}: ⚠ no user-scope path map registered for this provider`);
|
|
358
|
+
driftCount++;
|
|
359
|
+
continue;
|
|
360
|
+
}
|
|
361
|
+
const recorded = providerDeploy.entries;
|
|
362
|
+
if (!recorded) {
|
|
363
|
+
lines.push(` ${provider}: ⚠ pre-Cycle-3 entry — no per-artifact manifest, drift detection limited`);
|
|
364
|
+
lines.push(` counts: agents=${providerDeploy.agents} commands=${providerDeploy.commands} skills=${providerDeploy.skills} rules=${providerDeploy.rules}`);
|
|
365
|
+
limitedCount++;
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
// Walk the recorded entry names and check each one exists on disk.
|
|
369
|
+
const checks = [
|
|
370
|
+
['agents', userPaths.agents, recorded.agents, providerDeploy.agents],
|
|
371
|
+
['commands', userPaths.commands, recorded.commands, providerDeploy.commands],
|
|
372
|
+
['skills', userPaths.skills, recorded.skills, providerDeploy.skills],
|
|
373
|
+
['rules', userPaths.rules, recorded.rules, providerDeploy.rules],
|
|
374
|
+
];
|
|
375
|
+
const issues = [];
|
|
376
|
+
for (const [type, dir, names, expectedCount] of checks) {
|
|
377
|
+
if (!dir || !names)
|
|
378
|
+
continue;
|
|
379
|
+
let present = 0;
|
|
380
|
+
const missing = [];
|
|
381
|
+
for (const n of names) {
|
|
382
|
+
const target = path2.join(dir, n);
|
|
383
|
+
const stat = await fsp2.stat(target).catch(() => null);
|
|
384
|
+
if (stat)
|
|
385
|
+
present++;
|
|
386
|
+
else
|
|
387
|
+
missing.push(n);
|
|
388
|
+
}
|
|
389
|
+
if (names.length !== expectedCount) {
|
|
390
|
+
issues.push(`count drift on ${type}: registry says ${expectedCount}, manifest lists ${names.length}`);
|
|
391
|
+
}
|
|
392
|
+
if (missing.length > 0) {
|
|
393
|
+
issues.push(`${type}: ${missing.length}/${names.length} entries missing from ${dir}`);
|
|
394
|
+
if (verbose) {
|
|
395
|
+
for (const m of missing)
|
|
396
|
+
issues.push(` missing: ${path2.join(dir, m)}`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
else if (verbose) {
|
|
400
|
+
issues.push(`${type}: ${present}/${names.length} present at ${dir}`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
if (issues.length === 0) {
|
|
404
|
+
lines.push(` ${provider}: ✓ all recorded artifacts present`);
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
const hasMissing = issues.some(i => i.includes('missing') || i.includes('drift'));
|
|
408
|
+
const marker = hasMissing ? '✗' : 'ℹ';
|
|
409
|
+
lines.push(` ${provider}: ${marker}`);
|
|
410
|
+
for (const i of issues)
|
|
411
|
+
lines.push(` ${i}`);
|
|
412
|
+
if (hasMissing)
|
|
413
|
+
driftCount++;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
lines.push('');
|
|
418
|
+
lines.push('═'.repeat(60));
|
|
419
|
+
lines.push(`Frameworks: ${frameworks.length} Drift: ${driftCount} Limited (pre-Cycle-3): ${limitedCount}`);
|
|
420
|
+
if (driftCount > 0) {
|
|
421
|
+
lines.push('');
|
|
422
|
+
lines.push('Drift detected. To repair, re-run `aiwg use <framework> --scope user --provider <p>`.');
|
|
423
|
+
lines.push('To remove a stale registry entry, run `aiwg remove <framework> --scope user`.');
|
|
424
|
+
}
|
|
425
|
+
return {
|
|
426
|
+
exitCode: driftCount > 0 ? 1 : 0,
|
|
427
|
+
message: lines.join('\n') + '\n',
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Handler for doctor command
|
|
432
|
+
*
|
|
433
|
+
* Runs health diagnostics on the AIWG installation and workspace.
|
|
434
|
+
*
|
|
435
|
+
* Usage:
|
|
436
|
+
* aiwg doctor
|
|
437
|
+
* aiwg -doctor
|
|
438
|
+
* aiwg --doctor
|
|
439
|
+
* aiwg doctor --verbose
|
|
440
|
+
* aiwg doctor --scope user # validate ~/.aiwg/installed.json
|
|
441
|
+
*/
|
|
442
|
+
export const doctorHandler = {
|
|
443
|
+
id: 'doctor',
|
|
444
|
+
name: 'Doctor',
|
|
445
|
+
description: 'Run health diagnostics',
|
|
446
|
+
category: 'maintenance',
|
|
447
|
+
aliases: ['-doctor', '--doctor'],
|
|
448
|
+
async execute(ctx) {
|
|
449
|
+
// #1156 Phase 1 — `aiwg doctor --scope user` / `aiwg doctor --user`
|
|
450
|
+
// validates the per-user registry (~/.aiwg/installed.json) without
|
|
451
|
+
// running the project-scope diagnostics. Operators need this to verify
|
|
452
|
+
// their user-scope deployments from any cwd, including shells with no
|
|
453
|
+
// project at all.
|
|
454
|
+
const userScopeRequested = ctx.args.includes('--user') ||
|
|
455
|
+
(ctx.args.includes('--scope') && ctx.args[ctx.args.indexOf('--scope') + 1] === 'user');
|
|
456
|
+
if (userScopeRequested) {
|
|
457
|
+
return await runUserScopeDoctor(ctx.args.includes('--verbose') || ctx.args.includes('-v'));
|
|
458
|
+
}
|
|
459
|
+
const frameworkRoot = await getFrameworkRoot();
|
|
460
|
+
const runner = createScriptRunner(frameworkRoot);
|
|
461
|
+
// Run core doctor diagnostics
|
|
462
|
+
const result = await runner.run('tools/cli/doctor.mjs', ctx.args, { cwd: ctx.cwd });
|
|
463
|
+
// Surface feedback escape hatch when doctor finds issues
|
|
464
|
+
if (result.exitCode !== 0) {
|
|
465
|
+
console.log(`
|
|
466
|
+
── Recovery options ──
|
|
467
|
+
aiwg session --no-repair — launch anyway (skip auto-repair)
|
|
468
|
+
aiwg sync — sync to latest and redeploy
|
|
469
|
+
aiwg feedback --type bug — report this issue to GitHub
|
|
470
|
+
`);
|
|
471
|
+
}
|
|
472
|
+
// Append collision scan: check deployed skills dir for bad-state collisions
|
|
473
|
+
// (platform built-ins and AIWG CLI command shadows)
|
|
474
|
+
try {
|
|
475
|
+
const projectDir = ctx.cwd || process.cwd();
|
|
476
|
+
const skillsDir = path.join(projectDir, '.claude', 'skills');
|
|
477
|
+
let deployedSkillNames = [];
|
|
478
|
+
try {
|
|
479
|
+
const entries = await fsp.readdir(skillsDir, { withFileTypes: true });
|
|
480
|
+
deployedSkillNames = entries.filter(e => e.isDirectory()).map(e => e.name);
|
|
481
|
+
}
|
|
482
|
+
catch {
|
|
483
|
+
// No .claude/skills — nothing to check
|
|
484
|
+
}
|
|
485
|
+
if (deployedSkillNames.length > 0) {
|
|
486
|
+
const collisions = await checkCollisions({
|
|
487
|
+
platform: 'claude',
|
|
488
|
+
projectPath: projectDir,
|
|
489
|
+
skillNames: deployedSkillNames,
|
|
490
|
+
namespace: 'aiwg',
|
|
491
|
+
skillsBaseDir: skillsDir,
|
|
492
|
+
});
|
|
493
|
+
const errorAndWarn = collisions.filter(r => r.severity === 'error' || r.severity === 'warn');
|
|
494
|
+
if (errorAndWarn.length > 0) {
|
|
495
|
+
// In doctor context we report stale skills, not deployment blocks.
|
|
496
|
+
// Re-running `aiwg use` will auto-clean aiwg-owned stale skills.
|
|
497
|
+
console.log('\n── Skill collision scan ──');
|
|
498
|
+
console.log('');
|
|
499
|
+
console.log('⚠ Stale skills detected (names collide with Claude built-ins):');
|
|
500
|
+
for (const r of errorAndWarn) {
|
|
501
|
+
console.log(` ✗ ${r.skillName}: ${r.reason}`);
|
|
502
|
+
}
|
|
503
|
+
console.log('');
|
|
504
|
+
console.log(' Fix: run `aiwg use <framework>` to redeploy and auto-clean stale skill directories.');
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
catch {
|
|
509
|
+
// Collision scan is non-fatal for doctor
|
|
510
|
+
}
|
|
511
|
+
// #1037 / #1049 — Project-local artifacts section: per-type counts,
|
|
512
|
+
// validation errors, shadows, denylist violations, drift detection,
|
|
513
|
+
// and provider deployment matrix. Replaces the older inline shadow
|
|
514
|
+
// scan with the richer section spec'd by design-doctor-log-promote.md.
|
|
515
|
+
try {
|
|
516
|
+
const projectDir = ctx.cwd || process.cwd();
|
|
517
|
+
const fr = await getFrameworkRoot();
|
|
518
|
+
const { readAiwgConfig } = await import('../../config/aiwg-config.js');
|
|
519
|
+
const config = await readAiwgConfig(projectDir);
|
|
520
|
+
const { buildProjectLocalDoctorSection } = await import('../../extensions/project-local-doctor.js');
|
|
521
|
+
const onlyProjectLocal = ctx.args.includes('--project-local');
|
|
522
|
+
const quiet = ctx.args.includes('--quiet');
|
|
523
|
+
const section = await buildProjectLocalDoctorSection({
|
|
524
|
+
projectDir, frameworkRoot: fr, config, quiet,
|
|
525
|
+
});
|
|
526
|
+
if (section.output) {
|
|
527
|
+
console.log(section.output);
|
|
528
|
+
}
|
|
529
|
+
// When --project-local is requested as the only output and the rest
|
|
530
|
+
// of doctor printed nothing project-local-specific, fold result exit
|
|
531
|
+
// into our own findings.
|
|
532
|
+
if (onlyProjectLocal && section.hasFailures) {
|
|
533
|
+
return { exitCode: 1, message: '' };
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
catch {
|
|
537
|
+
// Project-local section is non-fatal for doctor
|
|
538
|
+
}
|
|
539
|
+
// Canonical workspace-context graph diagnostics (#1811). Legacy projects
|
|
540
|
+
// remain valid; drift, loops, conflicts, and possible credentials fail.
|
|
541
|
+
try {
|
|
542
|
+
const { diagnoseWorkspaceContext } = await import('../../smiths/context-pipeline/workspace-context.js');
|
|
543
|
+
const diagnostics = await diagnoseWorkspaceContext(ctx.cwd || process.cwd());
|
|
544
|
+
console.log('\n── Workspace context graph ──');
|
|
545
|
+
for (const diagnostic of diagnostics) {
|
|
546
|
+
const mark = diagnostic.severity === 'error' ? '✗' : diagnostic.severity === 'warning' ? '⚠' : '✓';
|
|
547
|
+
console.log(` ${mark} ${diagnostic.message}`);
|
|
548
|
+
}
|
|
549
|
+
if (diagnostics.some((item) => item.severity === 'error'))
|
|
550
|
+
return { exitCode: 1, message: '' };
|
|
551
|
+
}
|
|
552
|
+
catch (error) {
|
|
553
|
+
console.log(`\n── Workspace context graph ──\n ⚠ unable to audit: ${error instanceof Error ? error.message : String(error)}`);
|
|
554
|
+
}
|
|
555
|
+
return result;
|
|
556
|
+
},
|
|
557
|
+
};
|
|
558
|
+
/**
|
|
559
|
+
* Handler for update command
|
|
560
|
+
*
|
|
561
|
+
* Updates AIWG and re-deploys installed frameworks/addons.
|
|
562
|
+
* - Checks for npm/git updates first
|
|
563
|
+
* - Reads .aiwg/frameworks/registry.json to detect installed items
|
|
564
|
+
* - Re-deploys only those (preserving the user's current selection)
|
|
565
|
+
* - Use --all to deploy everything (equivalent to `aiwg use all`)
|
|
566
|
+
*
|
|
567
|
+
* Usage:
|
|
568
|
+
* aiwg update # Update + re-deploy installed frameworks
|
|
569
|
+
* aiwg update --all # Update + deploy everything
|
|
570
|
+
* aiwg update --dry-run # Show what would be updated
|
|
571
|
+
* aiwg update --provider <name> # Pass through provider to deployment
|
|
572
|
+
* aiwg update --skip-check # Skip npm/git update check, only re-deploy
|
|
573
|
+
*
|
|
574
|
+
* @issue #342
|
|
575
|
+
*/
|
|
576
|
+
export const updateHandler = {
|
|
577
|
+
id: 'update',
|
|
578
|
+
name: 'Update',
|
|
579
|
+
description: 'Update AIWG and re-deploy installed frameworks',
|
|
580
|
+
category: 'maintenance',
|
|
581
|
+
aliases: ['-update', '--update'],
|
|
582
|
+
async execute(ctx) {
|
|
583
|
+
const args = ctx.args;
|
|
584
|
+
const deployAll = args.includes('--all');
|
|
585
|
+
const dryRun = args.includes('--dry-run');
|
|
586
|
+
const skipCheck = args.includes('--skip-check');
|
|
587
|
+
// Extract --provider value if present
|
|
588
|
+
const providerIdx = args.findIndex(a => a === '--provider' || a === '--platform');
|
|
589
|
+
const providerArgs = providerIdx >= 0 && args[providerIdx + 1]
|
|
590
|
+
? ['--provider', args[providerIdx + 1]]
|
|
591
|
+
: [];
|
|
592
|
+
// Step 1: Check for package updates (unless --skip-check)
|
|
593
|
+
if (!skipCheck) {
|
|
594
|
+
try {
|
|
595
|
+
console.log('Checking for AIWG updates...\n');
|
|
596
|
+
await forceUpdateCheck();
|
|
597
|
+
}
|
|
598
|
+
catch (error) {
|
|
599
|
+
console.error(`Warning: Update check failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
600
|
+
console.log('Continuing with re-deployment...\n');
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
// Step 2: Determine what to re-deploy
|
|
604
|
+
if (deployAll) {
|
|
605
|
+
// --all: deploy everything (equivalent to `aiwg use all`)
|
|
606
|
+
const frameworks = ['all'];
|
|
607
|
+
if (dryRun) {
|
|
608
|
+
console.log('Dry run: Would re-deploy all frameworks and addons');
|
|
609
|
+
return { exitCode: 0 };
|
|
610
|
+
}
|
|
611
|
+
console.log('Re-deploying all frameworks and addons...\n');
|
|
612
|
+
const result = await useFrameworkHandler.execute({
|
|
613
|
+
...ctx,
|
|
614
|
+
args: [...frameworks, ...providerArgs],
|
|
615
|
+
});
|
|
616
|
+
return result;
|
|
617
|
+
}
|
|
618
|
+
// Read registry to determine installed frameworks
|
|
619
|
+
const registry = readFrameworkRegistry(ctx.cwd);
|
|
620
|
+
if (!registry || registry.frameworks.length === 0) {
|
|
621
|
+
console.log('No frameworks found in .aiwg/frameworks/registry.json');
|
|
622
|
+
console.log('');
|
|
623
|
+
console.log('To deploy a framework first, run:');
|
|
624
|
+
console.log(' aiwg use sdlc');
|
|
625
|
+
console.log(' aiwg use marketing');
|
|
626
|
+
console.log(' aiwg use all');
|
|
627
|
+
return { exitCode: 0 };
|
|
628
|
+
}
|
|
629
|
+
// Map registry IDs to framework use-names
|
|
630
|
+
const installedFrameworks = [];
|
|
631
|
+
const unmapped = [];
|
|
632
|
+
for (const fw of registry.frameworks) {
|
|
633
|
+
const useName = REGISTRY_ID_TO_USE_NAME[fw.id];
|
|
634
|
+
if (useName) {
|
|
635
|
+
installedFrameworks.push(useName);
|
|
636
|
+
}
|
|
637
|
+
else {
|
|
638
|
+
unmapped.push(fw.id);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
if (installedFrameworks.length === 0) {
|
|
642
|
+
console.log('No recognized frameworks in registry');
|
|
643
|
+
if (unmapped.length > 0) {
|
|
644
|
+
console.log(`Unrecognized entries: ${unmapped.join(', ')}`);
|
|
645
|
+
}
|
|
646
|
+
return { exitCode: 0 };
|
|
647
|
+
}
|
|
648
|
+
// Report what will be updated
|
|
649
|
+
console.log(`Installed frameworks: ${installedFrameworks.join(', ')}`);
|
|
650
|
+
if (unmapped.length > 0) {
|
|
651
|
+
console.log(`Skipping unrecognized: ${unmapped.join(', ')}`);
|
|
652
|
+
}
|
|
653
|
+
console.log('');
|
|
654
|
+
if (dryRun) {
|
|
655
|
+
console.log('Dry run: Would re-deploy the following frameworks:');
|
|
656
|
+
for (const fw of installedFrameworks) {
|
|
657
|
+
console.log(` - ${fw}`);
|
|
658
|
+
}
|
|
659
|
+
return { exitCode: 0 };
|
|
660
|
+
}
|
|
661
|
+
// Step 3: Re-deploy each installed framework
|
|
662
|
+
const results = [];
|
|
663
|
+
for (const fw of installedFrameworks) {
|
|
664
|
+
console.log(`Re-deploying ${fw}...`);
|
|
665
|
+
const result = await useFrameworkHandler.execute({
|
|
666
|
+
...ctx,
|
|
667
|
+
args: [fw, ...providerArgs],
|
|
668
|
+
});
|
|
669
|
+
results.push({ framework: fw, exitCode: result.exitCode });
|
|
670
|
+
if (result.exitCode !== 0) {
|
|
671
|
+
console.error(`Warning: Failed to re-deploy ${fw}`);
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
// Step 4: Report summary
|
|
675
|
+
console.log('');
|
|
676
|
+
console.log('Update Summary:');
|
|
677
|
+
const succeeded = results.filter(r => r.exitCode === 0);
|
|
678
|
+
const failed = results.filter(r => r.exitCode !== 0);
|
|
679
|
+
for (const r of results) {
|
|
680
|
+
const status = r.exitCode === 0 ? 'updated' : 'FAILED';
|
|
681
|
+
console.log(` ${r.framework}: ${status}`);
|
|
682
|
+
}
|
|
683
|
+
console.log('');
|
|
684
|
+
console.log(`Updated: ${succeeded.length}/${results.length}`);
|
|
685
|
+
return {
|
|
686
|
+
exitCode: failed.length > 0 ? 1 : 0,
|
|
687
|
+
message: failed.length > 0
|
|
688
|
+
? `Some frameworks failed to update: ${failed.map(f => f.framework).join(', ')}`
|
|
689
|
+
: `Successfully updated ${succeeded.length} framework(s)`,
|
|
690
|
+
};
|
|
691
|
+
},
|
|
692
|
+
};
|
|
693
|
+
/**
|
|
694
|
+
* All utility handlers
|
|
695
|
+
*/
|
|
696
|
+
export const utilityHandlers = [
|
|
697
|
+
prefillCardsHandler,
|
|
698
|
+
contributeStartHandler,
|
|
699
|
+
validateMetadataHandler,
|
|
700
|
+
doctorHandler,
|
|
701
|
+
updateHandler,
|
|
702
|
+
];
|
|
703
|
+
//# sourceMappingURL=utilities.js.map
|