diff --git a/README.md b/README.md index 9e4b939..7cd1674 100644 --- a/README.md +++ b/README.md @@ -12,29 +12,34 @@ Paste a GitHub issue URL, describe a task, or point at a diff. FixMap returns ra [![Marketplace](https://img.shields.io/badge/GitHub_Marketplace-FixMap-2ea44f?logo=github)](https://github.com/marketplace/actions/fixmap) [![MIT](https://img.shields.io/badge/license-MIT-74f0ba)](LICENSE) -[Try one command](#one-command-start) · [Watch the 24-second film](https://usefixmap.vercel.app/fixmap-launch.mp4) · [Install the Action](https://github.com/marketplace/actions/fixmap) · [Connect MCP](#mcp-server) · [Contribute](CONTRIBUTING.md) +[Install and start](#install-and-start) · [Watch the 24-second film](https://usefixmap.vercel.app/fixmap-launch.mp4) · [Install the Action](https://github.com/marketplace/actions/fixmap) · [Connect MCP](#mcp-server) · [Contribute](CONTRIBUTING.md) -## One-command start +## Install and start -Give FixMap a public GitHub issue. It fetches the task, infers the repository, scans an isolated temporary checkout, and removes that checkout when the report is complete: +Install FixMap once so the everyday command stays short and predictable: ```bash -npx -y @aryam/fixmap@latest plan --issue https://github.com/chalk/chalk/issues/624 +npm install --global @aryam/fixmap@latest +fixmap plan --issue https://github.com/chalk/chalk/issues/624 ``` -No clone, signup, configuration, or source upload is required. The CLI requires Node.js 20.11 or newer. The GitHub Action declares `using: node24`, which is the runtime GitHub supplies on its runners and places no requirement on your own Node version. +FixMap fetches the public task, infers the repository, scans an isolated temporary checkout, and removes it when the report is complete. No clone, signup, configuration, or source upload is required. The CLI requires Node.js 20.11 or newer. The GitHub Action declares `using: node24`, which is the runtime GitHub supplies on its runners and places no requirement on your own Node version. -### Installing +### One-off trial -`npx` fetches FixMap for that run and leaves nothing behind, which is the right default for trying it. Once it is part of your routine, install it and drop the `npx -y` prefix: +This form fetches FixMap for one run and leaves no global installation: ```bash -npm install -g @aryam/fixmap +npx -y @aryam/fixmap@latest plan --issue https://github.com/chalk/chalk/issues/624 ``` -Or pin it to one project, so everyone working on that repository gets the same version: +If the current directory or one of its parents already contains FixMap, npm may deliberately choose that project-local binary. Check `--version`, or use the isolated-prefix procedure below when the exact package version matters. + +### Project installation + +Pin FixMap to one project when everyone working on that repository should get the same version: ```bash npm install --save-dev @aryam/fixmap @@ -64,13 +69,13 @@ If `cd` or `Set-Location` fails, do not run the project-scoped `npm install` yet stays in the previous directory, so npm will install there. Run `Get-Location`, create or select the intended project directory, and then install. -If an older FixMap is installed globally, some npm/npx combinations on Windows resolve the old global `fixmap` shim even when a version is pinned — so a feature that shipped looks like it never existed. `fixmap doctor` detects exactly this and exits non-zero: +Run Doctor after installation to see the version and path that actually started: ```bash -npx -y @aryam/fixmap@latest doctor +fixmap doctor ``` -Remove the stale copy with `npm uninstall -g @aryam/fixmap`, or test an exact version in an isolated prefix and invoke that prefix's shim directly. This PowerShell sequence cannot be redirected to an older package in the current directory or one of its parents: +Doctor 0.8.4 and newer compares an exact npm-requested version when that newer Doctor is the process npm starts. An older project-local binary can win before newer Doctor code runs, so no new version can diagnose that decision from inside the old process. Treat the printed running version as authoritative, update or remove the stale installation, or test an exact version in an isolated prefix and invoke that prefix's shim directly. This PowerShell sequence cannot be redirected to an older package in the current directory or one of its parents: ```powershell $fixmapPrefix = Join-Path $env:TEMP "fixmap-cli-0.8.4" @@ -120,7 +125,7 @@ FixMap adds a deterministic routing step before an agent starts searching. Its o Analyze a task against any public GitHub repository: ```bash -npx -y @aryam/fixmap@latest plan \ +fixmap plan \ --issue "support public GitHub issue URLs" \ --repo https://github.com/aryamthecodebreaker/FixMap ``` @@ -128,14 +133,14 @@ npx -y @aryam/fixmap@latest plan \ Analyze private source or working-tree changes locally: ```bash -npx -y @aryam/fixmap@latest plan --issue "password reset emails fail" -npx -y @aryam/fixmap@latest plan --diff main...HEAD +fixmap plan --issue "password reset emails fail" +fixmap plan --diff main...HEAD ``` Write machine-readable output: ```bash -npx -y @aryam/fixmap@latest plan \ +fixmap plan \ --base main \ --head HEAD \ --format json \ @@ -147,7 +152,7 @@ Remote repository mode is issue-only, and deliberately so: the checkout is a sin That clone is also the expensive part of a remote run — minutes on a large monorepo, for a ranking that is lexical. If you already have the repository on disk, pass `--repo .` with the issue URL and FixMap will rank against your checkout instead of fetching its own: ```bash -npx -y @aryam/fixmap@latest plan --issue https://github.com/owner/repository/issues/123 --repo . +fixmap plan --issue https://github.com/owner/repository/issues/123 --repo . ``` Set `FIXMAP_PROGRESS=1` when you want clone/scan progress; `true`, `yes`, and `on` work too, and `0`/`false`/`no`/`off` silence it even in a terminal, where it is otherwise on by default. Progress is intentionally written to stderr so JSON/stdout remains pipe-safe; in PowerShell, merge it for display with `2>&1` or suppress it with `2>$null` if your host records native stderr as an error stream. The same applies to the next-step hints printed after a successful plan — they are stderr, not failure. `FIXMAP_VERBOSE_USAGE=1` restores the full usage block after every argument error. @@ -163,8 +168,8 @@ Every relative path — `--repo`, `--issue-file`, `--issue @file`, `--output` For long or private task text, avoid shell command-length limits by reading UTF-8 text from a file or stdin: ```bash -npx -y @aryam/fixmap@latest plan --issue-file task.md -Get-Content task.md -Raw | npx -y @aryam/fixmap@latest plan --issue - +fixmap plan --issue-file task.md +Get-Content task.md -Raw | fixmap plan --issue - ``` `--issue @task.md` is also accepted as a file shorthand. Repeated `--issue` flags are rejected instead of silently discarding the earlier task. @@ -174,7 +179,7 @@ Get-Content task.md -Raw | npx -y @aryam/fixmap@latest plan --issue - Every report explains the files it chose. `--explain` answers the harder question — why a file you expected is missing: ```bash -npx -y @aryam/fixmap@latest plan --issue "password reset emails fail" \ +fixmap plan --issue "password reset emails fail" \ --explain src/billing/invoice.ts ``` @@ -194,10 +199,10 @@ It distinguishes the cases that actually differ: the file was ranked, it scored The habit worth having is: plan, add the identifier the task was missing, re-plan, and check whether the real file rose. `--compare` prints that instead of leaving you to diff two JSON files by eye: ```bash -npx -y @aryam/fixmap@latest plan --issue "ranking confidence" \ +fixmap plan --issue "ranking confidence" \ --format json --output before.json -npx -y @aryam/fixmap@latest plan \ +fixmap plan \ --issue "confidenceForEntry gives every top-8 file high confidence" \ --compare before.json ``` @@ -219,7 +224,7 @@ That is FixMap's own feedback loop, measured in one command: naming a symbol mov Demo pages, marketing copy, and documentation often contain every symptom word a product documents, so they compete with the implementation. FixMap's built-in penalties cover conventions like `examples/`; a repository's own layout it cannot know: ```bash -npx -y @aryam/fixmap@latest plan --issue "password reset emails fail" \ +fixmap plan --issue "password reset emails fail" \ --exclude apps/web --exclude 'docs/**' --limit 3 ``` @@ -230,7 +235,7 @@ Patterns can also live in a `.fixmapignore` file at the repository root, one per To map what you are editing right now, without crafting a git spec: ```bash -npx -y @aryam/fixmap@latest plan --working-tree --issue "reset flow" +fixmap plan --working-tree --issue "reset flow" ``` That means staged and unstaged tracked changes against `HEAD`. Untracked files stay out of the **change set** unless you add `--include-untracked`, so agent metadata and scratch files are not reported as edits. @@ -242,12 +247,12 @@ They are still ranking candidates. The repository scan reads `git ls-files --oth `plan` answers where to start. `verify` answers whether the change that followed matches the plan — by comparing the saved report against a real git diff: ```bash -npx -y @aryam/fixmap@latest plan --issue "password reset emails fail" \ +fixmap plan --issue "password reset emails fail" \ --format json --output fixmap-report.json # ...make the change... -npx -y @aryam/fixmap@latest verify --report fixmap-report.json --diff main...HEAD +fixmap verify --report fixmap-report.json --diff main...HEAD ``` ```text @@ -269,10 +274,10 @@ Only a discarded, untracked generated edit exits non-zero. A committed generated ### Check the install -An older global install can shadow the version npm was asked for, so a feature that shipped appears not to exist. `doctor` says which version is actually running and why: +Doctor reports the version and path that actually started, plus conflicts the running process can observe: ```bash -npx -y @aryam/fixmap@latest doctor +fixmap doctor ``` ```text @@ -286,9 +291,9 @@ npx -y @aryam/fixmap@latest doctor - ok Node version: 24.13.0 ``` -It exits non-zero when it finds a shadow, so a CI step fails rather than reading on. +It exits non-zero when the running Doctor finds a shadow, so a CI step fails rather than reading on. -Doctor compares the running package, the first `fixmap` shim on `PATH`, npm's global package, and an exact version requested through npm exec. It exits non-zero if npm requested one version but an older local or ancestor install ran instead. It cannot infer a version intended in some unrelated shell command or inspect every historical npm-exec cache entry; when reproducibility matters, use the isolated-prefix command above and invoke its shim directly. +Doctor compares the running package, the first `fixmap` shim on `PATH`, npm's global package, and an exact version requested through npm exec. The exact-request check is available when Doctor 0.8.4 or newer is the process npm starts. If an older project-local binary wins first, that old code cannot contain the newer detector; its printed running version is the evidence. Doctor also cannot infer a version intended in an unrelated shell command or inspect every historical npm-exec cache entry. When reproducibility matters, use the isolated-prefix command above and invoke its shim directly. ### MCP server @@ -299,7 +304,7 @@ FixMap exposes five stdio tools: `fixmap_plan` builds the starting map, `fixmap_ Claude Code: ```bash -claude mcp add fixmap -- npx -y @aryam/fixmap@latest mcp +claude mcp add fixmap -- fixmap mcp ``` Cursor, Windsurf, or another MCP client: @@ -308,8 +313,8 @@ Cursor, Windsurf, or another MCP client: { "mcpServers": { "fixmap": { - "command": "npx", - "args": ["-y", "@aryam/fixmap@latest", "mcp"] + "command": "fixmap", + "args": ["mcp"] } } } @@ -468,7 +473,7 @@ npm run evaluate:heldout ## What changed in v0.8.4 -v0.8.4 closes the last installation defect found by the independent post-release audit. Doctor now exits non-zero when npm records an exact requested FixMap version but a local or ancestor `node_modules` installation runs a different version. The installation guide no longer calls npm exec unambiguous in that state; its reproducible path uses an isolated prefix and invokes that prefix's shim directly (#437). +v0.8.4 added an exact-request mismatch detector to Doctor and replaced the earlier npm exec recommendation with an isolated-prefix/direct-shim procedure. A post-release child-project test then established the detector's unavoidable boundary: it works when Doctor 0.8.4 or newer starts, but an older project-local binary can win before newer code runs. The printed running version remains authoritative (#437). ## What changed in v0.8.3 diff --git a/apps/web/app/_lib/site-data.ts b/apps/web/app/_lib/site-data.ts index cc3cabd..f10e365 100644 --- a/apps/web/app/_lib/site-data.ts +++ b/apps/web/app/_lib/site-data.ts @@ -42,9 +42,9 @@ export const siteStats = { export const commands = { publicIssue: - "npx -y @aryam/fixmap@latest plan --issue https://github.com/chalk/chalk/issues/624", - localTask: "npx -y @aryam/fixmap@latest plan --issue \"password reset emails fail\"", - diff: "npx -y @aryam/fixmap@latest plan --diff main...HEAD", - verify: "npx -y @aryam/fixmap@latest verify --report fixmap-report.json --diff main...HEAD", - mcp: "npx -y @aryam/fixmap@latest mcp" + "fixmap plan --issue https://github.com/chalk/chalk/issues/624", + localTask: "fixmap plan --issue \"password reset emails fail\"", + diff: "fixmap plan --diff main...HEAD", + verify: "fixmap verify --report fixmap-report.json --diff main...HEAD", + mcp: "fixmap mcp" }; diff --git a/apps/web/app/docs/page.tsx b/apps/web/app/docs/page.tsx index c71ec04..ca008f4 100644 --- a/apps/web/app/docs/page.tsx +++ b/apps/web/app/docs/page.tsx @@ -46,17 +46,17 @@ export default function DocsPage() {

Plan

Find the right place to start.

Give FixMap one task source: plain issue text, a task file, stdin, a public GitHub issue URL, or a git diff.

Public issue URL

Working-tree or branch diff

Remote repository mode is issue-only. Clone the repository locally when you need --diff, --base, or --head.

-

Explain

Ask the missing-file question.

Use --explain when you expected a path and it did not appear. The response distinguishes five different situations:

+

Explain

Ask the missing-file question.

Use --explain when you expected a path and it did not appear. The response distinguishes five different situations:

-

Focus

Narrow the map to what matters.

Demo pages, marketing copy, and documentation often contain every symptom word a product documents, so they compete with the implementation. FixMap knows about conventions like examples/; it cannot know your repository’s own layout.

Patterns can also live in a .fixmapignore file at the repository root, one per line. The two combine, and --explain reports an excluded file as excluded, naming the pattern that matched.

Map what you are editing now

That means staged and unstaged tracked changes against HEAD. Untracked files stay out of the change set unless you add --include-untracked, so scratch metadata is not reported as an edit. They remain ranking candidates either way — a file an agent just wrote is usually the most relevant thing in the repository.

Measure a better task

Refine the wording, re-plan, and see whether the real file moved up:

+

Focus

Narrow the map to what matters.

Demo pages, marketing copy, and documentation often contain every symptom word a product documents, so they compete with the implementation. FixMap knows about conventions like examples/; it cannot know your repository’s own layout.

Patterns can also live in a .fixmapignore file at the repository root, one per line. The two combine, and --explain reports an excluded file as excluded, naming the pattern that matched.

Map what you are editing now

That means staged and unstaged tracked changes against HEAD. Untracked files stay out of the change set unless you add --include-untracked, so scratch metadata is not reported as an edit. They remain ranking candidates either way — a file an agent just wrote is usually the most relevant thing in the repository.

Measure a better task

Refine the wording, re-plan, and see whether the real file moved up:

-

Verify

Compare the plan with the change.

Save a JSON plan before editing, then compare it with the real diff afterwards.

Verify does not run tests or judge correctness. Most findings are advisory because the plan can be wrong and the change can still be right.

+

Verify

Compare the plan with the change.

Save a JSON plan before editing, then compare it with the real diff afterwards.

Verify does not run tests or judge correctness. Most findings are advisory because the plan can be wrong and the change can still be right.

Output

Readable by people and tools.

Markdown is the default handoff. Add --format json for structured output and --output <path> to save it.

Context files

Ranked paths, scores, confidence labels, and evidence.

Test routes

Workspace-aware commands and reachable related tests.

Risks

Sensitive areas inferred from paths, symbols, and changes.

Diagnostics

Vague tasks, unresolved identifiers, scan limits, and other uncertainty.

MCP

Five tools for the agent workflow.

fixmap_plan maps tasks and working trees. fixmap_explain answers why a file is missing. fixmap_compare measures task refinement. fixmap_verify checks the later diff, and fixmap_doctor diagnoses install shadows. All five run locally over stdio.

MCP setup examples
-

Doctor

Check you are running what you asked for.

An older global install can shadow the version npm was asked for, so a feature that shipped appears not to exist. doctor reports the running version, the resolved path, any conflicting global, and the Node version.

It exits non-zero when it finds a shadow, so a CI step fails rather than reading on.

+

Doctor

Check what actually started.

doctor reports the running version, resolved path, conflicting global, and Node version. Version 0.8.4 and newer also checks an exact npm-requested version when that newer Doctor starts.

An older project-local binary can win before newer Doctor code runs, so always check the printed running version. Use the isolated-prefix/direct-shim procedure in the README when the exact version matters.

Safety and trust

What FixMap will not do.

Read the security policy
diff --git a/apps/web/app/get-started/page.tsx b/apps/web/app/get-started/page.tsx index 5c4d424..3c04b90 100644 --- a/apps/web/app/get-started/page.tsx +++ b/apps/web/app/get-started/page.tsx @@ -15,26 +15,29 @@ export default function GetStartedPage() {

Get started

Choose where the map should appear.

-

Use one command yourself, let a compatible coding agent request the map, or publish it automatically on pull requests.

+

Install the CLI once and use a short command, let a compatible coding agent request the map, or publish it automatically on pull requests.

CLIMCPGitHub Action
-
01

CLI

Run one command.

+
01

CLI

Install once. Keep the command short.

-

The fastest path. Paste a public GitHub issue URL and FixMap fetches the task, infers the repository, scans a temporary checkout, and removes it when the report is done.

+

Install FixMap globally, then paste a public GitHub issue URL. FixMap fetches the task, infers the repository, scans a temporary checkout, and removes it when the report is done.

+

Or work inside a local repository

-

Install it, if you use it often

-

Every command above uses npx, which fetches FixMap for that run and leaves nothing behind. That is the right default for trying it. Once it is part of your routine, install it and drop the npx -y prefix:

- -

Or pin it to one project, so everyone working on that repository gets the same version:

+

Pin it to a project instead

+

Use a project dependency when everyone working on that repository should get the same version:

A project install is reached with npx fixmap inside the repository, or from an npm script.

+

One-off trial without installing

+ +

If the current directory or one of its parents already contains FixMap, npm may deliberately choose that project-local binary. Check --version, or use the isolated-prefix test below when the exact package version matters.

+

Safe PowerShell test project

Create the directory before changing into it. If cd fails, PowerShell stays in the previous directory and a project-scoped npm install will go there instead.

Check what you are actually running

An older global install can shadow the version npx was asked for, which makes a feature that shipped look like it never existed. doctor reports the version in use, where it resolved from, and any conflicting global — and exits non-zero when it finds one:

- + +

Doctor 0.8.4 and newer compares an exact npm-requested version when that newer Doctor is the process npm starts. An older project-local binary can win before the newer code starts, so treat the printed running version as authoritative. For an exact clean test, use the isolated-prefix/direct-shim procedure in the repository README.

Requires Node.js 20.11 or newer. No account, API key, or model call at any point.

@@ -59,13 +63,13 @@ npx fixmap plan --issue "password reset emails fail"`} />

FixMap exposes five local stdio tools: fixmap_plan before editing, fixmap_explain when a file is missing, fixmap_compare to measure a refined plan, fixmap_verify after the diff exists, and fixmap_doctor to diagnose install shadows.

Claude Code

- +

Cursor, Windsurf, and other MCP clients

{`{
   "mcpServers": {
     "fixmap": {
-      "command": "npx",
-      "args": ["-y", "@aryam/fixmap@latest", "mcp"]
+      "command": "fixmap",
+      "args": ["mcp"]
     }
   }
 }`}
diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index 869540d..e6261e5 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -142,7 +142,7 @@ export default function HomePage() {

Thirty-second start

Give the next change
a clear place to begin.

-

One command. No account. No API key.

+

Install once. Then use one short command. No account or API key.

diff --git a/packages/cli/README.md b/packages/cli/README.md index ac29649..6741c3e 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -6,16 +6,17 @@ FixMap turns an issue, prompt, or git diff into ranked context files, test route ## Quick start -Paste a public GitHub issue URL; FixMap fetches its task context and infers the repository: +Install FixMap once, then paste a public GitHub issue URL. FixMap fetches its task context and infers the repository: ```bash -npx -y @aryam/fixmap@latest plan --issue https://github.com/chalk/chalk/issues/624 +npm install --global @aryam/fixmap@latest +fixmap plan --issue https://github.com/chalk/chalk/issues/624 ``` Or supply your own task and public repository: ```bash -npx -y @aryam/fixmap plan \ +fixmap plan \ --issue "support public GitHub issue URLs" \ --repo https://github.com/aryamthecodebreaker/FixMap ``` @@ -23,24 +24,24 @@ npx -y @aryam/fixmap plan \ For private source or working-tree changes, run from a local JavaScript or TypeScript repository: ```bash -npx @aryam/fixmap plan --issue "password reset emails fail" +fixmap plan --issue "password reset emails fail" ``` Use a real branch diff: ```bash -npx @aryam/fixmap plan --diff main...HEAD +fixmap plan --diff main...HEAD ``` Machine-readable output: ```bash -npx @aryam/fixmap plan --base main --head HEAD --format json --output fixmap-report.json +fixmap plan --base main --head HEAD --format json --output fixmap-report.json ``` Public GitHub issue, pull request, and repository URL modes are available in the CLI and MCP server for issue-only analysis. FixMap fetches task context anonymously, shallow-clones the default branch into an isolated temporary directory, disables credentials and repository execution surfaces, and removes the checkout before returning. Clone locally to use `--diff`, `--base`, `--head`, or working-tree inputs. -For long task text, use `--issue-file task.md`, `--issue @task.md`, or pipe text to `--issue -`. If a stale global, local, or ancestor installation shadows a pinned package on Windows, run `fixmap doctor` and update or remove the stale install. For a reproducible clean test, install the exact version into an isolated npm prefix and invoke that prefix's `fixmap` shim directly; the repository README includes complete PowerShell and POSIX commands. +For long task text, use `--issue-file task.md`, `--issue @task.md`, or pipe text to `--issue -`. A one-off `npx -y @aryam/fixmap@latest ...` run is also available, but npm may choose an existing project-local FixMap first. Run `fixmap doctor`, treat its printed running version as authoritative, and update or remove a stale install. For a reproducible clean test, install the exact version into an isolated npm prefix and invoke that prefix's `fixmap` shim directly; the repository README includes complete PowerShell and POSIX commands. ## MCP server @@ -49,7 +50,7 @@ FixMap ships as a Model Context Protocol server with `fixmap_plan` and `fixmap_v Claude Code: ```bash -claude mcp add fixmap -- npx -y @aryam/fixmap mcp +claude mcp add fixmap -- fixmap mcp ``` Cursor, Windsurf, or any MCP client: @@ -58,8 +59,8 @@ Cursor, Windsurf, or any MCP client: { "mcpServers": { "fixmap": { - "command": "npx", - "args": ["-y", "@aryam/fixmap", "mcp"] + "command": "fixmap", + "args": ["mcp"] } } }