Compare commits

..

1 commit

Author SHA1 Message Date
29580c89e5 wip 2021-01-18 17:29:01 -07:00
121 changed files with 1750 additions and 5558 deletions

View file

@ -1 +0,0 @@
home

2
.gitignore vendored
View file

@ -107,5 +107,3 @@ dmypy.json
.pyre/ .pyre/
# End of https://www.gitignore.io/api/python # End of https://www.gitignore.io/api/python
step.log

4
.gitmodules vendored Normal file
View file

@ -0,0 +1,4 @@
[submodule "dotbot"]
path = dotbot
url = https://github.com/anishathalye/dotbot
ignore = dirty

104
README.md
View file

@ -1,34 +1,92 @@
# dotfiles # dotfiles
## 1. set the fqdn:
```bash ```bash
sudo scutil --set HostName $MY_HOSTNAME.local $ git clone https://github.com/thermokarst/dotfiles.git ~/.dotfiles
sudo scutil --set LocalHostName $MY_HOSTNAME $ cd ~/.dotfiles
sudo scutil --set ComputerName $MY_HOSTNAME $ git remote rename origin thermokarst
dscacheutil -flushcache $ git clone https://github.com/chriskempson/base16-shell.git ~/.config/base16-shell
$ git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
$ ./install
$ sh <(curl -L https://nixos.org/nix/install) --darwin-use-unencrypted-nix-store-volume
$ source ~/.zshrc
$ nix-env -i \
coreutils \
elixir \
ffmpeg \
git \
heroku \
htop \
kakoune \
nodejs \
packer \
reattach-to-user-namespace \
silver-searcher \
sslmate \
tmux \
tree \
vim \
watch \
wget \
xz
$ base16_ashes
$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
$ vim +PlugInstall
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
$ sudo sh Miniconda3-latest-MacOSX-x86_64.sh -p /opt/miniconda3 -b
$ sudo conda update conda
$ wget https://raw.githubusercontent.com/qiime2/environment-files/master/latest/staging/qiime2-latest-py36-osx-conda.yml
$ conda env create -n q2dev --file qiime2-latest-py36-osx-conda.yml
$ git clone <some private repo> # this will bootstrap the macos keychain
$ python3 bin/bootstrap_git_repos.py
$ sudo rm ~/Desktop ~/Downloads
$ ln -s ~/desk ~/Desktop
$ ln -s ~/Desktop ~/Downloads
$ chflags hidden ~/Documents ~/Library ~/Movies ~/Music ~/Pictures ~/Public
$ chflags -h hidden ~/Desktop ~/Downloads
$ chflags nohidden desk
``` ```
## 2. reboot ## todos
## 3. install https://typeof.net/Iosevka/ - rework git bootstrap script
- add in neuron install
- cmus won't install
## 4. install `age` private key from password manager into `~/.key.txt` ## manual install/setup
## 5. bootstrap chezmoi: - anonymous pro
- docker
- firefox
- freedom
- iterm2
- postgres.app
- printer drivers
- rust
- slack
- ssh keys
- steermouse
- syncthing
- thunderbird
- virtualbox
- vscode
- wakatime key
- zoom
## optional vscode extensions
```bash ```bash
sh -c "$(curl -fsLS get.chezmoi.io)" -- \ $ code --install-extension AndrsDC.base16-themes
init \ $ code --install-extension ecmel.vscode-html-css
git://git.thermokar.st/thermokarst/dotfiles \ $ code --install-extension formulahendry.auto-close-tag
--apply \ $ code --install-extension hollowtree.vue-snippets
--guess-repo-url=false $ code --install-extension JakeBecker.elixir-ls
``` $ code --install-extension karigari.chat
$ code --install-extension lextudio.restructuredtext
## 6. restart shell $ code --install-extension ms-python.python
$ code --install-extension ms-vscode.Go
## 7. some "manual" stuff: $ code --install-extension ms-vsliveshare.vsliveshare
$ code --install-extension redhat.vscode-yaml
```bash $ code --install-extension vscodevim.vim
vdirsyncer discover my_cals $ code --install-extension wakatime.vscode-wakatime
``` ```

View file

@ -0,0 +1,54 @@
import json
import os
import subprocess
from qiime2_projects import PROJECTS as Q2_PROJECTS
from mds_projects import PROJECTS as MDS_PROJECTS
from personal_projects import PROJECTS as PERSONAL_PROJECTS
def fetch_projects(projects, base_fp, remotes):
for org, repos in projects.items():
base_fp = os.path.join('~', 'projects', base_fp)
base_fp = os.path.expanduser(base_fp)
for repo in repos:
print('repo: %s/%s' % (org, repo))
repo_fp = os.path.join(base_fp, repo)
repo_fp = os.path.expanduser(repo_fp)
if not os.path.isdir(repo_fp):
url = 'https://github.com/%s/%s' % (org, repo)
subprocess.run(['git', 'clone', url, repo_fp])
subprocess.run(['git', 'remote', 'rename', 'origin', org],
cwd=repo_fp)
for remote in remotes:
url = 'https://github.com/%s/%s' % (remote, repo)
try:
subprocess.run(['git', 'remote', 'add', remote, url],
cwd=repo_fp, check=True,
capture_output=True)
except subprocess.CalledProcessError as e:
msg = 'remote %s already exists' % (remote, )
if msg not in str(e.stderr):
raise
try:
subprocess.run(['git', 'fetch', remote],
cwd=repo_fp, check=True,
capture_output=True)
except subprocess.CalledProcessError as e:
if url not in str(e.stderr):
raise
else:
subprocess.run(['git', 'remote', 'remove', remote],
cwd=repo_fp)
if __name__ == '__main__':
remotes = ['thermokarst', 'ebolyen', 'gregcaporaso', 'ChrisKeefe',
'Oddant1', 'nbokulich', 'andrewsanchez', 'David-Rod']
fetch_projects(Q2_PROJECTS, 'qiime2', remotes)
fetch_projects(MDS_PROJECTS, 'mds', [])
fetch_projects(PERSONAL_PROJECTS, 'personal', [])

View file

@ -0,0 +1,57 @@
import json
import os
from qiime2_projects import PROJECTS as Q2_PROJECTS
from mds_projects import PROJECTS as MDS_PROJECTS
from personal_projects import PROJECTS as PERSONAL_PROJECTS
def render_vscode_workspace(projects, project_name, output_fp,
include_dotfiles=True, extra_dirs=None):
folders = []
for org, repos in projects.items():
for repo in repos:
fp = os.path.join('~', 'projects', project_name, repo)
fp = os.path.expanduser(fp)
folders.append({'name': repo.lower(),
'path': fp})
if include_dotfiles:
dotfile_fp = os.path.join(os.sep, 'Users', 'matthew', '.dotfiles')
folders.append({'name': 'dotfiles',
'path': dotfile_fp})
if extra_dirs is not None:
for name, path in extra_dirs.items():
fp = os.path.join('~', 'projects', project_name, path)
fp = os.path.expanduser(fp)
folders.append({'name': name,
'path': fp})
with open(output_fp, 'w') as fh:
json.dump({'folders': sorted(folders, key=lambda x: x['name'])},
fh, sort_keys=True, indent=4)
if __name__ == '__main__':
def qws(ws_number: int):
return render_vscode_workspace(
Q2_PROJECTS,
'qiime2',
os.path.join('vscode', 'qiime2-%d.code-workspace' % (ws_number, )),
extra_dirs={'data': 'data'},
)
[qws(i) for i in range(1, 4)]
render_vscode_workspace(
MDS_PROJECTS,
'mds',
os.path.join('vscode', 'mds.code-workspace'),
)
render_vscode_workspace(
PERSONAL_PROJECTS,
'personal',
os.path.join('vscode', 'personal.code-workspace'),
)

10
bin/mds_projects.py Normal file
View file

@ -0,0 +1,10 @@
PROJECTS = {
'thermokarst': [
'ccdb-api',
'ccdb-web',
'tucotuco',
'fathm',
'hibernators',
'hibernators-web',
],
}

5
bin/personal_projects.py Normal file
View file

@ -0,0 +1,5 @@
PROJECTS = {
'thermokarst': [
'elixir-class',
],
}

79
bin/qiime2_projects.py Normal file
View file

@ -0,0 +1,79 @@
PROJECTS = {
'qiime2': [
'Keemei',
'action-library-packaging',
'busywork',
'data302',
'dev-docs',
'discourse-unhandled-tagger',
'docs',
'environment-files',
'library',
'logos',
'paper2',
'q2-alignment',
'q2-composition',
'q2-cutadapt',
'q2-dada2',
'q2-deblur',
'q2-demux',
'q2-diversity',
'q2-diversity-lib',
'q2-emperor',
'q2-feature-classifier',
'q2-feature-table',
'q2-fragment-insertion',
'q2-gneiss',
'q2-longitudinal',
'q2-metadata',
'q2-mystery-stew',
'q2-phylogeny',
'q2-quality-control',
'q2-quality-filter',
'q2-sample-classifier',
'q2-shogun',
'q2-taxa',
'q2-types',
'q2-vsearch',
'q2cli',
'q2cwl',
'q2galaxy',
'q2studio',
'q2templates',
'q2view',
'qiime2',
'qiime2.github.io',
'static-site-infrastructure',
'template-repo',
'view.qiime2.org',
'vm-playbooks',
'workshop-playbooks',
'workshops.qiime2.org',
],
'caporaso-lab': [
'caporaso-lab.github.io',
'pretrained-feature-classifiers',
'q2-phylogenomics',
'genome-sampler',
],
'gregcaporaso': [
'caporaso-lab-secrets',
'qiime2-meta-figures',
],
'biocore': [
'scikit-bio',
'deblur',
],
'thermokarst': [
'q2-no-op',
'busywork2_action_playground',
],
'bioconda': [
'bioconda-recipes',
]
}

View file

@ -1,66 +0,0 @@
# personal
[[workspace]]
path = "$HOME/projects/personal"
ssh_key_path = "$HOME/.ssh/id_ecdsa"
origin.base_addr = "ssh://git@git.thermokar.st/thermokarst"
origin.name = "pingo"
repos = [
"copilot-proxy",
"devlog",
"dsort",
"gitolite-admin",
"gpx-web-utils",
"gwar",
"leaving-hope",
"llm-copilot",
"markdone",
"mini-lsm",
"pingo",
"talent-plan",
"trmnl-report",
]
remotes = []
# personal-dokku
[[workspace]]
path = "$HOME/projects/personal"
ssh_key_path = "$HOME/.ssh/id_ecdsa"
origin.base_addr = "ssh://git@git.thermokar.st/thermokarst"
origin.name = "pingo"
repos = [
"akdillon",
"planner",
# dokku app name is thermokarst, not thermokar.st
"thermokar.st",
"zettel",
]
remotes = [{ name = "dokku", base_addr = "ssh://dokku@pingo.thermokar.st" }]
# mds
[[workspace]]
path = "$HOME/projects/mds"
ssh_key_path = "$HOME/.ssh/id_ecdsa"
origin.base_addr = "ssh://git@git.thermokar.st/thermokarst"
origin.name = "pingo"
repos = [
"arctic_hibernators_schema",
"bactdb",
"bactdb_data",
"ccdb-api",
"ccdb-old",
"ccdb-web",
"drf_ember_pagination",
"hibernators",
"hibernators-web",
"hymenobacterdotinfo",
]
remotes = []
# github-thermokarst-personal
[[workspace]]
path = "$HOME/projects/personal"
ssh_key_path = "$HOME/.ssh/id_ecdsa"
origin.base_addr = "ssh://git@github.com/thermokarst"
origin.name = "thermokarst"
repos = ["thermokarst"]
remotes = []

1
dotbot Submodule

@ -0,0 +1 @@
Subproject commit 5d83f9e797b1950199e127a8196803f5e33e0916

View file

@ -1,18 +1,9 @@
[user] [user]
name = {{ .name }} name = Matthew Dillon
{{- if eq .hosttype "work" }} email = matthewrdillon@gmail.com
email = {{ .email_work }}
{{- else }}
email = {{ .email_personal }}
{{- end }}
[core] [core]
editor = hx editor = vim
excludesFiles = ~/.config/git/ignore excludesfile = /Users/matthew/.gitignore_global
{{ if eq .hosttype "work" }}
sshCommand = "ssh -i ~/.ssh/id_rsa_work"
{{ end }}
[diff]
colorMoved = default
[color] [color]
diff = auto diff = auto
status = auto status = auto
@ -23,9 +14,12 @@
auto = 1 auto = 1
[merge] [merge]
summary = true summary = true
tool = vimdiff
conflictstyle = diff3 conflictstyle = diff3
prompt = false prompt = false
[alias] [alias]
unstage = reset HEAD
uncommit = reset --soft HEAD^
# http://stackoverflow.com/a/9074343 # http://stackoverflow.com/a/9074343
lg1 = log \ lg1 = log \
--graph \ --graph \
@ -44,29 +38,19 @@
a = add a = add
c = commit --verbose c = commit --verbose
ca = commit -a --verbose ca = commit -a --verbose
m = commit --amend --verbose
d = diff d = diff
dc = diff --cached
s = status -s s = status -s
sw = switch co = checkout
swc = switch -c cob = checkout -b
# list branches sorted by last modified # list branches sorted by last modified
b = "!git for-each-ref --sort='-authordate' --format='%(authordate)%09%(objectname:short)%09%(refname)' refs/heads | sed -e 's-refs/heads/--'" b = "!git for-each-ref --sort='-authordate' --format='%(authordate)%09%(objectname:short)%09%(refname)' refs/heads | sed -e 's-refs/heads/--'"
# list aliases # list aliases
la = "!git config -l | grep alias | cut -c 7-" la = "!git config -l | grep alias | cut -c 7-"
[push]
default = upstream
[credential]
helper = osxkeychain
[pull] [pull]
rebase = true rebase = true
[init]
defaultBranch = main
{{ if eq .hosttype "work" -}}
[includeIf "gitdir:~/projects/personal/"]
path = ~/.gitconfig-personal-override
[includeIf "gitdir:~/.local/share/chezmoi/"]
path = ~/.gitconfig-personal-override
[includeIf "gitdir:~/.local/share/tree-sitter-prr/"]
path = ~/.gitconfig-personal-override
[includeIf "gitdir:~/notebook/"]
path = ~/.gitconfig-personal-override
{{- end }}

4
git/gitignore_global Normal file
View file

@ -0,0 +1,4 @@
*~
.DS_Store
.idea
.vscode

View file

@ -1,26 +0,0 @@
{{- $hostname := .chezmoi.hostname -}}
{{- if eq .chezmoi.os "darwin" -}}
{{- $hostname := output "scutil" "--get" "ComputerName" | trim -}}
{{- end -}}
{{- $choices := list "personal" "work" -}}
{{- $hosttype := promptChoiceOnce . "hosttype" "What type of host are you on" $choices -}}
{{ $name := promptString "name" -}}
{{ $email_personal := promptString "email_personal" -}}
{{ $email_work := promptString "email_work" -}}
{{ $github_personal := promptString "github_personal" -}}
{{ $github_work := promptString "github_work" -}}
encryption = "age"
[age]
identity = "~/.key.txt"
recipient = "age1yd87u4ae86erpem2tynyl959ppc8a3jt4ztssykytzaklut6uvus5prt2t"
[data]
hostname = {{ $hostname | quote }}
hosttype = {{ $hosttype | quote }}
name = {{ $name | quote }}
email_personal = {{ $email_personal | quote }}
email_work = {{ $email_work | quote }}
github_personal = {{ $github_personal | quote }}
github_work = {{ $github_work | quote }}

View file

@ -1,4 +0,0 @@
[".local/share/tree-sitter-prr"]
type = "git-repo"
url = "ssh://git@git.thermokar.st/thermokarst/tree-sitter-prr.git"
refreshPeriod = "168h"

View file

@ -1,10 +0,0 @@
{{- if eq .hosttype "work" }}
.zshprivate
{{- end }}
{{- if eq .hosttype "personal" }}
.apprc
.s2a_login
.work_packages
.work_paths
.zshwork
{{- end }}

View file

@ -1,96 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBJVGExVmpSUzJwYjNiU0Fy
RTU3eUE1TXFHdlovMGs1Tmg5ZFgxZDh0M1E0CjV0NnVXQXJ1aHVTaG1CQUlxWkxG
c3cwa3VpMHNPOVJTWmpUNlRQbXJGKzQKLS0tIDRtazR5QjBmM2IrbEFZaTB4VlFy
MStHc2c0azFwVmVXNkFoSUJ0QUdXYWMKg+edrwx7oCNcMlJWJ0kbYUFVXO9IzzXU
xVa2EnXYscPyLgikrkVH61mOZZlnikIjzRdrKvebyszm71novi9wvbjVXf6sz7pf
QfKiEeZxSiWn8O1HZWHyrIgZW8QLS3nhvqr9rD2VFI9Yn6cGuxtzCEAouShytRlY
MNieznSyyc6nqKzQgCv2+prY0+NqjAvybkMavLLaQhcpaUkEcGGhM1fYWP4A4UiC
AFTAvURFhNq/m2GCLnkwpWpesIQJEDF1cKkNX/tqc7wCgEAeLPLHYKuRPIexSnt0
vCNKX79b9PHVtKhVCkM5sw7gFKKkhyizNPkyq4JzcOK5itoLfkLu1fo2JryOH8gA
bYFEU5/2cqN4e+JlMZEVXszbl97iT4JkGN1K9FxpDuDYaz8PGK/s6vk2E5GQYCsO
/CAnIAywUACboTQ95+b7UJhbM1Fgu8Ug6ANqBYDt4eDleslFwNyUgjuncPCGNL+r
pxbLJblC7k2jctQQSYCdIhuYi5NtdCxeN2L+qrfRab3Pv3vJrbofA6mLEgpc3soc
jBmXgw7ieI/GmFZFp78kmHmvRIlRSp7IGY0rxjOOq1IftzYOAEgk7ZcvbWFwZgLp
FsGRkNTIw4/MHo8vQZ4oV70wNWyPTsQ/DDOUpsDeeBsIwnmft5+Sd3XMfLvQarJN
8nnPIOxqwluqhozXr3ZIloOQrVXLQqzkCFhDdYdjkzhWAPxfX8pCsIYvO4D6I/Lu
JNLqLQBVEZnopoWD1Km1r2VQ6HXrrvltcWb90Wz2yT/OJkmsmCrDuEEayoxwMvHj
v5NRMxfUktayPqYfycM+QAMgiZj3yt3LRwKgDZHHRDCI2paX5CXj/qXVdK6eslsk
hlG4D5rnzzu5G5G1vyZGTMDZrtl7JED+QAhnePfEjqTARmBw0ho3FSpU5hIVnCfv
hbWhZMmiO/NVWdXGckovctSvE+XGfU7p4GyC3kbpq57B+zp8PFZDligifzuvOC0M
Rj1dGLcw5NBgElAZGTBcvNMVu6uPgyQMTo45Z7zJn5rvZ1KTXLg7hy/4NGAsVOx8
1fTW2FhU3jfirt42wJXMUtNk6rFHXIFvOILdo/7Jz9M8ucraA47LcoJJaPyroo+4
UheBMcY8jWggVxEEKGBBn6QtWw2SIwxU50rSTH0BMJBxtkoVQ6LkNRqyRI9J6Fq7
L9aO78igIQoUWulm6itmXVTvdXaP5jhy7aAHBB16zXhPkVhMHbTrEgRAM3b2wTIk
B9ORb7VXnp6uUlmHmB5BjkEYCDAT0n8TOJECNHKcIKlmKqV0ygf2DSzkwH6rtO9V
9Ye80Clz79gHL4/6cUfjxgbeXoknN2qpADxET5CW3ItjTDg5mOGd9pAtvXvNKNuv
eUL3VLbOH4A9TpUoDg1ofgR+j+OjuV9TIpEhpdyJ5yM0C0z+SNHGx6g6rBzscKY7
4kr9e3nYfCitshrqHBMvQ6UErqmGtnB/Dk7V5dK3CuHspuqgwVqvicjirkaVlDK8
SY9xDM2MGAh5GQEUOrE92Jwq1XKP7+nM7MEWmPAwhl2GdS4PitCONCAS6waSq8h2
5T0ZdtPa1OpbMh3zeyAnmA/LszNjOcsn/SR/rKFu2FyFWA3Fu/uwhyROoJqvjxLe
VDkJItRwEqUYD8IPIFGT4GEI49yOLMbMv7IbNlwBZ9nkvtP/wmkA1QDzU137Ff6R
z1KdNTHKDtIzJgzEocuw1lJ8Rte18wQ00HSuXiCzE5xYwAdHkqpgRRrGHHioCuxw
bbBTzuf9QRzoKSHz8N3OzmjnorfAHT9bC7CUNr2m9/dsUYpjGlzAyW/Q5DaZCxj/
vY3cSE0LLtDsW65QGhFA+U+iO45F7z7Obzf0wfVNHZNQ3bCvyi2NmHF5N8FCoWTF
4cPI1gfAg4qSMRseiQQzuZ1y+vnSa2Hy7LbqipLOwXaONzH3Hk+tCfxKyQKPcqKR
Ex5yFXajOWvp04iRXKGLBXKHX2kXySq6rLnK6JBJ9SaNrCgmTGV8kQlE7RArYbgs
uokzyzdDV2wH/hawW9eW1lilHo8/y2kWWAWSgRg8GHtXCA5xr37OCBoIzbfPQq48
hbUfnbUkVnSlWKc0mh1IZMpme4r7Wo1ZOWmoZGvHf1TFG+ocs/r/GP0UeekLLtS5
V8Tr43GE/Ab39mcjGalVW+5Z33+IX5b/80MbysfpgOhO3ns3zUsQuKaX6NfaIhsB
9MWRRRqArp7MNqqRphHix1bZENZoxOnMRTAMV8WMDMHFk6ZiiNtVs5c2FBCEbaI0
qDCMNNjpXXWjBy368/mCIPAg5KJk661JBJM/ga4nR3TGz+c6tDr93B0LbATJM7sS
ATw827xPkzyIlLY+msuo95zFflpO7zU2V4gH0T4fhi0jC7SicV2itIauGPNpf60V
Z5xsUlDgWs5AfhZBaoLVugHRzZ+w3F/azyroCzfFgT4ekUa7OyCEJ9DaqpBR/0bA
aWFi7MLDo+SW74yp0FNDJOtqujNLAZXKTW9sKBmz4vBIb0q8dN5l3CqElZzaWZuC
BCxr2PTHcdlix2NbOK7QfzJCmEU5+e3sabEZFrJBTxBxRjoSSf4e8L4zPA0WhKq1
O44pa7sJt43Plwx//Nv9RRWQu9jdlH92GqrSOGrMJ1EFlMWUDq4EUw3t5fH4+kwr
P6MBInKMq/jBvUjQ9YiTAOEl8SZcbysvRkif/EYAPI+8HQmhFbX++NdiJDpvGzmj
jBBVpvXtzboG6v1n6zLCAVdNmcw8yHtRy1svR1/dqeY/oZlFocynlzGWQnOU/Z/Z
3vwCbs66eXldwDaFNOhEyPC3Nwoe1NjbW0Q6CDCD6hHWxt09wWWXqwnOXa5hmm8g
xUT0Jylm141CES6MVUlrsjEqGkdfIxoP0fXGtBlUYqr0zu/8OgRSCLL8gl9PZByN
mYfih0Oh5Z3aP/p7HG6cMpLVLg11k/pdzuL8Z1QeN7EFUeVlmWwbruM0FM88umpy
MW97rEPCHbm41xuueS2mlOqPlxEgR7XazpsoZhHCII44xkGCd69rUEiUvaNXzmRi
m/JV+BJlJLN8BRotgrBebHwyDGqU/P0qy++44BmCQidFKe1uz61nZskqr+QvJfoT
HstpfQS41xlkXuPUqOSCyNLAJz37KYMoVZHnA3+RQoMjnlG73aCWUtNn85nQAi88
qVrnOD+k6THZ4cXOjcz8NAKrdVlkV7W8yb9QwdeXTHKXrUvYGcPLOyiMzzErqqWs
3aNG8ba0ZSkm+zsk4daLepFhtJw+NvupZRHlVKbqPfxY/PP8ZzWJD5hfXRVwlz+h
hDPZVXCknjwtkM7R2Sf57YtfhwV1dRCc84ldlRvYtZJyobkvMeNg25rqO/DSC8e7
In607Up6EwG1hAOFHXQb8qPx/4ZtFMcb7PEOX0cNW5BnzsnRKwDSy8oY9tKs0dYV
OUaTwS5m2yHIFaQkKjzYa31cZPWbuy6iZ5mw+J+iNP0Fo10W0dowPODmfK6PVqs6
cSScxsTx/CQ1viXfY8jZIYw3X1tPToZZY6eowePm5nCfsN/79rcwvka2r9dWlYFg
iBKuta2HuxPD0QzkvVnaMxcNeXxTrmtkICRoC46yVddYJZnjFcVxF8v3VCQIzYwy
Vwth6zw+JVcWCXMKHqgMq5vgyxKi3QVGT59P0wrdjvk7dyxmRvqDFltoedSv6qM/
uNlx2iS6QNLCMOItWm/28Cpla3QSgqNzabsSgUDaIDVBcZKi63AgYbQzsX059ra/
TwIlxKwsVv6TDk7yGERQeGa2jHL8nAhtQCXFcaKF4BVq9GXCTsRyTyH6OcyKJQym
BnlOjdppN8WXnacNHVDc2XkD81FAjvJA5rtp6z4YE2E8UgNdhhTYDShjCJaLK5iU
zEAFpWpcy+4HJTOFvFOEDAiA9xIbgJfUtDLBXllbOK+BUujvRVS/H9376bUO3O4C
S4CNCMoEuWu11ERBKlymCXyDxmE0W1AMHphSS479rxUfxIjReayou+yP524QrAPP
mf1AuJx2ADxkeMqdPAb1DfoPnpgnA0xvxAPRtydACVVlBWvxjjuTbWen55k7SRfY
jODGz+9DE/sgNerGhmjL+6IvjrD6K1p//7f9rXRGr8v7Tf7YtORrfbn5kL/ejqZm
rXYwElKkJTlrWsF92xIwoez3E3Fizup9Fx66KUlqU7WiltsWruQPIP7k/mHwE5xS
ijFwZ4BBjDPrA/cseMhpQDxSJSIGDZ8m/WMTszJecIcttS+8K190H1Ie38rhnjqW
6Uk2ayTECdqxY77xadEiRL6oOPKu/tMXVkZ3V+KaSvc6mGN77ZICNF0xwNhGVsK2
n6AHLSD9pvpgD1IYe5sEDdce1sB7J4gdO1lsI6Cdgo/fUlCzPuvxOW/GGsZZajjJ
R25bXjIOQYFdZogzGgK/xFDKPQwO87bWNyNSv5ieX3ecqsk6eZnN3YJCzsjVJi3L
Gw5v5kRo2yxrELqfs66wSe0/1icVq3FdlDAGfmyQjB4OLq6TRl0el7AkKgSOsjTu
yak+noYwt2vIF7v7kCW+8Z8UXbjqXqFGKaAgfU4r9SyfIuEvgHQmd2YfCezCsuGq
SKSIkbkZRcj3pavmmzmt+nJy1Xvw36+CSHFFxdkzgg6gGzmHUbi6svr4U+BrAb5f
aLomMpeRgqJMOQPbEVkj9nipVKoUYYSCZK02jmh5WOpb37cjCkKFCRRoG0nMqYVh
EWbXzzW3dpEO3gCMbIHHVb01mmUrtIyZYUy6B2aEF1lY8+Zd3Mdw24QygIQEmdNg
BSAQmxOwYh3CEsQOSnQrt/WaGoz7TWQwIgXc7gykHj2lZOjfoLwguRV6R35MvS9i
3l8CH7NK6/twj7CELHNovrk2FUiKWPz2/telb6WMn5SUV0OSbkzWO8PRZ4NoUEuY
DFaV49V7dfHEGk5AJtKAm1JZ2vdgH1EC6xSQvy8RsntydOc6h2BguVxqQsNdQu5k
kTqyTcb071eMIO0e6DEUy4A2od5LSxe0lQ8+LFRXLUFey3AzOv8i9NLUmpyxLeoZ
4f2m2l9nirJi/bvLCh+Lx5CdkclHD/Bl+/sjNO4mVPq7Uu8ab+U/0QdTz8M3JOos
cXGY0LlEmSn9D1OkE4jf2R4JjoH3qYD4oGWP011gMaEDaG0I32iUYNk8VUUfC9JP
aSKpGPtmoelGAhgK8A88kxyIlU9+6Xr/1B/xy2SB+/6WZ+9xuvfX1XaFEFDh4N5l
p/ZE0LvDDXUQbrsbBfWEdK0GUI+S6T8Yaz0DPAI1AhezTDDlfQQ0vpNk+SsuRGaF
vBR5PkpXU+q+4rOwVsEsiHotT7iBMIH+Opy6qM3+9bVlFiCrel+aVarxId4n7acb
IZoFCjEKkUFo33OC1W+qvfQv/qgEE8LXJzCPaM4bW4Og0XlJ3T2xjQtRYgWSxrcU
Qdm214NAAoN9yAck3mpM+zmMfuTPZNl+pY7f9dtzSq7BnLBCTKUg7Ct3vv7STr0C
RPLACIZeWY9v8giLLmg5qYOZYBWy+pC9R8/2Em3ibQwk3/Fn5Bo1Vixytg/fO4Nh
qj8brCWzVyUdP2J9uuktLIBnDuFiD3AGAl3QJjuxtktqQjmPY/c2ZtAJyNpLWHWF
qxTLUcFfSeOsdqlo+9a9lVGJMiSI4hWXwT6j98tLXWZa8itYCSaaaEgddiGE2zRT
bqILw6m8qvGq6BwpT8lrSFN519+PD58gseAPHy1FITUCbotvTlVLQLF1n0Cj7c/r
rZ4=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,36 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4S0ZWL3BLcHpuNU1NNE5Y
NXcyRENhTTFPcGViMmQ4REdqOTFBdzZtVG5FCmxZMmNOS053OVlwMHZzc01JNUti
ajhEVkNsRk9HdHNhM0pHMk1GakMrN2cKLS0tIEFnd000T1E3ZjUwNnlTWklpbTJS
bmk2OUQ2MWVOdjk0czZIMEVseWxQODQKwA1fsDNDnMDMngERYOHFRRZ38DEgtNvG
PdnXl/z47zdjOhOxQRiQ4UYOTEiQTm1ALTXZJA2IFxT/h0zvs6tQk4yor6lQ1h7x
SpqGSYXAZkLGFqTzvFS/fos3DIBtt4wPTxpdAjU6zA6L9h8YAXxVh8aiIufHmvGv
t4f0BJ7l3+PuttHJt4Y1kzQLFYASO3rKxqCHY5grjE7KUg7PH5VjJxfdcO6dTztr
ZTThBkI+YArAJSjt22D0oIlcQJVGdaymuwjnTZ+AyGS2fZqne/4TtEjcvhj1ZRLi
gxRy2Wzxv5QtH34hINJetq1g5CCjd9mj0R+RhISCt7h6/FwbTHLfncpntL1qUZJZ
7rndhJ73nCKbk9viH8i4RN78jy6cnQ+bPin6j4Qnavr9umObKdL2PX8fnicb8JBN
pfoTXerp40b7Nk4ZjgcKgDR6USDU1ugTxb2WerSDCX/p9+fmydOr1btdnb6HwfFQ
bV8pzww4CbMCk0Bld80GiFGgkoy99PWLsLPQXweLcf21PJNoQkcoYRY/wzoSMfVt
uRzEISv5TWGvywQ0uRX5JG8sT/V+nuZBi3xlP/uRzrgAsYBn9nyKVSJk1VX0ZYze
ju1n7rJK5qbDl96y8qJTJpdnQMXmBHbhY2FtymkbJrKtD6+Htzctc45xjC3UUesP
ntCh1PNkFaayQFtZ+Fs/hSjueQp/WbMWOTPsjqE1ySQInc4zWDEbUscLV8xBgQMh
MmX5DaIgVgWVCfCzPsZEwpWy6mgZkVCkfOJdMSwg9YwVlS1L5wzBHh1xa+mthjTA
uxoZKvexsSPNrn2xSGhxaJE9yijciTT/tAJgo1Tqo1LrZ7fKj2AijHKF57FfuKHO
p4f004dBBkm7iTnpLuuEZiAT4VErKAbxSWprePIynH2e4YqUiyY3bk7ddDbYnaUC
fu9jg2rGDsKknp3L9uSeO9ygGBuwDt3JFMGN7SZK3qf/Zf9hfd5SYumHSd3vIbs+
/VWnIOPKn8DT2fTNnGswL1iTIrfLTV6Caq0McSkfAWplHqFvmW6dSzkpk2YpnBkh
jLg0ulW65agCecYQ0cI23i41c+PDuw0Mbt8tUc6Rd/JV4I2sBan509rxdBLJUxE+
AvRyxeVGxP8b3Nc+vRdkciy9zySxUSnRgG1BJxrQhLYPkyIzGHYY/pcOhBluhopz
Fe08akTRXHBR+gSqoOyi2mQGIznob3ijPKjAjr85Tj1Ir7PsfIRUqJys1gvo2XrD
EQGZ3ejwwtELqZDMqEb5NufvDJ0aRabvSar8vb9u2eSw9ooTQ5uW+RKJrc7vZy1e
0zngiRsKjxwc9TTXMnvNVXI1Y3kPBFoOqll2Cjxwxo8tbAuKvgZx7//qoMXWifFf
bXAVAhRIjGW7x2lB2/MIJ6hrWSqjn5Z1eRV/5VFtwhp7nyrPx94tlpBJ9DJURm9a
MHPzeho1pX9Xbf7pC6XM+kVk+PzUffHrp3O7ik8xjslJ1G9A+ZaUo/smabtaPSqU
Aoc4seR0HL6iaswEMPVKvHDB68NJtXa6cD5bQaRD37iXpyEj13UpzrfA2EokwykS
y6CmORSAlCisLf+xH2juA1II/yVmnqldLXO0u0B7RDPuzEM52qpWvZHR2w6rWMbC
NyTz7UtVT8JjaqwAGi7jp+HX3OHlAVes7+7n4Z4PH3D0fojsFJrWJTU+KY4jmwMM
iwsoY/A1DQbVzqeuSK04Hn6j1PtwCSElJc6MkVjcEIAxSr2dnnPqKxHdUuQFM7jf
Is6ss3lDqEGSBAjAaLUD+UYq68JGpEHnJcueSEPa3gXrchpNI43TOVHJLgFgHoJJ
zpf02tYUx5TKpSKU6Utg8PEHZViDlW7aQRNpX8zBgAlySkQa1ZyX070gl6t2TceJ
oTJXFFO8s+7AjMknDc6e1T7sVUxaf+FsJz1EjTY=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,17 +0,0 @@
#!/usr/bin/env bash
file=~/notebook/todo.xit
if [[ ! -f "$file" ]]; then
echo "$file is missing"
exit 0
fi
content=$(sed -n '/^Inbox$/,$ p' "$file" | tail -n +2)
if [[ -z "${content// }" ]]; then
echo "Inbox is empty"
else
echo "$content"
fi

View file

@ -1,309 +0,0 @@
#!/usr/bin/env bash
#
# jj-split-by-owner - Split a jj revision into multiple revisions by CODEOWNERS
#
# Usage: jj-split-by-owner <revision> <description_template>
#
# The description_template should contain %s where you want the team name inserted.
# Example: "feat: update %s components"
# -> "feat: update @frontend-team components"
# -> "feat: update @backend-team components"
#
# Example: "[%s] refactor authentication"
# -> "[@security-team] refactor authentication"
#
set -euo pipefail
usage() {
cat <<EOF
Usage: $(basename "$0") <revision> <description_template>
Split a jj revision into multiple revisions based on CODEOWNERS.
Arguments:
revision The jj revision to split (e.g., @, @-, abc123)
description_template A printf-style template with %s for the team name
Example: "feat: update %s components"
The script will:
1. Find all changed files in the revision
2. Match each file to its owner from CODEOWNERS
3. Create separate revisions for each unique owner
4. Each revision gets the template with the owner name substituted
EOF
exit 1
}
# Check arguments
if [[ $# -lt 2 ]]; then
usage
fi
REVISION="$1"
TEMPLATE="$2"
# Create temp directory for all working files
TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT
# Find CODEOWNERS file (check common locations)
find_codeowners() {
local locations=(
"CODEOWNERS"
".github/CODEOWNERS"
"docs/CODEOWNERS"
".gitlab/CODEOWNERS"
)
for loc in "${locations[@]}"; do
if [[ -f "$loc" ]]; then
echo "$loc"
return 0
fi
done
echo "Error: CODEOWNERS file not found" >&2
exit 1
}
CODEOWNERS_FILE=$(find_codeowners)
echo "Using CODEOWNERS: $CODEOWNERS_FILE"
# Get list of changed files in the revision
get_changed_files() {
jj diff -r "$REVISION" --summary | awk '{print $2}'
}
# Parse CODEOWNERS and convert patterns to regex in a single awk pass
# Output format: regex<TAB>owner (one per line, in order)
parse_and_convert_codeowners() {
awk '
# Skip empty lines and comments
/^[[:space:]]*$/ { next }
/^[[:space:]]*#/ { next }
{
pattern = $1
owner = $2
# Skip if no pattern or no owner
if (pattern == "" || owner == "") next
# Convert pattern to regex
regex = pattern
# Escape special regex chars (except *)
gsub(/\./, "\\.", regex)
gsub(/\?/, "\\?", regex)
gsub(/\+/, "\\+", regex)
gsub(/\[/, "\\[", regex)
gsub(/\]/, "\\]", regex)
gsub(/\^/, "\\^", regex)
gsub(/\$/, "\\$", regex)
# Handle ** first (match any path including /)
gsub(/\*\*/, ".*", regex)
# Handle * (match anything except /) - but not the .* we just created
# We need to be careful here: .* should stay, but lone * becomes [^/]*
# Split and rejoin to handle this
result = ""
n = split(regex, parts, /\.\*/)
for (i = 1; i <= n; i++) {
gsub(/\*/, "[^/]*", parts[i])
if (i > 1) result = result ".*"
result = result parts[i]
}
regex = result
# Handle leading / (anchor to start)
if (substr(regex, 1, 1) == "/") {
regex = "^" substr(regex, 2)
} else {
# Pattern can match anywhere in path
regex = "(^|/)" regex
}
# Handle trailing / (directory - match anything inside)
if (substr(regex, length(regex), 1) == "/") {
regex = regex ".*"
}
# Anchor to end unless it ends with .*
if (substr(regex, length(regex)-1, 2) != ".*") {
regex = regex "$"
}
print regex "\t" owner
}
' "$CODEOWNERS_FILE"
}
# Main logic
echo "Analyzing revision: $REVISION"
echo ""
# Get changed files
get_changed_files > "$TMPDIR/files.txt"
FILE_COUNT=$(wc -l < "$TMPDIR/files.txt" | tr -d ' ')
if [[ "$FILE_COUNT" -eq 0 ]]; then
echo "No changed files in revision $REVISION"
exit 0
fi
echo "Found $FILE_COUNT changed file(s)"
# Parse CODEOWNERS and convert to regex in one pass
echo "Parsing CODEOWNERS..."
parse_and_convert_codeowners > "$TMPDIR/codeowners_regex.txt"
line_num=$(wc -l < "$TMPDIR/codeowners_regex.txt" | tr -d ' ')
echo "Loaded $line_num CODEOWNERS rules"
echo ""
# Now match each file to its owner
# CODEOWNERS semantics: later rules override earlier ones
echo "Matching files to owners..."
# Process all files at once with awk for speed
awk -F'\t' '
BEGIN {
# Read all patterns and their owners
while ((getline line < "'"$TMPDIR/codeowners_regex.txt"'") > 0) {
n = split(line, parts, "\t")
if (n >= 2) {
pattern_count++
patterns[pattern_count] = parts[1] # regex
owners[pattern_count] = parts[2] # owner
}
}
close("'"$TMPDIR/codeowners_regex.txt"'")
}
{
file = $0
matched_owner = "UNOWNED"
# Check each pattern (later ones override)
for (i = 1; i <= pattern_count; i++) {
if (match(file, patterns[i])) {
matched_owner = owners[i]
}
}
print file "\t" matched_owner
}
' "$TMPDIR/files.txt" > "$TMPDIR/file_owners.txt"
# Group files by owner
echo "Grouping files by owner..."
mkdir -p "$TMPDIR/owners"
ALL_OWNERS=""
while IFS=$'\t' read -r file owner; do
# Sanitize owner name for filename
owner_safe=$(echo "$owner" | sed 's/[^a-zA-Z0-9_-]/_/g')
echo "$file" >> "$TMPDIR/owners/$owner_safe.files"
echo "$owner" > "$TMPDIR/owners/$owner_safe.name"
# Track unique owners
if [[ ! -f "$TMPDIR/owners/$owner_safe.seen" ]]; then
touch "$TMPDIR/owners/$owner_safe.seen"
ALL_OWNERS="${ALL_OWNERS:+$ALL_OWNERS }$owner_safe"
fi
done < "$TMPDIR/file_owners.txt"
# Show what we found
echo ""
echo "Files by owner:"
echo "---------------"
for owner_safe in $ALL_OWNERS; do
owner=$(cat "$TMPDIR/owners/$owner_safe.name")
file_count=$(wc -l < "$TMPDIR/owners/$owner_safe.files" | tr -d ' ')
echo " $owner: $file_count file(s)"
done
echo ""
# Count owners
OWNER_COUNT=$(echo "$ALL_OWNERS" | wc -w | tr -d ' ')
echo "Will create $OWNER_COUNT revision(s)"
echo ""
# If only one owner, no split needed
if [[ "$OWNER_COUNT" -eq 1 ]]; then
owner_safe=$(echo "$ALL_OWNERS" | awk '{print $1}')
owner=$(cat "$TMPDIR/owners/$owner_safe.name")
# shellcheck disable=SC2059
description=$(printf "$TEMPLATE" "$owner")
echo "Only one owner found. Updating revision description..."
jj describe -r "$REVISION" -m "$description"
echo "Done! Revision updated with description: $description"
exit 0
fi
# Convert to array for indexing
OWNERS_ARR=($ALL_OWNERS)
FIRST_OWNER_SAFE="${OWNERS_ARR[0]}"
FIRST_OWNER=$(cat "$TMPDIR/owners/$FIRST_OWNER_SAFE.name")
echo "Processing owners..."
echo ""
# Get the parent of the original revision
PARENT=$(jj log -r "parents($REVISION)" --no-graph -T 'change_id.short(12)' | head -1)
# Get the original revision's change_id for reference
ORIG_CHANGE_ID=$(jj log -r "$REVISION" --no-graph -T 'change_id.short(12)')
# Create a new revision for each owner (original revision stays untouched)
for i in "${!OWNERS_ARR[@]}"; do
owner_safe="${OWNERS_ARR[$i]}"
owner=$(cat "$TMPDIR/owners/$owner_safe.name")
# shellcheck disable=SC2059
description=$(printf "$TEMPLATE" "$owner")
# Create a new empty revision as sibling of original (this changes @)
jj new "$PARENT" -m "$description" >/dev/null 2>&1
# @ is now the new revision, get its change_id
new_rev=$(jj log -r @ --no-graph -T 'change_id.short(12)')
echo "$new_rev" > "$TMPDIR/owners/$owner_safe.rev"
echo "[$owner] Created new revision: $new_rev"
done
# Return to original revision
jj edit "$ORIG_CHANGE_ID" >/dev/null 2>&1 || true
echo ""
echo "Copying files to new revisions..."
# For each owner, copy their files from original to the new revision
for i in "${!OWNERS_ARR[@]}"; do
owner_safe="${OWNERS_ARR[$i]}"
owner=$(cat "$TMPDIR/owners/$owner_safe.name")
target_rev=$(cat "$TMPDIR/owners/$owner_safe.rev")
echo "Copying files for $owner to $target_rev..."
# Debug: show the command being run
file_count=$(wc -l < "$TMPDIR/owners/$owner_safe.files" | tr -d ' ')
echo " ($file_count files)"
# Pass all files at once to jj restore (show errors for debugging)
if ! xargs jj restore --from "$ORIG_CHANGE_ID" --to "$target_rev" < "$TMPDIR/owners/$owner_safe.files"; then
echo " Warning: jj restore had errors"
echo " Files: $(cat "$TMPDIR/owners/$owner_safe.files" | tr '\n' ' ')"
fi
done
echo ""
echo "Done! Created revisions:"
echo ""
for owner_safe in $ALL_OWNERS; do
owner=$(cat "$TMPDIR/owners/$owner_safe.name")
# shellcheck disable=SC2059
desc=$(printf "$TEMPLATE" "$owner")
echo " $owner -> $desc"
done

View file

@ -1,70 +0,0 @@
#!/usr/bin/env zsh
setopt aliases
NOTEBOOK_DIR=~/notebook
if [[ ! -d "$NOTEBOOK_DIR" ]]; then
echo "Error: Notebook directory does not exist at $NOTEBOOK_DIR"
exit 1
fi
cd "$NOTEBOOK_DIR" || exit 1
show_help() {
cat << EOF
nb - Notebook management tool
Usage: nb <command>
Commands:
cd Change directories
save Commit changes with timestamp
sync Save, fetch, and push changes
log Show commit log
diff Show differences
status Show diff summary
todo Add a todo item (or manage todos)
archive Archive completed todos
inbox List contents of inbox(es)
EOF
}
case "$1" in
cd)
exec "$SHELL"
;;
save)
jj diff -r @ --summary | grep -q . && jj commit -m "$(date +"%Y-%m-%dT%H:%M:%S%z")" && jj tug || true
;;
sync)
"$0" save && jj git fetch && jj git push
;;
log)
jj log -r ".."
;;
diff)
jj diff
;;
status)
jj diff -s
;;
todo)
if [[ "$2" == "archive" && -z "$3" ]]; then
todo_archive todo.xit done.xit
elif [[ "$2" == "inbox" && -z "$3" ]]; then
uvx --from todoman todo
else
todo "${@:2}"
fi
;;
"")
show_help
;;
*)
echo "Error: Unknown command '$1'"
echo ""
show_help
exit 1
;;
esac

