@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,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ashlr notify` — notification webhook subcommand.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* ashlr notify test [--json]
|
|
6
|
+
*
|
|
7
|
+
* Sends a test ping to configured webhook(s) (cfg.notify.slackWebhook /
|
|
8
|
+
* cfg.notify.discordWebhook). Informative no-op (exit 0) when none configured —
|
|
9
|
+
* explains how to set one up. Never posts without a configured webhook.
|
|
10
|
+
*
|
|
11
|
+
* Exit codes:
|
|
12
|
+
* 0 test ping sent (or no webhook configured — informative)
|
|
13
|
+
* 1 test ping failed
|
|
14
|
+
* 2 bad usage
|
|
15
|
+
*/
|
|
16
|
+
import { makeColors, isTty } from './ui.js';
|
|
17
|
+
import { loadConfig } from '../core/config.js';
|
|
18
|
+
const { bold, dim, red, green, yellow, cyan } = makeColors(isTty());
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Lazy import — integrations built by another agent; degrade gracefully
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
async function importNotify() {
|
|
23
|
+
return import('../core/integrations/notify.js');
|
|
24
|
+
}
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Help
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
function printNotifyHelp() {
|
|
29
|
+
console.log('');
|
|
30
|
+
console.log(bold(' ashlr notify') + dim(' — notification webhook (opt-in)'));
|
|
31
|
+
console.log('');
|
|
32
|
+
console.log(' ' + bold('Subcommands:'));
|
|
33
|
+
console.log('');
|
|
34
|
+
console.log(` ${cyan('test [--json]')} Send a test ping to configured webhook(s).`);
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(' ' + bold('How to configure:'));
|
|
37
|
+
console.log('');
|
|
38
|
+
console.log(` Add ${bold('notify')} to your ${dim('~/.ashlr/config.json')}:`);
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(` ${dim('"notify": {')}`);
|
|
41
|
+
console.log(` ${dim(' "slackWebhook": "https://hooks.slack.com/services/..."')}`);
|
|
42
|
+
console.log(` ${dim(' "discordWebhook": "https://discord.com/api/webhooks/..."')}`);
|
|
43
|
+
console.log(` ${dim('}')}`);
|
|
44
|
+
console.log('');
|
|
45
|
+
console.log(' ' + bold('Notes:'));
|
|
46
|
+
console.log('');
|
|
47
|
+
console.log(` ${dim('• No-op (safe, informative exit 0) when no webhook is configured.')}`);
|
|
48
|
+
console.log(` ${dim('• Posts concise summaries only — no secrets, no raw tokens.')}`);
|
|
49
|
+
console.log(` ${dim('• Automatic posting only happens when a run/swarm completes and')}`);
|
|
50
|
+
console.log(` ${dim(' notify is called explicitly from that flow — never from reads.')}`);
|
|
51
|
+
console.log('');
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Subcommand: notify test
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
async function cmdNotifyTest(args) {
|
|
57
|
+
const jsonMode = args.includes('--json');
|
|
58
|
+
// Load config — degrade gracefully if unavailable
|
|
59
|
+
let cfg;
|
|
60
|
+
try {
|
|
61
|
+
cfg = loadConfig();
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
65
|
+
if (jsonMode) {
|
|
66
|
+
process.stdout.write(JSON.stringify({ sent: false, detail: `config load failed: ${msg}` }, null, 2) + '\n');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
process.stderr.write(red('error: ') + `Could not load config: ${msg}\n`);
|
|
70
|
+
}
|
|
71
|
+
return 1;
|
|
72
|
+
}
|
|
73
|
+
// M32: opt-in desktop ping (macOS) — fired alongside the webhook test.
|
|
74
|
+
let desktopSent = false;
|
|
75
|
+
try {
|
|
76
|
+
const { desktopNotify, desktopNotifyEnabled } = await import('../core/integrations/desktop-notify.js');
|
|
77
|
+
if (desktopNotifyEnabled(cfg)) {
|
|
78
|
+
desktopSent = await desktopNotify('ashlr', 'notify test — desktop notifications are working', cfg);
|
|
79
|
+
if (!jsonMode && desktopSent) {
|
|
80
|
+
process.stdout.write('desktop notification sent ✓\n');
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
catch { /* desktop ping is best-effort */ }
|
|
85
|
+
// No webhook configured → informative no-op
|
|
86
|
+
const hasSlack = Boolean(cfg.notify?.slackWebhook);
|
|
87
|
+
const hasDiscord = Boolean(cfg.notify?.discordWebhook);
|
|
88
|
+
if (!hasSlack && !hasDiscord) {
|
|
89
|
+
if (jsonMode) {
|
|
90
|
+
process.stdout.write(JSON.stringify({
|
|
91
|
+
sent: false,
|
|
92
|
+
configured: false,
|
|
93
|
+
detail: 'no webhook configured',
|
|
94
|
+
hint: 'Add notify.slackWebhook or notify.discordWebhook to ~/.ashlr/config.json',
|
|
95
|
+
}, null, 2) + '\n');
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
console.log('');
|
|
99
|
+
console.log(yellow(' No notification webhook configured.'));
|
|
100
|
+
console.log('');
|
|
101
|
+
console.log(' To enable notifications, add to ' + dim('~/.ashlr/config.json') + ':');
|
|
102
|
+
console.log('');
|
|
103
|
+
console.log(` ${dim('"notify": {')}`);
|
|
104
|
+
console.log(` ${dim(' "slackWebhook": "https://hooks.slack.com/services/..."')}`);
|
|
105
|
+
console.log(` ${dim(' "discordWebhook": "https://discord.com/api/webhooks/..."')}`);
|
|
106
|
+
console.log(` ${dim('}')}`);
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log(dim(' Run `ashlr notify test` again once a webhook is configured.'));
|
|
109
|
+
console.log('');
|
|
110
|
+
}
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
// Load the notify module
|
|
114
|
+
let mod;
|
|
115
|
+
try {
|
|
116
|
+
mod = await importNotify();
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
if (jsonMode) {
|
|
120
|
+
process.stdout.write(JSON.stringify({ sent: false, detail: 'notify module not yet available' }, null, 2) + '\n');
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
process.stderr.write(red('error: ') + 'Notify integration module not yet available.\n');
|
|
124
|
+
}
|
|
125
|
+
return 1;
|
|
126
|
+
}
|
|
127
|
+
const targets = [];
|
|
128
|
+
if (hasSlack)
|
|
129
|
+
targets.push('Slack');
|
|
130
|
+
if (hasDiscord)
|
|
131
|
+
targets.push('Discord');
|
|
132
|
+
if (!jsonMode) {
|
|
133
|
+
console.log('');
|
|
134
|
+
console.log(bold(' ashlr notify test'));
|
|
135
|
+
console.log('');
|
|
136
|
+
console.log(` Sending test ping to: ${targets.map(t => cyan(t)).join(', ')}`);
|
|
137
|
+
console.log('');
|
|
138
|
+
}
|
|
139
|
+
const text = `ashlr notify test — connection check from ashlr-hub (${new Date().toISOString()})`;
|
|
140
|
+
let ok;
|
|
141
|
+
try {
|
|
142
|
+
ok = await mod.notify(text, cfg);
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
146
|
+
if (jsonMode) {
|
|
147
|
+
process.stdout.write(JSON.stringify({ sent: false, detail: msg }, null, 2) + '\n');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
console.log(red(` ✗ Failed: ${msg}`));
|
|
151
|
+
console.log('');
|
|
152
|
+
}
|
|
153
|
+
return 1;
|
|
154
|
+
}
|
|
155
|
+
if (jsonMode) {
|
|
156
|
+
process.stdout.write(JSON.stringify({ sent: ok, targets, detail: ok ? 'ping sent' : 'post failed' }, null, 2) + '\n');
|
|
157
|
+
return ok ? 0 : 1;
|
|
158
|
+
}
|
|
159
|
+
if (ok) {
|
|
160
|
+
console.log(green(` ✓ Test ping sent to: ${targets.join(', ')}`));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
console.log(red(' ✗ Failed to send test ping — check webhook URL and network.'));
|
|
164
|
+
}
|
|
165
|
+
console.log('');
|
|
166
|
+
return ok ? 0 : 1;
|
|
167
|
+
}
|
|
168
|
+
// ---------------------------------------------------------------------------
|
|
169
|
+
// cmdNotify — main entry point
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
/**
|
|
172
|
+
* `ashlr notify test` — send a test ping to configured webhook(s).
|
|
173
|
+
* Informative no-op when no webhook is configured. Returns a process exit code.
|
|
174
|
+
*/
|
|
175
|
+
export async function cmdNotify(args) {
|
|
176
|
+
const sub = args[0];
|
|
177
|
+
if (!sub || sub === '--help' || sub === '-h' || sub === 'help') {
|
|
178
|
+
printNotifyHelp();
|
|
179
|
+
return 0;
|
|
180
|
+
}
|
|
181
|
+
if (sub === 'test') {
|
|
182
|
+
return cmdNotifyTest(args.slice(1));
|
|
183
|
+
}
|
|
184
|
+
process.stderr.write(red('error: ') + `unknown notify subcommand: ${bold(sub)}\n`);
|
|
185
|
+
process.stderr.write(dim('Run `ashlr notify help` for usage.\n'));
|
|
186
|
+
return 2;
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=notify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify.js","sourceRoot":"","sources":["../../src/cli/notify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI handler for `ashlr onboard` — a TTY-aware GUIDED first-activation
|
|
3
|
+
* walkthrough + one-command rollback. See docs/contracts/CONTRACT-H7.md
|
|
4
|
+
* (BUILD ITEM 3, 4, 5).
|
|
5
|
+
*
|
|
6
|
+
* H7 ABSOLUTE RULES (proven by test/h7.onboard.test.ts + test/h7.rollback.test.ts):
|
|
7
|
+
* - ONBOARD-NEVER-AUTO-APPLIES: onboard chains ONLY the pre-existing human
|
|
8
|
+
* gates — preflight (read-only) → enroll ONE repo (the explicit enrollment
|
|
9
|
+
* gate, H6-audited) → daemon --dry-run --once (read-only, creates NO proposal)
|
|
10
|
+
* → print a human-readable PLAN → point the user at `ashlr inbox` (review
|
|
11
|
+
* only). It NEVER applies/approves a proposal, NEVER pushes/PRs/deploys, and
|
|
12
|
+
* NEVER runs a live (non-dry) daemon. It imports NO outward primitive.
|
|
13
|
+
* - ROLLBACK-INWARD-ONLY: `--rollback <repo>` only narrows state — unenroll +
|
|
14
|
+
* sweepRepoSandboxes (scoped to the repo; a LIVE owner is never reclaimed) +
|
|
15
|
+
* (opt-in --kill) setKill(true). The full trail is audited by the H6 audit()
|
|
16
|
+
* inside policy.ts.
|
|
17
|
+
* - Non-interactive (--yes OR non-TTY): prints the numbered steps as guidance
|
|
18
|
+
* WITHOUT prompting and WITHOUT enrolling (mirrors cmdInit yesMode).
|
|
19
|
+
* - No new runtime deps; node builtins + existing modules only.
|
|
20
|
+
*
|
|
21
|
+
* Wiring: BUILD/INTEGRATION adds `case 'onboard'` + a `loadOnboardCmd` lazy
|
|
22
|
+
* loader in src/cli/index.ts + a cmdHelp entry (+ optional `unenroll` alias).
|
|
23
|
+
*/
|
|
24
|
+
import type { AshlrConfig } from '../core/types.js';
|
|
25
|
+
/** Interactive readline confirm (y/N). Resolves false when stdin is not a TTY. */
|
|
26
|
+
export declare function promptConfirm(question: string): Promise<boolean>;
|
|
27
|
+
/**
|
|
28
|
+
* Test seam: cmdOnboard calls the confirm prompt THROUGH this indirection object
|
|
29
|
+
* so a unit test can override `confirm` without a live TTY (a direct
|
|
30
|
+
* module-internal call to the exported `promptConfirm` cannot be spied across
|
|
31
|
+
* the ESM boundary). Production always uses the real `promptConfirm`.
|
|
32
|
+
*/
|
|
33
|
+
export declare const _internals: {
|
|
34
|
+
confirm: (question: string) => Promise<boolean>;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Render a HUMAN-READABLE dry-run PLAN (BUILD ITEM 5). Re-derives the same
|
|
38
|
+
* would-run selection the dry-run uses (listEnrolled → buildBacklog → top-K) and
|
|
39
|
+
* runs tick(cfg,{dryRun:true}) for the authoritative count. Creates NO proposal,
|
|
40
|
+
* spends $0, takes NO outward action.
|
|
41
|
+
*
|
|
42
|
+
* WRITE NOTE (not strictly side-effect-free): the authoritative
|
|
43
|
+
* tick(cfg,{dryRun:true}) persists the daemon RUN-STATE via saveDaemonState
|
|
44
|
+
* before returning (loop.ts dry-run branch). That write is the pre-existing,
|
|
45
|
+
* H6-audited dry-run behavior — it persists the H5-self-healed run-state flag
|
|
46
|
+
* (it NEVER sets running:true and NEVER creates a proposal), is bounded to the
|
|
47
|
+
* (isolated-in-tests) ~/.ashlr/daemon.json, and is never an outward action.
|
|
48
|
+
* Everything else here (listEnrolled / loadBacklog / buildBacklog) is a pure
|
|
49
|
+
* read.
|
|
50
|
+
*
|
|
51
|
+
* Sequence:
|
|
52
|
+
* 1. enrolled = listEnrolled() (read)
|
|
53
|
+
* 2. tick(cfg,{dryRun:true}) — authoritative itemsConsidered (NO proposal, $0;
|
|
54
|
+
* persists daemon run-state only — never an outward action)
|
|
55
|
+
* 3. loadBacklog()/buildBacklog({repos:enrolled}) — the SAME scan the tick
|
|
56
|
+
* used, for titles (read)
|
|
57
|
+
* 4. format `N item(s) across M repo(s)` + a bulleted list of the top-K titles,
|
|
58
|
+
* explicitly labelled a PLAN that creates NO proposals.
|
|
59
|
+
*
|
|
60
|
+
* Never throws — degrades to a legible "0 item(s)" plan on any read error.
|
|
61
|
+
*/
|
|
62
|
+
export declare function renderDryRunPlan(cfg: AshlrConfig): Promise<string>;
|
|
63
|
+
/**
|
|
64
|
+
* ROLLBACK (BUILD ITEM 4) — INWARD CLEANUP ONLY. In order:
|
|
65
|
+
* 1. unenroll(repo) (H6-audited enroll:remove)
|
|
66
|
+
* 2. sweepRepoSandboxes(repo) (SCOPED to this repo; a LIVE owner is
|
|
67
|
+
* NEVER reclaimed; the age guard is
|
|
68
|
+
* dropped so a fresh crash-leftover from
|
|
69
|
+
* the very activation being undone IS
|
|
70
|
+
* reclaimed — true one-command undo)
|
|
71
|
+
* 3. opts.kill ⇒ setKill(true) (opt-in; H6-audited kill:on)
|
|
72
|
+
* Returns 0. NEVER widens access; NEVER an outward action.
|
|
73
|
+
*/
|
|
74
|
+
export declare function rollback(repo: string, opts: {
|
|
75
|
+
kill: boolean;
|
|
76
|
+
}): Promise<number>;
|
|
77
|
+
/**
|
|
78
|
+
* `ashlr onboard` — guided first-activation walkthrough.
|
|
79
|
+
* - `--rollback <repo> [--kill]` routes to rollback().
|
|
80
|
+
* - else: preflight → (TTY) confirm + enroll ONE repo → dry-run PLAN →
|
|
81
|
+
* point at `ashlr inbox` → offer rollback.
|
|
82
|
+
* - `--yes` OR non-TTY: print the numbered steps WITHOUT prompting/enrolling.
|
|
83
|
+
* Returns 0 on success, non-zero when preflight blocks.
|
|
84
|
+
*/
|
|
85
|
+
export declare function cmdOnboard(args: string[]): Promise<number>;
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI handler for `ashlr onboard` — a TTY-aware GUIDED first-activation
|
|
3
|
+
* walkthrough + one-command rollback. See docs/contracts/CONTRACT-H7.md
|
|
4
|
+
* (BUILD ITEM 3, 4, 5).
|
|
5
|
+
*
|
|
6
|
+
* H7 ABSOLUTE RULES (proven by test/h7.onboard.test.ts + test/h7.rollback.test.ts):
|
|
7
|
+
* - ONBOARD-NEVER-AUTO-APPLIES: onboard chains ONLY the pre-existing human
|
|
8
|
+
* gates — preflight (read-only) → enroll ONE repo (the explicit enrollment
|
|
9
|
+
* gate, H6-audited) → daemon --dry-run --once (read-only, creates NO proposal)
|
|
10
|
+
* → print a human-readable PLAN → point the user at `ashlr inbox` (review
|
|
11
|
+
* only). It NEVER applies/approves a proposal, NEVER pushes/PRs/deploys, and
|
|
12
|
+
* NEVER runs a live (non-dry) daemon. It imports NO outward primitive.
|
|
13
|
+
* - ROLLBACK-INWARD-ONLY: `--rollback <repo>` only narrows state — unenroll +
|
|
14
|
+
* sweepRepoSandboxes (scoped to the repo; a LIVE owner is never reclaimed) +
|
|
15
|
+
* (opt-in --kill) setKill(true). The full trail is audited by the H6 audit()
|
|
16
|
+
* inside policy.ts.
|
|
17
|
+
* - Non-interactive (--yes OR non-TTY): prints the numbered steps as guidance
|
|
18
|
+
* WITHOUT prompting and WITHOUT enrolling (mirrors cmdInit yesMode).
|
|
19
|
+
* - No new runtime deps; node builtins + existing modules only.
|
|
20
|
+
*
|
|
21
|
+
* Wiring: BUILD/INTEGRATION adds `case 'onboard'` + a `loadOnboardCmd` lazy
|
|
22
|
+
* loader in src/cli/index.ts + a cmdHelp entry (+ optional `unenroll` alias).
|
|
23
|
+
*/
|
|
24
|
+
import { resolve } from 'node:path';
|
|
25
|
+
import { loadConfig } from '../core/config.js';
|
|
26
|
+
import { buildReadiness } from '../core/readiness.js';
|
|
27
|
+
import { enroll, unenroll, setKill, listEnrolled } from '../core/sandbox/policy.js';
|
|
28
|
+
import { tick } from '../core/daemon/loop.js';
|
|
29
|
+
import { loadBacklog, buildBacklog } from '../core/portfolio/backlog.js';
|
|
30
|
+
import { sweepRepoSandboxes } from '../core/sandbox/worktree.js';
|
|
31
|
+
import { makeColors, isTty } from './ui.js';
|
|
32
|
+
const { bold, dim, red, green, yellow, cyan } = makeColors(isTty());
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Prompt — readline y/N confirm. Exported so tests can spy/mock it without
|
|
35
|
+
// touching a live TTY. Resolves false when stdin is not a TTY (so a non-TTY
|
|
36
|
+
// run NEVER enrolls; the caller's yesMode short-circuits before this anyway).
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
/** Interactive readline confirm (y/N). Resolves false when stdin is not a TTY. */
|
|
39
|
+
export async function promptConfirm(question) {
|
|
40
|
+
if (!process.stdin.isTTY)
|
|
41
|
+
return false;
|
|
42
|
+
const readline = await import('node:readline');
|
|
43
|
+
return new Promise((resolveP) => {
|
|
44
|
+
const rl = readline.createInterface({
|
|
45
|
+
input: process.stdin,
|
|
46
|
+
output: process.stdout,
|
|
47
|
+
});
|
|
48
|
+
rl.question(question + ' [y/N] ', (answer) => {
|
|
49
|
+
rl.close();
|
|
50
|
+
resolveP(answer.trim().toLowerCase() === 'y');
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Test seam: cmdOnboard calls the confirm prompt THROUGH this indirection object
|
|
56
|
+
* so a unit test can override `confirm` without a live TTY (a direct
|
|
57
|
+
* module-internal call to the exported `promptConfirm` cannot be spied across
|
|
58
|
+
* the ESM boundary). Production always uses the real `promptConfirm`.
|
|
59
|
+
*/
|
|
60
|
+
export const _internals = {
|
|
61
|
+
confirm: promptConfirm,
|
|
62
|
+
};
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
// renderDryRunPlan (BUILD ITEM 5) — human-readable, dry-run (NO outward action)
|
|
65
|
+
// ---------------------------------------------------------------------------
|
|
66
|
+
/**
|
|
67
|
+
* Render a HUMAN-READABLE dry-run PLAN (BUILD ITEM 5). Re-derives the same
|
|
68
|
+
* would-run selection the dry-run uses (listEnrolled → buildBacklog → top-K) and
|
|
69
|
+
* runs tick(cfg,{dryRun:true}) for the authoritative count. Creates NO proposal,
|
|
70
|
+
* spends $0, takes NO outward action.
|
|
71
|
+
*
|
|
72
|
+
* WRITE NOTE (not strictly side-effect-free): the authoritative
|
|
73
|
+
* tick(cfg,{dryRun:true}) persists the daemon RUN-STATE via saveDaemonState
|
|
74
|
+
* before returning (loop.ts dry-run branch). That write is the pre-existing,
|
|
75
|
+
* H6-audited dry-run behavior — it persists the H5-self-healed run-state flag
|
|
76
|
+
* (it NEVER sets running:true and NEVER creates a proposal), is bounded to the
|
|
77
|
+
* (isolated-in-tests) ~/.ashlr/daemon.json, and is never an outward action.
|
|
78
|
+
* Everything else here (listEnrolled / loadBacklog / buildBacklog) is a pure
|
|
79
|
+
* read.
|
|
80
|
+
*
|
|
81
|
+
* Sequence:
|
|
82
|
+
* 1. enrolled = listEnrolled() (read)
|
|
83
|
+
* 2. tick(cfg,{dryRun:true}) — authoritative itemsConsidered (NO proposal, $0;
|
|
84
|
+
* persists daemon run-state only — never an outward action)
|
|
85
|
+
* 3. loadBacklog()/buildBacklog({repos:enrolled}) — the SAME scan the tick
|
|
86
|
+
* used, for titles (read)
|
|
87
|
+
* 4. format `N item(s) across M repo(s)` + a bulleted list of the top-K titles,
|
|
88
|
+
* explicitly labelled a PLAN that creates NO proposals.
|
|
89
|
+
*
|
|
90
|
+
* Never throws — degrades to a legible "0 item(s)" plan on any read error.
|
|
91
|
+
*/
|
|
92
|
+
export async function renderDryRunPlan(cfg) {
|
|
93
|
+
const enrolled = listEnrolled();
|
|
94
|
+
// (2) Authoritative count from the existing read-only dry-run path. The
|
|
95
|
+
// dry-run branch of tick() returns proposalsCreated:0, spentUsd:0,
|
|
96
|
+
// reason:'dry-run' — it creates NO proposal and spends nothing.
|
|
97
|
+
let itemsConsidered = 0;
|
|
98
|
+
try {
|
|
99
|
+
const t = await tick(cfg, { dryRun: true });
|
|
100
|
+
itemsConsidered = t.itemsConsidered;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
itemsConsidered = 0;
|
|
104
|
+
}
|
|
105
|
+
// (3) The matching titles. Prefer the PERSISTED backlog (loadBacklog reads
|
|
106
|
+
// ~/.ashlr/backlog.json — the same scored, top-score-first set the daemon last
|
|
107
|
+
// computed; pure read, never throws). If none is persisted yet, fall back to a
|
|
108
|
+
// fresh read-only buildBacklog scan over the enrolled repos. Both are
|
|
109
|
+
// read-only and create no proposal.
|
|
110
|
+
let items = [];
|
|
111
|
+
try {
|
|
112
|
+
const persisted = loadBacklog();
|
|
113
|
+
if (persisted && persisted.items.length > 0) {
|
|
114
|
+
items = persisted.items;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const backlog = await buildBacklog({ repos: enrolled });
|
|
118
|
+
items = backlog.items;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
items = [];
|
|
123
|
+
}
|
|
124
|
+
// Present exactly the top-`itemsConsidered` titles the dry-run would work.
|
|
125
|
+
const planned = items.slice(0, itemsConsidered);
|
|
126
|
+
const repoCount = new Set(planned.map((i) => i.repo)).size;
|
|
127
|
+
const lines = [];
|
|
128
|
+
lines.push(bold(' Dry-run plan') + dim(' (preview only — creates NO proposals, spends $0)'));
|
|
129
|
+
lines.push('');
|
|
130
|
+
if (planned.length === 0) {
|
|
131
|
+
lines.push(` ${dim('0 item(s) would run')}` +
|
|
132
|
+
`${enrolled.length === 0 ? dim(' — no repo enrolled yet') : dim(' — backlog is empty for enrolled repo(s)')}`);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
lines.push(` ${green(String(planned.length))} item(s) would run across ` +
|
|
136
|
+
`${green(String(repoCount))} repo(s):`);
|
|
137
|
+
for (const it of planned) {
|
|
138
|
+
lines.push(` ${cyan('•')} ${it.title}${it.detail ? dim(` — ${it.detail}`) : ''}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
lines.push('');
|
|
142
|
+
return lines.join('\n');
|
|
143
|
+
}
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
// rollback (BUILD ITEM 4) — INWARD CLEANUP ONLY
|
|
146
|
+
// ---------------------------------------------------------------------------
|
|
147
|
+
/**
|
|
148
|
+
* ROLLBACK (BUILD ITEM 4) — INWARD CLEANUP ONLY. In order:
|
|
149
|
+
* 1. unenroll(repo) (H6-audited enroll:remove)
|
|
150
|
+
* 2. sweepRepoSandboxes(repo) (SCOPED to this repo; a LIVE owner is
|
|
151
|
+
* NEVER reclaimed; the age guard is
|
|
152
|
+
* dropped so a fresh crash-leftover from
|
|
153
|
+
* the very activation being undone IS
|
|
154
|
+
* reclaimed — true one-command undo)
|
|
155
|
+
* 3. opts.kill ⇒ setKill(true) (opt-in; H6-audited kill:on)
|
|
156
|
+
* Returns 0. NEVER widens access; NEVER an outward action.
|
|
157
|
+
*/
|
|
158
|
+
export async function rollback(repo, opts) {
|
|
159
|
+
const abs = resolve(repo);
|
|
160
|
+
// 1. Narrow the enrollment gate. Idempotent; H6-audited enroll:remove.
|
|
161
|
+
unenroll(abs);
|
|
162
|
+
// 2. Reclaim THIS repo's crash-leftover sandboxes (scoped). The scoped sweep
|
|
163
|
+
// drops the 6h age guard (so a FRESH leftover from the activation being
|
|
164
|
+
// undone is reclaimed too) but KEEPS the ownerAlive guard, so it NEVER
|
|
165
|
+
// force-removes a LIVE in-flight worktree; each removal inherits
|
|
166
|
+
// removeSandbox's full containment guards.
|
|
167
|
+
let swept = [];
|
|
168
|
+
try {
|
|
169
|
+
swept = sweepRepoSandboxes(abs);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
swept = [];
|
|
173
|
+
}
|
|
174
|
+
// 3. Opt-in: pause ALL autonomy in the same step (H6-audited kill:on).
|
|
175
|
+
if (opts.kill)
|
|
176
|
+
setKill(true);
|
|
177
|
+
console.log('');
|
|
178
|
+
console.log(bold(' ashlr onboard --rollback'));
|
|
179
|
+
console.log('');
|
|
180
|
+
console.log(` ${green('✓')} unenrolled ${dim(abs)}`);
|
|
181
|
+
console.log(` ${green('✓')} swept ${swept.length} leftover sandbox(es) for this repo ` +
|
|
182
|
+
dim('(a live in-flight worktree is never reclaimed)'));
|
|
183
|
+
if (opts.kill) {
|
|
184
|
+
console.log(` ${yellow('!')} kill switch ON ${dim('— all autonomy paused')}`);
|
|
185
|
+
}
|
|
186
|
+
console.log('');
|
|
187
|
+
console.log(` ${dim('Re-enable any time with')} ${cyan('ashlr onboard')}.`);
|
|
188
|
+
console.log('');
|
|
189
|
+
return 0;
|
|
190
|
+
}
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
// Blocker / guidance rendering
|
|
193
|
+
// ---------------------------------------------------------------------------
|
|
194
|
+
function printBlockers(report) {
|
|
195
|
+
console.log('');
|
|
196
|
+
console.log(bold(' ashlr onboard') + dim(' — preflight'));
|
|
197
|
+
console.log('');
|
|
198
|
+
console.log(` ${red('✗')} ${bold('not ready')} ${dim('— resolve the blocker(s) below, then re-run.')}`);
|
|
199
|
+
console.log('');
|
|
200
|
+
for (const b of report.blockers) {
|
|
201
|
+
console.log(` ${red('✗')} ${b.detail}${b.fix ? `\n ${dim('fix:')} ${cyan(b.fix)}` : ''}`);
|
|
202
|
+
}
|
|
203
|
+
console.log('');
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Non-interactive guidance: print the numbered FIRST-ACTIVATION steps WITHOUT
|
|
207
|
+
* prompting and WITHOUT enrolling. Mirrors cmdInit's yesMode — it DESCRIBES the
|
|
208
|
+
* activation; the human still runs the explicit enroll/inbox steps themselves.
|
|
209
|
+
*/
|
|
210
|
+
function printSteps(repoHint) {
|
|
211
|
+
console.log('');
|
|
212
|
+
console.log(bold(' ashlr onboard') + dim(' — first safe activation (steps)'));
|
|
213
|
+
console.log('');
|
|
214
|
+
console.log(` ${dim('Run these in order. Each step is the explicit human gate — nothing runs on its own.')}`);
|
|
215
|
+
console.log('');
|
|
216
|
+
console.log(` ${cyan('1.')} ${bold('Preflight')} ${dim('ashlr preflight')} ${dim('— read-only readiness check')}`);
|
|
217
|
+
console.log(` ${cyan('2.')} ${bold('Enroll ONE')} ${dim(`ashlr sandbox enroll ${repoHint}`)} ${dim('— the explicit enrollment gate')}`);
|
|
218
|
+
console.log(` ${cyan('3.')} ${bold('Dry-run')} ${dim('ashlr daemon start --dry-run --once')} ${dim('— preview the plan; NO proposal, $0')}`);
|
|
219
|
+
console.log(` ${cyan('4.')} ${bold('Review')} ${dim('ashlr inbox')} ${dim('— review + approve; NEVER auto-applied')}`);
|
|
220
|
+
console.log(` ${cyan('5.')} ${bold('Rollback')} ${dim(`ashlr onboard --rollback ${repoHint}`)} ${dim('— one-command undo')}`);
|
|
221
|
+
console.log('');
|
|
222
|
+
console.log(` ${dim('Re-run interactively (a TTY, no --yes) to be guided through steps 1–3 automatically.')}`);
|
|
223
|
+
console.log('');
|
|
224
|
+
}
|
|
225
|
+
// ---------------------------------------------------------------------------
|
|
226
|
+
// cmdOnboard — the dispatcher entry point
|
|
227
|
+
// ---------------------------------------------------------------------------
|
|
228
|
+
/**
|
|
229
|
+
* `ashlr onboard` — guided first-activation walkthrough.
|
|
230
|
+
* - `--rollback <repo> [--kill]` routes to rollback().
|
|
231
|
+
* - else: preflight → (TTY) confirm + enroll ONE repo → dry-run PLAN →
|
|
232
|
+
* point at `ashlr inbox` → offer rollback.
|
|
233
|
+
* - `--yes` OR non-TTY: print the numbered steps WITHOUT prompting/enrolling.
|
|
234
|
+
* Returns 0 on success, non-zero when preflight blocks.
|
|
235
|
+
*/
|
|
236
|
+
export async function cmdOnboard(args) {
|
|
237
|
+
const cfg = loadConfig();
|
|
238
|
+
// ── Rollback route ────────────────────────────────────────────────────────
|
|
239
|
+
if (args.includes('--rollback')) {
|
|
240
|
+
const idx = args.indexOf('--rollback');
|
|
241
|
+
// The repo is the positional right after --rollback, else the first
|
|
242
|
+
// non-flag positional, else cwd.
|
|
243
|
+
const positional = args.filter((a, i) => !a.startsWith('--') && i !== idx + 1);
|
|
244
|
+
const repo = args[idx + 1] && !args[idx + 1].startsWith('--')
|
|
245
|
+
? args[idx + 1]
|
|
246
|
+
: positional[0] ?? process.cwd();
|
|
247
|
+
const kill = args.includes('--kill');
|
|
248
|
+
return rollback(repo, { kill });
|
|
249
|
+
}
|
|
250
|
+
// ── yesMode = non-interactive guidance (NO prompt, NO enroll) ──────────────
|
|
251
|
+
const yesMode = args.includes('--yes') || !process.stdin.isTTY;
|
|
252
|
+
// Candidate repo: first positional arg, else cwd.
|
|
253
|
+
const repoArg = args.find((a) => !a.startsWith('--'));
|
|
254
|
+
const candidate = resolve(repoArg ?? process.cwd());
|
|
255
|
+
// ── Step 1: Preflight (READ-ONLY). Blockers ⇒ STOP, do nothing else. ───────
|
|
256
|
+
const report = await buildReadiness(cfg);
|
|
257
|
+
if (!report.ready) {
|
|
258
|
+
printBlockers(report);
|
|
259
|
+
return 1;
|
|
260
|
+
}
|
|
261
|
+
// Non-interactive: print the numbered steps and STOP — never enroll, never
|
|
262
|
+
// dry-run on the user's behalf. The human runs the explicit gates.
|
|
263
|
+
if (yesMode) {
|
|
264
|
+
printSteps(repoArg ?? candidate);
|
|
265
|
+
return 0;
|
|
266
|
+
}
|
|
267
|
+
// ── Interactive walkthrough ────────────────────────────────────────────────
|
|
268
|
+
console.log('');
|
|
269
|
+
console.log(bold(' ashlr onboard') + dim(' — first safe activation'));
|
|
270
|
+
console.log('');
|
|
271
|
+
console.log(` ${green('✓')} ${bold('ready')}` +
|
|
272
|
+
(report.warnings.length ? dim(` (${report.warnings.length} warning(s) — non-blocking)`) : ''));
|
|
273
|
+
for (const w of report.warnings) {
|
|
274
|
+
console.log(` ${yellow('!')} ${dim(w.detail)}`);
|
|
275
|
+
}
|
|
276
|
+
for (const note of report.info) {
|
|
277
|
+
console.log(` ${dim('•')} ${dim(note.detail)}`);
|
|
278
|
+
}
|
|
279
|
+
console.log('');
|
|
280
|
+
// ── Step 2: Enroll ONE repo (the explicit human gate; H6-audited) ──────────
|
|
281
|
+
const before = listEnrolled();
|
|
282
|
+
const confirmed = await _internals.confirm(` Enroll ${cyan(candidate)} for autonomous work?`);
|
|
283
|
+
if (!confirmed) {
|
|
284
|
+
console.log('');
|
|
285
|
+
console.log(` ${dim('No repo enrolled. Re-run when ready, or run')} ${cyan('ashlr preflight')} ${dim('to re-check.')}`);
|
|
286
|
+
console.log('');
|
|
287
|
+
return 0;
|
|
288
|
+
}
|
|
289
|
+
enroll(candidate); // idempotent; the ONLY mutating call in the whole flow
|
|
290
|
+
const after = listEnrolled();
|
|
291
|
+
console.log('');
|
|
292
|
+
console.log(` ${green('✓')} enrolled ${dim(candidate)} ${dim(`(${before.length} → ${after.length} repo(s))`)}`);
|
|
293
|
+
console.log('');
|
|
294
|
+
// ── Step 3: Dry-run PLAN (READ-ONLY — NO proposal, $0 spend) ───────────────
|
|
295
|
+
const plan = await renderDryRunPlan(cfg);
|
|
296
|
+
console.log(plan);
|
|
297
|
+
// ── Step 4: Point at the inbox (REVIEW ONLY — never auto-approve/apply) ─────
|
|
298
|
+
console.log(` ${bold('Next:')} review what would run with ${cyan('ashlr inbox')} ${dim('— nothing is applied until YOU approve it there.')}`);
|
|
299
|
+
console.log('');
|
|
300
|
+
// ── Step 5: Offer the one-command rollback ─────────────────────────────────
|
|
301
|
+
console.log(` ${dim('Undo this activation any time:')} ${cyan(`ashlr onboard --rollback ${candidate}`)}${dim(' [--kill]')}`);
|
|
302
|
+
console.log('');
|
|
303
|
+
return 0;
|
|
304
|
+
}
|
|
305
|
+
//# sourceMappingURL=onboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"onboard.js","sourceRoot":"","sources":["../../src/cli/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cli/open.ts — Launch items in editor, Finder, or Terminal.
|
|
3
|
+
*
|
|
4
|
+
* All launchers use spawn (detached, unref'd) so the CLI process exits
|
|
5
|
+
* immediately. Errors are swallowed — never throw; open operations are
|
|
6
|
+
* best-effort UI conveniences.
|
|
7
|
+
*/
|
|
8
|
+
import type { AshlrConfig } from '../core/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Open `path` in the configured editor using a deep link URL.
|
|
11
|
+
*
|
|
12
|
+
* Strategy:
|
|
13
|
+
* 1. Cursor → `open "cursor://file/<abs>"`
|
|
14
|
+
* Fallback: `open -a Cursor <path>`
|
|
15
|
+
* 2. VSCode → `open "vscode://file/<abs>"`
|
|
16
|
+
* Fallback: `open -a "Visual Studio Code" <path>`
|
|
17
|
+
*
|
|
18
|
+
* The deep link is tried first; if the URL scheme handler is not registered
|
|
19
|
+
* (e.g. app not installed) macOS silently does nothing, so we do not attempt
|
|
20
|
+
* explicit fallback detection — callers are welcome to retry via openInFinder.
|
|
21
|
+
*/
|
|
22
|
+
export declare function openInEditor(path: string, cfg: AshlrConfig): void;
|
|
23
|
+
/**
|
|
24
|
+
* Reveal `path` in macOS Finder.
|
|
25
|
+
* Uses `open <path>` which opens directories in Finder and files with their
|
|
26
|
+
* default app. For "reveal in Finder" semantics on a file, callers can pass
|
|
27
|
+
* the parent directory instead.
|
|
28
|
+
*/
|
|
29
|
+
export declare function openInFinder(path: string): void;
|
|
30
|
+
/**
|
|
31
|
+
* Open a new Terminal window cd'd to `path` (best-effort).
|
|
32
|
+
*
|
|
33
|
+
* Uses `open -a Terminal <path>`. On macOS this opens a new Terminal window
|
|
34
|
+
* at the given directory when path is a directory. For files, Terminal opens
|
|
35
|
+
* at the parent directory. No guarantee for iTerm2 or other terminals — this
|
|
36
|
+
* targets the system Terminal.app only.
|
|
37
|
+
*/
|
|
38
|
+
export declare function openInTerminal(path: string): void;
|