@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":"onboard.js","sourceRoot":"","sources":["../../src/core/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M31: buildOrientation — composite session-start context for agents.
|
|
3
|
+
*
|
|
4
|
+
* Answers "what should I know before I start working here" in ONE read-only
|
|
5
|
+
* call: genome memory hits + latest health score + persisted backlog items +
|
|
6
|
+
* pending proposal count + portfolio attention (dirty/stale).
|
|
7
|
+
*
|
|
8
|
+
* Contract (CONTRACT-M31):
|
|
9
|
+
* - READ-ONLY: derives everything from local stores; never scans repos,
|
|
10
|
+
* never builds an index, never calls a model or the network.
|
|
11
|
+
* - Every section is BEST-EFFORT: a failing store yields an empty section,
|
|
12
|
+
* never an exception. buildOrientation NEVER throws.
|
|
13
|
+
* - Bounded: hits/items are capped so the result stays context-friendly.
|
|
14
|
+
*
|
|
15
|
+
* Consumed by: `ashlr orient` (CLI), the `ashlr_orient` native MCP tool, and
|
|
16
|
+
* the read-only `GET /api/orient` web route.
|
|
17
|
+
*/
|
|
18
|
+
import type { AshlrConfig, OrientResult } from './types.js';
|
|
19
|
+
/**
|
|
20
|
+
* Build the orientation. `repo` may be absolute or relative (resolved against
|
|
21
|
+
* cwd); when omitted the orientation is portfolio-wide.
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildOrientation(cfg: AshlrConfig, repo?: string): Promise<OrientResult>;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* M31: buildOrientation — composite session-start context for agents.
|
|
3
|
+
*
|
|
4
|
+
* Answers "what should I know before I start working here" in ONE read-only
|
|
5
|
+
* call: genome memory hits + latest health score + persisted backlog items +
|
|
6
|
+
* pending proposal count + portfolio attention (dirty/stale).
|
|
7
|
+
*
|
|
8
|
+
* Contract (CONTRACT-M31):
|
|
9
|
+
* - READ-ONLY: derives everything from local stores; never scans repos,
|
|
10
|
+
* never builds an index, never calls a model or the network.
|
|
11
|
+
* - Every section is BEST-EFFORT: a failing store yields an empty section,
|
|
12
|
+
* never an exception. buildOrientation NEVER throws.
|
|
13
|
+
* - Bounded: hits/items are capped so the result stays context-friendly.
|
|
14
|
+
*
|
|
15
|
+
* Consumed by: `ashlr orient` (CLI), the `ashlr_orient` native MCP tool, and
|
|
16
|
+
* the read-only `GET /api/orient` web route.
|
|
17
|
+
*/
|
|
18
|
+
import { resolve, basename } from 'node:path';
|
|
19
|
+
import { recall } from './genome/recall.js';
|
|
20
|
+
import { loadPreviousReport } from './quality/store.js';
|
|
21
|
+
import { loadBacklog } from './portfolio/backlog.js';
|
|
22
|
+
import { pendingCount } from './inbox/store.js';
|
|
23
|
+
import { loadIndex } from './index-engine.js';
|
|
24
|
+
/** Bounds keeping an orientation small enough to inject into a session. */
|
|
25
|
+
const MAX_GENOME_HITS = 5;
|
|
26
|
+
const MAX_BACKLOG_ITEMS = 8;
|
|
27
|
+
const MAX_HIT_TEXT = 400;
|
|
28
|
+
const WORST_DIMENSIONS = 3;
|
|
29
|
+
/**
|
|
30
|
+
* Build the orientation. `repo` may be absolute or relative (resolved against
|
|
31
|
+
* cwd); when omitted the orientation is portfolio-wide.
|
|
32
|
+
*/
|
|
33
|
+
export async function buildOrientation(cfg, repo) {
|
|
34
|
+
const abs = repo && repo.trim() !== '' ? resolve(repo) : null;
|
|
35
|
+
// ── Genome memory (best-effort) ───────────────────────────────────────────
|
|
36
|
+
let genomeHits = [];
|
|
37
|
+
try {
|
|
38
|
+
const query = abs ? basename(abs) : 'project conventions decisions overview';
|
|
39
|
+
const hits = await recall(query, cfg, { limit: MAX_GENOME_HITS });
|
|
40
|
+
genomeHits = hits.map((h) => ({
|
|
41
|
+
title: h.entry.title,
|
|
42
|
+
text: h.entry.text.slice(0, MAX_HIT_TEXT),
|
|
43
|
+
score: h.score,
|
|
44
|
+
project: h.entry.project,
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
genomeHits = [];
|
|
49
|
+
}
|
|
50
|
+
// ── Health (best-effort; persisted report only — never re-scans) ─────────
|
|
51
|
+
let health = null;
|
|
52
|
+
try {
|
|
53
|
+
const report = loadPreviousReport();
|
|
54
|
+
if (report) {
|
|
55
|
+
const score = abs
|
|
56
|
+
? report.scores.find((s) => resolve(s.repo) === abs) ?? null
|
|
57
|
+
: null;
|
|
58
|
+
if (score) {
|
|
59
|
+
const worst = [...score.dimensions]
|
|
60
|
+
.sort((a, b) => a.score - b.score)
|
|
61
|
+
.slice(0, WORST_DIMENSIONS)
|
|
62
|
+
.map((d) => `${d.dimension} (${d.score})`);
|
|
63
|
+
health = { score: score.score, grade: score.grade, worstDimensions: worst };
|
|
64
|
+
}
|
|
65
|
+
else if (!abs) {
|
|
66
|
+
health = {
|
|
67
|
+
score: report.averageScore,
|
|
68
|
+
grade: report.averageGrade,
|
|
69
|
+
worstDimensions: report.scores
|
|
70
|
+
.slice(0, WORST_DIMENSIONS)
|
|
71
|
+
.map((s) => `${basename(s.repo)} (${s.score})`),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
health = null;
|
|
78
|
+
}
|
|
79
|
+
// ── Backlog (persisted only — never triggers a scan) ──────────────────────
|
|
80
|
+
let backlogItems = [];
|
|
81
|
+
try {
|
|
82
|
+
const backlog = loadBacklog();
|
|
83
|
+
if (backlog) {
|
|
84
|
+
const items = abs
|
|
85
|
+
? backlog.items.filter((it) => resolve(it.repo) === abs)
|
|
86
|
+
: backlog.items;
|
|
87
|
+
backlogItems = items.slice(0, MAX_BACKLOG_ITEMS).map((it) => ({
|
|
88
|
+
id: it.id,
|
|
89
|
+
source: it.source,
|
|
90
|
+
title: it.title,
|
|
91
|
+
score: it.score,
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
backlogItems = [];
|
|
97
|
+
}
|
|
98
|
+
// ── Pending proposals ──────────────────────────────────────────────────────
|
|
99
|
+
let pendingProposals = 0;
|
|
100
|
+
try {
|
|
101
|
+
pendingProposals = pendingCount();
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
pendingProposals = 0;
|
|
105
|
+
}
|
|
106
|
+
// ── Attention (index-derived; no rebuild) ─────────────────────────────────
|
|
107
|
+
let attention = null;
|
|
108
|
+
try {
|
|
109
|
+
const index = loadIndex();
|
|
110
|
+
if (index) {
|
|
111
|
+
let dirty = 0;
|
|
112
|
+
let stale = 0;
|
|
113
|
+
for (const item of index.items) {
|
|
114
|
+
if (item.git && item.git.dirty > 0)
|
|
115
|
+
dirty++;
|
|
116
|
+
if (item.kind === 'repo' && !item.active)
|
|
117
|
+
stale++;
|
|
118
|
+
}
|
|
119
|
+
attention = { dirtyRepos: dirty, staleRepos: stale };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
attention = null;
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
generatedAt: new Date().toISOString(),
|
|
127
|
+
repo: abs,
|
|
128
|
+
genomeHits,
|
|
129
|
+
health,
|
|
130
|
+
backlogItems,
|
|
131
|
+
pendingProposals,
|
|
132
|
+
attention,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=orient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orient.js","sourceRoot":"","sources":["../../src/core/orient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/phantom.ts — Phantom secrets CLI integration.
|
|
3
|
+
*
|
|
4
|
+
* INTENTIONALLY VALUES-FREE: this module inspects only the Phantom CLI's
|
|
5
|
+
* metadata (version, initialization state, secret NAMES). It never reads,
|
|
6
|
+
* captures, logs, or returns secret values under any code path.
|
|
7
|
+
*/
|
|
8
|
+
import type { PhantomStatus } from './types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Returns true when the `phantom` binary is resolvable and executes without a
|
|
11
|
+
* fatal error. Uses `phantom --version` as the probe (fast, side-effect-free).
|
|
12
|
+
*/
|
|
13
|
+
export declare function phantomInstalled(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Returns a read-only status snapshot of the Phantom CLI.
|
|
16
|
+
*
|
|
17
|
+
* Guarantees:
|
|
18
|
+
* - Never throws.
|
|
19
|
+
* - Never returns secret values — only secret NAMES (keys).
|
|
20
|
+
* - Degrades gracefully when phantom is absent, uninitialized, or returns
|
|
21
|
+
* an unexpected format.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getPhantomStatus(): PhantomStatus;
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/phantom.ts — Phantom secrets CLI integration.
|
|
3
|
+
*
|
|
4
|
+
* INTENTIONALLY VALUES-FREE: this module inspects only the Phantom CLI's
|
|
5
|
+
* metadata (version, initialization state, secret NAMES). It never reads,
|
|
6
|
+
* captures, logs, or returns secret values under any code path.
|
|
7
|
+
*/
|
|
8
|
+
import { spawnSync } from 'node:child_process';
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
// Internal helpers
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
const PHANTOM_BIN = 'phantom';
|
|
13
|
+
const TIMEOUT_MS = 5_000;
|
|
14
|
+
/**
|
|
15
|
+
* Run a phantom sub-command synchronously.
|
|
16
|
+
* Returns stdout/stderr as strings and the exit status.
|
|
17
|
+
* Never throws — all errors are caught and returned in `error`.
|
|
18
|
+
*/
|
|
19
|
+
function runPhantom(args, options = {}) {
|
|
20
|
+
try {
|
|
21
|
+
const result = spawnSync(PHANTOM_BIN, args, {
|
|
22
|
+
encoding: 'utf8',
|
|
23
|
+
timeout: TIMEOUT_MS,
|
|
24
|
+
cwd: options.cwd,
|
|
25
|
+
// Do NOT inherit env vars that could trigger interactive prompts.
|
|
26
|
+
env: { ...process.env, PHANTOM_NO_UPDATE_CHECK: '1' },
|
|
27
|
+
});
|
|
28
|
+
if (result.error) {
|
|
29
|
+
return { stdout: '', stderr: '', status: null, error: result.error.message };
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
stdout: result.stdout ?? '',
|
|
33
|
+
stderr: result.stderr ?? '',
|
|
34
|
+
status: result.status,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
39
|
+
return { stdout: '', stderr: '', status: null, error: msg };
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Public API
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
/**
|
|
46
|
+
* Returns true when the `phantom` binary is resolvable and executes without a
|
|
47
|
+
* fatal error. Uses `phantom --version` as the probe (fast, side-effect-free).
|
|
48
|
+
*/
|
|
49
|
+
export function phantomInstalled() {
|
|
50
|
+
const { status, error } = runPhantom(['--version']);
|
|
51
|
+
// spawnSync returns null status when the binary could not be found/launched.
|
|
52
|
+
return error === undefined && status !== null && status === 0;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns a read-only status snapshot of the Phantom CLI.
|
|
56
|
+
*
|
|
57
|
+
* Guarantees:
|
|
58
|
+
* - Never throws.
|
|
59
|
+
* - Never returns secret values — only secret NAMES (keys).
|
|
60
|
+
* - Degrades gracefully when phantom is absent, uninitialized, or returns
|
|
61
|
+
* an unexpected format.
|
|
62
|
+
*/
|
|
63
|
+
export function getPhantomStatus() {
|
|
64
|
+
// ── 1. Binary presence ──────────────────────────────────────────────────
|
|
65
|
+
if (!phantomInstalled()) {
|
|
66
|
+
return {
|
|
67
|
+
installed: false,
|
|
68
|
+
version: null,
|
|
69
|
+
initialized: false,
|
|
70
|
+
secretNames: [],
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ── 2. Version ──────────────────────────────────────────────────────────
|
|
74
|
+
let version = null;
|
|
75
|
+
{
|
|
76
|
+
const { stdout, status } = runPhantom(['--version']);
|
|
77
|
+
if (status === 0) {
|
|
78
|
+
// Expected format: "phantom 0.6.0"
|
|
79
|
+
const match = stdout.trim().match(/\d+\.\d+(?:\.\d+)?/);
|
|
80
|
+
version = match ? match[0] : stdout.trim() || null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// ── 3. Initialized state (phantom status --json) ─────────────────────────
|
|
84
|
+
//
|
|
85
|
+
// Prefer the documented `--json` flag and read a structured initialized /
|
|
86
|
+
// secret-count field when present (robust against wording/localization
|
|
87
|
+
// changes). Fall back to the legacy human-text heuristic only when the
|
|
88
|
+
// output is not parseable JSON.
|
|
89
|
+
//
|
|
90
|
+
// Human-text fallback: when NOT initialized, phantom prints something like
|
|
91
|
+
// "! Not initialized. Run phantom init to get started."
|
|
92
|
+
// When initialized it prints proxy state and a mapped-secrets count. We treat
|
|
93
|
+
// the presence of "not initialized" / "run phantom init" as initialized:false.
|
|
94
|
+
//
|
|
95
|
+
// statusError is reserved for GENUINE spawn failures (binary missing /
|
|
96
|
+
// crashed). A non-zero exit whose output is parseable (e.g. proxy stopped)
|
|
97
|
+
// is NOT a fault and records no error.
|
|
98
|
+
let initialized = false;
|
|
99
|
+
let statusError;
|
|
100
|
+
{
|
|
101
|
+
const { stdout, stderr, status, error } = runPhantom(['status', '--json']);
|
|
102
|
+
if (error !== undefined) {
|
|
103
|
+
// Genuine spawn failure (could not launch the binary).
|
|
104
|
+
statusError = error;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const combined = stdout + stderr;
|
|
108
|
+
const structured = parseInitializedFromJson(combined);
|
|
109
|
+
if (structured !== null) {
|
|
110
|
+
initialized = structured;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
// Fallback: human-text heuristic (labeled, brittle-by-design).
|
|
114
|
+
const lc = combined.toLowerCase();
|
|
115
|
+
initialized = !lc.includes('not initialized') && !lc.includes('run phantom init');
|
|
116
|
+
}
|
|
117
|
+
// A stopped proxy / non-zero exit is benign once we have parseable
|
|
118
|
+
// output; do not surface it as a hard error. statusError stays unset.
|
|
119
|
+
void status;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// ── 4. Secret NAMES (phantom list --json) ───────────────────────────────
|
|
123
|
+
//
|
|
124
|
+
// Only attempt when initialized; avoids spurious error output.
|
|
125
|
+
// We use --json for deterministic parsing. Expected shape (when secrets
|
|
126
|
+
// exist) is an array of objects each containing at minimum a "name" or
|
|
127
|
+
// "key" field. If the shape is unrecognised we return [] rather than
|
|
128
|
+
// risk accidentally surfacing values.
|
|
129
|
+
let secretNames = [];
|
|
130
|
+
if (initialized) {
|
|
131
|
+
const { stdout, status, error } = runPhantom(['list', '--json']);
|
|
132
|
+
if (error === undefined && status === 0 && stdout.trim().length > 0) {
|
|
133
|
+
secretNames = parseSecretNames(stdout);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const result = {
|
|
137
|
+
installed: true,
|
|
138
|
+
version,
|
|
139
|
+
initialized,
|
|
140
|
+
secretNames,
|
|
141
|
+
};
|
|
142
|
+
if (statusError !== undefined) {
|
|
143
|
+
result.error = statusError;
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
}
|
|
147
|
+
// ---------------------------------------------------------------------------
|
|
148
|
+
// Private parsing — deliberately conservative
|
|
149
|
+
// ---------------------------------------------------------------------------
|
|
150
|
+
/**
|
|
151
|
+
* Read the initialized state from `phantom status --json` output.
|
|
152
|
+
*
|
|
153
|
+
* Returns:
|
|
154
|
+
* - true / false when a structured boolean field can be determined
|
|
155
|
+
* - null when the output is not parseable JSON (caller should fall back to
|
|
156
|
+
* the human-text heuristic)
|
|
157
|
+
*
|
|
158
|
+
* Recognised shapes (defensive — phantom's exact schema may evolve):
|
|
159
|
+
* { "initialized": true, ... }
|
|
160
|
+
* { "vault": { "initialized": true }, ... }
|
|
161
|
+
* { "secrets": 3, ... } / { "secretCount": 3 } → initialized when count >= 0
|
|
162
|
+
* Never reads or returns secret values — only boolean/count metadata.
|
|
163
|
+
*/
|
|
164
|
+
function parseInitializedFromJson(raw) {
|
|
165
|
+
const trimmed = raw.trim();
|
|
166
|
+
if (!trimmed.startsWith('{') && !trimmed.startsWith('['))
|
|
167
|
+
return null;
|
|
168
|
+
let parsed;
|
|
169
|
+
try {
|
|
170
|
+
parsed = JSON.parse(trimmed);
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
if (parsed === null || typeof parsed !== 'object')
|
|
176
|
+
return null;
|
|
177
|
+
const obj = parsed;
|
|
178
|
+
// Direct boolean field
|
|
179
|
+
if (typeof obj['initialized'] === 'boolean')
|
|
180
|
+
return obj['initialized'];
|
|
181
|
+
// Nested vault.initialized
|
|
182
|
+
const vault = obj['vault'];
|
|
183
|
+
if (vault !== null && typeof vault === 'object') {
|
|
184
|
+
const v = vault['initialized'];
|
|
185
|
+
if (typeof v === 'boolean')
|
|
186
|
+
return v;
|
|
187
|
+
}
|
|
188
|
+
// A numeric secret count implies an initialized vault.
|
|
189
|
+
for (const key of ['secretCount', 'secrets', 'mapped', 'count']) {
|
|
190
|
+
if (typeof obj[key] === 'number')
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
// Parseable JSON but no recognised field — treat as initialized (a vault
|
|
194
|
+
// that emits structured status is, by definition, set up).
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Extract ONLY secret names from `phantom list --json` output.
|
|
199
|
+
*
|
|
200
|
+
* The function intentionally returns an empty array whenever it cannot
|
|
201
|
+
* confidently identify a "name" field, preventing accidental value leakage
|
|
202
|
+
* if the JSON schema changes.
|
|
203
|
+
*
|
|
204
|
+
* NEVER include or return values, tokens, or any field that is not the
|
|
205
|
+
* human-readable key name.
|
|
206
|
+
*/
|
|
207
|
+
function parseSecretNames(raw) {
|
|
208
|
+
try {
|
|
209
|
+
const parsed = JSON.parse(raw);
|
|
210
|
+
// ── Array of objects: [{ name: "KEY" }, ...] or [{ key: "KEY" }, ...]
|
|
211
|
+
if (Array.isArray(parsed)) {
|
|
212
|
+
const names = [];
|
|
213
|
+
for (const item of parsed) {
|
|
214
|
+
if (item !== null && typeof item === 'object') {
|
|
215
|
+
const obj = item;
|
|
216
|
+
// Prefer "name", fall back to "key" — both are safe identifier fields.
|
|
217
|
+
if (typeof obj['name'] === 'string') {
|
|
218
|
+
names.push(obj['name']);
|
|
219
|
+
}
|
|
220
|
+
else if (typeof obj['key'] === 'string') {
|
|
221
|
+
names.push(obj['key']);
|
|
222
|
+
}
|
|
223
|
+
// Deliberately skip any other field to avoid leaking values.
|
|
224
|
+
}
|
|
225
|
+
else if (typeof item === 'string') {
|
|
226
|
+
// Some CLIs emit a flat string array of names.
|
|
227
|
+
names.push(item);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return names;
|
|
231
|
+
}
|
|
232
|
+
// ── Object with a "secrets" or "keys" array at the top level
|
|
233
|
+
if (parsed !== null && typeof parsed === 'object') {
|
|
234
|
+
const obj = parsed;
|
|
235
|
+
for (const key of ['secrets', 'keys', 'names']) {
|
|
236
|
+
if (Array.isArray(obj[key])) {
|
|
237
|
+
return parseSecretNames(JSON.stringify(obj[key]));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
// Unknown shape — return empty rather than risk leaking values.
|
|
242
|
+
return [];
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// JSON parse failed — fall back to line-based extraction.
|
|
246
|
+
return parseSecretNamesFromText(raw);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Last-resort line-by-line name extractor for plain-text `phantom list` output.
|
|
251
|
+
*
|
|
252
|
+
* Phantom's table format typically looks like:
|
|
253
|
+
* NAME PROTECTED
|
|
254
|
+
* MY_API_KEY yes
|
|
255
|
+
* ANOTHER_SECRET yes
|
|
256
|
+
*
|
|
257
|
+
* We extract the first whitespace-delimited token from each non-header line
|
|
258
|
+
* that looks like an environment-variable name (ALL_CAPS / SCREAMING_SNAKE).
|
|
259
|
+
*
|
|
260
|
+
* Deliberately conservative — returns [] for any line that doesn't look like
|
|
261
|
+
* a canonical env-var name.
|
|
262
|
+
*/
|
|
263
|
+
function parseSecretNamesFromText(text) {
|
|
264
|
+
const ENV_VAR_RE = /^[A-Z_][A-Z0-9_]{0,127}$/;
|
|
265
|
+
const names = [];
|
|
266
|
+
for (const raw of text.split('\n')) {
|
|
267
|
+
const line = raw.trim();
|
|
268
|
+
if (!line)
|
|
269
|
+
continue;
|
|
270
|
+
const token = line.split(/\s+/)[0];
|
|
271
|
+
// Skip header lines ("NAME", "KEY", etc.) implicitly — they pass the
|
|
272
|
+
// same regex but are single-word and won't look like multi-word values.
|
|
273
|
+
if (token && ENV_VAR_RE.test(token) && token !== 'NAME' && token !== 'KEY') {
|
|
274
|
+
names.push(token);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return names;
|
|
278
|
+
}
|
|
279
|
+
//# sourceMappingURL=phantom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phantom.js","sourceRoot":"","sources":["../../src/core/phantom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/plugins/host-api.ts — M33 PluginHost factory.
|
|
3
|
+
*
|
|
4
|
+
* CONTRACT RULES (non-negotiable):
|
|
5
|
+
* - buildHostApi returns a fully frozen PluginHost. Every nested object is
|
|
6
|
+
* deep-frozen via structuredClone + recursive Object.freeze.
|
|
7
|
+
* - `settings` is a deep-frozen copy of cfg.plugins.settings[name] ONLY.
|
|
8
|
+
* The plugin NEVER receives the full AshlrConfig.
|
|
9
|
+
* - `view` is a frozen allowlisted projection — only editor + staleDays.
|
|
10
|
+
* - `audit()` delegates to core/sandbox/audit.ts and prefixes the action
|
|
11
|
+
* with "plugin:<name>:" automatically. Never throws.
|
|
12
|
+
* - `log()` writes to stderr, prefixed "[plugin:<name>]". Never throws.
|
|
13
|
+
* - `dataDir` is created eagerly at ~/.ashlr/plugin-data/<name>/ if absent.
|
|
14
|
+
* - homedir() is resolved at call time so tests can relocate HOME.
|
|
15
|
+
*/
|
|
16
|
+
import { type PluginHost } from './types.js';
|
|
17
|
+
import type { AshlrConfig } from '../types.js';
|
|
18
|
+
/**
|
|
19
|
+
* Build a fully frozen PluginHost for a plugin identified by `manifest.name`.
|
|
20
|
+
*
|
|
21
|
+
* `cfg` is the current AshlrConfig. Only a safe projection is exposed to the
|
|
22
|
+
* plugin — never the full config object.
|
|
23
|
+
*
|
|
24
|
+
* dataDir (~/.ashlr/plugin-data/<name>/) is created eagerly so the plugin can
|
|
25
|
+
* use it immediately after activate() without setup.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildHostApi(manifest: {
|
|
28
|
+
name: string;
|
|
29
|
+
}, cfg: AshlrConfig): PluginHost;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* core/plugins/host-api.ts — M33 PluginHost factory.
|
|
3
|
+
*
|
|
4
|
+
* CONTRACT RULES (non-negotiable):
|
|
5
|
+
* - buildHostApi returns a fully frozen PluginHost. Every nested object is
|
|
6
|
+
* deep-frozen via structuredClone + recursive Object.freeze.
|
|
7
|
+
* - `settings` is a deep-frozen copy of cfg.plugins.settings[name] ONLY.
|
|
8
|
+
* The plugin NEVER receives the full AshlrConfig.
|
|
9
|
+
* - `view` is a frozen allowlisted projection — only editor + staleDays.
|
|
10
|
+
* - `audit()` delegates to core/sandbox/audit.ts and prefixes the action
|
|
11
|
+
* with "plugin:<name>:" automatically. Never throws.
|
|
12
|
+
* - `log()` writes to stderr, prefixed "[plugin:<name>]". Never throws.
|
|
13
|
+
* - `dataDir` is created eagerly at ~/.ashlr/plugin-data/<name>/ if absent.
|
|
14
|
+
* - homedir() is resolved at call time so tests can relocate HOME.
|
|
15
|
+
*/
|
|
16
|
+
import { mkdirSync } from 'node:fs';
|
|
17
|
+
import { homedir } from 'node:os';
|
|
18
|
+
import { join } from 'node:path';
|
|
19
|
+
import { audit } from '../sandbox/audit.js';
|
|
20
|
+
import { PLUGIN_API_VERSION } from './types.js';
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Deep-freeze helper
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Recursively freeze `value` and all nested plain-object/array values.
|
|
26
|
+
* Returns the input (mutated in-place by Object.freeze, same reference).
|
|
27
|
+
* Only freezes plain objects and arrays to avoid freezing class instances.
|
|
28
|
+
*/
|
|
29
|
+
function deepFreeze(value) {
|
|
30
|
+
if (value === null || typeof value !== 'object')
|
|
31
|
+
return value;
|
|
32
|
+
Object.freeze(value);
|
|
33
|
+
if (Array.isArray(value)) {
|
|
34
|
+
for (const item of value) {
|
|
35
|
+
deepFreeze(item);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
for (const key of Object.keys(value)) {
|
|
40
|
+
deepFreeze(value[key]);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
// ---------------------------------------------------------------------------
|
|
46
|
+
// buildHostApi — public factory
|
|
47
|
+
// ---------------------------------------------------------------------------
|
|
48
|
+
/**
|
|
49
|
+
* Build a fully frozen PluginHost for a plugin identified by `manifest.name`.
|
|
50
|
+
*
|
|
51
|
+
* `cfg` is the current AshlrConfig. Only a safe projection is exposed to the
|
|
52
|
+
* plugin — never the full config object.
|
|
53
|
+
*
|
|
54
|
+
* dataDir (~/.ashlr/plugin-data/<name>/) is created eagerly so the plugin can
|
|
55
|
+
* use it immediately after activate() without setup.
|
|
56
|
+
*/
|
|
57
|
+
export function buildHostApi(manifest, cfg) {
|
|
58
|
+
const name = manifest.name;
|
|
59
|
+
// --- dataDir: created eagerly ---
|
|
60
|
+
// Re-resolve homedir() at call time (house convention: tests relocate HOME).
|
|
61
|
+
const dataDir = join(homedir(), '.ashlr', 'plugin-data', name);
|
|
62
|
+
try {
|
|
63
|
+
mkdirSync(dataDir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// best-effort: if creation fails, log but don't throw — the host is still usable.
|
|
67
|
+
}
|
|
68
|
+
// --- settings: deep-frozen copy of the plugin's own settings only ---
|
|
69
|
+
const rawSettings = cfg.plugins?.settings?.[name] ?? {};
|
|
70
|
+
const frozenSettings = deepFreeze(structuredClone(rawSettings));
|
|
71
|
+
// --- view: frozen allowlisted projection ---
|
|
72
|
+
const frozenView = Object.freeze({
|
|
73
|
+
editor: cfg.editor ?? 'vscode',
|
|
74
|
+
staleDays: cfg.staleDays ?? 30,
|
|
75
|
+
});
|
|
76
|
+
// --- Build the host (freeze the outer object last) ---
|
|
77
|
+
const host = {
|
|
78
|
+
apiVersion: PLUGIN_API_VERSION,
|
|
79
|
+
pluginName: name,
|
|
80
|
+
log(msg) {
|
|
81
|
+
try {
|
|
82
|
+
process.stderr.write(`[plugin:${name}] ${msg}\n`);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// log must never throw
|
|
86
|
+
}
|
|
87
|
+
},
|
|
88
|
+
audit(action, summary) {
|
|
89
|
+
// Delegate to core audit(), prefixing action with "plugin:<name>:".
|
|
90
|
+
// audit() never throws (house invariant).
|
|
91
|
+
audit({
|
|
92
|
+
action: `plugin:${name}:${action}`,
|
|
93
|
+
repo: null,
|
|
94
|
+
sandboxId: null,
|
|
95
|
+
summary,
|
|
96
|
+
result: 'ok',
|
|
97
|
+
});
|
|
98
|
+
},
|
|
99
|
+
get settings() {
|
|
100
|
+
return frozenSettings;
|
|
101
|
+
},
|
|
102
|
+
get view() {
|
|
103
|
+
return frozenView;
|
|
104
|
+
},
|
|
105
|
+
get dataDir() {
|
|
106
|
+
return dataDir;
|
|
107
|
+
},
|
|
108
|
+
};
|
|
109
|
+
// Freeze the host object itself. Methods are enumerable only if they appear
|
|
110
|
+
// on the object, not the prototype, so we freeze the literal object.
|
|
111
|
+
return Object.freeze(host);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=host-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-api.js","sourceRoot":"","sources":["../../../src/core/plugins/host-api.ts"],"names":[],"mappings":"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"}
|