@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
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/completions.ts — `ashlr completions zsh|bash` (M31).
|
|
3
|
+
*
|
|
4
|
+
* Emits a STATIC shell-completion script generated from the top-level command
|
|
5
|
+
* table. Install:
|
|
6
|
+
* zsh: ashlr completions zsh > ~/.zsh/completions/_ashlr (fpath dir)
|
|
7
|
+
* bash: ashlr completions bash > ~/.local/share/bash-completion/completions/ashlr
|
|
8
|
+
*
|
|
9
|
+
* Read-only: prints to stdout, writes nothing. Exit codes: 0 / 2 bad usage.
|
|
10
|
+
*/
|
|
11
|
+
import { makeColors, isTty } from './ui.js';
|
|
12
|
+
/** Top-level commands (kept in sync by test/m31.cli-agent.test.ts). */
|
|
13
|
+
export const TOP_LEVEL_COMMANDS = [
|
|
14
|
+
'index', 'go', 'status', 'ls', 'open', 'tidy', 'config', 'doctor', 'init',
|
|
15
|
+
'mcp', 'run', 'runs', 'pulse', 'new', 'ship', 'recall', 'learn', 'genome',
|
|
16
|
+
'update', 'spec', 'swarm', 'swarms', 'tui', 'dash', 'serve', 'models',
|
|
17
|
+
'gh', 'vercel', 'wire', 'notify', 'telemetry', 'sandbox', 'audit',
|
|
18
|
+
'enroll', 'backlog', 'inbox', 'daemon', 'ask', 'knowledge', 'reflect',
|
|
19
|
+
'health', 'goals', 'digest', 'seams', 'verify-safety', 'preflight',
|
|
20
|
+
'onboard', 'demo', 'orient', 'docs', 'completions', 'plugins', 'x', 'help',
|
|
21
|
+
];
|
|
22
|
+
/** Subcommands per top-level command (first-position completion only). */
|
|
23
|
+
const SUBCOMMANDS = {
|
|
24
|
+
config: ['get', 'set', 'path'],
|
|
25
|
+
mcp: ['list', 'doctor', 'install'],
|
|
26
|
+
run: ['show'],
|
|
27
|
+
spec: ['new', 'list', 'show', 'refine'],
|
|
28
|
+
swarm: ['show'],
|
|
29
|
+
models: ['pull', 'start'],
|
|
30
|
+
gh: ['pr', 'issue', 'ci'],
|
|
31
|
+
vercel: ['ls', 'logs'],
|
|
32
|
+
wire: ['claude', 'codex', 'cursor', 'all'],
|
|
33
|
+
notify: ['test'],
|
|
34
|
+
telemetry: ['status', 'test'],
|
|
35
|
+
sandbox: ['list', 'diff', 'cleanup', 'gc'],
|
|
36
|
+
enroll: ['add', 'remove', 'list', 'kill'],
|
|
37
|
+
backlog: ['refresh'],
|
|
38
|
+
inbox: ['show', 'approve', 'reject'],
|
|
39
|
+
daemon: ['start', 'stop', 'status'],
|
|
40
|
+
knowledge: ['build', 'impact', 'graph'],
|
|
41
|
+
reflect: ['playbooks', 'propose'],
|
|
42
|
+
health: ['propose'],
|
|
43
|
+
goals: ['add', 'plan', 'advance', 'status'],
|
|
44
|
+
seams: ['status'],
|
|
45
|
+
completions: ['zsh', 'bash'],
|
|
46
|
+
plugins: ['init', 'list', 'info', 'enable', 'disable'],
|
|
47
|
+
};
|
|
48
|
+
function zshScript() {
|
|
49
|
+
const subcases = Object.entries(SUBCOMMANDS)
|
|
50
|
+
.map(([cmd, subs]) => ` ${cmd}) _values 'subcommand' ${subs.map((s) => `'${s}'`).join(' ')} ;;`)
|
|
51
|
+
.join('\n');
|
|
52
|
+
return `#compdef ashlr
|
|
53
|
+
# ashlr zsh completions — generated by \`ashlr completions zsh\`.
|
|
54
|
+
_ashlr() {
|
|
55
|
+
local -a _ashlr_cmds
|
|
56
|
+
_ashlr_cmds=(${TOP_LEVEL_COMMANDS.map((c) => `'${c}'`).join(' ')})
|
|
57
|
+
if (( CURRENT == 2 )); then
|
|
58
|
+
_values 'ashlr command' "\${_ashlr_cmds[@]}"
|
|
59
|
+
elif (( CURRENT == 3 )); then
|
|
60
|
+
case "\${words[2]}" in
|
|
61
|
+
${subcases}
|
|
62
|
+
*) _files ;;
|
|
63
|
+
esac
|
|
64
|
+
else
|
|
65
|
+
_files
|
|
66
|
+
fi
|
|
67
|
+
}
|
|
68
|
+
_ashlr "$@"
|
|
69
|
+
`;
|
|
70
|
+
}
|
|
71
|
+
function bashScript() {
|
|
72
|
+
const subcases = Object.entries(SUBCOMMANDS)
|
|
73
|
+
.map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W "${subs.join(' ')}" -- "$cur") ) ;;`)
|
|
74
|
+
.join('\n');
|
|
75
|
+
return `# ashlr bash completions — generated by \`ashlr completions bash\`.
|
|
76
|
+
_ashlr_completions() {
|
|
77
|
+
local cur prev
|
|
78
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
79
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
80
|
+
if [ "$COMP_CWORD" -eq 1 ]; then
|
|
81
|
+
COMPREPLY=( $(compgen -W "${TOP_LEVEL_COMMANDS.join(' ')}" -- "$cur") )
|
|
82
|
+
return 0
|
|
83
|
+
fi
|
|
84
|
+
if [ "$COMP_CWORD" -eq 2 ]; then
|
|
85
|
+
case "\${COMP_WORDS[1]}" in
|
|
86
|
+
${subcases}
|
|
87
|
+
*) COMPREPLY=() ;;
|
|
88
|
+
esac
|
|
89
|
+
return 0
|
|
90
|
+
fi
|
|
91
|
+
COMPREPLY=()
|
|
92
|
+
}
|
|
93
|
+
complete -F _ashlr_completions ashlr
|
|
94
|
+
`;
|
|
95
|
+
}
|
|
96
|
+
export async function cmdCompletions(args) {
|
|
97
|
+
const shell = args[0];
|
|
98
|
+
if (shell === 'zsh') {
|
|
99
|
+
process.stdout.write(zshScript());
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
if (shell === 'bash') {
|
|
103
|
+
process.stdout.write(bashScript());
|
|
104
|
+
return 0;
|
|
105
|
+
}
|
|
106
|
+
const c = makeColors(isTty());
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log(c.bold(' ashlr completions') + c.dim(' — shell completion scripts'));
|
|
109
|
+
console.log('');
|
|
110
|
+
console.log(` ${c.cyan('ashlr completions zsh')} ${c.dim('print zsh completion (_ashlr) to stdout')}`);
|
|
111
|
+
console.log(` ${c.cyan('ashlr completions bash')} ${c.dim('print bash completion to stdout')}`);
|
|
112
|
+
console.log('');
|
|
113
|
+
return shell === undefined || shell === '--help' || shell === '-h' || shell === 'help' ? 0 : 2;
|
|
114
|
+
}
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
// "did you mean" (used by the dispatcher's unknown-command path)
|
|
117
|
+
// ---------------------------------------------------------------------------
|
|
118
|
+
/** Bounded Levenshtein distance (small strings only; zero-dep). */
|
|
119
|
+
function editDistance(a, b) {
|
|
120
|
+
const m = a.length;
|
|
121
|
+
const n = b.length;
|
|
122
|
+
if (m === 0)
|
|
123
|
+
return n;
|
|
124
|
+
if (n === 0)
|
|
125
|
+
return m;
|
|
126
|
+
let prev = Array.from({ length: n + 1 }, (_v, j) => j);
|
|
127
|
+
for (let i = 1; i <= m; i++) {
|
|
128
|
+
const cur = [i, ...new Array(n).fill(0)];
|
|
129
|
+
for (let j = 1; j <= n; j++) {
|
|
130
|
+
const cost = a[i - 1] === b[j - 1] ? 0 : 1;
|
|
131
|
+
cur[j] = Math.min((cur[j - 1] ?? 0) + 1, (prev[j] ?? 0) + 1, (prev[j - 1] ?? 0) + cost);
|
|
132
|
+
}
|
|
133
|
+
prev = cur;
|
|
134
|
+
}
|
|
135
|
+
return prev[n] ?? 0;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Closest known command for a typo, or null when nothing is plausibly close
|
|
139
|
+
* (distance must be ≤ 2 and less than half the input length).
|
|
140
|
+
*/
|
|
141
|
+
export function didYouMean(input) {
|
|
142
|
+
let best = null;
|
|
143
|
+
let bestDist = Infinity;
|
|
144
|
+
for (const cmd of TOP_LEVEL_COMMANDS) {
|
|
145
|
+
const d = editDistance(input.toLowerCase(), cmd);
|
|
146
|
+
if (d < bestDist) {
|
|
147
|
+
bestDist = d;
|
|
148
|
+
best = cmd;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if (best !== null && bestDist <= 2 && bestDist < Math.max(2, input.length / 2) + 1) {
|
|
152
|
+
return best;
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=completions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completions.js","sourceRoot":"","sources":["../../src/cli/completions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAE5C,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAAa;IAC1C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;IACzE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ;IACzE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ;IACrE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO;IACjE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS;IACrE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW;IAClE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;CAC3E,CAAC;AAEF,0EAA0E;AAC1E,MAAM,WAAW,GAA6B;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;IAC9B,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;IAClC,GAAG,EAAE,CAAC,MAAM,CAAC;IACb,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC;IACvC,KAAK,EAAE,CAAC,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;IACzB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC;IAC1C,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC7B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC;IAC1C,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;IACpC,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC;IACnC,SAAS,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;IACvC,OAAO,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;IACjC,MAAM,EAAE,CAAC,SAAS,CAAC;IACnB,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC3C,KAAK,EAAE,CAAC,QAAQ,CAAC;IACjB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC;CACvD,CAAC;AAEF,SAAS,SAAS;IAChB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,0BAA0B,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;SACpG,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;;;iBAIQ,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;EAKhE,QAAQ;;;;;;;;CAQT,CAAC;AACF,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;SACzC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,SAAS,GAAG,+BAA+B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC;SAClG,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;;;;;gCAMuB,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC;;;;;EAK1D,QAAQ;;;;;;;;CAQT,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAc;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;IAClF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC;IAC7G,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;IACrG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACjG,CAAC;AAED,8EAA8E;AAC9E,iEAAiE;AACjE,8EAA8E;AAE9E,mEAAmE;AACnE,SAAS,YAAY,CAAC,CAAS,EAAE,CAAS;IACxC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;IACnB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,QAAQ,GAAG,QAAQ,CAAC;IACxB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG,QAAQ,EAAE,CAAC;YACjB,QAAQ,GAAG,CAAC,CAAC;YACb,IAAI,GAAG,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ashlr daemon` — the M24 autonomous operator CLI surface.
|
|
3
|
+
*
|
|
4
|
+
* The daemon pulls the highest-value backlog items for ENROLLED repos and
|
|
5
|
+
* dispatches SANDBOXED swarms whose output becomes PENDING PROPOSALS in the
|
|
6
|
+
* Approval Inbox. It is SAFE BY CONSTRUCTION: it can ONLY propose; it has NO
|
|
7
|
+
* path to apply / push / PR / deploy / mutate.
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* daemon start [--once] [--dry-run] [--budget <usd>] [--interval <ms>]
|
|
11
|
+
* [--parallel <n>]
|
|
12
|
+
* Load cfg, merge flags over cfg.daemon defaults into a DaemonConfig,
|
|
13
|
+
* call runDaemon. --dry-run => plan only (which items WOULD be worked;
|
|
14
|
+
* NO swarm/proposal). REFUSES (nonzero, clear message) when
|
|
15
|
+
* ASHLR_IN_DAEMON / ASHLR_IN_SWARM is set (no fork bomb).
|
|
16
|
+
* daemon stop
|
|
17
|
+
* Set the kill switch + clear running state. Idempotent.
|
|
18
|
+
* daemon status
|
|
19
|
+
* Print running?, last tick, today's spend vs cap, items processed,
|
|
20
|
+
* pending proposals (M23 pendingCount). READ-ONLY.
|
|
21
|
+
*
|
|
22
|
+
* This file has NO outward-action path: it never applies, pushes, opens a PR,
|
|
23
|
+
* or deploys. Its only inbox interaction is the READ-ONLY pendingCount() (for
|
|
24
|
+
* status); all proposal creation happens inside the sandboxed swarm.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* `ashlr daemon [start|stop|status] [flags]`
|
|
28
|
+
*
|
|
29
|
+
* Returns a process exit code (0 = success, non-zero = error/usage).
|
|
30
|
+
*/
|
|
31
|
+
export declare function cmdDaemon(args: string[]): Promise<number>;
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ashlr daemon` — the M24 autonomous operator CLI surface.
|
|
3
|
+
*
|
|
4
|
+
* The daemon pulls the highest-value backlog items for ENROLLED repos and
|
|
5
|
+
* dispatches SANDBOXED swarms whose output becomes PENDING PROPOSALS in the
|
|
6
|
+
* Approval Inbox. It is SAFE BY CONSTRUCTION: it can ONLY propose; it has NO
|
|
7
|
+
* path to apply / push / PR / deploy / mutate.
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* daemon start [--once] [--dry-run] [--budget <usd>] [--interval <ms>]
|
|
11
|
+
* [--parallel <n>]
|
|
12
|
+
* Load cfg, merge flags over cfg.daemon defaults into a DaemonConfig,
|
|
13
|
+
* call runDaemon. --dry-run => plan only (which items WOULD be worked;
|
|
14
|
+
* NO swarm/proposal). REFUSES (nonzero, clear message) when
|
|
15
|
+
* ASHLR_IN_DAEMON / ASHLR_IN_SWARM is set (no fork bomb).
|
|
16
|
+
* daemon stop
|
|
17
|
+
* Set the kill switch + clear running state. Idempotent.
|
|
18
|
+
* daemon status
|
|
19
|
+
* Print running?, last tick, today's spend vs cap, items processed,
|
|
20
|
+
* pending proposals (M23 pendingCount). READ-ONLY.
|
|
21
|
+
*
|
|
22
|
+
* This file has NO outward-action path: it never applies, pushes, opens a PR,
|
|
23
|
+
* or deploys. Its only inbox interaction is the READ-ONLY pendingCount() (for
|
|
24
|
+
* status); all proposal creation happens inside the sandboxed swarm.
|
|
25
|
+
*/
|
|
26
|
+
import { makeColors } from './ui.js';
|
|
27
|
+
async function importLoop() {
|
|
28
|
+
try {
|
|
29
|
+
const mod = (await import('../core/daemon/loop.js'));
|
|
30
|
+
return { runDaemon: mod.runDaemon, stopDaemon: mod.stopDaemon };
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
async function importState() {
|
|
37
|
+
try {
|
|
38
|
+
const mod = (await import('../core/daemon/state.js'));
|
|
39
|
+
return { loadDaemonState: mod.loadDaemonState };
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async function importPendingCount() {
|
|
46
|
+
try {
|
|
47
|
+
const mod = (await import('../core/inbox/store.js'));
|
|
48
|
+
return mod.pendingCount;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async function importConfig() {
|
|
55
|
+
try {
|
|
56
|
+
const mod = (await import('../core/config.js'));
|
|
57
|
+
return mod.loadConfig;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Parse a numeric flag value; returns undefined when missing/invalid. */
|
|
64
|
+
function parseNum(v) {
|
|
65
|
+
if (v === undefined)
|
|
66
|
+
return undefined;
|
|
67
|
+
const n = Number(v);
|
|
68
|
+
return Number.isFinite(n) && n > 0 ? n : undefined;
|
|
69
|
+
}
|
|
70
|
+
function parseStartFlags(args) {
|
|
71
|
+
const flags = { once: false, dryRun: false };
|
|
72
|
+
for (let i = 0; i < args.length; i++) {
|
|
73
|
+
const a = args[i];
|
|
74
|
+
switch (a) {
|
|
75
|
+
case '--once':
|
|
76
|
+
flags.once = true;
|
|
77
|
+
break;
|
|
78
|
+
case '--dry-run':
|
|
79
|
+
flags.dryRun = true;
|
|
80
|
+
break;
|
|
81
|
+
case '--budget': {
|
|
82
|
+
const v = parseNum(args[++i]);
|
|
83
|
+
if (v === undefined)
|
|
84
|
+
return { flags, err: '--budget requires a positive number (USD)' };
|
|
85
|
+
flags.budgetUsd = v;
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case '--interval': {
|
|
89
|
+
const v = parseNum(args[++i]);
|
|
90
|
+
if (v === undefined)
|
|
91
|
+
return { flags, err: '--interval requires a positive number (ms)' };
|
|
92
|
+
flags.intervalMs = v;
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
case '--parallel': {
|
|
96
|
+
const v = parseNum(args[++i]);
|
|
97
|
+
if (v === undefined)
|
|
98
|
+
return { flags, err: '--parallel requires a positive integer' };
|
|
99
|
+
flags.parallel = Math.floor(v);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
default:
|
|
103
|
+
if (a?.startsWith('-'))
|
|
104
|
+
return { flags, err: `Unknown flag: ${a}` };
|
|
105
|
+
// ignore stray positionals
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return { flags };
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Merge CLI flags over cfg.daemon into the config passed to runDaemon.
|
|
113
|
+
* cfg.daemon grants NO authority — it only tunes the caps (budget/interval/
|
|
114
|
+
* parallel). The daemon remains proposal-only by construction regardless.
|
|
115
|
+
*/
|
|
116
|
+
function mergeDaemonConfig(cfg, flags) {
|
|
117
|
+
const existing = cfg.daemon ?? {};
|
|
118
|
+
const merged = { ...existing };
|
|
119
|
+
if (flags.budgetUsd !== undefined)
|
|
120
|
+
merged.dailyBudgetUsd = flags.budgetUsd;
|
|
121
|
+
if (flags.intervalMs !== undefined)
|
|
122
|
+
merged.intervalMs = flags.intervalMs;
|
|
123
|
+
if (flags.parallel !== undefined)
|
|
124
|
+
merged.parallel = flags.parallel;
|
|
125
|
+
return { ...cfg, daemon: merged };
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------------------
|
|
128
|
+
// Display helpers
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
/** Relative age string from an ISO timestamp. */
|
|
131
|
+
function relAge(iso) {
|
|
132
|
+
if (!iso)
|
|
133
|
+
return 'never';
|
|
134
|
+
try {
|
|
135
|
+
const ms = Date.now() - new Date(iso).getTime();
|
|
136
|
+
if (ms < 60_000)
|
|
137
|
+
return 'just now';
|
|
138
|
+
if (ms < 3_600_000)
|
|
139
|
+
return `${Math.floor(ms / 60_000)}m ago`;
|
|
140
|
+
if (ms < 86_400_000)
|
|
141
|
+
return `${Math.floor(ms / 3_600_000)}h ago`;
|
|
142
|
+
return `${Math.floor(ms / 86_400_000)}d ago`;
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
return iso;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// ---------------------------------------------------------------------------
|
|
149
|
+
// Subcommand: start
|
|
150
|
+
// ---------------------------------------------------------------------------
|
|
151
|
+
async function cmdDaemonStart(args) {
|
|
152
|
+
const tty = process.stdout.isTTY === true;
|
|
153
|
+
const col = makeColors(tty);
|
|
154
|
+
// ── Re-entrancy guard (clear, nonzero refusal) ──────────────────────────
|
|
155
|
+
// runDaemon ALSO refuses internally; we surface a friendly message here so
|
|
156
|
+
// the user gets a non-silent explanation and a nonzero exit code.
|
|
157
|
+
if (process.env['ASHLR_IN_DAEMON'] || process.env['ASHLR_IN_SWARM']) {
|
|
158
|
+
const which = process.env['ASHLR_IN_DAEMON'] ? 'ASHLR_IN_DAEMON' : 'ASHLR_IN_SWARM';
|
|
159
|
+
console.error(col.red('error: ') +
|
|
160
|
+
`daemon start refused: ${which} is set — no daemon-inside-daemon / daemon-inside-swarm.`);
|
|
161
|
+
return 1;
|
|
162
|
+
}
|
|
163
|
+
const { flags, err } = parseStartFlags(args);
|
|
164
|
+
if (err) {
|
|
165
|
+
console.error(col.red('error: ') + err);
|
|
166
|
+
console.error(col.dim('Usage: ashlr daemon start [--once] [--dry-run] [--budget <usd>] [--interval <ms>] [--parallel <n>]'));
|
|
167
|
+
return 2;
|
|
168
|
+
}
|
|
169
|
+
const loadConfig = await importConfig();
|
|
170
|
+
if (!loadConfig) {
|
|
171
|
+
console.error(col.red('error: ') + 'daemon requires src/core/config.ts.');
|
|
172
|
+
return 1;
|
|
173
|
+
}
|
|
174
|
+
const loop = await importLoop();
|
|
175
|
+
if (!loop) {
|
|
176
|
+
console.error(col.red('error: ') + 'daemon requires src/core/daemon/loop.ts (M24 module not yet built).');
|
|
177
|
+
return 1;
|
|
178
|
+
}
|
|
179
|
+
let cfg;
|
|
180
|
+
try {
|
|
181
|
+
cfg = loadConfig();
|
|
182
|
+
}
|
|
183
|
+
catch (e) {
|
|
184
|
+
console.error(col.red('error: ') + 'Failed to load config: ' + (e instanceof Error ? e.message : String(e)));
|
|
185
|
+
return 1;
|
|
186
|
+
}
|
|
187
|
+
const merged = mergeDaemonConfig(cfg, flags);
|
|
188
|
+
console.log('');
|
|
189
|
+
console.log(col.bold(' ashlr daemon') +
|
|
190
|
+
col.dim(` — ${flags.dryRun ? 'dry-run plan' : 'operator'}${flags.once ? ' · single tick' : ' · loop'}`));
|
|
191
|
+
if (flags.budgetUsd !== undefined) {
|
|
192
|
+
console.log(col.dim(` daily budget cap: $${flags.budgetUsd}`));
|
|
193
|
+
}
|
|
194
|
+
console.log(col.dim(' proposal-only · sandboxed · enrollment-only'));
|
|
195
|
+
console.log('');
|
|
196
|
+
// runDaemon never throws by contract; it REFUSES on re-entrancy (handled
|
|
197
|
+
// above) and stops on kill switch / budget exhaustion. It ONLY produces
|
|
198
|
+
// PENDING inbox proposals — never applies/pushes/PRs/deploys/mutates.
|
|
199
|
+
const finalState = await loop.runDaemon(merged, { once: flags.once, dryRun: flags.dryRun });
|
|
200
|
+
// Summarize the most-recent tick (if any) for human feedback.
|
|
201
|
+
const lastTick = finalState.ticks[finalState.ticks.length - 1];
|
|
202
|
+
if (lastTick) {
|
|
203
|
+
const reasonColor = lastTick.reason === 'ok'
|
|
204
|
+
? col.green
|
|
205
|
+
: lastTick.reason === 'dry-run'
|
|
206
|
+
? col.cyan
|
|
207
|
+
: col.yellow;
|
|
208
|
+
console.log(' ' +
|
|
209
|
+
col.bold('last tick: ') +
|
|
210
|
+
reasonColor(lastTick.reason) +
|
|
211
|
+
col.dim(` · considered ${lastTick.itemsConsidered} · proposals ${lastTick.proposalsCreated} · $${lastTick.spentUsd.toFixed(4)}`));
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
console.log(' ' + col.dim('no tick recorded.'));
|
|
215
|
+
}
|
|
216
|
+
console.log(' ' + col.dim(`today's spend: $${finalState.todaySpentUsd.toFixed(4)}`));
|
|
217
|
+
console.log(' ' + col.dim('Use `ashlr inbox` to review PENDING proposals (never auto-applied).'));
|
|
218
|
+
console.log('');
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
// Subcommand: stop
|
|
223
|
+
// ---------------------------------------------------------------------------
|
|
224
|
+
async function cmdDaemonStop() {
|
|
225
|
+
const tty = process.stdout.isTTY === true;
|
|
226
|
+
const col = makeColors(tty);
|
|
227
|
+
const loop = await importLoop();
|
|
228
|
+
if (!loop) {
|
|
229
|
+
console.error(col.red('error: ') + 'daemon requires src/core/daemon/loop.ts (M24 module not yet built).');
|
|
230
|
+
return 1;
|
|
231
|
+
}
|
|
232
|
+
loop.stopDaemon();
|
|
233
|
+
console.log('');
|
|
234
|
+
console.log(col.green(' ✓ daemon stopped') + col.dim(' — kill switch set; running state cleared.'));
|
|
235
|
+
console.log(col.dim(' Any running loop halts on its next tick.'));
|
|
236
|
+
console.log(col.dim(' Re-enable with `ashlr sandbox kill --off` before starting again.'));
|
|
237
|
+
console.log('');
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
// Subcommand: status (READ-ONLY)
|
|
242
|
+
// ---------------------------------------------------------------------------
|
|
243
|
+
async function cmdDaemonStatus(jsonMode) {
|
|
244
|
+
const tty = process.stdout.isTTY === true;
|
|
245
|
+
const col = makeColors(tty);
|
|
246
|
+
const stateMod = await importState();
|
|
247
|
+
if (!stateMod) {
|
|
248
|
+
console.error(col.red('error: ') + 'daemon requires src/core/daemon/state.ts (M24 module not yet built).');
|
|
249
|
+
return 1;
|
|
250
|
+
}
|
|
251
|
+
const state = stateMod.loadDaemonState();
|
|
252
|
+
// pendingCount is READ-ONLY; degrade to 0 if the inbox store is absent.
|
|
253
|
+
const pendingCount = await importPendingCount();
|
|
254
|
+
let pending = 0;
|
|
255
|
+
try {
|
|
256
|
+
if (pendingCount)
|
|
257
|
+
pending = pendingCount();
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
pending = 0;
|
|
261
|
+
}
|
|
262
|
+
// Resolve the configured daily cap for display (best-effort).
|
|
263
|
+
let dailyCap;
|
|
264
|
+
const loadConfig = await importConfig();
|
|
265
|
+
if (loadConfig) {
|
|
266
|
+
try {
|
|
267
|
+
dailyCap = loadConfig().daemon?.dailyBudgetUsd;
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
dailyCap = undefined;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (jsonMode) {
|
|
274
|
+
console.log(JSON.stringify({
|
|
275
|
+
running: state.running,
|
|
276
|
+
pid: state.pid,
|
|
277
|
+
startedAt: state.startedAt,
|
|
278
|
+
lastTickAt: state.lastTickAt,
|
|
279
|
+
todayDate: state.todayDate,
|
|
280
|
+
todaySpentUsd: state.todaySpentUsd,
|
|
281
|
+
dailyBudgetUsd: dailyCap ?? null,
|
|
282
|
+
itemsProcessed: state.itemsProcessed,
|
|
283
|
+
pendingProposals: pending,
|
|
284
|
+
}, null, 2));
|
|
285
|
+
return 0;
|
|
286
|
+
}
|
|
287
|
+
console.log('');
|
|
288
|
+
console.log(col.bold(' ashlr daemon status'));
|
|
289
|
+
console.log('');
|
|
290
|
+
console.log(' ' +
|
|
291
|
+
col.bold('running: ') +
|
|
292
|
+
(state.running ? col.green('yes') + col.dim(` (pid ${state.pid ?? '?'})`) : col.dim('no (idle)')));
|
|
293
|
+
console.log(' ' + col.bold('started: ') + col.dim(relAge(state.startedAt)));
|
|
294
|
+
console.log(' ' + col.bold('last tick: ') + col.dim(relAge(state.lastTickAt)));
|
|
295
|
+
const capStr = dailyCap !== undefined ? ` / $${dailyCap}` : '';
|
|
296
|
+
console.log(' ' + col.bold("today's spend: ") + col.dim(`$${state.todaySpentUsd.toFixed(4)}${capStr}`));
|
|
297
|
+
console.log(' ' + col.bold('items processed:') + ' ' + col.dim(String(state.itemsProcessed)));
|
|
298
|
+
console.log(' ' +
|
|
299
|
+
col.bold('pending props: ') +
|
|
300
|
+
(pending > 0 ? col.yellow(String(pending)) : col.dim('0')));
|
|
301
|
+
console.log('');
|
|
302
|
+
if (pending > 0) {
|
|
303
|
+
console.log(col.dim(' Review with `ashlr inbox` — proposals are NEVER auto-applied.'));
|
|
304
|
+
console.log('');
|
|
305
|
+
}
|
|
306
|
+
return 0;
|
|
307
|
+
}
|
|
308
|
+
// ---------------------------------------------------------------------------
|
|
309
|
+
// Public entry point
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
/**
|
|
312
|
+
* `ashlr daemon [start|stop|status] [flags]`
|
|
313
|
+
*
|
|
314
|
+
* Returns a process exit code (0 = success, non-zero = error/usage).
|
|
315
|
+
*/
|
|
316
|
+
export async function cmdDaemon(args) {
|
|
317
|
+
const tty = process.stdout.isTTY === true;
|
|
318
|
+
const col = makeColors(tty);
|
|
319
|
+
const sub = args[0] ?? 'status';
|
|
320
|
+
const rest = args.slice(1);
|
|
321
|
+
switch (sub) {
|
|
322
|
+
case 'start':
|
|
323
|
+
return cmdDaemonStart(rest);
|
|
324
|
+
case 'stop':
|
|
325
|
+
return cmdDaemonStop();
|
|
326
|
+
case 'status':
|
|
327
|
+
return cmdDaemonStatus(rest.includes('--json'));
|
|
328
|
+
default:
|
|
329
|
+
console.error(col.red('error: ') + `Unknown daemon subcommand: ${sub}`);
|
|
330
|
+
console.error(col.dim('Usage: ashlr daemon [start|stop|status] [--once] [--dry-run] [--budget <usd>] [--interval <ms>] [--parallel <n>] [--json]'));
|
|
331
|
+
return 2;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/cli/demo-sandbox.ts — H8 shared isolation module for `ashlr demo`.
|
|
3
|
+
*
|
|
4
|
+
* MILESTONE H8 "Harden & Prove" (FINAL). This module factors the
|
|
5
|
+
* DISPOSABLE-repo + ISOLATED-tmp-`~/.ashlr` setup/teardown out of `demo.ts`
|
|
6
|
+
* (and away from `test/`) so the demo applies the EXACT same isolation discipline
|
|
7
|
+
* the H1 testkit encodes (`test/helpers/h1-fixture.ts:makeFixture`) — but as a
|
|
8
|
+
* shippable CLI helper rather than a test-only one. See
|
|
9
|
+
* docs/contracts/CONTRACT-H8.md (BUILD ITEM 1).
|
|
10
|
+
*
|
|
11
|
+
* ───────────────────────────────────────────────────────────────────────────
|
|
12
|
+
* ABSOLUTE SAFETY RULES (paramount — encoded directly in these helpers):
|
|
13
|
+
* - HOME is relocated to a FRESH os.tmpdir() dir so every state read/write
|
|
14
|
+
* resolves to an ISOLATED ~/.ashlr — NEVER the real one. The real portfolio
|
|
15
|
+
* (~/.ashlr/enrollment.json = { repos: [] }) is NEVER touched. The prior
|
|
16
|
+
* HOME + re-entrancy env (ASHLR_IN_DAEMON / ASHLR_IN_SWARM) are snapshotted
|
|
17
|
+
* and RESTORED on dispose().
|
|
18
|
+
* - A sanity guard asserts homedir() resolves to the tmp HOME before the demo
|
|
19
|
+
* proceeds; if relocation did not take effect it RESTORES + ABORTS rather
|
|
20
|
+
* than risk mutating the real ~/.ashlr (mirrors makeFixture's guard).
|
|
21
|
+
* - The throwaway repo is a real git repo under os.tmpdir(), seeded with a
|
|
22
|
+
* `// TODO:` marker so the backlog scan finds work. dispose() unenrolls it,
|
|
23
|
+
* sweeps its sandboxes, rm -rf's the repo + the tmp HOME, and restores env.
|
|
24
|
+
* - dispose() is IDEMPOTENT and NEVER throws (best-effort teardown), so the
|
|
25
|
+
* demo's try/finally + signal handler can always clean up safely.
|
|
26
|
+
*
|
|
27
|
+
* IMPLEMENTATION NOTE: this module encodes the SAME disposable-repo + TODO-seed
|
|
28
|
+
* isolation discipline the H1 testkit (`test/helpers/h1-fixture.ts`) uses, but
|
|
29
|
+
* SELF-CONTAINED in `src/` — a shipped CLI module cannot import from `test/`
|
|
30
|
+
* (the build's `rootDir` is `src/`). The handful of git/seed primitives are tiny
|
|
31
|
+
* and use node builtins + git only, so duplicating them here (rather than
|
|
32
|
+
* importing a test helper) is the correct seam per docs/contracts/CONTRACT-H8.md ("factors them
|
|
33
|
+
* out of `test/` into a shippable module"). No new runtime dep is added.
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* A live, ISOLATED demo context: a fresh tmp HOME (so `~/.ashlr` is isolated)
|
|
37
|
+
* plus a single DISPOSABLE git repo seeded with a TODO so the backlog finds
|
|
38
|
+
* work. Obtain via {@link makeDemoContext}; always tear down via
|
|
39
|
+
* {@link DemoContext.dispose} (idempotent, never throws).
|
|
40
|
+
*/
|
|
41
|
+
export interface DemoContext {
|
|
42
|
+
/** Absolute path of the isolated tmp HOME (process.env.HOME for the demo). */
|
|
43
|
+
readonly home: string;
|
|
44
|
+
/** Absolute path of the isolated ~/.ashlr under the tmp HOME. */
|
|
45
|
+
readonly ashlrDir: string;
|
|
46
|
+
/** Absolute path of the DISPOSABLE git repo (under os.tmpdir()). */
|
|
47
|
+
readonly repoDir: string;
|
|
48
|
+
/**
|
|
49
|
+
* Tear down: unenroll the tmp repo, sweep its sandboxes, restore HOME + the
|
|
50
|
+
* re-entrancy env, and (unless {@link MakeDemoContextOptions.keep}) rm -rf the
|
|
51
|
+
* tmp repo + tmp HOME. Idempotent; never throws. When `keep` is set, the tmp
|
|
52
|
+
* dir is preserved (still under os.tmpdir()) for inspection.
|
|
53
|
+
*/
|
|
54
|
+
dispose(): void;
|
|
55
|
+
}
|
|
56
|
+
/** Options for {@link makeDemoContext}. */
|
|
57
|
+
export interface MakeDemoContextOptions {
|
|
58
|
+
/**
|
|
59
|
+
* When true (`ashlr demo --no-cleanup`), dispose() still unenrolls + restores
|
|
60
|
+
* env but does NOT rm -rf the tmp dir — it is kept (still under os.tmpdir())
|
|
61
|
+
* for inspection. Default false (auto-clean).
|
|
62
|
+
*/
|
|
63
|
+
keep?: boolean;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create an ISOLATED demo context: snapshot + relocate `process.env.HOME` to a
|
|
67
|
+
* fresh os.tmpdir() dir, clear the re-entrancy env, ASSERT homedir() now
|
|
68
|
+
* resolves to the tmp HOME (else restore + throw), then create a DISPOSABLE git
|
|
69
|
+
* repo seeded with a `// TODO:` marker.
|
|
70
|
+
*
|
|
71
|
+
* The returned context's `dispose()` performs the guaranteed auto-cleanup. The
|
|
72
|
+
* caller MUST invoke it in a `try/finally` (and from a SIGINT/SIGTERM handler)
|
|
73
|
+
* so the tmp state is always reclaimed.
|
|
74
|
+
*
|
|
75
|
+
* @throws if HOME relocation does not take effect (isolation broken) — fails
|
|
76
|
+
* loudly rather than risk touching the real ~/.ashlr.
|
|
77
|
+
*/
|
|
78
|
+
export declare function makeDemoContext(opts?: MakeDemoContextOptions): DemoContext;
|