@kindgi/cli 0.1.6 → 0.1.7

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 (227) hide show
  1. package/README.md +35 -24
  2. package/dist/commands/auth.d.ts.map +1 -1
  3. package/dist/commands/auth.js +5 -4
  4. package/dist/commands/auth.js.map +1 -1
  5. package/dist/commands/dev.d.ts.map +1 -1
  6. package/dist/commands/dev.js +84 -13
  7. package/dist/commands/dev.js.map +1 -1
  8. package/dist/commands/doctor.d.ts +5 -1
  9. package/dist/commands/doctor.d.ts.map +1 -1
  10. package/dist/commands/doctor.js +104 -19
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/guardrails.d.ts.map +1 -1
  13. package/dist/commands/guardrails.js +13 -2
  14. package/dist/commands/guardrails.js.map +1 -1
  15. package/dist/commands/index.d.ts.map +1 -1
  16. package/dist/commands/index.js +4 -0
  17. package/dist/commands/index.js.map +1 -1
  18. package/dist/commands/init.d.ts +1 -1
  19. package/dist/commands/init.d.ts.map +1 -1
  20. package/dist/commands/init.js +23 -3
  21. package/dist/commands/init.js.map +1 -1
  22. package/dist/commands/license.d.ts +3 -0
  23. package/dist/commands/license.d.ts.map +1 -0
  24. package/dist/commands/license.js +187 -0
  25. package/dist/commands/license.js.map +1 -0
  26. package/dist/commands/mcp.js +1 -1
  27. package/dist/commands/providers.d.ts.map +1 -1
  28. package/dist/commands/providers.js +11 -9
  29. package/dist/commands/providers.js.map +1 -1
  30. package/dist/commands/test.d.ts.map +1 -1
  31. package/dist/commands/test.js +21 -9
  32. package/dist/commands/test.js.map +1 -1
  33. package/dist/commands/webhooks.d.ts +20 -0
  34. package/dist/commands/webhooks.d.ts.map +1 -0
  35. package/dist/commands/webhooks.js +444 -0
  36. package/dist/commands/webhooks.js.map +1 -0
  37. package/dist/context.d.ts +4 -0
  38. package/dist/context.d.ts.map +1 -1
  39. package/dist/context.js +1 -0
  40. package/dist/context.js.map +1 -1
  41. package/dist/dev/already-running.d.ts +22 -0
  42. package/dist/dev/already-running.d.ts.map +1 -0
  43. package/dist/dev/already-running.js +72 -0
  44. package/dist/dev/already-running.js.map +1 -0
  45. package/dist/dev/defaults.d.ts.map +1 -1
  46. package/dist/dev/defaults.js +5 -2
  47. package/dist/dev/defaults.js.map +1 -1
  48. package/dist/dev/dev-lock.d.ts +50 -0
  49. package/dist/dev/dev-lock.d.ts.map +1 -0
  50. package/dist/dev/dev-lock.js +203 -0
  51. package/dist/dev/dev-lock.js.map +1 -0
  52. package/dist/dev/port.d.ts +6 -2
  53. package/dist/dev/port.d.ts.map +1 -1
  54. package/dist/dev/port.js +8 -4
  55. package/dist/dev/port.js.map +1 -1
  56. package/dist/dev/providers.d.ts.map +1 -1
  57. package/dist/dev/providers.js +112 -23
  58. package/dist/dev/providers.js.map +1 -1
  59. package/dist/dev/runners.d.ts +21 -2
  60. package/dist/dev/runners.d.ts.map +1 -1
  61. package/dist/dev/runtime-container.d.ts +78 -3
  62. package/dist/dev/runtime-container.d.ts.map +1 -1
  63. package/dist/dev/runtime-container.js +258 -26
  64. package/dist/dev/runtime-container.js.map +1 -1
  65. package/dist/dev/runtime-image.d.ts +4 -3
  66. package/dist/dev/runtime-image.d.ts.map +1 -1
  67. package/dist/dev/runtime-image.js +4 -3
  68. package/dist/dev/runtime-image.js.map +1 -1
  69. package/dist/dev/runtime-registry.d.ts +0 -9
  70. package/dist/dev/runtime-registry.d.ts.map +1 -1
  71. package/dist/dev/runtime-registry.js +12 -2
  72. package/dist/dev/runtime-registry.js.map +1 -1
  73. package/dist/dev/start-phases.d.ts +41 -0
  74. package/dist/dev/start-phases.d.ts.map +1 -0
  75. package/dist/dev/start-phases.js +103 -0
  76. package/dist/dev/start-phases.js.map +1 -0
  77. package/dist/init/augment-scaffolder.d.ts +20 -7
  78. package/dist/init/augment-scaffolder.d.ts.map +1 -1
  79. package/dist/init/augment-scaffolder.js +94 -21
  80. package/dist/init/augment-scaffolder.js.map +1 -1
  81. package/dist/init/pinning.d.ts +39 -0
  82. package/dist/init/pinning.d.ts.map +1 -0
  83. package/dist/init/pinning.js +130 -0
  84. package/dist/init/pinning.js.map +1 -0
  85. package/dist/init/template-files.d.ts +1 -1
  86. package/dist/init/tsconfig-paths.d.ts +29 -0
  87. package/dist/init/tsconfig-paths.d.ts.map +1 -0
  88. package/dist/init/tsconfig-paths.js +235 -0
  89. package/dist/init/tsconfig-paths.js.map +1 -0
  90. package/dist/init/vitest-setup.d.ts +41 -0
  91. package/dist/init/vitest-setup.d.ts.map +1 -0
  92. package/dist/init/vitest-setup.js +163 -0
  93. package/dist/init/vitest-setup.js.map +1 -0
  94. package/dist/license/aws.d.ts +24 -0
  95. package/dist/license/aws.d.ts.map +1 -0
  96. package/dist/license/aws.js +291 -0
  97. package/dist/license/aws.js.map +1 -0
  98. package/dist/license/cloud.d.ts +13 -0
  99. package/dist/license/cloud.d.ts.map +1 -0
  100. package/dist/license/cloud.js +193 -0
  101. package/dist/license/cloud.js.map +1 -0
  102. package/dist/license/expiry.d.ts +33 -0
  103. package/dist/license/expiry.d.ts.map +1 -0
  104. package/dist/license/expiry.js +35 -0
  105. package/dist/license/expiry.js.map +1 -0
  106. package/dist/license/license-key.d.ts +32 -0
  107. package/dist/license/license-key.d.ts.map +1 -0
  108. package/dist/license/license-key.js +91 -0
  109. package/dist/license/license-key.js.map +1 -0
  110. package/dist/license/protocol.d.ts +63 -0
  111. package/dist/license/protocol.d.ts.map +1 -0
  112. package/dist/license/protocol.js +102 -0
  113. package/dist/license/protocol.js.map +1 -0
  114. package/dist/license/renew.d.ts +59 -0
  115. package/dist/license/renew.d.ts.map +1 -0
  116. package/dist/license/renew.js +153 -0
  117. package/dist/license/renew.js.map +1 -0
  118. package/dist/license/stores.d.ts +19 -0
  119. package/dist/license/stores.d.ts.map +1 -0
  120. package/dist/license/stores.js +150 -0
  121. package/dist/license/stores.js.map +1 -0
  122. package/dist/main.d.ts +3 -0
  123. package/dist/main.d.ts.map +1 -1
  124. package/dist/main.js +1 -0
  125. package/dist/main.js.map +1 -1
  126. package/dist/package-manager.d.ts.map +1 -1
  127. package/dist/package-manager.js +2 -1
  128. package/dist/package-manager.js.map +1 -1
  129. package/dist/providers/preset-loader.d.ts +52 -1
  130. package/dist/providers/preset-loader.d.ts.map +1 -1
  131. package/dist/providers/preset-loader.js +85 -6
  132. package/dist/providers/preset-loader.js.map +1 -1
  133. package/dist/providers/presets/anthropic.json +1 -1
  134. package/dist/providers/presets/azure-openai.json +65 -0
  135. package/dist/providers/presets/bedrock.json +102 -0
  136. package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +3 -3
  137. package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +3 -3
  138. package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +11 -10
  139. package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +4 -4
  140. package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +16 -9
  141. package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +9 -11
  142. package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +3 -3
  143. package/dist/sdk-skills/kindgi-getting-started/SKILL.md +28 -5
  144. package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +1 -1
  145. package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +1 -1
  146. package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +1 -1
  147. package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +1 -1
  148. package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +6 -1
  149. package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +1 -1
  150. package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +1 -1
  151. package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +1 -1
  152. package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +1 -1
  153. package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +6 -1
  154. package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +1 -1
  155. package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +1 -1
  156. package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +1 -1
  157. package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +1 -1
  158. package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +6 -1
  159. package/dist/sdk-skills/kindgi-using/SKILL.md +236 -0
  160. package/dist/templates/drupal/.nvmrc +1 -0
  161. package/dist/templates/drupal/AGENTS.md +62 -0
  162. package/dist/templates/drupal/README.md.tmpl +321 -0
  163. package/dist/templates/drupal/agents/content-agent/index.test.ts.tmpl +47 -0
  164. package/dist/templates/drupal/agents/content-agent/index.ts.tmpl +69 -0
  165. package/dist/templates/drupal/agents/content-reviewer/index.test.ts.tmpl +37 -0
  166. package/dist/templates/drupal/agents/content-reviewer/index.ts.tmpl +57 -0
  167. package/dist/templates/drupal/fixtures/node-updated.json +174 -0
  168. package/dist/templates/drupal/flows/content-review/index.ts.tmpl +66 -0
  169. package/dist/templates/drupal/gitignore +8 -0
  170. package/dist/templates/drupal/guardrails/no-contact-details/index.test.ts.tmpl +29 -0
  171. package/dist/templates/drupal/guardrails/no-contact-details/index.ts.tmpl +73 -0
  172. package/dist/templates/drupal/kindgi.config.ts.tmpl +41 -0
  173. package/dist/templates/drupal/lib/drupal.ts.tmpl +64 -0
  174. package/dist/templates/drupal/package.json.tmpl +31 -0
  175. package/dist/templates/drupal/pnpm-workspace.yaml +9 -0
  176. package/dist/templates/drupal/scripts/connect-drupal.mjs.tmpl +57 -0
  177. package/dist/templates/drupal/tools/check-content-event/index.test.ts.tmpl +72 -0
  178. package/dist/templates/drupal/tools/check-content-event/index.ts.tmpl +115 -0
  179. package/dist/templates/drupal/tsconfig.json.tmpl +28 -0
  180. package/dist/templates/drupal/vitest.config.ts.tmpl +14 -0
  181. package/dist/templates/java/AGENTS.md +6 -0
  182. package/dist/templates/java/README.md.tmpl +1 -1
  183. package/dist/templates/minimal/AGENTS.md +6 -0
  184. package/dist/templates/minimal/README.md.tmpl +3 -2
  185. package/dist/templates/minimal/package.json.tmpl +3 -2
  186. package/dist/templates/python/AGENTS.md +3 -2
  187. package/dist/templates/sample/AGENTS.md +6 -0
  188. package/dist/templates/sample/package.json.tmpl +3 -2
  189. package/dist/templates/scala/AGENTS.md +6 -0
  190. package/dist/templates/scala/README.md.tmpl +1 -1
  191. package/dist/templates/woocommerce/.nvmrc +1 -0
  192. package/dist/templates/woocommerce/AGENTS.md +49 -0
  193. package/dist/templates/woocommerce/README.md.tmpl +273 -0
  194. package/dist/templates/woocommerce/agents/order-reviewer/index.test.ts.tmpl +28 -0
  195. package/dist/templates/woocommerce/agents/order-reviewer/index.ts.tmpl +45 -0
  196. package/dist/templates/woocommerce/agents/store-agent/index.test.ts.tmpl +47 -0
  197. package/dist/templates/woocommerce/agents/store-agent/index.ts.tmpl +79 -0
  198. package/dist/templates/woocommerce/fixtures/order-created.json +67 -0
  199. package/dist/templates/woocommerce/flows/order-review/index.ts.tmpl +64 -0
  200. package/dist/templates/woocommerce/gitignore +8 -0
  201. package/dist/templates/woocommerce/guardrails/no-customer-contact-details/index.test.ts.tmpl +29 -0
  202. package/dist/templates/woocommerce/guardrails/no-customer-contact-details/index.ts.tmpl +74 -0
  203. package/dist/templates/woocommerce/kindgi.config.ts.tmpl +41 -0
  204. package/dist/templates/woocommerce/lib/fake-store.ts.tmpl +82 -0
  205. package/dist/templates/woocommerce/lib/woo.ts.tmpl +182 -0
  206. package/dist/templates/woocommerce/package.json.tmpl +30 -0
  207. package/dist/templates/woocommerce/pnpm-workspace.yaml +9 -0
  208. package/dist/templates/woocommerce/tools/check-order-event/index.test.ts.tmpl +76 -0
  209. package/dist/templates/woocommerce/tools/check-order-event/index.ts.tmpl +131 -0
  210. package/dist/templates/woocommerce/tools/find-orders/index.ts.tmpl +80 -0
  211. package/dist/templates/woocommerce/tools/publish-product/index.ts.tmpl +34 -0
  212. package/dist/templates/woocommerce/tools/refund/index.test.ts.tmpl +125 -0
  213. package/dist/templates/woocommerce/tools/refund/index.ts.tmpl +70 -0
  214. package/dist/templates/woocommerce/tools/refund-large/index.test.ts.tmpl +53 -0
  215. package/dist/templates/woocommerce/tools/refund-large/index.ts.tmpl +44 -0
  216. package/dist/templates/woocommerce/tools/set-price/index.ts.tmpl +36 -0
  217. package/dist/templates/woocommerce/tsconfig.json.tmpl +28 -0
  218. package/dist/templates/woocommerce/vitest.config.ts.tmpl +14 -0
  219. package/dist/test/defaults.d.ts +1 -1
  220. package/dist/test/defaults.d.ts.map +1 -1
  221. package/dist/test/defaults.js +2 -7
  222. package/dist/test/defaults.js.map +1 -1
  223. package/dist/test/runners.d.ts +6 -0
  224. package/dist/test/runners.d.ts.map +1 -1
  225. package/dist/test/runners.js +18 -1
  226. package/dist/test/runners.js.map +1 -1
  227. package/package.json +13 -13