View file

@ -1,3 +0,0 @@
#!/usr/bin/env bash
date +"%Y-%m-%dT%H:%M:%S%z"

View file

@ -1,94 +0,0 @@
#!/usr/bin/env bash
if [[ -z "$1" ]]; then
cat << EOF
reldate - Format or adjust dates
Usage: reldate <date|adjustment|keyword>
Examples:
reldate "2025-12-12" # Output: 2025-12-12
reldate "+1d" # Output: tomorrow's date
reldate "-1w" # Output: date 1 week ago
reldate "+2m" # Output: date 2 months from now
reldate "-1y" # Output: date 1 year ago
reldate today # Output: today's date
reldate tomorrow # Output: tomorrow's date
reldate yesterday # Output: yesterday's date
reldate friday # Output: next Friday
reldate fri # Output: next Friday
reldate weekend # Output: next Saturday
Adjustments:
d = days, w = weeks, m = months, y = years
Use + for future, - for past
Keywords:
today, tomorrow, yesterday
monday-sunday (or mon-sun)
weekend (Saturday)
EOF
exit 1
fi
# Normalize input to lowercase
input=$(echo "$1" | tr '[:upper:]' '[:lower:]')
# Calculate days until a target weekday (1=Mon, 7=Sun)
# Returns days to add (1-7, never 0 - same day means next week)
days_until_weekday() {
local target=$1
local current=$(date +%u)
local diff=$(( (target - current + 7) % 7 ))
if [[ $diff -eq 0 ]]; then
diff=7
fi
echo $diff
}
# Map day name to number (1=Mon, 7=Sun)
day_to_number() {
case "$1" in
mon|monday) echo 1 ;;
tue|tuesday) echo 2 ;;
wed|wednesday) echo 3 ;;
thu|thursday) echo 4 ;;
fri|friday) echo 5 ;;
sat|saturday) echo 6 ;;
sun|sunday) echo 7 ;;
*) echo 0 ;;
esac
}
# Handle natural language keywords
case "$input" in
today)
date "+%Y-%m-%d"
;;
tomorrow)
date -v "+1d" "+%Y-%m-%d"
;;
yesterday)
date -v "-1d" "+%Y-%m-%d"
;;
weekend)
days=$(days_until_weekday 6)
date -v "+${days}d" "+%Y-%m-%d"
;;
mon|monday|tue|tuesday|wed|wednesday|thu|thursday|fri|friday|sat|saturday|sun|sunday)
day_num=$(day_to_number "$input")
days=$(days_until_weekday "$day_num")
date -v "+${days}d" "+%Y-%m-%d"
;;
*)
# Fall through to original logic
if [[ "$1" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]]; then
date -j -f "%Y-%m-%d" "$1" "+%Y-%m-%d" 2>/dev/null || echo "Invalid date: $1"
else
date -v "$1" "+%Y-%m-%d"
fi
;;
esac

