@aiwg/cli 0.0.0-bootstrap.0 → 2026.7.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +22 -1
- package/bin/aiwg.mjs +349 -0
- package/dist/src/a2a/agent-card.js +145 -0
- package/dist/src/a2a/client.js +411 -0
- package/dist/src/a2a/hitl-cli.js +171 -0
- package/dist/src/a2a/hitl-driver.js +370 -0
- package/dist/src/a2a/hitl.js +181 -0
- package/dist/src/a2a/http.js +193 -0
- package/dist/src/a2a/jcs.js +128 -0
- package/dist/src/a2a/jws.js +187 -0
- package/dist/src/a2a/types.js +24 -0
- package/dist/src/a2a/webhook.js +240 -0
- package/dist/src/activity-log/cli.js +348 -0
- package/dist/src/activity-log/parser.js +81 -0
- package/dist/src/activity-log/types.js +50 -0
- package/dist/src/agents/agent-deployer.js +367 -0
- package/dist/src/agents/agent-packager.js +271 -0
- package/dist/src/agents/agent-validator.js +271 -0
- package/dist/src/agents/grounding/knowledge-base.js +161 -0
- package/dist/src/agents/grounding/types.js +12 -0
- package/dist/src/agents/index.js +10 -0
- package/dist/src/agents/packaged-agent-inventory.js +75 -0
- package/dist/src/agents/types.js +7 -0
- package/dist/src/api/index.d.ts +10 -0
- package/dist/src/api/index.js +10 -0
- package/dist/src/artifacts/address-parser.js +73 -0
- package/dist/src/artifacts/audit/cli.js +183 -0
- package/dist/src/artifacts/audit/drift.js +122 -0
- package/dist/src/artifacts/audit/types.js +12 -0
- package/dist/src/artifacts/backends/graphology-backend.js +160 -0
- package/dist/src/artifacts/backends/json-backend.js +129 -0
- package/dist/src/artifacts/backends/sqlite-backend.js +199 -0
- package/dist/src/artifacts/browser-export.js +622 -0
- package/dist/src/artifacts/capability-resolver.js +94 -0
- package/dist/src/artifacts/checksum-manifest.js +91 -0
- package/dist/src/artifacts/citation-parser.js +162 -0
- package/dist/src/artifacts/cli.js +1486 -0
- package/dist/src/artifacts/corpus-tools/citation-densify.js +311 -0
- package/dist/src/artifacts/corpus-tools/cli.js +393 -0
- package/dist/src/artifacts/corpus-tools/corpus-graph.js +225 -0
- package/dist/src/artifacts/corpus-tools/curator.js +186 -0
- package/dist/src/artifacts/corpus-tools/discovery-log.js +70 -0
- package/dist/src/artifacts/corpus-tools/funder-network.js +141 -0
- package/dist/src/artifacts/corpus-tools/induction-audit.js +233 -0
- package/dist/src/artifacts/corpus-tools/integrity-scan.js +202 -0
- package/dist/src/artifacts/corpus-tools/profile-communities.js +166 -0
- package/dist/src/artifacts/corpus-tools/profile-edges.js +72 -0
- package/dist/src/artifacts/corpus-tools/profile-embed.js +113 -0
- package/dist/src/artifacts/corpus-tools/profile-generate-fm.js +167 -0
- package/dist/src/artifacts/corpus-tools/profile-generate.js +181 -0
- package/dist/src/artifacts/corpus-tools/profile-metrics.js +98 -0
- package/dist/src/artifacts/corpus-tools/profile-status.js +86 -0
- package/dist/src/artifacts/corpus-tools/profile-temporal.js +139 -0
- package/dist/src/artifacts/corpus-tools/radar-init.js +93 -0
- package/dist/src/artifacts/corpus-tools/radar-report.js +118 -0
- package/dist/src/artifacts/corpus-tools/radar-shared.js +189 -0
- package/dist/src/artifacts/corpus-tools/radar-status.js +68 -0
- package/dist/src/artifacts/corpus-tools/sidecar-lint.js +233 -0
- package/dist/src/artifacts/corpus-tools/sidecar-repair.js +277 -0
- package/dist/src/artifacts/corpus-tools/snapshot.js +591 -0
- package/dist/src/artifacts/corpus-tools/source-types.js +164 -0
- package/dist/src/artifacts/corpus-tools/vision-extract.js +243 -0
- package/dist/src/artifacts/corpus-views/build.js +126 -0
- package/dist/src/artifacts/corpus-views/corpus-config.js +124 -0
- package/dist/src/artifacts/corpus-views/ref-parser.js +437 -0
- package/dist/src/artifacts/corpus-views/renderers.js +353 -0
- package/dist/src/artifacts/corpus-views/taxonomies.js +131 -0
- package/dist/src/artifacts/dep-graph.js +173 -0
- package/dist/src/artifacts/discover-facets.js +375 -0
- package/dist/src/artifacts/embedding-index.js +354 -0
- package/dist/src/artifacts/enrichment/cli.js +240 -0
- package/dist/src/artifacts/enrichment/prompt.js +47 -0
- package/dist/src/artifacts/enrichment/store.js +90 -0
- package/dist/src/artifacts/enrichment/types.js +12 -0
- package/dist/src/artifacts/fortemi-core-query-adapter.js +475 -0
- package/dist/src/artifacts/fortemi-core-sync.js +251 -0
- package/dist/src/artifacts/fortemi-shard-export.js +44 -0
- package/dist/src/artifacts/fulltext.js +108 -0
- package/dist/src/artifacts/graph-backend.js +51 -0
- package/dist/src/artifacts/graph-query.js +247 -0
- package/dist/src/artifacts/hybrid-query.js +225 -0
- package/dist/src/artifacts/index-builder.js +1089 -0
- package/dist/src/artifacts/index-reader.js +112 -0
- package/dist/src/artifacts/index-status.js +193 -0
- package/dist/src/artifacts/legacy-index-migration.js +169 -0
- package/dist/src/artifacts/move.js +154 -0
- package/dist/src/artifacts/operational-state.js +239 -0
- package/dist/src/artifacts/prebuilt-build-lock.js +49 -0
- package/dist/src/artifacts/query-engine.js +1955 -0
- package/dist/src/artifacts/source-graph.js +529 -0
- package/dist/src/artifacts/stats.js +169 -0
- package/dist/src/artifacts/types.js +606 -0
- package/dist/src/artifacts/views/cli.js +293 -0
- package/dist/src/artifacts/views/definition.js +170 -0
- package/dist/src/artifacts/views/store.js +149 -0
- package/dist/src/artifacts/views/types.js +8 -0
- package/dist/src/artifacts/watcher.js +255 -0
- package/dist/src/catalog/builtin-models.json +636 -0
- package/dist/src/catalog/cli.js +228 -0
- package/dist/src/catalog/cli.mjs +289 -0
- package/dist/src/catalog/index.js +15 -0
- package/dist/src/catalog/loader.js +217 -0
- package/dist/src/catalog/loader.mjs +251 -0
- package/dist/src/catalog/sources.json +41 -0
- package/dist/src/catalog/types.js +8 -0
- package/dist/src/channel/manager.mjs +504 -0
- package/dist/src/cli/agent-spawn.js +178 -0
- package/dist/src/cli/cli-extension-loader.js +245 -0
- package/dist/src/cli/command-log.js +275 -0
- package/dist/src/cli/config-loader.js +232 -0
- package/dist/src/cli/env.js +82 -0
- package/dist/src/cli/errors.js +150 -0
- package/dist/src/cli/find-package-root.js +40 -0
- package/dist/src/cli/git-hooks.js +250 -0
- package/dist/src/cli/handlers/agentcard.js +206 -0
- package/dist/src/cli/handlers/artifacts.js +76 -0
- package/dist/src/cli/handlers/best-practices-audit.js +280 -0
- package/dist/src/cli/handlers/cockpit.js +137 -0
- package/dist/src/cli/handlers/command-log.js +37 -0
- package/dist/src/cli/handlers/daemon.js +59 -0
- package/dist/src/cli/handlers/diagnose.js +300 -0
- package/dist/src/cli/handlers/execution-mode.js +105 -0
- package/dist/src/cli/handlers/feedback.js +341 -0
- package/dist/src/cli/handlers/help.js +147 -0
- package/dist/src/cli/handlers/index.js +302 -0
- package/dist/src/cli/handlers/init.js +179 -0
- package/dist/src/cli/handlers/install.js +129 -0
- package/dist/src/cli/handlers/issues.js +46 -0
- package/dist/src/cli/handlers/lint.js +42 -0
- package/dist/src/cli/handlers/local-executor.js +315 -0
- package/dist/src/cli/handlers/marketplace.js +168 -0
- package/dist/src/cli/handlers/mc.js +1010 -0
- package/dist/src/cli/handlers/models.js +352 -0
- package/dist/src/cli/handlers/packages.js +155 -0
- package/dist/src/cli/handlers/ralph-launcher.js +717 -0
- package/dist/src/cli/handlers/ralph.js +575 -0
- package/dist/src/cli/handlers/refresh.js +432 -0
- package/dist/src/cli/handlers/regenerate.js +336 -0
- package/dist/src/cli/handlers/repo-access.js +109 -0
- package/dist/src/cli/handlers/run.js +165 -0
- package/dist/src/cli/handlers/runtime-info.js +301 -0
- package/dist/src/cli/handlers/sandbox.js +197 -0
- package/dist/src/cli/handlers/scaffolding.js +149 -0
- package/dist/src/cli/handlers/script-runner.js +121 -0
- package/dist/src/cli/handlers/sdlc-accelerate.js +148 -0
- package/dist/src/cli/handlers/serve.js +1835 -0
- package/dist/src/cli/handlers/session.js +348 -0
- package/dist/src/cli/handlers/setup.js +440 -0
- package/dist/src/cli/handlers/skill-lint.js +367 -0
- package/dist/src/cli/handlers/skill-usage.js +74 -0
- package/dist/src/cli/handlers/steward.js +567 -0
- package/dist/src/cli/handlers/subcommands.js +1702 -0
- package/dist/src/cli/handlers/team.js +337 -0
- package/dist/src/cli/handlers/types.js +11 -0
- package/dist/src/cli/handlers/use.js +2772 -0
- package/dist/src/cli/handlers/utilities.js +703 -0
- package/dist/src/cli/handlers/version.js +134 -0
- package/dist/src/cli/handlers/workspace-context.js +93 -0
- package/dist/src/cli/handlers/workspace.js +126 -0
- package/dist/src/cli/help-generator.js +178 -0
- package/dist/src/cli/hooks/builtin/activity-log-hook.js +126 -0
- package/dist/src/cli/hooks/executor.js +96 -0
- package/dist/src/cli/hooks/index.js +15 -0
- package/dist/src/cli/hooks/registry.js +143 -0
- package/dist/src/cli/hooks/types.js +13 -0
- package/dist/src/cli/log.js +492 -0
- package/dist/src/cli/project-isolation/detect.js +70 -0
- package/dist/src/cli/project-isolation/index.js +7 -0
- package/dist/src/cli/project-isolation/signals.js +17 -0
- package/dist/src/cli/project-isolation/warning.js +102 -0
- package/dist/src/cli/prompt-utils.js +155 -0
- package/dist/src/cli/provider-deployment-plan.js +126 -0
- package/dist/src/cli/provider-resolution.js +119 -0
- package/dist/src/cli/router.js +305 -0
- package/dist/src/cli/scope-resolver.js +392 -0
- package/dist/src/cli/skill-usage.js +616 -0
- package/dist/src/cli/ui.js +224 -0
- package/dist/src/cli/watch-service.js +203 -0
- package/dist/src/cli/workflow-orchestrator.js +478 -0
- package/dist/src/cli/workspace-signals.js +321 -0
- package/dist/src/community/footer.js +14 -0
- package/dist/src/community/links.js +123 -0
- package/dist/src/community/milestones.js +46 -0
- package/dist/src/community/nudge-policy.js +93 -0
- package/dist/src/config/aiwg-config.js +883 -0
- package/dist/src/config/cli.js +703 -0
- package/dist/src/config/gitignore.js +156 -0
- package/dist/src/config/project-artifacts.js +76 -0
- package/dist/src/config/user-config.js +428 -0
- package/dist/src/config/user-registry.js +127 -0
- package/dist/src/config/workspace.js +276 -0
- package/dist/src/contributors/detect.js +39 -0
- package/dist/src/contributors/discover.js +172 -0
- package/dist/src/contributors/heuristic.js +186 -0
- package/dist/src/contributors/index.js +11 -0
- package/dist/src/contributors/types.js +13 -0
- package/dist/src/contributors/validation.js +116 -0
- package/dist/src/data/community.schema.json +43 -0
- package/dist/src/data/community.yaml +16 -0
- package/dist/src/extensions/capability-index.js +270 -0
- package/dist/src/extensions/claude-hooks-installer.js +268 -0
- package/dist/src/extensions/commands/definitions.js +3485 -0
- package/dist/src/extensions/deployment-registration.js +463 -0
- package/dist/src/extensions/index.js +22 -0
- package/dist/src/extensions/loader.js +132 -0
- package/dist/src/extensions/managed-marker.js +100 -0
- package/dist/src/extensions/manifest.js +196 -0
- package/dist/src/extensions/project-local-activity.js +114 -0
- package/dist/src/extensions/project-local-discovery.js +261 -0
- package/dist/src/extensions/project-local-doctor.js +281 -0
- package/dist/src/extensions/project-local-gitignore.js +176 -0
- package/dist/src/extensions/project-local-paths.js +121 -0
- package/dist/src/extensions/project-local-promote.js +218 -0
- package/dist/src/extensions/project-local-remove.js +373 -0
- package/dist/src/extensions/project-local-scaffold.js +252 -0
- package/dist/src/extensions/project-quickref.js +291 -0
- package/dist/src/extensions/registry.js +368 -0
- package/dist/src/extensions/shadow-resolver.js +271 -0
- package/dist/src/extensions/types.js +86 -0
- package/dist/src/extensions/upstream-registry.js +195 -0
- package/dist/src/extensions/validation.js +631 -0
- package/dist/src/features/catalog.js +88 -0
- package/dist/src/features/cli.js +197 -0
- package/dist/src/features/installer.js +57 -0
- package/dist/src/features/paths.js +14 -0
- package/dist/src/features/runtime.js +21 -0
- package/dist/src/features/status.js +134 -0
- package/dist/src/hooks/laziness-detection.js +532 -0
- package/dist/src/intake/git-history-analyzer.js +486 -0
- package/dist/src/intake/index.js +9 -0
- package/dist/src/issues/cli.js +327 -0
- package/dist/src/issues/index.js +5 -0
- package/dist/src/issues/live.js +154 -0
- package/dist/src/issues/local.js +666 -0
- package/dist/src/issues/sync.js +143 -0
- package/dist/src/issues/types.js +2 -0
- package/dist/src/issues/workflows.js +164 -0
- package/dist/src/kb/cli.js +173 -0
- package/dist/src/lint/cli.js +171 -0
- package/dist/src/lint/loader.js +225 -0
- package/dist/src/lint/reporters.js +141 -0
- package/dist/src/lint/runner.js +364 -0
- package/dist/src/lint/types.js +10 -0
- package/dist/src/marketplace/cache.js +110 -0
- package/dist/src/marketplace/identifier.js +63 -0
- package/dist/src/marketplace/registry.js +36 -0
- package/dist/src/marketplace/sources/clawhub.js +53 -0
- package/dist/src/marketplace/sources/git.js +45 -0
- package/dist/src/marketplace/types.js +9 -0
- package/dist/src/mcp/adapters/codex-runtime.js +224 -0
- package/dist/src/mcp/cli.mjs +1197 -0
- package/dist/src/mcp/elicitation.mjs +149 -0
- package/dist/src/mcp/helpers.mjs +287 -0
- package/dist/src/mcp/index.mjs +11 -0
- package/dist/src/mcp/profiles.js +263 -0
- package/dist/src/mcp/profiles.mjs +360 -0
- package/dist/src/mcp/registry.js +376 -0
- package/dist/src/mcp/registry.mjs +387 -0
- package/dist/src/mcp/server.mjs +633 -0
- package/dist/src/mcp/test-simple.mjs +271 -0
- package/dist/src/mcp/tools/command-run.mjs +101 -0
- package/dist/src/mcp/tools/discovery.mjs +291 -0
- package/dist/src/mcp/tools/interaction.mjs +87 -0
- package/dist/src/mcp/tools/orchestration.mjs +320 -0
- package/dist/src/mcp/tools/subsystems.mjs +640 -0
- package/dist/src/memory/cli.js +166 -0
- package/dist/src/memory/project-registry.js +282 -0
- package/dist/src/metrics/artifact-metrics.js +184 -0
- package/dist/src/metrics/context-budget.js +174 -0
- package/dist/src/metrics/token-counter.js +133 -0
- package/dist/src/models/config-loader.js +228 -0
- package/dist/src/models/index.js +22 -0
- package/dist/src/models/model-capabilities.v1.json +120 -0
- package/dist/src/models/model-catalog.v1.json +96 -0
- package/dist/src/models/model-discovery.js +521 -0
- package/dist/src/models/provider-models.js +73 -0
- package/dist/src/models/provider-policy.js +273 -0
- package/dist/src/models/resolver.js +245 -0
- package/dist/src/models/router.js +70 -0
- package/dist/src/models/types.js +8 -0
- package/dist/src/models/wrapper-deployment.js +178 -0
- package/dist/src/models/wrapper-route.js +54 -0
- package/dist/src/ops/cli.js +268 -0
- package/dist/src/ops/registry.js +623 -0
- package/dist/src/packages/adapters/clawhub.js +113 -0
- package/dist/src/packages/adapters/git.js +153 -0
- package/dist/src/packages/adapters/gitea.js +93 -0
- package/dist/src/packages/adapters/github.js +69 -0
- package/dist/src/packages/adapters/local-cache.js +89 -0
- package/dist/src/packages/package-registry.js +143 -0
- package/dist/src/packages/registry.js +238 -0
- package/dist/src/packages/types.js +11 -0
- package/dist/src/plugin/cross-framework-ops.js +475 -0
- package/dist/src/plugin/framework-config-loader.js +235 -0
- package/dist/src/plugin/framework-detector.js +186 -0
- package/dist/src/plugin/framework-isolator.js +341 -0
- package/dist/src/plugin/framework-migration.js +371 -0
- package/dist/src/plugin/metadata-validator.js +906 -0
- package/dist/src/plugin/plugin-installer.js +436 -0
- package/dist/src/plugin/plugin-status.js +369 -0
- package/dist/src/plugin/plugin-uninstaller.js +473 -0
- package/dist/src/plugin/registry-validator.js +344 -0
- package/dist/src/plugin/skill-command-translator.js +415 -0
- package/dist/src/plugin/workspace-creator.js +189 -0
- package/dist/src/plugin/workspace-migrator.js +821 -0
- package/dist/src/policy/authorization.js +390 -0
- package/dist/src/policy/repo-access.js +215 -0
- package/dist/src/provenance/cli.js +16 -0
- package/dist/src/providers/capability-matrix.js +300 -0
- package/dist/src/providers/capability-matrix.yaml +514 -0
- package/dist/src/providers/provider-definitions.js +977 -0
- package/dist/src/providers/provider-definitions.mjs +159 -0
- package/dist/src/providers/provider-inventory.js +169 -0
- package/dist/src/quality/feedback-ab.js +174 -0
- package/dist/src/quality/feedback-collector.js +176 -0
- package/dist/src/quality/feedback-tracker.js +123 -0
- package/dist/src/quality/patterns/adr.json +24 -0
- package/dist/src/quality/patterns/sad.json +24 -0
- package/dist/src/quality/patterns/test-plan.json +24 -0
- package/dist/src/quality/patterns/use-case.json +24 -0
- package/dist/src/quality/scoring.js +157 -0
- package/dist/src/reflections/cli.js +15 -0
- package/dist/src/release/plan.js +139 -0
- package/dist/src/research/cache/manager.js +227 -0
- package/dist/src/research/clients/arxiv.js +156 -0
- package/dist/src/research/clients/base.js +197 -0
- package/dist/src/research/clients/crossref.js +112 -0
- package/dist/src/research/clients/semantic-scholar.js +126 -0
- package/dist/src/research/clients/unpaywall.js +87 -0
- package/dist/src/research/index.js +14 -0
- package/dist/src/research/query-cli.js +336 -0
- package/dist/src/research/services/acquisition.js +313 -0
- package/dist/src/research/services/archival.js +225 -0
- package/dist/src/research/services/citation.js +279 -0
- package/dist/src/research/services/discovery.js +243 -0
- package/dist/src/research/services/documentation.js +269 -0
- package/dist/src/research/services/index.js +14 -0
- package/dist/src/research/services/provenance.js +279 -0
- package/dist/src/research/services/quality.js +370 -0
- package/dist/src/research/services/types.js +7 -0
- package/dist/src/research/storage-cli.js +20 -0
- package/dist/src/research/types.js +47 -0
- package/dist/src/resources/index.d.ts +2 -0
- package/dist/src/resources/index.js +2 -0
- package/dist/src/resources/web-release.d.ts +89 -0
- package/dist/src/resources/web-release.js +886 -0
- package/dist/src/rlm/cache/cli.js +162 -0
- package/dist/src/rlm/cache/hash.js +35 -0
- package/dist/src/rlm/cache/store.js +170 -0
- package/dist/src/rlm/cache/types.js +8 -0
- package/dist/src/rlm/cli.js +650 -0
- package/dist/src/serve/a2a-terminal-observer.js +120 -0
- package/dist/src/serve/agent-router.js +205 -0
- package/dist/src/serve/dispatch-router.js +171 -0
- package/dist/src/serve/executor-registry.js +715 -0
- package/dist/src/serve/mission-conductor.js +177 -0
- package/dist/src/serve/orchestrator-adapter.js +113 -0
- package/dist/src/serve/orchestrator-override.js +94 -0
- package/dist/src/serve/orchestrator-pty.js +133 -0
- package/dist/src/serve/pty-bridge.js +799 -0
- package/dist/src/serve/sandbox-registry.js +832 -0
- package/dist/src/serve/screen-reader.js +228 -0
- package/dist/src/serve/stack-adapters.js +68 -0
- package/dist/src/serve/telemetry.js +143 -0
- package/dist/src/skills/adapters/clawhub.js +250 -0
- package/dist/src/skills/adapters/local.js +335 -0
- package/dist/src/skills/adapters/openclaw.js +316 -0
- package/dist/src/skills/cli.js +334 -0
- package/dist/src/skills/registry.js +117 -0
- package/dist/src/skills/run.js +259 -0
- package/dist/src/skills/runtime.js +94 -0
- package/dist/src/skills/types.js +10 -0
- package/dist/src/smiths/agentsmith/demo.js +116 -0
- package/dist/src/smiths/agentsmith/examples.js +300 -0
- package/dist/src/smiths/agentsmith/generator.js +503 -0
- package/dist/src/smiths/agentsmith/index.js +11 -0
- package/dist/src/smiths/agentsmith/types.js +8 -0
- package/dist/src/smiths/commandsmith/example.js +220 -0
- package/dist/src/smiths/commandsmith/generator.js +288 -0
- package/dist/src/smiths/commandsmith/index.js +41 -0
- package/dist/src/smiths/commandsmith/templates.js +296 -0
- package/dist/src/smiths/commandsmith/types.js +7 -0
- package/dist/src/smiths/context-pipeline/aiwg-md.js +104 -0
- package/dist/src/smiths/context-pipeline/allowlist.js +195 -0
- package/dist/src/smiths/context-pipeline/claude-hook.js +127 -0
- package/dist/src/smiths/context-pipeline/discovery.js +187 -0
- package/dist/src/smiths/context-pipeline/external-links-section.js +49 -0
- package/dist/src/smiths/context-pipeline/finalization.js +147 -0
- package/dist/src/smiths/context-pipeline/generator.js +477 -0
- package/dist/src/smiths/context-pipeline/index.js +30 -0
- package/dist/src/smiths/context-pipeline/legacy-inject.js +103 -0
- package/dist/src/smiths/context-pipeline/managed-hook.js +95 -0
- package/dist/src/smiths/context-pipeline/overflow.js +212 -0
- package/dist/src/smiths/context-pipeline/parallelism-section.js +94 -0
- package/dist/src/smiths/context-pipeline/provider-policy.js +64 -0
- package/dist/src/smiths/context-pipeline/sanitizer.js +93 -0
- package/dist/src/smiths/context-pipeline/types.js +23 -0
- package/dist/src/smiths/context-pipeline/workspace-context.js +988 -0
- package/dist/src/smiths/hook-bridge/codex-translator.js +129 -0
- package/dist/src/smiths/hook-bridge/copilot-translator.js +64 -0
- package/dist/src/smiths/hook-bridge/factory-translator.js +43 -0
- package/dist/src/smiths/hook-bridge/hermes-translator.js +88 -0
- package/dist/src/smiths/hook-bridge/index.js +79 -0
- package/dist/src/smiths/hook-bridge/loader.js +116 -0
- package/dist/src/smiths/hook-bridge/shim.js +89 -0
- package/dist/src/smiths/hook-bridge/types.js +31 -0
- package/dist/src/smiths/index.js +39 -0
- package/dist/src/smiths/mcpsmith/analyzers/cli-analyzer.js +390 -0
- package/dist/src/smiths/mcpsmith/example.js +119 -0
- package/dist/src/smiths/mcpsmith/generator.js +236 -0
- package/dist/src/smiths/mcpsmith/index.js +17 -0
- package/dist/src/smiths/mcpsmith/types.js +10 -0
- package/dist/src/smiths/platform-paths.js +101 -0
- package/dist/src/smiths/skillsmith/codex-sidecar.js +85 -0
- package/dist/src/smiths/skillsmith/collision-detector.js +249 -0
- package/dist/src/smiths/skillsmith/demo.js +83 -0
- package/dist/src/smiths/skillsmith/examples.js +161 -0
- package/dist/src/smiths/skillsmith/generator.js +316 -0
- package/dist/src/smiths/skillsmith/index.js +12 -0
- package/dist/src/smiths/skillsmith/namespace-adapter.js +180 -0
- package/dist/src/smiths/skillsmith/platform-resolver.js +157 -0
- package/dist/src/smiths/skillsmith/types.js +9 -0
- package/dist/src/smiths/toolsmith/index.js +10 -0
- package/dist/src/smiths/toolsmith/runtime-discovery.mjs +710 -0
- package/dist/src/smiths/toolsmith/types.js +8 -0
- package/dist/src/storage/backends/fortemi.js +227 -0
- package/dist/src/storage/backends/fs.js +134 -0
- package/dist/src/storage/backends/logseq.js +309 -0
- package/dist/src/storage/backends/obsidian.js +233 -0
- package/dist/src/storage/cli.js +468 -0
- package/dist/src/storage/config.js +272 -0
- package/dist/src/storage/index.js +108 -0
- package/dist/src/storage/subsystem-cli.js +201 -0
- package/dist/src/storage/types.js +33 -0
- package/dist/src/testing/corpus/corpus-builder.js +383 -0
- package/dist/src/testing/corpus/ground-truth-manager.js +460 -0
- package/dist/src/testing/corpus/index.js +10 -0
- package/dist/src/testing/fixtures/index.js +9 -0
- package/dist/src/testing/fixtures/test-data-factory.js +472 -0
- package/dist/src/testing/generators/index.js +11 -0
- package/dist/src/testing/generators/test-case-generator.js +393 -0
- package/dist/src/testing/generators/test-code-generator.js +384 -0
- package/dist/src/testing/generators/use-case-parser.js +325 -0
- package/dist/src/testing/index.js +11 -0
- package/dist/src/tracker/capability-protocol.js +118 -0
- package/dist/src/update/checker.mjs +396 -0
- package/dist/src/update/notifier.mjs +235 -0
- package/dist/src/writing/content-diversifier.js +804 -0
- package/dist/src/writing/example-generator.js +959 -0
- package/dist/src/writing/example-templates.js +99 -0
- package/dist/src/writing/pattern-library.js +486 -0
- package/dist/src/writing/patterns/banned-phrases.json +4413 -0
- package/dist/src/writing/patterns/formulaic-structures.json +1300 -0
- package/dist/src/writing/patterns/generic-adjectives.json +1510 -0
- package/dist/src/writing/patterns/hedging-language.json +2096 -0
- package/dist/src/writing/patterns/transition-words.json +1285 -0
- package/dist/src/writing/patterns/weak-verbs.json +1112 -0
- package/dist/src/writing/prompt-optimizer.js +660 -0
- package/dist/src/writing/prompt-templates.js +583 -0
- package/dist/src/writing/scoring-config-loader.js +168 -0
- package/dist/src/writing/validation-engine.js +595 -0
- package/dist/src/writing/validation-rules.js +380 -0
- package/dist/src/writing/voice-analyzer.js +439 -0
- package/dist/src/writing/voice-calibration.js +661 -0
- package/dist/src/writing/voice-profiles.json +588 -0
- package/package.json +65 -9
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages the distribution channel (stable vs edge) for AIWG.
|
|
5
|
+
* - Stable: Uses the npm-installed package
|
|
6
|
+
* - Edge: Uses a git clone of the main branch for bleeding-edge updates
|
|
7
|
+
*
|
|
8
|
+
* @module src/channel/manager
|
|
9
|
+
* @version 2024.12.0
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import fs from 'fs/promises';
|
|
13
|
+
import { readFileSync, existsSync } from 'fs';
|
|
14
|
+
import path from 'path';
|
|
15
|
+
import { fileURLToPath } from 'url';
|
|
16
|
+
import { execSync, spawn } from 'child_process';
|
|
17
|
+
import os from 'os';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Run a command with inherited stdio, applying a wall-clock timeout so a
|
|
21
|
+
* slow or hung git fetch cannot wedge the CLI for minutes. On timeout the
|
|
22
|
+
* child is SIGTERM'd and escalated to SIGKILL after 5s if it does not exit.
|
|
23
|
+
* Rejects with an Error carrying `.code = 'ETIMEDOUT'` on timeout or the
|
|
24
|
+
* original exit code otherwise.
|
|
25
|
+
*
|
|
26
|
+
* Replaces execSync() sites that had no timeout. Overridable via
|
|
27
|
+
* AIWG_GIT_TIMEOUT_MS (default 60s — fetch/pull on slow networks can take
|
|
28
|
+
* a while but must eventually terminate).
|
|
29
|
+
*/
|
|
30
|
+
async function runWithTimeout(cmd, args, options = {}) {
|
|
31
|
+
const timeoutMs = (() => {
|
|
32
|
+
const raw = process.env['AIWG_GIT_TIMEOUT_MS'];
|
|
33
|
+
const n = raw ? parseInt(raw, 10) : NaN;
|
|
34
|
+
return Number.isFinite(n) && n > 0 ? n : 60_000;
|
|
35
|
+
})();
|
|
36
|
+
|
|
37
|
+
return new Promise((resolve, reject) => {
|
|
38
|
+
const child = spawn(cmd, args, {
|
|
39
|
+
stdio: 'inherit',
|
|
40
|
+
...options,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
let settled = false;
|
|
44
|
+
const timer = setTimeout(() => {
|
|
45
|
+
if (settled) return;
|
|
46
|
+
try { child.kill('SIGTERM'); } catch { /* already exited */ }
|
|
47
|
+
const kill9 = setTimeout(() => {
|
|
48
|
+
try { child.kill('SIGKILL'); } catch { /* already exited */ }
|
|
49
|
+
}, 5_000);
|
|
50
|
+
kill9.unref?.();
|
|
51
|
+
settled = true;
|
|
52
|
+
const err = new Error(`\`${cmd} ${args.join(' ')}\` timed out after ${timeoutMs}ms`);
|
|
53
|
+
err.code = 'ETIMEDOUT';
|
|
54
|
+
reject(err);
|
|
55
|
+
}, timeoutMs);
|
|
56
|
+
timer.unref?.();
|
|
57
|
+
|
|
58
|
+
child.on('close', (code) => {
|
|
59
|
+
if (settled) return;
|
|
60
|
+
settled = true;
|
|
61
|
+
clearTimeout(timer);
|
|
62
|
+
if (code === 0) resolve();
|
|
63
|
+
else {
|
|
64
|
+
const err = new Error(`\`${cmd} ${args.join(' ')}\` exited with code ${code}`);
|
|
65
|
+
err.code = code ?? 1;
|
|
66
|
+
reject(err);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
child.on('error', (err) => {
|
|
71
|
+
if (settled) return;
|
|
72
|
+
settled = true;
|
|
73
|
+
clearTimeout(timer);
|
|
74
|
+
reject(err);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
80
|
+
const __dirname = path.dirname(__filename);
|
|
81
|
+
|
|
82
|
+
// Configuration paths
|
|
83
|
+
const CONFIG_DIR = path.join(os.homedir(), '.aiwg');
|
|
84
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'channel.json');
|
|
85
|
+
const EDGE_INSTALL_PATH = path.join(os.homedir(), '.local', 'share', 'ai-writing-guide');
|
|
86
|
+
const REPO_URL = 'https://github.com/jmagly/aiwg.git';
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Default channel configuration
|
|
90
|
+
*/
|
|
91
|
+
const DEFAULT_CONFIG = {
|
|
92
|
+
channel: 'stable',
|
|
93
|
+
edgePath: EDGE_INSTALL_PATH,
|
|
94
|
+
lastUpdateCheck: null,
|
|
95
|
+
updateCheckInterval: 86400000, // 24 hours in ms
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Get the package root directory.
|
|
100
|
+
*
|
|
101
|
+
* Walks up from this file's directory looking for the nearest package.json
|
|
102
|
+
* that names "aiwg". This works whether this module runs from its source
|
|
103
|
+
* location (`src/channel/manager.mjs`) or from its compiled-build copy
|
|
104
|
+
* (`dist/src/channel/manager.mjs`), both of which have package.json at
|
|
105
|
+
* the repo root.
|
|
106
|
+
*
|
|
107
|
+
* The walk is bounded to 10 levels as a safety cap.
|
|
108
|
+
*
|
|
109
|
+
* @returns {string} Path to package root
|
|
110
|
+
*/
|
|
111
|
+
export function getPackageRoot() {
|
|
112
|
+
let dir = __dirname;
|
|
113
|
+
for (let i = 0; i < 10; i++) {
|
|
114
|
+
const pkg = path.join(dir, 'package.json');
|
|
115
|
+
if (existsSync(pkg)) {
|
|
116
|
+
try {
|
|
117
|
+
const content = JSON.parse(readFileSync(pkg, 'utf8'));
|
|
118
|
+
if (content.name === 'aiwg') return dir;
|
|
119
|
+
} catch {
|
|
120
|
+
// keep walking
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const parent = path.dirname(dir);
|
|
124
|
+
if (parent === dir) break;
|
|
125
|
+
dir = parent;
|
|
126
|
+
}
|
|
127
|
+
// Fallback to the legacy hardcoded two-up resolution.
|
|
128
|
+
return path.resolve(__dirname, '..', '..');
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Load channel configuration
|
|
133
|
+
* @returns {Promise<object>} Channel configuration
|
|
134
|
+
*/
|
|
135
|
+
export async function loadConfig() {
|
|
136
|
+
try {
|
|
137
|
+
const data = await fs.readFile(CONFIG_FILE, 'utf8');
|
|
138
|
+
return { ...DEFAULT_CONFIG, ...JSON.parse(data) };
|
|
139
|
+
} catch {
|
|
140
|
+
return { ...DEFAULT_CONFIG };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Save channel configuration
|
|
146
|
+
* @param {object} config - Configuration to save
|
|
147
|
+
*/
|
|
148
|
+
export async function saveConfig(config) {
|
|
149
|
+
await fs.mkdir(CONFIG_DIR, { recursive: true });
|
|
150
|
+
await fs.writeFile(CONFIG_FILE, JSON.stringify(config, null, 2));
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Get the current channel
|
|
155
|
+
* @returns {Promise<string>} 'stable' or 'edge'
|
|
156
|
+
*/
|
|
157
|
+
export async function getChannel() {
|
|
158
|
+
const config = await loadConfig();
|
|
159
|
+
return config.channel;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Get the framework root path based on current channel
|
|
164
|
+
* @returns {Promise<string>} Path to framework root
|
|
165
|
+
*/
|
|
166
|
+
export async function getFrameworkRoot() {
|
|
167
|
+
const config = await loadConfig();
|
|
168
|
+
|
|
169
|
+
if (config.channel === 'edge') {
|
|
170
|
+
// Check if edge installation exists
|
|
171
|
+
try {
|
|
172
|
+
await fs.access(config.edgePath);
|
|
173
|
+
return config.edgePath;
|
|
174
|
+
} catch {
|
|
175
|
+
// Edge path doesn't exist, fall back to stable
|
|
176
|
+
console.warn('Edge installation not found, using stable channel');
|
|
177
|
+
return getPackageRoot();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return getPackageRoot();
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Switch to edge (bleeding edge) channel
|
|
186
|
+
* Clones or updates the git repository for latest main branch
|
|
187
|
+
*/
|
|
188
|
+
export async function switchToEdge() {
|
|
189
|
+
const config = await loadConfig();
|
|
190
|
+
|
|
191
|
+
console.log('Switching to edge channel (bleeding edge from main branch)...');
|
|
192
|
+
console.log('');
|
|
193
|
+
|
|
194
|
+
// Check if edge installation exists
|
|
195
|
+
const edgeExists = await fs.access(config.edgePath).then(() => true).catch(() => false);
|
|
196
|
+
|
|
197
|
+
if (edgeExists) {
|
|
198
|
+
// Update existing installation
|
|
199
|
+
console.log(`Updating edge installation at ${config.edgePath}...`);
|
|
200
|
+
try {
|
|
201
|
+
await runWithTimeout('git', ['fetch', '--all'], { cwd: config.edgePath });
|
|
202
|
+
await runWithTimeout('git', ['checkout', 'main'], { cwd: config.edgePath });
|
|
203
|
+
await runWithTimeout('git', ['pull', '--ff-only'], { cwd: config.edgePath });
|
|
204
|
+
// Ensure sparse checkout excludes .aiwg/ on existing installs
|
|
205
|
+
try {
|
|
206
|
+
const sparseConfig = path.join(config.edgePath, '.git', 'info', 'sparse-checkout');
|
|
207
|
+
const hasSparse = await fs.access(sparseConfig).then(() => true).catch(() => false);
|
|
208
|
+
if (!hasSparse) {
|
|
209
|
+
execSync('git sparse-checkout init --cone', { cwd: config.edgePath, stdio: 'pipe' });
|
|
210
|
+
execSync('git sparse-checkout set --no-cone "/*" "!/.aiwg"', { cwd: config.edgePath, stdio: 'pipe' });
|
|
211
|
+
}
|
|
212
|
+
} catch {
|
|
213
|
+
// Sparse checkout is optional — older git may not support it
|
|
214
|
+
}
|
|
215
|
+
console.log('Edge installation updated successfully.');
|
|
216
|
+
} catch (error) {
|
|
217
|
+
console.error('Failed to update edge installation:', error.message);
|
|
218
|
+
console.log('Try removing the directory and running again:');
|
|
219
|
+
console.log(` rm -rf ${config.edgePath}`);
|
|
220
|
+
console.log(' aiwg --use-main');
|
|
221
|
+
process.exit(1);
|
|
222
|
+
}
|
|
223
|
+
} else {
|
|
224
|
+
// Clone fresh
|
|
225
|
+
console.log(`Cloning repository to ${config.edgePath}...`);
|
|
226
|
+
await fs.mkdir(path.dirname(config.edgePath), { recursive: true });
|
|
227
|
+
try {
|
|
228
|
+
execSync(`git clone --branch main ${REPO_URL} "${config.edgePath}"`, { stdio: 'inherit' });
|
|
229
|
+
// Exclude dogfooding artifacts from edge clones — users want framework source only
|
|
230
|
+
try {
|
|
231
|
+
execSync('git sparse-checkout init --cone', { cwd: config.edgePath, stdio: 'pipe' });
|
|
232
|
+
execSync('git sparse-checkout set --no-cone "/*" "!/.aiwg"', { cwd: config.edgePath, stdio: 'pipe' });
|
|
233
|
+
} catch {
|
|
234
|
+
// Sparse checkout is optional — older git versions may not support it
|
|
235
|
+
console.log('Note: sparse checkout not available, .aiwg/ will be present in edge install.');
|
|
236
|
+
}
|
|
237
|
+
console.log('Edge installation created successfully.');
|
|
238
|
+
} catch (error) {
|
|
239
|
+
console.error('Failed to clone repository:', error.message);
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Update config
|
|
245
|
+
config.channel = 'edge';
|
|
246
|
+
await saveConfig(config);
|
|
247
|
+
|
|
248
|
+
console.log('');
|
|
249
|
+
console.log('Switched to edge channel.');
|
|
250
|
+
console.log('You are now using the latest code from the main branch.');
|
|
251
|
+
console.log('');
|
|
252
|
+
console.log('To update edge installation: aiwg -update');
|
|
253
|
+
console.log('To switch back to stable: aiwg --use-stable');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Switch to dev mode (use local repo as both framework source and CLI)
|
|
258
|
+
*
|
|
259
|
+
* In dev mode, the CLI entry point delegates to the dev repo's facade,
|
|
260
|
+
* so all code (including `aiwg index`, `aiwg use`, etc.) runs from the
|
|
261
|
+
* local build rather than the npm-installed package.
|
|
262
|
+
*
|
|
263
|
+
* @param {string} devPath - Path to the local development repository
|
|
264
|
+
*/
|
|
265
|
+
export async function switchToDev(devPath) {
|
|
266
|
+
const config = await loadConfig();
|
|
267
|
+
|
|
268
|
+
const resolvedPath = path.resolve(devPath);
|
|
269
|
+
|
|
270
|
+
console.log('Switching to dev mode (local repository source)...');
|
|
271
|
+
console.log('');
|
|
272
|
+
|
|
273
|
+
// Verify the path looks like an AIWG repo
|
|
274
|
+
try {
|
|
275
|
+
await fs.access(path.join(resolvedPath, 'agentic', 'code', 'frameworks'));
|
|
276
|
+
} catch {
|
|
277
|
+
console.error(`Error: ${resolvedPath} does not appear to be an AIWG repository.`);
|
|
278
|
+
console.error('Expected to find agentic/code/frameworks/ directory.');
|
|
279
|
+
process.exit(1);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Verify compiled router exists (dev-mode dispatch imports from dist/).
|
|
283
|
+
// Accept repos that have never been built by emitting a clear build hint
|
|
284
|
+
// rather than hard-failing here — the first `aiwg` invocation will re-check
|
|
285
|
+
// and print the same hint. This lets `aiwg --use-dev /path/to/fresh/clone`
|
|
286
|
+
// succeed followed by `npm run build`.
|
|
287
|
+
const distRouter = path.join(resolvedPath, 'dist', 'src', 'cli', 'router.js');
|
|
288
|
+
const distExists = await fs.access(distRouter).then(() => true).catch(() => false);
|
|
289
|
+
|
|
290
|
+
config.channel = 'edge';
|
|
291
|
+
config.edgePath = resolvedPath;
|
|
292
|
+
config.devMode = true;
|
|
293
|
+
await saveConfig(config);
|
|
294
|
+
|
|
295
|
+
console.log('Switched to dev mode.');
|
|
296
|
+
console.log(`Dev repo: ${resolvedPath}`);
|
|
297
|
+
console.log(`Router: ${distRouter}`);
|
|
298
|
+
if (!distExists) {
|
|
299
|
+
console.log('');
|
|
300
|
+
console.log('NOTE: dist/ is not built yet. Before running aiwg commands:');
|
|
301
|
+
console.log(` (cd ${resolvedPath} && npm run build)`);
|
|
302
|
+
}
|
|
303
|
+
console.log('');
|
|
304
|
+
console.log('The aiwg command now runs the compiled router from your local repo.');
|
|
305
|
+
console.log('After making changes, run: npm run build');
|
|
306
|
+
console.log('');
|
|
307
|
+
console.log('Commands:');
|
|
308
|
+
console.log(' aiwg use all Deploy from local source');
|
|
309
|
+
console.log(' aiwg version Verify dev mode active');
|
|
310
|
+
console.log(' aiwg --use-stable Switch back to npm package');
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* Switch to next (alpha/beta/RC) channel
|
|
315
|
+
* Installs the latest pre-release from the `next` dist-tag
|
|
316
|
+
*/
|
|
317
|
+
export async function switchToNext() {
|
|
318
|
+
const config = await loadConfig();
|
|
319
|
+
|
|
320
|
+
console.log('Switching to next channel (alpha/beta/RC — latest pre-release)...');
|
|
321
|
+
console.log('');
|
|
322
|
+
|
|
323
|
+
try {
|
|
324
|
+
execSync('npm install -g aiwg@next', { stdio: 'inherit' });
|
|
325
|
+
} catch (error) {
|
|
326
|
+
console.error('Failed to install aiwg@next:', error.message);
|
|
327
|
+
console.error('Check that npm is available and you have write access to the global prefix.');
|
|
328
|
+
process.exit(1);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
config.channel = 'next';
|
|
332
|
+
config.devMode = false;
|
|
333
|
+
await saveConfig(config);
|
|
334
|
+
|
|
335
|
+
console.log('');
|
|
336
|
+
console.log('Switched to next channel.');
|
|
337
|
+
console.log('You are now running the latest alpha/beta/RC release.');
|
|
338
|
+
console.log('');
|
|
339
|
+
console.log('To see what version you installed: aiwg version');
|
|
340
|
+
console.log('To switch back to stable: aiwg sync --channel latest');
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Switch to nightly channel
|
|
345
|
+
* Installs the latest nightly snapshot from the `nightly` dist-tag
|
|
346
|
+
*/
|
|
347
|
+
export async function switchToNightly() {
|
|
348
|
+
const config = await loadConfig();
|
|
349
|
+
|
|
350
|
+
console.log('Switching to nightly channel (latest automated snapshot)...');
|
|
351
|
+
console.log('');
|
|
352
|
+
|
|
353
|
+
try {
|
|
354
|
+
execSync('npm install -g aiwg@nightly', { stdio: 'inherit' });
|
|
355
|
+
} catch (error) {
|
|
356
|
+
console.error('Failed to install aiwg@nightly:', error.message);
|
|
357
|
+
console.error('Check that npm is available and you have write access to the global prefix.');
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
config.channel = 'nightly';
|
|
362
|
+
config.devMode = false;
|
|
363
|
+
await saveConfig(config);
|
|
364
|
+
|
|
365
|
+
console.log('');
|
|
366
|
+
console.log('Switched to nightly channel.');
|
|
367
|
+
console.log('You are now running the latest automated nightly snapshot.');
|
|
368
|
+
console.log('');
|
|
369
|
+
console.log('To see what version you installed: aiwg version');
|
|
370
|
+
console.log('To switch back to stable: aiwg sync --channel latest');
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Switch to stable (npm) channel
|
|
375
|
+
*/
|
|
376
|
+
export async function switchToStable() {
|
|
377
|
+
const config = await loadConfig();
|
|
378
|
+
|
|
379
|
+
console.log('Switching to stable channel (npm package)...');
|
|
380
|
+
console.log('');
|
|
381
|
+
|
|
382
|
+
config.channel = 'stable';
|
|
383
|
+
config.devMode = false;
|
|
384
|
+
await saveConfig(config);
|
|
385
|
+
|
|
386
|
+
console.log('Switched to stable channel.');
|
|
387
|
+
console.log('You are now using the npm-installed package.');
|
|
388
|
+
console.log('');
|
|
389
|
+
console.log('To update: npm install -g aiwg@latest');
|
|
390
|
+
console.log('To switch to edge: aiwg --use-main');
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Get version information based on current channel
|
|
395
|
+
* @returns {Promise<object>} Version info
|
|
396
|
+
*/
|
|
397
|
+
/**
|
|
398
|
+
* Normalize a package.json `repository` field (string or `{ url }`) into a clean
|
|
399
|
+
* `host/owner/repo` display form for version stamps — stripping the `git+`
|
|
400
|
+
* prefix, URL scheme, and `.git` suffix. Returns '' if none is declared.
|
|
401
|
+
*
|
|
402
|
+
* @param {string | { url?: string } | undefined} repository
|
|
403
|
+
* @returns {string}
|
|
404
|
+
*/
|
|
405
|
+
function normalizeRepoUrl(repository) {
|
|
406
|
+
const raw = typeof repository === 'string' ? repository : repository?.url || '';
|
|
407
|
+
return raw
|
|
408
|
+
.replace(/^git\+/, '')
|
|
409
|
+
.replace(/^git@([^:]+):/, '$1/')
|
|
410
|
+
.replace(/^[a-z]+:\/\//i, '')
|
|
411
|
+
.replace(/\.git$/, '')
|
|
412
|
+
.replace(/\/$/, '');
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
export async function getVersionInfo() {
|
|
416
|
+
const config = await loadConfig();
|
|
417
|
+
const packageRoot = getPackageRoot();
|
|
418
|
+
|
|
419
|
+
// Read package.json version
|
|
420
|
+
const packageJsonPath = path.join(packageRoot, 'package.json');
|
|
421
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
|
|
422
|
+
|
|
423
|
+
// Detect pre-release channel from version string when channel.json says 'stable'
|
|
424
|
+
// This handles the case where a user ran `npm install -g aiwg@next` directly —
|
|
425
|
+
// npm updates the binary but channel.json stays as 'stable'.
|
|
426
|
+
let channel = config.channel;
|
|
427
|
+
const version = packageJson.version;
|
|
428
|
+
if (!config.devMode && channel === 'stable') {
|
|
429
|
+
if (version.includes('-rc.')) {
|
|
430
|
+
channel = 'rc';
|
|
431
|
+
} else if (version.includes('-beta.')) {
|
|
432
|
+
channel = 'beta';
|
|
433
|
+
} else if (version.includes('-alpha.')) {
|
|
434
|
+
channel = 'alpha';
|
|
435
|
+
} else if (version.includes('-nightly.')) {
|
|
436
|
+
channel = 'nightly';
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
const info = {
|
|
441
|
+
version,
|
|
442
|
+
channel,
|
|
443
|
+
packageRoot,
|
|
444
|
+
devMode: config.devMode || false,
|
|
445
|
+
// Public-facing URLs — single source of truth is package.json, so user-visible
|
|
446
|
+
// stamps/links never hardcode the internal build origin. The published package
|
|
447
|
+
// declares the public repository/homepage/bugs; read them here rather than
|
|
448
|
+
// duplicating literals across the CLI.
|
|
449
|
+
repoUrl: normalizeRepoUrl(packageJson.repository), // e.g. github.com/jmagly/aiwg
|
|
450
|
+
homepage: packageJson.homepage || '', // e.g. https://aiwg.io
|
|
451
|
+
issuesUrl: packageJson.bugs?.url || '', // e.g. https://github.com/jmagly/aiwg/issues
|
|
452
|
+
};
|
|
453
|
+
|
|
454
|
+
if (config.channel === 'edge') {
|
|
455
|
+
// Get git info for edge channel
|
|
456
|
+
try {
|
|
457
|
+
const gitHash = execSync('git rev-parse --short HEAD', {
|
|
458
|
+
cwd: config.edgePath,
|
|
459
|
+
encoding: 'utf8',
|
|
460
|
+
}).trim();
|
|
461
|
+
const gitBranch = execSync('git branch --show-current', {
|
|
462
|
+
cwd: config.edgePath,
|
|
463
|
+
encoding: 'utf8',
|
|
464
|
+
}).trim();
|
|
465
|
+
info.edgePath = config.edgePath;
|
|
466
|
+
info.gitHash = gitHash;
|
|
467
|
+
info.gitBranch = gitBranch;
|
|
468
|
+
} catch {
|
|
469
|
+
// Git info not available
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
return info;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Update the edge installation from git
|
|
478
|
+
*/
|
|
479
|
+
export async function updateEdge() {
|
|
480
|
+
const config = await loadConfig();
|
|
481
|
+
|
|
482
|
+
if (config.channel !== 'edge') {
|
|
483
|
+
console.log('Not in edge channel. Use npm install -g aiwg@latest for stable channel.');
|
|
484
|
+
return;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
console.log('Updating edge installation...');
|
|
488
|
+
|
|
489
|
+
try {
|
|
490
|
+
await runWithTimeout('git', ['fetch', '--all'], { cwd: config.edgePath });
|
|
491
|
+
await runWithTimeout('git', ['pull', '--ff-only'], { cwd: config.edgePath });
|
|
492
|
+
console.log('');
|
|
493
|
+
console.log('Edge installation updated successfully.');
|
|
494
|
+
} catch (error) {
|
|
495
|
+
console.error('Update failed:', error.message);
|
|
496
|
+
console.log('');
|
|
497
|
+
console.log('If you have local changes, try:');
|
|
498
|
+
console.log(` cd ${config.edgePath}`);
|
|
499
|
+
console.log(' git stash');
|
|
500
|
+
console.log(' git pull');
|
|
501
|
+
console.log(' git stash pop');
|
|
502
|
+
process.exit(1);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agent Spawn Utility
|
|
3
|
+
*
|
|
4
|
+
* Centralized utility for spawning agentic CLI tools across providers.
|
|
5
|
+
* Handles --dangerous, --provider, and --params passthrough flags uniformly
|
|
6
|
+
* across all commands that invoke an underlying agent system.
|
|
7
|
+
*
|
|
8
|
+
* Usage pattern:
|
|
9
|
+
* const { opts, remaining } = parseAgentSpawnFlags(ctx.args);
|
|
10
|
+
* const config = getProviderConfig(opts.provider);
|
|
11
|
+
* const spawnArgs = buildAgentArgs(prompt, opts);
|
|
12
|
+
* spawn(config.binary, spawnArgs, { stdio: 'inherit' });
|
|
13
|
+
*/
|
|
14
|
+
export const PROVIDER_CONFIGS = {
|
|
15
|
+
claude: {
|
|
16
|
+
binary: 'claude',
|
|
17
|
+
dangerousFlag: '--dangerously-skip-permissions',
|
|
18
|
+
name: 'Claude Code',
|
|
19
|
+
},
|
|
20
|
+
opencode: {
|
|
21
|
+
binary: 'opencode',
|
|
22
|
+
// OpenCode uses `opencode run "<prompt>"` for non-interactive execution.
|
|
23
|
+
// Dangerous mode flag not yet confirmed; omit rather than guess.
|
|
24
|
+
promptPrefix: ['run'],
|
|
25
|
+
dangerousFlag: null,
|
|
26
|
+
name: 'OpenCode',
|
|
27
|
+
},
|
|
28
|
+
codex: {
|
|
29
|
+
binary: 'codex',
|
|
30
|
+
// Codex supports --full-auto (no approval prompts) and --approval-mode full-auto
|
|
31
|
+
dangerousFlag: '--full-auto',
|
|
32
|
+
name: 'OpenAI Codex',
|
|
33
|
+
},
|
|
34
|
+
hermes: {
|
|
35
|
+
// Hermes is a model series (NousResearch), not a confirmed standalone CLI.
|
|
36
|
+
// Treat as IDE/runtime-integrated until a CLI is confirmed.
|
|
37
|
+
binary: null,
|
|
38
|
+
dangerousFlag: null,
|
|
39
|
+
name: 'Hermes',
|
|
40
|
+
guidanceMessage: 'Hermes does not have a confirmed standalone CLI.\n' +
|
|
41
|
+
'Run via Ollama (`ollama run hermes3`) or through your configured MCP sidecar.',
|
|
42
|
+
},
|
|
43
|
+
copilot: {
|
|
44
|
+
binary: null,
|
|
45
|
+
dangerousFlag: null,
|
|
46
|
+
name: 'GitHub Copilot',
|
|
47
|
+
guidanceMessage: 'GitHub Copilot is IDE-integrated and cannot be spawned from the CLI.\n' +
|
|
48
|
+
'Open your IDE, navigate to the Copilot chat panel, and run the skill manually.',
|
|
49
|
+
},
|
|
50
|
+
cursor: {
|
|
51
|
+
binary: null,
|
|
52
|
+
dangerousFlag: null,
|
|
53
|
+
name: 'Cursor',
|
|
54
|
+
guidanceMessage: 'Cursor is IDE-integrated and cannot be spawned from the CLI.\n' +
|
|
55
|
+
'For unrestricted AIWG tool access, use the MCP sidecar:\n' +
|
|
56
|
+
' aiwg mcp install cursor && aiwg mcp serve\n' +
|
|
57
|
+
'See: docs/integrations/cursor-mcp-sidecar.md',
|
|
58
|
+
},
|
|
59
|
+
factory: {
|
|
60
|
+
binary: null,
|
|
61
|
+
dangerousFlag: null,
|
|
62
|
+
name: 'Factory AI',
|
|
63
|
+
guidanceMessage: 'Factory AI is cloud-based and cannot be spawned from the CLI.\n' +
|
|
64
|
+
'Use the Factory AI dashboard to dispatch the workflow.',
|
|
65
|
+
},
|
|
66
|
+
warp: {
|
|
67
|
+
binary: null,
|
|
68
|
+
dangerousFlag: null,
|
|
69
|
+
name: 'Warp Terminal',
|
|
70
|
+
guidanceMessage: 'Warp Terminal cannot be spawned programmatically.\n' +
|
|
71
|
+
'For unrestricted AIWG tool access, use the MCP sidecar:\n' +
|
|
72
|
+
' aiwg mcp install warp && aiwg mcp serve\n' +
|
|
73
|
+
'See: docs/integrations/warp-mcp-sidecar.md',
|
|
74
|
+
},
|
|
75
|
+
windsurf: {
|
|
76
|
+
binary: null,
|
|
77
|
+
dangerousFlag: null,
|
|
78
|
+
name: 'Windsurf',
|
|
79
|
+
guidanceMessage: 'Windsurf is IDE-integrated and cannot be spawned from the CLI.\n' +
|
|
80
|
+
'For unrestricted AIWG tool access, use the MCP sidecar:\n' +
|
|
81
|
+
' aiwg mcp install windsurf && aiwg mcp serve\n' +
|
|
82
|
+
'See: docs/integrations/windsurf-mcp-sidecar.md',
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Extract --provider, --dangerous, and --params from an args array.
|
|
87
|
+
* Returns the parsed options and the remaining args with those flags removed.
|
|
88
|
+
*
|
|
89
|
+
* This is non-destructive — the original array is not modified.
|
|
90
|
+
*/
|
|
91
|
+
export function parseAgentSpawnFlags(args) {
|
|
92
|
+
const opts = {};
|
|
93
|
+
const remaining = [];
|
|
94
|
+
for (let i = 0; i < args.length; i++) {
|
|
95
|
+
const arg = args[i];
|
|
96
|
+
if (arg === '--provider' && i + 1 < args.length) {
|
|
97
|
+
opts.provider = args[++i];
|
|
98
|
+
}
|
|
99
|
+
else if (arg === '--dangerous') {
|
|
100
|
+
opts.dangerous = true;
|
|
101
|
+
}
|
|
102
|
+
else if (arg === '--params' && i + 1 < args.length) {
|
|
103
|
+
opts.params = args[++i];
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
remaining.push(arg);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { opts, remaining };
|
|
110
|
+
}
|
|
111
|
+
// ── Arg construction ──────────────────────────────────────────
|
|
112
|
+
/**
|
|
113
|
+
* Build the final args array for spawning a provider binary.
|
|
114
|
+
*
|
|
115
|
+
* Order: [prompt, dangerous-flag?, ...raw-params]
|
|
116
|
+
*/
|
|
117
|
+
export function buildAgentArgs(prompt, opts) {
|
|
118
|
+
const config = getProviderConfig(opts.provider ?? 'claude');
|
|
119
|
+
const args = [];
|
|
120
|
+
// Dangerous flag must precede the prompt — it is a CLI flag to the binary,
|
|
121
|
+
// not content to pass to the agent. e.g. `claude --dangerously-skip-permissions "<prompt>"`
|
|
122
|
+
if (opts.dangerous && config.dangerousFlag) {
|
|
123
|
+
args.push(config.dangerousFlag);
|
|
124
|
+
// If provider has no dangerous flag, silently ignored —
|
|
125
|
+
// callers should warn via dangerousWarning().
|
|
126
|
+
}
|
|
127
|
+
// Some providers require a subcommand before the prompt (e.g. `opencode run "<prompt>"`)
|
|
128
|
+
args.push(...(config.promptPrefix ?? []));
|
|
129
|
+
// The prompt
|
|
130
|
+
args.push(prompt);
|
|
131
|
+
// User passthrough params — appended after the prompt verbatim
|
|
132
|
+
if (opts.params) {
|
|
133
|
+
args.push(...splitParams(opts.params));
|
|
134
|
+
}
|
|
135
|
+
return args;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Split a params string into individual args, respecting double/single quotes.
|
|
139
|
+
* "hello world" → ['hello world']
|
|
140
|
+
* --flag value → ['--flag', 'value']
|
|
141
|
+
*/
|
|
142
|
+
export function splitParams(params) {
|
|
143
|
+
const result = [];
|
|
144
|
+
const re = /(?:[^\s"']+|"[^"]*"|'[^']*')+/g;
|
|
145
|
+
let match;
|
|
146
|
+
while ((match = re.exec(params)) !== null) {
|
|
147
|
+
// Strip surrounding quotes from individual tokens
|
|
148
|
+
result.push(match[0].replace(/^["']|["']$/g, ''));
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
}
|
|
152
|
+
// ── Provider helpers ──────────────────────────────────────────
|
|
153
|
+
/** Get config for a provider, falling back to claude for unknown values. */
|
|
154
|
+
export function getProviderConfig(provider) {
|
|
155
|
+
return PROVIDER_CONFIGS[provider] ?? PROVIDER_CONFIGS['claude'];
|
|
156
|
+
}
|
|
157
|
+
/** Returns true if the provider has a CLI binary that can be spawned. */
|
|
158
|
+
export function isSpawnableProvider(provider) {
|
|
159
|
+
return getProviderConfig(provider).binary !== null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Warn string if --dangerous was requested but the provider has no
|
|
163
|
+
* corresponding flag. Returns null if the combination is valid.
|
|
164
|
+
*/
|
|
165
|
+
export function dangerousWarning(provider) {
|
|
166
|
+
const config = getProviderConfig(provider);
|
|
167
|
+
if (!config.dangerousFlag) {
|
|
168
|
+
return `--dangerous is not supported for provider '${config.name}' and will be ignored.`;
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
/** List all spawnable provider names. */
|
|
173
|
+
export function spawnableProviders() {
|
|
174
|
+
return Object.entries(PROVIDER_CONFIGS)
|
|
175
|
+
.filter(([, c]) => c.binary !== null)
|
|
176
|
+
.map(([k]) => k);
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=agent-spawn.js.map
|