You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
[5.0.0] - 2026-08-22
Added
file_organizer_organize_by_project - project-based content
organization, re-added on the v5 architecture (the v3.5 Phase 3 feature,
rebuilt). Detection groups files across types using deterministic,
local-only signals: rarity-weighted shared name tokens, IDF-filtered
content terms from text-like files (read through the hardened core/io reader, plain text only, no new dependencies), and identifier
markers. Content-blind files join only via a name token or marker.
The server serves 22 tools (was 21).
⚠️ Breaking Changes
Scheduler is now a standalone bin - the watch tools
(file_organizer_watch_directory, file_organizer_unwatch_directory, file_organizer_list_watches) are removed from the MCP server. Scheduled
organization is managed and run by bin/file-organizer-watch.mjs
(add/remove/list subcommands; daemon mode is the default). The core
stdio server serves 21 tools (was 24).
Content-based tools deleted - organize_smart, organize_by_content
and the screen_files flag are gone, along with PDF/DOCX text extraction.
Text previews are raw reads. Dropped dependencies: pdf-parse, mammoth.
Stateless protocol era - see MCP section below; clients on the 2025-era
handshake keep working via dual-era negotiation.
🚀 MCP 2026-07-28 Protocol Support
Switched to @modelcontextprotocol/server@2.0.0 (replacing @modelcontextprotocol/sdk@1.30.0). The server implements the stateless
MCP spec from 2026-07-28: no session handshake, no Mcp-Session-Id, modern
requests carried in the _meta envelope, and server/discover for
capability negotiation.
Dual-era stdio serving - serveStdio negotiates the protocol era per
connection. 2025-era clients (classic initialize handshake) and
2026-07-28 clients (server/discover opening) are served by the same
binary. Era is locked per connection at the opening message.
Response caching - cacheHints (ttlMs: 3600000, cacheScope: "private") on cacheable list operations (tools/list, server/discover),
so cached clients skip redundant metadata fetches.
Legacy initialize support remains available (12-month deprecation window);
operators can set legacy: "reject" to serve 2026-07-28 clients only.
🧹 Simplification (simplify-v5)
No file over 300 lines - types.ts, config.ts, index.ts and the
categorizer god-file split into core/types, core/config, core/categorize
and friends. Dead methods deleted.
27 services → core modules - end state is core/{path,io,scan,categorize,organize,hash} + history logger + extensions/scheduler. The readers/ framework (~2k lines with its factory,
Result type, rate limiter and audit log) collapsed into one core/io/readFile() function that keeps the sensitive-file gate and TOCTOU
protection. Metadata stack merged into services/metadata/{image,audio,service};
content-analyzer, topic-extractor, text-extraction, content-screening and
metadata-cache deleted.
History logger rewrite - log() appends directly behind an in-process
write chain instead of a batch queue with a flush timer. Lockfile kept for
cross-process safety (server + watch daemon share one file).
Stateless server - fresh McpServer per connection, request-scoped ctx = { config, history }, zero module-level service instances. Custom
categorization rules persist to user config instead of a global singleton.
Rollback manifests moved from process.cwd()/.file-organizer-rollbacks
(broke under npx/global installs) to the platform config dir, with guarded
migration of legacy manifests.
🐛 Bug Fixes
set_custom_rules filename patterns never matched - the Zod schema uses filename_pattern but the old code cast straight to camelCase without
normalizing, so pattern rules from the tool were silently ignored. Handler
now converts snake_case → camelCase.
History lockfile steal - staleness was judged on the same window as the
wait, so a waiter could take a live lock at its deadline. Stale threshold is
now lockTimeoutMs * 2.
Undo broken for npx/global installs - rollback manifests were written
relative to the process working directory.