@crvouga/dev-fleet 0.8.0 → 0.9.1

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 (205) hide show
  1. package/README.md +65 -9
  2. package/agents/audit.md +18 -18
  3. package/ansible/agents/agents.yml +134 -0
  4. package/ansible/agents/templates/antigravity.settings.json.j2 +3 -0
  5. package/ansible/agents/templates/claude.settings.json.j2 +3 -0
  6. package/ansible/agents/templates/codex.config.toml.j2 +11 -0
  7. package/ansible/agents/templates/gemini.settings.json.j2 +14 -0
  8. package/ansible/agents/templates/grok.config.toml.j2 +19 -0
  9. package/ansible/agents/templates/opencode.json.j2 +24 -0
  10. package/ansible/agents/templates/receipt.json.j2 +10 -0
  11. package/ansible/ansible.cfg +14 -0
  12. package/ansible/github/git.yml +82 -0
  13. package/ansible/macos/manager-privilege.yml +55 -9
  14. package/ansible/macos/manager.yml +154 -7
  15. package/ansible/macos/policy.json +13 -0
  16. package/ansible/macos/t3-policy.yml +5 -3
  17. package/ansible/macos/vault-renew.yml +85 -0
  18. package/ansible/monitoring/agent-darwin.yml +3 -0
  19. package/ansible/monitoring/agent.yml +2 -0
  20. package/ansible/monitoring/hub-darwin.yml +3 -0
  21. package/ansible/monitoring/hub-route-darwin.yml +1 -0
  22. package/ansible/net/remote-probe.sh +4 -1
  23. package/ansible/platforms.json +2 -2
  24. package/ansible/pyproject.toml +5 -0
  25. package/ansible/ubuntu/baseline.yml +39 -13
  26. package/ansible/ubuntu/disk-gc.py +6 -2
  27. package/ansible/ubuntu/firewall.nft.j2 +50 -0
  28. package/ansible/ubuntu/policy.json +125 -6
  29. package/ansible/ubuntu/reboot.yml +89 -0
  30. package/ansible/ubuntu/recovery.yml +13 -3
  31. package/ansible/ubuntu/t3/policy.json +3 -0
  32. package/ansible/ubuntu/t3-desktop.yml +23 -2
  33. package/ansible/ubuntu/t3-headless.yml +128 -0
  34. package/ansible/ubuntu/t3-health.sh +24 -10
  35. package/ansible/ubuntu/t3-idle.py +37 -2
  36. package/ansible/ubuntu/t3-policy.yml +4 -1
  37. package/ansible/ubuntu/t3-route.yml +1 -0
  38. package/ansible/ubuntu/tailscale.yml +54 -8
  39. package/ansible/ubuntu/tasks/browser.yml +3 -0
  40. package/ansible/ubuntu/tasks/containers-off.yml +43 -0
  41. package/ansible/ubuntu/tasks/docker.yml +53 -6
  42. package/ansible/ubuntu/tasks/dpkg.yml +4 -0
  43. package/ansible/ubuntu/tasks/features.yml +22 -0
  44. package/ansible/ubuntu/tasks/firewall.yml +172 -0
  45. package/ansible/ubuntu/tasks/install.yml +2 -1
  46. package/ansible/ubuntu/tasks/packages.yml +4 -2
  47. package/ansible/ubuntu/tasks/release.yml +6 -0
  48. package/ansible/ubuntu/tasks/resources.yml +6 -4
  49. package/ansible/ubuntu/tasks/services.yml +2 -2
  50. package/ansible/ubuntu/tasks/sizing.yml +49 -0
  51. package/ansible/ubuntu/tasks/snapshot.yml +14 -3
  52. package/ansible/ubuntu/tasks/ssh.yml +61 -4
  53. package/ansible/ubuntu/tasks/t3-restart.yml +3 -1
  54. package/ansible/ubuntu/tasks/user.yml +1 -0
  55. package/ansible/ubuntu/worker-account.yml +117 -0
  56. package/ansible/uv.lock +265 -0
  57. package/bin/devfleet.mjs +42 -4
  58. package/bootstrap/fleet-remote-bootstrap.sh +91 -25
  59. package/bootstrap/global-config.ts +29 -3
  60. package/bootstrap/package-smoke.ts +127 -0
  61. package/bootstrap/pins.ts +189 -0
  62. package/bootstrap/release-notes.ts +88 -0
  63. package/bootstrap/release-version.ts +41 -7
  64. package/bootstrap/worker-features.ts +114 -0
  65. package/bootstrap/worker-seed.yaml +7 -3
  66. package/bootstrap/worker-tools.ts +39 -9
  67. package/cliproxy/README.md +1 -1
  68. package/cliproxy/docs/health-workflow.example.yml +20 -143
  69. package/docs/authentication.md +19 -11
  70. package/docs/consumer-setup.md +42 -27
  71. package/docs/convergence.md +67 -0
  72. package/docs/declared.md +61 -34
  73. package/docs/machine-setup.md +73 -7
  74. package/docs/manager-setup.md +10 -3
  75. package/docs/operations.md +64 -9
  76. package/docs/releasing.md +49 -1
  77. package/docs/runbooks.md +98 -7
  78. package/docs/state.md +23 -11
  79. package/docs/support-matrix.md +40 -4
  80. package/docs/topology.md +67 -6
  81. package/docs/ubuntu-sync.md +78 -28
  82. package/docs/worker-contract.md +122 -19
  83. package/docs/worker-requirements.md +107 -0
  84. package/examples/fleet.json +1 -0
  85. package/examples/workers-from-infrastructure/main.tf +132 -0
  86. package/examples/workers-from-infrastructure/worker-records.json +14 -0
  87. package/llms.txt +3 -1
  88. package/mise.lock +29 -0
  89. package/mise.toml +5 -3
  90. package/package.json +2 -2
  91. package/schema/check-ids.json +1967 -170
  92. package/schema/check-ids.schema.json +34 -0
  93. package/schema/fleet.schema.json +327 -8
  94. package/schema/output/check.schema.json +1 -1
  95. package/schema/output/fleet-state-definition.schema.json +14 -0
  96. package/schema/output/fleet-sync-schedule.schema.json +26 -0
  97. package/schema/output/fleet-sync.schema.json +18 -0
  98. package/schema/output/report.schema.json +3 -2
  99. package/schema/worker-record.schema.json +76 -0
  100. package/src/agents/converge.ts +140 -24
  101. package/src/agents/files.ts +2 -32
  102. package/src/agents/native-verify.ts +34 -3
  103. package/src/agents/secrets.ts +39 -4
  104. package/src/check-owners.ts +61 -2
  105. package/src/check-registry.ts +630 -0
  106. package/src/cli/agent-guide.ts +3 -3
  107. package/src/cli/cli.ts +4 -0
  108. package/src/cli/fleet-manifest.ts +9 -3
  109. package/src/cli/fleet-node-lifecycle.ts +313 -64
  110. package/src/cli/fleet-node-park.ts +238 -0
  111. package/src/cli/fleet-node-seed.ts +51 -35
  112. package/src/cli/fleet-state.ts +2 -1
  113. package/src/cli/fleet-sync-checkout.ts +7 -0
  114. package/src/cli/fleet-sync-enrollment.ts +193 -32
  115. package/src/cli/fleet-sync-forward.ts +4 -0
  116. package/src/cli/fleet-sync-manager.ts +103 -33
  117. package/src/cli/fleet-sync-output.ts +31 -11
  118. package/src/cli/fleet-sync-plan.ts +65 -9
  119. package/src/cli/fleet-sync-records.ts +113 -0
  120. package/src/cli/fleet-sync-remote.ts +151 -9
  121. package/src/cli/fleet-sync-schedule.ts +14 -4
  122. package/src/cli/fleet-sync-state.ts +28 -16
  123. package/src/cli/fleet-sync-vault.ts +77 -0
  124. package/src/cli/fleet-sync-worker.ts +214 -0
  125. package/src/cli/fleet-sync.ts +150 -19
  126. package/src/cli/fleet-validate.ts +59 -21
  127. package/src/cli/fleet-watch.ts +7 -1
  128. package/src/cli/fleet.ts +87 -5
  129. package/src/cli/managed-health.ts +25 -1
  130. package/src/cli/register-fleet.ts +115 -4
  131. package/src/cli/registry.ts +14 -0
  132. package/src/cli/tailnet.ts +43 -10
  133. package/src/cli/ui-data.ts +3 -1
  134. package/src/cli/worker-usage-report.ts +63 -0
  135. package/src/clock.ts +42 -0
  136. package/src/definition.ts +332 -9
  137. package/src/diagnostics.ts +5 -2
  138. package/src/exposure.ts +102 -0
  139. package/src/fleet-config.ts +3 -1
  140. package/src/git-identity.ts +76 -3
  141. package/src/ide/ide.ts +5 -0
  142. package/src/ide/t3.ts +12 -2
  143. package/src/input-hashes.ts +6 -0
  144. package/src/machine/machine-class.ts +59 -0
  145. package/src/machine/platform.ts +90 -11
  146. package/src/machine/state.ts +37 -15
  147. package/src/machine/support-matrix.ts +11 -9
  148. package/src/machine-health.ts +28 -5
  149. package/src/manager-health.ts +148 -2
  150. package/src/manager-sync.ts +65 -4
  151. package/src/monitoring/beszel.ts +8 -8
  152. package/src/monitoring/enroll.ts +8 -1
  153. package/src/monitoring/hub-access.ts +10 -4
  154. package/src/monitoring/systems.ts +138 -0
  155. package/src/network-definition.ts +13 -4
  156. package/src/node-converge-linux.ts +136 -27
  157. package/src/node-converge.ts +13 -3
  158. package/src/platform/ansible-receipt.ts +17 -2
  159. package/src/platform/ansible.ts +40 -4
  160. package/src/platform/manager-host.ts +25 -8
  161. package/src/platform/resource-verify.ts +18 -7
  162. package/src/platform/t3-policy.ts +24 -10
  163. package/src/platform/t3-service.ts +109 -34
  164. package/src/platform/ubuntu-release.ts +24 -0
  165. package/src/platform/ubuntu-verify.ts +31 -3
  166. package/src/platform/ubuntu-worker.ts +58 -0
  167. package/src/platform/worker-platform.ts +72 -0
  168. package/src/protocol.ts +1 -1
  169. package/src/public-reachability.ts +186 -0
  170. package/src/remote-bootstrap.ts +50 -12
  171. package/src/remote-operation.ts +18 -4
  172. package/src/repair-plan.ts +23 -12
  173. package/src/report.ts +2 -1
  174. package/src/schedule-check.ts +21 -2
  175. package/src/secrets.ts +4 -0
  176. package/src/service-auth.ts +55 -48
  177. package/src/ssh-connection.ts +141 -0
  178. package/src/ssh.ts +63 -24
  179. package/src/state/store.ts +4 -2
  180. package/src/state/sync.ts +35 -6
  181. package/src/state/workers.ts +140 -0
  182. package/src/t3/pairing.ts +59 -0
  183. package/src/t3/peer-link.ts +333 -0
  184. package/src/t3/version.ts +1 -1
  185. package/src/tailnet-cleanup.ts +185 -0
  186. package/src/tailnet-control.ts +346 -0
  187. package/src/tailscale.ts +1 -1
  188. package/src/toolchain-checks.ts +11 -1
  189. package/src/types.ts +4 -2
  190. package/src/worker-account.ts +63 -0
  191. package/src/worker-activity.ts +303 -0
  192. package/src/worker-capability-checks.ts +55 -16
  193. package/src/worker-capacity.ts +31 -0
  194. package/src/worker-exposure.ts +388 -0
  195. package/src/worker-features.ts +201 -0
  196. package/src/worker-host-checks.ts +71 -20
  197. package/src/worker-manifest.ts +27 -4
  198. package/src/worker-parking.ts +70 -0
  199. package/src/worker-policy.ts +17 -1
  200. package/src/worker-readiness.ts +15 -3
  201. package/src/worker-reboot.ts +129 -0
  202. package/src/worker-records.ts +305 -0
  203. package/src/worker-seed.ts +16 -11
  204. package/src/worker-sizing.ts +76 -0
  205. package/src/cli/schedule-logs.ts +0 -36