View file

@ -1,3 +0,0 @@
#!/usr/bin/env bash
date +"%Y-%m-%d"

View file

@ -1,8 +0,0 @@
#!/usr/bin/env bash
if [[ -z "$*" ]]; then
echo "Error: Please provide a todo item"
exit 1
fi
echo "[ ] $*" >> ~/notebook/todo.xit

View file

@ -1,188 +0,0 @@
#!/usr/bin/env -S uv run --script
# /// script
# requires-python = ">=3.10"
# dependencies = [
# "stage-left",
# ]
# ///
"""
Archive completed (DONE) and obsolete todos from a [x]it! file.
Extracts all checked and obsolete items, outputs them (preserving groups), and
removes them from the original file.
"""
import argparse
import sys
from pathlib import Path
from stage_left import parse_file
from stage_left.types import State, Group, Item
def format_item(item: Item) -> str:
"""Format an item back to [x]it! syntax."""
lines = item.description.split('\n')
first_line = f"[{item.state.value}] {lines[0]}"
if len(lines) == 1:
return first_line
# Indent continuation lines (4 spaces to align with content after "[x] ")
continuation_lines = [' ' + line for line in lines[1:]]
return '\n'.join([first_line] + continuation_lines)
def sort_groups(groups: list[Group]) -> list[Group]:
"""
Sort groups: untitled groups first, then alphabetically by title.
"""
untitled = [g for g in groups if not g.title]
titled = [g for g in groups if g.title]
titled.sort(key=lambda g: g.title.lower())
return untitled + titled
def format_groups(groups: list[Group]) -> str:
"""Format a list of groups back to [x]it! syntax."""
lines = []
for i, group in enumerate(groups):
if group.title:
if i > 0:
lines.append("") # Blank line before group title
lines.append(group.title)
for item in group.items:
lines.append(format_item(item))
return "\n".join(lines)
def extract_archivable_items(groups: list[Group]) -> tuple[list[Group], list[Group]]:
"""
Split groups into archivable (done/obsolete) and remaining items.
Returns:
(archivable_groups, remaining_groups) - Both preserve group structure.
Empty groups are preserved in remaining_groups.
"""
archivable_states = {State.CHECKED, State.OBSOLETE, State.IN_QUESTION}
archivable_groups = []
remaining_groups = []
for group in groups:
archivable_items = [item for item in group.items if item.state in archivable_states]
remaining_items = [item for item in group.items if item.state not in archivable_states]
if archivable_items:
archivable_groups.append(Group(title=group.title, items=archivable_items))
# Always preserve the group in remaining, even if empty
remaining_groups.append(Group(title=group.title, items=remaining_items))
return archivable_groups, remaining_groups
def merge_groups(existing: list[Group], new: list[Group]) -> list[Group]:
"""
Merge new groups into existing groups.
Groups with matching titles have their items combined.
New groups without a matching title are appended.
"""
merged: dict[str | None, Group] = {}
order: list[str | None] = []
for group in existing:
if group.title in merged:
# Extend existing group's items
merged[group.title] = Group(
title=group.title,
items=merged[group.title].items + group.items,
)
else:
merged[group.title] = Group(title=group.title, items=list(group.items))
order.append(group.title)
for group in new:
if group.title in merged:
# Merge into existing group
merged[group.title] = Group(
title=group.title,
items=merged[group.title].items + group.items,
)
else:
# New group
merged[group.title] = Group(title=group.title, items=list(group.items))
order.append(group.title)
return [merged[title] for title in order]
def main() -> int:
parser = argparse.ArgumentParser(
description="Archive completed and obsolete todos from a [x]it! file.",
epilog="Done and obsolete items are extracted and removed from the input file.",
)
parser.add_argument(
"input",
type=Path,
help="Path to the [x]it! file to process",
)
parser.add_argument(
"output",
type=Path,
help="Output file for archived todos",
)
args = parser.parse_args()
if not args.input.exists():
print(f"Error: Input file not found: {args.input}", file=sys.stderr)
return 1
with open(args.input, "r") as fp:
groups = parse_file(fp)
archivable_groups, remaining_groups = extract_archivable_items(groups)
if archivable_groups:
if args.output.exists():
with open(args.output, "r") as fp:
existing_groups = parse_file(fp)
merged_groups = merge_groups(existing_groups, archivable_groups)
else:
merged_groups = archivable_groups
merged_output = format_groups(sort_groups(merged_groups))
with open(args.output, "w") as fp:
fp.write(merged_output)
fp.write("\n")
remaining_output = format_groups(remaining_groups)
with open(args.input, "w") as fp:
if remaining_output:
fp.write(remaining_output)
fp.write("\n")
elif args.output.exists():
# No new items to archive, but re-sort existing archive
with open(args.output, "r") as fp:
existing_groups = parse_file(fp)
sorted_output = format_groups(sort_groups(existing_groups))
with open(args.output, "w") as fp:
fp.write(sorted_output)
fp.write("\n")
archived_count = sum(len(g.items) for g in archivable_groups)
remaining_count = sum(len(g.items) for g in remaining_groups)
if archived_count:
print(
f"Archived {archived_count} todo(s). {remaining_count} remaining.",
file=sys.stderr,
)
else:
print(f"Sorted {remaining_count} todo(s).", file=sys.stderr)
return 0
if __name__ == "__main__":
sys.exit(main())

View file

@ -1,18 +0,0 @@
cache-prompts: true
gitignore: false
auto-commits: false
watch-files: true
subtree-only: true
stream: false
show-model-warnings: false
code-theme: "lightbulb"
user-input-color: "#a6e3a1"
tool-output-color: "#89b4fa"
tool-error-color: "#f38ba8"
tool-warning-color: "#fab387"
assistant-output-color: "#cba6f7"
completion-menu-color: "#cdd6f4"
completion-menu-bg-color: "#313244"
completion-menu-current-color: "#f9e2af"
completion-menu-current-bg-color: "#45475a"

View file

@ -1,5 +0,0 @@
[user]
email = {{ .email_personal }}
[core]
sshCommand = "ssh -i ~/.ssh/id_rsa_personal"

View file

View file

