3 Commits

Author SHA1 Message Date
f4f0d86d1f svg-maker: rendered example in the README
All checks were successful
release-tools / build-release (push) Successful in 4m4s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011KikHkfCiC3yELbsMN8fT9
2026-08-07 08:54:40 +02:00
4bae7bfb72 ci/tasks/readme: register fleet
All checks were successful
release-tools / build-release (push) Successful in 2m27s
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011KikHkfCiC3yELbsMN8fT9
2026-08-07 01:02:53 +02:00
ea06442d44 Merge dev/fleet: fleet v1 2026-08-07 01:02:06 +02:00
7 changed files with 47 additions and 6 deletions

View File

@@ -20,7 +20,7 @@ jobs:
- name: Detektera ändrade tools - name: Detektera ändrade tools
id: changed id: changed
run: | run: |
TOOLS="pixel-sprite-maker mesh-tool bitmap-font-maker sfx-maker hitbox-tool notifyr svg-maker waitfor cronr giteactl" TOOLS="pixel-sprite-maker mesh-tool bitmap-font-maker sfx-maker hitbox-tool notifyr svg-maker waitfor cronr giteactl fleet"
BEFORE="${{ github.event.before }}" BEFORE="${{ github.event.before }}"
CHANGED="" CHANGED=""
if [ "${{ github.event_name }}" = "workflow_dispatch" ] \ if [ "${{ github.event_name }}" = "workflow_dispatch" ] \
@@ -64,6 +64,7 @@ jobs:
waitfor) BIN=waitfor ;; waitfor) BIN=waitfor ;;
cronr) BIN=cronr ;; cronr) BIN=cronr ;;
giteactl) BIN=giteactl ;; giteactl) BIN=giteactl ;;
fleet) BIN=fleet ;;
*) echo "okänt tool $t"; exit 1 ;; *) echo "okänt tool $t"; exit 1 ;;
esac esac
echo "=== $t ($BIN) ===" echo "=== $t ($BIN) ==="
@@ -98,6 +99,7 @@ jobs:
waitfor) BIN=waitfor ;; waitfor) BIN=waitfor ;;
cronr) BIN=cronr ;; cronr) BIN=cronr ;;
giteactl) BIN=giteactl ;; giteactl) BIN=giteactl ;;
fleet) BIN=fleet ;;
esac esac
TAG="$t-latest" TAG="$t-latest"
BODY="$t (binär: $BIN) - rullande bygge från senaste master. Commit: ${{ github.sha }}. Arkitekturer: linux x64 + arm64 (Pi5)." BODY="$t (binär: $BIN) - rullande bygge från senaste master. Commit: ${{ github.sha }}. Arkitekturer: linux x64 + arm64 (Pi5)."

27
.vscode/tasks.json vendored
View File

