devlanes 0.3.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/bin/devlanes +21 -10
- package/package.json +7 -5
- package/schema.json +8 -100
- package/user-schema.json +49 -4
package/bin/devlanes
CHANGED
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
// Runs the native binary from the @devlanes/<platform>-<arch> package that npm
|
|
5
5
|
// installed as an optional dependency. install.js replaces this file with that
|
|
6
6
|
// binary, so it only runs when the postinstall script did not (--ignore-scripts,
|
|
7
|
-
// Yarn) or could not swap it.
|
|
7
|
+
// Yarn, Windows) or could not swap it.
|
|
8
8
|
const { spawn } = require("node:child_process");
|
|
9
9
|
const path = require("node:path");
|
|
10
10
|
|
|
11
|
+
const windows = process.platform === "win32";
|
|
11
12
|
const platform = `${process.platform}-${process.arch}`;
|
|
12
13
|
let binary;
|
|
13
14
|
try {
|
|
14
15
|
const manifest = require.resolve(`@devlanes/${platform}/package.json`);
|
|
15
|
-
binary = path.join(path.dirname(manifest), "bin", "devlanes");
|
|
16
|
+
binary = path.join(path.dirname(manifest), "bin", windows ? "devlanes.exe" : "devlanes");
|
|
16
17
|
} catch {
|
|
17
18
|
console.error(
|
|
18
19
|
`devlanes: no binary installed for ${platform}. Release builds exist for ` +
|
|
19
|
-
"darwin-arm64, darwin-x64, linux-arm64 and linux-x64 (glibc).\n" +
|
|
20
|
+
"darwin-arm64, darwin-x64, linux-arm64 and linux-x64 (glibc), win32-arm64 and win32-x64.\n" +
|
|
20
21
|
"If npm ran with --omit=optional or --no-optional, reinstall without it.",
|
|
21
22
|
);
|
|
22
23
|
process.exit(1);
|
|
@@ -24,12 +25,20 @@ try {
|
|
|
24
25
|
|
|
25
26
|
const child = spawn(binary, process.argv.slice(2), { stdio: "inherit" });
|
|
26
27
|
|
|
27
|
-
|
|
28
|
-
//
|
|
29
|
-
//
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
process.on(signal, () =>
|
|
28
|
+
if (windows) {
|
|
29
|
+
// Ctrl-C, Ctrl-Break and closing the console reach every process attached to
|
|
30
|
+
// the console, the binary included, which handles them itself. The listeners
|
|
31
|
+
// only keep Node from exiting before it; child.kill() would end the binary
|
|
32
|
+
// without notice.
|
|
33
|
+
for (const signal of ["SIGINT", "SIGBREAK", "SIGHUP"]) process.on(signal, () => {});
|
|
34
|
+
} else {
|
|
35
|
+
// The terminal already delivers SIGINT and SIGQUIT to the whole process group,
|
|
36
|
+
// so forwarding them would reach the binary twice. Signals sent only to this
|
|
37
|
+
// wrapper are passed on.
|
|
38
|
+
for (const signal of ["SIGINT", "SIGQUIT"]) process.on(signal, () => {});
|
|
39
|
+
for (const signal of ["SIGTERM", "SIGHUP"]) {
|
|
40
|
+
process.on(signal, () => child.kill(signal));
|
|
41
|
+
}
|
|
33
42
|
}
|
|
34
43
|
|
|
35
44
|
child.on("error", (error) => {
|
|
@@ -37,7 +46,9 @@ child.on("error", (error) => {
|
|
|
37
46
|
process.exit(1);
|
|
38
47
|
});
|
|
39
48
|
child.on("exit", (code, signal) => {
|
|
40
|
-
|
|
49
|
+
// Windows processes end with a code only, such as 0xC000013A after Ctrl-C,
|
|
50
|
+
// which process.exit passes on unchanged.
|
|
51
|
+
if (signal && !windows) {
|
|
41
52
|
process.removeAllListeners(signal);
|
|
42
53
|
process.kill(process.pid, signal);
|
|
43
54
|
return;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devlanes",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Development environments in Git worktree lanes",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://devlanes.run",
|
|
@@ -30,9 +30,11 @@
|
|
|
30
30
|
"node": ">=18"
|
|
31
31
|
},
|
|
32
32
|
"optionalDependencies": {
|
|
33
|
-
"@devlanes/darwin-arm64": "0.
|
|
34
|
-
"@devlanes/darwin-x64": "0.
|
|
35
|
-
"@devlanes/linux-arm64": "0.
|
|
36
|
-
"@devlanes/linux-x64": "0.
|
|
33
|
+
"@devlanes/darwin-arm64": "0.4.0",
|
|
34
|
+
"@devlanes/darwin-x64": "0.4.0",
|
|
35
|
+
"@devlanes/linux-arm64": "0.4.0",
|
|
36
|
+
"@devlanes/linux-x64": "0.4.0",
|
|
37
|
+
"@devlanes/win32-arm64": "0.4.0",
|
|
38
|
+
"@devlanes/win32-x64": "0.4.0"
|
|
37
39
|
}
|
|
38
40
|
}
|
package/schema.json
CHANGED
|
@@ -202,38 +202,6 @@
|
|
|
202
202
|
},
|
|
203
203
|
"type": "object"
|
|
204
204
|
},
|
|
205
|
-
"FnoxConfig": {
|
|
206
|
-
"additionalProperties": false,
|
|
207
|
-
"description": "Which fnox profile secrets come from.",
|
|
208
|
-
"examples": [
|
|
209
|
-
{
|
|
210
|
-
"profile": "dev"
|
|
211
|
-
}
|
|
212
|
-
],
|
|
213
|
-
"markdownDescription": "Which fnox profile secrets come from.",
|
|
214
|
-
"properties": {
|
|
215
|
-
"profile": {
|
|
216
|
-
"anyOf": [
|
|
217
|
-
{
|
|
218
|
-
"$ref": "#/$defs/Templated_string",
|
|
219
|
-
"description": "",
|
|
220
|
-
"examples": [],
|
|
221
|
-
"markdownDescription": ""
|
|
222
|
-
},
|
|
223
|
-
{
|
|
224
|
-
"type": "null"
|
|
225
|
-
}
|
|
226
|
-
],
|
|
227
|
-
"description": "fnox profile whose secrets are loaded; fnox's default profile when omitted. Locked secrets are unlocked with `devlanes secrets unlock`.",
|
|
228
|
-
"examples": [
|
|
229
|
-
"dev",
|
|
230
|
-
"admin-api"
|
|
231
|
-
],
|
|
232
|
-
"markdownDescription": "fnox profile whose secrets are loaded; fnox's default profile when omitted. Locked secrets are unlocked with `devlanes secrets unlock`."
|
|
233
|
-
}
|
|
234
|
-
},
|
|
235
|
-
"type": "object"
|
|
236
|
-
},
|
|
237
205
|
"HostConfig": {
|
|
238
206
|
"anyOf": [
|
|
239
207
|
{
|
|
@@ -1946,36 +1914,16 @@
|
|
|
1946
1914
|
"type": "object"
|
|
1947
1915
|
},
|
|
1948
1916
|
"extends": {
|
|
1949
|
-
"description": "Template under `templates` whose settings this service inherits; its own settings apply on top. Mappings (`env`, `ready`, `stop`,
|
|
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.",
|
|
1950
1918
|
"examples": [
|
|
1951
1919
|
"fastify-api"
|
|
1952
1920
|
],
|
|
1953
|
-
"markdownDescription": "Template under `templates` whose settings this service inherits; its own settings apply on top. Mappings (`env`, `ready`, `stop`,
|
|
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.",
|
|
1954
1922
|
"type": [
|
|
1955
1923
|
"string",
|
|
1956
1924
|
"null"
|
|
1957
1925
|
]
|
|
1958
1926
|
},
|
|
1959
|
-
"fnox": {
|
|
1960
|
-
"anyOf": [
|
|
1961
|
-
{
|
|
1962
|
-
"$ref": "#/$defs/FnoxConfig",
|
|
1963
|
-
"description": "",
|
|
1964
|
-
"examples": [],
|
|
1965
|
-
"markdownDescription": ""
|
|
1966
|
-
},
|
|
1967
|
-
{
|
|
1968
|
-
"type": "null"
|
|
1969
|
-
}
|
|
1970
|
-
],
|
|
1971
|
-
"description": "Secrets profile for this service, replacing the project's `fnox.profile`. fnox puts that profile's secrets into the service's environment and `${{ env.X }}`; use it when one service needs different credentials.",
|
|
1972
|
-
"examples": [
|
|
1973
|
-
{
|
|
1974
|
-
"profile": "dev"
|
|
1975
|
-
}
|
|
1976
|
-
],
|
|
1977
|
-
"markdownDescription": "Secrets profile for this service, replacing the project's `fnox.profile`. fnox puts that profile's secrets into the service's environment and `${{ env.X }}`; use it when one service needs different credentials."
|
|
1978
|
-
},
|
|
1979
1927
|
"hidden": {
|
|
1980
1928
|
"anyOf": [
|
|
1981
1929
|
{
|
|
@@ -2007,7 +1955,7 @@
|
|
|
2007
1955
|
"type": "null"
|
|
2008
1956
|
}
|
|
2009
1957
|
],
|
|
2010
|
-
"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
|
|
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.",
|
|
2011
1959
|
"examples": [
|
|
2012
1960
|
"api.${{ lane.domain }}",
|
|
2013
1961
|
[
|
|
@@ -2020,7 +1968,7 @@
|
|
|
2020
1968
|
}
|
|
2021
1969
|
]
|
|
2022
1970
|
],
|
|
2023
|
-
"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
|
|
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."
|
|
2024
1972
|
},
|
|
2025
1973
|
"name": {
|
|
2026
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.",
|
|
@@ -2673,26 +2621,6 @@
|
|
|
2673
2621
|
"markdownDescription": "Variables for this task only, above `global_env`.",
|
|
2674
2622
|
"type": "object"
|
|
2675
2623
|
},
|
|
2676
|
-
"fnox": {
|
|
2677
|
-
"anyOf": [
|
|
2678
|
-
{
|
|
2679
|
-
"$ref": "#/$defs/FnoxConfig",
|
|
2680
|
-
"description": "",
|
|
2681
|
-
"examples": [],
|
|
2682
|
-
"markdownDescription": ""
|
|
2683
|
-
},
|
|
2684
|
-
{
|
|
2685
|
-
"type": "null"
|
|
2686
|
-
}
|
|
2687
|
-
],
|
|
2688
|
-
"description": "fnox profile for this task's secrets, instead of the project's `fnox.profile`.",
|
|
2689
|
-
"examples": [
|
|
2690
|
-
{
|
|
2691
|
-
"profile": "dev"
|
|
2692
|
-
}
|
|
2693
|
-
],
|
|
2694
|
-
"markdownDescription": "fnox profile for this task's secrets, instead of the project's `fnox.profile`."
|
|
2695
|
-
},
|
|
2696
2624
|
"interactive": {
|
|
2697
2625
|
"anyOf": [
|
|
2698
2626
|
{
|
|
@@ -3029,7 +2957,7 @@
|
|
|
3029
2957
|
"$id": "https://devlanes.run/v1/schema.json",
|
|
3030
2958
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3031
2959
|
"additionalProperties": false,
|
|
3032
|
-
"description": "devlanes v0.
|
|
2960
|
+
"description": "devlanes v0.4.0 project config. Run a dev environment per git worktree, side by side. https://devlanes.run",
|
|
3033
2961
|
"examples": [
|
|
3034
2962
|
{
|
|
3035
2963
|
"project": "acme",
|
|
@@ -3043,28 +2971,8 @@
|
|
|
3043
2971
|
}
|
|
3044
2972
|
}
|
|
3045
2973
|
],
|
|
3046
|
-
"markdownDescription": "devlanes v0.
|
|
2974
|
+
"markdownDescription": "devlanes v0.4.0 project config. Run a dev environment per git worktree, side by side. https://devlanes.run",
|
|
3047
2975
|
"properties": {
|
|
3048
|
-
"fnox": {
|
|
3049
|
-
"anyOf": [
|
|
3050
|
-
{
|
|
3051
|
-
"$ref": "#/$defs/FnoxConfig",
|
|
3052
|
-
"description": "",
|
|
3053
|
-
"examples": [],
|
|
3054
|
-
"markdownDescription": ""
|
|
3055
|
-
},
|
|
3056
|
-
{
|
|
3057
|
-
"type": "null"
|
|
3058
|
-
}
|
|
3059
|
-
],
|
|
3060
|
-
"description": "fnox profile that the secrets of every task and service come from. A task or service can name its own profile with its `fnox` key.",
|
|
3061
|
-
"examples": [
|
|
3062
|
-
{
|
|
3063
|
-
"profile": "dev"
|
|
3064
|
-
}
|
|
3065
|
-
],
|
|
3066
|
-
"markdownDescription": "fnox profile that the secrets of every task and service come from. A task or service can name its own profile with its `fnox` key."
|
|
3067
|
-
},
|
|
3068
2976
|
"global_env": {
|
|
3069
2977
|
"additionalProperties": {
|
|
3070
2978
|
"$ref": "#/$defs/Templated_Scalar",
|
|
@@ -3291,7 +3199,7 @@
|
|
|
3291
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`."
|
|
3292
3200
|
},
|
|
3293
3201
|
"default": {},
|
|
3294
|
-
"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`,
|
|
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.",
|
|
3295
3203
|
"examples": [
|
|
3296
3204
|
{
|
|
3297
3205
|
"fastify-api": {
|
|
@@ -3307,7 +3215,7 @@
|
|
|
3307
3215
|
}
|
|
3308
3216
|
}
|
|
3309
3217
|
],
|
|
3310
|
-
"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`,
|
|
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.",
|
|
3311
3219
|
"type": "object"
|
|
3312
3220
|
}
|
|
3313
3221
|
},
|
package/user-schema.json
CHANGED
|
@@ -65,6 +65,29 @@
|
|
|
65
65
|
"pattern": "^[0-9]+(ms|s|m|h|d)$",
|
|
66
66
|
"type": "string"
|
|
67
67
|
},
|
|
68
|
+
"DaemonConfig": {
|
|
69
|
+
"additionalProperties": false,
|
|
70
|
+
"description": "The daemon's own lifetime.",
|
|
71
|
+
"examples": [
|
|
72
|
+
{
|
|
73
|
+
"exit_when_idle": false
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"markdownDescription": "The daemon's own lifetime.",
|
|
77
|
+
"properties": {
|
|
78
|
+
"exit_when_idle": {
|
|
79
|
+
"default": true,
|
|
80
|
+
"description": "Stop the daemon about 30 seconds after the last TUI closes when no service, task or start is running; the next devlanes command starts it again. Containers keep running either way. Defaults to true. Only a daemon a command started on demand exits; one installed with `devlanes daemon install` keeps running.",
|
|
81
|
+
"examples": [
|
|
82
|
+
true,
|
|
83
|
+
false
|
|
84
|
+
],
|
|
85
|
+
"markdownDescription": "Stop the daemon about 30 seconds after the last TUI closes when no service, task or start is running; the next devlanes command starts it again. Containers keep running either way. Defaults to true. Only a daemon a command started on demand exits; one installed with `devlanes daemon install` keeps running.",
|
|
86
|
+
"type": "boolean"
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"type": "object"
|
|
90
|
+
},
|
|
68
91
|
"DnsProvider": {
|
|
69
92
|
"additionalProperties": false,
|
|
70
93
|
"description": "Reserved DNS-01 provider settings for the planned `public` resolver; not supported yet.",
|
|
@@ -790,7 +813,7 @@
|
|
|
790
813
|
},
|
|
791
814
|
"trust": {
|
|
792
815
|
"default": [],
|
|
793
|
-
"description": "Stores `devlanes certs trust` installs the CA into and `certs untrust` removes it from; an empty list means `[system]`. On Linux, browsers do not read the system store, so add `chrome` and `firefox` there; `devlanes doctor` shows each store's state.",
|
|
816
|
+
"description": "Stores `devlanes certs trust` installs the CA into and `certs untrust` removes it from; an empty list means `[system]`. On Linux, browsers do not read the system store, so add `chrome` and `firefox` there; inside WSL add `windows` for browsers on Windows. `devlanes doctor` shows each store's state.",
|
|
794
817
|
"examples": [
|
|
795
818
|
[
|
|
796
819
|
"system",
|
|
@@ -798,6 +821,10 @@
|
|
|
798
821
|
],
|
|
799
822
|
[
|
|
800
823
|
"chrome"
|
|
824
|
+
],
|
|
825
|
+
[
|
|
826
|
+
"system",
|
|
827
|
+
"windows"
|
|
801
828
|
]
|
|
802
829
|
],
|
|
803
830
|
"items": {
|
|
@@ -807,12 +834,13 @@
|
|
|
807
834
|
"system",
|
|
808
835
|
"firefox",
|
|
809
836
|
"chrome",
|
|
837
|
+
"windows",
|
|
810
838
|
"ios-simulator",
|
|
811
839
|
"android-emulator"
|
|
812
840
|
],
|
|
813
841
|
"markdownDescription": "Certificate store that `devlanes certs trust` installs the CA into."
|
|
814
842
|
},
|
|
815
|
-
"markdownDescription": "Stores `devlanes certs trust` installs the CA into and `certs untrust` removes it from; an empty list means `[system]`. On Linux, browsers do not read the system store, so add `chrome` and `firefox` there; `devlanes doctor` shows each store's state.",
|
|
843
|
+
"markdownDescription": "Stores `devlanes certs trust` installs the CA into and `certs untrust` removes it from; an empty list means `[system]`. On Linux, browsers do not read the system store, so add `chrome` and `firefox` there; inside WSL add `windows` for browsers on Windows. `devlanes doctor` shows each store's state.",
|
|
816
844
|
"type": "array"
|
|
817
845
|
}
|
|
818
846
|
},
|
|
@@ -824,6 +852,7 @@
|
|
|
824
852
|
"system",
|
|
825
853
|
"firefox",
|
|
826
854
|
"chrome",
|
|
855
|
+
"windows",
|
|
827
856
|
"ios-simulator",
|
|
828
857
|
"android-emulator"
|
|
829
858
|
],
|
|
@@ -831,6 +860,7 @@
|
|
|
831
860
|
"The OS store: the login keychain on macOS, read by Safari, Chrome, Edge and `/usr/bin/curl`; on Linux, the distribution's CA anchors, updated through sudo.",
|
|
832
861
|
"Every Firefox profile's certificate database, through `certutil` from the NSS tools (`brew install nss`, or `libnss3-tools` / `nss-tools` on Linux).",
|
|
833
862
|
"The store Chrome and Chromium read: `~/.pki/nssdb` through `certutil` on Linux, the same login keychain as `system` on macOS.",
|
|
863
|
+
"The Windows user root store, read by Edge, Chrome and Firefox on Windows. For devlanes inside WSL, whose browser usually runs on Windows: it runs Windows' `certutil.exe` through interop, and Windows asks you to confirm each change. On Windows it is the same store as `system`; on macOS and Linux outside WSL `certs trust` reports it as unavailable.",
|
|
834
864
|
"Reserved for the iOS simulator; not supported yet, so it is dropped with a warning.",
|
|
835
865
|
"Reserved for the Android emulator; not supported yet, so it is dropped with a warning."
|
|
836
866
|
],
|
|
@@ -838,6 +868,7 @@
|
|
|
838
868
|
"system",
|
|
839
869
|
"firefox",
|
|
840
870
|
"chrome",
|
|
871
|
+
"windows",
|
|
841
872
|
"ios-simulator",
|
|
842
873
|
"android-emulator"
|
|
843
874
|
],
|
|
@@ -846,6 +877,7 @@
|
|
|
846
877
|
"The OS store: the login keychain on macOS, read by Safari, Chrome, Edge and `/usr/bin/curl`; on Linux, the distribution's CA anchors, updated through sudo.",
|
|
847
878
|
"Every Firefox profile's certificate database, through `certutil` from the NSS tools (`brew install nss`, or `libnss3-tools` / `nss-tools` on Linux).",
|
|
848
879
|
"The store Chrome and Chromium read: `~/.pki/nssdb` through `certutil` on Linux, the same login keychain as `system` on macOS.",
|
|
880
|
+
"The Windows user root store, read by Edge, Chrome and Firefox on Windows. For devlanes inside WSL, whose browser usually runs on Windows: it runs Windows' `certutil.exe` through interop, and Windows asks you to confirm each change. On Windows it is the same store as `system`; on macOS and Linux outside WSL `certs trust` reports it as unavailable.",
|
|
849
881
|
"Reserved for the iOS simulator; not supported yet, so it is dropped with a warning.",
|
|
850
882
|
"Reserved for the Android emulator; not supported yet, so it is dropped with a warning."
|
|
851
883
|
],
|
|
@@ -1047,7 +1079,7 @@
|
|
|
1047
1079
|
"$id": "https://devlanes.run/v1/user-schema.json",
|
|
1048
1080
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
1049
1081
|
"additionalProperties": false,
|
|
1050
|
-
"description": "devlanes v0.
|
|
1082
|
+
"description": "devlanes v0.4.0 user config: per-user settings in ~/.devlanes/config.yaml. Run a dev environment per git worktree, side by side. https://devlanes.run",
|
|
1051
1083
|
"examples": [
|
|
1052
1084
|
{
|
|
1053
1085
|
"hostnames": {
|
|
@@ -1061,8 +1093,21 @@
|
|
|
1061
1093
|
}
|
|
1062
1094
|
}
|
|
1063
1095
|
],
|
|
1064
|
-
"markdownDescription": "devlanes v0.
|
|
1096
|
+
"markdownDescription": "devlanes v0.4.0 user config: per-user settings in ~/.devlanes/config.yaml. Run a dev environment per git worktree, side by side. https://devlanes.run",
|
|
1065
1097
|
"properties": {
|
|
1098
|
+
"daemon": {
|
|
1099
|
+
"$ref": "#/$defs/DaemonConfig",
|
|
1100
|
+
"default": {
|
|
1101
|
+
"exit_when_idle": true
|
|
1102
|
+
},
|
|
1103
|
+
"description": "The daemon's lifetime: whether it stops on its own once the last TUI closes and nothing runs.",
|
|
1104
|
+
"examples": [
|
|
1105
|
+
{
|
|
1106
|
+
"exit_when_idle": false
|
|
1107
|
+
}
|
|
1108
|
+
],
|
|
1109
|
+
"markdownDescription": "The daemon's lifetime: whether it stops on its own once the last TUI closes and nothing runs."
|
|
1110
|
+
},
|
|
1066
1111
|
"history": {
|
|
1067
1112
|
"$ref": "#/$defs/HistoryConfig",
|
|
1068
1113
|
"default": {
|