Commit Graph

416 Commits

Author SHA1 Message Date
Dmitriy Kovalenko 84a9b50dd7 fix(nix): Prevent illegal instructions sneaking into nix builds (#707) 0.10.2-nightly.84a9b50 2026-07-23 16:54:14 -07:00
Dmitriy Kovalenko 63b126e7b0 fix: Not finding if needle contains != (#706) 0.10.2-nightly.167f7d6 0.10.2-nightly.63b126e 2026-07-23 13:01:29 -07:00
Dmitriy Kovalenko 167f7d67cb chore: Fix CI (#704)
closes https://github.com/dmtrKovalenko/fff/issues/702
0.10.2-nightly.829bfa9
2026-07-23 11:49:29 -07:00
Gustav the Bot 829bfa9570 fix(pi-fff): preserve path/exclude in fuzzy grep fallback (#697) (#699)
* fix(pi-fff): preserve path and exclude constraints in fuzzy grep fallback (#697)

The automatic fuzzy fallback in the pi-fff `grep` tool passed the raw
`pattern` to `picker.grep`, discarding the constrained `query` built via
`buildQuery`. As a result, the fallback ignored the caller's `path` and
`exclude` constraints and could return matches from explicitly excluded
directories or files outside the requested path.

Pass the constrained `query` to the fallback instead, so it only broadens
matching (fuzzy vs. plain) without broadening scope.

Closes #697

* fix(pi-fff): drop path constraint in fuzzy fallback only for file paths

When the caller pinned a specific file (path has an extension), the
fuzzy fallback broadens across the whole picker so a mistyped filename
can still surface matches. For directory constraints (or no path), keep
the constrained query so the fallback does not leak matches from
excluded / out-of-scope directories.

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
2026-07-23 11:38:42 -07:00
Gustav the Bot 9bab609ddf fix(pi-fff): temporarily remove aux pickers frecency db access (#700) (#701)
LMDB envs may only be opened once per process. AuxFinderPool was forwarding
the main finder's frecencyDbPath / historyDbPath into every aux FileFinder,
so the first out-of-workspace search failed with
"environment already open in this program".

Aux finders are transient and per-search; they run without persistent
frecency/history scoring.

Closes #700

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.10.2-nightly.9bab609
2026-07-23 11:05:33 -07:00
dmtrKovalenko 05a35c6d48 chore: bump fff-mcp release artifacts to v0.10.1 2026-07-20 23:48:58 +00:00
Dmitriy Kovalenko 686a84959d chore: release 0.10.1
Build & Publish / Build Neovim aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build Neovim aarch64-linux-android (push) Has been cancelled
Build & Publish / Build Neovim aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build Neovim aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build Neovim aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build Neovim x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build Neovim x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build Neovim x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build Neovim x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build C FFI aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build C FFI aarch64-linux-android (push) Has been cancelled
Build & Publish / Build C FFI aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build C FFI aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build C FFI aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build C FFI x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build C FFI x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build C FFI x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build C FFI x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build MCP aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build MCP aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build MCP aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build MCP aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build MCP x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build MCP x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build MCP x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build MCP x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build Python wheels aarch64 (macos-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (macos-latest) (push) Has been cancelled
Build & Publish / Build Python wheels aarch64 (ubuntu-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (ubuntu-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (windows-latest) (push) Has been cancelled
Build & Publish / Build Python sdist (push) Has been cancelled
Build & Publish / Release (push) Has been cancelled
Build & Publish / Publish Python wheels to PyPI (push) Has been cancelled
Build & Publish / Publish Rust crates (push) Has been cancelled
Build & Publish / Publish npm packages (push) Has been cancelled
0.10.2-nightly.686a849 v0.10.1
2026-07-20 16:05:07 -07:00
Gustav the Bot 11a0d447a6 chore(node & bun): add Android arm64 (Termux) support (#695)
Adds @ff-labs/fff-bin-android-arm64 platform package and wires the
existing aarch64-linux-android CI build into the npm publishing matrix.
Extends getTriple() in fff-node and fff-bun to map process.platform
'android' to linux-android, and adds android to os arrays with the new
optionalDependency. Closes #692.

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.10.1-nightly.11a0d44
2026-07-20 15:17:17 -07:00
ziqian li 9dee049973 fix(pi-fff): handle Windows cross-volume external paths (#684)
On Windows, `path.relative()` returns an absolute path when the source
and target are on different drives (e.g. `D:\` → `C:\`). The existing
check in `routePathConstraint()` only recognizes `".."` and `"..\..."`
as indicators that a path is outside the workspace — it misses the
cross-volume case entirely. The path is then treated as workspace-local,
and downstream code rejects it with:

    Path constraint must be relative to the workspace

Extract the workspace-outside check into
`isOutsideWorkspaceRelativePath()` so the logic is testable in
isolation, and add `path.isAbsolute()` to the condition. A cross-volume
relative result is by definition outside the workspace.

Add a Windows-specific regression test that verifies the helper
recognizes a cross-volume `path.win32.relative()` result as outside the
workspace. The test is gated on `process.platform === "win32"` and has
no effect on Linux or macOS CI runs.
0.10.1-nightly.9dee049
2026-07-20 14:45:10 -07:00
Gustav the Bot 16a666b095 fix(pi-fff): install fff-bun so bun runtimes can load the SDK (#689) (#694)
PR #669 made sdk.ts dynamically import @ff-labs/fff-bun when running under
bun, but only added it as an optional peer dependency. Package managers do
not install optional peers by default, so `pi install npm:@ff-labs/pi-fff`
on a bun-only host produced a node_modules tree without @ff-labs/fff-bun
and pi crashed at session_start with "Cannot find module '@ff-labs/fff-bun'".

Promote both SDKs to regular deps. Bundle size cost is minor (SDKs are TS
shims over the same optional native bins) and this guarantees the dynamic
import in sdk.ts always resolves regardless of runtime or installer.

Closes #689

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.10.1-nightly.16a666b
2026-07-20 11:44:34 -07:00
Anton Panasenko 073698c8e7 fix(mcp): use absolute path for Codex setup (#685) 0.10.1-nightly.073698c 2026-07-17 13:27:45 -07:00
dmtrKovalenko b14c31d137 chore: bump fff-mcp release artifacts to v0.10.0 2026-07-16 20:28:10 +00:00
Dmitriy Kovalenko 31be224223 chore: release 0.10.0
Build & Publish / Build Neovim aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build Neovim aarch64-linux-android (push) Has been cancelled
Build & Publish / Build Neovim aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build Neovim aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build Neovim x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build Neovim x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build Neovim x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build Neovim aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build Neovim x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build C FFI aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build C FFI aarch64-linux-android (push) Has been cancelled
Build & Publish / Build C FFI aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build C FFI aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build C FFI aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build C FFI x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build C FFI x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build C FFI x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build C FFI x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build MCP aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build MCP aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build MCP aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build MCP aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build MCP x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build MCP x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build MCP x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build MCP x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build Python wheels aarch64 (macos-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (macos-latest) (push) Has been cancelled
Build & Publish / Build Python wheels aarch64 (ubuntu-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (ubuntu-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (windows-latest) (push) Has been cancelled
Build & Publish / Build Python sdist (push) Has been cancelled
Build & Publish / Release (push) Has been cancelled
Build & Publish / Publish Python wheels to PyPI (push) Has been cancelled
Build & Publish / Publish Rust crates (push) Has been cancelled
Build & Publish / Publish npm packages (push) Has been cancelled
0.10.1-nightly.31be224 0.9.7-nightly.a9df55d v0.10.0
2026-07-16 12:15:31 -07:00
Dmitriy Kovalenko a9df55d18e feat(sdk): Expose file watcher (#674)
* feat: Expose fff watcher

* fix: Snapshots

* fix: Snapshots

* fix: CI cache
2026-07-16 12:14:10 -07:00
Gustav the Bot 42f38ff66e chore: regenerate Neovim vimdoc (#683)
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
0.9.7-nightly.42f38ff
2026-07-16 09:35:47 -07:00
Ionut Ciolan 57b6773f4c feat(sdk): add stable FffResult C accessors (#681)
Co-authored-by: Ionut Adrian Ciolan <iadrian@ciolan.net>
0.9.7-nightly.57b6773 0.9.7-nightly.9a637cc
2026-07-15 17:44:46 -07:00
Gustav the Bot 9a637ccd73 fix(pi-fff): Allow pi to search in non cwd folders using fff(#622)
* fix(pi-fff): route out-of-workspace path constraints to a rotating aux finder pool

Hotfix prototype for #463. When the agent passes an absolute `path`
outside the workspace cwd to ffgrep/fffind, spin up (or reuse) a
FileFinder rooted at that path instead of throwing
"Path constraint must be relative to the workspace".

Pool keeps at most 3 aux finders, LRU-evicted, dropped after 5 minutes
of inactivity. Find pagination cursors carry the aux root so resumes
hit the same finder.

* fix: Redesign the aux finder

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
2026-07-15 17:42:25 -07:00
Karavellas 93b063b9d2 fix(picker_ui): highlight fuzzy query matches on file picker (#673)
* fix(picker_ui): highlight fuzzy query matches on file picker

* fix(file-picker): gate fuzzy query highlights behind config

* fix(file-picker): use rust fuzzy match ranges for highlights

Compute fuzzy match byte ranges on the Rust side for paginated file results and pass them through the nvim Lua binding.
0.9.7-nightly.d1dac82 0.9.7-nightly.93b063b 0.9.7-nightly.a97adac
2026-07-15 14:53:52 -07:00
Gustav the Bot a97adaccd8 docs(readme): add FAQ answering what FFF stands for (#680)
* docs(readme): add FAQ answering what FFF stands for

Closes #679

* docs(readme): move FFF expansions into branding subheader with logo links

* docs(readme): move FFF expansions from branding subheader to FAQ section

---------

Co-authored-by: dmtrKovalenko <dmitriy@iusevimbtw.com>
2026-07-15 14:10:14 -07:00
Gustav the Bot d1dac82ca7 fix(pi-fff): isomorphic bun/node SDK lazy-load (#669)
* fix(pi-fff): isomorphic runtime detection with lazy SDK load

Detect bun vs node at runtime and dynamically import the matching SDK
(@ff-labs/fff-bun on bun, @ff-labs/fff-node on node) via a variable
package name so oh-my-pi's static extension validator does not chase
ffi-rs' optional native binaries through the module graph.

Closes #668

* fix(pi-fff): fail loud on wrong-runtime SDK

Drop the cross-runtime SDK fallback in loadSdk. Falling back to the
node SDK on a bun host re-introduces the ffi-rs cost this PR is meant
to avoid, and hides packaging bugs where the correct SDK is missing.

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
2026-07-15 14:09:25 -07:00
Gustav the Bot 63fac0b455 chore: regenerate Neovim vimdoc (#677)
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
0.9.7-nightly.63fac0b
2026-07-14 22:06:20 -07:00
Dmitriy Kovalenko a487120c32 feat: Mulitline search (#676) 0.9.7-nightly.a487120 2026-07-14 20:28:04 -07:00
Gustav the Bot 44a5b25957 chore(deps): bump crossbeam-epoch, anyhow, memmap2 for RustSec advisories (#670) (#671) 0.9.7-nightly.44a5b25 2026-07-11 09:15:14 -07:00
Dmitriy Kovalenko b4590ca108 refactor: Split grep.rs into a few modules (#667)
* refactor: Split grep.rs into a few modules

* fix(git regression): Watch reflog for consistent git events burst handling
0.9.7-nightly.b4590ca
2026-07-10 02:35:44 -07:00
Dmitriy Kovalenko 9c30eda09e feat: Expand internal SIMD memmem implemenation and use it everywhere (#666)
Drop the custom ad-hoc implemenations per feature and memchar::Finder
when we can use internal optimize case flip & memmem
0.9.7-nightly.9c30eda
2026-07-09 14:49:39 -07:00
Dmitriy Kovalenko 1a8ef35ad8 chore(deps): Bump zlob to 1.6.1 (#663) 0.9.7-nightly.1a8ef35 2026-07-08 12:39:49 -07:00
Gustav the Bot 906b66b736 fix(core): emit compile_error for --no-default-features (#659) (#661)
`fff-search` supports two mutually exclusive backend features (`ripgrep`
default, or `zlob`) but internal cfg gates keyed off
`cfg(not(feature = "zlob"))`, meaning the ripgrep code compiled even
when the `ripgrep` feature (and its `ignore`/`globset` deps) was off.
Building with `--no-default-features` produced a wall of
"unresolved crate" errors.

Tighten the gates to `all(not(feature = "zlob"), feature = "ripgrep")`
and add a top-level `compile_error!` when neither backend is enabled,
so the failure is a single actionable message instead of 15 cascading
errors.

Refs #659

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.9.7-nightly.906b66b 0.9.7-nightly.98d4d4e
2026-07-08 09:39:26 -07:00
Eduardo Santos de Brito 98d4d4ed63 chore(readme): typo on bun package name (#662) 2026-07-08 09:39:00 -07:00
Dmitriy Kovalenko 5858d893b5 chore: Bump frizbee to 0.11 (#658) 0.9.7-nightly.5858d89 2026-07-07 13:20:56 -07:00
Gustav the Bot 7221081183 fix(core): restrict AVX2 normalize to x86_64 (fix i686 build) (#657)
* fix(core): restrict AVX2 normalize to x86_64

The AVX2 path in `normalize_bytes` gated on `any(target_arch = "x86_64",
target_arch = "x86")` unconditionally imports `std::arch::x86_64`, which
does not exist on 32-bit x86, so `fff-search` failed to compile for
`i686-unknown-linux-gnu` (e.g. termux i686 android builds pulling us in
via nushell). SIMD stays on x86_64/aarch64; 32-bit x86 falls back to the
scalar path.

Add a `Build i686-unknown-linux-gnu` CI job so this regresses loudly next
time. Closes #656.

* fix(core): silence unused i1/i2 on non-SIMD targets

`select_rare_pair` results are only consumed inside x86_64/aarch64 cfg
blocks, so on 32-bit x86 both bindings are unused and CI's
`-D unused-variables` fails the i686 build introduced in the previous
commit.

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.9.7-nightly.7221081
2026-07-07 11:16:06 -07:00
Dmitriy Kovalenko 8c76a1b3fe fix(score): size chunk ptr buffers to PATH_MAX instead of 512 bytes (#655)
* fix(simd_path): clamp resolve_ptrs iteration to buf.len()

resolve_ptrs() iterates self.indices.len() times over a fixed-size
[*const u8; 32] buffer with no guard. When a file path exceeds 512
bytes (32 chunks × 16 bytes), the loop accesses buf[32] and panics:

    index out of bounds: the len is 32 but the index is 32

On macOS PATH_MAX is 1024, so any legitimately long path can trigger
this. Clamp count to buf.len() so pathological paths are truncated
gracefully instead of crashing.

Fixes an OOB panic found in pi-fff v0.9.6.

* fix(score): size chunk ptr buffers to PATH_MAX instead of 512 bytes

The scoring hot path passed fixed [*const u8; 32] buffers (32 * 16 =
512 bytes) to resolve_ptrs while PATH_BUF_SIZE allows PATH_MAX-long
paths (1024 on macOS, 4096 on Linux), so any path over 512 bytes
panicked with an out of bounds index.

neo_frizbee 0.10.4 makes the resolver buffer size a const generic, so
the buffers are now sized MAX_PATH_CHUNKS = PATH_BUF_SIZE / 16 at
compile time and long paths are matched in full instead of truncated.
Also covers the frizbee greedy fallback for haystacks longer than its
DP matrix which previously scanned a stale score matrix and panicked.

Adds regression tests for both the resolve_ptrs unit level and the
full scoring pipeline.

---------

Co-authored-by: elee7420-gif <elee7420@gmail.com>
0.9.7-nightly.8c76a1b
2026-07-07 09:42:50 -07:00
Dmitriy Kovalenko 98af56c393 fix: Fuzzy tests caught watcher inconsistencies (#644)
* fix: Fuzz test branches

* cleanup
0.9.7-nightly.98af56c
2026-07-06 21:38:51 -07:00
Gustav the Bot 960e689d42 fix(pi-fff): feature-detect ctx.ui.addAutocompleteProvider (#651) (#653)
pi forks (e.g. omp) do not expose addAutocompleteProvider, causing
session_start to throw "FFF init failed: ... is not a function" and
skipping tool registration entirely.

Skip UI wiring when the host lacks the method; tools still register.

Refs #651

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.9.7-nightly.960e689
2026-07-05 21:36:28 -07:00
Abdelkader Boudih 18f546a4fe refactor(core): generic SharedDb<T> replaces the two LMDB handles (#617)
SharedFrecency and SharedQueryTracker are now type aliases over a single
SharedDb<T: LmdbStore>, and the three wait_for_* methods share one
poll_until helper. Public API unchanged.
0.9.7-nightly.18f546a
2026-07-04 19:37:25 -07:00
Dmitriy Kovalenko 1cd8d31da4 feat: Significantly faster & better per-platform optimized file walking & gitignore matcher (#645)
* feat: Zlob walker

* feat: Use outcome gitignore rules

; Conflicts:
;	crates/fff-core/src/file_picker.rs
;	crates/fff-core/tests/scan_correctness_contract.rs

* chore: get rid of ripgrep crates in default build

* refactor: use '/' as canonical internal path separator

The zlob walker emits '/'-separated relative paths on every platform.
Instead of converting every walked path to native '\' on Windows, make
'/' the canonical internal separator throughout the index and convert
native inputs to '/' on the (fewer) inbound lookup paths.

Native separators are re-applied only at OS/state boundaries:
- write_absolute_path nativizes for git-cache keys, frecency, Win32 APIs
- frecency keys additionally canonicalize on Windows (dunce), with a
  raw-string fallback so watcher deletes never drop the op

Removes several scattered Windows compensations (score.rs fuzzy folds,
constraints.rs collect fold) now that stored paths are already '/'.
relative_path emitted to Lua is now '/' on all platforms.
0.9.7-nightly.1cd8d31 0.9.7-nightly.4ac67d0
2026-07-02 15:39:47 -07:00
Gustav the Bot 4ac67d0167 fix(loging): create log file when before the SIGSEGV hook can chance to write a banner (#648) 2026-07-02 15:38:59 -07:00
Gustav the Bot 4d1353757d fix(nvim): use configurable grep_match hl in preview (#646) (#647)
The preview window hardcoded 'IncSearch' for grep match highlights while
the results list uses config.hl.grep_match. Overriding grep_match had no
effect on the preview, forcing users to override the global IncSearch
group instead.

Refs #646

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
0.9.7-nightly.4d13537
2026-07-02 13:36:35 -07:00
chpf 3826905a4b chore(build): be less strict on the zig executable (#643) 0.9.7-nightly.3826905 2026-07-01 10:36:52 -07:00
Gustav the Bot e0a9e08a3a chore: regenerate Neovim vimdoc (#640)
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
0.9.7-nightly.e0a9e08
2026-06-29 22:32:33 -07:00
Will Hopkins 0c40be4a4d feat(nvim): add layout.border to override winborder (#639) 0.9.7-nightly.0c40be4 2026-06-29 20:46:20 -07:00
Gabe Shahbazian a0008b1cde feat(nvim): open all multi-selected files on cr (#544) 0.9.7-nightly.a0008b1 2026-06-27 19:45:04 -07:00
thuan1412 fce72fa5d6 fix(nvim): use raw text for highlight in preview (#637) 0.9.7-nightly.fce72fa 2026-06-27 07:44:19 -07:00
Gustav the Bot 0a953ab918 chore: regenerate Neovim vimdoc (#636)
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
0.9.7-nightly.0a953ab
2026-06-26 22:26:15 -07:00
Gustav the Bot 03e1a1a15e feat: expose follow_symlinks for SDK/MCP/python paths (#628)
* feat: expose follow_symlinks for SDK/MCP/python paths

Closes #627

Bumps FFF_CREATE_OPTIONS_VERSION to 2 (append-only).
Adds --follow-symlinks flag to fff-mcp, follow_symlinks kwarg to the
pyo3 finder, and followSymlinks option to @ff-labs/fff-node. Default
stays false everywhere; follow_symlinks is preserved across reindex
in C and Python.

Watcher cycle handling is unchanged — caller must ensure the indexed
tree has no symlink loops.

* fix build

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
0.9.7-nightly.03e1a1a
2026-06-26 16:58:55 -07:00
Gustav the Bot a1f0c5c151 docs(nvim): add visual-mode example for fc keymap (#631) (#632)
* docs(nvim): add visual-mode example for fc keymap (#631)

Refs #631

* feat(api): add live_grep_under_cursor for normal/visual mode

* refactor(nvim): live_grep_under_cursor reads visual region without yank

Use getpos('<)/getpos('>) + getregion() instead of yanking into the v register.
Avoids touching the user's registers entirely.

* chore: improve default binding

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
0.9.7-nightly.b55a566 0.9.7-nightly.a1f0c5c
2026-06-26 16:26:46 -07:00
Gustav the Bot b55a566da0 fix(mcp): self-exit after idle timeout (prototype for #633) (#634)
* fix(mcp): self-exit after idle timeout to mitigate orphan processes

Some MCP clients (e.g. Claude Code) spawn fff-mcp per session but don't
close stdin on session end, leaving orphan processes consuming CPU
(#633, #497).

Add an idle watchdog: each tool call bumps a last-activity timestamp, a
background task ticks every 60s and exits(0) after --idle-timeout-secs
(default 900) without activity. Set to 0 to disable. Also configurable
via FFF_MCP_IDLE_TIMEOUT_SECS.

Stopgap before the daemon-based process model. Notifications/pings do
not count as activity, so a chatty-but-dead client cannot keep the
process alive forever.

* fix: cleanup

---------

Co-authored-by: gustav-fff <286169375+gustav-fff@users.noreply.github.com>
Co-authored-by: Dmitriy Kovalenko <dmtr.kovalenko@outlook.com>
2026-06-26 16:18:36 -07:00
Dmitriy Kovalenko 957f222da7 fix(release): do not skip ci on release artifact commit (#625) 0.9.7-nightly.957f222 2026-06-21 19:25:06 -07:00
dmtrKovalenko a39fec79cd chore: bump fff-mcp release artifacts to v0.9.6 [skip ci] 2026-06-21 19:15:33 +00:00
Dmitriy Kovalenko 28321da228 chore: release 0.9.6
Build & Publish / Build Neovim aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build Neovim aarch64-linux-android (push) Has been cancelled
Build & Publish / Build Neovim aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build Neovim aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build Neovim aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build Neovim x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build Neovim x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build Neovim x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build Neovim x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build C FFI aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build C FFI aarch64-linux-android (push) Has been cancelled
Build & Publish / Build C FFI aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build C FFI aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build C FFI aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build C FFI x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build C FFI x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build C FFI x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build C FFI x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build MCP aarch64-apple-darwin (push) Has been cancelled
Build & Publish / Build MCP aarch64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build MCP aarch64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build MCP aarch64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build MCP x86_64-apple-darwin (push) Has been cancelled
Build & Publish / Build MCP x86_64-pc-windows-msvc (push) Has been cancelled
Build & Publish / Build MCP x86_64-unknown-linux-gnu (push) Has been cancelled
Build & Publish / Build MCP x86_64-unknown-linux-musl (push) Has been cancelled
Build & Publish / Build Python wheels aarch64 (macos-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (macos-latest) (push) Has been cancelled
Build & Publish / Build Python wheels aarch64 (ubuntu-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (ubuntu-latest) (push) Has been cancelled
Build & Publish / Build Python wheels x86_64 (windows-latest) (push) Has been cancelled
Build & Publish / Build Python sdist (push) Has been cancelled
Build & Publish / Release (push) Has been cancelled
Build & Publish / Publish Python wheels to PyPI (push) Has been cancelled
Build & Publish / Publish Rust crates (push) Has been cancelled
Build & Publish / Publish npm packages (push) Has been cancelled
0.9.7-nightly.28321da v0.9.6
2026-06-21 11:48:22 -07:00
Dmitriy Kovalenko 001bfe9220 fix: More efficient watching for .git related files (#621)
closes https://github.com/dmtrKovalenko/fff/issues/616
2026-06-21 11:47:23 -07:00