@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,474 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config + path constants for ashlr-hub.
|
|
3
|
+
*
|
|
4
|
+
* Handles reading, writing, and defaulting the ~/.ashlr/config.json file.
|
|
5
|
+
* All ~ paths are expanded to the real homedir at module load time.
|
|
6
|
+
*/
|
|
7
|
+
import { homedir } from 'node:os';
|
|
8
|
+
import { join } from 'node:path';
|
|
9
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Path constants (exported, resolved immediately)
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
const HOME = homedir();
|
|
14
|
+
/** Absolute path to the hub's config/index home: ~/.ashlr */
|
|
15
|
+
export const CONFIG_DIR = join(HOME, '.ashlr');
|
|
16
|
+
/** Absolute path to the config file: ~/.ashlr/config.json */
|
|
17
|
+
export const CONFIG_PATH = join(CONFIG_DIR, 'config.json');
|
|
18
|
+
/** Absolute path to the index file: ~/.ashlr/index.json */
|
|
19
|
+
export const INDEX_PATH = join(CONFIG_DIR, 'index.json');
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Runtime path resolution
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// The exported constants above are resolved once at module load for external
|
|
24
|
+
// consumers. The functions below re-resolve from homedir() at call time so a
|
|
25
|
+
// changed HOME (e.g. in tests, or a relocated home dir) is always honored.
|
|
26
|
+
// This keeps the public constants stable while making load/save correct under
|
|
27
|
+
// a moving HOME.
|
|
28
|
+
function resolveConfigDir() {
|
|
29
|
+
return join(homedir(), '.ashlr');
|
|
30
|
+
}
|
|
31
|
+
function resolveConfigPath() {
|
|
32
|
+
return join(resolveConfigDir(), 'config.json');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Absolute path to the M26 self-improvement / meta-learning home:
|
|
36
|
+
* `~/.ashlr/learn`. Re-resolved from `homedir()` at call time so tests that
|
|
37
|
+
* relocate HOME work. This is the ONLY directory `ashlr reflect` writes to for
|
|
38
|
+
* its reports/snapshots — it NEVER writes CONFIG_PATH / router policy / prompts.
|
|
39
|
+
* This function does NOT create the directory; the learn store creates it lazily.
|
|
40
|
+
*/
|
|
41
|
+
export function learnDir() {
|
|
42
|
+
return join(resolveConfigDir(), 'learn');
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Absolute path to the M27 quality / health-review home: `~/.ashlr/quality`.
|
|
46
|
+
* Re-resolved from `homedir()` at call time so tests that relocate HOME work.
|
|
47
|
+
* This is the ONLY directory `ashlr health` writes to for its HealthReport
|
|
48
|
+
* snapshots (trend tracking) — it NEVER writes CONFIG_PATH / router policy /
|
|
49
|
+
* prompts, and NEVER touches a user repo working tree. This function does NOT
|
|
50
|
+
* create the directory; the quality store creates it lazily.
|
|
51
|
+
*/
|
|
52
|
+
export function qualityDir() {
|
|
53
|
+
return join(resolveConfigDir(), 'quality');
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Absolute path to the M28 goal planning/tracking home: `~/.ashlr/goals`.
|
|
57
|
+
* Re-resolved from `homedir()` at call time so tests that relocate HOME work.
|
|
58
|
+
* This is the ONLY directory `ashlr goals` writes its planning/tracking data
|
|
59
|
+
* to — it NEVER writes CONFIG_PATH / router policy / prompts, and NEVER touches
|
|
60
|
+
* a user repo working tree. This function does NOT create the directory; the
|
|
61
|
+
* goals store creates it lazily. Single source of truth for the ~/.ashlr root.
|
|
62
|
+
*/
|
|
63
|
+
export function goalsDir() {
|
|
64
|
+
return join(resolveConfigDir(), 'goals');
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Absolute path to the M29 portfolio-digest home: `~/.ashlr/digests`.
|
|
68
|
+
* Re-resolved from `homedir()` at call time so tests that relocate HOME work.
|
|
69
|
+
* This is the ONLY directory `ashlr digest` writes to (JSON + markdown digest
|
|
70
|
+
* artifacts for day-over-day trend) — it NEVER writes CONFIG_PATH / router
|
|
71
|
+
* policy / prompts, and NEVER touches a user repo working tree. This function
|
|
72
|
+
* does NOT create the directory; the digest store creates it lazily. Single
|
|
73
|
+
* source of truth for the ~/.ashlr root.
|
|
74
|
+
*/
|
|
75
|
+
export function digestsDir() {
|
|
76
|
+
return join(resolveConfigDir(), 'digests');
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Default tidy rules
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Conservative, opinionated rules for tidying loose top-level Desktop files.
|
|
83
|
+
* Rules are applied in order — first match wins (enforced by the tidy engine).
|
|
84
|
+
* Only moves clearly-typed files; ambiguous or structurally-important items
|
|
85
|
+
* should be added to `keepers` instead.
|
|
86
|
+
*/
|
|
87
|
+
const DEFAULT_TIDY_RULES = [
|
|
88
|
+
// ── Screenshots ──────────────────────────────────────────────────────────
|
|
89
|
+
{
|
|
90
|
+
match: 'Screenshot*',
|
|
91
|
+
matchType: 'glob',
|
|
92
|
+
dest: join(HOME, 'Desktop/Assets/Screenshots'),
|
|
93
|
+
description: 'macOS screenshot files captured to Desktop',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
match: 'Screen Recording*',
|
|
97
|
+
matchType: 'glob',
|
|
98
|
+
dest: join(HOME, 'Desktop/Assets/Screenshots'),
|
|
99
|
+
description: 'macOS screen recordings captured to Desktop',
|
|
100
|
+
},
|
|
101
|
+
// ── Images ────────────────────────────────────────────────────────────────
|
|
102
|
+
{
|
|
103
|
+
match: 'png',
|
|
104
|
+
matchType: 'ext',
|
|
105
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
106
|
+
description: 'Loose PNG images',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
match: 'jpg',
|
|
110
|
+
matchType: 'ext',
|
|
111
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
112
|
+
description: 'Loose JPEG images',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
match: 'jpeg',
|
|
116
|
+
matchType: 'ext',
|
|
117
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
118
|
+
description: 'Loose JPEG images',
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
match: 'gif',
|
|
122
|
+
matchType: 'ext',
|
|
123
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
124
|
+
description: 'Loose GIF images',
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
match: 'webp',
|
|
128
|
+
matchType: 'ext',
|
|
129
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
130
|
+
description: 'Loose WebP images',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
match: 'svg',
|
|
134
|
+
matchType: 'ext',
|
|
135
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
136
|
+
description: 'Loose SVG files',
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
match: 'heic',
|
|
140
|
+
matchType: 'ext',
|
|
141
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
142
|
+
description: 'Loose HEIC images (iPhone captures)',
|
|
143
|
+
},
|
|
144
|
+
// ── Documents — PDF ───────────────────────────────────────────────────────
|
|
145
|
+
{
|
|
146
|
+
match: '*Invoice*',
|
|
147
|
+
matchType: 'glob',
|
|
148
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
149
|
+
description: 'Invoice PDFs and documents',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
match: '*Receipt*',
|
|
153
|
+
matchType: 'glob',
|
|
154
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
155
|
+
description: 'Receipt PDFs and documents',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
match: '*Contract*',
|
|
159
|
+
matchType: 'glob',
|
|
160
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
161
|
+
description: 'Contract documents',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
match: 'pdf',
|
|
165
|
+
matchType: 'ext',
|
|
166
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
167
|
+
description: 'Loose PDF documents (generic catch-all for PDFs not matched above)',
|
|
168
|
+
},
|
|
169
|
+
// ── Documents — Office / text ─────────────────────────────────────────────
|
|
170
|
+
{
|
|
171
|
+
match: 'docx',
|
|
172
|
+
matchType: 'ext',
|
|
173
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
174
|
+
description: 'Loose Word documents',
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
match: 'doc',
|
|
178
|
+
matchType: 'ext',
|
|
179
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
180
|
+
description: 'Loose Word documents (legacy format)',
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
match: 'xlsx',
|
|
184
|
+
matchType: 'ext',
|
|
185
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
186
|
+
description: 'Loose Excel spreadsheets',
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
match: 'xls',
|
|
190
|
+
matchType: 'ext',
|
|
191
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
192
|
+
description: 'Loose Excel spreadsheets (legacy format)',
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
match: 'pptx',
|
|
196
|
+
matchType: 'ext',
|
|
197
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
198
|
+
description: 'Loose PowerPoint presentations',
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
match: 'ppt',
|
|
202
|
+
matchType: 'ext',
|
|
203
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
204
|
+
description: 'Loose PowerPoint presentations (legacy format)',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
match: 'numbers',
|
|
208
|
+
matchType: 'ext',
|
|
209
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
210
|
+
description: 'Loose Numbers spreadsheets',
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
match: 'pages',
|
|
214
|
+
matchType: 'ext',
|
|
215
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
216
|
+
description: 'Loose Pages documents',
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
match: 'keynote',
|
|
220
|
+
matchType: 'ext',
|
|
221
|
+
dest: join(HOME, 'Desktop/Business'),
|
|
222
|
+
description: 'Loose Keynote presentations',
|
|
223
|
+
},
|
|
224
|
+
// ── Notes / Markdown ──────────────────────────────────────────────────────
|
|
225
|
+
{
|
|
226
|
+
match: 'md',
|
|
227
|
+
matchType: 'ext',
|
|
228
|
+
dest: join(HOME, 'Desktop/Knowledge'),
|
|
229
|
+
description: 'Loose Markdown notes and documents',
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
match: 'txt',
|
|
233
|
+
matchType: 'ext',
|
|
234
|
+
dest: join(HOME, 'Desktop/Knowledge'),
|
|
235
|
+
description: 'Loose plain-text notes',
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
match: 'rtf',
|
|
239
|
+
matchType: 'ext',
|
|
240
|
+
dest: join(HOME, 'Desktop/Knowledge'),
|
|
241
|
+
description: 'Loose RTF notes',
|
|
242
|
+
},
|
|
243
|
+
// ── Archives / downloads ──────────────────────────────────────────────────
|
|
244
|
+
{
|
|
245
|
+
match: 'zip',
|
|
246
|
+
matchType: 'ext',
|
|
247
|
+
dest: join(HOME, 'Desktop/archive'),
|
|
248
|
+
description: 'Loose ZIP archives (downloads, exports)',
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
match: 'tar',
|
|
252
|
+
matchType: 'ext',
|
|
253
|
+
dest: join(HOME, 'Desktop/archive'),
|
|
254
|
+
description: 'Loose tar archives',
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
match: 'gz',
|
|
258
|
+
matchType: 'ext',
|
|
259
|
+
dest: join(HOME, 'Desktop/archive'),
|
|
260
|
+
description: 'Loose gzip archives',
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
match: 'dmg',
|
|
264
|
+
matchType: 'ext',
|
|
265
|
+
dest: join(HOME, 'Desktop/archive'),
|
|
266
|
+
description: 'Loose disk image installers',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
match: 'pkg',
|
|
270
|
+
matchType: 'ext',
|
|
271
|
+
dest: join(HOME, 'Desktop/archive'),
|
|
272
|
+
description: 'Loose macOS package installers',
|
|
273
|
+
},
|
|
274
|
+
// ── Audio / video ─────────────────────────────────────────────────────────
|
|
275
|
+
{
|
|
276
|
+
match: 'mp3',
|
|
277
|
+
matchType: 'ext',
|
|
278
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
279
|
+
description: 'Loose audio files',
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
match: 'wav',
|
|
283
|
+
matchType: 'ext',
|
|
284
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
285
|
+
description: 'Loose WAV audio files',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
match: 'mp4',
|
|
289
|
+
matchType: 'ext',
|
|
290
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
291
|
+
description: 'Loose MP4 video files',
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
match: 'mov',
|
|
295
|
+
matchType: 'ext',
|
|
296
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
297
|
+
description: 'Loose QuickTime video files',
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
match: 'mkv',
|
|
301
|
+
matchType: 'ext',
|
|
302
|
+
dest: join(HOME, 'Desktop/Assets'),
|
|
303
|
+
description: 'Loose MKV video files',
|
|
304
|
+
},
|
|
305
|
+
];
|
|
306
|
+
// ---------------------------------------------------------------------------
|
|
307
|
+
// Category map (Desktop doc-folder categories; git-category entries come from
|
|
308
|
+
// the github/<category> subdirectory layout and are added dynamically in
|
|
309
|
+
// the index engine, but we seed the doc-folder ones here for tidy purposes).
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
const DEFAULT_CATEGORIES = {
|
|
312
|
+
// Git repo categories (path-based; used by classify.ts to resolve category)
|
|
313
|
+
'dev-tools': join(HOME, 'Desktop/github/dev-tools'),
|
|
314
|
+
'side-projects': join(HOME, 'Desktop/github/side-projects'),
|
|
315
|
+
'professional-tools': join(HOME, 'Desktop/github/professional-tools'),
|
|
316
|
+
'artist-encyclopedias': join(HOME, 'Desktop/github/artist-encyclopedias'),
|
|
317
|
+
'client-engagements': join(HOME, 'Desktop/github/client-engagements'),
|
|
318
|
+
forks: join(HOME, 'Desktop/github/forks'),
|
|
319
|
+
ashlrai: join(HOME, 'Desktop/github/ashlrai'),
|
|
320
|
+
// Desktop document folders
|
|
321
|
+
Business: join(HOME, 'Desktop/Business'),
|
|
322
|
+
'Client-Work': join(HOME, 'Desktop/Client-Work'),
|
|
323
|
+
'Product-Docs': join(HOME, 'Desktop/Product-Docs'),
|
|
324
|
+
Knowledge: join(HOME, 'Desktop/Knowledge'),
|
|
325
|
+
Assets: join(HOME, 'Desktop/Assets'),
|
|
326
|
+
archive: join(HOME, 'Desktop/archive'),
|
|
327
|
+
};
|
|
328
|
+
// ---------------------------------------------------------------------------
|
|
329
|
+
// Keeper list
|
|
330
|
+
// These basenames / absolute paths must NEVER be moved or deleted by tidy.
|
|
331
|
+
// ---------------------------------------------------------------------------
|
|
332
|
+
const DEFAULT_KEEPERS = [
|
|
333
|
+
'Rent Application.pdf',
|
|
334
|
+
'ASHLRAI',
|
|
335
|
+
'rde-other',
|
|
336
|
+
'Keys & Recovery',
|
|
337
|
+
'github',
|
|
338
|
+
'Evero Notes',
|
|
339
|
+
'OneDrive - James Madison University',
|
|
340
|
+
// Top-level symlinks that happen to mirror github/ structure — never double-count
|
|
341
|
+
'tts agents',
|
|
342
|
+
];
|
|
343
|
+
// ---------------------------------------------------------------------------
|
|
344
|
+
// defaultConfig()
|
|
345
|
+
// ---------------------------------------------------------------------------
|
|
346
|
+
/**
|
|
347
|
+
* Produce a sensible default AshlrConfig for a fresh install.
|
|
348
|
+
* All paths are resolved to absolute values (no ~ remaining).
|
|
349
|
+
*/
|
|
350
|
+
export function defaultConfig() {
|
|
351
|
+
return {
|
|
352
|
+
version: 1,
|
|
353
|
+
roots: [
|
|
354
|
+
join(HOME, 'Desktop/github'),
|
|
355
|
+
join(HOME, 'Desktop'),
|
|
356
|
+
],
|
|
357
|
+
editor: 'cursor',
|
|
358
|
+
staleDays: 30,
|
|
359
|
+
categories: DEFAULT_CATEGORIES,
|
|
360
|
+
tidyRules: DEFAULT_TIDY_RULES,
|
|
361
|
+
keepers: DEFAULT_KEEPERS,
|
|
362
|
+
models: {
|
|
363
|
+
lmstudio: 'http://localhost:1234',
|
|
364
|
+
ollama: 'http://localhost:11434',
|
|
365
|
+
providerChain: ['lmstudio', 'ollama', 'anthropic'],
|
|
366
|
+
},
|
|
367
|
+
telemetry: {},
|
|
368
|
+
tools: {},
|
|
369
|
+
// M33: plugin system defaults — DEFAULT EMPTY (enabled:[] = no plugins load).
|
|
370
|
+
plugins: {
|
|
371
|
+
enabled: [],
|
|
372
|
+
settings: {},
|
|
373
|
+
integrity: {},
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
// ---------------------------------------------------------------------------
|
|
378
|
+
// Deep merge helper
|
|
379
|
+
// ---------------------------------------------------------------------------
|
|
380
|
+
/**
|
|
381
|
+
* Recursively merge `override` on top of `base`.
|
|
382
|
+
* Arrays from `override` replace those in `base` entirely (no concat) —
|
|
383
|
+
* this lets users fully replace roots/keepers/tidyRules in their config file.
|
|
384
|
+
* Plain objects are merged recursively; all other values override directly.
|
|
385
|
+
*/
|
|
386
|
+
function deepMerge(base, override) {
|
|
387
|
+
const result = { ...base };
|
|
388
|
+
for (const key of Object.keys(override)) {
|
|
389
|
+
const baseVal = base[key];
|
|
390
|
+
const overVal = override[key];
|
|
391
|
+
if (overVal !== null &&
|
|
392
|
+
overVal !== undefined &&
|
|
393
|
+
typeof overVal === 'object' &&
|
|
394
|
+
!Array.isArray(overVal) &&
|
|
395
|
+
typeof baseVal === 'object' &&
|
|
396
|
+
baseVal !== null &&
|
|
397
|
+
!Array.isArray(baseVal)) {
|
|
398
|
+
// Both sides are plain objects — recurse
|
|
399
|
+
result[key] = deepMerge(baseVal, overVal);
|
|
400
|
+
}
|
|
401
|
+
else if (overVal !== undefined) {
|
|
402
|
+
// Array, primitive, or null — take override's value
|
|
403
|
+
result[key] = overVal;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return result;
|
|
407
|
+
}
|
|
408
|
+
// ---------------------------------------------------------------------------
|
|
409
|
+
// loadConfig()
|
|
410
|
+
// ---------------------------------------------------------------------------
|
|
411
|
+
/**
|
|
412
|
+
* Load config from CONFIG_PATH.
|
|
413
|
+
* - If CONFIG_DIR does not exist, creates it.
|
|
414
|
+
* - If CONFIG_PATH does not exist, writes the default config and returns it.
|
|
415
|
+
* - Otherwise, reads the file, JSON-parses it, deep-merges over defaultConfig()
|
|
416
|
+
* (so new keys added in future versions are always present), and returns.
|
|
417
|
+
* - On parse error, logs a warning and falls back to the default config
|
|
418
|
+
* (we intentionally do NOT overwrite the user's potentially-fixable file).
|
|
419
|
+
*/
|
|
420
|
+
export function loadConfig() {
|
|
421
|
+
const configDir = resolveConfigDir();
|
|
422
|
+
const configPath = resolveConfigPath();
|
|
423
|
+
// Ensure the config directory exists
|
|
424
|
+
if (!existsSync(configDir)) {
|
|
425
|
+
mkdirSync(configDir, { recursive: true });
|
|
426
|
+
}
|
|
427
|
+
// If the config file does not exist, bootstrap it with defaults
|
|
428
|
+
if (!existsSync(configPath)) {
|
|
429
|
+
const defaults = defaultConfig();
|
|
430
|
+
saveConfig(defaults);
|
|
431
|
+
return defaults;
|
|
432
|
+
}
|
|
433
|
+
// Read and parse the existing config file
|
|
434
|
+
let raw;
|
|
435
|
+
try {
|
|
436
|
+
raw = readFileSync(configPath, 'utf8');
|
|
437
|
+
}
|
|
438
|
+
catch (err) {
|
|
439
|
+
console.warn(`[ashlr] Warning: could not read config at ${configPath}: ${String(err)}. Using defaults.`);
|
|
440
|
+
return defaultConfig();
|
|
441
|
+
}
|
|
442
|
+
let parsed;
|
|
443
|
+
try {
|
|
444
|
+
parsed = JSON.parse(raw);
|
|
445
|
+
}
|
|
446
|
+
catch (err) {
|
|
447
|
+
console.warn(`[ashlr] Warning: config file at ${configPath} is not valid JSON: ${String(err)}. Using defaults.`);
|
|
448
|
+
return defaultConfig();
|
|
449
|
+
}
|
|
450
|
+
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
451
|
+
console.warn(`[ashlr] Warning: config file at ${configPath} does not contain a JSON object. Using defaults.`);
|
|
452
|
+
return defaultConfig();
|
|
453
|
+
}
|
|
454
|
+
// Deep-merge the user's persisted config over the defaults so newly-added
|
|
455
|
+
// fields always have a value even on older config files.
|
|
456
|
+
return deepMerge(defaultConfig(), parsed);
|
|
457
|
+
}
|
|
458
|
+
// ---------------------------------------------------------------------------
|
|
459
|
+
// saveConfig()
|
|
460
|
+
// ---------------------------------------------------------------------------
|
|
461
|
+
/**
|
|
462
|
+
* Persist `c` to CONFIG_PATH as pretty-printed JSON.
|
|
463
|
+
* Creates CONFIG_DIR if it does not yet exist.
|
|
464
|
+
*/
|
|
465
|
+
export function saveConfig(c) {
|
|
466
|
+
const configDir = resolveConfigDir();
|
|
467
|
+
const configPath = resolveConfigPath();
|
|
468
|
+
if (!existsSync(configDir)) {
|
|
469
|
+
mkdirSync(configDir, { recursive: true });
|
|
470
|
+
}
|
|
471
|
+
const json = JSON.stringify(c, null, 2) + '\n';
|
|
472
|
+
writeFileSync(configPath, json, 'utf8');
|
|
473
|
+
}
|
|
474
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* loop.ts — The M24 daemon operator.
|
|
3
|
+
*
|
|
4
|
+
* Exports:
|
|
5
|
+
* - tick(cfg, opts): one operator cycle — check guards, load backlog, dispatch
|
|
6
|
+
* sandboxed swarms, create PENDING inbox proposals, record spend + state.
|
|
7
|
+
* - runDaemon(cfg, opts): loop ticks on an interval (or once); REFUSES when
|
|
8
|
+
* nested; marks running state; stops on kill switch / budget exhaustion.
|
|
9
|
+
* - stopDaemon(): set kill switch + clear running state.
|
|
10
|
+
*
|
|
11
|
+
* NON-NEGOTIABLE GUARDRAILS (enforced here, grep-provable):
|
|
12
|
+
* 1. PROPOSAL-ONLY: this file has NO outward-action path whatsoever. Its ONLY
|
|
13
|
+
* inbox output is a PENDING proposal, produced indirectly by the swarm
|
|
14
|
+
* runner when this file passes { propose: true } to runSwarm. A PENDING
|
|
15
|
+
* proposal is applied LATER only by an explicit human inbox approve.
|
|
16
|
+
* This file imports no apply/push/PR/deploy primitive.
|
|
17
|
+
* 2. ENROLLMENT-ONLY: operates exclusively on listEnrolled() repos.
|
|
18
|
+
* DEFAULT EMPTY => the daemon does NOTHING.
|
|
19
|
+
* 3. SANDBOXED: every runSwarm call sets opts.sandbox = true so all
|
|
20
|
+
* swarm work runs in an isolated git-worktree (M21).
|
|
21
|
+
* 4. BOUNDED: hard daily USD cap + per-tick item cap + concurrency cap.
|
|
22
|
+
* Resets per calendar day. NO unbounded loop — every iteration
|
|
23
|
+
* re-checks kill switch + budget.
|
|
24
|
+
* 5. RE-ENTRANCY: runDaemon REFUSES if ASHLR_IN_DAEMON or ASHLR_IN_SWARM
|
|
25
|
+
* is already set (no daemon-inside-daemon / daemon-inside-swarm fork bomb).
|
|
26
|
+
* Sets ASHLR_IN_DAEMON=1 on this process so child spawns inherit it.
|
|
27
|
+
*
|
|
28
|
+
* No new runtime deps; node builtins only; never throws out of public API.
|
|
29
|
+
*/
|
|
30
|
+
import type { AshlrConfig, DaemonState, DaemonTick } from '../types.js';
|
|
31
|
+
/**
|
|
32
|
+
* One operator cycle. In order:
|
|
33
|
+
* 1. Kill-switch check.
|
|
34
|
+
* 2. Load + resetDayIfNeeded state; budget exhaustion check.
|
|
35
|
+
* 3. Enrollment check (DEFAULT EMPTY => do nothing).
|
|
36
|
+
* 4. Build/load backlog for enrolled repos.
|
|
37
|
+
* 5. Select top-K items within remaining budget.
|
|
38
|
+
* 6a. dryRun: describe what WOULD be worked; create NO proposals.
|
|
39
|
+
* 6b. else: for each selected item (bounded concurrency):
|
|
40
|
+
* runSwarm({ sandbox:true, propose:true }) => a PENDING inbox proposal
|
|
41
|
+
* is produced by the runner + tally spend.
|
|
42
|
+
* 7. Persist updated state; return tick record.
|
|
43
|
+
*
|
|
44
|
+
* Has NO outward-action path (no apply, no push, no PR, no deploy).
|
|
45
|
+
* Never throws.
|
|
46
|
+
*/
|
|
47
|
+
export declare function tick(cfg: AshlrConfig, opts: {
|
|
48
|
+
dryRun: boolean;
|
|
49
|
+
}): Promise<DaemonTick>;
|
|
50
|
+
/**
|
|
51
|
+
* Start the daemon operator.
|
|
52
|
+
*
|
|
53
|
+
* REFUSES (returns unchanged state) if ASHLR_IN_DAEMON or ASHLR_IN_SWARM is
|
|
54
|
+
* set — prevents daemon-inside-daemon and daemon-inside-swarm fork bombs.
|
|
55
|
+
*
|
|
56
|
+
* Sets ASHLR_IN_DAEMON=1 on this process.env so all child spawns inherit it.
|
|
57
|
+
*
|
|
58
|
+
* opts.once = true => run exactly one tick then stop.
|
|
59
|
+
* opts.once = false => loop: tick → sleep intervalMs → tick → ... until kill
|
|
60
|
+
* switch is set OR daily budget is exhausted.
|
|
61
|
+
* NO unbounded loop — every iteration re-checks both.
|
|
62
|
+
*
|
|
63
|
+
* Never throws.
|
|
64
|
+
*/
|
|
65
|
+
export declare function runDaemon(cfg: AshlrConfig, opts: {
|
|
66
|
+
once: boolean;
|
|
67
|
+
dryRun: boolean;
|
|
68
|
+
}): Promise<DaemonState>;
|
|
69
|
+
/**
|
|
70
|
+
* Set the kill switch (M21 ~/.ashlr/KILL) AND mark running=false, pid=null in
|
|
71
|
+
* persisted state. Idempotent; never throws. A running loop sees the kill
|
|
72
|
+
* switch on the next iteration and stops cleanly.
|
|
73
|
+
*/
|
|
74
|
+
export declare function stopDaemon(): void;
|