Files
dotfiles-public/dot_local/share/dotup/packages.tsv
T
bcherb2 b487b0e855 feat: public dotfiles tier — no credential, no identity, one installer
Fresh history. This is the repo a throwaway VM clones anonymously: it brings a
machine to a working baseline and carries nothing that makes it mine.

56 files. 50 land in $HOME, 3 are chezmoi metadata, 2 are repo documentation,
1 is the manifest, and a 15-file test harness stays behind in .tests/.

What did not travel, and why:

  encrypted_private_bws-token.age   a real credential; age is dropped entirely
  .chezmoidata/bws.toml             env-var -> secret-id map; belongs with the
                                    tier that can use it
  SECRETS.md                        documentation of the rules, not config
  finish-setup.sh.tmpl              superseded by dotup
  nvim/init.lua.backup              dead file
  dot_claude/**, dot_codex/**,      120 files of agent config, private tier
  dot_pi/**

De-identified rather than dropped:

  .gitconfig   [user], the GitHub ssh rewrite and both Gitea host rewrites are
               identity, not configuration. They move behind an [include] of
               ~/.config/git/config.local, which the private tier writes. Git
               treats a missing include as a no-op, so a public-only machine
               reads the file and stops.
  .zshrc       the two gitea aliases carried a personal domain and a LAN IP.
               They move behind a guarded source of ~/.config/zsh/local.zsh,
               the sibling of the secrets.zsh seam phase 2 established.
  nvim         a commented-out LM Studio endpoint naming a LAN address.
  ghostty      a stale auto-generated header naming an absolute home directory.

Newly captured, never tracked before: ~/.zshenv, ~/.config/gh/config.yml. The
former sourced ~/.cargo/env unguarded, so every zsh on a machine without rustup
printed an error -- the same shape as the unguarded oh-my-zsh source phase 2
fixed. It is guarded now.

.chezmoiexternal.toml grows from one entry to six. oh-my-zsh, powerlevel10k,
zsh-autosuggestions, zsh-ai and tpm were hand-installed and declared nowhere,
which is why `chezmoi init --apply` on a clean box produced a .zshrc that broke
the shell it configures. The theme and both plugins nest under
.oh-my-zsh/custom/, which is what $ZSH_CUSTOM resolves to.

dotup gains an install engine. It resolves each selected package to a channel
(apt, brew, npm, uv, snap, deb, flatpak, tarball, script, builtin) through one
function every consumer reads, probes apt-cache before batching so a name apt
does not know moves to brew instead of failing all thirty, and retries
individually if a batch still fails -- which earned its keep on the first real
container run, where mermaid-cli's puppeteer dependency failed and the other
twelve npm packages installed anyway. --unattended computes safe defaults fresh
from the manifest rather than inheriting a state file, and refuses private and
invasive rows outright even when a stale state file ticks them.

The manifest gains @spec, a second directive kind alongside @needs, carrying the
argument a channel needs but a package name cannot supply -- the scoped npm
name, the flatpak app id, the .deb source. The TSV stays five columns wide.

Three bugs the container runs found, all fixed here:

  * `apt install nodejs` gives you node WITHOUT npm on Ubuntu, so all thirteen
    npm packages failed on a fresh box. The manifest asks apt for both names.
  * A tool installed a moment ago is not on this process's PATH -- uv lands in
    ~/.local/bin, npm -g honours the ~/.npmrc prefix, linuxbrew is outside a
    non-login PATH. Resolved by looking in the places we just wrote to, never by
    exporting a modified PATH.
  * `A || { B && C; }` is one || list, so when `command -v sudo` failed the list
    failed and `set -e` killed dotup at load. On a non-root machine with no
    sudo it died before printing anything. There is a regression test.

.zshenv and .p10k.zsh are marked private_. Both are shell code the login shell
executes and both applied at 664, group-writable. Third occurrence of the class
of bug phase 1 found on .pi/agent/auth.json and phase 2 found on .zshrc; the
first one found on purpose rather than by accident.

Verification: 81 assertions, 81/81 on this box and in ubuntu:24.04, ubuntu:22.04
and debian:12. The installer is driven against a directory of fake package
managers that record what they were asked to do and install nothing, so the
engine is exercised end to end without a package landing on the test machine.
`gitleaks detect` over the full history and the working tree: no leaks found,
with no allowlist and no .gitleaks.toml.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 00:24:41 -04:00

6.4 KiB

1#grouppkgflagaptbrewnote
2#
3# Five columns, tab separated, greppable by hand. Anything that would have been
4# a sixth column is an @ directive instead, so a package with no dependency and
5# no install argument -- most of them -- costs nothing to read.
6#
7# @needs <group/pkg> <dep>... dep is group/pkg or a whole group.
8# Closure is transitive in both directions.
9# @spec <group/pkg> <arg>... Argument for a channel that cannot be named
10# by the package: the npm spec, the flatpak
11# app id, the .deb source. Defaults to the
12# package name when absent.
13# @<group> <note> Group note. Only needed where the members
14# fail the safe test for different reasons;
15# otherwise the worst child's note is right.
16#
17# -tarball -npm -script -snap -deb -flatpak -uv -builtin -xcode.
18# A bare `-` means unavailable there. Linux falls back to the brew column before
19# giving up -- omp, herdr and lazygit have no apt package at all. The fallback is
20# one-directional: there is no apt on a Mac, so a `-` in the brew column is the
21# end of the road rather than a reason to read a column of Debian package names.
22#
23@needsnetworking/xrdpdesktop
24@needsnetworking/xorgxrdpdesktop
25@needsgpu/container-toolkitdocker
26@needsagents/codexcore/node
27@needsagents/picore/node
28@needsagents/pi-pluginscore/node
29@needsagents/pi-pluginsagents/pi
30@needsagents/specify-clicore/uv
31@needscore/mermaid-clicore/node
32@needscore/neovimcore/imagemagick core/mermaid-cli
33#
34# npm names carry scopes that the plugin's short name does not. `npm i -g
35# rpiv-btw` installs somebody else's package.
36@specagents/codex@openai/codex
37@specagents/pi@earendil-works/pi-coding-agent
38@specagents/pi-plugins@juicesharp/rpiv-ask-user-question @juicesharp/rpiv-btw @juicesharp/rpiv-todo @samfp/pi-memory @tmustier/pi-ralph-wiggum pi-markdown-preview pi-powerline-footer pi-simplify pi-subagents pi-web-access
39@specagents/specify-clispecify-cli
40@speccore/mermaid-cli@mermaid-js/mermaid-cli
41@speccore/bitwarden-clibw
42@specapps/obsidianmd.obsidian.Obsidian
43@specapps/chromehttps://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
44@specapps/ghosttygh:mkasberg/ghostty-ubuntu:_amd64.deb
45coreneovimsafe-tarballneovimapt ships 0.9.5 — tarball to /opt/nvim
46coreripgrepsaferipgrepripgrepbinary is rg
47corefdsafefd-findfdbinary is fdfind on ubuntu
48corebatsafebatbatbinary is batcat on ubuntu
49corefzfsafefzffzffor your shell (ctrl-r); the picker uses its own pinned copy
50coreezasafeezaeza
51corezshsafezsh-builtinlogin shell everywhere
52coretmuxsafetmuxtmux
53coregit-lfssafegit-lfsgit-lfs
54corelazygitsafe-lazygitno apt package
55coreghsafeghgh
56corechezmoisafe-scriptchezmoibootstrap cannot come from the manifest
57coregosafe-tarballgo/usr/local/go on linux
58coreuvsafe-scriptuvastral installer to ~/.local/bin
59corenodesafenodejs npmnodeapt's nodejs ships node WITHOUT npm — both names needed
60coreimagemagicksafeimagemagickimagemagickrequired by the nvim markdown render path
61coremermaid-clisafe-npm-npmmmdc — nvim renders mermaid fences with it
62corebtopsafebtopbtop
63corehtopsafehtophtop
64corencdusafencduncdu
65coretreesafetreetree
66corecmakesafecmakecmake
67coreninjasafeninja-buildninjapackage name differs from binary
68corebuild-toolssafebuild-essential-xcode
69coremagic-wormholesafemagic-wormholemagic-wormholesnap wormhole on dev
70corebitwarden-clisafe-snapbitwarden-clisnap bw on ubuntu
71coremoshsafemoshmosh
72corenmapsafenmapnmap
73corebinwalksafebinwalkbinwalk
74corepipxsafepipxpipx
75coreagesafeageagegeneral purpose only now
76agentscodexsafe-npm-npm@openai/codex — unpinned, always latest
77agentspisafe-npm-npm@earendil-works/pi-coding-agent
78agentspi-pluginssafe-npm-npm10 plugins: rpiv-*, pi-memory, pi-subagents, ...
79agentsompsafe-can1357/tap/ompoh my pi — tap only, pulls linuxbrew on linux
80agentsherdrsafe-herdrterminal workspace manager for agents
81agentsspecify-clisafe-uv-uvuv tool install
82fontshack-nerd-fontsafefonts-powerlinefont-hack-nerd-font
83fontsiosevka-nerd-fontsafefonts-powerlinefont-iosevka-nerd-font
84mediaffmpegsafeffmpegffmpeg
85mediasoxsafesoxsox
86mediap7zipsafep7zip-fullp7zip
87appsobsidiangui-flatpakobsidian
88appsghosttygui-debghostty
89appschromegui-debgoogle-chrome
90appsfirefoxguifirefoxfirefox
91appsvlcguivlcvlc
92@networkingdaemons, listening ports, and setuid mount helpers
93networkingopenssh-serverinvasiveopenssh-server-builtinopens port 22 on every network this box can reach
94networkingtailscaleinvasivetailscaletailscaledaemon; joins a private network and rewrites DNS
95networkingavahi-daemoninvasiveavahi-daemon-daemon; broadcasts this host on the LAN
96networkingxrdpinvasivexrdp-opens port 3389 · useless without the desktop group
97networkingxorgxrdpinvasivexorgxrdp-xrdp's X backend
98networkingnfs-commoninvasivenfs-common-setuid mount helper
99networkingcifs-utilsinvasivecifs-utils-setuid mount helper
100networkingdavfs2invasivedavfs2-setuid mount helper
101@dockerdaemon; membership in the docker group is root-equivalent
102dockerdocker-ceinvasivedocker-ce-daemon; docker group is root-equivalent
103dockerdocker-buildxinvasivedocker-buildx-plugin-
104dockerdocker-composeinvasivedocker-compose-plugin-
105@desktopchanges the display manager — can leave you at a black screen
106desktopxfce4invasivexfce4-changes the display manager
107desktoplightdminvasivelightdm-CAN LEAVE YOU AT A BLACK SCREEN
108@gpukernel modules; a bad driver can break boot
109gpunvidia-driverinvasivenvidia-driver-570-kernel modules; can break boot
110gpucuda-toolkitinvasivenvidia-cuda-toolkit-
111gpucontainer-toolkitinvasivenvidia-container-toolkit-requires docker
112@virtdaemon, bridges, and group membership
113virtqemuinvasiveqemu-kvm-
114virtlibvirtinvasivelibvirt-daemon-system-daemon + group membership
115virtvirt-managerinvasivevirt-manager-
116@privateone password, typed after the install finishes
117privateprivate-repoprivate--~/.local/share/dotfiles-private — agent config, ssh config
118privatebws-secretsprivate--7 API keys into ~/.config/zsh/secrets.zsh