@kindgi/cli 0.1.6-rc.0 → 0.1.7-rc.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.
Files changed (220) hide show
  1. package/README.md +23 -12
  2. package/dist/commands/dev.d.ts.map +1 -1
  3. package/dist/commands/dev.js +84 -13
  4. package/dist/commands/dev.js.map +1 -1
  5. package/dist/commands/doctor.d.ts +5 -1
  6. package/dist/commands/doctor.d.ts.map +1 -1
  7. package/dist/commands/doctor.js +102 -18
  8. package/dist/commands/doctor.js.map +1 -1
  9. package/dist/commands/guardrails.d.ts.map +1 -1
  10. package/dist/commands/guardrails.js +13 -2
  11. package/dist/commands/guardrails.js.map +1 -1
  12. package/dist/commands/index.d.ts.map +1 -1
  13. package/dist/commands/index.js +4 -0
  14. package/dist/commands/index.js.map +1 -1
  15. package/dist/commands/init.d.ts +1 -1
  16. package/dist/commands/init.d.ts.map +1 -1
  17. package/dist/commands/init.js +23 -3
  18. package/dist/commands/init.js.map +1 -1
  19. package/dist/commands/license.d.ts +3 -0
  20. package/dist/commands/license.d.ts.map +1 -0
  21. package/dist/commands/license.js +187 -0
  22. package/dist/commands/license.js.map +1 -0
  23. package/dist/commands/mcp.js +1 -1
  24. package/dist/commands/providers.d.ts.map +1 -1
  25. package/dist/commands/providers.js +11 -9
  26. package/dist/commands/providers.js.map +1 -1
  27. package/dist/commands/test.d.ts.map +1 -1
  28. package/dist/commands/test.js +21 -9
  29. package/dist/commands/test.js.map +1 -1
  30. package/dist/commands/webhooks.d.ts +20 -0
  31. package/dist/commands/webhooks.d.ts.map +1 -0
  32. package/dist/commands/webhooks.js +444 -0
  33. package/dist/commands/webhooks.js.map +1 -0
  34. package/dist/context.d.ts +4 -0
  35. package/dist/context.d.ts.map +1 -1
  36. package/dist/context.js +1 -0
  37. package/dist/context.js.map +1 -1
  38. package/dist/dev/already-running.d.ts +22 -0
  39. package/dist/dev/already-running.d.ts.map +1 -0
  40. package/dist/dev/already-running.js +72 -0
  41. package/dist/dev/already-running.js.map +1 -0
  42. package/dist/dev/defaults.d.ts.map +1 -1
  43. package/dist/dev/defaults.js +5 -2
  44. package/dist/dev/defaults.js.map +1 -1
  45. package/dist/dev/dev-lock.d.ts +50 -0
  46. package/dist/dev/dev-lock.d.ts.map +1 -0
  47. package/dist/dev/dev-lock.js +203 -0
  48. package/dist/dev/dev-lock.js.map +1 -0
  49. package/dist/dev/port.d.ts +6 -2
  50. package/dist/dev/port.d.ts.map +1 -1
  51. package/dist/dev/port.js +8 -4
  52. package/dist/dev/port.js.map +1 -1
  53. package/dist/dev/providers.d.ts.map +1 -1
  54. package/dist/dev/providers.js +112 -23
  55. package/dist/dev/providers.js.map +1 -1
  56. package/dist/dev/runners.d.ts +21 -2
  57. package/dist/dev/runners.d.ts.map +1 -1
  58. package/dist/dev/runtime-container.d.ts +78 -3
  59. package/dist/dev/runtime-container.d.ts.map +1 -1
  60. package/dist/dev/runtime-container.js +256 -25
  61. package/dist/dev/runtime-container.js.map +1 -1
  62. package/dist/dev/runtime-image.d.ts +1 -1
  63. package/dist/dev/runtime-image.js +1 -1
  64. package/dist/dev/start-phases.d.ts +41 -0
  65. package/dist/dev/start-phases.d.ts.map +1 -0
  66. package/dist/dev/start-phases.js +103 -0
  67. package/dist/dev/start-phases.js.map +1 -0
  68. package/dist/help.js +1 -1
  69. package/dist/help.js.map +1 -1
  70. package/dist/init/augment-scaffolder.d.ts +20 -7
  71. package/dist/init/augment-scaffolder.d.ts.map +1 -1
  72. package/dist/init/augment-scaffolder.js +94 -21
  73. package/dist/init/augment-scaffolder.js.map +1 -1
  74. package/dist/init/pinning.d.ts +39 -0
  75. package/dist/init/pinning.d.ts.map +1 -0
  76. package/dist/init/pinning.js +130 -0
  77. package/dist/init/pinning.js.map +1 -0
  78. package/dist/init/template-files.d.ts +1 -1
  79. package/dist/init/tsconfig-paths.d.ts +29 -0
  80. package/dist/init/tsconfig-paths.d.ts.map +1 -0
  81. package/dist/init/tsconfig-paths.js +235 -0
  82. package/dist/init/tsconfig-paths.js.map +1 -0
  83. package/dist/init/vitest-setup.d.ts +41 -0
  84. package/dist/init/vitest-setup.d.ts.map +1 -0
  85. package/dist/init/vitest-setup.js +163 -0
  86. package/dist/init/vitest-setup.js.map +1 -0
  87. package/dist/license/aws.d.ts +24 -0
  88. package/dist/license/aws.d.ts.map +1 -0
  89. package/dist/license/aws.js +291 -0
  90. package/dist/license/aws.js.map +1 -0
  91. package/dist/license/cloud.d.ts +13 -0
  92. package/dist/license/cloud.d.ts.map +1 -0
  93. package/dist/license/cloud.js +193 -0
  94. package/dist/license/cloud.js.map +1 -0
  95. package/dist/license/expiry.d.ts +33 -0
  96. package/dist/license/expiry.d.ts.map +1 -0
  97. package/dist/license/expiry.js +35 -0
  98. package/dist/license/expiry.js.map +1 -0
  99. package/dist/license/license-key.d.ts +32 -0
  100. package/dist/license/license-key.d.ts.map +1 -0
  101. package/dist/license/license-key.js +91 -0
  102. package/dist/license/license-key.js.map +1 -0
  103. package/dist/license/protocol.d.ts +63 -0
  104. package/dist/license/protocol.d.ts.map +1 -0
  105. package/dist/license/protocol.js +102 -0
  106. package/dist/license/protocol.js.map +1 -0
  107. package/dist/license/renew.d.ts +59 -0
  108. package/dist/license/renew.d.ts.map +1 -0
  109. package/dist/license/renew.js +153 -0
  110. package/dist/license/renew.js.map +1 -0
  111. package/dist/license/stores.d.ts +19 -0
  112. package/dist/license/stores.d.ts.map +1 -0
  113. package/dist/license/stores.js +150 -0
  114. package/dist/license/stores.js.map +1 -0
  115. package/dist/main.d.ts +3 -0
  116. package/dist/main.d.ts.map +1 -1
  117. package/dist/main.js +1 -0
  118. package/dist/main.js.map +1 -1
  119. package/dist/package-manager.d.ts.map +1 -1
  120. package/dist/package-manager.js +2 -1
  121. package/dist/package-manager.js.map +1 -1
  122. package/dist/providers/preset-loader.d.ts +52 -1
  123. package/dist/providers/preset-loader.d.ts.map +1 -1
  124. package/dist/providers/preset-loader.js +85 -6
  125. package/dist/providers/preset-loader.js.map +1 -1
  126. package/dist/providers/presets/anthropic.json +1 -1
  127. package/dist/providers/presets/azure-openai.json +65 -0
  128. package/dist/providers/presets/bedrock.json +102 -0
  129. package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +3 -3
  130. package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +3 -3
  131. package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +11 -10
  132. package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +4 -4
  133. package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +16 -9
  134. package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +9 -11
  135. package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +3 -3
  136. package/dist/sdk-skills/kindgi-getting-started/SKILL.md +28 -5
  137. package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +1 -1
  138. package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +1 -1
  139. package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +1 -1
  140. package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +1 -1
  141. package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +6 -1
  142. package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +1 -1
  143. package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +1 -1
  144. package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +1 -1
  145. package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +1 -1
  146. package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +6 -1
  147. package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +1 -1
  148. package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +1 -1
  149. package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +1 -1
  150. package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +1 -1
  151. package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +6 -1
  152. package/dist/sdk-skills/kindgi-using/SKILL.md +236 -0
  153. package/dist/templates/drupal/.nvmrc +1 -0
  154. package/dist/templates/drupal/AGENTS.md +62 -0
  155. package/dist/templates/drupal/README.md.tmpl +321 -0
  156. package/dist/templates/drupal/agents/content-agent/index.test.ts.tmpl +47 -0
  157. package/dist/templates/drupal/agents/content-agent/index.ts.tmpl +69 -0
  158. package/dist/templates/drupal/agents/content-reviewer/index.test.ts.tmpl +37 -0
  159. package/dist/templates/drupal/agents/content-reviewer/index.ts.tmpl +57 -0
  160. package/dist/templates/drupal/fixtures/node-updated.json +174 -0
  161. package/dist/templates/drupal/flows/content-review/index.ts.tmpl +66 -0
  162. package/dist/templates/drupal/gitignore +8 -0
  163. package/dist/templates/drupal/guardrails/no-contact-details/index.test.ts.tmpl +29 -0
  164. package/dist/templates/drupal/guardrails/no-contact-details/index.ts.tmpl +73 -0
  165. package/dist/templates/drupal/kindgi.config.ts.tmpl +41 -0
  166. package/dist/templates/drupal/lib/drupal.ts.tmpl +64 -0
  167. package/dist/templates/drupal/package.json.tmpl +31 -0
  168. package/dist/templates/drupal/pnpm-workspace.yaml +9 -0
  169. package/dist/templates/drupal/scripts/connect-drupal.mjs.tmpl +57 -0
  170. package/dist/templates/drupal/tools/check-content-event/index.test.ts.tmpl +72 -0
  171. package/dist/templates/drupal/tools/check-content-event/index.ts.tmpl +115 -0
  172. package/dist/templates/drupal/tsconfig.json.tmpl +28 -0
  173. package/dist/templates/drupal/vitest.config.ts.tmpl +14 -0
  174. package/dist/templates/java/AGENTS.md +6 -0
  175. package/dist/templates/java/README.md.tmpl +1 -1
  176. package/dist/templates/minimal/AGENTS.md +6 -0
  177. package/dist/templates/minimal/README.md.tmpl +3 -2
  178. package/dist/templates/minimal/package.json.tmpl +3 -2
  179. package/dist/templates/python/AGENTS.md +3 -2
  180. package/dist/templates/sample/AGENTS.md +6 -0
  181. package/dist/templates/sample/package.json.tmpl +3 -2
  182. package/dist/templates/scala/AGENTS.md +6 -0
  183. package/dist/templates/scala/README.md.tmpl +1 -1
  184. package/dist/templates/woocommerce/.nvmrc +1 -0
  185. package/dist/templates/woocommerce/AGENTS.md +49 -0
  186. package/dist/templates/woocommerce/README.md.tmpl +273 -0
  187. package/dist/templates/woocommerce/agents/order-reviewer/index.test.ts.tmpl +28 -0
  188. package/dist/templates/woocommerce/agents/order-reviewer/index.ts.tmpl +45 -0
  189. package/dist/templates/woocommerce/agents/store-agent/index.test.ts.tmpl +47 -0
  190. package/dist/templates/woocommerce/agents/store-agent/index.ts.tmpl +79 -0
  191. package/dist/templates/woocommerce/fixtures/order-created.json +67 -0
  192. package/dist/templates/woocommerce/flows/order-review/index.ts.tmpl +64 -0
  193. package/dist/templates/woocommerce/gitignore +8 -0
  194. package/dist/templates/woocommerce/guardrails/no-customer-contact-details/index.test.ts.tmpl +29 -0
  195. package/dist/templates/woocommerce/guardrails/no-customer-contact-details/index.ts.tmpl +74 -0
  196. package/dist/templates/woocommerce/kindgi.config.ts.tmpl +41 -0
  197. package/dist/templates/woocommerce/lib/fake-store.ts.tmpl +82 -0
  198. package/dist/templates/woocommerce/lib/woo.ts.tmpl +182 -0
  199. package/dist/templates/woocommerce/package.json.tmpl +30 -0
  200. package/dist/templates/woocommerce/pnpm-workspace.yaml +9 -0
  201. package/dist/templates/woocommerce/tools/check-order-event/index.test.ts.tmpl +76 -0
  202. package/dist/templates/woocommerce/tools/check-order-event/index.ts.tmpl +131 -0
  203. package/dist/templates/woocommerce/tools/find-orders/index.ts.tmpl +80 -0
  204. package/dist/templates/woocommerce/tools/publish-product/index.ts.tmpl +34 -0
  205. package/dist/templates/woocommerce/tools/refund/index.test.ts.tmpl +125 -0
  206. package/dist/templates/woocommerce/tools/refund/index.ts.tmpl +70 -0
  207. package/dist/templates/woocommerce/tools/refund-large/index.test.ts.tmpl +53 -0
  208. package/dist/templates/woocommerce/tools/refund-large/index.ts.tmpl +44 -0
  209. package/dist/templates/woocommerce/tools/set-price/index.ts.tmpl +36 -0
  210. package/dist/templates/woocommerce/tsconfig.json.tmpl +28 -0
  211. package/dist/templates/woocommerce/vitest.config.ts.tmpl +14 -0
  212. package/dist/test/defaults.d.ts +1 -1
  213. package/dist/test/defaults.d.ts.map +1 -1
  214. package/dist/test/defaults.js +2 -7
  215. package/dist/test/defaults.js.map +1 -1
  216. package/dist/test/runners.d.ts +6 -0
  217. package/dist/test/runners.d.ts.map +1 -1
  218. package/dist/test/runners.js +18 -1
  219. package/dist/test/runners.js.map +1 -1
  220. package/package.json +14 -14
