@kindgi/cli 0.1.11-rc.0 → 0.2.0-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 (343) hide show
  1. package/README.md +77 -33
  2. package/dist/build/containerfile.d.ts +2 -0
  3. package/dist/build/containerfile.d.ts.map +1 -1
  4. package/dist/build/containerfile.js +14 -3
  5. package/dist/build/containerfile.js.map +1 -1
  6. package/dist/build/defaults.d.ts +2 -0
  7. package/dist/build/defaults.d.ts.map +1 -1
  8. package/dist/build/defaults.js +8 -0
  9. package/dist/build/defaults.js.map +1 -1
  10. package/dist/build/hosted.d.ts +2 -9
  11. package/dist/build/hosted.d.ts.map +1 -1
  12. package/dist/build/hosted.js +4 -2
  13. package/dist/build/hosted.js.map +1 -1
  14. package/dist/build/pack-blocks.d.ts +51 -0
  15. package/dist/build/pack-blocks.d.ts.map +1 -0
  16. package/dist/build/pack-blocks.js +98 -0
  17. package/dist/build/pack-blocks.js.map +1 -0
  18. package/dist/build/runners.d.ts +5 -1
  19. package/dist/build/runners.d.ts.map +1 -1
  20. package/dist/cli.js +4 -0
  21. package/dist/cli.js.map +1 -1
  22. package/dist/commands/adapters.d.ts.map +1 -1
  23. package/dist/commands/adapters.js +12 -6
  24. package/dist/commands/adapters.js.map +1 -1
  25. package/dist/commands/agents.js +8 -8
  26. package/dist/commands/agents.js.map +1 -1
  27. package/dist/commands/auth.d.ts.map +1 -1
  28. package/dist/commands/auth.js +155 -39
  29. package/dist/commands/auth.js.map +1 -1
  30. package/dist/commands/blocks.d.ts.map +1 -1
  31. package/dist/commands/blocks.js +1 -1
  32. package/dist/commands/blocks.js.map +1 -1
  33. package/dist/commands/build.d.ts +17 -6
  34. package/dist/commands/build.d.ts.map +1 -1
  35. package/dist/commands/build.js +136 -89
  36. package/dist/commands/build.js.map +1 -1
  37. package/dist/commands/connection-apps.d.ts +3 -0
  38. package/dist/commands/connection-apps.d.ts.map +1 -0
  39. package/dist/commands/connection-apps.js +239 -0
  40. package/dist/commands/connection-apps.js.map +1 -0
  41. package/dist/commands/connections.d.ts +44 -0
  42. package/dist/commands/connections.d.ts.map +1 -0
  43. package/dist/commands/connections.js +385 -0
  44. package/dist/commands/connections.js.map +1 -0
  45. package/dist/commands/conversations.js +1 -1
  46. package/dist/commands/conversations.js.map +1 -1
  47. package/dist/commands/deploy.d.ts.map +1 -1
  48. package/dist/commands/deploy.js +178 -97
  49. package/dist/commands/deploy.js.map +1 -1
  50. package/dist/commands/dev.d.ts +10 -0
  51. package/dist/commands/dev.d.ts.map +1 -1
  52. package/dist/commands/dev.js +177 -87
  53. package/dist/commands/dev.js.map +1 -1
  54. package/dist/commands/doctor.js +7 -7
  55. package/dist/commands/doctor.js.map +1 -1
  56. package/dist/commands/env-scoped.d.ts.map +1 -1
  57. package/dist/commands/env-scoped.js +37 -22
  58. package/dist/commands/env-scoped.js.map +1 -1
  59. package/dist/commands/env.d.ts.map +1 -1
  60. package/dist/commands/env.js +35 -22
  61. package/dist/commands/env.js.map +1 -1
  62. package/dist/commands/eval-runs.js +6 -6
  63. package/dist/commands/eval-runs.js.map +1 -1
  64. package/dist/commands/eval-suites.js +9 -9
  65. package/dist/commands/eval-suites.js.map +1 -1
  66. package/dist/commands/exports.d.ts.map +1 -1
  67. package/dist/commands/exports.js +35 -9
  68. package/dist/commands/exports.js.map +1 -1
  69. package/dist/commands/feedback.d.ts.map +1 -1
  70. package/dist/commands/feedback.js +4 -3
  71. package/dist/commands/feedback.js.map +1 -1
  72. package/dist/commands/gate-policies.d.ts.map +1 -1
  73. package/dist/commands/gate-policies.js +7 -7
  74. package/dist/commands/gate-policies.js.map +1 -1
  75. package/dist/commands/helpers.d.ts +9 -0
  76. package/dist/commands/helpers.d.ts.map +1 -1
  77. package/dist/commands/helpers.js +20 -0
  78. package/dist/commands/helpers.js.map +1 -1
  79. package/dist/commands/index.d.ts.map +1 -1
  80. package/dist/commands/index.js +8 -0
  81. package/dist/commands/index.js.map +1 -1
  82. package/dist/commands/init.d.ts +1 -1
  83. package/dist/commands/init.d.ts.map +1 -1
  84. package/dist/commands/init.js +57 -45
  85. package/dist/commands/init.js.map +1 -1
  86. package/dist/commands/judge-classes.js +4 -4
  87. package/dist/commands/judge-classes.js.map +1 -1
  88. package/dist/commands/judging-queue.d.ts +3 -0
  89. package/dist/commands/judging-queue.d.ts.map +1 -0
  90. package/dist/commands/judging-queue.js +105 -0
  91. package/dist/commands/judging-queue.js.map +1 -0
  92. package/dist/commands/judging-rules.d.ts +3 -0
  93. package/dist/commands/judging-rules.d.ts.map +1 -0
  94. package/dist/commands/judging-rules.js +351 -0
  95. package/dist/commands/judging-rules.js.map +1 -0
  96. package/dist/commands/judgments.d.ts.map +1 -1
  97. package/dist/commands/judgments.js +78 -36
  98. package/dist/commands/judgments.js.map +1 -1
  99. package/dist/commands/key.d.ts.map +1 -1
  100. package/dist/commands/key.js +107 -9
  101. package/dist/commands/key.js.map +1 -1
  102. package/dist/commands/license.d.ts.map +1 -1
  103. package/dist/commands/license.js +67 -15
  104. package/dist/commands/license.js.map +1 -1
  105. package/dist/commands/mcp.d.ts.map +1 -1
  106. package/dist/commands/mcp.js +4 -4
  107. package/dist/commands/mcp.js.map +1 -1
  108. package/dist/commands/people.js +8 -14
  109. package/dist/commands/people.js.map +1 -1
  110. package/dist/commands/promote.js +1 -1
  111. package/dist/commands/promote.js.map +1 -1
  112. package/dist/commands/proposals.d.ts.map +1 -1
  113. package/dist/commands/proposals.js +83 -30
  114. package/dist/commands/proposals.js.map +1 -1
  115. package/dist/commands/run-waits.d.ts +68 -19
  116. package/dist/commands/run-waits.d.ts.map +1 -1
  117. package/dist/commands/run-waits.js +82 -8
  118. package/dist/commands/run-waits.js.map +1 -1
  119. package/dist/commands/runs.d.ts.map +1 -1
  120. package/dist/commands/runs.js +70 -30
  121. package/dist/commands/runs.js.map +1 -1
  122. package/dist/commands/schedules.d.ts.map +1 -1
  123. package/dist/commands/schedules.js +35 -12
  124. package/dist/commands/schedules.js.map +1 -1
  125. package/dist/commands/secrets-copy.d.ts.map +1 -1
  126. package/dist/commands/secrets-copy.js +20 -12
  127. package/dist/commands/secrets-copy.js.map +1 -1
  128. package/dist/commands/secrets.d.ts.map +1 -1
  129. package/dist/commands/secrets.js +13 -8
  130. package/dist/commands/secrets.js.map +1 -1
  131. package/dist/commands/sign-in.js +2 -2
  132. package/dist/commands/sign-in.js.map +1 -1
  133. package/dist/commands/sites.d.ts.map +1 -1
  134. package/dist/commands/sites.js +13 -6
  135. package/dist/commands/sites.js.map +1 -1
  136. package/dist/commands/skills.d.ts +54 -3
  137. package/dist/commands/skills.d.ts.map +1 -1
  138. package/dist/commands/skills.js +169 -38
  139. package/dist/commands/skills.js.map +1 -1
  140. package/dist/commands/tokens.d.ts.map +1 -1
  141. package/dist/commands/tokens.js +9 -1
  142. package/dist/commands/tokens.js.map +1 -1
  143. package/dist/commands/upgrade.d.ts.map +1 -1
  144. package/dist/commands/upgrade.js +9 -8
  145. package/dist/commands/upgrade.js.map +1 -1
  146. package/dist/commands/webhooks.d.ts.map +1 -1
  147. package/dist/commands/webhooks.js +62 -24
  148. package/dist/commands/webhooks.js.map +1 -1
  149. package/dist/config.d.ts +6 -0
  150. package/dist/config.d.ts.map +1 -1
  151. package/dist/config.js +18 -3
  152. package/dist/config.js.map +1 -1
  153. package/dist/context.d.ts +12 -0
  154. package/dist/context.d.ts.map +1 -1
  155. package/dist/context.js +2 -0
  156. package/dist/context.js.map +1 -1
  157. package/dist/deploy/pack-blocks-gate.d.ts +12 -0
  158. package/dist/deploy/pack-blocks-gate.d.ts.map +1 -0
  159. package/dist/deploy/pack-blocks-gate.js +34 -0
  160. package/dist/deploy/pack-blocks-gate.js.map +1 -0
  161. package/dist/deploy/post.d.ts +9 -0
  162. package/dist/deploy/post.d.ts.map +1 -1
  163. package/dist/deploy/post.js +20 -3
  164. package/dist/deploy/post.js.map +1 -1
  165. package/dist/dev/defaults.d.ts.map +1 -1
  166. package/dist/dev/defaults.js +8 -1
  167. package/dist/dev/defaults.js.map +1 -1
  168. package/dist/dev/dev-only-imports.d.ts +7 -4
  169. package/dist/dev/dev-only-imports.d.ts.map +1 -1
  170. package/dist/dev/dev-only-imports.js +5 -5
  171. package/dist/dev/dev-only-imports.js.map +1 -1
  172. package/dist/dev/log-view.d.ts +4 -4
  173. package/dist/dev/log-view.d.ts.map +1 -1
  174. package/dist/dev/log-view.js +4 -4
  175. package/dist/dev/log-view.js.map +1 -1
  176. package/dist/dev/pack-service.d.ts +7 -1
  177. package/dist/dev/pack-service.d.ts.map +1 -1
  178. package/dist/dev/pack-service.js +36 -3
  179. package/dist/dev/pack-service.js.map +1 -1
  180. package/dist/dev/preview-expiry.d.ts +6 -7
  181. package/dist/dev/preview-expiry.d.ts.map +1 -1
  182. package/dist/dev/preview-expiry.js +7 -8
  183. package/dist/dev/preview-expiry.js.map +1 -1
  184. package/dist/dev/providers.d.ts +2 -1
  185. package/dist/dev/providers.d.ts.map +1 -1
  186. package/dist/dev/providers.js +28 -12
  187. package/dist/dev/providers.js.map +1 -1
  188. package/dist/dev/runners.d.ts +19 -0
  189. package/dist/dev/runners.d.ts.map +1 -1
  190. package/dist/dev/runtime-container.d.ts.map +1 -1
  191. package/dist/dev/runtime-container.js +2 -2
  192. package/dist/dev/runtime-container.js.map +1 -1
  193. package/dist/dev/runtime-env.d.ts +2 -1
  194. package/dist/dev/runtime-env.d.ts.map +1 -1
  195. package/dist/dev/runtime-env.js +5 -5
  196. package/dist/dev/runtime-env.js.map +1 -1
  197. package/dist/dev/runtime-image.d.ts +2 -2
  198. package/dist/dev/runtime-image.d.ts.map +1 -1
  199. package/dist/dev/runtime-image.js +2 -2
  200. package/dist/dev/runtime-image.js.map +1 -1
  201. package/dist/dev/runtime-registry.d.ts +8 -10
  202. package/dist/dev/runtime-registry.d.ts.map +1 -1
  203. package/dist/dev/runtime-registry.js +27 -27
  204. package/dist/dev/runtime-registry.js.map +1 -1
  205. package/dist/dev/sandbox/index.js +1 -1
  206. package/dist/dev/sandbox/notices.d.ts +2 -0
  207. package/dist/dev/sandbox/notices.d.ts.map +1 -1
  208. package/dist/dev/sandbox/notices.js +5 -2
  209. package/dist/dev/sandbox/notices.js.map +1 -1
  210. package/dist/env/defaults.d.ts.map +1 -1
  211. package/dist/env/defaults.js +3 -1
  212. package/dist/env/defaults.js.map +1 -1
  213. package/dist/env/pack-env-plan.d.ts +4 -0
  214. package/dist/env/pack-env-plan.d.ts.map +1 -1
  215. package/dist/env/pack-env-plan.js +8 -2
  216. package/dist/env/pack-env-plan.js.map +1 -1
  217. package/dist/exports/create.d.ts +2 -0
  218. package/dist/exports/create.d.ts.map +1 -1
  219. package/dist/exports/create.js +10 -2
  220. package/dist/exports/create.js.map +1 -1
  221. package/dist/exports/plan.d.ts.map +1 -1
  222. package/dist/exports/plan.js +20 -0
  223. package/dist/exports/plan.js.map +1 -1
  224. package/dist/feedback/store.d.ts.map +1 -1
  225. package/dist/feedback/store.js +8 -19
  226. package/dist/feedback/store.js.map +1 -1
  227. package/dist/help.d.ts +6 -0
  228. package/dist/help.d.ts.map +1 -1
  229. package/dist/help.js +35 -1
  230. package/dist/help.js.map +1 -1
  231. package/dist/init/agent-access.d.ts +3 -2
  232. package/dist/init/agent-access.d.ts.map +1 -1
  233. package/dist/init/agent-access.js +5 -1
  234. package/dist/init/agent-access.js.map +1 -1
  235. package/dist/init/augment-scaffolder.d.ts +7 -0
  236. package/dist/init/augment-scaffolder.d.ts.map +1 -1
  237. package/dist/init/augment-scaffolder.js +15 -14
  238. package/dist/init/augment-scaffolder.js.map +1 -1
  239. package/dist/init/dependency-specs.d.ts +1 -0
  240. package/dist/init/dependency-specs.d.ts.map +1 -1
  241. package/dist/init/dependency-specs.js +27 -7
  242. package/dist/init/dependency-specs.js.map +1 -1
  243. package/dist/init/java-augment.d.ts +3 -0
  244. package/dist/init/java-augment.d.ts.map +1 -1
  245. package/dist/init/java-augment.js +16 -15
  246. package/dist/init/java-augment.js.map +1 -1
  247. package/dist/init/python-augment.d.ts +3 -0
  248. package/dist/init/python-augment.d.ts.map +1 -1
  249. package/dist/init/python-augment.js +15 -14
  250. package/dist/init/python-augment.js.map +1 -1
  251. package/dist/init/scala-augment.d.ts +8 -1
  252. package/dist/init/scala-augment.d.ts.map +1 -1
  253. package/dist/init/scala-augment.js +32 -17
  254. package/dist/init/scala-augment.js.map +1 -1
  255. package/dist/key/defaults.d.ts.map +1 -1
  256. package/dist/key/defaults.js +6 -1
  257. package/dist/key/defaults.js.map +1 -1
  258. package/dist/key/runners.d.ts +4 -1
  259. package/dist/key/runners.d.ts.map +1 -1
  260. package/dist/license/renew.d.ts +6 -0
  261. package/dist/license/renew.d.ts.map +1 -1
  262. package/dist/license/renew.js +8 -5
  263. package/dist/license/renew.js.map +1 -1
  264. package/dist/main.d.ts +10 -0
  265. package/dist/main.d.ts.map +1 -1
  266. package/dist/main.js +19 -5
  267. package/dist/main.js.map +1 -1
  268. package/dist/output.d.ts +6 -0
  269. package/dist/output.d.ts.map +1 -1
  270. package/dist/output.js +8 -0
  271. package/dist/output.js.map +1 -1
  272. package/dist/parse.d.ts +1 -1
  273. package/dist/parse.d.ts.map +1 -1
  274. package/dist/parse.js +1 -1
  275. package/dist/parse.js.map +1 -1
  276. package/dist/private-file.d.ts +23 -0
  277. package/dist/private-file.d.ts.map +1 -0
  278. package/dist/private-file.js +65 -0
  279. package/dist/private-file.js.map +1 -0
  280. package/dist/progress-head.d.ts +13 -0
  281. package/dist/progress-head.d.ts.map +1 -0
  282. package/dist/progress-head.js +30 -0
  283. package/dist/progress-head.js.map +1 -0
  284. package/dist/progress-lines.d.ts +29 -0
  285. package/dist/progress-lines.d.ts.map +1 -0
  286. package/dist/progress-lines.js +35 -0
  287. package/dist/progress-lines.js.map +1 -0
  288. package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +6 -6
  289. package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +1 -1
  290. package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +2 -2
  291. package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +1 -1
  292. package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +3 -3
  293. package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +39 -6
  294. package/dist/sdk-skills/kindgi-fix-corrections/SKILL.md +262 -0
  295. package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +1 -1
  296. package/dist/sdk-skills/kindgi-getting-started/SKILL.md +43 -9
  297. package/dist/sdk-skills/kindgi-java-authoring-agents/SKILL.md +5 -5
  298. package/dist/sdk-skills/kindgi-java-authoring-flows/SKILL.md +1 -1
  299. package/dist/sdk-skills/kindgi-java-authoring-guardrails/SKILL.md +1 -1
  300. package/dist/sdk-skills/kindgi-java-authoring-tools/SKILL.md +91 -9
  301. package/dist/sdk-skills/kindgi-java-getting-started/SKILL.md +38 -9
  302. package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +4 -4
  303. package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +1 -1
  304. package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +1 -1
  305. package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +43 -8
  306. package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +39 -11
  307. package/dist/sdk-skills/kindgi-scala-authoring-agents/SKILL.md +5 -5
  308. package/dist/sdk-skills/kindgi-scala-authoring-flows/SKILL.md +1 -1
  309. package/dist/sdk-skills/kindgi-scala-authoring-guardrails/SKILL.md +1 -1
  310. package/dist/sdk-skills/kindgi-scala-authoring-tools/SKILL.md +82 -7
  311. package/dist/sdk-skills/kindgi-scala-getting-started/SKILL.md +38 -9
  312. package/dist/sdk-skills/kindgi-using/SKILL.md +50 -21
  313. package/dist/templates/drupal/AGENTS.md +2 -1
  314. package/dist/templates/follow-up/.nvmrc +1 -0
  315. package/dist/templates/follow-up/AGENTS.md +83 -0
  316. package/dist/templates/follow-up/README.md.tmpl +111 -0
  317. package/dist/templates/follow-up/agents/follow-up/index.test.ts.tmpl +26 -0
  318. package/dist/templates/follow-up/agents/follow-up/index.ts.tmpl +53 -0
  319. package/dist/templates/follow-up/gitignore +8 -0
  320. package/dist/templates/follow-up/kindgi.config.ts.tmpl +45 -0
  321. package/dist/templates/follow-up/package.json.tmpl +30 -0
  322. package/dist/templates/follow-up/pnpm-workspace.yaml +9 -0
  323. package/dist/templates/follow-up/tools/gmail-send/index.test.ts.tmpl +60 -0
  324. package/dist/templates/follow-up/tools/gmail-send/index.ts.tmpl +14 -0
  325. package/dist/templates/follow-up/tsconfig.json.tmpl +27 -0
  326. package/dist/templates/follow-up/vitest.config.ts.tmpl +14 -0
  327. package/dist/templates/java/AGENTS.md +2 -1
  328. package/dist/templates/minimal/AGENTS.md +2 -1
  329. package/dist/templates/python/AGENTS.md +2 -1
  330. package/dist/templates/sample/AGENTS.md +2 -1
  331. package/dist/templates/scala/AGENTS.md +2 -1
  332. package/dist/templates/woocommerce/AGENTS.md +12 -3
  333. package/dist/templates/woocommerce/README.md.tmpl +29 -5
  334. package/dist/templates/woocommerce/agents/store-agent/index.test.ts.tmpl +38 -7
  335. package/dist/templates/woocommerce/agents/store-agent/index.ts.tmpl +7 -12
  336. package/dist/templates/woocommerce/blocks/store-agent-prompt.json.tmpl +10 -0
  337. package/dist/templates/woocommerce/blocks/store-agent-prompt.liquid.tmpl +7 -0
  338. package/dist/templates/woocommerce/kindgi.config.ts.tmpl +1 -0
  339. package/dist/value-target.d.ts +4 -2
  340. package/dist/value-target.d.ts.map +1 -1
  341. package/dist/value-target.js +8 -5
  342. package/dist/value-target.js.map +1 -1
  343. package/package.json +13 -13
