@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
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP elicitation helpers.
|
|
3
|
+
*
|
|
4
|
+
* Emit structured single/multi-select forms when the connected client supports
|
|
5
|
+
* MCP form elicitation, with a graceful markdown fallback otherwise. This is the
|
|
6
|
+
* stable path for agent-initiated structured questions on Codex, whose native
|
|
7
|
+
* `request_user_input` tool is mode-gated and off by default (see #1668, #1676
|
|
8
|
+
* and the native-ux-tools rule).
|
|
9
|
+
*
|
|
10
|
+
* @implements #1676
|
|
11
|
+
* @see agentic/code/addons/aiwg-utils/rules/native-ux-tools.md
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Normalize loosely-typed options into `{ value, label }` pairs.
|
|
16
|
+
* Accepts plain strings or `{ label, value? }` objects.
|
|
17
|
+
* @param {Array<string | { value?: string, label: string }>} options
|
|
18
|
+
* @returns {Array<{ value: string, label: string }>}
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeOptions(options) {
|
|
21
|
+
return (options || []).map((o, i) => {
|
|
22
|
+
if (typeof o === 'string') return { value: o, label: o };
|
|
23
|
+
const label = o.label ?? o.value ?? String(i);
|
|
24
|
+
const value = o.value ?? o.label ?? String(i);
|
|
25
|
+
return { value, label };
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* True when the connected client advertises MCP form elicitation support.
|
|
31
|
+
* @param {{ server?: { getClientCapabilities?: () => any } }} mcpServer
|
|
32
|
+
* @returns {boolean}
|
|
33
|
+
*/
|
|
34
|
+
export function clientSupportsFormElicitation(mcpServer) {
|
|
35
|
+
try {
|
|
36
|
+
const caps = mcpServer?.server?.getClientCapabilities?.();
|
|
37
|
+
return Boolean(caps?.elicitation?.form);
|
|
38
|
+
} catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Build a restricted JSON-schema (MCP elicitation `requestedSchema`) for a
|
|
45
|
+
* single- or multi-select choice over the given options.
|
|
46
|
+
* @param {object} params
|
|
47
|
+
* @returns {{ requestedSchema: object, key: string, options: Array<{value:string,label:string}> }}
|
|
48
|
+
*/
|
|
49
|
+
export function buildChoiceSchema({
|
|
50
|
+
key = 'choice',
|
|
51
|
+
title,
|
|
52
|
+
description,
|
|
53
|
+
options,
|
|
54
|
+
multiSelect = false,
|
|
55
|
+
minItems,
|
|
56
|
+
maxItems,
|
|
57
|
+
}) {
|
|
58
|
+
const opts = normalizeOptions(options);
|
|
59
|
+
let prop;
|
|
60
|
+
if (multiSelect) {
|
|
61
|
+
prop = {
|
|
62
|
+
type: 'array',
|
|
63
|
+
...(title ? { title } : {}),
|
|
64
|
+
...(description ? { description } : {}),
|
|
65
|
+
items: { anyOf: opts.map((o) => ({ const: o.value, title: o.label })) },
|
|
66
|
+
...(minItems != null ? { minItems } : {}),
|
|
67
|
+
...(maxItems != null ? { maxItems } : {}),
|
|
68
|
+
};
|
|
69
|
+
} else {
|
|
70
|
+
prop = {
|
|
71
|
+
type: 'string',
|
|
72
|
+
...(title ? { title } : {}),
|
|
73
|
+
...(description ? { description } : {}),
|
|
74
|
+
oneOf: opts.map((o) => ({ const: o.value, title: o.label })),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
requestedSchema: {
|
|
79
|
+
type: 'object',
|
|
80
|
+
properties: { [key]: prop },
|
|
81
|
+
required: [key],
|
|
82
|
+
},
|
|
83
|
+
key,
|
|
84
|
+
options: opts,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Ask the user a single- or multi-select question via MCP elicitation.
|
|
90
|
+
*
|
|
91
|
+
* Returns `{ supported: false }` when the client has no form-elicitation support
|
|
92
|
+
* (caller should fall back to a markdown prompt). When supported, returns the
|
|
93
|
+
* outcome with `action` of `accept` (plus `value`), `decline`, or `cancel`.
|
|
94
|
+
* Never throws — any transport/capability error degrades to `{ supported: false }`.
|
|
95
|
+
*
|
|
96
|
+
* @param {{ server: { elicitInput: Function, getClientCapabilities?: Function } }} mcpServer
|
|
97
|
+
* @param {object} params
|
|
98
|
+
* @returns {Promise<{ supported: boolean, action?: string, value?: any, options: Array<{value:string,label:string}> }>}
|
|
99
|
+
*/
|
|
100
|
+
export async function elicitChoice(
|
|
101
|
+
mcpServer,
|
|
102
|
+
{ question, options, multiSelect = false, key = 'choice', title, description, minItems, maxItems },
|
|
103
|
+
) {
|
|
104
|
+
const { requestedSchema, options: opts } = buildChoiceSchema({
|
|
105
|
+
key,
|
|
106
|
+
title: title ?? question,
|
|
107
|
+
description,
|
|
108
|
+
options,
|
|
109
|
+
multiSelect,
|
|
110
|
+
minItems,
|
|
111
|
+
maxItems,
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
if (!clientSupportsFormElicitation(mcpServer)) {
|
|
115
|
+
return { supported: false, options: opts };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
try {
|
|
119
|
+
const result = await mcpServer.server.elicitInput({
|
|
120
|
+
message: question,
|
|
121
|
+
requestedSchema,
|
|
122
|
+
mode: 'form',
|
|
123
|
+
});
|
|
124
|
+
const action = result?.action;
|
|
125
|
+
if (action === 'accept') {
|
|
126
|
+
return { supported: true, action, value: result?.content?.[key], options: opts };
|
|
127
|
+
}
|
|
128
|
+
return { supported: true, action: action === 'decline' ? 'decline' : 'cancel', options: opts };
|
|
129
|
+
} catch {
|
|
130
|
+
// Capability mismatch or transport error — degrade to markdown fallback.
|
|
131
|
+
return { supported: false, options: opts };
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Render a clear markdown prompt for clients without native elicitation.
|
|
137
|
+
* @param {object} params
|
|
138
|
+
* @returns {string}
|
|
139
|
+
*/
|
|
140
|
+
export function renderMarkdownPrompt({ question, options, multiSelect = false }) {
|
|
141
|
+
const opts = normalizeOptions(options);
|
|
142
|
+
const lines = [`**${question}**`, ''];
|
|
143
|
+
for (const o of opts) {
|
|
144
|
+
lines.push(o.label === o.value ? `- \`${o.value}\`` : `- ${o.label} (\`${o.value}\`)`);
|
|
145
|
+
}
|
|
146
|
+
lines.push('');
|
|
147
|
+
lines.push(multiSelect ? '_Select one or more and reply with your choices._' : '_Reply with your choice._');
|
|
148
|
+
return lines.join('\n');
|
|
149
|
+
}
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AIWG MCP Server — Shared Helpers
|
|
3
|
+
*
|
|
4
|
+
* @architecture @.aiwg/architecture/sketch-hermes-mcp-parity.md
|
|
5
|
+
* @issues #1311 (scope split), #1312 (command-run), #1313 (discover + pairs)
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { spawn } from 'node:child_process';
|
|
9
|
+
import fs from 'node:fs/promises';
|
|
10
|
+
import path from 'node:path';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Resolve AIWG_ROOT, with safe fallback to known install locations.
|
|
14
|
+
*/
|
|
15
|
+
export const AIWG_ROOT = process.env.AIWG_ROOT ||
|
|
16
|
+
path.join(process.env.HOME || '', '.local/share/ai-writing-guide');
|
|
17
|
+
|
|
18
|
+
const PROJECT_AIWG_LOCATION_FILE = '.aiwg-location';
|
|
19
|
+
const ARTIFACT_PATH_ENV_ALIASES = [
|
|
20
|
+
'AIWG_ARTIFACTS_PATH',
|
|
21
|
+
'AIWG_PROJECT_ARTIFACTS_PATH',
|
|
22
|
+
'AIWG_PROJECT_AIWG_DIR',
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
function expandProjectArtifactPath(pathValue, projectDir) {
|
|
26
|
+
const trimmed = pathValue.trim();
|
|
27
|
+
if (trimmed === '~') return process.env.HOME || trimmed;
|
|
28
|
+
if (trimmed.startsWith('~/')) return path.resolve(process.env.HOME || '', trimmed.slice(2));
|
|
29
|
+
if (path.isAbsolute(trimmed)) return trimmed;
|
|
30
|
+
return path.resolve(projectDir, trimmed);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function parseProjectArtifactLocation(contents) {
|
|
34
|
+
for (const rawLine of contents.split(/\r?\n/)) {
|
|
35
|
+
let line = rawLine.trim();
|
|
36
|
+
if (!line || line.startsWith('#')) continue;
|
|
37
|
+
if (line.startsWith('export ')) line = line.slice('export '.length).trim();
|
|
38
|
+
const assignment = line.match(/^AIWG_ARTIFACTS_PATH\s*=\s*(.+)$/);
|
|
39
|
+
if (assignment) line = assignment[1].trim();
|
|
40
|
+
if (
|
|
41
|
+
(line.startsWith('"') && line.endsWith('"')) ||
|
|
42
|
+
(line.startsWith("'") && line.endsWith("'"))
|
|
43
|
+
) {
|
|
44
|
+
line = line.slice(1, -1);
|
|
45
|
+
}
|
|
46
|
+
return line || null;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export async function resolveProjectAiwgDir(projectDir) {
|
|
52
|
+
for (const key of ARTIFACT_PATH_ENV_ALIASES) {
|
|
53
|
+
const value = process.env[key];
|
|
54
|
+
if (typeof value === 'string' && value.trim()) return expandProjectArtifactPath(value, projectDir);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const pointer = await fs.readFile(path.join(projectDir, PROJECT_AIWG_LOCATION_FILE), 'utf-8');
|
|
58
|
+
const configured = parseProjectArtifactLocation(pointer);
|
|
59
|
+
if (configured) return expandProjectArtifactPath(configured, projectDir);
|
|
60
|
+
} catch {
|
|
61
|
+
// no pointer
|
|
62
|
+
}
|
|
63
|
+
return path.resolve(projectDir, '.aiwg');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Walk up the directory tree looking for `.aiwg/` or `.aiwg-location`.
|
|
68
|
+
*
|
|
69
|
+
* @param {string} startDir
|
|
70
|
+
* @returns {Promise<string>}
|
|
71
|
+
* @throws {Error} when no .aiwg directory or .aiwg-location pointer is found
|
|
72
|
+
*/
|
|
73
|
+
export async function findProjectRoot(startDir = process.cwd()) {
|
|
74
|
+
let currentDir = startDir;
|
|
75
|
+
while (currentDir !== path.dirname(currentDir)) {
|
|
76
|
+
const aiwgPath = path.join(currentDir, '.aiwg');
|
|
77
|
+
const pointerPath = path.join(currentDir, PROJECT_AIWG_LOCATION_FILE);
|
|
78
|
+
try {
|
|
79
|
+
const stat = await fs.stat(aiwgPath);
|
|
80
|
+
if (stat.isDirectory()) return currentDir;
|
|
81
|
+
} catch {
|
|
82
|
+
// continue to pointer check
|
|
83
|
+
}
|
|
84
|
+
try {
|
|
85
|
+
const stat = await fs.stat(pointerPath);
|
|
86
|
+
if (stat.isFile()) return currentDir;
|
|
87
|
+
} catch {
|
|
88
|
+
// continue up
|
|
89
|
+
}
|
|
90
|
+
currentDir = path.dirname(currentDir);
|
|
91
|
+
}
|
|
92
|
+
throw new Error('No .aiwg directory or .aiwg-location pointer found. Run from an AIWG project or `aiwg new` first.');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Resolve project root with optional global fallback (#1311).
|
|
97
|
+
*
|
|
98
|
+
* Tools that operate on global registries (discover, *-show against the
|
|
99
|
+
* canonical corpus) accept a missing project root and fall back to AIWG_ROOT.
|
|
100
|
+
* Tools that operate on `.aiwg/` artifacts (artifact-read, memory-*) reject
|
|
101
|
+
* with a structured remediation message.
|
|
102
|
+
*
|
|
103
|
+
* @param {string|undefined} explicitDir
|
|
104
|
+
* @param {{ allowGlobal?: boolean, toolName?: string }} [options]
|
|
105
|
+
* @returns {Promise<{ root: string, isGlobal: boolean }>}
|
|
106
|
+
*/
|
|
107
|
+
export async function resolveProjectRoot(explicitDir, { allowGlobal = false, toolName = 'tool' } = {}) {
|
|
108
|
+
if (explicitDir && explicitDir !== '.') {
|
|
109
|
+
return { root: path.resolve(explicitDir), isGlobal: false };
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
const root = await findProjectRoot();
|
|
113
|
+
return { root, isGlobal: false };
|
|
114
|
+
} catch (err) {
|
|
115
|
+
if (allowGlobal) {
|
|
116
|
+
return { root: AIWG_ROOT, isGlobal: true };
|
|
117
|
+
}
|
|
118
|
+
throw new Error(
|
|
119
|
+
`Tool "${toolName}" requires a project root. ${err.message} ` +
|
|
120
|
+
`Remediation: Run from an AIWG project directory or pass project_dir explicitly.`
|
|
121
|
+
);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* The set of MCP tools that are allowed to operate without a project root
|
|
127
|
+
* (they fall back to AIWG_ROOT). Maintained here so tool registrations
|
|
128
|
+
* stay in sync (#1311).
|
|
129
|
+
*/
|
|
130
|
+
export const GLOBAL_ALLOWED_TOOLS = new Set([
|
|
131
|
+
'discover',
|
|
132
|
+
'skill-list',
|
|
133
|
+
'skill-show',
|
|
134
|
+
'command-list',
|
|
135
|
+
'command-show',
|
|
136
|
+
'rule-list',
|
|
137
|
+
'rule-show',
|
|
138
|
+
'agent-list', // existing; canonical corpus enumeration
|
|
139
|
+
'agent-show',
|
|
140
|
+
'template-list',
|
|
141
|
+
'template-show',
|
|
142
|
+
'template-render', // existing; uses corpus templates
|
|
143
|
+
]);
|
|
144
|
+
|
|
145
|
+
export function isGlobalAllowed(toolName) {
|
|
146
|
+
return GLOBAL_ALLOWED_TOOLS.has(toolName);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Spawn the `aiwg` CLI as a subprocess with safe argv handling (#1312).
|
|
151
|
+
*
|
|
152
|
+
* NEVER use `shell: true` — args must pass as an array so user-provided
|
|
153
|
+
* strings are never interpreted as shell metacharacters. Token security
|
|
154
|
+
* (RULES: token-security) — command path is logged, args content is not.
|
|
155
|
+
*
|
|
156
|
+
* @param {string[]} args
|
|
157
|
+
* @param {{ cwd?: string, env?: object, timeoutMs?: number, input?: string }} [options]
|
|
158
|
+
* @returns {Promise<{ stdout: string, stderr: string, code: number }>}
|
|
159
|
+
*/
|
|
160
|
+
export function runAiwgCli(args, { cwd, env, timeoutMs = 120_000, input } = {}) {
|
|
161
|
+
return new Promise((resolve, reject) => {
|
|
162
|
+
const proc = spawn('aiwg', args, {
|
|
163
|
+
shell: false,
|
|
164
|
+
cwd: cwd || process.cwd(),
|
|
165
|
+
env: { ...process.env, ...(env || {}) },
|
|
166
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
167
|
+
});
|
|
168
|
+
let stdout = '';
|
|
169
|
+
let stderr = '';
|
|
170
|
+
let timedOut = false;
|
|
171
|
+
const timer = setTimeout(() => {
|
|
172
|
+
timedOut = true;
|
|
173
|
+
proc.kill('SIGTERM');
|
|
174
|
+
}, timeoutMs);
|
|
175
|
+
|
|
176
|
+
proc.stdout.on('data', (chunk) => { stdout += chunk; });
|
|
177
|
+
proc.stderr.on('data', (chunk) => { stderr += chunk; });
|
|
178
|
+
|
|
179
|
+
proc.on('close', (code) => {
|
|
180
|
+
clearTimeout(timer);
|
|
181
|
+
if (timedOut) {
|
|
182
|
+
reject(new Error(`aiwg ${args[0] || ''} timed out after ${timeoutMs}ms`));
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
resolve({ stdout, stderr, code: code ?? -1 });
|
|
186
|
+
});
|
|
187
|
+
proc.on('error', (err) => {
|
|
188
|
+
clearTimeout(timer);
|
|
189
|
+
reject(err);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
if (input !== undefined) {
|
|
193
|
+
proc.stdin.write(input);
|
|
194
|
+
proc.stdin.end();
|
|
195
|
+
} else {
|
|
196
|
+
proc.stdin.end();
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Structured MCP error response.
|
|
203
|
+
*/
|
|
204
|
+
export function mcpError(message, { remediation, requiresConfirmation } = {}) {
|
|
205
|
+
const body = { error: message };
|
|
206
|
+
if (remediation) body.remediation = remediation;
|
|
207
|
+
if (requiresConfirmation) body.requires_confirmation = true;
|
|
208
|
+
return {
|
|
209
|
+
content: [{ type: 'text', text: JSON.stringify(body, null, 2) }],
|
|
210
|
+
isError: true,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Structured MCP success response wrapping a JSON or text payload.
|
|
216
|
+
*/
|
|
217
|
+
export function mcpJson(data) {
|
|
218
|
+
const text = typeof data === 'string' ? data : JSON.stringify(data, null, 2);
|
|
219
|
+
return { content: [{ type: 'text', text }] };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Read AIWG CLI command registry to build the command-run allow-list.
|
|
224
|
+
*
|
|
225
|
+
* Lazily loaded from `src/extensions/commands/definitions.ts` — extracts
|
|
226
|
+
* `id:` fields. Cached after first read.
|
|
227
|
+
*/
|
|
228
|
+
let _commandIds = null;
|
|
229
|
+
export async function loadCommandAllowList() {
|
|
230
|
+
if (_commandIds) return _commandIds;
|
|
231
|
+
const defPath = path.join(AIWG_ROOT, 'src/extensions/commands/definitions.ts');
|
|
232
|
+
// Fall back to source-checkout location if AIWG_ROOT points to the project itself
|
|
233
|
+
const candidates = [
|
|
234
|
+
defPath,
|
|
235
|
+
path.resolve(process.cwd(), 'src/extensions/commands/definitions.ts'),
|
|
236
|
+
];
|
|
237
|
+
let text = '';
|
|
238
|
+
for (const c of candidates) {
|
|
239
|
+
try {
|
|
240
|
+
text = await fs.readFile(c, 'utf-8');
|
|
241
|
+
break;
|
|
242
|
+
} catch {
|
|
243
|
+
// try next
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
if (!text) {
|
|
247
|
+
// Last-resort fallback: spawn `aiwg help` and parse — slower but always works
|
|
248
|
+
try {
|
|
249
|
+
const { stdout } = await runAiwgCli(['help'], { timeoutMs: 30_000 });
|
|
250
|
+
_commandIds = new Set(
|
|
251
|
+
Array.from(stdout.matchAll(/^\s{4}([a-z][a-z0-9-]+)\s/gm))
|
|
252
|
+
.map(m => m[1])
|
|
253
|
+
);
|
|
254
|
+
return _commandIds;
|
|
255
|
+
} catch (e) {
|
|
256
|
+
_commandIds = new Set();
|
|
257
|
+
return _commandIds;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
const ids = new Set();
|
|
261
|
+
for (const m of text.matchAll(/^ id: '([^']+)'/gm)) {
|
|
262
|
+
ids.add(m[1]);
|
|
263
|
+
}
|
|
264
|
+
_commandIds = ids;
|
|
265
|
+
return _commandIds;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Commands that mutate fleet/project state and require explicit `confirmed: true`
|
|
270
|
+
* before `command-run` will execute them. Defensive default.
|
|
271
|
+
*/
|
|
272
|
+
export const DESTRUCTIVE_COMMANDS = new Set([
|
|
273
|
+
'remove',
|
|
274
|
+
'rollback-workspace',
|
|
275
|
+
'promote',
|
|
276
|
+
'uninstall-plugin',
|
|
277
|
+
'cleanup-audit',
|
|
278
|
+
'doc-sync',
|
|
279
|
+
'sandbox', // local executor sandbox
|
|
280
|
+
'ralph', // long-running loop
|
|
281
|
+
'agent-loop-ext',
|
|
282
|
+
'ralph-abort',
|
|
283
|
+
]);
|
|
284
|
+
|
|
285
|
+
export function isDestructive(command) {
|
|
286
|
+
return DESTRUCTIVE_COMMANDS.has(command);
|
|
287
|
+
}
|