@crvouga/dev-fleet 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.mise/locks/aws-cdk/2.1146.1/aube-lock.yaml +24 -0
- package/.mise/locks/aws-cdk/2.1146.1/package.json +7 -0
- package/.mise/locks/azure-cli/2.91.0~a837e014/pyproject.toml +5 -0
- package/.mise/locks/azure-cli/2.91.0~a837e014/uv.lock +2794 -0
- package/.mise/locks/gemini/0.66.0~84aac8e6/aube-lock.yaml +123 -0
- package/.mise/locks/gemini/0.66.0~84aac8e6/package.json +12 -0
- package/.mise/locks/npm-devcontainers-cli/0.90.0/aube-lock.yaml +24 -0
- package/.mise/locks/npm-devcontainers-cli/0.90.0/package.json +7 -0
- package/.mise/locks/npm-modelcontextprotocol-inspector/2.13.0~4c109bea/aube-lock.yaml +1432 -0
- package/.mise/locks/npm-modelcontextprotocol-inspector/2.13.0~4c109bea/package.json +7 -0
- package/.mise/locks/npm-vercel/65.8.0/aube-lock.yaml +3595 -0
- package/.mise/locks/npm-vercel/65.8.0/package.json +7 -0
- package/.mise/locks/npm-wrangler/4.156.0/aube-lock.yaml +895 -0
- package/.mise/locks/npm-wrangler/4.156.0/package.json +7 -0
- package/.mise/locks/npm-yarnpkg-cli-dist/4.18.1/aube-lock.yaml +24 -0
- package/.mise/locks/npm-yarnpkg-cli-dist/4.18.1/package.json +7 -0
- package/LICENSE +21 -0
- package/README.md +157 -2
- package/agents/antigravity-proxy.ts +3 -0
- package/agents/audit.md +89 -0
- package/agents/claude-proxy +5 -0
- package/agents/claude-proxy.ts +3 -0
- package/agents/codex-proxy.ts +3 -0
- package/agents/grok-proxy.ts +3 -0
- package/agents/managed-proxy.ts +55 -0
- package/agents/opencode-proxy.ts +3 -0
- package/agents/registry.json +209 -0
- package/agents/registry.schema.json +149 -0
- package/agents/setup.md +128 -0
- package/agents/t3.json +40 -0
- package/ansible/macos/manager.yml +30 -0
- package/ansible/macos/policy.json +17 -0
- package/ansible/monitoring/README.md +154 -0
- package/ansible/monitoring/agent-darwin.yml +198 -0
- package/ansible/monitoring/agent.yml +134 -0
- package/ansible/monitoring/beszel-agent.service +42 -0
- package/ansible/monitoring/compose.yml +74 -0
- package/ansible/monitoring/hub-darwin.yml +102 -0
- package/ansible/monitoring/lock.json +11 -0
- package/ansible/net/remote-probe.sh +13 -0
- package/ansible/ubuntu/authorize-sudo.sh +51 -0
- package/ansible/ubuntu/baseline.yml +89 -0
- package/ansible/ubuntu/disk-guard.py +104 -0
- package/ansible/ubuntu/policy.json +43 -0
- package/ansible/ubuntu/recovery.yml +15 -0
- package/ansible/ubuntu/t3/policy.json +7 -0
- package/ansible/ubuntu/t3-desktop.yml +220 -0
- package/ansible/ubuntu/t3-health.sh +33 -0
- package/ansible/ubuntu/t3-policy.yml +76 -0
- package/ansible/ubuntu/t3-route.yml +28 -0
- package/ansible/ubuntu/tailscale.yml +75 -0
- package/ansible/ubuntu/tasks/credentials.yml +47 -0
- package/ansible/ubuntu/tasks/docker.yml +31 -0
- package/ansible/ubuntu/tasks/packages.yml +56 -0
- package/ansible/ubuntu/tasks/power.yml +51 -0
- package/ansible/ubuntu/tasks/recovery.yml +39 -0
- package/ansible/ubuntu/tasks/resources.yml +252 -0
- package/ansible/ubuntu/tasks/services.yml +31 -0
- package/ansible/ubuntu/tasks/ssh.yml +71 -0
- package/ansible/ubuntu/tasks/user.yml +120 -0
- package/bin/devfleet.mjs +36 -0
- package/bootstrap/bootstrap.ps1 +50 -0
- package/bootstrap/bootstrap.sh +73 -0
- package/bootstrap/devfleet +7 -0
- package/bootstrap/docker-desktop.sh +33 -0
- package/bootstrap/doctor.ts +189 -0
- package/bootstrap/fleet-manager-run.sh +76 -0
- package/bootstrap/fleet-remote-bootstrap.sh +185 -0
- package/bootstrap/global-config.ts +113 -0
- package/bootstrap/install-launcher.sh +7 -0
- package/bootstrap/native-aws.ts +86 -0
- package/bootstrap/native-t3.ts +154 -0
- package/bootstrap/npm.ts +350 -0
- package/bootstrap/setup-status.ts +51 -0
- package/bootstrap/setup.ts +88 -0
- package/bootstrap/shell-path.ts +105 -0
- package/bootstrap/verify-t3-archive.py +49 -0
- package/bootstrap/worker-auth.ts +65 -0
- package/bootstrap/worker-github.ts +47 -0
- package/bootstrap/worker-tools.ts +24 -0
- package/cliproxy/AGENTS.md +11 -0
- package/cliproxy/README.md +269 -0
- package/cliproxy/clients/bootstrap.py +143 -0
- package/cliproxy/clients/launcher.py +57 -0
- package/cliproxy/compose.yaml +90 -0
- package/cliproxy/config.template.yaml +70 -0
- package/cliproxy/docs/cloud-adoption.md +16 -0
- package/cliproxy/docs/deployment.png +0 -0
- package/cliproxy/docs/deployment.svg +109 -0
- package/cliproxy/docs/health-workflow.example.yml +185 -0
- package/cliproxy/docs/migration.md +131 -0
- package/cliproxy/docs/model-health-report.schema.json +364 -0
- package/cliproxy/docs/model-health.md +393 -0
- package/cliproxy/image.lock.json +5 -0
- package/cliproxy/launchd/dev.devfleet.cliproxy-backup-check.plist +38 -0
- package/cliproxy/launchd/dev.devfleet.cliproxy-backup.plist +48 -0
- package/cliproxy/launchd/dev.devfleet.cliproxy-fleet.plist +32 -0
- package/cliproxy/launchd/dev.devfleet.cliproxy-gc.plist +38 -0
- package/cliproxy/launchd/dev.devfleet.cliproxy-monitor.plist +29 -0
- package/cliproxy/launchd/dev.devfleet.cliproxy-vault-renew.plist +31 -0
- package/cliproxy/models.json +1618 -0
- package/cliproxy/requirements.lock +78 -0
- package/cliproxy/scripts/accounts.py +38 -0
- package/cliproxy/scripts/audit.py +123 -0
- package/cliproxy/scripts/backup +234 -0
- package/cliproxy/scripts/check.py +34 -0
- package/cliproxy/scripts/checkpoint.py +226 -0
- package/cliproxy/scripts/cli.py +64 -0
- package/cliproxy/scripts/cliproxy_host.py +257 -0
- package/cliproxy/scripts/cloud_state.py +150 -0
- package/cliproxy/scripts/container-health +6 -0
- package/cliproxy/scripts/docker +24 -0
- package/cliproxy/scripts/external-health.py +79 -0
- package/cliproxy/scripts/fleet_config.py +43 -0
- package/cliproxy/scripts/fleet_sync.py +274 -0
- package/cliproxy/scripts/initialize +84 -0
- package/cliproxy/scripts/install-dependencies +48 -0
- package/cliproxy/scripts/install.py +406 -0
- package/cliproxy/scripts/model_health.py +16 -0
- package/cliproxy/scripts/modelhealth/__init__.py +5 -0
- package/cliproxy/scripts/modelhealth/checks.py +429 -0
- package/cliproxy/scripts/modelhealth/cli.py +117 -0
- package/cliproxy/scripts/modelhealth/config.py +186 -0
- package/cliproxy/scripts/modelhealth/emulator.py +536 -0
- package/cliproxy/scripts/modelhealth/expect.py +88 -0
- package/cliproxy/scripts/modelhealth/findings.py +183 -0
- package/cliproxy/scripts/modelhealth/protocol.py +330 -0
- package/cliproxy/scripts/modelhealth/redact.py +28 -0
- package/cliproxy/scripts/modelhealth/report.py +150 -0
- package/cliproxy/scripts/modelhealth/runner.py +390 -0
- package/cliproxy/scripts/modelhealth/scenario.py +131 -0
- package/cliproxy/scripts/modelhealth/schema.py +63 -0
- package/cliproxy/scripts/modelhealth/simulate.py +111 -0
- package/cliproxy/scripts/modelhealth/transport.py +213 -0
- package/cliproxy/scripts/monitor +68 -0
- package/cliproxy/scripts/ops +527 -0
- package/cliproxy/scripts/public-endpoint +127 -0
- package/cliproxy/scripts/recover_node.py +177 -0
- package/cliproxy/scripts/restore-verify +60 -0
- package/cliproxy/scripts/retention.py +144 -0
- package/cliproxy/scripts/service-start +7 -0
- package/cliproxy/scripts/validate-config +56 -0
- package/cliproxy/scripts/vault-access.py +57 -0
- package/cliproxy/scripts/vault-backup-login +55 -0
- package/cliproxy/scripts/vault-recovery +56 -0
- package/cliproxy/scripts/vault-renew +30 -0
- package/cliproxy/systemd/cliproxy-backup-check.service +10 -0
- package/cliproxy/systemd/cliproxy-backup-check.timer +8 -0
- package/cliproxy/systemd/cliproxy-backup.service +13 -0
- package/cliproxy/systemd/cliproxy-backup.timer +8 -0
- package/cliproxy/systemd/cliproxy-fleet.service +17 -0
- package/cliproxy/systemd/cliproxy-gc.service +13 -0
- package/cliproxy/systemd/cliproxy-gc.timer +8 -0
- package/cliproxy/systemd/cliproxy-monitor.service +8 -0
- package/cliproxy/systemd/cliproxy-monitor.timer +7 -0
- package/cliproxy/systemd/cliproxy-vault-renew.service +8 -0
- package/cliproxy/systemd/cliproxy-vault-renew.timer +7 -0
- package/cliproxy/vendor/LICENSE +22 -0
- package/cliproxy/vendor/config.upstream.yaml +1349 -0
- package/examples/fleet.json +95 -0
- package/examples/roster.json +13 -0
- package/mise.lock +1492 -0
- package/mise.toml +99 -0
- package/package.json +65 -4
- package/schema/fleet.schema.json +364 -0
- package/schema/roster.schema.json +77 -0
- package/src/agents/account-relay.ts +111 -0
- package/src/agents/accounts.ts +85 -0
- package/src/agents/audit.ts +77 -0
- package/src/agents/cli.ts +13 -0
- package/src/agents/command.ts +204 -0
- package/src/agents/converge.ts +123 -0
- package/src/agents/doctor.ts +107 -0
- package/src/agents/errors.ts +2 -0
- package/src/agents/files.ts +73 -0
- package/src/agents/fleet-verify.ts +156 -0
- package/src/agents/launch.ts +290 -0
- package/src/agents/native-verify.ts +226 -0
- package/src/agents/provider-errors.ts +50 -0
- package/src/agents/registry.ts +55 -0
- package/src/agents/render.ts +110 -0
- package/src/agents/round-trip.ts +192 -0
- package/src/agents/secrets.ts +13 -0
- package/src/agents/toolchain.ts +34 -0
- package/src/agents/verify-cache.ts +103 -0
- package/src/agents/verify.ts +127 -0
- package/src/auth-checks.ts +163 -0
- package/src/cli/agent-guide.ts +95 -0
- package/src/cli/app.ts +115 -0
- package/src/cli/cli.ts +21 -0
- package/src/cli/command-index.ts +50 -0
- package/src/cli/contracts.ts +25 -0
- package/src/cli/fleet-reference.ts +17 -0
- package/src/cli/fleet-sync-checkout.ts +91 -0
- package/src/cli/fleet-sync-enrollment.ts +144 -0
- package/src/cli/fleet-sync-forward.ts +134 -0
- package/src/cli/fleet-sync-manager.ts +193 -0
- package/src/cli/fleet-sync-monitoring.ts +185 -0
- package/src/cli/fleet-sync-output.ts +314 -0
- package/src/cli/fleet-sync-privilege.ts +27 -0
- package/src/cli/fleet-sync-progress.ts +109 -0
- package/src/cli/fleet-sync-remote.ts +236 -0
- package/src/cli/fleet-sync-report.ts +26 -0
- package/src/cli/fleet-sync-schedule.ts +138 -0
- package/src/cli/fleet-sync-vault.ts +166 -0
- package/src/cli/fleet-sync.ts +309 -0
- package/src/cli/fleet.ts +163 -0
- package/src/cli/managed-health.ts +219 -0
- package/src/cli/node-deployment.ts +34 -0
- package/src/cli/node-sync.ts +114 -0
- package/src/cli/node-t3.ts +31 -0
- package/src/cli/options.ts +141 -0
- package/src/cli/probe-source.ts +7 -0
- package/src/cli/program.ts +169 -0
- package/src/cli/register-fleet.ts +246 -0
- package/src/cli/registry.ts +158 -0
- package/src/cli/repair-apply.ts +67 -0
- package/src/cli/repair-guard.ts +11 -0
- package/src/cli/repair-inspect.ts +150 -0
- package/src/cli/repair-script.ts +76 -0
- package/src/cli/repair.ts +209 -0
- package/src/cli/roster.ts +89 -0
- package/src/cli/search.ts +35 -0
- package/src/cli/settings.ts +64 -0
- package/src/cli/source-operations.ts +78 -0
- package/src/cli/t3/command.ts +90 -0
- package/src/cli/t3/register.ts +55 -0
- package/src/cli/tailnet.ts +127 -0
- package/src/cli/ui-actions.ts +133 -0
- package/src/cli/ui-controller.ts +113 -0
- package/src/cli/ui-data.ts +106 -0
- package/src/cli/ui-execute.ts +163 -0
- package/src/cli/ui-repairs.ts +34 -0
- package/src/cli/ui-reports.ts +211 -0
- package/src/cli/ui-targets.ts +100 -0
- package/src/cli/ui-terminal.ts +109 -0
- package/src/cli/ui-types.ts +49 -0
- package/src/cli/ui-wizard.ts +101 -0
- package/src/cli/ui.ts +9 -0
- package/src/cli/worker-health-output.ts +37 -0
- package/src/config.ts +186 -0
- package/src/configure.ts +255 -0
- package/src/definition.ts +260 -0
- package/src/diagnostics.ts +92 -0
- package/src/doctor-check.ts +10 -0
- package/src/errors.ts +1 -0
- package/src/fingerprint.ts +120 -0
- package/src/fleet-config.ts +88 -0
- package/src/index.ts +6 -0
- package/src/input-hashes.ts +73 -0
- package/src/machine/local-source.ts +52 -0
- package/src/machine/lock-error.ts +2 -0
- package/src/machine/platform.ts +44 -0
- package/src/machine/source.ts +68 -0
- package/src/machine/state.ts +185 -0
- package/src/machine-health.ts +95 -0
- package/src/managed-source.ts +47 -0
- package/src/manager-failure.ts +48 -0
- package/src/manager-sync.ts +400 -0
- package/src/manager.ts +62 -0
- package/src/monitoring/apply.ts +171 -0
- package/src/monitoring/beszel.ts +191 -0
- package/src/monitoring/enroll.ts +110 -0
- package/src/monitoring/hub-access.ts +113 -0
- package/src/monitoring/hub-viewer.ts +142 -0
- package/src/monitoring/hub.ts +93 -0
- package/src/monitoring/manager-agent.ts +73 -0
- package/src/monitoring/manager-hub.ts +232 -0
- package/src/monitoring/remote.ts +65 -0
- package/src/network-definition.ts +83 -0
- package/src/node-converge-linux.ts +372 -0
- package/src/node-converge-shared.ts +83 -0
- package/src/node-converge.ts +40 -0
- package/src/onboard.ts +35 -0
- package/src/platform/ansible-receipt.ts +128 -0
- package/src/platform/ansible.ts +62 -0
- package/src/platform/darwin.ts +203 -0
- package/src/platform/detect.ts +11 -0
- package/src/platform/fallback.ts +110 -0
- package/src/platform/index.ts +38 -0
- package/src/platform/launchd.ts +98 -0
- package/src/platform/linux.ts +139 -0
- package/src/platform/ps.ts +45 -0
- package/src/platform/resource-verify.ts +128 -0
- package/src/platform/systemd-user.ts +95 -0
- package/src/platform/t3-policy.ts +137 -0
- package/src/platform/t3-route.ts +68 -0
- package/src/platform/t3-service.ts +75 -0
- package/src/platform/types.ts +123 -0
- package/src/platform/ubuntu-audit.ts +63 -0
- package/src/platform/ubuntu-verify.ts +105 -0
- package/src/platform/windows.ts +148 -0
- package/src/power-recovery.ts +55 -0
- package/src/probe.ts +51 -0
- package/src/protocol.ts +119 -0
- package/src/proxy-converge.ts +85 -0
- package/src/remote-bootstrap.ts +212 -0
- package/src/remote-entry.ts +89 -0
- package/src/remote-lock.ts +12 -0
- package/src/repair-catalog.ts +206 -0
- package/src/repair-plan.ts +78 -0
- package/src/repair-runner.ts +84 -0
- package/src/report.ts +71 -0
- package/src/runner.ts +104 -0
- package/src/secrets.ts +169 -0
- package/src/service-auth.ts +115 -0
- package/src/ssh.ts +135 -0
- package/src/sync.ts +104 -0
- package/src/t3/accounts.ts +81 -0
- package/src/t3/desired.ts +165 -0
- package/src/t3/files.ts +81 -0
- package/src/t3/names-check.ts +53 -0
- package/src/t3/names.ts +155 -0
- package/src/t3/plan.ts +82 -0
- package/src/t3/providers.ts +74 -0
- package/src/t3/reconcile.ts +123 -0
- package/src/t3-endpoint.ts +48 -0
- package/src/t3-linked-check.ts +101 -0
- package/src/tailnet-health.ts +231 -0
- package/src/tailnet-matching.ts +37 -0
- package/src/tailscale.ts +141 -0
- package/src/test-fixtures.ts +36 -0
- package/src/toolchain-checks.ts +83 -0
- package/src/topology.ts +24 -0
- package/src/transport.ts +122 -0
- package/src/types.ts +95 -0
- package/src/vault-config.ts +38 -0
- package/src/worker-access-checks.ts +115 -0
- package/src/worker-capacity.ts +34 -0
- package/src/worker-host-checks.ts +176 -0
- package/src/worker-policy.ts +64 -0
- package/src/worker-readiness.ts +64 -0
- package/src/workstation-checks.ts +29 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
lockfileVersion: '9.0'
|
|
2
|
+
|
|
3
|
+
settings:
|
|
4
|
+
autoInstallPeers: true
|
|
5
|
+
excludeLinksFromLockfile: false
|
|
6
|
+
|
|
7
|
+
importers:
|
|
8
|
+
|
|
9
|
+
.:
|
|
10
|
+
dependencies:
|
|
11
|
+
'@yarnpkg/cli-dist':
|
|
12
|
+
specifier: 4.18.1
|
|
13
|
+
version: 4.18.1
|
|
14
|
+
|
|
15
|
+
packages:
|
|
16
|
+
|
|
17
|
+
'@yarnpkg/cli-dist@4.18.1':
|
|
18
|
+
resolution: {integrity: sha512-EH+A4TxAtBWXKE0DGQxW9Bo9crXHLJ73mfxjTQJuv8XonNWWTpei8BQ5JjczHJNU9GROTycwMFn8iOvRIZXUcA==}
|
|
19
|
+
engines: {node: '>=18.12.0'}
|
|
20
|
+
hasBin: true
|
|
21
|
+
|
|
22
|
+
snapshots:
|
|
23
|
+
|
|
24
|
+
'@yarnpkg/cli-dist@4.18.1': {}
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dev-fleet contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,158 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dev-fleet
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Keeps a set of development machines in sync: one **manager** and many
|
|
4
|
+
**workers**. One command, `fleet-sync`, brings every machine to the same
|
|
5
|
+
pinned tools, the same coding agents signed in through one proxy, the same
|
|
6
|
+
uptime policy and the same monitoring. Adding or removing a machine is one
|
|
7
|
+
entry in `fleet.json`.
|
|
8
|
+
|
|
9
|
+
Status: extracted from a working three-machine fleet and in daily use there.
|
|
10
|
+
It has not yet been set up from nothing by a second person; expect rough edges
|
|
11
|
+
and read [what is assumed](#what-it-assumes) first.
|
|
12
|
+
|
|
13
|
+
## What it assumes
|
|
14
|
+
|
|
15
|
+
dev-fleet is opinionated. These are part of it, not options:
|
|
16
|
+
|
|
17
|
+
- The **manager** is a macOS machine. It runs `fleet-sync` and hosts the
|
|
18
|
+
shared services (the CLI proxy and the monitoring hub) in Docker Desktop.
|
|
19
|
+
- **Workers** are Ubuntu 26.04 machines reached over SSH. They are stateless:
|
|
20
|
+
everything on them is rebuilt from Git and your secrets.
|
|
21
|
+
- Machines reach each other over **Tailscale**.
|
|
22
|
+
- Coding agents (Claude Code, Codex, Grok, OpenCode, Antigravity) run through
|
|
23
|
+
**CLIProxyAPI** on the manager, and **T3 Code** lists one provider per
|
|
24
|
+
account signed in on the proxy.
|
|
25
|
+
- Machine policy is **Ansible** (`ansible/`), tool versions are **mise** pins
|
|
26
|
+
(`mise.toml`, `mise.lock`), monitoring is **Beszel**.
|
|
27
|
+
|
|
28
|
+
What it does not assume is anything about you: no account, hostname, domain,
|
|
29
|
+
tailnet or repository is written in this code. They live in your `fleet.json`.
|
|
30
|
+
|
|
31
|
+
## Quickstart
|
|
32
|
+
|
|
33
|
+
On the manager (macOS, with Git, Docker Desktop and Tailscale signed in):
|
|
34
|
+
|
|
35
|
+
```sh
|
|
36
|
+
git clone https://github.com/crvouga/dev-fleet.git ~/.local/share/dev-fleet/source
|
|
37
|
+
cd ~/.local/share/dev-fleet/source
|
|
38
|
+
bash bootstrap/bootstrap.sh # installs the pinned toolchain with mise
|
|
39
|
+
|
|
40
|
+
mkdir -p ~/.config/dev-fleet
|
|
41
|
+
cp examples/fleet.json ~/.config/dev-fleet/fleet.json
|
|
42
|
+
$EDITOR ~/.config/dev-fleet/fleet.json # your machines, endpoints and secrets
|
|
43
|
+
|
|
44
|
+
export DEVFLEET_REPO=$PWD
|
|
45
|
+
sh bootstrap/fleet-manager-run.sh "$(git rev-parse HEAD)" --dry-run # preview
|
|
46
|
+
sh bootstrap/fleet-manager-run.sh "$(git rev-parse HEAD)" # apply
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
`fleet-sync` converges the manager first, then every worker over SSH: it sends
|
|
50
|
+
the pinned revision and your configuration, installs the toolchain, applies
|
|
51
|
+
the Ansible policy and verifies the result. It prints one table and writes a
|
|
52
|
+
full JSON report.
|
|
53
|
+
|
|
54
|
+
Most people keep `fleet.json` in their own repository and point at it:
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
DEVFLEET_CONFIG=/path/to/your/fleet.json sh bootstrap/fleet-manager-run.sh REVISION
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Pin `REVISION` to a full commit SHA of this repository; that is your version.
|
|
61
|
+
|
|
62
|
+
## Run it from npm
|
|
63
|
+
|
|
64
|
+
The CLI is also published as `@crvouga/dev-fleet`, for any machine or project
|
|
65
|
+
that has Node:
|
|
66
|
+
|
|
67
|
+
```sh
|
|
68
|
+
npx @crvouga/dev-fleet commands --json
|
|
69
|
+
npx @crvouga/dev-fleet fleet-status --local
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`fleet-sync` still runs from a clone, because it pins a git revision. See
|
|
73
|
+
[releasing](docs/releasing.md) for how versions are published.
|
|
74
|
+
|
|
75
|
+
## Add or remove a machine
|
|
76
|
+
|
|
77
|
+
1. Set up SSH from the manager to the new Ubuntu box (a non-root user with
|
|
78
|
+
sudo) and join it to your tailnet.
|
|
79
|
+
2. Add it under `workers` in `fleet.json`:
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"id": "worker-three",
|
|
84
|
+
"ssh": "worker-three",
|
|
85
|
+
"os": "linux",
|
|
86
|
+
"network": {
|
|
87
|
+
"tailscaleName": "worker-three.tail0a1b2c.ts.net",
|
|
88
|
+
"sshPort": 22,
|
|
89
|
+
"user": "dev",
|
|
90
|
+
"t3Port": 3773
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
3. Run `fleet-sync`. A box that has only sudo is enough: the opt-in test
|
|
96
|
+
`bun ansible/ubuntu/tests/fresh-box.ts` proves that against a bare
|
|
97
|
+
container.
|
|
98
|
+
|
|
99
|
+
Remove a machine by deleting its entry.
|
|
100
|
+
|
|
101
|
+
## Configuration
|
|
102
|
+
|
|
103
|
+
`fleet.json` is validated by [`schema/fleet.schema.json`](schema/fleet.schema.json);
|
|
104
|
+
[`examples/fleet.json`](examples/fleet.json) is a complete example.
|
|
105
|
+
|
|
106
|
+
| Block | What it declares |
|
|
107
|
+
| ---------- | ------------------------------------------------------------------- |
|
|
108
|
+
| `source` | The Git repository nodes accept code from (this one, or your fork) |
|
|
109
|
+
| `secrets` | Where secrets are kept: `env`, `file`, `sops` or `vault` |
|
|
110
|
+
| `manager` | The one macOS manager |
|
|
111
|
+
| `workers` | The Ubuntu workers |
|
|
112
|
+
| `services` | The proxy's public origin and the monitoring dashboard and accounts |
|
|
113
|
+
| `worker` | Policy every worker must meet |
|
|
114
|
+
|
|
115
|
+
Secrets are asked for by purpose (`proxy-client-key`,
|
|
116
|
+
`monitoring-account-password`, `monitoring-tunnel-token`,
|
|
117
|
+
`proxy-tunnel-token`); see [`src/secrets.ts`](src/secrets.ts).
|
|
118
|
+
|
|
119
|
+
## Known limits
|
|
120
|
+
|
|
121
|
+
- Each worker's own login and renewal, and the proxy's backup and recovery,
|
|
122
|
+
are implemented for the **`vault`** secrets provider only. With `env`, `file`
|
|
123
|
+
or `sops` the fleet's three shared secrets are read, but those two features
|
|
124
|
+
are not available yet.
|
|
125
|
+
- State on machines still uses the historical `personal` prefix
|
|
126
|
+
(`~/.local/share/personal/fleet`, `/etc/personal-fleet`, unit names). It
|
|
127
|
+
works, and renaming it needs a migration.
|
|
128
|
+
- The manager is a Mac host. There is no container image of the manager.
|
|
129
|
+
- The reference documents under `docs/` were written for the fleet this came
|
|
130
|
+
from and are being revised.
|
|
131
|
+
|
|
132
|
+
## Repository layout
|
|
133
|
+
|
|
134
|
+
| Path | What |
|
|
135
|
+
| ------------ | ----------------------------------------------------------------- |
|
|
136
|
+
| `src/` | Inventory, orchestration, verification, the report; `src/cli` CLI |
|
|
137
|
+
| `ansible/` | Machine policy: `ubuntu/`, `macos/`, `monitoring/` |
|
|
138
|
+
| `agents/` | Agent launchers T3 runs, and their registry |
|
|
139
|
+
| `cliproxy/` | The CLIProxyAPI service: install, audit, backup, model health |
|
|
140
|
+
| `bootstrap/` | Toolchain bootstrap and the manager and worker entry scripts |
|
|
141
|
+
| `schema/` | JSON schemas for `fleet.json` and the private roster |
|
|
142
|
+
| `examples/` | A complete example configuration |
|
|
143
|
+
|
|
144
|
+
## Develop
|
|
145
|
+
|
|
146
|
+
```sh
|
|
147
|
+
bash bootstrap/bootstrap.sh
|
|
148
|
+
bun install --frozen-lockfile
|
|
149
|
+
bun run check
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
`bun run check` runs formatting, typecheck, lint, the TypeScript tests and the
|
|
153
|
+
proxy package's Python tests. Tests run against `examples/fleet.json` and
|
|
154
|
+
never contact a real machine.
|
|
155
|
+
|
|
156
|
+
## License
|
|
157
|
+
|
|
158
|
+
MIT. See [LICENSE](LICENSE).
|
package/agents/audit.md
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Agent configuration audit and ownership
|
|
2
|
+
|
|
3
|
+
Audited against the checked-in tool pins and client source, installed T3 source
|
|
4
|
+
`322f6544dfad0a3c8a0c8cbecf2c7f7874b14268`, and linked vendor documentation.
|
|
5
|
+
This is a compatibility inventory, not a claim that all desktop apps or fleet
|
|
6
|
+
nodes were inspected or authenticated. The execution host exposes Codex, Claude
|
|
7
|
+
and T3 on PATH; the mise catalog additionally includes Gemini, Copilot and OpenCode.
|
|
8
|
+
Cursor and Antigravity are desktop prerequisites, not mise-managed binaries.
|
|
9
|
+
|
|
10
|
+
| Source/owner | Installed destination | Scope |
|
|
11
|
+
| ---------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
|
|
12
|
+
| `mise.toml`, `mise.lock`, `.mise/locks/`; bootstrap | Global mise config, shims and installed tools | Versions; no authentication |
|
|
13
|
+
| `agents/registry.json`; dev-fleet | Dedicated profile outputs described below | Endpoint, models, secret references, node model overrides |
|
|
14
|
+
| `cli/lib/agents/render.ts`; dev-fleet | `ROOT/NODE/codex/{direct,proxy}/config.toml` | Separate CODEX_HOME, Responses HTTP/SSE provider declaration |
|
|
15
|
+
| same | `ROOT/NODE/claude/{direct,proxy}/settings.json` | Passed using native --settings; process environment routes proxy |
|
|
16
|
+
| same | `ROOT/NODE/opencode/{direct,proxy}/opencode.json` | OPENCODE_CONFIG, environment key placeholder |
|
|
17
|
+
| same | `ROOT/NODE/gemini/direct/.gemini/settings.json` | GEMINI_CLI_HOME is the profile root; independent native login |
|
|
18
|
+
| `cli/lib/agents/converge.ts`; dev-fleet | Each profile's receipt.json; ROOT/backups | Nonsecret fingerprints/revision; private migration backups |
|
|
19
|
+
| Existing `opencode/provider-secrets.ts`, OpenRouter package; dev-fleet | Platform OpenCode directory/opencode.json | Vault provider catalog, OpenRouter auto policy; existing sync embeds private keys with mode 0600 |
|
|
20
|
+
| Existing OpenCode plugins/bin and cli/lib/links.ts; dev-fleet | Platform OpenCode plugins/bin, tui.json, notifier files | Notification plugins, sounds, platform-derived app paths |
|
|
21
|
+
| `agents/codex-proxy.ts`; dev-fleet | T3 binaryPath points directly into reviewed Git checkout | Runtime Vault injection; WS_AGENT_NODE is a declared machine value |
|
|
22
|
+
| `agents/t3.json`; personal T3 reconciler | T3CODE_HOME/userdata/settings.json | Owned provider instances only; plan/apply/import/cleanup and private ownership state |
|
|
23
|
+
| `../fleet/definition.json`, cli/lib/net; dev-fleet | Managed SSH block and VS Code Remote-SSH settings | Existing machine aliases, OS/user/identity public paths and T3 ports; no private keys |
|
|
24
|
+
| `.agents/commands/*.md`; agents:sync | Harness command symlinks | Canonical agent commands; do not edit copies |
|
|
25
|
+
| Root AGENTS.md, CLAUDE.md, GEMINI.md, .github/copilot-instructions.md | Repository instruction discovery | Same canonical repository rules |
|
|
26
|
+
| Existing cliproxy clients/bootstrap.py and launcher.py | ~/.config/cliproxy-fleet; ~/.local/bin/*-fleet | Legacy opt-in migration boundary; native settings preserved |
|
|
27
|
+
| Fleet configure | checkout/node_modules/.fleet-revisions/SHA; .fleet-configuration/*.json | Pinned Git deployment worktrees and per-selection rollout receipts |
|
|
28
|
+
|
|
29
|
+
ROOT is `~/.config/personal/agents` on macOS/Linux and
|
|
30
|
+
`%USERPROFILE%\AppData\Local\personal\agents` on native Windows. Home and platform
|
|
31
|
+
are documented machine-derived inputs. The explicit `--node` ID selects checked-in
|
|
32
|
+
`nodes[ID][TOOL].direct` or `.proxy` model overrides over shared defaults. The local
|
|
33
|
+
fleet roster contains connection aliases/paths, not configuration values or secrets.
|
|
34
|
+
|
|
35
|
+
The registry is the portable profile source. Native project settings, organization
|
|
36
|
+
policies, MCP servers, skills and plugins can still affect tools through their
|
|
37
|
+
vendor precedence. These are not silently imported from a home directory. Existing
|
|
38
|
+
home MCP definitions, user skills, marketplace caches and desktop settings remain
|
|
39
|
+
unmanaged until reviewed and added to an appropriate canonical repository source.
|
|
40
|
+
Do not treat the registry as a complete export of arbitrary installed applications.
|
|
41
|
+
Usage tracking in CLIProxyAPI/T3 is independent from the inference route.
|
|
42
|
+
|
|
43
|
+
## Compatibility and authentication evidence
|
|
44
|
+
|
|
45
|
+
- [Codex configuration](https://learn.chatgpt.com/docs/config-file/config-reference):
|
|
46
|
+
CODEX_HOME, model_providers, env_key and wire_api. Direct profiles have separate
|
|
47
|
+
login state. T3 source confirms homePath and binaryPath per provider instance.
|
|
48
|
+
- [Claude gateway](https://code.claude.com/docs/en/llm-gateway-connect) and
|
|
49
|
+
[settings](https://code.claude.com/docs/en/settings): native settings-file override
|
|
50
|
+
plus ANTHROPIC_BASE_URL/AUTH_TOKEN. The registry declares `claude-sonnet-4-6`; availability and authentication are checked separately.
|
|
51
|
+
- [OpenCode](https://opencode.ai/docs/config/): OPENCODE_CONFIG merges with native
|
|
52
|
+
configuration; environment placeholders avoid persisting the proxy key. Direct
|
|
53
|
+
OpenRouter defaults remain owned by the existing provider sync.
|
|
54
|
+
- [Gemini CLI](https://geminicli.com/docs/reference/configuration/): native settings,
|
|
55
|
+
GEMINI_CLI_HOME and Google/API-key/Vertex authentication are distinct. Pinned 0.66.0 also supports `gateway` authentication, `GOOGLE_GEMINI_BASE_URL` and a runtime `GEMINI_API_KEY`; the managed proxy adapter uses those native interfaces. Live native-client acceptance remains unverified.
|
|
56
|
+
- [Cursor](https://prod.cursor.com/help/models-and-usage/api-keys): supported API-key
|
|
57
|
+
setup uses Settings > Models; some features continue through Cursor. No supported
|
|
58
|
+
unattended portable credential/settings adapter was established; no SQLite edits.
|
|
59
|
+
- [Antigravity](https://antigravity.google/docs/settings): native Google identity and
|
|
60
|
+
settings are distinct from Gemini CLI. No verified arbitrary proxy-routing adapter.
|
|
61
|
+
- [Copilot](https://docs.github.com/en/copilot/how-tos/copilot-cli): native independent
|
|
62
|
+
GitHub authentication. No proxy integration is claimed.
|
|
63
|
+
|
|
64
|
+
Runtime OAuth, auth.json, keychains, T3 pairing/control-plane tokens, SSH private
|
|
65
|
+
keys, session databases, conversations, histories, caches and plugin downloaded
|
|
66
|
+
state are never profile source. Never export or copy them between nodes. Backups
|
|
67
|
+
may preserve preexisting local contents and therefore stay private, outside Git.
|
|
68
|
+
New proxy profiles read only Vault `secret/data/personal/prd` field
|
|
69
|
+
`CLIPROXY_FLEET_CLIENT_API_KEY`; neither generated configs nor receipts contain it.
|
|
70
|
+
Missing access fails without retaining Vault responses. No secret is seeded here.
|
|
71
|
+
|
|
72
|
+
## Fleet provider routes
|
|
73
|
+
|
|
74
|
+
The registry’s `proxy.routes` declares the shared accounts (Claude, Codex,
|
|
75
|
+
Gemini, Grok, Muse, Antigravity). Grok Build and the Antigravity CLI are pinned
|
|
76
|
+
native clients with proxy profiles (Grok: `GROK_HOME/config.toml` custom model
|
|
77
|
+
with `env_key`; Antigravity: Gemini API-key mode with `GOOGLE_GEMINI_BASE_URL`).
|
|
78
|
+
Muse runs through the OpenCode harness: native Muse Code only talks to Meta's
|
|
79
|
+
own catalog endpoint. Cursor is not managed (it cannot use the proxy). T3's
|
|
80
|
+
Antigravity instance uses T3's own runtime with the proxy key in T3's per-host
|
|
81
|
+
secret store. See the fleet guide's "Agents on every node".
|
|
82
|
+
Version-specific source evidence:
|
|
83
|
+
[Gemini 0.66.0 gateway interface](https://github.com/google-gemini/gemini-cli/blob/v0.66.0/packages/core/src/core/contentGenerator.ts),
|
|
84
|
+
[CLIProxyAPI 8.0.55 catalog](https://github.com/router-for-me/CLIProxyAPI/blob/v8.0.55/internal/registry/models/models.json).
|
|
85
|
+
A catalog entry is only a supported identifier, not proof that Chris has an
|
|
86
|
+
active account for it. Fleet verifies authenticated availability, inference,
|
|
87
|
+
stream completion and a harmless echo-tool round trip. Native application/T3
|
|
88
|
+
acceptance is recorded separately. Runtime Vault access must work without an
|
|
89
|
+
interactive shell; missing renewal authorization remains action required.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# T3 binaryPath for Claude. The Claude Agent SDK runs any path ending in .ts
|
|
3
|
+
# with node, so T3 needs an extension-less executable; this runs the tracked
|
|
4
|
+
# Bun launcher beside it. No generated copy: this file lives in Git.
|
|
5
|
+
exec bun "${0%/*}/claude-proxy.ts" "$@"
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** T3 binaryPath adapter. This file remains in Git; no generated executable copies. */
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { currentPlatform } from '../src/platform';
|
|
4
|
+
import { agentRoot } from '../src/agents/render';
|
|
5
|
+
import { select } from '../src/agents/registry';
|
|
6
|
+
import { plan } from '../src/agents/converge';
|
|
7
|
+
import { launchProfile } from '../src/agents/launch';
|
|
8
|
+
import { AgentConfigurationError } from '../src/agents/errors';
|
|
9
|
+
import { pinnedPath } from '../src/agents/toolchain';
|
|
10
|
+
|
|
11
|
+
const SYNC_HINT =
|
|
12
|
+
'Run devfleet fleet-sync from a terminal to repair this machine.';
|
|
13
|
+
|
|
14
|
+
export async function runManagedProxy(
|
|
15
|
+
tool: 'codex' | 'opencode' | 'claude' | 'grok' | 'antigravity'
|
|
16
|
+
): Promise<void> {
|
|
17
|
+
const args = process.argv.slice(2);
|
|
18
|
+
// Version probes need no credentials; answering them lets T3 report the real
|
|
19
|
+
// launch error instead of "unable to determine version".
|
|
20
|
+
if (args.length === 1 && ['--version', '-v'].includes(args[0]!)) {
|
|
21
|
+
process.exitCode = await Bun.spawn([tool, ...args], {
|
|
22
|
+
env: { ...process.env, PATH: pinnedPath() },
|
|
23
|
+
stdio: ['inherit', 'inherit', 'inherit'],
|
|
24
|
+
}).exited;
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
try {
|
|
28
|
+
const selection = select(process.env['WS_AGENT_NODE'] ?? '', tool, 'proxy');
|
|
29
|
+
const root = agentRoot(homedir(), currentPlatform().name);
|
|
30
|
+
const result = await plan({ root, selection, revision: 'unverified' });
|
|
31
|
+
if (
|
|
32
|
+
!result.previous ||
|
|
33
|
+
result.previous.fingerprint !== result.fingerprint ||
|
|
34
|
+
result.files.some((file) => file.state !== 'unchanged')
|
|
35
|
+
)
|
|
36
|
+
throw new AgentConfigurationError(
|
|
37
|
+
`The ${tool} proxy profile for node ${selection.node} is missing or out of date.`
|
|
38
|
+
);
|
|
39
|
+
// T3 sets WS_AGENT_ACCOUNT on a provider that is pinned to one account.
|
|
40
|
+
process.exitCode = await launchProfile(
|
|
41
|
+
root,
|
|
42
|
+
selection,
|
|
43
|
+
args,
|
|
44
|
+
process.env['WS_AGENT_ACCOUNT'] || undefined
|
|
45
|
+
);
|
|
46
|
+
} catch (error) {
|
|
47
|
+
// Configuration errors carry curated, secret-free messages; others do not.
|
|
48
|
+
const reason =
|
|
49
|
+
error instanceof AgentConfigurationError
|
|
50
|
+
? error.message
|
|
51
|
+
: 'Managed provider proxy unavailable.';
|
|
52
|
+
process.stderr.write(`${reason} ${SYNC_HINT}\n`);
|
|
53
|
+
process.exitCode = 1;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./registry.schema.json",
|
|
3
|
+
"version": 1,
|
|
4
|
+
"defaults": {
|
|
5
|
+
"codex": {
|
|
6
|
+
"model": "gpt-6.1-sol"
|
|
7
|
+
},
|
|
8
|
+
"claude": {
|
|
9
|
+
"model": "sonnet"
|
|
10
|
+
},
|
|
11
|
+
"opencode": {
|
|
12
|
+
"model": "openrouter/auto"
|
|
13
|
+
},
|
|
14
|
+
"gemini": {
|
|
15
|
+
"model": "auto"
|
|
16
|
+
},
|
|
17
|
+
"grok": {
|
|
18
|
+
"model": "grok-4.7"
|
|
19
|
+
},
|
|
20
|
+
"antigravity": {
|
|
21
|
+
"model": "gemini-3.8-flash"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"proxy": {
|
|
25
|
+
"models": {
|
|
26
|
+
"codex": "gpt-6.1-sol",
|
|
27
|
+
"claude": "claude-sonnet-4-6",
|
|
28
|
+
"opencode": "gpt-6.1-sol",
|
|
29
|
+
"gemini": "gemini-3-flash",
|
|
30
|
+
"grok": "grok-4.7",
|
|
31
|
+
"antigravity": "gemini-3.8-flash"
|
|
32
|
+
},
|
|
33
|
+
"accounts": {
|
|
34
|
+
"claude": {
|
|
35
|
+
"provider": "claude",
|
|
36
|
+
"models": ["claude-opus-5-5", "claude-sonnet-5-5", "claude-haiku-5-5"]
|
|
37
|
+
},
|
|
38
|
+
"codex": {
|
|
39
|
+
"provider": "codex",
|
|
40
|
+
"models": ["gpt-6.1-sol"]
|
|
41
|
+
},
|
|
42
|
+
"opencode": {
|
|
43
|
+
"provider": "antigravity",
|
|
44
|
+
"models": ["gemini-3.8-flash"]
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"routes": {
|
|
48
|
+
"claude": {
|
|
49
|
+
"model": "claude-sonnet-4-6",
|
|
50
|
+
"native": "claude",
|
|
51
|
+
"harness": "opencode"
|
|
52
|
+
},
|
|
53
|
+
"codex": {
|
|
54
|
+
"model": "gpt-6.1-sol",
|
|
55
|
+
"native": "codex",
|
|
56
|
+
"harness": "opencode"
|
|
57
|
+
},
|
|
58
|
+
"gemini": {
|
|
59
|
+
"model": "gemini-3-flash",
|
|
60
|
+
"native": "gemini",
|
|
61
|
+
"harness": "opencode"
|
|
62
|
+
},
|
|
63
|
+
"grok": {
|
|
64
|
+
"model": "grok-4.7",
|
|
65
|
+
"native": "grok",
|
|
66
|
+
"harness": "opencode"
|
|
67
|
+
},
|
|
68
|
+
"muse": {
|
|
69
|
+
"model": "devin/muse-wonder-1-0",
|
|
70
|
+
"native": null,
|
|
71
|
+
"harness": "opencode"
|
|
72
|
+
},
|
|
73
|
+
"antigravity": {
|
|
74
|
+
"model": "gemini-3.8-flash",
|
|
75
|
+
"native": "antigravity",
|
|
76
|
+
"harness": "opencode"
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"nodes": {},
|
|
81
|
+
"tools": {
|
|
82
|
+
"codex": {
|
|
83
|
+
"binary": "codex",
|
|
84
|
+
"config": "CODEX_HOME/config.toml",
|
|
85
|
+
"authentication": "Independent codex login for direct; Vault environment key for proxy",
|
|
86
|
+
"proxy": "responses",
|
|
87
|
+
"source": "https://learn.chatgpt.com/docs/config-file/config-reference",
|
|
88
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
89
|
+
"capabilities": {
|
|
90
|
+
"streaming": "unverified on fleet nodes",
|
|
91
|
+
"toolCalls": "unverified on fleet nodes",
|
|
92
|
+
"usageTracking": "independent native/runtime state",
|
|
93
|
+
"unattendedProfile": true
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"claude": {
|
|
97
|
+
"binary": "claude",
|
|
98
|
+
"config": "--settings FILE",
|
|
99
|
+
"authentication": "Independent claude auth login for direct; ANTHROPIC_AUTH_TOKEN for proxy",
|
|
100
|
+
"proxy": "messages",
|
|
101
|
+
"source": "https://code.claude.com/docs/en/llm-gateway-connect",
|
|
102
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
103
|
+
"capabilities": {
|
|
104
|
+
"streaming": "unverified on fleet nodes",
|
|
105
|
+
"toolCalls": "unverified on fleet nodes",
|
|
106
|
+
"usageTracking": "independent native/runtime state",
|
|
107
|
+
"unattendedProfile": true
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
"opencode": {
|
|
111
|
+
"binary": "opencode",
|
|
112
|
+
"config": "OPENCODE_CONFIG",
|
|
113
|
+
"authentication": "Existing dev-fleet opencode sync/Vault; runtime environment key for proxy",
|
|
114
|
+
"proxy": "responses",
|
|
115
|
+
"source": "https://opencode.ai/docs/config/",
|
|
116
|
+
"directEndpoint": "Existing dev-fleet OpenCode provider catalog and OpenRouter auto policy",
|
|
117
|
+
"capabilities": {
|
|
118
|
+
"streaming": "unverified on fleet nodes",
|
|
119
|
+
"toolCalls": "unverified on fleet nodes",
|
|
120
|
+
"usageTracking": "independent native/runtime state",
|
|
121
|
+
"unattendedProfile": true
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
"gemini": {
|
|
125
|
+
"binary": "gemini",
|
|
126
|
+
"config": "GEMINI_CLI_HOME/.gemini/settings.json",
|
|
127
|
+
"authentication": "Native Google login for direct; supported gateway authentication with runtime Vault key for proxy",
|
|
128
|
+
"proxy": "generateContent",
|
|
129
|
+
"source": "https://github.com/google-gemini/gemini-cli/blob/v0.66.0/packages/core/src/core/contentGenerator.ts",
|
|
130
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
131
|
+
"capabilities": {
|
|
132
|
+
"streaming": "unverified on fleet nodes",
|
|
133
|
+
"toolCalls": "unverified on fleet nodes",
|
|
134
|
+
"usageTracking": "independent native/runtime state",
|
|
135
|
+
"unattendedProfile": true
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
"t3": {
|
|
139
|
+
"binary": "t3",
|
|
140
|
+
"config": "T3CODE_HOME/userdata/settings.json providerInstances",
|
|
141
|
+
"authentication": "Independent t3 up --connect and peer pairing",
|
|
142
|
+
"proxy": null,
|
|
143
|
+
"source": "Installed T3 contracts/settings.ts and providerInstance.ts; see audit.md",
|
|
144
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
145
|
+
"capabilities": {
|
|
146
|
+
"streaming": "unverified on fleet nodes",
|
|
147
|
+
"toolCalls": "unverified on fleet nodes",
|
|
148
|
+
"usageTracking": "independent native/runtime state",
|
|
149
|
+
"unattendedProfile": false
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"cursor": {
|
|
153
|
+
"binary": "cursor",
|
|
154
|
+
"config": "OS-specific Cursor User/settings.json and .cursor/mcp.json",
|
|
155
|
+
"authentication": "Interactive Cursor Settings > Models; credentials stay in application storage",
|
|
156
|
+
"proxy": null,
|
|
157
|
+
"source": "https://prod.cursor.com/help/models-and-usage/api-keys",
|
|
158
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
159
|
+
"capabilities": {
|
|
160
|
+
"streaming": "unverified on fleet nodes",
|
|
161
|
+
"toolCalls": "unverified on fleet nodes",
|
|
162
|
+
"usageTracking": "independent native/runtime state",
|
|
163
|
+
"unattendedProfile": false
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"antigravity": {
|
|
167
|
+
"binary": "antigravity",
|
|
168
|
+
"config": "Profile --gemini-dir (antigravity-cli/settings.json, modelProvider gemini)",
|
|
169
|
+
"authentication": "Shared CLI proxy: GEMINI_API_KEY (Vault) with GOOGLE_GEMINI_BASE_URL; no Google sign-in",
|
|
170
|
+
"proxy": "generateContent",
|
|
171
|
+
"source": "https://antigravity.google/docs/install/",
|
|
172
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
173
|
+
"capabilities": {
|
|
174
|
+
"streaming": "unverified on fleet nodes",
|
|
175
|
+
"toolCalls": "unverified on fleet nodes",
|
|
176
|
+
"usageTracking": "independent native/runtime state",
|
|
177
|
+
"unattendedProfile": true
|
|
178
|
+
}
|
|
179
|
+
},
|
|
180
|
+
"copilot": {
|
|
181
|
+
"binary": "copilot",
|
|
182
|
+
"config": "Native config and repository .github/copilot-instructions.md",
|
|
183
|
+
"authentication": "Independent native GitHub login",
|
|
184
|
+
"proxy": null,
|
|
185
|
+
"source": "https://docs.github.com/en/copilot/how-tos/copilot-cli",
|
|
186
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
187
|
+
"capabilities": {
|
|
188
|
+
"streaming": "unverified on fleet nodes",
|
|
189
|
+
"toolCalls": "unverified on fleet nodes",
|
|
190
|
+
"usageTracking": "independent native/runtime state",
|
|
191
|
+
"unattendedProfile": false
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
"grok": {
|
|
195
|
+
"binary": "grok",
|
|
196
|
+
"config": "GROK_HOME/config.toml",
|
|
197
|
+
"authentication": "Shared CLI proxy: custom [model.*] entry with env_key CLIPROXY_API_KEY (Vault); no grok login",
|
|
198
|
+
"proxy": "chat_completions",
|
|
199
|
+
"source": "https://docs.x.ai/build/settings/reference",
|
|
200
|
+
"directEndpoint": "Native vendor/account configuration; no portable endpoint override is applied",
|
|
201
|
+
"capabilities": {
|
|
202
|
+
"streaming": "unverified on fleet nodes",
|
|
203
|
+
"toolCalls": "unverified on fleet nodes",
|
|
204
|
+
"usageTracking": "independent native/runtime state",
|
|
205
|
+
"unattendedProfile": true
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|