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,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* _ast-languages.ts — Language registry for AST-aware editing (Track C, Sprint 1).
|
|
3
|
+
*
|
|
4
|
+
* Uses web-tree-sitter@0.22.6 (WASM) rather than native tree-sitter bindings.
|
|
5
|
+
*
|
|
6
|
+
* Why WASM over native tree-sitter:
|
|
7
|
+
* Native tree-sitter fails on macOS/Bun — node-gyp requires C++20 but the
|
|
8
|
+
* cached Node.js headers (node@25.x / node-gyp@12.x) emit flags that clang
|
|
9
|
+
* rejects. web-tree-sitter ships a self-contained WASM bundle with no native
|
|
10
|
+
* build step.
|
|
11
|
+
*
|
|
12
|
+
* Why web-tree-sitter@0.22.6 (not latest 0.26.x):
|
|
13
|
+
* web-tree-sitter 0.25+ requires grammar WASM files to contain a `dylink.0`
|
|
14
|
+
* custom section (Emscripten side-module format). The `tree-sitter-wasms`
|
|
15
|
+
* package (0.1.13) ships grammars built with older Emscripten that omit this
|
|
16
|
+
* section, so they fail to load under 0.26.x with "need dylink section".
|
|
17
|
+
* Version 0.22.6 uses the pre-dylink loading path and accepts these grammars.
|
|
18
|
+
* Sprint-2 can upgrade if a compatible grammar bundle ships for 0.26.x.
|
|
19
|
+
*
|
|
20
|
+
* Grammar WASM files: `tree-sitter-wasms` npm package (pre-built assets).
|
|
21
|
+
*
|
|
22
|
+
* Supported languages: TypeScript (.ts), TSX (.tsx), JavaScript (.js/.mjs/.cjs/.jsx).
|
|
23
|
+
*
|
|
24
|
+
* NOT YET SUPPORTED: Python, Go, Rust. Calls to getParser() for these languages
|
|
25
|
+
* throw immediately with a clear error. Callers (e.g. _ast-chunker.ts) catch
|
|
26
|
+
* the throw and fall back to line-based chunking, so no user-visible breakage
|
|
27
|
+
* occurs — but semantic-diff/chunker features are unavailable for those files.
|
|
28
|
+
* Re-enable by wiring grammar WASM files compatible with web-tree-sitter@0.22.6
|
|
29
|
+
* and adding the language to WIRED_LANGUAGES (tracked as a future sprint item).
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
// web-tree-sitter@0.22.x uses a default export. Sub-types (Tree, Language, etc.)
|
|
33
|
+
// live in the Parser namespace.
|
|
34
|
+
import Parser from "web-tree-sitter";
|
|
35
|
+
import { resolve } from "path";
|
|
36
|
+
import { fileURLToPath } from "url";
|
|
37
|
+
|
|
38
|
+
// Re-export the Parser class so consumers can use `import type { WTSParser }` for
|
|
39
|
+
// instance-type annotations without importing the whole module.
|
|
40
|
+
export type WTSParser = Parser;
|
|
41
|
+
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
// Public types
|
|
44
|
+
// ---------------------------------------------------------------------------
|
|
45
|
+
|
|
46
|
+
export type Language = "typescript" | "tsx" | "javascript" | "python" | "go" | "rust";
|
|
47
|
+
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Extension → Language map
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
|
|
52
|
+
const EXT_MAP: Record<string, Language> = {
|
|
53
|
+
".ts": "typescript",
|
|
54
|
+
".tsx": "tsx",
|
|
55
|
+
".js": "javascript",
|
|
56
|
+
".mjs": "javascript",
|
|
57
|
+
".cjs": "javascript",
|
|
58
|
+
".jsx": "javascript",
|
|
59
|
+
// Stubs — resolveLanguage returns them so callers can check,
|
|
60
|
+
// but getParser throws for these until sprint 2.
|
|
61
|
+
".py": "python",
|
|
62
|
+
".go": "go",
|
|
63
|
+
".rs": "rust",
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Map a filename (or bare extension) to its Language key.
|
|
68
|
+
* Returns null for unrecognised extensions.
|
|
69
|
+
*/
|
|
70
|
+
export function resolveLanguage(filename: string): Language | null {
|
|
71
|
+
// Accept both "foo.ts" and ".ts"
|
|
72
|
+
const dot = filename.lastIndexOf(".");
|
|
73
|
+
if (dot === -1) return null;
|
|
74
|
+
const ext = filename.slice(dot).toLowerCase();
|
|
75
|
+
return EXT_MAP[ext] ?? null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Lazy parser cache (one Parser instance per Language per process)
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
/** Set of languages with fully wired grammars in this sprint. */
|
|
83
|
+
const WIRED_LANGUAGES: ReadonlySet<Language> = new Set(["typescript", "tsx", "javascript"]);
|
|
84
|
+
|
|
85
|
+
let _tsInitialized = false;
|
|
86
|
+
|
|
87
|
+
/** Absolute path to the tree-sitter-wasms/out directory. */
|
|
88
|
+
function wasmDir(): string {
|
|
89
|
+
// Resolve relative to this file so it works from any cwd.
|
|
90
|
+
const here = fileURLToPath(import.meta.url);
|
|
91
|
+
// servers/_ast-languages.ts → root → node_modules
|
|
92
|
+
return resolve(here, "../../node_modules/tree-sitter-wasms/out");
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/** Grammar file names for each supported language. */
|
|
96
|
+
const GRAMMAR_FILES: Record<Language, string> = {
|
|
97
|
+
typescript: "tree-sitter-typescript.wasm",
|
|
98
|
+
tsx: "tree-sitter-tsx.wasm",
|
|
99
|
+
javascript: "tree-sitter-javascript.wasm",
|
|
100
|
+
// Not yet supported — getParser() throws for these before the path below is
|
|
101
|
+
// reached. Grammar WASM files are present in tree-sitter-wasms but not wired
|
|
102
|
+
// into WIRED_LANGUAGES. See module-level comment for re-enable instructions.
|
|
103
|
+
python: "tree-sitter-python.wasm",
|
|
104
|
+
go: "tree-sitter-go.wasm",
|
|
105
|
+
rust: "tree-sitter-rust.wasm",
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const _parserCache = new Map<Language, Parser>();
|
|
109
|
+
let _initPromise: Promise<void> | null = null;
|
|
110
|
+
|
|
111
|
+
/** Ensure web-tree-sitter WASM runtime is initialized (idempotent). */
|
|
112
|
+
async function ensureInit(): Promise<void> {
|
|
113
|
+
if (_tsInitialized) return;
|
|
114
|
+
if (_initPromise) return _initPromise;
|
|
115
|
+
_initPromise = (async () => {
|
|
116
|
+
const wasmPath = resolve(
|
|
117
|
+
fileURLToPath(import.meta.url),
|
|
118
|
+
"../../node_modules/web-tree-sitter/tree-sitter.wasm"
|
|
119
|
+
);
|
|
120
|
+
await Parser.init({
|
|
121
|
+
locateFile: () => wasmPath,
|
|
122
|
+
});
|
|
123
|
+
_tsInitialized = true;
|
|
124
|
+
})();
|
|
125
|
+
return _initPromise;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Return a cached (or freshly constructed) Parser for the given Language key.
|
|
130
|
+
*
|
|
131
|
+
* Throws for languages not yet wired in this sprint (Python, Go, Rust).
|
|
132
|
+
*/
|
|
133
|
+
export async function getParser(lang: Language): Promise<Parser> {
|
|
134
|
+
if (!WIRED_LANGUAGES.has(lang)) {
|
|
135
|
+
throw new Error(
|
|
136
|
+
`[ast-languages] Grammar for '${lang}' is not wired yet (sprint-2 deliverable). ` +
|
|
137
|
+
`Call resolveLanguage() and check before calling getParser().`
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const cached = _parserCache.get(lang);
|
|
142
|
+
if (cached) return cached;
|
|
143
|
+
|
|
144
|
+
await ensureInit();
|
|
145
|
+
|
|
146
|
+
const grammarPath = resolve(wasmDir(), GRAMMAR_FILES[lang]);
|
|
147
|
+
const language = await Parser.Language.load(grammarPath);
|
|
148
|
+
const parser = new Parser();
|
|
149
|
+
parser.setLanguage(language);
|
|
150
|
+
|
|
151
|
+
_parserCache.set(lang, parser);
|
|
152
|
+
return parser;
|
|
153
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* _ast-refactor/_shared.ts — Shared types, constants, and helpers for all
|
|
3
|
+
* AST-refactor operations (file-local rename, cross-file rename,
|
|
4
|
+
* extract-function).
|
|
5
|
+
*
|
|
6
|
+
* Nothing in this module has file-system side-effects. It is pure logic
|
|
7
|
+
* operating on tree-sitter trees and source strings.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type Parser from "web-tree-sitter";
|
|
11
|
+
import { walkNodes } from "../_ast-helpers";
|
|
12
|
+
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Public types
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* A single byte-range edit. Replaces `[start, end)` with `replacement`.
|
|
19
|
+
* Compatible with the shape needed by an in-place file write.
|
|
20
|
+
*/
|
|
21
|
+
export interface RangeEdit {
|
|
22
|
+
start: number;
|
|
23
|
+
end: number;
|
|
24
|
+
replacement: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type RefactorKind = "value" | "type";
|
|
28
|
+
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
// Declaration detection constants
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Parent-node types whose identifier child is a binding *declaration* site.
|
|
35
|
+
* Used by the shadowing guard to decide whether multiple same-name
|
|
36
|
+
* identifiers in the file actually introduce distinct bindings (→ refuse)
|
|
37
|
+
* or are just references to a single declaration (→ safe to rename).
|
|
38
|
+
*/
|
|
39
|
+
export const VALUE_DECLARATION_PARENTS = new Set([
|
|
40
|
+
"variable_declarator", // const X = …
|
|
41
|
+
"function_declaration", // function X() {}
|
|
42
|
+
"function_signature", // declare function X()
|
|
43
|
+
"method_definition", // class body: X() {}
|
|
44
|
+
"class_declaration", // class X {}
|
|
45
|
+
"required_parameter", // fn(X: T)
|
|
46
|
+
"optional_parameter", // fn(X?: T)
|
|
47
|
+
"rest_parameter", // fn(...X: T[])
|
|
48
|
+
"formal_parameters", // bare parameter id
|
|
49
|
+
"import_specifier", // import { X }
|
|
50
|
+
"import_clause", // import X from …
|
|
51
|
+
"namespace_import", // import * as X from …
|
|
52
|
+
"enum_declaration", // enum X {}
|
|
53
|
+
]);
|
|
54
|
+
|
|
55
|
+
export const TYPE_DECLARATION_PARENTS = new Set([
|
|
56
|
+
"type_alias_declaration", // type X = …
|
|
57
|
+
"interface_declaration", // interface X {}
|
|
58
|
+
"enum_declaration", // enum X {} (also type-side)
|
|
59
|
+
"type_parameter", // generic <X>
|
|
60
|
+
]);
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Pattern-wrapper node types that can sit between an identifier and its
|
|
64
|
+
* declaration parent (e.g., `const { a } = obj` → identifier → object_pattern
|
|
65
|
+
* → variable_declarator). We walk upward THROUGH these, but refuse to skip
|
|
66
|
+
* arbitrary expressions — otherwise `const x = a + b` would count `a` as a
|
|
67
|
+
* declaration of itself (since its grandparent is `variable_declarator`).
|
|
68
|
+
*/
|
|
69
|
+
export const PATTERN_INTERMEDIATE_TYPES = new Set([
|
|
70
|
+
"array_pattern",
|
|
71
|
+
"object_pattern",
|
|
72
|
+
"pair_pattern",
|
|
73
|
+
"rest_pattern",
|
|
74
|
+
"assignment_pattern",
|
|
75
|
+
"object_assignment_pattern",
|
|
76
|
+
]);
|
|
77
|
+
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Node comparison helpers
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Compare two SyntaxNode references by byte range. web-tree-sitter does NOT
|
|
84
|
+
* guarantee reference stability — `parent.childForFieldName("name")` returns
|
|
85
|
+
* a fresh JS object each call, so `===` always fails even when the underlying
|
|
86
|
+
* node is the same. Comparing start/end indexes is the canonical approach.
|
|
87
|
+
*/
|
|
88
|
+
export function sameNode(a: Parser.SyntaxNode | null, b: Parser.SyntaxNode | null): boolean {
|
|
89
|
+
if (!a || !b) return false;
|
|
90
|
+
return a.startIndex === b.startIndex && a.endIndex === b.endIndex && a.type === b.type;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Declaration site detection
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
export function isDeclarationSite(node: Parser.SyntaxNode, kind: RefactorKind): boolean {
|
|
98
|
+
const parent = node.parent;
|
|
99
|
+
if (!parent) return false;
|
|
100
|
+
const set = kind === "value" ? VALUE_DECLARATION_PARENTS : TYPE_DECLARATION_PARENTS;
|
|
101
|
+
if (set.has(parent.type)) {
|
|
102
|
+
// Field-aware check: in a variable_declarator the identifier at field
|
|
103
|
+
// `name` is the binding, and the identifier at field `value` is a
|
|
104
|
+
// reference to another binding. Without this check,
|
|
105
|
+
// const msg = greet;
|
|
106
|
+
// counts `greet` (the initializer) as a declaration of itself.
|
|
107
|
+
if (parent.type === "variable_declarator") {
|
|
108
|
+
const nameField = parent.childForFieldName
|
|
109
|
+
? parent.childForFieldName("name")
|
|
110
|
+
: null;
|
|
111
|
+
return sameNode(nameField, node);
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
// Walk upward ONLY through pattern intermediate nodes (destructuring).
|
|
116
|
+
// Skipping through arbitrary expressions misidentifies every identifier
|
|
117
|
+
// inside an initializer as a declaration of itself.
|
|
118
|
+
if (!PATTERN_INTERMEDIATE_TYPES.has(parent.type)) return false;
|
|
119
|
+
let up: Parser.SyntaxNode | null = parent.parent;
|
|
120
|
+
while (up && PATTERN_INTERMEDIATE_TYPES.has(up.type)) up = up.parent;
|
|
121
|
+
if (up === null || !set.has(up.type)) return false;
|
|
122
|
+
// If we walked through patterns to a variable_declarator, confirm we came
|
|
123
|
+
// from the `name` field (left side) not `value` (right side). Compare by
|
|
124
|
+
// byte-range containment since refs aren't stable.
|
|
125
|
+
if (up.type === "variable_declarator") {
|
|
126
|
+
const nameField = up.childForFieldName
|
|
127
|
+
? up.childForFieldName("name")
|
|
128
|
+
: null;
|
|
129
|
+
if (!nameField) return false;
|
|
130
|
+
// node lies inside nameField iff [node.start, node.end] ⊆ [nameField.start, nameField.end].
|
|
131
|
+
return (
|
|
132
|
+
node.startIndex >= nameField.startIndex &&
|
|
133
|
+
node.endIndex <= nameField.endIndex
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// Range edit applicator
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Apply a set of byte-range edits to a source string. Edits are sorted
|
|
145
|
+
* right-to-left so offsets stay valid during the rewrite. Overlapping
|
|
146
|
+
* ranges (which should never come out of planRenameInFile) are detected
|
|
147
|
+
* and throw.
|
|
148
|
+
*/
|
|
149
|
+
export function applyRangeEdits(source: string, edits: RangeEdit[]): string {
|
|
150
|
+
const sorted = [...edits].sort((a, b) => b.start - a.start);
|
|
151
|
+
let out = source;
|
|
152
|
+
let prevStart: number | null = null;
|
|
153
|
+
for (const edit of sorted) {
|
|
154
|
+
if (edit.start < 0 || edit.end > source.length || edit.start > edit.end) {
|
|
155
|
+
throw new Error(
|
|
156
|
+
`applyRangeEdits: invalid range [${edit.start}, ${edit.end}] for source of length ${source.length}`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
if (prevStart !== null && edit.end > prevStart) {
|
|
160
|
+
throw new Error(
|
|
161
|
+
`applyRangeEdits: overlapping edits at [${edit.start}, ${edit.end}] vs prior start ${prevStart}`,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
out = out.slice(0, edit.start) + edit.replacement + out.slice(edit.end);
|
|
165
|
+
prevStart = edit.start;
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Identifier validation
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* JS/TS identifier syntax check.
|
|
176
|
+
*
|
|
177
|
+
* Uses the ECMAScript ID_Start / ID_Continue Unicode sets (ES2018+ `/\p{}/u`
|
|
178
|
+
* regex) so identifiers like `café`, `π`, `日本語` are accepted. ZWNJ (U+200C)
|
|
179
|
+
* and ZWJ (U+200D) are allowed in continue position per spec.
|
|
180
|
+
*
|
|
181
|
+
* Tree-sitter TS/TSX/JS grammars all tokenize Unicode identifiers correctly
|
|
182
|
+
* (verified — a `const café = 1` source parses as `identifier` node with
|
|
183
|
+
* text "café"), so a rename plan produced here applies cleanly.
|
|
184
|
+
*/
|
|
185
|
+
export function validateIdentifier(name: string): string | null {
|
|
186
|
+
if (!name) return "new name is empty";
|
|
187
|
+
// ES identifier: first char is ID_Start | _ | $; rest is ID_Continue | _ | $
|
|
188
|
+
// | ZWNJ (U+200C) | ZWJ (U+200D).
|
|
189
|
+
if (!/^[\p{ID_Start}_$][\p{ID_Continue}_$]*$/u.test(name)) {
|
|
190
|
+
return `'${name}' is not a valid JS identifier (must start with a letter, '_' or '$' and contain only ID_Continue characters)`;
|
|
191
|
+
}
|
|
192
|
+
// Refuse reserved words proactively so the edit doesn't brick the file.
|
|
193
|
+
const RESERVED = new Set([
|
|
194
|
+
"break","case","catch","class","const","continue","debugger","default",
|
|
195
|
+
"delete","do","else","enum","export","extends","false","finally","for",
|
|
196
|
+
"function","if","import","in","instanceof","new","null","return","super",
|
|
197
|
+
"switch","this","throw","true","try","typeof","var","void","while","with",
|
|
198
|
+
"yield","let","static","async","await",
|
|
199
|
+
]);
|
|
200
|
+
if (RESERVED.has(name)) return `'${name}' is a reserved word`;
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ---------------------------------------------------------------------------
|
|
205
|
+
// rangesToNodes — range-to-node round-trip (used by file-local rename)
|
|
206
|
+
// ---------------------------------------------------------------------------
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Resolve a list of [start, end] ranges back to concrete tree nodes by
|
|
210
|
+
* re-walking the tree. Inefficient (O(nodes) per plan) — deferred to v1.14
|
|
211
|
+
* when `extractIdentifiers` returns SyntaxNode refs alongside the
|
|
212
|
+
* {name, kind, range} tuples, making the round-trip walk unnecessary.
|
|
213
|
+
*/
|
|
214
|
+
export function rangesToNodes(tree: Parser.Tree, ranges: Array<[number, number]>): Parser.SyntaxNode[] {
|
|
215
|
+
const wanted = new Set(ranges.map((r) => `${r[0]}:${r[1]}`));
|
|
216
|
+
const out: Parser.SyntaxNode[] = [];
|
|
217
|
+
walkNodes(tree, (n) => {
|
|
218
|
+
if (wanted.has(`${n.startIndex}:${n.endIndex}`)) out.push(n);
|
|
219
|
+
});
|
|
220
|
+
return out;
|
|
221
|
+
}
|