@ -1 +0,0 @@
--glob=!.git/*

View file

@ -1,5 +0,0 @@
# {{ .name }}
# {{ .email_personal }}
# Added by OrbStack: command-line tools and integration
source ~/.orbstack/shell/init.zsh 2>/dev/null || :

View file

@ -1,100 +0,0 @@
# Browser
if [[ "$OSTYPE" == darwin* ]]; then
export BROWSER='open'
fi
# Editors
export EDITOR='hx'
export VISUAL='hx'
export PAGER='less'
# Language
if [[ -z "$LANG" ]]; then
export LANG='en_US.UTF-8'
fi
# Less
# Set the default Less options.
# Mouse-wheel scrolling has been disabled by -X (disable screen clearing).
# Remove -X and -F (exit if the content fits on one screen) to enable it.
export LESS='-F -g -i -M -R -S -w -X -z-4'
# Set the Less input preprocessor.
if (( $+commands[lesspipe.sh] )); then
export LESSOPEN='| /usr/bin/env lesspipe.sh %s 2>&-'
fi
# Temporary Files
if [[ ! -d "$TMPDIR" ]]; then
export TMPDIR="/tmp/$USER"
mkdir -p -m 700 "$TMPDIR"
fi
TMPPREFIX="${TMPDIR%/}/zsh"
if [[ ! -d "$TMPPREFIX" ]]; then
mkdir -p "$TMPPREFIX"
fi
# Paths
typeset -gU cdpath fpath mailpath path
check_paths=(
# rust
$HOME/.cargo/bin
$HOME/.cargo/env
# npm
$HOME/.npm-packages/bin
# yarn
$HOME/.yarn/bin
$HOME/.config/yarn/global/node_modules/.bin
# WSL
# /mnt/c/windows
# /mnt/c/windows/system32
# home
$HOME/bin
# go
$HOME/go/bin
# pixi
$HOME/.pixi/bin
# homebrew
/opt/homebrew/bin
# uv
$HOME/.local/bin
# lm studio
$HOME/.lmstudio/bin
{{ join .chezmoi.sourceDir "encrypted_dot_work_paths.age" | include | decrypt -}}
)
for fp in $check_paths; do
if [[ -s "$fp" ]]; then
path+=("$fp")
fi
done
export -U PATH
export NVM_DIR="$HOME/.nvm"
export XDG_CONFIG_HOME=$HOME/.config
export JJ_CONFIG=$XDG_CONFIG_HOME/jj/config.toml
export RIPGREP_CONFIG_PATH=$HOME/.ripgreprc
export FZF_DEFAULT_COMMAND="rg --files --hidden"
export FZF_DEFAULT_OPTS=" \
--color=bg+:#313244,bg:#1e1e2e,spinner:#f5e0dc,hl:#f38ba8 \
--color=fg:#cdd6f4,header:#f38ba8,info:#cba6f7,pointer:#f5e0dc \
--color=marker:#b4befe,fg+:#cdd6f4,prompt:#cba6f7,hl+:#f38ba8 \
--color=selected-bg:#45475a \
--color=border:#313244,label:#cdd6f4"
alias devlog="cd ~/projects/personal/devlog && hx logs/$(date '+%Y-%m-%d').gmi && cd -"
alias khal='uvx khal "$@"'
alias todoman='uvx --from todoman todo "$@"'

View file

@ -1,63 +0,0 @@
setopt HIST_IGNORE_ALL_DUPS
bindkey -v
WORDCHARS=${WORDCHARS//[\/]}
ZSH_AUTOSUGGEST_MANUAL_REBIND=1
ZSH_HIGHLIGHT_HIGHLIGHTERS=(main brackets)
ZIM_HOME=${ZDOTDIR:-${HOME}}/.zim
if [[ ! -e ${ZIM_HOME}/zimfw.zsh ]]; then
if (( ${+commands[curl]} )); then
curl -fsSL --create-dirs -o ${ZIM_HOME}/zimfw.zsh \
https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh
else
mkdir -p ${ZIM_HOME} && wget -nv -O ${ZIM_HOME}/zimfw.zsh \
https://github.com/zimfw/zimfw/releases/latest/download/zimfw.zsh
fi
fi
if [[ ! ${ZIM_HOME}/init.zsh -nt ${ZDOTDIR:-${HOME}}/.zimrc ]]; then
source ${ZIM_HOME}/zimfw.zsh init -q
fi
source ${ZIM_HOME}/init.zsh
zmodload -F zsh/terminfo +p:terminfo
# Bind ^[[A/^[[B manually so up/down works both before and after zle-line-init
for key ('^[[A' '^P' ${terminfo[kcuu1]}) bindkey ${key} history-substring-search-up
for key ('^[[B' '^N' ${terminfo[kcud1]}) bindkey ${key} history-substring-search-down
for key ('k') bindkey -M vicmd ${key} history-substring-search-up
for key ('j') bindkey -M vicmd ${key} history-substring-search-down
unset key
srcs=(
"$HOME/.cargo/env"
"$HOME/.zshwork"
"$HOME/.zshprivate"
)
for fp in $srcs; do
if [[ -s "$fp" ]]; then
source "$fp"
fi
done
eval "$(/opt/homebrew/bin/brew shellenv)"
eval "$(direnv hook zsh)"
eval "$(jj util completion zsh)"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
[ -s "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm" ] && \. "/opt/homebrew/opt/nvm/etc/bash_completion.d/nvm"
[ "$TERM" = "xterm-kitty" ] && alias ssh="TERM=xterm ssh"
function update_now() {
cd ~/projects/personal/thermokar.st || return
jj git fetch --remote pingo && jj new deploy
hx now.md
if [[ -n $(jj diff) ]]; then
jj commit -m "$(now)"
jj tug
jj git push --remote pingo
jj git push --remote dokku
fi
}

View file

@ -1,11 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYcS9JQTB5TkZGVTlFVEkx
T0pkZWtQeVA0OGJGcTJCTi9zK2o5VkNVQ3dnClFQdWVuWUpwOStuZTNqQ0N1dm9z
aUJsMktNd1N6MDhaN1RlYmZ1YVAwSE0KLS0tIElubG8wNVlOUXYzdTBieGpYRGFQ
RFhHSTM2Yit0WWVRVXpWcUhDVlU3a2sKwiBHRNxbfp6imiMrKPiBmSmq7W8qZOTY
dY6gANHwmwYahtVAFjLMySiTiheRCNqMRbkII8sbOZRvE0Nx7BneE2enHc+gX5kJ
PnOjbqmAYtR58FBhX3aL578cxkdMmEJC+lT4189ywPhWsuZb2j9ysbyNT4WwYcdk
NjY58Tpt/v5kDb5Roj6eMfoQiR3lBJEbPeP7QI9VlJNa1vP242bK7gYWLKMsTB4Q
pbdF+3dJ58khvCpdw3gNz11tBCE+qKeiPwQSj1ghPzeNOOM4fpPftdU8HPDWNMWh
qNJtqwwZl6FLCw==
-----END AGE ENCRYPTED FILE-----

View file

@ -1,10 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLVVd1WlkyUitSUWdFSzBG
ZnJWc3pYZmVGSzBxKzhRcmpnSGVjSnZVdUdZCmFDOHcySkhtVXd4L2tuaERDRjRq
UzBvY1h5cmhQM09JTzZpTEVJQVcyWDgKLS0tIE9pYm9CUzRFdjh4NkN3eWEvUE9V
KzZyUm1qMVA5Tm54c1UzZTdROW5qakUKBuIeMGy+Jff9ZUueA8j7zSu1M0LVYTHH
udpQLQIJXMS/UGRSWimfIn9jdRv1wrovPYE/hQJCLcuL3cf5iejZAmmKj/+3ODF0
cS4RAO/t8W2GFCXvoc2fiiqN6lu5Cq79aLMu7W5CtgOLB2nbov+WgapZ4T/5gogX
n7Ks/+M13urAphxvdBegNkDOLz7bkF0JJ8v3HcHS9JPZ9WkpOF4nBGycwdnYFplU
ws0nrpLwFg6QEmScqxtyh8G2ZXQgd+P3m3M68jtQkD6nK2Q=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,9 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0R1ZRL1VJVW5URzZoZXJC
Wm1XcjVzeE5rdXBVVFJ4RmpVS3FqVE5LRmtjCjVia29aeklXUkRWWWpKY2hGRlJh
cWlRTlIyNlZqbUNoTmhaNzFoOWc2czQKLS0tIDUwTFJZVlcxVjRzOVV0QUJBdEZV
Mm5SamhSYlgvZUgxd1NlcFhRd2R3MDgKHuVfpKp1BQBx1xXur5x8N8Ohli0rYY6+
MmmKTDdYvuZKDqGrI+EpQw0yywLyUgeWfDUx5OSx1Z9PKMAU1+KYGAWB0WLYXafT
51UZSNj835YVZUChLKwLhthKg8KTl6h4FxE4K/88iHVOlRyVhuUAkZfGlGpL21uC
XgKaOnt/i5IFeGj459sR0io2m0sjCcZJA/3F1SBkVch3Lw1Xx4GrPmKq
-----END AGE ENCRYPTED FILE-----

View file

@ -1,7 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSByV0J4aGFoR3hDSTJvNVp2
a1F1NzJmaERoYWwycStJeC9OS0tLaUp0aXpvCjhndzJrQmhRaWo4STRzdWtYTE94
Y0V4UHJ5UHlwaXZJOVJXSjdhMktvUWcKLS0tIDRtUHptRjYzT0RHQVJxT2RBbXNa
OUwxak52ZVhQL2psSUlpRVhHdzUxZjgKtcrEfrCDzTmLFhPNcnJ/PBMoiIxF0KAE
B2lhLyJ6+0OVTHMM6byVr+JnjnIXoA35537EUkQZ+A==
-----END AGE ENCRYPTED FILE-----

View file

@ -1,12 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzTmhSUzdOTnJmczRqd3g3
YWhZRm1iNHpIMFNwOFdDMExKQ25qcGgwTWhJClBpSzkrUTREZk84VDZYajlXcndF
enhwVUt1enVFY24xUDNDK2gwQUxTb2cKLS0tIGE5ellZWHZHR3Y2WVhoTUNLWUlT
YmM3S2diZ1JYOHNMcW83dm5zRzVkZmcKTOtE4Sekeosb1khWwlViiPDjg7iG4unX
iqforD+jLIR+M0+2inoNXuSwz1mn1dZVaR5m5B6aXw6oUNXlA3nzZIN57p7pR+kW
YkHA5MovQpHSpFNP0QMhfngU+oZ2+U/sQLa2EegtmfErt3uuYEJ3axpe6CcZgQsh
x9eZYlc/cF8UxqPew9/Pj1M+Bu8jpRMWvKXUOBQgp19Jc/wh9eXqydmnLqYoJJ0a
LMzN+oZDejtV3WVC9jmwrFVFQ+YAKGc17UZAxWk/fhhuPT7CJkhqRkuIiBkmmXXp
3Vmwm5csnJahKjVdntMz+QQ0wdoPKCn1NPOypH+ox57nE1K3bAuoMPDv+RgODisB
ESW3gXyo+pEMxdsP31/awOK4CNQdaKNtmrYa5A5V3+CJOzqiVxM=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,63 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGU2E2Mld2R1R3R2JWRURO
cEd4SWRTaU9jeENkZ3g2Tm9FL2h5R0l2eG5JCjNzUVpoWmVwR3BOUGU1RDNyNUw2
N0c2NWtBaFZNK3hrNmNTN1VOWmZEZzAKLS0tIC9WSEdlOWFkaWhhZ1FyamlybWlj
RFZGZHJVbXpaVk02c1JDS3BGWVJmL1kKRKjBdIPBTWB0pbPdw9cb7ZPueXdRY2wy
goYJrLhHjdAISUHldgabcGJzdBpfwRzL5TcVSzfqjCGNPToH2brLRYNrRjm7J3t8
ZcZo//w4TIvU8x4qyqqw/GN5/PS0vd/LQ1Gu4EOH95Q/xWXu+YowDTcYijOaBGiD
I1mGWgy6iU/8NLF987GtNSltfJlzy1wGU97gawMkDUNjI+tP6VLvJ3vEiCQzKdPA
rnLifnzClvGb7LPLzXTMwqmX+vm889S6cZE1giMRgeg/w9NNA+LPRKd1ofIrOA+v
UjToiSoz3wClaJ+DzrtT2Cp4KXx/GApIjCUIlEfPgO+i5wlpnJBrOTu/fQ+9CCb6
mVLHoptx3I8mkZiMmkcLQcJZFt40BvMieX18oXpTtcHdj9znYmHnN+2tYs6QcKQD
/jgSPfVWKANUSayhlhFFX76qqSuh/pxrpsFZiEtUujxmCmXOhZdBa7q6RqaO9eR5
X4dayXBwhocP982cMGQLjpTWo9gmmkig70nDILc5bjqXNUvJCouK+qSHKfN041dF
KGhrZU15lcCimKkoiPRZPWei7lTcZS84g6jrLisF+C3LzWAmB4NZ+W5I5SQJ81fk
W31gsu17M0zfdJYugrYbUsALA79PH3FcdWtFLG7uXVJY6j7DZcqUy9rz8CRjiqNA
E80Qk4Qn+3t5ptvtaGOG6dLdXt2Q6jcC7lc2TIddV3f2/I7SOebviLQUrfJ858HM
IZJXyz8xy6wCMs80p+VjYidZIqaLQy8bLvQ/EXGnkEHCezFFxNYwxpPqCNsrZWff
+8SNAdcM5nH5n1MbjotgAAXMYpmRMBejccN9uSW/8GxUZLaEPM5G6AdJeRalbHfk
LEjenKx1BVoAR2s9M0EfyPpBMmivPrETRGeh9pGvNJtj92vGcj1bu0jUVzNNMs5F
VX9HaWQLbVbl6Sz+YW3Vbe8qk7ypEmdlylDw6F0NmUExRtYjkCXuLAfuR0foVBNS
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
7husN3fi6bqeIxAr7vY=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,17 +0,0 @@
- model_id: copilot-gpt-4.1
model_name: gpt-4.1
api_base: "https://api.githubcopilot.com"
api_key_name: copilot
supports_tools: true
- model_id: copilot-gpt-4o
model_name: gpt-4o
api_base: "https://api.githubcopilot.com"
api_key_name: copilot
supports_tools: true
- model_id: lms-qwen3-coder-30b
model_name: qwen/qwen3-coder-30b
api_base: "http://localhost:1234/v1"
api_key_name: copilot
supports_tools: true

View file

@ -1 +0,0 @@
--theme="Catppuccin Mocha"

File diff suppressed because it is too large Load diff

View file

@ -1,9 +0,0 @@
*~
.DS_Store
.idea
.vscode
.envrc
.aider*
**/.claude/settings.local.json
CLAUDE.md
TODO.xit

View file

@ -1,16 +0,0 @@
theme = "catppuccin_mocha"
[editor]
true-color = true
insert-final-newline = false
[editor.file-picker]
hidden = false
[keys.normal.space.m]
r = ":reload-all"
s = ":toggle-option soft-wrap.enable"
[keys.normal.space.m.n]
a = ":run-shell-command nb todo archive"
s = ":run-shell-command nb sync"

View file

@ -1,73 +0,0 @@
[[language]]
name = "rust"
language-servers = ["rust-analyzer"]
[language-server.rust-analyzer.config.check]
command = "clippy"
[language-server.pyright]
command = "pyright-langserver"
args = ["--stdio"]
config = {}
[[language]]
name = "python"
language-servers = ["pyright"]
[language-server.roc-ls]
command = "roc_language_server"
[[language]]
name = "roc"
scope = "source.roc"
injection-regex = "roc"
file-types = ["roc"]
shebangs = ["roc"]
roots = []
comment-token = "#"
language-servers = ["roc-ls"]
indent = { tab-width = 2, unit = " " }
auto-format = true
formatter = { command = "roc", args =[ "format", "--stdin", "--stdout"]}
[language.auto-pairs]
'(' = ')'
'{' = '}'
'[' = ']'
'"' = '"'
[[grammar]]
name = "roc"
source = { git = "https://github.com/faldor20/tree-sitter-roc.git", rev = "ef46edd0c03ea30a22f7e92bc68628fb7231dc8a" }
[[language]]
name = "go"
roots = ["go.work", "go.mod"]
auto-format = true
formatter = ["gofmt"]
comment-token = "//"
language-servers = ["gopls"]
[language-server]
zk-lsp = { command = "zk", args = [ "lsp" ] }
[[language]]
name = "markdown"
language-servers = ["zk-lsp"]
roots = [ ".zk" ]
[[language]]
name = "lua"
formatter = { command = "stylua", args = [ "-" ] }
[[language]]
name = "prr"
scope = "source.prr"
file-types = ["prr"]
roots = []
comment-token = "#"
[[grammar]]
name = "prr"
source = { path = "~/.local/share/tree-sitter-prr" }

View file

@ -1,25 +0,0 @@
; PRR syntax highlighting for Helix
; Diff additions and deletions
(addition) @diff.plus
(deletion) @diff.minus
; File headers
(old_file) @diff.minus
(new_file) @diff.plus
; Diff metadata
(diff_header) @keyword
(index_line) @comment
(chunk_header) @attribute
; Context lines (unchanged diff lines)
(context_line) @comment
; PRR tag components
(tag_name) @keyword
(action) @string
(tag_content) @comment
; User comments
(comment_line) @comment

View file

@ -1,42 +0,0 @@
[user]
name = {{ .name | quote }}
{{- if eq .hosttype "work" }}
email = {{ .email_work | quote }}
{{- else }}
email = {{ .email_personal | quote }}
{{- end }}
[git]
private-commits = "description(glob:'private:*')"
[templates]
{{- if eq .hosttype "work" }}
git_push_bookmark = '"2025_{{ .github_work }}_jj_" ++ change_id.short()'
{{- else }}
git_push_bookmark = '"{{ .github_personal }}_jj_" ++ change_id.short()'
{{- end }}
[colors]
"diff removed token" = { fg = "red", underline = false }
"diff added token" = { fg = "green", underline = false }
[revset-aliases]
"immutable_heads()" = "builtin_immutable_heads() | (trunk().. & ~mine())"
"why_immutable(r)" = "r | roots(r:: & immutable_heads())"
"closest_bookmark(to)" = "heads(::to & bookmarks())"
[aliases]
tug = ["bookmark", "move", "--from", "closest_bookmark(@-)", "--to", "@-"]
[ui]
default-command = ["log"]
diff-formatter = ":git"
{{ if eq .hosttype "work" -}}
[[--scope]]
--when.repositories = ["~/projects/personal", "~/.local/share/chezmoi"]
[--scope.user]
email = {{ .email_personal | quote }}
[--scope.templates]
git_push_bookmark = '"{{ .github_personal }}_jj_" ++ change_id.short()'
{{- end }}

View file

