@muvon/octofs 0.14.1 → 0.15.1

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.
Files changed (2) hide show
  1. package/README.md +21 -1
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -58,6 +58,7 @@ Your AI coding assistant (Cursor, Claude, Windsurf, etc.) is smart — but it's
58
58
  | **Transport** | STDIO + Streamable HTTP | STDIO only |
59
59
  | **Shell Integration** | Automatic foreground-to-background handoff | Limited or none |
60
60
  | **Remote Files** | Transparent SSH/SFTP on every file tool | None |
61
+ | **Re-reads** | Delta views — re-viewing a file returns only the hunks changed since | Full file every time |
61
62
  | **Safety** | Gitignore-aware, stale-write detection, path validation | Full filesystem access |
62
63
 
63
64
  ---
@@ -234,7 +235,10 @@ Edit tools take these ids back as targets and verify the hash against the file
234
235
  before applying anything. A stale id (the file changed since it was viewed) fails
235
236
  with the current content around the target and where the expected content moved —
236
237
  so the model retargets from the error instead of re-reading the file. Edit results
237
- are diffs with fresh ids, so edits chain without re-viewing.
238
+ are diffs with fresh ids, so edits chain without re-viewing. Removed lines collapse
239
+ to their old id range (`-12:a3..15:f1 (4 lines)`), and a trailing
240
+ `shift: lines after 40:b2 +3` line says how original line numbers below each edit
241
+ moved, so ids the model still holds can be adjusted without a failed call.
238
242
 
239
243
  This is the single line-id format — there is no mode switch. Plain line numbers
240
244
  are still accepted where a position alone is safe: `view` ranges (negative counts
@@ -301,6 +305,7 @@ octofs mcp --path ssh://deploy@example.com/var/www/app --ssh-key ~/.ssh/id_ed255
301
305
  view path="ssh://deploy@example.com/etc/nginx/nginx.conf"
302
306
  ```
303
307
 
308
+ - **Login home** — `ssh://host` (no path) and `ssh://host/~/dir` resolve against the login user's home, like `ssh host` / `scp host:dir`. `ssh://host/dir` stays absolute.
304
309
  - **OpenSSH config** — host aliases are resolved through the local OpenSSH config (including `Include` and `Match`) and honor `HostName`, `User`, `Port`, and a single `ProxyJump`. Explicit URL values win, so both `ssh://dev/path` and `ssh://user@example.com:2222/path` work as expected. Multi-hop `ProxyJump` and `ProxyCommand` routing are rejected with a clear error.
305
310
  - **Authentication** — uses the host's `IdentityAgent` (e.g. 1Password) or `$SSH_AUTH_SOCK`, then key files — `--ssh-key` if given, the host's `IdentityFile` entries, then the defaults in `~/.ssh` (`id_ed25519`, `id_ecdsa`). Passphrase-protected key files are not supported directly; use an agent instead.
306
311
  - **RSA keys are not supported** — the Rust `rsa` crate has an unfixed timing side-channel (Marvin attack, [RUSTSEC-2023-0071](https://rustsec.org/advisories/RUSTSEC-2023-0071)), so octofs is built without RSA entirely. Use an ed25519 key instead (`ssh-keygen -t ed25519`); ecdsa also works. RSA-only setups fail with a clear error naming the key.
@@ -329,6 +334,16 @@ that `batch_edit` and `extract_lines` take as targets.
329
334
 
330
335
  To read several files, make multiple `view` calls — they run in parallel.
331
336
 
337
+ **Delta views:** a whole-file view of a file the session already served returns
338
+ only the hunks changed since — the same `...`/`-`/`+` style as edit results, with
339
+ removed lines collapsed to their old id range — or
340
+ `[unchanged since you last viewed or edited it: N lines. Pass full: true to re-read.]`.
341
+ Octofs' own edits keep the cache current, so a re-view after your own `batch_edit`
342
+ costs one line. Ranged views and content search always render exactly what was asked.
343
+ ```json
344
+ {"path": "src/main.rs", "full": true} // force the complete file (e.g. after context compaction)
345
+ ```
346
+
332
347
  **Directory listing:**
333
348
  ```json
334
349
  {"path": "src/"}
@@ -336,6 +351,11 @@ To read several files, make multiple `view` calls — they run in parallel.
336
351
  {"path": "src/", "max_depth": 2, "include_hidden": true}
337
352
  ```
338
353
 
354
+ A bare listing of a remote directory (`ssh://host/path`, no `pattern`/`content`)
355
+ defaults to `max_depth: 1` — root entries only — because every subdirectory costs
356
+ an SFTP round trip; pass `max_depth` explicitly to walk deeper. Searches with
357
+ `pattern` or `content` always walk the whole tree, like `rg`.
358
+
339
359
  `pattern` uses the same gitignore-style glob grammar as ripgrep's `-g/--glob`:
340
360
  without `/` it matches filenames at any depth, while a pattern containing `/`
341
361
  matches the returned relative path. It supports `*` within one path component,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@muvon/octofs",
3
- "version": "0.14.1",
3
+ "version": "0.15.1",
4
4
  "description": "Standalone MCP filesystem tools server \u2014 view, edit, shell, workdir.",
5
5
  "mcpName": "io.github.Muvon/octofs",
6
6
  "bin": {