# fencecat ⚖️🐈

[![Crates.io](https://img.shields.io/crates/v/fencecat)](https://crates.io/crates/fencecat)
[![Docs.rs](https://docs.rs/fencecat/badge.svg)](https://docs.rs/fencecat)
[![License](https://img.shields.io/crates/l/fencecat)](https://spdx.org/licenses/MIT)

Recursively emit Markdown code fences labeled with relative file paths.  
Perfect for sharing source trees in LLM chats, issues, blog posts, or code reviews.

## Features

- Walks a directory tree and prints each file inside a fenced code block.
- Labels fences with the file’s relative path.
- Automatically chooses fence length so embedded backticks don’t break.
- Skips binary files and empty files.
- Supports filtering by file extension (allow list and deny list).
- Supports filtering by path Regex (allow list and deny list).
- Optional: order by file size (largest first).
- Optional: copy the entire output to your clipboard.

## Installation

```bash
cargo install --locked fencecat
```

The resulting binary will be in `~/.cargo/bin/fencecat`.

## Usage

```bash
fencecat [OPTIONS] [DIR]
```

### Options

- `-c`, `--copy`
  Copy the full output to the clipboard.
  On Wayland/X11 this uses external tools (`wl-copy`, `xclip`, or `xsel`) if available.

- `-B`, `--biggest-first`
  Order files by size, largest first.

- `--ext EXT[,EXT...]`
  Only include files with the given extensions.
  Examples:

  ```bash
  fencecat . --ext rs,ts,py
  fencecat src --ext .md,.toml
  ```

- `--not-ext EXT[,EXT...]`
  Exclude files with the given extensions. This takes precedence over inclusions.
  Example:

  ```bash
  fencecat . --not-ext lock,txt
  ```

- `--regex PATTERN`
  Only include paths that match the given Regex pattern (relative to the current working directory).
  Can be specified multiple times to add multiple patterns.

- `--not-regex PATTERN`
  Exclude paths that match the given Regex pattern.
  Can be specified multiple times.

- `-h`, `--help`
  Show help information.

- `-V`, `--version`
  Show version.

- `--no-ignore`
  Include hidden and gitignored files (disables ignore rules).

### Examples

Emit all files under `src/`:

```bash
fencecat src
```

Emit only Rust and Python files:

```bash
fencecat . --ext rs,py
```

Exclude lock files and text files:

```bash
fencecat . --not-ext lock,txt
```

Emit only files in a `controllers` or `models` folder using Regex:

```bash
fencecat src --regex "controllers/" --regex "models/"
```

Exclude test files using Regex:

```bash
fencecat . --not-regex "test" --not-regex "_spec\."
```

Copy output to clipboard for pasting into GitHub:

```bash
fencecat . -c
```

Sort files by size:

```bash
fencecat . -B
```

## Clipboard Notes

On Linux/Wayland:

- Install [`wl-clipboard`](https://github.com/bugaevc/wl-clipboard) for `wl-copy` / `wl-paste`.
- If unavailable, `xclip` or `xsel` under XWayland are used.
- macOS uses `pbcopy`; Windows uses PowerShell’s `Set-Clipboard`.

If the clipboard still seems empty, check your compositor or portal logs.

## License

MIT
