@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,407 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/inbox/apply.ts — The ONLY outward mutation path in v2 (M23).
|
|
3
|
+
*
|
|
4
|
+
* applyProposal is the single funnel for every outward action. It is called
|
|
5
|
+
* ONLY from `cli/inbox.ts` after the user explicitly runs `inbox approve <id>`
|
|
6
|
+
* (with confirm or --yes). It is NEVER called automatically, never on create,
|
|
7
|
+
* never on list/show, never by the daemon.
|
|
8
|
+
*
|
|
9
|
+
* GUARDRAILS:
|
|
10
|
+
* - REFUSE unless proposal exists AND status==='approved' AND confirmed===true.
|
|
11
|
+
* - assertMayMutate(repo) before any mutation (enrollment + kill switch).
|
|
12
|
+
* - 'patch': apply diff on a NEW branch (ashlr/proposal/<id>) off HEAD.
|
|
13
|
+
* NEVER touch the user's current branch/index/working tree.
|
|
14
|
+
* NEVER force. NEVER push. Local only.
|
|
15
|
+
* - 'pr': branch + commit, then the gated M18 createPr.
|
|
16
|
+
* - 'deploy': gated ship path.
|
|
17
|
+
* - 'note': no-op record.
|
|
18
|
+
* - Every attempt is audited. Status set to 'applied'/'failed' + result.
|
|
19
|
+
* - Never throws out — all failures returned as ApplyResult.
|
|
20
|
+
* - No secrets in proposals/audit.
|
|
21
|
+
* - No new runtime deps; node builtins only.
|
|
22
|
+
*/
|
|
23
|
+
import { execFileSync } from 'node:child_process';
|
|
24
|
+
import { existsSync, mkdirSync, writeFileSync, unlinkSync } from 'node:fs';
|
|
25
|
+
import { homedir } from 'node:os';
|
|
26
|
+
import { join } from 'node:path';
|
|
27
|
+
import { randomBytes } from 'node:crypto';
|
|
28
|
+
import { loadProposal, setStatus } from './store.js';
|
|
29
|
+
import { assertMayMutate } from '../sandbox/policy.js';
|
|
30
|
+
import { audit } from '../sandbox/audit.js';
|
|
31
|
+
import { isRepo } from '../git.js';
|
|
32
|
+
import { createPr } from '../integrations/github.js';
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Constants
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/** Branch prefix for all inbox-applied branches — NEVER delete user branches. */
|
|
37
|
+
const PROPOSAL_BRANCH_PREFIX = 'ashlr/proposal/';
|
|
38
|
+
/** Timeout for git operations (ms). */
|
|
39
|
+
const GIT_TIMEOUT = 30_000;
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// git helper — arg arrays, no shell
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** Run a git command in `cwd`. Throws on failure. */
|
|
44
|
+
function gitRun(cwd, args) {
|
|
45
|
+
return execFileSync('git', args, {
|
|
46
|
+
cwd,
|
|
47
|
+
timeout: GIT_TIMEOUT,
|
|
48
|
+
stdio: 'pipe',
|
|
49
|
+
encoding: 'utf8',
|
|
50
|
+
}).trim();
|
|
51
|
+
}
|
|
52
|
+
/** Run a git command, returning null on any error (never throws). */
|
|
53
|
+
function gitTry(cwd, args) {
|
|
54
|
+
try {
|
|
55
|
+
return gitRun(cwd, args);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Temp file helper for diff application
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Write `content` to a temp file under ~/.ashlr/tmp and return its path.
|
|
66
|
+
* Caller is responsible for cleanup.
|
|
67
|
+
*/
|
|
68
|
+
function writeTmpFile(content) {
|
|
69
|
+
const dir = join(homedir(), '.ashlr', 'tmp');
|
|
70
|
+
if (!existsSync(dir)) {
|
|
71
|
+
mkdirSync(dir, { recursive: true });
|
|
72
|
+
}
|
|
73
|
+
const name = `patch-${randomBytes(6).toString('hex')}.diff`;
|
|
74
|
+
const p = join(dir, name);
|
|
75
|
+
writeFileSync(p, content, 'utf8');
|
|
76
|
+
return p;
|
|
77
|
+
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Kind handlers
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Apply a unified diff to a NEW branch off current HEAD in `repo`.
|
|
83
|
+
* NEVER touches the user's current branch, index, or working tree.
|
|
84
|
+
* NEVER force. NEVER push. Local only.
|
|
85
|
+
*/
|
|
86
|
+
async function applyPatch(repo, proposalId, diff) {
|
|
87
|
+
if (!isRepo(repo)) {
|
|
88
|
+
return { ok: false, detail: `not a git repository: ${repo}` };
|
|
89
|
+
}
|
|
90
|
+
if (!diff.trim()) {
|
|
91
|
+
return { ok: false, detail: 'proposal diff is empty — nothing to apply' };
|
|
92
|
+
}
|
|
93
|
+
// Derive a safe, namespaced branch name. The proposal id is already a
|
|
94
|
+
// filename-safe lowercase slug (prop-<ts>-<hex>) and is valid as a git ref,
|
|
95
|
+
// so we use it whole — keeping the full id in the branch lets callers match
|
|
96
|
+
// the branch back to its proposal (branch.includes(proposalId)).
|
|
97
|
+
const branch = `${PROPOSAL_BRANCH_PREFIX}${proposalId}`;
|
|
98
|
+
// Read current HEAD without touching working tree.
|
|
99
|
+
const head = gitTry(repo, ['rev-parse', 'HEAD']);
|
|
100
|
+
if (!head) {
|
|
101
|
+
return { ok: false, detail: 'could not resolve HEAD in repo' };
|
|
102
|
+
}
|
|
103
|
+
// Create the new branch off HEAD using --no-checkout so we stay on the
|
|
104
|
+
// user's current branch. We then apply the diff directly to the new branch
|
|
105
|
+
// via a worktree, which fully isolates the patch from the user's working tree.
|
|
106
|
+
// Strategy: use `git worktree add -b <branch> <tmpPath> HEAD` to create an
|
|
107
|
+
// isolated checkout, apply the patch there, commit, then remove the worktree.
|
|
108
|
+
// This is the safest approach — it NEVER modifies the user's working tree,
|
|
109
|
+
// index, or HEAD.
|
|
110
|
+
const tmpWorktreeDir = join(homedir(), '.ashlr', 'tmp', `wt-${randomBytes(6).toString('hex')}`);
|
|
111
|
+
// Create the isolated worktree on the new branch.
|
|
112
|
+
try {
|
|
113
|
+
gitRun(repo, [
|
|
114
|
+
'worktree',
|
|
115
|
+
'add',
|
|
116
|
+
'-b',
|
|
117
|
+
branch,
|
|
118
|
+
tmpWorktreeDir,
|
|
119
|
+
head,
|
|
120
|
+
]);
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
// Clean up any partial worktree registration.
|
|
124
|
+
gitTry(repo, ['worktree', 'prune']);
|
|
125
|
+
return {
|
|
126
|
+
ok: false,
|
|
127
|
+
detail: `git worktree add failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
// Write diff to a temp file so we can pass it as a path argument (no shell).
|
|
131
|
+
let patchFile = null;
|
|
132
|
+
let applyErr = null;
|
|
133
|
+
let commitSha = null;
|
|
134
|
+
try {
|
|
135
|
+
patchFile = writeTmpFile(diff);
|
|
136
|
+
// Apply the diff inside the isolated worktree.
|
|
137
|
+
try {
|
|
138
|
+
gitRun(tmpWorktreeDir, ['apply', '--index', patchFile]);
|
|
139
|
+
}
|
|
140
|
+
catch (err) {
|
|
141
|
+
applyErr = `git apply failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
142
|
+
}
|
|
143
|
+
if (!applyErr) {
|
|
144
|
+
// Commit the applied changes on the new branch.
|
|
145
|
+
try {
|
|
146
|
+
gitRun(tmpWorktreeDir, [
|
|
147
|
+
'commit',
|
|
148
|
+
'--no-verify',
|
|
149
|
+
'-m',
|
|
150
|
+
`ashlr: apply proposal ${proposalId}`,
|
|
151
|
+
]);
|
|
152
|
+
commitSha = gitTry(tmpWorktreeDir, ['rev-parse', 'HEAD']);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
applyErr = `git commit failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
finally {
|
|
160
|
+
// Always remove the temp patch file.
|
|
161
|
+
if (patchFile) {
|
|
162
|
+
try {
|
|
163
|
+
unlinkSync(patchFile);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// ignore cleanup errors
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// Always remove the worktree (removes the tmpWorktreeDir checkout).
|
|
170
|
+
// The branch itself remains in the repo — that's the desired output.
|
|
171
|
+
gitTry(repo, ['worktree', 'remove', '--force', tmpWorktreeDir]);
|
|
172
|
+
gitTry(repo, ['worktree', 'prune']);
|
|
173
|
+
// If apply/commit failed, also delete the scratch branch to leave no
|
|
174
|
+
// dangling refs. The branch is in our namespace so this is safe.
|
|
175
|
+
if (applyErr && branch.startsWith(PROPOSAL_BRANCH_PREFIX)) {
|
|
176
|
+
gitTry(repo, ['branch', '-D', branch]);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
if (applyErr) {
|
|
180
|
+
return { ok: false, detail: applyErr };
|
|
181
|
+
}
|
|
182
|
+
const sha = commitSha ? ` @ ${commitSha.slice(0, 8)}` : '';
|
|
183
|
+
return {
|
|
184
|
+
ok: true,
|
|
185
|
+
detail: `patch applied on branch ${branch}${sha} (local only, not pushed)`,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Create a branch + commit from the diff, then open a PR via the gated M18
|
|
190
|
+
* createPr path. EXPLICIT + GATED — never auto-triggered.
|
|
191
|
+
*/
|
|
192
|
+
async function applyPr(repo, proposalId, title, summary, diff) {
|
|
193
|
+
if (!isRepo(repo)) {
|
|
194
|
+
return { ok: false, detail: `not a git repository: ${repo}` };
|
|
195
|
+
}
|
|
196
|
+
// First apply the patch to a new branch (same isolation as 'patch' kind).
|
|
197
|
+
if (diff && diff.trim()) {
|
|
198
|
+
const patchResult = await applyPatch(repo, proposalId, diff);
|
|
199
|
+
if (!patchResult.ok) {
|
|
200
|
+
return { ok: false, detail: `patch step failed: ${patchResult.detail}` };
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// The branch was created by applyPatch above (same full-id naming).
|
|
204
|
+
const branch = `${PROPOSAL_BRANCH_PREFIX}${proposalId}`;
|
|
205
|
+
// Call the gated M18 createPr — EXPLICIT path, never auto.
|
|
206
|
+
const prResult = await createPr(repo, {
|
|
207
|
+
title,
|
|
208
|
+
body: summary,
|
|
209
|
+
head: branch,
|
|
210
|
+
});
|
|
211
|
+
if (!prResult.ok) {
|
|
212
|
+
return { ok: false, detail: `gh pr create failed: ${prResult.detail}` };
|
|
213
|
+
}
|
|
214
|
+
return {
|
|
215
|
+
ok: true,
|
|
216
|
+
detail: prResult.detail,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// applyProposal — the ONLY outward path
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
/**
|
|
223
|
+
* Apply an approved proposal. This is the ONLY outward mutation path in v2.
|
|
224
|
+
*
|
|
225
|
+
* REFUSES (ok:false, mutates nothing) unless ALL hold:
|
|
226
|
+
* 1. Proposal exists (loadProposal !== null)
|
|
227
|
+
* 2. proposal.status === 'approved'
|
|
228
|
+
* 3. opts.confirmed === true
|
|
229
|
+
*
|
|
230
|
+
* Never throws — all failures returned as ApplyResult with status 'failed'.
|
|
231
|
+
*/
|
|
232
|
+
export async function applyProposal(id, opts) {
|
|
233
|
+
// ── Gate 1: proposal must exist ──────────────────────────────────────────
|
|
234
|
+
const proposal = loadProposal(id);
|
|
235
|
+
if (!proposal) {
|
|
236
|
+
audit({
|
|
237
|
+
action: 'inbox:apply',
|
|
238
|
+
repo: null,
|
|
239
|
+
sandboxId: id,
|
|
240
|
+
summary: `refused: proposal ${id} not found`,
|
|
241
|
+
result: 'refused',
|
|
242
|
+
});
|
|
243
|
+
return {
|
|
244
|
+
ok: false,
|
|
245
|
+
status: 'failed',
|
|
246
|
+
detail: `proposal not found: ${id}`,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// ── Gate 2: must be approved ─────────────────────────────────────────────
|
|
250
|
+
if (proposal.status !== 'approved') {
|
|
251
|
+
audit({
|
|
252
|
+
action: 'inbox:apply',
|
|
253
|
+
repo: proposal.repo,
|
|
254
|
+
sandboxId: id,
|
|
255
|
+
summary: `refused: proposal ${id} status is '${proposal.status}', must be 'approved'`,
|
|
256
|
+
result: 'refused',
|
|
257
|
+
});
|
|
258
|
+
return {
|
|
259
|
+
ok: false,
|
|
260
|
+
status: proposal.status,
|
|
261
|
+
detail: `proposal status is '${proposal.status}'; must be 'approved' before applying`,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
// ── Gate 3: must be explicitly confirmed ─────────────────────────────────
|
|
265
|
+
if (!opts.confirmed) {
|
|
266
|
+
audit({
|
|
267
|
+
action: 'inbox:apply',
|
|
268
|
+
repo: proposal.repo,
|
|
269
|
+
sandboxId: id,
|
|
270
|
+
summary: `refused: proposal ${id} apply not confirmed`,
|
|
271
|
+
result: 'refused',
|
|
272
|
+
});
|
|
273
|
+
return {
|
|
274
|
+
ok: false,
|
|
275
|
+
status: 'approved',
|
|
276
|
+
detail: 'apply not confirmed; pass confirmed:true (via --yes or interactive prompt)',
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
// ── Gate 4: 'note' kind — no-op, record and return ───────────────────────
|
|
280
|
+
if (proposal.kind === 'note') {
|
|
281
|
+
setStatus(id, 'applied', 'note recorded (no-op)');
|
|
282
|
+
audit({
|
|
283
|
+
action: 'inbox:apply',
|
|
284
|
+
repo: proposal.repo,
|
|
285
|
+
sandboxId: id,
|
|
286
|
+
summary: `note proposal ${id} applied (no-op)`,
|
|
287
|
+
result: 'ok',
|
|
288
|
+
});
|
|
289
|
+
return { ok: true, status: 'applied', detail: 'note recorded (no-op)' };
|
|
290
|
+
}
|
|
291
|
+
// ── Gate 5: enrollment + kill switch ─────────────────────────────────────
|
|
292
|
+
// 'note' is exempt (never mutates). All other kinds require enrollment.
|
|
293
|
+
const repo = proposal.repo;
|
|
294
|
+
if (!repo) {
|
|
295
|
+
const detail = 'proposal has no repo; cannot apply a mutating kind without a target repo';
|
|
296
|
+
setStatus(id, 'failed', detail);
|
|
297
|
+
audit({
|
|
298
|
+
action: 'inbox:apply',
|
|
299
|
+
repo: null,
|
|
300
|
+
sandboxId: id,
|
|
301
|
+
summary: `failed: ${detail}`,
|
|
302
|
+
result: 'error',
|
|
303
|
+
});
|
|
304
|
+
return { ok: false, status: 'failed', detail };
|
|
305
|
+
}
|
|
306
|
+
try {
|
|
307
|
+
assertMayMutate(repo);
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
const detail = err instanceof Error ? err.message : String(err);
|
|
311
|
+
// REFUSAL — not a failure. Nothing was mutated and the proposal remains
|
|
312
|
+
// 'approved' so it can be retried after enrolling / clearing the kill switch.
|
|
313
|
+
// Advancing to 'failed' here would wrongly burn an approved proposal.
|
|
314
|
+
audit({
|
|
315
|
+
action: 'inbox:apply',
|
|
316
|
+
repo,
|
|
317
|
+
sandboxId: id,
|
|
318
|
+
summary: `refused by policy gate: ${detail}`,
|
|
319
|
+
result: 'refused',
|
|
320
|
+
});
|
|
321
|
+
return { ok: false, status: 'approved', detail };
|
|
322
|
+
}
|
|
323
|
+
// ── Dispatch by kind ─────────────────────────────────────────────────────
|
|
324
|
+
let result;
|
|
325
|
+
try {
|
|
326
|
+
switch (proposal.kind) {
|
|
327
|
+
case 'patch': {
|
|
328
|
+
if (!proposal.diff) {
|
|
329
|
+
result = { ok: false, detail: 'proposal has no diff to apply' };
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
result = await applyPatch(repo, id, proposal.diff);
|
|
333
|
+
}
|
|
334
|
+
break;
|
|
335
|
+
}
|
|
336
|
+
case 'pr': {
|
|
337
|
+
result = await applyPr(repo, id, proposal.title, proposal.summary, proposal.diff);
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
case 'deploy': {
|
|
341
|
+
// The gated ship/deploy path. Attempt to load the ship module dynamically
|
|
342
|
+
// so this module stays importable even before the ship module exists.
|
|
343
|
+
// The deploy gate requires its own --confirm per the contract.
|
|
344
|
+
try {
|
|
345
|
+
// Dynamic import via indirection so TypeScript's static module resolver
|
|
346
|
+
// does not error on the not-yet-implemented ship.ts. At runtime this
|
|
347
|
+
// resolves correctly when ship.ts is present, and falls back to null.
|
|
348
|
+
const shipPath = new URL('../ship.js', import.meta.url).href;
|
|
349
|
+
const shipMod = await new Function('p', 'return import(p)')(shipPath).catch(() => null);
|
|
350
|
+
const shipObj = (shipMod !== null && typeof shipMod === 'object')
|
|
351
|
+
? shipMod
|
|
352
|
+
: null;
|
|
353
|
+
if (!shipObj || typeof shipObj['ship'] !== 'function') {
|
|
354
|
+
result = {
|
|
355
|
+
ok: false,
|
|
356
|
+
detail: 'deploy kind requires the ship module (core/ship.ts) — not yet available in this build',
|
|
357
|
+
};
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
// The ship function is itself gated; pass confirmed:true since we
|
|
361
|
+
// already confirmed at the inbox layer.
|
|
362
|
+
const shipFn = shipObj['ship'];
|
|
363
|
+
const shipResult = await shipFn(repo, { confirmed: true });
|
|
364
|
+
result = shipResult;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
catch (err) {
|
|
368
|
+
result = {
|
|
369
|
+
ok: false,
|
|
370
|
+
detail: `deploy failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
break;
|
|
374
|
+
}
|
|
375
|
+
default: {
|
|
376
|
+
// Exhaustiveness guard — should never reach here given the type.
|
|
377
|
+
result = {
|
|
378
|
+
ok: false,
|
|
379
|
+
detail: `unknown proposal kind: ${String(proposal.kind)}`,
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
catch (err) {
|
|
385
|
+
// Belt-and-suspenders: the dispatch must never throw out.
|
|
386
|
+
result = {
|
|
387
|
+
ok: false,
|
|
388
|
+
detail: `unexpected error: ${err instanceof Error ? err.message : String(err)}`,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
// ── Persist outcome + audit ───────────────────────────────────────────────
|
|
392
|
+
const finalStatus = result.ok ? 'applied' : 'failed';
|
|
393
|
+
setStatus(id, finalStatus, result.detail);
|
|
394
|
+
audit({
|
|
395
|
+
action: 'inbox:apply',
|
|
396
|
+
repo,
|
|
397
|
+
sandboxId: id,
|
|
398
|
+
summary: `proposal ${id} (${proposal.kind}) ${finalStatus}: ${result.detail}`,
|
|
399
|
+
result: result.ok ? 'ok' : 'error',
|
|
400
|
+
});
|
|
401
|
+
return {
|
|
402
|
+
ok: result.ok,
|
|
403
|
+
status: finalStatus,
|
|
404
|
+
detail: result.detail,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../../src/core/inbox/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M32: new-proposal notification fan-out — desktop (macOS, opt-in) + the
|
|
3
|
+
* existing webhook notify() (opt-in), fired when an UNATTENDED path (daemon
|
|
4
|
+
* tick, background swarm) creates a PENDING proposal.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately OUTSIDE inbox/store.ts (whose contract is pure persistence).
|
|
7
|
+
* METADATA ONLY: title/kind/id — never the diff, never repo contents.
|
|
8
|
+
* Best-effort and never throws; failures are silent (notification is a
|
|
9
|
+
* convenience, not a control path).
|
|
10
|
+
*/
|
|
11
|
+
import type { AshlrConfig, Proposal } from '../types.js';
|
|
12
|
+
/** Fire desktop + webhook notifications for a newly created proposal. */
|
|
13
|
+
export declare function notifyNewProposal(proposal: Proposal, cfg: AshlrConfig): Promise<void>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M32: new-proposal notification fan-out — desktop (macOS, opt-in) + the
|
|
3
|
+
* existing webhook notify() (opt-in), fired when an UNATTENDED path (daemon
|
|
4
|
+
* tick, background swarm) creates a PENDING proposal.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately OUTSIDE inbox/store.ts (whose contract is pure persistence).
|
|
7
|
+
* METADATA ONLY: title/kind/id — never the diff, never repo contents.
|
|
8
|
+
* Best-effort and never throws; failures are silent (notification is a
|
|
9
|
+
* convenience, not a control path).
|
|
10
|
+
*/
|
|
11
|
+
import { desktopNotify } from '../integrations/desktop-notify.js';
|
|
12
|
+
import { notify } from '../integrations/notify.js';
|
|
13
|
+
/** Fire desktop + webhook notifications for a newly created proposal. */
|
|
14
|
+
export async function notifyNewProposal(proposal, cfg) {
|
|
15
|
+
const line = `[${proposal.kind}] ${proposal.title} — review: ashlr inbox show ${proposal.id}`;
|
|
16
|
+
await Promise.all([
|
|
17
|
+
desktopNotify('ashlr: new proposal', line, cfg).catch(() => false),
|
|
18
|
+
notify(`ashlr: new pending proposal ${line}`, cfg).catch(() => false),
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=notify-proposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notify-proposal.js","sourceRoot":"","sources":["../../../src/core/inbox/notify-proposal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAAkB,EAAE,GAAgB;IAC1E,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,KAAK,+BAA+B,QAAQ,CAAC,EAAE,EAAE,CAAC;IAC9F,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,aAAa,CAAC,qBAAqB,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;QAClE,MAAM,CAAC,+BAA+B,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;KACtE,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* store.ts — Proposal persistence for the M23 approval inbox.
|
|
3
|
+
*
|
|
4
|
+
* Persists one proposal per file at ~/.ashlr/inbox/<id>.json.
|
|
5
|
+
*
|
|
6
|
+
* GUARDRAILS:
|
|
7
|
+
* - PURE PERSISTENCE: never applies anything, never mutates a repo, never
|
|
8
|
+
* auto-advances status. Status changes happen ONLY through setStatus().
|
|
9
|
+
* - Never throws: all exported functions swallow errors and return safe
|
|
10
|
+
* defaults (null / [] / 0) so callers remain unblocked.
|
|
11
|
+
* - Atomic write: write to <id>.json.tmp then rename, matching the pattern
|
|
12
|
+
* in core/portfolio/backlog.ts.
|
|
13
|
+
* - No secrets stored: diffs contain user-owned code (fine); tokens/keys are
|
|
14
|
+
* not proposal fields. audit() strips secrets defensively on its side.
|
|
15
|
+
*/
|
|
16
|
+
import type { Proposal, ProposalStatus } from '../types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Absolute path to the inbox directory: ~/.ashlr/inbox.
|
|
19
|
+
* Created lazily by createProposal / setStatus — this function does NOT
|
|
20
|
+
* create it.
|
|
21
|
+
*/
|
|
22
|
+
export declare function inboxDir(): string;
|
|
23
|
+
/**
|
|
24
|
+
* Create a new proposal, persist it, audit the creation, and return it.
|
|
25
|
+
*
|
|
26
|
+
* Assigns:
|
|
27
|
+
* - `id` — fresh unique slug (stable, filename-safe)
|
|
28
|
+
* - `status` — 'pending'
|
|
29
|
+
* - `createdAt` — current ISO timestamp
|
|
30
|
+
*
|
|
31
|
+
* NEVER applies or mutates any repo.
|
|
32
|
+
* Never throws — on persistence failure the in-memory proposal is still
|
|
33
|
+
* returned (best-effort).
|
|
34
|
+
*/
|
|
35
|
+
export declare function createProposal(p: Omit<Proposal, 'id' | 'status' | 'createdAt'>): Proposal;
|
|
36
|
+
/**
|
|
37
|
+
* List all persisted proposals, most-recent first by `createdAt`.
|
|
38
|
+
* Optionally filter by status.
|
|
39
|
+
*
|
|
40
|
+
* Read-only. Unreadable / corrupt files are silently skipped.
|
|
41
|
+
* Never throws.
|
|
42
|
+
*/
|
|
43
|
+
export declare function listProposals(filter?: {
|
|
44
|
+
status?: ProposalStatus;
|
|
45
|
+
}): Proposal[];
|
|
46
|
+
/**
|
|
47
|
+
* Load a single proposal by id.
|
|
48
|
+
* Returns null if absent, unreadable, or malformed.
|
|
49
|
+
* Never throws.
|
|
50
|
+
*/
|
|
51
|
+
export declare function loadProposal(id: string): Proposal | null;
|
|
52
|
+
/**
|
|
53
|
+
* Persist a new status (and optional result detail) for an existing proposal.
|
|
54
|
+
*
|
|
55
|
+
* - Sets `decidedAt` to now when moving to 'approved' or 'rejected'.
|
|
56
|
+
* - No-op if the proposal does not exist or cannot be read.
|
|
57
|
+
* - NEVER applies anything — pure persistence change only.
|
|
58
|
+
* - Audits the decision.
|
|
59
|
+
* - Never throws.
|
|
60
|
+
*/
|
|
61
|
+
export declare function setStatus(id: string, status: ProposalStatus, result?: string): void;
|
|
62
|
+
/**
|
|
63
|
+
* Count proposals with status === 'pending'.
|
|
64
|
+
* Read-only. Returns 0 on any error.
|
|
65
|
+
* Never throws.
|
|
66
|
+
*/
|
|
67
|
+
export declare function pendingCount(): number;
|