بنقرة واحدة
add-ruinage-project
Add a new project to ruinage with DNS, Caddy, Gatus, and deployment
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Add a new project to ruinage with DNS, Caddy, Gatus, and deployment
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Add an AeroSpace window rule to assign an app/window to a workspace (macOS only)
Create or update secrets using Infisical (preferred) or legacy agenix files
Re-encrypt all secrets after modifying .age files or changing host keys
Decrypt and view the contents of an .age secret file
Deploy NixOS/Darwin configuration to local or remote host using justfile commands
Analyze project from URL/path and auto-detect build system to create Nix package
| name | add-ruinage-project |
| description | Add a new project to ruinage with DNS, Caddy, Gatus, and deployment |
| compatibility | Requires cfcli, nix, ssh access to hosts |
| metadata | {"author":"ruinous.ai","version":"2.0","domain":"ruinage"} |
| parameters | {"forge_url":{"type":"string","description":"Full forge URL to the repository","required":true,"placeholder":"forge.meskill.farm/iamruinous/my-project"},"hostname":{"type":"select","description":"Target host for the ruinage project","required":false,"options":[{"label":"chassis (Recommended)","description":"Primary AI development hub"},{"label":"obelisk","description":"GPU compute server"},{"label":"zenith","description":"AI container server"}],"default":"chassis"}} |
Add a new project to ruinage with full deployment: DNS, Caddy reverse proxy, Gatus monitoring, and host deployment.
If parameters are missing from $ARGUMENTS, use mcp_question to gather them:
mcp_question({
questions: [
{
question: "What is the forge URL for the repository?",
header: "Forge URL",
options: [] // custom input
},
{
question: "Which host should run this project?",
header: "Host",
options: [
{ label: "chassis (Recommended)", description: "Primary AI development hub" },
{ label: "obelisk", description: "GPU compute server" },
{ label: "zenith", description: "AI container server" }
]
}
]
})
Expected $ARGUMENTS format: <forge_url> [hostname]
forge.meskill.farm/iamruinous/budgey-assistant-dashboard chassisforge.meskill.farm/iamruinous/budgey-assistant-dashboard (defaults to chassis)From forge.meskill.farm/iamruinous/budgey-assistant-dashboard:
forge.meskill.farmiamruinousbudgey-assistant-dashboardbudgey-assistant-dashboard~/Projects/ruinage/budgey-assistant-dashboardbudgey-assistant-dashboard.oc.ruinous.aiEdit hosts/<hostname>/users/jmeskill/home-configuration.nix:
Add a new project entry inside ruinous.ruinage.projects:
# <repo> - web service with Caddy
<project-name> = {
# Only specify if different from project name
# repo = "<repo-name>";
# Only specify if different from default (forge.meskill.farm)
# forge = "<forge>";
# Only specify if different from default (iamruinous)
# owner = "<owner>";
assistants.opencode = {
enable = true;
web.enable = true;
budgey.enable = true;
};
assistants.kimaki.enable = true;
direnv.enable = true;
environmentFiles = [
config.age.secrets.chassis_opencode_common_env.path
];
};
Key points:
forge defaults to forge.meskill.farmowner defaults to iamruinousworkdir auto-computes to ~/Projects/ruinage/<repo>web.fqdn auto-computes to <project-name>.oc.ruinous.aiAdd CNAME pointing to the host:
cfcli --domain ruinous.ai --type CNAME add <project-name>.oc <hostname>.meskill.farm
Example for budgey-assistant-dashboard on chassis:
cfcli --domain ruinous.ai --type CNAME add budgey-assistant-dashboard.oc chassis.meskill.farm
Edit hosts/monolith/files/gatus/config.yaml:
Add a new endpoint under the # CHASSIS SERVICES (OpenCode) section (or appropriate host section):
- name: "OpenCode - <project-name> (<hostname>)"
group: "Development"
url: "https://<project-name>.oc.ruinous.ai"
interval: 5m
conditions:
- "[STATUS] == 200"
alerts:
- type: discord
- type: email
Dry-build both hosts to verify configuration:
just remote-dry-build <hostname>
just remote-dry-build monolith
mkdir -p ~/Projects/ruinage
cd ~/Projects/ruinage
git clone git@<forge>:<owner>/<repo>.git
Deploy to both hosts:
# Deploy to target host (Caddy routes auto-generated from projects)
just remote-rebuild <hostname>
# Deploy to monolith (Gatus monitoring)
just remote-rebuild monolith
The new ruinage module automatically handles:
| Feature | Auto-Generated |
|---|---|
| workdir | ~/Projects/ruinage/<repo> |
| web.fqdn | <project-name>.oc.ruinous.ai |
| web.port | Auto-assigned (alphabetical order from 9500) |
| Caddy routes | From assistants.opencode.web.enable |
| tmuxp session | From project config |
| direnv | From direnv.enable |
| File | Purpose |
|---|---|
hosts/<hostname>/users/jmeskill/home-configuration.nix | Project definition |
hosts/<hostname>/caddy.nix | Caddy config (auto-generated from projects) |
hosts/monolith/files/gatus/config.yaml | Uptime monitoring |
| Pattern | Use Case |
|---|---|
<project>.oc.ruinous.ai | OpenCode web services |
<project>.agent.ruinous.ai | Agent documentation sites |
# Arguments: forge.meskill.farm/iamruinous/budgey-assistant-dashboard
# 1. Parse URL
# forge = forge.meskill.farm
# owner = iamruinous
# repo = budgey-assistant-dashboard
# project = budgey-assistant-dashboard
# domain = budgey-assistant-dashboard.oc.ruinous.ai
# 2. Add project to home-configuration.nix
# (edit the file to add new project entry)
# 3. Add DNS record
cfcli --domain ruinous.ai --type CNAME add budgey-assistant-dashboard.oc chassis.meskill.farm
# 4. Add Gatus monitoring
# (edit hosts/monolith/files/gatus/config.yaml)
# 5. Verify builds
just remote-dry-build chassis
just remote-dry-build monolith
# 6. Clone if needed
cd ~/Projects/ruinage && git clone git@forge.meskill.farm:iamruinous/budgey-assistant-dashboard.git
# 7. Deploy
just remote-rebuild chassis
just remote-rebuild monolith
# Check systemd service status
systemctl --user status opencode-<project>
# View logs
journalctl --user -fu opencode-<project>.service
# Check Cloudflare records
cfcli --domain ruinous.ai ls | grep <project>
# Test DNS resolution
dig <domain>
# Check Caddy logs
journalctl -fu caddy
# Verify Caddy config
caddy validate --config /etc/caddy/Caddyfile