diff --git a/.changeset/add-futureinfra-provider.md b/.changeset/add-futureinfra-provider.md deleted file mode 100644 index a65fa9247..000000000 --- a/.changeset/add-futureinfra-provider.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": minor ---- - -Added a first-class provider template for FutureInfra, an OpenAI-compatible AI API router, to the `/settings providers` wizard. Selecting it fills in the base URL (`https://futureinfra.ai/v1/ai`) so only an API key and a model name (for example `openai/gpt-4o-mini`) are needed. diff --git a/.changeset/agent-eval-harness.md b/.changeset/agent-eval-harness.md deleted file mode 100644 index ee29f2426..000000000 --- a/.changeset/agent-eval-harness.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': minor ---- - -Added an agent evaluation harness under `benchmarks/agent/`, run with `pnpm run test:agent-eval`. It measures pass/fail, steps, tokens and cost per task by shelling out to `nanocoder --plain --json run`, so a released tag can be measured with the same harness as the working tree. Six vendored task fixtures each carry machine-checkable assertions and distractor files, so a run working from degraded context fails rather than merely finishing cheaper; every result records the fixture-set id and a content hash of the fixtures. It is deliberately outside `pnpm run test:all`, since it needs real model calls. Phase 0 of #1197. diff --git a/.changeset/api-route-provider.md b/.changeset/api-route-provider.md deleted file mode 100644 index 7a86b846c..000000000 --- a/.changeset/api-route-provider.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": minor ---- - -Add an API Route template to the provider setup wizard. diff --git a/.changeset/architect-review-bar-wrapper.md b/.changeset/architect-review-bar-wrapper.md deleted file mode 100644 index 786372d31..000000000 --- a/.changeset/architect-review-bar-wrapper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fix the architect review bar's accent border sitting out of line with the composer and every other footer modal. `ArchitectReviewPrompt` was missing the shared left-edge wrapper `PlanReviewPrompt`, `FileExplorer`, `IdeSelector` and `ModalSelectors` already use. Closes #1532. diff --git a/.changeset/architect-review-file-list-cap.md b/.changeset/architect-review-file-list-cap.md deleted file mode 100644 index 04fc0fafa..000000000 --- a/.changeset/architect-review-file-list-cap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Cap the Architect review bar's changed/new-file lists at 5 rows with a "+N more" line, matching the same cap already used for the live tool-count summary. It used to print every file with no limit, so on a turn touching many files the list pushed the Keep / Revert / Revert & Revise choices below the bottom of the screen. Closes #1533. diff --git a/.changeset/auto-commit-edits.md b/.changeset/auto-commit-edits.md deleted file mode 100644 index 30f29e5b1..000000000 --- a/.changeset/auto-commit-edits.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": minor ---- - -Add `nanocoder.autoCommit` (#1482). When set to `true` in `agents.config.json`, every successful agent file edit (`write_file`, `string_replace`, `diff_edit`) is committed on its own, with a Conventional Commit message the current model writes from that file's diff (the `/commit` prompt), falling back to `chore: update ` if the model call fails. Only the edited file is committed, so the user's own staged and unstaged work is never swept in. Auto-commit is skipped outside a git repository, for ignored files, for no-op edits, and while a merge, rebase, cherry-pick or revert is in progress; a failed commit is logged as a warning and never fails the tool call. Off by default. diff --git a/.changeset/auto-commit-failure-rollback.md b/.changeset/auto-commit-failure-rollback.md deleted file mode 100644 index e674a86fa..000000000 --- a/.changeset/auto-commit-failure-rollback.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': patch ---- - -Restore exact prior git staging state on auto-commit failure and clarify same-file edit behavior in documentation diff --git a/.changeset/auto-commit-literal-pathspecs.md b/.changeset/auto-commit-literal-pathspecs.md deleted file mode 100644 index fd9eb571a..000000000 --- a/.changeset/auto-commit-literal-pathspecs.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fix `nanocoder.autoCommit` committing other files when the edited file's name looks like a git glob. The path was passed to `git add`, `git diff --cached` and `git commit` as a pathspec, so an agent edit to `[ab].txt` also matched `a.txt` and `b.txt` and swept the user's uncommitted edits to them into the agent's commit. Auto-commit now runs git with `--literal-pathspecs`, so only the edited file is committed. Closes #1654. diff --git a/.changeset/bash-failure-capsules.md b/.changeset/bash-failure-capsules.md deleted file mode 100644 index d2dc0316e..000000000 --- a/.changeset/bash-failure-capsules.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": minor ---- - -A failing test or type-check run that is too long to pass to the model whole now reaches it as a failure capsule instead of a head-and-tail cut, which used to drop the failure detail printed in the middle of the log. Nanocoder recognises Jest, Vitest, Mocha, AVA and `tsc` output, keeps each failing test's title, location, assertion and expected/received diff, and narrows the original command to the first failing test (for example `npm test -- jest/auth.test.js -t '...'`). It re-runs that narrow command once to report whether the failure reproduces on its own. Only plain runner invocations are narrowed or re-run; `!command` input is distilled but never re-run; short or unrecognised output is unchanged. Closes #1584. diff --git a/.changeset/bash-nonzero-exit-failure.md b/.changeset/bash-nonzero-exit-failure.md deleted file mode 100644 index 0488a2f1b..000000000 --- a/.changeset/bash-nonzero-exit-failure.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -A shell command that exits non-zero is no longer displayed as a success in the interactive TUI. `execute_bash` only prefixed its result with `Error: ` when the command could not be spawned at all, and the display layer decided success purely by sniffing for that prefix, so a broken build or a failing test run rendered as `⚒ Ran 1 command`, identical to a clean run. The streamed bash path now sets `ToolResult.isError` on a non-zero exit and the compact display branches on that flag, showing `⚒ execute_bash failed` instead. Together with the earlier `--plain`/`--json`/ACP fix, this closes #1371. diff --git a/.changeset/better-mammals-rhyme.md b/.changeset/better-mammals-rhyme.md deleted file mode 100644 index d773b2804..000000000 --- a/.changeset/better-mammals-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fix /copy argument validation so unknown arguments show a usage warning instead of copying the full assistant response. diff --git a/.changeset/branch-display-width.md b/.changeset/branch-display-width.md deleted file mode 100644 index 6ffb882bf..000000000 --- a/.changeset/branch-display-width.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -A git branch name containing CJK characters or emoji no longer breaks the welcome screen's location line. The row was budgeted by counting characters, but a wide glyph is one character and two terminal columns, so the line overflowed and split into a branch row with a dangling separator and a stranded path. Path truncation now measures display width, which also stops an emoji being cut in half. Closes #1389. diff --git a/.changeset/browser-tool.md b/.changeset/browser-tool.md deleted file mode 100644 index 5a9bcb62f..000000000 --- a/.changeset/browser-tool.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': minor ---- - -Add a built-in `browser` tool (navigate, click, type, screenshot) on one shared headless Chromium page. Screenshots reach vision models as images. On OpenAI-compatible providers they follow the tool result as an image message. Models that models.dev lists as text-only get the caption without the image. Localhost is allowed. Private network and cloud metadata addresses are blocked. Chromium itself is installed with `npx playwright install chromium`. diff --git a/.changeset/command-specific-help.md b/.changeset/command-specific-help.md deleted file mode 100644 index 6f89e677b..000000000 --- a/.changeset/command-specific-help.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': minor ---- - -Enhanced `/help` with categorized command listings and command-specific details, including usage, supported options and subcommands, aliases, and examples. Closes #1308. diff --git a/.changeset/compact-git-tool-phrasing.md b/.changeset/compact-git-tool-phrasing.md deleted file mode 100644 index f7aac9685..000000000 --- a/.changeset/compact-git-tool-phrasing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fix the compact tool-activity summary showing identical "Ran N git command(s)" rows for `git_status`, `git_diff` and `git_log`, making a turn that mixes them indistinguishable. Each git tool now gets its own phrasing. Closes #1556. diff --git a/.changeset/custom-tool-cmd-quoting.md b/.changeset/custom-tool-cmd-quoting.md deleted file mode 100644 index 6633b9cf7..000000000 --- a/.changeset/custom-tool-cmd-quoting.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': patch ---- - -Quote custom tool template values for cmd.exe so spaces, command metacharacters, and embedded quotes stay literal on Windows. Values containing percent signs, carriage returns, newlines, or null bytes are rejected because cmd.exe cannot represent them safely in a command string. This is a deliberate cross-platform restriction: values accepted by POSIX shells may be rejected by cmd.exe. Closes #1084. diff --git a/.changeset/daemon-install-untrusted-warning.md b/.changeset/daemon-install-untrusted-warning.md deleted file mode 100644 index 8255c031e..000000000 --- a/.changeset/daemon-install-untrusted-warning.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': patch ---- - -`nanocoder daemon install` now warns when the project isn't trusted yet. The installed service runs `nanocoder daemon start` unattended on a restart-on-failure policy, and `daemon start` refuses to boot outside a trusted directory - so installing auto-start before ever running nanocoder there produced a service that failed forever with no explanation, while install itself reported plain success. The result message now names both fixes: run `nanocoder` there once to accept the trust disclaimer, or pass `--trust-directory`. diff --git a/.changeset/dirty-hotels-care.md b/.changeset/dirty-hotels-care.md deleted file mode 100644 index 9f929ff53..000000000 --- a/.changeset/dirty-hotels-care.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Preserve HTML literals inside fenced markdown code blocks by extracting code blocks before HTML entity decoding and
conversion. Adds tests to ensure HTML tags and entities remain unchanged inside code fences. Thanks to @Shreya657. Closes #1591. - \ No newline at end of file diff --git a/.changeset/enter-selects-fresh-completion.md b/.changeset/enter-selects-fresh-completion.md deleted file mode 100644 index 29a79fc90..000000000 --- a/.changeset/enter-selects-fresh-completion.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fixed pressing Enter immediately after typing a slash-command fragment submitting the raw fragment. The completion menu opens a render after the keystroke, so an Enter landing in between saw it closed. Enter now selects from the completions about to be shown, and still submits a command once its completion has been selected. Closes #1327. diff --git a/.changeset/enter-submits-exact-command.md b/.changeset/enter-submits-exact-command.md deleted file mode 100644 index 52099f630..000000000 --- a/.changeset/enter-submits-exact-command.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': patch ---- - -Pressing Enter on a fully typed slash command now runs it on the first press instead of needing a second Enter to dismiss the completion menu. The menu opens with the exact, unambiguous match already highlighted, and Enter used to "select" it - re-applying text that was already there and closing the menu - rather than submitting. Partly typed commands still complete on Enter as before. Closes #1431. diff --git a/.changeset/escape-empty-clear-hint.md b/.changeset/escape-empty-clear-hint.md deleted file mode 100644 index 776d0237e..000000000 --- a/.changeset/escape-empty-clear-hint.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': patch ---- - -Pressing Escape on an empty composer no longer offers to "clear" it. Escape armed the two-press clear hint unconditionally, so it appeared even when there was no text, no attachments and no active-editor pill to clear. It now only arms when there is something to clear, and Escape still clears an attached VS Code file pill on its own when the composer text and attachments are otherwise empty. Closes #1430. diff --git a/.changeset/expand-row-collapse.md b/.changeset/expand-row-collapse.md deleted file mode 100644 index 79b0753f9..000000000 --- a/.changeset/expand-row-collapse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fixed /expand list rows: multi-line command arguments are collapsed to a single line, cut to the width the terminal leaves for the row, and the id column is padded so tool names stay aligned past result 9. Thanks to @theluckystrike. Closes #1534. diff --git a/.changeset/explorer-selection-clamp.md b/.changeset/explorer-selection-clamp.md deleted file mode 100644 index cdf659b6e..000000000 --- a/.changeset/explorer-selection-clamp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@nanocollective/nanocoder': patch ---- - -`/explorer` no longer strands the selection when its list gets shorter. Leaving a search swaps the list from every match back to only the expanded rows, but the selected row was only ever clamped inside the arrow-key handlers, so after a long search it pointed past the end of the tree: no row highlighted, the path readout blank, Up and Enter doing nothing, and Down jumping straight to the last row. The selection is now pulled back into range whenever the list shrinks. Closes #1454. diff --git a/.changeset/fix-1149-timeline-prune-lock.md b/.changeset/fix-1149-timeline-prune-lock.md deleted file mode 100644 index 974c83c97..000000000 --- a/.changeset/fix-1149-timeline-prune-lock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Fixed `TimelineManager` pruning an active session whose directory `mtimeMs` was older than `MAX_TIMELINE_SESSION_AGE_MS`. Each session now holds a per-process lockfile at `.nanocoder/timeline//.lock`, published atomically via a temp file plus hard `link` so concurrent readers never observe a half-written lock; `pruneStaleSessions` probes the lock and removes the entry only when the lock is missing, malformed, held by a dead PID, or older than 24h by file mtime. The mtime is refreshed on every capture so long-lived sessions keep their protection, a resumed session reaps a dead predecessor's lock before acquiring, `clear()` resets the in-memory claim so the next capture re-acquires, and a session whose lock was reaped by another process re-acquires it on its next capture. Closes #1149. diff --git a/.changeset/fix-fetch-url-process-null.md b/.changeset/fix-fetch-url-process-null.md deleted file mode 100644 index 6dd0fdefa..000000000 --- a/.changeset/fix-fetch-url-process-null.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@nanocollective/nanocoder": patch ---- - -Keep `globalThis.process` intact when `fetch_url` or file caching converts HTML through get-md: pages with an `