@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.17
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/README.md +21 -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 +1462 -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 +882 -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 +64 -9
package/README.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
1
|
# @aiwg/cli
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Lightweight AIWG CLI for signed, versioned resources from
|
|
4
|
+
[`releases.aiwg.io`](https://releases.aiwg.io/).
|
|
5
|
+
|
|
6
|
+
```bash
|
|
7
|
+
npm install --global @aiwg/cli@next
|
|
8
|
+
|
|
9
|
+
aiwg discover "architecture evolution" \
|
|
10
|
+
--resource-source web \
|
|
11
|
+
--aiwg-version canary
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## Release status
|
|
15
|
+
|
|
16
|
+
This package follows AIWG CalVer in exact lockstep with the `aiwg` package.
|
|
17
|
+
The current beta supports signed web-backed `discover` and `show`, exact or
|
|
18
|
+
channel resource selection, verified caching, and warm offline reads. The
|
|
19
|
+
larger `aiwg` package remains the local/full distribution while web parity is
|
|
20
|
+
completed for mutating commands such as `use` and `regenerate`.
|
|
21
|
+
|
|
22
|
+
Resource bundles and precomputed indices are distributed by the release host,
|
|
23
|
+
not as additional npm packages.
|
package/bin/aiwg.mjs
ADDED
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* AIWG CLI Entry Point
|
|
5
|
+
*
|
|
6
|
+
* Single entry point for the `aiwg` command. Dispatches directly to the
|
|
7
|
+
* compiled router at `dist/src/cli/router.js` with no intermediate tsx fork
|
|
8
|
+
* or facade layer — one Node process per invocation.
|
|
9
|
+
*
|
|
10
|
+
* Responsibilities:
|
|
11
|
+
* 1. Handle channel-switching commands (--use-dev, --use-edge, --use-stable)
|
|
12
|
+
* 2. Fire a non-blocking background update check
|
|
13
|
+
* 3. Resolve the compiled router (installed path or dev-repo override)
|
|
14
|
+
* 4. Dispatch to router.run(args), then process.exit() deterministically
|
|
15
|
+
*
|
|
16
|
+
* This file is intentionally minimal. All command logic lives in the router
|
|
17
|
+
* and its handlers. If you find yourself adding business logic here, it
|
|
18
|
+
* probably belongs in a handler instead.
|
|
19
|
+
*
|
|
20
|
+
* @module bin/aiwg
|
|
21
|
+
* @implements #919
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { fileURLToPath } from 'url';
|
|
25
|
+
import path from 'path';
|
|
26
|
+
import { existsSync, readFileSync } from 'fs';
|
|
27
|
+
import os from 'os';
|
|
28
|
+
import { randomUUID } from 'crypto';
|
|
29
|
+
|
|
30
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
31
|
+
const __dirname = path.dirname(__filename);
|
|
32
|
+
const packageRoot = path.resolve(__dirname, '..');
|
|
33
|
+
|
|
34
|
+
function readPackageVersion() {
|
|
35
|
+
try {
|
|
36
|
+
const pkg = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
37
|
+
return typeof pkg.version === 'string' ? pkg.version : '(unknown)';
|
|
38
|
+
} catch {
|
|
39
|
+
return '(unknown)';
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function detectVersionChannel(version) {
|
|
44
|
+
if (version.includes('-rc.')) return 'rc';
|
|
45
|
+
if (version.includes('-beta.')) return 'beta';
|
|
46
|
+
if (version.includes('-alpha.')) return 'alpha';
|
|
47
|
+
if (version.includes('-nightly.')) return 'nightly';
|
|
48
|
+
try {
|
|
49
|
+
const raw = readFileSync(path.join(os.homedir(), '.aiwg', 'channel.json'), 'utf8');
|
|
50
|
+
const cfg = JSON.parse(raw);
|
|
51
|
+
if (cfg?.devMode) return 'dev';
|
|
52
|
+
if (typeof cfg?.channel === 'string') return cfg.channel;
|
|
53
|
+
} catch {
|
|
54
|
+
// Default below.
|
|
55
|
+
}
|
|
56
|
+
return 'stable';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function maybeHandleFastVersion(args) {
|
|
60
|
+
if (args.length !== 1) return false;
|
|
61
|
+
if (args[0] !== '--version' && args[0] !== '-version') return false;
|
|
62
|
+
|
|
63
|
+
const version = readPackageVersion();
|
|
64
|
+
const channel = detectVersionChannel(version);
|
|
65
|
+
console.log(` aiwg ${version} [${channel}]`);
|
|
66
|
+
console.log(` path: ${packageRoot}`);
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (maybeHandleFastVersion(process.argv.slice(2))) {
|
|
71
|
+
process.exit(0);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Preflight: verify dist/ is built before any of the dynamic imports below
|
|
75
|
+
// try to resolve files that don't exist. Without this, a missing/incomplete
|
|
76
|
+
// dist/ surfaces as a raw `Cannot find module '.../dist/src/.../*.mjs'` from
|
|
77
|
+
// whichever import lands first, with no remediation hint. Fixes #1513
|
|
78
|
+
// (#1512 follow-up — the research agent hit MODULE_NOT_FOUND when dist/ was
|
|
79
|
+
// absent in their checkout; the answer was always `npm run build:cli`,
|
|
80
|
+
// which is what this preflight tells them).
|
|
81
|
+
//
|
|
82
|
+
// `--version` is handled above without dist, so this runs after that.
|
|
83
|
+
function maybeWarnUnbuiltDist() {
|
|
84
|
+
const required = [
|
|
85
|
+
'dist/src/cli/router.js',
|
|
86
|
+
'dist/src/update/notifier.mjs',
|
|
87
|
+
'dist/src/channel/manager.mjs',
|
|
88
|
+
];
|
|
89
|
+
const missing = required.filter(rel => !existsSync(path.join(packageRoot, rel)));
|
|
90
|
+
if (missing.length === 0) return;
|
|
91
|
+
const isDevCheckout =
|
|
92
|
+
existsSync(path.join(packageRoot, 'src')) &&
|
|
93
|
+
existsSync(path.join(packageRoot, '.git'));
|
|
94
|
+
const remediation = isDevCheckout
|
|
95
|
+
? 'Run `npm run build:cli` in the AIWG checkout to build dist/.'
|
|
96
|
+
: 'Reinstall AIWG: `npm install -g aiwg` (the published package ships dist/).';
|
|
97
|
+
process.stderr.write(`aiwg: dist/ is missing or incomplete — required files absent:\n`);
|
|
98
|
+
for (const rel of missing) process.stderr.write(` - ${rel}\n`);
|
|
99
|
+
process.stderr.write(` ${remediation}\n`);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
maybeWarnUnbuiltDist();
|
|
103
|
+
|
|
104
|
+
// Mint or inherit an invocation ID before anything else loads. Child processes
|
|
105
|
+
// spawned by handlers (detached update-notifier, aiwg exec, etc.) inherit the
|
|
106
|
+
// parent's ID via `AIWG_INVOCATION_ID` so their JSONL log records correlate
|
|
107
|
+
// with the parent's — search the log by invocation_id to get the full trace
|
|
108
|
+
// across process boundaries.
|
|
109
|
+
//
|
|
110
|
+
// randomUUID() is UUIDv4 today. Time-ordered v7 is not in Node stdlib yet;
|
|
111
|
+
// the correlation property is what matters, not the ordering.
|
|
112
|
+
function ensureInvocationId() {
|
|
113
|
+
const existing = process.env['AIWG_INVOCATION_ID'];
|
|
114
|
+
if (existing) return existing;
|
|
115
|
+
const fresh = randomUUID();
|
|
116
|
+
process.env['AIWG_INVOCATION_ID'] = fresh;
|
|
117
|
+
return fresh;
|
|
118
|
+
}
|
|
119
|
+
const invocationId = ensureInvocationId();
|
|
120
|
+
|
|
121
|
+
// Startup tracing — set AIWG_TRACE_STARTUP=1 to print per-phase timings to
|
|
122
|
+
// stderr. Useful for diagnosing cold-start regressions. No-op by default so
|
|
123
|
+
// it doesn't cost anything on the hot path.
|
|
124
|
+
const traceStartup = process.env['AIWG_TRACE_STARTUP'] === '1' ||
|
|
125
|
+
process.env['AIWG_TRACE_STARTUP']?.toLowerCase() === 'true';
|
|
126
|
+
const startHr = process.hrtime.bigint();
|
|
127
|
+
function trace(phase) {
|
|
128
|
+
if (!traceStartup) return;
|
|
129
|
+
const ms = Number(process.hrtime.bigint() - startHr) / 1_000_000;
|
|
130
|
+
process.stderr.write(`[trace] +${ms.toFixed(1)}ms ${phase}\n`);
|
|
131
|
+
}
|
|
132
|
+
trace('bin:entry');
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Resolve the path to the compiled router.
|
|
136
|
+
*
|
|
137
|
+
* In dev mode (AIWG --use-dev set), point at the dev repo's `dist/`. In
|
|
138
|
+
* stable/next/edge/nightly mode, use this installed package's `dist/`.
|
|
139
|
+
*
|
|
140
|
+
* If the compiled router is missing (fresh clone without `npm run build`),
|
|
141
|
+
* emit a clear error and exit rather than falling back to a tsx fork.
|
|
142
|
+
*/
|
|
143
|
+
async function resolveRouterPath() {
|
|
144
|
+
const { loadConfig } = await import('../dist/src/channel/manager.mjs');
|
|
145
|
+
const config = await loadConfig();
|
|
146
|
+
if (config.devMode && config.edgePath && config.edgePath !== packageRoot) {
|
|
147
|
+
const devRouter = path.join(config.edgePath, 'dist', 'src', 'cli', 'router.js');
|
|
148
|
+
if (!existsSync(devRouter)) {
|
|
149
|
+
console.error(`Dev mode: compiled router not found at ${devRouter}`);
|
|
150
|
+
console.error(` Run: (cd ${config.edgePath} && npm run build)`);
|
|
151
|
+
console.error(` Or switch back: aiwg --use-stable`);
|
|
152
|
+
process.exit(1);
|
|
153
|
+
}
|
|
154
|
+
return devRouter;
|
|
155
|
+
}
|
|
156
|
+
const installedRouter = path.join(packageRoot, 'dist', 'src', 'cli', 'router.js');
|
|
157
|
+
if (!existsSync(installedRouter)) {
|
|
158
|
+
// Config-driven from package.json (single source of truth). Falls back to
|
|
159
|
+
// the homepage if `bugs.url` is absent — never hardcode the build origin.
|
|
160
|
+
let issuesUrl = 'https://aiwg.io';
|
|
161
|
+
try {
|
|
162
|
+
const pkg = JSON.parse(readFileSync(path.join(packageRoot, 'package.json'), 'utf8'));
|
|
163
|
+
issuesUrl = pkg.bugs?.url || pkg.homepage || issuesUrl;
|
|
164
|
+
} catch {
|
|
165
|
+
// package.json unreadable in this broken install — keep the homepage fallback.
|
|
166
|
+
}
|
|
167
|
+
console.error(`Compiled router not found at ${installedRouter}`);
|
|
168
|
+
console.error(` This is a packaging bug. Please report it at:`);
|
|
169
|
+
console.error(` ${issuesUrl}`);
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
return installedRouter;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Parse verbosity flags from argv and set the logger level. Stackable:
|
|
177
|
+
* (none) → warn and above
|
|
178
|
+
* -v → info
|
|
179
|
+
* -vv → debug
|
|
180
|
+
* -vvv → debug + scope filter wide-open
|
|
181
|
+
* --quiet → error only
|
|
182
|
+
*
|
|
183
|
+
* `AIWG_LOG_LEVEL` env var overrides argv. `--verbose` is a synonym for -v.
|
|
184
|
+
*
|
|
185
|
+
* Returns the resolved level so the main entry can stash it. Does NOT mutate
|
|
186
|
+
* argv — handlers still see the flags. Call before the router loads so the
|
|
187
|
+
* logger picks up the right level when it initializes.
|
|
188
|
+
*/
|
|
189
|
+
async function applyVerbosityFromArgs(args) {
|
|
190
|
+
let level = 'warn'; // default
|
|
191
|
+
if (args.includes('--quiet') || args.includes('-q')) level = 'error';
|
|
192
|
+
else if (args.includes('-vvv')) { level = 'debug'; process.env['AIWG_DEBUG'] ??= '1'; }
|
|
193
|
+
else if (args.includes('-vv')) level = 'debug';
|
|
194
|
+
else if (args.includes('-v') || args.includes('--verbose')) level = 'info';
|
|
195
|
+
// Env var takes precedence (for CI or scripting).
|
|
196
|
+
const envLevel = process.env['AIWG_LOG_LEVEL']?.toLowerCase();
|
|
197
|
+
if (envLevel && ['debug', 'info', 'warn', 'error', 'silent'].includes(envLevel)) {
|
|
198
|
+
level = envLevel;
|
|
199
|
+
}
|
|
200
|
+
// Reach into the compiled logger (same dist/ we're about to dispatch to)
|
|
201
|
+
// and set the level. Failing to import the logger here is non-fatal — the
|
|
202
|
+
// logger's own fallbacks will pick up AIWG_LOG_LEVEL from env.
|
|
203
|
+
try {
|
|
204
|
+
const routerPath = await resolveRouterPath();
|
|
205
|
+
const logPath = path.join(path.dirname(routerPath), 'log.js');
|
|
206
|
+
if (existsSync(logPath)) {
|
|
207
|
+
const { setLogLevel, setInvocationId, pruneOldLogs } = await import('file://' + logPath);
|
|
208
|
+
setLogLevel(level);
|
|
209
|
+
setInvocationId(invocationId);
|
|
210
|
+
// One-shot prune of old JSONL files on startup. Bounded work; safe to
|
|
211
|
+
// call on every invocation because the work is a single directory list.
|
|
212
|
+
pruneOldLogs();
|
|
213
|
+
}
|
|
214
|
+
} catch {
|
|
215
|
+
// If the logger isn't importable yet (fresh clone without dist/), the
|
|
216
|
+
// regular router-resolution error below surfaces it.
|
|
217
|
+
}
|
|
218
|
+
return level;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
async function main() {
|
|
222
|
+
const args = process.argv.slice(2);
|
|
223
|
+
|
|
224
|
+
// Channel-switching commands — handled before anything else so they work
|
|
225
|
+
// even when the router can't load (e.g. fixing a broken dev-mode pointer).
|
|
226
|
+
if (args[0] === '--use-main' || args[0] === '--use-edge') {
|
|
227
|
+
const { switchToEdge } = await import('../dist/src/channel/manager.mjs');
|
|
228
|
+
await switchToEdge();
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
if (args[0] === '--use-dev') {
|
|
232
|
+
const { switchToDev } = await import('../dist/src/channel/manager.mjs');
|
|
233
|
+
const devPath = args[1] || process.cwd();
|
|
234
|
+
await switchToDev(devPath);
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (args[0] === '--use-stable' || args[0] === '--use-npm') {
|
|
238
|
+
const { switchToStable } = await import('../dist/src/channel/manager.mjs');
|
|
239
|
+
await switchToStable();
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Wire up the logger level from -v/-vv/--quiet/AIWG_LOG_LEVEL before any
|
|
244
|
+
// handler runs, and stamp the top-level invocation ID so the logger can
|
|
245
|
+
// tag every record with it.
|
|
246
|
+
await applyVerbosityFromArgs(args);
|
|
247
|
+
|
|
248
|
+
// Update notifier: print any pending notice from the previous run's
|
|
249
|
+
// background check, then schedule the next background check. Both are
|
|
250
|
+
// non-blocking — the current command never waits on the network.
|
|
251
|
+
// Honors NO_UPDATE_NOTIFIER, CI=*, and non-TTY stderr.
|
|
252
|
+
const { scheduleBackgroundCheck, maybePrintNotice } = await import('../dist/src/update/notifier.mjs');
|
|
253
|
+
maybePrintNotice();
|
|
254
|
+
scheduleBackgroundCheck(packageRoot);
|
|
255
|
+
|
|
256
|
+
// Top-level cancellation controller. SIGINT / SIGTERM flip it, long-running
|
|
257
|
+
// handlers plumb ctx.signal through fetches and loops so Ctrl-C cancels
|
|
258
|
+
// in-flight work cleanly instead of leaving orphaned sockets and children.
|
|
259
|
+
// Exit codes 130 (SIGINT = 128+2) and 143 (SIGTERM = 128+15) follow shell
|
|
260
|
+
// convention so scripts can branch on the signal kind.
|
|
261
|
+
const abortController = new AbortController();
|
|
262
|
+
const onSigint = () => {
|
|
263
|
+
abortController.abort('sigint');
|
|
264
|
+
// Safety deadline: if a handler does not honor the signal, force exit
|
|
265
|
+
// after 3s. .unref() so a well-behaved handler can still finish first.
|
|
266
|
+
const deadline = setTimeout(() => process.exit(130), 3_000);
|
|
267
|
+
deadline.unref?.();
|
|
268
|
+
};
|
|
269
|
+
const onSigterm = () => {
|
|
270
|
+
abortController.abort('sigterm');
|
|
271
|
+
const deadline = setTimeout(() => process.exit(143), 3_000);
|
|
272
|
+
deadline.unref?.();
|
|
273
|
+
};
|
|
274
|
+
process.once('SIGINT', onSigint);
|
|
275
|
+
process.once('SIGTERM', onSigterm);
|
|
276
|
+
|
|
277
|
+
// Direct in-process dispatch — no tsx fork, no facade, no router-loader.
|
|
278
|
+
trace('resolve:router');
|
|
279
|
+
const routerPath = await resolveRouterPath();
|
|
280
|
+
trace('import:router');
|
|
281
|
+
const { run } = await import('file://' + routerPath);
|
|
282
|
+
trace('dispatch:begin');
|
|
283
|
+
try {
|
|
284
|
+
await run(args, { cwd: process.cwd(), signal: abortController.signal });
|
|
285
|
+
} finally {
|
|
286
|
+
trace('dispatch:end');
|
|
287
|
+
process.removeListener('SIGINT', onSigint);
|
|
288
|
+
process.removeListener('SIGTERM', onSigterm);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Give the background update check a brief grace window before forcing exit.
|
|
293
|
+
// Without an explicit process.exit(), unawaited promises (HTTPS keepalive
|
|
294
|
+
// sockets, libuv worker handles, buffered readline from the update prompt)
|
|
295
|
+
// can keep the event loop alive for minutes on slow networks or detached
|
|
296
|
+
// terminals — the "30s command that hangs for 5 minutes" symptom we debugged
|
|
297
|
+
// in #924. 1500ms is plenty for a normal npm registry check; if the check
|
|
298
|
+
// is slower the user still gets their shell back promptly and the check
|
|
299
|
+
// runs again on the next invocation.
|
|
300
|
+
// Lazy-loaded structured error formatter. Imported on demand so a failing
|
|
301
|
+
// top-level catch doesn't itself throw by trying to load a missing dist/.
|
|
302
|
+
async function formatAndExit(error, fallbackCode = 1) {
|
|
303
|
+
// Show stack trace when the user has opted in to verbose diagnostics.
|
|
304
|
+
const verbose =
|
|
305
|
+
process.env.AIWG_DEBUG === '1' ||
|
|
306
|
+
process.env.AIWG_DEBUG?.toLowerCase() === 'true' ||
|
|
307
|
+
process.env.DEBUG === '1' ||
|
|
308
|
+
process.argv.includes('--verbose') ||
|
|
309
|
+
process.argv.includes('-vv') ||
|
|
310
|
+
process.argv.includes('-vvv');
|
|
311
|
+
|
|
312
|
+
let exitCode = fallbackCode;
|
|
313
|
+
try {
|
|
314
|
+
const errorsMod = await import(
|
|
315
|
+
'file://' + path.join(packageRoot, 'dist', 'src', 'cli', 'errors.js')
|
|
316
|
+
);
|
|
317
|
+
const { formatError, exitCodeFor } = errorsMod;
|
|
318
|
+
const formatted = formatError(error, { verbose });
|
|
319
|
+
// Strip ANSI colors when stderr isn't a TTY so piped output stays clean.
|
|
320
|
+
process.stderr.write(formatted + '\n');
|
|
321
|
+
exitCode = exitCodeFor(error);
|
|
322
|
+
} catch {
|
|
323
|
+
// Fallback path: dist/ missing or errors.js failed to load. Print a
|
|
324
|
+
// minimal message so we never silently exit.
|
|
325
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
326
|
+
process.stderr.write(`aiwg: error: ${msg}\n`);
|
|
327
|
+
if (verbose && error instanceof Error && error.stack) {
|
|
328
|
+
process.stderr.write(error.stack + '\n');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
process.exit(exitCode);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Install process-level handlers for unhandled failures so the same
|
|
335
|
+
// structured formatter renders them instead of Node's default crash dump.
|
|
336
|
+
process.on('uncaughtException', (err) => {
|
|
337
|
+
formatAndExit(err, 1).catch(() => process.exit(1));
|
|
338
|
+
});
|
|
339
|
+
process.on('unhandledRejection', (reason) => {
|
|
340
|
+
formatAndExit(reason, 1).catch(() => process.exit(1));
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
// With the update notifier now running as a detached unref()'d child (#920),
|
|
344
|
+
// main() has no background promise to grace-wait on — the router finishes,
|
|
345
|
+
// we exit. The background child writes its cache file and exits on its own
|
|
346
|
+
// schedule.
|
|
347
|
+
main()
|
|
348
|
+
.then(() => process.exit(0))
|
|
349
|
+
.catch((error) => formatAndExit(error, 1));
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// AgentCard fetch + signature verification with a TTL cache.
|
|
2
|
+
// Closes the runtime side of #1253; the JCS / JWS / verify primitives are in
|
|
3
|
+
// `src/a2a/{jcs,jws}.ts`.
|
|
4
|
+
//
|
|
5
|
+
// Per A2A §8, agents publish their card at
|
|
6
|
+
// /agents/{instanceId}/.well-known/agent-card.json
|
|
7
|
+
// Sandbox v2 also exposes the authenticated extended card at
|
|
8
|
+
// /agents/{instanceId}/v1/extendedAgentCard
|
|
9
|
+
// with a legacy fallback at
|
|
10
|
+
// /agents/{instanceId}/v1/card.
|
|
11
|
+
// The card declares required + optional extensions, supported transports,
|
|
12
|
+
// and skills.
|
|
13
|
+
import { loadJwkSet, verifyAgentCardSignature } from './jws.js';
|
|
14
|
+
const DEFAULT_TTL_MS = 5 * 60 * 1000;
|
|
15
|
+
export class AgentCardCache {
|
|
16
|
+
ttlMs;
|
|
17
|
+
entries = new Map();
|
|
18
|
+
constructor(ttlMs = DEFAULT_TTL_MS) {
|
|
19
|
+
this.ttlMs = ttlMs;
|
|
20
|
+
}
|
|
21
|
+
get(key) {
|
|
22
|
+
const entry = this.entries.get(key);
|
|
23
|
+
if (!entry)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (Date.now() >= entry.expiresAt) {
|
|
26
|
+
this.entries.delete(key);
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
return entry.verified;
|
|
30
|
+
}
|
|
31
|
+
set(key, verified) {
|
|
32
|
+
this.entries.set(key, { verified, expiresAt: Date.now() + this.ttlMs });
|
|
33
|
+
}
|
|
34
|
+
/** Invalidate a single instance (call this on `instance state change` events). */
|
|
35
|
+
invalidate(key) {
|
|
36
|
+
this.entries.delete(key);
|
|
37
|
+
}
|
|
38
|
+
clear() {
|
|
39
|
+
this.entries.clear();
|
|
40
|
+
}
|
|
41
|
+
size() {
|
|
42
|
+
return this.entries.size;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Fetch + verify an AgentCard. Bypasses any cache the caller may have.
|
|
47
|
+
* Throws on fetch failure or signature mismatch.
|
|
48
|
+
*/
|
|
49
|
+
export async function fetchAgentCard(host, instanceId, opts = {}) {
|
|
50
|
+
const fetchImpl = opts.fetch ?? fetch;
|
|
51
|
+
const base = host.replace(/\/+$/, '');
|
|
52
|
+
const encoded = encodeURIComponent(instanceId);
|
|
53
|
+
const urls = [
|
|
54
|
+
`${base}/agents/${encoded}/.well-known/agent-card.json`,
|
|
55
|
+
`${base}/agents/${encoded}/v1/extendedAgentCard`,
|
|
56
|
+
`${base}/agents/${encoded}/v1/card`,
|
|
57
|
+
];
|
|
58
|
+
const headers = { accept: 'application/json' };
|
|
59
|
+
if (opts.bearer)
|
|
60
|
+
headers.authorization = `Bearer ${opts.bearer}`;
|
|
61
|
+
const init = { method: 'GET', headers };
|
|
62
|
+
if (opts.signal)
|
|
63
|
+
init.signal = opts.signal;
|
|
64
|
+
let url = urls[0];
|
|
65
|
+
let resp;
|
|
66
|
+
for (const candidate of urls) {
|
|
67
|
+
const candidateResp = await fetchImpl(candidate, init);
|
|
68
|
+
if (candidateResp.status === 404 && candidate !== urls[urls.length - 1]) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
url = candidate;
|
|
72
|
+
resp = candidateResp;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
if (!resp || resp.status !== 200) {
|
|
76
|
+
throw new Error(`fetchAgentCard: ${url} returned ${resp?.status ?? 'no response'}`);
|
|
77
|
+
}
|
|
78
|
+
const raw = await resp.text();
|
|
79
|
+
let card;
|
|
80
|
+
try {
|
|
81
|
+
card = JSON.parse(raw);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
throw new Error(`fetchAgentCard: invalid JSON from ${url}: ${err.message}`);
|
|
85
|
+
}
|
|
86
|
+
if (opts.skipVerify) {
|
|
87
|
+
return { card, raw, verifiedAt: new Date().toISOString() };
|
|
88
|
+
}
|
|
89
|
+
let jwks = opts.jwks;
|
|
90
|
+
if (!jwks) {
|
|
91
|
+
if (!opts.jwksSource) {
|
|
92
|
+
throw new Error('fetchAgentCard: provide `jwks` or `jwksSource` for verification');
|
|
93
|
+
}
|
|
94
|
+
jwks = await loadJwks(opts.jwksSource, fetchImpl, opts.signal);
|
|
95
|
+
}
|
|
96
|
+
// Pull the kid before verifying (verify throws on mismatch).
|
|
97
|
+
const kid = card.signatures?.[0]?.header?.['kid'] ?? undefined;
|
|
98
|
+
verifyAgentCardSignature(raw, jwks);
|
|
99
|
+
const verified = {
|
|
100
|
+
card,
|
|
101
|
+
raw,
|
|
102
|
+
verifiedAt: new Date().toISOString(),
|
|
103
|
+
};
|
|
104
|
+
if (kid !== undefined)
|
|
105
|
+
verified.kid = kid;
|
|
106
|
+
return verified;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Cache-aware variant: returns the cached entry when fresh, otherwise
|
|
110
|
+
* fetches and stores. Cache key is `${host}|${instanceId}`.
|
|
111
|
+
*/
|
|
112
|
+
export async function fetchAgentCardCached(cache, host, instanceId, opts = {}) {
|
|
113
|
+
const key = `${host}|${instanceId}`;
|
|
114
|
+
const cached = cache.get(key);
|
|
115
|
+
if (cached)
|
|
116
|
+
return cached;
|
|
117
|
+
const verified = await fetchAgentCard(host, instanceId, opts);
|
|
118
|
+
cache.set(key, verified);
|
|
119
|
+
return verified;
|
|
120
|
+
}
|
|
121
|
+
async function loadJwks(source, fetchImpl, signal) {
|
|
122
|
+
if (/^https?:\/\//i.test(source)) {
|
|
123
|
+
const init = { method: 'GET' };
|
|
124
|
+
if (signal)
|
|
125
|
+
init.signal = signal;
|
|
126
|
+
const resp = await fetchImpl(source, init);
|
|
127
|
+
if (resp.status !== 200)
|
|
128
|
+
throw new Error(`loadJwks: ${source} returned ${resp.status}`);
|
|
129
|
+
return loadJwkSet(await resp.text());
|
|
130
|
+
}
|
|
131
|
+
const { readFile } = await import('node:fs/promises');
|
|
132
|
+
const text = await readFile(source, 'utf8');
|
|
133
|
+
return loadJwkSet(text);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Extract the required-set extension URIs from an AgentCard.
|
|
137
|
+
* Used by A2AClient to know which `A2A-Extensions: <URI>` values to inject
|
|
138
|
+
* on every mutating call (#1254).
|
|
139
|
+
*/
|
|
140
|
+
export function requiredExtensionUris(card) {
|
|
141
|
+
return (card.capabilities?.extensions ?? [])
|
|
142
|
+
.filter((e) => e.required === true)
|
|
143
|
+
.map((e) => e.uri);
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=agent-card.js.map
|