@@ -241,6 +241,30 @@
"$go" "$go"
] ]
}, },
{
"label": "build fleet",
"type": "shell",
"command": "go build -trimpath -ldflags '-s -w' -o build/fleet .",
"options": {
"cwd": "${workspaceFolder}/fleet"
},
"group": "build",
"problemMatcher": [
"$go"
]
},
{
"label": "test fleet",
"type": "shell",
"command": "go test ./...",
"options": {
"cwd": "${workspaceFolder}/fleet"
},
"group": "test",
"problemMatcher": [
"$go"
]
},
{ {
"label": "build", "label": "build",
"dependsOn": [ "dependsOn": [
@@ -253,7 +277,8 @@
"build svg-maker", "build svg-maker",
"build waitfor", "build waitfor",
"build cronr", "build cronr",
"build giteactl" "build giteactl",
"build fleet"
], ],
"dependsOrder": "parallel", "dependsOrder": "parallel",
"group": { "group": {

View File

@@ -18,6 +18,7 @@ agent understands the result without opening an image viewer.
| [`waitfor/`](waitfor/) | `waitfor` | Blocks until a shell condition holds (exit 0 + optional regex match) — replaces hand-rolled poll loops. `--then` hook composes with notifyr. | | [`waitfor/`](waitfor/) | `waitfor` | Blocks until a shell condition holds (exit 0 + optional regex match) — replaces hand-rolled poll loops. `--then` hook composes with notifyr. |
| [`cronr/`](cronr/) | `cronr` | Recurring/one-shot jobs as systemd user timers that survive session exit and reboot. add/list/run/logs/rm, schedules validated by systemd-analyze. | | [`cronr/`](cronr/) | `cronr` | Recurring/one-shot jobs as systemd user timers that survive session exit and reboot. add/list/run/logs/rm, schedules validated by systemd-analyze. |
| [`giteactl/`](giteactl/) | `giteactl` | Gitea Actions runs, job logs (API/web/ssh+zstd fallback), `wait` (block until green) and `wait-quiet` (the "serialize heavy builds" rule), release assets. | | [`giteactl/`](giteactl/) | `giteactl` | Gitea Actions runs, job logs (API/web/ssh+zstd fallback), `wait` (block until green) and `wait-quiet` (the "serialize heavy builds" rule), release assets. |
| [`fleet/`](fleet/) | `fleet` | One-shot homelab health snapshot: container states, disk fill and failed systemd units across hosts, via read-only commands. Exit 2 = findings. |
Each tool has its own folder, its own README with the full format/CLI Each tool has its own folder, its own README with the full format/CLI
reference, its own tests and its own dev branch (`dev/<tool>`). reference, its own tests and its own dev branch (`dev/<tool>`).
@@ -27,8 +28,8 @@ reference, its own tests and its own dev branch (`dev/<tool>`).
[`doc/tool-parity.md`](doc/tool-parity.md) compares the Google agent's [`doc/tool-parity.md`](doc/tool-parity.md) compares the Google agent's
built-in tools with Claude Code's, and specs the CLI tools that close built-in tools with Claude Code's, and specs the CLI tools that close
the gaps so any agent gets the same capabilities via its shell tool. the gaps so any agent gets the same capabilities via its shell tool.
Built so far: `notifyr`, `waitfor`, `cronr`, `giteactl`, `svgc` Built so far: `notifyr`, `waitfor`, `cronr`, `giteactl`, `svgc`,
(2026-08-07). Still on the list: `fleet`, `envaudit`, `reghelper`, `fleet` (2026-08-07). Still on the list: `envaudit`, `reghelper`,
`pagepub`, `nbcell`, `wtreectl`, `fanout`. Build order and rationale `pagepub`, `nbcell`, `wtreectl`, `fanout`. Build order and rationale
live there and in [`doc/plan.md`](doc/plan.md). Agy finds the tools live there and in [`doc/plan.md`](doc/plan.md). Agy finds the tools
through the `agent-tools` skill in `~/.gemini/config/skills/`. through the `agent-tools` skill in `~/.gemini/config/skills/`.

View File

@@ -31,7 +31,7 @@ master/main. Only tools whose folders changed get rebuilt.
send/read), `waitfor` (block on condition), `cronr` (systemd user send/read), `waitfor` (block on condition), `cronr` (systemd user
timers), `giteactl` (CI runs/logs/wait/wait-quiet/releases) and timers), `giteactl` (CI runs/logs/wait/wait-quiet/releases) and
`svgc` (`svg-maker/`: .svgd → SVG for agent-helm, Björns direkta `svgc` (`svg-maker/`: .svgd → SVG for agent-helm, Björns direkta
önskemål). Alla smoke-testade mot riktig infra; agy-integration önskemål) samt `fleet` (hälsosnapshot). Alla smoke-testade mot riktig infra; agy-integration
via `agent-tools`-skill + AGENTS.md i `~/.gemini/config/`. via `agent-tools`-skill + AGENTS.md i `~/.gemini/config/`.
## Roadmap / expansion ideas (not agreed yet) ## Roadmap / expansion ideas (not agreed yet)

View File

@@ -292,7 +292,7 @@ binaries), same philosophy — don't duplicate those here.
1.`notifyr` — smallest, everything else composes with it, ntfy already runs. *(built 2026-08-07)* 1.`notifyr` — smallest, everything else composes with it, ntfy already runs. *(built 2026-08-07)*
2.`giteactl` — removes the biggest daily friction (CI logs + build serialization). *(built 2026-08-07; private repos need an API token in the config)* 2.`giteactl` — removes the biggest daily friction (CI logs + build serialization). *(built 2026-08-07; private repos need an API token in the config)*
3.`waitfor` + `cronr` — turns both agents into unattended operators. *(built 2026-08-07)* 3.`waitfor` + `cronr` — turns both agents into unattended operators. *(built 2026-08-07)*
4. `fleet` — replaces the hand-rolled health loops in every runbook. 4. `fleet` — replaces the hand-rolled health loops in every runbook. *(built 2026-08-07)*
5. `envaudit`, `reghelper`, `pagepub`, `nbcell`, `wtreectl` — as needed. 5. `envaudit`, `reghelper`, `pagepub`, `nbcell`, `wtreectl` — as needed.
6. `fanout` — only if a concrete multi-agent need shows up. 6. `fanout` — only if a concrete multi-agent need shows up.

View File

@@ -30,6 +30,11 @@ canvas** — so mistakes surface as text even without the preview.
Errors carry line numbers (`card.svgd: line 7: "four" is not a Errors carry line numbers (`card.svgd: line 7: "four" is not a
number — rect needs: rect <x> <y> <w> <h>`). number — rect needs: rect <x> <y> <w> <h>`).
The example above, rendered (this exact file is
[`examples/gauge.svgd`](examples/gauge.svgd) → [`examples/gauge.svg`](examples/gauge.svg)):
![gauge example](examples/gauge.svg)
## The .svgd format ## The .svgd format
One element per line, `#` comments, `key=value` attributes last: One element per line, `#` comments, `key=value` attributes last:

View File

@@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 120" width="240" height="120">
<rect width="100%" height="100%" fill="#12161f"/>
<rect x="8" y="8" width="224" height="104" fill="none" rx="10" stroke="#262d3a" stroke-width="2"/>
<circle cx="40" cy="60" r="22" fill="none" stroke="#3fca7c" stroke-width="6"/>
<path d="M30,60 L38,68 L52,50" fill="none" stroke="#3fca7c" stroke-linecap="round" stroke-width="5"/>
<text x="76" y="54" fill="#8a93a5" font-size="13">backups</text>
<text x="76" y="76" fill="white" font-size="17" font-weight="bold">all green</text>
</svg>

After

Width:  |  Height:  |  Size: 586 B