Imported from calamity-m/slop (
AGENTS.md). Install upstream withnpx skills add calamity-m/slop. Copyright stays with the author.
slop
Personal dotfiles for Neovim, Bash, Zellij, mise, Peanutbutter snippets, and reusable AI-agent skills, installed by symlinking this repo into $HOME.
1. Project Rules
- Surface assumptions and tradeoffs before changing config behavior; this repo favors small, explicit dotfile changes over broad cleanup or unrelated refactors.
- Treat
install.shas the contract for what this repo installs. When adding or moving a dotfile area, update symlink setup, usage text, and final summary lines together. - Keep
install.shconservative: preserveensure_symlinkbehavior where real files are skipped unless--forceis passed. - Do not bulk-format
.config/zellij/config.kdl;.config/nvim/lua/plugins/conform.luaintentionally disableskdlfmtfor that file. - Respect
.gitignore: local Neovim overrides live under.config/nvim/lua/local/*.lua, private skills live under.skills/private/, tracked prompts live under.agents/prompts/*.md, and only explicitly listed.bashrc.d/*.shfiles are tracked. - Skills under
.skills/{general,management,development,fermenting,deprecated,private}/*/SKILL.mdare executable agent instructions. Keep references relative to each skill directory and verify any referenced scripts or docs exist.
2. Verification
Define success criteria before editing, then run the checks that match the changed area.
For multi-step tasks, state a brief plan with checks:
1. [Step] -> verify: [check]
2. [Step] -> verify: [check]
3. [Step] -> verify: [check]
Useful checks in this repo:
- Installer changes:
bash -n install.sh; if behavior changed, inspect./install.sh --helpand keep usage text, symlink setup, and final summary in sync. - Bash snippets:
bash -n .bashrc.d/<file>.sh; useshellcheckwhen available. - Neovim Lua: load the changed module with Neovim when practical, or run
stylua --check .config/nvimwhen formatting is in scope. - Zellij config: avoid whole-file formatting; validate only the touched KDL behavior manually or with the relevant Zellij command if available.
- Skill docs: confirm every relative reference from
.skills/<category>/<skill>/SKILL.mdresolves from that skill directory. - Peanutbutter snippets: keep Markdown sections with executable fenced blocks and validate against Peanutbutter behavior/docs when changing snippet syntax.
Strong success criteria let agents loop independently. Weak criteria require clarification.
3. In-Code Documentation
Use the native comment style for the file being edited: --- LuaDoc for public Lua modules/functions, # comments for Bash and TOML, // comments for KDL, and concise Markdown notes in skill docs.
For public Lua and shell entry points:
- Document what the item is for and any non-obvious environment, filesystem, or external-command requirement.
- Keep one-liners for simple keymaps, aliases, and plugin setup; the name plus
descis often enough.
For internal code, comment the why, not the what:
- Symlink safety in
install.sh(--force, skipped existing files, and$CLAUDE_HOME/$CODEX_HOMEhandling). - Formatting exceptions such as Prettier requiring a project config and
kdlfmtskipping Zellijconfig.kdl. - Neovim/Zellij runtime coupling, especially pane renaming in
.config/nvim/lua/zellij.luaand locked-mode keybind assumptions in.config/zellij/config.kdl. - Mason versus mise ownership: Mason installs Neovim-scoped LSP/DAP/format tools, while mise installs shell-visible binaries.
4. Key Decisions
install.shis the only installer. Itsensure_dirandensure_symlinkfunctions create links into~/.config,~/.agents,~/.pi/agent, and tool-specific skill paths without replacing real files unless--forceis used.- Neovim starts at
.config/nvim/init.lua, which loadsoptions,keymaps,plugins,theme, thenrequire("zellij").setup(). Plugin registration lives in.config/nvim/lua/plugins.luaviavim.pack.addand the orderedplugin_moduleslist. - Mason state is centralized in
.config/nvim/lua/plugins/mason.lua:M.lsp_serversfeedsvim.lsp.enable(mason.lsp_servers)in.config/nvim/lua/plugins/lsp.lua, whiletoolsfeedsmason-tool-installer. - Neovim plugin configs that need machine-specific values should load optional ignored overrides from
.config/nvim/lua/local/*.lua; prefervim.tbl_deep_extendfor table overrides and a function override when lists such as pluginviewsmust be replaced. - Debugger setup lives in
.config/nvim/lua/plugins/dap.lua; language-specific launch/test workflows live under.config/nvim/lua/plugins/dap/. - Formatting is centralized in
.config/nvim/lua/plugins/conform.lua;format_on_saveis enabled, Prettier only runs whenhas_prettier_config(ctx)finds config, andWriteNoFormat/ConformDirare the escape hatches. - Zellij integration is split:
.config/nvim/lua/zellij.luarenames panes throughzellij action rename-pane, while.config/zellij/config.kdlusesclear-defaults=true,default_mode "locked", custom themes, and disabledweb_sharing. - Tracked skills live under
.skills/{general,management,development,fermenting,deprecated}, while ignored local skills live under.skills/private. Skills and.agents/promptsare plain Markdown/YAML/shell dotfiles, not built artifacts. - Skills are installed by reconciliation, not by static per-skill links.
.scripts/sync-agent-skillsflattens.skills/<category>/<skill>into~/.agents/skills/<skill>;install.shcalls it once with explicit roots, and.bashrc.d/agent-skills.shruns it on every interactive Bash start so category moves and new skills need no installer rerun. Categories are enumerated from the filesystem, so adding one requires no code change. A destination entry is managed only when it is a symlink whose literal target starts with<repo>/.skills/— targets are never canonicalized, unmanaged entries such as Codex's.systemare never touched, and duplicate basenames across categories are reported with a nonzero exit rather than resolved. The sole exception is a dangling symlink on a wanted name, which is reclaimed so the tree heals after a repository move.
5. Local Notes
- No repo pre-commit config is currently present. If adding one is in scope, natural checks are
bash -nandshellcheckforinstall.shand.bashrc.d/*.sh, plusstylua --check .config/nvimfor Lua. .config/mise/config.tomlis intentionally limited to global binary tools, not project language runtimes.- Peanutbutter snippets live under
.config/peanutbutter/snippets; keep snippet changes as Markdown sections with executable fenced code blocks and check syntax against the upstream Peanutbutter docs when needed. CLAUDE.mdshould remain a symlink toAGENTS.mdso Claude Code and other agents read the same guidance.
These guidelines are working if: diffs stay small, assumptions are visible, and verification is concrete.