@@ -32,13 +32,15 @@
32
32
  */
33
33
  import { randomBytes, randomUUID } from 'node:crypto';
34
34
  import { existsSync } from 'node:fs';
35
- import { chmod, readFile, unlink, writeFile } from 'node:fs/promises';
35
+ import { readFile, unlink } from 'node:fs/promises';
36
36
  import { homedir } from 'node:os';
37
37
  import { basename, isAbsolute, join, resolve } from 'node:path';
38
38
  import { createInterface } from 'node:readline';
39
- import { discoveryRoots, findKindgiConfig, packLanguage, resolveDiscovery, } from '@kindgi/handler-runtime';
39
+ import { blocksFolder, codePatterns, createGlobMatcher, discoveryRoots, findKindgiConfig, packLanguage, readPackBlocks, resolveDiscovery, } from '@kindgi/handler-runtime';
40
40
  import { LOCAL_ENV_NAME, describeUnreadable, displayEnvPath, namesInAppFiles, packValues, readPackEnv, runtimeValues, } from '@kindgi/secrets-dotenv';
41
41
  import { CORS_ORIGINS_VAR, EXPORT_SIGNING_KEY_PATH_VAR, PUBLIC_TOKEN_KEY_PATH_VAR, parseCorsOrigins, } from '@kindgi/env-schema';