@ -1,19 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzM1hrWEZheUp6MEF3Y1ZO
NXQyRlVlUDl5T2xsYktXeldxZlR1c0ZDVW5zCnVzdUhNUFRySlZqa2Y1dk5WaEM1
RENzc25KSG94ZmNDcTd3TmJXd0JxZVEKLS0tIHNZYWpsMHMrNmw1V2wxK1NXT2Nu
N1pDNFdaYVlCQmJOTVZMZ2V5Mmt0MlUK5kSI0GGB5f1k7Yrk5Hn+p60Nqa5fXhHW
Wy4X3ww/Nmgs9DWiNc/cHz/xheJ6jWAQ7spw0sJRLCG1dmUAwpgzoObCIByC58rd
ZwS7N2/OKkAFd+CGyqxcxQMjKHOzzT/DG5GvCWZcnbAc6WhF5uD949VtV2V4bXlf
RnZyQ1TvmQ0bsqHzJgs/ts/AerbM5km/jeKzXdOIJEw00x6Mh3U8JXuusHnKw4CI
eHxFHTDasx51+GDPAw9wv7hd2bn/6bv8FS0VQ58W8YnXeUIKAaxUnsdgq/ancR6g
vrqy29yTo1UIao6B5tWnhlThycZbYVbVeFCnnA/GpUhIRYUmFGttNU4U8IS+mNwl
6OfGuBqGKa/ele8ZZ3Ty3hC5yV/6C+7H+SI7g4+sI/dbdwyJ4PkX0ItQ7Iv6vlme
Nu9mB4l8fJTiSTSDGfM7Z4845YGgibgFhWME0tCifzubljDtHyBfeEocI1KfN0pN
qfjUPujtHnXO9TzpIwd73iHJKcR5MmKsnXvffwtJDrxPI781ucPxA8U2txyEs+nP
NRPzdotxFjK7YHoQSfhvtS5+83MXkul9GmCVGxYzvHKF36I3fEsiJ2YI7hwibEkO
FRfYi6zFfs1h6SGdni6D1ZwTmtnfSJWmOnaVS1QXVUJoUgyTNZyRdmz9yLDGaTkF
Kv0Pht3deoCWLcg9jemFnZzpQpMIPi3BtilVGSRy4IZApY3KN2SWibeJWoMmcvuy
tQZBjss/djL48/HOGn6hGPz/1IyXkUQNz9747VN952MdwgvtWGYaFDsypjGWrueD
NV6SlIe+jVp1IKiwhlbfMPd8VUtXGiE0KarkNPBqo3CbB7iZazRrItU=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,38 +0,0 @@
font_family Iosevka Term Extralight
font_size 14.0
shell .
clipboard_control write-clipboard write-primary no-append
macos_option_as_alt yes
enable_audio_bell no
visual_bell_duration 0.5
enabled_layouts splits, stack
tab_bar_edge top
tab_bar_min_tabs 2
tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{index} {title.split('/')[-1].split(':')[-1]}"
allow_remote_control yes
map ctrl+a>h neighboring_window left
map ctrl+a>j neighboring_window bottom
map ctrl+a>k neighboring_window top
map ctrl+a>l neighboring_window right
map ctrl+a>" launch --location=hsplit
map ctrl+a>% launch --location=vsplit
map ctrl+a>c new_tab_with_cwd
map ctrl+a>shift+c new_tab
map ctrl+a>z toggle_layout stack
map ctrl+a>ctrl+a goto_tab -1
map ctrl+a>0 select_tab
map ctrl+a>1 goto_tab 1
map ctrl+a>2 goto_tab 2
map ctrl+a>3 goto_tab 3
map ctrl+a>4 goto_tab 4
map ctrl+a>5 goto_tab 5
map ctrl+a>6 goto_tab 6
map ctrl+a>7 goto_tab 7
map ctrl+a>8 goto_tab 8
map ctrl+a>9 goto_tab 9
# BEGIN_KITTY_THEME
include current-theme.conf
# END_KITTY_THEME

View file

@ -1,14 +0,0 @@
[
{
"name": "default",
"path": "/Users/matthew.dillon/notebook/tracker.klg"
},
{
"name": "tracker",
"path": "/Users/matthew.dillon/notebook/tracker.klg"
},
{
"name": "agenda",
"path": "/Users/matthew.dillon/notebook/agenda.klg"
}
]

View file

@ -1,5 +0,0 @@
{
"diagnostics.globals": [
"vim"
]
}

View file

@ -1,20 +0,0 @@
-- Bootstrap lazy.nvim
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
if vim.v.shell_error ~= 0 then
vim.api.nvim_echo({
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
{ out, "WarningMsg" },
{ "\nPress any key to exit..." },
}, true, {})
vim.fn.getchar()
os.exit(1)
end
end
vim.opt.rtp:prepend(lazypath)
-- order matters here!
require("vim-options")
require("lazy").setup("plugins")

View file

@ -1,25 +0,0 @@
return {
"yetone/avante.nvim",
opts = {
provider = "copilot",
},
dependencies = {
{
"zbirenbaum/copilot.lua",
config = function()
require("copilot").setup({
copilot_node_command = vim.fn.expand("$HOME") .. "/.nvm/versions/node/v22.14.0/bin/node",
suggestion = { enabled = false },
panel = { enabled = false },
})
end,
},
{
"MeanderingProgrammer/render-markdown.nvim",
opts = {
file_types = { "markdown", "Avante" },
},
ft = { "markdown", "Avante" },
},
},
}

View file

@ -1,9 +0,0 @@
return {
"catppuccin/nvim",
lazy = false,
name = "catppuccin",
priority = 1000,
config = function()
vim.cmd.colorscheme("catppuccin")
end,
}

View file

@ -1,38 +0,0 @@
return {
{
"hrsh7th/cmp-nvim-lsp",
},
{
"zbirenbaum/copilot-cmp",
config = function()
require("copilot_cmp").setup()
end,
},
{
"hrsh7th/nvim-cmp",
config = function()
local cmp = require("cmp")
cmp.setup({
window = {
completion = cmp.config.window.bordered(),
documentation = cmp.config.window.bordered(),
},
mapping = cmp.mapping.preset.insert({
["<C-b>"] = cmp.mapping.scroll_docs(-4),
["<C-f>"] = cmp.mapping.scroll_docs(4),
["<C-Space>"] = cmp.mapping.complete(),
["<C-e>"] = cmp.mapping.abort(),
["<CR>"] = cmp.mapping.confirm({ select = true }),
}),
sources = cmp.config.sources({
{ name = "nvim_lsp" },
}, {
{ name = "buffer" },
}, {
{ name = "copilot" },
}),
})
end,
},
}

View file

@ -1,49 +0,0 @@
return {
{
"williamboman/mason.nvim",
config = function()
require("mason").setup()
end,
},
{
"williamboman/mason-lspconfig.nvim",
config = function()
require("mason-lspconfig").setup({
ensure_installed = { "lua_ls", "marksman", "rust_analyzer", "pyright" },
})
end,
},
{
"neovim/nvim-lspconfig",
config = function()
local capabilities = require("cmp_nvim_lsp").default_capabilities()
local lspconfig = require("lspconfig")
-- lua
lspconfig.lua_ls.setup({
capabilities = capabilities,
})
-- markdown
lspconfig.marksman.setup({
capabilities = capabilities,
})
-- rust
lspconfig.rust_analyzer.setup({
capabilities = capabilities,
})
-- python
lspconfig.pyright.setup({
capabilities = capabilities,
})
vim.keymap.set("n", "K", vim.lsp.buf.hover, {})
vim.keymap.set("n", "gd", vim.lsp.buf.definition, {})
vim.keymap.set({ "n", "v" }, "<leader>c", "", { desc = "+code" })
vim.keymap.set({ "n", "v" }, "<leader>ca", vim.lsp.buf.code_action, { desc = "action" })
vim.keymap.set({ "n", "v" }, "<leader>cr", vim.lsp.buf.rename, { desc = "rename" })
end,
},
}

View file

@ -1,6 +0,0 @@
return {
"nvim-lualine/lualine.nvim",
config = function()
require("lualine").setup()
end,
}

View file

@ -1,12 +0,0 @@
return {
"nvim-neo-tree/neo-tree.nvim",
branch = "v3.x",
dependencies = {
"nvim-lua/plenary.nvim",
"nvim-tree/nvim-web-devicons",
"MunifTanjim/nui.nvim",
},
config = function()
vim.keymap.set("n", "<leader>e", ":Neotree toggle<CR>", { desc = "toggle file tree" })
end,
}

View file

@ -1,14 +0,0 @@
return {
"nvimtools/none-ls.nvim",
config = function()
local null_ls = require("null-ls")
null_ls.setup({
sources = {
null_ls.builtins.formatting.stylua,
},
})
vim.keymap.set("n", "<leader>cf", vim.lsp.buf.format, { desc = "format" })
end,
}

View file

@ -1,39 +0,0 @@
return {
{
"nvim-telescope/telescope.nvim",
tag = "0.1.8",
dependencies = { "nvim-lua/plenary.nvim" },
config = function()
local builtin = require("telescope.builtin")
vim.keymap.set("n", "<leader>f", builtin.find_files, { desc = "find files" })
vim.keymap.set("n", "<leader>b", builtin.buffers, { desc = "find buffers" })
vim.keymap.set("n", "<leader>/", builtin.live_grep, { desc = "live grep" })
vim.keymap.set("n", "<leader>j", builtin.jumplist, { desc = "jumplist" })
local actions = require("telescope.actions")
require("telescope").setup({
defaults = {
mappings = {
i = {
["<esc>"] = actions.close,
},
},
},
})
end,
},
{
"nvim-telescope/telescope-ui-select.nvim",
config = function()
require("telescope").setup({
extensions = {
["ui-select"] = {
require("telescope.themes").get_dropdown({}),
},
},
})
require("telescope").load_extension("ui-select")
end,
},
}

View file

@ -1,56 +0,0 @@
return {
{
"nvim-neotest/neotest",
dependencies = {
"nvim-neotest/nvim-nio",
"nvim-lua/plenary.nvim",
"antoinemadec/FixCursorHold.nvim",
"nvim-treesitter/nvim-treesitter",
},
config = function()
require("neotest").setup({
adapters = {
require("neotest-python"),
require("rustaceanvim.neotest"),
},
})
vim.keymap.set({ "n", "v" }, "<leader>t", "", { desc = "+testing" })
vim.keymap.set({ "n", "v" }, "<leader>tt", function()
require("neotest").run.run(vim.fn.expand("%"))
end, { desc = "run file" })
vim.keymap.set({ "n", "v" }, "<leader>tT", function()
require("neotest").run.run(vim.uv.cwd())
end, { desc = "run all test files" })
vim.keymap.set({ "n", "v" }, "<leader>tr", function()
require("neotest").run.run()
end, { desc = "run nearest" })
vim.keymap.set({ "n", "v" }, "<leader>tl", function()
require("neotest").run.run_last()
end, { desc = "run last" })
vim.keymap.set({ "n", "v" }, "<leader>ts", function()
require("neotest").summary.toggle()
end, { desc = "toggle summary" })
vim.keymap.set({ "n", "v" }, "<leader>to", function()
require("neotest").output.open({ enter = true, auto_close = true })
end, { desc = "show output" })
vim.keymap.set({ "n", "v" }, "<leader>to", function()
require("neotest").output_panel.toggle()
end, { desc = "toggle output panel" })
vim.keymap.set({ "n", "v" }, "<leader>ts", function()
require("neotest").run.stop()
end, { desc = "stop" })
vim.keymap.set({ "n", "v" }, "<leader>tw", function()
require("neotest").watch.toggle(vim.fn.expand("%"))
end, { desc = "toggle watch" })
end,
},
{
"nvim-neotest/neotest-python",
},
{
"mrcjkb/rustaceanvim",
version = "^5",
lazy = false,
},
}

View file

@ -1,15 +0,0 @@
return {
"nvim-treesitter/nvim-treesitter",
build = ":TSUpdate",
config = function()
local configs = require("nvim-treesitter.configs")
configs.setup({
ensure_installed = { "lua", "vim", "query", "javascript", "html", "python", "rust", "markdown" },
sync_install = false,
auto_install = true,
highlight = { enable = true },
indent = { enable = true },
})
end,
}

View file

@ -1,14 +0,0 @@
return {
"folke/which-key.nvim",
event = "VeryLazy",
opts = {},
keys = {
{
"<leader>?",
function()
require("which-key").show({ global = false })
end,
desc = "buffer local keymaps (which-key)",
},
},
}

View file

@ -1,11 +0,0 @@
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"
vim.o.cursorline = true
vim.o.expandtab = true
vim.o.number = true
vim.o.shiftwidth = 2
vim.o.softtabstop = 2
vim.o.tabstop = 2
vim.keymap.set({ "n", "v" }, "<leader>y", "\"*y", { desc = "yank to clipboard" })

View file

@ -1,3 +0,0 @@
defaults:
max_columns: 150
theme: "catppuccin-mocha"

View file

@ -1,26 +0,0 @@
set mouse=1
### catppuccin theme
set color_cmdline_bg=default
set color_cmdline_fg=254
set color_error=211
set color_info=223
set color_separator=117
set color_statusline_bg=default
set color_statusline_fg=254
set color_titleline_bg=151
set color_titleline_fg=16
set color_win_bg=default
set color_win_cur=117
set color_win_cur_sel_bg=151
set color_win_cur_sel_fg=16
set color_win_dir=254
set color_win_fg=254
set color_win_inactive_cur_sel_bg=181
set color_win_inactive_cur_sel_fg=235
set color_win_inactive_sel_bg=152
set color_win_inactive_sel_fg=235
set color_win_sel_bg=117
set color_win_sel_fg=235
set color_win_title_bg=default
set color_win_title_fg=117

View file

@ -1,5 +0,0 @@
style: {{ .chezmoi.homeDir }}/.config/glow/themes/catppuccin-mocha.json
mouse: false
pager: false
width: 80
all: false

View file

@ -1,199 +0,0 @@
{
"document": {
"block_prefix": "\n",
"block_suffix": "\n",
"color": "#cdd6f4",
"margin": 2
},
"block_quote": {
"indent": 1,
"indent_token": "│ "
},
"paragraph": {},
"list": {
"level_indent": 2
},
"heading": {
"block_suffix": "\n",
"color": "#cdd6f4",
"bold": true
},
"h1": {
"prefix": "▓▓▓ ",
"suffix": " ",
"color": "#f38ba8",
"bold": true
},
"h2": {
"prefix": "▓▓▓▓ ",
"color": "#fab387"
},
"h3": {
"prefix": "▓▓▓▓▓ ",
"color": "#f9e2af"
},
"h4": {
"prefix": "▓▓▓▓▓▓ ",
"color": "#a6e3a1"
},
"h5": {
"prefix": "▓▓▓▓▓▓▓ ",
"color": "#74c7ec"
},
"h6": {
"prefix": "▓▓▓▓▓▓▓▓ ",
"color": "#b4befe"
},
"text": {},
"strikethrough": {
"crossed_out": true
},
"emph": {
"italic": true
},
"strong": {
"bold": true
},
"hr": {
"color": "#6c7086",
"format": "\n--------\n"
},
"item": {
"block_prefix": "• "
},
"enumeration": {
"block_prefix": ". "
},
"task": {
"ticked": "[✓] ",
"unticked": "[ ] "
},
"link": {
"color": "#89b4fa",
"underline": true
},
"link_text": {
"color": "#b4befe",
"bold": true
},
"image": {
"color": "#89b4fa",
"underline": true
},
"image_text": {
"color": "#b4befe",
"format": "Image: {{.text}} →"
},
"code": {
"prefix": " ",
"suffix": " ",
"color": "#eba0ac",
"background_color": "#181825"
},
"code_block": {
"color": "#181825",
"margin": 2,
"chroma": {
"text": {
"color": "#cdd6f4"
},
"error": {
"color": "#cdd6f4",
"background_color": "#f38ba8"
},
"comment": {
"color": "#6c7086"
},
"comment_preproc": {
"color": "#89b4fa"
},
"keyword": {
"color": "#cba6f7"
},
"keyword_reserved": {
"color": "#cba6f7"
},
"keyword_namespace": {
"color": "#f9e2af"
},
"keyword_type": {
"color": "#f9e2af"
},
"operator": {
"color": "#89dceb"
},
"punctuation": {
"color": "#9399b2"
},
"name": {
"color": "#b4befe"
},
"name_builtin": {
"color": "#fab387"
},
"name_tag": {
"color": "#cba6f7"
},
"name_attribute": {
"color": "#f9e2af"
},
"name_class": {
"color": "#f9e2af"
},
"name_constant": {
"color": "#f9e2af"
},
"name_decorator": {
"color": "#f5c2e7"
},
"name_exception": {},
"name_function": {
"color": "#89b4fa"
},
"name_other": {},
"literal": {},
"literal_number": {
"color": "#fab387"
},
"literal_date": {},
"literal_string": {
"color": "#a6e3a1"
},
"literal_string_escape": {
"color": "#f5c2e7"
},
"generic_deleted": {
"color": "#f38ba8"
},
"generic_emph": {
"color": "#cdd6f4",
"italic": true
},
"generic_inserted": {
"color": "#a6e3a1"
},
"generic_strong": {
"color": "#cdd6f4",
"bold": true
},
"generic_subheading": {
"color": "#89dceb"
},
"background": {
"background_color": "#181825"
}
}
},
"table": {
"center_separator": "┼",
"column_separator": "│",
"row_separator": "─"
},
"definition_list": {},
"definition_term": {},
"definition_description": {
"block_prefix": "\n🠶 "
},
"html_block": {},
"html_span": {}
}

View file

@ -1,9 +0,0 @@
aliases:
dp: deployments
sec: v1/secrets
jo: jobs
cr: clusterroles
crb: clusterrolebindings
ro: roles
rb: rolebindings
np: networkpolicies

View file

