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,78 @@
|
|
|
1
|
+
# Ask Claude Code to install ashlr for you
|
|
2
|
+
|
|
3
|
+
Copy everything in the fenced block below and paste it into a Claude Code
|
|
4
|
+
session. Claude Code will drive the whole install end-to-end, reload or restart
|
|
5
|
+
included, and report the final `/ashlr-doctor` result back to you.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
````
|
|
10
|
+
Install the ashlr-plugin for me. Follow these steps in order. Do not skip or
|
|
11
|
+
reorder. Report exactly what happened after each step.
|
|
12
|
+
|
|
13
|
+
1. Run in a Bash shell:
|
|
14
|
+
curl -fsSL https://plugin.ashlr.ai/install.sh | bash
|
|
15
|
+
If it exits non-zero, stop and show me the full stderr. Don't try to
|
|
16
|
+
work around failures — I want to see them.
|
|
17
|
+
|
|
18
|
+
2. Run these Claude Code slash commands:
|
|
19
|
+
/plugin marketplace add ashlrai/ashlr-plugin
|
|
20
|
+
/plugin install ashlr@ashlr-marketplace
|
|
21
|
+
If either command errors, show the exact error verbatim and stop.
|
|
22
|
+
|
|
23
|
+
3. Then run:
|
|
24
|
+
/reload-plugins
|
|
25
|
+
This forces Claude Code to pick up the newly installed plugin. If
|
|
26
|
+
/reload-plugins is unavailable or fails, tell me:
|
|
27
|
+
"Fully quit and restart Claude Code now, then tell me when you're back."
|
|
28
|
+
Then stop and wait for me before continuing.
|
|
29
|
+
|
|
30
|
+
4. Then run:
|
|
31
|
+
/ashlr-doctor
|
|
32
|
+
Capture and report the full output. Summarize:
|
|
33
|
+
- total checks
|
|
34
|
+
- passes
|
|
35
|
+
- failures (if any, list each with its message)
|
|
36
|
+
|
|
37
|
+
5. If /ashlr-doctor reports 0 failures, ask me:
|
|
38
|
+
"Doctor is clean. Want me to initialize a genome for this project
|
|
39
|
+
(/ashlr-genome-init) and then run the /ashlr-tour?"
|
|
40
|
+
Only run those two if I say yes. If I say no, stop here.
|
|
41
|
+
|
|
42
|
+
Source: https://github.com/ashlrai/ashlr-plugin
|
|
43
|
+
Landing: https://plugin.ashlr.ai/
|
|
44
|
+
License: MIT · No account · Telemetry off by default; explicit opt-in only
|
|
45
|
+
````
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
That's it. Claude Code runs the shell command, installs from the marketplace,
|
|
50
|
+
reloads plugins or asks you for a full restart, self-diagnoses, and optionally
|
|
51
|
+
bootstraps a genome + tour. If anything fails along the way, you'll see the
|
|
52
|
+
exact error and can decide what to do next.
|
|
53
|
+
|
|
54
|
+
## If you'd rather do it manually
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
# 1. terminal
|
|
58
|
+
curl -fsSL https://plugin.ashlr.ai/install.sh | bash
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
Then inside Claude Code:
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
/plugin marketplace add ashlrai/ashlr-plugin
|
|
65
|
+
/plugin install ashlr@ashlr-marketplace
|
|
66
|
+
/reload-plugins
|
|
67
|
+
/ashlr-doctor
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
If `/reload-plugins` is unavailable or `/ashlr-doctor` does not see the plugin,
|
|
71
|
+
fully quit and restart Claude Code, then run `/ashlr-doctor` again.
|
|
72
|
+
|
|
73
|
+
If doctor is clean:
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
/ashlr-genome-init
|
|
77
|
+
/ashlr-tour
|
|
78
|
+
```
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# Installing ashlr-plugin on Windows
|
|
2
|
+
|
|
3
|
+
ashlr-plugin runs on Windows via [Bun for Windows](https://bun.sh/docs/installation#windows).
|
|
4
|
+
All hooks are TypeScript files invoked with `bun run` — no bash or POSIX shell required.
|
|
5
|
+
|
|
6
|
+
## Prerequisites
|
|
7
|
+
|
|
8
|
+
1. **Bun for Windows** (1.x or later) — auto-installed by the marketplace flow the first time the MCP server starts. You don't need to install it up-front.
|
|
9
|
+
|
|
10
|
+
Manual install (only if you set `ASHLR_NO_AUTO_INSTALL=1` or want to pre-install):
|
|
11
|
+
|
|
12
|
+
```powershell
|
|
13
|
+
powershell -c "irm bun.sh/install.ps1 | iex"
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
2. **Claude Code** — install the standard way from [claude.ai/claude-code](https://claude.ai/claude-code).
|
|
17
|
+
|
|
18
|
+
3. **Git for Windows** — required for clone and git-related tools (`ashlr__diff`, commit attribution).
|
|
19
|
+
Download from [git-scm.com](https://git-scm.com/download/win).
|
|
20
|
+
|
|
21
|
+
4. **ripgrep** (optional, improves `ashlr__grep` performance)
|
|
22
|
+
|
|
23
|
+
```powershell
|
|
24
|
+
winget install BurntSushi.ripgrep.MSVC
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### How bun auto-install works
|
|
28
|
+
|
|
29
|
+
`plugin.json` spawns `node scripts/bootstrap.mjs`. The bootstrap checks for `bun`
|
|
30
|
+
on PATH; if missing it runs `irm bun.sh/install.ps1 | iex` (Windows) or
|
|
31
|
+
`curl -fsSL https://bun.sh/install | bash` (macOS/Linux), prepends the default
|
|
32
|
+
bun install dir to the current process's PATH, and then execs `bun run` to
|
|
33
|
+
start the real MCP entrypoint.
|
|
34
|
+
|
|
35
|
+
Set `ASHLR_NO_AUTO_INSTALL=1` in your environment to disable this behaviour —
|
|
36
|
+
the bootstrap will exit with a manual-install message instead.
|
|
37
|
+
|
|
38
|
+
## Install
|
|
39
|
+
|
|
40
|
+
Run the installer — it handles cloning, dependency install, and stale-cache cleanup:
|
|
41
|
+
|
|
42
|
+
```powershell
|
|
43
|
+
irm https://raw.githubusercontent.com/ashlrai/ashlr-plugin/main/docs/install.ps1 | iex
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
If Bun is not installed, the script will ask:
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
[ashlr] Bun is required but not found.
|
|
50
|
+
[ashlr] Install Bun now? (Y/n)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Press Enter (or Y) to let the installer fetch and configure Bun automatically. If you
|
|
54
|
+
decline, install Bun manually first and re-run.
|
|
55
|
+
|
|
56
|
+
The installer clones to:
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
%USERPROFILE%\.claude\plugins\cache\ashlr-marketplace\ashlr\<version>\
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
This matches the path Claude Code's marketplace flow expects, so `/plugin install` is
|
|
63
|
+
instant and re-runs update the active copy rather than creating orphan directories.
|
|
64
|
+
|
|
65
|
+
After the script completes, run these two commands inside Claude Code:
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
/plugin marketplace add ashlrai/ashlr-plugin
|
|
69
|
+
/plugin install ashlr@ashlr-marketplace
|
|
70
|
+
/reload-plugins
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Then run `/ashlr-status`. If `/reload-plugins` is unavailable or the status
|
|
74
|
+
check does not see ashlr, fully quit and restart Claude Code.
|
|
75
|
+
|
|
76
|
+
## Migration note
|
|
77
|
+
|
|
78
|
+
If you previously installed with an older version of this script, you may have an orphan
|
|
79
|
+
copy at `%USERPROFILE%\.claude\plugins\ashlr-plugin\`. It is safe to delete that directory
|
|
80
|
+
manually — it is not referenced by Claude Code's marketplace flow.
|
|
81
|
+
|
|
82
|
+
## Bun auto-install
|
|
83
|
+
|
|
84
|
+
Both `install.ps1` (Windows) and `install.sh` (macOS/Linux) offer an interactive Bun
|
|
85
|
+
install prompt when Bun is missing. On Windows:
|
|
86
|
+
|
|
87
|
+
- The script runs `irm bun.sh/install.ps1 | iex` via an inner `powershell` call.
|
|
88
|
+
- After install it refreshes `PATH` in the current session and re-checks.
|
|
89
|
+
- If Bun still isn't on PATH (rare, requires a new shell), exit 1 with instructions.
|
|
90
|
+
|
|
91
|
+
On macOS/Linux, `install.sh` only offers the prompt when stdin is a terminal (TTY). In
|
|
92
|
+
non-interactive/piped mode it falls through to the original error message.
|
|
93
|
+
|
|
94
|
+
## Shell behavior
|
|
95
|
+
|
|
96
|
+
On Windows, `ashlr__bash` uses **PowerShell** (`pwsh` if available, otherwise `powershell`)
|
|
97
|
+
instead of `/bin/sh`. This means:
|
|
98
|
+
|
|
99
|
+
- Commands like `ls`, `cat`, `rm` use their PowerShell aliases, not POSIX tools.
|
|
100
|
+
- If you need POSIX shell behavior, install [Git for Windows](https://git-scm.com) and
|
|
101
|
+
set `SHELL=C:\Program Files\Git\bin\bash.exe` in your environment.
|
|
102
|
+
|
|
103
|
+
## Key file permissions (genome encryption)
|
|
104
|
+
|
|
105
|
+
On POSIX systems, `~/.ashlr/team-keys/*.key` files are protected with `chmod 0600`.
|
|
106
|
+
On Windows, NTFS does not support POSIX ACLs. ashlr-plugin logs a one-time warning
|
|
107
|
+
and continues — the file is written but not restricted at the OS level.
|
|
108
|
+
|
|
109
|
+
Recommended mitigations (choose one):
|
|
110
|
+
|
|
111
|
+
- **BitLocker**: Encrypt the entire volume containing your user profile.
|
|
112
|
+
- **Windows EFS**: Right-click `%USERPROFILE%\.ashlr\team-keys\` in Explorer,
|
|
113
|
+
Properties > Advanced > Encrypt contents.
|
|
114
|
+
- **Dedicated protected directory**: Move key storage to a BitLocker-protected
|
|
115
|
+
secondary drive or VeraCrypt container.
|
|
116
|
+
|
|
117
|
+
## Troubleshooting
|
|
118
|
+
|
|
119
|
+
| Symptom | Fix |
|
|
120
|
+
|---------|-----|
|
|
121
|
+
| `irm ... \| iex` blocked by execution policy | Run `Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser` first, then re-run |
|
|
122
|
+
| `bun: command not found` after auto-install | Open a new terminal — PATH updates require a new session |
|
|
123
|
+
| `git: command not found` | Install [Git for Windows](https://git-scm.com/download/win) and ensure it's on PATH |
|
|
124
|
+
| `rg: command not found` | Install via `winget install BurntSushi.ripgrep.MSVC` or skip (`ashlr__grep` falls back gracefully) |
|
|
125
|
+
| Hook errors mentioning `bash` | Ensure hooks.json points at `.ts` files (not `.sh`). Run `bun run scripts/doctor.ts` |
|
|
126
|
+
| Key file warning on every session | Expected on Windows — see "Key file permissions" above |
|
|
127
|
+
|
|
128
|
+
## WSL (optional)
|
|
129
|
+
|
|
130
|
+
If you prefer a full Linux environment, install ashlr-plugin inside
|
|
131
|
+
[WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install) using `install.sh`.
|
|
132
|
+
The TypeScript hooks work in WSL without any changes.
|
package/docs/install.ps1
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
# install.ps1 — ashlr-plugin Windows installer
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# irm https://raw.githubusercontent.com/ashlrai/ashlr-plugin/main/docs/install.ps1 | iex
|
|
5
|
+
#
|
|
6
|
+
# Or locally:
|
|
7
|
+
# .\docs\install.ps1
|
|
8
|
+
#
|
|
9
|
+
# Requirements: Bun for Windows, Git for Windows
|
|
10
|
+
# Supports: Windows PowerShell 5.1+, PowerShell 7+
|
|
11
|
+
|
|
12
|
+
Set-StrictMode -Version Latest
|
|
13
|
+
$ErrorActionPreference = "Stop"
|
|
14
|
+
|
|
15
|
+
$PluginRepo = "https://github.com/ashlrai/ashlr-plugin"
|
|
16
|
+
|
|
17
|
+
# Target path mirrors the macOS/Linux marketplace cache structure:
|
|
18
|
+
# ~/.claude/plugins/cache/ashlr-marketplace/ashlr/<version>/
|
|
19
|
+
# Version is resolved from package.json after clone; we use a temp dir first,
|
|
20
|
+
# then move into the versioned slot.
|
|
21
|
+
$CacheBase = Join-Path $env:USERPROFILE ".claude\plugins\cache\ashlr-marketplace\ashlr"
|
|
22
|
+
|
|
23
|
+
function Write-Step([string]$msg) {
|
|
24
|
+
Write-Host "[ashlr] $msg" -ForegroundColor Cyan
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function Write-Ok([string]$msg) {
|
|
28
|
+
Write-Host "[ashlr] $msg" -ForegroundColor Green
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function Write-Warn([string]$msg) {
|
|
32
|
+
Write-Host "[ashlr] WARNING: $msg" -ForegroundColor Yellow
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function Write-Fail([string]$msg) {
|
|
36
|
+
Write-Host "[ashlr] ERROR: $msg" -ForegroundColor Red
|
|
37
|
+
exit 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
# ---- Check prerequisites ----
|
|
41
|
+
|
|
42
|
+
Write-Step "Checking prerequisites..."
|
|
43
|
+
|
|
44
|
+
# Bun — offer auto-install if missing
|
|
45
|
+
if (-not (Get-Command bun -ErrorAction SilentlyContinue)) {
|
|
46
|
+
Write-Host "[ashlr] Bun is required but not found." -ForegroundColor Yellow
|
|
47
|
+
$answer = Read-Host "[ashlr] Install Bun now? (Y/n)"
|
|
48
|
+
if ($answer -eq "" -or $answer -match "^[Yy]") {
|
|
49
|
+
Write-Step "Running Bun installer..."
|
|
50
|
+
try {
|
|
51
|
+
powershell -NoProfile -Command "irm bun.sh/install.ps1 | iex"
|
|
52
|
+
} catch {
|
|
53
|
+
Write-Fail "Bun installer failed: $_"
|
|
54
|
+
}
|
|
55
|
+
# Refresh PATH for the current session
|
|
56
|
+
$env:PATH = [System.Environment]::GetEnvironmentVariable("PATH", "User") + ";" + `
|
|
57
|
+
[System.Environment]::GetEnvironmentVariable("PATH", "Machine")
|
|
58
|
+
if (-not (Get-Command bun -ErrorAction SilentlyContinue)) {
|
|
59
|
+
Write-Fail "Bun was installed but is not on PATH yet. Open a new terminal and re-run this script."
|
|
60
|
+
}
|
|
61
|
+
Write-Ok "Bun installed successfully."
|
|
62
|
+
} else {
|
|
63
|
+
Write-Fail "Bun is not installed. Install it with: powershell -c `"irm bun.sh/install.ps1 | iex`""
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
Write-Ok "Bun $(bun --version) found"
|
|
67
|
+
|
|
68
|
+
if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
|
|
69
|
+
Write-Fail "Git is not installed. Download from https://git-scm.com/download/win"
|
|
70
|
+
}
|
|
71
|
+
Write-Ok "Git $(git --version) found"
|
|
72
|
+
|
|
73
|
+
# ---- Ensure cache base exists ----
|
|
74
|
+
|
|
75
|
+
if (-not (Test-Path $CacheBase)) {
|
|
76
|
+
New-Item -ItemType Directory -Path $CacheBase -Force | Out-Null
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
# ---- Clone to a stable 'current' working dir, then read version ----
|
|
80
|
+
# We clone into a fixed 'current' subdirectory under CacheBase, read the
|
|
81
|
+
# version from package.json, then move it to the versioned slot.
|
|
82
|
+
|
|
83
|
+
$WorkDir = Join-Path $CacheBase "current"
|
|
84
|
+
|
|
85
|
+
if (Test-Path (Join-Path $WorkDir ".git")) {
|
|
86
|
+
Write-Step "Found existing clone — updating..."
|
|
87
|
+
git -C $WorkDir fetch --quiet origin main
|
|
88
|
+
git -C $WorkDir reset --quiet --hard origin/main
|
|
89
|
+
} else {
|
|
90
|
+
if (Test-Path $WorkDir) {
|
|
91
|
+
Remove-Item -Recurse -Force $WorkDir
|
|
92
|
+
}
|
|
93
|
+
Write-Step "Cloning plugin..."
|
|
94
|
+
git clone --quiet $PluginRepo $WorkDir
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
Write-Ok "Plugin source ready."
|
|
98
|
+
|
|
99
|
+
# Read version from package.json
|
|
100
|
+
$pkgJson = Get-Content (Join-Path $WorkDir "package.json") -Raw | ConvertFrom-Json
|
|
101
|
+
$Version = $pkgJson.version
|
|
102
|
+
if (-not $Version) {
|
|
103
|
+
Write-Warn "Could not read version from package.json; defaulting to 'latest'."
|
|
104
|
+
$Version = "latest"
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# ---- Move/copy into versioned slot ----
|
|
108
|
+
|
|
109
|
+
$VersionDir = Join-Path $CacheBase $Version
|
|
110
|
+
|
|
111
|
+
if (Test-Path $VersionDir) {
|
|
112
|
+
# Already exists — remove and replace so update is idempotent
|
|
113
|
+
Remove-Item -Recurse -Force $VersionDir
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
Write-Step "Installing to $VersionDir ..."
|
|
117
|
+
# Use robocopy for a reliable move on Windows 5.1 (Move-Item can fail across drives)
|
|
118
|
+
$null = robocopy $WorkDir $VersionDir /E /NFL /NDL /NJH /NJS /NC /NS /NP
|
|
119
|
+
Remove-Item -Recurse -Force $WorkDir
|
|
120
|
+
|
|
121
|
+
$PluginDir = $VersionDir
|
|
122
|
+
Write-Ok "Plugin at: $PluginDir"
|
|
123
|
+
|
|
124
|
+
# ---- Prune stale sibling versioned directories ----
|
|
125
|
+
# Keep only the newest semver dir; remove the rest.
|
|
126
|
+
|
|
127
|
+
$semverPattern = '^\d+\.\d+\.\d+$'
|
|
128
|
+
$siblingDirs = Get-ChildItem -Path $CacheBase -Directory |
|
|
129
|
+
Where-Object { $_.Name -match $semverPattern } |
|
|
130
|
+
Sort-Object { [Version]$_.Name }
|
|
131
|
+
|
|
132
|
+
if ($siblingDirs.Count -gt 1) {
|
|
133
|
+
$latest = $siblingDirs[-1].Name
|
|
134
|
+
foreach ($dir in $siblingDirs) {
|
|
135
|
+
if ($dir.Name -ne $latest) {
|
|
136
|
+
Write-Warn "Removing stale cache version: $($dir.Name)"
|
|
137
|
+
Remove-Item -Recurse -Force $dir.FullName
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
Write-Ok "Kept only latest cache version: $latest"
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
# ---- Install dependencies ----
|
|
144
|
+
|
|
145
|
+
Write-Step "Running bun install..."
|
|
146
|
+
Push-Location $PluginDir
|
|
147
|
+
try {
|
|
148
|
+
bun install --silent
|
|
149
|
+
Write-Ok "Dependencies installed."
|
|
150
|
+
} finally {
|
|
151
|
+
Pop-Location
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
# ---- Next steps ----
|
|
155
|
+
|
|
156
|
+
Write-Host ""
|
|
157
|
+
Write-Ok "Installation complete."
|
|
158
|
+
Write-Host ""
|
|
159
|
+
Write-Host "Next steps — inside Claude Code:" -ForegroundColor White
|
|
160
|
+
Write-Host ""
|
|
161
|
+
Write-Host " /plugin marketplace add ashlrai/ashlr-plugin" -ForegroundColor Gray
|
|
162
|
+
Write-Host " /plugin install ashlr@ashlr-marketplace" -ForegroundColor Gray
|
|
163
|
+
Write-Host " /reload-plugins" -ForegroundColor Gray
|
|
164
|
+
Write-Host ""
|
|
165
|
+
Write-Host "Then run /ashlr-status. If /reload-plugins is unavailable or the status check does not see ashlr, fully quit and restart Claude Code." -ForegroundColor White
|
|
166
|
+
Write-Host ""
|
|
167
|
+
Write-Ok "Start here:"
|
|
168
|
+
Write-Host " /ashlr-tour -- 2-minute guided tour of every tool, hook, and command" -ForegroundColor Gray
|
|
169
|
+
Write-Host ""
|
|
170
|
+
Write-Host "Landing page: https://plugin.ashlr.ai/" -ForegroundColor Cyan
|
|
171
|
+
Write-Host "Source: https://github.com/ashlrai/ashlr-plugin" -ForegroundColor Cyan
|
package/docs/install.sh
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ashlr-plugin Claude Code one-liner installer.
|
|
3
|
+
#
|
|
4
|
+
# Usage:
|
|
5
|
+
# curl -fsSL https://plugin.ashlr.ai/install.sh | bash
|
|
6
|
+
#
|
|
7
|
+
# What it does (idempotent — safe to re-run):
|
|
8
|
+
# 1. Checks bun is installed (links to install if missing)
|
|
9
|
+
# 2. Clones the plugin repo into Claude Code's marketplace cache
|
|
10
|
+
# 3. Runs `bun install` so MCP servers have their deps
|
|
11
|
+
# 4. Tells you the exact slash commands to run inside Claude Code
|
|
12
|
+
#
|
|
13
|
+
# Does NOT modify your Claude Code settings.json. Does NOT install globally.
|
|
14
|
+
# Everything lives in ~/.claude/plugins/cache/.
|
|
15
|
+
|
|
16
|
+
set -euo pipefail
|
|
17
|
+
|
|
18
|
+
cyan() { printf "\033[36m%s\033[0m\n" "$*"; }
|
|
19
|
+
green() { printf "\033[32m%s\033[0m\n" "$*"; }
|
|
20
|
+
yellow() { printf "\033[33m%s\033[0m\n" "$*"; }
|
|
21
|
+
red() { printf "\033[31m%s\033[0m\n" "$*"; }
|
|
22
|
+
|
|
23
|
+
cyan "ashlr-plugin Claude Code installer · github.com/ashlrai/ashlr-plugin"
|
|
24
|
+
echo
|
|
25
|
+
|
|
26
|
+
# 1. Prerequisite: bun
|
|
27
|
+
if ! command -v bun >/dev/null 2>&1; then
|
|
28
|
+
yellow "⚠ bun is not installed."
|
|
29
|
+
# Offer auto-install when stdin is a terminal (skip in piped/non-interactive mode).
|
|
30
|
+
if [ -t 0 ]; then
|
|
31
|
+
printf " Install Bun now via curl -fsSL bun.sh/install | bash? (Y/n) "
|
|
32
|
+
read -r _bun_answer </dev/tty
|
|
33
|
+
case "${_bun_answer:-Y}" in
|
|
34
|
+
[Yy]|"")
|
|
35
|
+
yellow "→ Running Bun installer..."
|
|
36
|
+
curl -fsSL https://bun.sh/install | bash
|
|
37
|
+
# Source the profile additions the Bun installer wrote.
|
|
38
|
+
for _rc in "$HOME/.bashrc" "$HOME/.zshrc" "$HOME/.profile"; do
|
|
39
|
+
# shellcheck disable=SC1090
|
|
40
|
+
[ -f "$_rc" ] && . "$_rc" 2>/dev/null || true
|
|
41
|
+
done
|
|
42
|
+
# Also update PATH directly for this shell session.
|
|
43
|
+
export PATH="$HOME/.bun/bin:$PATH"
|
|
44
|
+
if ! command -v bun >/dev/null 2>&1; then
|
|
45
|
+
red "✗ Bun was installed but is not on PATH yet."
|
|
46
|
+
echo " Open a new terminal and re-run this script."
|
|
47
|
+
exit 1
|
|
48
|
+
fi
|
|
49
|
+
green "✓ Bun installed successfully."
|
|
50
|
+
;;
|
|
51
|
+
*)
|
|
52
|
+
red "✗ bun is not installed."
|
|
53
|
+
echo " Install it first: https://bun.sh (curl -fsSL https://bun.sh/install | bash)"
|
|
54
|
+
echo " ashlr-plugin's MCP servers run under bun."
|
|
55
|
+
exit 1
|
|
56
|
+
;;
|
|
57
|
+
esac
|
|
58
|
+
else
|
|
59
|
+
yellow "⚠ bun is not installed — skipping cache pre-warm."
|
|
60
|
+
echo " This installer will still finish cloning + printing next steps."
|
|
61
|
+
echo " bun will be auto-installed when the MCP server starts for the first time."
|
|
62
|
+
echo " (Set ASHLR_NO_AUTO_INSTALL=1 to opt out.)"
|
|
63
|
+
_skip_bun_install=1
|
|
64
|
+
fi
|
|
65
|
+
fi
|
|
66
|
+
if [ -z "${_skip_bun_install:-}" ]; then
|
|
67
|
+
green "✓ bun $(bun --version)"
|
|
68
|
+
fi
|
|
69
|
+
|
|
70
|
+
# 2. Prerequisite: git + gh or raw clone access
|
|
71
|
+
if ! command -v git >/dev/null 2>&1; then
|
|
72
|
+
red "✗ git is not installed."
|
|
73
|
+
exit 1
|
|
74
|
+
fi
|
|
75
|
+
green "✓ git $(git --version | awk '{print $3}')"
|
|
76
|
+
|
|
77
|
+
# 3. Pre-clone into Claude Code's cache dir so /plugin install is instant
|
|
78
|
+
CACHE_DIR="$HOME/.claude/plugins/cache/ashlr-marketplace/ashlr"
|
|
79
|
+
mkdir -p "$(dirname "$CACHE_DIR")"
|
|
80
|
+
|
|
81
|
+
if [ -d "$CACHE_DIR/.git" ]; then
|
|
82
|
+
yellow "→ Cache exists — updating"
|
|
83
|
+
git -C "$CACHE_DIR" fetch --quiet origin main
|
|
84
|
+
git -C "$CACHE_DIR" reset --quiet --hard origin/main
|
|
85
|
+
else
|
|
86
|
+
yellow "→ Cloning plugin to $CACHE_DIR"
|
|
87
|
+
git clone --quiet https://github.com/ashlrai/ashlr-plugin.git "$CACHE_DIR"
|
|
88
|
+
fi
|
|
89
|
+
green "✓ plugin at: $CACHE_DIR"
|
|
90
|
+
|
|
91
|
+
# 3b. Prune stale sibling cache versions (keep only the latest semver dir).
|
|
92
|
+
# Claude Code's marketplace cache sometimes accumulates old <X.Y.Z>/ dirs
|
|
93
|
+
# next to the active one. Keep only the newest.
|
|
94
|
+
SIBLING_PARENT="$(dirname "$CACHE_DIR")"
|
|
95
|
+
if [ -d "$SIBLING_PARENT" ]; then
|
|
96
|
+
# Collect semver-shaped siblings, sort with -V, drop the latest, rm the rest.
|
|
97
|
+
# shellcheck disable=SC2012
|
|
98
|
+
mapfile -t _semver_dirs < <(
|
|
99
|
+
ls -1 "$SIBLING_PARENT" 2>/dev/null \
|
|
100
|
+
| grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' \
|
|
101
|
+
| sort -V || true
|
|
102
|
+
) || _semver_dirs=()
|
|
103
|
+
if [ "${#_semver_dirs[@]}" -gt 1 ]; then
|
|
104
|
+
_latest="${_semver_dirs[-1]}"
|
|
105
|
+
for _v in "${_semver_dirs[@]}"; do
|
|
106
|
+
if [ "$_v" != "$_latest" ]; then
|
|
107
|
+
yellow "→ Removing stale cache version: $_v"
|
|
108
|
+
rm -rf "${SIBLING_PARENT:?}/${_v}"
|
|
109
|
+
fi
|
|
110
|
+
done
|
|
111
|
+
green "✓ kept only latest cache version: $_latest"
|
|
112
|
+
fi
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# 4. Install dependencies (skipped when bun isn't present — the MCP bootstrap
|
|
116
|
+
# will auto-install bun + run `bun install` itself on first spawn).
|
|
117
|
+
if [ -z "${_skip_bun_install:-}" ]; then
|
|
118
|
+
yellow "→ Installing dependencies (bun install)"
|
|
119
|
+
(cd "$CACHE_DIR" && bun install --silent 2>&1 | tail -5 || true)
|
|
120
|
+
green "✓ dependencies installed"
|
|
121
|
+
else
|
|
122
|
+
yellow "→ Skipping bun install — will run on first MCP server spawn"
|
|
123
|
+
fi
|
|
124
|
+
|
|
125
|
+
echo
|
|
126
|
+
cyan "Done. Next steps — inside Claude Code:"
|
|
127
|
+
echo
|
|
128
|
+
echo " /plugin marketplace add ashlrai/ashlr-plugin"
|
|
129
|
+
echo " /plugin install ashlr@ashlr-marketplace"
|
|
130
|
+
echo " /reload-plugins"
|
|
131
|
+
echo
|
|
132
|
+
echo "Then run /ashlr-status. If /reload-plugins is unavailable or the"
|
|
133
|
+
echo "status check does not see ashlr, fully quit and restart Claude Code."
|
|
134
|
+
echo
|
|
135
|
+
green "▶ Start here:"
|
|
136
|
+
echo " /ashlr-tour — 2-minute guided tour of every tool, hook, and command"
|
|
137
|
+
echo
|
|
138
|
+
cyan "Codex users:"
|
|
139
|
+
echo " git clone https://github.com/ashlrai/ashlr-plugin"
|
|
140
|
+
echo " cd ashlr-plugin && bun install"
|
|
141
|
+
echo " codex plugin marketplace add ashlrai/ashlr-plugin"
|
|
142
|
+
echo " codex plugin add ashlr@ashlr-marketplace"
|
|
143
|
+
echo " bun run scripts/cli.ts codex-doctor --json"
|
|
144
|
+
echo
|
|
145
|
+
cyan "Landing page: https://plugin.ashlr.ai/"
|
|
146
|
+
cyan "Source: https://github.com/ashlrai/ashlr-plugin"
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Launch playbook — ashlr-plugin v1.36 Codex-native release
|
|
2
|
+
|
|
3
|
+
A meta-guide for Mason (first-time launcher) covering where each post goes, when to post, what to monitor, and how to answer the questions that will show up in the first 24 hours. If you're reading this and you're not Mason: the tone is internal-note, not polished copy.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## When to post what
|
|
8
|
+
|
|
9
|
+
| Platform | File | Best window (PT) | Why |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| Hacker News | `hn.md` | **Tue–Thu, 7:30–9:30am PT** | HN front-page algo favors morning US-east activity. Avoid Monday (noisy), Friday (dead), weekends (low-signal). |
|
|
12
|
+
| X / Twitter | `x.md` | **Weekday evenings, 6–9pm PT** | Dev-twitter is an after-work crowd. Thread, not single tweet. Pin it. |
|
|
13
|
+
| r/ClaudeAI | `reddit.md` (variant 1) | Any weekday, **avoid weekends** | Reddit's Claude subs are active all day; Sat/Sun posts get buried by meme content. |
|
|
14
|
+
| r/ClaudeCode | `reddit.md` (variant 2) | Same | Smaller sub, more technical — quality threshold is higher. |
|
|
15
|
+
|
|
16
|
+
**Order of operations:** Post HN first (highest risk, highest reward). If HN picks up, tweet the HN link. Post Reddit after HN peaks (either way — a dead HN post is still a fine Reddit post, and a live one gives Reddit posts a "here's the discussion" link to include).
|
|
17
|
+
|
|
18
|
+
**Don't cross-post the HN text verbatim to Reddit.** Reddit mods smell it. Variants in `reddit.md` are pre-tailored.
|
|
19
|
+
|
|
20
|
+
**Don't submit the same URL to HN twice** in a short window — it'll get flagged. If the first HN submission flops, wait a week and try a different title.
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Monitoring checklist (first 24h)
|
|
25
|
+
|
|
26
|
+
Refresh roughly every 30 min for the first 3 hours, then hourly until bedtime.
|
|
27
|
+
|
|
28
|
+
- **GitHub stars** — `gh api repos/ashlrai/ashlr-plugin | jq .stargazers_count`. Expect 0–50 for a quiet launch, 50–500 for a good HN run.
|
|
29
|
+
- **Issues opened** — `gh issue list --repo ashlrai/ashlr-plugin`. Respond within 2h if you're awake. A fast first response shapes the whole thread.
|
|
30
|
+
- **HN comments** — refresh the submission, read every comment before replying. HN rewards thoughtful, don't rush.
|
|
31
|
+
- **X replies/quote-tweets** — quote-tweets matter more than replies for reach. Thank thoughtful ones, don't dunk on dumb ones.
|
|
32
|
+
- **Reddit comments** — Reddit auto-sorts by controversial early; skim, respond to top-level questions only.
|
|
33
|
+
- **Traffic** — if Pages analytics is wired, watch `plugin.ashlr.ai` referrers. Otherwise `gh api repos/.../traffic/views` (14-day window, updates hourly).
|
|
34
|
+
- **`/ashlr-doctor` error reports** — if someone files an install issue, ask them to paste `/ashlr-doctor` output. Saves 10 back-and-forths.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Rehearsed answers — the 10 questions you'll definitely get
|
|
39
|
+
|
|
40
|
+
Keep these in a scratchpad. Don't copy-paste verbatim; rephrase slightly per thread so it doesn't feel templated.
|
|
41
|
+
|
|
42
|
+
**Q: "Why not just make this a paid product?"**
|
|
43
|
+
I wanted the mechanism auditable. WOZCODE exists, it's polished, people happily pay — I'm not trying to eat their lunch. This is for the people who want to see every line of code that's rewriting their MCP traffic.
|
|
44
|
+
|
|
45
|
+
**Q: "Does this work with Opus?"**
|
|
46
|
+
Yes. Savings math is model-agnostic (characters in, tokens out); pricing math respects `ASHLR_PRICING_MODEL` so the `$` in `/ashlr-savings` reflects whatever plan you're on. Opus users see the biggest dollar savings because Opus is the most expensive per-token.
|
|
47
|
+
|
|
48
|
+
**Q: "Is it spying on me / phoning home?"**
|
|
49
|
+
No. `git grep -E 'posthog|fetch.*\.(com|io)|analytics'` on the repo — nothing outbound. The one exception is `/ashlr-doctor`, which hits GitHub's public releases API to check if you're behind. That's a deliberate user-invoked action, not background.
|
|
50
|
+
|
|
51
|
+
**Q: "How does this compare to WOZCODE?"**
|
|
52
|
+
Same shape: tri-agent, Read/Grep/Edit redirect, commit attribution, edit-batching, status line. Mine adds SQL + Bash + Tree MCP tools and a baseline scanner. Mine is MIT, no account, telemetry off by default. Theirs is more polished and has a real support channel. Both valid.
|
|
53
|
+
|
|
54
|
+
**Q: "Does the tokenizer count match Anthropic exactly?"**
|
|
55
|
+
No — Anthropic doesn't publish theirs. I use tiktoken cl100k_base as a proxy, which is ~12.9% more accurate than chars/4 on code (measured). I'd rather ship an honest proxy than a fake-precise estimate.
|
|
56
|
+
|
|
57
|
+
**Q: "Will it work with Cursor / Zed / Windsurf?"**
|
|
58
|
+
Cursor, Zed, and Windsurf can use Ashlr through MCP-only config. Codex also has plugin-format install via `codex plugin marketplace add ashlrai/ashlr-plugin` and `codex plugin add ashlr@ashlr-marketplace`. Claude-Code-only surfaces are slash commands, status line, OAuth bootstrap, and redirect-mode hooks.
|
|
59
|
+
|
|
60
|
+
**Q: "Why Bun? I don't have Bun."**
|
|
61
|
+
Bun starts MCP servers faster than Node and the install story is cleaner. `curl -fsSL https://bun.sh/install | bash` — 5 seconds. If this is a hard blocker for someone, open an issue; Node compat is a reasonable ask but not free to maintain.
|
|
62
|
+
|
|
63
|
+
**Q: "Show me the real savings on my own code."**
|
|
64
|
+
`/ashlr-benchmark` runs the harness against the current working directory. Real files, real numbers, reproducible.
|
|
65
|
+
|
|
66
|
+
**Q: "Is the -57% figure cherry-picked?"**
|
|
67
|
+
It's the mean across files ≥ 2 KB in the benchmark corpus. Smaller files see 0% because `snipCompact` has a 2 KB threshold — I could have dropped the threshold to juice the number, I didn't.
|
|
68
|
+
|
|
69
|
+
**Q: "What's the genome thing?"**
|
|
70
|
+
`.ashlrcode/genome/` is a sectioned project spec (markdown files, ~one per concern). `ashlr__grep` returns only the task-relevant sections instead of grepping the whole tree. Ashlr includes a scribe that keeps the genome current as you work. Run `/ashlr-genome-init` to try it.
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## What to NOT do
|
|
75
|
+
|
|
76
|
+
These matter more than the positive advice above. Re-read before posting.
|
|
77
|
+
|
|
78
|
+
1. **Don't engage trolls.** Every launch thread gets one "this is garbage / reinventing the wheel / you should just use X" comment. Do not reply. Replying legitimizes it and sinks the thread. Move on.
|
|
79
|
+
2. **Don't overpromise.** The numbers are specific: −57% cross-repo. Don't let excitement turn it into "80% faster" or "80% cheaper" — those mean different things.
|
|
80
|
+
3. **Don't vanity-name-drop.** No "I used this at $BIG_CO" if you didn't. No "endorsed by X" unless X actually endorsed it. Credibility is cheap to lose.
|
|
81
|
+
4. **Don't shit on WOZCODE.** They built the pattern first. Frame as "open-source equivalent," never "killer" or "replacement." You'll get WOZCODE users trying it precisely because you were respectful.
|
|
82
|
+
5. **Don't amend the HN post after it's live.** Comments will reference earlier phrasing. If you find a typo, note it in a comment on your own thread instead.
|
|
83
|
+
6. **Don't reply to every comment.** Reply to substantive questions, thoughtful critiques, and install issues. Skip "nice!" and "cool project" — a like is fine.
|
|
84
|
+
7. **Don't cross-link your own Reddit post from X within the first hour.** Looks like brigading. Wait until it has organic traction.
|
|
85
|
+
8. **Don't add an "upvote please" anywhere.** Instant credibility death on HN/Reddit.
|
|
86
|
+
9. **Don't argue about the benchmark methodology in public.** If someone says the benchmark is bad, ask them to file an issue with a proposed improvement. Takes the heat off the thread and usually produces better data.
|
|
87
|
+
10. **Don't launch on a day you can't monitor for 12 hours.** If you post and disappear, questions go unanswered and the thread dies.
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Sample reply templates
|
|
92
|
+
|
|
93
|
+
Adapt, don't paste verbatim.
|
|
94
|
+
|
|
95
|
+
**Install issue:**
|
|
96
|
+
> Can you paste the output of `/ashlr-doctor`? That'll tell me whether it's an MCP registration issue, a bun version thing, or a plugin-path problem. If doctor itself fails, `bun --version` + `ls ~/.claude/plugins/cache/ashlr-marketplace/ashlr` is the next step.
|
|
97
|
+
|
|
98
|
+
**Skeptical about numbers:**
|
|
99
|
+
> Fair question. `/ashlr-benchmark` runs the harness on your working directory and prints the raw per-file savings. If it comes out very different from the −57% figure, I'd genuinely like the dataset — open an issue.
|
|
100
|
+
|
|
101
|
+
**"Why should I trust you?"**
|
|
102
|
+
> You shouldn't, really — that's the whole point of MIT + telemetry off by default. Source is 100% readable, stats never leave your disk unless you explicitly enable opt-in telemetry. If you find anything that contradicts that, it's a CVE and I want to know.
|
|
103
|
+
|
|
104
|
+
**"Doesn't WOZCODE already do this?"**
|
|
105
|
+
> Yes, and they did it first. Ashlr is the open-source equivalent — same shape, auditable source, no account, telemetry off by default. If WOZCODE's polish is worth $20/week to you, use WOZCODE. This is for people who want to read every line.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## After the launch
|
|
110
|
+
|
|
111
|
+
- Merge any install-issue PRs within 48h if they're clean.
|
|
112
|
+
- Write a "lessons learned" note in `docs/launch/post-mortem.md` once the dust settles — which number surprised you, which question you weren't ready for, what you'd change.
|
|
113
|
+
- If traction is real, ask two or three early users for a short quote — not testimonials, just "what surprised you." Use in future posts.
|
|
114
|
+
- Don't re-launch for at least 3 months. New major version = new launch; point release = don't.
|