devlanes 0.2.0 → 0.4.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/README.md +3 -1
- package/bin/devlanes +57 -0
- package/install.js +75 -0
- package/package.json +12 -6
- package/schema.json +993 -942
- package/user-schema.json +528 -389
- package/bin/devlanes.js +0 -44
package/schema.json
CHANGED
|
@@ -4,52 +4,44 @@
|
|
|
4
4
|
"ComposeFiles": {
|
|
5
5
|
"anyOf": [
|
|
6
6
|
{
|
|
7
|
-
"description": "One Compose file relative to the project.",
|
|
8
|
-
"examples": [
|
|
9
|
-
"docker-compose.yml"
|
|
10
|
-
],
|
|
11
7
|
"type": "string"
|
|
12
8
|
},
|
|
13
9
|
{
|
|
14
|
-
"description": "Ordered Compose files, merged in the same order as repeated -f arguments.",
|
|
15
|
-
"examples": [
|
|
16
|
-
[
|
|
17
|
-
"docker-compose.yml",
|
|
18
|
-
"docker-compose.dev.yml"
|
|
19
|
-
]
|
|
20
|
-
],
|
|
21
10
|
"items": {
|
|
22
|
-
"description": "
|
|
11
|
+
"description": "Compose files merged in order, like repeated `-f` arguments.",
|
|
23
12
|
"examples": [
|
|
24
13
|
"docker-compose.yml",
|
|
25
14
|
"docker-compose.dev.yml"
|
|
26
15
|
],
|
|
16
|
+
"markdownDescription": "Compose files merged in order, like repeated `-f` arguments.",
|
|
27
17
|
"type": "string"
|
|
28
18
|
},
|
|
29
19
|
"type": "array"
|
|
30
20
|
}
|
|
31
21
|
],
|
|
32
|
-
"description": "Compose files
|
|
22
|
+
"description": "Compose file, or files merged like repeated `-f` arguments.",
|
|
33
23
|
"examples": [
|
|
34
24
|
"docker-compose.yml",
|
|
35
25
|
[
|
|
36
26
|
"docker-compose.yml",
|
|
37
27
|
"docker-compose.dev.yml"
|
|
38
28
|
]
|
|
39
|
-
]
|
|
29
|
+
],
|
|
30
|
+
"markdownDescription": "Compose file, or files merged like repeated `-f` arguments."
|
|
40
31
|
},
|
|
41
32
|
"ConfigDuration": {
|
|
42
|
-
"description": "A duration
|
|
33
|
+
"description": "A duration: a whole number followed by `ms`, `s`, `m`, `h` or `d`, such as `500ms`, `15s` or `10m`. Units cannot be combined.",
|
|
43
34
|
"examples": [
|
|
44
35
|
"15s",
|
|
45
36
|
"10m"
|
|
46
37
|
],
|
|
38
|
+
"markdownDescription": "A duration: a whole number followed by `ms`, `s`, `m`, `h` or `d`, such as `500ms`, `15s` or `10m`. Units cannot be combined.",
|
|
47
39
|
"pattern": "^[0-9]+(ms|s|m|h|d)$",
|
|
48
40
|
"type": "string"
|
|
49
41
|
},
|
|
50
42
|
"ContainerConfig": {
|
|
51
43
|
"additionalProperties": false,
|
|
52
|
-
"description": "
|
|
44
|
+
"description": "Docker container run without a Compose file, shared by every lane or one per lane. Processes reach it through `${{ infra.<name>.ports.<port> }}`.",
|
|
53
45
|
"examples": [
|
|
54
46
|
{
|
|
55
47
|
"image": "ghcr.io/cerbos/cerbos:0.40.0",
|
|
@@ -60,98 +52,119 @@
|
|
|
60
52
|
}
|
|
61
53
|
}
|
|
62
54
|
],
|
|
55
|
+
"markdownDescription": "Docker container run without a Compose file, shared by every lane or one per lane. Processes reach it through `${{ infra.<name>.ports.<port> }}`.",
|
|
63
56
|
"properties": {
|
|
64
57
|
"command": {
|
|
65
58
|
"anyOf": [
|
|
66
59
|
{
|
|
67
|
-
"$ref": "#/$defs/Run"
|
|
60
|
+
"$ref": "#/$defs/Run",
|
|
61
|
+
"description": "",
|
|
62
|
+
"examples": [],
|
|
63
|
+
"markdownDescription": ""
|
|
68
64
|
},
|
|
69
65
|
{
|
|
70
66
|
"type": "null"
|
|
71
67
|
}
|
|
72
68
|
],
|
|
73
|
-
"description": "Command replacing the image's default
|
|
69
|
+
"description": "Command replacing the image's default: a list is used as is, a string runs through `/bin/sh -c` inside the container.",
|
|
74
70
|
"examples": [
|
|
75
71
|
[
|
|
76
72
|
"server",
|
|
77
73
|
"--config=/policies/config.yaml"
|
|
78
74
|
]
|
|
79
|
-
]
|
|
75
|
+
],
|
|
76
|
+
"markdownDescription": "Command replacing the image's default: a list is used as is, a string runs through `/bin/sh -c` inside the container."
|
|
80
77
|
},
|
|
81
78
|
"env": {
|
|
82
79
|
"additionalProperties": {
|
|
83
80
|
"$ref": "#/$defs/Templated_Scalar",
|
|
84
|
-
"description": "
|
|
81
|
+
"description": "Environment variables set inside the container.",
|
|
85
82
|
"examples": [
|
|
86
|
-
"
|
|
87
|
-
]
|
|
83
|
+
"debug"
|
|
84
|
+
],
|
|
85
|
+
"markdownDescription": "Environment variables set inside the container."
|
|
88
86
|
},
|
|
89
87
|
"default": {},
|
|
90
|
-
"description": "Environment variables
|
|
88
|
+
"description": "Environment variables set inside the container.",
|
|
91
89
|
"examples": [
|
|
92
90
|
{
|
|
93
91
|
"LOG_LEVEL": "debug"
|
|
94
92
|
}
|
|
95
93
|
],
|
|
94
|
+
"markdownDescription": "Environment variables set inside the container.",
|
|
96
95
|
"type": "object"
|
|
97
96
|
},
|
|
98
97
|
"image": {
|
|
99
98
|
"anyOf": [
|
|
100
99
|
{
|
|
101
|
-
"$ref": "#/$defs/Templated_string"
|
|
100
|
+
"$ref": "#/$defs/Templated_string",
|
|
101
|
+
"description": "",
|
|
102
|
+
"examples": [],
|
|
103
|
+
"markdownDescription": ""
|
|
102
104
|
},
|
|
103
105
|
{
|
|
104
106
|
"type": "null"
|
|
105
107
|
}
|
|
106
108
|
],
|
|
107
|
-
"description": "
|
|
109
|
+
"description": "Image to run. Required. A running container with the same image, command, env, mounts and ports is reused; any change recreates it.",
|
|
108
110
|
"examples": [
|
|
109
111
|
"ghcr.io/cerbos/cerbos:0.40.0"
|
|
110
|
-
]
|
|
112
|
+
],
|
|
113
|
+
"markdownDescription": "Image to run. Required. A running container with the same image, command, env, mounts and ports is reused; any change recreates it."
|
|
111
114
|
},
|
|
112
115
|
"per_lane": {
|
|
113
116
|
"anyOf": [
|
|
114
117
|
{
|
|
115
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
118
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
119
|
+
"description": "",
|
|
120
|
+
"examples": [],
|
|
121
|
+
"markdownDescription": ""
|
|
116
122
|
},
|
|
117
123
|
{
|
|
118
124
|
"type": "null"
|
|
119
125
|
}
|
|
120
126
|
],
|
|
121
|
-
"description": "
|
|
127
|
+
"description": "Run one container per lane instead of one shared by every lane. Defaults to false. Per-lane containers and their named volumes are removed by `devlanes lane clean`.",
|
|
122
128
|
"examples": [
|
|
123
129
|
true,
|
|
124
130
|
false
|
|
125
|
-
]
|
|
131
|
+
],
|
|
132
|
+
"markdownDescription": "Run one container per lane instead of one shared by every lane. Defaults to false. Per-lane containers and their named volumes are removed by `devlanes lane clean`."
|
|
126
133
|
},
|
|
127
134
|
"ports": {
|
|
128
135
|
"additionalProperties": {
|
|
129
136
|
"$ref": "#/$defs/Templated_uint16",
|
|
130
|
-
"description": "
|
|
137
|
+
"description": "Container ports by name. devlanes publishes each on a host port on 127.0.0.1, read as `${{ infra.<name>.ports.<port> }}`; `infra.<name>.port` is the first one.",
|
|
131
138
|
"examples": [
|
|
132
|
-
|
|
133
|
-
|
|
139
|
+
3592,
|
|
140
|
+
3593
|
|
141
|
+
],
|
|
142
|
+
"markdownDescription": "Container ports by name. devlanes publishes each on a host port on 127.0.0.1, read as `${{ infra.<name>.ports.<port> }}`; `infra.<name>.port` is the first one."
|
|
134
143
|
},
|
|
135
144
|
"default": {},
|
|
136
|
-
"description": "
|
|
145
|
+
"description": "Container ports by name. devlanes publishes each on a host port on 127.0.0.1, read as `${{ infra.<name>.ports.<port> }}`; `infra.<name>.port` is the first one.",
|
|
137
146
|
"examples": [
|
|
138
147
|
{
|
|
139
148
|
"grpc": 3593,
|
|
140
149
|
"http": 3592
|
|
141
150
|
}
|
|
142
151
|
],
|
|
152
|
+
"markdownDescription": "Container ports by name. devlanes publishes each on a host port on 127.0.0.1, read as `${{ infra.<name>.ports.<port> }}`; `infra.<name>.port` is the first one.",
|
|
143
153
|
"type": "object"
|
|
144
154
|
},
|
|
145
155
|
"ready": {
|
|
146
156
|
"anyOf": [
|
|
147
157
|
{
|
|
148
|
-
"$ref": "#/$defs/ReadyConfig"
|
|
158
|
+
"$ref": "#/$defs/ReadyConfig",
|
|
159
|
+
"description": "",
|
|
160
|
+
"examples": [],
|
|
161
|
+
"markdownDescription": ""
|
|
149
162
|
},
|
|
150
163
|
{
|
|
151
164
|
"type": "null"
|
|
152
165
|
}
|
|
153
166
|
],
|
|
154
|
-
"description": "
|
|
167
|
+
"description": "Extra check the start waits for once the container is up (the image's healthcheck, else its first port accepting TCP), before setup, tasks and services run. Write `started` or one of `tcp`, `http`, `log` (matched against the container's logs) or `cmd` (run on the host). If it does not pass within its timeout (default 60s), the start fails.",
|
|
155
168
|
"examples": [
|
|
156
169
|
"started",
|
|
157
170
|
{
|
|
@@ -162,10 +175,11 @@
|
|
|
162
175
|
{
|
|
163
176
|
"tcp": true
|
|
164
177
|
}
|
|
165
|
-
]
|
|
178
|
+
],
|
|
179
|
+
"markdownDescription": "Extra check the start waits for once the container is up (the image's healthcheck, else its first port accepting TCP), before setup, tasks and services run. Write `started` or one of `tcp`, `http`, `log` (matched against the container's logs) or `cmd` (run on the host). If it does not pass within its timeout (default 60s), the start fails."
|
|
166
180
|
},
|
|
167
181
|
"volumes": {
|
|
168
|
-
"description": "
|
|
182
|
+
"description": "Mounts as `source:destination[:mode]`. `./relative` and `/absolute` sources are bind mounts, relative ones from the owning worktree; a bare name is a named volume kept per project or per lane.",
|
|
169
183
|
"examples": [
|
|
170
184
|
[
|
|
171
185
|
"./infra/cerbos:/policies:ro"
|
|
@@ -173,11 +187,13 @@
|
|
|
173
187
|
],
|
|
174
188
|
"items": {
|
|
175
189
|
"$ref": "#/$defs/Templated_string",
|
|
176
|
-
"description": "
|
|
190
|
+
"description": "Mounts as `source:destination[:mode]`. `./relative` and `/absolute` sources are bind mounts, relative ones from the owning worktree; a bare name is a named volume kept per project or per lane.",
|
|
177
191
|
"examples": [
|
|
178
|
-
"
|
|
179
|
-
]
|
|
192
|
+
"./infra/cerbos:/policies:ro"
|
|
193
|
+
],
|
|
194
|
+
"markdownDescription": "Mounts as `source:destination[:mode]`. `./relative` and `/absolute` sources are bind mounts, relative ones from the owning worktree; a bare name is a named volume kept per project or per lane."
|
|
180
195
|
},
|
|
196
|
+
"markdownDescription": "Mounts as `source:destination[:mode]`. `./relative` and `/absolute` sources are bind mounts, relative ones from the owning worktree; a bare name is a named volume kept per project or per lane.",
|
|
181
197
|
"type": [
|
|
182
198
|
"array",
|
|
183
199
|
"null"
|
|
@@ -186,90 +202,55 @@
|
|
|
186
202
|
},
|
|
187
203
|
"type": "object"
|
|
188
204
|
},
|
|
189
|
-
"FnoxConfig": {
|
|
190
|
-
"additionalProperties": false,
|
|
191
|
-
"description": "Secrets profile selection for the project or a single unit.",
|
|
192
|
-
"examples": [
|
|
193
|
-
{
|
|
194
|
-
"profile": "dev"
|
|
195
|
-
}
|
|
196
|
-
],
|
|
197
|
-
"properties": {
|
|
198
|
-
"profile": {
|
|
199
|
-
"anyOf": [
|
|
200
|
-
{
|
|
201
|
-
"$ref": "#/$defs/Templated_string"
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
"type": "null"
|
|
205
|
-
}
|
|
206
|
-
],
|
|
207
|
-
"description": "Secrets profile passed to fnox; uses fnox's default profile when omitted.",
|
|
208
|
-
"examples": [
|
|
209
|
-
"dev",
|
|
210
|
-
"admin-api"
|
|
211
|
-
]
|
|
212
|
-
}
|
|
213
|
-
},
|
|
214
|
-
"type": "object"
|
|
215
|
-
},
|
|
216
205
|
"HostConfig": {
|
|
217
206
|
"anyOf": [
|
|
218
207
|
{
|
|
219
208
|
"$ref": "#/$defs/Templated_string",
|
|
220
|
-
"description": "
|
|
221
|
-
"examples": [
|
|
222
|
-
|
|
223
|
-
]
|
|
209
|
+
"description": "",
|
|
210
|
+
"examples": [],
|
|
211
|
+
"markdownDescription": ""
|
|
224
212
|
},
|
|
225
213
|
{
|
|
226
214
|
"$ref": "#/$defs/HostRoute",
|
|
227
|
-
"description": "
|
|
228
|
-
"examples": [
|
|
229
|
-
|
|
230
|
-
"fallback": true,
|
|
231
|
-
"host": "*.${{ lane.domain }}"
|
|
232
|
-
}
|
|
233
|
-
]
|
|
215
|
+
"description": "",
|
|
216
|
+
"examples": [],
|
|
217
|
+
"markdownDescription": ""
|
|
234
218
|
}
|
|
235
219
|
],
|
|
236
|
-
"description": "
|
|
220
|
+
"description": "HTTPS hostname the devlanes proxy routes to this unit in the current lane: a plain hostname, or a mapping with `host` plus `port`, `fallback` or `host_header`. Keep names under `lane.domain` so lanes never claim the same name.",
|
|
237
221
|
"examples": [
|
|
238
222
|
"api.${{ lane.domain }}",
|
|
239
223
|
{
|
|
240
224
|
"fallback": true,
|
|
241
225
|
"host": "*.${{ lane.domain }}"
|
|
242
226
|
}
|
|
243
|
-
]
|
|
227
|
+
],
|
|
228
|
+
"markdownDescription": "HTTPS hostname the devlanes proxy routes to this unit in the current lane: a plain hostname, or a mapping with `host` plus `port`, `fallback` or `host_header`. Keep names under `lane.domain` so lanes never claim the same name."
|
|
244
229
|
},
|
|
245
230
|
"HostHeader": {
|
|
246
|
-
"description": "Host header sent to the
|
|
231
|
+
"description": "Host header sent to the unit behind a hostname.",
|
|
232
|
+
"enum": [
|
|
233
|
+
"preserve",
|
|
234
|
+
"upstream"
|
|
235
|
+
],
|
|
236
|
+
"enumDescriptions": [
|
|
237
|
+
"Send the hostname the client requested, such as `api.acme-2.localhost`.",
|
|
238
|
+
"Send the local address and port the proxy connects to, such as `127.0.0.1:<port>`."
|
|
239
|
+
],
|
|
247
240
|
"examples": [
|
|
248
241
|
"preserve",
|
|
249
242
|
"upstream"
|
|
250
243
|
],
|
|
251
|
-
"
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
],
|
|
258
|
-
"type": "string"
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
"const": "upstream",
|
|
262
|
-
"description": "Send the upstream address and port as the Host header.",
|
|
263
|
-
"examples": [
|
|
264
|
-
"upstream"
|
|
265
|
-
],
|
|
266
|
-
"type": "string"
|
|
267
|
-
}
|
|
268
|
-
]
|
|
244
|
+
"markdownDescription": "Host header sent to the unit behind a hostname.",
|
|
245
|
+
"markdownEnumDescriptions": [
|
|
246
|
+
"Send the hostname the client requested, such as `api.acme-2.localhost`.",
|
|
247
|
+
"Send the local address and port the proxy connects to, such as `127.0.0.1:<port>`."
|
|
248
|
+
],
|
|
249
|
+
"type": "string"
|
|
269
250
|
},
|
|
270
251
|
"HostRoute": {
|
|
271
252
|
"additionalProperties": false,
|
|
272
|
-
"description": "
|
|
253
|
+
"description": "Hostname route with options: a named port, catch-all behaviour or a rewritten Host header.",
|
|
273
254
|
"examples": [
|
|
274
255
|
{
|
|
275
256
|
"host": "inspect.${{ lane.domain }}",
|
|
@@ -280,50 +261,61 @@
|
|
|
280
261
|
"host": "*.${{ lane.domain }}"
|
|
281
262
|
}
|
|
282
263
|
],
|
|
264
|
+
"markdownDescription": "Hostname route with options: a named port, catch-all behaviour or a rewritten Host header.",
|
|
283
265
|
"properties": {
|
|
284
266
|
"fallback": {
|
|
285
267
|
"anyOf": [
|
|
286
268
|
{
|
|
287
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
269
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
270
|
+
"description": "",
|
|
271
|
+
"examples": [],
|
|
272
|
+
"markdownDescription": ""
|
|
288
273
|
},
|
|
289
274
|
{
|
|
290
275
|
"type": "null"
|
|
291
276
|
}
|
|
292
277
|
],
|
|
293
|
-
"description": "
|
|
278
|
+
"description": "Make this route a catch-all: it is used only when no other route, exact or wildcard, matches the requested hostname. Typical for `*.${{ lane.domain }}` on a gateway that should answer every subdomain other services do not claim. Defaults to false.",
|
|
294
279
|
"examples": [
|
|
295
280
|
true,
|
|
296
281
|
false
|
|
297
|
-
]
|
|
282
|
+
],
|
|
283
|
+
"markdownDescription": "Make this route a catch-all: it is used only when no other route, exact or wildcard, matches the requested hostname. Typical for `*.${{ lane.domain }}` on a gateway that should answer every subdomain other services do not claim. Defaults to false."
|
|
298
284
|
},
|
|
299
285
|
"host": {
|
|
300
286
|
"$ref": "#/$defs/Templated_string",
|
|
301
|
-
"description": "
|
|
287
|
+
"description": "Hostname to route, evaluated for each lane. A leading `*.` makes a wildcard that matches any depth below it but not the name itself; quote it in YAML. Labels hold letters, digits and inner hyphens; case and a trailing dot are ignored.",
|
|
302
288
|
"examples": [
|
|
303
289
|
"api.${{ lane.domain }}",
|
|
304
290
|
"*.${{ lane.domain }}"
|
|
305
|
-
]
|
|
291
|
+
],
|
|
292
|
+
"markdownDescription": "Hostname to route, evaluated for each lane. A leading `*.` makes a wildcard that matches any depth below it but not the name itself; quote it in YAML. Labels hold letters, digits and inner hyphens; case and a trailing dot are ignored."
|
|
306
293
|
},
|
|
307
294
|
"host_header": {
|
|
308
295
|
"anyOf": [
|
|
309
296
|
{
|
|
310
|
-
"$ref": "#/$defs/HostHeader"
|
|
297
|
+
"$ref": "#/$defs/HostHeader",
|
|
298
|
+
"description": "",
|
|
299
|
+
"examples": [],
|
|
300
|
+
"markdownDescription": ""
|
|
311
301
|
},
|
|
312
302
|
{
|
|
313
303
|
"type": "null"
|
|
314
304
|
}
|
|
315
305
|
],
|
|
316
|
-
"description": "
|
|
306
|
+
"description": "Host header the unit receives. Defaults to `preserve`, the hostname the browser asked for; `upstream` sends the local address, such as `127.0.0.1:<port>`, for servers that reject or misroute requests for a Host that is not their own address.",
|
|
317
307
|
"examples": [
|
|
318
308
|
"preserve",
|
|
319
309
|
"upstream"
|
|
320
|
-
]
|
|
310
|
+
],
|
|
311
|
+
"markdownDescription": "Host header the unit receives. Defaults to `preserve`, the hostname the browser asked for; `upstream` sends the local address, such as `127.0.0.1:<port>`, for servers that reject or misroute requests for a Host that is not their own address."
|
|
321
312
|
},
|
|
322
313
|
"port": {
|
|
323
|
-
"description": "
|
|
314
|
+
"description": "Send this hostname to one of the unit's named ports instead of its main port. For a service it is a port name as in `self.ports.<name>`, and naming it here allocates that port; in `infra.hosts` it is the container port for Compose services, or the port's name for plain containers.",
|
|
324
315
|
"examples": [
|
|
325
316
|
"inspector"
|
|
326
317
|
],
|
|
318
|
+
"markdownDescription": "Send this hostname to one of the unit's named ports instead of its main port. For a service it is a port name as in `self.ports.<name>`, and naming it here allocates that port; in `infra.hosts` it is the container port for Compose services, or the port's name for plain containers.",
|
|
327
319
|
"type": [
|
|
328
320
|
"string",
|
|
329
321
|
"null"
|
|
@@ -335,43 +327,71 @@
|
|
|
335
327
|
],
|
|
336
328
|
"type": "object"
|
|
337
329
|
},
|
|
330
|
+
"Hosts": {
|
|
331
|
+
"anyOf": [
|
|
332
|
+
{
|
|
333
|
+
"$ref": "#/$defs/HostConfig",
|
|
334
|
+
"description": "",
|
|
335
|
+
"examples": [],
|
|
336
|
+
"markdownDescription": ""
|
|
337
|
+
},
|
|
338
|
+
{
|
|
339
|
+
"items": {
|
|
340
|
+
"$ref": "#/$defs/HostConfig",
|
|
341
|
+
"description": "HTTPS hostname the devlanes proxy routes to this unit in the current lane: a plain hostname, or a mapping with `host` plus `port`, `fallback` or `host_header`. Keep names under `lane.domain` so lanes never claim the same name.",
|
|
342
|
+
"examples": [
|
|
343
|
+
"api.${{ lane.domain }}",
|
|
344
|
+
{
|
|
345
|
+
"fallback": true,
|
|
346
|
+
"host": "*.${{ lane.domain }}"
|
|
347
|
+
}
|
|
348
|
+
],
|
|
349
|
+
"markdownDescription": "HTTPS hostname the devlanes proxy routes to this unit in the current lane: a plain hostname, or a mapping with `host` plus `port`, `fallback` or `host_header`. Keep names under `lane.domain` so lanes never claim the same name."
|
|
350
|
+
},
|
|
351
|
+
"type": "array"
|
|
352
|
+
}
|
|
353
|
+
],
|
|
354
|
+
"description": "HTTPS hostnames the devlanes proxy routes to this unit, so a browser reaches it at `https://<host>`: one hostname or route mapping, or a list of them.",
|
|
355
|
+
"examples": [
|
|
356
|
+
"api.${{ lane.domain }}",
|
|
357
|
+
[
|
|
358
|
+
"api.${{ lane.domain }}",
|
|
359
|
+
{
|
|
360
|
+
"host": "inspect.${{ lane.domain }}",
|
|
361
|
+
"port": "inspector"
|
|
362
|
+
}
|
|
363
|
+
]
|
|
364
|
+
],
|
|
365
|
+
"markdownDescription": "HTTPS hostnames the devlanes proxy routes to this unit, so a browser reaches it at `https://<host>`: one hostname or route mapping, or a list of them."
|
|
366
|
+
},
|
|
338
367
|
"HostsFile": {
|
|
339
|
-
"description": "Whether
|
|
368
|
+
"description": "Whether routed hostnames are also written to `/etc/hosts`.",
|
|
369
|
+
"enum": [
|
|
370
|
+
"auto",
|
|
371
|
+
"never",
|
|
372
|
+
"always"
|
|
373
|
+
],
|
|
374
|
+
"enumDescriptions": [
|
|
375
|
+
"Write the exact hostnames only when the daemon's startup check finds that the system resolver does not answer `*.localhost` with a loopback address.",
|
|
376
|
+
"Never write hostnames to `/etc/hosts`. Set in the user config, it applies to every project whatever the project sets.",
|
|
377
|
+
"Always write the exact hostnames, even when the system resolver handles `*.localhost`, for programs that send `*.localhost` to DNS themselves."
|
|
378
|
+
],
|
|
340
379
|
"examples": [
|
|
341
380
|
"auto",
|
|
342
381
|
"never",
|
|
343
382
|
"always"
|
|
344
383
|
],
|
|
345
|
-
"
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
"type": "string"
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
"const": "never",
|
|
356
|
-
"description": "Do not write hosts entries.",
|
|
357
|
-
"examples": [
|
|
358
|
-
"never"
|
|
359
|
-
],
|
|
360
|
-
"type": "string"
|
|
361
|
-
},
|
|
362
|
-
{
|
|
363
|
-
"const": "always",
|
|
364
|
-
"description": "Always write exact hostnames, including for runtimes without localhost subdomain support.",
|
|
365
|
-
"examples": [
|
|
366
|
-
"always"
|
|
367
|
-
],
|
|
368
|
-
"type": "string"
|
|
369
|
-
}
|
|
370
|
-
]
|
|
384
|
+
"markdownDescription": "Whether routed hostnames are also written to `/etc/hosts`.",
|
|
385
|
+
"markdownEnumDescriptions": [
|
|
386
|
+
"Write the exact hostnames only when the daemon's startup check finds that the system resolver does not answer `*.localhost` with a loopback address.",
|
|
387
|
+
"Never write hostnames to `/etc/hosts`. Set in the user config, it applies to every project whatever the project sets.",
|
|
388
|
+
"Always write the exact hostnames, even when the system resolver handles `*.localhost`, for programs that send `*.localhost` to DNS themselves."
|
|
389
|
+
],
|
|
390
|
+
"type": "string"
|
|
371
391
|
},
|
|
372
392
|
"HttpReady": {
|
|
373
393
|
"additionalProperties": false,
|
|
374
|
-
"description": "HTTP readiness probe against the unit's
|
|
394
|
+
"description": "HTTP readiness probe against the unit's main port. Passes on a 2xx answer when `status` is unset, or on exactly `status` when it is set. Redirects are not followed.",
|
|
375
395
|
"examples": [
|
|
376
396
|
{
|
|
377
397
|
"path": "/healthz",
|
|
@@ -379,50 +399,63 @@
|
|
|
379
399
|
"timeout": "60s"
|
|
380
400
|
}
|
|
381
401
|
],
|
|
402
|
+
"markdownDescription": "HTTP readiness probe against the unit's main port. Passes on a 2xx answer when `status` is unset, or on exactly `status` when it is set. Redirects are not followed.",
|
|
382
403
|
"properties": {
|
|
383
404
|
"path": {
|
|
384
405
|
"anyOf": [
|
|
385
406
|
{
|
|
386
|
-
"$ref": "#/$defs/Templated_string"
|
|
407
|
+
"$ref": "#/$defs/Templated_string",
|
|
408
|
+
"description": "",
|
|
409
|
+
"examples": [],
|
|
410
|
+
"markdownDescription": ""
|
|
387
411
|
},
|
|
388
412
|
{
|
|
389
413
|
"type": "null"
|
|
390
414
|
}
|
|
391
415
|
],
|
|
392
|
-
"description": "
|
|
416
|
+
"description": "Path requested with GET, such as `/healthz`; defaults to `/`.",
|
|
393
417
|
"examples": [
|
|
394
418
|
"/healthz",
|
|
395
419
|
"/-/health"
|
|
396
|
-
]
|
|
420
|
+
],
|
|
421
|
+
"markdownDescription": "Path requested with GET, such as `/healthz`; defaults to `/`."
|
|
397
422
|
},
|
|
398
423
|
"status": {
|
|
399
424
|
"anyOf": [
|
|
400
425
|
{
|
|
401
|
-
"$ref": "#/$defs/Templated_uint16"
|
|
426
|
+
"$ref": "#/$defs/Templated_uint16",
|
|
427
|
+
"description": "",
|
|
428
|
+
"examples": [],
|
|
429
|
+
"markdownDescription": ""
|
|
402
430
|
},
|
|
403
431
|
{
|
|
404
432
|
"type": "null"
|
|
405
433
|
}
|
|
406
434
|
],
|
|
407
|
-
"description": "
|
|
435
|
+
"description": "Status code that counts as ready, between 100 and 599; only that exact code passes. When unset, any status from 200 to 299 counts, so a 404 or a redirect keeps waiting (redirects are not followed). Set it to accept another code, such as `302` for a route that redirects to a login.",
|
|
408
436
|
"examples": [
|
|
409
437
|
200
|
|
410
|
-
]
|
|
438
|
+
],
|
|
439
|
+
"markdownDescription": "Status code that counts as ready, between 100 and 599; only that exact code passes. When unset, any status from 200 to 299 counts, so a 404 or a redirect keeps waiting (redirects are not followed). Set it to accept another code, such as `302` for a route that redirects to a login."
|
|
411
440
|
},
|
|
412
441
|
"timeout": {
|
|
413
442
|
"anyOf": [
|
|
414
443
|
{
|
|
415
|
-
"$ref": "#/$defs/Templated_ConfigDuration"
|
|
444
|
+
"$ref": "#/$defs/Templated_ConfigDuration",
|
|
445
|
+
"description": "",
|
|
446
|
+
"examples": [],
|
|
447
|
+
"markdownDescription": ""
|
|
416
448
|
},
|
|
417
449
|
{
|
|
418
450
|
"type": "null"
|
|
419
451
|
}
|
|
420
452
|
],
|
|
421
|
-
"description": "
|
|
453
|
+
"description": "How long the HTTP check may take to pass, replacing the check's `timeout`; defaults to 60s. When it runs out, a service is marked failed but keeps running, and for an infra container the start fails.",
|
|
422
454
|
"examples": [
|
|
423
455
|
"15s",
|
|
424
456
|
"10m"
|
|
425
|
-
]
|
|
457
|
+
],
|
|
458
|
+
"markdownDescription": "How long the HTTP check may take to pass, replacing the check's `timeout`; defaults to 60s. When it runs out, a service is marked failed but keeps running, and for an infra container the start fails."
|
|
426
459
|
}
|
|
427
460
|
},
|
|
428
461
|
"type": "object"
|
|
@@ -431,23 +464,18 @@
|
|
|
431
464
|
"anyOf": [
|
|
432
465
|
{
|
|
433
466
|
"$ref": "#/$defs/InfraCommandOptions",
|
|
434
|
-
"description": "
|
|
435
|
-
"examples": [
|
|
436
|
-
|
|
437
|
-
"ignore_errors": true,
|
|
438
|
-
"run": "docker compose exec -T rabbitmq rabbitmqctl add_vhost ${{ lane.vhost }}"
|
|
439
|
-
}
|
|
440
|
-
]
|
|
467
|
+
"description": "",
|
|
468
|
+
"examples": [],
|
|
469
|
+
"markdownDescription": ""
|
|
441
470
|
},
|
|
442
471
|
{
|
|
443
472
|
"$ref": "#/$defs/Run",
|
|
444
|
-
"description": "
|
|
445
|
-
"examples": [
|
|
446
|
-
|
|
447
|
-
]
|
|
473
|
+
"description": "",
|
|
474
|
+
"examples": [],
|
|
475
|
+
"markdownDescription": ""
|
|
448
476
|
}
|
|
449
477
|
],
|
|
450
|
-
"description": "
|
|
478
|
+
"description": "Command that prepares (`setup`) or removes (`teardown`) a lane's data: a command string or list, or a mapping with `run` and options such as `container`, `ignore_errors` and `timeout`. Task `steps` can run it as `infra.setup.<name>` or `infra.teardown.<name>`.",
|
|
451
479
|
"examples": [
|
|
452
480
|
"docker compose exec -T postgres createdb acme_${{ lane.name }}",
|
|
453
481
|
{
|
|
@@ -459,11 +487,12 @@
|
|
|
459
487
|
"s3://${{ lane.bucket }}"
|
|
460
488
|
]
|
|
461
489
|
}
|
|
462
|
-
]
|
|
490
|
+
],
|
|
491
|
+
"markdownDescription": "Command that prepares (`setup`) or removes (`teardown`) a lane's data: a command string or list, or a mapping with `run` and options such as `container`, `ignore_errors` and `timeout`. Task `steps` can run it as `infra.setup.<name>` or `infra.teardown.<name>`."
|
|
463
492
|
},
|
|
464
493
|
"InfraCommandOptions": {
|
|
465
494
|
"additionalProperties": false,
|
|
466
|
-
"description": "Setup or teardown command with
|
|
495
|
+
"description": "Setup or teardown command with options.",
|
|
467
496
|
"examples": [
|
|
468
497
|
{
|
|
469
498
|
"container": "rabbitmq",
|
|
@@ -471,12 +500,14 @@
|
|
|
471
500
|
"run": "docker compose exec -T rabbitmq rabbitmqctl add_vhost ${{ lane.vhost }}"
|
|
472
501
|
}
|
|
473
502
|
],
|
|
503
|
+
"markdownDescription": "Setup or teardown command with options.",
|
|
474
504
|
"properties": {
|
|
475
505
|
"container": {
|
|
476
|
-
"description": "
|
|
506
|
+
"description": "Run this setup entry again whenever the named container has restarted since it last ran, for data that lives in the container and may be gone, such as a RabbitMQ vhost.",
|
|
477
507
|
"examples": [
|
|
478
508
|
"rabbitmq"
|
|
479
509
|
],
|
|
510
|
+
"markdownDescription": "Run this setup entry again whenever the named container has restarted since it last ran, for data that lives in the container and may be gone, such as a RabbitMQ vhost.",
|
|
480
511
|
"type": [
|
|
481
512
|
"string",
|
|
482
513
|
"null"
|
|
@@ -485,59 +516,72 @@
|
|
|
485
516
|
"cwd": {
|
|
486
517
|
"anyOf": [
|
|
487
518
|
{
|
|
488
|
-
"$ref": "#/$defs/Templated_string"
|
|
519
|
+
"$ref": "#/$defs/Templated_string",
|
|
520
|
+
"description": "",
|
|
521
|
+
"examples": [],
|
|
522
|
+
"markdownDescription": ""
|
|
489
523
|
},
|
|
490
524
|
{
|
|
491
525
|
"type": "null"
|
|
492
526
|
}
|
|
493
527
|
],
|
|
494
|
-
"description": "Working directory relative to the lane's worktree.",
|
|
528
|
+
"description": "Working directory, relative to the lane's worktree; defaults to the worktree root.",
|
|
495
529
|
"examples": [
|
|
496
530
|
"infra"
|
|
497
|
-
]
|
|
531
|
+
],
|
|
532
|
+
"markdownDescription": "Working directory, relative to the lane's worktree; defaults to the worktree root."
|
|
498
533
|
},
|
|
499
534
|
"env": {
|
|
500
535
|
"additionalProperties": {
|
|
501
536
|
"$ref": "#/$defs/Templated_Scalar",
|
|
502
|
-
"description": "
|
|
537
|
+
"description": "Variables for this command only.",
|
|
503
538
|
"examples": [
|
|
504
|
-
"
|
|
505
|
-
]
|
|
539
|
+
"us-east-1"
|
|
540
|
+
],
|
|
541
|
+
"markdownDescription": "Variables for this command only."
|
|
506
542
|
},
|
|
507
543
|
"default": {},
|
|
508
|
-
"description": "
|
|
544
|
+
"description": "Variables for this command only.",
|
|
509
545
|
"examples": [
|
|
510
546
|
{
|
|
511
547
|
"AWS_DEFAULT_REGION": "us-east-1"
|
|
512
548
|
}
|
|
513
549
|
],
|
|
550
|
+
"markdownDescription": "Variables for this command only.",
|
|
514
551
|
"type": "object"
|
|
515
552
|
},
|
|
516
553
|
"ignore_errors": {
|
|
517
554
|
"anyOf": [
|
|
518
555
|
{
|
|
519
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
556
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
557
|
+
"description": "",
|
|
558
|
+
"examples": [],
|
|
559
|
+
"markdownDescription": ""
|
|
520
560
|
},
|
|
521
561
|
{
|
|
522
562
|
"type": "null"
|
|
523
563
|
}
|
|
524
564
|
],
|
|
525
|
-
"description": "
|
|
565
|
+
"description": "Count a failed or timed-out command as done instead of failing the start, for commands whose \"already exists\" error is fine. Defaults to false.",
|
|
526
566
|
"examples": [
|
|
527
567
|
true,
|
|
528
568
|
false
|
|
529
|
-
]
|
|
569
|
+
],
|
|
570
|
+
"markdownDescription": "Count a failed or timed-out command as done instead of failing the start, for commands whose \"already exists\" error is fine. Defaults to false."
|
|
530
571
|
},
|
|
531
572
|
"run": {
|
|
532
573
|
"anyOf": [
|
|
533
574
|
{
|
|
534
|
-
"$ref": "#/$defs/Run"
|
|
575
|
+
"$ref": "#/$defs/Run",
|
|
576
|
+
"description": "",
|
|
577
|
+
"examples": [],
|
|
578
|
+
"markdownDescription": ""
|
|
535
579
|
},
|
|
536
580
|
{
|
|
537
581
|
"type": "null"
|
|
538
582
|
}
|
|
539
583
|
],
|
|
540
|
-
"description": "
|
|
584
|
+
"description": "Command to run: a string runs through `/bin/sh -c`, a list runs the program directly. Write the command you mean, such as `docker compose exec -T postgres ...`; devlanes runs it as written. Required.",
|
|
541
585
|
"examples": [
|
|
542
586
|
"pnpm dev",
|
|
543
587
|
[
|
|
@@ -546,47 +590,34 @@
|
|
|
546
590
|
"--port",
|
|
547
591
|
"${{ self.port }}"
|
|
548
592
|
]
|
|
549
|
-
]
|
|
550
|
-
},
|
|
551
|
-
"run_script": {
|
|
552
|
-
"anyOf": [
|
|
553
|
-
{
|
|
554
|
-
"$ref": "#/$defs/RunScript"
|
|
555
|
-
},
|
|
556
|
-
{
|
|
557
|
-
"type": "null"
|
|
558
|
-
}
|
|
559
593
|
],
|
|
560
|
-
"
|
|
561
|
-
"examples": [
|
|
562
|
-
"apps/api/package.json#dev",
|
|
563
|
-
{
|
|
564
|
-
"name": "fixtures",
|
|
565
|
-
"source": "justfile"
|
|
566
|
-
}
|
|
567
|
-
]
|
|
594
|
+
"markdownDescription": "Command to run: a string runs through `/bin/sh -c`, a list runs the program directly. Write the command you mean, such as `docker compose exec -T postgres ...`; devlanes runs it as written. Required."
|
|
568
595
|
},
|
|
569
596
|
"timeout": {
|
|
570
597
|
"anyOf": [
|
|
571
598
|
{
|
|
572
|
-
"$ref": "#/$defs/Templated_ConfigDuration"
|
|
599
|
+
"$ref": "#/$defs/Templated_ConfigDuration",
|
|
600
|
+
"description": "",
|
|
601
|
+
"examples": [],
|
|
602
|
+
"markdownDescription": ""
|
|
573
603
|
},
|
|
574
604
|
{
|
|
575
605
|
"type": "null"
|
|
576
606
|
}
|
|
577
607
|
],
|
|
578
|
-
"description": "
|
|
608
|
+
"description": "Longest the command may run. When it runs out, the command is stopped (SIGTERM, then SIGKILL after 10 seconds) and counts as failed, so a setup entry fails the start unless `ignore_errors` is set. No limit by default.",
|
|
579
609
|
"examples": [
|
|
580
610
|
"15s",
|
|
581
611
|
"10m"
|
|
582
|
-
]
|
|
612
|
+
],
|
|
613
|
+
"markdownDescription": "Longest the command may run. When it runs out, the command is stopped (SIGTERM, then SIGKILL after 10 seconds) and counts as failed, so a setup entry fails the start unless `ignore_errors` is set. No limit by default."
|
|
583
614
|
}
|
|
584
615
|
},
|
|
585
616
|
"type": "object"
|
|
586
617
|
},
|
|
587
618
|
"InfraConfig": {
|
|
588
619
|
"additionalProperties": false,
|
|
589
|
-
"description": "Containers and
|
|
620
|
+
"description": "Containers the lanes depend on, started and waited on before setup, tasks and services, plus the commands that create and remove each lane's data in them. Processes reach a container through its host port, `${{ infra.<container>.port }}`.",
|
|
590
621
|
"examples": [
|
|
591
622
|
{
|
|
592
623
|
"compose": "docker-compose.yml",
|
|
@@ -595,29 +626,34 @@
|
|
|
595
626
|
]
|
|
596
627
|
}
|
|
597
628
|
],
|
|
629
|
+
"markdownDescription": "Containers the lanes depend on, started and waited on before setup, tasks and services, plus the commands that create and remove each lane's data in them. Processes reach a container through its host port, `${{ infra.<container>.port }}`.",
|
|
598
630
|
"properties": {
|
|
599
631
|
"compose": {
|
|
600
632
|
"anyOf": [
|
|
601
633
|
{
|
|
602
|
-
"$ref": "#/$defs/ComposeFiles"
|
|
634
|
+
"$ref": "#/$defs/ComposeFiles",
|
|
635
|
+
"description": "",
|
|
636
|
+
"examples": [],
|
|
637
|
+
"markdownDescription": ""
|
|
603
638
|
},
|
|
604
639
|
{
|
|
605
640
|
"type": "null"
|
|
606
641
|
}
|
|
607
642
|
],
|
|
608
|
-
"description": "Compose file or
|
|
643
|
+
"description": "Compose file, or a list of files merged like repeated `-f`, relative to the project. Its services are shared by every lane unless listed in `per_lane`; the shared project runs from the primary worktree with that worktree's `.env` as `--env-file`.",
|
|
609
644
|
"examples": [
|
|
610
645
|
"docker-compose.yml",
|
|
611
646
|
[
|
|
612
647
|
"docker-compose.yml",
|
|
613
648
|
"docker-compose.dev.yml"
|
|
614
649
|
]
|
|
615
|
-
]
|
|
650
|
+
],
|
|
651
|
+
"markdownDescription": "Compose file, or a list of files merged like repeated `-f`, relative to the project. Its services are shared by every lane unless listed in `per_lane`; the shared project runs from the primary worktree with that worktree's `.env` as `--env-file`."
|
|
616
652
|
},
|
|
617
653
|
"containers": {
|
|
618
654
|
"additionalProperties": {
|
|
619
655
|
"$ref": "#/$defs/ContainerConfig",
|
|
620
|
-
"description": "
|
|
656
|
+
"description": "Docker container run without a Compose file, shared by every lane or one per lane. Processes reach it through `${{ infra.<name>.ports.<port> }}`.",
|
|
621
657
|
"examples": [
|
|
622
658
|
{
|
|
623
659
|
"image": "ghcr.io/cerbos/cerbos:0.40.0",
|
|
@@ -627,10 +663,11 @@
|
|
|
627
663
|
"http": 3592
|
|
628
664
|
}
|
|
629
665
|
}
|
|
630
|
-
]
|
|
666
|
+
],
|
|
667
|
+
"markdownDescription": "Docker container run without a Compose file, shared by every lane or one per lane. Processes reach it through `${{ infra.<name>.ports.<port> }}`."
|
|
631
668
|
},
|
|
632
669
|
"default": {},
|
|
633
|
-
"description": "
|
|
670
|
+
"description": "Docker containers run without a Compose file, keyed by name and reached as `infra.<name>` in expressions.",
|
|
634
671
|
"examples": [
|
|
635
672
|
{
|
|
636
673
|
"cerbos": {
|
|
@@ -642,58 +679,65 @@
|
|
|
642
679
|
}
|
|
643
680
|
}
|
|
644
681
|
],
|
|
682
|
+
"markdownDescription": "Docker containers run without a Compose file, keyed by name and reached as `infra.<name>` in expressions.",
|
|
645
683
|
"type": "object"
|
|
646
684
|
},
|
|
647
685
|
"env": {
|
|
648
686
|
"additionalProperties": {
|
|
649
687
|
"$ref": "#/$defs/Templated_Scalar",
|
|
650
|
-
"description": "
|
|
688
|
+
"description": "Variables for `${VAR}` interpolation in the Compose files only; processes do not see them (use `global_env` for those).",
|
|
651
689
|
"examples": [
|
|
652
|
-
|
|
653
|
-
]
|
|
690
|
+
15432
|
|
691
|
+
],
|
|
692
|
+
"markdownDescription": "Variables for `${VAR}` interpolation in the Compose files only; processes do not see them (use `global_env` for those)."
|
|
654
693
|
},
|
|
655
694
|
"default": {},
|
|
656
|
-
"description": "Variables for
|
|
695
|
+
"description": "Variables for `${VAR}` interpolation in the Compose files only; processes do not see them (use `global_env` for those).",
|
|
657
696
|
"examples": [
|
|
658
697
|
{
|
|
659
698
|
"ACME_DB_PORT": 15432
|
|
660
699
|
}
|
|
661
700
|
],
|
|
701
|
+
"markdownDescription": "Variables for `${VAR}` interpolation in the Compose files only; processes do not see them (use `global_env` for those).",
|
|
662
702
|
"type": "object"
|
|
663
703
|
},
|
|
664
704
|
"exclude": {
|
|
665
|
-
"description": "Compose services never
|
|
705
|
+
"description": "Compose services devlanes never starts, such as a local reverse proxy the devlanes proxy replaces.",
|
|
666
706
|
"examples": [
|
|
667
707
|
[
|
|
668
708
|
"caddy"
|
|
669
709
|
]
|
|
670
710
|
],
|
|
671
711
|
"items": {
|
|
672
|
-
"description": "Compose services never
|
|
712
|
+
"description": "Compose services devlanes never starts, such as a local reverse proxy the devlanes proxy replaces.",
|
|
673
713
|
"examples": [
|
|
674
714
|
"caddy"
|
|
675
715
|
],
|
|
716
|
+
"markdownDescription": "Compose services devlanes never starts, such as a local reverse proxy the devlanes proxy replaces.",
|
|
676
717
|
"type": "string"
|
|
677
718
|
},
|
|
719
|
+
"markdownDescription": "Compose services devlanes never starts, such as a local reverse proxy the devlanes proxy replaces.",
|
|
678
720
|
"type": [
|
|
679
721
|
"array",
|
|
680
722
|
"null"
|
|
681
723
|
]
|
|
682
724
|
},
|
|
683
725
|
"hidden": {
|
|
684
|
-
"description": "Containers whose ports
|
|
726
|
+
"description": "Containers whose ports are not mirrored to machines connected with `devlanes remote connect`.",
|
|
685
727
|
"examples": [
|
|
686
728
|
[
|
|
687
729
|
"postgres"
|
|
688
730
|
]
|
|
689
731
|
],
|
|
690
732
|
"items": {
|
|
691
|
-
"description": "Containers whose ports
|
|
733
|
+
"description": "Containers whose ports are not mirrored to machines connected with `devlanes remote connect`.",
|
|
692
734
|
"examples": [
|
|
693
735
|
"postgres"
|
|
694
736
|
],
|
|
737
|
+
"markdownDescription": "Containers whose ports are not mirrored to machines connected with `devlanes remote connect`.",
|
|
695
738
|
"type": "string"
|
|
696
739
|
},
|
|
740
|
+
"markdownDescription": "Containers whose ports are not mirrored to machines connected with `devlanes remote connect`.",
|
|
697
741
|
"type": [
|
|
698
742
|
"array",
|
|
699
743
|
"null"
|
|
@@ -701,69 +745,67 @@
|
|
|
701
745
|
},
|
|
702
746
|
"hosts": {
|
|
703
747
|
"additionalProperties": {
|
|
704
|
-
"
|
|
748
|
+
"$ref": "#/$defs/Hosts",
|
|
749
|
+
"description": "HTTPS hostnames the devlanes proxy routes to this unit, so a browser reaches it at `https://<host>`: one hostname or route mapping, or a list of them.",
|
|
705
750
|
"examples": [
|
|
751
|
+
"api.${{ lane.domain }}",
|
|
706
752
|
[
|
|
707
|
-
"s3.${{ lane.domain }}"
|
|
708
|
-
]
|
|
709
|
-
],
|
|
710
|
-
"items": {
|
|
711
|
-
"$ref": "#/$defs/HostConfig",
|
|
712
|
-
"description": "Hostname routed by the HTTP proxy, optionally with route settings.",
|
|
713
|
-
"examples": [
|
|
714
753
|
"api.${{ lane.domain }}",
|
|
715
754
|
{
|
|
716
|
-
"
|
|
717
|
-
"
|
|
755
|
+
"host": "inspect.${{ lane.domain }}",
|
|
756
|
+
"port": "inspector"
|
|
718
757
|
}
|
|
719
758
|
]
|
|
720
|
-
|
|
721
|
-
"
|
|
759
|
+
],
|
|
760
|
+
"markdownDescription": "HTTPS hostnames the devlanes proxy routes to this unit, so a browser reaches it at `https://<host>`: one hostname or route mapping, or a list of them."
|
|
722
761
|
},
|
|
723
762
|
"default": {},
|
|
724
|
-
"description": "
|
|
763
|
+
"description": "HTTPS hostnames for containers, keyed by Compose service or plain container name, so a browser can open a container's web port: a MinIO console or presigned S3 URLs, Mailpit, a mock OIDC provider. A hostname routes to the container's first published port unless its route sets `port`; each key takes one hostname or route, or a list.",
|
|
725
764
|
"examples": [
|
|
726
765
|
{
|
|
727
|
-
"s3mock":
|
|
728
|
-
"s3.${{ lane.domain }}"
|
|
729
|
-
]
|
|
766
|
+
"s3mock": "s3.${{ lane.domain }}"
|
|
730
767
|
}
|
|
731
768
|
],
|
|
769
|
+
"markdownDescription": "HTTPS hostnames for containers, keyed by Compose service or plain container name, so a browser can open a container's web port: a MinIO console or presigned S3 URLs, Mailpit, a mock OIDC provider. A hostname routes to the container's first published port unless its route sets `port`; each key takes one hostname or route, or a list.",
|
|
732
770
|
"type": "object"
|
|
733
771
|
},
|
|
734
772
|
"per_lane": {
|
|
735
|
-
"description": "Compose services
|
|
773
|
+
"description": "Compose services run once per lane instead of shared, each in its own Compose project with ports from the lane's block and its own named volumes, removed by `devlanes lane clean`. Needs Compose 2.24.4 or newer.",
|
|
736
774
|
"examples": [
|
|
737
775
|
[
|
|
738
776
|
"mailpit"
|
|
739
777
|
]
|
|
740
778
|
],
|
|
741
779
|
"items": {
|
|
742
|
-
"description": "Compose services
|
|
780
|
+
"description": "Compose services run once per lane instead of shared, each in its own Compose project with ports from the lane's block and its own named volumes, removed by `devlanes lane clean`. Needs Compose 2.24.4 or newer.",
|
|
743
781
|
"examples": [
|
|
744
782
|
"mailpit"
|
|
745
783
|
],
|
|
784
|
+
"markdownDescription": "Compose services run once per lane instead of shared, each in its own Compose project with ports from the lane's block and its own named volumes, removed by `devlanes lane clean`. Needs Compose 2.24.4 or newer.",
|
|
746
785
|
"type": "string"
|
|
747
786
|
},
|
|
787
|
+
"markdownDescription": "Compose services run once per lane instead of shared, each in its own Compose project with ports from the lane's block and its own named volumes, removed by `devlanes lane clean`. Needs Compose 2.24.4 or newer.",
|
|
748
788
|
"type": [
|
|
749
789
|
"array",
|
|
750
790
|
"null"
|
|
751
791
|
]
|
|
752
792
|
},
|
|
753
793
|
"profiles": {
|
|
754
|
-
"description": "Compose profiles
|
|
794
|
+
"description": "Compose profiles to enable when resolving and starting the Compose services.",
|
|
755
795
|
"examples": [
|
|
756
796
|
[
|
|
757
797
|
"development"
|
|
758
798
|
]
|
|
759
799
|
],
|
|
760
800
|
"items": {
|
|
761
|
-
"description": "Compose profiles
|
|
801
|
+
"description": "Compose profiles to enable when resolving and starting the Compose services.",
|
|
762
802
|
"examples": [
|
|
763
803
|
"development"
|
|
764
804
|
],
|
|
805
|
+
"markdownDescription": "Compose profiles to enable when resolving and starting the Compose services.",
|
|
765
806
|
"type": "string"
|
|
766
807
|
},
|
|
808
|
+
"markdownDescription": "Compose profiles to enable when resolving and starting the Compose services.",
|
|
767
809
|
"type": [
|
|
768
810
|
"array",
|
|
769
811
|
"null"
|
|
@@ -772,21 +814,25 @@
|
|
|
772
814
|
"project_name": {
|
|
773
815
|
"anyOf": [
|
|
774
816
|
{
|
|
775
|
-
"$ref": "#/$defs/Templated_string"
|
|
817
|
+
"$ref": "#/$defs/Templated_string",
|
|
818
|
+
"description": "",
|
|
819
|
+
"examples": [],
|
|
820
|
+
"markdownDescription": ""
|
|
776
821
|
},
|
|
777
822
|
{
|
|
778
823
|
"type": "null"
|
|
779
824
|
}
|
|
780
825
|
],
|
|
781
|
-
"description": "
|
|
826
|
+
"description": "Name of the shared Compose project, fixed so `docker compose -p <name>` reaches the same containers outside devlanes. Defaults to the name Compose picks itself.",
|
|
782
827
|
"examples": [
|
|
783
828
|
"acme"
|
|
784
|
-
]
|
|
829
|
+
],
|
|
830
|
+
"markdownDescription": "Name of the shared Compose project, fixed so `docker compose -p <name>` reaches the same containers outside devlanes. Defaults to the name Compose picks itself."
|
|
785
831
|
},
|
|
786
832
|
"setup": {
|
|
787
833
|
"additionalProperties": {
|
|
788
834
|
"$ref": "#/$defs/InfraCommand",
|
|
789
|
-
"description": "
|
|
835
|
+
"description": "Command that prepares (`setup`) or removes (`teardown`) a lane's data: a command string or list, or a mapping with `run` and options such as `container`, `ignore_errors` and `timeout`. Task `steps` can run it as `infra.setup.<name>` or `infra.teardown.<name>`.",
|
|
790
836
|
"examples": [
|
|
791
837
|
"docker compose exec -T postgres createdb acme_${{ lane.name }}",
|
|
792
838
|
{
|
|
@@ -798,21 +844,23 @@
|
|
|
798
844
|
"s3://${{ lane.bucket }}"
|
|
799
845
|
]
|
|
800
846
|
}
|
|
801
|
-
]
|
|
847
|
+
],
|
|
848
|
+
"markdownDescription": "Command that prepares (`setup`) or removes (`teardown`) a lane's data: a command string or list, or a mapping with `run` and options such as `container`, `ignore_errors` and `timeout`. Task `steps` can run it as `infra.setup.<name>` or `infra.teardown.<name>`."
|
|
802
849
|
},
|
|
803
850
|
"default": {},
|
|
804
|
-
"description": "Named commands run once per lane after containers
|
|
851
|
+
"description": "Named commands that prepare each lane's data, such as creating its database in a shared Postgres. They run once per lane after the containers are ready, all at the same time, and are recorded as done so later starts skip them; a failure stops the start unless the entry sets `ignore_errors`.",
|
|
805
852
|
"examples": [
|
|
806
853
|
{
|
|
807
854
|
"database": "docker compose exec -T postgres createdb acme_${{ lane.name }}"
|
|
808
855
|
}
|
|
809
856
|
],
|
|
857
|
+
"markdownDescription": "Named commands that prepare each lane's data, such as creating its database in a shared Postgres. They run once per lane after the containers are ready, all at the same time, and are recorded as done so later starts skip them; a failure stops the start unless the entry sets `ignore_errors`.",
|
|
810
858
|
"type": "object"
|
|
811
859
|
},
|
|
812
860
|
"teardown": {
|
|
813
861
|
"additionalProperties": {
|
|
814
862
|
"$ref": "#/$defs/InfraCommand",
|
|
815
|
-
"description": "
|
|
863
|
+
"description": "Command that prepares (`setup`) or removes (`teardown`) a lane's data: a command string or list, or a mapping with `run` and options such as `container`, `ignore_errors` and `timeout`. Task `steps` can run it as `infra.setup.<name>` or `infra.teardown.<name>`.",
|
|
816
864
|
"examples": [
|
|
817
865
|
"docker compose exec -T postgres createdb acme_${{ lane.name }}",
|
|
818
866
|
{
|
|
@@ -824,15 +872,17 @@
|
|
|
824
872
|
"s3://${{ lane.bucket }}"
|
|
825
873
|
]
|
|
826
874
|
}
|
|
827
|
-
]
|
|
875
|
+
],
|
|
876
|
+
"markdownDescription": "Command that prepares (`setup`) or removes (`teardown`) a lane's data: a command string or list, or a mapping with `run` and options such as `container`, `ignore_errors` and `timeout`. Task `steps` can run it as `infra.setup.<name>` or `infra.teardown.<name>`."
|
|
828
877
|
},
|
|
829
878
|
"default": {},
|
|
830
|
-
"description": "Named
|
|
879
|
+
"description": "Named commands that remove a lane's data when the lane is cleaned (`devlanes lane clean`), one after another; never on stop. A failure is reported and the cleanup goes on.",
|
|
831
880
|
"examples": [
|
|
832
881
|
{
|
|
833
882
|
"database": "docker compose exec -T postgres dropdb --if-exists acme_${{ lane.name }}"
|
|
834
883
|
}
|
|
835
884
|
],
|
|
885
|
+
"markdownDescription": "Named commands that remove a lane's data when the lane is cleaned (`devlanes lane clean`), one after another; never on stop. A failure is reported and the cleanup goes on.",
|
|
836
886
|
"type": "object"
|
|
837
887
|
}
|
|
838
888
|
},
|
|
@@ -840,7 +890,7 @@
|
|
|
840
890
|
},
|
|
841
891
|
"InjectedPresetOptions0": {
|
|
842
892
|
"additionalProperties": false,
|
|
843
|
-
"description": "Options
|
|
893
|
+
"description": "Options for `preset: vite`, which adds `--port <self.port> --strictPort --host 127.0.0.1` to the dev server command. `--strictPort` makes Vite exit when the port is taken instead of moving to another port the proxy does not know about.",
|
|
844
894
|
"examples": [
|
|
845
895
|
{
|
|
846
896
|
"args": [
|
|
@@ -848,21 +898,24 @@
|
|
|
848
898
|
]
|
|
849
899
|
}
|
|
850
900
|
],
|
|
901
|
+
"markdownDescription": "Options for `preset: vite`, which adds `--port <self.port> --strictPort --host 127.0.0.1` to the dev server command. `--strictPort` makes Vite exit when the port is taken instead of moving to another port the proxy does not know about.",
|
|
851
902
|
"properties": {
|
|
852
903
|
"args": {
|
|
853
|
-
"description": "Extra arguments
|
|
904
|
+
"description": "Extra arguments for the Vite command, added after the preset's port and host flags, for example `[--mode, staging]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
854
905
|
"examples": [
|
|
855
906
|
[
|
|
856
907
|
"--open"
|
|
857
908
|
]
|
|
858
909
|
],
|
|
859
910
|
"items": {
|
|
860
|
-
"description": "Extra arguments
|
|
911
|
+
"description": "Extra arguments for the Vite command, added after the preset's port and host flags, for example `[--mode, staging]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
861
912
|
"examples": [
|
|
862
913
|
"--open"
|
|
863
914
|
],
|
|
915
|
+
"markdownDescription": "Extra arguments for the Vite command, added after the preset's port and host flags, for example `[--mode, staging]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
864
916
|
"type": "string"
|
|
865
917
|
},
|
|
918
|
+
"markdownDescription": "Extra arguments for the Vite command, added after the preset's port and host flags, for example `[--mode, staging]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
866
919
|
"type": [
|
|
867
920
|
"array",
|
|
868
921
|
"null"
|
|
@@ -873,29 +926,32 @@
|
|
|
873
926
|
},
|
|
874
927
|
"InjectedPresetOptions1": {
|
|
875
928
|
"additionalProperties": false,
|
|
876
|
-
"description": "Options
|
|
929
|
+
"description": "Options for `preset: next`, which adds `--port <self.port> --hostname 127.0.0.1` to the `next dev` command. Without the hostname flag Next listens on `0.0.0.0` instead of loopback.",
|
|
877
930
|
"examples": [
|
|
878
931
|
{
|
|
879
932
|
"args": [
|
|
880
|
-
"--
|
|
933
|
+
"--turbopack"
|
|
881
934
|
]
|
|
882
935
|
}
|
|
883
936
|
],
|
|
937
|
+
"markdownDescription": "Options for `preset: next`, which adds `--port <self.port> --hostname 127.0.0.1` to the `next dev` command. Without the hostname flag Next listens on `0.0.0.0` instead of loopback.",
|
|
884
938
|
"properties": {
|
|
885
939
|
"args": {
|
|
886
|
-
"description": "Extra arguments
|
|
940
|
+
"description": "Extra arguments for `next dev`, added after the preset's port and hostname flags, for example `[--turbopack]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
887
941
|
"examples": [
|
|
888
942
|
[
|
|
889
|
-
"--
|
|
943
|
+
"--turbopack"
|
|
890
944
|
]
|
|
891
945
|
],
|
|
892
946
|
"items": {
|
|
893
|
-
"description": "Extra arguments
|
|
947
|
+
"description": "Extra arguments for `next dev`, added after the preset's port and hostname flags, for example `[--turbopack]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
894
948
|
"examples": [
|
|
895
|
-
"--
|
|
949
|
+
"--turbopack"
|
|
896
950
|
],
|
|
951
|
+
"markdownDescription": "Extra arguments for `next dev`, added after the preset's port and hostname flags, for example `[--turbopack]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
897
952
|
"type": "string"
|
|
898
953
|
},
|
|
954
|
+
"markdownDescription": "Extra arguments for `next dev`, added after the preset's port and hostname flags, for example `[--turbopack]`. A local override or `extends` child that sets `args` replaces the inherited list. Default: none.",
|
|
899
955
|
"type": [
|
|
900
956
|
"array",
|
|
901
957
|
"null"
|
|
@@ -906,7 +962,7 @@
|
|
|
906
962
|
},
|
|
907
963
|
"InjectedPresetOptions2": {
|
|
908
964
|
"additionalProperties": false,
|
|
909
|
-
"description": "Options
|
|
965
|
+
"description": "Options for `preset: wrangler`, which gives each lane's `wrangler dev` its own `--port <self.port>`, `--inspector-port <self.ports.inspector>` and dev registry. The `inspector` port is allocated automatically. `args` that pass either port flag are refused by `devlanes config check`, and a `run_script` script that does is refused at start.",
|
|
910
966
|
"examples": [
|
|
911
967
|
{
|
|
912
968
|
"args": [
|
|
@@ -919,9 +975,10 @@
|
|
|
919
975
|
}
|
|
920
976
|
}
|
|
921
977
|
],
|
|
978
|
+
"markdownDescription": "Options for `preset: wrangler`, which gives each lane's `wrangler dev` its own `--port <self.port>`, `--inspector-port <self.ports.inspector>` and dev registry. The `inspector` port is allocated automatically. `args` that pass either port flag are refused by `devlanes config check`, and a `run_script` script that does is refused at start.",
|
|
922
979
|
"properties": {
|
|
923
980
|
"args": {
|
|
924
|
-
"description": "Extra arguments
|
|
981
|
+
"description": "Extra arguments for `wrangler dev`, added after the port and `--var` flags, for example `[--env-file, .dev.vars]`. `--port` and `--inspector-port` (or `--inspectorPort`) are refused here, since the preset already sets them per lane. A local override or `extends` child that sets `args` replaces the inherited list.",
|
|
925
982
|
"examples": [
|
|
926
983
|
[
|
|
927
984
|
"--env-file",
|
|
@@ -929,24 +986,27 @@
|
|
|
929
986
|
]
|
|
930
987
|
],
|
|
931
988
|
"items": {
|
|
932
|
-
"description": "Extra arguments
|
|
989
|
+
"description": "Extra arguments for `wrangler dev`, added after the port and `--var` flags, for example `[--env-file, .dev.vars]`. `--port` and `--inspector-port` (or `--inspectorPort`) are refused here, since the preset already sets them per lane. A local override or `extends` child that sets `args` replaces the inherited list.",
|
|
933
990
|
"examples": [
|
|
934
991
|
"--env-file",
|
|
935
992
|
".dev.vars"
|
|
936
993
|
],
|
|
994
|
+
"markdownDescription": "Extra arguments for `wrangler dev`, added after the port and `--var` flags, for example `[--env-file, .dev.vars]`. `--port` and `--inspector-port` (or `--inspectorPort`) are refused here, since the preset already sets them per lane. A local override or `extends` child that sets `args` replaces the inherited list.",
|
|
937
995
|
"type": "string"
|
|
938
996
|
},
|
|
997
|
+
"markdownDescription": "Extra arguments for `wrangler dev`, added after the port and `--var` flags, for example `[--env-file, .dev.vars]`. `--port` and `--inspector-port` (or `--inspectorPort`) are refused here, since the preset already sets them per lane. A local override or `extends` child that sets `args` replaces the inherited list.",
|
|
939
998
|
"type": [
|
|
940
999
|
"array",
|
|
941
1000
|
"null"
|
|
942
1001
|
]
|
|
943
1002
|
},
|
|
944
1003
|
"isolate_registry": {
|
|
945
|
-
"description": "
|
|
1004
|
+
"description": "Points `WRANGLER_REGISTRY_PATH` at `wrangler-registry` in the lane's data folder (`${{ lane.data_path }}`), so service bindings resolve to workers of the same lane instead of same-named workers in another lane, also when two lanes run from one folder. Set `false` to drop the variable for this service, which then uses Wrangler's shared default registry. Default: `true`.",
|
|
946
1005
|
"examples": [
|
|
947
1006
|
true,
|
|
948
1007
|
false
|
|
949
1008
|
],
|
|
1009
|
+
"markdownDescription": "Points `WRANGLER_REGISTRY_PATH` at `wrangler-registry` in the lane's data folder (`${{ lane.data_path }}`), so service bindings resolve to workers of the same lane instead of same-named workers in another lane, also when two lanes run from one folder. Set `false` to drop the variable for this service, which then uses Wrangler's shared default registry. Default: `true`.",
|
|
950
1010
|
"type": [
|
|
951
1011
|
"boolean",
|
|
952
1012
|
"null"
|
|
@@ -954,22 +1014,24 @@
|
|
|
954
1014
|
},
|
|
955
1015
|
"vars": {
|
|
956
1016
|
"additionalProperties": {
|
|
957
|
-
"description": "Worker variables, passed as `--var KEY:VALUE`.
|
|
1017
|
+
"description": "Worker variables for this lane, each passed as `--var KEY:VALUE` so it overrides the same name in the Wrangler config's `vars`. Values can be strings, numbers or booleans (sent as text) and may use expressions such as `${{ self.public_url }}`; names must be non-empty and cannot contain `:`. Local overrides and `extends` children merge with inherited vars per name.",
|
|
958
1018
|
"examples": [
|
|
959
1019
|
"${{ self.public_url }}"
|
|
960
1020
|
],
|
|
1021
|
+
"markdownDescription": "Worker variables for this lane, each passed as `--var KEY:VALUE` so it overrides the same name in the Wrangler config's `vars`. Values can be strings, numbers or booleans (sent as text) and may use expressions such as `${{ self.public_url }}`; names must be non-empty and cannot contain `:`. Local overrides and `extends` children merge with inherited vars per name.",
|
|
961
1022
|
"type": [
|
|
962
1023
|
"string",
|
|
963
1024
|
"number",
|
|
964
1025
|
"boolean"
|
|
965
1026
|
]
|
|
966
1027
|
},
|
|
967
|
-
"description": "Worker variables, passed as `--var KEY:VALUE`.
|
|
1028
|
+
"description": "Worker variables for this lane, each passed as `--var KEY:VALUE` so it overrides the same name in the Wrangler config's `vars`. Values can be strings, numbers or booleans (sent as text) and may use expressions such as `${{ self.public_url }}`; names must be non-empty and cannot contain `:`. Local overrides and `extends` children merge with inherited vars per name.",
|
|
968
1029
|
"examples": [
|
|
969
1030
|
{
|
|
970
1031
|
"PUBLIC_BASE_URL": "${{ self.public_url }}"
|
|
971
1032
|
}
|
|
972
1033
|
],
|
|
1034
|
+
"markdownDescription": "Worker variables for this lane, each passed as `--var KEY:VALUE` so it overrides the same name in the Wrangler config's `vars`. Values can be strings, numbers or booleans (sent as text) and may use expressions such as `${{ self.public_url }}`; names must be non-empty and cannot contain `:`. Local overrides and `extends` children merge with inherited vars per name.",
|
|
973
1035
|
"type": "object"
|
|
974
1036
|
}
|
|
975
1037
|
},
|
|
@@ -977,51 +1039,56 @@
|
|
|
977
1039
|
},
|
|
978
1040
|
"InjectedPresetOptions3": {
|
|
979
1041
|
"additionalProperties": false,
|
|
980
|
-
"description": "Options
|
|
1042
|
+
"description": "Options for `preset: tauri`, which lets several Tauri v2 dev apps run side by side, one per lane and replica. The values go into a config overlay at `${{ lane.data_path }}/tauri/<service>.<replica>.conf.json`, passed with `--config` and in `DEVLANES_TAURI_CONFIG`, which Tauri merges over `tauri.conf.json`.",
|
|
981
1043
|
"examples": [
|
|
982
1044
|
{
|
|
983
1045
|
"before_dev_command": "",
|
|
984
|
-
"dev_url": "${{
|
|
1046
|
+
"dev_url": "${{ services.desktop_web.url }}",
|
|
985
1047
|
"identifier": "io.acme.app.lane${{ lane.index }}.client${{ replica.index }}"
|
|
986
1048
|
}
|
|
987
1049
|
],
|
|
1050
|
+
"markdownDescription": "Options for `preset: tauri`, which lets several Tauri v2 dev apps run side by side, one per lane and replica. The values go into a config overlay at `${{ lane.data_path }}/tauri/<service>.<replica>.conf.json`, passed with `--config` and in `DEVLANES_TAURI_CONFIG`, which Tauri merges over `tauri.conf.json`.",
|
|
988
1051
|
"properties": {
|
|
989
1052
|
"before_dev_command": {
|
|
990
|
-
"description": "`build.beforeDevCommand
|
|
1053
|
+
"description": "Replaces `build.beforeDevCommand`, the command Tauri runs before the app. Set it to `\"\"` when the frontend runs as its own devlanes service; otherwise every replica starts its own frontend on the port from `tauri.conf.json`. Default: the command in `tauri.conf.json`.",
|
|
991
1054
|
"examples": [
|
|
992
1055
|
"",
|
|
993
1056
|
"pnpm dev"
|
|
994
1057
|
],
|
|
1058
|
+
"markdownDescription": "Replaces `build.beforeDevCommand`, the command Tauri runs before the app. Set it to `\"\"` when the frontend runs as its own devlanes service; otherwise every replica starts its own frontend on the port from `tauri.conf.json`. Default: the command in `tauri.conf.json`.",
|
|
995
1059
|
"type": [
|
|
996
1060
|
"string",
|
|
997
1061
|
"null"
|
|
998
1062
|
]
|
|
999
1063
|
},
|
|
1000
1064
|
"dev_url": {
|
|
1001
|
-
"description": "`build.devUrl
|
|
1065
|
+
"description": "Frontend address the app loads, written to `build.devUrl`. Usually another service's `url`, such as `${{ services.desktop_web.url }}`, so each lane's app loads that lane's frontend. Must start with `http://` or `https://`; when unset, `tauri.conf.json` decides.",
|
|
1002
1066
|
"examples": [
|
|
1003
|
-
"${{
|
|
1067
|
+
"${{ services.desktop_web.url }}"
|
|
1004
1068
|
],
|
|
1069
|
+
"markdownDescription": "Frontend address the app loads, written to `build.devUrl`. Usually another service's `url`, such as `${{ services.desktop_web.url }}`, so each lane's app loads that lane's frontend. Must start with `http://` or `https://`; when unset, `tauri.conf.json` decides.",
|
|
1005
1070
|
"type": [
|
|
1006
1071
|
"string",
|
|
1007
1072
|
"null"
|
|
1008
1073
|
]
|
|
1009
1074
|
},
|
|
1010
1075
|
"identifier": {
|
|
1011
|
-
"description": "Bundle identifier for this lane and replica. Required
|
|
1076
|
+
"description": "Bundle identifier for this lane and replica, which keys the app data, webview data and keychain entries. Required and must differ per lane and replica, for example `com.acme.app.dev.lane${{ lane.index }}.client${{ replica.index }}`; two instances with the same value are refused at start. Only letters, digits, `-` and `.` are allowed, with no empty part between dots.",
|
|
1012
1077
|
"examples": [
|
|
1013
1078
|
"io.acme.app.lane${{ lane.index }}.client${{ replica.index }}"
|
|
1014
1079
|
],
|
|
1080
|
+
"markdownDescription": "Bundle identifier for this lane and replica, which keys the app data, webview data and keychain entries. Required and must differ per lane and replica, for example `com.acme.app.dev.lane${{ lane.index }}.client${{ replica.index }}`; two instances with the same value are refused at start. Only letters, digits, `-` and `.` are allowed, with no empty part between dots.",
|
|
1015
1081
|
"type": [
|
|
1016
1082
|
"string",
|
|
1017
1083
|
"null"
|
|
1018
1084
|
]
|
|
1019
1085
|
},
|
|
1020
1086
|
"product_name": {
|
|
1021
|
-
"description": "`productName`
|
|
1087
|
+
"description": "Replaces the app's `productName` from `tauri.conf.json` for this instance, for example to tell lanes apart. Default: the value in `tauri.conf.json`.",
|
|
1022
1088
|
"examples": [
|
|
1023
1089
|
"Acme Dev"
|
|
1024
1090
|
],
|
|
1091
|
+
"markdownDescription": "Replaces the app's `productName` from `tauri.conf.json` for this instance, for example to tell lanes apart. Default: the value in `tauri.conf.json`.",
|
|
1025
1092
|
"type": [
|
|
1026
1093
|
"string",
|
|
1027
1094
|
"null"
|
|
@@ -1032,7 +1099,7 @@
|
|
|
1032
1099
|
},
|
|
1033
1100
|
"LanesConfig": {
|
|
1034
1101
|
"additionalProperties": false,
|
|
1035
|
-
"description": "
|
|
1102
|
+
"description": "Each Git worktree of the project is a lane with its own ports, hostnames and data. These settings decide which worktrees get a lane, where new ones are created, how many ports each lane reserves, and the values each lane computes.",
|
|
1036
1103
|
"examples": [
|
|
1037
1104
|
{
|
|
1038
1105
|
"hosts_file": "always",
|
|
@@ -1042,39 +1109,48 @@
|
|
|
1042
1109
|
}
|
|
1043
1110
|
}
|
|
1044
1111
|
],
|
|
1112
|
+
"markdownDescription": "Each Git worktree of the project is a lane with its own ports, hostnames and data. These settings decide which worktrees get a lane, where new ones are created, how many ports each lane reserves, and the values each lane computes.",
|
|
1045
1113
|
"properties": {
|
|
1046
1114
|
"block_size": {
|
|
1047
1115
|
"anyOf": [
|
|
1048
1116
|
{
|
|
1049
|
-
"$ref": "#/$defs/Templated_uint16"
|
|
1117
|
+
"$ref": "#/$defs/Templated_uint16",
|
|
1118
|
+
"description": "",
|
|
1119
|
+
"examples": [],
|
|
1120
|
+
"markdownDescription": ""
|
|
1050
1121
|
},
|
|
1051
1122
|
{
|
|
1052
1123
|
"type": "null"
|
|
1053
1124
|
}
|
|
1054
1125
|
],
|
|
1055
|
-
"description": "
|
|
1126
|
+
"description": "Number of ports reserved for each lane. By default devlanes counts the ports the config needs and adds half again, rounded up to ten. A fixed size smaller than what the config needs is an error.",
|
|
1056
1127
|
"examples": [
|
|
1057
1128
|
80
|
|
1058
|
-
]
|
|
1129
|
+
],
|
|
1130
|
+
"markdownDescription": "Number of ports reserved for each lane. By default devlanes counts the ports the config needs and adds half again, rounded up to ten. A fixed size smaller than what the config needs is an error."
|
|
1059
1131
|
},
|
|
1060
1132
|
"hosts_file": {
|
|
1061
1133
|
"anyOf": [
|
|
1062
1134
|
{
|
|
1063
|
-
"$ref": "#/$defs/HostsFile"
|
|
1135
|
+
"$ref": "#/$defs/HostsFile",
|
|
1136
|
+
"description": "",
|
|
1137
|
+
"examples": [],
|
|
1138
|
+
"markdownDescription": ""
|
|
1064
1139
|
},
|
|
1065
1140
|
{
|
|
1066
1141
|
"type": "null"
|
|
1067
1142
|
}
|
|
1068
1143
|
],
|
|
1069
|
-
"description": "
|
|
1144
|
+
"description": "Whether this project's hostnames are also written to `/etc/hosts`, for programs that cannot resolve `*.localhost` by themselves (Wrangler's workerd, musl or pure-Go binaries). Overrides the user's `hostnames.hosts_file` (default `auto`), except that a user `never` always wins. Writing needs the helper installed by `devlanes certs trust --hosts`, and only exact names are written, never wildcards.",
|
|
1070
1145
|
"examples": [
|
|
1071
1146
|
"auto",
|
|
1072
1147
|
"never",
|
|
1073
1148
|
"always"
|
|
1074
|
-
]
|
|
1149
|
+
],
|
|
1150
|
+
"markdownDescription": "Whether this project's hostnames are also written to `/etc/hosts`, for programs that cannot resolve `*.localhost` by themselves (Wrangler's workerd, musl or pure-Go binaries). Overrides the user's `hostnames.hosts_file` (default `auto`), except that a user `never` always wins. Writing needs the helper installed by `devlanes certs trust --hosts`, and only exact names are written, never wildcards."
|
|
1075
1151
|
},
|
|
1076
1152
|
"matrix": {
|
|
1077
|
-
"description": "
|
|
1153
|
+
"description": "Fixed values per lane instead of computed `vars`: entry N holds lane N's values, read as `lane.<name>`. A lane whose index has no entry fails to resolve. Cannot be combined with `vars`.",
|
|
1078
1154
|
"examples": [
|
|
1079
1155
|
[
|
|
1080
1156
|
{
|
|
@@ -1090,12 +1166,13 @@
|
|
|
1090
1166
|
"items": {
|
|
1091
1167
|
"additionalProperties": {
|
|
1092
1168
|
"$ref": "#/$defs/Templated_Scalar",
|
|
1093
|
-
"description": "A
|
|
1169
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
1094
1170
|
"examples": [
|
|
1095
1171
|
"${{ lane.index }}"
|
|
1096
|
-
]
|
|
1172
|
+
],
|
|
1173
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
1097
1174
|
},
|
|
1098
|
-
"description": "
|
|
1175
|
+
"description": "Fixed values per lane instead of computed `vars`: entry N holds lane N's values, read as `lane.<name>`. A lane whose index has no entry fails to resolve. Cannot be combined with `vars`.",
|
|
1099
1176
|
"examples": [
|
|
1100
1177
|
{
|
|
1101
1178
|
"domain": "acme.localhost",
|
|
@@ -1106,8 +1183,10 @@
|
|
|
1106
1183
|
"port": 20100
|
|
1107
1184
|
}
|
|
1108
1185
|
],
|
|
1186
|
+
"markdownDescription": "Fixed values per lane instead of computed `vars`: entry N holds lane N's values, read as `lane.<name>`. A lane whose index has no entry fails to resolve. Cannot be combined with `vars`.",
|
|
1109
1187
|
"type": "object"
|
|
1110
1188
|
},
|
|
1189
|
+
"markdownDescription": "Fixed values per lane instead of computed `vars`: entry N holds lane N's values, read as `lane.<name>`. A lane whose index has no entry fails to resolve. Cannot be combined with `vars`.",
|
|
1111
1190
|
"type": [
|
|
1112
1191
|
"array",
|
|
1113
1192
|
"null"
|
|
@@ -1116,38 +1195,47 @@
|
|
|
1116
1195
|
"max": {
|
|
1117
1196
|
"anyOf": [
|
|
1118
1197
|
{
|
|
1119
|
-
"$ref": "#/$defs/Templated_uint32"
|
|
1198
|
+
"$ref": "#/$defs/Templated_uint32",
|
|
1199
|
+
"description": "",
|
|
1200
|
+
"examples": [],
|
|
1201
|
+
"markdownDescription": ""
|
|
1120
1202
|
},
|
|
1121
1203
|
{
|
|
1122
1204
|
"type": "null"
|
|
1123
1205
|
}
|
|
1124
1206
|
],
|
|
1125
|
-
"description": "
|
|
1207
|
+
"description": "Most lanes the project may hold at once; further worktrees stay unassigned, without ports. Lowering it keeps existing lanes. Unset, the number of lanes is limited only by free port blocks.",
|
|
1126
1208
|
"examples": [
|
|
1127
1209
|
6
|
|
1128
|
-
]
|
|
1210
|
+
],
|
|
1211
|
+
"markdownDescription": "Most lanes the project may hold at once; further worktrees stay unassigned, without ports. Lowering it keeps existing lanes. Unset, the number of lanes is limited only by free port blocks."
|
|
1129
1212
|
},
|
|
1130
1213
|
"new_worktrees": {
|
|
1131
1214
|
"anyOf": [
|
|
1132
1215
|
{
|
|
1133
|
-
"$ref": "#/$defs/NewWorktrees"
|
|
1216
|
+
"$ref": "#/$defs/NewWorktrees",
|
|
1217
|
+
"description": "",
|
|
1218
|
+
"examples": [],
|
|
1219
|
+
"markdownDescription": ""
|
|
1134
1220
|
},
|
|
1135
1221
|
{
|
|
1136
1222
|
"type": "null"
|
|
1137
1223
|
}
|
|
1138
1224
|
],
|
|
1139
|
-
"description": "What
|
|
1225
|
+
"description": "What devlanes does when a worktree gets its lane: only reserve it, also set it up, or also start it. Defaults to `register`. A worktree gets a lane the first time devlanes runs in it or `devlanes lane new` creates it, not merely because it exists.",
|
|
1140
1226
|
"examples": [
|
|
1141
1227
|
"register",
|
|
1142
1228
|
"setup",
|
|
1143
1229
|
"start"
|
|
1144
|
-
]
|
|
1230
|
+
],
|
|
1231
|
+
"markdownDescription": "What devlanes does when a worktree gets its lane: only reserve it, also set it up, or also start it. Defaults to `register`. A worktree gets a lane the first time devlanes runs in it or `devlanes lane new` creates it, not merely because it exists."
|
|
1145
1232
|
},
|
|
1146
1233
|
"primary": {
|
|
1147
|
-
"description": "Branch
|
|
1234
|
+
"description": "Branch whose worktree is lane 0, the main lane (`lanes.main` in expressions) and the only worktree that gets a lane by itself. Defaults to the remote's default branch, else `main` or `master`.",
|
|
1148
1235
|
"examples": [
|
|
1149
1236
|
"main"
|
|
1150
1237
|
],
|
|
1238
|
+
"markdownDescription": "Branch whose worktree is lane 0, the main lane (`lanes.main` in expressions) and the only worktree that gets a lane by itself. Defaults to the remote's default branch, else `main` or `master`.",
|
|
1151
1239
|
"type": [
|
|
1152
1240
|
"string",
|
|
1153
1241
|
"null"
|
|
@@ -1156,120 +1244,109 @@
|
|
|
1156
1244
|
"removed_worktrees": {
|
|
1157
1245
|
"anyOf": [
|
|
1158
1246
|
{
|
|
1159
|
-
"$ref": "#/$defs/RemovedWorktrees"
|
|
1247
|
+
"$ref": "#/$defs/RemovedWorktrees",
|
|
1248
|
+
"description": "",
|
|
1249
|
+
"examples": [],
|
|
1250
|
+
"markdownDescription": ""
|
|
1160
1251
|
},
|
|
1161
1252
|
{
|
|
1162
1253
|
"type": "null"
|
|
1163
1254
|
}
|
|
1164
1255
|
],
|
|
1165
|
-
"description": "What happens to a running lane whose worktree folder
|
|
1256
|
+
"description": "What happens to a running lane whose worktree folder is deleted. Defaults to `stop`. A lane whose folder is gone and that runs nothing is cleaned; its logs stay until log retention removes them.",
|
|
1166
1257
|
"examples": [
|
|
1167
1258
|
"stop",
|
|
1168
1259
|
"clean"
|
|
1169
|
-
]
|
|
1260
|
+
],
|
|
1261
|
+
"markdownDescription": "What happens to a running lane whose worktree folder is deleted. Defaults to `stop`. A lane whose folder is gone and that runs nothing is cleaned; its logs stay until log retention removes them."
|
|
1170
1262
|
},
|
|
1171
1263
|
"vars": {
|
|
1172
1264
|
"additionalProperties": {
|
|
1173
1265
|
"$ref": "#/$defs/Templated_Scalar",
|
|
1174
|
-
"description": "
|
|
1266
|
+
"description": "Values computed for each lane and read as `${{ lane.<name> }}`, such as a database name, vhost, bucket or Redis index per lane. A var named `domain` replaces the default lane domain, and one named `port` fixes where the lane's port block starts. Cannot be combined with `matrix`.",
|
|
1175
1267
|
"examples": [
|
|
1176
|
-
"${{ lane.
|
|
1177
|
-
]
|
|
1268
|
+
"acme_${{ lane.name }}"
|
|
1269
|
+
],
|
|
1270
|
+
"markdownDescription": "Values computed for each lane and read as `${{ lane.<name> }}`, such as a database name, vhost, bucket or Redis index per lane. A var named `domain` replaces the default lane domain, and one named `port` fixes where the lane's port block starts. Cannot be combined with `matrix`."
|
|
1178
1271
|
},
|
|
1179
1272
|
"default": {},
|
|
1180
|
-
"description": "
|
|
1273
|
+
"description": "Values computed for each lane and read as `${{ lane.<name> }}`, such as a database name, vhost, bucket or Redis index per lane. A var named `domain` replaces the default lane domain, and one named `port` fixes where the lane's port block starts. Cannot be combined with `matrix`.",
|
|
1181
1274
|
"examples": [
|
|
1182
1275
|
{
|
|
1183
1276
|
"db_name": "acme_${{ lane.name }}"
|
|
1184
1277
|
}
|
|
1185
1278
|
],
|
|
1279
|
+
"markdownDescription": "Values computed for each lane and read as `${{ lane.<name> }}`, such as a database name, vhost, bucket or Redis index per lane. A var named `domain` replaces the default lane domain, and one named `port` fixes where the lane's port block starts. Cannot be combined with `matrix`.",
|
|
1186
1280
|
"type": "object"
|
|
1187
1281
|
},
|
|
1188
1282
|
"worktree_dir": {
|
|
1189
1283
|
"anyOf": [
|
|
1190
1284
|
{
|
|
1191
|
-
"$ref": "#/$defs/Templated_string"
|
|
1285
|
+
"$ref": "#/$defs/Templated_string",
|
|
1286
|
+
"description": "",
|
|
1287
|
+
"examples": [],
|
|
1288
|
+
"markdownDescription": ""
|
|
1192
1289
|
},
|
|
1193
1290
|
{
|
|
1194
1291
|
"type": "null"
|
|
1195
1292
|
}
|
|
1196
1293
|
],
|
|
1197
|
-
"description": "Directory
|
|
1294
|
+
"description": "Directory where `devlanes lane new` creates worktrees, relative to the project directory of the primary worktree. Defaults to `../<project>-lanes`. Expressions can only use `project.*` here.",
|
|
1198
1295
|
"examples": [
|
|
1199
1296
|
"../${{ project.name }}-lanes"
|
|
1200
|
-
]
|
|
1297
|
+
],
|
|
1298
|
+
"markdownDescription": "Directory where `devlanes lane new` creates worktrees, relative to the project directory of the primary worktree. Defaults to `../<project>-lanes`. Expressions can only use `project.*` here."
|
|
1201
1299
|
}
|
|
1202
1300
|
},
|
|
1203
1301
|
"type": "object"
|
|
1204
1302
|
},
|
|
1205
1303
|
"NewWorktrees": {
|
|
1206
|
-
"description": "
|
|
1304
|
+
"description": "What devlanes does when a worktree gets its lane.",
|
|
1305
|
+
"enum": [
|
|
1306
|
+
"register",
|
|
1307
|
+
"setup",
|
|
1308
|
+
"start"
|
|
1309
|
+
],
|
|
1310
|
+
"enumDescriptions": [
|
|
1311
|
+
"Only reserve the lane (its index, port block and domain); nothing runs until the lane is started.",
|
|
1312
|
+
"Also run infrastructure setup and `lane.create` tasks, leaving services stopped.",
|
|
1313
|
+
"Also start the lane with the default profile."
|
|
1314
|
+
],
|
|
1207
1315
|
"examples": [
|
|
1208
1316
|
"register",
|
|
1209
1317
|
"setup",
|
|
1210
1318
|
"start"
|
|
1211
1319
|
],
|
|
1212
|
-
"
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
"type": "string"
|
|
1220
|
-
},
|
|
1221
|
-
{
|
|
1222
|
-
"const": "setup",
|
|
1223
|
-
"description": "Also run infrastructure setup and lane.create tasks, leaving services stopped.",
|
|
1224
|
-
"examples": [
|
|
1225
|
-
"setup"
|
|
1226
|
-
],
|
|
1227
|
-
"type": "string"
|
|
1228
|
-
},
|
|
1229
|
-
{
|
|
1230
|
-
"const": "start",
|
|
1231
|
-
"description": "Also start the lane with the default profile.",
|
|
1232
|
-
"examples": [
|
|
1233
|
-
"start"
|
|
1234
|
-
],
|
|
1235
|
-
"type": "string"
|
|
1236
|
-
}
|
|
1237
|
-
]
|
|
1320
|
+
"markdownDescription": "What devlanes does when a worktree gets its lane.",
|
|
1321
|
+
"markdownEnumDescriptions": [
|
|
1322
|
+
"Only reserve the lane (its index, port block and domain); nothing runs until the lane is started.",
|
|
1323
|
+
"Also run infrastructure setup and `lane.create` tasks, leaving services stopped.",
|
|
1324
|
+
"Also start the lane with the default profile."
|
|
1325
|
+
],
|
|
1326
|
+
"type": "string"
|
|
1238
1327
|
},
|
|
1239
1328
|
"ProfileConfig": {
|
|
1240
1329
|
"anyOf": [
|
|
1241
1330
|
{
|
|
1242
|
-
"description": "Service names, globs, or +tag selectors.",
|
|
1243
|
-
"examples": [
|
|
1244
|
-
[
|
|
1245
|
-
"+api",
|
|
1246
|
-
"+web"
|
|
1247
|
-
]
|
|
1248
|
-
],
|
|
1249
1331
|
"items": {
|
|
1250
|
-
"description": "Service names, globs
|
|
1332
|
+
"description": "Service names, globs and `+tag` selectors; short for `{ include: [...] }`.",
|
|
1251
1333
|
"examples": [
|
|
1252
1334
|
"+api",
|
|
1253
1335
|
"+web"
|
|
1254
1336
|
],
|
|
1337
|
+
"markdownDescription": "Service names, globs and `+tag` selectors; short for `{ include: [...] }`.",
|
|
1255
1338
|
"type": "string"
|
|
1256
1339
|
},
|
|
1257
1340
|
"type": "array"
|
|
1258
1341
|
},
|
|
1259
1342
|
{
|
|
1260
1343
|
"$ref": "#/$defs/ProfileOptions",
|
|
1261
|
-
"description": "
|
|
1262
|
-
"examples": [
|
|
1263
|
-
|
|
1264
|
-
"include": [
|
|
1265
|
-
"+web"
|
|
1266
|
-
],
|
|
1267
|
-
"infra": false
|
|
1268
|
-
}
|
|
1269
|
-
]
|
|
1344
|
+
"description": "",
|
|
1345
|
+
"examples": [],
|
|
1346
|
+
"markdownDescription": ""
|
|
1270
1347
|
}
|
|
1271
1348
|
],
|
|
1272
|
-
"description": "
|
|
1349
|
+
"description": "Services started by `devlanes start --profile <name>` (`default` when no profile is given): a list of names, globs and `+tag` selectors, or a mapping that can also exclude services, skip infra, add `env` and remap script names. Several `--profile` flags start the union.",
|
|
1273
1350
|
"examples": [
|
|
1274
1351
|
[
|
|
1275
1352
|
"+api",
|
|
@@ -1281,11 +1358,12 @@
|
|
|
1281
1358
|
],
|
|
1282
1359
|
"infra": false
|
|
1283
1360
|
}
|
|
1284
|
-
]
|
|
1361
|
+
],
|
|
1362
|
+
"markdownDescription": "Services started by `devlanes start --profile <name>` (`default` when no profile is given): a list of names, globs and `+tag` selectors, or a mapping that can also exclude services, skip infra, add `env` and remap script names. Several `--profile` flags start the union."
|
|
1285
1363
|
},
|
|
1286
1364
|
"ProfileOptions": {
|
|
1287
1365
|
"additionalProperties": false,
|
|
1288
|
-
"description": "
|
|
1366
|
+
"description": "Profile written as a mapping: which services it starts and what it changes for them.",
|
|
1289
1367
|
"examples": [
|
|
1290
1368
|
{
|
|
1291
1369
|
"env": {
|
|
@@ -1300,26 +1378,29 @@
|
|
|
1300
1378
|
}
|
|
1301
1379
|
}
|
|
1302
1380
|
],
|
|
1381
|
+
"markdownDescription": "Profile written as a mapping: which services it starts and what it changes for them.",
|
|
1303
1382
|
"properties": {
|
|
1304
1383
|
"env": {
|
|
1305
1384
|
"additionalProperties": {
|
|
1306
1385
|
"$ref": "#/$defs/Templated_Scalar",
|
|
1307
|
-
"description": "
|
|
1386
|
+
"description": "Variables for the services this profile starts, above their own `env`.",
|
|
1308
1387
|
"examples": [
|
|
1309
|
-
"
|
|
1310
|
-
]
|
|
1388
|
+
"production"
|
|
1389
|
+
],
|
|
1390
|
+
"markdownDescription": "Variables for the services this profile starts, above their own `env`."
|
|
1311
1391
|
},
|
|
1312
1392
|
"default": {},
|
|
1313
|
-
"description": "
|
|
1393
|
+
"description": "Variables for the services this profile starts, above their own `env`.",
|
|
1314
1394
|
"examples": [
|
|
1315
1395
|
{
|
|
1316
1396
|
"NODE_ENV": "production"
|
|
1317
1397
|
}
|
|
1318
1398
|
],
|
|
1399
|
+
"markdownDescription": "Variables for the services this profile starts, above their own `env`.",
|
|
1319
1400
|
"type": "object"
|
|
1320
1401
|
},
|
|
1321
1402
|
"exclude": {
|
|
1322
|
-
"description": "
|
|
1403
|
+
"description": "Services removed from the `include` selection, by name, glob or `+tag`.",
|
|
1323
1404
|
"examples": [
|
|
1324
1405
|
[
|
|
1325
1406
|
"+desktop",
|
|
@@ -1327,20 +1408,22 @@
|
|
|
1327
1408
|
]
|
|
1328
1409
|
],
|
|
1329
1410
|
"items": {
|
|
1330
|
-
"description": "
|
|
1411
|
+
"description": "Services removed from the `include` selection, by name, glob or `+tag`.",
|
|
1331
1412
|
"examples": [
|
|
1332
1413
|
"+desktop",
|
|
1333
1414
|
"sms-stub"
|
|
1334
1415
|
],
|
|
1416
|
+
"markdownDescription": "Services removed from the `include` selection, by name, glob or `+tag`.",
|
|
1335
1417
|
"type": "string"
|
|
1336
1418
|
},
|
|
1419
|
+
"markdownDescription": "Services removed from the `include` selection, by name, glob or `+tag`.",
|
|
1337
1420
|
"type": [
|
|
1338
1421
|
"array",
|
|
1339
1422
|
"null"
|
|
1340
1423
|
]
|
|
1341
1424
|
},
|
|
1342
1425
|
"include": {
|
|
1343
|
-
"description": "
|
|
1426
|
+
"description": "Services this profile starts: names, globs such as `crm-*`, and `+tag` selectors. Globs skip services with `autostart: false`; names and tags include them.",
|
|
1344
1427
|
"examples": [
|
|
1345
1428
|
[
|
|
1346
1429
|
"+api",
|
|
@@ -1351,14 +1434,16 @@
|
|
|
1351
1434
|
]
|
|
1352
1435
|
],
|
|
1353
1436
|
"items": {
|
|
1354
|
-
"description": "
|
|
1437
|
+
"description": "Services this profile starts: names, globs such as `crm-*`, and `+tag` selectors. Globs skip services with `autostart: false`; names and tags include them.",
|
|
1355
1438
|
"examples": [
|
|
1356
1439
|
"+api",
|
|
1357
1440
|
"+web",
|
|
1358
1441
|
"*"
|
|
1359
1442
|
],
|
|
1443
|
+
"markdownDescription": "Services this profile starts: names, globs such as `crm-*`, and `+tag` selectors. Globs skip services with `autostart: false`; names and tags include them.",
|
|
1360
1444
|
"type": "string"
|
|
1361
1445
|
},
|
|
1446
|
+
"markdownDescription": "Services this profile starts: names, globs such as `crm-*`, and `+tag` selectors. Globs skip services with `autostart: false`; names and tags include them.",
|
|
1362
1447
|
"type": [
|
|
1363
1448
|
"array",
|
|
1364
1449
|
"null"
|
|
@@ -1367,35 +1452,41 @@
|
|
|
1367
1452
|
"infra": {
|
|
1368
1453
|
"anyOf": [
|
|
1369
1454
|
{
|
|
1370
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
1455
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
1456
|
+
"description": "",
|
|
1457
|
+
"examples": [],
|
|
1458
|
+
"markdownDescription": ""
|
|
1371
1459
|
},
|
|
1372
1460
|
{
|
|
1373
1461
|
"type": "null"
|
|
1374
1462
|
}
|
|
1375
1463
|
],
|
|
1376
|
-
"description": "Set false to skip containers and infra
|
|
1464
|
+
"description": "Set false to skip containers and `infra.setup`, for example to run only a frontend against another lane's backend. Services that reference `infra.*` then fail to resolve. With several profiles active, infra is skipped only when all of them set false. Defaults to true.",
|
|
1377
1465
|
"examples": [
|
|
1378
1466
|
false,
|
|
1379
1467
|
true
|
|
1380
|
-
]
|
|
1468
|
+
],
|
|
1469
|
+
"markdownDescription": "Set false to skip containers and `infra.setup`, for example to run only a frontend against another lane's backend. Services that reference `infra.*` then fail to resolve. With several profiles active, infra is skipped only when all of them set false. Defaults to true."
|
|
1381
1470
|
},
|
|
1382
1471
|
"run_scripts": {
|
|
1383
1472
|
"additionalProperties": {
|
|
1384
|
-
"description": "
|
|
1473
|
+
"description": "Swap script names for services that use `run_script`: `{ dev: start }` runs the `start` script wherever a service's `run_script` names `dev`. The file stays the same, and each name is swapped once, not chained.",
|
|
1385
1474
|
"examples": [
|
|
1386
1475
|
"start"
|
|
1387
1476
|
],
|
|
1477
|
+
"markdownDescription": "Swap script names for services that use `run_script`: `{ dev: start }` runs the `start` script wherever a service's `run_script` names `dev`. The file stays the same, and each name is swapped once, not chained.",
|
|
1388
1478
|
"minLength": 1,
|
|
1389
1479
|
"pattern": "\\S",
|
|
1390
1480
|
"type": "string"
|
|
1391
1481
|
},
|
|
1392
1482
|
"default": {},
|
|
1393
|
-
"description": "
|
|
1483
|
+
"description": "Swap script names for services that use `run_script`: `{ dev: start }` runs the `start` script wherever a service's `run_script` names `dev`. The file stays the same, and each name is swapped once, not chained.",
|
|
1394
1484
|
"examples": [
|
|
1395
1485
|
{
|
|
1396
1486
|
"dev": "start"
|
|
1397
1487
|
}
|
|
1398
1488
|
],
|
|
1489
|
+
"markdownDescription": "Swap script names for services that use `run_script`: `{ dev: start }` runs the `start` script wherever a service's `run_script` names `dev`. The file stays the same, and each name is swapped once, not chained.",
|
|
1399
1490
|
"propertyNames": {
|
|
1400
1491
|
"minLength": 1,
|
|
1401
1492
|
"pattern": "\\S",
|
|
@@ -1408,7 +1499,7 @@
|
|
|
1408
1499
|
},
|
|
1409
1500
|
"ReadyCheck": {
|
|
1410
1501
|
"additionalProperties": false,
|
|
1411
|
-
"description": "
|
|
1502
|
+
"description": "Readiness probe: exactly one of `tcp`, `http`, `log` or `cmd`, retried until it passes or `timeout` runs out.",
|
|
1412
1503
|
"examples": [
|
|
1413
1504
|
{
|
|
1414
1505
|
"http": {
|
|
@@ -1425,82 +1516,103 @@
|
|
|
1425
1516
|
"cmd": "curl -fsS ${{ self.url }}/healthz"
|
|
1426
1517
|
}
|
|
1427
1518
|
],
|
|
1519
|
+
"markdownDescription": "Readiness probe: exactly one of `tcp`, `http`, `log` or `cmd`, retried until it passes or `timeout` runs out.",
|
|
1428
1520
|
"properties": {
|
|
1429
1521
|
"cmd": {
|
|
1430
1522
|
"anyOf": [
|
|
1431
1523
|
{
|
|
1432
|
-
"$ref": "#/$defs/Run"
|
|
1524
|
+
"$ref": "#/$defs/Run",
|
|
1525
|
+
"description": "",
|
|
1526
|
+
"examples": [],
|
|
1527
|
+
"markdownDescription": ""
|
|
1433
1528
|
},
|
|
1434
1529
|
{
|
|
1435
1530
|
"type": "null"
|
|
1436
1531
|
}
|
|
1437
1532
|
],
|
|
1438
|
-
"description": "
|
|
1533
|
+
"description": "Ready once this command exits 0. It runs on the host through `/bin/sh` (a list is quoted into one command line) with its output discarded, is retried until the timeout, and each attempt is cut off after 10 seconds. For a service it gets the service's environment and working directory.",
|
|
1439
1534
|
"examples": [
|
|
1440
1535
|
"curl -fsS ${{ self.url }}/healthz"
|
|
1441
|
-
]
|
|
1536
|
+
],
|
|
1537
|
+
"markdownDescription": "Ready once this command exits 0. It runs on the host through `/bin/sh` (a list is quoted into one command line) with its output discarded, is retried until the timeout, and each attempt is cut off after 10 seconds. For a service it gets the service's environment and working directory."
|
|
1442
1538
|
},
|
|
1443
1539
|
"http": {
|
|
1444
1540
|
"anyOf": [
|
|
1445
1541
|
{
|
|
1446
|
-
"$ref": "#/$defs/HttpReady"
|
|
1542
|
+
"$ref": "#/$defs/HttpReady",
|
|
1543
|
+
"description": "",
|
|
1544
|
+
"examples": [],
|
|
1545
|
+
"markdownDescription": ""
|
|
1447
1546
|
},
|
|
1448
1547
|
{
|
|
1449
1548
|
"type": "null"
|
|
1450
1549
|
}
|
|
1451
1550
|
],
|
|
1452
|
-
"description": "
|
|
1551
|
+
"description": "Ready once a GET request to `path` on the unit's main port answers with `status`, or with a 2xx status when `status` is unset. Redirects are not followed. Best when the app has a health route that fails while it is broken.",
|
|
1453
1552
|
"examples": [
|
|
1454
1553
|
{
|
|
1455
1554
|
"path": "/healthz",
|
|
1456
1555
|
"status": 200,
|
|
1457
1556
|
"timeout": "60s"
|
|
1458
1557
|
}
|
|
1459
|
-
]
|
|
1558
|
+
],
|
|
1559
|
+
"markdownDescription": "Ready once a GET request to `path` on the unit's main port answers with `status`, or with a 2xx status when `status` is unset. Redirects are not followed. Best when the app has a health route that fails while it is broken."
|
|
1460
1560
|
},
|
|
1461
1561
|
"log": {
|
|
1462
1562
|
"anyOf": [
|
|
1463
1563
|
{
|
|
1464
|
-
"$ref": "#/$defs/Templated_string"
|
|
1564
|
+
"$ref": "#/$defs/Templated_string",
|
|
1565
|
+
"description": "",
|
|
1566
|
+
"examples": [],
|
|
1567
|
+
"markdownDescription": ""
|
|
1465
1568
|
},
|
|
1466
1569
|
{
|
|
1467
1570
|
"type": "null"
|
|
1468
1571
|
}
|
|
1469
1572
|
],
|
|
1470
|
-
"description": "
|
|
1573
|
+
"description": "Ready once a line of output matches this regular expression, with colors and other terminal escape codes removed; recent lines printed before the check began count too. Suits workers without a port: have them print a line once connected.",
|
|
1471
1574
|
"examples": [
|
|
1472
1575
|
"Connected to Redis"
|
|
1473
|
-
]
|
|
1576
|
+
],
|
|
1577
|
+
"markdownDescription": "Ready once a line of output matches this regular expression, with colors and other terminal escape codes removed; recent lines printed before the check began count too. Suits workers without a port: have them print a line once connected."
|
|
1474
1578
|
},
|
|
1475
1579
|
"tcp": {
|
|
1476
1580
|
"anyOf": [
|
|
1477
1581
|
{
|
|
1478
|
-
"$ref": "#/$defs/TcpReady"
|
|
1582
|
+
"$ref": "#/$defs/TcpReady",
|
|
1583
|
+
"description": "",
|
|
1584
|
+
"examples": [],
|
|
1585
|
+
"markdownDescription": ""
|
|
1479
1586
|
},
|
|
1480
1587
|
{
|
|
1481
1588
|
"type": "null"
|
|
1482
1589
|
}
|
|
1483
1590
|
],
|
|
1484
|
-
"description": "
|
|
1591
|
+
"description": "Ready once a port accepts a TCP connection on 127.0.0.1 or ::1, tried every 150 ms. `true` uses the unit's main port; a port name such as `inspector` uses that named port. It only proves the socket is open, not that the app works.",
|
|
1485
1592
|
"examples": [
|
|
1486
1593
|
true,
|
|
1487
1594
|
"inspector"
|
|
1488
|
-
]
|
|
1595
|
+
],
|
|
1596
|
+
"markdownDescription": "Ready once a port accepts a TCP connection on 127.0.0.1 or ::1, tried every 150 ms. `true` uses the unit's main port; a port name such as `inspector` uses that named port. It only proves the socket is open, not that the app works."
|
|
1489
1597
|
},
|
|
1490
1598
|
"timeout": {
|
|
1491
1599
|
"anyOf": [
|
|
1492
1600
|
{
|
|
1493
|
-
"$ref": "#/$defs/Templated_ConfigDuration"
|
|
1601
|
+
"$ref": "#/$defs/Templated_ConfigDuration",
|
|
1602
|
+
"description": "",
|
|
1603
|
+
"examples": [],
|
|
1604
|
+
"markdownDescription": ""
|
|
1494
1605
|
},
|
|
1495
1606
|
{
|
|
1496
1607
|
"type": "null"
|
|
1497
1608
|
}
|
|
1498
1609
|
],
|
|
1499
|
-
"description": "
|
|
1610
|
+
"description": "How long the check may take to pass; defaults to 60s. When it runs out, a service is marked failed (its process keeps running and is not restarted) and `after: services` tasks are skipped; for an infra container the start fails. Raise it for services that compile before they listen.",
|
|
1500
1611
|
"examples": [
|
|
1501
1612
|
"15s",
|
|
1502
1613
|
"10m"
|
|
1503
|
-
]
|
|
1614
|
+
],
|
|
1615
|
+
"markdownDescription": "How long the check may take to pass; defaults to 60s. When it runs out, a service is marked failed (its process keeps running and is not restarted) and `after: services` tasks are skipped; for an infra container the start fails. Raise it for services that compile before they listen."
|
|
1504
1616
|
}
|
|
1505
1617
|
},
|
|
1506
1618
|
"type": "object"
|
|
@@ -1509,27 +1621,18 @@
|
|
|
1509
1621
|
"anyOf": [
|
|
1510
1622
|
{
|
|
1511
1623
|
"$ref": "#/$defs/Started",
|
|
1512
|
-
"description": "
|
|
1513
|
-
"examples": [
|
|
1514
|
-
|
|
1515
|
-
]
|
|
1624
|
+
"description": "",
|
|
1625
|
+
"examples": [],
|
|
1626
|
+
"markdownDescription": ""
|
|
1516
1627
|
},
|
|
1517
1628
|
{
|
|
1518
1629
|
"$ref": "#/$defs/ReadyCheck",
|
|
1519
|
-
"description": "
|
|
1520
|
-
"examples": [
|
|
1521
|
-
|
|
1522
|
-
"http": {
|
|
1523
|
-
"path": "/healthz"
|
|
1524
|
-
}
|
|
1525
|
-
},
|
|
1526
|
-
{
|
|
1527
|
-
"tcp": true
|
|
1528
|
-
}
|
|
1529
|
-
]
|
|
1630
|
+
"description": "",
|
|
1631
|
+
"examples": [],
|
|
1632
|
+
"markdownDescription": ""
|
|
1530
1633
|
}
|
|
1531
1634
|
],
|
|
1532
|
-
"description": "
|
|
1635
|
+
"description": "When a unit counts as ready. `devlanes start` waits for it, and `after: services` tasks run only once every started service is ready. Write `started`, or a mapping with one of `tcp`, `http`, `log` or `cmd` and an optional `timeout`.",
|
|
1533
1636
|
"examples": [
|
|
1534
1637
|
"started",
|
|
1535
1638
|
{
|
|
@@ -1540,61 +1643,52 @@
|
|
|
1540
1643
|
{
|
|
1541
1644
|
"tcp": true
|
|
1542
1645
|
}
|
|
1543
|
-
]
|
|
1646
|
+
],
|
|
1647
|
+
"markdownDescription": "When a unit counts as ready. `devlanes start` waits for it, and `after: services` tasks run only once every started service is ready. Write `started`, or a mapping with one of `tcp`, `http`, `log` or `cmd` and an optional `timeout`."
|
|
1544
1648
|
},
|
|
1545
1649
|
"RemovedWorktrees": {
|
|
1546
|
-
"description": "
|
|
1547
|
-
"
|
|
1650
|
+
"description": "What happens to a running lane whose worktree folder is deleted.",
|
|
1651
|
+
"enum": [
|
|
1548
1652
|
"stop",
|
|
1549
1653
|
"clean"
|
|
1550
1654
|
],
|
|
1551
|
-
"
|
|
1552
|
-
|
|
1553
|
-
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1561
|
-
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
],
|
|
1566
|
-
"type": "string"
|
|
1567
|
-
}
|
|
1568
|
-
]
|
|
1655
|
+
"enumDescriptions": [
|
|
1656
|
+
"Stop the lane's processes; once nothing runs, the lane is cleaned.",
|
|
1657
|
+
"Clean the lane right away: stop its processes, run `lane.clean` tasks and `infra.teardown`, and free its index and ports."
|
|
1658
|
+
],
|
|
1659
|
+
"examples": [
|
|
1660
|
+
"stop",
|
|
1661
|
+
"clean"
|
|
1662
|
+
],
|
|
1663
|
+
"markdownDescription": "What happens to a running lane whose worktree folder is deleted.",
|
|
1664
|
+
"markdownEnumDescriptions": [
|
|
1665
|
+
"Stop the lane's processes; once nothing runs, the lane is cleaned.",
|
|
1666
|
+
"Clean the lane right away: stop its processes, run `lane.clean` tasks and `infra.teardown`, and free its index and ports."
|
|
1667
|
+
],
|
|
1668
|
+
"type": "string"
|
|
1569
1669
|
},
|
|
1570
1670
|
"Run": {
|
|
1571
1671
|
"anyOf": [
|
|
1572
1672
|
{
|
|
1573
1673
|
"$ref": "#/$defs/Templated_string",
|
|
1574
|
-
"description": "
|
|
1575
|
-
"examples": [
|
|
1576
|
-
|
|
1577
|
-
]
|
|
1674
|
+
"description": "",
|
|
1675
|
+
"examples": [],
|
|
1676
|
+
"markdownDescription": ""
|
|
1578
1677
|
},
|
|
1579
1678
|
{
|
|
1580
|
-
"description": "Executable and arguments passed directly without shell expansion.",
|
|
1581
|
-
"examples": [
|
|
1582
|
-
[
|
|
1583
|
-
"node",
|
|
1584
|
-
"server.mjs"
|
|
1585
|
-
]
|
|
1586
|
-
],
|
|
1587
1679
|
"items": {
|
|
1588
1680
|
"$ref": "#/$defs/Templated_string",
|
|
1589
|
-
"description": "
|
|
1681
|
+
"description": "Program and arguments run directly, without shell expansion.",
|
|
1590
1682
|
"examples": [
|
|
1591
|
-
"
|
|
1592
|
-
|
|
1683
|
+
"node",
|
|
1684
|
+
"server.mjs"
|
|
1685
|
+
],
|
|
1686
|
+
"markdownDescription": "Program and arguments run directly, without shell expansion."
|
|
1593
1687
|
},
|
|
1594
1688
|
"type": "array"
|
|
1595
1689
|
}
|
|
1596
1690
|
],
|
|
1597
|
-
"description": "
|
|
1691
|
+
"description": "Command as shell text, run through `/bin/sh -c`, or as a list of program and arguments run without a shell.",
|
|
1598
1692
|
"examples": [
|
|
1599
1693
|
"pnpm dev",
|
|
1600
1694
|
[
|
|
@@ -1603,109 +1697,70 @@
|
|
|
1603
1697
|
"--port",
|
|
1604
1698
|
"${{ self.port }}"
|
|
1605
1699
|
]
|
|
1606
|
-
]
|
|
1700
|
+
],
|
|
1701
|
+
"markdownDescription": "Command as shell text, run through `/bin/sh -c`, or as a list of program and arguments run without a shell."
|
|
1607
1702
|
},
|
|
1608
1703
|
"RunScript": {
|
|
1609
|
-
"
|
|
1704
|
+
"additionalProperties": false,
|
|
1705
|
+
"description": "Script from a project file, as a mapping with `file` and `name`. devlanes picks the tool from the file name: package.json (the project's package manager), Makefile or `*.mk`, justfile or `*.just`, deno.json, pyproject.toml (uv or poetry) and Cargo.toml (a binary). In `devlanes.local.yaml` or a service that `extends` a template, either key can be left out to keep the inherited one.",
|
|
1706
|
+
"examples": [
|
|
1610
1707
|
{
|
|
1611
|
-
"
|
|
1708
|
+
"file": "apps/api/package.json",
|
|
1709
|
+
"name": "dev"
|
|
1710
|
+
},
|
|
1711
|
+
{
|
|
1712
|
+
"file": "justfile",
|
|
1713
|
+
"name": "fixtures"
|
|
1714
|
+
}
|
|
1715
|
+
],
|
|
1716
|
+
"markdownDescription": "Script from a project file, as a mapping with `file` and `name`. devlanes picks the tool from the file name: package.json (the project's package manager), Makefile or `*.mk`, justfile or `*.just`, deno.json, pyproject.toml (uv or poetry) and Cargo.toml (a binary). In `devlanes.local.yaml` or a service that `extends` a template, either key can be left out to keep the inherited one.",
|
|
1717
|
+
"properties": {
|
|
1718
|
+
"file": {
|
|
1719
|
+
"description": "File that defines the script, relative to the worktree, such as `apps/api/package.json`. The script runs in this file's directory. Required unless an override or `extends` child keeps the inherited file.",
|
|
1612
1720
|
"examples": [
|
|
1613
|
-
"apps/api/package.json
|
|
1721
|
+
"apps/api/package.json",
|
|
1722
|
+
"Makefile",
|
|
1723
|
+
"justfile"
|
|
1614
1724
|
],
|
|
1725
|
+
"markdownDescription": "File that defines the script, relative to the worktree, such as `apps/api/package.json`. The script runs in this file's directory. Required unless an override or `extends` child keeps the inherited file.",
|
|
1615
1726
|
"type": "string"
|
|
1616
1727
|
},
|
|
1617
|
-
{
|
|
1618
|
-
"
|
|
1619
|
-
"description": "Source file and script name written as separate fields.",
|
|
1728
|
+
"name": {
|
|
1729
|
+
"description": "Script, target, recipe, task or binary name in that file. Required unless an override or `extends` child keeps the inherited name.",
|
|
1620
1730
|
"examples": [
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
}
|
|
1627
|
-
],
|
|
1628
|
-
"description": "Script selected from a package manifest, Makefile, or justfile.",
|
|
1629
|
-
"examples": [
|
|
1630
|
-
"apps/api/package.json#dev",
|
|
1631
|
-
{
|
|
1632
|
-
"name": "fixtures",
|
|
1633
|
-
"source": "justfile"
|
|
1731
|
+
"dev",
|
|
1732
|
+
"fixtures"
|
|
1733
|
+
],
|
|
1734
|
+
"markdownDescription": "Script, target, recipe, task or binary name in that file. Required unless an override or `extends` child keeps the inherited name.",
|
|
1735
|
+
"type": "string"
|
|
1634
1736
|
}
|
|
1635
|
-
|
|
1737
|
+
},
|
|
1738
|
+
"type": "object"
|
|
1636
1739
|
},
|
|
1637
1740
|
"Scalar": {
|
|
1638
1741
|
"anyOf": [
|
|
1639
1742
|
{
|
|
1640
|
-
"description": "Text used verbatim in the environment or lane variables.",
|
|
1641
|
-
"examples": [
|
|
1642
|
-
"acme"
|
|
1643
|
-
],
|
|
1644
1743
|
"type": "string"
|
|
1645
1744
|
},
|
|
1646
1745
|
{
|
|
1647
|
-
"description": "Boolean value, rendered as true or false in process environments.",
|
|
1648
|
-
"examples": [
|
|
1649
|
-
true,
|
|
1650
|
-
false
|
|
1651
|
-
],
|
|
1652
1746
|
"type": "boolean"
|
|
1653
1747
|
},
|
|
1654
1748
|
{
|
|
1655
|
-
"description": "Whole number, such as a port or lane index.",
|
|
1656
|
-
"examples": [
|
|
1657
|
-
20000
|
|
1658
|
-
],
|
|
1659
1749
|
"format": "int64",
|
|
1660
1750
|
"type": "integer"
|
|
1661
1751
|
},
|
|
1662
1752
|
{
|
|
1663
|
-
"description": "Decimal number, rendered as text in process environments.",
|
|
1664
|
-
"examples": [
|
|
1665
|
-
1.5
|
|
1666
|
-
],
|
|
1667
1753
|
"format": "double",
|
|
1668
1754
|
"type": "number"
|
|
1669
1755
|
}
|
|
1670
1756
|
],
|
|
1671
|
-
"description": "A
|
|
1757
|
+
"description": "A text, number or boolean value. Process environments receive it as text, such as `true` or `20000`.",
|
|
1672
1758
|
"examples": [
|
|
1673
1759
|
"acme",
|
|
1674
1760
|
20000,
|
|
1675
1761
|
true
|
|
1676
|
-
]
|
|
1677
|
-
},
|
|
1678
|
-
"ScriptSource": {
|
|
1679
|
-
"additionalProperties": false,
|
|
1680
|
-
"description": "A source file and the script or target to run from it.",
|
|
1681
|
-
"examples": [
|
|
1682
|
-
{
|
|
1683
|
-
"name": "fixtures",
|
|
1684
|
-
"source": "justfile"
|
|
1685
|
-
}
|
|
1686
1762
|
],
|
|
1687
|
-
"
|
|
1688
|
-
"name": {
|
|
1689
|
-
"default": "",
|
|
1690
|
-
"description": "Script, target, or recipe name within the source file.\nRequired, unless an override or extends child keeps the inherited name.",
|
|
1691
|
-
"examples": [
|
|
1692
|
-
"dev",
|
|
1693
|
-
"fixtures"
|
|
1694
|
-
],
|
|
1695
|
-
"type": "string"
|
|
1696
|
-
},
|
|
1697
|
-
"source": {
|
|
1698
|
-
"default": "",
|
|
1699
|
-
"description": "Script source relative to the worktree, such as package.json, Makefile, or justfile.\nRequired, unless an override or extends child keeps the inherited source.",
|
|
1700
|
-
"examples": [
|
|
1701
|
-
"apps/api/package.json",
|
|
1702
|
-
"Makefile",
|
|
1703
|
-
"justfile"
|
|
1704
|
-
],
|
|
1705
|
-
"type": "string"
|
|
1706
|
-
}
|
|
1707
|
-
},
|
|
1708
|
-
"type": "object"
|
|
1763
|
+
"markdownDescription": "A text, number or boolean value. Process environments receive it as text, such as `true` or `20000`."
|
|
1709
1764
|
},
|
|
1710
1765
|
"ServiceConfig": {
|
|
1711
1766
|
"additionalProperties": false,
|
|
@@ -1723,7 +1778,8 @@
|
|
|
1723
1778
|
"description": "`vite` options require `preset: vite`.",
|
|
1724
1779
|
"examples": [
|
|
1725
1780
|
"vite"
|
|
1726
|
-
]
|
|
1781
|
+
],
|
|
1782
|
+
"markdownDescription": "`vite` options require `preset: vite`."
|
|
1727
1783
|
}
|
|
1728
1784
|
}
|
|
1729
1785
|
}
|
|
@@ -1741,7 +1797,8 @@
|
|
|
1741
1797
|
"description": "`next` options require `preset: next`.",
|
|
1742
1798
|
"examples": [
|
|
1743
1799
|
"next"
|
|
1744
|
-
]
|
|
1800
|
+
],
|
|
1801
|
+
"markdownDescription": "`next` options require `preset: next`."
|
|
1745
1802
|
}
|
|
1746
1803
|
}
|
|
1747
1804
|
}
|
|
@@ -1759,7 +1816,8 @@
|
|
|
1759
1816
|
"description": "`wrangler` options require `preset: wrangler`.",
|
|
1760
1817
|
"examples": [
|
|
1761
1818
|
"wrangler"
|
|
1762
|
-
]
|
|
1819
|
+
],
|
|
1820
|
+
"markdownDescription": "`wrangler` options require `preset: wrangler`."
|
|
1763
1821
|
}
|
|
1764
1822
|
}
|
|
1765
1823
|
}
|
|
@@ -1777,115 +1835,129 @@
|
|
|
1777
1835
|
"description": "`tauri` options require `preset: tauri`.",
|
|
1778
1836
|
"examples": [
|
|
1779
1837
|
"tauri"
|
|
1780
|
-
]
|
|
1838
|
+
],
|
|
1839
|
+
"markdownDescription": "`tauri` options require `preset: tauri`."
|
|
1781
1840
|
}
|
|
1782
1841
|
}
|
|
1783
1842
|
}
|
|
1784
1843
|
}
|
|
1785
1844
|
],
|
|
1786
|
-
"description": "
|
|
1845
|
+
"description": "A long-running process started with the lane, such as a dev server or a worker. Each service gets its own port from the lane's block (`PORT`, `${{ self.port }}`); devlanes stops it with the lane and never restarts it when it exits. A service needs `run` or `run_script`, directly or through `extends`.",
|
|
1787
1846
|
"examples": [
|
|
1788
1847
|
{
|
|
1789
|
-
"hosts":
|
|
1790
|
-
|
|
1791
|
-
|
|
1792
|
-
|
|
1848
|
+
"hosts": "api.${{ lane.domain }}",
|
|
1849
|
+
"run_script": {
|
|
1850
|
+
"file": "apps/api/package.json",
|
|
1851
|
+
"name": "dev"
|
|
1852
|
+
},
|
|
1793
1853
|
"tags": [
|
|
1794
1854
|
"api"
|
|
1795
1855
|
]
|
|
1796
1856
|
}
|
|
1797
1857
|
],
|
|
1858
|
+
"markdownDescription": "A long-running process started with the lane, such as a dev server or a worker. Each service gets its own port from the lane's block (`PORT`, `${{ self.port }}`); devlanes stops it with the lane and never restarts it when it exits. A service needs `run` or `run_script`, directly or through `extends`.",
|
|
1798
1859
|
"properties": {
|
|
1799
1860
|
"autostart": {
|
|
1800
1861
|
"anyOf": [
|
|
1801
1862
|
{
|
|
1802
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
1863
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
1864
|
+
"description": "",
|
|
1865
|
+
"examples": [],
|
|
1866
|
+
"markdownDescription": ""
|
|
1803
1867
|
},
|
|
1804
1868
|
{
|
|
1805
1869
|
"type": "null"
|
|
1806
1870
|
}
|
|
1807
1871
|
],
|
|
1808
|
-
"description": "
|
|
1872
|
+
"description": "Set false for an on-demand service: a plain `devlanes start` without a `default` profile skips it, and so do globs such as `*` in profiles. Naming it or its `+tag`, on the command line or in a profile, still starts it. An expression is evaluated for each lane and acts like the `true` or `false` it gives, such as `${{ lane.index == 0 }}` to autostart only in the main lane. With `replicas`, the service starts all its copies when any copy's expression gives true. Defaults to true.",
|
|
1809
1873
|
"examples": [
|
|
1810
1874
|
true,
|
|
1811
1875
|
false
|
|
1812
|
-
]
|
|
1876
|
+
],
|
|
1877
|
+
"markdownDescription": "Set false for an on-demand service: a plain `devlanes start` without a `default` profile skips it, and so do globs such as `*` in profiles. Naming it or its `+tag`, on the command line or in a profile, still starts it. An expression is evaluated for each lane and acts like the `true` or `false` it gives, such as `${{ lane.index == 0 }}` to autostart only in the main lane. With `replicas`, the service starts all its copies when any copy's expression gives true. Defaults to true."
|
|
1813
1878
|
},
|
|
1814
1879
|
"cwd": {
|
|
1815
1880
|
"anyOf": [
|
|
1816
1881
|
{
|
|
1817
|
-
"$ref": "#/$defs/Templated_string"
|
|
1882
|
+
"$ref": "#/$defs/Templated_string",
|
|
1883
|
+
"description": "",
|
|
1884
|
+
"examples": [],
|
|
1885
|
+
"markdownDescription": ""
|
|
1818
1886
|
},
|
|
1819
1887
|
{
|
|
1820
1888
|
"type": "null"
|
|
1821
1889
|
}
|
|
1822
1890
|
],
|
|
1823
|
-
"description": "
|
|
1891
|
+
"description": "Directory `run` starts in, relative to the lane's worktree; defaults to the worktree root. Platform detection also looks here. Cannot be combined with `run_script`, which runs in the script file's directory; `devlanes config check` refuses the pair, including a `cwd` inherited through `extends`.",
|
|
1824
1892
|
"examples": [
|
|
1825
1893
|
"apps/api"
|
|
1826
|
-
]
|
|
1894
|
+
],
|
|
1895
|
+
"markdownDescription": "Directory `run` starts in, relative to the lane's worktree; defaults to the worktree root. Platform detection also looks here. Cannot be combined with `run_script`, which runs in the script file's directory; `devlanes config check` refuses the pair, including a `cwd` inherited through `extends`."
|
|
1827
1896
|
},
|
|
1828
1897
|
"env": {
|
|
1829
1898
|
"additionalProperties": {
|
|
1830
1899
|
"$ref": "#/$defs/Templated_Scalar",
|
|
1831
|
-
"description": "
|
|
1900
|
+
"description": "Environment variables for this service's process. They override `global_env` and are overridden by the active profile's `env` and `--env`; values may be text, numbers, booleans or `${{ ... }}` expressions. Setting `PORT` replaces the port devlanes allocated; a literal number is the same in every lane, so lanes collide.",
|
|
1832
1901
|
"examples": [
|
|
1833
|
-
"${{
|
|
1834
|
-
]
|
|
1902
|
+
"${{ services.api.url }}"
|
|
1903
|
+
],
|
|
1904
|
+
"markdownDescription": "Environment variables for this service's process. They override `global_env` and are overridden by the active profile's `env` and `--env`; values may be text, numbers, booleans or `${{ ... }}` expressions. Setting `PORT` replaces the port devlanes allocated; a literal number is the same in every lane, so lanes collide."
|
|
1835
1905
|
},
|
|
1836
1906
|
"default": {},
|
|
1837
|
-
"description": "
|
|
1907
|
+
"description": "Environment variables for this service's process. They override `global_env` and are overridden by the active profile's `env` and `--env`; values may be text, numbers, booleans or `${{ ... }}` expressions. Setting `PORT` replaces the port devlanes allocated; a literal number is the same in every lane, so lanes collide.",
|
|
1838
1908
|
"examples": [
|
|
1839
1909
|
{
|
|
1840
|
-
"API_URL": "${{
|
|
1910
|
+
"API_URL": "${{ services.api.url }}"
|
|
1841
1911
|
}
|
|
1842
1912
|
],
|
|
1913
|
+
"markdownDescription": "Environment variables for this service's process. They override `global_env` and are overridden by the active profile's `env` and `--env`; values may be text, numbers, booleans or `${{ ... }}` expressions. Setting `PORT` replaces the port devlanes allocated; a literal number is the same in every lane, so lanes collide.",
|
|
1843
1914
|
"type": "object"
|
|
1844
1915
|
},
|
|
1845
1916
|
"extends": {
|
|
1846
|
-
"description": "Template
|
|
1917
|
+
"description": "Template under `templates` whose settings this service inherits; its own settings apply on top. Mappings (`env`, `ready`, `stop`, preset options, `run_script`) merge by key, lists (`tags`, `hosts`, `sync`) and single values replace. Setting `run` or `run_script` drops the inherited other one, and one `ready` probe (`tcp`, `http`, `log`, `cmd`) drops the inherited probe. Templates may extend other templates and are resolved after devlanes.local.yaml is merged.",
|
|
1847
1918
|
"examples": [
|
|
1848
1919
|
"fastify-api"
|
|
1849
1920
|
],
|
|
1921
|
+
"markdownDescription": "Template under `templates` whose settings this service inherits; its own settings apply on top. Mappings (`env`, `ready`, `stop`, preset options, `run_script`) merge by key, lists (`tags`, `hosts`, `sync`) and single values replace. Setting `run` or `run_script` drops the inherited other one, and one `ready` probe (`tcp`, `http`, `log`, `cmd`) drops the inherited probe. Templates may extend other templates and are resolved after devlanes.local.yaml is merged.",
|
|
1850
1922
|
"type": [
|
|
1851
1923
|
"string",
|
|
1852
1924
|
"null"
|
|
1853
1925
|
]
|
|
1854
1926
|
},
|
|
1855
|
-
"
|
|
1927
|
+
"hidden": {
|
|
1856
1928
|
"anyOf": [
|
|
1857
1929
|
{
|
|
1858
|
-
"$ref": "#/$defs/
|
|
1930
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
1931
|
+
"description": "",
|
|
1932
|
+
"examples": [],
|
|
1933
|
+
"markdownDescription": ""
|
|
1859
1934
|
},
|
|
1860
1935
|
{
|
|
1861
1936
|
"type": "null"
|
|
1862
1937
|
}
|
|
1863
1938
|
],
|
|
1864
|
-
"description": "
|
|
1939
|
+
"description": "Keep this service's ports and hosts off machines connected with `devlanes remote connect`: they are not mirrored there and cannot be reached from there. The service still runs and works on this machine. Defaults to false.",
|
|
1865
1940
|
"examples": [
|
|
1866
|
-
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
|
|
1941
|
+
false,
|
|
1942
|
+
true
|
|
1943
|
+
],
|
|
1944
|
+
"markdownDescription": "Keep this service's ports and hosts off machines connected with `devlanes remote connect`: they are not mirrored there and cannot be reached from there. The service still runs and works on this machine. Defaults to false."
|
|
1870
1945
|
},
|
|
1871
|
-
"
|
|
1946
|
+
"hosts": {
|
|
1872
1947
|
"anyOf": [
|
|
1873
1948
|
{
|
|
1874
|
-
"$ref": "#/$defs/
|
|
1949
|
+
"$ref": "#/$defs/Hosts",
|
|
1950
|
+
"description": "",
|
|
1951
|
+
"examples": [],
|
|
1952
|
+
"markdownDescription": ""
|
|
1875
1953
|
},
|
|
1876
1954
|
{
|
|
1877
1955
|
"type": "null"
|
|
1878
1956
|
}
|
|
1879
1957
|
],
|
|
1880
|
-
"description": "
|
|
1881
|
-
"examples": [
|
|
1882
|
-
false,
|
|
1883
|
-
true
|
|
1884
|
-
]
|
|
1885
|
-
},
|
|
1886
|
-
"hosts": {
|
|
1887
|
-
"description": "HTTP hosts, wildcard hosts, and routes to named ports.",
|
|
1958
|
+
"description": "Hostnames the devlanes HTTPS proxy routes to this service, so `https://<host>` reaches it. One entry or a list; an entry is a hostname or a mapping with `host` and optional `port` (a named port), `fallback` and `host_header`. A `*.` wildcard matches subdomains, and an exact host wins over it. The first non-wildcard host becomes `public_url`, non-wildcard hosts join the lane's `DEVLANES_ORIGINS`, and having hosts makes the default `ready` a TCP check. Keep them under `${{ lane.domain }}` so lanes do not collide.",
|
|
1888
1959
|
"examples": [
|
|
1960
|
+
"api.${{ lane.domain }}",
|
|
1889
1961
|
[
|
|
1890
1962
|
"api.${{ lane.domain }}"
|
|
1891
1963
|
],
|
|
@@ -1896,28 +1968,15 @@
|
|
|
1896
1968
|
}
|
|
1897
1969
|
]
|
|
1898
1970
|
],
|
|
1899
|
-
"
|
|
1900
|
-
"$ref": "#/$defs/HostConfig",
|
|
1901
|
-
"description": "Hostname routed by the HTTP proxy, optionally with route settings.",
|
|
1902
|
-
"examples": [
|
|
1903
|
-
"api.${{ lane.domain }}",
|
|
1904
|
-
{
|
|
1905
|
-
"fallback": true,
|
|
1906
|
-
"host": "*.${{ lane.domain }}"
|
|
1907
|
-
}
|
|
1908
|
-
]
|
|
1909
|
-
},
|
|
1910
|
-
"type": [
|
|
1911
|
-
"array",
|
|
1912
|
-
"null"
|
|
1913
|
-
]
|
|
1971
|
+
"markdownDescription": "Hostnames the devlanes HTTPS proxy routes to this service, so `https://<host>` reaches it. One entry or a list; an entry is a hostname or a mapping with `host` and optional `port` (a named port), `fallback` and `host_header`. A `*.` wildcard matches subdomains, and an exact host wins over it. The first non-wildcard host becomes `public_url`, non-wildcard hosts join the lane's `DEVLANES_ORIGINS`, and having hosts makes the default `ready` a TCP check. Keep them under `${{ lane.domain }}` so lanes do not collide."
|
|
1914
1972
|
},
|
|
1915
1973
|
"name": {
|
|
1916
|
-
"description": "
|
|
1974
|
+
"description": "Label shown in the TUI and human output instead of the service key; any text, spaces allowed, with ` #N` added per replica. Commands, profiles and `${{ services.<key> }}` keep using the key.",
|
|
1917
1975
|
"examples": [
|
|
1918
1976
|
"Admin API",
|
|
1919
1977
|
"Storefront (web)"
|
|
1920
1978
|
],
|
|
1979
|
+
"markdownDescription": "Label shown in the TUI and human output instead of the service key; any text, spaces allowed, with ` #N` added per replica. Commands, profiles and `${{ services.<key> }}` keep using the key.",
|
|
1921
1980
|
"type": [
|
|
1922
1981
|
"string",
|
|
1923
1982
|
"null"
|
|
@@ -1925,18 +1984,18 @@
|
|
|
1925
1984
|
},
|
|
1926
1985
|
"next": {
|
|
1927
1986
|
"$ref": "#/$defs/InjectedPresetOptions1",
|
|
1928
|
-
"description": "Options
|
|
1987
|
+
"description": "Options for `preset: next`, which adds `--port <self.port> --hostname 127.0.0.1` to the `next dev` command. Without the hostname flag Next listens on `0.0.0.0` instead of loopback.",
|
|
1929
1988
|
"examples": [
|
|
1930
1989
|
{
|
|
1931
1990
|
"args": [
|
|
1932
|
-
"--
|
|
1991
|
+
"--turbopack"
|
|
1933
1992
|
]
|
|
1934
1993
|
}
|
|
1935
1994
|
],
|
|
1936
|
-
"
|
|
1995
|
+
"markdownDescription": "Options for `preset: next`, which adds `--port <self.port> --hostname 127.0.0.1` to the `next dev` command. Without the hostname flag Next listens on `0.0.0.0` instead of loopback."
|
|
1937
1996
|
},
|
|
1938
1997
|
"platform": {
|
|
1939
|
-
"description": "
|
|
1998
|
+
"description": "Runtime of the service: `node`, `bun`, `deno`, `python` or `rust`. It decides which variables devlanes adds, such as the devlanes CA (`NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE`) and color settings. Detected from the `run_script` file or the working directory when omitted; set it only when detection is wrong.",
|
|
1940
1999
|
"examples": [
|
|
1941
2000
|
"node",
|
|
1942
2001
|
"bun",
|
|
@@ -1944,13 +2003,14 @@
|
|
|
1944
2003
|
"python",
|
|
1945
2004
|
"rust"
|
|
1946
2005
|
],
|
|
2006
|
+
"markdownDescription": "Runtime of the service: `node`, `bun`, `deno`, `python` or `rust`. It decides which variables devlanes adds, such as the devlanes CA (`NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE`) and color settings. Detected from the `run_script` file or the working directory when omitted; set it only when detection is wrong.",
|
|
1947
2007
|
"type": [
|
|
1948
2008
|
"string",
|
|
1949
2009
|
"null"
|
|
1950
2010
|
]
|
|
1951
2011
|
},
|
|
1952
2012
|
"preset": {
|
|
1953
|
-
"description": "
|
|
2013
|
+
"description": "Framework integration that adds the flags and variables a dev server needs to run in a lane, such as `--port <port> --strictPort --host 127.0.0.1` for `vite`, so you do not pass them yourself. Requires `run_script`; with a hand-written `run`, drop the preset and pass its flags yourself. Its options go under a sibling key with the preset's name, for example `vite: { args: [--open] }`.",
|
|
1954
2014
|
"enum": [
|
|
1955
2015
|
"vite",
|
|
1956
2016
|
"next",
|
|
@@ -1963,6 +2023,7 @@
|
|
|
1963
2023
|
"wrangler",
|
|
1964
2024
|
"tauri"
|
|
1965
2025
|
],
|
|
2026
|
+
"markdownDescription": "Framework integration that adds the flags and variables a dev server needs to run in a lane, such as `--port <port> --strictPort --host 127.0.0.1` for `vite`, so you do not pass them yourself. Requires `run_script`; with a hand-written `run`, drop the preset and pass its flags yourself. Its options go under a sibling key with the preset's name, for example `vite: { args: [--open] }`.",
|
|
1966
2027
|
"type": [
|
|
1967
2028
|
"string",
|
|
1968
2029
|
"null"
|
|
@@ -1971,28 +2032,35 @@
|
|
|
1971
2032
|
"pty": {
|
|
1972
2033
|
"anyOf": [
|
|
1973
2034
|
{
|
|
1974
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
2035
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
2036
|
+
"description": "",
|
|
2037
|
+
"examples": [],
|
|
2038
|
+
"markdownDescription": ""
|
|
1975
2039
|
},
|
|
1976
2040
|
{
|
|
1977
2041
|
"type": "null"
|
|
1978
2042
|
}
|
|
1979
2043
|
],
|
|
1980
|
-
"description": "
|
|
2044
|
+
"description": "Run the service in a pseudoterminal, so it sees a terminal as it would in your shell and you can type into it from the TUI. Set false to use pipes instead: stdin is empty and stdout and stderr are read separately. Defaults to true.",
|
|
1981
2045
|
"examples": [
|
|
1982
2046
|
true,
|
|
1983
2047
|
false
|
|
1984
|
-
]
|
|
2048
|
+
],
|
|
2049
|
+
"markdownDescription": "Run the service in a pseudoterminal, so it sees a terminal as it would in your shell and you can type into it from the TUI. Set false to use pipes instead: stdin is empty and stdout and stderr are read separately. Defaults to true."
|
|
1985
2050
|
},
|
|
1986
2051
|
"ready": {
|
|
1987
2052
|
"anyOf": [
|
|
1988
2053
|
{
|
|
1989
|
-
"$ref": "#/$defs/ReadyConfig"
|
|
2054
|
+
"$ref": "#/$defs/ReadyConfig",
|
|
2055
|
+
"description": "",
|
|
2056
|
+
"examples": [],
|
|
2057
|
+
"markdownDescription": ""
|
|
1990
2058
|
},
|
|
1991
2059
|
{
|
|
1992
2060
|
"type": "null"
|
|
1993
2061
|
}
|
|
1994
2062
|
],
|
|
1995
|
-
"description": "
|
|
2063
|
+
"description": "When the service counts as up: `devlanes start` waits for it, and `after: services` tasks run once every started service is ready. Write `started` (ready once the process runs) or a mapping with one of `tcp`, `http`, `log` or `cmd`, plus `timeout` (default 60s). Without it, a service with `hosts` waits for TCP on its port and one without hosts uses `started`. A check that times out marks the service failed, which also skips `after: services` tasks; the process keeps running and is not restarted.",
|
|
1996
2064
|
"examples": [
|
|
1997
2065
|
"started",
|
|
1998
2066
|
{
|
|
@@ -2003,33 +2071,37 @@
|
|
|
2003
2071
|
{
|
|
2004
2072
|
"tcp": true
|
|
2005
2073
|
}
|
|
2006
|
-
]
|
|
2074
|
+
],
|
|
2075
|
+
"markdownDescription": "When the service counts as up: `devlanes start` waits for it, and `after: services` tasks run once every started service is ready. Write `started` (ready once the process runs) or a mapping with one of `tcp`, `http`, `log` or `cmd`, plus `timeout` (default 60s). Without it, a service with `hosts` waits for TCP on its port and one without hosts uses `started`. A check that times out marks the service failed, which also skips `after: services` tasks; the process keeps running and is not restarted."
|
|
2007
2076
|
},
|
|
2008
2077
|
"replicas": {
|
|
2009
|
-
"
|
|
2010
|
-
{
|
|
2011
|
-
"$ref": "#/$defs/Templated_uint16"
|
|
2012
|
-
},
|
|
2013
|
-
{
|
|
2014
|
-
"type": "null"
|
|
2015
|
-
}
|
|
2016
|
-
],
|
|
2017
|
-
"description": "Number of instances; replica.index starts at one. Defaults to one.",
|
|
2078
|
+
"description": "Number of copies of this service to run, each with its own port, for example several queue workers. They run as `<name>.1` to `<name>.N`, `${{ replica.index }}` counts from 1, and `services.<name>` in expressions means the first copy; use `${{ replica.index }}` in `hosts` to give each copy its own hostname. A plain number of at least 1, the same in every lane, because each copy reserves ports in every lane's block; `${{ ... }}` expressions are not allowed. Defaults to 1.",
|
|
2018
2079
|
"examples": [
|
|
2019
2080
|
1,
|
|
2020
2081
|
2
|
|
2082
|
+
],
|
|
2083
|
+
"format": "uint16",
|
|
2084
|
+
"markdownDescription": "Number of copies of this service to run, each with its own port, for example several queue workers. They run as `<name>.1` to `<name>.N`, `${{ replica.index }}` counts from 1, and `services.<name>` in expressions means the first copy; use `${{ replica.index }}` in `hosts` to give each copy its own hostname. A plain number of at least 1, the same in every lane, because each copy reserves ports in every lane's block; `${{ ... }}` expressions are not allowed. Defaults to 1.",
|
|
2085
|
+
"maximum": 65535,
|
|
2086
|
+
"minimum": 0,
|
|
2087
|
+
"type": [
|
|
2088
|
+
"integer",
|
|
2089
|
+
"null"
|
|
2021
2090
|
]
|
|
2022
2091
|
},
|
|
2023
2092
|
"run": {
|
|
2024
2093
|
"anyOf": [
|
|
2025
2094
|
{
|
|
2026
|
-
"$ref": "#/$defs/Run"
|
|
2095
|
+
"$ref": "#/$defs/Run",
|
|
2096
|
+
"description": "",
|
|
2097
|
+
"examples": [],
|
|
2098
|
+
"markdownDescription": ""
|
|
2027
2099
|
},
|
|
2028
2100
|
{
|
|
2029
2101
|
"type": "null"
|
|
2030
2102
|
}
|
|
2031
2103
|
],
|
|
2032
|
-
"description": "
|
|
2104
|
+
"description": "Command that starts the service. A string runs with `/bin/sh -c`, so pipes, `&&` and multi-line scripts work; a list is an argv run directly without a shell. It starts in the lane's worktree root unless `cwd` is set. devlanes runs it exactly as written, so it cannot be combined with `preset`; prefer `run_script` when the command is a script in a project file. Exactly one of `run` and `run_script` is required after templates are applied.",
|
|
2033
2105
|
"examples": [
|
|
2034
2106
|
"pnpm dev",
|
|
2035
2107
|
[
|
|
@@ -2038,45 +2110,57 @@
|
|
|
2038
2110
|
"--port",
|
|
2039
2111
|
"${{ self.port }}"
|
|
2040
2112
|
]
|
|
2041
|
-
]
|
|
2113
|
+
],
|
|
2114
|
+
"markdownDescription": "Command that starts the service. A string runs with `/bin/sh -c`, so pipes, `&&` and multi-line scripts work; a list is an argv run directly without a shell. It starts in the lane's worktree root unless `cwd` is set. devlanes runs it exactly as written, so it cannot be combined with `preset`; prefer `run_script` when the command is a script in a project file. Exactly one of `run` and `run_script` is required after templates are applied."
|
|
2042
2115
|
},
|
|
2043
2116
|
"run_script": {
|
|
2044
2117
|
"anyOf": [
|
|
2045
2118
|
{
|
|
2046
|
-
"$ref": "#/$defs/RunScript"
|
|
2119
|
+
"$ref": "#/$defs/RunScript",
|
|
2120
|
+
"description": "",
|
|
2121
|
+
"examples": [],
|
|
2122
|
+
"markdownDescription": ""
|
|
2047
2123
|
},
|
|
2048
2124
|
{
|
|
2049
2125
|
"type": "null"
|
|
2050
2126
|
}
|
|
2051
2127
|
],
|
|
2052
|
-
"description": "Script file
|
|
2128
|
+
"description": "Script to run from a project file, as `{ file, name }`, such as `{ file: apps/api/package.json, name: dev }`. devlanes picks the tool from the file name (`package.json`, `Makefile`, `justfile`, `deno.json`, `pyproject.toml`, `Cargo.toml`), runs the script in that file's directory and checks that it exists before starting. Presets need it to place their flags, and a profile's `run_scripts` can swap the script name. Exactly one of `run` and `run_script` is required after templates are applied.",
|
|
2053
2129
|
"examples": [
|
|
2054
|
-
"apps/api/package.json#dev",
|
|
2055
2130
|
{
|
|
2056
|
-
"
|
|
2057
|
-
"
|
|
2131
|
+
"file": "apps/api/package.json",
|
|
2132
|
+
"name": "dev"
|
|
2133
|
+
},
|
|
2134
|
+
{
|
|
2135
|
+
"file": "justfile",
|
|
2136
|
+
"name": "fixtures"
|
|
2058
2137
|
}
|
|
2059
|
-
]
|
|
2138
|
+
],
|
|
2139
|
+
"markdownDescription": "Script to run from a project file, as `{ file, name }`, such as `{ file: apps/api/package.json, name: dev }`. devlanes picks the tool from the file name (`package.json`, `Makefile`, `justfile`, `deno.json`, `pyproject.toml`, `Cargo.toml`), runs the script in that file's directory and checks that it exists before starting. Presets need it to place their flags, and a profile's `run_scripts` can swap the script name. Exactly one of `run` and `run_script` is required after templates are applied."
|
|
2060
2140
|
},
|
|
2061
2141
|
"stop": {
|
|
2062
2142
|
"anyOf": [
|
|
2063
2143
|
{
|
|
2064
|
-
"$ref": "#/$defs/StopConfig"
|
|
2144
|
+
"$ref": "#/$defs/StopConfig",
|
|
2145
|
+
"description": "",
|
|
2146
|
+
"examples": [],
|
|
2147
|
+
"markdownDescription": ""
|
|
2065
2148
|
},
|
|
2066
2149
|
{
|
|
2067
2150
|
"type": "null"
|
|
2068
2151
|
}
|
|
2069
2152
|
],
|
|
2070
|
-
"description": "
|
|
2153
|
+
"description": "How devlanes stops the service: `signal` goes to its whole process tree, and after `timeout` every process still running is SIGKILLed. The service then shows as stopped and is not restarted. Defaults to SIGTERM and 10s.",
|
|
2071
2154
|
"examples": [
|
|
2072
2155
|
{
|
|
2073
2156
|
"signal": "SIGINT",
|
|
2074
2157
|
"timeout": "15s"
|
|
2075
2158
|
}
|
|
2076
|
-
]
|
|
2159
|
+
],
|
|
2160
|
+
"markdownDescription": "How devlanes stops the service: `signal` goes to its whole process tree, and after `timeout` every process still running is SIGKILLed. The service then shows as stopped and is not restarted. Defaults to SIGTERM and 10s."
|
|
2077
2161
|
},
|
|
2078
2162
|
"sync": {
|
|
2079
|
-
"description": "Folders
|
|
2163
|
+
"description": "Folders mirrored while the service runs, such as build output a browser loads unpacked from a fixed path. Each entry copies `from` to `to` (default `~/devlanes/sync/<project>/<lane>/<folder>`) and follows changes; machines connected with `devlanes remote connect` get their own copy.",
|
|
2080
2164
|
"examples": [
|
|
2081
2165
|
[
|
|
2082
2166
|
{
|
|
@@ -2089,7 +2173,7 @@
|
|
|
2089
2173
|
],
|
|
2090
2174
|
"items": {
|
|
2091
2175
|
"$ref": "#/$defs/SyncConfig",
|
|
2092
|
-
"description": "
|
|
2176
|
+
"description": "Folder copied to a fixed path and kept up to date, for build output another program loads from a stable location, such as an unpacked browser extension. Also streams to machines connected with `devlanes remote connect`.",
|
|
2093
2177
|
"examples": [
|
|
2094
2178
|
{
|
|
2095
2179
|
"from": "apps/extension/.output/chrome-mv3",
|
|
@@ -2097,15 +2181,17 @@
|
|
|
2097
2181
|
"*.map"
|
|
2098
2182
|
]
|
|
2099
2183
|
}
|
|
2100
|
-
]
|
|
2184
|
+
],
|
|
2185
|
+
"markdownDescription": "Folder copied to a fixed path and kept up to date, for build output another program loads from a stable location, such as an unpacked browser extension. Also streams to machines connected with `devlanes remote connect`."
|
|
2101
2186
|
},
|
|
2187
|
+
"markdownDescription": "Folders mirrored while the service runs, such as build output a browser loads unpacked from a fixed path. Each entry copies `from` to `to` (default `~/devlanes/sync/<project>/<lane>/<folder>`) and follows changes; machines connected with `devlanes remote connect` get their own copy.",
|
|
2102
2188
|
"type": [
|
|
2103
2189
|
"array",
|
|
2104
2190
|
"null"
|
|
2105
2191
|
]
|
|
2106
2192
|
},
|
|
2107
2193
|
"tags": {
|
|
2108
|
-
"description": "Tags
|
|
2194
|
+
"description": "Labels for selecting and grouping services. `+tag` selects every service with the tag in profiles, in commands such as `devlanes start +api`, and in the TUI filter. Tags also set the service's color: the first tag with a `color` under the top-level `tags` wins, then the first tag naming a category such as `api`, `web` or `worker`, so put that tag first.",
|
|
2109
2195
|
"examples": [
|
|
2110
2196
|
[
|
|
2111
2197
|
"api",
|
|
@@ -2119,15 +2205,17 @@
|
|
|
2119
2205
|
]
|
|
2120
2206
|
],
|
|
2121
2207
|
"items": {
|
|
2122
|
-
"description": "Tags
|
|
2208
|
+
"description": "Labels for selecting and grouping services. `+tag` selects every service with the tag in profiles, in commands such as `devlanes start +api`, and in the TUI filter. Tags also set the service's color: the first tag with a `color` under the top-level `tags` wins, then the first tag naming a category such as `api`, `web` or `worker`, so put that tag first.",
|
|
2123
2209
|
"examples": [
|
|
2124
2210
|
"api",
|
|
2125
2211
|
"essential",
|
|
2126
2212
|
"worker",
|
|
2127
2213
|
"web"
|
|
2128
2214
|
],
|
|
2215
|
+
"markdownDescription": "Labels for selecting and grouping services. `+tag` selects every service with the tag in profiles, in commands such as `devlanes start +api`, and in the TUI filter. Tags also set the service's color: the first tag with a `color` under the top-level `tags` wins, then the first tag naming a category such as `api`, `web` or `worker`, so put that tag first.",
|
|
2129
2216
|
"type": "string"
|
|
2130
2217
|
},
|
|
2218
|
+
"markdownDescription": "Labels for selecting and grouping services. `+tag` selects every service with the tag in profiles, in commands such as `devlanes start +api`, and in the TUI filter. Tags also set the service's color: the first tag with a `color` under the top-level `tags` wins, then the first tag naming a category such as `api`, `web` or `worker`, so put that tag first.",
|
|
2131
2219
|
"type": [
|
|
2132
2220
|
"array",
|
|
2133
2221
|
"null"
|
|
@@ -2135,19 +2223,19 @@
|
|
|
2135
2223
|
},
|
|
2136
2224
|
"tauri": {
|
|
2137
2225
|
"$ref": "#/$defs/InjectedPresetOptions3",
|
|
2138
|
-
"description": "Options
|
|
2226
|
+
"description": "Options for `preset: tauri`, which lets several Tauri v2 dev apps run side by side, one per lane and replica. The values go into a config overlay at `${{ lane.data_path }}/tauri/<service>.<replica>.conf.json`, passed with `--config` and in `DEVLANES_TAURI_CONFIG`, which Tauri merges over `tauri.conf.json`.",
|
|
2139
2227
|
"examples": [
|
|
2140
2228
|
{
|
|
2141
2229
|
"before_dev_command": "",
|
|
2142
|
-
"dev_url": "${{
|
|
2230
|
+
"dev_url": "${{ services.desktop_web.url }}",
|
|
2143
2231
|
"identifier": "io.acme.app.lane${{ lane.index }}.client${{ replica.index }}"
|
|
2144
2232
|
}
|
|
2145
2233
|
],
|
|
2146
|
-
"
|
|
2234
|
+
"markdownDescription": "Options for `preset: tauri`, which lets several Tauri v2 dev apps run side by side, one per lane and replica. The values go into a config overlay at `${{ lane.data_path }}/tauri/<service>.<replica>.conf.json`, passed with `--config` and in `DEVLANES_TAURI_CONFIG`, which Tauri merges over `tauri.conf.json`."
|
|
2147
2235
|
},
|
|
2148
2236
|
"vite": {
|
|
2149
2237
|
"$ref": "#/$defs/InjectedPresetOptions0",
|
|
2150
|
-
"description": "Options
|
|
2238
|
+
"description": "Options for `preset: vite`, which adds `--port <self.port> --strictPort --host 127.0.0.1` to the dev server command. `--strictPort` makes Vite exit when the port is taken instead of moving to another port the proxy does not know about.",
|
|
2151
2239
|
"examples": [
|
|
2152
2240
|
{
|
|
2153
2241
|
"args": [
|
|
@@ -2155,11 +2243,11 @@
|
|
|
2155
2243
|
]
|
|
2156
2244
|
}
|
|
2157
2245
|
],
|
|
2158
|
-
"
|
|
2246
|
+
"markdownDescription": "Options for `preset: vite`, which adds `--port <self.port> --strictPort --host 127.0.0.1` to the dev server command. `--strictPort` makes Vite exit when the port is taken instead of moving to another port the proxy does not know about."
|
|
2159
2247
|
},
|
|
2160
2248
|
"wrangler": {
|
|
2161
2249
|
"$ref": "#/$defs/InjectedPresetOptions2",
|
|
2162
|
-
"description": "Options
|
|
2250
|
+
"description": "Options for `preset: wrangler`, which gives each lane's `wrangler dev` its own `--port <self.port>`, `--inspector-port <self.ports.inspector>` and dev registry. The `inspector` port is allocated automatically. `args` that pass either port flag are refused by `devlanes config check`, and a `run_script` script that does is refused at start.",
|
|
2163
2251
|
"examples": [
|
|
2164
2252
|
{
|
|
2165
2253
|
"args": [
|
|
@@ -2172,43 +2260,46 @@
|
|
|
2172
2260
|
}
|
|
2173
2261
|
}
|
|
2174
2262
|
],
|
|
2175
|
-
"
|
|
2263
|
+
"markdownDescription": "Options for `preset: wrangler`, which gives each lane's `wrangler dev` its own `--port <self.port>`, `--inspector-port <self.ports.inspector>` and dev registry. The `inspector` port is allocated automatically. `args` that pass either port flag are refused by `devlanes config check`, and a `run_script` script that does is refused at start."
|
|
2176
2264
|
}
|
|
2177
2265
|
},
|
|
2178
2266
|
"type": "object"
|
|
2179
2267
|
},
|
|
2180
2268
|
"Started": {
|
|
2181
|
-
"description": "Readiness without
|
|
2269
|
+
"description": "Readiness without a probe.",
|
|
2270
|
+
"enum": [
|
|
2271
|
+
"started"
|
|
2272
|
+
],
|
|
2273
|
+
"enumDescriptions": [
|
|
2274
|
+
"Count the unit ready as soon as it runs, without probing anything. A dev server whose program crashed under a file watcher still counts as ready, so prefer a check when there is something to probe."
|
|
2275
|
+
],
|
|
2182
2276
|
"examples": [
|
|
2183
2277
|
"started"
|
|
2184
2278
|
],
|
|
2185
|
-
"
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
"started"
|
|
2191
|
-
],
|
|
2192
|
-
"type": "string"
|
|
2193
|
-
}
|
|
2194
|
-
]
|
|
2279
|
+
"markdownDescription": "Readiness without a probe.",
|
|
2280
|
+
"markdownEnumDescriptions": [
|
|
2281
|
+
"Count the unit ready as soon as it runs, without probing anything. A dev server whose program crashed under a file watcher still counts as ready, so prefer a check when there is something to probe."
|
|
2282
|
+
],
|
|
2283
|
+
"type": "string"
|
|
2195
2284
|
},
|
|
2196
2285
|
"StopConfig": {
|
|
2197
2286
|
"additionalProperties": false,
|
|
2198
|
-
"description": "
|
|
2287
|
+
"description": "How devlanes stops the service on `devlanes stop`, a restart or a lane stop: it sends `signal` to every process of the service, waits up to `timeout`, then SIGKILLs whatever is still running. Defaults to SIGTERM and 10s.",
|
|
2199
2288
|
"examples": [
|
|
2200
2289
|
{
|
|
2201
2290
|
"signal": "SIGINT",
|
|
2202
2291
|
"timeout": "15s"
|
|
2203
2292
|
}
|
|
2204
2293
|
],
|
|
2294
|
+
"markdownDescription": "How devlanes stops the service on `devlanes stop`, a restart or a lane stop: it sends `signal` to every process of the service, waits up to `timeout`, then SIGKILLs whatever is still running. Defaults to SIGTERM and 10s.",
|
|
2205
2295
|
"properties": {
|
|
2206
2296
|
"signal": {
|
|
2207
|
-
"description": "
|
|
2297
|
+
"description": "Signal sent to the service's whole process tree when devlanes stops or restarts it. One of `SIGTERM` (default), `SIGINT`, `SIGHUP`, `SIGQUIT`, `SIGUSR1`, `SIGUSR2` or `SIGKILL`; use `SIGINT` for programs that only shut down cleanly on Ctrl-C.",
|
|
2208
2298
|
"examples": [
|
|
2209
2299
|
"SIGTERM",
|
|
2210
2300
|
"SIGINT"
|
|
2211
2301
|
],
|
|
2302
|
+
"markdownDescription": "Signal sent to the service's whole process tree when devlanes stops or restarts it. One of `SIGTERM` (default), `SIGINT`, `SIGHUP`, `SIGQUIT`, `SIGUSR1`, `SIGUSR2` or `SIGKILL`; use `SIGINT` for programs that only shut down cleanly on Ctrl-C.",
|
|
2212
2303
|
"type": [
|
|
2213
2304
|
"string",
|
|
2214
2305
|
"null"
|
|
@@ -2217,24 +2308,28 @@
|
|
|
2217
2308
|
"timeout": {
|
|
2218
2309
|
"anyOf": [
|
|
2219
2310
|
{
|
|
2220
|
-
"$ref": "#/$defs/Templated_ConfigDuration"
|
|
2311
|
+
"$ref": "#/$defs/Templated_ConfigDuration",
|
|
2312
|
+
"description": "",
|
|
2313
|
+
"examples": [],
|
|
2314
|
+
"markdownDescription": ""
|
|
2221
2315
|
},
|
|
2222
2316
|
{
|
|
2223
2317
|
"type": "null"
|
|
2224
2318
|
}
|
|
2225
2319
|
],
|
|
2226
|
-
"description": "
|
|
2320
|
+
"description": "How long to wait after `signal` before devlanes SIGKILLs every process of the service that is still running. The service then shows as stopped; devlanes never restarts it. Defaults to 10s; raise it for programs that need time to flush or close connections.",
|
|
2227
2321
|
"examples": [
|
|
2228
2322
|
"15s",
|
|
2229
2323
|
"10m"
|
|
2230
|
-
]
|
|
2324
|
+
],
|
|
2325
|
+
"markdownDescription": "How long to wait after `signal` before devlanes SIGKILLs every process of the service that is still running. The service then shows as stopped; devlanes never restarts it. Defaults to 10s; raise it for programs that need time to flush or close connections."
|
|
2231
2326
|
}
|
|
2232
2327
|
},
|
|
2233
2328
|
"type": "object"
|
|
2234
2329
|
},
|
|
2235
2330
|
"SyncConfig": {
|
|
2236
2331
|
"additionalProperties": false,
|
|
2237
|
-
"description": "
|
|
2332
|
+
"description": "Folder copied to a fixed path and kept up to date, for build output another program loads from a stable location, such as an unpacked browser extension. Also streams to machines connected with `devlanes remote connect`.",
|
|
2238
2333
|
"examples": [
|
|
2239
2334
|
{
|
|
2240
2335
|
"from": "apps/extension/.output/chrome-mv3",
|
|
@@ -2243,44 +2338,52 @@
|
|
|
2243
2338
|
]
|
|
2244
2339
|
}
|
|
2245
2340
|
],
|
|
2341
|
+
"markdownDescription": "Folder copied to a fixed path and kept up to date, for build output another program loads from a stable location, such as an unpacked browser extension. Also streams to machines connected with `devlanes remote connect`.",
|
|
2246
2342
|
"properties": {
|
|
2247
2343
|
"from": {
|
|
2248
2344
|
"$ref": "#/$defs/Templated_string",
|
|
2249
|
-
"description": "
|
|
2345
|
+
"description": "Folder to copy, relative to the lane's worktree.",
|
|
2250
2346
|
"examples": [
|
|
2251
2347
|
"apps/extension/.output/chrome-mv3"
|
|
2252
|
-
]
|
|
2348
|
+
],
|
|
2349
|
+
"markdownDescription": "Folder to copy, relative to the lane's worktree."
|
|
2253
2350
|
},
|
|
2254
2351
|
"ignore": {
|
|
2255
2352
|
"default": [],
|
|
2256
|
-
"description": "Glob patterns
|
|
2353
|
+
"description": "Glob patterns of files left out of the copy and of later updates.",
|
|
2257
2354
|
"examples": [
|
|
2258
2355
|
[
|
|
2259
2356
|
"*.map"
|
|
2260
2357
|
]
|
|
2261
2358
|
],
|
|
2262
2359
|
"items": {
|
|
2263
|
-
"description": "Glob patterns
|
|
2360
|
+
"description": "Glob patterns of files left out of the copy and of later updates.",
|
|
2264
2361
|
"examples": [
|
|
2265
2362
|
"*.map"
|
|
2266
2363
|
],
|
|
2364
|
+
"markdownDescription": "Glob patterns of files left out of the copy and of later updates.",
|
|
2267
2365
|
"type": "string"
|
|
2268
2366
|
},
|
|
2367
|
+
"markdownDescription": "Glob patterns of files left out of the copy and of later updates.",
|
|
2269
2368
|
"type": "array"
|
|
2270
2369
|
},
|
|
2271
2370
|
"to": {
|
|
2272
2371
|
"anyOf": [
|
|
2273
2372
|
{
|
|
2274
|
-
"$ref": "#/$defs/Templated_string"
|
|
2373
|
+
"$ref": "#/$defs/Templated_string",
|
|
2374
|
+
"description": "",
|
|
2375
|
+
"examples": [],
|
|
2376
|
+
"markdownDescription": ""
|
|
2275
2377
|
},
|
|
2276
2378
|
{
|
|
2277
2379
|
"type": "null"
|
|
2278
2380
|
}
|
|
2279
2381
|
],
|
|
2280
|
-
"description": "
|
|
2382
|
+
"description": "Local destination; `~/` is your home and other relative paths start at the worktree. Defaults to `~/devlanes/sync/<project>/<lane>/<folder>`. Machines connected with `devlanes remote connect` ignore it and use their own path.",
|
|
2281
2383
|
"examples": [
|
|
2282
2384
|
"~/devlanes/sync/acme/${{ lane.name }}/chrome-mv3"
|
|
2283
|
-
]
|
|
2385
|
+
],
|
|
2386
|
+
"markdownDescription": "Local destination; `~/` is your home and other relative paths start at the worktree. Defaults to `~/devlanes/sync/<project>/<lane>/<folder>`. Machines connected with `devlanes remote connect` ignore it and use their own path."
|
|
2284
2387
|
}
|
|
2285
2388
|
},
|
|
2286
2389
|
"required": [
|
|
@@ -2289,7 +2392,39 @@
|
|
|
2289
2392
|
"type": "object"
|
|
2290
2393
|
},
|
|
2291
2394
|
"TagColor": {
|
|
2292
|
-
"description": "
|
|
2395
|
+
"description": "A color from the terminal's basic palette; the exact shade follows the terminal theme, and `bright-` variants are the lighter shades.",
|
|
2396
|
+
"enum": [
|
|
2397
|
+
"red",
|
|
2398
|
+
"green",
|
|
2399
|
+
"yellow",
|
|
2400
|
+
"blue",
|
|
2401
|
+
"magenta",
|
|
2402
|
+
"cyan",
|
|
2403
|
+
"white",
|
|
2404
|
+
"gray",
|
|
2405
|
+
"bright-red",
|
|
2406
|
+
"bright-green",
|
|
2407
|
+
"bright-yellow",
|
|
2408
|
+
"bright-blue",
|
|
2409
|
+
"bright-magenta",
|
|
2410
|
+
"bright-cyan"
|
|
2411
|
+
],
|
|
2412
|
+
"enumDescriptions": [
|
|
2413
|
+
"Show the tag's services in the terminal's red color.",
|
|
2414
|
+
"Show the tag's services in the terminal's green color.",
|
|
2415
|
+
"Show the tag's services in the terminal's yellow color.",
|
|
2416
|
+
"Show the tag's services in the terminal's blue color.",
|
|
2417
|
+
"Show the tag's services in the terminal's magenta color.",
|
|
2418
|
+
"Show the tag's services in the terminal's cyan color.",
|
|
2419
|
+
"Show the tag's services in the terminal's white color.",
|
|
2420
|
+
"Show the tag's services in the terminal's gray color.",
|
|
2421
|
+
"Show the tag's services in the terminal's bright-red color.",
|
|
2422
|
+
"Show the tag's services in the terminal's bright-green color.",
|
|
2423
|
+
"Show the tag's services in the terminal's bright-yellow color.",
|
|
2424
|
+
"Show the tag's services in the terminal's bright-blue color.",
|
|
2425
|
+
"Show the tag's services in the terminal's bright-magenta color.",
|
|
2426
|
+
"Show the tag's services in the terminal's bright-cyan color."
|
|
2427
|
+
],
|
|
2293
2428
|
"examples": [
|
|
2294
2429
|
"red",
|
|
2295
2430
|
"green",
|
|
@@ -2306,141 +2441,49 @@
|
|
|
2306
2441
|
"bright-magenta",
|
|
2307
2442
|
"bright-cyan"
|
|
2308
2443
|
],
|
|
2309
|
-
"
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
"const": "yellow",
|
|
2328
|
-
"description": "Use the terminal's yellow palette color.",
|
|
2329
|
-
"examples": [
|
|
2330
|
-
"yellow"
|
|
2331
|
-
],
|
|
2332
|
-
"type": "string"
|
|
2333
|
-
},
|
|
2334
|
-
{
|
|
2335
|
-
"const": "blue",
|
|
2336
|
-
"description": "Use the terminal's blue palette color.",
|
|
2337
|
-
"examples": [
|
|
2338
|
-
"blue"
|
|
2339
|
-
],
|
|
2340
|
-
"type": "string"
|
|
2341
|
-
},
|
|
2342
|
-
{
|
|
2343
|
-
"const": "magenta",
|
|
2344
|
-
"description": "Use the terminal's magenta palette color.",
|
|
2345
|
-
"examples": [
|
|
2346
|
-
"magenta"
|
|
2347
|
-
],
|
|
2348
|
-
"type": "string"
|
|
2349
|
-
},
|
|
2350
|
-
{
|
|
2351
|
-
"const": "cyan",
|
|
2352
|
-
"description": "Use the terminal's cyan palette color.",
|
|
2353
|
-
"examples": [
|
|
2354
|
-
"cyan"
|
|
2355
|
-
],
|
|
2356
|
-
"type": "string"
|
|
2357
|
-
},
|
|
2358
|
-
{
|
|
2359
|
-
"const": "white",
|
|
2360
|
-
"description": "Use the terminal's white palette color.",
|
|
2361
|
-
"examples": [
|
|
2362
|
-
"white"
|
|
2363
|
-
],
|
|
2364
|
-
"type": "string"
|
|
2365
|
-
},
|
|
2366
|
-
{
|
|
2367
|
-
"const": "gray",
|
|
2368
|
-
"description": "Use the terminal's gray palette color.",
|
|
2369
|
-
"examples": [
|
|
2370
|
-
"gray"
|
|
2371
|
-
],
|
|
2372
|
-
"type": "string"
|
|
2373
|
-
},
|
|
2374
|
-
{
|
|
2375
|
-
"const": "bright-red",
|
|
2376
|
-
"description": "Use the terminal's bright-red palette color.",
|
|
2377
|
-
"examples": [
|
|
2378
|
-
"bright-red"
|
|
2379
|
-
],
|
|
2380
|
-
"type": "string"
|
|
2381
|
-
},
|
|
2382
|
-
{
|
|
2383
|
-
"const": "bright-green",
|
|
2384
|
-
"description": "Use the terminal's bright-green palette color.",
|
|
2385
|
-
"examples": [
|
|
2386
|
-
"bright-green"
|
|
2387
|
-
],
|
|
2388
|
-
"type": "string"
|
|
2389
|
-
},
|
|
2390
|
-
{
|
|
2391
|
-
"const": "bright-yellow",
|
|
2392
|
-
"description": "Use the terminal's bright-yellow palette color.",
|
|
2393
|
-
"examples": [
|
|
2394
|
-
"bright-yellow"
|
|
2395
|
-
],
|
|
2396
|
-
"type": "string"
|
|
2397
|
-
},
|
|
2398
|
-
{
|
|
2399
|
-
"const": "bright-blue",
|
|
2400
|
-
"description": "Use the terminal's bright-blue palette color.",
|
|
2401
|
-
"examples": [
|
|
2402
|
-
"bright-blue"
|
|
2403
|
-
],
|
|
2404
|
-
"type": "string"
|
|
2405
|
-
},
|
|
2406
|
-
{
|
|
2407
|
-
"const": "bright-magenta",
|
|
2408
|
-
"description": "Use the terminal's bright-magenta palette color.",
|
|
2409
|
-
"examples": [
|
|
2410
|
-
"bright-magenta"
|
|
2411
|
-
],
|
|
2412
|
-
"type": "string"
|
|
2413
|
-
},
|
|
2414
|
-
{
|
|
2415
|
-
"const": "bright-cyan",
|
|
2416
|
-
"description": "Use the terminal's bright-cyan palette color.",
|
|
2417
|
-
"examples": [
|
|
2418
|
-
"bright-cyan"
|
|
2419
|
-
],
|
|
2420
|
-
"type": "string"
|
|
2421
|
-
}
|
|
2422
|
-
]
|
|
2444
|
+
"markdownDescription": "A color from the terminal's basic palette; the exact shade follows the terminal theme, and `bright-` variants are the lighter shades.",
|
|
2445
|
+
"markdownEnumDescriptions": [
|
|
2446
|
+
"Show the tag's services in the terminal's red color.",
|
|
2447
|
+
"Show the tag's services in the terminal's green color.",
|
|
2448
|
+
"Show the tag's services in the terminal's yellow color.",
|
|
2449
|
+
"Show the tag's services in the terminal's blue color.",
|
|
2450
|
+
"Show the tag's services in the terminal's magenta color.",
|
|
2451
|
+
"Show the tag's services in the terminal's cyan color.",
|
|
2452
|
+
"Show the tag's services in the terminal's white color.",
|
|
2453
|
+
"Show the tag's services in the terminal's gray color.",
|
|
2454
|
+
"Show the tag's services in the terminal's bright-red color.",
|
|
2455
|
+
"Show the tag's services in the terminal's bright-green color.",
|
|
2456
|
+
"Show the tag's services in the terminal's bright-yellow color.",
|
|
2457
|
+
"Show the tag's services in the terminal's bright-blue color.",
|
|
2458
|
+
"Show the tag's services in the terminal's bright-magenta color.",
|
|
2459
|
+
"Show the tag's services in the terminal's bright-cyan color."
|
|
2460
|
+
],
|
|
2461
|
+
"type": "string"
|
|
2423
2462
|
},
|
|
2424
2463
|
"TagConfig": {
|
|
2425
2464
|
"additionalProperties": false,
|
|
2426
|
-
"description": "
|
|
2465
|
+
"description": "Settings for one tag used in `services.<name>.tags`. Declaring a tag here is optional: services can use any tag and `+tag` selectors work without it. Declare one to pin its color or describe it.",
|
|
2427
2466
|
"examples": [
|
|
2428
2467
|
{
|
|
2429
2468
|
"color": "cyan",
|
|
2430
2469
|
"description": "HTTP APIs"
|
|
2431
2470
|
}
|
|
2432
2471
|
],
|
|
2472
|
+
"markdownDescription": "Settings for one tag used in `services.<name>.tags`. Declaring a tag here is optional: services can use any tag and `+tag` selectors work without it. Declare one to pin its color or describe it.",
|
|
2433
2473
|
"properties": {
|
|
2434
2474
|
"color": {
|
|
2435
2475
|
"anyOf": [
|
|
2436
2476
|
{
|
|
2437
|
-
"$ref": "#/$defs/TagColor"
|
|
2477
|
+
"$ref": "#/$defs/TagColor",
|
|
2478
|
+
"description": "",
|
|
2479
|
+
"examples": [],
|
|
2480
|
+
"markdownDescription": ""
|
|
2438
2481
|
},
|
|
2439
2482
|
{
|
|
2440
2483
|
"type": "null"
|
|
2441
2484
|
}
|
|
2442
2485
|
],
|
|
2443
|
-
"description": "
|
|
2486
|
+
"description": "Color of services with this tag in the TUI and CLI output. When a service has several tags with a color, the first one in its `tags` list wins. Without one, devlanes infers a color from category words such as `api` (blue), `web` (green) or `worker` (magenta) in the service's tags, preset or name.",
|
|
2444
2487
|
"examples": [
|
|
2445
2488
|
"red",
|
|
2446
2489
|
"green",
|
|
@@ -2456,14 +2499,16 @@
|
|
|
2456
2499
|
"bright-blue",
|
|
2457
2500
|
"bright-magenta",
|
|
2458
2501
|
"bright-cyan"
|
|
2459
|
-
]
|
|
2502
|
+
],
|
|
2503
|
+
"markdownDescription": "Color of services with this tag in the TUI and CLI output. When a service has several tags with a color, the first one in its `tags` list wins. Without one, devlanes infers a color from category words such as `api` (blue), `web` (green) or `worker` (magenta) in the service's tags, preset or name."
|
|
2460
2504
|
},
|
|
2461
2505
|
"description": {
|
|
2462
|
-
"description": "
|
|
2506
|
+
"description": "Note on what the tag groups, for people reading the config.",
|
|
2463
2507
|
"examples": [
|
|
2464
2508
|
"HTTP APIs",
|
|
2465
2509
|
"Background workers"
|
|
2466
2510
|
],
|
|
2511
|
+
"markdownDescription": "Note on what the tag groups, for people reading the config.",
|
|
2467
2512
|
"type": [
|
|
2468
2513
|
"string",
|
|
2469
2514
|
"null"
|
|
@@ -2473,123 +2518,130 @@
|
|
|
2473
2518
|
"type": "object"
|
|
2474
2519
|
},
|
|
2475
2520
|
"TaskAfter": {
|
|
2476
|
-
"description": "
|
|
2521
|
+
"description": "Later point in the start at which a `lane.create` or `lane.start` task runs.",
|
|
2522
|
+
"enum": [
|
|
2523
|
+
"services"
|
|
2524
|
+
],
|
|
2525
|
+
"enumDescriptions": [
|
|
2526
|
+
"Run once every started service is ready; the task is skipped when one of them failed or the start timed out."
|
|
2527
|
+
],
|
|
2477
2528
|
"examples": [
|
|
2478
2529
|
"services"
|
|
2479
2530
|
],
|
|
2480
|
-
"
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
"services"
|
|
2486
|
-
],
|
|
2487
|
-
"type": "string"
|
|
2488
|
-
}
|
|
2489
|
-
]
|
|
2531
|
+
"markdownDescription": "Later point in the start at which a `lane.create` or `lane.start` task runs.",
|
|
2532
|
+
"markdownEnumDescriptions": [
|
|
2533
|
+
"Run once every started service is ready; the task is skipped when one of them failed or the start timed out."
|
|
2534
|
+
],
|
|
2535
|
+
"type": "string"
|
|
2490
2536
|
},
|
|
2491
2537
|
"TaskConfig": {
|
|
2492
2538
|
"additionalProperties": false,
|
|
2493
|
-
"description": "
|
|
2539
|
+
"description": "A one-shot command, run by hand with `devlanes run <name>` or automatically at a lane event set with `when`. Anything that ends by itself belongs here, not in `services`, where an exit counts as a failure.",
|
|
2494
2540
|
"examples": [
|
|
2495
2541
|
{
|
|
2496
|
-
"run_script":
|
|
2542
|
+
"run_script": {
|
|
2543
|
+
"file": "apps/api/package.json",
|
|
2544
|
+
"name": "migrate"
|
|
2545
|
+
},
|
|
2497
2546
|
"when": "lane.start"
|
|
2498
2547
|
}
|
|
2499
2548
|
],
|
|
2549
|
+
"markdownDescription": "A one-shot command, run by hand with `devlanes run <name>` or automatically at a lane event set with `when`. Anything that ends by itself belongs here, not in `services`, where an exit counts as a failure.",
|
|
2500
2550
|
"properties": {
|
|
2501
2551
|
"after": {
|
|
2502
2552
|
"anyOf": [
|
|
2503
2553
|
{
|
|
2504
|
-
"$ref": "#/$defs/TaskAfter"
|
|
2554
|
+
"$ref": "#/$defs/TaskAfter",
|
|
2555
|
+
"description": "",
|
|
2556
|
+
"examples": [],
|
|
2557
|
+
"markdownDescription": ""
|
|
2505
2558
|
},
|
|
2506
2559
|
{
|
|
2507
2560
|
"type": "null"
|
|
2508
2561
|
}
|
|
2509
2562
|
],
|
|
2510
|
-
"description": "
|
|
2563
|
+
"description": "Set to `services` to run a `lane.create` or `lane.start` task after the started services are ready instead of before them, for work that goes through the running app, such as seeding through its API.",
|
|
2511
2564
|
"examples": [
|
|
2512
2565
|
"services"
|
|
2513
|
-
]
|
|
2566
|
+
],
|
|
2567
|
+
"markdownDescription": "Set to `services` to run a `lane.create` or `lane.start` task after the started services are ready instead of before them, for work that goes through the running app, such as seeding through its API."
|
|
2514
2568
|
},
|
|
2515
2569
|
"confirm": {
|
|
2516
2570
|
"anyOf": [
|
|
2517
2571
|
{
|
|
2518
|
-
"$ref": "#/$defs/Templated_string"
|
|
2572
|
+
"$ref": "#/$defs/Templated_string",
|
|
2573
|
+
"description": "",
|
|
2574
|
+
"examples": [],
|
|
2575
|
+
"markdownDescription": ""
|
|
2519
2576
|
},
|
|
2520
2577
|
{
|
|
2521
2578
|
"type": "null"
|
|
2522
2579
|
}
|
|
2523
2580
|
],
|
|
2524
|
-
"description": "
|
|
2581
|
+
"description": "Question asked before the task runs, for destructive tasks. Scripts and agents without a terminal must pass `--yes` to run it.",
|
|
2525
2582
|
"examples": [
|
|
2526
2583
|
"Reset ${{ lane.db_name }} and re-seed it?"
|
|
2527
|
-
]
|
|
2584
|
+
],
|
|
2585
|
+
"markdownDescription": "Question asked before the task runs, for destructive tasks. Scripts and agents without a terminal must pass `--yes` to run it."
|
|
2528
2586
|
},
|
|
2529
2587
|
"cwd": {
|
|
2530
2588
|
"anyOf": [
|
|
2531
2589
|
{
|
|
2532
|
-
"$ref": "#/$defs/Templated_string"
|
|
2590
|
+
"$ref": "#/$defs/Templated_string",
|
|
2591
|
+
"description": "",
|
|
2592
|
+
"examples": [],
|
|
2593
|
+
"markdownDescription": ""
|
|
2533
2594
|
},
|
|
2534
2595
|
{
|
|
2535
2596
|
"type": "null"
|
|
2536
2597
|
}
|
|
2537
2598
|
],
|
|
2538
|
-
"description": "Working directory relative to the lane's worktree.",
|
|
2599
|
+
"description": "Working directory for `run`, relative to the lane's worktree; defaults to the worktree root. Cannot be combined with `run_script`, which runs in the script file's directory.",
|
|
2539
2600
|
"examples": [
|
|
2540
2601
|
"apps/api"
|
|
2541
|
-
]
|
|
2602
|
+
],
|
|
2603
|
+
"markdownDescription": "Working directory for `run`, relative to the lane's worktree; defaults to the worktree root. Cannot be combined with `run_script`, which runs in the script file's directory."
|
|
2542
2604
|
},
|
|
2543
2605
|
"env": {
|
|
2544
2606
|
"additionalProperties": {
|
|
2545
2607
|
"$ref": "#/$defs/Templated_Scalar",
|
|
2546
|
-
"description": "
|
|
2608
|
+
"description": "Variables for this task only, above `global_env`.",
|
|
2547
2609
|
"examples": [
|
|
2548
|
-
"${{
|
|
2549
|
-
]
|
|
2610
|
+
"${{ services.api.url }}"
|
|
2611
|
+
],
|
|
2612
|
+
"markdownDescription": "Variables for this task only, above `global_env`."
|
|
2550
2613
|
},
|
|
2551
2614
|
"default": {},
|
|
2552
|
-
"description": "
|
|
2615
|
+
"description": "Variables for this task only, above `global_env`.",
|
|
2553
2616
|
"examples": [
|
|
2554
2617
|
{
|
|
2555
|
-
"API_URL": "${{
|
|
2618
|
+
"API_URL": "${{ services.api.url }}"
|
|
2556
2619
|
}
|
|
2557
2620
|
],
|
|
2621
|
+
"markdownDescription": "Variables for this task only, above `global_env`.",
|
|
2558
2622
|
"type": "object"
|
|
2559
2623
|
},
|
|
2560
|
-
"fnox": {
|
|
2561
|
-
"anyOf": [
|
|
2562
|
-
{
|
|
2563
|
-
"$ref": "#/$defs/FnoxConfig"
|
|
2564
|
-
},
|
|
2565
|
-
{
|
|
2566
|
-
"type": "null"
|
|
2567
|
-
}
|
|
2568
|
-
],
|
|
2569
|
-
"description": "Task-specific fnox profile.",
|
|
2570
|
-
"examples": [
|
|
2571
|
-
{
|
|
2572
|
-
"profile": "dev"
|
|
2573
|
-
}
|
|
2574
|
-
]
|
|
2575
|
-
},
|
|
2576
2624
|
"interactive": {
|
|
2577
2625
|
"anyOf": [
|
|
2578
2626
|
{
|
|
2579
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
2627
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
2628
|
+
"description": "",
|
|
2629
|
+
"examples": [],
|
|
2630
|
+
"markdownDescription": ""
|
|
2580
2631
|
},
|
|
2581
2632
|
{
|
|
2582
2633
|
"type": "null"
|
|
2583
2634
|
}
|
|
2584
2635
|
],
|
|
2585
|
-
"description": "
|
|
2636
|
+
"description": "Give the task your terminal for input and output, for logins, prompts and TUIs. Interactive tasks only run by hand, so they cannot have `when`. Defaults to false.",
|
|
2586
2637
|
"examples": [
|
|
2587
2638
|
true,
|
|
2588
2639
|
false
|
|
2589
|
-
]
|
|
2640
|
+
],
|
|
2641
|
+
"markdownDescription": "Give the task your terminal for input and output, for logins, prompts and TUIs. Interactive tasks only run by hand, so they cannot have `when`. Defaults to false."
|
|
2590
2642
|
},
|
|
2591
2643
|
"profiles": {
|
|
2592
|
-
"description": "
|
|
2644
|
+
"description": "Run this task's `when` hook only while one of these profiles is active; `default` also matches a start without `--profile`. Runs by hand are not affected. Requires `when`.",
|
|
2593
2645
|
"examples": [
|
|
2594
2646
|
[
|
|
2595
2647
|
"default",
|
|
@@ -2597,13 +2649,15 @@
|
|
|
2597
2649
|
]
|
|
2598
2650
|
],
|
|
2599
2651
|
"items": {
|
|
2600
|
-
"description": "
|
|
2652
|
+
"description": "Run this task's `when` hook only while one of these profiles is active; `default` also matches a start without `--profile`. Runs by hand are not affected. Requires `when`.",
|
|
2601
2653
|
"examples": [
|
|
2602
2654
|
"default",
|
|
2603
2655
|
"backend"
|
|
2604
2656
|
],
|
|
2657
|
+
"markdownDescription": "Run this task's `when` hook only while one of these profiles is active; `default` also matches a start without `--profile`. Runs by hand are not affected. Requires `when`.",
|
|
2605
2658
|
"type": "string"
|
|
2606
2659
|
},
|
|
2660
|
+
"markdownDescription": "Run this task's `when` hook only while one of these profiles is active; `default` also matches a start without `--profile`. Runs by hand are not affected. Requires `when`.",
|
|
2607
2661
|
"type": [
|
|
2608
2662
|
"array",
|
|
2609
2663
|
"null"
|
|
@@ -2612,28 +2666,35 @@
|
|
|
2612
2666
|
"pty": {
|
|
2613
2667
|
"anyOf": [
|
|
2614
2668
|
{
|
|
2615
|
-
"$ref": "#/$defs/Templated_boolean"
|
|
2669
|
+
"$ref": "#/$defs/Templated_boolean",
|
|
2670
|
+
"description": "",
|
|
2671
|
+
"examples": [],
|
|
2672
|
+
"markdownDescription": ""
|
|
2616
2673
|
},
|
|
2617
2674
|
{
|
|
2618
2675
|
"type": "null"
|
|
2619
2676
|
}
|
|
2620
2677
|
],
|
|
2621
|
-
"description": "
|
|
2678
|
+
"description": "Run the task in a pseudoterminal instead of plain pipes, for tools that only print colors or progress to a terminal. Defaults to the value of `interactive`.",
|
|
2622
2679
|
"examples": [
|
|
2623
2680
|
true,
|
|
2624
2681
|
false
|
|
2625
|
-
]
|
|
2682
|
+
],
|
|
2683
|
+
"markdownDescription": "Run the task in a pseudoterminal instead of plain pipes, for tools that only print colors or progress to a terminal. Defaults to the value of `interactive`."
|
|
2626
2684
|
},
|
|
2627
2685
|
"run": {
|
|
2628
2686
|
"anyOf": [
|
|
2629
2687
|
{
|
|
2630
|
-
"$ref": "#/$defs/Run"
|
|
2688
|
+
"$ref": "#/$defs/Run",
|
|
2689
|
+
"description": "",
|
|
2690
|
+
"examples": [],
|
|
2691
|
+
"markdownDescription": ""
|
|
2631
2692
|
},
|
|
2632
2693
|
{
|
|
2633
2694
|
"type": "null"
|
|
2634
2695
|
}
|
|
2635
2696
|
],
|
|
2636
|
-
"description": "
|
|
2697
|
+
"description": "Command to run: a string runs through `/bin/sh -c` (pipes and multi-line scripts work), a list runs the program directly with those arguments. Use exactly one of `run`, `run_script` or `steps`.",
|
|
2637
2698
|
"examples": [
|
|
2638
2699
|
"pnpm dev",
|
|
2639
2700
|
[
|
|
@@ -2642,28 +2703,36 @@
|
|
|
2642
2703
|
"--port",
|
|
2643
2704
|
"${{ self.port }}"
|
|
2644
2705
|
]
|
|
2645
|
-
]
|
|
2706
|
+
],
|
|
2707
|
+
"markdownDescription": "Command to run: a string runs through `/bin/sh -c` (pipes and multi-line scripts work), a list runs the program directly with those arguments. Use exactly one of `run`, `run_script` or `steps`."
|
|
2646
2708
|
},
|
|
2647
2709
|
"run_script": {
|
|
2648
2710
|
"anyOf": [
|
|
2649
2711
|
{
|
|
2650
|
-
"$ref": "#/$defs/RunScript"
|
|
2712
|
+
"$ref": "#/$defs/RunScript",
|
|
2713
|
+
"description": "",
|
|
2714
|
+
"examples": [],
|
|
2715
|
+
"markdownDescription": ""
|
|
2651
2716
|
},
|
|
2652
2717
|
{
|
|
2653
2718
|
"type": "null"
|
|
2654
2719
|
}
|
|
2655
2720
|
],
|
|
2656
|
-
"description": "Script
|
|
2721
|
+
"description": "Script to run from a project file, as `{ file, name }`, such as `{ file: apps/api/package.json, name: migrate }`. It runs with that file's tool (the project's package manager for package.json) in the file's directory, and a missing script fails before anything starts. Prefer it to `run` for scripts that live in a file. Use exactly one of `run`, `run_script` or `steps`.",
|
|
2657
2722
|
"examples": [
|
|
2658
|
-
"apps/api/package.json#dev",
|
|
2659
2723
|
{
|
|
2660
|
-
"
|
|
2661
|
-
"
|
|
2724
|
+
"file": "apps/api/package.json",
|
|
2725
|
+
"name": "dev"
|
|
2726
|
+
},
|
|
2727
|
+
{
|
|
2728
|
+
"file": "justfile",
|
|
2729
|
+
"name": "fixtures"
|
|
2662
2730
|
}
|
|
2663
|
-
]
|
|
2731
|
+
],
|
|
2732
|
+
"markdownDescription": "Script to run from a project file, as `{ file, name }`, such as `{ file: apps/api/package.json, name: migrate }`. It runs with that file's tool (the project's package manager for package.json) in the file's directory, and a missing script fails before anything starts. Prefer it to `run` for scripts that live in a file. Use exactly one of `run`, `run_script` or `steps`."
|
|
2664
2733
|
},
|
|
2665
2734
|
"steps": {
|
|
2666
|
-
"description": "
|
|
2735
|
+
"description": "Run these tasks and `infra.setup.<name>` or `infra.teardown.<name>` entries in order, stopping at the first failure, for jobs such as resetting a database. Each step runs whatever its own `when` says, and setup entries run again even when already done. Use instead of `run` or `run_script`.",
|
|
2667
2736
|
"examples": [
|
|
2668
2737
|
[
|
|
2669
2738
|
"infra.teardown.database",
|
|
@@ -2673,15 +2742,17 @@
|
|
|
2673
2742
|
]
|
|
2674
2743
|
],
|
|
2675
2744
|
"items": {
|
|
2676
|
-
"description": "
|
|
2745
|
+
"description": "Run these tasks and `infra.setup.<name>` or `infra.teardown.<name>` entries in order, stopping at the first failure, for jobs such as resetting a database. Each step runs whatever its own `when` says, and setup entries run again even when already done. Use instead of `run` or `run_script`.",
|
|
2677
2746
|
"examples": [
|
|
2678
2747
|
"infra.teardown.database",
|
|
2679
2748
|
"infra.setup.database",
|
|
2680
2749
|
"migrate",
|
|
2681
2750
|
"seed"
|
|
2682
2751
|
],
|
|
2752
|
+
"markdownDescription": "Run these tasks and `infra.setup.<name>` or `infra.teardown.<name>` entries in order, stopping at the first failure, for jobs such as resetting a database. Each step runs whatever its own `when` says, and setup entries run again even when already done. Use instead of `run` or `run_script`.",
|
|
2683
2753
|
"type": "string"
|
|
2684
2754
|
},
|
|
2755
|
+
"markdownDescription": "Run these tasks and `infra.setup.<name>` or `infra.teardown.<name>` entries in order, stopping at the first failure, for jobs such as resetting a database. Each step runs whatever its own `when` says, and setup entries run again even when already done. Use instead of `run` or `run_script`.",
|
|
2685
2756
|
"type": [
|
|
2686
2757
|
"array",
|
|
2687
2758
|
"null"
|
|
@@ -2690,276 +2761,235 @@
|
|
|
2690
2761
|
"timeout": {
|
|
2691
2762
|
"anyOf": [
|
|
2692
2763
|
{
|
|
2693
|
-
"$ref": "#/$defs/Templated_ConfigDuration"
|
|
2764
|
+
"$ref": "#/$defs/Templated_ConfigDuration",
|
|
2765
|
+
"description": "",
|
|
2766
|
+
"examples": [],
|
|
2767
|
+
"markdownDescription": ""
|
|
2694
2768
|
},
|
|
2695
2769
|
{
|
|
2696
2770
|
"type": "null"
|
|
2697
2771
|
}
|
|
2698
2772
|
],
|
|
2699
|
-
"description": "
|
|
2773
|
+
"description": "Longest the task may run. When it runs out, the task is stopped (SIGTERM, then SIGKILL after 10 seconds) and counts as failed; a failed task that runs before services fails the start. No limit by default.",
|
|
2700
2774
|
"examples": [
|
|
2701
2775
|
"15s",
|
|
2702
2776
|
"10m"
|
|
2703
|
-
]
|
|
2777
|
+
],
|
|
2778
|
+
"markdownDescription": "Longest the task may run. When it runs out, the task is stopped (SIGTERM, then SIGKILL after 10 seconds) and counts as failed; a failed task that runs before services fails the start. No limit by default."
|
|
2704
2779
|
},
|
|
2705
2780
|
"when": {
|
|
2706
2781
|
"anyOf": [
|
|
2707
2782
|
{
|
|
2708
|
-
"$ref": "#/$defs/TaskWhen"
|
|
2783
|
+
"$ref": "#/$defs/TaskWhen",
|
|
2784
|
+
"description": "",
|
|
2785
|
+
"examples": [],
|
|
2786
|
+
"markdownDescription": ""
|
|
2709
2787
|
},
|
|
2710
2788
|
{
|
|
2711
2789
|
"type": "null"
|
|
2712
2790
|
}
|
|
2713
2791
|
],
|
|
2714
|
-
"description": "
|
|
2792
|
+
"description": "Lane event that runs this task automatically. Without it the task runs only by hand with `devlanes run <name>` or as a step of another task.",
|
|
2715
2793
|
"examples": [
|
|
2716
2794
|
"lane.create",
|
|
2717
2795
|
"lane.start",
|
|
2718
2796
|
"lane.stop",
|
|
2719
2797
|
"lane.clean"
|
|
2720
|
-
]
|
|
2798
|
+
],
|
|
2799
|
+
"markdownDescription": "Lane event that runs this task automatically. Without it the task runs only by hand with `devlanes run <name>` or as a step of another task."
|
|
2721
2800
|
}
|
|
2722
2801
|
},
|
|
2723
2802
|
"type": "object"
|
|
2724
2803
|
},
|
|
2725
2804
|
"TaskWhen": {
|
|
2726
|
-
"description": "
|
|
2805
|
+
"description": "Lane event that runs a task automatically.",
|
|
2806
|
+
"enum": [
|
|
2807
|
+
"lane.create",
|
|
2808
|
+
"lane.start",
|
|
2809
|
+
"lane.stop",
|
|
2810
|
+
"lane.clean"
|
|
2811
|
+
],
|
|
2812
|
+
"enumDescriptions": [
|
|
2813
|
+
"Run on each start until it has succeeded once for the lane, then no longer automatically; for installs, code generation and a first seed.",
|
|
2814
|
+
"Run on every start of the lane, before services unless `after: services` is set; for migrations and other steps that are safe to repeat.",
|
|
2815
|
+
"Run before the lane's processes stop when the whole lane stops: `devlanes stop` without unit names, `devlanes daemon stop` and `daemon restart`. Skipped when a signal (logout, system shutdown) stops the daemon.",
|
|
2816
|
+
"Run when the lane is cleaned (`devlanes lane clean`), after its processes stop and before `infra.teardown`."
|
|
2817
|
+
],
|
|
2727
2818
|
"examples": [
|
|
2728
2819
|
"lane.create",
|
|
2729
2820
|
"lane.start",
|
|
2730
2821
|
"lane.stop",
|
|
2731
2822
|
"lane.clean"
|
|
2732
2823
|
],
|
|
2733
|
-
"
|
|
2734
|
-
|
|
2735
|
-
|
|
2736
|
-
|
|
2737
|
-
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
},
|
|
2742
|
-
{
|
|
2743
|
-
"const": "lane.start",
|
|
2744
|
-
"description": "Run each time the lane starts.",
|
|
2745
|
-
"examples": [
|
|
2746
|
-
"lane.start"
|
|
2747
|
-
],
|
|
2748
|
-
"type": "string"
|
|
2749
|
-
},
|
|
2750
|
-
{
|
|
2751
|
-
"const": "lane.stop",
|
|
2752
|
-
"description": "Run when the whole lane stops, on `devlanes daemon stop` and on `daemon restart`; skipped when a signal (logout, system shutdown) stops the daemon.",
|
|
2753
|
-
"examples": [
|
|
2754
|
-
"lane.stop"
|
|
2755
|
-
],
|
|
2756
|
-
"type": "string"
|
|
2757
|
-
},
|
|
2758
|
-
{
|
|
2759
|
-
"const": "lane.clean",
|
|
2760
|
-
"description": "Run during lane cleanup before infrastructure teardown.",
|
|
2761
|
-
"examples": [
|
|
2762
|
-
"lane.clean"
|
|
2763
|
-
],
|
|
2764
|
-
"type": "string"
|
|
2765
|
-
}
|
|
2766
|
-
]
|
|
2824
|
+
"markdownDescription": "Lane event that runs a task automatically.",
|
|
2825
|
+
"markdownEnumDescriptions": [
|
|
2826
|
+
"Run on each start until it has succeeded once for the lane, then no longer automatically; for installs, code generation and a first seed.",
|
|
2827
|
+
"Run on every start of the lane, before services unless `after: services` is set; for migrations and other steps that are safe to repeat.",
|
|
2828
|
+
"Run before the lane's processes stop when the whole lane stops: `devlanes stop` without unit names, `devlanes daemon stop` and `daemon restart`. Skipped when a signal (logout, system shutdown) stops the daemon.",
|
|
2829
|
+
"Run when the lane is cleaned (`devlanes lane clean`), after its processes stop and before `infra.teardown`."
|
|
2830
|
+
],
|
|
2831
|
+
"type": "string"
|
|
2767
2832
|
},
|
|
2768
2833
|
"TcpReady": {
|
|
2769
2834
|
"anyOf": [
|
|
2770
2835
|
{
|
|
2771
|
-
"description": "Set true to probe the unit's primary port; false is invalid.",
|
|
2772
|
-
"examples": [
|
|
2773
|
-
true
|
|
2774
|
-
],
|
|
2775
2836
|
"type": "boolean"
|
|
2776
2837
|
},
|
|
2777
2838
|
{
|
|
2778
|
-
"description": "Probe a named extra port instead of the primary port.",
|
|
2779
|
-
"examples": [
|
|
2780
|
-
"inspector"
|
|
2781
|
-
],
|
|
2782
2839
|
"type": "string"
|
|
2783
2840
|
}
|
|
2784
2841
|
],
|
|
2785
|
-
"description": "
|
|
2842
|
+
"description": "Port a `tcp` readiness check connects to: `true` for the main port, or a port name.",
|
|
2786
2843
|
"examples": [
|
|
2787
2844
|
true,
|
|
2788
2845
|
"inspector"
|
|
2789
|
-
]
|
|
2846
|
+
],
|
|
2847
|
+
"markdownDescription": "Port a `tcp` readiness check connects to: `true` for the main port, or a port name."
|
|
2790
2848
|
},
|
|
2791
2849
|
"Templated_ConfigDuration": {
|
|
2792
2850
|
"anyOf": [
|
|
2793
2851
|
{
|
|
2794
2852
|
"$ref": "#/$defs/ConfigDuration",
|
|
2795
|
-
"description": "
|
|
2853
|
+
"description": "",
|
|
2854
|
+
"examples": [],
|
|
2855
|
+
"markdownDescription": ""
|
|
2796
2856
|
},
|
|
2797
2857
|
{
|
|
2798
|
-
"description": "Text containing `${{ ... }}`, evaluated for each lane; write `${{ '${{' }}` for a literal `${{`.",
|
|
2799
|
-
"examples": [
|
|
2800
|
-
"${{ lane.index }}"
|
|
2801
|
-
],
|
|
2802
2858
|
"pattern": "\\$\\{\\{",
|
|
2803
2859
|
"type": "string"
|
|
2804
2860
|
}
|
|
2805
2861
|
],
|
|
2806
|
-
"description": "A
|
|
2862
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
2807
2863
|
"examples": [
|
|
2808
2864
|
"${{ lane.index }}"
|
|
2809
|
-
]
|
|
2865
|
+
],
|
|
2866
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
2810
2867
|
},
|
|
2811
2868
|
"Templated_Scalar": {
|
|
2812
2869
|
"anyOf": [
|
|
2813
2870
|
{
|
|
2814
2871
|
"$ref": "#/$defs/Scalar",
|
|
2815
|
-
"description": "
|
|
2872
|
+
"description": "",
|
|
2873
|
+
"examples": [],
|
|
2874
|
+
"markdownDescription": ""
|
|
2816
2875
|
},
|
|
2817
2876
|
{
|
|
2818
|
-
"description": "Text containing `${{ ... }}`, evaluated for each lane; write `${{ '${{' }}` for a literal `${{`.",
|
|
2819
|
-
"examples": [
|
|
2820
|
-
"${{ lane.index }}"
|
|
2821
|
-
],
|
|
2822
2877
|
"pattern": "\\$\\{\\{",
|
|
2823
2878
|
"type": "string"
|
|
2824
2879
|
}
|
|
2825
2880
|
],
|
|
2826
|
-
"description": "A
|
|
2881
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
2827
2882
|
"examples": [
|
|
2828
2883
|
"${{ lane.index }}"
|
|
2829
|
-
]
|
|
2884
|
+
],
|
|
2885
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
2830
2886
|
},
|
|
2831
2887
|
"Templated_boolean": {
|
|
2832
2888
|
"anyOf": [
|
|
2833
2889
|
{
|
|
2834
|
-
"description": "Literal value used without expression evaluation.",
|
|
2835
2890
|
"type": "boolean"
|
|
2836
2891
|
},
|
|
2837
2892
|
{
|
|
2838
|
-
"description": "Text containing `${{ ... }}`, evaluated for each lane; write `${{ '${{' }}` for a literal `${{`.",
|
|
2839
|
-
"examples": [
|
|
2840
|
-
"${{ lane.index }}"
|
|
2841
|
-
],
|
|
2842
2893
|
"pattern": "\\$\\{\\{",
|
|
2843
2894
|
"type": "string"
|
|
2844
2895
|
}
|
|
2845
2896
|
],
|
|
2846
|
-
"description": "A
|
|
2897
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
2847
2898
|
"examples": [
|
|
2848
2899
|
"${{ lane.index }}"
|
|
2849
|
-
]
|
|
2900
|
+
],
|
|
2901
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
2850
2902
|
},
|
|
2851
2903
|
"Templated_string": {
|
|
2852
2904
|
"anyOf": [
|
|
2853
2905
|
{
|
|
2854
|
-
"description": "Literal value used without expression evaluation.",
|
|
2855
2906
|
"type": "string"
|
|
2856
2907
|
},
|
|
2857
2908
|
{
|
|
2858
|
-
"description": "Text containing `${{ ... }}`, evaluated for each lane; write `${{ '${{' }}` for a literal `${{`.",
|
|
2859
|
-
"examples": [
|
|
2860
|
-
"${{ lane.index }}"
|
|
2861
|
-
],
|
|
2862
2909
|
"pattern": "\\$\\{\\{",
|
|
2863
2910
|
"type": "string"
|
|
2864
2911
|
}
|
|
2865
2912
|
],
|
|
2866
|
-
"description": "A
|
|
2913
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
2867
2914
|
"examples": [
|
|
2868
2915
|
"${{ lane.index }}"
|
|
2869
|
-
]
|
|
2916
|
+
],
|
|
2917
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
2870
2918
|
},
|
|
2871
2919
|
"Templated_uint16": {
|
|
2872
2920
|
"anyOf": [
|
|
2873
2921
|
{
|
|
2874
|
-
"description": "Literal value used without expression evaluation.",
|
|
2875
2922
|
"format": "uint16",
|
|
2876
2923
|
"maximum": 65535,
|
|
2877
2924
|
"minimum": 0,
|
|
2878
2925
|
"type": "integer"
|
|
2879
2926
|
},
|
|
2880
2927
|
{
|
|
2881
|
-
"description": "Text containing `${{ ... }}`, evaluated for each lane; write `${{ '${{' }}` for a literal `${{`.",
|
|
2882
|
-
"examples": [
|
|
2883
|
-
"${{ lane.index }}"
|
|
2884
|
-
],
|
|
2885
2928
|
"pattern": "\\$\\{\\{",
|
|
2886
2929
|
"type": "string"
|
|
2887
2930
|
}
|
|
2888
2931
|
],
|
|
2889
|
-
"description": "A
|
|
2932
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
2890
2933
|
"examples": [
|
|
2891
2934
|
"${{ lane.index }}"
|
|
2892
|
-
]
|
|
2935
|
+
],
|
|
2936
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
2893
2937
|
},
|
|
2894
2938
|
"Templated_uint32": {
|
|
2895
2939
|
"anyOf": [
|
|
2896
2940
|
{
|
|
2897
|
-
"description": "Literal value used without expression evaluation.",
|
|
2898
2941
|
"format": "uint32",
|
|
2899
2942
|
"minimum": 0,
|
|
2900
2943
|
"type": "integer"
|
|
2901
2944
|
},
|
|
2902
2945
|
{
|
|
2903
|
-
"description": "Text containing `${{ ... }}`, evaluated for each lane; write `${{ '${{' }}` for a literal `${{`.",
|
|
2904
|
-
"examples": [
|
|
2905
|
-
"${{ lane.index }}"
|
|
2906
|
-
],
|
|
2907
2946
|
"pattern": "\\$\\{\\{",
|
|
2908
2947
|
"type": "string"
|
|
2909
2948
|
}
|
|
2910
2949
|
],
|
|
2911
|
-
"description": "A
|
|
2950
|
+
"description": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`.",
|
|
2912
2951
|
"examples": [
|
|
2913
2952
|
"${{ lane.index }}"
|
|
2914
|
-
]
|
|
2953
|
+
],
|
|
2954
|
+
"markdownDescription": "A plain value or text with `${{ ... }}` expressions, evaluated for each lane with names such as `lane`, `self`, `services`, `infra` and `env`. A value that is one whole expression keeps its type, which must fit the setting. Write `${{ '${{' }}` for a literal `${{`."
|
|
2915
2955
|
}
|
|
2916
2956
|
},
|
|
2917
2957
|
"$id": "https://devlanes.run/v1/schema.json",
|
|
2918
2958
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
2919
2959
|
"additionalProperties": false,
|
|
2920
|
-
"description": "
|
|
2960
|
+
"description": "devlanes v0.4.0 project config. Run a dev environment per git worktree, side by side. https://devlanes.run",
|
|
2921
2961
|
"examples": [
|
|
2922
2962
|
{
|
|
2923
2963
|
"project": "acme",
|
|
2924
2964
|
"services": {
|
|
2925
2965
|
"api": {
|
|
2926
|
-
"run_script":
|
|
2966
|
+
"run_script": {
|
|
2967
|
+
"file": "apps/api/package.json",
|
|
2968
|
+
"name": "dev"
|
|
2969
|
+
}
|
|
2927
2970
|
}
|
|
2928
2971
|
}
|
|
2929
2972
|
}
|
|
2930
2973
|
],
|
|
2974
|
+
"markdownDescription": "devlanes v0.4.0 project config. Run a dev environment per git worktree, side by side. https://devlanes.run",
|
|
2931
2975
|
"properties": {
|
|
2932
|
-
"fnox": {
|
|
2933
|
-
"anyOf": [
|
|
2934
|
-
{
|
|
2935
|
-
"$ref": "#/$defs/FnoxConfig"
|
|
2936
|
-
},
|
|
2937
|
-
{
|
|
2938
|
-
"type": "null"
|
|
2939
|
-
}
|
|
2940
|
-
],
|
|
2941
|
-
"description": "Project-wide fnox profile for secrets resolved by the runtime.",
|
|
2942
|
-
"examples": [
|
|
2943
|
-
{
|
|
2944
|
-
"profile": "dev"
|
|
2945
|
-
}
|
|
2946
|
-
]
|
|
2947
|
-
},
|
|
2948
2976
|
"global_env": {
|
|
2949
2977
|
"additionalProperties": {
|
|
2950
2978
|
"$ref": "#/$defs/Templated_Scalar",
|
|
2951
|
-
"description": "
|
|
2979
|
+
"description": "Variables for every service and task of the lane, above devlanes' own variables (`PORT`, `DEVLANES_*`) and below each unit's `env` and the profile's `env`. Use it for values many units share, such as a database URL built from `${{ infra.postgres.port }}`. Never set `PORT` here: it would replace every service's own port.",
|
|
2952
2980
|
"examples": [
|
|
2953
|
-
"${{
|
|
2954
|
-
]
|
|
2981
|
+
"${{ services.api.url }}"
|
|
2982
|
+
],
|
|
2983
|
+
"markdownDescription": "Variables for every service and task of the lane, above devlanes' own variables (`PORT`, `DEVLANES_*`) and below each unit's `env` and the profile's `env`. Use it for values many units share, such as a database URL built from `${{ infra.postgres.port }}`. Never set `PORT` here: it would replace every service's own port."
|
|
2955
2984
|
},
|
|
2956
2985
|
"default": {},
|
|
2957
|
-
"description": "
|
|
2986
|
+
"description": "Variables for every service and task of the lane, above devlanes' own variables (`PORT`, `DEVLANES_*`) and below each unit's `env` and the profile's `env`. Use it for values many units share, such as a database URL built from `${{ infra.postgres.port }}`. Never set `PORT` here: it would replace every service's own port.",
|
|
2958
2987
|
"examples": [
|
|
2959
2988
|
{
|
|
2960
|
-
"API_URL": "${{
|
|
2989
|
+
"API_URL": "${{ services.api.url }}"
|
|
2961
2990
|
}
|
|
2962
2991
|
],
|
|
2992
|
+
"markdownDescription": "Variables for every service and task of the lane, above devlanes' own variables (`PORT`, `DEVLANES_*`) and below each unit's `env` and the profile's `env`. Use it for values many units share, such as a database URL built from `${{ infra.postgres.port }}`. Never set `PORT` here: it would replace every service's own port.",
|
|
2963
2993
|
"type": "object"
|
|
2964
2994
|
},
|
|
2965
2995
|
"infra": {
|
|
@@ -2977,7 +3007,7 @@
|
|
|
2977
3007
|
"setup": {},
|
|
2978
3008
|
"teardown": {}
|
|
2979
3009
|
},
|
|
2980
|
-
"description": "
|
|
3010
|
+
"description": "Containers the lanes depend on (databases, brokers, object stores), started and waited on before setup, tasks and services, plus the commands that create and remove each lane's data in them.",
|
|
2981
3011
|
"examples": [
|
|
2982
3012
|
{
|
|
2983
3013
|
"compose": "docker-compose.yml",
|
|
@@ -2985,7 +3015,8 @@
|
|
|
2985
3015
|
"postgres"
|
|
2986
3016
|
]
|
|
2987
3017
|
}
|
|
2988
|
-
]
|
|
3018
|
+
],
|
|
3019
|
+
"markdownDescription": "Containers the lanes depend on (databases, brokers, object stores), started and waited on before setup, tasks and services, plus the commands that create and remove each lane's data in them."
|
|
2989
3020
|
},
|
|
2990
3021
|
"lanes": {
|
|
2991
3022
|
"$ref": "#/$defs/LanesConfig",
|
|
@@ -3000,7 +3031,7 @@
|
|
|
3000
3031
|
"vars": {},
|
|
3001
3032
|
"worktree_dir": null
|
|
3002
3033
|
},
|
|
3003
|
-
"description": "
|
|
3034
|
+
"description": "Which worktrees get a lane, where new worktrees are created, how many ports each lane reserves, and values computed per lane (`lane.<name>`).",
|
|
3004
3035
|
"examples": [
|
|
3005
3036
|
{
|
|
3006
3037
|
"hosts_file": "always",
|
|
@@ -3009,12 +3040,13 @@
|
|
|
3009
3040
|
"db_name": "acme_${{ lane.name }}"
|
|
3010
3041
|
}
|
|
3011
3042
|
}
|
|
3012
|
-
]
|
|
3043
|
+
],
|
|
3044
|
+
"markdownDescription": "Which worktrees get a lane, where new worktrees are created, how many ports each lane reserves, and values computed per lane (`lane.<name>`)."
|
|
3013
3045
|
},
|
|
3014
3046
|
"profiles": {
|
|
3015
3047
|
"additionalProperties": {
|
|
3016
3048
|
"$ref": "#/$defs/ProfileConfig",
|
|
3017
|
-
"description": "
|
|
3049
|
+
"description": "Services started by `devlanes start --profile <name>` (`default` when no profile is given): a list of names, globs and `+tag` selectors, or a mapping that can also exclude services, skip infra, add `env` and remap script names. Several `--profile` flags start the union.",
|
|
3018
3050
|
"examples": [
|
|
3019
3051
|
[
|
|
3020
3052
|
"+api",
|
|
@@ -3026,10 +3058,11 @@
|
|
|
3026
3058
|
],
|
|
3027
3059
|
"infra": false
|
|
3028
3060
|
}
|
|
3029
|
-
]
|
|
3061
|
+
],
|
|
3062
|
+
"markdownDescription": "Services started by `devlanes start --profile <name>` (`default` when no profile is given): a list of names, globs and `+tag` selectors, or a mapping that can also exclude services, skip infra, add `env` and remap script names. Several `--profile` flags start the union."
|
|
3030
3063
|
},
|
|
3031
3064
|
"default": {},
|
|
3032
|
-
"description": "Named
|
|
3065
|
+
"description": "Named selections of services for `devlanes start --profile <name>`; `default` is used when no profile is given. A profile is a list of names, globs and `+tag` selectors, or a mapping that can also exclude services, skip infra, add `env` and remap script names.",
|
|
3033
3066
|
"examples": [
|
|
3034
3067
|
{
|
|
3035
3068
|
"default": [
|
|
@@ -3046,58 +3079,65 @@
|
|
|
3046
3079
|
}
|
|
3047
3080
|
}
|
|
3048
3081
|
],
|
|
3082
|
+
"markdownDescription": "Named selections of services for `devlanes start --profile <name>`; `default` is used when no profile is given. A profile is a list of names, globs and `+tag` selectors, or a mapping that can also exclude services, skip infra, add `env` and remap script names.",
|
|
3049
3083
|
"type": "object"
|
|
3050
3084
|
},
|
|
3051
3085
|
"project": {
|
|
3052
|
-
"description": "Project
|
|
3086
|
+
"description": "Project name, the same in every worktree of the repository. It builds each lane's default domain (`<project>.localhost` for lane 0, `<project>-<N>.localhost` for lane N), names lanes in commands (`acme@2`), the containers devlanes creates and `DEVLANES_PROJECT`, and other projects reach this one as `projects.<project>`. Lowercase letters, digits, dots, underscores and dashes.",
|
|
3053
3087
|
"examples": [
|
|
3054
3088
|
"acme"
|
|
3055
3089
|
],
|
|
3090
|
+
"markdownDescription": "Project name, the same in every worktree of the repository. It builds each lane's default domain (`<project>.localhost` for lane 0, `<project>-<N>.localhost` for lane N), names lanes in commands (`acme@2`), the containers devlanes creates and `DEVLANES_PROJECT`, and other projects reach this one as `projects.<project>`. Lowercase letters, digits, dots, underscores and dashes.",
|
|
3056
3091
|
"type": "string"
|
|
3057
3092
|
},
|
|
3058
3093
|
"services": {
|
|
3059
3094
|
"additionalProperties": {
|
|
3060
3095
|
"$ref": "#/$defs/ServiceConfig",
|
|
3061
|
-
"description": "
|
|
3096
|
+
"description": "A long-running process started with the lane, such as a dev server or a worker. Each service gets its own port from the lane's block (`PORT`, `${{ self.port }}`); devlanes stops it with the lane and never restarts it when it exits. A service needs `run` or `run_script`, directly or through `extends`.",
|
|
3062
3097
|
"examples": [
|
|
3063
3098
|
{
|
|
3064
|
-
"hosts":
|
|
3065
|
-
|
|
3066
|
-
|
|
3067
|
-
|
|
3099
|
+
"hosts": "api.${{ lane.domain }}",
|
|
3100
|
+
"run_script": {
|
|
3101
|
+
"file": "apps/api/package.json",
|
|
3102
|
+
"name": "dev"
|
|
3103
|
+
},
|
|
3068
3104
|
"tags": [
|
|
3069
3105
|
"api"
|
|
3070
3106
|
]
|
|
3071
3107
|
}
|
|
3072
|
-
]
|
|
3108
|
+
],
|
|
3109
|
+
"markdownDescription": "A long-running process started with the lane, such as a dev server or a worker. Each service gets its own port from the lane's block (`PORT`, `${{ self.port }}`); devlanes stops it with the lane and never restarts it when it exits. A service needs `run` or `run_script`, directly or through `extends`."
|
|
3073
3110
|
},
|
|
3074
3111
|
"default": {},
|
|
3075
|
-
"description": "Long-running processes started together after infrastructure and
|
|
3112
|
+
"description": "Long-running processes of each lane, started together after infrastructure, setup and `lane.start` tasks. Each service gets its own port as `PORT` and, with `hosts`, HTTPS hostnames. A service that exits shows as failed and is not restarted.",
|
|
3076
3113
|
"examples": [
|
|
3077
3114
|
{
|
|
3078
3115
|
"api": {
|
|
3079
|
-
"hosts":
|
|
3080
|
-
|
|
3081
|
-
|
|
3082
|
-
|
|
3116
|
+
"hosts": "api.${{ lane.domain }}",
|
|
3117
|
+
"run_script": {
|
|
3118
|
+
"file": "apps/api/package.json",
|
|
3119
|
+
"name": "dev"
|
|
3120
|
+
}
|
|
3083
3121
|
}
|
|
3084
3122
|
}
|
|
3085
3123
|
],
|
|
3124
|
+
"markdownDescription": "Long-running processes of each lane, started together after infrastructure, setup and `lane.start` tasks. Each service gets its own port as `PORT` and, with `hosts`, HTTPS hostnames. A service that exits shows as failed and is not restarted.",
|
|
3086
3125
|
"type": "object"
|
|
3087
3126
|
},
|
|
3088
3127
|
"tags": {
|
|
3089
3128
|
"additionalProperties": {
|
|
3090
3129
|
"$ref": "#/$defs/TagConfig",
|
|
3091
|
-
"description": "
|
|
3130
|
+
"description": "Settings for one tag used in `services.<name>.tags`. Declaring a tag here is optional: services can use any tag and `+tag` selectors work without it. Declare one to pin its color or describe it.",
|
|
3092
3131
|
"examples": [
|
|
3093
3132
|
{
|
|
3094
3133
|
"color": "cyan",
|
|
3095
3134
|
"description": "HTTP APIs"
|
|
3096
3135
|
}
|
|
3097
|
-
]
|
|
3136
|
+
],
|
|
3137
|
+
"markdownDescription": "Settings for one tag used in `services.<name>.tags`. Declaring a tag here is optional: services can use any tag and `+tag` selectors work without it. Declare one to pin its color or describe it."
|
|
3098
3138
|
},
|
|
3099
3139
|
"default": {},
|
|
3100
|
-
"description": "
|
|
3140
|
+
"description": "Optional color and description per tag. Services list their tags in their own `tags`, and tags group them: `+api` selects every service tagged `api` in profiles and in commands such as `devlanes start +api`. A unit's color comes from the first of its tags with a `color` set here, else the first tag naming a category such as api, web, worker or db, else its preset or name. Tags not listed here work too.",
|
|
3101
3141
|
"examples": [
|
|
3102
3142
|
{
|
|
3103
3143
|
"api": {
|
|
@@ -3106,49 +3146,60 @@
|
|
|
3106
3146
|
}
|
|
3107
3147
|
}
|
|
3108
3148
|
],
|
|
3149
|
+
"markdownDescription": "Optional color and description per tag. Services list their tags in their own `tags`, and tags group them: `+api` selects every service tagged `api` in profiles and in commands such as `devlanes start +api`. A unit's color comes from the first of its tags with a `color` set here, else the first tag naming a category such as api, web, worker or db, else its preset or name. Tags not listed here work too.",
|
|
3109
3150
|
"type": "object"
|
|
3110
3151
|
},
|
|
3111
3152
|
"tasks": {
|
|
3112
3153
|
"additionalProperties": {
|
|
3113
3154
|
"$ref": "#/$defs/TaskConfig",
|
|
3114
|
-
"description": "
|
|
3155
|
+
"description": "A one-shot command, run by hand with `devlanes run <name>` or automatically at a lane event set with `when`. Anything that ends by itself belongs here, not in `services`, where an exit counts as a failure.",
|
|
3115
3156
|
"examples": [
|
|
3116
3157
|
{
|
|
3117
|
-
"run_script":
|
|
3158
|
+
"run_script": {
|
|
3159
|
+
"file": "apps/api/package.json",
|
|
3160
|
+
"name": "migrate"
|
|
3161
|
+
},
|
|
3118
3162
|
"when": "lane.start"
|
|
3119
3163
|
}
|
|
3120
|
-
]
|
|
3164
|
+
],
|
|
3165
|
+
"markdownDescription": "A one-shot command, run by hand with `devlanes run <name>` or automatically at a lane event set with `when`. Anything that ends by itself belongs here, not in `services`, where an exit counts as a failure."
|
|
3121
3166
|
},
|
|
3122
3167
|
"default": {},
|
|
3123
|
-
"description": "One-shot commands
|
|
3168
|
+
"description": "One-shot commands such as installs, migrations and seeds, run by hand with `devlanes run <name>` or automatically at a lane event set with `when`. Tasks of the same event run in declaration order.",
|
|
3124
3169
|
"examples": [
|
|
3125
3170
|
{
|
|
3126
3171
|
"migrate": {
|
|
3127
|
-
"run_script":
|
|
3172
|
+
"run_script": {
|
|
3173
|
+
"file": "apps/api/package.json",
|
|
3174
|
+
"name": "migrate"
|
|
3175
|
+
},
|
|
3128
3176
|
"when": "lane.start"
|
|
3129
3177
|
}
|
|
3130
3178
|
}
|
|
3131
3179
|
],
|
|
3180
|
+
"markdownDescription": "One-shot commands such as installs, migrations and seeds, run by hand with `devlanes run <name>` or automatically at a lane event set with `when`. Tasks of the same event run in declaration order.",
|
|
3132
3181
|
"type": "object"
|
|
3133
3182
|
},
|
|
3134
3183
|
"templates": {
|
|
3135
3184
|
"additionalProperties": {
|
|
3136
3185
|
"$ref": "#/$defs/ServiceConfig",
|
|
3137
|
-
"description": "
|
|
3186
|
+
"description": "A long-running process started with the lane, such as a dev server or a worker. Each service gets its own port from the lane's block (`PORT`, `${{ self.port }}`); devlanes stops it with the lane and never restarts it when it exits. A service needs `run` or `run_script`, directly or through `extends`.",
|
|
3138
3187
|
"examples": [
|
|
3139
3188
|
{
|
|
3140
|
-
"hosts":
|
|
3141
|
-
|
|
3142
|
-
|
|
3143
|
-
|
|
3189
|
+
"hosts": "api.${{ lane.domain }}",
|
|
3190
|
+
"run_script": {
|
|
3191
|
+
"file": "apps/api/package.json",
|
|
3192
|
+
"name": "dev"
|
|
3193
|
+
},
|
|
3144
3194
|
"tags": [
|
|
3145
3195
|
"api"
|
|
3146
3196
|
]
|
|
3147
3197
|
}
|
|
3148
|
-
]
|
|
3198
|
+
],
|
|
3199
|
+
"markdownDescription": "A long-running process started with the lane, such as a dev server or a worker. Each service gets its own port from the lane's block (`PORT`, `${{ self.port }}`); devlanes stops it with the lane and never restarts it when it exits. A service needs `run` or `run_script`, directly or through `extends`."
|
|
3149
3200
|
},
|
|
3150
3201
|
"default": {},
|
|
3151
|
-
"description": "
|
|
3202
|
+
"description": "Named service settings that services reuse with `extends: <template>`. The service inherits every setting of the template and its own settings win: mappings (`env`, `ready`, `stop`, preset options, `run_script`) merge by key, lists (`tags`, `hosts`, `sync`) and single values replace. Setting `run` or `run_script` drops the inherited other one, and one `ready` probe (`tcp`, `http`, `log`, `cmd`) drops the inherited probe. Templates may extend other templates, are never started themselves, and are applied after `devlanes.local.yaml` is merged.",
|
|
3152
3203
|
"examples": [
|
|
3153
3204
|
{
|
|
3154
3205
|
"fastify-api": {
|
|
@@ -3164,9 +3215,9 @@
|
|
|
3164
3215
|
}
|
|
3165
3216
|
}
|
|
3166
3217
|
],
|
|
3218
|
+
"markdownDescription": "Named service settings that services reuse with `extends: <template>`. The service inherits every setting of the template and its own settings win: mappings (`env`, `ready`, `stop`, preset options, `run_script`) merge by key, lists (`tags`, `hosts`, `sync`) and single values replace. Setting `run` or `run_script` drops the inherited other one, and one `ready` probe (`tcp`, `http`, `log`, `cmd`) drops the inherited probe. Templates may extend other templates, are never started themselves, and are applied after `devlanes.local.yaml` is merged.",
|
|
3167
3219
|
"type": "object"
|
|
3168
3220
|
}
|
|
3169
3221
|
},
|
|
3170
|
-
"title": "devlanes",
|
|
3171
3222
|
"type": "object"
|
|
3172
3223
|
}
|