@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 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/core/learn/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tuning.ts — M26 PROPOSAL-ONLY routing/policy/prompt tuning suggestions.
|
|
3
|
+
*
|
|
4
|
+
* Derives tuning suggestions from a deterministic ReflectionReport and — only
|
|
5
|
+
* when explicitly asked — routes them to the M23 Approval Inbox as PENDING
|
|
6
|
+
* proposals. It NEVER auto-applies anything.
|
|
7
|
+
*
|
|
8
|
+
* HARD SAFETY INVARIANTS (M26) — paramount:
|
|
9
|
+
* - PROPOSAL-ONLY. The ONLY sink is the inbox via createProposal (status
|
|
10
|
+
* pending). There is NO code path here that writes the global config path,
|
|
11
|
+
* saves config, or mutates routing policy or prompts. Suggestions reason
|
|
12
|
+
* ABOUT routing but never change it. Each proposal is kind 'note' (a no-op
|
|
13
|
+
* record that, even when applied, mutates nothing).
|
|
14
|
+
* - DETERMINISTIC. deriveTuning() is pure over the report — no LLM, no network.
|
|
15
|
+
* - NO OUTWARD ACTION. Proposals sit pending; nothing is shipped or deployed.
|
|
16
|
+
* - BOUNDED. Caps the number of suggestions emitted.
|
|
17
|
+
* - NEVER THROWS. Degrades to [] / a no-op emit.
|
|
18
|
+
*
|
|
19
|
+
* METADATA ONLY — proposals carry titles + rationale grounded in metrics; never
|
|
20
|
+
* secret values, never raw payloads.
|
|
21
|
+
*/
|
|
22
|
+
import type { Proposal, ReflectionReport, TuningProposal } from '../types.js';
|
|
23
|
+
/**
|
|
24
|
+
* Derive PROPOSAL-ONLY tuning suggestions from a ReflectionReport. Pure over
|
|
25
|
+
* the report; never throws; never mutates anything; makes ZERO I/O or network
|
|
26
|
+
* calls. Returns at most MAX_TUNING suggestions, highest-confidence first.
|
|
27
|
+
*
|
|
28
|
+
* Heuristics (deterministic, grounded in report metrics):
|
|
29
|
+
* - High localShare + zero cloud spend -> "raise local-first threshold".
|
|
30
|
+
* - A recurring failure cluster -> "add a playbook for failure Y".
|
|
31
|
+
* - A category succeeding ~every time -> "lower retry cap for category X".
|
|
32
|
+
* - A category far costlier than the fleet -> "flag over-budget category X".
|
|
33
|
+
* - Effectiveness regressed vs prior -> "review recent routing/policy".
|
|
34
|
+
*
|
|
35
|
+
* NOTE: every suggestion only DESCRIBES a possible change. Nothing here applies
|
|
36
|
+
* it — emitTuningProposals() routes them to the inbox as inert pending notes.
|
|
37
|
+
*/
|
|
38
|
+
export declare function deriveTuning(report: ReflectionReport): TuningProposal[];
|
|
39
|
+
/**
|
|
40
|
+
* Convert derived TuningProposals into PENDING M23 inbox proposals via
|
|
41
|
+
* createProposal(). Returns the created Proposal records.
|
|
42
|
+
*
|
|
43
|
+
* GUARDRAIL: this is the ONLY outward sink for tuning. Each proposal is created
|
|
44
|
+
* with kind 'note' (a no-op record — applying it mutates NOTHING), origin
|
|
45
|
+
* 'manual', repo null, status 'pending'. There is NO path here that touches the
|
|
46
|
+
* global config, routing policy, or prompts. Never throws.
|
|
47
|
+
*/
|
|
48
|
+
export declare function emitTuningProposals(suggestions: TuningProposal[]): Proposal[];
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* tuning.ts — M26 PROPOSAL-ONLY routing/policy/prompt tuning suggestions.
|
|
3
|
+
*
|
|
4
|
+
* Derives tuning suggestions from a deterministic ReflectionReport and — only
|
|
5
|
+
* when explicitly asked — routes them to the M23 Approval Inbox as PENDING
|
|
6
|
+
* proposals. It NEVER auto-applies anything.
|
|
7
|
+
*
|
|
8
|
+
* HARD SAFETY INVARIANTS (M26) — paramount:
|
|
9
|
+
* - PROPOSAL-ONLY. The ONLY sink is the inbox via createProposal (status
|
|
10
|
+
* pending). There is NO code path here that writes the global config path,
|
|
11
|
+
* saves config, or mutates routing policy or prompts. Suggestions reason
|
|
12
|
+
* ABOUT routing but never change it. Each proposal is kind 'note' (a no-op
|
|
13
|
+
* record that, even when applied, mutates nothing).
|
|
14
|
+
* - DETERMINISTIC. deriveTuning() is pure over the report — no LLM, no network.
|
|
15
|
+
* - NO OUTWARD ACTION. Proposals sit pending; nothing is shipped or deployed.
|
|
16
|
+
* - BOUNDED. Caps the number of suggestions emitted.
|
|
17
|
+
* - NEVER THROWS. Degrades to [] / a no-op emit.
|
|
18
|
+
*
|
|
19
|
+
* METADATA ONLY — proposals carry titles + rationale grounded in metrics; never
|
|
20
|
+
* secret values, never raw payloads.
|
|
21
|
+
*/
|
|
22
|
+
import { createProposal } from '../inbox/store.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Bounds
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
/** Max tuning suggestions derived/emitted per reflection. */
|
|
27
|
+
const MAX_TUNING = 6;
|
|
28
|
+
/** Minimum analyzed swarms before any quantitative heuristic fires (avoids
|
|
29
|
+
* drawing conclusions from a 1-2 run sample). */
|
|
30
|
+
const MIN_SAMPLE = 3;
|
|
31
|
+
/** A localShare at/above this with zero cloud spend => the org is already
|
|
32
|
+
* local-first; suggest raising the local-first routing threshold. */
|
|
33
|
+
const HIGH_LOCAL_SHARE = 0.9;
|
|
34
|
+
/** A failure cluster this size (or larger) is "recurring" => playbook-worthy. */
|
|
35
|
+
const RECURRING_FAILURE_MIN = 2;
|
|
36
|
+
/** A category costing at least this multiple of the fleet average looks
|
|
37
|
+
* over-provisioned => flag as over-budget. */
|
|
38
|
+
const OVER_BUDGET_MULTIPLE = 1.75;
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Pure derivation (exported for testing) — NO I/O, NO LLM, NO MUTATION
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/** Round a 0..1 confidence to 2 decimals, clamped into [0,1]. */
|
|
43
|
+
function clampConfidence(n) {
|
|
44
|
+
if (!Number.isFinite(n))
|
|
45
|
+
return 0;
|
|
46
|
+
const c = Math.max(0, Math.min(1, n));
|
|
47
|
+
return Math.round(c * 100) / 100;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Derive PROPOSAL-ONLY tuning suggestions from a ReflectionReport. Pure over
|
|
51
|
+
* the report; never throws; never mutates anything; makes ZERO I/O or network
|
|
52
|
+
* calls. Returns at most MAX_TUNING suggestions, highest-confidence first.
|
|
53
|
+
*
|
|
54
|
+
* Heuristics (deterministic, grounded in report metrics):
|
|
55
|
+
* - High localShare + zero cloud spend -> "raise local-first threshold".
|
|
56
|
+
* - A recurring failure cluster -> "add a playbook for failure Y".
|
|
57
|
+
* - A category succeeding ~every time -> "lower retry cap for category X".
|
|
58
|
+
* - A category far costlier than the fleet -> "flag over-budget category X".
|
|
59
|
+
* - Effectiveness regressed vs prior -> "review recent routing/policy".
|
|
60
|
+
*
|
|
61
|
+
* NOTE: every suggestion only DESCRIBES a possible change. Nothing here applies
|
|
62
|
+
* it — emitTuningProposals() routes them to the inbox as inert pending notes.
|
|
63
|
+
*/
|
|
64
|
+
export function deriveTuning(report) {
|
|
65
|
+
const out = [];
|
|
66
|
+
try {
|
|
67
|
+
const analyzed = report.swarmsAnalyzed | 0;
|
|
68
|
+
// -- 1. Routing: already local-first => suggest raising the threshold. ----
|
|
69
|
+
// Only when we have a real sample, the local share is dominant, and there
|
|
70
|
+
// was no cloud spend to justify keeping headroom for escalation.
|
|
71
|
+
if (analyzed >= MIN_SAMPLE &&
|
|
72
|
+
report.localShare >= HIGH_LOCAL_SHARE &&
|
|
73
|
+
report.totalCostUsd <= 0) {
|
|
74
|
+
const localPct = Math.round(report.localShare * 100);
|
|
75
|
+
out.push({
|
|
76
|
+
key: 'routing.local-first-threshold',
|
|
77
|
+
area: 'routing',
|
|
78
|
+
title: 'Raise the local-first routing threshold',
|
|
79
|
+
rationale: `${localPct}% of token usage already ran on LOCAL providers across ` +
|
|
80
|
+
`${analyzed} swarms with $0 cloud spend. Routing could bias even more ` +
|
|
81
|
+
`work to local models before escalating to cloud. (Suggestion only — ` +
|
|
82
|
+
`routing is not changed.)`,
|
|
83
|
+
// More confident the larger the sample and the higher the local share.
|
|
84
|
+
confidence: clampConfidence(0.4 + report.localShare * 0.4 + (Math.min(analyzed, 20) / 20) * 0.2),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
// -- 2. Playbook: recurring failure clusters => suggest a playbook. -------
|
|
88
|
+
for (const fm of report.topFailures ?? []) {
|
|
89
|
+
if (fm.count < RECURRING_FAILURE_MIN)
|
|
90
|
+
continue;
|
|
91
|
+
const phases = (fm.phases ?? []).filter(Boolean);
|
|
92
|
+
const where = phases.length ? ` (most often in phase ${phases[0]})` : '';
|
|
93
|
+
out.push({
|
|
94
|
+
key: `playbook.failure.${fm.key}`,
|
|
95
|
+
area: 'playbook',
|
|
96
|
+
title: `Add a playbook for recurring failure: ${fm.label}`,
|
|
97
|
+
rationale: `"${fm.label}" recurred ${fm.count} time(s)${where}. A distilled ` +
|
|
98
|
+
`playbook capturing the fix would auto-inject into future agents and ` +
|
|
99
|
+
`reduce repeat failures.`,
|
|
100
|
+
// Confidence scales with how often the failure recurred (caps at 1.0).
|
|
101
|
+
confidence: clampConfidence(0.45 + (Math.min(fm.count, 8) / 8) * 0.45),
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
// -- 3/4. Per-category retry + budget heuristics. ------------------------
|
|
105
|
+
const cats = report.goalCategories ?? [];
|
|
106
|
+
const fleetAvgCost = report.avgCostUsd;
|
|
107
|
+
for (const cat of cats) {
|
|
108
|
+
// 3. A category that essentially always succeeds first-try => the retry
|
|
109
|
+
// cap for that kind of work is likely larger than needed.
|
|
110
|
+
if (cat.swarms >= MIN_SAMPLE && cat.successRate >= 1) {
|
|
111
|
+
out.push({
|
|
112
|
+
key: `policy.retry-cap.${cat.category}`,
|
|
113
|
+
area: 'policy',
|
|
114
|
+
title: `Lower the retry cap for "${cat.category}" work`,
|
|
115
|
+
rationale: `"${cat.category}" succeeded on ${cat.swarms}/${cat.swarms} swarms ` +
|
|
116
|
+
`(100%). Retries for this category may rarely fire — a lower retry ` +
|
|
117
|
+
`cap could cut wasted steps with little risk. (Suggestion only.)`,
|
|
118
|
+
confidence: clampConfidence(0.35 + (Math.min(cat.swarms, 12) / 12) * 0.4),
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
// 4. A category costing far more than the fleet average => flag it.
|
|
122
|
+
if (cat.swarms >= MIN_SAMPLE &&
|
|
123
|
+
fleetAvgCost > 0 &&
|
|
124
|
+
cat.avgCostUsd >= fleetAvgCost * OVER_BUDGET_MULTIPLE) {
|
|
125
|
+
const x = cat.avgCostUsd / fleetAvgCost;
|
|
126
|
+
out.push({
|
|
127
|
+
key: `policy.budget.${cat.category}`,
|
|
128
|
+
area: 'policy',
|
|
129
|
+
title: `Flag over-budget goal category: "${cat.category}"`,
|
|
130
|
+
rationale: `"${cat.category}" averaged $${cat.avgCostUsd.toFixed(4)} per swarm ` +
|
|
131
|
+
`— ${x.toFixed(1)}x the fleet average of ` +
|
|
132
|
+
`$${fleetAvgCost.toFixed(4)}. Worth a budget cap or a cheaper ` +
|
|
133
|
+
`routing tier for this category. (Suggestion only.)`,
|
|
134
|
+
confidence: clampConfidence(0.4 + (Math.min(x - 1, 3) / 3) * 0.4),
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// -- 5. Regression watch: effectiveness dropped week-over-week. ----------
|
|
139
|
+
const eff = report.delta?.effectivenessPct;
|
|
140
|
+
if (analyzed >= MIN_SAMPLE && typeof eff === 'number' && eff <= -10) {
|
|
141
|
+
out.push({
|
|
142
|
+
key: 'policy.effectiveness-regression',
|
|
143
|
+
area: 'policy',
|
|
144
|
+
title: 'Review recent routing/policy: effectiveness regressed',
|
|
145
|
+
rationale: `Success rate fell ${Math.abs(Math.round(eff))} points vs the prior ` +
|
|
146
|
+
`snapshot. Recent routing or policy changes may be worth reviewing. ` +
|
|
147
|
+
`(Suggestion only — nothing is reverted.)`,
|
|
148
|
+
confidence: clampConfidence(0.4 + (Math.min(Math.abs(eff), 50) / 50) * 0.4),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Highest-confidence first, then stable by key. Bounded by MAX_TUNING.
|
|
152
|
+
out.sort((a, b) => b.confidence - a.confidence || a.key.localeCompare(b.key));
|
|
153
|
+
return out.slice(0, MAX_TUNING);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return [];
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// ---------------------------------------------------------------------------
|
|
160
|
+
// Public: emit to the Approval Inbox (the SOLE sink)
|
|
161
|
+
// ---------------------------------------------------------------------------
|
|
162
|
+
/**
|
|
163
|
+
* Convert derived TuningProposals into PENDING M23 inbox proposals via
|
|
164
|
+
* createProposal(). Returns the created Proposal records.
|
|
165
|
+
*
|
|
166
|
+
* GUARDRAIL: this is the ONLY outward sink for tuning. Each proposal is created
|
|
167
|
+
* with kind 'note' (a no-op record — applying it mutates NOTHING), origin
|
|
168
|
+
* 'manual', repo null, status 'pending'. There is NO path here that touches the
|
|
169
|
+
* global config, routing policy, or prompts. Never throws.
|
|
170
|
+
*/
|
|
171
|
+
export function emitTuningProposals(suggestions) {
|
|
172
|
+
const created = [];
|
|
173
|
+
try {
|
|
174
|
+
// Bounded defensively even though deriveTuning already caps the input.
|
|
175
|
+
for (const s of (suggestions ?? []).slice(0, MAX_TUNING)) {
|
|
176
|
+
try {
|
|
177
|
+
const pct = Math.round(clampConfidence(s.confidence) * 100);
|
|
178
|
+
const proposal = createProposal({
|
|
179
|
+
repo: null,
|
|
180
|
+
origin: 'manual',
|
|
181
|
+
// 'note' is a no-op record: approving/applying it mutates NOTHING.
|
|
182
|
+
kind: 'note',
|
|
183
|
+
title: `[tuning] ${s.title}`,
|
|
184
|
+
summary: `${s.rationale}\n\n` +
|
|
185
|
+
`area: ${s.area} · key: ${s.key} · confidence: ${pct}%\n` +
|
|
186
|
+
`This is a tuning SUGGESTION only — approving it records the ` +
|
|
187
|
+
`decision but changes no configuration, routing, policy, or prompt.`,
|
|
188
|
+
});
|
|
189
|
+
created.push(proposal);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
// Skip a single failed proposal; keep emitting the rest.
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return created;
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
return created;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=tuning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tuning.js","sourceRoot":"","sources":["../../../src/core/learn/tuning.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAOH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,6DAA6D;AAC7D,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB;kDACkD;AAClD,MAAM,UAAU,GAAG,CAAC,CAAC;AAErB;sEACsE;AACtE,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,iFAAiF;AACjF,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC;+CAC+C;AAC/C,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAElC,8EAA8E;AAC9E,uEAAuE;AACvE,8EAA8E;AAE9E,iEAAiE;AACjE,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,YAAY,CAAC,MAAwB;IACnD,MAAM,GAAG,GAAqB,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;QAE3C,4EAA4E;QAC5E,0EAA0E;QAC1E,iEAAiE;QACjE,IACE,QAAQ,IAAI,UAAU;YACtB,MAAM,CAAC,UAAU,IAAI,gBAAgB;YACrC,MAAM,CAAC,YAAY,IAAI,CAAC,EACxB,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,+BAA+B;gBACpC,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,yCAAyC;gBAChD,SAAS,EACP,GAAG,QAAQ,yDAAyD;oBACpE,GAAG,QAAQ,4DAA4D;oBACvE,sEAAsE;oBACtE,0BAA0B;gBAC5B,uEAAuE;gBACvE,UAAU,EAAE,eAAe,CACzB,GAAG,GAAG,MAAM,CAAC,UAAU,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CACpE;aACF,CAAC,CAAC;QACL,CAAC;QAED,4EAA4E;QAC5E,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAC1C,IAAI,EAAE,CAAC,KAAK,GAAG,qBAAqB;gBAAE,SAAS;YAC/C,MAAM,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAyB,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,oBAAoB,EAAE,CAAC,GAAG,EAAE;gBACjC,IAAI,EAAE,UAAU;gBAChB,KAAK,EAAE,yCAAyC,EAAE,CAAC,KAAK,EAAE;gBAC1D,SAAS,EACP,IAAI,EAAE,CAAC,KAAK,cAAc,EAAE,CAAC,KAAK,WAAW,KAAK,gBAAgB;oBAClE,sEAAsE;oBACtE,yBAAyB;gBAC3B,uEAAuE;gBACvE,UAAU,EAAE,eAAe,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;aACvE,CAAC,CAAC;QACL,CAAC;QAED,2EAA2E;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,cAAc,IAAI,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC;QACvC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,wEAAwE;YACxE,6DAA6D;YAC7D,IAAI,GAAG,CAAC,MAAM,IAAI,UAAU,IAAI,GAAG,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrD,GAAG,CAAC,IAAI,CAAC;oBACP,GAAG,EAAE,oBAAoB,GAAG,CAAC,QAAQ,EAAE;oBACvC,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,4BAA4B,GAAG,CAAC,QAAQ,QAAQ;oBACvD,SAAS,EACP,IAAI,GAAG,CAAC,QAAQ,kBAAkB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,UAAU;wBACpE,oEAAoE;wBACpE,iEAAiE;oBACnE,UAAU,EAAE,eAAe,CACzB,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAC7C;iBACF,CAAC,CAAC;YACL,CAAC;YAED,oEAAoE;YACpE,IACE,GAAG,CAAC,MAAM,IAAI,UAAU;gBACxB,YAAY,GAAG,CAAC;gBAChB,GAAG,CAAC,UAAU,IAAI,YAAY,GAAG,oBAAoB,EACrD,CAAC;gBACD,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,GAAG,YAAY,CAAC;gBACxC,GAAG,CAAC,IAAI,CAAC;oBACP,GAAG,EAAE,iBAAiB,GAAG,CAAC,QAAQ,EAAE;oBACpC,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,oCAAoC,GAAG,CAAC,QAAQ,GAAG;oBAC1D,SAAS,EACP,IAAI,GAAG,CAAC,QAAQ,eAAe,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa;wBACrE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB;wBAC1C,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,oCAAoC;wBAC/D,oDAAoD;oBACtD,UAAU,EAAE,eAAe,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC;iBAClE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,2EAA2E;QAC3E,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC;QAC3C,IAAI,QAAQ,IAAI,UAAU,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YACpE,GAAG,CAAC,IAAI,CAAC;gBACP,GAAG,EAAE,iCAAiC;gBACtC,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,uDAAuD;gBAC9D,SAAS,EACP,qBAAqB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,uBAAuB;oBACrE,qEAAqE;oBACrE,0CAA0C;gBAC5C,UAAU,EAAE,eAAe,CACzB,GAAG,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,CAC/C;aACF,CAAC,CAAC;QACL,CAAC;QAED,uEAAuE;QACvE,GAAG,CAAC,IAAI,CACN,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CACpE,CAAC;QACF,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,qDAAqD;AACrD,8EAA8E;AAE9E;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAA6B;IAC/D,MAAM,OAAO,GAAe,EAAE,CAAC;IAC/B,IAAI,CAAC;QACH,uEAAuE;QACvE,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;gBAC5D,MAAM,QAAQ,GAAG,cAAc,CAAC;oBAC9B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,QAAQ;oBAChB,mEAAmE;oBACnE,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,YAAY,CAAC,CAAC,KAAK,EAAE;oBAC5B,OAAO,EACL,GAAG,CAAC,CAAC,SAAS,MAAM;wBACpB,SAAS,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,GAAG,kBAAkB,GAAG,KAAK;wBACzD,8DAA8D;wBAC9D,oEAAoE;iBACvE,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,yDAAyD;YAC3D,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M6: Project Lifecycle — Scaffolder
|
|
3
|
+
*
|
|
4
|
+
* Materializes a ProjectTemplate onto disk for `ashlr new`, then best-effort
|
|
5
|
+
* runs `git init` and registers the project in the ashlr index.
|
|
6
|
+
*
|
|
7
|
+
* SAFETY GUARDRAILS:
|
|
8
|
+
* - REFUSES to write if the target directory already exists (no clobber).
|
|
9
|
+
* - Writes ONLY under spec.dir; every TemplateFile path is resolved relative
|
|
10
|
+
* to spec.dir and rejected if it escapes the directory.
|
|
11
|
+
* - NEVER throws — all failures surface via the returned ScaffoldResult.
|
|
12
|
+
*/
|
|
13
|
+
import type { ScaffoldSpec, ScaffoldResult } from '../types.js';
|
|
14
|
+
/** The default category bucket for new projects. */
|
|
15
|
+
export declare function defaultCategory(): string;
|
|
16
|
+
/**
|
|
17
|
+
* The canonical root under which all scaffolded projects must live:
|
|
18
|
+
* ~/Desktop/github. Used as the allowed-root for the in-tree write guard.
|
|
19
|
+
*/
|
|
20
|
+
export declare function githubRoot(): string;
|
|
21
|
+
/**
|
|
22
|
+
* Resolve the canonical target directory for a project under the
|
|
23
|
+
* ~/Desktop/github/<category>/<name> tree.
|
|
24
|
+
*/
|
|
25
|
+
export declare function targetDir(name: string, category: string): string;
|
|
26
|
+
/** Synchronous index-registration function shape (injectable for tests). */
|
|
27
|
+
export type IndexRegistrar = () => {
|
|
28
|
+
registered: boolean;
|
|
29
|
+
warning?: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Scaffold a project from its template into spec.dir.
|
|
33
|
+
*
|
|
34
|
+
* Returns a ScaffoldResult; never throws. Index registration runs
|
|
35
|
+
* SYNCHRONOUSLY before returning, so `result.registered` deterministically
|
|
36
|
+
* reflects the real outcome (M6 contract).
|
|
37
|
+
*
|
|
38
|
+
* @param register Optional injected registrar (defaults to the real
|
|
39
|
+
* createRequire-based synchronous registration). Tests inject a stub here
|
|
40
|
+
* because vitest's `vi.mock` intercepts dynamic `import()` but NOT
|
|
41
|
+
* `createRequire`, so the real index-engine cannot be mocked otherwise.
|
|
42
|
+
*/
|
|
43
|
+
export declare function scaffoldProject(spec: ScaffoldSpec, register?: IndexRegistrar): ScaffoldResult;
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M6: Project Lifecycle — Scaffolder
|
|
3
|
+
*
|
|
4
|
+
* Materializes a ProjectTemplate onto disk for `ashlr new`, then best-effort
|
|
5
|
+
* runs `git init` and registers the project in the ashlr index.
|
|
6
|
+
*
|
|
7
|
+
* SAFETY GUARDRAILS:
|
|
8
|
+
* - REFUSES to write if the target directory already exists (no clobber).
|
|
9
|
+
* - Writes ONLY under spec.dir; every TemplateFile path is resolved relative
|
|
10
|
+
* to spec.dir and rejected if it escapes the directory.
|
|
11
|
+
* - NEVER throws — all failures surface via the returned ScaffoldResult.
|
|
12
|
+
*/
|
|
13
|
+
import { execSync } from 'node:child_process';
|
|
14
|
+
import { existsSync, mkdirSync, writeFileSync, chmodSync, } from 'node:fs';
|
|
15
|
+
import { createRequire } from 'node:module';
|
|
16
|
+
import { homedir } from 'node:os';
|
|
17
|
+
import { dirname, isAbsolute, join, relative, resolve, sep, } from 'node:path';
|
|
18
|
+
import { getTemplate } from './templates.js';
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Path helpers
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
/** The default category bucket for new projects. */
|
|
23
|
+
export function defaultCategory() {
|
|
24
|
+
return 'side-projects';
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The canonical root under which all scaffolded projects must live:
|
|
28
|
+
* ~/Desktop/github. Used as the allowed-root for the in-tree write guard.
|
|
29
|
+
*/
|
|
30
|
+
export function githubRoot() {
|
|
31
|
+
return resolve(join(homedir(), 'Desktop', 'github'));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the canonical target directory for a project under the
|
|
35
|
+
* ~/Desktop/github/<category>/<name> tree.
|
|
36
|
+
*/
|
|
37
|
+
export function targetDir(name, category) {
|
|
38
|
+
return resolve(join(homedir(), 'Desktop', 'github', category, name));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* True when `child` resolves to a path strictly inside `parent`
|
|
42
|
+
* (or equal to it). Used to keep all writes under spec.dir.
|
|
43
|
+
*/
|
|
44
|
+
function isInside(parent, child) {
|
|
45
|
+
const rel = relative(parent, child);
|
|
46
|
+
return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
|
|
47
|
+
}
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// git
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
function gitInit(dir) {
|
|
52
|
+
try {
|
|
53
|
+
execSync('git init', { cwd: dir, stdio: 'pipe', timeout: 30_000 });
|
|
54
|
+
return { ok: true };
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
58
|
+
return { ok: false, warning: `git init failed: ${msg}` };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// stack recipe detection (warning-only; provisioning is done by the CLI layer)
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
function stackInstalled() {
|
|
65
|
+
try {
|
|
66
|
+
const out = execSync('which stack 2>/dev/null', { encoding: 'utf8' }).trim();
|
|
67
|
+
return out.length > 0;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ---------------------------------------------------------------------------
|
|
74
|
+
// index registration (best-effort; never blocks scaffold success)
|
|
75
|
+
// ---------------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Register the new project in the ashlr index, SYNCHRONOUSLY.
|
|
78
|
+
*
|
|
79
|
+
* buildIndex / writeIndex / loadConfig are all synchronous in the real
|
|
80
|
+
* index-engine, so registration completes before scaffoldProject returns and
|
|
81
|
+
* the `registered` flag deterministically reflects the outcome (M6 contract).
|
|
82
|
+
*
|
|
83
|
+
* Modules are loaded via createRequire so this stays synchronous; failures and
|
|
84
|
+
* the (test-only) async-buildIndex case surface as a non-fatal warning with
|
|
85
|
+
* registered:false rather than blocking or throwing.
|
|
86
|
+
*/
|
|
87
|
+
function registerInIndex() {
|
|
88
|
+
try {
|
|
89
|
+
const require = createRequire(import.meta.url);
|
|
90
|
+
const indexMod = require('../index-engine.js');
|
|
91
|
+
let configMod = null;
|
|
92
|
+
try {
|
|
93
|
+
configMod = require('../config.js');
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
configMod = null;
|
|
97
|
+
}
|
|
98
|
+
const { buildIndex, writeIndex } = indexMod;
|
|
99
|
+
let cfg = undefined;
|
|
100
|
+
if (configMod && typeof configMod.loadConfig === 'function') {
|
|
101
|
+
try {
|
|
102
|
+
cfg = configMod.loadConfig();
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
cfg = undefined;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const built = buildIndex(cfg);
|
|
109
|
+
// The real buildIndex is synchronous. If a caller (or a test mock) returns a
|
|
110
|
+
// Promise, we cannot await it on this synchronous path — report it as a
|
|
111
|
+
// non-fatal skip rather than registering a half-built index.
|
|
112
|
+
if (built instanceof Promise) {
|
|
113
|
+
return {
|
|
114
|
+
registered: false,
|
|
115
|
+
warning: 'index registration skipped: buildIndex returned a Promise (async index-engine)',
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
writeIndex(built);
|
|
119
|
+
return { registered: true };
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
123
|
+
return { registered: false, warning: `index registration skipped: ${msg}` };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Scaffold a project from its template into spec.dir.
|
|
128
|
+
*
|
|
129
|
+
* Returns a ScaffoldResult; never throws. Index registration runs
|
|
130
|
+
* SYNCHRONOUSLY before returning, so `result.registered` deterministically
|
|
131
|
+
* reflects the real outcome (M6 contract).
|
|
132
|
+
*
|
|
133
|
+
* @param register Optional injected registrar (defaults to the real
|
|
134
|
+
* createRequire-based synchronous registration). Tests inject a stub here
|
|
135
|
+
* because vitest's `vi.mock` intercepts dynamic `import()` but NOT
|
|
136
|
+
* `createRequire`, so the real index-engine cannot be mocked otherwise.
|
|
137
|
+
*/
|
|
138
|
+
export function scaffoldProject(spec, register = registerInIndex) {
|
|
139
|
+
const result = {
|
|
140
|
+
ok: false,
|
|
141
|
+
dir: spec.dir,
|
|
142
|
+
filesWritten: [],
|
|
143
|
+
gitInitialized: false,
|
|
144
|
+
mcpWired: false,
|
|
145
|
+
registered: false,
|
|
146
|
+
warnings: [],
|
|
147
|
+
};
|
|
148
|
+
try {
|
|
149
|
+
// SAFETY (defense-in-depth): the write-performing layer self-defends. Refuse
|
|
150
|
+
// any spec.dir that is not the cwd-relative `--here` form AND not strictly
|
|
151
|
+
// inside ~/Desktop/github/. This stops out-of-tree creation even if a CLI
|
|
152
|
+
// caller forgets to validate (e.g. a crafted --category). spec.allowAnyRoot
|
|
153
|
+
// is the explicit opt-out used by hermetic tmp-dir tests.
|
|
154
|
+
if (!spec.allowAnyRoot) {
|
|
155
|
+
const root = githubRoot();
|
|
156
|
+
const inTree = spec.dir === root || spec.dir.startsWith(root + sep);
|
|
157
|
+
const here = isInside(resolve(process.cwd()), spec.dir);
|
|
158
|
+
if (!inTree && !here) {
|
|
159
|
+
result.error =
|
|
160
|
+
`Refusing to scaffold outside the github tree: ${spec.dir} ` +
|
|
161
|
+
`(allowed root: ${root}).`;
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// SAFETY: refuse to overwrite an existing directory.
|
|
166
|
+
if (existsSync(spec.dir)) {
|
|
167
|
+
result.error = `Target directory already exists: ${spec.dir}. Refusing to overwrite.`;
|
|
168
|
+
return result;
|
|
169
|
+
}
|
|
170
|
+
// Resolve the template.
|
|
171
|
+
const template = getTemplate(spec.templateId);
|
|
172
|
+
if (!template) {
|
|
173
|
+
result.error = `Unknown template: "${spec.templateId}".`;
|
|
174
|
+
return result;
|
|
175
|
+
}
|
|
176
|
+
// Build the file list.
|
|
177
|
+
let files;
|
|
178
|
+
try {
|
|
179
|
+
files = template.files({ name: spec.name, category: spec.category });
|
|
180
|
+
}
|
|
181
|
+
catch (err) {
|
|
182
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
183
|
+
result.error = `Template "${spec.templateId}" failed to produce files: ${msg}`;
|
|
184
|
+
return result;
|
|
185
|
+
}
|
|
186
|
+
// Create the root directory.
|
|
187
|
+
mkdirSync(spec.dir, { recursive: true });
|
|
188
|
+
// Write each file, guarding against path escape.
|
|
189
|
+
let mcpWired = false;
|
|
190
|
+
for (const file of files) {
|
|
191
|
+
const targetPath = resolve(spec.dir, file.path);
|
|
192
|
+
if (!isInside(spec.dir, targetPath)) {
|
|
193
|
+
result.warnings.push(`skipped file outside project dir: ${file.path}`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
mkdirSync(dirname(targetPath), { recursive: true });
|
|
197
|
+
writeFileSync(targetPath, file.content);
|
|
198
|
+
if (typeof file.mode === 'number') {
|
|
199
|
+
try {
|
|
200
|
+
chmodSync(targetPath, file.mode);
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
// mode is best-effort; ignore on platforms that reject it
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
result.filesWritten.push(targetPath);
|
|
207
|
+
// Detect the .mcp.json wiring the ashlr gateway.
|
|
208
|
+
if (targetPath === resolve(spec.dir, '.mcp.json')) {
|
|
209
|
+
try {
|
|
210
|
+
const parsed = JSON.parse(file.content);
|
|
211
|
+
if (parsed.mcpServers && 'ashlr' in parsed.mcpServers) {
|
|
212
|
+
mcpWired = true;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
// not valid JSON — leave mcpWired false
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
result.mcpWired = mcpWired;
|
|
221
|
+
// stack recipe: warn (only) when requested but stack is not installed.
|
|
222
|
+
if (spec.stackRecipe) {
|
|
223
|
+
if (!stackInstalled()) {
|
|
224
|
+
result.warnings.push(`stack recipe "${spec.stackRecipe}" requested but \`stack\` is not installed — skipping provisioning.`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// git init (best-effort).
|
|
228
|
+
if (spec.git) {
|
|
229
|
+
const git = gitInit(spec.dir);
|
|
230
|
+
result.gitInitialized = git.ok;
|
|
231
|
+
if (git.warning) {
|
|
232
|
+
result.warnings.push(git.warning);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// Index registration (synchronous — buildIndex/writeIndex are sync). Doing
|
|
236
|
+
// this inline makes `result.registered` deterministically reflect the real
|
|
237
|
+
// outcome before we return, satisfying the M6 contract. Never throws.
|
|
238
|
+
let reg;
|
|
239
|
+
try {
|
|
240
|
+
reg = register();
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
244
|
+
reg = { registered: false, warning: `index registration skipped: ${msg}` };
|
|
245
|
+
}
|
|
246
|
+
if (reg.warning) {
|
|
247
|
+
result.warnings.push(reg.warning);
|
|
248
|
+
}
|
|
249
|
+
result.registered = reg.registered;
|
|
250
|
+
result.ok = true;
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
catch (err) {
|
|
254
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
255
|
+
result.error = `Scaffold failed: ${msg}`;
|
|
256
|
+
result.ok = false;
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/core/lifecycle/scaffold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/lifecycle/ship.ts — pre-ship gate + optional deploy for `ashlr ship`.
|
|
3
|
+
*
|
|
4
|
+
* `runShipGate` is READ-ONLY: it scans, runs scripts, and reports.
|
|
5
|
+
* `deploy` is the ONLY place an outward action can happen, and ONLY when
|
|
6
|
+
* opts.confirm === true. Default is always dry-run.
|
|
7
|
+
*
|
|
8
|
+
* Both functions NEVER throw — errors are captured in ShipCheck / detail strings.
|
|
9
|
+
*/
|
|
10
|
+
import type { ShipGate } from '../types.js';
|
|
11
|
+
/**
|
|
12
|
+
* Run all pre-ship gate checks for the project at `projectPath`.
|
|
13
|
+
*
|
|
14
|
+
* READ-ONLY: scans files and runs npm scripts. Never deploys or pushes.
|
|
15
|
+
* Never throws — all errors are captured as ShipCheck fail/warn/skip entries.
|
|
16
|
+
*
|
|
17
|
+
* Checks run in order:
|
|
18
|
+
* 1. supply-chain — binshield (if installed) else built-in dep sanity check
|
|
19
|
+
* 2. test — npm run test (if script exists)
|
|
20
|
+
* 3. lint — npm run lint (if script exists)
|
|
21
|
+
* 4. build — npm run build (if script exists)
|
|
22
|
+
* 5. secrets — git-tracked .env files + obvious key patterns
|
|
23
|
+
*
|
|
24
|
+
* `passed` is true when no check has status 'fail'.
|
|
25
|
+
*/
|
|
26
|
+
export declare function runShipGate(projectPath: string, opts: {
|
|
27
|
+
strict: boolean;
|
|
28
|
+
}): Promise<ShipGate>;
|
|
29
|
+
/**
|
|
30
|
+
* Optionally deploy the project to the named target.
|
|
31
|
+
*
|
|
32
|
+
* DRY-RUN BY DEFAULT: only runs the real deploy command when `opts.confirm`
|
|
33
|
+
* is true. This is the ONLY function in the codebase that may execute an
|
|
34
|
+
* outward action.
|
|
35
|
+
*
|
|
36
|
+
* Supported targets: vercel | stack | morphkit | gh
|
|
37
|
+
* Detect every tool at runtime via `which`. If the tool is not installed,
|
|
38
|
+
* return a guidance string instead of failing.
|
|
39
|
+
*
|
|
40
|
+
* Never throws.
|
|
41
|
+
*/
|
|
42
|
+
export declare function deploy(projectPath: string, target: string, opts: {
|
|
43
|
+
confirm: boolean;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
ran: boolean;
|
|
46
|
+
dryRun: boolean;
|
|
47
|
+
detail: string;
|
|
48
|
+
}>;
|