Compare commits

...
8 Commits
Author SHA1 Message Date
rootiest 23d74690dc fix: remove watcher from base repo
The Rootiest fish-config will append the watcher automatically when it
adds the symlink.

On systems using this kitty config but not the accompanying fish config,
this will prevent any confusion on the feature.
2026-07-16 02:49:40 -04:00
rootiest 77fcd76f43 chore: fix section indicators 2026-07-16 02:47:28 -04:00
rootiest af9111c791 feat: implement fish-config logging utility 2026-07-16 02:38:47 -04:00
rootiest baf2dc7d0b fix: adjust initial window size to be a bit larger 2026-07-16 02:38:06 -04:00
rootiest 3e00a620d1 chore(gitignore): update ai agent ignore patterns 2026-06-17 21:10:30 -04:00
rootiest 3f7eab7761 refactor(logging): remove redundant home assignment in save_scrollback_safely 2026-06-10 21:38:19 -04:00
rootiest e271c6e486 feat(logging): check C5 sentinel before scrollback capture 2026-06-10 21:36:48 -04:00
rootiest 5970905c08 docs: update links
chore: update gitignore patterns
2026-05-31 00:18:54 -04:00
5 changed files with 275 additions and 101 deletions
View File
+267 -9
View File
@@ -2,14 +2,272 @@ kitty-dump.json
saved-session.conf saved-session.conf
/OLD /OLD
# AI Sessions # id: gi-patterns-e390e9c720b3dda36906a2b4cb76ffdd
.gemini_session # Created by https://www.toptal.com/developers/gitignore/api/python
.claude_session # Edit at https://www.toptal.com/developers/gitignore?templates=python
.remember/
# Personal testing/temporary files ### Python ###
[Tt][Mm][Pp]/ # Byte-compiled / optimized / DLL files
[Tt][Ee][Mm][Pp]/ __pycache__/
[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/ *.py[cod]
[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/ *$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/#use-with-ide
.pdm.toml
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
### Python Patch ###
# Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration
poetry.toml
# ruff
.ruff_cache/
# LSP config files
pyrightconfig.json
# End of https://www.toptal.com/developers/gitignore/api/python
# id: gitig-boilerplate-7f0528027e23f210196ae4583c408e5b
# ╭──────────────────────────────────────────────────────────╮
# │ GitIgnore Boilerplate Template │
# ╰──────────────────────────────────────────────────────────╯
#
# ──────────────────── OS-Generated Files ────────────────────
# automatic backup files created by some editors (e.g., Vim, Emacs)
*~
# temporary files created if a process still has a handle to a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# MacOS junk
.DS_Store
# Linux trash folder which might appear on any partition or disk
.Trash-*
# files created when an open file is removed but is still being accessed
.nfs*
# ─────────────────── Debug/Temporary/Testing ────────────────
# Matches OLD / .OLD
[Oo][Ll][Dd]/
.[Oo][Ll][Dd]/
# Matches DISABLE / .DISABLE
[Dd][Ii][Ss][Aa][Bb][Ll][Ee]/
.[Dd][Ii][Ss][Aa][Bb][Ll][Ee]/
# Matches DISABLED / .DISABLED
[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd]/
.[Dd][Ii][Ss][Aa][Bb][Ll][Ee][Dd]/
# Matches DEBUG / .DEBUG
[Dd][Ee][Bb][Uu][Gg]/ [Dd][Ee][Bb][Uu][Gg]/
.[Dd][Ee][Bb][Uu][Gg]/
# Matches TMP / .TMP
[Tt][Mm][Pp]/
.[Tt][Mm][Pp]/
# Matches TEMP / .TEMP
[Tt][Ee][Mm][Pp]/
.[Tt][Ee][Mm][Pp]/
# Matches TEMPORARY / .TEMPORARY
[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/
.[Tt][Ee][Mm][Pp][Oo][Rr][Aa][Rr][Yy]/
# Matches TESTING / .TESTING
[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/
.[Tt][Ee][Ss][Tt][Ii][Nn][Gg]/
# ─────────────────── AI Sessions and Rules ──────────────────
# Matches CLAUDE.md, .claud*, etc.
[Cc][Ll][Aa][Uu][Dd][Ee].[Mm][Dd]
.[Cc][Ll][Aa][Uu][Dd]*
# Matches GEMINI.md, .gemin*, etc.
[Gg][Ee][Mm][Ii][Nn][Ii].[Mm][Dd]
.[Gg][Ee][Mm][Ii][Nn]*
# Matches ANTIGRAVITY.md, .antigrav*, etc.
[Aa][nN][Tt][Ii][Gg][Rr][Aa][Vv][Ii][Tt][Yy].[Mm][Dd]
.[Aa][Nn][Tt][Ii][Gg][Rr][Aa][Vv]*
# Matches AGENTS.md, .remember, etc.
[Aa][Gg][Ee][Nn][Tt][Ss].[Mm][Dd]
.[Rr][Ee][Mm][Ee][Mm][Bb][Ee][Rr]
# ──────────────────────────────────────────────────────────────
# ──────────────── Added by agents-init ──────────────────
# agents-init --agents
AGENTS/
# ────────────────────────────────────────────────────────
# ──────────────── Added by agents-init ──────────────────
# agents-init --plugins
docs/superpowers
docs/plans
docs/specs
docs/devlogs
# ────────────────────────────────────────────────────────
### Generated dynamically when needed
/fish-config-watcher.py
+5 -5
View File
@@ -95,20 +95,20 @@ Terminal scrollback is automatically saved to `~/.terminal_history/` whenever a
## Companion Tools ## Companion Tools
[Rootiest Fish](https://github.com/rootiest/rootiest-fish) - [Rootiest Fish](https://git.rootiest.dev/rootiest/fish-config) -
Fish shell configuration that pairs well with this kitty configuration Fish shell configuration that pairs well with this kitty configuration
and the NeoVim configuration. and the NeoVim configuration.
[Rootiest Tmux](https://github.com/rootiest/rootiest-tmux) - [Rootiest Tmux](https://git.rootiest.dev/rootiest/tmux-config) -
A tmux configuration that is designed to work with this kitty config. A tmux configuration that is designed to work with this kitty config.
[Rootiest Neovim](https://github.com/rootiest/rootiest-nvim) - [Rootiest Neovim](https://git.rootiest.dev/rootiest/neovim-config) -
A NeoVim config built to work alongside this and the fish config. A NeoVim config built to work alongside this and the fish config.
[Rootiest Iosevka Font](https://github.com/rootiest/rootiest-iosevka) - [Rootiest Iosevka Font](https://git.rootiest.dev/rootiest/rootiest-iosevka) -
A custom Iosevka font that is designed by developers, for developers. A custom Iosevka font that is designed by developers, for developers.
[Nerd Fonts](https://github.com/ryanoasis/nerd-fonts/) - [Nerd Fonts](https://github.com/ryanoasis/nerd-fonts) -
A collection of fonts that include many icons and glyphs that are used in this configuration. A collection of fonts that include many icons and glyphs that are used in this configuration.
## Dotfiles ## Dotfiles
+3 -6
View File
@@ -11,14 +11,10 @@ notify_on_cmd_finish never
copy_on_select yes copy_on_select yes
# }}} # }}}
# {{{ Watcher
watcher watcher.py
# }}}
# {{{ Window # {{{ Window
remember_window_size no remember_window_size no
initial_window_width 150c initial_window_width 160c
initial_window_height 31c initial_window_height 36c
enabled_layouts splits enabled_layouts splits
# }}} # }}}
@@ -47,6 +43,7 @@ font_features IosevkaRootiestV2NF ss05 aplf clik wwid calt jspt mosc thnd vdaa=2
font_features IosevkaRootiestV2NF-ExtraBold ss05 aplf clik wwid calt jspt mosc thnd vdaa=2 vdac=1 vsac=3 vsaf=2 vsag=2 vsah=3 vsai=2 vsaj=3 vsak=1 vsal=6 vsam=6 vsan=6 vsao=4 vsaq=1 vsar=2 vsas=6 vsat=1 cv01=5 cv02=4 cv03=2 cv04=10 cv05=7 cv06=2 cv07=12 cv08=3 cv09=2 cv10=12 cv11=7 cv12=6 cv13=3 cv14=6 cv15=4 cv16=4 cv17=9 cv18=4 cv19=2 cv20=11 cv21=9 cv22=3 cv23=9 cv24=6 cv25=6 cv26=2 cv27=24 cv28=5 cv29=3 cv30=7 cv31=2 cv32=3 cv33=8 cv34=8 cv35=27 cv36=3 cv37=3 cv38=5 cv39=5 cv40=2 cv41=4 cv42=2 cv43=7 cv44=8 cv45=2 cv46=20 cv47=7 cv48=34 cv49=6 cv50=3 cv51=20 cv52=14 cv53=1 cv54=4 cv55=5 cv56=4 cv57=25 cv58=13 cv59=13 cv60=11 cv67=1 cv68=1 cv70=3 cv73=3 cv85=2 font_features IosevkaRootiestV2NF-ExtraBold ss05 aplf clik wwid calt jspt mosc thnd vdaa=2 vdac=1 vsac=3 vsaf=2 vsag=2 vsah=3 vsai=2 vsaj=3 vsak=1 vsal=6 vsam=6 vsan=6 vsao=4 vsaq=1 vsar=2 vsas=6 vsat=1 cv01=5 cv02=4 cv03=2 cv04=10 cv05=7 cv06=2 cv07=12 cv08=3 cv09=2 cv10=12 cv11=7 cv12=6 cv13=3 cv14=6 cv15=4 cv16=4 cv17=9 cv18=4 cv19=2 cv20=11 cv21=9 cv22=3 cv23=9 cv24=6 cv25=6 cv26=2 cv27=24 cv28=5 cv29=3 cv30=7 cv31=2 cv32=3 cv33=8 cv34=8 cv35=27 cv36=3 cv37=3 cv38=5 cv39=5 cv40=2 cv41=4 cv42=2 cv43=7 cv44=8 cv45=2 cv46=20 cv47=7 cv48=34 cv49=6 cv50=3 cv51=20 cv52=14 cv53=1 cv54=4 cv55=5 cv56=4 cv57=25 cv58=13 cv59=13 cv60=11 cv67=1 cv68=1 cv70=3 cv73=3 cv85=2
font_features IosevkaRootiestV2NF-Italic ss05 aplf clik wwid calt jspt mosc thnd vdaa=2 vdac=1 vsac=3 vsaf=2 vsag=2 vsah=3 vsai=2 vsaj=3 vsak=1 vsal=6 vsam=6 vsan=6 vsao=4 vsaq=1 vsar=2 vsas=6 vsat=1 cv01=5 cv02=4 cv03=2 cv04=10 cv05=7 cv06=2 cv07=12 cv08=3 cv09=2 cv10=12 cv11=7 cv12=6 cv13=3 cv14=6 cv15=4 cv16=4 cv17=9 cv18=4 cv19=2 cv20=11 cv21=9 cv22=3 cv23=9 cv24=6 cv25=6 cv26=2 cv27=24 cv28=5 cv29=3 cv30=7 cv31=2 cv32=3 cv33=8 cv34=8 cv35=27 cv36=3 cv37=3 cv38=5 cv39=5 cv40=2 cv41=4 cv42=2 cv43=7 cv44=8 cv45=2 cv46=20 cv47=7 cv48=34 cv49=6 cv50=3 cv51=20 cv52=14 cv53=1 cv54=4 cv55=5 cv56=4 cv57=25 cv58=13 cv59=13 cv60=11 cv67=1 cv68=1 cv70=3 cv73=3 cv85=2 font_features IosevkaRootiestV2NF-Italic ss05 aplf clik wwid calt jspt mosc thnd vdaa=2 vdac=1 vsac=3 vsaf=2 vsag=2 vsah=3 vsai=2 vsaj=3 vsak=1 vsal=6 vsam=6 vsan=6 vsao=4 vsaq=1 vsar=2 vsas=6 vsat=1 cv01=5 cv02=4 cv03=2 cv04=10 cv05=7 cv06=2 cv07=12 cv08=3 cv09=2 cv10=12 cv11=7 cv12=6 cv13=3 cv14=6 cv15=4 cv16=4 cv17=9 cv18=4 cv19=2 cv20=11 cv21=9 cv22=3 cv23=9 cv24=6 cv25=6 cv26=2 cv27=24 cv28=5 cv29=3 cv30=7 cv31=2 cv32=3 cv33=8 cv34=8 cv35=27 cv36=3 cv37=3 cv38=5 cv39=5 cv40=2 cv41=4 cv42=2 cv43=7 cv44=8 cv45=2 cv46=20 cv47=7 cv48=34 cv49=6 cv50=3 cv51=20 cv52=14 cv53=1 cv54=4 cv55=5 cv56=4 cv57=25 cv58=13 cv59=13 cv60=11 cv67=1 cv68=1 cv70=3 cv73=3 cv85=2
font_features IosevkaRootiestV2NF-ExtraBoldItalic ss05 aplf clik wwid calt jspt mosc thnd vdaa=2 vdac=1 vsac=3 vsaf=2 vsag=2 vsah=3 vsai=2 vsaj=3 vsak=1 vsal=6 vsam=6 vsan=6 vsao=4 vsaq=1 vsar=2 vsas=6 vsat=1 cv01=5 cv02=4 cv03=2 cv04=10 cv05=7 cv06=2 cv07=12 cv08=3 cv09=2 cv10=12 cv11=7 cv12=6 cv13=3 cv14=6 cv15=4 cv16=4 cv17=9 cv18=4 cv19=2 cv20=11 cv21=9 cv22=3 cv23=9 cv24=6 cv25=6 cv26=2 cv27=24 cv28=5 cv29=3 cv30=7 cv31=2 cv32=3 cv33=8 cv34=8 cv35=27 cv36=3 cv37=3 cv38=5 cv39=5 cv40=2 cv41=4 cv42=2 cv43=7 cv44=8 cv45=2 cv46=20 cv47=7 cv48=34 cv49=6 cv50=3 cv51=20 cv52=14 cv53=1 cv54=4 cv55=5 cv56=4 cv57=25 cv58=13 cv59=13 cv60=11 cv67=1 cv68=1 cv70=3 cv73=3 cv85=2 font_features IosevkaRootiestV2NF-ExtraBoldItalic ss05 aplf clik wwid calt jspt mosc thnd vdaa=2 vdac=1 vsac=3 vsaf=2 vsag=2 vsah=3 vsai=2 vsaj=3 vsak=1 vsal=6 vsam=6 vsan=6 vsao=4 vsaq=1 vsar=2 vsas=6 vsat=1 cv01=5 cv02=4 cv03=2 cv04=10 cv05=7 cv06=2 cv07=12 cv08=3 cv09=2 cv10=12 cv11=7 cv12=6 cv13=3 cv14=6 cv15=4 cv16=4 cv17=9 cv18=4 cv19=2 cv20=11 cv21=9 cv22=3 cv23=9 cv24=6 cv25=6 cv26=2 cv27=24 cv28=5 cv29=3 cv30=7 cv31=2 cv32=3 cv33=8 cv34=8 cv35=27 cv36=3 cv37=3 cv38=5 cv39=5 cv40=2 cv41=4 cv42=2 cv43=7 cv44=8 cv45=2 cv46=20 cv47=7 cv48=34 cv49=6 cv50=3 cv51=20 cv52=14 cv53=1 cv54=4 cv55=5 cv56=4 cv57=25 cv58=13 cv59=13 cv60=11 cv67=1 cv68=1 cv70=3 cv73=3 cv85=2
# }}}
# {{{ Tab Bar # {{{ Tab Bar
tab_bar_style powerline tab_bar_style powerline
-81
View File
@@ -1,81 +0,0 @@
#!/usr/bin/env python3
# Copyright (C) 2026 Rootiest
# SPDX-License-Identifier: AGPL-3.0-or-later
import datetime
import os
import re
from kitty.boss import Boss
from kitty.window import Window
_logged_windows: set[int] = set()
def save_scrollback_safely(window: Window) -> None:
if window.user_vars.get("logged_by_shell") == "true":
return
if window.id in _logged_windows:
return
home = os.path.expanduser("~")
snapshot_dir = os.environ.get(
"SCROLLBACK_HISTORY_DIR", os.path.join(home, ".terminal_history")
)
max_files_str = os.environ.get("SCROLLBACK_HISTORY_MAX_FILES", "100")
try:
max_files = int(max_files_str)
except ValueError:
max_files = 100
os.makedirs(snapshot_dir, exist_ok=True)
# Safety filter: prevent TUI capture if an editor is focused
try:
foreground_processes = window.child.foreground_processes
if foreground_processes:
cmdline = foreground_processes[-1].get("cmdline") or [""]
base_app = os.path.basename(cmdline[0])
if re.match(r"^(nvim|vim|vi|nano|emacs|tmux)$", base_app):
return
except Exception:
pass
text = window.as_text(as_ansi=True, add_history=True)
if not text.strip():
return
text_cleaned = re.sub(r"^\x1b\[38;2;[0-9;]*m", "", text)
timestamp = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = os.path.join(snapshot_dir, f"scrollback_{timestamp}.log")
try:
with open(filename, "w", encoding="utf-8") as f:
f.write(text_cleaned)
except IOError:
return
_logged_windows.add(window.id)
try:
files = sorted(
os.path.join(snapshot_dir, f)
for f in os.listdir(snapshot_dir)
if f.startswith("scrollback_") and f.endswith(".log")
)
for old in files[: max(0, len(files) - max_files)]:
os.remove(old)
except Exception:
pass
def on_close(boss: Boss, window: Window, data: dict) -> None:
save_scrollback_safely(window)
def on_quit(boss: Boss, window: Window, data: dict) -> None:
if not data.get("confirmed"):
return
for win in boss.all_windows:
save_scrollback_safely(win)