@ -1,44 +0,0 @@
k9s:
liveViewAutoRefresh: false
screenDumpDir: {{ .chezmoi.homeDir }}/Library/Application Support/k9s/screen-dumps
refreshRate: 2
maxConnRetry: 5
readOnly: false
noExitOnCtrlC: false
portForwardAddress: localhost
ui:
skin: catppuccin-mocha
enableMouse: false
headless: false
logoless: false
crumbsless: false
reactive: false
noIcons: false
defaultsToFullScreen: false
skipLatestRevCheck: false
disablePodCounting: false
shellPod:
image: busybox:1.35.0
namespace: default
limits:
cpu: 100m
memory: 100Mi
imageScans:
enable: false
exclusions:
namespaces: []
labels: {}
logger:
tail: 100
buffer: 5000
sinceSeconds: -1
textWrap: false
disableAutoscroll: false
showTime: false
thresholds:
cpu:
critical: 90
warn: 70
memory:
critical: 90
warn: 70

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#c6d0f5'
bgColor: default
logoColor: '#ca9ee6'
prompt:
fgColor: '#c6d0f5'
bgColor: default
suggestColor: '#8caaee'
help:
fgColor: '#c6d0f5'
bgColor: default
sectionColor: '#a6d189'
keyColor: '#8caaee'
numKeyColor: '#ea999c'
frame:
title:
fgColor: '#81c8be'
bgColor: default
highlightColor: '#f4b8e4'
counterColor: '#e5c890'
filterColor: '#a6d189'
border:
fgColor: '#ca9ee6'
focusColor: '#babbf1'
menu:
fgColor: '#c6d0f5'
keyColor: '#8caaee'
numKeyColor: '#ea999c'
crumbs:
fgColor: '#303446'
bgColor: default
activeColor: '#eebebe'
status:
newColor: '#8caaee'
modifyColor: '#babbf1'
addColor: '#a6d189'
pendingColor: '#ef9f76'
errorColor: '#e78284'
highlightColor: '#99d1db'
killColor: '#ca9ee6'
completedColor: '#737994'
info:
fgColor: '#ef9f76'
sectionColor: '#c6d0f5'
views:
table:
fgColor: '#c6d0f5'
bgColor: default
cursorFgColor: '#414559'
cursorBgColor: '#51576d'
markColor: '#f2d5cf'
header:
fgColor: '#e5c890'
bgColor: default
sorterColor: '#99d1db'
xray:
fgColor: '#c6d0f5'
bgColor: default
cursorColor: '#51576d'
cursorTextColor: '#303446'
graphicColor: '#f4b8e4'
charts:
bgColor: default
chartBgColor: default
dialBgColor: default
defaultDialColors:
- '#a6d189'
- '#e78284'
defaultChartColors:
- '#a6d189'
- '#e78284'
resourceColors:
cpu:
- '#ca9ee6'
- '#8caaee'
mem:
- '#e5c890'
- '#ef9f76'
yaml:
keyColor: '#8caaee'
valueColor: '#c6d0f5'
colonColor: '#a5adce'
logs:
fgColor: '#c6d0f5'
bgColor: default
indicator:
fgColor: '#babbf1'
bgColor: default
toggleOnColor: '#a6d189'
toggleOffColor: '#a5adce'
dialog:
fgColor: '#e5c890'
bgColor: default
buttonFgColor: '#303446'
buttonBgColor: default
buttonFocusFgColor: '#303446'
buttonFocusBgColor: '#f4b8e4'
labelFgColor: '#f2d5cf'
fieldFgColor: '#c6d0f5'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#c6d0f5'
bgColor: '#303446'
logoColor: '#ca9ee6'
prompt:
fgColor: '#c6d0f5'
bgColor: '#292c3c'
suggestColor: '#8caaee'
help:
fgColor: '#c6d0f5'
bgColor: '#303446'
sectionColor: '#a6d189'
keyColor: '#8caaee'
numKeyColor: '#ea999c'
frame:
title:
fgColor: '#81c8be'
bgColor: '#303446'
highlightColor: '#f4b8e4'
counterColor: '#e5c890'
filterColor: '#a6d189'
border:
fgColor: '#ca9ee6'
focusColor: '#babbf1'
menu:
fgColor: '#c6d0f5'
keyColor: '#8caaee'
numKeyColor: '#ea999c'
crumbs:
fgColor: '#303446'
bgColor: '#ea999c'
activeColor: '#eebebe'
status:
newColor: '#8caaee'
modifyColor: '#babbf1'
addColor: '#a6d189'
pendingColor: '#ef9f76'
errorColor: '#e78284'
highlightColor: '#99d1db'
killColor: '#ca9ee6'
completedColor: '#737994'
info:
fgColor: '#ef9f76'
sectionColor: '#c6d0f5'
views:
table:
fgColor: '#c6d0f5'
bgColor: '#303446'
cursorFgColor: '#414559'
cursorBgColor: '#51576d'
markColor: '#f2d5cf'
header:
fgColor: '#e5c890'
bgColor: '#303446'
sorterColor: '#99d1db'
xray:
fgColor: '#c6d0f5'
bgColor: '#303446'
cursorColor: '#51576d'
cursorTextColor: '#303446'
graphicColor: '#f4b8e4'
charts:
bgColor: '#303446'
chartBgColor: '#303446'
dialBgColor: '#303446'
defaultDialColors:
- '#a6d189'
- '#e78284'
defaultChartColors:
- '#a6d189'
- '#e78284'
resourceColors:
cpu:
- '#ca9ee6'
- '#8caaee'
mem:
- '#e5c890'
- '#ef9f76'
yaml:
keyColor: '#8caaee'
valueColor: '#c6d0f5'
colonColor: '#a5adce'
logs:
fgColor: '#c6d0f5'
bgColor: '#303446'
indicator:
fgColor: '#babbf1'
bgColor: '#303446'
toggleOnColor: '#a6d189'
toggleOffColor: '#a5adce'
dialog:
fgColor: '#e5c890'
bgColor: '#949cbb'
buttonFgColor: '#303446'
buttonBgColor: '#838ba7'
buttonFocusFgColor: '#303446'
buttonFocusBgColor: '#f4b8e4'
labelFgColor: '#f2d5cf'
fieldFgColor: '#c6d0f5'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#4c4f69'
bgColor: default
logoColor: '#8839ef'
prompt:
fgColor: '#4c4f69'
bgColor: default
suggestColor: '#1e66f5'
help:
fgColor: '#4c4f69'
bgColor: default
sectionColor: '#40a02b'
keyColor: '#1e66f5'
numKeyColor: '#e64553'
frame:
title:
fgColor: '#179299'
bgColor: default
highlightColor: '#ea76cb'
counterColor: '#df8e1d'
filterColor: '#40a02b'
border:
fgColor: '#8839ef'
focusColor: '#7287fd'
menu:
fgColor: '#4c4f69'
keyColor: '#1e66f5'
numKeyColor: '#e64553'
crumbs:
fgColor: '#eff1f5'
bgColor: default
activeColor: '#dd7878'
status:
newColor: '#1e66f5'
modifyColor: '#7287fd'
addColor: '#40a02b'
pendingColor: '#fe640b'
errorColor: '#d20f39'
highlightColor: '#04a5e5'
killColor: '#8839ef'
completedColor: '#9ca0b0'
info:
fgColor: '#fe640b'
sectionColor: '#4c4f69'
views:
table:
fgColor: '#4c4f69'
bgColor: default
cursorFgColor: '#ccd0da'
cursorBgColor: '#bcc0cc'
markColor: '#dc8a78'
header:
fgColor: '#df8e1d'
bgColor: default
sorterColor: '#04a5e5'
xray:
fgColor: '#4c4f69'
bgColor: default
cursorColor: '#bcc0cc'
cursorTextColor: '#eff1f5'
graphicColor: '#ea76cb'
charts:
bgColor: default
chartBgColor: default
dialBgColor: default
defaultDialColors:
- '#40a02b'
- '#d20f39'
defaultChartColors:
- '#40a02b'
- '#d20f39'
resourceColors:
cpu:
- '#8839ef'
- '#1e66f5'
mem:
- '#df8e1d'
- '#fe640b'
yaml:
keyColor: '#1e66f5'
valueColor: '#4c4f69'
colonColor: '#6c6f85'
logs:
fgColor: '#4c4f69'
bgColor: default
indicator:
fgColor: '#7287fd'
bgColor: default
toggleOnColor: '#40a02b'
toggleOffColor: '#6c6f85'
dialog:
fgColor: '#df8e1d'
bgColor: default
buttonFgColor: '#eff1f5'
buttonBgColor: default
buttonFocusFgColor: '#eff1f5'
buttonFocusBgColor: '#ea76cb'
labelFgColor: '#dc8a78'
fieldFgColor: '#4c4f69'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#4c4f69'
bgColor: '#eff1f5'
logoColor: '#8839ef'
prompt:
fgColor: '#4c4f69'
bgColor: '#e6e9ef'
suggestColor: '#1e66f5'
help:
fgColor: '#4c4f69'
bgColor: '#eff1f5'
sectionColor: '#40a02b'
keyColor: '#1e66f5'
numKeyColor: '#e64553'
frame:
title:
fgColor: '#179299'
bgColor: '#eff1f5'
highlightColor: '#ea76cb'
counterColor: '#df8e1d'
filterColor: '#40a02b'
border:
fgColor: '#8839ef'
focusColor: '#7287fd'
menu:
fgColor: '#4c4f69'
keyColor: '#1e66f5'
numKeyColor: '#e64553'
crumbs:
fgColor: '#eff1f5'
bgColor: '#e64553'
activeColor: '#dd7878'
status:
newColor: '#1e66f5'
modifyColor: '#7287fd'
addColor: '#40a02b'
pendingColor: '#fe640b'
errorColor: '#d20f39'
highlightColor: '#04a5e5'
killColor: '#8839ef'
completedColor: '#9ca0b0'
info:
fgColor: '#fe640b'
sectionColor: '#4c4f69'
views:
table:
fgColor: '#4c4f69'
bgColor: '#eff1f5'
cursorFgColor: '#ccd0da'
cursorBgColor: '#bcc0cc'
markColor: '#dc8a78'
header:
fgColor: '#df8e1d'
bgColor: '#eff1f5'
sorterColor: '#04a5e5'
xray:
fgColor: '#4c4f69'
bgColor: '#eff1f5'
cursorColor: '#bcc0cc'
cursorTextColor: '#eff1f5'
graphicColor: '#ea76cb'
charts:
bgColor: '#eff1f5'
chartBgColor: '#eff1f5'
dialBgColor: '#eff1f5'
defaultDialColors:
- '#40a02b'
- '#d20f39'
defaultChartColors:
- '#40a02b'
- '#d20f39'
resourceColors:
cpu:
- '#8839ef'
- '#1e66f5'
mem:
- '#df8e1d'
- '#fe640b'
yaml:
keyColor: '#1e66f5'
valueColor: '#4c4f69'
colonColor: '#6c6f85'
logs:
fgColor: '#4c4f69'
bgColor: '#eff1f5'
indicator:
fgColor: '#7287fd'
bgColor: '#eff1f5'
toggleOnColor: '#40a02b'
toggleOffColor: '#6c6f85'
dialog:
fgColor: '#df8e1d'
bgColor: '#7c7f93'
buttonFgColor: '#eff1f5'
buttonBgColor: '#8c8fa1'
buttonFocusFgColor: '#eff1f5'
buttonFocusBgColor: '#ea76cb'
labelFgColor: '#dc8a78'
fieldFgColor: '#4c4f69'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#cad3f5'
bgColor: default
logoColor: '#c6a0f6'
prompt:
fgColor: '#cad3f5'
bgColor: default
suggestColor: '#8aadf4'
help:
fgColor: '#cad3f5'
bgColor: default
sectionColor: '#a6da95'
keyColor: '#8aadf4'
numKeyColor: '#ee99a0'
frame:
title:
fgColor: '#8bd5ca'
bgColor: default
highlightColor: '#f5bde6'
counterColor: '#eed49f'
filterColor: '#a6da95'
border:
fgColor: '#c6a0f6'
focusColor: '#b7bdf8'
menu:
fgColor: '#cad3f5'
keyColor: '#8aadf4'
numKeyColor: '#ee99a0'
crumbs:
fgColor: '#24273a'
bgColor: default
activeColor: '#f0c6c6'
status:
newColor: '#8aadf4'
modifyColor: '#b7bdf8'
addColor: '#a6da95'
pendingColor: '#f5a97f'
errorColor: '#ed8796'
highlightColor: '#91d7e3'
killColor: '#c6a0f6'
completedColor: '#6e738d'
info:
fgColor: '#f5a97f'
sectionColor: '#cad3f5'
views:
table:
fgColor: '#cad3f5'
bgColor: default
cursorFgColor: '#363a4f'
cursorBgColor: '#494d64'
markColor: '#f4dbd6'
header:
fgColor: '#eed49f'
bgColor: default
sorterColor: '#91d7e3'
xray:
fgColor: '#cad3f5'
bgColor: default
cursorColor: '#494d64'
cursorTextColor: '#24273a'
graphicColor: '#f5bde6'
charts:
bgColor: default
chartBgColor: default
dialBgColor: default
defaultDialColors:
- '#a6da95'
- '#ed8796'
defaultChartColors:
- '#a6da95'
- '#ed8796'
resourceColors:
cpu:
- '#c6a0f6'
- '#8aadf4'
mem:
- '#eed49f'
- '#f5a97f'
yaml:
keyColor: '#8aadf4'
valueColor: '#cad3f5'
colonColor: '#a5adcb'
logs:
fgColor: '#cad3f5'
bgColor: default
indicator:
fgColor: '#b7bdf8'
bgColor: default
toggleOnColor: '#a6da95'
toggleOffColor: '#a5adcb'
dialog:
fgColor: '#eed49f'
bgColor: default
buttonFgColor: '#24273a'
buttonBgColor: default
buttonFocusFgColor: '#24273a'
buttonFocusBgColor: '#f5bde6'
labelFgColor: '#f4dbd6'
fieldFgColor: '#cad3f5'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#cad3f5'
bgColor: '#24273a'
logoColor: '#c6a0f6'
prompt:
fgColor: '#cad3f5'
bgColor: '#1e2030'
suggestColor: '#8aadf4'
help:
fgColor: '#cad3f5'
bgColor: '#24273a'
sectionColor: '#a6da95'
keyColor: '#8aadf4'
numKeyColor: '#ee99a0'
frame:
title:
fgColor: '#8bd5ca'
bgColor: '#24273a'
highlightColor: '#f5bde6'
counterColor: '#eed49f'
filterColor: '#a6da95'
border:
fgColor: '#c6a0f6'
focusColor: '#b7bdf8'
menu:
fgColor: '#cad3f5'
keyColor: '#8aadf4'
numKeyColor: '#ee99a0'
crumbs:
fgColor: '#24273a'
bgColor: '#ee99a0'
activeColor: '#f0c6c6'
status:
newColor: '#8aadf4'
modifyColor: '#b7bdf8'
addColor: '#a6da95'
pendingColor: '#f5a97f'
errorColor: '#ed8796'
highlightColor: '#91d7e3'
killColor: '#c6a0f6'
completedColor: '#6e738d'
info:
fgColor: '#f5a97f'
sectionColor: '#cad3f5'
views:
table:
fgColor: '#cad3f5'
bgColor: '#24273a'
cursorFgColor: '#363a4f'
cursorBgColor: '#494d64'
markColor: '#f4dbd6'
header:
fgColor: '#eed49f'
bgColor: '#24273a'
sorterColor: '#91d7e3'
xray:
fgColor: '#cad3f5'
bgColor: '#24273a'
cursorColor: '#494d64'
cursorTextColor: '#24273a'
graphicColor: '#f5bde6'
charts:
bgColor: '#24273a'
chartBgColor: '#24273a'
dialBgColor: '#24273a'
defaultDialColors:
- '#a6da95'
- '#ed8796'
defaultChartColors:
- '#a6da95'
- '#ed8796'
resourceColors:
cpu:
- '#c6a0f6'
- '#8aadf4'
mem:
- '#eed49f'
- '#f5a97f'
yaml:
keyColor: '#8aadf4'
valueColor: '#cad3f5'
colonColor: '#a5adcb'
logs:
fgColor: '#cad3f5'
bgColor: '#24273a'
indicator:
fgColor: '#b7bdf8'
bgColor: '#24273a'
toggleOnColor: '#a6da95'
toggleOffColor: '#a5adcb'
dialog:
fgColor: '#eed49f'
bgColor: '#939ab7'
buttonFgColor: '#24273a'
buttonBgColor: '#8087a2'
buttonFocusFgColor: '#24273a'
buttonFocusBgColor: '#f5bde6'
labelFgColor: '#f4dbd6'
fieldFgColor: '#cad3f5'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#cdd6f4'
bgColor: default
logoColor: '#cba6f7'
prompt:
fgColor: '#cdd6f4'
bgColor: default
suggestColor: '#89b4fa'
help:
fgColor: '#cdd6f4'
bgColor: default
sectionColor: '#a6e3a1'
keyColor: '#89b4fa'
numKeyColor: '#eba0ac'
frame:
title:
fgColor: '#94e2d5'
bgColor: default
highlightColor: '#f5c2e7'
counterColor: '#f9e2af'
filterColor: '#a6e3a1'
border:
fgColor: '#cba6f7'
focusColor: '#b4befe'
menu:
fgColor: '#cdd6f4'
keyColor: '#89b4fa'
numKeyColor: '#eba0ac'
crumbs:
fgColor: '#1e1e2e'
bgColor: default
activeColor: '#f2cdcd'
status:
newColor: '#89b4fa'
modifyColor: '#b4befe'
addColor: '#a6e3a1'
pendingColor: '#fab387'
errorColor: '#f38ba8'
highlightColor: '#89dceb'
killColor: '#cba6f7'
completedColor: '#6c7086'
info:
fgColor: '#fab387'
sectionColor: '#cdd6f4'
views:
table:
fgColor: '#cdd6f4'
bgColor: default
cursorFgColor: '#313244'
cursorBgColor: '#45475a'
markColor: '#f5e0dc'
header:
fgColor: '#f9e2af'
bgColor: default
sorterColor: '#89dceb'
xray:
fgColor: '#cdd6f4'
bgColor: default
cursorColor: '#45475a'
cursorTextColor: '#1e1e2e'
graphicColor: '#f5c2e7'
charts:
bgColor: default
chartBgColor: default
dialBgColor: default
defaultDialColors:
- '#a6e3a1'
- '#f38ba8'
defaultChartColors:
- '#a6e3a1'
- '#f38ba8'
resourceColors:
cpu:
- '#cba6f7'
- '#89b4fa'
mem:
- '#f9e2af'
- '#fab387'
yaml:
keyColor: '#89b4fa'
valueColor: '#cdd6f4'
colonColor: '#a6adc8'
logs:
fgColor: '#cdd6f4'
bgColor: default
indicator:
fgColor: '#b4befe'
bgColor: default
toggleOnColor: '#a6e3a1'
toggleOffColor: '#a6adc8'
dialog:
fgColor: '#f9e2af'
bgColor: default
buttonFgColor: '#1e1e2e'
buttonBgColor: default
buttonFocusFgColor: '#1e1e2e'
buttonFocusBgColor: '#f5c2e7'
labelFgColor: '#f5e0dc'
fieldFgColor: '#cdd6f4'

View file