42
+ import { scrubText } from '@kindgi/log';
43
+ import { indexerPredatesBlocks, packIndexerName } from '../build/pack-blocks.js';
42
44
  import { ALREADY_RUNNING_EXIT_CODE, alreadyRunning } from '../dev/already-running.js';
43
45
  import { LocalPortsRefused, localPortsRefused, refusedHere, } from '../dev/blocked.js';
44
46
  import { DEV_LOCK_FILE, osProcesses, ownerIsLive, takeDevLock, } from '../dev/dev-lock.js';
@@ -47,7 +49,7 @@ import { DEV_GOOGLE_CREDENTIALS_VAR, VERTEX_PROVIDER_ID, isVertexRegistration, r
47
49
  import { DEFAULT_DEV_LOG_VIEW, parseDevLogFlags, resolveDevLogView, runtimeLogLevels, showIndexerLine, showLine, showText, sourceLogEnv, } from '../dev/log-view.js';
48
50
  import { isJvmPackCode, resolvePackCode } from '../dev/pack-code.js';
49
51
  import { devPackEnv, devPackEnvFiles } from '../dev/pack-env.js';
50
- import { createPackRefresher, showPackEvent } from '../dev/pack-service.js';
52
+ import { createPackRefresher, showBlockWritten, showPackEvent } from '../dev/pack-service.js';
51
53
  import { PORT_SEARCH_SPAN, firstFreePort } from '../dev/port.js';
52
54
  import { devRuntimeSource, previewExpiryWarning, previewRefusalHint, readLicenseStatus, } from '../dev/preview-expiry.js';
53
55
  import { resolveDevProject } from '../dev/project.js';
@@ -63,12 +65,13 @@ import { PYPI_NO_BUNDLER } from '../esbuild-loader.js';
63
65
  import { openUrlInBrowser } from '../open-url.js';
64
66
  import { renderJson } from '../output.js';
65
67
  import { binDisplay, cliInstall, detectBinRunner } from '../package-manager.js';
68
+ import { writePrivateFile } from '../private-file.js';
66
69
  import { MODELS_GUIDE } from '../providers/models-guide.js';
67
70
  import { loadProviderPresets } from '../providers/preset-loader.js';
68
71
  import { CLI_VERSION } from '../version-info.js';
69
72
  import { consoleUrlOf, couldNotOpen } from './console.js';
70
73
  import { defaultSdkSkillsRoot } from './init.js';
71
- import { describeSkillDrift, detectSkillDrift } from './skills.js';
74
+ import { describeDevSkillsRefresh, refreshSkillsForDev } from './skills.js';
72
75
  export const devCommand = {
73
76
  kind: 'leaf',
74
77
  name: 'dev',
@@ -141,10 +144,10 @@ export const devCommand = {
141
144
  description: 'Let `docker compose` recreate the bundled Postgres if its definition changed (needs compose). By default an existing container is reused.',
142
145
  },
143
146
  // The runtime's and the pack service's records: what's shown, and how.
144
- // `--quiet` (a global flag) keeps errors only.
147
+ // `--quiet` (a global flag) keeps errors and warnings only.
145
148
  'log-level': {
146
149
  type: 'string',
147
- description: "The lowest level of the log records shown: error, warn, info, debug or trace. Default: `KINDGI_LOG_LEVEL` (the shell's, then the env files'), else info; with `--quiet`, error.",
150
+ description: "The lowest level of the log records shown: error, warn, info, debug or trace. Default: `KINDGI_LOG_LEVEL` (the shell's, then the env files'), else info; with `--quiet`, warn.",
148
151
  },
149
152
  log: {
150
153
  type: 'string',
@@ -182,11 +185,18 @@ function emitProgress(msg) {
182
185
  return;
183
186
  emitProblem(msg);
184
187
  }
185
- /** A progress line that's an error: shown under `--quiet` too. */
188
+ /** A progress line that's an error or a warning: shown under `--quiet` too. */
186
189
  function emitProblem(msg) {
187
190
  process.stderr.write(`${stoppingLineOpen ? '\n' : ''} ${msg}\n`);
188
191
  stoppingLineOpen = false;
189
192
  }
193
+ /** The dev sandbox's lines, then its warnings: those are said under `--quiet` too. */
194
+ function emitSandboxLines(outcome) {
195
+ for (const line of outcome.lines)
196
+ emitProgress(line);
197
+ for (const line of outcome.warnings)
198
+ emitProblem(line);
199
+ }
190
200
  /**
191
201
  * How logs show this session (`dev/log-view.ts`): set from the flags as
192
202
  * `runDev` starts, and again once the env files are read.
@@ -366,7 +376,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
366
376
  emitProgress(`✓ Google credentials: ${google.credentials.path} (${google.credentials.who}), mounted read-only for Vertex AI`);
367
377
  }
368
378
  else if (declaredVertex.length > 0) {
369
- emitProgress(`⚠ ${vertexCredentialsHint(declaredVertex, ctx.env)}`);
379
+ emitProblem(`⚠ ${vertexCredentialsHint(declaredVertex, ctx.env)}`);
370
380
  }
371
381
  // The pack service runs sandboxed where this machine can: the code a
372
382
  // coding agent writes can't read your keys or reach Docker. Where it
@@ -382,8 +392,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
382
392
  if (devSandbox.kind === 'error') {
383
393
  return { kind: 'error', stderr: `kindgi dev: ${devSandbox.message}\n`, exitCode: 1 };
384
394
  }
385
- for (const line of devSandbox.lines)
386
- emitProgress(line);
395
+ emitSandboxLines(devSandbox);
387
396
  const sandboxNotices = new Set();
388
397
  // The runtime's port, before anything starts. Taken without `--port`
389
398
  // (another `kindgi dev`, say): the next free one, which `.kindgirc.json`
@@ -417,7 +426,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
417
426
  };
418
427
  }
419
428
  if (args.recreateServices) {
420
- emitProgress('⚠ --recreate-services: the shared Postgres may be recreated; every kindgi dev on this machine using it reconnects');
429
+ emitProblem('⚠ --recreate-services: the shared Postgres may be recreated; every kindgi dev on this machine using it reconnects');
421
430
  }
422
431
  emitProgress('Starting Postgres...');
423
432
  emitProgress(' first-run image pull can take 30-90s; cached boots are ~5-10s');
@@ -442,7 +451,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
442
451
  ? "✓ Postgres: started with docker (docker compose isn't available)"
443
452
  : '✓ Postgres: started with docker compose');
444
453
  for (const note of outcome.handle.notes ?? [])
445
- emitProgress(`⚠ ${note}`);
454
+ emitProblem(`⚠ ${note}`);
446
455
  }
447
456
  const kindgircPath = join(args.packDir, '.kindgirc.json');
448
457
  const persisted = await readPersistedRc(kindgircPath);
@@ -498,7 +507,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
498
507
  }
499
508
  catch (err) {
500
509
  if (err.code !== 'ENOENT') {
501
- emitProgress(` --reset: could not remove .kindgirc.json: ${err.message}`);
510
+ emitProblem(`⚠ --reset: could not remove .kindgirc.json: ${err.message}`);
502
511
  }
503
512
  }
504
513
  if (projectDatabases === undefined) {
@@ -569,13 +578,17 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
569
578
  if (sandboxNotices.has(line))
570
579
  return;
571
580
  sandboxNotices.add(line);
572
- emitProgress(`⚠ ${line}`);
581
+ emitProblem(`⚠ ${line}`);
573
582
  },
574
583
  onLog: (line, stream) => emitOutput(showText('pack', line, logView, stream)),
575
584
  onEvent: (event) => {
576
585
  for (const output of showPackEvent(event, logView))
577
586
  emitOutput(output);
578
587
  },
588
+ blocks: {
589
+ pattern: projectEnv.blocksPattern,
590
+ onWritten: (write, written) => emitProgress(` ${showBlockWritten(write, written)}`),
591
+ },
579
592
  };
580
593
  // The front listens for the whole session; children come and go behind
581
594
  // it. It keeps the previous session's port, so a runtime started with
@@ -597,7 +610,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
597
610
  }
598
611
  if (previous.packServicePort === undefined)
599
612
  throw err;
600
- emitProgress(` the pack service's port ${previous.packServicePort} is taken: using another one${args.runtimeUrl !== undefined ? ' (restart your runtime with the new runtime.env)' : ''}`);
613
+ emitProblem(`⚠ the pack service's port ${previous.packServicePort} is taken: using another one${args.runtimeUrl !== undefined ? ' (restart your runtime with the new runtime.env)' : ''}`);
601
614
  await pack.close().catch(() => undefined);
602
615
  pack = dev.createPackService(packOptions);
603
616
  packFront = await pack.listen();
@@ -625,7 +638,10 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
625
638
  onBuild: async (build) => {
626
639
  if (build.externals === undefined)
627
640
  return;
628
- for (const line of await devOnly.check(build.externals))
641
+ const checked = await devOnly.check(build.externals);
642
+ for (const line of checked.warnings)
643
+ emitProblem(` ${line}`);
644
+ for (const line of checked.lines)
629
645
  emitProgress(` ${line}`);
630
646
  },
631
647
  }),
@@ -716,6 +732,17 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
716
732
  })
717
733
  : emptyReport();
718
734
  emitBootIndex(bootIndex, bootReport, discoveryRoots(projectEnv.discoveryPatterns));
735
+ if (bootIndex.kind === 'ok') {
736
+ const predates = await indexerPredatesBlocks({
737
+ packDir: args.packDir,
738
+ pattern: projectEnv.blocksPattern,
739
+ blocksCounted: bootIndex.counts.blocks !== undefined,
740
+ indexer: packIndexerName(code.value.language),
741
+ release: CLI_VERSION,
742
+ });
743
+ if (predates !== undefined)
744
+ emitProblem(` ⚠ ${predates}`);
745
+ }
719
746
  // Hints run the project's own kindgi through its package manager — or,
720
747
  // for a Python pack (no npm project), the kindgi on PATH.
721
748
  const runner = await detectBinRunner(args.packDir, code.value.language, undefined, ctx.env);
@@ -729,7 +756,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
729
756
  : { kind: 'database', url: databaseUrl };
730
757
  if (providersTarget.kind === 'bundled') {
731
758
  await adoptLegacyBundledEntries(devProvidersRecordPath(args.packDir), providersTarget.database, server.tenantId).catch((err) => {
732
- emitProgress(` ⚠ could not update ${join('.kindgi', 'dev', 'providers.json')}: ${err.message}. Providers this pack registered before 0.1.4 may read as not its own.`);
759
+ emitProblem(` ⚠ could not update ${join('.kindgi', 'dev', 'providers.json')}: ${err.message}. Providers this pack registered before 0.1.4 may read as not its own.`);
733
760
  });
734
761
  }
735
762
  await applyDeclaredProviders({
@@ -761,27 +788,13 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
761
788
  .map((p) => p.id)
762
789
  .filter((id) => id === VERTEX_PROVIDER_ID && !declaredVertex.includes(id));
763
790
  if (byHand.length > 0)
764
- emitProgress(`⚠ ${vertexCredentialsHint(byHand, ctx.env)}`);
791
+ emitProblem(`⚠ ${vertexCredentialsHint(byHand, ctx.env)}`);
765
792
  }
766
793
  // A preview runtime near the end of its life (90 days after its
767
- // release, until 1.0): from 30 days before, the way to a newer one.
794
+ // release): from 30 days before, the way to a newer one.
768
795
  const previewWarning = previewExpiryWarning(await readLicenseStatus(client), devRuntimeSource(args));
769
796
  if (previewWarning !== undefined)
770
- emitProgress(previewWarning);
771
- const bannerLines = renderDevBanner({
772
- baseUrl: server.baseUrl,
773
- consoleMounted: server.consoleMounted === true,
774
- tenantId: server.tenantId,
775
- token: server.token,
776
- providers,
777
- packDir: args.packDir,
778
- bootIndex,
779
- bootReport,
780
- discoveryRoots: discoveryRoots(projectEnv.discoveryPatterns),
781
- ...(servicesHandle !== undefined && { autoStartedServices: servicesHandle.services }),
782
- corsOrigins: publicRunTokens.corsOrigins,
783
- ...(google.credentials !== undefined && { googleCredentials: google.credentials }),
784
- });
797
+ emitProblem(previewWarning);
785
798
  // Write `.kindgirc.json` to the pack root so a SECOND terminal in
786
799
  // the same directory (`cd <pack>; kindgi runs start ...`) picks up
787
800
  // the api URL + bearer token automatically. Same file the config
@@ -799,25 +812,31 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
799
812
  // tenant row and orphans the pack's registered primitives under old
800
813
  // tenant UUIDs. Persisting keeps the "run this pack" identity
801
814
  // stable across restarts.
802
- let kindgircWritten = false;
803
- try {
804
- await writeFile(kindgircPath, `${JSON.stringify({
805
- apiUrl: server.baseUrl,
806
- token: server.token,
807
- tenantId: server.tenantId,
808
- userId: server.userId,
809
- packServicePort: packFront.port,
810
- packServiceToken: pack.token,
811
- }, null, 2)}\n`,
812
- // It holds the dev token and the pack service's token.
813
- { encoding: 'utf8', mode: 0o600 });
814
- await chmod(kindgircPath, 0o600);
815
- kindgircWritten = true;
816
- }
817
- catch {
818
- // Best effort — if the pack dir is read-only or something goes wrong,
819
- // don't fail boot. The user can still pass --url/--token flags.
820
- }
815
+ const kindgircWritten = await writeKindgirc(kindgircPath, {
816
+ apiUrl: server.baseUrl,
817
+ token: server.token,
818
+ tenantId: server.tenantId,
819
+ userId: server.userId,
820
+ packServicePort: packFront.port,
821
+ packServiceToken: pack.token,
822
+ });
823
+ // Where the token is in full: the banners show only its ends.
824
+ const tokenFile = kindgircWritten ? '.kindgirc.json' : join('.kindgi', 'dev', 'runtime.env');
825
+ const bannerLines = renderDevBanner({
826
+ baseUrl: server.baseUrl,
827
+ consoleMounted: server.consoleMounted === true,
828
+ tenantId: server.tenantId,
829
+ token: server.token,
830
+ tokenFile,
831
+ providers,
832
+ packDir: args.packDir,
833
+ bootIndex,
834
+ bootReport,
835
+ discoveryRoots: discoveryRoots(projectEnv.discoveryPatterns),
836
+ ...(servicesHandle !== undefined && { autoStartedServices: servicesHandle.services }),
837
+ corsOrigins: publicRunTokens.corsOrigins,
838
+ ...(google.credentials !== undefined && { googleCredentials: google.credentials }),
839
+ });
821
840
  // Where it serves, for a second kindgi dev to say (`dev.lock`).
822
841
  await lock
823
842
  .update({
@@ -842,7 +861,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
842
861
  emitProgress(` Project ${project.name} · database ${project.database}`);
843
862
  }
844
863
  emitProgress(` Tenant ${server.tenantId}`);
845
- emitProgress(` Token ${server.token}`);
864
+ emitProgress(` Token ${describeDevToken(server.token, tokenFile)}`);
846
865
  if (providers !== undefined) {
847
866
  emitProgress(` Models ${describeModels(providers)}`);
848
867
  }
@@ -871,7 +890,10 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
871
890
  emitProgress(' Hit a framework rough edge?');
872
891
  emitProgress(` echo "…" | ${kindgi('feedback', 'write', '--kind=bug', '--title="…"', '--body-stdin')} (appends to FEEDBACK.md)`);
873
892
  emitProgress('');
874
- await emitSkillDriftHint(args.packDir, code.value.language, kindgi('skills', 'sync'));
893
+ await emitSkillsRefresh(args.packDir, code.value.language, {
894
+ sync: kindgi('skills', 'sync'),
895
+ force: kindgi('skills', 'sync', '--force'),
896
+ });
875
897
  if (args.watch) {
876
898
  emitProgress(` Watching ${args.packDir}`);
877
899
  emitProgress(' Ctrl+C to stop.');
@@ -880,10 +902,13 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
880
902
  if (args.open) {
881
903
  if (server.consoleMounted === true) {
882
904
  const opened = await (ctx.openUrl ?? openUrlInBrowser)(consoleUrlOf(server.baseUrl));
883
- emitProgress(opened.ok ? ' Opened the console in your browser.' : ` ${couldNotOpen(opened.reason)}`);
905
+ if (opened.ok)
906
+ emitProgress(' Opened the console in your browser.');
907
+ else
908
+ emitProblem(`⚠ ${couldNotOpen(opened.reason)}`);
884
909
  }
885
910
  else {
886
- emitProgress(' --open: this runtime serves no console, so there is nothing to open.');
911
+ emitProblem('⚠ --open: this runtime serves no console, so there is nothing to open.');
887
912
  }
888
913
  emitProgress('');
889
914
  }
@@ -961,6 +986,12 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
961
986
  patterns: projectEnv.discoveryPatterns,
962
987
  onWatchFailed,
963
988
  }));
989
+ // The pack's blocks: their files and their templates, read into the index again.
990
+ watchHandles.push(await dev.watchPack(args.packDir, untilStopped(ctx.stopSignal, () => onRefresh()), {
991
+ debounceMs: DEFAULT_WATCH_DEBOUNCE_MS,
992
+ ...(await blocksWatch(args.packDir, projectEnv.blocksPattern)),
993
+ onWatchFailed,
994
+ }));
964
995
  // The env files: the same code, restarted with the new environment.
965
996
  watchHandles.push(await dev.watchPack(args.packDir, untilStopped(ctx.stopSignal, () => onRefresh()), {
966
997
  debounceMs: DEFAULT_WATCH_DEBOUNCE_MS,
@@ -1014,7 +1045,7 @@ async function runDevForPack(ctx, args, dev, configFile, stderrIsTTY, lock) {
1014
1045
  const stdout = ctx.globals.formatRequested ? renderJson(summary, ctx.globals.format).stdout : '';
1015
1046
  return {
1016
1047
  kind: 'ok',
1017
- // --quiet: errors only, so no summary.
1048
+ // --quiet: errors and warnings only, so no summary.
1018
1049
  rendered: {
1019
1050
  stdout,
1020
1051
  stderr: args.watch || logView.quiet ? '' : `${bannerLines.join('\n')}\n`,
@@ -1090,16 +1121,18 @@ async function loadDevProjectEnv(ctx, packDir) {
1090
1121
  ? `env files: none yet (reads ${label(env.files.read)})`
1091
1122
  : `✓ env files: ${label(env.present)} — ${Object.keys(packValues(env.values)).length} name(s) for the pack`);
1092
1123
  for (const line of describeEnvDiagnostics(packDir, env.diagnostics))
1093
- emitProgress(` ! ${line}`);
1124
+ emitProblem(` ! ${line}`);
1094
1125
  const discovery = settings.config?.discovery;
1095
1126
  const language = settings.config !== undefined ? packLanguage(settings.config) : 'node';
1127
+ const resolved = resolveDiscovery(typeof discovery === 'object' && discovery !== null
1128
+ ? discovery
1129
+ : undefined, language);
1096
1130
  return {
1097
1131
  kind: 'ok',
1098
1132
  localEnvFiles: settings.localEnvFiles,
1099
1133
  runtime: runtimeValues(env.values),
1100
- discoveryPatterns: Object.values(resolveDiscovery(typeof discovery === 'object' && discovery !== null
1101
- ? discovery
1102
- : undefined, language)),
1134
+ discoveryPatterns: codePatterns(resolved),
1135
+ blocksPattern: resolved.blocks,
1103
1136
  language,
1104
1137
  config: settings.config,
1105
1138
  secretNames: new Set(Object.keys(packValues(env.values))),
@@ -1153,7 +1186,7 @@ async function walkRuntimePorts(args, inUse) {
1153
1186
  exitCode: 1,
1154
1187
  };
1155
1188
  }
1156
- emitProgress(`⚠ port ${args.port} is in use (another kindgi dev?): using ${free}`);
1189
+ emitProblem(`⚠ port ${args.port} is in use (another kindgi dev?): using ${free}`);
1157
1190
  return { kind: 'ok', port: free };
1158
1191
  }
1159
1192
  function resolveDevArgs(ctx) {
@@ -1330,6 +1363,24 @@ function pickRunners(ctx) {
1330
1363
  exitCode: 1,
1331
1364
  };
1332
1365
  }
1366
+ /**
1367
+ * Write `.kindgirc.json`, readable by its owner only, since it holds the dev
1368
+ * token and the pack service's token: a new `0600` file that replaces the old
1369
+ * one (`writePrivateFile`), so a program that opened an older, looser one
1370
+ * can't read the new tokens through it. Whether it was written. Best effort:
1371
+ * what goes wrong is a warning, and boot goes on. Without the file, the CLI
1372
+ * in the folder can still pass --url and --token.
1373
+ */
1374
+ async function writeKindgirc(path, rc) {
1375
+ try {
1376
+ await writePrivateFile(path, `${JSON.stringify(rc, null, 2)}\n`);
1377
+ }
1378
+ catch (err) {
1379
+ emitProblem(`⚠ couldn't write .kindgirc.json (${err.message}): the CLI in this folder needs --url and --token to reach this runtime`);
1380
+ return false;
1381
+ }
1382
+ return true;
1383
+ }
1333
1384
  /**
1334
1385
  * Read the persisted `.kindgirc.json` if present. Returns `undefined`
1335
1386
  * for any missing field — all missing cases fall back to
@@ -1377,7 +1428,7 @@ function emitBootIndex(bootIndex, bootReport, roots) {
1377
1428
  return;
1378
1429
  }
1379
1430
  const c = bootIndex.counts;
1380
- emitProgress(`✓ loaded: ${c.tools} tools, ${c.guardrails} guardrails, ${c.agents} agents, ${c.flows} flows`);
1431
+ emitProgress(`✓ loaded: ${c.tools} tools, ${c.guardrails} guardrails, ${c.agents} agents, ${c.flows} flows${blocksTotal(c)}`);
1381
1432
  for (const e of bootIndex.fileErrors) {
1382
1433
  emitProblem(` ⚠ indexer: ${e.filePath ?? '?'} [${e.code}] ${e.message}`);
1383
1434
  }
@@ -1410,7 +1461,7 @@ function reportWatchFailureOnce() {
1410
1461
  return;
1411
1462
  said = true;
1412
1463
  const why = error instanceof Error ? error.message : String(error);
1413
- emitProgress(` ⚠ file watch failed (${why}): changes are picked up by the once-a-second scan`);
1464
+ emitProblem(` ⚠ file watch failed (${why}): changes are picked up by the once-a-second scan`);
1414
1465
  };
1415
1466
  }
1416
1467
  /** `fn` until the stop begins: a change seen while stopping starts nothing. */
@@ -1479,7 +1530,7 @@ async function runEach(steps) {
1479
1530
  */
1480
1531
  function emitWatchTick(input) {
1481
1532
  const { counts, fileErrors, failed, elapsedMs, registered, warnings } = input;
1482
- const totals = `${counts.tools} tools, ${counts.guardrails} guardrails, ${counts.agents} agents, ${counts.flows} flows`;
1533
+ const totals = `${counts.tools} tools, ${counts.guardrails} guardrails, ${counts.agents} agents, ${counts.flows} flows${blocksTotal(counts)}`;
1483
1534
  if (fileErrors.length === 0 && failed.length === 0) {
1484
1535
  emitProgress(` ✓ loaded ${registered} primitives (${totals}) in ${elapsedMs}ms`);
1485
1536
  emitWarningsSince(warnings);
@@ -1494,6 +1545,24 @@ function emitWatchTick(input) {
1494
1545
  }
1495
1546
  emitWarningsSince(warnings);
1496
1547
  }
1548
+ /** `, 2 blocks` after the other counts, when the pack has any. */
1549
+ function blocksTotal(counts) {
1550
+ return counts.blocks !== undefined && counts.blocks > 0 ? `, ${counts.blocks} blocks` : '';
1551
+ }
1552
+ /**
1553
+ * What the blocks watcher follows: the blocks folder, templates and all.
1554
+ * A pattern at the pack root has no folder of its own, so it follows the
1555
+ * block files and, by name, the templates they name now.
1556
+ */
1557
+ async function blocksWatch(packDir, pattern) {
1558
+ const folder = blocksFolder(pattern);
1559
+ if (folder !== '')
1560
+ return { patterns: [`${folder}/**`] };
1561
+ const matches = createGlobMatcher([pattern]);
1562
+ const read = await readPackBlocks(packDir, pattern);
1563
+ const templates = read.files.filter((rel) => !matches(rel)).map((rel) => join(packDir, rel));
1564
+ return { patterns: [pattern], ...(templates.length > 0 && { files: templates }) };
1565
+ }
1497
1566
  /** A load's warnings, by message (an indexer that reports none, or a failed load, has none). */
1498
1567
  function warningsOf(result) {
1499
1568
  return new Set(result.kind === 'ok' ? (result.warnings ?? []).map((w) => w.message) : []);
@@ -1512,27 +1581,33 @@ function emitWarningsSince({ fresh, standing }) {
1512
1581
  emitProblem(` ⚠ ${standing} warnings from the last load still apply`);
1513
1582
  }
1514
1583
  /**
1515
- * Compare the pack's installed framework skills against the bundled
1516
- * SDK versions; print a one-liner if drift is detected. Silent when
1517
- * everything is up to date. Never fails boot — a drift-check crash
1518
- * (missing skills root, unreadable manifest) is swallowed because
1519
- * the drift check is advisory, not load-bearing.
1584
+ * Bring the pack's framework skills up to this CLI's (`refreshSkillsForDev`),
1585
+ * and say what changed and what's still behind. Silent when nothing is. A
1586
+ * refresh that fails is said, never fails boot: the skills help the coding
1587
+ * agent, not the pack. What's behind, and a refresh that fails, are
1588
+ * warnings: shown under `--quiet` too.
1520
1589
  */
1521
- async function emitSkillDriftHint(packDir, language, syncCommand) {
1590
+ async function emitSkillsRefresh(packDir, language, commands) {
1522
1591
  const skillsRoot = defaultSdkSkillsRoot();
1523
1592
  if (skillsRoot === undefined)
1524
1593
  return;
1594
+ let lines;
1525
1595
  try {
1526
- const drift = describeSkillDrift(await detectSkillDrift({ skillsRoot, targetDir: packDir, language }));
1527
- if (drift === undefined)
1528
- return;
1529
- emitProgress(` ⚠ Framework skills: ${drift}.`);
1530
- emitProgress(` Run \`${syncCommand}\` to pull the latest.`);
1531
- emitProgress('');
1596
+ const refresh = await refreshSkillsForDev({ skillsRoot, targetDir: packDir, language });
1597
+ lines = describeDevSkillsRefresh(refresh, commands);
1532
1598
  }
1533
- catch {
1534
- // Advisory; never block boot on a drift-check failure.
1599
+ catch (error) {
1600
+ const why = error instanceof Error ? error.message : String(error);
1601
+ lines = [
1602
+ { text: ` ⚠ Framework skills: couldn't refresh them: ${why}`, problem: true },
1603
+ { text: ` Run \`${commands.sync}\` to pull the latest.`, problem: true },
1604
+ ];
1535
1605
  }
1606
+ if (lines.length === 0)
1607
+ return;
1608
+ for (const line of lines)
1609
+ (line.problem ? emitProblem : emitProgress)(line.text);
1610
+ (lines.some((line) => line.problem) ? emitProblem : emitProgress)('');
1536
1611
  }
1537
1612
  /**
1538
1613
  * How this pack's code runs (`dev/pack-code.ts`). For a Python pack, the
@@ -1607,7 +1682,7 @@ async function settleProviderKeys(inputs) {
1607
1682
  if (h.inKindgiFile)
1608
1683
  continue;
1609
1684
  const where = h.files.map((f) => displayEnvPath(inputs.packDir, f)).join(' and ');
1610
- emitProgress(` ⚠ ${h.name} is in ${where}, which your app loads too. To give Kindgi its own copy: ${inputs.kindgi('secrets', 'copy')} (it never edits your app's files).`);
1685
+ emitProblem(` ⚠ ${h.name} is in ${where}, which your app loads too. To give Kindgi its own copy: ${inputs.kindgi('secrets', 'copy')} (it never edits your app's files).`);
1611
1686
  }
1612
1687
  return all;
1613
1688
  }
@@ -1648,18 +1723,33 @@ async function applyDeclaredProviders(inputs) {
1648
1723
  });
1649
1724
  }
1650
1725
  catch (err) {
1651
- emitProgress(`⚠ Providers from ${inputs.file}: not applied; the runtime's providers could not be listed: ${err.message}`);
1726
+ emitProblem(`⚠ Providers from ${inputs.file}: not applied; the runtime's providers could not be listed: ${err.message}`);
1652
1727
  return;
1653
1728
  }
1654
- for (const line of describeReconcile(result.outcomes, inputs))
1655
- emitProgress(line);
1729
+ for (const line of describeReconcile(result.outcomes, inputs)) {
1730
+ (line.problem ? emitProblem : emitProgress)(line.text);
1731
+ }
1656
1732
  try {
1657
1733
  await writeOwnedProviders(recordPath, inputs.key, result.owned);
1658
1734
  }
1659
1735
  catch (err) {
1660
- emitProgress(` ⚠ could not write ${join('.kindgi', 'dev', 'providers.json')}: ${err.message}. The next boot leaves the providers registered now as they are.`);
1736
+ emitProblem(` ⚠ could not write ${join('.kindgi', 'dev', 'providers.json')}: ${err.message}. The next boot leaves the providers registered now as they are.`);
1661
1737
  }
1662
1738
  }
1739
+ /**
1740
+ * The dev token as the banners show it: as the runtime's own startup line
1741
+ * does, `kgi_bt_…` and its last four characters, so a dev log someone
1742
+ * pastes doesn't give the token away. A token pinned with `--dev-token` in
1743
+ * another shape shows only its last four, and none under 16 characters.
1744
+ * `tokenFile`, in the pack, has it in full.
1745
+ */
1746
+ export function describeDevToken(token, tokenFile) {
1747
+ const scrubbed = scrubText(token);
1748
+ const shown = /^kgi_[a-z]{2,3}_…[^…]{0,4}$/u.test(scrubbed)
1749
+ ? scrubbed
1750
+ : `…${token.length >= 16 ? token.slice(-4) : ''}`;
1751
+ return `${shown} (in full in the pack's ${tokenFile})`;
1752
+ }
1663
1753
  /** The browser origins line: who may follow runs with public run tokens (`KINDGI_CORS_ORIGINS`). */
1664
1754
  function describeBrowserOrigins(origins) {
1665
1755
  return origins.length > 0
@@ -1700,7 +1790,7 @@ export function renderDevBanner(inputs) {
1700
1790
  }
1701
1791
  lines.push(` API server ${inputs.baseUrl}`);
1702
1792
  lines.push(` Tenant ${inputs.tenantId}`);
1703
- lines.push(` Bearer token ${inputs.token}`);
1793
+ lines.push(` Bearer token ${describeDevToken(inputs.token, inputs.tokenFile)}`);
1704
1794
  lines.push(` Pack dir ${inputs.packDir}`);
1705
1795
  if (inputs.providers !== undefined) {
1706
1796
  lines.push(` Models ${describeModels(inputs.providers)}`);
@@ -1727,7 +1817,7 @@ function renderIndexSection(inputs) {
1727
1817
  const c = index.counts;
1728
1818
  const lines = [
1729
1819
  ` Discovering pack (${index.packId}@${index.packVersion})`,
1730
- ` ✓ ${c.tools} tools ✓ ${c.guardrails} guardrails ✓ ${c.agents} agents ✓ ${c.flows} flows`,
1820
+ ` ✓ ${c.tools} tools ✓ ${c.guardrails} guardrails ✓ ${c.agents} agents ✓ ${c.flows} flows${c.blocks !== undefined && c.blocks > 0 ? ` ✓ ${c.blocks} blocks` : ''}`,
1731
1821
  ];
1732
1822
  if (inputs.bootReport.failed.length > 0) {
1733
1823
  lines.push('', ' Registration failures:');