⚠️ NOTE
You are reading a post about an older version of the extension. Newer versions automatically apply the generated diffs from your clipboard and add many more features. Check out the GitHub Repository for the most up-to-date details, or read this updated post on DEV.
The UI:
An example output:
# Project structure
```
.gitattributes
.gitignore
AGENTS.md
CONTRIBUTING.md
LICENSE
README.md
assets/preview.webp
docs/me/prompt.md
docs/me/publishing.md
pyproject.toml
reptclip-config.toml
src/reptclip/__init__.py
src/reptclip/cli.py
src/reptclip/cli_parser.py
src/reptclip/clipboard.py
src/reptclip/config.py
src/reptclip/file_reader.py
src/reptclip/filters.py
src/reptclip/git_files.py
src/reptclip/markdown_builder.py
tests/test_cli.py
tests/test_config.py
tests/test_file_reader.py
tests/test_filters.py
tests/test_git_files.py
tests/test_markdown_builder.py
```
# AGENTS.md
```
Do not make mistakes.
```
# Prompt
<- Cursor lands here; you can quickly start typing!
Basically, type whatever you want to copy, then press Enter. Context will be copied straight to your clipboard!
Also, you'll get suggestions as you type:
State is stored on a per-project basis. When you come back, your configuration will too!
It's inspired by my CLI app PipxClip, which was formerly ReptClip. So I named it ReptClip for VS Code.
Here are the key improvements from the CLI version:
- No need to provide quotes for glob patterns: This is impossible in the CLI
- Get suggestions as you type
- Syntax highlighting
- Intuitive UI (README not required!)
It's really useful for me because this is my workflow when I finish my GitHub Copilot free credits:
- Copy files
- Paste them into gemini.google.com
- Paste them back
And repeat:
If you also found this helpful, please consider giving a ⭐ on GitHub! It really helps A LOT!
Thank you for reading till the end! Please let me know what you think. I am really curious!
Issues and PRs are welcome too!



