@ashlr/hub 2.2.0
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/CHANGELOG.md +1158 -0
- package/LICENSE +21 -0
- package/README.md +833 -0
- package/bin/ashlr +8 -0
- package/dist/api/core.d.ts +28 -0
- package/dist/api/core.js +42 -0
- package/dist/api/core.js.map +1 -0
- package/dist/api/index.d.ts +9 -0
- package/dist/api/index.js +9 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/plugin.d.ts +12 -0
- package/dist/api/plugin.js +13 -0
- package/dist/api/plugin.js.map +1 -0
- package/dist/api/types.d.ts +9 -0
- package/dist/api/types.js +9 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli/args.d.ts +20 -0
- package/dist/cli/args.js +23 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/ask.d.ts +22 -0
- package/dist/cli/ask.js +240 -0
- package/dist/cli/ask.js.map +1 -0
- package/dist/cli/audit.d.ts +26 -0
- package/dist/cli/audit.js +199 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/backlog.d.ts +26 -0
- package/dist/cli/backlog.js +322 -0
- package/dist/cli/backlog.js.map +1 -0
- package/dist/cli/completions.d.ts +18 -0
- package/dist/cli/completions.js +156 -0
- package/dist/cli/completions.js.map +1 -0
- package/dist/cli/daemon.d.ts +31 -0
- package/dist/cli/daemon.js +334 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/demo-sandbox.d.ts +78 -0
- package/dist/cli/demo-sandbox.js +227 -0
- package/dist/cli/demo-sandbox.js.map +1 -0
- package/dist/cli/demo.d.ts +76 -0
- package/dist/cli/demo.js +285 -0
- package/dist/cli/demo.js.map +1 -0
- package/dist/cli/digest.d.ts +46 -0
- package/dist/cli/digest.js +352 -0
- package/dist/cli/digest.js.map +1 -0
- package/dist/cli/doctor-init.d.ts +28 -0
- package/dist/cli/doctor-init.js +335 -0
- package/dist/cli/doctor-init.js.map +1 -0
- package/dist/cli/genome.d.ts +62 -0
- package/dist/cli/genome.js +1061 -0
- package/dist/cli/genome.js.map +1 -0
- package/dist/cli/gh.d.ts +27 -0
- package/dist/cli/gh.js +322 -0
- package/dist/cli/gh.js.map +1 -0
- package/dist/cli/goals.d.ts +55 -0
- package/dist/cli/goals.js +667 -0
- package/dist/cli/goals.js.map +1 -0
- package/dist/cli/health.d.ts +56 -0
- package/dist/cli/health.js +407 -0
- package/dist/cli/health.js.map +1 -0
- package/dist/cli/help.d.ts +51 -0
- package/dist/cli/help.js +436 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli/inbox.d.ts +28 -0
- package/dist/cli/inbox.js +589 -0
- package/dist/cli/inbox.js.map +1 -0
- package/dist/cli/index.d.ts +41 -0
- package/dist/cli/index.js +1208 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/knowledge.d.ts +33 -0
- package/dist/cli/knowledge.js +575 -0
- package/dist/cli/knowledge.js.map +1 -0
- package/dist/cli/mcp.d.ts +26 -0
- package/dist/cli/mcp.js +487 -0
- package/dist/cli/mcp.js.map +1 -0
- package/dist/cli/models.d.ts +26 -0
- package/dist/cli/models.js +435 -0
- package/dist/cli/models.js.map +1 -0
- package/dist/cli/new.d.ts +32 -0
- package/dist/cli/new.js +565 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/notify.d.ts +20 -0
- package/dist/cli/notify.js +188 -0
- package/dist/cli/notify.js.map +1 -0
- package/dist/cli/onboard.d.ts +85 -0
- package/dist/cli/onboard.js +305 -0
- package/dist/cli/onboard.js.map +1 -0
- package/dist/cli/open.d.ts +38 -0
- package/dist/cli/open.js +86 -0
- package/dist/cli/open.js.map +1 -0
- package/dist/cli/orient.d.ts +14 -0
- package/dist/cli/orient.js +110 -0
- package/dist/cli/orient.js.map +1 -0
- package/dist/cli/picker.d.ts +21 -0
- package/dist/cli/picker.js +177 -0
- package/dist/cli/picker.js.map +1 -0
- package/dist/cli/plugins.d.ts +21 -0
- package/dist/cli/plugins.js +394 -0
- package/dist/cli/plugins.js.map +1 -0
- package/dist/cli/preflight.d.ts +29 -0
- package/dist/cli/preflight.js +131 -0
- package/dist/cli/preflight.js.map +1 -0
- package/dist/cli/pulse.d.ts +26 -0
- package/dist/cli/pulse.js +482 -0
- package/dist/cli/pulse.js.map +1 -0
- package/dist/cli/reflect.d.ts +42 -0
- package/dist/cli/reflect.js +381 -0
- package/dist/cli/reflect.js.map +1 -0
- package/dist/cli/run.d.ts +29 -0
- package/dist/cli/run.js +687 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/sandbox.d.ts +20 -0
- package/dist/cli/sandbox.js +345 -0
- package/dist/cli/sandbox.js.map +1 -0
- package/dist/cli/seams.d.ts +41 -0
- package/dist/cli/seams.js +167 -0
- package/dist/cli/seams.js.map +1 -0
- package/dist/cli/serve.d.ts +25 -0
- package/dist/cli/serve.js +249 -0
- package/dist/cli/serve.js.map +1 -0
- package/dist/cli/ship.d.ts +33 -0
- package/dist/cli/ship.js +433 -0
- package/dist/cli/ship.js.map +1 -0
- package/dist/cli/spec.d.ts +19 -0
- package/dist/cli/spec.js +478 -0
- package/dist/cli/spec.js.map +1 -0
- package/dist/cli/swarm.d.ts +42 -0
- package/dist/cli/swarm.js +1365 -0
- package/dist/cli/swarm.js.map +1 -0
- package/dist/cli/telemetry.d.ts +26 -0
- package/dist/cli/telemetry.js +364 -0
- package/dist/cli/telemetry.js.map +1 -0
- package/dist/cli/tui.d.ts +17 -0
- package/dist/cli/tui.js +52 -0
- package/dist/cli/tui.js.map +1 -0
- package/dist/cli/ui.d.ts +53 -0
- package/dist/cli/ui.js +66 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/cli/update.d.ts +38 -0
- package/dist/cli/update.js +682 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/vercel.d.ts +20 -0
- package/dist/cli/vercel.js +193 -0
- package/dist/cli/vercel.js.map +1 -0
- package/dist/cli/verify-safety.d.ts +96 -0
- package/dist/cli/verify-safety.js +509 -0
- package/dist/cli/verify-safety.js.map +1 -0
- package/dist/cli/wire.d.ts +22 -0
- package/dist/cli/wire.js +205 -0
- package/dist/cli/wire.js.map +1 -0
- package/dist/core/classify.d.ts +51 -0
- package/dist/core/classify.js +450 -0
- package/dist/core/classify.js.map +1 -0
- package/dist/core/config.d.ts +63 -0
- package/dist/core/config.js +474 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/daemon/loop.d.ts +74 -0
- package/dist/core/daemon/loop.js +618 -0
- package/dist/core/daemon/loop.js.map +1 -0
- package/dist/core/daemon/state.d.ts +66 -0
- package/dist/core/daemon/state.js +197 -0
- package/dist/core/daemon/state.js.map +1 -0
- package/dist/core/dashboard.d.ts +40 -0
- package/dist/core/dashboard.js +463 -0
- package/dist/core/dashboard.js.map +1 -0
- package/dist/core/digest/build.d.ts +51 -0
- package/dist/core/digest/build.js +230 -0
- package/dist/core/digest/build.js.map +1 -0
- package/dist/core/digest/deliver.d.ts +47 -0
- package/dist/core/digest/deliver.js +230 -0
- package/dist/core/digest/deliver.js.map +1 -0
- package/dist/core/digest/store.d.ts +57 -0
- package/dist/core/digest/store.js +223 -0
- package/dist/core/digest/store.js.map +1 -0
- package/dist/core/doctor-fix.d.ts +21 -0
- package/dist/core/doctor-fix.js +440 -0
- package/dist/core/doctor-fix.js.map +1 -0
- package/dist/core/doctor.d.ts +18 -0
- package/dist/core/doctor.js +806 -0
- package/dist/core/doctor.js.map +1 -0
- package/dist/core/env-bridge.d.ts +64 -0
- package/dist/core/env-bridge.js +103 -0
- package/dist/core/env-bridge.js.map +1 -0
- package/dist/core/genome/capture.d.ts +49 -0
- package/dist/core/genome/capture.js +352 -0
- package/dist/core/genome/capture.js.map +1 -0
- package/dist/core/genome/consolidate.d.ts +38 -0
- package/dist/core/genome/consolidate.js +426 -0
- package/dist/core/genome/consolidate.js.map +1 -0
- package/dist/core/genome/export.d.ts +29 -0
- package/dist/core/genome/export.js +102 -0
- package/dist/core/genome/export.js.map +1 -0
- package/dist/core/genome/playbook.d.ts +33 -0
- package/dist/core/genome/playbook.js +320 -0
- package/dist/core/genome/playbook.js.map +1 -0
- package/dist/core/genome/recall.d.ts +45 -0
- package/dist/core/genome/recall.js +293 -0
- package/dist/core/genome/recall.js.map +1 -0
- package/dist/core/genome/store.d.ts +62 -0
- package/dist/core/genome/store.js +711 -0
- package/dist/core/genome/store.js.map +1 -0
- package/dist/core/git.d.ts +34 -0
- package/dist/core/git.js +115 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/goals/advance.d.ts +82 -0
- package/dist/core/goals/advance.js +263 -0
- package/dist/core/goals/advance.js.map +1 -0
- package/dist/core/goals/planner.d.ts +58 -0
- package/dist/core/goals/planner.js +233 -0
- package/dist/core/goals/planner.js.map +1 -0
- package/dist/core/goals/store.d.ts +128 -0
- package/dist/core/goals/store.js +442 -0
- package/dist/core/goals/store.js.map +1 -0
- package/dist/core/inbox/apply.d.ts +36 -0
- package/dist/core/inbox/apply.js +407 -0
- package/dist/core/inbox/apply.js.map +1 -0
- package/dist/core/inbox/notify-proposal.d.ts +13 -0
- package/dist/core/inbox/notify-proposal.js +21 -0
- package/dist/core/inbox/notify-proposal.js.map +1 -0
- package/dist/core/inbox/store.d.ts +67 -0
- package/dist/core/inbox/store.js +258 -0
- package/dist/core/inbox/store.js.map +1 -0
- package/dist/core/index-engine.d.ts +62 -0
- package/dist/core/index-engine.js +486 -0
- package/dist/core/index-engine.js.map +1 -0
- package/dist/core/integrations/desktop-notify.d.ts +18 -0
- package/dist/core/integrations/desktop-notify.js +42 -0
- package/dist/core/integrations/desktop-notify.js.map +1 -0
- package/dist/core/integrations/editors.d.ts +50 -0
- package/dist/core/integrations/editors.js +216 -0
- package/dist/core/integrations/editors.js.map +1 -0
- package/dist/core/integrations/github.d.ts +66 -0
- package/dist/core/integrations/github.js +332 -0
- package/dist/core/integrations/github.js.map +1 -0
- package/dist/core/integrations/identity.d.ts +29 -0
- package/dist/core/integrations/identity.js +359 -0
- package/dist/core/integrations/identity.js.map +1 -0
- package/dist/core/integrations/notify.d.ts +23 -0
- package/dist/core/integrations/notify.js +96 -0
- package/dist/core/integrations/notify.js.map +1 -0
- package/dist/core/integrations/vercel.d.ts +37 -0
- package/dist/core/integrations/vercel.js +192 -0
- package/dist/core/integrations/vercel.js.map +1 -0
- package/dist/core/knowledge/ask.d.ts +34 -0
- package/dist/core/knowledge/ask.js +325 -0
- package/dist/core/knowledge/ask.js.map +1 -0
- package/dist/core/knowledge/graph.d.ts +51 -0
- package/dist/core/knowledge/graph.js +564 -0
- package/dist/core/knowledge/graph.js.map +1 -0
- package/dist/core/knowledge/index.d.ts +74 -0
- package/dist/core/knowledge/index.js +586 -0
- package/dist/core/knowledge/index.js.map +1 -0
- package/dist/core/learn/playbooks.d.ts +84 -0
- package/dist/core/learn/playbooks.js +241 -0
- package/dist/core/learn/playbooks.js.map +1 -0
- package/dist/core/learn/reflect.d.ts +87 -0
- package/dist/core/learn/reflect.js +435 -0
- package/dist/core/learn/reflect.js.map +1 -0
- package/dist/core/learn/store.d.ts +51 -0
- package/dist/core/learn/store.js +165 -0
- package/dist/core/learn/store.js.map +1 -0
- package/dist/core/learn/tuning.d.ts +48 -0
- package/dist/core/learn/tuning.js +201 -0
- package/dist/core/learn/tuning.js.map +1 -0
- package/dist/core/lifecycle/scaffold.d.ts +43 -0
- package/dist/core/lifecycle/scaffold.js +260 -0
- package/dist/core/lifecycle/scaffold.js.map +1 -0
- package/dist/core/lifecycle/ship.d.ts +48 -0
- package/dist/core/lifecycle/ship.js +513 -0
- package/dist/core/lifecycle/ship.js.map +1 -0
- package/dist/core/lifecycle/templates.d.ts +20 -0
- package/dist/core/lifecycle/templates.js +605 -0
- package/dist/core/lifecycle/templates.js.map +1 -0
- package/dist/core/mcp-gateway.d.ts +59 -0
- package/dist/core/mcp-gateway.js +385 -0
- package/dist/core/mcp-gateway.js.map +1 -0
- package/dist/core/mcp-native.d.ts +53 -0
- package/dist/core/mcp-native.js +507 -0
- package/dist/core/mcp-native.js.map +1 -0
- package/dist/core/mcp-registry.d.ts +36 -0
- package/dist/core/mcp-registry.js +180 -0
- package/dist/core/mcp-registry.js.map +1 -0
- package/dist/core/observability/budget-alert.d.ts +18 -0
- package/dist/core/observability/budget-alert.js +90 -0
- package/dist/core/observability/budget-alert.js.map +1 -0
- package/dist/core/observability/estimate.d.ts +27 -0
- package/dist/core/observability/estimate.js +188 -0
- package/dist/core/observability/estimate.js.map +1 -0
- package/dist/core/observability/forecast.d.ts +19 -0
- package/dist/core/observability/forecast.js +101 -0
- package/dist/core/observability/forecast.js.map +1 -0
- package/dist/core/observability/governance.d.ts +28 -0
- package/dist/core/observability/governance.js +101 -0
- package/dist/core/observability/governance.js.map +1 -0
- package/dist/core/observability/otlp.d.ts +88 -0
- package/dist/core/observability/otlp.js +217 -0
- package/dist/core/observability/otlp.js.map +1 -0
- package/dist/core/observability/rollup.d.ts +35 -0
- package/dist/core/observability/rollup.js +311 -0
- package/dist/core/observability/rollup.js.map +1 -0
- package/dist/core/observability/telemetry-sink.d.ts +63 -0
- package/dist/core/observability/telemetry-sink.js +350 -0
- package/dist/core/observability/telemetry-sink.js.map +1 -0
- package/dist/core/observability/usage-source.d.ts +60 -0
- package/dist/core/observability/usage-source.js +347 -0
- package/dist/core/observability/usage-source.js.map +1 -0
- package/dist/core/onboard.d.ts +27 -0
- package/dist/core/onboard.js +288 -0
- package/dist/core/onboard.js.map +1 -0
- package/dist/core/orient.d.ts +23 -0
- package/dist/core/orient.js +135 -0
- package/dist/core/orient.js.map +1 -0
- package/dist/core/phantom.d.ts +23 -0
- package/dist/core/phantom.js +279 -0
- package/dist/core/phantom.js.map +1 -0
- package/dist/core/plugins/host-api.d.ts +29 -0
- package/dist/core/plugins/host-api.js +113 -0
- package/dist/core/plugins/host-api.js.map +1 -0
- package/dist/core/plugins/integrity.d.ts +36 -0
- package/dist/core/plugins/integrity.js +73 -0
- package/dist/core/plugins/integrity.js.map +1 -0
- package/dist/core/plugins/manifest.d.ts +31 -0
- package/dist/core/plugins/manifest.js +316 -0
- package/dist/core/plugins/manifest.js.map +1 -0
- package/dist/core/plugins/registry.d.ts +87 -0
- package/dist/core/plugins/registry.js +415 -0
- package/dist/core/plugins/registry.js.map +1 -0
- package/dist/core/plugins/types.d.ts +182 -0
- package/dist/core/plugins/types.js +40 -0
- package/dist/core/plugins/types.js.map +1 -0
- package/dist/core/plugins/wrappers.d.ts +40 -0
- package/dist/core/plugins/wrappers.js +229 -0
- package/dist/core/plugins/wrappers.js.map +1 -0
- package/dist/core/portfolio/backlog.d.ts +40 -0
- package/dist/core/portfolio/backlog.js +177 -0
- package/dist/core/portfolio/backlog.js.map +1 -0
- package/dist/core/portfolio/scanners.d.ts +21 -0
- package/dist/core/portfolio/scanners.js +600 -0
- package/dist/core/portfolio/scanners.js.map +1 -0
- package/dist/core/providers.d.ts +34 -0
- package/dist/core/providers.js +250 -0
- package/dist/core/providers.js.map +1 -0
- package/dist/core/quality/conventions.d.ts +35 -0
- package/dist/core/quality/conventions.js +267 -0
- package/dist/core/quality/conventions.js.map +1 -0
- package/dist/core/quality/fixes.d.ts +56 -0
- package/dist/core/quality/fixes.js +209 -0
- package/dist/core/quality/fixes.js.map +1 -0
- package/dist/core/quality/health.d.ts +69 -0
- package/dist/core/quality/health.js +350 -0
- package/dist/core/quality/health.js.map +1 -0
- package/dist/core/quality/store.d.ts +56 -0
- package/dist/core/quality/store.js +195 -0
- package/dist/core/quality/store.js.map +1 -0
- package/dist/core/readiness.d.ts +112 -0
- package/dist/core/readiness.js +431 -0
- package/dist/core/readiness.js.map +1 -0
- package/dist/core/run/agent-loop.d.ts +40 -0
- package/dist/core/run/agent-loop.js +291 -0
- package/dist/core/run/agent-loop.js.map +1 -0
- package/dist/core/run/budget.d.ts +47 -0
- package/dist/core/run/budget.js +113 -0
- package/dist/core/run/budget.js.map +1 -0
- package/dist/core/run/engines.d.ts +75 -0
- package/dist/core/run/engines.js +199 -0
- package/dist/core/run/engines.js.map +1 -0
- package/dist/core/run/model-manager.d.ts +64 -0
- package/dist/core/run/model-manager.js +339 -0
- package/dist/core/run/model-manager.js.map +1 -0
- package/dist/core/run/orchestrator.d.ts +100 -0
- package/dist/core/run/orchestrator.js +1515 -0
- package/dist/core/run/orchestrator.js.map +1 -0
- package/dist/core/run/provider-client.d.ts +46 -0
- package/dist/core/run/provider-client.js +796 -0
- package/dist/core/run/provider-client.js.map +1 -0
- package/dist/core/run/retry.d.ts +19 -0
- package/dist/core/run/retry.js +68 -0
- package/dist/core/run/retry.js.map +1 -0
- package/dist/core/run/router.d.ts +50 -0
- package/dist/core/run/router.js +257 -0
- package/dist/core/run/router.js.map +1 -0
- package/dist/core/run/self-heal.d.ts +52 -0
- package/dist/core/run/self-heal.js +181 -0
- package/dist/core/run/self-heal.js.map +1 -0
- package/dist/core/run/streaming.d.ts +31 -0
- package/dist/core/run/streaming.js +122 -0
- package/dist/core/run/streaming.js.map +1 -0
- package/dist/core/run/verify.d.ts +30 -0
- package/dist/core/run/verify.js +204 -0
- package/dist/core/run/verify.js.map +1 -0
- package/dist/core/sandbox/audit.d.ts +31 -0
- package/dist/core/sandbox/audit.js +169 -0
- package/dist/core/sandbox/audit.js.map +1 -0
- package/dist/core/sandbox/policy.d.ts +61 -0
- package/dist/core/sandbox/policy.js +211 -0
- package/dist/core/sandbox/policy.js.map +1 -0
- package/dist/core/sandbox/worktree.d.ts +175 -0
- package/dist/core/sandbox/worktree.js +673 -0
- package/dist/core/sandbox/worktree.js.map +1 -0
- package/dist/core/seams/backlog.d.ts +47 -0
- package/dist/core/seams/backlog.js +47 -0
- package/dist/core/seams/backlog.js.map +1 -0
- package/dist/core/seams/daemon-coordinator.d.ts +72 -0
- package/dist/core/seams/daemon-coordinator.js +76 -0
- package/dist/core/seams/daemon-coordinator.js.map +1 -0
- package/dist/core/seams/genome.d.ts +45 -0
- package/dist/core/seams/genome.js +53 -0
- package/dist/core/seams/genome.js.map +1 -0
- package/dist/core/seams/identity.d.ts +40 -0
- package/dist/core/seams/identity.js +44 -0
- package/dist/core/seams/identity.js.map +1 -0
- package/dist/core/seams/inbox.d.ts +60 -0
- package/dist/core/seams/inbox.js +66 -0
- package/dist/core/seams/inbox.js.map +1 -0
- package/dist/core/seams/index.d.ts +20 -0
- package/dist/core/seams/index.js +21 -0
- package/dist/core/seams/index.js.map +1 -0
- package/dist/core/seams/portfolio.d.ts +50 -0
- package/dist/core/seams/portfolio.js +61 -0
- package/dist/core/seams/portfolio.js.map +1 -0
- package/dist/core/seams/registry.d.ts +42 -0
- package/dist/core/seams/registry.js +128 -0
- package/dist/core/seams/registry.js.map +1 -0
- package/dist/core/seams/run-swarm.d.ts +66 -0
- package/dist/core/seams/run-swarm.js +74 -0
- package/dist/core/seams/run-swarm.js.map +1 -0
- package/dist/core/seams/types.d.ts +123 -0
- package/dist/core/seams/types.js +35 -0
- package/dist/core/seams/types.js.map +1 -0
- package/dist/core/spec/spec-store.d.ts +62 -0
- package/dist/core/spec/spec-store.js +359 -0
- package/dist/core/spec/spec-store.js.map +1 -0
- package/dist/core/swarm/gate.d.ts +45 -0
- package/dist/core/swarm/gate.js +114 -0
- package/dist/core/swarm/gate.js.map +1 -0
- package/dist/core/swarm/planner.d.ts +32 -0
- package/dist/core/swarm/planner.js +293 -0
- package/dist/core/swarm/planner.js.map +1 -0
- package/dist/core/swarm/rollback.d.ts +56 -0
- package/dist/core/swarm/rollback.js +266 -0
- package/dist/core/swarm/rollback.js.map +1 -0
- package/dist/core/swarm/runner.d.ts +62 -0
- package/dist/core/swarm/runner.js +1263 -0
- package/dist/core/swarm/runner.js.map +1 -0
- package/dist/core/swarm/sign.d.ts +71 -0
- package/dist/core/swarm/sign.js +362 -0
- package/dist/core/swarm/sign.js.map +1 -0
- package/dist/core/swarm/store.d.ts +52 -0
- package/dist/core/swarm/store.js +195 -0
- package/dist/core/swarm/store.js.map +1 -0
- package/dist/core/tidy.d.ts +32 -0
- package/dist/core/tidy.js +354 -0
- package/dist/core/tidy.js.map +1 -0
- package/dist/core/tools-registry.d.ts +16 -0
- package/dist/core/tools-registry.js +308 -0
- package/dist/core/tools-registry.js.map +1 -0
- package/dist/core/types.d.ts +2545 -0
- package/dist/core/types.js +9 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/web/api.d.ts +53 -0
- package/dist/core/web/api.js +698 -0
- package/dist/core/web/api.js.map +1 -0
- package/dist/core/web/public/app.js +1906 -0
- package/dist/core/web/public/index.html +721 -0
- package/dist/core/web/public/styles.css +2007 -0
- package/dist/core/web/server.d.ts +18 -0
- package/dist/core/web/server.js +122 -0
- package/dist/core/web/server.js.map +1 -0
- package/dist/core/web/static.d.ts +18 -0
- package/dist/core/web/static.js +122 -0
- package/dist/core/web/static.js.map +1 -0
- package/dist/tui/app.d.ts +33 -0
- package/dist/tui/app.js +350 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/render.d.ts +20 -0
- package/dist/tui/render.js +558 -0
- package/dist/tui/render.js.map +1 -0
- package/package.json +80 -0
- package/schema/config.schema.json +223 -0
package/dist/cli/mcp.js
ADDED
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ashlr mcp` command dispatcher.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* (default / "run") — run the aggregation gateway on stdio
|
|
6
|
+
* "list" — print discovered servers + per-server tool counts; --json
|
|
7
|
+
* "doctor" — per-server health (starts? #tools?); --json; exit 1 if required servers down
|
|
8
|
+
* "install <target> [--config <path>]" — idempotently add "ashlr" gateway entry to a target config
|
|
9
|
+
*
|
|
10
|
+
* SAFETY: install NEVER targets real configs unless explicitly passed via --config or invoked
|
|
11
|
+
* interactively with the real target paths. In tests, always pass --config to a temp file.
|
|
12
|
+
*/
|
|
13
|
+
import { readFileSync, writeFileSync, existsSync, copyFileSync } from 'node:fs';
|
|
14
|
+
import { homedir } from 'node:os';
|
|
15
|
+
import { resolve, join, dirname } from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
import { mkdirSync } from 'node:fs';
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// ANSI helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
import { pad, makeColors, isTty } from './ui.js';
|
|
22
|
+
const { bold, dim, red, green, yellow, cyan, gray, magenta } = makeColors(isTty());
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Lazy imports — the gateway/registry modules depend on @modelcontextprotocol/sdk
|
|
25
|
+
// and must be dynamically imported so that non-gateway commands stay fast.
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
async function importRegistry() {
|
|
28
|
+
return import('../core/mcp-registry.js');
|
|
29
|
+
}
|
|
30
|
+
async function importGateway() {
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
|
+
const mod = await import('../core/mcp-gateway.js');
|
|
33
|
+
return mod;
|
|
34
|
+
}
|
|
35
|
+
async function importToolsRegistry() {
|
|
36
|
+
return import('../core/tools-registry.js');
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// Redaction — env values MUST never be printed
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function redactEnv(env) {
|
|
42
|
+
if (!env)
|
|
43
|
+
return undefined;
|
|
44
|
+
const result = {};
|
|
45
|
+
for (const key of Object.keys(env)) {
|
|
46
|
+
result[key] = '<set>';
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
// Secrets are frequently passed as CLI args (e.g. `--access-token sbp_…`,
|
|
51
|
+
// `--api-key=sk_test_…`), not just env. Redact them before any display so
|
|
52
|
+
// `mcp list` / `--json` never surface real credentials.
|
|
53
|
+
const SENSITIVE_FLAG = /(?:^|[-_])(?:token|key|secret|password|passwd|auth|credential|api[-_]?key|access[-_]?token|bearer|dsn)$/i;
|
|
54
|
+
const SECRET_TOKEN = /(?:sk-|sk_live_|sk_test_|rk_live_|rk_test_|sbp_|pk_live_|ghp_|gho_|ghu_|ghs_|github_pat_|xox[baprs]-|AKIA[0-9A-Z]{12,}|AIza[0-9A-Za-z_-]{10,}|eyJ[A-Za-z0-9_-]{10,})/;
|
|
55
|
+
export function redactArgs(args) {
|
|
56
|
+
const out = [];
|
|
57
|
+
let redactNext = false;
|
|
58
|
+
for (const arg of args) {
|
|
59
|
+
if (redactNext) {
|
|
60
|
+
out.push('<redacted>');
|
|
61
|
+
redactNext = false;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
const eq = arg.match(/^(--?[A-Za-z0-9][\w-]*)=(.+)$/);
|
|
65
|
+
if (eq && SENSITIVE_FLAG.test(eq[1])) {
|
|
66
|
+
out.push(`${eq[1]}=<redacted>`);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (/^--?[A-Za-z]/.test(arg) && SENSITIVE_FLAG.test(arg.replace(/^--?/, ''))) {
|
|
70
|
+
out.push(arg);
|
|
71
|
+
redactNext = true;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (SECRET_TOKEN.test(arg)) {
|
|
75
|
+
out.push('<redacted>');
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
out.push(arg);
|
|
79
|
+
}
|
|
80
|
+
return out;
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Resolve the absolute path to the bin/ashlr executable
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function resolveAshlrBin() {
|
|
86
|
+
// __filename is unavailable in ESM; resolve relative to this module file
|
|
87
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
88
|
+
// src/cli/mcp.ts -> two levels up = project root
|
|
89
|
+
const projectRoot = resolve(dirname(thisFile), '..', '..');
|
|
90
|
+
const binPath = join(projectRoot, 'bin', 'ashlr');
|
|
91
|
+
return binPath;
|
|
92
|
+
}
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Default target config paths for `ashlr mcp install`
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
const DEFAULT_TARGETS = {
|
|
97
|
+
claude: join(homedir(), '.claude.json'),
|
|
98
|
+
ashlrcode: join(homedir(), '.ashlrcode', 'settings.json'),
|
|
99
|
+
};
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// Subcommand: run (default)
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
async function cmdMcpRun() {
|
|
104
|
+
// Pure stdio — log only to stderr, never stdout
|
|
105
|
+
try {
|
|
106
|
+
const { discoverMcpServers } = await importRegistry();
|
|
107
|
+
const { startGateway } = await importGateway();
|
|
108
|
+
const registry = discoverMcpServers();
|
|
109
|
+
process.stderr.write(`[ashlr mcp] starting gateway with ${registry.servers.length} discovered server(s)\n`);
|
|
110
|
+
await startGateway(registry);
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
115
|
+
process.stderr.write(`[ashlr mcp] gateway error: ${msg}\n`);
|
|
116
|
+
return 1;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// ---------------------------------------------------------------------------
|
|
120
|
+
// Subcommand: list
|
|
121
|
+
// ---------------------------------------------------------------------------
|
|
122
|
+
async function cmdMcpList(args) {
|
|
123
|
+
const jsonMode = args.includes('--json');
|
|
124
|
+
const { discoverMcpServers } = await importRegistry();
|
|
125
|
+
const { getToolsRegistry } = await importToolsRegistry();
|
|
126
|
+
const registry = discoverMcpServers();
|
|
127
|
+
const toolsReg = getToolsRegistry();
|
|
128
|
+
// M31: native ashlr tools served by the gateway itself (no probe needed).
|
|
129
|
+
const { nativeToolDefs } = await import('../core/mcp-native.js');
|
|
130
|
+
const native = nativeToolDefs();
|
|
131
|
+
if (jsonMode) {
|
|
132
|
+
// Redact env before serializing
|
|
133
|
+
const safe = registry.servers.map(s => ({
|
|
134
|
+
...s,
|
|
135
|
+
args: redactArgs(s.args),
|
|
136
|
+
env: redactEnv(s.env),
|
|
137
|
+
}));
|
|
138
|
+
process.stdout.write(JSON.stringify({
|
|
139
|
+
servers: safe,
|
|
140
|
+
tools: toolsReg,
|
|
141
|
+
native: native.map(t => ({ name: t.name, safety: t.safety })),
|
|
142
|
+
}, null, 2) + '\n');
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
// Human output
|
|
146
|
+
console.log('');
|
|
147
|
+
console.log(bold(' ashlr mcp list') + gray(` — ${registry.servers.length} discovered server(s) + ${native.length} native tool(s)`));
|
|
148
|
+
console.log('');
|
|
149
|
+
// Native (built-in) tools — always available, served by the gateway itself.
|
|
150
|
+
console.log(bold(' Native (built-in)') + gray(' — served by `ashlr mcp` directly'));
|
|
151
|
+
console.log('');
|
|
152
|
+
{
|
|
153
|
+
const nameW = Math.max(10, ...native.map(t => t.name.length));
|
|
154
|
+
for (const t of native) {
|
|
155
|
+
const safetyStr = t.safety === 'read' ? green(t.safety) : t.safety === 'append' ? yellow(t.safety) : magenta(t.safety);
|
|
156
|
+
console.log(` ${pad(cyan(t.name), nameW)} ${pad(safetyStr, 10)} ${dim(t.description.split('. ')[0] ?? '')}`);
|
|
157
|
+
}
|
|
158
|
+
console.log('');
|
|
159
|
+
}
|
|
160
|
+
if (registry.servers.length === 0) {
|
|
161
|
+
console.log(' ' + dim('No MCP servers discovered.'));
|
|
162
|
+
console.log('');
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const nameW = Math.max(8, ...registry.servers.map(s => s.name.length));
|
|
166
|
+
const srcW = Math.max(8, ...registry.servers.map(s => s.source.length));
|
|
167
|
+
const cmdW = 36;
|
|
168
|
+
console.log(` ${bold(pad('Name', nameW))} ${bold(pad('Source', srcW))} ${bold(pad('Command', cmdW))}`);
|
|
169
|
+
console.log(` ${'─'.repeat(nameW)} ${'─'.repeat(srcW)} ${'─'.repeat(cmdW)}`);
|
|
170
|
+
for (const srv of registry.servers) {
|
|
171
|
+
const isAshlr = srv.name === 'ashlr';
|
|
172
|
+
const isPhantom = srv.name === 'phantom-secrets';
|
|
173
|
+
const nameStr = isAshlr
|
|
174
|
+
? magenta(srv.name)
|
|
175
|
+
: isPhantom
|
|
176
|
+
? cyan(srv.name)
|
|
177
|
+
: srv.name;
|
|
178
|
+
const safeArgs = redactArgs(srv.args);
|
|
179
|
+
const cmdStr = [srv.command, ...(safeArgs.length > 0 ? safeArgs : [])].join(' ');
|
|
180
|
+
const cmdTrunc = cmdStr.length > cmdW ? cmdStr.slice(0, cmdW - 1) + '…' : cmdStr;
|
|
181
|
+
const envCount = srv.env ? Object.keys(srv.env).length : 0;
|
|
182
|
+
const envStr = envCount > 0 ? gray(` +${envCount} env`) : '';
|
|
183
|
+
console.log(` ${pad(nameStr, nameW)} ${pad(gray(srv.source), srcW)} ${dim(cmdTrunc)}${envStr}`);
|
|
184
|
+
}
|
|
185
|
+
console.log('');
|
|
186
|
+
}
|
|
187
|
+
// Tools registry summary
|
|
188
|
+
const installed = toolsReg.tools.filter(t => t.installed);
|
|
189
|
+
console.log(bold(' Ecosystem tools') + gray(` — ${installed.length}/${toolsReg.tools.length} installed`));
|
|
190
|
+
console.log('');
|
|
191
|
+
if (toolsReg.tools.length > 0) {
|
|
192
|
+
const idW = Math.max(8, ...toolsReg.tools.map(t => t.id.length));
|
|
193
|
+
const verW = 12;
|
|
194
|
+
console.log(` ${bold(pad('Tool', idW))} ${bold(pad('Version', verW))} ${bold('Path')}`);
|
|
195
|
+
console.log(` ${'─'.repeat(idW)} ${'─'.repeat(verW)} ${'─'.repeat(40)}`);
|
|
196
|
+
for (const tool of toolsReg.tools) {
|
|
197
|
+
const nameStr = tool.installed ? green(tool.id) : dim(tool.id);
|
|
198
|
+
const verStr = tool.version ? cyan(tool.version) : dim('—');
|
|
199
|
+
const pathStr = tool.path
|
|
200
|
+
? gray(tool.path.replace(homedir(), '~'))
|
|
201
|
+
: dim('not found');
|
|
202
|
+
console.log(` ${pad(nameStr, idW)} ${pad(verStr, verW)} ${pathStr}`);
|
|
203
|
+
}
|
|
204
|
+
console.log('');
|
|
205
|
+
}
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
// ---------------------------------------------------------------------------
|
|
209
|
+
// Subcommand: doctor
|
|
210
|
+
// ---------------------------------------------------------------------------
|
|
211
|
+
/** Required server names — gateway is unhealthy if these are down. */
|
|
212
|
+
const REQUIRED_SERVERS = new Set(['ashlr', 'phantom-secrets']);
|
|
213
|
+
async function cmdMcpDoctor(args) {
|
|
214
|
+
const jsonMode = args.includes('--json');
|
|
215
|
+
const timeoutMs = 8000;
|
|
216
|
+
const { discoverMcpServers } = await importRegistry();
|
|
217
|
+
const { probeServer } = await importGateway();
|
|
218
|
+
const registry = discoverMcpServers();
|
|
219
|
+
if (!jsonMode) {
|
|
220
|
+
console.log('');
|
|
221
|
+
console.log(bold(' ashlr mcp doctor') + gray(` — probing ${registry.servers.length} server(s)`));
|
|
222
|
+
console.log('');
|
|
223
|
+
}
|
|
224
|
+
// Probe all servers in parallel
|
|
225
|
+
const probes = registry.servers.map(async (srv) => {
|
|
226
|
+
if (!jsonMode) {
|
|
227
|
+
process.stderr.write(` probing ${srv.name}…\n`);
|
|
228
|
+
}
|
|
229
|
+
const health = await probeServer(srv, timeoutMs);
|
|
230
|
+
return health;
|
|
231
|
+
});
|
|
232
|
+
// M31: native tools need no probe — they are in-process and always present.
|
|
233
|
+
const { nativeToolDefs } = await import('../core/mcp-native.js');
|
|
234
|
+
const nativeCount = nativeToolDefs().length;
|
|
235
|
+
if (!jsonMode) {
|
|
236
|
+
console.log(` ${bold('native')} ${green('ok')} ${cyan(String(nativeCount))} built-in ashlr tool(s) (no probe needed)`);
|
|
237
|
+
console.log('');
|
|
238
|
+
}
|
|
239
|
+
const results = await Promise.allSettled(probes);
|
|
240
|
+
const healths = results.map((r, i) => {
|
|
241
|
+
if (r.status === 'fulfilled')
|
|
242
|
+
return r.value;
|
|
243
|
+
return {
|
|
244
|
+
name: registry.servers[i].name,
|
|
245
|
+
ok: false,
|
|
246
|
+
toolCount: 0,
|
|
247
|
+
tools: [],
|
|
248
|
+
error: r.reason instanceof Error ? r.reason.message : String(r.reason),
|
|
249
|
+
};
|
|
250
|
+
});
|
|
251
|
+
if (jsonMode) {
|
|
252
|
+
process.stdout.write(JSON.stringify(healths, null, 2) + '\n');
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
// Clear the "probing…" lines were written to stderr; now print table to stdout
|
|
256
|
+
const nameW = Math.max(8, ...healths.map(h => h.name.length));
|
|
257
|
+
const statusW = 6;
|
|
258
|
+
const toolW = 7;
|
|
259
|
+
console.log(` ${bold(pad('Server', nameW))} ${bold(pad('Status', statusW))} ${bold(pad('#Tools', toolW))} ${bold('Info')}`);
|
|
260
|
+
console.log(` ${'─'.repeat(nameW)} ${'─'.repeat(statusW)} ${'─'.repeat(toolW)} ${'─'.repeat(40)}`);
|
|
261
|
+
for (const h of healths) {
|
|
262
|
+
const isRequired = REQUIRED_SERVERS.has(h.name);
|
|
263
|
+
const statusStr = h.ok ? green('ok') : (isRequired ? red('DOWN') : yellow('down'));
|
|
264
|
+
const toolStr = h.ok ? cyan(String(h.toolCount)) : dim('0');
|
|
265
|
+
const infoStr = h.ok
|
|
266
|
+
? dim(h.tools.slice(0, 3).join(', ') + (h.tools.length > 3 ? ` +${h.tools.length - 3} more` : ''))
|
|
267
|
+
: red(h.error ?? 'failed');
|
|
268
|
+
console.log(` ${pad(bold(h.name), nameW)} ${pad(statusStr, statusW)} ${pad(toolStr, toolW)} ${infoStr}`);
|
|
269
|
+
}
|
|
270
|
+
console.log('');
|
|
271
|
+
}
|
|
272
|
+
// Exit 1 if any REQUIRED server is down
|
|
273
|
+
const anyRequiredDown = healths.some(h => REQUIRED_SERVERS.has(h.name) && !h.ok);
|
|
274
|
+
if (anyRequiredDown && !jsonMode) {
|
|
275
|
+
console.log(red(' One or more required servers (ashlr, phantom-secrets) are down.'));
|
|
276
|
+
console.log('');
|
|
277
|
+
}
|
|
278
|
+
return anyRequiredDown ? 1 : 0;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Sentinel thrown by parseConfigFile when a target file exists and is non-empty
|
|
282
|
+
* but is NOT valid JSON. cmdMcpInstall MUST abort on this rather than treating
|
|
283
|
+
* the file as {} — otherwise a deep-merge would clobber the user's real config
|
|
284
|
+
* (every other key AND every other mcpServers entry) down to just our entry.
|
|
285
|
+
*/
|
|
286
|
+
class ConfigParseError extends Error {
|
|
287
|
+
path;
|
|
288
|
+
constructor(path) {
|
|
289
|
+
super(`config is not valid JSON: ${path}`);
|
|
290
|
+
this.path = path;
|
|
291
|
+
this.name = 'ConfigParseError';
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Parse a target config file.
|
|
296
|
+
* - absent or empty → {} (a fresh config we may safely create)
|
|
297
|
+
* - present + valid JSON → the parsed object
|
|
298
|
+
* - present + UNPARSEABLE JSON → throws ConfigParseError (caller aborts; we
|
|
299
|
+
* never derive a merged write from a file we failed to parse).
|
|
300
|
+
*/
|
|
301
|
+
function parseConfigFile(filePath) {
|
|
302
|
+
if (!existsSync(filePath))
|
|
303
|
+
return {};
|
|
304
|
+
const raw = readFileSync(filePath, 'utf8').trim();
|
|
305
|
+
if (!raw)
|
|
306
|
+
return {};
|
|
307
|
+
try {
|
|
308
|
+
return JSON.parse(raw);
|
|
309
|
+
}
|
|
310
|
+
catch {
|
|
311
|
+
throw new ConfigParseError(filePath);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
async function cmdMcpInstall(args) {
|
|
315
|
+
// Parse: install <target> [--config <path>]
|
|
316
|
+
const positional = args.filter(a => !a.startsWith('--'));
|
|
317
|
+
const target = positional[0];
|
|
318
|
+
if (!target || (target !== 'claude' && target !== 'ashlrcode')) {
|
|
319
|
+
console.error(red('error: ') + 'Usage: ashlr mcp install <claude|ashlrcode> [--config <path>]');
|
|
320
|
+
return 2;
|
|
321
|
+
}
|
|
322
|
+
// --config override
|
|
323
|
+
const configFlagIdx = args.indexOf('--config');
|
|
324
|
+
const configPath = configFlagIdx !== -1 && args[configFlagIdx + 1]
|
|
325
|
+
? resolve(args[configFlagIdx + 1])
|
|
326
|
+
: DEFAULT_TARGETS[target];
|
|
327
|
+
const binPath = resolveAshlrBin();
|
|
328
|
+
// The gateway entry we want to install
|
|
329
|
+
const gatewayEntry = {
|
|
330
|
+
command: binPath,
|
|
331
|
+
args: ['mcp'],
|
|
332
|
+
};
|
|
333
|
+
// ── Parse FIRST — abort on malformed input, before any write/backup ──────
|
|
334
|
+
// A file that exists but is not valid JSON must be left byte-for-byte
|
|
335
|
+
// unchanged. Parsing before backup/write guarantees we never destroy a real
|
|
336
|
+
// config (or its .bak) because of a transient trailing comma / partial write.
|
|
337
|
+
let existing;
|
|
338
|
+
try {
|
|
339
|
+
existing = parseConfigFile(configPath);
|
|
340
|
+
}
|
|
341
|
+
catch (err) {
|
|
342
|
+
if (err instanceof ConfigParseError) {
|
|
343
|
+
console.error(red('error: ') +
|
|
344
|
+
`refusing to write: ${err.path} is not valid JSON; ` +
|
|
345
|
+
`restore it or pass a clean --config <path>.`);
|
|
346
|
+
return 1;
|
|
347
|
+
}
|
|
348
|
+
throw err;
|
|
349
|
+
}
|
|
350
|
+
// ── Backup (only after a clean parse) ────────────────────────────────────
|
|
351
|
+
if (existsSync(configPath)) {
|
|
352
|
+
// Primary recovery slot: <config>.bak (documented; what users look for).
|
|
353
|
+
const bakPath = configPath + '.bak';
|
|
354
|
+
// If a .bak already exists that we did NOT create this run, snapshot it to a
|
|
355
|
+
// timestamped sidecar first so a second run can't destroy an older backup.
|
|
356
|
+
if (existsSync(bakPath)) {
|
|
357
|
+
try {
|
|
358
|
+
copyFileSync(bakPath, `${bakPath}.${Date.now()}`);
|
|
359
|
+
}
|
|
360
|
+
catch { /* best-effort — never block install on backup-of-backup */ }
|
|
361
|
+
}
|
|
362
|
+
copyFileSync(configPath, bakPath);
|
|
363
|
+
console.log(dim(` backed up: ${configPath} → ${bakPath}`));
|
|
364
|
+
}
|
|
365
|
+
else {
|
|
366
|
+
// Ensure the parent directory exists
|
|
367
|
+
const dir = dirname(configPath);
|
|
368
|
+
mkdirSync(dir, { recursive: true });
|
|
369
|
+
}
|
|
370
|
+
// ── Idempotency check ────────────────────────────────────────────────────
|
|
371
|
+
const existingServers = existing.mcpServers ?? {};
|
|
372
|
+
const existingEntry = existingServers['ashlr'];
|
|
373
|
+
if (existingEntry) {
|
|
374
|
+
const same = existingEntry.command === gatewayEntry.command &&
|
|
375
|
+
JSON.stringify(existingEntry.args ?? []) === JSON.stringify(gatewayEntry.args);
|
|
376
|
+
if (same) {
|
|
377
|
+
console.log(green(' ✓ already installed — no changes needed.'));
|
|
378
|
+
console.log(dim(` config: ${configPath}`));
|
|
379
|
+
return 0;
|
|
380
|
+
}
|
|
381
|
+
// Entry exists but differs — update it
|
|
382
|
+
console.log(yellow(' ! existing "ashlr" entry differs — updating.'));
|
|
383
|
+
}
|
|
384
|
+
// ── Deep merge: add/update "ashlr" key only, preserve all others ─────────
|
|
385
|
+
const merged = {
|
|
386
|
+
...existing,
|
|
387
|
+
mcpServers: {
|
|
388
|
+
...existingServers,
|
|
389
|
+
ashlr: gatewayEntry,
|
|
390
|
+
},
|
|
391
|
+
};
|
|
392
|
+
writeFileSync(configPath, JSON.stringify(merged, null, 2) + '\n', 'utf8');
|
|
393
|
+
console.log('');
|
|
394
|
+
console.log(green(' ✓ installed') + ' ashlr gateway → ' + cyan(configPath));
|
|
395
|
+
console.log('');
|
|
396
|
+
console.log(` ${bold('entry added:')}`);
|
|
397
|
+
console.log(` ${gray('"mcpServers"')}: {`);
|
|
398
|
+
console.log(` ${gray('"ashlr"')}: {`);
|
|
399
|
+
console.log(` ${gray('"command"')}: ${cyan(`"${gatewayEntry.command}"`)},`);
|
|
400
|
+
console.log(` ${gray('"args"')}: ${cyan(JSON.stringify(gatewayEntry.args))}`);
|
|
401
|
+
console.log(` }`);
|
|
402
|
+
console.log(` }`);
|
|
403
|
+
console.log('');
|
|
404
|
+
console.log(dim(` Point your agent at this config to get every discovered MCP tool.`));
|
|
405
|
+
console.log('');
|
|
406
|
+
return 0;
|
|
407
|
+
}
|
|
408
|
+
// ---------------------------------------------------------------------------
|
|
409
|
+
// Help
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
function printHelp() {
|
|
412
|
+
console.log('');
|
|
413
|
+
console.log(bold(' ashlr mcp') + dim(' — MCP aggregation gateway'));
|
|
414
|
+
console.log('');
|
|
415
|
+
console.log(' ' + bold('Subcommands:'));
|
|
416
|
+
console.log('');
|
|
417
|
+
const cmds = [
|
|
418
|
+
['(default)', 'Run the aggregation gateway on stdio. Point any agent here.'],
|
|
419
|
+
['list [--json]', 'Print discovered servers + ecosystem tools summary.'],
|
|
420
|
+
['doctor [--json]', 'Probe each server; exit 1 if required servers (ashlr/phantom) are down.'],
|
|
421
|
+
['install <claude|ashlrcode>', 'Idempotently add the ashlr gateway to a target config (backs up first).'],
|
|
422
|
+
['install <target> --config <path>', 'Install to a specific config path (use in tests to avoid real configs).'],
|
|
423
|
+
];
|
|
424
|
+
const cmdW = Math.max(...cmds.map(([c]) => c.length));
|
|
425
|
+
for (const [cmd, desc] of cmds) {
|
|
426
|
+
console.log(` ${cyan(pad(cmd, cmdW))} ${desc}`);
|
|
427
|
+
}
|
|
428
|
+
console.log('');
|
|
429
|
+
console.log(' ' + bold('Examples:'));
|
|
430
|
+
console.log('');
|
|
431
|
+
console.log(` ${dim('# Run as MCP server (stdio)')}`);
|
|
432
|
+
console.log(` ashlr mcp`);
|
|
433
|
+
console.log('');
|
|
434
|
+
console.log(` ${dim('# List what would be aggregated')}`);
|
|
435
|
+
console.log(` ashlr mcp list`);
|
|
436
|
+
console.log('');
|
|
437
|
+
console.log(` ${dim('# Health-check all downstream servers')}`);
|
|
438
|
+
console.log(` ashlr mcp doctor`);
|
|
439
|
+
console.log('');
|
|
440
|
+
console.log(` ${dim('# Install gateway into Claude config (backs up ~/.claude.json first)')}`);
|
|
441
|
+
console.log(` ashlr mcp install claude`);
|
|
442
|
+
console.log('');
|
|
443
|
+
console.log(` ${dim('# Install into a temp file for testing')}`);
|
|
444
|
+
console.log(` ashlr mcp install claude --config /tmp/test-claude.json`);
|
|
445
|
+
console.log('');
|
|
446
|
+
}
|
|
447
|
+
// ---------------------------------------------------------------------------
|
|
448
|
+
// Main dispatcher
|
|
449
|
+
// ---------------------------------------------------------------------------
|
|
450
|
+
/**
|
|
451
|
+
* `ashlr mcp` command dispatcher. Subcommands (args[0]):
|
|
452
|
+
* - (default / "run"): run the aggregation gateway on stdio
|
|
453
|
+
* (discoverMcpServers -> startGateway).
|
|
454
|
+
* - "list": print the registry + per-server tool counts (env values redacted).
|
|
455
|
+
* - "doctor": per-server health (starts? #tools?) via probeServer.
|
|
456
|
+
* - "install <claude|ashlrcode> [--config <path>]": idempotently add the ashlr
|
|
457
|
+
* gateway to a target mcpServers config. BACK UP the file first; merge,
|
|
458
|
+
* don't clobber. NEVER target the real configs during verify — only a TEMP
|
|
459
|
+
* path passed via --config.
|
|
460
|
+
* Returns a process exit code (0 = success).
|
|
461
|
+
*/
|
|
462
|
+
export async function cmdMcp(args) {
|
|
463
|
+
const sub = args[0];
|
|
464
|
+
// Help shortcircuit
|
|
465
|
+
if (sub === '--help' || sub === '-h' || sub === 'help') {
|
|
466
|
+
printHelp();
|
|
467
|
+
return 0;
|
|
468
|
+
}
|
|
469
|
+
// Default / explicit "run"
|
|
470
|
+
if (!sub || sub === 'run') {
|
|
471
|
+
return cmdMcpRun();
|
|
472
|
+
}
|
|
473
|
+
if (sub === 'list') {
|
|
474
|
+
return cmdMcpList(args.slice(1));
|
|
475
|
+
}
|
|
476
|
+
if (sub === 'doctor') {
|
|
477
|
+
return cmdMcpDoctor(args.slice(1));
|
|
478
|
+
}
|
|
479
|
+
if (sub === 'install') {
|
|
480
|
+
return cmdMcpInstall(args.slice(1));
|
|
481
|
+
}
|
|
482
|
+
// Unknown subcommand
|
|
483
|
+
console.error(red('error: ') + `unknown subcommand: ${bold(sub)}`);
|
|
484
|
+
console.error(dim('Run `ashlr mcp help` for usage.'));
|
|
485
|
+
return 2;
|
|
486
|
+
}
|
|
487
|
+
//# sourceMappingURL=mcp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../src/cli/mcp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ashlr models` — local model management CLI.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
* (none) List local models (Ollama + LM Studio) with provider,
|
|
6
|
+
* name, size, and active marker.
|
|
7
|
+
* pull <name> Confirm then pull a model via `ollama pull` (EXPLICIT
|
|
8
|
+
* only — large download; honors --yes to skip prompt).
|
|
9
|
+
* start Best-effort start a locally-installed Ollama daemon.
|
|
10
|
+
*
|
|
11
|
+
* Flags (all subcommands):
|
|
12
|
+
* --json Emit machine-readable JSON instead of human output.
|
|
13
|
+
* --yes Skip interactive confirmation prompts (pull only).
|
|
14
|
+
*
|
|
15
|
+
* Returns process exit code: 0 success, 1 error, 2 bad usage.
|
|
16
|
+
*
|
|
17
|
+
* Guardrails:
|
|
18
|
+
* - `pull` NEVER runs automatically; only from this explicit path + confirm.
|
|
19
|
+
* - `start` NEVER auto-runs; only from the explicit `models start` path.
|
|
20
|
+
* - No secrets in output; no cloud interaction here.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* `ashlr models` — local model management.
|
|
24
|
+
* Returns process exit code.
|
|
25
|
+
*/
|
|
26
|
+
export declare function cmdModels(args: string[]): Promise<number>;
|