@@ -16,9 +16,11 @@
16
16
  import { spawn } from 'node:child_process';
17
17
  import { createHash } from 'node:crypto';
18
18
  import { lineReader } from './lines.js';
19
- import { textLines } from './log-view.js';
19
+ import { parseRecord, textLines } from './log-view.js';
20
20
  import { RUNTIME_EXPORT_SIGNING_KEY, RUNTIME_GOOGLE_CREDENTIALS, RUNTIME_PACK_DIR, RUNTIME_PUBLIC_TOKEN_KEY, } from './runtime-env.js';
21
+ import { registryOf } from './runtime-image.js';
21
22
  import { credentialHelperFailure, credentialHelperHint, isRegistryAuthFailure, registryLoginCommand, } from './runtime-registry.js';
23
+ import { NO_START_PHASES, formatSize } from './start-phases.js';
22
24
  /** The port the image's server listens on (its `KINDGI_API_PORT`). */
23
25
  export const IMAGE_API_PORT = 4000;
24
26
  /** Run one `docker` command to completion. */
@@ -26,17 +28,27 @@ export function docker(args, options = {}) {
26
28
  return new Promise((resolve) => {
27
29
  const child = spawn('docker', args, {
28
30
  stdio: [options.stdin === undefined ? 'ignore' : 'pipe', 'pipe', 'pipe'],
31
+ ...(options.signal !== undefined && { signal: options.signal }),
29
32
  });
30
33
  let stdout = '';
31
34
  let stderr = '';
35
+ const onLine = options.onLine;
36
+ const outLines = onLine === undefined ? undefined : lineReader(onLine);
37
+ const errLines = onLine === undefined ? undefined : lineReader(onLine);
32
38
  child.stdout?.on('data', (chunk) => {
33
39
  stdout += chunk.toString();
40
+ outLines?.push(chunk.toString());
34
41
  });
35
42
  child.stderr?.on('data', (chunk) => {
36
43
  stderr += chunk.toString();
44
+ errLines?.push(chunk.toString());
37
45
  });
38
46
  child.once('error', (err) => resolve({ code: null, stdout, stderr: err.message }));
39
- child.once('close', (code) => resolve({ code, stdout, stderr }));
47
+ child.once('close', (code) => {
48
+ outLines?.end();
49
+ errLines?.end();
50
+ resolve({ code, stdout, stderr });
51
+ });
40
52
  if (options.stdin !== undefined) {
41
53
  // `docker` may exit without reading it (a bad flag, or no `docker`
42
54
  // at all): the write's EPIPE is reported by the exit, not thrown.
@@ -83,20 +95,43 @@ export function runtimeContainerName(packDir) {
83
95
  return `kindgi-dev-runtime-${createHash('sha256').update(packDir).digest('hex').slice(0, 12)}`;
84
96
  }
85
97
  /**
86
- * Make sure the image is here, pulling it if not. A private image needs
87
- * a registry login first (`kindgi auth registry`); the error says so.
98
+ * Make sure the image is here, pulling it if not: the pull is a phase,
99
+ * said at once, with how much has come as each layer arrives. The image's
100
+ * size comes from its manifest, read beside the pull (it never waits on
101
+ * the registry's answer) and given up when the pull ends. A private image
102
+ * needs a registry login first (`kindgi auth registry`); the error says so.
88
103
  */
89
- export async function ensureRuntimeImage(image, onProgress) {
104
+ export async function ensureRuntimeImage(image, phases = NO_START_PHASES) {
90
105
  const present = await docker(['image', 'inspect', '--format', '{{.Id}}', image]);
91
106
  if (present.code === 0)
92
107
  return { kind: 'ok' };
93
108
  if (present.code === null) {
94
109
  return { kind: 'error', message: `Docker isn't available: ${present.stderr}` };
95
110
  }
96
- onProgress(`Pulling the Kindgi runtime image ${image} (first run only)...`);
97
- const pulled = await docker(['pull', image]);
98
- if (pulled.code === 0)
111
+ phases.begin('pull', `${image} (first run only)`);
112
+ const progress = pullProgress();
113
+ const manifestRead = new AbortController();
114
+ void imageLayers(image, manifestRead.signal)
115
+ .then((layers) => {
116
+ if (layers !== undefined && !manifestRead.signal.aborted) {
117
+ phases.progress('pull', progress.sized(layers));
118
+ }
119
+ })
120
+ // It can't reject today (`docker` reports, never throws); an unhandled rejection would end the CLI.
121
+ .catch(() => undefined);
122
+ const pulled = await docker(['pull', image], {
123
+ onLine: (line) => {
124
+ const note = progress.take(line);
125
+ if (note !== undefined)
126
+ phases.progress('pull', note);
127
+ },
128
+ });
129
+ manifestRead.abort();
130
+ if (pulled.code === 0) {
131
+ const total = progress.totalBytes();
132
+ phases.end('pull', total > 0 ? formatSize(total) : undefined);
99
133
  return { kind: 'ok' };
134
+ }
100
135
  const detail = dockerFailureDetail(pulled.stderr);
101
136
  const helper = credentialHelperFailure(pulled.stderr);
102
137
  const auth = helper !== undefined
@@ -106,11 +141,172 @@ export async function ensureRuntimeImage(image, onProgress) {
106
141
  : '';
107
142
  return { kind: 'error', message: `Couldn't pull ${image}: ${detail}${auth}` };
108
143
  }
144
+ /** How long a registry gets to answer for the image's manifest (the pull goes on meanwhile). */
145
+ const MANIFEST_TIMEOUT_MS = 15_000;
146
+ /**
147
+ * The layers `docker pull` will fetch for this machine, from the image's
148
+ * manifest (`docker manifest inspect --verbose`, a registry read that
149
+ * stores nothing); `undefined` when the registry doesn't say, or for a
150
+ * Docker Hub image, whose manifest reads count against its pull limit.
151
+ */
152
+ async function imageLayers(image, stop) {
153
+ if (registryOf(image) === 'docker.io')
154
+ return undefined;
155
+ const signal = AbortSignal.any([stop, AbortSignal.timeout(MANIFEST_TIMEOUT_MS)]);
156
+ const platform = await docker(['version', '--format', '{{.Server.Os}}/{{.Server.Arch}}'], {
157
+ signal,
158
+ });
159
+ if (platform.code !== 0)
160
+ return undefined;
161
+ const manifest = await docker(['manifest', 'inspect', '--verbose', image], { signal });
162
+ if (manifest.code !== 0)
163
+ return undefined;
164
+ return manifestLayers(manifest.stdout, platform.stdout.trim());
165
+ }
166
+ /**
167
+ * The layers for `platform` (`linux/arm64`) in `docker manifest inspect
168
+ * --verbose`'s output: one entry per platform for an index (attestations,
169
+ * `unknown/unknown`, are skipped), or one manifest.
170
+ */
171
+ export function manifestLayers(json, platform) {
172
+ let parsed;
173
+ try {
174
+ parsed = JSON.parse(json);
175
+ }
176
+ catch {
177
+ return undefined;
178
+ }
179
+ const entries = (Array.isArray(parsed) ? parsed : [parsed]).filter(isObject);
180
+ const [os, architecture] = platform.split('/');
181
+ // One manifest is this machine's; an index's entries name theirs.
182
+ const entry = entries.length === 1
183
+ ? entries[0]
184
+ : entries.find((e) => {
185
+ const p = isObject(e.Descriptor) && isObject(e.Descriptor.platform) ? e.Descriptor.platform : {};
186
+ return p.os === os && p.architecture === architecture;
187
+ });
188
+ return entry === undefined ? undefined : layersOf(entry);
189
+ }
190
+ /** A verbose manifest entry's layers, when each has a digest and a size. */
191
+ function layersOf(entry) {
192
+ const manifest = entry.SchemaV2Manifest ?? entry.OCIManifest;
193
+ const layers = isObject(manifest) ? manifest.layers : undefined;
194
+ if (!Array.isArray(layers) || layers.length === 0)
195
+ return undefined;
196
+ const out = [];
197
+ for (const layer of layers) {
198
+ if (!isObject(layer) || typeof layer.digest !== 'string' || typeof layer.size !== 'number') {
199
+ return undefined;
200
+ }
201
+ out.push({ digest: layer.digest, size: layer.size });
202
+ }
203
+ return out;
204
+ }
205
+ function isObject(value) {
206
+ return value !== null && typeof value === 'object' && !Array.isArray(value);
207
+ }
208
+ /** A pull's line saying a layer is in: its 12-character id. */
209
+ const LAYER_IN = /^([0-9a-f]{12}): (?:Download complete|Pull complete|Already exists)\s*$/;
210
+ /**
211
+ * A pull's progress from its lines: without a terminal, `docker pull`
212
+ * prints no byte counts, only a line as each layer arrives, so the bytes
213
+ * so far are the sizes of the layers in, once the manifest has said them
214
+ * (until then, layers are counted). `take` answers a line that moved it,
215
+ * and `sized` the manifest's layers, with the progress as words.
216
+ */
217
+ export function pullProgress() {
218
+ const sizes = new Map();
219
+ const done = new Set();
220
+ const total = () => [...sizes.values()].reduce((sum, n) => sum + n, 0);
221
+ const note = () => {
222
+ if (sizes.size === 0)
223
+ return `${done.size} ${done.size === 1 ? 'layer' : 'layers'} in`;
224
+ if (done.size === 0)
225
+ return `${formatSize(total())} in ${sizes.size} layers`;
226
+ let bytes = 0;
227
+ for (const d of done)
228
+ bytes += sizes.get(d) ?? 0;
229
+ return `${formatSize(bytes)} of ${formatSize(total())}, ${Math.min(done.size, sizes.size)} of ${sizes.size} layers`;
230
+ };
231
+ return {
232
+ take(line) {
233
+ const id = LAYER_IN.exec(line.replace(/^.*\r/, ''))?.[1];
234
+ if (id === undefined || done.has(id))
235
+ return undefined;
236
+ done.add(id);
237
+ return note();
238
+ },
239
+ sized(layers) {
240
+ for (const layer of layers) {
241
+ sizes.set(layer.digest.replace(/^sha256:/, '').slice(0, 12), layer.size);
242
+ }
243
+ return note();
244
+ },
245
+ totalBytes: total,
246
+ };
247
+ }
248
+ /** The label naming the `kindgi dev` that started a runtime container. */
249
+ export const RUNTIME_OWNER_LABEL = 'kindgi.dev.owner';
250
+ /**
251
+ * The owner named by an existing container's label when it's another
252
+ * `kindgi dev` that is still alive, whether the container runs or not
253
+ * (it's stopped between its create and start, and while its owner reads
254
+ * why it stopped: no `--rm`); `undefined` when it may be replaced:
255
+ * unlabeled (an older CLI's), this `kindgi dev`'s own, or its owner gone.
256
+ */
257
+ export async function ownedElsewhere(label, self) {
258
+ // Whole: the owner holds the process's start time, which has spaces.
259
+ const owner = label.trim();
260
+ if (owner === '' || owner === '<no value>' || owner === self.owner)
261
+ return undefined;
262
+ return (await self.ownerIsLive?.(owner)) === true ? owner : undefined;
263
+ }
264
+ /**
265
+ * Clear the way for this pack's runtime container: one left by an earlier
266
+ * `kindgi dev` of this pack (a crashed session) is removed, but never one
267
+ * another live `kindgi dev` owns (its lock was skipped: an older CLI, a
268
+ * lock removed by hand), which throws `RuntimeOwnedElsewhere` and is left
269
+ * as it is. The port check and the start both go through here. It removes
270
+ * by the id it checked, never by the name, which another could reuse.
271
+ */
272
+ export async function removeReplaceableRuntimeContainer(name, self) {
273
+ const run = self.docker ?? docker;
274
+ const existing = await run([
275
+ 'inspect',
276
+ '--format',
277
+ `{{.Id}} {{index .Config.Labels "${RUNTIME_OWNER_LABEL}"}}`,
278
+ name,
279
+ ]);
280
+ if (existing.code !== 0)
281
+ return;
282
+ // The id has no spaces; the rest is the label, whole.
283
+ const line = existing.stdout.trim();
284
+ const space = line.indexOf(' ');
285
+ const id = space === -1 ? line : line.slice(0, space);
286
+ const owner = await ownedElsewhere(space === -1 ? '' : line.slice(space + 1), self);
287
+ if (owner !== undefined)
288
+ throw new RuntimeOwnedElsewhere(name, owner);
289
+ await run(['rm', '--force', id]);
290
+ }
291
+ /** This pack's runtime container runs for another `kindgi dev`, still alive: it isn't touched. */
292
+ export class RuntimeOwnedElsewhere extends Error {
293
+ container;
294
+ owner;
295
+ constructor(container, owner) {
296
+ const pid = owner.split('@')[0];
297
+ super(`this pack's runtime container (${container}) belongs to another kindgi dev (pid ${pid}), still running`);
298
+ this.container = container;
299
+ this.owner = owner;
300
+ this.name = 'RuntimeOwnedElsewhere';
301
+ }
302
+ }
109
303
  /** The `docker run` arguments for the runtime container. */
110
304
  export function runtimeRunArgs(name, options) {
111
305
  // No --rm: a container that stops while starting is read (its logs, how
112
306
  // it exited) before kindgi dev removes it; `stop` removes it too.
113
307
  const args = ['run', '--detach', '--name', name, '--env-file', options.envFile];
308
+ if (options.owner !== undefined)
309
+ args.push('--label', `${RUNTIME_OWNER_LABEL}=${options.owner}`);
114
310
  args.push('--volume', `${options.packDir}:${RUNTIME_PACK_DIR}`);
115
311
  if (options.googleCredentials !== undefined) {
116
312
  args.push('--volume', `${options.googleCredentials}:${RUNTIME_GOOGLE_CREDENTIALS}:ro`);
@@ -175,18 +371,30 @@ const PACK_DIR_BANNER = ` Pack: ${RUNTIME_PACK_DIR} `;
175
371
  * container for the same pack (a crashed session) is replaced.
176
372
  */
177
373
  export async function startRuntimeContainer(options, wait = {}) {
374
+ const run = options.docker ?? docker;
178
375
  const name = runtimeContainerName(options.packDir);
179
- await docker(['rm', '--force', name]);
180
- const started = await docker(runtimeRunArgs(name, options));
376
+ const phases = options.phases ?? NO_START_PHASES;
377
+ phases.begin('container');
378
+ await removeReplaceableRuntimeContainer(name, options);
379
+ const started = await run(runtimeRunArgs(name, options));
181
380
  if (started.code !== 0) {
182
381
  throw new Error(`docker run failed: ${dockerFailureDetail(started.stderr)}`);
183
382
  }
383
+ // From here on, the container this run started, by its id (`--detach`
384
+ // prints it): never the name, which another kindgi dev could reuse for
385
+ // a container of its own.
386
+ const id = started.stdout.trim().split('\n').pop()?.trim() ?? '';
387
+ if (!/^[0-9a-f]{12,64}$/.test(id)) {
388
+ throw new Error(`docker run printed no container id: ${lastLines(started.stdout)}`);
389
+ }
390
+ phases.end('container');
391
+ phases.begin('serve');
184
392
  // The runtime's latest lines as text (a record as its pretty line, the
185
393
  // JSON boot record as its banner lines), enough for the boot wait and a
186
394
  // failure's tail: a long session's lines aren't kept (they're shown as
187
395
  // they come).
188
396
  const lines = [];
189
- let logs = spawn('docker', ['logs', '--follow', name], {
397
+ let logs = spawn('docker', ['logs', '--follow', id], {
190
398
  stdio: ['ignore', 'pipe', 'pipe'],
191
399
  });
192
400
  const reader = (stream) => lineReader((line) => {
@@ -198,7 +406,12 @@ export async function startRuntimeContainer(options, wait = {}) {
198
406
  lines.push(...textLines(line));
199
407
  if (lines.length > KEPT_LINES)
200
408
  lines.splice(0, lines.length - KEPT_LINES);
201
- options.onLog(line, stream);
409
+ // The runtime's migration records are the migrating phase's start and end.
410
+ const stage = migrationStage(line);
411
+ if (stage === undefined)
412
+ options.onLog(line, stream);
413
+ else
414
+ migrationPhase(stage, phases);
202
415
  });
203
416
  const out = reader('stdout');
204
417
  const err = reader('stderr');
@@ -217,8 +430,8 @@ export async function startRuntimeContainer(options, wait = {}) {
217
430
  };
218
431
  const stop = async () => {
219
432
  stopFollowing();
220
- await docker(['stop', '--time', '10', name]);
221
- await docker(['rm', '--force', name]);
433
+ await run(['stop', '--time', '10', id]);
434
+ await run(['rm', '--force', id]);
222
435
  };
223
436
  const baseUrl = `http://127.0.0.1:${options.hostPort}`;
224
437
  const doFetch = wait.fetch ?? fetch;
@@ -227,7 +440,7 @@ export async function startRuntimeContainer(options, wait = {}) {
227
440
  if (options.signal?.aborted === true) {
228
441
  // It hasn't served anything: removed at once, not stopped gracefully.
229
442
  stopFollowing();
230
- await docker(['rm', '--force', name]);
443
+ await run(['rm', '--force', id]);
231
444
  throw new RuntimeStartStopped();
232
445
  }
233
446
  const healthy = await doFetch(`${baseUrl}/health`, { signal: AbortSignal.timeout(2_000) })
@@ -236,10 +449,10 @@ export async function startRuntimeContainer(options, wait = {}) {
236
449
  // Serving, and its banner printed (the pack line comes after the URL).
237
450
  if (healthy && lines.some((l) => l.startsWith(PACK_DIR_BANNER)))
238
451
  break;
239
- const running = await docker(['inspect', '--format', '{{.State.Running}}', name]);
452
+ const running = await run(['inspect', '--format', '{{.State.Running}}', id]);
240
453
  if (running.code !== 0 || running.stdout.trim() !== 'true') {
241
454
  stopFollowing();
242
- throw await startupFailure(name, lines);
455
+ throw await startupFailure(id, lines, run);
243
456
  }
244
457
  const hopeless = waitingWontHelp(options.image, lines, deadline);
245
458
  if (hopeless !== undefined) {
@@ -248,7 +461,25 @@ export async function startRuntimeContainer(options, wait = {}) {
248
461
  }
249
462
  await pauseUnlessStopped(250, options.signal);
250
463
  }
251
- return { name, baseUrl, banner: lines.join('\n'), stop };
464
+ return { name, id, baseUrl, banner: lines.join('\n'), stop };
465
+ }
466
+ /**
467
+ * Whether a runtime line is one of its migration records: `start` before
468
+ * it applies the database's migrations, `done` after. A runtime that
469
+ * writes none (older images) never shows a migrating phase.
470
+ */
471
+ export function migrationStage(line) {
472
+ const record = parseRecord(line);
473
+ if (record?.subsystem !== 'migrations')
474
+ return undefined;
475
+ return record.stage === 'start' || record.stage === 'done' ? record.stage : undefined;
476
+ }
477
+ /** Migrating begins at its `start` record; its `done` ends it, and waiting for it to serve goes on. */
478
+ function migrationPhase(stage, phases) {
479
+ if (stage === 'start')
480
+ phases.begin('migrate');
481
+ else if (phases.end('migrate'))
482
+ phases.begin('serve');
252
483
  }
253
484
  /** Why waiting longer for a running container won't help, if it won't. */
254
485
  function waitingWontHelp(image, lines, deadline) {
@@ -267,9 +498,9 @@ function waitingWontHelp(image, lines, deadline) {
267
498
  * (one that exits at once can stop before `docker logs --follow`
268
499
  * attaches), then removed.
269
500
  */
270
- async function startupFailure(name, followed) {
271
- const stopped = await stoppedContainer(name);
272
- await docker(['rm', '--force', name]);
501
+ async function startupFailure(id, followed, run) {
502
+ const stopped = await stoppedContainer(id, run);
503
+ await run(['rm', '--force', id]);
273
504
  return new Error(describeStartupStop(stopped.lines.length > 0 ? stopped.lines : followed, stopped.exit));
274
505
  }
275
506
  /**
@@ -300,10 +531,10 @@ function describeExit(exit) {
300
531
  return ` (exit code ${exit.code}${meaning}${error})`;
301
532
  }
302
533
  /** A stopped container's whole log, in the order it was written, and how it exited. */
303
- async function stoppedContainer(name) {
534
+ async function stoppedContainer(id, run) {
304
535
  const logLines = await new Promise((resolve) => {
305
536
  const out = [];
306
- const child = spawn('docker', ['logs', name], { stdio: ['ignore', 'pipe', 'pipe'] });
537
+ const child = spawn('docker', ['logs', id], { stdio: ['ignore', 'pipe', 'pipe'] });
307
538
  const onChunk = (chunk) => {
308
539
  for (const line of chunk.toString().split('\n')) {
309
540
  if (line !== '' && !line.startsWith(DOCKER_DAEMON_ERROR))
@@ -315,11 +546,11 @@ async function stoppedContainer(name) {
315
546
  child.on('error', () => resolve(out));
316
547
  child.on('close', () => resolve(out));
317
548
  });
318
- const state = await docker([
549
+ const state = await run([
319
550
  'inspect',
320
551
  '--format',
321
552
  '{{.State.ExitCode}}|{{.State.OOMKilled}}|{{.State.Error}}',
322
- name,
553
+ id,
323
554
  ]);
324
555
  if (state.code !== 0)
325
556
  return { lines: logLines, exit: {} };
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-container.js","sourceRoot":"","sources":["../../src/dev/runtime-container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime-container.js","sourceRoot":"","sources":["../../src/dev/runtime-container.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@
9
9
  * The image is in private preview on Quay (pull credentials on request at
10
10
  * contact@kindgi.com, then `kindgi auth registry --username <name>`).
11
11
  */
12
- export declare const DEFAULT_RUNTIME_IMAGE = "quay.io/kindgi/runtime:0.1.6-rc.0@sha256:fac3374f8f8aefac5eb91e0ab9d95bd93966cb632a3faec2557b916a63ff9c6c";
12
+ export declare const DEFAULT_RUNTIME_IMAGE = "quay.io/kindgi/runtime:0.1.7-rc.0@sha256:58b1628cb8ac2433fda449243d2599247d0bfe60eb80143172ec11a731290a9b";
13
13
  /**
14
14
  * The registry an image reference is pulled from, read the way Docker
15
15
  * reads it: the first path component when it names a host (it has a `.`
@@ -11,7 +11,7 @@
11
11
  * The image is in private preview on Quay (pull credentials on request at
12
12
  * contact@kindgi.com, then `kindgi auth registry --username <name>`).
13
13
  */
14
- export const DEFAULT_RUNTIME_IMAGE = 'quay.io/kindgi/runtime:0.1.6-rc.0@sha256:fac3374f8f8aefac5eb91e0ab9d95bd93966cb632a3faec2557b916a63ff9c6c';
14
+ export const DEFAULT_RUNTIME_IMAGE = 'quay.io/kindgi/runtime:0.1.7-rc.0@sha256:58b1628cb8ac2433fda449243d2599247d0bfe60eb80143172ec11a731290a9b';
15
15
  /** Docker Hub, the registry of a reference that names none (`busybox`, `library/busybox`). */
16
16
  const DOCKER_HUB = 'docker.io';
17
17
  /**
@@ -0,0 +1,41 @@
1
+ /**
2
+ * What `kindgi dev` says while the Kindgi runtime starts: each phase as it
3
+ * happens, and how long it took. Pulling the image (its size, and how much
4
+ * has come as each layer arrives), starting the container, migrating the
5
+ * database (from the runtime's own `migrations` records; an image that
6
+ * writes none shows no such phase, and that time counts as waiting), then
7
+ * waiting for it to serve. A phase that takes a while gets a line every few
8
+ * seconds, so a long pull or migration never looks stuck.
9
+ */
10
+ export type StartPhase = 'pull' | 'container' | 'migrate' | 'serve';
11
+ export interface StartPhases {
12
+ /** A phase begins. One still open ends without a line (waiting gives way to migrating). */
13
+ begin(phase: StartPhase, note?: string): void;
14
+ /**
15
+ * What `phase` has done so far (a pull's bytes), shown on its next line,
16
+ * if it's the one open (a late answer never lands on the next phase).
17
+ */
18
+ progress(phase: StartPhase, note: string): void;
19
+ /**
20
+ * `phase` ends, if it's the one open: a line saying so, with how long it
21
+ * took. Whether it was (a stray end claims nothing).
22
+ */
23
+ end(phase: StartPhase, note?: string): boolean;
24
+ /** No more lines: the start served, failed or was stopped. */
25
+ close(): void;
26
+ /** How long since the first phase began. */
27
+ elapsedMs(): number;
28
+ }
29
+ /** How often a phase that's still going says so. */
30
+ export declare const PHASE_HEARTBEAT_MS = 3000;
31
+ export declare function createStartPhases(options: {
32
+ readonly emit: (line: string) => void;
33
+ readonly heartbeatMs?: number;
34
+ }): StartPhases;
35
+ /** A duration as people say it: `0.4s`, `12s`, `1m 05s`. */
36
+ export declare function formatDuration(ms: number): string;
37
+ /** A size as docker states one (decimal units): `812 kB`, `48.2 MB`, `412 MB`, `1.24 GB`. */
38
+ export declare function formatSize(bytes: number): string;
39
+ /** No phases: what a start reports when no one listens (a test's fake runtime). */
40
+ export declare const NO_START_PHASES: StartPhases;
41
+ //# sourceMappingURL=start-phases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start-phases.d.ts","sourceRoot":"","sources":["../../src/dev/start-phases.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AAEH,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAEpE,MAAM,WAAW,WAAW;IAC1B,2FAA2F;IAC3F,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9C;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD;;;OAGG;IACH,GAAG,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC/C,8DAA8D;IAC9D,KAAK,IAAI,IAAI,CAAC;IACd,4CAA4C;IAC5C,SAAS,IAAI,MAAM,CAAC;CACrB;AASD,oDAAoD;AACpD,eAAO,MAAM,kBAAkB,OAAO,CAAC;AAKvC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE;IACzC,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,GAAG,WAAW,CA0Dd;AAED,4DAA4D;AAC5D,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED,6FAA6F;AAC7F,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,mFAAmF;AACnF,eAAO,MAAM,eAAe,EAAE,WAM7B,CAAC"}
@@ -0,0 +1,103 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ const LABELS = {
4
+ pull: { doing: 'pulling the runtime image', done: 'pulled the runtime image' },
5
+ container: { doing: 'starting its container', done: 'started its container' },
6
+ migrate: { doing: 'migrating the database', done: 'migrated the database' },
7
+ serve: { doing: 'waiting for it to serve', done: 'serving' },
8
+ };
9
+ /** How often a phase that's still going says so. */
10
+ export const PHASE_HEARTBEAT_MS = 3000;
11
+ /** Phase lines sit under "Starting the Kindgi runtime...". */
12
+ const INDENT = ' ';
13
+ export function createStartPhases(options) {
14
+ const heartbeatMs = options.heartbeatMs ?? PHASE_HEARTBEAT_MS;
15
+ let open;
16
+ let tick;
17
+ let firstAt;
18
+ let closed = false;
19
+ const stopTicking = () => {
20
+ if (tick !== undefined)
21
+ clearInterval(tick);
22
+ tick = undefined;
23
+ };
24
+ // Each phase's own clock: its lines come at 3s, 6s, … into it.
25
+ const startTicking = () => {
26
+ stopTicking();
27
+ tick = setInterval(() => {
28
+ if (open === undefined)
29
+ return;
30
+ const seconds = Math.round((Date.now() - open.startedAt) / 1000);
31
+ const note = open.note === undefined ? '' : `: ${open.note}`;
32
+ options.emit(`${INDENT}⋯ ${LABELS[open.phase].doing}${note} (${seconds}s)`);
33
+ }, heartbeatMs);
34
+ // The heartbeat never keeps the CLI alive by itself.
35
+ tick.unref?.();
36
+ };
37
+ return {
38
+ begin(phase, note) {
39
+ if (closed)
40
+ return;
41
+ const now = Date.now();
42
+ firstAt ??= now;
43
+ open = { phase, startedAt: now, note };
44
+ startTicking();
45
+ // A pull says what's coming at once: its size is news.
46
+ if (phase === 'pull') {
47
+ options.emit(`${INDENT}⋯ ${LABELS.pull.doing}${note === undefined ? '' : `: ${note}`}`);
48
+ open.note = undefined;
49
+ }
50
+ },
51
+ progress(phase, note) {
52
+ if (open?.phase === phase)
53
+ open.note = note;
54
+ },
55
+ end(phase, note) {
56
+ if (closed || open?.phase !== phase)
57
+ return false;
58
+ stopTicking();
59
+ const took = formatDuration(Date.now() - open.startedAt);
60
+ const what = note === undefined ? '' : `: ${note}`;
61
+ options.emit(`${INDENT}✓ ${LABELS[open.phase].done}${what} in ${took}`);
62
+ open = undefined;
63
+ return true;
64
+ },
65
+ close() {
66
+ closed = true;
67
+ open = undefined;
68
+ stopTicking();
69
+ },
70
+ elapsedMs() {
71
+ return firstAt === undefined ? 0 : Date.now() - firstAt;
72
+ },
73
+ };
74
+ }
75
+ /** A duration as people say it: `0.4s`, `12s`, `1m 05s`. */
76
+ export function formatDuration(ms) {
77
+ if (ms < 10_000)
78
+ return `${(Math.max(ms, 0) / 1000).toFixed(1)}s`;
79
+ const seconds = Math.round(ms / 1000);
80
+ if (seconds < 60)
81
+ return `${seconds}s`;
82
+ return `${Math.floor(seconds / 60)}m ${String(seconds % 60).padStart(2, '0')}s`;
83
+ }
84
+ /** A size as docker states one (decimal units): `812 kB`, `48.2 MB`, `412 MB`, `1.24 GB`. */
85
+ export function formatSize(bytes) {
86
+ if (bytes < 1_000_000)
87
+ return `${Math.max(1, Math.round(bytes / 1000))} kB`;
88
+ const mb = bytes / 1_000_000;
89
+ if (mb < 100)
90
+ return `${mb.toFixed(1)} MB`;
91
+ if (mb < 1000)
92
+ return `${Math.round(mb)} MB`;
93
+ return `${(mb / 1000).toFixed(2)} GB`;
94
+ }
95
+ /** No phases: what a start reports when no one listens (a test's fake runtime). */
96
+ export const NO_START_PHASES = {
97
+ begin: () => undefined,
98
+ progress: () => undefined,
99
+ end: () => false,
100
+ close: () => undefined,
101
+ elapsedMs: () => 0,
102
+ };
103
+ //# sourceMappingURL=start-phases.js.map