Top comments (16)
Tree-first output is the right shape, it is close to what coding agents assemble for themselves. Two things from running the same shuttle to Gemini. Put the file you are asking about at the very end, just before your question. Long pastes degrade in the middle, so the tree can open the context but the working file should land closest to the prompt. And your example output shows the gotcha by accident: docs/me/prompt.md and docs/me/publishing.md are personal notes that ride along to a hosted chat the moment they match the pattern. A one-second skim of the generated markdown before pasting catches it. Per-project state would have saved me, redoing selections every session is what killed my manual version.
Thanks for your comment! That's correct! I have to figure out a way to allow people to put certain files close to the prompt without making the UI complicated.
Another problem is that currently, all files not ignored by
.gitignorewill appear in the project structure..gitignoreis the only way to control what goes there. I have to fix that too. Thanks for the suggestion! Means a lot!Can you share that manual version of yours? Just to take a look.
It was a shell script and a throwaway markdown buffer, nothing clever. I ran git ls-files for the tracked file list, trimmed it in the editor to the files that mattered, then piped the surviving paths through a loop that appended each file to context.md under its own heading in a code fence. Paste the result into Gemini with the question at the end. Same property you are hitting now, by the way: git ls-files only respects .gitignore, so tracked-but-personal files rode along unless I trimmed them by hand. The workflow itself held up, what killed it was redoing the same selection every session, because the choice lived only in that one buffer. Your extension removes exactly that step, which is why I would store selections as per-project state.
@mansio Curious what you think about this one!
Congrats — the copy/paste loop is what everyone hand-rolls with a shell script, and you actually turned it into a tool with state. That's the part people skip.
I build the other side of this (an MCP server serving code context live), and I went in sure "dump the whole repo" was the wrong call. Measured, it's not about recall — my plain keyword tier matched the full pipeline on 30 code tasks. What breaks is the middle of a long paste, like @piekwerk said. So tree-first + target file last is the right shape, not a bigger paste.
The tokens are where it bites. A friend ran chunks vs whole-document on the same retriever: 9/14 correct at 1,356 tokens for chunks, 5/14 at 2,181 for the whole doc. Tiny sample, direction only, but it points at a context budget being the next move — collapse dirs by default, expand on demand.
The AGENTS.md ("Do not make mistakes.") made me laugh. Good luck with it.
So, it's that important? I have a plan. If you prepend the letter
i(for "important") before a file or a pattern, they get pasted last. How does that sound? I am also thinking about a separate text box for important files, but that would be too many boxes. But it would be clearer to the user. I am not sure how to implement it.Can you share that MCP server you were talking about? Sounds interesting to me...
Thanks for the tag. Your chunks-vs-whole-doc numbers match the shape I kept hitting from the paste side, and it is good to see it quantified even at n=14. I measured something similar on the tool end while consolidating a 9-server MCP setup: the schema block halved, but the bigger win turned out to be cache stability, because the prefix has to stay byte-identical across turns or every reply re-reads everything. One caveat worth adding to the chunk test: chunk count trades against chunk size, and past some point the per-chunk overhead and the lost cross-file references cost more than the shrink saves. Collapsing dirs by default sounds right. The tree only has to tell the model where it is. The file you are asking about is the part that needs to sit at the bottom.
Yes. Now we can put certain files at the bottom. If we want to add all Python files but put
main.pyat the end:Files to include:
**/*.pymain.pyIf you want to include all Python files, but put the ones in
srcat the end:Files to include:
**/*.pysrc/**/*.pyIf you want to put
main.pyat the end, andutils.pybeforemain.py:Files to include:
**/*.py utils.pymain.pyI added another feature today. If we click the "Apply Diffs" button, the extension reads the diffs from the clipboard and applies them to the files! No need to manually paste each file! Instructions on how to generate diffs are provided after the project structure.
Oh yeah! I didnt get that initially. Maybe I should add another tab inside the ReptClip panel where we can open and close directories just like we do on the left side of VS Code. Opened directories go into the project structure. It can be added cleanly without affecting the rest of the UI that much. Brilliant idea! 🙂
Oh, but then we won't be able to remove individual files in a folder. Maybe that's a problem?
Separating the target file to the very bottom is definitely worth doing — LLM attention degradation in the middle of long contexts is real. Putting the main file right above the prompt gives the highest accuracy.
For the UI: a prefix like
iworks, but a second text box (e.g. "Focus / Target File") or a simple "pin to bottom" button in the file tree is much more intuitive. People forget syntax prefixes quickly, but separate inputs are self-explanatory.For excluding single files from an expanded folder: simple checkboxes next to each file in the tree solve the selection problem cleanly.
As for the MCP server: check out my DEV.to profile bio or my pinned portfolio. Look for the MSCodeBase project — that's the custom MCP server I built to prevent AI hallucinations by using AST and call graphs to maintain structural codebase context. You can query it live through the portfolio interface or check the repository on my GitHub.
I fixed the alignment issues with the ASCII diagrams in your README.
PR: github.com/ManSio/mscodebase-intel...
AI still doesn't get it right?
Appreciate the PR! Merged.
You caught it right in the middle of an auto-update pass — I set my background agents to refresh the docs and drift tracking last night and hadn't reviewed the output yet.
ASCII grid alignment is such a classic LLM blind spot — models reason in tokens rather than character column widths, so vertical pipes always get butchered when an agent touches markdown.
Thanks for the clean fix, and good luck with the RepoClip updates!
Thank you so much! I've added your suggestions to TODO. I really do and don't want to add a third text box. It does make it simpler and not simpler at the same time. I have to figure out a clean solution.
@mansio I found the perfect solution! If we want to add all Python files but put
main.pyat the end:Files to include:
**/*.pymain.pyIf you want to include all Python files, but put the ones in
srcat the end:Files to include:
**/*.pysrc/**/*.pyIf you want to put
main.pyat the end, andutils.pybeforemain.py:Files to include:
**/*.pyutils.pymain.pyWhatever order you type in, that order is preserved!