@@ -0,0 +1,444 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { randomBytes, randomInt } from 'node:crypto';
4
+ import { formatThrown } from '../errors.js';
5
+ import { renderJson } from '../output.js';
6
+ import { integerFlag, readJsonInput, requiredPositional, runSdk, runSdkRendered, stringFlag, } from './helpers.js';
7
+ /**
8
+ * How each sender signs, from its own source (`--preset`): the API takes
9
+ * the scheme itself, so a sender with no preset is `--signature-*` flags.
10
+ */
11
+ export const WEBHOOK_PRESETS = {
12
+ woocommerce: {
13
+ signature: { kind: 'hmac-sha256', encoding: 'base64', header: 'X-WC-Webhook-Signature' },
14
+ deliveryIdHeader: 'X-WC-Webhook-Delivery-ID',
15
+ where: 'In WooCommerce: Settings → Advanced → Webhooks → Add webhook. One webhook per topic (`order.created`, …); Delivery URL: the receive URL; Secret: the secret. WooCommerce never resends a delivery Kindgi refuses, and switches the webhook off after 7 in a row.',
16
+ },
17
+ 'drupal-webhooks': {
18
+ signature: {
19
+ kind: 'hmac-sha256',
20
+ encoding: 'hex',
21
+ header: 'X-Hub-Signature-256',
22
+ prefix: 'sha256=',
23
+ },
24
+ deliveryIdHeader: 'X-Drupal-Delivery',
25
+ where: "In Drupal's Webhooks module: add an outgoing webhook with the receive URL as its Payload URL and the secret as its Secret (it signs only with one).",
26
+ },
27
+ github: {
28
+ signature: {
29
+ kind: 'hmac-sha256',
30
+ encoding: 'hex',
31
+ header: 'X-Hub-Signature-256',
32
+ prefix: 'sha256=',
33
+ },
34
+ deliveryIdHeader: 'X-GitHub-Delivery',
35
+ where: "In GitHub: the repository's or organization's Settings → Webhooks → Add webhook; Payload URL: the receive URL; Content type: application/json; Secret: the secret.",
36
+ },
37
+ shopify: {
38
+ signature: { kind: 'hmac-sha256', encoding: 'base64', header: 'X-Shopify-Hmac-Sha256' },
39
+ deliveryIdHeader: 'X-Shopify-Webhook-Id',
40
+ where: "In Shopify: a webhook subscription to the receive URL; Shopify signs with the app's client secret, so store that as the secret.",
41
+ },
42
+ 'standard-webhooks': {
43
+ signature: { kind: 'standard-webhooks' },
44
+ where: 'In the sender: the receive URL as the endpoint, and the secret (`whsec_…`) as its signing secret.',
45
+ },
46
+ };
47
+ const PRESET_NAMES = Object.keys(WEBHOOK_PRESETS).join('|');
48
+ const PAGE_FLAGS = {
49
+ limit: { type: 'string', description: 'The most to return (default 25, at most 100).' },
50
+ cursor: {
51
+ type: 'string',
52
+ description: "Resume after this cursor, from the previous page's `nextCursor`.",
53
+ },
54
+ };
55
+ function page(ctx) {
56
+ const limit = integerFlag(ctx, 'limit');
57
+ const cursor = stringFlag(ctx, 'cursor');
58
+ return {
59
+ ...(limit !== undefined && { limit }),
60
+ ...(cursor !== undefined && { cursor }),
61
+ };
62
+ }
63
+ /** How a trigger's sender signs, as one cell: `base64 X-WC-Webhook-Signature`, `standard-webhooks`. */
64
+ function signedCell(t) {
65
+ const s = t.signature;
66
+ if (s.kind === 'standard-webhooks')
67
+ return 'standard-webhooks';
68
+ return `${s.encoding} ${s.header}${s.prefix !== undefined ? ` (${s.prefix}…)` : ''}`;
69
+ }
70
+ const TRIGGERS_TABLE = {
71
+ rows: (p) => p.data,
72
+ columns: [
73
+ { header: 'ID', get: (t) => t.triggerId },
74
+ { header: 'FLOW', get: (t) => `${t.flowId}@${t.flowVersion}` },
75
+ { header: 'SIGNED', get: signedCell },
76
+ { header: 'STATUS', get: (t) => t.status },
77
+ { header: 'OWNER', get: (t) => t.owner.displayName ?? t.owner.id },
78
+ { header: 'LAST', get: (t) => t.lastFiredAt ?? '' },
79
+ { header: 'LABEL', get: (t) => t.label ?? '' },
80
+ ],
81
+ };
82
+ const FIRES_TABLE = {
83
+ rows: (p) => p.data,
84
+ columns: [
85
+ { header: 'RECEIVED', get: (f) => f.firedAt },
86
+ { header: 'OUTCOME', get: (f) => f.outcome },
87
+ { header: 'RUN', get: (f) => f.runId ?? '' },
88
+ { header: 'NOTE', get: (f) => f.detail ?? '' },
89
+ {
90
+ header: 'REPEATS',
91
+ get: (f) => (f.duplicates !== undefined ? String(f.duplicates) : ''),
92
+ },
93
+ ],
94
+ };
95
+ const SIGNATURE_FLAGS = {
96
+ preset: {
97
+ type: 'string',
98
+ description: `How the sender signs, by sender: ${PRESET_NAMES}. Sets the scheme and the delivery-id header.`,
99
+ },
100
+ 'signature-header': {
101
+ type: 'string',
102
+ description: 'Instead of --preset: the header that carries an HMAC-SHA256 of the raw body (with --signature-encoding).',
103
+ },
104
+ 'signature-encoding': {
105
+ type: 'string',
106
+ description: 'With --signature-header: `hex` or `base64`.',
107
+ },
108
+ 'signature-prefix': {
109
+ type: 'string',
110
+ description: 'With --signature-header: stripped before decoding (e.g. `sha256=`).',
111
+ },
112
+ 'delivery-id-header': {
113
+ type: 'string',
114
+ description: 'The header whose value, with the body, dedupes deliveries (a preset sets it; `none` on update stops deduping).',
115
+ },
116
+ 'body-limit': {
117
+ type: 'string',
118
+ description: 'The largest body it takes, in bytes (1024 to 1048576; default 262144).',
119
+ },
120
+ 'rate-limit': {
121
+ type: 'string',
122
+ description: 'Accepted deliveries a minute (1 to 6000; default 600); past it, 429.',
123
+ },
124
+ label: { type: 'string', description: 'A short label.' },
125
+ };
126
+ /** The scheme and delivery fields from `--preset` or the `--signature-*` flags. */
127
+ function signatureFields(ctx) {
128
+ const preset = stringFlag(ctx, 'preset');
129
+ const header = stringFlag(ctx, 'signature-header');
130
+ const encoding = stringFlag(ctx, 'signature-encoding');
131
+ const prefix = stringFlag(ctx, 'signature-prefix');
132
+ const delivery = stringFlag(ctx, 'delivery-id-header');
133
+ const deliveryField = delivery === undefined ? {} : { deliveryIdHeader: delivery === 'none' ? null : delivery };
134
+ if (preset !== undefined) {
135
+ if (header !== undefined || encoding !== undefined || prefix !== undefined) {
136
+ throw new Error('--preset sets the scheme: not with --signature-header/-encoding/-prefix');
137
+ }
138
+ const p = WEBHOOK_PRESETS[preset];
139
+ if (p === undefined)
140
+ throw new Error(`--preset must be one of ${PRESET_NAMES}`);
141
+ return {
142
+ signature: p.signature,
143
+ ...(p.deliveryIdHeader !== undefined && { deliveryIdHeader: p.deliveryIdHeader }),
144
+ ...deliveryField,
145
+ };
146
+ }
147
+ if (header === undefined) {
148
+ if (encoding !== undefined || prefix !== undefined) {
149
+ throw new Error('--signature-encoding and --signature-prefix go with --signature-header');
150
+ }
151
+ return deliveryField;
152
+ }
153
+ if (encoding !== 'hex' && encoding !== 'base64') {
154
+ throw new Error('--signature-header needs --signature-encoding=hex|base64');
155
+ }
156
+ return {
157
+ signature: {
158
+ kind: 'hmac-sha256',
159
+ encoding,
160
+ header,
161
+ ...(prefix !== undefined && { prefix }),
162
+ },
163
+ ...deliveryField,
164
+ };
165
+ }
166
+ function limitFields(ctx) {
167
+ const body = integerFlag(ctx, 'body-limit');
168
+ const rate = integerFlag(ctx, 'rate-limit');
169
+ return {
170
+ ...(body !== undefined && { bodyLimitBytes: body }),
171
+ ...(rate !== undefined && { rateLimitPerMinute: rate }),
172
+ };
173
+ }
174
+ /**
175
+ * A new signing secret. `standard-webhooks`: `whsec_` and 32 random bytes in
176
+ * base64. Otherwise 40 letters and digits: WooCommerce HTML-decodes its
177
+ * secret before signing, so anything else could sign differently.
178
+ */
179
+ export function generateSigningSecret(signature) {
180
+ if (signature?.kind === 'standard-webhooks') {
181
+ return `whsec_${randomBytes(32).toString('base64')}`;
182
+ }
183
+ const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
184
+ let out = '';
185
+ for (let i = 0; i < 40; i++)
186
+ out += alphabet[randomInt(alphabet.length)];
187
+ return out;
188
+ }
189
+ /** Where to point the sender, or why there's nothing to point it at yet. */
190
+ function receiveNote(t) {
191
+ return t.receiveUrl !== undefined
192
+ ? ` Receive URL (the sender posts here): ${t.receiveUrl}\n`
193
+ : ` No receive URL: this deployment has no public URL configured. Set KINDGI_PUBLIC_URL on the runtime to the address your sender reaches it at, then \`kindgi webhooks get ${t.triggerId}\` shows it.\n`;
194
+ }
195
+ function secretExists(name, env) {
196
+ return `A secret named ${name} already exists in ${env}: pick another --secret, or store your own value with \`kindgi secrets set\` and drop --generate-secret`;
197
+ }
198
+ /**
199
+ * Store a generated secret once its trigger exists, so a refused register
200
+ * leaves no secret behind (the trigger refuses deliveries until it's stored,
201
+ * and no sender has the value yet). What went wrong, or `undefined`.
202
+ */
203
+ async function storeGenerated(ctx, name, generated) {
204
+ try {
205
+ const stored = await ctx.client().secrets.set({
206
+ scope: { kind: 'tenant' },
207
+ envName: generated.env,
208
+ name,
209
+ value: generated.value,
210
+ writeMode: 'create-new',
211
+ });
212
+ return stored.kind === 'version-conflict'
213
+ ? new Error(secretExists(name, generated.env))
214
+ : undefined;
215
+ }
216
+ catch (err) {
217
+ return err;
218
+ }
219
+ }
220
+ const register = {
221
+ kind: 'leaf',
222
+ name: 'register',
223
+ description: "Start a flow's run when a signed request arrives: from WooCommerce, Drupal's Webhooks module, GitHub, Shopify, or any sender that signs with HMAC-SHA256 or Standard Webhooks. Its runs act as you, checked again at every delivery. The event the flow gets is data from outside, never instructions: check it in a step before any agent, and keep the agent that reads it read-only.",
224
+ usage: `kindgi webhooks register --flow=<id> --flow-version=<v> (--secret=<name> | --generate-secret --secret=<name> --env=<env>) [--preset=${PRESET_NAMES} | --signature-header=<h> --signature-encoding=hex|base64 [--signature-prefix=<p>]] [--delivery-id-header=<h>] [--input=<json-or-@file>] [--project=<project-id>] [--body-limit=<bytes>] [--rate-limit=<per-minute>] [--label=<text>]`,
225
+ optionSpec: {
226
+ flow: { type: 'string', description: 'The flow each delivery starts.' },
227
+ 'flow-version': { type: 'string', description: 'The flow version.' },
228
+ secret: {
229
+ type: 'string',
230
+ description: "The signing secret's name (written with `kindgi secrets set`, at the tenant, in the env the runtime serves). Never a model provider's key.",
231
+ },
232
+ 'generate-secret': {
233
+ type: 'boolean',
234
+ description: 'Make a new signing secret, store it as --secret in --env (at the tenant), and show it once, to paste into the sender. Letters and digits only (WooCommerce HTML-decodes its secret); `whsec_…` with --preset=standard-webhooks.',
235
+ },
236
+ env: {
237
+ type: 'string',
238
+ description: 'With --generate-secret: the env the runtime serves, where the secret is stored (`local` under `kindgi dev`).',
239
+ },
240
+ input: {
241
+ type: 'string',
242
+ description: "The flow's input on every delivery, in place of the event, as JSON or `@<file>` (default: the event).",
243
+ },
244
+ project: {
245
+ type: 'string',
246
+ description: "The trigger's project, by id (default: the tenant's Default project).",
247
+ },
248
+ ...SIGNATURE_FLAGS,
249
+ },
250
+ run: (ctx) => runSdkRendered(ctx, 'webhooks register', async () => {
251
+ const flowId = stringFlag(ctx, 'flow');
252
+ const flowVersion = stringFlag(ctx, 'flow-version');
253
+ const secretName = stringFlag(ctx, 'secret');
254
+ if (flowId === undefined || flowVersion === undefined) {
255
+ throw new Error('--flow=<id> and --flow-version=<v> are required');
256
+ }
257
+ if (secretName === undefined)
258
+ throw new Error('--secret=<name> is required');
259
+ const signing = signatureFields(ctx);
260
+ const generate = ctx.options['generate-secret'] === true;
261
+ let generated;
262
+ if (generate) {
263
+ const env = stringFlag(ctx, 'env');
264
+ if (env === undefined) {
265
+ throw new Error('--generate-secret needs --env=<env>: the env the runtime serves (`local` under `kindgi dev`)');
266
+ }
267
+ // A generated secret never replaces one; checked before anything is made.
268
+ const existing = await ctx.client().secrets.get({
269
+ scope: { kind: 'tenant' },
270
+ envName: env,
271
+ name: secretName,
272
+ });
273
+ if (existing !== null)
274
+ throw new Error(secretExists(secretName, env));
275
+ generated = { value: generateSigningSecret(signing.signature), env };
276
+ }
277
+ const input = stringFlag(ctx, 'input');
278
+ const project = stringFlag(ctx, 'project');
279
+ const label = stringFlag(ctx, 'label');
280
+ const deliveryIdHeader = signing.deliveryIdHeader;
281
+ const trigger = await ctx.client().webhooks.register({
282
+ flowId,
283
+ flowVersion,
284
+ hmacSecretName: secretName,
285
+ ...(signing.signature !== undefined && { signature: signing.signature }),
286
+ ...(typeof deliveryIdHeader === 'string' && { deliveryIdHeader }),
287
+ ...limitFields(ctx),
288
+ ...(input !== undefined && { config: { input: await readJsonInput(input) } }),
289
+ ...(project !== undefined && { projectId: project }),
290
+ ...(label !== undefined && { label }),
291
+ });
292
+ const preset = stringFlag(ctx, 'preset');
293
+ const rendered = renderJson(trigger, ctx.globals.format);
294
+ if (generated !== undefined) {
295
+ const failed = await storeGenerated(ctx, secretName, generated);
296
+ if (failed !== undefined) {
297
+ const cliErr = formatThrown(failed, {
298
+ commandLabel: 'webhooks register',
299
+ verbose: ctx.globals.verbose,
300
+ });
301
+ return {
302
+ stdout: rendered.stdout,
303
+ stderr: [
304
+ cliErr.stderr.trimEnd(),
305
+ ` Registered webhook trigger ${trigger.triggerId}, but its signing secret wasn't stored. It refuses every delivery until ${secretName} holds a value in ${generated.env}: store one with \`kindgi secrets set ${secretName} --env=${generated.env} --scope=tenant --from-stdin\` and paste the same value into the sender, or remove the trigger with \`kindgi webhooks unregister ${trigger.triggerId}\`.`,
306
+ '',
307
+ ].join('\n'),
308
+ exitCode: cliErr.exitCode,
309
+ };
310
+ }
311
+ }
312
+ return {
313
+ stdout: rendered.stdout,
314
+ stderr: [
315
+ '',
316
+ ` Registered webhook trigger ${trigger.triggerId}: each signed delivery starts ${flowId}@${flowVersion}.`,
317
+ receiveNote(trigger).trimEnd(),
318
+ ...(generated !== undefined
319
+ ? [
320
+ ` Signing secret (stored as ${secretName} in ${generated.env}; shown this once): ${generated.value}`,
321
+ ]
322
+ : []),
323
+ ...(preset !== undefined ? [` ${WEBHOOK_PRESETS[preset]?.where ?? ''}`] : []),
324
+ '',
325
+ '',
326
+ ].join('\n'),
327
+ };
328
+ }),
329
+ };
330
+ const list = {
331
+ kind: 'leaf',
332
+ name: 'list',
333
+ description: 'List webhook triggers.',
334
+ usage: 'kindgi webhooks list [--project=<project-id>] [--status=active|paused] [--limit=<n>] [--cursor=<c>]',
335
+ optionSpec: {
336
+ project: { type: 'string', description: "Only this project's webhook triggers." },
337
+ status: { type: 'string', description: 'Only `active` or only `paused` triggers.' },
338
+ ...PAGE_FLAGS,
339
+ },
340
+ run: (ctx) => runSdk(ctx, 'webhooks list', async () => {
341
+ const status = stringFlag(ctx, 'status');
342
+ if (status !== undefined && status !== 'active' && status !== 'paused') {
343
+ throw new Error('--status must be `active` or `paused`');
344
+ }
345
+ const projectId = stringFlag(ctx, 'project');
346
+ return await ctx.client().webhooks.list({
347
+ ...page(ctx),
348
+ ...(status !== undefined && { status }),
349
+ ...(projectId !== undefined && { projectId }),
350
+ });
351
+ }, TRIGGERS_TABLE),
352
+ };
353
+ const get = {
354
+ kind: 'leaf',
355
+ name: 'get',
356
+ description: 'Fetch a webhook trigger, with its receive URL.',
357
+ usage: 'kindgi webhooks get <trigger-id>',
358
+ run: (ctx) => runSdkRendered(ctx, 'webhooks get', async () => {
359
+ const trigger = await ctx.client().webhooks.get(requiredPositional(ctx, 0, 'trigger-id'));
360
+ const rendered = renderJson(trigger, ctx.globals.format);
361
+ return { stdout: rendered.stdout, stderr: `\n${receiveNote(trigger)}\n` };
362
+ }),
363
+ };
364
+ const update = {
365
+ kind: 'leaf',
366
+ name: 'update',
367
+ description: 'Change a webhook trigger: its flow version, input, secret, scheme, delivery-id header or limits. Its flow stays: register another trigger for another flow.',
368
+ usage: `kindgi webhooks update <trigger-id> [--flow-version=<v>] [--input=<json-or-@file>] [--secret=<name>] [--preset=${PRESET_NAMES} | --signature-header=<h> --signature-encoding=hex|base64 [--signature-prefix=<p>]] [--delivery-id-header=<h>|none] [--body-limit=<bytes>] [--rate-limit=<per-minute>] [--label=<text>]`,
369
+ optionSpec: {
370
+ 'flow-version': { type: 'string', description: 'Start this flow version instead.' },
371
+ input: {
372
+ type: 'string',
373
+ description: "The flow's input on every delivery, as JSON or `@<file>`.",
374
+ },
375
+ secret: {
376
+ type: 'string',
377
+ description: "Verify with another secret, by name. To change a secret's value, use `kindgi secrets rotate`.",
378
+ },
379
+ ...SIGNATURE_FLAGS,
380
+ },
381
+ run: (ctx) => runSdk(ctx, 'webhooks update', async () => {
382
+ const id = requiredPositional(ctx, 0, 'trigger-id');
383
+ const flowVersion = stringFlag(ctx, 'flow-version');
384
+ const input = stringFlag(ctx, 'input');
385
+ const secret = stringFlag(ctx, 'secret');
386
+ const label = stringFlag(ctx, 'label');
387
+ return await ctx.client().webhooks.update(id, {
388
+ ...(flowVersion !== undefined && { flowVersion }),
389
+ ...(input !== undefined && { config: { input: await readJsonInput(input) } }),
390
+ ...(secret !== undefined && { hmacSecretName: secret }),
391
+ ...signatureFields(ctx),
392
+ ...limitFields(ctx),
393
+ ...(label !== undefined && { label }),
394
+ });
395
+ }),
396
+ };
397
+ const pause = {
398
+ kind: 'leaf',
399
+ name: 'pause',
400
+ description: 'Pause a webhook trigger. Deliveries are still taken (so the sender keeps the webhook on), recorded as skipped, and start nothing: their events are dropped, and WooCommerce never resends them.',
401
+ usage: 'kindgi webhooks pause <trigger-id>',
402
+ run: (ctx) => runSdkRendered(ctx, 'webhooks pause', async () => {
403
+ const trigger = await ctx.client().webhooks.pause(requiredPositional(ctx, 0, 'trigger-id'));
404
+ const rendered = renderJson(trigger, ctx.globals.format);
405
+ return {
406
+ stdout: rendered.stdout,
407
+ stderr: '\n Paused. Deliveries are taken and recorded as skipped (`kindgi webhooks fires`), and start nothing: their events are dropped. WooCommerce never resends them, so resuming does not bring them back.\n\n',
408
+ };
409
+ }),
410
+ };
411
+ function byId(name, description, call) {
412
+ return {
413
+ kind: 'leaf',
414
+ name,
415
+ description,
416
+ usage: `kindgi webhooks ${name} <trigger-id>`,
417
+ run: (ctx) => runSdk(ctx, `webhooks ${name}`, async () => call(ctx.client().webhooks, requiredPositional(ctx, 0, 'trigger-id'))),
418
+ };
419
+ }
420
+ const fires = {
421
+ kind: 'leaf',
422
+ name: 'fires',
423
+ description: "A webhook trigger's deliveries, newest first: the run each started, or why it was skipped (paused) or refused (a wrong or missing signature, a stale one, the limits, …). A fire keeps the event only until its run starts.",
424
+ usage: 'kindgi webhooks fires <trigger-id> [--limit=<n>] [--cursor=<c>]',
425
+ optionSpec: PAGE_FLAGS,
426
+ run: (ctx) => runSdk(ctx, 'webhooks fires', async () => await ctx.client().webhooks.fires(requiredPositional(ctx, 0, 'trigger-id'), page(ctx)), FIRES_TABLE),
427
+ };
428
+ export const webhooksCommand = {
429
+ kind: 'group',
430
+ name: 'webhooks',
431
+ description: 'Start flow runs from signed webhooks (WooCommerce, Drupal, GitHub, Shopify, Standard Webhooks): register, list, get, update, pause, resume, fires, take-ownership, unregister.',
432
+ subcommands: [
433
+ register,
434
+ list,
435
+ get,
436
+ update,
437
+ pause,
438
+ byId('resume', 'Resume a paused webhook trigger: deliveries start runs again.', (w, id) => w.resume(id)),
439
+ fires,
440
+ byId('take-ownership', "Become a webhook trigger's owner, so its runs act as you (for a trigger whose owner left).", (w, id) => w.takeOwnership(id)),
441
+ byId('unregister', 'Remove a webhook trigger: its sender is answered 410 from now on.', (w, id) => w.unregister(id)),
442
+ ],
443
+ };
444
+ //# sourceMappingURL=webhooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/commands/webhooks.ts"],"names":[],"mappings":"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"}
package/dist/context.d.ts CHANGED
@@ -9,6 +9,7 @@ import type { DeployRunners } from './deploy/runners.js';
9
9
  import type { DevRunners } from './dev/runners.js';
