This file provides context and guidance for Claude (AI assistant) when working on FSLint (file-soup).
FSLint is a cross-platform file system intelligence tool with a Notepad++-style plugin architecture.
Core Purpose: Provide contextual metadata about files (git status, age, grouping, AI detection, OCR status, etc.) through tiny, composable plugins that can be enabled/disabled individually.
Innovation: No existing tool provides cross-platform file intelligence with this plugin architecture. Closest competitors: exa (no plugins), fd (search only), gitleaks (git-only).
file-soup/
├── crates/
│ ├── fslint-core/ # Scanner, plugin loader, config system
│ ├── fslint-cli/ # CLI commands and output formats
│ ├── fslint-plugin-api/ # Plugin trait definitions
│ └── fslint-plugin-sdk/ # Plugin helper utilities
├── plugins/
│ ├── git-status/ # Git repo status + branch (color-coded)
│ ├── file-age/ # Recent modification highlighting (<7 days)
│ ├── grouping/ # node_modules, .DS_Store, media sets
│ ├── version-detection/ # Find newest among file_v1, file_v2, file_final
│ ├── ocr-status/ # PDF text layer detection
│ ├── ai-detection/ # EXIF/PNG metadata for AI-generated content
│ ├── duplicate-finder/ # Hash-based duplicate detection
│ └── secret-scanner/ # Regex patterns for API keys
└── target/ # Build output (in .gitignore)
- Better mobile/app store support
- Stronger ecosystem
- WASM runtime available for future browser integration
- Ship fast with native plugins
- Add WASM support in Phase 2 for sandboxing and web compatibility
trait Plugin {
fn metadata() -> PluginMetadata;
fn check(context: &PluginContext) -> PluginResult;
}Simple, focused interface - each plugin = one feature
Like Notepad++: each plugin is one focused feature that can be enabled/disabled
- Location:
~/.config/fslint/config.toml - Plugin enable/disable state
- Per-plugin configuration
- Follow Rust conventions (rustfmt, clippy)
- Write clear, self-documenting code with appropriate comments
- Keep plugins focused - one feature per plugin
- Graceful error handling (no panics in plugins)
- Work on feature branches prefixed with
claude/ - Write clear, descriptive commit messages
- Push changes to the designated branch when complete
- Commit frequently with logical chunks
# Run all tests
cargo test --workspace
# Run specific crate tests
cargo test -p fslint-core
# Run with output
cargo test -- --nocapture- Use version pinning for stability
- libgit2 for git operations (auto-walks to find .git/)
- wasmtime for WASM plugin runtime
- serde for serialization
- clap for CLI parsing
# Clone the repository
git clone <repository-url>
cd file-soup
# Build debug
cargo build
# Build release
cargo build --release# Run FSLint
cargo run --release -- scan .
# List plugins
cargo run --release -- plugins
# Enable/disable plugins
cargo run --release -- enable git-status
cargo run --release -- disable file-age
# Query syntax
cargo run --release -- query "name:myfile ext:tiff newest:true"
# Output formats
cargo run --release -- scan . --format table
cargo run --release -- scan . --format json
cargo run --release -- scan . --format simple# Format code
cargo fmt --all
# Lint
cargo clippy --workspace -- -D warnings
# Test
cargo test --workspace
# Build release binary
cargo build --release
# Binary at: ./target/release/fslint- ✅ Plugin API trait system
- ✅ File scanner with directory walker
- ✅ CLI with table/JSON/simple output
- ✅ Config system
- ✅ Three core plugins (git-status, file-age, grouping)
- Performance: --max-depth default, smart caching by (path, mtime, size)
- WASM plugin support with wasmtime runtime
- Query engine:
name:, ext:, newest:syntax - Additional plugins: version-detection, OCR-status, AI-detection, duplicate-finder, secret-scanner
- Shadow navigation mode for symlinks
- Virtual filesystem across disks/cloud
- Mailbox integration for email attachments
- Focus mode filters
- Shell integration (Windows Explorer, Finder, Nautilus)
- Uses libgit2 which automatically walks up to find
.git/ - Must strip path prefix gracefully for files outside repo
- Shows branch in separate table column
- Add
--max-depthdefault to prevent deep recursion - Implement caching by (path, mtime, size) tuple
- Lazy plugin execution (only enabled plugins)
- Warn: "3 visible, 1000 hidden" before destructive operations
- Require
--include-hiddenflag for hidden files - No accidental operations on system directories
target/must be in.gitignore- Use
cargo build --releasefor performance testing - Profile with
cargo build --release && time ./target/release/fslint scan .
- Create directory in
plugins/my-plugin/ - Add
Cargo.toml:
[package]
name = "fslint-plugin-my-plugin"
version = "0.1.0"
[dependencies]
fslint-plugin-api = { path = "../../crates/fslint-plugin-api" }
fslint-plugin-sdk = { path = "../../crates/fslint-plugin-sdk" }- Implement trait in
src/lib.rs:
use fslint_plugin_api::{Plugin, PluginContext, PluginResult, PluginMetadata};
pub struct MyPlugin;
impl Plugin for MyPlugin {
fn metadata() -> PluginMetadata {
PluginMetadata {
name: "my-plugin".into(),
version: "0.1.0".into(),
description: "Does something useful".into(),
}
}
fn check(context: &PluginContext) -> PluginResult {
// Implementation
}
}- Register in
fslint-core/src/plugin_loader.rs
- Cargo:
cargo install fslint - Homebrew: Formula for macOS/Linux
- winget: Windows package manager
- Future: Shell extension integration
- Ensure read permissions on scanned directories
- Use
--include-hiddenfor hidden files
- Use
--max-depth Nto limit recursion - Enable only needed plugins
- Check cache effectiveness
- Verify plugin is in
config.tomlenabled list - Check plugin compilation:
cargo build -p fslint-plugin-NAME - Review logs for plugin errors
- Repository: file-soup (FSLint)
- Documentation: FSLINT_README.md
- Issue tracking: GitHub Issues
- Previous work:
claude/git-status-shell-extension-01L7Ppr72PPKbg6yb4Ko4baG
Tiny plugins that can be added incrementally, not monolithic features.
Each plugin should:
- Do one thing well
- Be independently enable/disable-able
- Have minimal performance impact when disabled
- Fail gracefully
- Provide clear, actionable information
Last Updated: 2025-11-22