@ -1,100 +0,0 @@
k9s:
body:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
logoColor: '#cba6f7'
prompt:
fgColor: '#cdd6f4'
bgColor: '#181825'
suggestColor: '#89b4fa'
help:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
sectionColor: '#a6e3a1'
keyColor: '#89b4fa'
numKeyColor: '#eba0ac'
frame:
title:
fgColor: '#94e2d5'
bgColor: '#1e1e2e'
highlightColor: '#f5c2e7'
counterColor: '#f9e2af'
filterColor: '#a6e3a1'
border:
fgColor: '#cba6f7'
focusColor: '#b4befe'
menu:
fgColor: '#cdd6f4'
keyColor: '#89b4fa'
numKeyColor: '#eba0ac'
crumbs:
fgColor: '#1e1e2e'
bgColor: '#eba0ac'
activeColor: '#f2cdcd'
status:
newColor: '#89b4fa'
modifyColor: '#b4befe'
addColor: '#a6e3a1'
pendingColor: '#fab387'
errorColor: '#f38ba8'
highlightColor: '#89dceb'
killColor: '#cba6f7'
completedColor: '#6c7086'
info:
fgColor: '#fab387'
sectionColor: '#cdd6f4'
views:
table:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
cursorFgColor: '#313244'
cursorBgColor: '#45475a'
markColor: '#f5e0dc'
header:
fgColor: '#f9e2af'
bgColor: '#1e1e2e'
sorterColor: '#89dceb'
xray:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
cursorColor: '#45475a'
cursorTextColor: '#1e1e2e'
graphicColor: '#f5c2e7'
charts:
bgColor: '#1e1e2e'
chartBgColor: '#1e1e2e'
dialBgColor: '#1e1e2e'
defaultDialColors:
- '#a6e3a1'
- '#f38ba8'
defaultChartColors:
- '#a6e3a1'
- '#f38ba8'
resourceColors:
cpu:
- '#cba6f7'
- '#89b4fa'
mem:
- '#f9e2af'
- '#fab387'
yaml:
keyColor: '#89b4fa'
valueColor: '#cdd6f4'
colonColor: '#a6adc8'
logs:
fgColor: '#cdd6f4'
bgColor: '#1e1e2e'
indicator:
fgColor: '#b4befe'
bgColor: '#1e1e2e'
toggleOnColor: '#a6e3a1'
toggleOffColor: '#a6adc8'
dialog:
fgColor: '#f9e2af'
bgColor: '#9399b2'
buttonFgColor: '#1e1e2e'
buttonBgColor: '#7f849c'
buttonFocusFgColor: '#1e1e2e'
buttonFocusBgColor: '#f5c2e7'
labelFgColor: '#f5e0dc'
fieldFgColor: '#cdd6f4'

View file

@ -1,9 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBrZy9talpnbS9zRUpNV0RC
YmExd1FYUkdtekVwa241dUhWUWxpSy83c1ZzCmhLRnZlcHozaVhNaUVPUVA3L0wx
dExBZXZMRk4xL1Y5Q3Bjd2M1VHQwb2cKLS0tIDZha0hwR0FnaDJXNXhIcTk3dFBa
blV4dGlSUFpyd3BOYks3MGlZTW55U2cKpSgRsX6cHEDJdbAhkiTzESJsEYJvQECE
18UYtpibMeVdHnGh9/J4qkH7RNLGu/o+IsIJlIN+2ALNXkRTgnwska7di8FlgN+X
OBAf03DbwILRRf9rFqdgehzD7TsiVX1DbFQm8986//FhPVrblA9N3sRlGvywatDG
CJujmkqXSBSCTimvM+ECYUWB6Q==
-----END AGE ENCRYPTED FILE-----

View file

@ -1,9 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBxNkVwT0lIQUMxS0t5ZCt1
dkV4aXB2QU02NFZydFI0andWZklTbUp6OGk4CkcvdWJXeUorczZDNGw0VTg5YTl2
NHJLNGRYbVdwdTZWL2RhT0E1RUtZaU0KLS0tIERHZGpEY0gySFNHTXlqblV5QVpz
alFhVUtXQ3ErR0hSdytxWmM5c2dja1UKkqMyi5ZSf/PRT1JUm+FstxOp3Z8DJovv
xZMuAj85RWL0yXMe8mcLupxkxuT3eKbCvkKWP5Ot+YX1p3npVGGceQ4a7frs9QRj
fi+YZx8LOEUu5m1OiMYqYVrRDyTvMiHhJjQ3lKl2ikoWLnE9AFkx0EOsRzVFGv6G
AbxHzYuhDAw8DvCBbsu0FORLB0gN+uxwfg==
-----END AGE ENCRYPTED FILE-----

View file

@ -1,19 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBoNGxzeUdqNkE4TTZEek9y
a2oybWwzNlZXbGhrMmJybkwyT1JGRkkvWFQ4CjUwbkNjVnByQTJ1d2FsbHV6dUpT
cnJzZUoxY0d5L2dETit5aWYrZUdHelkKLS0tIEZ1Q2RQSlBMZ0V0QzFxdlBqekJp
TXdLK3RRSEtmWGZ2aWZkK2hobWx4aVUKz8hAJq2YWa5kMZYt/5Di6pK1on+x8zeH
sLETXqtVU0bSKkFIizRfk+6rlt+34oTumuPeHXeL1/o4ks8aYyTCZfxN1/zmopS5
gi79LXdJVZATnwrNZ5MpBYHmI0VhMclhnt5K17yiEpDOFwwSTt7xJetZtLUP/uNw
pxvKexRE+lRWSesS3kG7Z8jfFHxAOAmrhlkXsmUfKuLCCSdb3bBVDnKTgL4iN8DP
ZF2lktkGdP5azhJ21KD4nTtYacwGKJuEEpOK5Ly8184ucOOtn1CbAb8keUbvpURO
ms/ROKDyBtBLb3jKZTSWfwFHNExC/H0qgXQAqnpWXWlki/1BbnFU+DX76b3zKHwo
K7e8IMygflCe+XOAy9jKi7hv0x+vYvPUBU7W9kVP/f073aewm3lnbz6/rGfKCaUR
YyFlJ5FcrOV4PLoXLvItd84qUyHPNusSyQHsjAb3CMirgZjFreLN0SJUi+eu8Y0G
l1IIK1BuDQleJVbrj67c/WW3sRHSoeB3UAKu3Ch4BokO3B7YTt1vk1eRPaHKMat7
NvvAapJLKr+QMkX0KO5Hi2do4KPleBGfLTKuXh/q3Tq4G8ZdBokDu8r3k6gQcInK
gxkdyE4RNcAsKkV0NcSQ6jA+MMfo6mVp0RfMG/u0swDfk+wPzUvSBlFR7EJ4LKtS
b90bBIxj7nlC6T5mLR9OOhehsnGfgwZjFg4wKVAYsYkdWlXJWmqf/aBDdmysJh6Q
FBVUG+cnePUJxoIsleuw5bq+S0xKBj4vhOXvCLpoPsA1rAIOA3u9DPO39/m/ELv1
T1IdOgQuoHdqpDPiBtiut7j3k7o7KL8XU2WB9JsdCMZCXtlKWOvu7QsQwrGya8/I
-----END AGE ENCRYPTED FILE-----

View file

@ -1,3 +0,0 @@
{{ if eq .chezmoi.os "darwin" -}}
Include ~/.orbstack/ssh/config
{{ end }}

View file

@ -1,12 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA1Y1Z4ZEpoK2RidUgrZFFV
VElqZDlNdXZ3czRwSVZiSWx3WnZGUFIrbkZzCnhTMG1MUWMraFVwSjFNQUFvMjhU
RUFHZE1nTDBwRGt4MXNHTUxVZFhUTUEKLS0tIDNsSjlsMWlSbnlRbTM5TmFVVmQy
am9LSzI0SjBBZ3pXSVhxQnlzTWR5ZFEKrx4z3Usu6NUqMyuM0UJeGa3X7SJed50o
lNYgdEatTd52LmkBDBeId4uilJU4Hw7g+NK80uxLgsXyjjfI+FznigNl8Ofd6n57
uPMuLj2shrslWRYoLq3Dtw03X/q/2eUuJPG9T7H98RQvsEl/N7zekymgoXUFT44v
eRZBr5mg5i57sX539Z1jZmmaWEcPyR9OYFSRCrtRATOEF520hU2LTxIRSxF194/e
NzGh6lrvK/m8VGClGHk/UqdItH5S6+dAg+P4v2FSFQwls/uzq9j0n/bK0A06F6Vs
lL+mSumS9d+zvXzsu0iHLSoECP31kAfNuWPj9j0WCekISdwJmoXR+gp3iCf6IUOh
w0vP1Vsz4cIWUC6SgoK2rrWqmfSkD2TFPom3MzFhr3yw+60LwtYZQ3LzIJQQ
-----END AGE ENCRYPTED FILE-----

View file

@ -1,9 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAzZlFZSzBiYXVpdzl5VGR6
OWZYTk8zaVBxZE4yK1dNN2ZqMWtyMmlzY2lZCkhSM3ZGbkgwTXlVR0RNbFZPM3ps
R21IM2N5d2RXQmt4RUY3RUV1YjZmTVEKLS0tIEJSK2ZocWFPUE40OGlBN3I1TCtR
QWhjVGVPMk1LdVNzeCtSYTA5NzQ2d1UKKff/PWU7776PpbUztvJE3X8AnG+CKfW/
l/Ha2puxfpa30d0gD9TeeqiEYFgGAujHinV4NvrsbLrWbia8tM3Ycl+wiCF2fdAh
oerskCiUow212eOXwIUEYKobe/pWjVka6ZOPOrviwVLlwAjMBtF9y+G6M2v/g6nK
lt03ojnwkFLWd8UTJyFKqZeFMlA=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,22 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwekJ1R1Z6M0hLN2pESFBY
NW1BYjFPTjNKMEFaeFJsdWtzK2lnQkl3emdzCitrREJ3RGd4TWh0R25yaDRRd0pi
bDlrbG1ucDV2SXd5NklMeUx3K2F0Z0UKLS0tIDZTUjBYV1Q1TDh4RVJQUzlTUENS
YllMcXlQalVoUkY5VzN6bWJTakt4L2cKlYHzGnnjKZQpZzc7NdjrRsXum2tfcjwk
T45iSastj8gFQLbB3fIElsprJAgCPhu0jcWtbvgiFpESRlmThzP1wWf9DmgDNnHI
68IBPaM4Ru6PWBY6HTMQ4EsyzFrnuKj8ZM/RYF7fjOmKG/K1hYB7+iqwR3tlt1D2
6Cryn5qLU0Ou68nwnsXdFIcPEolVvMX4XsGrSaSnprNVF3hCW9vtYEdjJvIgKNUz
3xX+J3MfGIR+oSfYb6o81aA9F5xS2obbPaBIW04x9ZQ4ik20GiYt+gI2H3QTOp7z
+/Je1HIF2/biWwP7qgdbusAd+XFbwPs4wh/M3XEqiEVcY+MvshmWUbjShjYq0c0e
ySqF+ZPSw0NKg50O+avZeH1LxPXqshr2RHpGDNFGHaJRIKse0W1hNPZ5rj8daJj1
f8eIcfZ4fcIAgci3Je5PZHdErEnhU2LsvTEeGuINdNjiEpV+YqMEhZlKE2h0sdeF
oYRQt8enCCqFEizMTm1CQRcix7WYLx2CCJEbH8jnDlnlJnNRQ4utHA+q8c0ERndz
iDtgbjhktDgNRtXx/gvf9Fu1Jh4fHz2brFTIeuI27hy9OmtcNF5Z2U+86K3QkGyr
Dp3NFQUXlkv5NLDeCACbsqE99BBfczhliVFCeR1WaUtriNbXkzO17KDy7vI7XUwb
+V4OW7y5+2v4UQX4GbhViUSioxIfjil5NHXYIXIhlk2QB50odvbkfhfEboir0+vC
fx1+9SzZB+Krp+/29u+mN357OSRTWMkZephjUCPP42rOqe+WYFBVLQJ60JAHsyye
Vb9ge7FPCHHO7TmzD2a5rWU3u0Mzh5l8x0KoVoaP7PZnmQmFJ8TdRAGaMowH/Ej+
IiHbStLtMqLpRtHMou5+wC+oIJW6mgJCS8m+dJPG522xHpDnTmg3rHRax771i9SP
fpL9OPDcqCQABCU8iTL1K/iisj/1+0sjV3ojBZb6FTk14rrJyCes6BgVU46Yr19T
i52qXa5Pq0i1V4Md72ucws8Y7qaOjkNd/5Zrzy/7qOh7Iuv1fLo=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,22 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzMEJ4N2R4bFlLR1JIdEVO
Vm93M0h3QmE2c05jRG1CaVJXamVrQWVtQVUwCml0b0xWdExQQ2oxd1p0ODBPcnJa
U1RQR080cHI2VGVmUWt2SWxHVGZrREkKLS0tIDdwMTZJWVQrZFFqSlpJT3Q5VDZz
MXJPWGs1enAvUjNmMC9MbitqREVhZzAK5TvmoMNf7PPPYRjTY/ysv6s6ryX8b/eK
6wuJRiWLEYUlB5cZrMRZuJMJF2v/zXdooyglEsd+cLMac0PEYb+RL6Ao9HZR1lS5
ZW482zkYS2WTOey2wp8kcqPeMIybWcbBXc1P9fE5+skLnVmmHicV2kH8ZJ2jksk+
95Mitr+RjUrVhYVP0pY6uNQex3As1OYaipBr/H9/VVM56t1lee8tREnpjWw4V22A
QbwQn0CHZAug1ZUkrERDAdV+1WLpNrtcADyoOGX1j1FG5UzQzEE4K++Al2QOawQL
YoTvEXvHMyz30zmToZmI6hLQWxp6mkYcSMbJVf472v2Nbt8NiGlU6fU6+cnnCQfw
FjykqTF1Lem+yWN+OigBVbSkZFGRMRhgHzdV53Px7qU6uivKbGHXyyp/nL4C1plM
pZnl5JSWt2ukgCKFWQGo+1ccHrUB5dBOJ/G01kmqvIk/eHMd/Qn2WYeMwKz3H7U0
DB7YDGRTo4j2lKjNUuLRf6zPng0jZ/HDXbgyjYU51R7CKS7alqPsa5d24xZ/iWpF
GYCAdMJXTWdqHj60K25F41Ym9B+dB/TUJ4uz+/ylgcoeVsBjESk22OZp1nRbJ+Ak
qC6gGuoZV9aOyrm3M00SlHOlkZzJT8ZElOTXYX4hpydCBZ5UTU9r8sjIsMTWV4FM
3e+tfG0pyF6zgy2q/X21mFBpZCwy8hgRoUHBtqS5n1+DgiFeasZbFB1tTW66Drz4
ojtOCgztU54V0LRZuTJJ7WfNDZ+LBWzbnZZfzACCe9llIkY1BbFMfN5BnCWi0zNW
7v4k+nZ+XfWXsQ3+pvAjsInDwvEcjLke/efiXfHEjQ7avsu4iRfApbEWfOazilax
uRPcvXGK30lZKPuaCPjhNmxZm7oh2+jsXSkrirx+rmTx+sLBqU+NXcDp2iZO8Eq8
ek1MGbyXi9EypJvYMs2eGbHona+YfnvP5ryZBDA8ZAP7qzKLBVrrVUej7NzD3byg
MXxBe8OOjxwhhAB+YK10jegte6SFS2sFIFLEe59kccM0qm40ZJSAOg==
-----END AGE ENCRYPTED FILE-----

View file

@ -1,22 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2SEFzdmNyTWdiSXpIZGhs
T2kxOXpXczc4VE9nWkNFbi9yelJvdmtVOEhVClVaWlZ0dUJLaXhMRCs1dW9MY1Nl
NUpNcGR3WW5vcG1tTCtTOXcwZEt0M1UKLS0tIHhvWDJDTFkzcWd2bjRoRDdzS2hs
RzBLdFZvWlc2VW1OczZOak9YMzlzZmcKARnp+EZvwPa2LvmGeI1EDaaVtroC6SKe
qEhhN3Oq8zX9jEIYJxGU49HHr+V9qS2e3v992alPdstejkuJA1sMBoEzI5UuJFDI
zZ4YUj6tJjzNQiW2L018jYfvywZRbCv55M3y63LTzHMsVIvWRcJYwf5KBDvJXK6g
Bivbxobm41KL6ftMqsPIShQwUmbitdIO2hw7ZxEQc+VXrGZeU2pU5oRSbAXxxY/p
F2OBm/mWfxrcmN7OvhjfQkp52mquK5bYCSBf41hipA+bHhRGajzzhRWuKHqaPB60
d8KEgPIDP673BAhUNH+PLkoar1b7SDX63OsMmHECkS+cdpuuXAIlm1OaTTEb5tUD
+DxXCD5W5jYQAEjNoihXgxRfXFS7ADUtn7m/xoTwAaTScZmJKXfCMFwP2aOdQFa2
eWOFFIo93+rpwFuSHNw2r2mEAd7UD3ctEWkpYfagaVT4kWJFa7aprBmi7hb3IPZa
L7KnnokXWZiVmMEuRz69eqJ5/PWM/097mg03E62bS0KHM5yz4QhD2t3ExwqdfR2g
5EYqDnvY0TtT+mJqW1SRNNOTD69Xrrud/j01GobTrDgkAZf8afUm1NXozgZJh+dl
RFqdyvbYtgmQ9VGuJyPgHlHmiCGgNuMJ6h6Q8xI+fOemvjDVZ0sOa/Upggl2Wi8+
RxbSXSw/SXBH0eOkP2Wi52U8cM6K5Q++YgG8lljYiGSwGqJ87hBSOYJme5qN5UVF
s1e2/OZEixtvtD7wFqZji699ZZwonqXWbP1g8/Wg9oOS0rFKKFpGnprMcbaZp3ac
4ioIpe5xbKyoB5phzWK1L2U6pVD7BdVSbx3S0KNvsvkQ2g9CjrsbkY/7YsKYnZMJ
CLw/paagNm/1RNJTtGi1lz6rPwsYNVE8ilq7QwbTrDUJRQaicywJpyx+uxv0FcA/
5lR1KBvURANX/8g4AOh1tD4nlHCnQXQ1w1miObJaayxuoEzvawhH6gxP3jMcfpXZ
BSZNelSQuTnErxhjtaIiWgM8ITVw7j+WigVZR080Ipl72xLA
-----END AGE ENCRYPTED FILE-----

View file