10
10
  import type { EnvRunners } from './env/runners.js';
11
11
  import type { KeyRunners } from './key/runners.js';
12
+ import type { LicenseCommandDeps } from './license/renew.js';
12
13
  import type { OpenUrl } from './open-url.js';
13
14
  import type { PackageManager } from './package-manager.js';
14
15
  import type { GlobalFlags, OptionValue } from './parse.js';
@@ -115,6 +116,8 @@ export interface CommandContext {
115
116
  * lazy-loads `key/defaults.ts` on dispatch.
116
117
  */
117
118
  readonly keyRunners: KeyRunners | undefined;
119
+ /** Injectable seams for `kindgi license renew` (its clock, its fetch): tests only. */
120
+ readonly licenseDeps?: LicenseCommandDeps;
118
121
  /**
119
122
  * Injectable value-input seams for `kindgi secrets set` /
120
123
  * `rotate`. Tests pass fixtures so the TTY prompt / stdin reader /
@@ -177,6 +180,7 @@ export interface BuildContextInputs {
177
180
  readonly testRunners?: TestRunners;
178
181
  readonly envRunners?: EnvRunners;
179
182
  readonly keyRunners?: KeyRunners;
183
+ readonly licenseDeps?: LicenseCommandDeps;
180
184
  readonly secretsInputSeam?: SecretsValueInputSeam;
181
185
  readonly envInitInputSeam?: EnvInitInputSeam;
182
186
  readonly registryAuthSeam?: RegistryAuthSeam;
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
package/dist/context.js CHANGED
@@ -37,6 +37,7 @@ export function buildContext(inputs) {
37
37
  testRunners: inputs.testRunners,
38
38
  envRunners: inputs.envRunners,
39
39
  keyRunners: inputs.keyRunners,
40
+ ...(inputs.licenseDeps !== undefined && { licenseDeps: inputs.licenseDeps }),
40
41
  secretsInputSeam: inputs.secretsInputSeam,
41
42
  envInitInputSeam: inputs.envInitInputSeam,
42
43
  registryAuthSeam: inputs.registryAuthSeam,
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAqB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA8LjE,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,MAAM,GAAG,GAAW,EAAE;QAC1B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,GAAW,EAAE;QACzB,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B,CAAC,CAAC;IACF,MAAM,OAAO,GACX,MAAM,CAAC,aAAa;QACpB,CAAC,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;QACxC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QAC1C,MAAM;QACN,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QAChC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC,OAAO,EAAqB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAkMjE,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,MAAM,MAAM,GAAG,GAAW,EAAE;QAC1B,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,yFAAyF,CAC1F,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,GAAW,EAAE;QACzB,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CACb,+FAA+F,CAChG,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;IAC7B,CAAC,CAAC;IACF,MAAM,OAAO,GACX,MAAM,CAAC,aAAa;QACpB,CAAC,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE,CAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC;QACxC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;QAC1C,MAAM;QACN,KAAK;QACL,KAAK,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QAChC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QAChC,GAAG,EAAE,MAAM,CAAC,GAAG,IAAI,EAAE;QACrB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QAC5E,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;KACxB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * What a second `kindgi dev` in a pack says, and exits with: where the
3
+ * running one is, and how to restart it. Exit code 3 always means this,
4
+ * so a script or a coding agent can tell "already running" from "failed"
5
+ * before reading a word.
6
+ */
7
+ import type { CommandResult } from '../commands/types.js';
8
+ import { type OutputFormat } from '../output.js';
9
+ import type { DevLockRecord } from './dev-lock.js';
10
+ /** `kindgi dev` is already running for this pack. */
11
+ export declare const ALREADY_RUNNING_EXIT_CODE = 3;
12
+ /** Whether the running one's runtime answers: `undefined` when it hasn't said where it serves yet. */
13
+ export declare function runtimeAnswers(holder: DevLockRecord, fetchFn: typeof fetch): Promise<boolean | undefined>;
14
+ /** The refusal's words. */
15
+ export declare function alreadyRunningText(holder: DevLockRecord, answering: boolean | undefined): string;
16
+ /** The refusal: its words on stderr, the facts on stdout when a format was asked for, exit 3. */
17
+ export declare function alreadyRunning(holder: DevLockRecord, options: {
18
+ readonly fetch: typeof fetch;
19
+ readonly format: OutputFormat;
20
+ readonly formatRequested: boolean;
21
+ }): Promise<CommandResult>;
22
+ //# sourceMappingURL=already-running.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"already-running.d.ts","sourceRoot":"","sources":["../../src/dev/already-running.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,YAAY,EAAc,MAAM,cAAc,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD,qDAAqD;AACrD,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,sGAAsG;AACtG,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,KAAK,GACpB,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAQ9B;AAaD,2BAA2B;AAC3B,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAwBhG;AAED,iGAAiG;AACjG,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE;IACP,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,GACA,OAAO,CAAC,aAAa,CAAC,CAqBxB"}
@@ -0,0 +1,72 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ import { renderJson } from '../output.js';
4
+ /** `kindgi dev` is already running for this pack. */
5
+ export const ALREADY_RUNNING_EXIT_CODE = 3;
6
+ /** Whether the running one's runtime answers: `undefined` when it hasn't said where it serves yet. */
7
+ export async function runtimeAnswers(holder, fetchFn) {
8
+ if (holder.apiUrl === undefined)
9
+ return undefined;
10
+ try {
11
+ const res = await fetchFn(`${holder.apiUrl}/ready`, { signal: AbortSignal.timeout(2_000) });
12
+ return res.ok;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ function stopCommand(pid) {
19
+ return process.platform === 'win32' ? `taskkill /PID ${pid}` : `kill ${pid}`;
20
+ }
21
+ function since(takenAt) {
22
+ const at = new Date(takenAt);
23
+ return Number.isNaN(at.getTime())
24
+ ? takenAt
25
+ : at.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
26
+ }
27
+ /** The refusal's words. */
28
+ export function alreadyRunningText(holder, answering) {
29
+ const who = `pid ${holder.pid}, since ${since(holder.takenAt)}`;
30
+ const stop = stopCommand(holder.pid);
31
+ if (answering === false) {
32
+ return [
33
+ `kindgi dev: kindgi dev is already running for this pack (${who}), but its runtime isn't answering at ${holder.apiUrl}.`,
34
+ `Stop it (Ctrl+C in its terminal, or \`${stop}\`), then run kindgi dev again.`,
35
+ '',
36
+ ].join('\n');
37
+ }
38
+ const where = answering === true
39
+ ? [
40
+ ...(holder.consoleUrl !== undefined ? [` Console ${holder.consoleUrl}`] : []),
41
+ ` API ${holder.apiUrl} (.kindgirc.json points here)`,
42
+ ]
43
+ : [' It is still starting.'];
44
+ return [
45
+ `kindgi dev: kindgi dev is already running for this pack (${who}).`,
46
+ ...where,
47
+ "It reloads the pack when its files change, so you don't need a second one.",
48
+ `To restart it: stop that one first (Ctrl+C in its terminal, or \`${stop}\`), then run kindgi dev again.`,
49
+ '',
50
+ ].join('\n');
51
+ }
52
+ /** The refusal: its words on stderr, the facts on stdout when a format was asked for, exit 3. */
53
+ export async function alreadyRunning(holder, options) {
54
+ const answering = await runtimeAnswers(holder, options.fetch);
55
+ const stdout = options.formatRequested
56
+ ? renderJson({
57
+ running: {
58
+ pid: holder.pid,
59
+ since: holder.takenAt,
60
+ ...(holder.apiUrl !== undefined && { apiUrl: holder.apiUrl }),
61
+ ...(holder.consoleUrl !== undefined && { consoleUrl: holder.consoleUrl }),
62
+ answering: answering ?? null,
63
+ },
64
+ }, options.format).stdout
65
+ : '';
66
+ return {
67
+ kind: 'ok',
68
+ rendered: { stdout, stderr: alreadyRunningText(holder, answering) },
69
+ exitCode: ALREADY_RUNNING_EXIT_CODE,
70
+ };
71
+ }
72
+ //# sourceMappingURL=already-running.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"already-running.js","sourceRoot":"","sources":["../../src/dev/already-running.ts"],"names":[],"mappings":"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"}