What's new
🗜️ Zip file support
Pass a .zip as an input path (CLI or GUI) and its contents are glued directly — no manual extraction needed. GitHub-style zips with a single top-level folder (e.g. repo-main/) are auto-unwrapped so the tree shows src/app.py, not repo-main/src/app.py. Includes zip-slip (path traversal) protection and a pre-extraction size guard that rejects oversized archives before they hit disk.
🛡️ OOM / freeze safety guards
Recursive glues (-r) on real-world projects can otherwise choke on node_modules/.git/dist/etc. and thrash the system to a freeze. CodeGluer now guards against this by default:
- Auto-skip common dependency/build folders (
node_modules,.git,.next,.nuxt,dist,build,__pycache__,.venv,venv,target,.cache,.pytest_cache,vendor,.turbo) during-r. Disable with--no-default-ignore. - 20MB default size cap on total glued content, aborting before the offending file is appended. Adjust with
--max-size <MB>, or--max-size 0to disable.
🏷️ Chip-based exclude UI
The old comma-separated exclude text field is gone. Exclude patterns now show as removable chips (tags) — type a pattern and press Enter, or click Browse… to pick files/folders visually. Includes theme-aware chip colors and a fix for the chip reflow bug where chips would silently not appear after the first add.
🖱️ Scoped Browse button
The Browse button now opens anchored inside your selected folder — it won't let you wander off and exclude something outside your selection. Rejects:
- Picks outside the selected directory or zip
- Absolute paths (
/etc/passwd) - Home paths (
~/secret.txt) ..traversals that escape the scope
Also includes a lighter _looks_heavy() heuristic that prevents the file picker from pointing directly at folders like node_modules (which would freeze GTK while thumbnailing).
🕐 Timestamp checkbox (GUI)
A new Timestamp checkbox next to the output filename. When checked, the default filename includes the current date and time in YYYYMMDD_HHMMSS format (e.g. Glued_Code_20260710_143022.md).
- The entry field updates live as you toggle the checkbox.
- Collision suffixing still applies: if
Glued_Code_20260710_143022.mdalready exists, you get..._1.md,..._2.md, etc. - Toggling won't overwrite a custom filename you've typed — it only updates the field if it still holds a default value.
- Switching format (Markdown ↔ Plain) respects the timestamp setting.
- The post-glue notification shows the actual filename that was written, not a recomputed one.
🛡️ Uninstall fixes
uninstall.sh previously left two files behind:
~/.local/bin/codegluer-gui— the GUI launcher itself~/.local/share/nautilus/scripts/CodeGluer— the current Nautilus right-click entry
Both are now correctly removed.
📚 README overhaul
- Added CLI examples for
--version,--toc,--stats,--estimate-tokens,--ai-prompt, and--tree-max-files. - New Known Limitations section covering mixed zip+non-zip inputs, naive zip unwrap, and the zip size guard's adversarial-zip-bomb caveat.
- Softened the "Why CodeGluer?" pitch:
pipxnow mentions thepip --userfallback, and "no config files" → "zero required configuration". - Added
screenshots/browse-scoped.pngshowing the scoped browse dialog.
Upgrade instructions
If you installed v1.0.0 via install.sh:
git pull
./install.shThat's it. install.sh reinstalls the Python package (picking up the new version) and refreshes the codegluer-gui binary and file-manager integration files. The version bump to 1.1.0 ensures pip/pipx actually pick up the new code instead of skipping with "already satisfied."