@ -1,15 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAyQVYvNlBnd1VrTXdaOXov
RVV2dTBJWTRwSnIzNkdVUm5mTStNcnFRVW40CmhJNmpaa1NQV2FEd0xBa2RSMGdF
WnhWLzAzMFl5SFJzQ3FwS3dQZWU4NkEKLS0tIDBvWUJiN3BVVy9hc3M1VE9udEpR
OG1Bc1JmRjhYNm1PU2tHL1Vrcmp4WmMKUlnXIK32N1ckGjILWLehf1rBDwzlozWV
WZ6s1JAIFsqswNTDMbrSzK9rho8B5r0blIOz0ik4imtz3NE1kNj3D8F4VnGm0m7M
TljtehOxSXLJbF5S2Gf6G1j9td0t6H6XVLHlUC0qhZkF1H+dHJoBfiGpLLYxp569
V3B8XItIpmA1oJHNTcV7HZBbdZchR/jQTUBhogmwIWU5RVPwofoIiq/ID3ack9ZZ
4YhDgjqi9fjkdxQUChjS4Sl4bekWrafuGjKZixWGofV7nlYHMNWsI5x3Y0Y60lWD
WEZbSzwq4NgtRS4l/8G1F3In40OM5/TbbVIJYzmiwkisNw0kCApeb7EOtsDsTTxx
lu9lxUbORXUelVrmcyjmllqQJ8QsNnUnAdXlQ6WeLa4UaA4xRXEHZ1es2pAMMTm9
S0RXa3ZGXHwCmaU2Qz5JgDhmnRXfTsfMnv+jjtV1xohgT1Pkwv3uOLmgCnT4K4IH
lMGfIlwcTVtS+6tDJcOW4CbRET1hhXDXR+o6FzTGNSzQE5YuO8wCEoAZ3P/9aKQC
vT7ni7KA7WwJEWXTbw+cTy/qZa2b8vPTPKOFhdKXHyD5ArRj2yUKcOwdIQ==
-----END AGE ENCRYPTED FILE-----

View file

@ -1,77 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2dTJtOXhNTXRJSW5XaVk2
cVFrZlg1bkEvWk0zMEpVTnVIQXZtYWhlRmdVCkFOTDljY3l3dVF6eitzTTZEYk9T
L2V6cWJPQnRnaGRMMkI4Q0I4K1M2bFkKLS0tIEpDQ2hKYWVPS3hvbkt3NDJuTmpa
ZXgwa24wODVLZE1IRENYTXd4SGdXdVEK/4D4Bobna1iIX2ot9uMiyO4hE4mhs9mU
QK691AjAnY0DnOC7P+ZCjMFnA3PphfwXI5AEPMYW/hq0wpNjRZfhZm2vDT/IkSjR
H2knv/AW5WwERu2HxIHETGoQQlrAm+NANeca+OWF3+OFkO1+Mpsu5Dfyr3Txmz9Z
yG8INKwmunU5SqtdpRCg/YQmwylA6Nmmw8fjFREWD+eLxvuDmUYIGBUOfetrP78l
h1Vanx9zhj85J89qAkLFaQ8uZy7NezgIUe81L7+QY98H2wwnc279tvnv/vc3QLc1
hwH9D5Pdrq6KUNBv1pG5hItLbh1yY3ho5/vMWIMXHw5LxQsE2nLHkvXGhZXN8YyM
bR0BWMH6n1w5KQHR8nnHCuJsCuFC7KUoXAwaljbbbv/xO/+uAihJu3/2RrgMgA+y
dOUtNkl9VrvXll5frAAijZzgd/JgQk3OrJGlpCxamcbPjvKok8aYfqeJa+MVr3lU
akc7lJpBE54rsHw+wR844rgdve4x5z3sSQ1sMmThVu2VvDw+SqKGbcgSu0sdARgz
c/ktCxSbC3x6j2sVv4Eie+1mtkfky9pX6GKzfvrGb6sLXtHL+nwli1F3ahP3TNK3
7y8+57Ob6/XSGfxGdRe0ylMSXPCQ7NiU8fQAKyY92larkKpBZJfaoyrYwbPmTnPP
W2Y1WtXecKKvE6S0GToMOqKkESJQhQNj57zBSGF+CjPTtuKN/WafwQy2sL9H+XxJ
JLLh4DVfdcnbmz6Kh/+hcGQbpwHcW0Lm1ZOAi+VKgCe45oaUWM5h/D7xb6C4SbAh
IXlPewrk+6TqSUSoK4GLYEaFEC4i5x+1HlouNDHSoFacMrbEgZ3KooK+/+Rcsr1J
L4j1AG6EAaxd39XtffA3a4GsgcoeXmekg5V9b/MwwmXOTjdrq5cJCU5izrQFuFEw
faTi3OgQJJDLiKbaFNzLhfD6bf9gprKFDtjr/wLE7fxHGywPG6QDFo2ARQKfYiSd
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
-----END AGE ENCRYPTED FILE-----

View file

@ -1,22 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwekJ1R1Z6M0hLN2pESFBY
NW1BYjFPTjNKMEFaeFJsdWtzK2lnQkl3emdzCitrREJ3RGd4TWh0R25yaDRRd0pi
bDlrbG1ucDV2SXd5NklMeUx3K2F0Z0UKLS0tIDZTUjBYV1Q1TDh4RVJQUzlTUENS
YllMcXlQalVoUkY5VzN6bWJTakt4L2cKlYHzGnnjKZQpZzc7NdjrRsXum2tfcjwk
T45iSastj8gFQLbB3fIElsprJAgCPhu0jcWtbvgiFpESRlmThzP1wWf9DmgDNnHI
68IBPaM4Ru6PWBY6HTMQ4EsyzFrnuKj8ZM/RYF7fjOmKG/K1hYB7+iqwR3tlt1D2
6Cryn5qLU0Ou68nwnsXdFIcPEolVvMX4XsGrSaSnprNVF3hCW9vtYEdjJvIgKNUz
3xX+J3MfGIR+oSfYb6o81aA9F5xS2obbPaBIW04x9ZQ4ik20GiYt+gI2H3QTOp7z
+/Je1HIF2/biWwP7qgdbusAd+XFbwPs4wh/M3XEqiEVcY+MvshmWUbjShjYq0c0e
ySqF+ZPSw0NKg50O+avZeH1LxPXqshr2RHpGDNFGHaJRIKse0W1hNPZ5rj8daJj1
f8eIcfZ4fcIAgci3Je5PZHdErEnhU2LsvTEeGuINdNjiEpV+YqMEhZlKE2h0sdeF
oYRQt8enCCqFEizMTm1CQRcix7WYLx2CCJEbH8jnDlnlJnNRQ4utHA+q8c0ERndz
iDtgbjhktDgNRtXx/gvf9Fu1Jh4fHz2brFTIeuI27hy9OmtcNF5Z2U+86K3QkGyr
Dp3NFQUXlkv5NLDeCACbsqE99BBfczhliVFCeR1WaUtriNbXkzO17KDy7vI7XUwb
+V4OW7y5+2v4UQX4GbhViUSioxIfjil5NHXYIXIhlk2QB50odvbkfhfEboir0+vC
fx1+9SzZB+Krp+/29u+mN357OSRTWMkZephjUCPP42rOqe+WYFBVLQJ60JAHsyye
Vb9ge7FPCHHO7TmzD2a5rWU3u0Mzh5l8x0KoVoaP7PZnmQmFJ8TdRAGaMowH/Ej+
IiHbStLtMqLpRtHMou5+wC+oIJW6mgJCS8m+dJPG522xHpDnTmg3rHRax771i9SP
fpL9OPDcqCQABCU8iTL1K/iisj/1+0sjV3ojBZb6FTk14rrJyCes6BgVU46Yr19T
i52qXa5Pq0i1V4Md72ucws8Y7qaOjkNd/5Zrzy/7qOh7Iuv1fLo=
-----END AGE ENCRYPTED FILE-----

View file

@ -1,77 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2dTJtOXhNTXRJSW5XaVk2
cVFrZlg1bkEvWk0zMEpVTnVIQXZtYWhlRmdVCkFOTDljY3l3dVF6eitzTTZEYk9T
L2V6cWJPQnRnaGRMMkI4Q0I4K1M2bFkKLS0tIEpDQ2hKYWVPS3hvbkt3NDJuTmpa
ZXgwa24wODVLZE1IRENYTXd4SGdXdVEK/4D4Bobna1iIX2ot9uMiyO4hE4mhs9mU
QK691AjAnY0DnOC7P+ZCjMFnA3PphfwXI5AEPMYW/hq0wpNjRZfhZm2vDT/IkSjR
H2knv/AW5WwERu2HxIHETGoQQlrAm+NANeca+OWF3+OFkO1+Mpsu5Dfyr3Txmz9Z
yG8INKwmunU5SqtdpRCg/YQmwylA6Nmmw8fjFREWD+eLxvuDmUYIGBUOfetrP78l
h1Vanx9zhj85J89qAkLFaQ8uZy7NezgIUe81L7+QY98H2wwnc279tvnv/vc3QLc1
hwH9D5Pdrq6KUNBv1pG5hItLbh1yY3ho5/vMWIMXHw5LxQsE2nLHkvXGhZXN8YyM
bR0BWMH6n1w5KQHR8nnHCuJsCuFC7KUoXAwaljbbbv/xO/+uAihJu3/2RrgMgA+y
dOUtNkl9VrvXll5frAAijZzgd/JgQk3OrJGlpCxamcbPjvKok8aYfqeJa+MVr3lU
akc7lJpBE54rsHw+wR844rgdve4x5z3sSQ1sMmThVu2VvDw+SqKGbcgSu0sdARgz
c/ktCxSbC3x6j2sVv4Eie+1mtkfky9pX6GKzfvrGb6sLXtHL+nwli1F3ahP3TNK3
7y8+57Ob6/XSGfxGdRe0ylMSXPCQ7NiU8fQAKyY92larkKpBZJfaoyrYwbPmTnPP
W2Y1WtXecKKvE6S0GToMOqKkESJQhQNj57zBSGF+CjPTtuKN/WafwQy2sL9H+XxJ
JLLh4DVfdcnbmz6Kh/+hcGQbpwHcW0Lm1ZOAi+VKgCe45oaUWM5h/D7xb6C4SbAh
IXlPewrk+6TqSUSoK4GLYEaFEC4i5x+1HlouNDHSoFacMrbEgZ3KooK+/+Rcsr1J
L4j1AG6EAaxd39XtffA3a4GsgcoeXmekg5V9b/MwwmXOTjdrq5cJCU5izrQFuFEw
faTi3OgQJJDLiKbaFNzLhfD6bf9gprKFDtjr/wLE7fxHGywPG6QDFo2ARQKfYiSd
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
-----END AGE ENCRYPTED FILE-----

View file

@ -1,74 +0,0 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA4aVhyNDdpNERyeS9nYkRG
STB2YUV4Rm8yL1VJRGVYZW11MW1iWXlmdWk0CmJWeUNlcEdlNVhMKzduZFNCSFpo
U1lJVzlKZ09OU0lmdytLZ0FtVzZCd2sKLS0tIG5IM0tzclJuTDVWYWVYak9JL3kx
emYwZEhpNTdlbkRyc2VadEtQbGpvZ2MKIfg4lE/XfD3NVUr+q7KfPUL0mxMxf6Jr
vMSe3nySaXOeHep5HCCFNzIW3UUk+sZml0Y3nZNlIm5ZTCbzG0nCT+R4aYzwFUmq
W22IlXNlTd+4KuGS0UODztBivY4dU2LkKsAZFboYD7RYxhKShSygab9TkJJ18tEU
O8Oqewnh4t7cnos0NegazQ0bWcv9k1SFT3AfovBRIqMfBKbn6Lufgy3k5qLPWOs3
GuWEtr8lHVeHiFo+g3WrKUc1AEXsYAIyO+0ry05VG0svVAD9krTxCyB0x55cymuy
hSWPNpu0+7cXIsMAwO6EM7TQgM/CDhYDcXu84Kz7iZp1N0QY7X0q7nvc6w/mNRnd
XxezMgJSGFhZ9tktWwbEG5hbzk+BtccLnjLvzr939U5HjoALh+SEu3HJmslpifmr
AHiRxV3/XKTbJDhHqCEXkWiR3m38czIkJrtvOp3VxCUEBXl+xu4kDBu57/0tZqmq
DHo87J3Jj+TmvJqRly4xM+Q2aHfzCxGFMNriSEvAvlMTXBnklFEoSQM+1VR33sVQ
eeisQzwgi9koAwilM+zUbYjcQaZ4AUneUdYUcz6V1gEkSDG8RWBelywmDsSX5srj
r1tvEG95poNOYD/mXRyG9DEUG4RBdzrrAr2/NTEYOrsPATabp/HCdqnmld0nHvkl
LTizBKa1JeQ7Ldw5zoyS5qqzVV/xG0Gs5f6pyLc/oMLV21De5Ypt7i4+Oipxm1mE
gf9eJKjFd1TcfwqiWr549q7sot1ZMCyInutEmNk+c8KlfBDGal1OcvoQaBlMWbus
ozd3hEGOLdwn/PmgGKg3nLOl3HrXYOd+v72zSb0ke1pnpdL0F1QdmL5l+qaJ3VHS
ynFX1Lv/Se9lswktB2z0zjXXpw7qxvv2aP9kEy8vmJbYeYUuYgSczB1CO5VYHTcD
OVoGYj/ACICqDzRaAnAtLjiK+O+3PVAAe2Gwf/qe5KWDTryh/bjNzw4RQdpaipms
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
-----END AGE ENCRYPTED FILE-----

View file

@ -1,49 +0,0 @@
### Modules ###
# Sets sane Zsh built-in environment options.
zmodule environment
# Provides handy git aliases and functions.
zmodule git
# Applies correct bindkeys for input events.
zmodule input
# Sets a custom terminal title.
zmodule termtitle
# Utility aliases and functions. Adds colour to ls, grep and less.
zmodule utility
### Prompt ###
# Exposes to prompts how long the last command took to execute, used by asciiship.
zmodule duration-info
# Exposes git repository status information to prompts, used by asciiship.
zmodule git-info
# A heavily reduced, ASCII-only version of the Spaceship and Starship prompts.
zmodule asciiship
### Completion ###
# Additional completion definitions for Zsh.
zmodule zsh-users/zsh-completions --fpath src
# Enables and configures smart and extensive tab completion.
# completion must be sourced after all modules that add completion definitions.
zmodule completion
### Modules that must be initialized last ###
# Fish-like syntax highlighting for Zsh.
# zsh-users/zsh-syntax-highlighting must be sourced after completion
zmodule zsh-users/zsh-syntax-highlighting
# Fish-like history search (up arrow) for Zsh.
# zsh-users/zsh-history-substring-search must be sourced after zsh-users/zsh-syntax-highlighting
zmodule zsh-users/zsh-history-substring-search
# Fish-like autosuggestions for Zsh.
zmodule zsh-users/zsh-autosuggestions

View file

@ -1,55 +0,0 @@
#!/bin/sh
set -e
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
eval "$(/opt/homebrew/bin/brew shellenv)"
brew install \
age \
bat \
bzip2 \
cmus \
curl \
direnv \
exercism \
fzf \
gh \
git \
glow \
go \
golangci-lint \
helix \
inlyne \
jj \
just \
lua-language-server \
luarocks \
marksman \
nvm \
presenterm \
prr \
ripgrep \
sqlite \
tree \
vdirsyncer \
watch \
wget \
xz \
zlib
export NVM_DIR="$HOME/.nvm"
[ -s "/opt/homebrew/opt/nvm/nvm.sh" ] && \. "/opt/homebrew/opt/nvm/nvm.sh"
nvm install 22
nvm use 22
curl -LsSf https://astral.sh/uv/install.sh | sh
{{ if eq .hosttype "personal" -}}
brew install \
love \
mingw-w64 \
pandoc \
stylua
{{ else if eq .hosttype "work" -}}
{{ join .chezmoi.sourceDir "encrypted_dot_work_packages.age" | include | decrypt -}}
{{ end }}

View file

@ -1,9 +0,0 @@
#!/bin/sh
set -e
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o /tmp/rustup.sh
chmod u+x /tmp/rustup.sh
/tmp/rustup.sh -y --no-modify-path
. $HOME/.cargo/env
rustup update stable

View file

@ -1,13 +0,0 @@
#!/bin/sh
set -e
if [ ! -d $HOME/.src/gwar ] ; then
git clone ssh://git@git.thermokar.st/thermokarst/gwar $HOME/.src/gwar
fi
cd $HOME/.src/gwar
# belt-and-suspenders
. $HOME/.cargo/env
cargo build --release
cp target/release/gwar ~/bin

View file

@ -1,15 +0,0 @@
#!/bin/sh
set -e
{{- if eq .hosttype "work" }}
if [ ! -d $HOME/notebook ] ; then
jj git clone ssh://git@git.thermokar.st/thermokarst/klaviyo-notebook $HOME/notebook
fi
{{- end }}
{{- if eq .hosttype "personal" }}
if [ ! -d $HOME/notebook ] ; then
jj git clone ssh://git@git.thermokar.st/thermokarst/notebook $HOME/notebook
fi
{{- end }}

15
install Executable file
View file

@ -0,0 +1,15 @@
#!/usr/bin/env bash
set -e
CONFIG="install.conf.yaml"
DOTBOT_DIR="dotbot"
DOTBOT_BIN="bin/dotbot"
BASEDIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "${BASEDIR}"
git -C "${DOTBOT_DIR}" submodule sync --quiet --recursive
git submodule update --init --recursive "${DOTBOT_DIR}"
"${BASEDIR}/${DOTBOT_DIR}/${DOTBOT_BIN}" -d "${BASEDIR}" -c "${CONFIG}" "${@}"

41
install.conf.yaml Normal file
View file

@ -0,0 +1,41 @@
- clean:
- '~'
- create:
- ~/projects/qiime2
- ~/projects/qiime2/data/moving-pictures
- ~/projects/mds
- ~/projects/personal
- ~/desk
- ~/files
- link:
~/.tmux.conf: tmux.conf
~/.gitconfig: git/gitconfig
~/.gitignore_global: git/gitignore_global
~/.npmrc: npmrc
~/.psqlrc: psqlrc
~/.vimrc: vimrc
~/.zpreztorc: zsh/zpreztorc
~/.zlogin: zsh/zlogin
~/.zlogout: zsh/zlogout
~/.zprofile: zsh/zprofile
~/.zshenv: zsh/zshenv
~/.zshrc: zsh/zshrc
~/Library/Application Support/Code/User/settings.json:
create: true
path: vscode/settings.json
~/Library/Application Support/Code/User/keybindings.json:
create: true
path: vscode/keybindings.json
~/Library/Application Support/Code/User/tasks.json:
create: true
path: vscode/tasks.json
~/qiime2-1.code-workspace: vscode/qiime2-1.code-workspace
~/qiime2-2.code-workspace: vscode/qiime2-2.code-workspace
~/qiime2-3.code-workspace: vscode/qiime2-3.code-workspace
~/mds.code-workspace: vscode/mds.code-workspace
~/personal.code-workspace: vscode/personal.code-workspace
~/.config/kak/kakrc:
create: true
path: kakrc

Some files were not shown because too many files have changed in this diff Show more