dev-cockpit 0.2.6 → 0.2.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +32 -32
  2. package/bin/dev-cockpit.mjs +1 -1
  3. package/dist/buildCli.d.ts.map +1 -1
  4. package/dist/{chunk-A446TCT5.js → chunk-YTMK7EXK.js} +1 -1
  5. package/dist/chunk-YTMK7EXK.js.map +7 -0
  6. package/dist/cockpit/Footer.d.ts.map +1 -1
  7. package/dist/cockpit/hooks/useGlobalKeys.d.ts.map +1 -1
  8. package/dist/cockpit/panes/FilterModal.d.ts.map +1 -1
  9. package/dist/cockpit/panes/Output.d.ts.map +1 -1
  10. package/dist/cockpit/panes/Repos.d.ts.map +1 -1
  11. package/dist/cockpit/panes/SearchModal.d.ts.map +1 -1
  12. package/dist/cockpit/state/store.d.ts.map +1 -1
  13. package/dist/commands/dev.d.ts.map +1 -1
  14. package/dist/commands/doctor.d.ts.map +1 -1
  15. package/dist/commands/init-config-wizard.d.ts.map +1 -1
  16. package/dist/commands/init-config.d.ts.map +1 -1
  17. package/dist/commands/link.d.ts.map +1 -1
  18. package/dist/commands/migrate-config.d.ts.map +1 -1
  19. package/dist/commands/mount.d.ts +1 -3
  20. package/dist/commands/mount.d.ts.map +1 -1
  21. package/dist/core/config-discovery.d.ts.map +1 -1
  22. package/dist/core/config.d.ts +27 -6
  23. package/dist/core/config.d.ts.map +1 -1
  24. package/dist/core/manifest.d.ts.map +1 -1
  25. package/dist/core/migrations.d.ts.map +1 -1
  26. package/dist/core/paths.d.ts.map +1 -1
  27. package/dist/core/subprocess.d.ts.map +1 -1
  28. package/dist/core/types.d.ts +16 -1
  29. package/dist/core/types.d.ts.map +1 -1
  30. package/dist/docker/highlights.d.ts.map +1 -1
  31. package/dist/health/builtin.d.ts.map +1 -1
  32. package/dist/index.d.ts +8 -8
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +274 -170
  35. package/dist/index.js.map +3 -3
  36. package/dist/ink.d.ts +1 -1
  37. package/dist/ink.d.ts.map +1 -1
  38. package/dist/{link-VWT2VQH6.js → link-Y7OFHOUP.js} +4 -6
  39. package/dist/link-Y7OFHOUP.js.map +7 -0
  40. package/dist/mount/compose.d.ts.map +1 -1
  41. package/dist/mount/symlinks.d.ts +4 -4
  42. package/dist/mount/symlinks.d.ts.map +1 -1
  43. package/dist/mount/types.d.ts +15 -2
  44. package/dist/mount/types.d.ts.map +1 -1
  45. package/docs/commands.md +8 -8
  46. package/docs/config-reference.md +45 -41
  47. package/docs/health.md +32 -22
  48. package/docs/init-config.md +16 -16
  49. package/docs/mount.md +14 -9
  50. package/docs/notifications.md +3 -3
  51. package/docs/panes.md +5 -5
  52. package/docs/processes.md +7 -5
  53. package/examples/cockpit.schema.json +230 -59
  54. package/examples/cockpit.yaml +8 -6
  55. package/package.json +99 -93
  56. package/prettier-config.json +7 -0
  57. package/dist/chunk-A446TCT5.js.map +0 -7
  58. package/dist/link-VWT2VQH6.js.map +0 -7
@@ -18,12 +18,16 @@
18
18
  "processes": {
19
19
  "type": "array",
20
20
  "description": "Long-running commands streamed into the Output pane. Each runs once at startup and is restarted on `restartOn` fsevents.",
21
- "items": { "$ref": "#/$defs/Process" }
21
+ "items": {
22
+ "$ref": "#/$defs/Process"
23
+ }
22
24
  },
