feat(fleet): add local canary CLI
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
ci/woodpecker/pr/ci Pipeline was successful

This commit is contained in:
Jarvis
2026-06-20 11:52:09 -05:00
parent 00e464b9c3
commit 0c95aa3e6e
14 changed files with 1782 additions and 4 deletions

View File

@@ -0,0 +1,26 @@
# Mosaic Fleet Rosters
The local fleet canary uses a product-owned roster schema with site-owned roster
files. Product examples live here; active local rosters should live outside the
package, normally at:
```text
~/.config/mosaic/fleet/roster.yaml
```
The default tmux socket is `mosaic-factory` so fleet commands do not touch the
default tmux server.
## Examples
- `examples/minimal.yaml` starts one local canary slot.
- `examples/local-canary.yaml` starts a small generic dogfood fleet.
Initialize a roster:
```bash
mosaic fleet init --profile minimal --write
mosaic fleet install-systemd
mosaic fleet start
mosaic fleet verify
```

View File

@@ -0,0 +1,27 @@
version: 1
transport: tmux
tmux:
socket_name: mosaic-factory
holder_session: _holder
defaults:
working_directory: ~/src
runtimes:
claude:
reset_command: /clear
codex:
reset_command: /clear
pi:
reset_command: /new
agents:
- name: lead
runtime: claude
class: orchestrator
persistent_persona: true
- name: coder0
runtime: codex
class: implementer
reset_between_tasks: true
- name: reviewer0
runtime: pi
class: reviewer
reset_between_tasks: true

View File

@@ -0,0 +1,15 @@
version: 1
transport: tmux
tmux:
socket_name: mosaic-factory
holder_session: _holder
defaults:
working_directory: ~/src
runtimes:
pi:
reset_command: /new
agents:
- name: canary-pi
runtime: pi
class: canary
reset_between_tasks: true

View File

@@ -0,0 +1,118 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://mosaicstack.dev/schemas/fleet-roster.schema.json",
"title": "Mosaic Fleet Roster",
"type": "object",
"required": ["version", "transport", "agents"],
"additionalProperties": false,
"properties": {
"version": {
"const": 1
},
"transport": {
"const": "tmux"
},
"tmux": {
"type": "object",
"additionalProperties": false,
"properties": {
"socket_name": {
"type": "string",
"default": "mosaic-factory"
},
"socketName": {
"type": "string",
"default": "mosaic-factory"
},
"holder_session": {
"type": "string",
"default": "_holder"
},
"holderSession": {
"type": "string",
"default": "_holder"
}
}
},
"defaults": {
"type": "object",
"additionalProperties": false,
"properties": {
"working_directory": {
"type": "string",
"default": "~/src"
},
"workingDirectory": {
"type": "string",
"default": "~/src"
}
}
},
"runtimes": {
"type": "object",
"additionalProperties": {
"type": "object",
"additionalProperties": false,
"properties": {
"reset_command": {
"type": "string"
},
"resetCommand": {
"type": "string"
}
}
}
},
"agents": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"required": ["name", "runtime"],
"additionalProperties": false,
"properties": {
"name": {
"type": "string",
"pattern": "^[A-Za-z0-9_.-]+$"
},
"runtime": {
"type": "string"
},
"class": {
"type": "string"
},
"working_directory": {
"type": "string"
},
"workingDirectory": {
"type": "string"
},
"model_hint": {
"type": "string"
},
"modelHint": {
"type": "string"
},
"persistent_persona": {
"oneOf": [{ "type": "boolean" }, { "type": "string" }]
},
"persistentPersona": {
"oneOf": [{ "type": "boolean" }, { "type": "string" }]
},
"reset_between_tasks": {
"type": "boolean"
},
"resetBetweenTasks": {
"type": "boolean"
},
"kickstart_template": {
"type": "string"
},
"kickstartTemplate": {
"type": "string"
}
}
}
}
}
}