@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.
Files changed (333) hide show
  1. package/.mise/locks/aws-cdk/2.1146.1/aube-lock.yaml +24 -0
  2. package/.mise/locks/aws-cdk/2.1146.1/package.json +7 -0
  3. package/.mise/locks/azure-cli/2.91.0~a837e014/pyproject.toml +5 -0
  4. package/.mise/locks/azure-cli/2.91.0~a837e014/uv.lock +2794 -0
  5. package/.mise/locks/gemini/0.66.0~84aac8e6/aube-lock.yaml +123 -0
  6. package/.mise/locks/gemini/0.66.0~84aac8e6/package.json +12 -0
  7. package/.mise/locks/npm-devcontainers-cli/0.90.0/aube-lock.yaml +24 -0
  8. package/.mise/locks/npm-devcontainers-cli/0.90.0/package.json +7 -0
  9. package/.mise/locks/npm-modelcontextprotocol-inspector/2.13.0~4c109bea/aube-lock.yaml +1432 -0
  10. package/.mise/locks/npm-modelcontextprotocol-inspector/2.13.0~4c109bea/package.json +7 -0
  11. package/.mise/locks/npm-vercel/65.8.0/aube-lock.yaml +3595 -0
  12. package/.mise/locks/npm-vercel/65.8.0/package.json +7 -0
  13. package/.mise/locks/npm-wrangler/4.156.0/aube-lock.yaml +895 -0
  14. package/.mise/locks/npm-wrangler/4.156.0/package.json +7 -0
  15. package/.mise/locks/npm-yarnpkg-cli-dist/4.18.1/aube-lock.yaml +24 -0
  16. package/.mise/locks/npm-yarnpkg-cli-dist/4.18.1/package.json +7 -0
  17. package/LICENSE +21 -0
  18. package/README.md +157 -2
  19. package/agents/antigravity-proxy.ts +3 -0
  20. package/agents/audit.md +89 -0
  21. package/agents/claude-proxy +5 -0
  22. package/agents/claude-proxy.ts +3 -0
  23. package/agents/codex-proxy.ts +3 -0
  24. package/agents/grok-proxy.ts +3 -0
  25. package/agents/managed-proxy.ts +55 -0
  26. package/agents/opencode-proxy.ts +3 -0
  27. package/agents/registry.json +209 -0
  28. package/agents/registry.schema.json +149 -0
  29. package/agents/setup.md +128 -0
  30. package/agents/t3.json +40 -0
  31. package/ansible/macos/manager.yml +30 -0
  32. package/ansible/macos/policy.json +17 -0
  33. package/ansible/monitoring/README.md +154 -0
  34. package/ansible/monitoring/agent-darwin.yml +198 -0
  35. package/ansible/monitoring/agent.yml +134 -0
  36. package/ansible/monitoring/beszel-agent.service +42 -0
  37. package/ansible/monitoring/compose.yml +74 -0
  38. package/ansible/monitoring/hub-darwin.yml +102 -0
  39. package/ansible/monitoring/lock.json +11 -0
  40. package/ansible/net/remote-probe.sh +13 -0
  41. package/ansible/ubuntu/authorize-sudo.sh +51 -0
  42. package/ansible/ubuntu/baseline.yml +89 -0
  43. package/ansible/ubuntu/disk-guard.py +104 -0
  44. package/ansible/ubuntu/policy.json +43 -0
  45. package/ansible/ubuntu/recovery.yml +15 -0
  46. package/ansible/ubuntu/t3/policy.json +7 -0
  47. package/ansible/ubuntu/t3-desktop.yml +220 -0
  48. package/ansible/ubuntu/t3-health.sh +33 -0
  49. package/ansible/ubuntu/t3-policy.yml +76 -0
  50. package/ansible/ubuntu/t3-route.yml +28 -0
  51. package/ansible/ubuntu/tailscale.yml +75 -0
  52. package/ansible/ubuntu/tasks/credentials.yml +47 -0
  53. package/ansible/ubuntu/tasks/docker.yml +31 -0
  54. package/ansible/ubuntu/tasks/packages.yml +56 -0
  55. package/ansible/ubuntu/tasks/power.yml +51 -0
  56. package/ansible/ubuntu/tasks/recovery.yml +39 -0
  57. package/ansible/ubuntu/tasks/resources.yml +252 -0
  58. package/ansible/ubuntu/tasks/services.yml +31 -0
  59. package/ansible/ubuntu/tasks/ssh.yml +71 -0
  60. package/ansible/ubuntu/tasks/user.yml +120 -0
  61. package/bin/devfleet.mjs +36 -0
  62. package/bootstrap/bootstrap.ps1 +50 -0
  63. package/bootstrap/bootstrap.sh +73 -0
  64. package/bootstrap/devfleet +7 -0
  65. package/bootstrap/docker-desktop.sh +33 -0
  66. package/bootstrap/doctor.ts +189 -0
  67. package/bootstrap/fleet-manager-run.sh +76 -0
  68. package/bootstrap/fleet-remote-bootstrap.sh +185 -0
  69. package/bootstrap/global-config.ts +113 -0
  70. package/bootstrap/install-launcher.sh +7 -0
  71. package/bootstrap/native-aws.ts +86 -0
  72. package/bootstrap/native-t3.ts +154 -0
  73. package/bootstrap/npm.ts +350 -0
  74. package/bootstrap/setup-status.ts +51 -0
  75. package/bootstrap/setup.ts +88 -0
  76. package/bootstrap/shell-path.ts +105 -0
  77. package/bootstrap/verify-t3-archive.py +49 -0
  78. package/bootstrap/worker-auth.ts +65 -0
  79. package/bootstrap/worker-github.ts +47 -0
  80. package/bootstrap/worker-tools.ts +24 -0
  81. package/cliproxy/AGENTS.md +11 -0
  82. package/cliproxy/README.md +269 -0
  83. package/cliproxy/clients/bootstrap.py +143 -0
  84. package/cliproxy/clients/launcher.py +57 -0
  85. package/cliproxy/compose.yaml +90 -0
  86. package/cliproxy/config.template.yaml +70 -0
  87. package/cliproxy/docs/cloud-adoption.md +16 -0
  88. package/cliproxy/docs/deployment.png +0 -0
  89. package/cliproxy/docs/deployment.svg +109 -0
  90. package/cliproxy/docs/health-workflow.example.yml +185 -0
  91. package/cliproxy/docs/migration.md +131 -0
  92. package/cliproxy/docs/model-health-report.schema.json +364 -0
  93. package/cliproxy/docs/model-health.md +393 -0
  94. package/cliproxy/image.lock.json +5 -0
  95. package/cliproxy/launchd/dev.devfleet.cliproxy-backup-check.plist +38 -0
  96. package/cliproxy/launchd/dev.devfleet.cliproxy-backup.plist +48 -0
  97. package/cliproxy/launchd/dev.devfleet.cliproxy-fleet.plist +32 -0
  98. package/cliproxy/launchd/dev.devfleet.cliproxy-gc.plist +38 -0
  99. package/cliproxy/launchd/dev.devfleet.cliproxy-monitor.plist +29 -0
  100. package/cliproxy/launchd/dev.devfleet.cliproxy-vault-renew.plist +31 -0
  101. package/cliproxy/models.json +1618 -0
  102. package/cliproxy/requirements.lock +78 -0
  103. package/cliproxy/scripts/accounts.py +38 -0
  104. package/cliproxy/scripts/audit.py +123 -0
  105. package/cliproxy/scripts/backup +234 -0
  106. package/cliproxy/scripts/check.py +34 -0
  107. package/cliproxy/scripts/checkpoint.py +226 -0
  108. package/cliproxy/scripts/cli.py +64 -0
  109. package/cliproxy/scripts/cliproxy_host.py +257 -0
  110. package/cliproxy/scripts/cloud_state.py +150 -0
  111. package/cliproxy/scripts/container-health +6 -0
  112. package/cliproxy/scripts/docker +24 -0
  113. package/cliproxy/scripts/external-health.py +79 -0
  114. package/cliproxy/scripts/fleet_config.py +43 -0
  115. package/cliproxy/scripts/fleet_sync.py +274 -0
  116. package/cliproxy/scripts/initialize +84 -0
  117. package/cliproxy/scripts/install-dependencies +48 -0
  118. package/cliproxy/scripts/install.py +406 -0
  119. package/cliproxy/scripts/model_health.py +16 -0
  120. package/cliproxy/scripts/modelhealth/__init__.py +5 -0
  121. package/cliproxy/scripts/modelhealth/checks.py +429 -0
  122. package/cliproxy/scripts/modelhealth/cli.py +117 -0
  123. package/cliproxy/scripts/modelhealth/config.py +186 -0
  124. package/cliproxy/scripts/modelhealth/emulator.py +536 -0
  125. package/cliproxy/scripts/modelhealth/expect.py +88 -0
  126. package/cliproxy/scripts/modelhealth/findings.py +183 -0
  127. package/cliproxy/scripts/modelhealth/protocol.py +330 -0
  128. package/cliproxy/scripts/modelhealth/redact.py +28 -0
  129. package/cliproxy/scripts/modelhealth/report.py +150 -0
  130. package/cliproxy/scripts/modelhealth/runner.py +390 -0
  131. package/cliproxy/scripts/modelhealth/scenario.py +131 -0
  132. package/cliproxy/scripts/modelhealth/schema.py +63 -0
  133. package/cliproxy/scripts/modelhealth/simulate.py +111 -0
  134. package/cliproxy/scripts/modelhealth/transport.py +213 -0
  135. package/cliproxy/scripts/monitor +68 -0
  136. package/cliproxy/scripts/ops +527 -0
  137. package/cliproxy/scripts/public-endpoint +127 -0
  138. package/cliproxy/scripts/recover_node.py +177 -0
  139. package/cliproxy/scripts/restore-verify +60 -0
  140. package/cliproxy/scripts/retention.py +144 -0
  141. package/cliproxy/scripts/service-start +7 -0
  142. package/cliproxy/scripts/validate-config +56 -0
  143. package/cliproxy/scripts/vault-access.py +57 -0
  144. package/cliproxy/scripts/vault-backup-login +55 -0
  145. package/cliproxy/scripts/vault-recovery +56 -0
  146. package/cliproxy/scripts/vault-renew +30 -0
  147. package/cliproxy/systemd/cliproxy-backup-check.service +10 -0
  148. package/cliproxy/systemd/cliproxy-backup-check.timer +8 -0
  149. package/cliproxy/systemd/cliproxy-backup.service +13 -0
  150. package/cliproxy/systemd/cliproxy-backup.timer +8 -0
  151. package/cliproxy/systemd/cliproxy-fleet.service +17 -0
  152. package/cliproxy/systemd/cliproxy-gc.service +13 -0
  153. package/cliproxy/systemd/cliproxy-gc.timer +8 -0
  154. package/cliproxy/systemd/cliproxy-monitor.service +8 -0
  155. package/cliproxy/systemd/cliproxy-monitor.timer +7 -0
  156. package/cliproxy/systemd/cliproxy-vault-renew.service +8 -0
  157. package/cliproxy/systemd/cliproxy-vault-renew.timer +7 -0
  158. package/cliproxy/vendor/LICENSE +22 -0
  159. package/cliproxy/vendor/config.upstream.yaml +1349 -0
  160. package/examples/fleet.json +95 -0
  161. package/examples/roster.json +13 -0
  162. package/mise.lock +1492 -0
  163. package/mise.toml +99 -0
  164. package/package.json +65 -4
  165. package/schema/fleet.schema.json +364 -0
  166. package/schema/roster.schema.json +77 -0
  167. package/src/agents/account-relay.ts +111 -0
  168. package/src/agents/accounts.ts +85 -0
  169. package/src/agents/audit.ts +77 -0
  170. package/src/agents/cli.ts +13 -0
  171. package/src/agents/command.ts +204 -0
  172. package/src/agents/converge.ts +123 -0
  173. package/src/agents/doctor.ts +107 -0
  174. package/src/agents/errors.ts +2 -0
  175. package/src/agents/files.ts +73 -0
  176. package/src/agents/fleet-verify.ts +156 -0
  177. package/src/agents/launch.ts +290 -0
  178. package/src/agents/native-verify.ts +226 -0
  179. package/src/agents/provider-errors.ts +50 -0
  180. package/src/agents/registry.ts +55 -0
  181. package/src/agents/render.ts +110 -0
  182. package/src/agents/round-trip.ts +192 -0
  183. package/src/agents/secrets.ts +13 -0
  184. package/src/agents/toolchain.ts +34 -0
  185. package/src/agents/verify-cache.ts +103 -0
  186. package/src/agents/verify.ts +127 -0
  187. package/src/auth-checks.ts +163 -0
  188. package/src/cli/agent-guide.ts +95 -0
  189. package/src/cli/app.ts +115 -0
  190. package/src/cli/cli.ts +21 -0
  191. package/src/cli/command-index.ts +50 -0
  192. package/src/cli/contracts.ts +25 -0
  193. package/src/cli/fleet-reference.ts +17 -0
  194. package/src/cli/fleet-sync-checkout.ts +91 -0
  195. package/src/cli/fleet-sync-enrollment.ts +144 -0
  196. package/src/cli/fleet-sync-forward.ts +134 -0
  197. package/src/cli/fleet-sync-manager.ts +193 -0
  198. package/src/cli/fleet-sync-monitoring.ts +185 -0
  199. package/src/cli/fleet-sync-output.ts +314 -0
  200. package/src/cli/fleet-sync-privilege.ts +27 -0
  201. package/src/cli/fleet-sync-progress.ts +109 -0
  202. package/src/cli/fleet-sync-remote.ts +236 -0
  203. package/src/cli/fleet-sync-report.ts +26 -0
  204. package/src/cli/fleet-sync-schedule.ts +138 -0
  205. package/src/cli/fleet-sync-vault.ts +166 -0
  206. package/src/cli/fleet-sync.ts +309 -0
  207. package/src/cli/fleet.ts +163 -0
  208. package/src/cli/managed-health.ts +219 -0
  209. package/src/cli/node-deployment.ts +34 -0
  210. package/src/cli/node-sync.ts +114 -0
  211. package/src/cli/node-t3.ts +31 -0
  212. package/src/cli/options.ts +141 -0
  213. package/src/cli/probe-source.ts +7 -0
  214. package/src/cli/program.ts +169 -0
  215. package/src/cli/register-fleet.ts +246 -0
  216. package/src/cli/registry.ts +158 -0
  217. package/src/cli/repair-apply.ts +67 -0
  218. package/src/cli/repair-guard.ts +11 -0
  219. package/src/cli/repair-inspect.ts +150 -0
  220. package/src/cli/repair-script.ts +76 -0
  221. package/src/cli/repair.ts +209 -0
  222. package/src/cli/roster.ts +89 -0
  223. package/src/cli/search.ts +35 -0
  224. package/src/cli/settings.ts +64 -0
  225. package/src/cli/source-operations.ts +78 -0
  226. package/src/cli/t3/command.ts +90 -0
  227. package/src/cli/t3/register.ts +55 -0
  228. package/src/cli/tailnet.ts +127 -0
  229. package/src/cli/ui-actions.ts +133 -0
  230. package/src/cli/ui-controller.ts +113 -0
  231. package/src/cli/ui-data.ts +106 -0
  232. package/src/cli/ui-execute.ts +163 -0
  233. package/src/cli/ui-repairs.ts +34 -0
  234. package/src/cli/ui-reports.ts +211 -0
  235. package/src/cli/ui-targets.ts +100 -0
  236. package/src/cli/ui-terminal.ts +109 -0
  237. package/src/cli/ui-types.ts +49 -0
  238. package/src/cli/ui-wizard.ts +101 -0
  239. package/src/cli/ui.ts +9 -0
  240. package/src/cli/worker-health-output.ts +37 -0
  241. package/src/config.ts +186 -0
  242. package/src/configure.ts +255 -0
  243. package/src/definition.ts +260 -0
  244. package/src/diagnostics.ts +92 -0
  245. package/src/doctor-check.ts +10 -0
  246. package/src/errors.ts +1 -0
  247. package/src/fingerprint.ts +120 -0
  248. package/src/fleet-config.ts +88 -0
  249. package/src/index.ts +6 -0
  250. package/src/input-hashes.ts +73 -0
  251. package/src/machine/local-source.ts +52 -0
  252. package/src/machine/lock-error.ts +2 -0
  253. package/src/machine/platform.ts +44 -0
  254. package/src/machine/source.ts +68 -0
  255. package/src/machine/state.ts +185 -0
  256. package/src/machine-health.ts +95 -0
  257. package/src/managed-source.ts +47 -0
  258. package/src/manager-failure.ts +48 -0
  259. package/src/manager-sync.ts +400 -0
  260. package/src/manager.ts +62 -0
  261. package/src/monitoring/apply.ts +171 -0
  262. package/src/monitoring/beszel.ts +191 -0
  263. package/src/monitoring/enroll.ts +110 -0
  264. package/src/monitoring/hub-access.ts +113 -0
  265. package/src/monitoring/hub-viewer.ts +142 -0
  266. package/src/monitoring/hub.ts +93 -0
  267. package/src/monitoring/manager-agent.ts +73 -0
  268. package/src/monitoring/manager-hub.ts +232 -0
  269. package/src/monitoring/remote.ts +65 -0
  270. package/src/network-definition.ts +83 -0
  271. package/src/node-converge-linux.ts +372 -0
  272. package/src/node-converge-shared.ts +83 -0
  273. package/src/node-converge.ts +40 -0
  274. package/src/onboard.ts +35 -0
  275. package/src/platform/ansible-receipt.ts +128 -0
  276. package/src/platform/ansible.ts +62 -0
  277. package/src/platform/darwin.ts +203 -0
  278. package/src/platform/detect.ts +11 -0
  279. package/src/platform/fallback.ts +110 -0
  280. package/src/platform/index.ts +38 -0
  281. package/src/platform/launchd.ts +98 -0
  282. package/src/platform/linux.ts +139 -0
  283. package/src/platform/ps.ts +45 -0
  284. package/src/platform/resource-verify.ts +128 -0
  285. package/src/platform/systemd-user.ts +95 -0
  286. package/src/platform/t3-policy.ts +137 -0
  287. package/src/platform/t3-route.ts +68 -0
  288. package/src/platform/t3-service.ts +75 -0
  289. package/src/platform/types.ts +123 -0
  290. package/src/platform/ubuntu-audit.ts +63 -0
  291. package/src/platform/ubuntu-verify.ts +105 -0
  292. package/src/platform/windows.ts +148 -0
  293. package/src/power-recovery.ts +55 -0
  294. package/src/probe.ts +51 -0
  295. package/src/protocol.ts +119 -0
  296. package/src/proxy-converge.ts +85 -0
  297. package/src/remote-bootstrap.ts +212 -0
  298. package/src/remote-entry.ts +89 -0
  299. package/src/remote-lock.ts +12 -0
  300. package/src/repair-catalog.ts +206 -0
  301. package/src/repair-plan.ts +78 -0
  302. package/src/repair-runner.ts +84 -0
  303. package/src/report.ts +71 -0
  304. package/src/runner.ts +104 -0
  305. package/src/secrets.ts +169 -0
  306. package/src/service-auth.ts +115 -0
  307. package/src/ssh.ts +135 -0
  308. package/src/sync.ts +104 -0
  309. package/src/t3/accounts.ts +81 -0
  310. package/src/t3/desired.ts +165 -0
  311. package/src/t3/files.ts +81 -0
  312. package/src/t3/names-check.ts +53 -0
  313. package/src/t3/names.ts +155 -0
  314. package/src/t3/plan.ts +82 -0
  315. package/src/t3/providers.ts +74 -0
  316. package/src/t3/reconcile.ts +123 -0
  317. package/src/t3-endpoint.ts +48 -0
  318. package/src/t3-linked-check.ts +101 -0
  319. package/src/tailnet-health.ts +231 -0
  320. package/src/tailnet-matching.ts +37 -0
  321. package/src/tailscale.ts +141 -0
  322. package/src/test-fixtures.ts +36 -0
  323. package/src/toolchain-checks.ts +83 -0
  324. package/src/topology.ts +24 -0
  325. package/src/transport.ts +122 -0
  326. package/src/types.ts +95 -0
  327. package/src/vault-config.ts +38 -0
  328. package/src/worker-access-checks.ts +115 -0
  329. package/src/worker-capacity.ts +34 -0
  330. package/src/worker-host-checks.ts +176 -0
  331. package/src/worker-policy.ts +64 -0
  332. package/src/worker-readiness.ts +64 -0
  333. package/src/workstation-checks.ts +29 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "mise-npm-install",
3
+ "private": true,
4
+ "dependencies": {
5
+ "wrangler": "4.156.0"
6
+ }
7
+ }
@@ -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': {}
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "mise-npm-install",
3
+ "private": true,
4
+ "dependencies": {
5
+ "@yarnpkg/cli-dist": "4.18.1"
6
+ }
7
+ }
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
- # Temporary Holding Version
1
+ # dev-fleet
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
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).
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ import { runManagedProxy } from './managed-proxy';
3
+ await runManagedProxy('antigravity');
@@ -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,3 @@
1
+ #!/usr/bin/env bun
2
+ import { runManagedProxy } from './managed-proxy';
3
+ await runManagedProxy('claude');
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ import { runManagedProxy } from './managed-proxy';
3
+ await runManagedProxy('codex');
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env bun
2
+ import { runManagedProxy } from './managed-proxy';
3
+ await runManagedProxy('grok');
@@ -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,3 @@
1
+ #!/usr/bin/env bun
2
+ import { runManagedProxy } from './managed-proxy';
3
+ await runManagedProxy('opencode');
@@ -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
+ }