skills/filesystem/SKILL.md
File and directory operations via Claude Code built-in tools, replacing the Filesystem MCP server. Triggers on: "read this file", "write to file", "edit file", "find files matching", "search for text in files", "list directory", "show directory tree", "rename file".
npx skillsauth add mathews-tom/armory filesystemInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
All file and directory operations use Claude Code's built-in tools. No MCP server needed — native tools are faster, more capable, and cost zero context tokens when idle.
| Filesystem MCP Tool | Replacement | Notes |
| ----------------------------- | ------------------------------ | ---------------------------------------------------------------------- |
| read_file(path) | Read tool | Supports line offset and limit |
| read_multiple_files(paths) | Multiple parallel Read calls | Faster than sequential MCP calls |
| write_file(path, content) | Write tool | Overwrites entire file |
| edit_file(path, edits) | Edit tool | Exact string replacement; surgical edits |
| list_directory(path) | Glob or Bash ls | Glob for patterns, ls for simple listing |
| directory_tree(path) | Bash fd or Glob **/* | fd is fastest; Glob for pattern filtering |
| search_files(pattern, path) | Grep tool | Full regex, file type filters, context lines |
| create_directory(path) | Bash mkdir -p | -p creates intermediate directories |
| move_file(src, dst) | Bash mv | Also handles renames |
| get_file_info(path) | Bash stat or Bash ls -la | Size, permissions, timestamps |
| list_allowed_directories | N/A | Claude Code operates in the working directory; no sandbox restrictions |
Use the Read tool with an absolute path:
Read: /path/to/file.py
For large files, use offset and limit to read specific sections:
Read: /path/to/file.py (offset: 100, limit: 50)
This reads 50 lines starting from line 100. Use this for files with thousands of lines to avoid flooding context.
Issue multiple Read calls in a single response. Claude Code executes them concurrently:
Read: /path/to/file1.py
Read: /path/to/file2.py
Read: /path/to/file3.py
Parallel reads are faster than the MCP's read_multiple_files which serialized internally.
The Read tool handles binary formats:
pages: "1-5" for large documents (max 20 pages per call)Use the Write tool to create a file or overwrite an existing one:
Write: /path/to/new-file.py
Content: <full file content>
The Write tool requires reading the file first if it already exists. For new files,
write directly.
Use the Edit tool for surgical modifications — replace exact string matches:
Edit: /path/to/file.py
old_string: "def old_function():"
new_string: "def new_function():"
The Edit tool fails if old_string is not unique in the file. Provide enough
surrounding context to make the match unique, or use replace_all: true for
find-and-replace across the entire file.
Prefer Edit over Write for existing files. Edit preserves everything outside the changed region and shows a clear diff. Write replaces the entire file.
Glob: **/*.py → all Python files recursively
Glob: src/**/*.ts → TypeScript files under src/
Glob: *.md → Markdown files in current directory
Glob: **/test_*.py → test files anywhere in the tree
Results are sorted by modification time (most recent first).
Grep: pattern="def process_data" type="py"
Grep: pattern="TODO|FIXME" glob="*.py"
Grep: pattern="class.*Controller" output_mode="content" -C=2
| Grep Parameter | Purpose |
| ---------------- | -------------------------------------------------- |
| pattern | Regex pattern to match |
| type | File type filter (py, js, ts, rust, go, etc.) |
| glob | Glob pattern filter (*.tsx, src/**/*.py) |
| output_mode | files_with_matches (default), content, count |
| -C, -A, -B | Context lines: around, after, before matches |
| -i | Case-insensitive search |
Simple listing:
ls -la /path/to/directory
Recursive tree with fd:
fd . /path/to/directory --type f
Tree with depth limit:
fd . /path/to/directory --type f --max-depth 2
Filter by extension:
fd -e py /path/to/directory
mkdir -p /path/to/new/directory
The -p flag creates all intermediate directories. Always verify the parent path
exists first with ls.
mv /path/to/source.py /path/to/destination.py
Rename a file (same directory):
mv /path/to/old-name.py /path/to/new-name.py
Move a directory:
mv /path/to/source-dir /path/to/destination-dir
cp /path/to/source.py /path/to/destination.py
cp -r /path/to/source-dir /path/to/destination-dir
rm /path/to/file.py
rm -r /path/to/directory
Always confirm with the user before deleting files or directories.
stat /path/to/file.py
ls -la /path/to/file.py
wc -l /path/to/file.py
| Command | Returns |
| -------- | ------------------------------------------- |
| stat | Size, permissions, timestamps, inode |
| ls -la | Permissions, owner, size, modification date |
| wc -l | Line count |
| file | MIME type detection |
# Find all files containing the old string
Grep: pattern="old_function_name" type="py" output_mode="files_with_matches"
# Then Edit each file
Edit: /path/to/file1.py (old_string → new_string, replace_all: true)
Edit: /path/to/file2.py (old_string → new_string, replace_all: true)
fd . --type f --max-depth 2Read: package.json or Read: pyproject.tomlGrep: pattern="def main|if __name__" type="py"fd --type f --exec stat -f '%z %N' {} \; | sort -rn | head -20
| Error | Cause | Resolution |
| --------------------------- | --------------------------------------- | ------------------------------------------------- |
| Read: file not found | Path incorrect or file deleted | Verify with ls or Glob |
| Edit: old_string not unique | Multiple matches in the file | Add more surrounding context to make it unique |
| Edit: old_string not found | Content changed since last read | Re-read the file, then retry with current content |
| Write: file not read first | Attempting to overwrite without reading | Read the file first, then Write |
| Permission denied | Insufficient OS permissions | Check with ls -la; use chmod if appropriate |
| Glob: no files found | Pattern too restrictive | Broaden the pattern; check path spelling |
Bash ls or fd to list directories.fd or find for queries Glob cannot express (size filters, date filters).grep or rg via Bash.testing
Manages dependent branch stacks and stacked pull requests using safe Git topology rules. Triggers on: "create stacked PRs", "publish this stack", "sync my PR stack", "rebase this stack", "merge the stack", "retarget child PRs", "split this branch into stacked PRs", "validate this stack", "cleanup stacked branches". Use when local branches or one source branch need to become a dependency-ordered PR stack with correct parent bases, validation, synchronization, merge order, and cleanup.
development
Scaffolds per-repository agent context so coding agents share the same issue tracker rules, triage label vocabulary, domain glossary, ADR layout, and handoff conventions. Triggers on: "set up project context", "configure agent docs", "create CONTEXT.md", "setup agent workflow", "agent issue tracker setup", "triage labels", "domain glossary for agents". Use when a repo needs durable context files before planning, triage, debugging, TDD, architecture review, or multi-agent implementation.
testing
Produces phased task boards from feature requests: dependency-mapped work items, parallelization flags, risk flags, edge cases, test matrices. Triggers on: "decompose this feature", "task breakdown with dependencies", "phased implementation plan", "work breakdown structure". NOT for effort estimates, use estimate-calibrator.
development
Hypothesis-driven debugging with ranked hypotheses, git bisect strategy, instrumentation planning, and minimal reproduction design. Triggers on: "debug this systematically", "root cause analysis", "bisect this bug", "rank hypotheses", "isolate this issue", "minimal reproduction". NOT for general reasoning.