ashlr-plugin 1.36.4
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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +39 -0
- package/.claude-plugin/plugin.json +36 -0
- package/.codex/agents/README.md +9 -0
- package/.codex/agents/ashlr-explorer.md +36 -0
- package/.codex/agents/ashlr-worker.md +38 -0
- package/.codex-plugin/plugin.json +45 -0
- package/.mcp.json +14 -0
- package/LICENSE +21 -0
- package/README.md +311 -0
- package/agents/ashlr-code.md +69 -0
- package/agents/ashlr-explore.md +44 -0
- package/agents/ashlr-plan.md +54 -0
- package/bench/fixtures/notebook-large.ipynb +660 -0
- package/bench/fixtures/notebook-small.ipynb +39 -0
- package/bench/fixtures/tasklist-closed.json +62 -0
- package/bench/fixtures/tasklist-large-mixed.json +27 -0
- package/bench/fixtures/tasklist-sprint-open.json +79 -0
- package/bench/fixtures/websearch-bun-runtime.json +32 -0
- package/bench/fixtures/websearch-react-hooks-patterns.json +32 -0
- package/bench/fixtures/websearch-typescript-generics.json +38 -0
- package/bench/refs/node-sdk/.refrev +1 -0
- package/bench/refs/node-sdk/README.md +17 -0
- package/bench/refs/node-sdk/src/agent/agent.ts +163 -0
- package/bench/refs/node-sdk/src/agent/create-agent-ui-stream.ts +83 -0
- package/bench/refs/node-sdk/src/agent/tool-loop-agent.ts +238 -0
- package/bench/refs/node-sdk/src/embed/embed-many.ts +409 -0
- package/bench/refs/node-sdk/src/embed/embed-result.ts +50 -0
- package/bench/refs/node-sdk/src/embed/embed.ts +257 -0
- package/bench/refs/node-sdk/src/error/invalid-argument-error.ts +34 -0
- package/bench/refs/node-sdk/src/error/invalid-tool-input-error.ts +33 -0
- package/bench/refs/node-sdk/src/error/no-object-generated-error.ts +70 -0
- package/bench/refs/node-sdk/src/generate-image/generate-image-result.ts +42 -0
- package/bench/refs/node-sdk/src/generate-image/generate-image.ts +362 -0
- package/bench/refs/node-sdk/src/generate-object/generate-object-result.ts +67 -0
- package/bench/refs/node-sdk/src/generate-object/generate-object.ts +501 -0
- package/bench/refs/node-sdk/src/generate-object/inject-json-instruction.ts +30 -0
- package/bench/refs/node-sdk/src/generate-object/output-strategy.ts +415 -0
- package/bench/refs/node-sdk/src/generate-object/repair-text.ts +12 -0
- package/bench/refs/node-sdk/src/generate-object/stream-object.ts +960 -0
- package/bench/refs/node-sdk/src/generate-speech/generate-speech.ts +191 -0
- package/bench/refs/node-sdk/src/generate-text/generate-text.ts +1484 -0
- package/bench/refs/node-sdk/src/generate-text/stream-text.ts +2708 -0
- package/bench/refs/node-sdk/src/generate-text/tool-call.ts +59 -0
- package/bench/refs/node-sdk/src/generate-text/tool-result.ts +36 -0
- package/bench/refs/node-sdk/src/telemetry/create-telemetry-dispatcher.ts +146 -0
- package/bench/refs/node-sdk/src/telemetry/telemetry-registry.ts +15 -0
- package/bench/refs/node-sdk/src/telemetry/telemetry.ts +223 -0
- package/bench/refs/node-sdk/src/util/async-iterable-stream.ts +94 -0
- package/bench/refs/node-sdk/src/util/consume-stream.ts +31 -0
- package/bench/refs/node-sdk/src/util/create-stitchable-stream.ts +112 -0
- package/bench/refs/node-sdk/src/util/download/download.ts +74 -0
- package/bench/refs/node-sdk/src/util/error-handler.ts +1 -0
- package/bench/refs/node-sdk/src/util/fix-json.ts +401 -0
- package/bench/refs/node-sdk/src/util/merge-objects.ts +79 -0
- package/bench/refs/python-lib/.refrev +1 -0
- package/bench/refs/python-lib/README.md +18 -0
- package/bench/refs/python-lib/pandas/core/_numba/executor.py +249 -0
- package/bench/refs/python-lib/pandas/core/_numba/extensions.py +586 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/mean_.py +198 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/min_max_.py +178 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/sum_.py +255 -0
- package/bench/refs/python-lib/pandas/core/_numba/kernels/var_.py +251 -0
- package/bench/refs/python-lib/pandas/core/accessor.py +520 -0
- package/bench/refs/python-lib/pandas/core/api.py +138 -0
- package/bench/refs/python-lib/pandas/core/array_algos/masked_accumulations.py +97 -0
- package/bench/refs/python-lib/pandas/core/array_algos/masked_reductions.py +252 -0
- package/bench/refs/python-lib/pandas/core/array_algos/putmask.py +150 -0
- package/bench/refs/python-lib/pandas/core/array_algos/quantile.py +232 -0
- package/bench/refs/python-lib/pandas/core/array_algos/replace.py +159 -0
- package/bench/refs/python-lib/pandas/core/array_algos/take.py +609 -0
- package/bench/refs/python-lib/pandas/core/arraylike.py +534 -0
- package/bench/refs/python-lib/pandas/core/arrays/_arrow_string_mixins.py +434 -0
- package/bench/refs/python-lib/pandas/core/arrays/_mixins.py +630 -0
- package/bench/refs/python-lib/pandas/core/arrays/_ranges.py +276 -0
- package/bench/refs/python-lib/pandas/core/arrays/_utils.py +77 -0
- package/bench/refs/python-lib/pandas/core/arrays/arrow/accessors.py +521 -0
- package/bench/refs/python-lib/pandas/core/arrays/arrow/extension_types.py +174 -0
- package/bench/refs/python-lib/pandas/core/arrays/boolean.py +454 -0
- package/bench/refs/python-lib/pandas/core/arrays/floating.py +192 -0
- package/bench/refs/python-lib/pandas/core/arrays/integer.py +296 -0
- package/bench/refs/python-lib/pandas/core/arrays/masked.py +2140 -0
- package/bench/refs/python-lib/pandas/core/arrays/numeric.py +305 -0
- package/bench/refs/python-lib/pandas/core/arrays/numpy_.py +701 -0
- package/bench/refs/python-lib/pandas/core/arrays/period.py +1586 -0
- package/bench/refs/python-lib/pandas/core/arrays/sparse/accessor.py +505 -0
- package/bench/refs/python-lib/pandas/core/arrays/sparse/scipy_sparse.py +208 -0
- package/bench/refs/rust-project/.refrev +1 -0
- package/bench/refs/rust-project/README.md +17 -0
- package/bench/refs/rust-project/tokio/src/doc/os.rs +68 -0
- package/bench/refs/rust-project/tokio/src/fs/dir_builder.rs +129 -0
- package/bench/refs/rust-project/tokio/src/fs/file.rs +1113 -0
- package/bench/refs/rust-project/tokio/src/fs/mocks.rs +176 -0
- package/bench/refs/rust-project/tokio/src/fs/mod.rs +324 -0
- package/bench/refs/rust-project/tokio/src/fs/open_options.rs +856 -0
- package/bench/refs/rust-project/tokio/src/fs/read.rs +80 -0
- package/bench/refs/rust-project/tokio/src/fs/read_dir.rs +357 -0
- package/bench/refs/rust-project/tokio/src/fs/write.rs +99 -0
- package/bench/refs/rust-project/tokio/src/future/maybe_done.rs +123 -0
- package/bench/refs/rust-project/tokio/src/future/try_join.rs +82 -0
- package/bench/refs/rust-project/tokio/src/io/async_buf_read.rs +117 -0
- package/bench/refs/rust-project/tokio/src/io/async_read.rs +133 -0
- package/bench/refs/rust-project/tokio/src/io/async_seek.rs +96 -0
- package/bench/refs/rust-project/tokio/src/io/async_write.rs +402 -0
- package/bench/refs/rust-project/tokio/src/io/blocking.rs +339 -0
- package/bench/refs/rust-project/tokio/src/io/interest.rs +345 -0
- package/bench/refs/rust-project/tokio/src/io/join.rs +130 -0
- package/bench/refs/rust-project/tokio/src/io/mod.rs +308 -0
- package/bench/refs/rust-project/tokio/src/io/poll_evented.rs +319 -0
- package/bench/refs/rust-project/tokio/src/io/read_buf.rs +344 -0
- package/bench/refs/rust-project/tokio/src/io/ready.rs +322 -0
- package/bench/refs/rust-project/tokio/src/io/split.rs +166 -0
- package/bench/refs/rust-project/tokio/src/io/stderr.rs +148 -0
- package/bench/refs/rust-project/tokio/src/io/stdin.rs +98 -0
- package/bench/refs/rust-project/tokio/src/io/stdio_common.rs +222 -0
- package/bench/refs/rust-project/tokio/src/io/stdout.rs +197 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_reader.rs +311 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_stream.rs +207 -0
- package/bench/refs/rust-project/tokio/src/io/util/buf_writer.rs +310 -0
- package/bench/refs/rust-project/tokio/src/io/util/chain.rs +144 -0
- package/commands/_spawn-patterns.json +32 -0
- package/commands/ashlr-allow.md +21 -0
- package/commands/ashlr-benchmark.md +53 -0
- package/commands/ashlr-brief.md +97 -0
- package/commands/ashlr-budget.md +76 -0
- package/commands/ashlr-compact.md +54 -0
- package/commands/ashlr-dashboard.md +37 -0
- package/commands/ashlr-doctor.md +56 -0
- package/commands/ashlr-eco-mode.md +92 -0
- package/commands/ashlr-genome-init.md +24 -0
- package/commands/ashlr-genome-keygen.md +36 -0
- package/commands/ashlr-genome-loop.md +118 -0
- package/commands/ashlr-genome-push.md +36 -0
- package/commands/ashlr-genome-rewrap.md +48 -0
- package/commands/ashlr-genome-team-init.md +67 -0
- package/commands/ashlr-handoff.md +23 -0
- package/commands/ashlr-help.md +86 -0
- package/commands/ashlr-hook-timings.md +30 -0
- package/commands/ashlr-leaderboard.md +50 -0
- package/commands/ashlr-ollama-setup.md +39 -0
- package/commands/ashlr-orchestrate-status.md +72 -0
- package/commands/ashlr-orchestrate.md +83 -0
- package/commands/ashlr-parallelize.md +63 -0
- package/commands/ashlr-report-crash.md +33 -0
- package/commands/ashlr-resume.md +72 -0
- package/commands/ashlr-savings.md +24 -0
- package/commands/ashlr-settings.md +50 -0
- package/commands/ashlr-spawn.md +61 -0
- package/commands/ashlr-start.md +60 -0
- package/commands/ashlr-status.md +64 -0
- package/commands/ashlr-team-invite.md +47 -0
- package/commands/ashlr-tier.md +122 -0
- package/commands/ashlr-tour.md +60 -0
- package/commands/ashlr-update.md +155 -0
- package/commands/ashlr-upgrade.md +96 -0
- package/commands/goal.md +58 -0
- package/commands/loop.md +40 -0
- package/docs/CNAME +1 -0
- package/docs/PRO_TIER.md +104 -0
- package/docs/README.md +21 -0
- package/docs/architecture.md +415 -0
- package/docs/ashlr-pipe.md +161 -0
- package/docs/assets/logo.svg +19 -0
- package/docs/assets/og.png +0 -0
- package/docs/assets/og.svg +41 -0
- package/docs/benchmarks-v2.json +355 -0
- package/docs/benchmarks.json +102 -0
- package/docs/benchmarks.md +211 -0
- package/docs/billing.md +185 -0
- package/docs/cloud-genome.md +155 -0
- package/docs/competitive-wozcode.md +92 -0
- package/docs/deploy.md +325 -0
- package/docs/email-templates.md +113 -0
- package/docs/embed-tuning.md +103 -0
- package/docs/genome.md +120 -0
- package/docs/github-oauth-onboarding.md +127 -0
- package/docs/hero-video-script.md +129 -0
- package/docs/index.html +2262 -0
- package/docs/install-prompt.md +78 -0
- package/docs/install-windows.md +132 -0
- package/docs/install.ps1 +171 -0
- package/docs/install.sh +146 -0
- package/docs/launch/README.md +114 -0
- package/docs/launch/hn.md +49 -0
- package/docs/launch/reddit.md +45 -0
- package/docs/launch/x.md +65 -0
- package/docs/launch-post.md +112 -0
- package/docs/legal.md +78 -0
- package/docs/llm-providers.md +99 -0
- package/docs/multi-host-mcp.md +217 -0
- package/docs/multi-turn-architecture.md +108 -0
- package/docs/operations/deployment.md +108 -0
- package/docs/operations/error-monitoring.md +70 -0
- package/docs/operations/weekly-digest.md +70 -0
- package/docs/operations.md +494 -0
- package/docs/platform-support.md +133 -0
- package/docs/policy-packs.md +188 -0
- package/docs/press-kit/fact-sheet.md +78 -0
- package/docs/press-kit/founder-bio.md +3 -0
- package/docs/press-kit/logo.svg +33 -0
- package/docs/press-kit/screenshots.md +146 -0
- package/docs/pricing.md +251 -0
- package/docs/pro-backend-architecture.md +523 -0
- package/docs/producthunt.md +52 -0
- package/docs/router-migration.md +110 -0
- package/docs/session-log-schema.md +68 -0
- package/docs/social.md +95 -0
- package/docs/team-genome.md +528 -0
- package/docs/telemetry.md +194 -0
- package/docs/test-isolation.md +100 -0
- package/docs/upgrade.md +159 -0
- package/hooks/_hook-errors.ts +87 -0
- package/hooks/_hook-perf-emit.ts +113 -0
- package/hooks/_hook-timing-ledger.ts +1133 -0
- package/hooks/_nudge-throttle.ts +127 -0
- package/hooks/_recent-blocks.ts +127 -0
- package/hooks/audit-upload.ts +86 -0
- package/hooks/codex-hooks.json +171 -0
- package/hooks/commit-attribution.ts +179 -0
- package/hooks/edit-batching-nudge.ts +154 -0
- package/hooks/genome-scribe-hook.ts +219 -0
- package/hooks/hooks.json +294 -0
- package/hooks/orient-nudge-hook.ts +242 -0
- package/hooks/policy-enforce.ts +214 -0
- package/hooks/post-tool-use-embedding.ts +93 -0
- package/hooks/post-tool-use-genome.sh +37 -0
- package/hooks/post-tool-use-genome.ts +69 -0
- package/hooks/posttooluse-correlate.ts +122 -0
- package/hooks/posttooluse-dedupe-output.ts +241 -0
- package/hooks/posttooluse-genome-refresh.ts +223 -0
- package/hooks/posttooluse-native-nudge.ts +205 -0
- package/hooks/posttooluse-stale-result.ts +277 -0
- package/hooks/pretooluse-bash.ts +63 -0
- package/hooks/pretooluse-budget-guard.ts +318 -0
- package/hooks/pretooluse-common.ts +985 -0
- package/hooks/pretooluse-eco-router.ts +196 -0
- package/hooks/pretooluse-edit.sh +93 -0
- package/hooks/pretooluse-edit.ts +197 -0
- package/hooks/pretooluse-glob.ts +70 -0
- package/hooks/pretooluse-grep.sh +85 -0
- package/hooks/pretooluse-grep.ts +96 -0
- package/hooks/pretooluse-notebookedit.ts +121 -0
- package/hooks/pretooluse-read.sh +118 -0
- package/hooks/pretooluse-read.ts +118 -0
- package/hooks/pretooluse-task.ts +130 -0
- package/hooks/pretooluse-webfetch.ts +66 -0
- package/hooks/pretooluse-websearch.ts +85 -0
- package/hooks/pretooluse-write.ts +128 -0
- package/hooks/pulse-emit.ts +197 -0
- package/hooks/session-end-consolidate.sh +35 -0
- package/hooks/session-end-consolidate.ts +188 -0
- package/hooks/session-end-stats-gc.ts +80 -0
- package/hooks/session-log-append.sh +94 -0
- package/hooks/session-log-append.ts +116 -0
- package/hooks/session-start.ts +993 -0
- package/hooks/sessionend-hook-health-nudge.ts +451 -0
- package/hooks/sessionend-savings-nudge.ts +318 -0
- package/hooks/sessionend-status-line-nudge.ts +296 -0
- package/hooks/sessionstart-brief.ts +140 -0
- package/hooks/sessionstart-cost-refactor.ts +95 -0
- package/hooks/sessionstart-efficient.ts +110 -0
- package/hooks/sessionstart-genome-author.ts +93 -0
- package/hooks/sessionstart-lean-tools.ts +98 -0
- package/hooks/sessionstart-search.ts +97 -0
- package/hooks/stop-accounting.ts +152 -0
- package/hooks/subagent-stop-rollup.ts +162 -0
- package/hooks/userpromptsubmit-brief-trigger.ts +156 -0
- package/package.json +56 -0
- package/ports/README.md +108 -0
- package/ports/cursor/mcp.json +11 -0
- package/ports/goose/recipe.yaml +26 -0
- package/scripts/ashlr-mcp.ts +40 -0
- package/scripts/auto-update.ts +177 -0
- package/scripts/baseline-scan.ts +831 -0
- package/scripts/bench-orchestrate.ts +377 -0
- package/scripts/benchmark-refs.ts +292 -0
- package/scripts/bootstrap.mjs +100 -0
- package/scripts/brief-eval.ts +234 -0
- package/scripts/bump-version.ts +82 -0
- package/scripts/bun-resolve.d.mts +11 -0
- package/scripts/bun-resolve.mjs +59 -0
- package/scripts/calibrate-grep.ts +467 -0
- package/scripts/capture-grep-workload.ts +260 -0
- package/scripts/check-tier.ts +61 -0
- package/scripts/check-version-sync.ts +97 -0
- package/scripts/cli-orchestrate-status.ts +386 -0
- package/scripts/cli-orchestrate.ts +303 -0
- package/scripts/cli.ts +478 -0
- package/scripts/cloud-smoke-test.ts +313 -0
- package/scripts/coach-report.ts +373 -0
- package/scripts/context-db-migrate.ts +137 -0
- package/scripts/context-status.ts +43 -0
- package/scripts/demo-run.ts +255 -0
- package/scripts/deploy-smoke.sh +140 -0
- package/scripts/doctor.ts +992 -0
- package/scripts/embed-file-worker.ts +104 -0
- package/scripts/embed-tune.ts +308 -0
- package/scripts/errors-report.ts +428 -0
- package/scripts/find-test-leak.ts +69 -0
- package/scripts/generate-badge.ts +357 -0
- package/scripts/genome-auto-consolidate.ts +533 -0
- package/scripts/genome-auto-propose.ts +578 -0
- package/scripts/genome-cloud-pull.ts +363 -0
- package/scripts/genome-cloud-push.ts +382 -0
- package/scripts/genome-cloud-sync.ts +587 -0
- package/scripts/genome-commit-watcher.ts +295 -0
- package/scripts/genome-init.ts +986 -0
- package/scripts/genome-key.ts +233 -0
- package/scripts/genome-keygen.ts +168 -0
- package/scripts/genome-link.ts +59 -0
- package/scripts/genome-refresh-worker.ts +364 -0
- package/scripts/genome-rewrap.ts +90 -0
- package/scripts/genome-synthesizer.ts +679 -0
- package/scripts/genome-team-init.ts +312 -0
- package/scripts/handoff-pack.ts +438 -0
- package/scripts/hook-bootstrap.mjs +75 -0
- package/scripts/hook-timing-reader.ts +371 -0
- package/scripts/hook-timings-report.ts +554 -0
- package/scripts/install-genome-hooks.ts +196 -0
- package/scripts/install-onnx-model.ts +154 -0
- package/scripts/install-permissions.ts +276 -0
- package/scripts/install-status-line.ts +150 -0
- package/scripts/mcp-entrypoint.sh +78 -0
- package/scripts/mcp-entrypoint.ts +130 -0
- package/scripts/mdx-angle-bracket-lint.ts +152 -0
- package/scripts/measure-cold-start.ts +126 -0
- package/scripts/migrate-stats-to-sqlite.ts +86 -0
- package/scripts/ollama-setup.ts +498 -0
- package/scripts/onboarding-wizard.ts +1691 -0
- package/scripts/orchestrate-emit-telemetry.ts +177 -0
- package/scripts/orchestrate-expand.ts +517 -0
- package/scripts/orchestrate-run.ts +744 -0
- package/scripts/print-legend.ts +50 -0
- package/scripts/product-metadata.ts +38 -0
- package/scripts/prune-old-memories.ts +208 -0
- package/scripts/publish.sh +88 -0
- package/scripts/read-calibration.ts +122 -0
- package/scripts/report-crash.ts +226 -0
- package/scripts/run-benchmark.ts +750 -0
- package/scripts/run-root-tests.ts +28 -0
- package/scripts/savings-dashboard.ts +1258 -0
- package/scripts/savings-report-extras.ts +447 -0
- package/scripts/savings-status-line.ts +873 -0
- package/scripts/session-event-emit.ts +266 -0
- package/scripts/session-greet.ts +686 -0
- package/scripts/session-log-report.ts +551 -0
- package/scripts/session-resume.ts +614 -0
- package/scripts/set-hook-mode.ts +83 -0
- package/scripts/smoke-cross-platform.ts +117 -0
- package/scripts/smoke-realtime.ts +257 -0
- package/scripts/smoke-tools.ts +21 -0
- package/scripts/stats-cloud-pull.ts +213 -0
- package/scripts/stats-cloud-sync.ts +261 -0
- package/scripts/telemetry-flush.ts +160 -0
- package/scripts/telemetry-status.ts +266 -0
- package/scripts/timing-budget.ts +35 -0
- package/scripts/ui-animation.ts +120 -0
- package/scripts/ui.ts +431 -0
- package/scripts/upgrade-flow.ts +775 -0
- package/scripts/weekly-digest.ts +394 -0
- package/servers/_accounting.ts +78 -0
- package/servers/_ask-router.ts +84 -0
- package/servers/_ast-chunker.ts +434 -0
- package/servers/_ast-helpers.ts +183 -0
- package/servers/_ast-languages.ts +153 -0
- package/servers/_ast-refactor/_shared.ts +221 -0
- package/servers/_ast-refactor/cross-file-rename.ts +560 -0
- package/servers/_ast-refactor/extract-function.ts +357 -0
- package/servers/_ast-refactor/file-local-rename.ts +172 -0
- package/servers/_ast-refactor.ts +41 -0
- package/servers/_ast-skeleton.ts +107 -0
- package/servers/_bash-summarizers-registry.ts +1096 -0
- package/servers/_crash-dump.ts +210 -0
- package/servers/_cwd-clamp.ts +342 -0
- package/servers/_edit-log.ts +28 -0
- package/servers/_edit-match.ts +236 -0
- package/servers/_edit-validate.ts +196 -0
- package/servers/_embed-calibration.ts +123 -0
- package/servers/_embedding-cache.ts +401 -0
- package/servers/_embedding-model.ts +329 -0
- package/servers/_events.ts +113 -0
- package/servers/_genome-cache.ts +154 -0
- package/servers/_genome-commits.ts +172 -0
- package/servers/_genome-crypto-v2.ts +242 -0
- package/servers/_genome-crypto.ts +259 -0
- package/servers/_genome-discoveries.ts +140 -0
- package/servers/_genome-embed-populator.ts +216 -0
- package/servers/_genome-freshness.ts +134 -0
- package/servers/_genome-issues.ts +171 -0
- package/servers/_genome-live.ts +263 -0
- package/servers/_genome-prs.ts +188 -0
- package/servers/_genome-search.ts +479 -0
- package/servers/_genome-sync.ts +297 -0
- package/servers/_history-tracker.ts +279 -0
- package/servers/_http-helpers.ts +151 -0
- package/servers/_identity-hash.ts +151 -0
- package/servers/_llm-providers/anthropic.ts +132 -0
- package/servers/_llm-providers/cloud.ts +195 -0
- package/servers/_llm-providers/index.ts +350 -0
- package/servers/_llm-providers/local.ts +127 -0
- package/servers/_llm-providers/onnx.ts +393 -0
- package/servers/_llm-providers/types.ts +27 -0
- package/servers/_manifest-v2.ts +447 -0
- package/servers/_mcp-host.ts +93 -0
- package/servers/_nudge-events.ts +451 -0
- package/servers/_orchestrate-executor.ts +316 -0
- package/servers/_prefetch.ts +435 -0
- package/servers/_pricing.ts +256 -0
- package/servers/_pro.ts +381 -0
- package/servers/_read-cache.ts +44 -0
- package/servers/_router-handlers.ts +46 -0
- package/servers/_router.ts +55 -0
- package/servers/_run-with-timeout.ts +173 -0
- package/servers/_savings-render.ts +214 -0
- package/servers/_stats-sqlite.ts +640 -0
- package/servers/_stats.ts +1183 -0
- package/servers/_status-line-cells.ts +469 -0
- package/servers/_streaks.ts +162 -0
- package/servers/_summarize.ts +208 -0
- package/servers/_task-graph-render.ts +217 -0
- package/servers/_task-graph.ts +545 -0
- package/servers/_telemetry.ts +719 -0
- package/servers/_test-parsers.ts +530 -0
- package/servers/_test-watch.ts +626 -0
- package/servers/_text-helpers.ts +37 -0
- package/servers/_token-measure.ts +160 -0
- package/servers/_tool-base.ts +248 -0
- package/servers/_weekly-digest.ts +391 -0
- package/servers/ask-server-handlers.ts +49 -0
- package/servers/ask-server.ts +174 -0
- package/servers/bash-server-handlers.ts +138 -0
- package/servers/bash-server.ts +1136 -0
- package/servers/bench.ts +186 -0
- package/servers/diff-semantic-server-handlers.ts +39 -0
- package/servers/diff-semantic-server.ts +566 -0
- package/servers/diff-server-handlers.ts +317 -0
- package/servers/diff-server.ts +20 -0
- package/servers/edit-server-handlers.ts +31 -0
- package/servers/edit-server.ts +209 -0
- package/servers/edit-structural-server-handlers.ts +322 -0
- package/servers/efficiency-server-handlers.ts +161 -0
- package/servers/efficiency-server.ts +1135 -0
- package/servers/flush-server-handlers.ts +21 -0
- package/servers/flush-server.ts +19 -0
- package/servers/genome-server-handlers.ts +118 -0
- package/servers/genome-server.ts +397 -0
- package/servers/github-server-handlers.ts +187 -0
- package/servers/github-server.ts +856 -0
- package/servers/glob-server-handlers.ts +233 -0
- package/servers/glob-server.ts +20 -0
- package/servers/grep-server-handlers.ts +61 -0
- package/servers/grep-server.ts +564 -0
- package/servers/http-server-handlers.ts +36 -0
- package/servers/http-server.ts +149 -0
- package/servers/logs-server-handlers.ts +42 -0
- package/servers/logs-server.ts +359 -0
- package/servers/ls-server-handlers.ts +166 -0
- package/servers/ls-server.ts +20 -0
- package/servers/multi-edit-server-handlers.ts +51 -0
- package/servers/multi-edit-server.ts +422 -0
- package/servers/notebook-edit-server-handlers.ts +34 -0
- package/servers/notebook-edit-server.ts +181 -0
- package/servers/orient-server-handlers.ts +52 -0
- package/servers/orient-server.ts +436 -0
- package/servers/pipe-server-handlers.ts +68 -0
- package/servers/pipe-server.ts +300 -0
- package/servers/read-server-handlers.ts +42 -0
- package/servers/read-server.ts +206 -0
- package/servers/rename-file-server-handlers.ts +67 -0
- package/servers/rename-file-server.ts +699 -0
- package/servers/savings-server-handlers.ts +27 -0
- package/servers/savings-server.ts +54 -0
- package/servers/search-replace-regex-server-handlers.ts +96 -0
- package/servers/search-replace-regex-server.ts +751 -0
- package/servers/sql-server-handlers.ts +58 -0
- package/servers/sql-server.ts +505 -0
- package/servers/task-server-handlers.ts +358 -0
- package/servers/task-server.ts +24 -0
- package/servers/test-server-handlers.ts +351 -0
- package/servers/test-server.ts +20 -0
- package/servers/tree-server-handlers.ts +503 -0
- package/servers/tree-server.ts +20 -0
- package/servers/webfetch-server-handlers.ts +166 -0
- package/servers/webfetch-server.ts +20 -0
- package/servers/websearch-server-handlers.ts +215 -0
- package/servers/websearch-server.ts +19 -0
- package/servers/write-server-handlers.ts +27 -0
- package/servers/write-server.ts +97 -0
- package/skills/ashlr-brief/SKILL.md +80 -0
- package/skills/ashlr-codex-doctor/SKILL.md +21 -0
- package/skills/ashlr-codex-efficient-tools/SKILL.md +17 -0
- package/skills/ashlr-codex-genome-refresh/SKILL.md +20 -0
- package/skills/ashlr-codex-parallel-explore/SKILL.md +20 -0
- package/skills/ashlr-codex-savings/SKILL.md +17 -0
- package/skills/ashlr-cost-refactor/SKILL.md +50 -0
- package/skills/ashlr-efficient/SKILL.md +64 -0
- package/skills/ashlr-genome-author/SKILL.md +43 -0
- package/skills/ashlr-lean-tools/SKILL.md +43 -0
- package/skills/ashlr-search/SKILL.md +46 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* bootstrap.mjs — node-level trampoline that ensures bun is available
|
|
4
|
+
* before handing off to scripts/mcp-entrypoint.ts.
|
|
5
|
+
*
|
|
6
|
+
* Why a node shim? Claude Code's plugin manifest spawns a single `command`.
|
|
7
|
+
* If that command is `bun` and bun isn't installed, the spawn fails before
|
|
8
|
+
* any of our code runs — chicken-and-egg. Node is reliably present because
|
|
9
|
+
* Claude Code itself runs on node, so we use it as the trampoline.
|
|
10
|
+
*
|
|
11
|
+
* Flow:
|
|
12
|
+
* 1. Check for bun on PATH (`bun --version`).
|
|
13
|
+
* 2. If missing, auto-install via the upstream installer (unless
|
|
14
|
+
* ASHLR_NO_AUTO_INSTALL=1), then prepend the default bun bin dir to
|
|
15
|
+
* PATH so the current process can find it without a shell restart.
|
|
16
|
+
* 3. Exec `bun run scripts/mcp-entrypoint.ts <forwarded-args>` with stdio
|
|
17
|
+
* wired through so the MCP protocol owns stdin/stdout.
|
|
18
|
+
*
|
|
19
|
+
* Any diagnostic output goes to stderr — stdout is reserved for MCP traffic.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
23
|
+
import { platform } from "node:os";
|
|
24
|
+
import { dirname, join, resolve } from "node:path";
|
|
25
|
+
import { fileURLToPath } from "node:url";
|
|
26
|
+
import { hasBun, prependBunToPath } from "./bun-resolve.mjs";
|
|
27
|
+
|
|
28
|
+
const PLUGIN_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "..");
|
|
29
|
+
const IS_WINDOWS = platform() === "win32";
|
|
30
|
+
|
|
31
|
+
function log(msg) {
|
|
32
|
+
process.stderr.write(`[ashlr:bootstrap] ${msg}\n`);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function autoInstallBun() {
|
|
36
|
+
if (process.env.ASHLR_NO_AUTO_INSTALL === "1") {
|
|
37
|
+
log("bun not found and ASHLR_NO_AUTO_INSTALL=1 — refusing to auto-install.");
|
|
38
|
+
log("install manually: https://bun.sh/docs/installation");
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
log("bun not found on PATH — installing from https://bun.sh ...");
|
|
42
|
+
const result = IS_WINDOWS
|
|
43
|
+
? spawnSync(
|
|
44
|
+
"powershell",
|
|
45
|
+
[
|
|
46
|
+
"-NoProfile",
|
|
47
|
+
"-ExecutionPolicy",
|
|
48
|
+
"Bypass",
|
|
49
|
+
"-Command",
|
|
50
|
+
"irm bun.sh/install.ps1 | iex",
|
|
51
|
+
],
|
|
52
|
+
{ stdio: ["ignore", "inherit", "inherit"] },
|
|
53
|
+
)
|
|
54
|
+
: spawnSync(
|
|
55
|
+
"bash",
|
|
56
|
+
["-lc", "curl -fsSL https://bun.sh/install | bash"],
|
|
57
|
+
{ stdio: ["ignore", "inherit", "inherit"] },
|
|
58
|
+
);
|
|
59
|
+
if (result.status !== 0) {
|
|
60
|
+
log("bun installer failed. Install manually: https://bun.sh/docs/installation");
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
prependBunToPath();
|
|
64
|
+
if (!hasBun()) {
|
|
65
|
+
log("bun installed but still not visible — open a new terminal and retry.");
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
log("bun installed successfully.");
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// --- Main ---
|
|
72
|
+
|
|
73
|
+
if (!hasBun()) {
|
|
74
|
+
// Default install dir may exist from a prior install that hadn't made it
|
|
75
|
+
// onto PATH yet — try it before downloading anything.
|
|
76
|
+
prependBunToPath();
|
|
77
|
+
if (!hasBun()) autoInstallBun();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const entrypoint = join(PLUGIN_ROOT, "scripts", "mcp-entrypoint.ts");
|
|
81
|
+
const child = spawn("bun", ["run", entrypoint, ...process.argv.slice(2)], {
|
|
82
|
+
cwd: PLUGIN_ROOT,
|
|
83
|
+
stdio: ["inherit", "inherit", "inherit"],
|
|
84
|
+
env: process.env,
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
for (const signal of ["SIGINT", "SIGTERM"]) {
|
|
88
|
+
process.on(signal, () => {
|
|
89
|
+
try {
|
|
90
|
+
child.kill(signal);
|
|
91
|
+
} catch {
|
|
92
|
+
// Child may already be gone.
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
child.on("exit", (code, signal) => {
|
|
98
|
+
if (signal) process.kill(process.pid, signal);
|
|
99
|
+
else process.exit(code ?? 0);
|
|
100
|
+
});
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
/**
|
|
3
|
+
* brief-eval.ts — three-arm evaluation of /ashlr-brief output reduction.
|
|
4
|
+
*
|
|
5
|
+
* Compares three response styles for the same prompts:
|
|
6
|
+
* - "verbose" — baseline, no instructions
|
|
7
|
+
* - "brief" — ashlr-brief skill ruleset injected at the chosen level
|
|
8
|
+
* - "control" — generic "be terse" instruction (no skill ruleset)
|
|
9
|
+
*
|
|
10
|
+
* The control arm prevents conflating generic brevity with the skill's
|
|
11
|
+
* specific compression value (matches caveman's eval discipline).
|
|
12
|
+
*
|
|
13
|
+
* Output: JSON with per-prompt + aggregate input/output token counts and
|
|
14
|
+
* reduction percentages, plus a correctness sentinel (response must
|
|
15
|
+
* mention key terms expected for the prompt).
|
|
16
|
+
*
|
|
17
|
+
* This script does NOT call a real LLM by default — it operates against a
|
|
18
|
+
* canned prompt suite + reference responses to keep CI deterministic. Pass
|
|
19
|
+
* `--live` to make actual API calls (requires ANTHROPIC_API_KEY or
|
|
20
|
+
* ASHLR_PRO_TOKEN).
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* bun run scripts/brief-eval.ts # canned mode
|
|
24
|
+
* bun run scripts/brief-eval.ts --level concise # set brief level
|
|
25
|
+
* bun run scripts/brief-eval.ts --live # real API calls
|
|
26
|
+
* bun run scripts/brief-eval.ts --out eval-results.json
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { writeFileSync } from "fs";
|
|
30
|
+
|
|
31
|
+
interface EvalCase {
|
|
32
|
+
id: string;
|
|
33
|
+
prompt: string;
|
|
34
|
+
/** Tokens the must appear in any valid response (correctness sentinel). */
|
|
35
|
+
required: string[];
|
|
36
|
+
/** Canned baseline response (no brief). Used in non-live mode. */
|
|
37
|
+
verbose: string;
|
|
38
|
+
/** Canned brief response (level-aware applied). */
|
|
39
|
+
brief: { lite: string; standard: string; concise: string };
|
|
40
|
+
/** Canned control ("be terse" instruction, no skill). */
|
|
41
|
+
control: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const CASES: EvalCase[] = [
|
|
45
|
+
{
|
|
46
|
+
id: "explain-fn",
|
|
47
|
+
prompt: "Explain what the validateToken function does.",
|
|
48
|
+
required: ["validateToken", "JWT", "expiry"],
|
|
49
|
+
verbose:
|
|
50
|
+
`I'll now look at the validateToken function for you. Let me explain what it does. Looking at this, I can see that the function validateToken is essentially doing a few things in order. First, it accepts a JWT (JSON Web Token) as input. It then verifies the signature using the secret key. After that, it checks the expiry timestamp to make sure the token hasn't expired. If everything checks out, it returns the decoded payload. Otherwise, it throws a descriptive error. So in summary, validateToken is responsible for verifying JWTs.`,
|
|
51
|
+
brief: {
|
|
52
|
+
lite:
|
|
53
|
+
`The validateToken function accepts a JWT, verifies the signature with the secret key, checks the expiry, and returns the decoded payload (or throws on failure).`,
|
|
54
|
+
standard:
|
|
55
|
+
`validateToken accepts a JWT, verifies its signature, checks expiry, and returns the decoded payload — or throws on failure.`,
|
|
56
|
+
concise:
|
|
57
|
+
`validateToken: JWT in → verify signature → check expiry → decoded payload out (throws on failure).`,
|
|
58
|
+
},
|
|
59
|
+
control:
|
|
60
|
+
`The validateToken function takes a JWT, verifies its signature with the secret key, checks the expiry, and returns the decoded payload. It throws an error on failure.`,
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
id: "fix-bug",
|
|
64
|
+
prompt: "How would you fix the off-by-one in the pagination logic?",
|
|
65
|
+
required: ["page", "offset"],
|
|
66
|
+
verbose:
|
|
67
|
+
`Great question — let me think about how to fix this off-by-one error in the pagination logic. So basically, the way pagination typically works is that you have a page number and a page size. The bug here is that when calculating the offset, the code uses page * size instead of (page - 1) * size, which means page 1 actually skips the first batch entirely. To fix this, I would suggest changing the offset calculation to (page - 1) * size, which correctly maps page 1 to offset 0, page 2 to offset size, and so on. We should also update the tests to cover the boundary case where page=1, since that's where the bug manifests most obviously.`,
|
|
68
|
+
brief: {
|
|
69
|
+
lite:
|
|
70
|
+
`The off-by-one is in the offset calculation: \`page * size\` should be \`(page - 1) * size\` so page 1 maps to index 0. Update tests to cover the page=1 boundary.`,
|
|
71
|
+
standard:
|
|
72
|
+
`Fix: change offset to \`(page - 1) * size\`. Page 1 currently skips the first batch (uses \`page * size\`). Add a page=1 boundary test.`,
|
|
73
|
+
concise:
|
|
74
|
+
`Offset bug: \`page * size\` → \`(page - 1) * size\`. Page 1 → index 0. Add page=1 test.`,
|
|
75
|
+
},
|
|
76
|
+
control:
|
|
77
|
+
`Change the offset calculation from \`page * size\` to \`(page - 1) * size\`. This fixes the off-by-one where page 1 was skipping the first batch.`,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "review-pr",
|
|
81
|
+
prompt: "Review this PR description: 'Adds caching to the user lookup endpoint.'",
|
|
82
|
+
required: ["TTL", "invalidation", "motivation"],
|
|
83
|
+
verbose:
|
|
84
|
+
`Thanks for the PR description. Looking at this, I have a few suggestions and questions. First of all, the description is quite minimal — it would be helpful to know more details. For instance, what kind of caching is being used? In-memory, Redis, something else? What's the TTL? How does cache invalidation work — is it time-based, or do you bust the cache when user data changes? Also, what's the motivation behind adding caching here? Is this a performance issue, a cost issue, or proactive optimization? I'd recommend expanding the description to cover the cache backend, the TTL, the invalidation strategy, and the rationale.`,
|
|
85
|
+
brief: {
|
|
86
|
+
lite:
|
|
87
|
+
`The description is too minimal. Specify: cache backend (in-memory? Redis?), TTL, invalidation strategy, and motivation (perf? cost?).`,
|
|
88
|
+
standard:
|
|
89
|
+
`Description too thin. Specify: backend, TTL, invalidation strategy, motivation. PR reviewers can't evaluate trade-offs without these.`,
|
|
90
|
+
concise:
|
|
91
|
+
`Too thin. Need: backend, TTL, invalidation, motivation. Reviewers need trade-offs.`,
|
|
92
|
+
},
|
|
93
|
+
control:
|
|
94
|
+
`Description is too short. Add: cache backend, TTL, invalidation strategy, and the motivation for caching.`,
|
|
95
|
+
},
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
interface ArmResult {
|
|
99
|
+
arm: "verbose" | "brief" | "control";
|
|
100
|
+
level?: "lite" | "standard" | "concise";
|
|
101
|
+
totalInputBytes: number;
|
|
102
|
+
totalOutputBytes: number;
|
|
103
|
+
/** Approximate token estimate using bytes/4 heuristic (consistent across arms). */
|
|
104
|
+
totalOutputTokens: number;
|
|
105
|
+
perCase: Array<{
|
|
106
|
+
id: string;
|
|
107
|
+
outputBytes: number;
|
|
108
|
+
correctnessOk: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function approxTokens(text: string): number {
|
|
113
|
+
return Math.ceil(Buffer.byteLength(text, "utf-8") / 4);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
function checkCorrectness(text: string, required: string[]): boolean {
|
|
117
|
+
return required.every((r) => text.toLowerCase().includes(r.toLowerCase()));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function evalArm(arm: "verbose" | "brief" | "control", level: "lite" | "standard" | "concise"): ArmResult {
|
|
121
|
+
const perCase = CASES.map((c) => {
|
|
122
|
+
let response: string;
|
|
123
|
+
if (arm === "verbose") response = c.verbose;
|
|
124
|
+
else if (arm === "control") response = c.control;
|
|
125
|
+
else response = c.brief[level];
|
|
126
|
+
return {
|
|
127
|
+
id: c.id,
|
|
128
|
+
outputBytes: Buffer.byteLength(response, "utf-8"),
|
|
129
|
+
correctnessOk: checkCorrectness(response, c.required),
|
|
130
|
+
};
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
const totalInputBytes = CASES.reduce((s, c) => s + Buffer.byteLength(c.prompt, "utf-8"), 0);
|
|
134
|
+
const totalOutputBytes = perCase.reduce((s, p) => s + p.outputBytes, 0);
|
|
135
|
+
const totalText = perCase
|
|
136
|
+
.map((p, i) => {
|
|
137
|
+
const c = CASES[i]!;
|
|
138
|
+
if (arm === "verbose") return c.verbose;
|
|
139
|
+
if (arm === "control") return c.control;
|
|
140
|
+
return c.brief[level];
|
|
141
|
+
})
|
|
142
|
+
.join("");
|
|
143
|
+
return {
|
|
144
|
+
arm,
|
|
145
|
+
...(arm === "brief" ? { level } : {}),
|
|
146
|
+
totalInputBytes,
|
|
147
|
+
totalOutputBytes,
|
|
148
|
+
totalOutputTokens: approxTokens(totalText),
|
|
149
|
+
perCase,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
interface EvalReport {
|
|
154
|
+
generatedAt: string;
|
|
155
|
+
level: "lite" | "standard" | "concise";
|
|
156
|
+
arms: ArmResult[];
|
|
157
|
+
reductionVsVerbose: { brief: number; control: number };
|
|
158
|
+
briefReductionVsControl: number;
|
|
159
|
+
correctnessAllOk: boolean;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function runCannedEval(level: "lite" | "standard" | "concise"): EvalReport {
|
|
163
|
+
const verbose = evalArm("verbose", level);
|
|
164
|
+
const brief = evalArm("brief", level);
|
|
165
|
+
const control = evalArm("control", level);
|
|
166
|
+
|
|
167
|
+
const reductionVsVerbose = {
|
|
168
|
+
brief: 1 - brief.totalOutputBytes / verbose.totalOutputBytes,
|
|
169
|
+
control: 1 - control.totalOutputBytes / verbose.totalOutputBytes,
|
|
170
|
+
};
|
|
171
|
+
const briefReductionVsControl = 1 - brief.totalOutputBytes / control.totalOutputBytes;
|
|
172
|
+
const correctnessAllOk = [verbose, brief, control].every((arm) =>
|
|
173
|
+
arm.perCase.every((p) => p.correctnessOk),
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
generatedAt: new Date().toISOString(),
|
|
178
|
+
level,
|
|
179
|
+
arms: [verbose, brief, control],
|
|
180
|
+
reductionVsVerbose,
|
|
181
|
+
briefReductionVsControl,
|
|
182
|
+
correctnessAllOk,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function pct(x: number): string {
|
|
187
|
+
return `${(x * 100).toFixed(1)}%`;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
async function main(): Promise<void> {
|
|
191
|
+
const args = process.argv.slice(2);
|
|
192
|
+
const levelFlag = args.find((a) => a.startsWith("--level"));
|
|
193
|
+
const level = (levelFlag?.split("=")[1] ?? args[args.indexOf("--level") + 1] ?? "standard") as "lite" | "standard" | "concise";
|
|
194
|
+
const outFlag = args.find((a) => a.startsWith("--out"));
|
|
195
|
+
const outPath = outFlag?.split("=")[1] ?? args[args.indexOf("--out") + 1];
|
|
196
|
+
const live = args.includes("--live");
|
|
197
|
+
|
|
198
|
+
if (live) {
|
|
199
|
+
process.stderr.write("[brief-eval] --live mode not yet implemented; falling back to canned mode\n");
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const report = runCannedEval(level);
|
|
203
|
+
|
|
204
|
+
if (outPath) {
|
|
205
|
+
writeFileSync(outPath, JSON.stringify(report, null, 2));
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// Pretty stdout
|
|
209
|
+
process.stdout.write(`ashlr-brief eval (level: ${level})\n`);
|
|
210
|
+
process.stdout.write(` cases: ${CASES.length}\n`);
|
|
211
|
+
process.stdout.write(` output bytes (verbose): ${report.arms[0]!.totalOutputBytes}\n`);
|
|
212
|
+
process.stdout.write(` output bytes (brief): ${report.arms[1]!.totalOutputBytes}\n`);
|
|
213
|
+
process.stdout.write(` output bytes (control): ${report.arms[2]!.totalOutputBytes}\n`);
|
|
214
|
+
process.stdout.write(` brief vs verbose: -${pct(report.reductionVsVerbose.brief)}\n`);
|
|
215
|
+
process.stdout.write(` control vs verbose: -${pct(report.reductionVsVerbose.control)}\n`);
|
|
216
|
+
process.stdout.write(` brief vs control: -${pct(report.briefReductionVsControl)}\n`);
|
|
217
|
+
process.stdout.write(` correctness: ${report.correctnessAllOk ? "preserved" : "FAILED"}\n`);
|
|
218
|
+
if (outPath) process.stdout.write(` written: ${outPath}\n`);
|
|
219
|
+
|
|
220
|
+
// Exit non-zero if reduction targets are missed (CI signal).
|
|
221
|
+
const targets: Record<string, number> = { lite: 0.20, standard: 0.30, concise: 0.45 };
|
|
222
|
+
if (report.reductionVsVerbose.brief < targets[level]!) {
|
|
223
|
+
process.stderr.write(`[brief-eval] FAIL: reduction ${pct(report.reductionVsVerbose.brief)} below target ${pct(targets[level]!)} for level=${level}\n`);
|
|
224
|
+
process.exit(2);
|
|
225
|
+
}
|
|
226
|
+
if (!report.correctnessAllOk) {
|
|
227
|
+
process.stderr.write(`[brief-eval] FAIL: correctness sentinels not met\n`);
|
|
228
|
+
process.exit(3);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (import.meta.main) {
|
|
233
|
+
void main();
|
|
234
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
// bump-version.ts — single source of truth for the plugin manifest version.
|
|
3
|
+
//
|
|
4
|
+
// Writes <new-version> into the public-facing manifests that must always agree
|
|
5
|
+
// (package.json, .claude-plugin/plugin.json, .claude-plugin/marketplace.json,
|
|
6
|
+
// .codex-plugin/plugin.json).
|
|
7
|
+
// Does NOT touch git, tags, or the CHANGELOG — release sequencing stays human/CI
|
|
8
|
+
// controlled. Sub-workspaces (server/, site/, vscode/) version independently and
|
|
9
|
+
// are intentionally excluded.
|
|
10
|
+
//
|
|
11
|
+
// Usage: bun run scripts/bump-version.ts <version>
|
|
12
|
+
// e.g. bun run scripts/bump-version.ts 1.34.0
|
|
13
|
+
//
|
|
14
|
+
// See check-version-sync.ts for the CI gate that enforces agreement.
|
|
15
|
+
|
|
16
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
17
|
+
import { join, dirname } from "node:path";
|
|
18
|
+
import { fileURLToPath } from "node:url";
|
|
19
|
+
|
|
20
|
+
const ROOT = join(dirname(fileURLToPath(import.meta.url)), "..");
|
|
21
|
+
|
|
22
|
+
// SemVer with optional pre-release/build metadata (e.g. 1.34.0, 1.34.0-rc.1).
|
|
23
|
+
const SEMVER = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/;
|
|
24
|
+
|
|
25
|
+
/** Read a JSON manifest, preserving 2-space indentation on write. */
|
|
26
|
+
function readJson(rel: string): { path: string; data: any } {
|
|
27
|
+
const path = join(ROOT, rel);
|
|
28
|
+
return { path, data: JSON.parse(readFileSync(path, "utf8")) };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function writeJson(path: string, data: unknown): void {
|
|
32
|
+
writeFileSync(path, JSON.stringify(data, null, 2) + "\n");
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function bumpVersion(version: string): string[] {
|
|
36
|
+
if (!SEMVER.test(version)) {
|
|
37
|
+
throw new Error(`invalid SemVer: "${version}" (expected e.g. 1.34.0)`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const touched: string[] = [];
|
|
41
|
+
|
|
42
|
+
const pkg = readJson("package.json");
|
|
43
|
+
pkg.data.version = version;
|
|
44
|
+
writeJson(pkg.path, pkg.data);
|
|
45
|
+
touched.push("package.json");
|
|
46
|
+
|
|
47
|
+
const plugin = readJson(".claude-plugin/plugin.json");
|
|
48
|
+
plugin.data.version = version;
|
|
49
|
+
writeJson(plugin.path, plugin.data);
|
|
50
|
+
touched.push(".claude-plugin/plugin.json");
|
|
51
|
+
|
|
52
|
+
const codexPlugin = readJson(".codex-plugin/plugin.json");
|
|
53
|
+
codexPlugin.data.version = version;
|
|
54
|
+
writeJson(codexPlugin.path, codexPlugin.data);
|
|
55
|
+
touched.push(".codex-plugin/plugin.json");
|
|
56
|
+
|
|
57
|
+
const mkt = readJson(".claude-plugin/marketplace.json");
|
|
58
|
+
if (mkt.data.metadata) mkt.data.metadata.version = version;
|
|
59
|
+
if (Array.isArray(mkt.data.plugins)) {
|
|
60
|
+
for (const p of mkt.data.plugins) p.version = version;
|
|
61
|
+
}
|
|
62
|
+
writeJson(mkt.path, mkt.data);
|
|
63
|
+
touched.push(".claude-plugin/marketplace.json");
|
|
64
|
+
|
|
65
|
+
return touched;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (import.meta.main) {
|
|
69
|
+
const version = process.argv[2];
|
|
70
|
+
if (!version) {
|
|
71
|
+
console.error("usage: bun run scripts/bump-version.ts <version>");
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
try {
|
|
75
|
+
const touched = bumpVersion(version);
|
|
76
|
+
console.log(`✓ bumped to ${version}:`);
|
|
77
|
+
for (const f of touched) console.log(` - ${f}`);
|
|
78
|
+
} catch (e) {
|
|
79
|
+
console.error(`✗ ${(e as Error).message}`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Type declarations for bun-resolve.mjs. The implementation stays as .mjs
|
|
2
|
+
// because scripts/bootstrap.mjs and scripts/hook-bootstrap.mjs run under
|
|
3
|
+
// plain node (no TypeScript loader) — they can't import a .ts/.mts source.
|
|
4
|
+
// TypeScript consumers (scripts/doctor.ts) resolve to this sidecar via
|
|
5
|
+
// bundler module resolution.
|
|
6
|
+
|
|
7
|
+
export const BUN_BIN_DIR: string;
|
|
8
|
+
export function bunBinaryPath(): string;
|
|
9
|
+
export function hasBun(): boolean;
|
|
10
|
+
export function prependBunToPath(): void;
|
|
11
|
+
export function bunBinaryOnDisk(): string | null;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* bun-resolve.mjs — shared primitives for locating bun across:
|
|
3
|
+
* - scripts/bootstrap.mjs (MCP server trampoline; also installs)
|
|
4
|
+
* - scripts/hook-bootstrap.mjs (hook trampoline; never installs)
|
|
5
|
+
* - scripts/doctor.ts (status reporting)
|
|
6
|
+
*
|
|
7
|
+
* Rationale: all three need the same "is bun reachable, and if not is it
|
|
8
|
+
* already on disk under ~/.bun/bin" logic. Keeping that in one place means
|
|
9
|
+
* the hook trampoline and doctor agree with bootstrap about what counts as
|
|
10
|
+
* "installed" — otherwise doctor could falsely report missing while the
|
|
11
|
+
* trampoline silently succeeds (or vice versa).
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { spawnSync } from "node:child_process";
|
|
15
|
+
import { existsSync } from "node:fs";
|
|
16
|
+
import { homedir, platform } from "node:os";
|
|
17
|
+
import { delimiter, join } from "node:path";
|
|
18
|
+
|
|
19
|
+
const IS_WINDOWS = platform() === "win32";
|
|
20
|
+
|
|
21
|
+
function userHome() {
|
|
22
|
+
return process.env.HOME || process.env.USERPROFILE || homedir();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const BUN_BIN_DIR = join(userHome(), ".bun", "bin");
|
|
26
|
+
|
|
27
|
+
/** Absolute path to where the bun binary lives under ~/.bun/bin (.exe on Windows). */
|
|
28
|
+
export function bunBinaryPath() {
|
|
29
|
+
return join(BUN_BIN_DIR, IS_WINDOWS ? "bun.exe" : "bun");
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** True when `bun --version` returns 0 via the current PATH. */
|
|
33
|
+
export function hasBun() {
|
|
34
|
+
const result = spawnSync("bun", ["--version"], { stdio: "ignore" });
|
|
35
|
+
return result.status === 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* If ~/.bun/bin exists on disk, prepend it to process.env.PATH (only if not
|
|
40
|
+
* already present). Safe to call multiple times. No-op if the dir is missing.
|
|
41
|
+
*/
|
|
42
|
+
export function prependBunToPath() {
|
|
43
|
+
if (!existsSync(BUN_BIN_DIR)) return;
|
|
44
|
+
const current = process.env.PATH || "";
|
|
45
|
+
const parts = current.split(delimiter);
|
|
46
|
+
if (!parts.includes(BUN_BIN_DIR)) {
|
|
47
|
+
process.env.PATH = `${BUN_BIN_DIR}${delimiter}${current}`;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Returns the absolute path to the bun binary on disk if it exists there,
|
|
53
|
+
* otherwise null. Used by doctor to distinguish "missing" from
|
|
54
|
+
* "installed-but-not-on-PATH".
|
|
55
|
+
*/
|
|
56
|
+
export function bunBinaryOnDisk() {
|
|
57
|
+
const p = bunBinaryPath();
|
|
58
|
+
return existsSync(p) ? p : null;
|
|
59
|
+
}
|