Initial commit: homelab infrastructure wiki

- Full Obsidian vault content
- Host configs (ice, grizzley, ubuntu, proxmox, truenas, panda, hyte)
- Media stack documentation
- Traefik HA setup
- Automation scripts
- Bachelor party planning
This commit is contained in:
Hermes Agent
2026-05-24 16:08:40 -07:00
parent d132442429
commit e4d91aadf9
285 changed files with 30018 additions and 0 deletions

View File

@@ -0,0 +1,98 @@
---
type: agent-doc
agent: ForgeCode
source: https://forgecode.dev/docs/commands/
scraped: 2026-04-28T21:02:35.706451+00:00
content_hash: 8ef9d024
---
# Custom Commands
You repeat the same workflow constantly — lint, test, fix, commit. Every time, you type it out or paste it from a notes file. Custom commands let you turn any repeatable workflow into a named slash command that ForgeCode executes on demand.
## How It Works
A custom command is a Markdown file in the .forge/commands/ directory. The filename becomes the command name. The file body is the instruction ForgeCode follows when you invoke it.
```
.forge/└── commands/ ├── check.md → :check └── fixme.md → :fixme
```
Type :check in the chat, and ForgeCode runs whatever check.md describes. That's it.
## File Format
Every command file has two parts: a frontmatter block and an instruction body.
```
---name: checkdescription: Checks if the code is ready to be committed---- Run the `lint` and `test` commands and verify if everything is fine. <lint>cargo +nightly fmt --all; cargo +nightly clippy --fix --allow-staged --allow-dirty --workspace</lint> <test>cargo insta test --accept --unreferenced=delete</test>- Fix every issue found in the process
```
### Frontmatter
| Field | Required | Description |
|---|---|---|
| name | Yes | The slash command name (e.g. check → /check) |
| description | Yes | One-line summary shown in the command picker |
### Body
The body is plain Markdown. Write it the same way you'd explain the workflow to a teammate. You can use:
- Prose for context or decision logic
- Bullet lists for sequential steps
- XML-style tags to attach literal shell commands to a step (e.g. <lint>...</lint>, <test>...</test>)
- Code blocks for multi-line scripts
ForgeCode reads the body as instructions and executes them. If a step fails, it attempts to fix the problem before continuing — just like it would for any other task.
## A Minimal Example
The simplest possible command:
```
---name: fixmedescription: Looks for all the fixme comments in the code and attempts to fix them---Find all the FIXME comments in source-code files and attempt to fix them.
```
Invoke it with :fixme and ForgeCode searches every source file for FIXME comments and tries to resolve each one.
## A More Complex Example
Commands can embed exact shell commands so ForgeCode runs the right tools every time:
```
---name: checkdescription: Checks if the code is ready to be committed---- Run the `lint` and `test` commands and verify if everything is fine. <lint>cargo +nightly fmt --all; cargo +nightly clippy --fix --allow-staged --allow-dirty --workspace</lint> <test>cargo insta test --accept --unreferenced=delete</test>- Fix every issue found in the process
```
The <lint> and <test> tags tell ForgeCode the exact commands to run for those steps. If clippy reports an error, ForgeCode fixes it. If a test fails, ForgeCode investigates. You don't have to tell it how — the command already knows.
## Where to Put Commands
Commands can live in three places, loaded in precedence order:
```
.forge/commands/ ← project commands (highest precedence)~/.agents/commands/ ← shared across agent tools~/forge/commands/ ← global, across all projects
```
Project commands are the most common. Check them into version control and your team shares the same /check, /fixme, and any other workflows you define.
## Invoking Commands
Type the command name with a leading slash in the ForgeCode chat:
```
:check:fixme
```
ForgeCode picks it up immediately. No restart needed — new command files are available as soon as they exist on disk.
## Verifying Your Commands
To see all available commands, run :help in the chat. You'll get a list with names and descriptions.
```
:help
```
---
The hardest part of getting value from custom commands is identifying which workflows deserve one. A good rule: if you've typed the same instruction three times, write a command for it.