@@ -0,0 +1,132 @@
1
+ # Workers from infrastructure as code: an example, with a local virtual
2
+ # machine (libvirt) standing in for the provider. Any tool or provider that
3
+ # can boot a stock Ubuntu image with cloud-init user data and write a file
4
+ # works the same way; dev-fleet never calls a provider and never creates a
5
+ # machine. It reads the worker records this writes (worker-records.json, see
6
+ # schema/worker-record.schema.json) because fleet.json names the file:
7
+ #
8
+ # "workerRecords": [{ "file": "infra/worker-records.json" }]
9
+ #
10
+ # The handoff, from the fleet project (OpenTofu installed, libvirt on this
11
+ # machine):
12
+ #
13
+ # 1. Declare the worker. With only `tailnet_name` and `user` set, this
14
+ # writes its record and creates nothing else:
15
+ # tofu -chdir=infra apply -var-file=workers.tfvars
16
+ # 2. Seed it. dev-fleet generates its host key, pins it in the fleet state
17
+ # and writes the cloud-init user data:
18
+ # npx devfleet fleet-node-seed --id rented-one \
19
+ # --output infra/seed/rented-one.yaml --apply --yes --json
20
+ # Put the path in `seed` (and, if you like, the printed hostKey in
21
+ # `host_key`, so that the record carries it too).
22
+ # 3. Create the machine, then converge it:
23
+ # tofu -chdir=infra apply -var-file=workers.tfvars
24
+ # npx devfleet fleet-sync --non-interactive
25
+ # 4. Remove it: drop it from `workers` and apply, or `tofu destroy`. Its
26
+ # record is gone, so the next `npx devfleet fleet-sync` retires it: its
27
+ # token, pinned host key, monitoring system and T3 link are removed.
28
+ #
29
+ # What the machine must offer (image, architecture, size, access, network) is
30
+ # docs/worker-requirements.md. For a hosted provider only these change: the
31
+ # provider block and its credentials, the image (its stock Ubuntu image of an
32
+ # accepted release, in place of `ubuntu_image`), the instance type (at least
33
+ # the minimum size, in place of `memory_mib` and `vcpus`) and the network (a
34
+ # private network, or inbound rules with nothing open, in place of
35
+ # `network_interface`). The seed goes in as the instance's user data and the
36
+ # records come out the same way.
37
+ #
38
+ # This example cannot be applied in dev-fleet's CI (it needs a libvirt host
39
+ # and a tailnet), so it is not proven there; the record format and what
40
+ # fleet-sync does with records are (features/cli/fleet-validate.feature,
41
+ # features/fleet-sync/node-lifecycle.feature). Pin the provider in your own
42
+ # project: `tofu init` writes .terraform.lock.hcl.
43
+
44
+ terraform {
45
+ required_providers {
46
+ libvirt = { source = "dmacvicar/libvirt" }
47
+ local = { source = "hashicorp/local" }
48
+ }
49
+ }
50
+
51
+ provider "libvirt" {
52
+ uri = "qemu:///system"
53
+ }
54
+
55
+ variable "ubuntu_image" {
56
+ description = "A stock Ubuntu cloud image (a URL or a local path) of the release fleet.json names."
57
+ type = string
58
+ }
59
+
60
+ variable "workers" {
61
+ description = "The workers, by fleet ID. A worker with a seed is created; one without is only declared."
62
+ type = map(object({
63
+ tailnet_name = string
64
+ user = string
65
+ seed = optional(string)
66
+ host_key = optional(string)
67
+ memory_mib = optional(number, 8192)
68
+ vcpus = optional(number, 4)
69
+ hourly_rate = optional(number)
70
+ }))
71
+ }
72
+
73
+ locals {
74
+ seeded = { for id, worker in var.workers : id => worker if worker.seed != null }
75
+ }
76
+
77
+ resource "libvirt_volume" "image" {
78
+ name = "devfleet-ubuntu.qcow2"
79
+ source = var.ubuntu_image
80
+ }
81
+
82
+ resource "libvirt_volume" "disk" {
83
+ for_each = local.seeded
84
+ name = "${each.key}.qcow2"
85
+ base_volume_id = libvirt_volume.image.id
86
+ size = 64 * 1024 * 1024 * 1024
87
+ }
88
+
89
+ resource "libvirt_cloudinit_disk" "seed" {
90
+ for_each = local.seeded
91
+ name = "${each.key}-seed.iso"
92
+ user_data = file(each.value.seed)
93
+ }
94
+
95
+ resource "libvirt_domain" "worker" {
96
+ for_each = local.seeded
97
+ name = each.key
98
+ memory = each.value.memory_mib
99
+ vcpu = each.value.vcpus
100
+ cloudinit = libvirt_cloudinit_disk.seed[each.key].id
101
+
102
+ disk {
103
+ volume_id = libvirt_volume.disk[each.key].id
104
+ }
105
+
106
+ network_interface {
107
+ network_name = "default"
108
+ }
109
+ }
110
+
111
+ # The handoff: one record per declared worker. Only what dev-fleet needs to
112
+ # reach the machine, and nothing that names this tool or the provider.
113
+ resource "local_file" "worker_records" {
114
+ filename = "${path.module}/worker-records.json"
115
+ file_permission = "0644"
116
+ content = jsonencode({
117
+ version = 1
118
+ workers = [
119
+ for id, worker in var.workers : merge(
120
+ { id = id, tailnetName = worker.tailnet_name, user = worker.user },
121
+ worker.host_key == null ? {} : { hostKey = worker.host_key },
122
+ worker.hourly_rate == null ? {} : { billing = { hourlyRate = worker.hourly_rate } },
123
+ { labels = { source = "local-vm" } },
124
+ )
125
+ ]
126
+ })
127
+ }
128
+
129
+ output "fleet_workers" {
130
+ description = "The same records, for a fleet.json that runs a command instead: { \"command\": [\"tofu\", \"-chdir=infra\", \"output\", \"-json\", \"fleet_workers\"] }."
131
+ value = jsondecode(local_file.worker_records.content)
132
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$schema": "../../schema/worker-record.schema.json",
3
+ "version": 1,
4
+ "workers": [
5
+ {
6
+ "id": "rented-one",
7
+ "tailnetName": "rented-one.tail0a1b2c.ts.net",
8
+ "user": "dev",
9
+ "hostKey": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIExampleHostKeyOfARentedWorker",
10
+ "billing": { "hourlyRate": 0.5 },
11
+ "labels": { "source": "local-vm" }
12
+ }
13
+ ]
14
+ }
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # dev-fleet
2
2
 