23
25
  "repos": {
24
26
  "type": "array",
25
27
  "description": "Rows shown in the Repos/Targets pane.",
26
- "items": { "$ref": "#/$defs/Repo" }
28
+ "items": {
29
+ "$ref": "#/$defs/Repo"
30
+ }
27
31
  },
28
32
  "docker": {
29
33
  "$ref": "#/$defs/Docker",
@@ -32,12 +36,16 @@
32
36
  "highlights": {
33
37
  "type": "array",
34
38
  "description": "Regex patterns applied to all output streams (processes + docker). Each can carry an explicit severity; otherwise inferred.",
35
- "items": { "$ref": "#/$defs/Highlight" }
39
+ "items": {
40
+ "$ref": "#/$defs/Highlight"
41
+ }
36
42
  },
37
43
  "health": {
38
44
  "type": "array",
39
45
  "description": "Health-check declarations. `type` references a built-in (`container-running` | `port-open` | `http-ok` | `file-exists` | `exec-zero`) or a profile-registered check id.",
40
- "items": { "$ref": "#/$defs/HealthCheck" }
46
+ "items": {
47
+ "$ref": "#/$defs/HealthCheck"
48
+ }
41
49
  },
42
50
  "help": {
43
51
  "$ref": "#/$defs/Help",
@@ -50,11 +58,13 @@
50
58
  "mounts": {
51
59
  "type": "array",
52
60
  "description": "Explicit `{hostPath, containerPath, meta?}` candidates for `dev-cockpit mount`. Merged with `profile.mountCandidatesProvider()`.",
53
- "items": { "$ref": "#/$defs/Mount" }
61
+ "items": {
62
+ "$ref": "#/$defs/Mount"
63
+ }
54
64
  },
55
65
  "mount": {
56
66
  "$ref": "#/$defs/MountSettings",
57
- "description": "Overlay/manifest path overrides. Default overlay lives at <stateDir>/dev-mount-overlay.yml (out of the repo)."
67
+ "description": "Overlay/manifest path overrides. Default overlay lives at <stateDir>/dev-mount-overlay.yml (out of the repo). Set `overlayPath` when the project's compose chain (Makefile wildcard, compose -f include, etc.) expects the overlay at a fixed location."
58
68
  },
59
69
  "defaultPane": {
60
70
  "type": "string",
@@ -64,7 +74,9 @@
64
74
  "actions": {
65
75
  "type": "array",
66
76
  "description": "Named, key-bound shell commands surfaced via the `:` command palette and the Targets pane.",
67
- "items": { "$ref": "#/$defs/Action" }
77
+ "items": {
78
+ "$ref": "#/$defs/Action"
79
+ }
68
80
  },
69
81
  "profile": {
70
82
  "type": "object",
@@ -76,13 +88,18 @@
76
88
  "NotifyOverride": {
77
89
  "description": "Either `false` (mute notifications for this item) or `{ onTransitionTo: [...] }` to override the global transition list.",
78
90
  "oneOf": [
79
- { "type": "boolean", "const": false },
91
+ {
92
+ "type": "boolean",
93
+ "const": false
94
+ },
80
95
  {
81
96
  "type": "object",
82
97
  "properties": {
83
98
  "onTransitionTo": {
84
99
  "type": "array",
85
- "items": { "type": "string" }
100
+ "items": {
101
+ "type": "string"
102
+ }
86
103
  }
87
104
  },
88
105
  "additionalProperties": false
@@ -93,18 +110,40 @@
93
110
  "type": "object",
94
111
  "required": ["id", "command"],
95
112
  "properties": {
96
- "id": { "type": "string" },
97
- "label": { "type": "string" },
98
- "command": { "type": "string", "description": "Shell command. Spawned via the wrapper with the workspace as cwd by default." },
99
- "cwd": { "type": "string", "description": "Workspace-relative override of the process working dir." },
100
- "env": { "type": "object", "additionalProperties": { "type": "string" } },
101
- "color": { "type": "string", "description": "ANSI colour for prefixed output (cyan / magenta / yellow / blue / green / red / white)." },
113
+ "id": {
114
+ "type": "string"
115
+ },
116
+ "label": {
117
+ "type": "string"
118
+ },
119
+ "command": {
120
+ "type": "string",
121
+ "description": "Shell command. Spawned via the wrapper with the workspace as cwd by default."
122
+ },
123
+ "cwd": {
124
+ "type": "string",
125
+ "description": "Workspace-relative override of the process working dir."
126
+ },
127
+ "env": {
128
+ "type": "object",
129
+ "additionalProperties": {
130
+ "type": "string"
131
+ }
132
+ },
133
+ "color": {
134
+ "type": "string",
135
+ "description": "ANSI colour for prefixed output (cyan / magenta / yellow / blue / green / red / white)."
136
+ },
102
137
  "restartOn": {
103
138
  "type": "array",
104
- "items": { "type": "string" },
139
+ "items": {
140
+ "type": "string"
141
+ },
105
142
  "description": "Glob patterns; when a matching file changes, the process is killed + respawned."
106
143
  },
107
- "notify": { "$ref": "#/$defs/NotifyOverride" }
144
+ "notify": {
145
+ "$ref": "#/$defs/NotifyOverride"
146
+ }
108
147
  },
109
148
  "additionalProperties": false
110
149
  },
@@ -112,9 +151,16 @@
112
151
  "type": "object",
113
152
  "required": ["id", "path"],
114
153
  "properties": {
115
- "id": { "type": "string" },
116
- "path": { "type": "string", "description": "Workspace-relative path to the repo root." },
117
- "label": { "type": "string" }
154
+ "id": {
155
+ "type": "string"
156
+ },
157
+ "path": {
158
+ "type": "string",
159
+ "description": "Workspace-relative path to the repo root."
160
+ },
161
+ "label": {
162
+ "type": "string"
163
+ }
118
164
  },
119
165
  "additionalProperties": false
120
166
  },
@@ -122,8 +168,14 @@
122
168
  "type": "object",
123
169
  "required": ["name"],
124
170
  "properties": {
125
- "name": { "type": "string", "description": "Compose service name." },
126
- "tail": { "type": "boolean", "default": true }
171
+ "name": {
172
+ "type": "string",
173
+ "description": "Compose service name."
174
+ },
175
+ "tail": {
176
+ "type": "boolean",
177
+ "default": true
178
+ }
127
179
  },
128
180
  "additionalProperties": false
129
181
  },
@@ -136,7 +188,9 @@
136
188
  },
137
189
  "services": {
138
190
  "type": "array",
139
- "items": { "$ref": "#/$defs/Service" },
191
+ "items": {
192
+ "$ref": "#/$defs/Service"
193
+ },
140
194
  "description": "Services to tail in the Output pane + reference as `container-running` health check targets."
141
195
  }
142
196
  },
@@ -146,7 +200,10 @@
146
200
  "type": "object",
147
201
  "required": ["pattern"],
148
202
  "properties": {
149
- "pattern": { "type": "string", "description": "JavaScript-flavour regex." },
203
+ "pattern": {
204
+ "type": "string",
205
+ "description": "JavaScript-flavour regex."
206
+ },
150
207
  "severity": {
151
208
  "type": "string",
152
209
  "enum": ["info", "warn", "error"],
@@ -159,10 +216,21 @@
159
216
  "type": "object",
160
217
  "required": ["key", "label", "command"],
161
218
  "properties": {
162
- "key": { "type": "string", "minLength": 1, "maxLength": 1, "description": "Single key character that triggers the remediation in the Health pane." },
163
- "label": { "type": "string" },
164
- "command": { "type": "string" },
165
- "cwd": { "type": "string" }
219
+ "key": {
220
+ "type": "string",
221
+ "minLength": 1,
222
+ "maxLength": 1,
223
+ "description": "Single key character that triggers the remediation in the Health pane."
224
+ },
225
+ "label": {
226
+ "type": "string"
227
+ },
228
+ "command": {
229
+ "type": "string"
230
+ },
231
+ "cwd": {
232
+ "type": "string"
233
+ }
166
234
  },
167
235
  "additionalProperties": false
168
236
  },
@@ -170,8 +238,12 @@
170
238
  "type": "object",
171
239
  "required": ["id", "label", "type", "remediation"],
172
240
  "properties": {
173
- "id": { "type": "string" },
174
- "label": { "type": "string" },
241
+ "id": {
242
+ "type": "string"
243
+ },
244
+ "label": {
245
+ "type": "string"
246
+ },
175
247
  "type": {
176
248
  "type": "string",
177
249
  "description": "Built-in: container-running | port-open | http-ok | file-exists | exec-zero. Profiles may register additional check types."
@@ -183,20 +255,57 @@
183
255
  },
184
256
  "triggers": {
185
257
  "type": "array",
186
- "items": { "type": "string", "enum": ["startup", "fsevent", "lockfile", "docker"] },
258
+ "items": {
259
+ "type": "string",
260
+ "enum": ["startup", "fsevent", "lockfile", "docker"]
261
+ },
187
262
  "description": "When to re-run this check. Sensible defaults per check type when omitted."
188
263
  },
189
- "url": { "type": "string", "description": "http-ok target." },
190
- "expectStatus": { "type": "integer", "description": "http-ok success status (default 200)." },
191
- "container": { "type": "string", "description": "container-running target — compose service or container name (substring match against `docker ps --filter name=`)." },
192
- "port": { "type": "integer", "description": "port-open TCP port." },
193
- "host": { "type": "string", "description": "port-open / http-ok host override (default 127.0.0.1)." },
194
- "path": { "type": "string", "description": "file-exists path (workspace-relative)." },
195
- "command": { "type": "string", "description": "exec-zero command to run (success = exit 0)." },
196
- "args": { "type": "array", "items": { "type": "string" }, "description": "exec-zero argv." },
197
- "cwd": { "type": "string", "description": "exec-zero cwd override." },
198
- "notify": { "$ref": "#/$defs/NotifyOverride" },
199
- "remediation": { "$ref": "#/$defs/Remediation" }
264
+ "url": {
265
+ "type": "string",
266
+ "description": "http-ok target."
267
+ },
268
+ "expectStatus": {
269
+ "type": "integer",
270
+ "description": "http-ok success status (default 200)."
271
+ },
272
+ "container": {
273
+ "type": "string",
274
+ "description": "container-running target — compose service or container name (substring match against `docker ps --filter name=`)."
275
+ },
276
+ "port": {
277
+ "type": "integer",
278
+ "description": "port-open TCP port."
279
+ },
280
+ "host": {
281
+ "type": "string",
282
+ "description": "port-open / http-ok host override (default 127.0.0.1)."
283
+ },
284
+ "path": {
285
+ "type": "string",
286
+ "description": "file-exists path (workspace-relative)."
287
+ },
288
+ "command": {
289
+ "type": "string",
290
+ "description": "exec-zero command to run (success = exit 0)."
291
+ },
292
+ "args": {
293
+ "type": "array",
294
+ "items": {
295
+ "type": "string"
296
+ },
297
+ "description": "exec-zero argv."
298
+ },
299
+ "cwd": {
300
+ "type": "string",
301
+ "description": "exec-zero cwd override."
302
+ },
303
+ "notify": {
304
+ "$ref": "#/$defs/NotifyOverride"
305
+ },
306
+ "remediation": {
307
+ "$ref": "#/$defs/Remediation"
308
+ }
200
309
  },
201
310
  "additionalProperties": false
202
311
  },
@@ -205,25 +314,37 @@
205
314
  "properties": {
206
315
  "sources": {
207
316
  "type": "array",
208
- "items": { "type": "string" },
317
+ "items": {
318
+ "type": "string"
319
+ },
209
320
  "description": "Workspace-relative paths to markdown dirs layered on top of built-in help."
210
321
  },
211
- "defaultPage": { "type": "string", "description": "Slug of the page to land on when Help opens." }
322
+ "defaultPage": {
323
+ "type": "string",
324
+ "description": "Slug of the page to land on when Help opens."
325
+ }
212
326
  },
213
327
  "additionalProperties": false
214
328
  },
215
329
  "Notifications": {
216
330
  "type": "object",
217
331
  "properties": {
218
- "enabled": { "type": "boolean", "default": true },
332
+ "enabled": {
333
+ "type": "boolean",
334
+ "default": true
335
+ },
219
336
  "onTransitionTo": {
220
337
  "type": "array",
221
- "items": { "type": "string" },
338
+ "items": {
339
+ "type": "string"
340
+ },
222
341
  "description": "Severities that fire a notification on transition (default: [error, recovered])."
223
342
  },
224
343
  "exclude": {
225
344
  "type": "array",
226
- "items": { "type": "string" },
345
+ "items": {
346
+ "type": "string"
347
+ },
227
348
  "description": "Check ids to mute even when their severity matches."
228
349
  }
229
350
  },
@@ -231,25 +352,59 @@
231
352
  },
232
353
  "Mount": {
233
354
  "type": "object",
234
- "required": ["hostPath", "containerPath"],
355
+ "required": ["hostPath"],
235
356
  "properties": {
236
- "hostPath": { "type": "string" },
237
- "containerPath": { "type": "string" },
238
- "meta": { "type": "object", "description": "Opaque to dev-cockpit core; consumed by profile hooks (e.g. awc reads meta.name and meta.type)." }
357
+ "hostPath": {
358
+ "type": "string"
359
+ },
360
+ "containerPath": {
361
+ "type": "string",
362
+ "description": "Absolute path inside the container. Required when kind='bind' (the default); omit for kind='symlink-only'."
363
+ },
364
+ "kind": {
365
+ "type": "string",
366
+ "enum": ["bind", "symlink-only"],
367
+ "description": "How the mount is materialised. 'bind' (default) emits a docker-compose bind into the overlay. 'symlink-only' skips the docker bind — used when a host-side symlink (via Profile.mountSymlinks) is the only artefact, e.g. when redirecting a pre-existing compose bind to a dev clone."
368
+ },
369
+ "meta": {
370
+ "type": "object",
371
+ "description": "Opaque to dev-cockpit core; consumed by profile hooks (e.g. awc reads meta.name and meta.type)."
372
+ }
239
373
  },
240
- "additionalProperties": false
374
+ "additionalProperties": false,
375
+ "allOf": [
376
+ {
377
+ "if": {
378
+ "not": {
379
+ "properties": {
380
+ "kind": {
381
+ "const": "symlink-only"
382
+ }
383
+ },
384
+ "required": ["kind"]
385
+ }
386
+ },
387
+ "then": {
388
+ "required": ["containerPath"]
389
+ }
390
+ }
391
+ ]
241
392
  },
242
393
  "MountSettings": {
243
394
  "type": "object",
244
395
  "properties": {
245
396
  "overlayPath": {
246
397
  "type": "string",
247
- "description": "Override for the generated docker-compose overlay. Unset = <stateDir>/dev-mount-overlay.yml (recommended). Set values are workspace-relative; absolute paths honoured verbatim."
398
+ "description": "Override for the generated docker-compose overlay. Unset = <stateDir>/dev-mount-overlay.yml (out of the repo). Set this when the project's compose chain expects the overlay at a specific path — e.g. a wrapper Makefile wildcard or a `docker compose -f` include — that won't pick up the stateDir default. Relative values resolve against the workspace root; absolute paths honoured verbatim."
248
399
  },
249
400
  "manifestFile": {
250
401
  "type": "string",
251
402
  "default": "mount.manifest.json",
252
403
  "description": "Basename inside stateDir for the mount manifest."
404
+ },
405
+ "service": {
406
+ "type": "string",
407
+ "description": "Target compose service. Unset = first in docker.services."
253
408
  }
254
409
  },
255
410
  "additionalProperties": false
@@ -258,10 +413,19 @@
258
413
  "type": "object",
259
414
  "required": ["id", "label", "command"],
260
415
  "properties": {
261
- "id": { "type": "string" },
262
- "label": { "type": "string" },
263
- "command": { "type": "string", "description": "Shell command to run. cwd defaults to the workspace." },
264
- "cwd": { "type": "string" },
416
+ "id": {
417
+ "type": "string"
418
+ },
419
+ "label": {
420
+ "type": "string"
421
+ },
422
+ "command": {
423
+ "type": "string",
424
+ "description": "Shell command to run. cwd defaults to the workspace."
425
+ },
426
+ "cwd": {
427
+ "type": "string"
428
+ },
265
429
  "scope": {
266
430
  "type": "string",
267
431
  "pattern": "^(global|repos(:[\\w-]+)?)$",
@@ -278,10 +442,17 @@
278
442
  "allOf": [
279
443
  {
280
444
  "if": {
281
- "properties": { "scope": { "type": "string", "pattern": "^repos(:.*)?$" } },
445
+ "properties": {
446
+ "scope": {
447
+ "type": "string",
448
+ "pattern": "^repos(:.*)?$"
449
+ }
450
+ },
282
451
  "required": ["scope"]
283
452
  },
284
- "then": { "required": ["key"] }
453
+ "then": {
454
+ "required": ["key"]
455
+ }
285
456
  }
286
457
  ]
287
458
  }
@@ -7,8 +7,8 @@
7
7
  # DEV_COCKPIT_CONFIG=<path> dev-cockpit dev # one-shot env override
8
8
  # dev-cockpit dev --config <path> # one-shot CLI override
9
9
 
10
- version: 2 # config schema version; required (v1 auto-migrated in memory)
11
- appName: my-app # state dir: ~/.local/state/my-app/<workspace-hash>/
10
+ version: 2 # config schema version; required (v1 auto-migrated in memory)
11
+ appName: my-app # state dir: ~/.local/state/my-app/<workspace-hash>/
12
12
 
13
13
  # Processes — long-running commands streamed into the Output pane.
14
14
  # Renamed from `watchers` in schema v2; v1 configs still load with a one-time warning.
@@ -25,7 +25,7 @@ processes:
25
25
  label: eslint
26
26
  command: npx eslint . --watch
27
27
  color: yellow
28
- notify: false # mute notifications for this process
28
+ notify: false # mute notifications for this process
29
29
  restartOn:
30
30
  - package.json
31
31
  - .eslintrc.*
@@ -59,7 +59,7 @@ highlights:
59
59
  severity: error
60
60
  - pattern: WARN
61
61
  severity: warn
62
- - pattern: "Stack trace"
62
+ - pattern: 'Stack trace'
63
63
  severity: error
64
64
 
65
65
  # Health checks — `type` references a built-in or profile-registered check id.
@@ -70,7 +70,7 @@ health:
70
70
  type: http-ok
71
71
  url: http://localhost:3000/health
72
72
  notify:
73
- onTransitionTo: [error] # only notify on going-down, not on recovery
73
+ onTransitionTo: [error] # only notify on going-down, not on recovery
74
74
  remediation:
75
75
  key: a
76
76
  label: restart api
@@ -122,6 +122,7 @@ notifications:
122
122
  # mount:
123
123
  # overlayPath: docker/compose/dev-mount-overlay.yml # workspace-relative
124
124
  # manifestFile: mount.manifest.json # basename inside stateDir
125
+ # service: web # target compose service (default: first in docker.services)
125
126
 
126
127
  # Actions — named, key-bound shell commands surfaced via the `:` palette and
127
128
  # the Targets pane. `scope` values: `global` | `repos` | `repos:<id>`.
@@ -133,7 +134,8 @@ actions:
133
134
  key: o
134
135
 
135
136
  # Which pane the cockpit lands on when it boots.
136
- defaultPane: repos # repos | output | health | help
137
+ defaultPane: repos # repos | output | health | help
138
+
137
139
 
138
140
  # Profile-specific config lives under `profile.<name>` — validated by the
139
141
  # profile's `configSchemaExt` zod extension. Generic core ignores this block.