dev-cockpit 0.2.7 → 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 (53) 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 +6 -0
  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/docker/highlights.d.ts.map +1 -1
  29. package/dist/health/builtin.d.ts.map +1 -1
  30. package/dist/index.d.ts +8 -8
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +206 -143
  33. package/dist/index.js.map +2 -2
  34. package/dist/ink.d.ts +1 -1
  35. package/dist/ink.d.ts.map +1 -1
  36. package/dist/{link-VWT2VQH6.js → link-Y7OFHOUP.js} +4 -6
  37. package/dist/link-Y7OFHOUP.js.map +7 -0
  38. package/dist/mount/compose.d.ts.map +1 -1
  39. package/dist/mount/symlinks.d.ts.map +1 -1
  40. package/docs/commands.md +8 -8
  41. package/docs/config-reference.md +45 -41
  42. package/docs/health.md +32 -22
  43. package/docs/init-config.md +16 -16
  44. package/docs/mount.md +8 -7
  45. package/docs/notifications.md +3 -3
  46. package/docs/panes.md +5 -5
  47. package/docs/processes.md +7 -5
  48. package/examples/cockpit.schema.json +217 -57
  49. package/examples/cockpit.yaml +8 -10
  50. package/package.json +99 -93
  51. package/prettier-config.json +7 -0
  52. package/dist/chunk-A446TCT5.js.map +0 -7
  53. 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,7 +58,9 @@
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",
@@ -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
  },
@@ -233,20 +354,39 @@
233
354
  "type": "object",
234
355
  "required": ["hostPath"],
235
356
  "properties": {
236
- "hostPath": { "type": "string" },
237
- "containerPath": { "type": "string", "description": "Absolute path inside the container. Required when kind='bind' (the default); omit for kind='symlink-only'." },
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
+ },
238
364
  "kind": {
239
365
  "type": "string",
240
366
  "enum": ["bind", "symlink-only"],
241
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."
242
368
  },
243
- "meta": { "type": "object", "description": "Opaque to dev-cockpit core; consumed by profile hooks (e.g. awc reads meta.name and meta.type)." }
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
+ }
244
373
  },
245
374
  "additionalProperties": false,
246
375
  "allOf": [
247
376
  {
248
- "if": { "not": { "properties": { "kind": { "const": "symlink-only" } }, "required": ["kind"] } },
249
- "then": { "required": ["containerPath"] }
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
+ }
250
390
  }
251
391
  ]
252
392
  },
@@ -261,6 +401,10 @@
261
401
  "type": "string",
262
402
  "default": "mount.manifest.json",
263
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."
264
408
  }
265
409
  },
266
410
  "additionalProperties": false
@@ -269,10 +413,19 @@
269
413
  "type": "object",
270
414
  "required": ["id", "label", "command"],
271
415
  "properties": {
272
- "id": { "type": "string" },
273
- "label": { "type": "string" },
274
- "command": { "type": "string", "description": "Shell command to run. cwd defaults to the workspace." },
275
- "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
+ },
276
429
  "scope": {
277
430
  "type": "string",
278
431
  "pattern": "^(global|repos(:[\\w-]+)?)$",
@@ -289,10 +442,17 @@
289
442
  "allOf": [
290
443
  {
291
444
  "if": {
292
- "properties": { "scope": { "type": "string", "pattern": "^repos(:.*)?$" } },
445
+ "properties": {
446
+ "scope": {
447
+ "type": "string",
448
+ "pattern": "^repos(:.*)?$"
449
+ }
450
+ },
293
451
  "required": ["scope"]
294
452
  },
295
- "then": { "required": ["key"] }
453
+ "then": {
454
+ "required": ["key"]
455
+ }
296
456
  }
297
457
  ]
298
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,14 +134,11 @@ 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.
140
142
  # profile:
141
143
  # myapp:
142
144
  # someKey: value
143
-
144
- ## Mount overlay path override (optional) - tells the mount command where to write the overlay file.
145
- mount:
146
- overlayPath: docker/compose/web/docker-compose.dev-link.yml