3
- > dev-fleet keeps a set of development machines in sync: one macOS **manager** and any number of Ubuntu 26.04 **workers** reached over SSH and Tailscale. It is used as the npm package `@crvouga/dev-fleet` (CLI `devfleet`) from a project of your own that holds `fleet.json` and pins the package version; one command, `devfleet fleet-sync`, converges every machine to the commit that version was published from. The fleet state lives in an S3-compatible bucket you own.
3
+ > dev-fleet keeps a set of development machines in sync: one macOS **manager** and any number of Ubuntu (26.04 or 24.04) **workers** reached over SSH and Tailscale. It is used as the npm package `@crvouga/dev-fleet` (CLI `devfleet`) from a project of your own that holds `fleet.json` and pins the package version; one command, `devfleet fleet-sync`, converges every machine to the commit that version was published from. The fleet state lives in an S3-compatible bucket you own.
4
4
 
5
5
  Rules for an agent working in a project that uses dev-fleet:
6
6
 
@@ -16,10 +16,12 @@ Rules for an agent working in a project that uses dev-fleet:
16
16
  - [README](https://github.com/crvouga/dev-fleet/blob/main/README.md): what dev-fleet assumes, quickstart, versions, adding a machine, known limits
17
17
  - [Example fleet.json](https://github.com/crvouga/dev-fleet/blob/main/examples/fleet.json): a complete configuration with placeholders (`npx devfleet fleet-state --example` prints it)
18
18
  - [fleet.json schema](https://github.com/crvouga/dev-fleet/blob/main/schema/fleet.schema.json): JSON Schema for the fleet configuration
19
+ - [Check-ID registry](https://github.com/crvouga/dev-fleet/blob/main/schema/check-ids.json): every check ID a report can carry, with what it means, whether it can block readiness (severity) and what repairs it (a fleet-repair recipe, or why only a person can); generated from the code
19
20
 
20
21
  ## Operate it
21
22
 
22
23
  - [Fleet state](https://github.com/crvouga/dev-fleet/blob/main/docs/state.md): the bucket, replication, replacing the manager, what the bucket does not hold yet
24
+ - [Worker requirements](https://github.com/crvouga/dev-fleet/blob/main/docs/worker-requirements.md): what a machine must offer to be a worker (image, architecture, size, access, first-boot data, network), each with its check and failure code, and what changes for a hosted provider
23
25
  - [Topology](https://github.com/crvouga/dev-fleet/blob/main/docs/topology.md): the manager and worker roles and the canary
24
26
  - [What is declared, and where](https://github.com/crvouga/dev-fleet/blob/main/docs/declared.md): what is pinned on a machine and what is not
25
27
  - [Provider accounts](https://github.com/crvouga/dev-fleet/blob/main/docs/accounts.md): the account roster, its states and checks, adding or removing an account, propagation to every node, account selection
package/mise.lock CHANGED
@@ -1355,6 +1355,35 @@ url = "https://github.com/getsops/sops/releases/download/v3.13.3/sops-v3.13.3.am
1355
1355
  url_api = "https://api.github.com/repos/getsops/sops/releases/assets/486808200"
1356
1356
  provenance = "cosign"
1357
1357
 
1358
+ [[tools.tmux]]
1359
+ version = "3.8"
1360
+ backend = "aqua:tmux/tmux-builds"
1361
+ specifiers = ["3.8"]
1362
+
1363
+ [tools.tmux."platforms.linux-arm64"]
1364
+ checksum = "sha256:f399311b1159705e69839eaf4f6f68c8b8540dc3a8538b87c30dedb9c3c7fc23"
1365
+ checksum_source = "mise-versions"
1366
+ url = "https://github.com/tmux/tmux-builds/releases/download/v3.8/tmux-3.8-linux-arm64.tar.gz"
1367
+ url_api = "https://api.github.com/repos/tmux/tmux-builds/releases/assets/721688993"
1368
+
1369
+ [tools.tmux."platforms.linux-x64"]
1370
+ checksum = "sha256:147849ff18b62a8aa3d5d8f75dd07c3f9fdfad529f932236afdec838fc1d15e1"
1371
+ checksum_source = "mise-versions"
1372
+ url = "https://github.com/tmux/tmux-builds/releases/download/v3.8/tmux-3.8-linux-x86_64.tar.gz"
1373
+ url_api = "https://api.github.com/repos/tmux/tmux-builds/releases/assets/721688991"
1374
+
1375
+ [tools.tmux."platforms.macos-arm64"]
1376
+ checksum = "sha256:ec926bbf28ddf55d0dc7c9791d43e03e251ddab392d763f7fbb38d4b8408d051"
1377
+ checksum_source = "mise-versions"
1378
+ url = "https://github.com/tmux/tmux-builds/releases/download/v3.8/tmux-3.8-macos-arm64.tar.gz"
1379
+ url_api = "https://api.github.com/repos/tmux/tmux-builds/releases/assets/721688988"
1380
+
1381
+ [tools.tmux."platforms.macos-x64"]
1382
+ checksum = "sha256:e7b92e51d9e9610ce80d1c477da1e6ff6a6398ea6b6b4d4ff7b19cf60f594555"
1383
+ checksum_source = "mise-versions"
1384
+ url = "https://github.com/tmux/tmux-builds/releases/download/v3.8/tmux-3.8-macos-x86_64.tar.gz"
1385
+ url_api = "https://api.github.com/repos/tmux/tmux-builds/releases/assets/721688994"
1386
+
1358
1387
  [[tools.usql]]
1359
1388
  version = "0.21.6"
1360
1389
  backend = "aqua:xo/usql"
package/mise.toml CHANGED
@@ -1,7 +1,7 @@
1
1
  # Shared workstation toolchain. Bootstrap installs this globally; projects may override it.
2
2
  # Commit mise.lock whenever changing these pins.
3
- # min_version is also the exact mise bootstrap/bootstrap.sh installs; bump the
4
- # mise_*_sha256 digests under [vars] with it.
3
+ # min_version is also the exact mise bootstrap/bootstrap.sh installs; the
4
+ # mise_*_sha256 digests under [vars] move with it (bun bootstrap/pins.ts mise).
5
5
  min_version = "2026.10.24"
6
6
 
7
7
  [settings]
@@ -30,6 +30,8 @@ go = "1.27.3"
30
30
  jq = "1.8.2"
31
31
  yq = "4.54.1"
32
32
  ripgrep = "15.2.0"
33
+ # Terminal multiplexer for long agent and build sessions on a worker.
34
+ tmux = { version = "3.8", os = ["linux", "macos"] }
33
35
  fd = "10.5.0"
34
36
  fzf = "0.74.5"
35
37
  bat = "0.26.1"
@@ -109,7 +111,7 @@ docker_desktop_arm64_sha256 = "9c6f13ce4edda2abf20d801552b6acb96acd3d64b3e91b50c
109
111
  docker_desktop_amd64_sha256 = "96b53f9a4a807b6be6207d18f360b9778ff481e1d94b5027bdf1ae2a22d837cb"
110
112
 
111
113
  # Minimal remote development baseline; versions are resolved exclusively by tools + mise.lock.
112
- worker_tools = "bun,node,gh,python,uv,docker-cli,vault,jq,codex,claude,aqua:anomalyco/opencode,gemini,copilot,http:grok,http:antigravity"
114
+ worker_tools = "bun,node,gh,python,uv,docker-cli,vault,jq,tmux,codex,claude,aqua:anomalyco/opencode,gemini,copilot,http:grok,http:antigravity"
113
115
  # Tool profiles a fleet adds to its workers (`worker.toolProfiles` in
114
116
  # fleet.json, fleet-wide or per worker): one `worker_profile_<name>` each,
115
117
  # naming tools pinned above. bootstrap/worker-tools.ts lists the names.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crvouga/dev-fleet",
3
- "version": "0.8.0",
3
+ "version": "0.9.1",
4
4
  "description": "Keeps a set of development machines in sync: one manager and many workers",
5
5
  "license": "MIT",
6
6
  "repository": "github:crvouga/dev-fleet",
@@ -72,5 +72,5 @@
72
72
  "engines": {
73
73
  "node": ">=22"
74
74
  },
75
- "gitHead": "3f13ebe4bda2cf813a68ee45678627b2e21660d5"
75
+ "gitHead": "3a465d53335387bf4851216ad8df67d1866fe887"
76
76
  }