@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,703 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config CLI — Subcommand router for `aiwg config`
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* get <key> — Read a config value
|
|
6
|
+
* set <key> <value> — Write a config value
|
|
7
|
+
* list — Show all user config (merged view)
|
|
8
|
+
* validate — Validate all config files
|
|
9
|
+
* reset [<key>] — Reset key or all config to defaults
|
|
10
|
+
* path — Print the active config directory path
|
|
11
|
+
* edit — Open config in $EDITOR
|
|
12
|
+
* gitignore — Show/check/fix .gitignore for AIWG runtime dirs
|
|
13
|
+
*
|
|
14
|
+
* Global flags:
|
|
15
|
+
* --config-dir <path> — Override config directory
|
|
16
|
+
*
|
|
17
|
+
* @implements #545
|
|
18
|
+
* @implements #553
|
|
19
|
+
*/
|
|
20
|
+
import { fileURLToPath } from 'url';
|
|
21
|
+
import path from 'path';
|
|
22
|
+
import { UserConfig } from './user-config.js';
|
|
23
|
+
import { AiwgError, EXIT_CODES } from '../cli/errors.js';
|
|
24
|
+
const _scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
|
25
|
+
/**
|
|
26
|
+
* Main CLI entry point for `aiwg config <subcommand> [args]`
|
|
27
|
+
*/
|
|
28
|
+
export async function main(args) {
|
|
29
|
+
// Extract --config-dir flag before routing
|
|
30
|
+
let configDir;
|
|
31
|
+
const filteredArgs = [];
|
|
32
|
+
for (let i = 0; i < args.length; i++) {
|
|
33
|
+
if (args[i] === '--config-dir' && i + 1 < args.length) {
|
|
34
|
+
configDir = args[i + 1];
|
|
35
|
+
i++; // skip next arg
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
filteredArgs.push(args[i]);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const subcommand = filteredArgs[0];
|
|
42
|
+
const subArgs = filteredArgs.slice(1);
|
|
43
|
+
const config = new UserConfig(configDir);
|
|
44
|
+
switch (subcommand) {
|
|
45
|
+
case 'get':
|
|
46
|
+
await handleGet(config, subArgs);
|
|
47
|
+
break;
|
|
48
|
+
case 'set':
|
|
49
|
+
await handleSet(config, subArgs);
|
|
50
|
+
break;
|
|
51
|
+
case 'list':
|
|
52
|
+
case 'ls':
|
|
53
|
+
await handleList(config);
|
|
54
|
+
break;
|
|
55
|
+
case 'validate':
|
|
56
|
+
await handleValidate(config, subArgs);
|
|
57
|
+
break;
|
|
58
|
+
case 'reset':
|
|
59
|
+
await handleReset(config, subArgs);
|
|
60
|
+
break;
|
|
61
|
+
case 'path':
|
|
62
|
+
handlePath(config);
|
|
63
|
+
break;
|
|
64
|
+
case 'edit':
|
|
65
|
+
await handleEdit(config);
|
|
66
|
+
break;
|
|
67
|
+
case 'gitignore':
|
|
68
|
+
await handleGitignore(subArgs);
|
|
69
|
+
break;
|
|
70
|
+
case 'show':
|
|
71
|
+
await handleShow(subArgs);
|
|
72
|
+
break;
|
|
73
|
+
default:
|
|
74
|
+
printUsage();
|
|
75
|
+
if (subcommand) {
|
|
76
|
+
throw new AiwgError({
|
|
77
|
+
code: 'ERR_USAGE_UNKNOWN_SUBCOMMAND',
|
|
78
|
+
message: `Unknown config subcommand: ${subcommand}`,
|
|
79
|
+
hint: "Run 'aiwg config' without arguments to see usage",
|
|
80
|
+
exitCode: EXIT_CODES.USAGE,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
async function handleGet(config, args) {
|
|
87
|
+
const isProject = args.includes('--project');
|
|
88
|
+
const positional = args.filter(a => a !== '--project' && a !== '--user');
|
|
89
|
+
const key = positional[0];
|
|
90
|
+
if (!key) {
|
|
91
|
+
throw new AiwgError({
|
|
92
|
+
code: 'ERR_USAGE_MISSING_ARG',
|
|
93
|
+
message: 'aiwg config get requires a key',
|
|
94
|
+
hint: 'Example: aiwg config get defaults.provider (or --project delivery.mode)',
|
|
95
|
+
exitCode: EXIT_CODES.USAGE,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
if (isProject) {
|
|
99
|
+
await projectConfigGet(key, args);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
const value = await config.get(key);
|
|
103
|
+
if (value === undefined) {
|
|
104
|
+
console.log(`(not set)`);
|
|
105
|
+
}
|
|
106
|
+
else if (typeof value === 'object') {
|
|
107
|
+
console.log(JSON.stringify(value, null, 2));
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
console.log(String(value));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function handleSet(config, args) {
|
|
114
|
+
const isProject = args.includes('--project');
|
|
115
|
+
const positional = args.filter(a => a !== '--project' && a !== '--user');
|
|
116
|
+
const key = positional[0];
|
|
117
|
+
const value = positional[1];
|
|
118
|
+
if (!key || value === undefined) {
|
|
119
|
+
throw new AiwgError({
|
|
120
|
+
code: 'ERR_USAGE_MISSING_ARG',
|
|
121
|
+
message: 'aiwg config set requires both a key and a value',
|
|
122
|
+
hint: 'Example: aiwg config set defaults.verbosity quiet (or --project delivery.mode pr-required)',
|
|
123
|
+
exitCode: EXIT_CODES.USAGE,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (isProject) {
|
|
127
|
+
await projectConfigSet(key, value, args);
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
await config.set(key, value);
|
|
131
|
+
console.log(`Set ${key} = ${value}`);
|
|
132
|
+
}
|
|
133
|
+
// ── Project-config get/set (#1006) ────────────────────────────────────────────
|
|
134
|
+
//
|
|
135
|
+
// Extends `aiwg config get|set` with `--project` to read/write the project-
|
|
136
|
+
// level .aiwg/aiwg.config. Dotted paths address nested fields:
|
|
137
|
+
// aiwg config get --project delivery.mode
|
|
138
|
+
// aiwg config set --project delivery.mode pr-required
|
|
139
|
+
// aiwg config get --project remotes.primary
|
|
140
|
+
//
|
|
141
|
+
// Set validates enum membership for known fields (delivery.mode,
|
|
142
|
+
// delivery.merge_style, delivery.force_push_policy) before writing.
|
|
143
|
+
const ENUM_RULES = {
|
|
144
|
+
'delivery.mode': ['direct', 'feature-branch', 'pr-required'],
|
|
145
|
+
'delivery.merge_style': ['rebase-merge', 'squash', 'merge', 'fast-forward-only'],
|
|
146
|
+
'delivery.force_push_policy': ['never', 'own-branch-only', 'allowed'],
|
|
147
|
+
'delivery.signing.format': ['openpgp', 'ssh', 'x509'],
|
|
148
|
+
'delivery.signing.enforce': ['commits', 'tags', 'all'],
|
|
149
|
+
'delivery.release_signing.format': ['openpgp', 'ssh', 'x509'],
|
|
150
|
+
'delivery.release_signing.enforce': ['commits', 'tags', 'all'],
|
|
151
|
+
'remotes.tracker_actor.via': ['tea', 'gh', 'mcp', 'api'],
|
|
152
|
+
'remotes.transport.protocol': ['ssh', 'https'],
|
|
153
|
+
'repo_maintainer.tiers.local': ['collaborator', 'maintainer', 'admin'],
|
|
154
|
+
};
|
|
155
|
+
const BOOLEAN_FIELDS = new Set([
|
|
156
|
+
'delivery.delete_branch_on_merge',
|
|
157
|
+
'delivery.require_ci_green',
|
|
158
|
+
'delivery.require_signed_commits',
|
|
159
|
+
'delivery.auto_close_issues',
|
|
160
|
+
'delivery.issue_comment_on_cycle',
|
|
161
|
+
'command_log.enabled',
|
|
162
|
+
'telemetry.skill_usage.enabled',
|
|
163
|
+
]);
|
|
164
|
+
const STRING_ARRAY_FIELDS = new Set([
|
|
165
|
+
'remotes.tracker_actor.forbid_actors',
|
|
166
|
+
'command_log.scopes',
|
|
167
|
+
'telemetry.skill_usage.scopes',
|
|
168
|
+
]);
|
|
169
|
+
// Integer fields with valid range constraints. Validated at `aiwg config set`.
|
|
170
|
+
// Bounds mirror the JSON schema (vscode-extension/schemas/aiwg.config.v1.json).
|
|
171
|
+
const INTEGER_FIELDS = {
|
|
172
|
+
'parallelism.max_parallel_subagents': { min: 1, max: 50 },
|
|
173
|
+
'parallelism.max_parallel_ralph_loops': { min: 1, max: 20 },
|
|
174
|
+
'parallelism.max_parallel_mc_missions': { min: 1, max: 20 },
|
|
175
|
+
'command_log.max_bytes': { min: 1024, max: 104_857_600 },
|
|
176
|
+
'telemetry.skill_usage.max_bytes': { min: 1024, max: 104_857_600 },
|
|
177
|
+
};
|
|
178
|
+
async function projectConfigGet(key, args) {
|
|
179
|
+
const { readAiwgConfig, getProjectDir } = await import('./aiwg-config.js');
|
|
180
|
+
const projectDir = getProjectDir(undefined, args);
|
|
181
|
+
const cfg = await readAiwgConfig(projectDir);
|
|
182
|
+
if (!cfg) {
|
|
183
|
+
throw new AiwgError({
|
|
184
|
+
code: 'ERR_NO_PROJECT_CONFIG',
|
|
185
|
+
message: 'No .aiwg/aiwg.config in this project.',
|
|
186
|
+
hint: 'Run `aiwg init`, then ask your AIWG agent to set up repo/tracker/delivery policy.',
|
|
187
|
+
exitCode: EXIT_CODES.CONFIG,
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
const value = getDottedPath(cfg, key);
|
|
191
|
+
if (value === undefined) {
|
|
192
|
+
console.log('(not set)');
|
|
193
|
+
}
|
|
194
|
+
else if (typeof value === 'object') {
|
|
195
|
+
console.log(JSON.stringify(value, null, 2));
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
console.log(String(value));
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
async function projectConfigSet(key, raw, args) {
|
|
202
|
+
const { readAiwgConfig, writeAiwgConfig, getProjectDir, emptyConfig, validateExternalLinks, } = await import('./aiwg-config.js');
|
|
203
|
+
const projectDir = getProjectDir(undefined, args);
|
|
204
|
+
// Validate enum fields before writing
|
|
205
|
+
const allowed = ENUM_RULES[key];
|
|
206
|
+
if (allowed && !allowed.includes(raw)) {
|
|
207
|
+
throw new AiwgError({
|
|
208
|
+
code: 'ERR_INVALID_VALUE',
|
|
209
|
+
message: `Invalid value for ${key}: '${raw}'. Allowed: ${allowed.join(', ')}`,
|
|
210
|
+
hint: `Try: aiwg config set --project ${key} ${allowed[0]}`,
|
|
211
|
+
exitCode: EXIT_CODES.USAGE,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
// Coerce booleans for known boolean fields
|
|
215
|
+
let value = raw;
|
|
216
|
+
if (/^externalLinks\.[^.]+$/.test(key)) {
|
|
217
|
+
try {
|
|
218
|
+
value = JSON.parse(raw);
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
throw new AiwgError({
|
|
222
|
+
code: 'ERR_INVALID_VALUE',
|
|
223
|
+
message: `${key} must be a JSON object containing label and url`,
|
|
224
|
+
hint: `Try: aiwg config set --project ${key} '{"label":"Project docs","url":"https://example.com/docs"}'`,
|
|
225
|
+
exitCode: EXIT_CODES.USAGE,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (BOOLEAN_FIELDS.has(key)) {
|
|
230
|
+
if (raw === 'true')
|
|
231
|
+
value = true;
|
|
232
|
+
else if (raw === 'false')
|
|
233
|
+
value = false;
|
|
234
|
+
else {
|
|
235
|
+
throw new AiwgError({
|
|
236
|
+
code: 'ERR_INVALID_VALUE',
|
|
237
|
+
message: `${key} must be 'true' or 'false', got '${raw}'`,
|
|
238
|
+
hint: `Try: aiwg config set --project ${key} true`,
|
|
239
|
+
exitCode: EXIT_CODES.USAGE,
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (STRING_ARRAY_FIELDS.has(key)) {
|
|
244
|
+
value = raw
|
|
245
|
+
.split(',')
|
|
246
|
+
.map(item => item.trim())
|
|
247
|
+
.filter(Boolean);
|
|
248
|
+
if (key === 'command_log.scopes' || key === 'telemetry.skill_usage.scopes') {
|
|
249
|
+
const invalid = value.filter(item => item !== 'project' && item !== 'global');
|
|
250
|
+
if (invalid.length > 0) {
|
|
251
|
+
throw new AiwgError({
|
|
252
|
+
code: 'ERR_INVALID_VALUE',
|
|
253
|
+
message: `${key} supports only 'project' and 'global', got '${invalid.join(', ')}'`,
|
|
254
|
+
hint: `Try: aiwg config set --project ${key} project,global`,
|
|
255
|
+
exitCode: EXIT_CODES.USAGE,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Coerce + range-check integers for known integer fields (#1359).
|
|
261
|
+
const intRule = INTEGER_FIELDS[key];
|
|
262
|
+
if (intRule) {
|
|
263
|
+
const n = Number(raw);
|
|
264
|
+
if (!Number.isInteger(n) || n < intRule.min || n > intRule.max) {
|
|
265
|
+
throw new AiwgError({
|
|
266
|
+
code: 'ERR_INVALID_VALUE',
|
|
267
|
+
message: `${key} must be an integer between ${intRule.min} and ${intRule.max}, got '${raw}'`,
|
|
268
|
+
hint: `Try: aiwg config set --project ${key} ${intRule.min}`,
|
|
269
|
+
exitCode: EXIT_CODES.USAGE,
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
value = n;
|
|
273
|
+
}
|
|
274
|
+
// Read-modify-write — preserve unrelated fields. emptyConfig() seeds the
|
|
275
|
+
// base shape when no config file exists yet (e.g. brand-new project).
|
|
276
|
+
const cfg = (await readAiwgConfig(projectDir)) ?? emptyConfig();
|
|
277
|
+
setDottedPath(cfg, key, value);
|
|
278
|
+
const externalLinkErrors = validateExternalLinks(cfg.externalLinks);
|
|
279
|
+
if (externalLinkErrors.length > 0) {
|
|
280
|
+
throw new AiwgError({
|
|
281
|
+
code: 'ERR_INVALID_VALUE',
|
|
282
|
+
message: `Invalid external link configuration: ${externalLinkErrors.join('; ')}`,
|
|
283
|
+
hint: 'Each link needs a stable key, non-empty label, and absolute HTTP(S) URL without embedded credentials.',
|
|
284
|
+
exitCode: EXIT_CODES.USAGE,
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
await writeAiwgConfig(projectDir, cfg);
|
|
288
|
+
console.log(`Set --project ${key} = ${raw}`);
|
|
289
|
+
}
|
|
290
|
+
/** Read a dotted path from a nested record. Returns undefined when any segment is missing. */
|
|
291
|
+
function getDottedPath(obj, key) {
|
|
292
|
+
const parts = key.split('.');
|
|
293
|
+
let cur = obj;
|
|
294
|
+
for (const p of parts) {
|
|
295
|
+
if (cur === null || typeof cur !== 'object')
|
|
296
|
+
return undefined;
|
|
297
|
+
cur = cur[p];
|
|
298
|
+
}
|
|
299
|
+
return cur;
|
|
300
|
+
}
|
|
301
|
+
/** Write a dotted path into a nested record, creating intermediate objects. */
|
|
302
|
+
function setDottedPath(obj, key, value) {
|
|
303
|
+
const parts = key.split('.');
|
|
304
|
+
const last = parts.pop();
|
|
305
|
+
let cur = obj;
|
|
306
|
+
for (const p of parts) {
|
|
307
|
+
const next = cur[p];
|
|
308
|
+
if (next === undefined || next === null || typeof next !== 'object' || Array.isArray(next)) {
|
|
309
|
+
cur[p] = {};
|
|
310
|
+
}
|
|
311
|
+
cur = cur[p];
|
|
312
|
+
}
|
|
313
|
+
cur[last] = value;
|
|
314
|
+
}
|
|
315
|
+
async function handleList(config) {
|
|
316
|
+
const allConfig = await config.list();
|
|
317
|
+
console.log(`Config directory: ${config.getPath()}\n`);
|
|
318
|
+
for (const [filename, data] of Object.entries(allConfig)) {
|
|
319
|
+
console.log(`── ${filename} ──`);
|
|
320
|
+
if (typeof data === 'string') {
|
|
321
|
+
console.log(data);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
console.log(JSON.stringify(data, null, 2));
|
|
325
|
+
}
|
|
326
|
+
console.log('');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
async function handleValidate(config, args) {
|
|
330
|
+
if (args.includes('--project')) {
|
|
331
|
+
await handleProjectValidate(args);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
const issues = await config.validate();
|
|
335
|
+
console.log(`Config directory: ${config.getPath()}\n`);
|
|
336
|
+
if (issues.length === 0) {
|
|
337
|
+
console.log('✓ All config files valid');
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const errors = issues.filter(i => i.severity === 'error');
|
|
341
|
+
const warnings = issues.filter(i => i.severity === 'warning');
|
|
342
|
+
const infos = issues.filter(i => i.severity === 'info');
|
|
343
|
+
for (const issue of issues) {
|
|
344
|
+
const icon = issue.severity === 'error' ? '✗' : issue.severity === 'warning' ? '!' : 'i';
|
|
345
|
+
console.log(` ${icon} [${issue.file}] ${issue.message}`);
|
|
346
|
+
}
|
|
347
|
+
console.log('');
|
|
348
|
+
console.log(`${errors.length} error(s), ${warnings.length} warning(s), ${infos.length} info`);
|
|
349
|
+
if (errors.length > 0) {
|
|
350
|
+
throw new AiwgError({
|
|
351
|
+
code: 'ERR_CONFIG_VALIDATION',
|
|
352
|
+
message: `Config validation failed with ${errors.length} error(s)`,
|
|
353
|
+
hint: 'Fix the errors listed above, or run: aiwg config edit',
|
|
354
|
+
exitCode: EXIT_CODES.CONFIG,
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
async function handleProjectValidate(args) {
|
|
359
|
+
const { getProjectDir, readAiwgConfig, resolveIssueLabels, validateExternalLinks, validateIndexConfig, validateIssueLabels, } = await import('./aiwg-config.js');
|
|
360
|
+
const projectDir = getProjectDir(undefined, args);
|
|
361
|
+
const cfg = await readAiwgConfig(projectDir);
|
|
362
|
+
if (!cfg) {
|
|
363
|
+
throw new AiwgError({
|
|
364
|
+
code: 'ERR_NO_PROJECT_CONFIG',
|
|
365
|
+
message: 'No .aiwg/aiwg.config in this project.',
|
|
366
|
+
hint: 'Run `aiwg init`, then configure project policy.',
|
|
367
|
+
exitCode: EXIT_CODES.CONFIG,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
const providerIndex = args.indexOf('--provider');
|
|
371
|
+
const providerArg = providerIndex >= 0 ? args[providerIndex + 1] : undefined;
|
|
372
|
+
const allowedProviders = ['gitea', 'github', 'local'];
|
|
373
|
+
if (providerArg && !allowedProviders.includes(providerArg)) {
|
|
374
|
+
throw new AiwgError({
|
|
375
|
+
code: 'ERR_INVALID_VALUE',
|
|
376
|
+
message: `Unsupported issue label provider '${providerArg}'.`,
|
|
377
|
+
hint: 'Use --provider gitea, --provider github, or --provider local.',
|
|
378
|
+
exitCode: EXIT_CODES.USAGE,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
const provider = providerArg;
|
|
382
|
+
const availableLabels = [];
|
|
383
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
384
|
+
if (args[i] === '--available-label' && args[i + 1])
|
|
385
|
+
availableLabels.push(args[++i]);
|
|
386
|
+
}
|
|
387
|
+
const indexErrors = validateIndexConfig(cfg.index).map((message) => ({
|
|
388
|
+
severity: 'error',
|
|
389
|
+
code: 'index',
|
|
390
|
+
message,
|
|
391
|
+
}));
|
|
392
|
+
const externalLinkErrors = validateExternalLinks(cfg.externalLinks).map((message) => ({
|
|
393
|
+
severity: 'error',
|
|
394
|
+
code: 'external-links',
|
|
395
|
+
message,
|
|
396
|
+
}));
|
|
397
|
+
const labelDiagnostics = provider
|
|
398
|
+
? validateIssueLabels(cfg.issues, {
|
|
399
|
+
provider,
|
|
400
|
+
...(availableLabels.length ? { availableLabels } : {}),
|
|
401
|
+
})
|
|
402
|
+
: cfg.issues?.labels
|
|
403
|
+
? validateIssueLabels(cfg.issues)
|
|
404
|
+
: resolveIssueLabels(undefined, 'local').diagnostics;
|
|
405
|
+
const diagnostics = [...indexErrors, ...externalLinkErrors, ...labelDiagnostics];
|
|
406
|
+
console.log(`Project config: ${projectDir}/.aiwg/aiwg.config\n`);
|
|
407
|
+
if (diagnostics.length === 0) {
|
|
408
|
+
console.log('✓ Project config valid');
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
for (const diagnostic of diagnostics) {
|
|
412
|
+
const icon = diagnostic.severity === 'error' ? '✗' : '!';
|
|
413
|
+
console.log(` ${icon} [${diagnostic.code}] ${diagnostic.message}`);
|
|
414
|
+
}
|
|
415
|
+
const errors = diagnostics.filter((diagnostic) => diagnostic.severity === 'error');
|
|
416
|
+
const warnings = diagnostics.filter((diagnostic) => diagnostic.severity === 'warning');
|
|
417
|
+
console.log(`\n${errors.length} error(s), ${warnings.length} warning(s)`);
|
|
418
|
+
if (errors.length) {
|
|
419
|
+
throw new AiwgError({
|
|
420
|
+
code: 'ERR_CONFIG_VALIDATION',
|
|
421
|
+
message: `Project config validation failed with ${errors.length} error(s)`,
|
|
422
|
+
hint: 'Fix the reported taxonomy or index configuration. Missing tracker labels must be provisioned explicitly.',
|
|
423
|
+
exitCode: EXIT_CODES.CONFIG,
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
async function handleReset(config, args) {
|
|
428
|
+
const isProject = args.includes('--project');
|
|
429
|
+
const positional = args.filter(a => a !== '--project');
|
|
430
|
+
const key = positional[0];
|
|
431
|
+
if (isProject) {
|
|
432
|
+
await projectConfigReset(key, args);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
if (key) {
|
|
436
|
+
await config.reset(key);
|
|
437
|
+
console.log(`Reset ${key} to default`);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
await config.reset();
|
|
441
|
+
console.log('Reset all config to defaults');
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Reset a project-config key to its provider-aware default.
|
|
446
|
+
*
|
|
447
|
+
* Currently scoped to the `parallelism` block (#1359). Resetting
|
|
448
|
+
* `parallelism` (no field suffix) restores the block to the primary
|
|
449
|
+
* provider's defaults. Resetting a specific field like
|
|
450
|
+
* `parallelism.max_parallel_subagents` restores just that field.
|
|
451
|
+
*/
|
|
452
|
+
async function projectConfigReset(key, args) {
|
|
453
|
+
const { readAiwgConfig, writeAiwgConfig, getProjectDir, getProviderParallelismDefaults, } = await import('./aiwg-config.js');
|
|
454
|
+
if (!key) {
|
|
455
|
+
throw new AiwgError({
|
|
456
|
+
code: 'ERR_USAGE_MISSING_ARG',
|
|
457
|
+
message: 'aiwg config reset --project requires a key',
|
|
458
|
+
hint: 'Example: aiwg config reset --project parallelism',
|
|
459
|
+
exitCode: EXIT_CODES.USAGE,
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
const projectDir = getProjectDir(undefined, args);
|
|
463
|
+
const cfg = await readAiwgConfig(projectDir);
|
|
464
|
+
if (!cfg) {
|
|
465
|
+
throw new AiwgError({
|
|
466
|
+
code: 'ERR_NO_PROJECT_CONFIG',
|
|
467
|
+
message: 'No .aiwg/aiwg.config in this project.',
|
|
468
|
+
hint: 'Run `aiwg init`, then ask your AIWG agent to establish project policy.',
|
|
469
|
+
exitCode: EXIT_CODES.CONFIG,
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
const primary = cfg.providers[0];
|
|
473
|
+
const defaults = getProviderParallelismDefaults(primary);
|
|
474
|
+
if (key === 'parallelism') {
|
|
475
|
+
cfg.parallelism = {
|
|
476
|
+
max_parallel_subagents: defaults.max_parallel_subagents,
|
|
477
|
+
max_parallel_ralph_loops: defaults.max_parallel_ralph_loops,
|
|
478
|
+
max_parallel_mc_missions: defaults.max_parallel_mc_missions,
|
|
479
|
+
rationale: `Reset to provider default for ${primary ?? 'unknown'}`,
|
|
480
|
+
};
|
|
481
|
+
await writeAiwgConfig(projectDir, cfg);
|
|
482
|
+
console.log(`Reset --project parallelism to provider default (${primary ?? 'unknown'})`);
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
if (key.startsWith('parallelism.')) {
|
|
486
|
+
const field = key.slice('parallelism.'.length);
|
|
487
|
+
if (field in defaults) {
|
|
488
|
+
cfg.parallelism = cfg.parallelism ?? {};
|
|
489
|
+
cfg.parallelism[field] = defaults[field];
|
|
490
|
+
await writeAiwgConfig(projectDir, cfg);
|
|
491
|
+
console.log(`Reset --project ${key} to provider default (${defaults[field]})`);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
throw new AiwgError({
|
|
496
|
+
code: 'ERR_INVALID_KEY',
|
|
497
|
+
message: `Reset for project key '${key}' is not supported.`,
|
|
498
|
+
hint: 'Supported: parallelism, parallelism.max_parallel_subagents, parallelism.max_parallel_ralph_loops, parallelism.max_parallel_mc_missions',
|
|
499
|
+
exitCode: EXIT_CODES.USAGE,
|
|
500
|
+
});
|
|
501
|
+
}
|
|
502
|
+
function handlePath(config) {
|
|
503
|
+
console.log(config.getPath());
|
|
504
|
+
}
|
|
505
|
+
async function handleEdit(config) {
|
|
506
|
+
const editor = process.env.EDITOR || process.env.VISUAL || 'vi';
|
|
507
|
+
const configPath = `${config.getPath()}/config.yaml`;
|
|
508
|
+
// Ensure the config file exists before opening
|
|
509
|
+
await config.ensureDir();
|
|
510
|
+
const { execSync } = await import('child_process');
|
|
511
|
+
try {
|
|
512
|
+
execSync(`${editor} "${configPath}"`, { stdio: 'inherit' });
|
|
513
|
+
}
|
|
514
|
+
catch (err) {
|
|
515
|
+
throw new AiwgError({
|
|
516
|
+
code: 'ERR_EDITOR_FAILED',
|
|
517
|
+
message: `Failed to open editor: ${editor}`,
|
|
518
|
+
hint: 'Set EDITOR or VISUAL to a valid editor binary, or edit the file directly',
|
|
519
|
+
exitCode: EXIT_CODES.GENERAL,
|
|
520
|
+
cause: err,
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* `aiwg config show --project [--json]` — print the resolved project-level
|
|
526
|
+
* .aiwg/aiwg.config (#999).
|
|
527
|
+
*
|
|
528
|
+
* Without `--project`, prints a hint pointing at `list` (user config) or
|
|
529
|
+
* `show --project` (project config). Project mode resolves the remotes block
|
|
530
|
+
* via the same defaults the rest of AIWG uses (origin → primary → issue/ci).
|
|
531
|
+
*/
|
|
532
|
+
async function handleShow(args) {
|
|
533
|
+
const isProject = args.includes('--project');
|
|
534
|
+
const isJson = args.includes('--json');
|
|
535
|
+
if (!isProject) {
|
|
536
|
+
console.log(`aiwg config show requires a scope flag.
|
|
537
|
+
|
|
538
|
+
For user-level config: aiwg config list
|
|
539
|
+
For project-level config: aiwg config show --project [--json]
|
|
540
|
+
`);
|
|
541
|
+
throw new AiwgError({
|
|
542
|
+
code: 'ERR_USAGE_MISSING_FLAG',
|
|
543
|
+
message: 'aiwg config show requires --project (or use `aiwg config list` for user config)',
|
|
544
|
+
hint: 'Try: aiwg config show --project',
|
|
545
|
+
exitCode: EXIT_CODES.USAGE,
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
// Lazy-import to keep startup cost low for unrelated subcommands.
|
|
549
|
+
const { readAiwgConfig, resolveRemotes, getProjectDir } = await import('./aiwg-config.js');
|
|
550
|
+
const { spawnSync } = await import('child_process');
|
|
551
|
+
const projectDir = getProjectDir(undefined, args);
|
|
552
|
+
const cfg = await readAiwgConfig(projectDir);
|
|
553
|
+
if (!cfg) {
|
|
554
|
+
throw new AiwgError({
|
|
555
|
+
code: 'ERR_NO_PROJECT_CONFIG',
|
|
556
|
+
message: 'No .aiwg/aiwg.config in this project.',
|
|
557
|
+
hint: 'Run `aiwg init`, then ask your AIWG agent to set up repo/tracker/delivery policy.',
|
|
558
|
+
exitCode: EXIT_CODES.CONFIG,
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
const resolvedRemotes = resolveRemotes(cfg.remotes);
|
|
562
|
+
// Resolve each declared remote name to its URL via git. Best-effort.
|
|
563
|
+
function getUrl(name) {
|
|
564
|
+
const r = spawnSync('git', ['-C', projectDir, 'remote', 'get-url', name], {
|
|
565
|
+
encoding: 'utf-8',
|
|
566
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
567
|
+
});
|
|
568
|
+
if (r.status !== 0)
|
|
569
|
+
return null;
|
|
570
|
+
const out = r.stdout?.toString().trim();
|
|
571
|
+
return out || null;
|
|
572
|
+
}
|
|
573
|
+
const remotesView = {
|
|
574
|
+
primary: { name: resolvedRemotes.primary, url: getUrl(resolvedRemotes.primary) },
|
|
575
|
+
issue_tracker: { name: resolvedRemotes.issue_tracker, url: getUrl(resolvedRemotes.issue_tracker) },
|
|
576
|
+
ci: { name: resolvedRemotes.ci, url: getUrl(resolvedRemotes.ci) },
|
|
577
|
+
secondary: resolvedRemotes.secondary.map((s) => ({
|
|
578
|
+
...s,
|
|
579
|
+
url: getUrl(s.name),
|
|
580
|
+
})),
|
|
581
|
+
has_remotes_block: !!cfg.remotes,
|
|
582
|
+
};
|
|
583
|
+
if (isJson) {
|
|
584
|
+
console.log(JSON.stringify({
|
|
585
|
+
project_dir: projectDir,
|
|
586
|
+
version: cfg.version,
|
|
587
|
+
providers: cfg.providers,
|
|
588
|
+
installed: cfg.installed,
|
|
589
|
+
scripts: cfg.scripts,
|
|
590
|
+
externalLinks: cfg.externalLinks ?? {},
|
|
591
|
+
remotes: remotesView,
|
|
592
|
+
}, null, 2));
|
|
593
|
+
return;
|
|
594
|
+
}
|
|
595
|
+
// Human-readable view
|
|
596
|
+
console.log(`Project config: ${projectDir}/.aiwg/aiwg.config\n`);
|
|
597
|
+
console.log(`Schema version: ${cfg.version}`);
|
|
598
|
+
console.log(`Providers: ${cfg.providers.join(', ') || '(none)'}`);
|
|
599
|
+
console.log('');
|
|
600
|
+
console.log('Installed frameworks:');
|
|
601
|
+
const installed = Object.entries(cfg.installed);
|
|
602
|
+
if (installed.length === 0) {
|
|
603
|
+
console.log(' (none)');
|
|
604
|
+
}
|
|
605
|
+
else {
|
|
606
|
+
for (const [name, entry] of installed) {
|
|
607
|
+
const providers = Object.keys(entry.deployedTo).join(', ') || '(no targets)';
|
|
608
|
+
console.log(` - ${name} v${entry.version} → ${providers}`);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
console.log('');
|
|
612
|
+
console.log('External links:');
|
|
613
|
+
const externalLinks = Object.entries(cfg.externalLinks ?? {});
|
|
614
|
+
if (externalLinks.length === 0) {
|
|
615
|
+
console.log(' (none)');
|
|
616
|
+
}
|
|
617
|
+
else {
|
|
618
|
+
for (const [key, link] of externalLinks) {
|
|
619
|
+
const metadata = [link.category, link.audience].filter(Boolean).join(', ');
|
|
620
|
+
console.log(` - ${key}: ${link.label} — ${link.url}${metadata ? ` [${metadata}]` : ''}`);
|
|
621
|
+
if (link.description)
|
|
622
|
+
console.log(` ${link.description}`);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
console.log('');
|
|
626
|
+
console.log('Remote topology:');
|
|
627
|
+
if (!remotesView.has_remotes_block) {
|
|
628
|
+
console.log(' (no `remotes` block — defaults: origin is primary, issue tracker, and CI)');
|
|
629
|
+
}
|
|
630
|
+
const fmt = (label, ref) => {
|
|
631
|
+
const u = ref.url ? ` (${ref.url})` : ' (no such remote in `git remote`)';
|
|
632
|
+
return ` ${label}: ${ref.name}${u}`;
|
|
633
|
+
};
|
|
634
|
+
console.log(fmt('Primary ', remotesView.primary));
|
|
635
|
+
if (remotesView.issue_tracker.name !== remotesView.primary.name) {
|
|
636
|
+
console.log(fmt('Issue tracker ', remotesView.issue_tracker));
|
|
637
|
+
}
|
|
638
|
+
if (remotesView.ci.name !== remotesView.primary.name) {
|
|
639
|
+
console.log(fmt('CI ', remotesView.ci));
|
|
640
|
+
}
|
|
641
|
+
for (const sec of remotesView.secondary) {
|
|
642
|
+
const purpose = sec.purpose ? ` — ${sec.purpose}` : '';
|
|
643
|
+
const release = sec.push_on_release ? ' [push tags on release]' : '';
|
|
644
|
+
const u = sec.url ? ` (${sec.url})` : ' (no such remote in `git remote`)';
|
|
645
|
+
console.log(` Secondary : ${sec.name}${u}${purpose}${release}`);
|
|
646
|
+
}
|
|
647
|
+
console.log('');
|
|
648
|
+
}
|
|
649
|
+
async function handleGitignore(args) {
|
|
650
|
+
const { spawnSync } = await import('child_process');
|
|
651
|
+
// Locate the gitignore CLI script relative to this compiled module
|
|
652
|
+
// (#1228). At runtime this module lives at `dist/src/config/cli.js`,
|
|
653
|
+
// so we need three `..` segments to reach the package root where
|
|
654
|
+
// `tools/cli/` is shipped (see package.json `files`).
|
|
655
|
+
const scriptPath = path.resolve(_scriptDir, '../../../tools/cli/config-gitignore.mjs');
|
|
656
|
+
const result = spawnSync(process.execPath, [scriptPath, ...args], { stdio: 'inherit' });
|
|
657
|
+
if (result.status !== 0) {
|
|
658
|
+
process.exit(result.status ?? 1);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
function printUsage() {
|
|
662
|
+
console.log(`Usage: aiwg config <subcommand> [options]
|
|
663
|
+
|
|
664
|
+
Subcommands:
|
|
665
|
+
get <key> Read a user config value
|
|
666
|
+
get --project <key> Read a project config value (.aiwg/aiwg.config)
|
|
667
|
+
set <key> <value> Write a user config value
|
|
668
|
+
set --project <key> <value> Write a project config value (validates enums)
|
|
669
|
+
list Show all user config
|
|
670
|
+
show --project Show resolved project config (.aiwg/aiwg.config)
|
|
671
|
+
validate Validate user config files
|
|
672
|
+
validate --project Validate .aiwg/aiwg.config taxonomy/index semantics
|
|
673
|
+
[--provider gitea|github|local] [--available-label NAME ...]
|
|
674
|
+
reset [<key>] Reset key or all config to defaults
|
|
675
|
+
path Print config directory path
|
|
676
|
+
edit Open config in $EDITOR
|
|
677
|
+
gitignore Show/check/fix .gitignore AIWG entries
|
|
678
|
+
|
|
679
|
+
Global flags:
|
|
680
|
+
--config-dir <path> Override config directory
|
|
681
|
+
|
|
682
|
+
Examples:
|
|
683
|
+
aiwg config get defaults.provider
|
|
684
|
+
aiwg config set defaults.verbosity quiet
|
|
685
|
+
aiwg config set updates.channel next
|
|
686
|
+
aiwg config list
|
|
687
|
+
aiwg config show --project
|
|
688
|
+
aiwg config show --project --json
|
|
689
|
+
aiwg config get --project delivery.mode
|
|
690
|
+
aiwg config set --project delivery.mode pr-required
|
|
691
|
+
aiwg config set --project delivery.merge_style squash
|
|
692
|
+
aiwg config get --project parallelism
|
|
693
|
+
aiwg config set --project parallelism.max_parallel_subagents 6
|
|
694
|
+
aiwg config reset --project parallelism
|
|
695
|
+
aiwg config validate
|
|
696
|
+
aiwg config path
|
|
697
|
+
aiwg config reset defaults.provider
|
|
698
|
+
aiwg config --config-dir /custom/path list
|
|
699
|
+
aiwg config gitignore
|
|
700
|
+
aiwg config gitignore --fix
|
|
701
|
+
aiwg config gitignore --check`);
|
|
702
|
+
}
|
|
703
|
+
//# sourceMappingURL=cli.js.map
|