@kindgi/cli 0.0.0-bootstrap.0 → 0.1.1

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 (516) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +738 -1
  3. package/dist/build/apt.d.ts +16 -0
  4. package/dist/build/apt.d.ts.map +1 -0
  5. package/dist/build/apt.js +50 -0
  6. package/dist/build/apt.js.map +1 -0
  7. package/dist/build/bundle.d.ts +48 -0
  8. package/dist/build/bundle.d.ts.map +1 -0
  9. package/dist/build/bundle.js +125 -0
  10. package/dist/build/bundle.js.map +1 -0
  11. package/dist/build/containerfile.d.ts +27 -0
  12. package/dist/build/containerfile.d.ts.map +1 -0
  13. package/dist/build/containerfile.js +197 -0
  14. package/dist/build/containerfile.js.map +1 -0
  15. package/dist/build/context-files.d.ts +24 -0
  16. package/dist/build/context-files.d.ts.map +1 -0
  17. package/dist/build/context-files.js +99 -0
  18. package/dist/build/context-files.js.map +1 -0
  19. package/dist/build/defaults.d.ts +66 -0
  20. package/dist/build/defaults.d.ts.map +1 -0
  21. package/dist/build/defaults.js +597 -0
  22. package/dist/build/defaults.js.map +1 -0
  23. package/dist/build/envelope.d.ts +72 -0
  24. package/dist/build/envelope.d.ts.map +1 -0
  25. package/dist/build/envelope.js +76 -0
  26. package/dist/build/envelope.js.map +1 -0
  27. package/dist/build/host-install.d.ts +100 -0
  28. package/dist/build/host-install.d.ts.map +1 -0
  29. package/dist/build/host-install.js +443 -0
  30. package/dist/build/host-install.js.map +1 -0
  31. package/dist/build/image-config.d.ts +32 -0
  32. package/dist/build/image-config.d.ts.map +1 -0
  33. package/dist/build/image-config.js +129 -0
  34. package/dist/build/image-config.js.map +1 -0
  35. package/dist/build/integrity.d.ts +51 -0
  36. package/dist/build/integrity.d.ts.map +1 -0
  37. package/dist/build/integrity.js +75 -0
  38. package/dist/build/integrity.js.map +1 -0
  39. package/dist/build/node-image.d.ts +18 -0
  40. package/dist/build/node-image.d.ts.map +1 -0
  41. package/dist/build/node-image.js +46 -0
  42. package/dist/build/node-image.js.map +1 -0
  43. package/dist/build/pack-root.d.ts +69 -0
  44. package/dist/build/pack-root.d.ts.map +1 -0
  45. package/dist/build/pack-root.js +102 -0
  46. package/dist/build/pack-root.js.map +1 -0
  47. package/dist/build/poetry-requirements.d.ts +5 -0
  48. package/dist/build/poetry-requirements.d.ts.map +1 -0
  49. package/dist/build/poetry-requirements.js +8 -0
  50. package/dist/build/poetry-requirements.js.map +1 -0
  51. package/dist/build/python-image.d.ts +40 -0
  52. package/dist/build/python-image.d.ts.map +1 -0
  53. package/dist/build/python-image.js +197 -0
  54. package/dist/build/python-image.js.map +1 -0
  55. package/dist/build/runners.d.ts +259 -0
  56. package/dist/build/runners.d.ts.map +1 -0
  57. package/dist/build/runners.js +4 -0
  58. package/dist/build/runners.js.map +1 -0
  59. package/dist/build/version-specifier.d.ts +2 -0
  60. package/dist/build/version-specifier.d.ts.map +1 -0
  61. package/dist/build/version-specifier.js +70 -0
  62. package/dist/build/version-specifier.js.map +1 -0
  63. package/dist/cli-package.d.ts +15 -0
  64. package/dist/cli-package.d.ts.map +1 -0
  65. package/dist/cli-package.js +37 -0
  66. package/dist/cli-package.js.map +1 -0
  67. package/dist/cli.d.ts +3 -0
  68. package/dist/cli.d.ts.map +1 -0
  69. package/dist/cli.js +26 -0
  70. package/dist/cli.js.map +1 -0
  71. package/dist/commands/adapters.d.ts +3 -0
  72. package/dist/commands/adapters.d.ts.map +1 -0
  73. package/dist/commands/adapters.js +148 -0
  74. package/dist/commands/adapters.js.map +1 -0
  75. package/dist/commands/agents.d.ts +3 -0
  76. package/dist/commands/agents.d.ts.map +1 -0
  77. package/dist/commands/agents.js +82 -0
  78. package/dist/commands/agents.js.map +1 -0
  79. package/dist/commands/approvals.d.ts +3 -0
  80. package/dist/commands/approvals.d.ts.map +1 -0
  81. package/dist/commands/approvals.js +92 -0
  82. package/dist/commands/approvals.js.map +1 -0
  83. package/dist/commands/artifacts.d.ts +3 -0
  84. package/dist/commands/artifacts.d.ts.map +1 -0
  85. package/dist/commands/artifacts.js +87 -0
  86. package/dist/commands/artifacts.js.map +1 -0
  87. package/dist/commands/auth.d.ts +25 -0
  88. package/dist/commands/auth.d.ts.map +1 -0
  89. package/dist/commands/auth.js +283 -0
  90. package/dist/commands/auth.js.map +1 -0
  91. package/dist/commands/build.d.ts +46 -0
  92. package/dist/commands/build.d.ts.map +1 -0
  93. package/dist/commands/build.js +902 -0
  94. package/dist/commands/build.js.map +1 -0
  95. package/dist/commands/capabilities.d.ts +3 -0
  96. package/dist/commands/capabilities.d.ts.map +1 -0
  97. package/dist/commands/capabilities.js +38 -0
  98. package/dist/commands/capabilities.js.map +1 -0
  99. package/dist/commands/conversations.d.ts +3 -0
  100. package/dist/commands/conversations.d.ts.map +1 -0
  101. package/dist/commands/conversations.js +75 -0
  102. package/dist/commands/conversations.js.map +1 -0
  103. package/dist/commands/deploy.d.ts +7 -0
  104. package/dist/commands/deploy.d.ts.map +1 -0
  105. package/dist/commands/deploy.js +697 -0
  106. package/dist/commands/deploy.js.map +1 -0
  107. package/dist/commands/dev.d.ts +43 -0
  108. package/dist/commands/dev.d.ts.map +1 -0
  109. package/dist/commands/dev.js +1110 -0
  110. package/dist/commands/dev.js.map +1 -0
  111. package/dist/commands/env.d.ts +27 -0
  112. package/dist/commands/env.d.ts.map +1 -0
  113. package/dist/commands/env.js +816 -0
  114. package/dist/commands/env.js.map +1 -0
  115. package/dist/commands/feedback.d.ts +33 -0
  116. package/dist/commands/feedback.d.ts.map +1 -0
  117. package/dist/commands/feedback.js +374 -0
  118. package/dist/commands/feedback.js.map +1 -0
  119. package/dist/commands/flows.d.ts +3 -0
  120. package/dist/commands/flows.d.ts.map +1 -0
  121. package/dist/commands/flows.js +60 -0
  122. package/dist/commands/flows.js.map +1 -0
  123. package/dist/commands/guardrails.d.ts +3 -0
  124. package/dist/commands/guardrails.d.ts.map +1 -0
  125. package/dist/commands/guardrails.js +89 -0
  126. package/dist/commands/guardrails.js.map +1 -0
  127. package/dist/commands/health.d.ts +8 -0
  128. package/dist/commands/health.d.ts.map +1 -0
  129. package/dist/commands/health.js +40 -0
  130. package/dist/commands/health.js.map +1 -0
  131. package/dist/commands/helpers.d.ts +48 -0
  132. package/dist/commands/helpers.d.ts.map +1 -0
  133. package/dist/commands/helpers.js +110 -0
  134. package/dist/commands/helpers.js.map +1 -0
  135. package/dist/commands/index.d.ts +7 -0
  136. package/dist/commands/index.d.ts.map +1 -0
  137. package/dist/commands/index.js +90 -0
  138. package/dist/commands/index.js.map +1 -0
  139. package/dist/commands/init.d.ts +46 -0
  140. package/dist/commands/init.d.ts.map +1 -0
  141. package/dist/commands/init.js +454 -0
  142. package/dist/commands/init.js.map +1 -0
  143. package/dist/commands/key.d.ts +3 -0
  144. package/dist/commands/key.d.ts.map +1 -0
  145. package/dist/commands/key.js +322 -0
  146. package/dist/commands/key.js.map +1 -0
  147. package/dist/commands/mcp.d.ts +43 -0
  148. package/dist/commands/mcp.d.ts.map +1 -0
  149. package/dist/commands/mcp.js +433 -0
  150. package/dist/commands/mcp.js.map +1 -0
  151. package/dist/commands/memory.d.ts +3 -0
  152. package/dist/commands/memory.d.ts.map +1 -0
  153. package/dist/commands/memory.js +82 -0
  154. package/dist/commands/memory.js.map +1 -0
  155. package/dist/commands/observations.d.ts +3 -0
  156. package/dist/commands/observations.d.ts.map +1 -0
  157. package/dist/commands/observations.js +27 -0
  158. package/dist/commands/observations.js.map +1 -0
  159. package/dist/commands/proposals.d.ts +3 -0
  160. package/dist/commands/proposals.d.ts.map +1 -0
  161. package/dist/commands/proposals.js +116 -0
  162. package/dist/commands/proposals.js.map +1 -0
  163. package/dist/commands/provenance.d.ts +3 -0
  164. package/dist/commands/provenance.d.ts.map +1 -0
  165. package/dist/commands/provenance.js +53 -0
  166. package/dist/commands/provenance.js.map +1 -0
  167. package/dist/commands/providers.d.ts +3 -0
  168. package/dist/commands/providers.d.ts.map +1 -0
  169. package/dist/commands/providers.js +212 -0
  170. package/dist/commands/providers.js.map +1 -0
  171. package/dist/commands/reviewers.d.ts +3 -0
  172. package/dist/commands/reviewers.d.ts.map +1 -0
  173. package/dist/commands/reviewers.js +78 -0
  174. package/dist/commands/reviewers.js.map +1 -0
  175. package/dist/commands/runs.d.ts +3 -0
  176. package/dist/commands/runs.d.ts.map +1 -0
  177. package/dist/commands/runs.js +223 -0
  178. package/dist/commands/runs.js.map +1 -0
  179. package/dist/commands/secrets.d.ts +18 -0
  180. package/dist/commands/secrets.d.ts.map +1 -0
  181. package/dist/commands/secrets.js +702 -0
  182. package/dist/commands/secrets.js.map +1 -0
  183. package/dist/commands/skills.d.ts +64 -0
  184. package/dist/commands/skills.d.ts.map +1 -0
  185. package/dist/commands/skills.js +430 -0
  186. package/dist/commands/skills.js.map +1 -0
  187. package/dist/commands/test.d.ts +5 -0
  188. package/dist/commands/test.d.ts.map +1 -0
  189. package/dist/commands/test.js +181 -0
  190. package/dist/commands/test.js.map +1 -0
  191. package/dist/commands/tokens.d.ts +3 -0
  192. package/dist/commands/tokens.d.ts.map +1 -0
  193. package/dist/commands/tokens.js +33 -0
  194. package/dist/commands/tokens.js.map +1 -0
  195. package/dist/commands/tools.d.ts +3 -0
  196. package/dist/commands/tools.d.ts.map +1 -0
  197. package/dist/commands/tools.js +162 -0
  198. package/dist/commands/tools.js.map +1 -0
  199. package/dist/commands/types.d.ts +54 -0
  200. package/dist/commands/types.d.ts.map +1 -0
  201. package/dist/commands/types.js +4 -0
  202. package/dist/commands/types.js.map +1 -0
  203. package/dist/commands/unwired.d.ts +22 -0
  204. package/dist/commands/unwired.d.ts.map +1 -0
  205. package/dist/commands/unwired.js +52 -0
  206. package/dist/commands/unwired.js.map +1 -0
  207. package/dist/commands/version.d.ts +8 -0
  208. package/dist/commands/version.d.ts.map +1 -0
  209. package/dist/commands/version.js +41 -0
  210. package/dist/commands/version.js.map +1 -0
  211. package/dist/config.d.ts +42 -0
  212. package/dist/config.d.ts.map +1 -0
  213. package/dist/config.js +83 -0
  214. package/dist/config.js.map +1 -0
  215. package/dist/context.d.ts +162 -0
  216. package/dist/context.d.ts.map +1 -0
  217. package/dist/context.js +45 -0
  218. package/dist/context.js.map +1 -0
  219. package/dist/deploy/defaults.d.ts +14 -0
  220. package/dist/deploy/defaults.d.ts.map +1 -0
  221. package/dist/deploy/defaults.js +37 -0
  222. package/dist/deploy/defaults.js.map +1 -0
  223. package/dist/deploy/envelope-loader.d.ts +24 -0
  224. package/dist/deploy/envelope-loader.d.ts.map +1 -0
  225. package/dist/deploy/envelope-loader.js +141 -0
  226. package/dist/deploy/envelope-loader.js.map +1 -0
  227. package/dist/deploy/post.d.ts +48 -0
  228. package/dist/deploy/post.d.ts.map +1 -0
  229. package/dist/deploy/post.js +210 -0
  230. package/dist/deploy/post.js.map +1 -0
  231. package/dist/deploy/response.d.ts +42 -0
  232. package/dist/deploy/response.d.ts.map +1 -0
  233. package/dist/deploy/response.js +128 -0
  234. package/dist/deploy/response.js.map +1 -0
  235. package/dist/deploy/runners.d.ts +218 -0
  236. package/dist/deploy/runners.d.ts.map +1 -0
  237. package/dist/deploy/runners.js +4 -0
  238. package/dist/deploy/runners.js.map +1 -0
  239. package/dist/dev/bundler.d.ts +10 -0
  240. package/dist/dev/bundler.d.ts.map +1 -0
  241. package/dist/dev/bundler.js +235 -0
  242. package/dist/dev/bundler.js.map +1 -0
  243. package/dist/dev/defaults.d.ts +140 -0
  244. package/dist/dev/defaults.d.ts.map +1 -0
  245. package/dist/dev/defaults.js +709 -0
  246. package/dist/dev/defaults.js.map +1 -0
  247. package/dist/dev/dev-only-imports.d.ts +15 -0
  248. package/dist/dev/dev-only-imports.d.ts.map +1 -0
  249. package/dist/dev/dev-only-imports.js +57 -0
  250. package/dist/dev/dev-only-imports.js.map +1 -0
  251. package/dist/dev/docker-compose.dev.yml +68 -0
  252. package/dist/dev/index-child.d.ts +2 -0
  253. package/dist/dev/index-child.d.ts.map +1 -0
  254. package/dist/dev/index-child.js +53 -0
  255. package/dist/dev/index-child.js.map +1 -0
  256. package/dist/dev/pack-code.d.ts +36 -0
  257. package/dist/dev/pack-code.d.ts.map +1 -0
  258. package/dist/dev/pack-code.js +129 -0
  259. package/dist/dev/pack-code.js.map +1 -0
  260. package/dist/dev/pack-env.d.ts +13 -0
  261. package/dist/dev/pack-env.d.ts.map +1 -0
  262. package/dist/dev/pack-env.js +36 -0
  263. package/dist/dev/pack-env.js.map +1 -0
  264. package/dist/dev/pack-service.d.ts +40 -0
  265. package/dist/dev/pack-service.d.ts.map +1 -0
  266. package/dist/dev/pack-service.js +189 -0
  267. package/dist/dev/pack-service.js.map +1 -0
  268. package/dist/dev/paths.d.ts +22 -0
  269. package/dist/dev/paths.d.ts.map +1 -0
  270. package/dist/dev/paths.js +35 -0
  271. package/dist/dev/paths.js.map +1 -0
  272. package/dist/dev/postgres-container.d.ts +77 -0
  273. package/dist/dev/postgres-container.d.ts.map +1 -0
  274. package/dist/dev/postgres-container.js +346 -0
  275. package/dist/dev/postgres-container.js.map +1 -0
  276. package/dist/dev/python-builder.d.ts +16 -0
  277. package/dist/dev/python-builder.d.ts.map +1 -0
  278. package/dist/dev/python-builder.js +122 -0
  279. package/dist/dev/python-builder.js.map +1 -0
  280. package/dist/dev/register.d.ts +71 -0
  281. package/dist/dev/register.d.ts.map +1 -0
  282. package/dist/dev/register.js +54 -0
  283. package/dist/dev/register.js.map +1 -0
  284. package/dist/dev/runners.d.ts +312 -0
  285. package/dist/dev/runners.d.ts.map +1 -0
  286. package/dist/dev/runners.js +4 -0
  287. package/dist/dev/runners.js.map +1 -0
  288. package/dist/dev/runtime-container.d.ts +71 -0
  289. package/dist/dev/runtime-container.d.ts.map +1 -0
  290. package/dist/dev/runtime-container.js +173 -0
  291. package/dist/dev/runtime-container.js.map +1 -0
  292. package/dist/dev/runtime-env.d.ts +62 -0
  293. package/dist/dev/runtime-env.d.ts.map +1 -0
  294. package/dist/dev/runtime-env.js +100 -0
  295. package/dist/dev/runtime-env.js.map +1 -0
  296. package/dist/dev/runtime-image.d.ts +26 -0
  297. package/dist/dev/runtime-image.d.ts.map +1 -0
  298. package/dist/dev/runtime-image.js +44 -0
  299. package/dist/dev/runtime-image.js.map +1 -0
  300. package/dist/dev/runtime-registry.d.ts +73 -0
  301. package/dist/dev/runtime-registry.d.ts.map +1 -0
  302. package/dist/dev/runtime-registry.js +111 -0
  303. package/dist/dev/runtime-registry.js.map +1 -0
  304. package/dist/env/defaults.d.ts +3 -0
  305. package/dist/env/defaults.d.ts.map +1 -0
  306. package/dist/env/defaults.js +22 -0
  307. package/dist/env/defaults.js.map +1 -0
  308. package/dist/env/pack-env-plan.d.ts +70 -0
  309. package/dist/env/pack-env-plan.d.ts.map +1 -0
  310. package/dist/env/pack-env-plan.js +236 -0
  311. package/dist/env/pack-env-plan.js.map +1 -0
  312. package/dist/env/parser.d.ts +9 -0
  313. package/dist/env/parser.d.ts.map +1 -0
  314. package/dist/env/parser.js +11 -0
  315. package/dist/env/parser.js.map +1 -0
  316. package/dist/env/project-env.d.ts +34 -0
  317. package/dist/env/project-env.d.ts.map +1 -0
  318. package/dist/env/project-env.js +45 -0
  319. package/dist/env/project-env.js.map +1 -0
  320. package/dist/env/runners.d.ts +22 -0
  321. package/dist/env/runners.d.ts.map +1 -0
  322. package/dist/env/runners.js +4 -0
  323. package/dist/env/runners.js.map +1 -0
  324. package/dist/env/writer.d.ts +7 -0
  325. package/dist/env/writer.d.ts.map +1 -0
  326. package/dist/env/writer.js +9 -0
  327. package/dist/env/writer.js.map +1 -0
  328. package/dist/errors.d.ts +31 -0
  329. package/dist/errors.d.ts.map +1 -0
  330. package/dist/errors.js +111 -0
  331. package/dist/errors.js.map +1 -0
  332. package/dist/help.d.ts +5 -0
  333. package/dist/help.d.ts.map +1 -0
  334. package/dist/help.js +61 -0
  335. package/dist/help.js.map +1 -0
  336. package/dist/index.d.ts +13 -0
  337. package/dist/index.d.ts.map +1 -0
  338. package/dist/index.js +13 -0
  339. package/dist/index.js.map +1 -0
  340. package/dist/init/augment-scaffolder.d.ts +86 -0
  341. package/dist/init/augment-scaffolder.d.ts.map +1 -0
  342. package/dist/init/augment-scaffolder.js +538 -0
  343. package/dist/init/augment-scaffolder.js.map +1 -0
  344. package/dist/init/dependency-specs.d.ts +58 -0
  345. package/dist/init/dependency-specs.d.ts.map +1 -0
  346. package/dist/init/dependency-specs.js +153 -0
  347. package/dist/init/dependency-specs.js.map +1 -0
  348. package/dist/init/gitignore-patcher.d.ts +23 -0
  349. package/dist/init/gitignore-patcher.d.ts.map +1 -0
  350. package/dist/init/gitignore-patcher.js +103 -0
  351. package/dist/init/gitignore-patcher.js.map +1 -0
  352. package/dist/init/mode-detect.d.ts +34 -0
  353. package/dist/init/mode-detect.d.ts.map +1 -0
  354. package/dist/init/mode-detect.js +115 -0
  355. package/dist/init/mode-detect.js.map +1 -0
  356. package/dist/init/package-json-patcher.d.ts +36 -0
  357. package/dist/init/package-json-patcher.d.ts.map +1 -0
  358. package/dist/init/package-json-patcher.js +128 -0
  359. package/dist/init/package-json-patcher.js.map +1 -0
  360. package/dist/init/pnpm-workspace-patcher.d.ts +55 -0
  361. package/dist/init/pnpm-workspace-patcher.d.ts.map +1 -0
  362. package/dist/init/pnpm-workspace-patcher.js +248 -0
  363. package/dist/init/pnpm-workspace-patcher.js.map +1 -0
  364. package/dist/init/pyproject-patcher.d.ts +56 -0
  365. package/dist/init/pyproject-patcher.d.ts.map +1 -0
  366. package/dist/init/pyproject-patcher.js +324 -0
  367. package/dist/init/pyproject-patcher.js.map +1 -0
  368. package/dist/init/python-augment.d.ts +22 -0
  369. package/dist/init/python-augment.d.ts.map +1 -0
  370. package/dist/init/python-augment.js +300 -0
  371. package/dist/init/python-augment.js.map +1 -0
  372. package/dist/init/template-files.d.ts +18 -0
  373. package/dist/init/template-files.d.ts.map +1 -0
  374. package/dist/init/template-files.js +53 -0
  375. package/dist/init/template-files.js.map +1 -0
  376. package/dist/key/defaults.d.ts +3 -0
  377. package/dist/key/defaults.d.ts.map +1 -0
  378. package/dist/key/defaults.js +60 -0
  379. package/dist/key/defaults.js.map +1 -0
  380. package/dist/key/fingerprint.d.ts +6 -0
  381. package/dist/key/fingerprint.d.ts.map +1 -0
  382. package/dist/key/fingerprint.js +25 -0
  383. package/dist/key/fingerprint.js.map +1 -0
  384. package/dist/key/paths.d.ts +30 -0
  385. package/dist/key/paths.d.ts.map +1 -0
  386. package/dist/key/paths.js +51 -0
  387. package/dist/key/paths.js.map +1 -0
  388. package/dist/key/runners.d.ts +60 -0
  389. package/dist/key/runners.d.ts.map +1 -0
  390. package/dist/key/runners.js +4 -0
  391. package/dist/key/runners.js.map +1 -0
  392. package/dist/main.d.ts +113 -0
  393. package/dist/main.d.ts.map +1 -0
  394. package/dist/main.js +199 -0
  395. package/dist/main.js.map +1 -0
  396. package/dist/mcp/launcher.d.ts +143 -0
  397. package/dist/mcp/launcher.d.ts.map +1 -0
  398. package/dist/mcp/launcher.js +393 -0
  399. package/dist/mcp/launcher.js.map +1 -0
  400. package/dist/mcp/preset-loader.d.ts +29 -0
  401. package/dist/mcp/preset-loader.d.ts.map +1 -0
  402. package/dist/mcp/preset-loader.js +217 -0
  403. package/dist/mcp/preset-loader.js.map +1 -0
  404. package/dist/mcp/preset-types.d.ts +71 -0
  405. package/dist/mcp/preset-types.d.ts.map +1 -0
  406. package/dist/mcp/preset-types.js +4 -0
  407. package/dist/mcp/preset-types.js.map +1 -0
  408. package/dist/mcp/presets/README.md +68 -0
  409. package/dist/mcp/presets/postgres.json +15 -0
  410. package/dist/output.d.ts +26 -0
  411. package/dist/output.d.ts.map +1 -0
  412. package/dist/output.js +46 -0
  413. package/dist/output.js.map +1 -0
  414. package/dist/pack-config.d.ts +37 -0
  415. package/dist/pack-config.d.ts.map +1 -0
  416. package/dist/pack-config.js +65 -0
  417. package/dist/pack-config.js.map +1 -0
  418. package/dist/package-manager.d.ts +33 -0
  419. package/dist/package-manager.d.ts.map +1 -0
  420. package/dist/package-manager.js +129 -0
  421. package/dist/package-manager.js.map +1 -0
  422. package/dist/parse.d.ts +88 -0
  423. package/dist/parse.d.ts.map +1 -0
  424. package/dist/parse.js +100 -0
  425. package/dist/parse.js.map +1 -0
  426. package/dist/providers/preset-loader.d.ts +47 -0
  427. package/dist/providers/preset-loader.d.ts.map +1 -0
  428. package/dist/providers/preset-loader.js +107 -0
  429. package/dist/providers/preset-loader.js.map +1 -0
  430. package/dist/providers/presets/anthropic.json +47 -0
  431. package/dist/providers/presets/gemini.json +40 -0
  432. package/dist/reference.d.ts +28 -0
  433. package/dist/reference.d.ts.map +1 -0
  434. package/dist/reference.js +52 -0
  435. package/dist/reference.js.map +1 -0
  436. package/dist/sdk-package.d.ts +9 -0
  437. package/dist/sdk-package.d.ts.map +1 -0
  438. package/dist/sdk-package.js +20 -0
  439. package/dist/sdk-package.js.map +1 -0
  440. package/dist/sdk-skills/kindgi-authoring-agents/SKILL.md +252 -0
  441. package/dist/sdk-skills/kindgi-authoring-flows/SKILL.md +302 -0
  442. package/dist/sdk-skills/kindgi-authoring-guardrails/SKILL.md +297 -0
  443. package/dist/sdk-skills/kindgi-authoring-mcp-servers/SKILL.md +289 -0
  444. package/dist/sdk-skills/kindgi-authoring-providers/SKILL.md +705 -0
  445. package/dist/sdk-skills/kindgi-authoring-tools/SKILL.md +298 -0
  446. package/dist/sdk-skills/kindgi-framework-feedback/SKILL.md +211 -0
  447. package/dist/sdk-skills/kindgi-getting-started/SKILL.md +189 -0
  448. package/dist/sdk-skills/kindgi-python-authoring-agents/SKILL.md +205 -0
  449. package/dist/sdk-skills/kindgi-python-authoring-flows/SKILL.md +325 -0
  450. package/dist/sdk-skills/kindgi-python-authoring-guardrails/SKILL.md +176 -0
  451. package/dist/sdk-skills/kindgi-python-authoring-tools/SKILL.md +305 -0
  452. package/dist/sdk-skills/kindgi-python-getting-started/SKILL.md +242 -0
  453. package/dist/stop-signal.d.ts +15 -0
  454. package/dist/stop-signal.d.ts.map +1 -0
  455. package/dist/stop-signal.js +16 -0
  456. package/dist/stop-signal.js.map +1 -0
  457. package/dist/templates/minimal/.nvmrc +1 -0
  458. package/dist/templates/minimal/AGENTS.md +23 -0
  459. package/dist/templates/minimal/README.md.tmpl +69 -0
  460. package/dist/templates/minimal/agents/.gitkeep +0 -0
  461. package/dist/templates/minimal/flows/.gitkeep +0 -0
  462. package/dist/templates/minimal/gitignore +8 -0
  463. package/dist/templates/minimal/guardrails/.gitkeep +0 -0
  464. package/dist/templates/minimal/kindgi.config.ts.tmpl +44 -0
  465. package/dist/templates/minimal/package.json.tmpl +25 -0
  466. package/dist/templates/minimal/pnpm-workspace.yaml +8 -0
  467. package/dist/templates/minimal/tools/.gitkeep +0 -0
  468. package/dist/templates/minimal/tsconfig.json.tmpl +27 -0
  469. package/dist/templates/minimal/vitest.config.ts.tmpl +14 -0
  470. package/dist/templates/python/AGENTS.md +30 -0
  471. package/dist/templates/python/README.md.tmpl +56 -0
  472. package/dist/templates/python/agents/echo_agent.py.tmpl +23 -0
  473. package/dist/templates/python/flows/echo_flow.py.tmpl +17 -0
  474. package/dist/templates/python/gitignore +9 -0
  475. package/dist/templates/python/guardrails/response_not_empty.py.tmpl +27 -0
  476. package/dist/templates/python/pyproject.toml.tmpl +42 -0
  477. package/dist/templates/python/tests/test_tools.py.tmpl +22 -0
  478. package/dist/templates/python/tools/echo.py.tmpl +27 -0
  479. package/dist/templates/python/tools/greet.py.tmpl +20 -0
  480. package/dist/templates/sample/.nvmrc +1 -0
  481. package/dist/templates/sample/AGENTS.md +23 -0
  482. package/dist/templates/sample/README.md.tmpl +85 -0
  483. package/dist/templates/sample/agents/echo-agent/index.ts.tmpl +34 -0
  484. package/dist/templates/sample/flows/echo-flow/index.ts.tmpl +59 -0
  485. package/dist/templates/sample/gitignore +8 -0
  486. package/dist/templates/sample/guardrails/response-not-empty/index.ts.tmpl +58 -0
  487. package/dist/templates/sample/kindgi.config.ts.tmpl +41 -0
  488. package/dist/templates/sample/package.json.tmpl +25 -0
  489. package/dist/templates/sample/pnpm-workspace.yaml +8 -0
  490. package/dist/templates/sample/tools/echo/index.test.ts.tmpl +31 -0
  491. package/dist/templates/sample/tools/echo/index.ts.tmpl +37 -0
  492. package/dist/templates/sample/tools/fetch-httpbin/index.ts.tmpl +60 -0
  493. package/dist/templates/sample/tools/greet/index.ts.tmpl +35 -0
  494. package/dist/templates/sample/tsconfig.json.tmpl +27 -0
  495. package/dist/templates/sample/vitest.config.ts.tmpl +14 -0
  496. package/dist/terminal-input.d.ts +17 -0
  497. package/dist/terminal-input.d.ts.map +1 -0
  498. package/dist/terminal-input.js +88 -0
  499. package/dist/terminal-input.js.map +1 -0
  500. package/dist/test/defaults.d.ts +3 -0
  501. package/dist/test/defaults.d.ts.map +1 -0
  502. package/dist/test/defaults.js +104 -0
  503. package/dist/test/defaults.js.map +1 -0
  504. package/dist/test/runners.d.ts +60 -0
  505. package/dist/test/runners.d.ts.map +1 -0
  506. package/dist/test/runners.js +4 -0
  507. package/dist/test/runners.js.map +1 -0
  508. package/dist/version-info.d.ts +9 -0
  509. package/dist/version-info.d.ts.map +1 -0
  510. package/dist/version-info.js +27 -0
  511. package/dist/version-info.js.map +1 -0
  512. package/dist/write-fully.d.ts +13 -0
  513. package/dist/write-fully.d.ts.map +1 -0
  514. package/dist/write-fully.js +17 -0
  515. package/dist/write-fully.js.map +1 -0
  516. package/package.json +63 -4
@@ -0,0 +1,16 @@
1
+ export type AptPackages = {
2
+ readonly kind: 'ok';
3
+ readonly packages: readonly string[];
4
+ } | {
5
+ readonly kind: 'err';
6
+ readonly message: string;
7
+ };
8
+ /** The declared packages, checked — `where` names the setting in messages. */
9
+ export declare function checkAptPackages(value: unknown, where: string): AptPackages;
10
+ /**
11
+ * The Containerfile `RUN` step installing `packages` (checked by
12
+ * `checkAptPackages`): one layer, no recommended extras, the package
13
+ * lists removed after. Empty → no step.
14
+ */
15
+ export declare function renderAptGetStep(packages: readonly string[]): string;
16
+ //# sourceMappingURL=apt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apt.d.ts","sourceRoot":"","sources":["../../src/build/apt.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC7D;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAa3E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOpE"}
@@ -0,0 +1,50 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * Debian packages in a pack image — the one place that renders the
5
+ * `apt-get` step, so every pack image installs them the same way.
6
+ *
7
+ * A pack declares them when its code needs programs or libraries outside
8
+ * its language's packages (OCR, PDF tools, `libmagic`, …):
9
+ * - a Python pack: `[tool.kindgi.image] system-packages = [...]` in
10
+ * `pyproject.toml` — the Python spelling of the `aptGet` image
11
+ * extension (plan decision K8) a TypeScript pack configures under
12
+ * `image:` in `kindgi.config`;
13
+ * - the Node pack image renders the same step for `aptGet` (R3).
14
+ *
15
+ * Names are checked against Debian's package-name rules, with an optional
16
+ * `=version` pin, so nothing else can reach the `RUN` line.
17
+ */
18
+ /** `name` or `name=version`, as Debian policy allows them. */
19
+ const APT_PACKAGE = /^[a-z0-9][a-z0-9+.-]+(=[A-Za-z0-9.+~:-]+)?$/;
20
+ /** The declared packages, checked — `where` names the setting in messages. */
21
+ export function checkAptPackages(value, where) {
22
+ if (value === undefined)
23
+ return { kind: 'ok', packages: [] };
24
+ if (!Array.isArray(value) || !value.every((p) => typeof p === 'string')) {
25
+ return { kind: 'err', message: `${where} must be a list of Debian package names` };
26
+ }
27
+ const bad = value.filter((p) => !APT_PACKAGE.test(p));
28
+ if (bad.length > 0) {
29
+ return {
30
+ kind: 'err',
31
+ message: `${where}: not a Debian package name: ${bad.map((p) => JSON.stringify(p)).join(', ')}`,
32
+ };
33
+ }
34
+ return { kind: 'ok', packages: [...new Set(value)].sort() };
35
+ }
36
+ /**
37
+ * The Containerfile `RUN` step installing `packages` (checked by
38
+ * `checkAptPackages`): one layer, no recommended extras, the package
39
+ * lists removed after. Empty → no step.
40
+ */
41
+ export function renderAptGetStep(packages) {
42
+ if (packages.length === 0)
43
+ return '';
44
+ return [
45
+ 'RUN apt-get update \\',
46
+ ` && apt-get install -y --no-install-recommends ${packages.join(' ')} \\`,
47
+ ' && rm -rf /var/lib/apt/lists/*',
48
+ ].join('\n');
49
+ }
50
+ //# sourceMappingURL=apt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apt.js","sourceRoot":"","sources":["../../src/build/apt.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,iCAAiC;AAEjC;;;;;;;;;;;;;;GAcG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,GAAG,6CAA6C,CAAC;AAMlE,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,KAAa;IAC5D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QACrF,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,yCAAyC,EAAE,CAAC;IACrF,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACtD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO;YACL,IAAI,EAAE,KAAK;YACX,OAAO,EAAE,GAAG,KAAK,gCAAgC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAChG,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;AAC9D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAA2B;IAC1D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACrC,OAAO;QACL,uBAAuB;QACvB,kDAAkD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;QACzE,iCAAiC;KAClC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,48 @@
1
+ import type { Plugin } from 'esbuild';
2
+ export interface PackEntry {
3
+ /** Absolute path of the primitive's source file. */
4
+ readonly abs: string;
5
+ /** The source path relative to the pack root — what the index records as `modulePath`. */
6
+ readonly sourceRel: string;
7
+ /** The bundle's path under the output directory, without extension. */
8
+ readonly outRel: string;
9
+ }
10
+ /**
11
+ * Bundle entrypoints: every file the pack's discovery patterns match
12
+ * (test files excluded), walked from each pattern's static prefix —
13
+ * the same set the indexer discovers, at any depth.
14
+ */
15
+ export declare function collectPackEntries(packDir: string, patterns: readonly string[]): Promise<readonly PackEntry[]>;
16
+ /**
17
+ * Local files esbuild read (metafile keys are relative to
18
+ * absWorkingDir): real files outside `node_modules`; plugin namespaces
19
+ * (`ns:…`) are not paths.
20
+ */
21
+ export declare function localSourceInputs(root: string, inputs: Readonly<Record<string, unknown>>): Promise<string[]>;
22
+ /** An ESM bundle that inlines CommonJS code needs `require`. */
23
+ export declare const REQUIRE_BANNER = "import { createRequire as __kindgiCreateRequire } from 'node:module'; const require = __kindgiCreateRequire(import.meta.url);";
24
+ /**
25
+ * Externals: whatever resolves into a `node_modules` directory stays
26
+ * external — loaded from the pack's own installed dependencies at
27
+ * runtime, native modules and generated clients (Prisma) included.
28
+ * Everything else, the pack's own code, what tsconfig `paths` point at,
29
+ * and a package linked from outside `node_modules` (its real path isn't
30
+ * in one), is bundled.
31
+ *
32
+ * How an external is imported:
33
+ * - `resolved` (dev): by the absolute path esbuild resolved, so it
34
+ * loads the same file no matter where the bundle sits;
35
+ * - `bare` (a pack image): by its specifier, which Node resolves from
36
+ * the bundle's folder upward into the image's own `node_modules` —
37
+ * the host's absolute paths don't exist there.
38
+ *
39
+ * Which packages are external doesn't depend on `importBy`: a dev bundle
40
+ * and an image's leave out the same ones. `onExternal` (optional) is told
41
+ * each external import: the package's name (`@scope/name` of
42
+ * `@scope/name/sub`), and the absolute path of the file importing it.
43
+ */
44
+ export declare function nodeModulesExternalPlugin(options?: {
45
+ readonly importBy?: 'resolved' | 'bare';
46
+ readonly onExternal?: (name: string, importer: string) => void;
47
+ }): Plugin;
48
+ //# sourceMappingURL=bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.d.ts","sourceRoot":"","sources":["../../src/build/bundle.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,MAAM,WAAW,SAAS;IACxB,oDAAoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,OAAO,CAAC,SAAS,SAAS,EAAE,CAAC,CAyB/B;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB;AAUD,gEAAgE;AAChE,eAAO,MAAM,cAAc,kIACsG,CAAC;AAIlI;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE;IACP,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IACxC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CAC3D,GACL,MAAM,CAuBR"}
@@ -0,0 +1,125 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * What `kindgi build` and `kindgi dev` share about bundling a pack: the
5
+ * entry points (every file the discovery patterns match), the local
6
+ * source files a build read, and the externals rule: which packages both
7
+ * load from the app's `node_modules`.
8
+ */
9
+ import { readdir, stat } from 'node:fs/promises';
10
+ import { join, resolve } from 'node:path';
11
+ import { createGlobMatcher, discoveryRoots } from '@kindgi/handler-runtime';
12
+ /**
13
+ * Bundle entrypoints: every file the pack's discovery patterns match
14
+ * (test files excluded), walked from each pattern's static prefix —
15
+ * the same set the indexer discovers, at any depth.
16
+ */
17
+ export async function collectPackEntries(packDir, patterns) {
18
+ const matches = createGlobMatcher(patterns);
19
+ const out = [];
20
+ const walk = async (rel) => {
21
+ let entries;
22
+ try {
23
+ entries = await readdir(rel === '' ? packDir : join(packDir, rel), { withFileTypes: true });
24
+ }
25
+ catch {
26
+ return;
27
+ }
28
+ for (const entry of entries) {
29
+ if (entry.name === 'node_modules' || entry.name.startsWith('.'))
30
+ continue;
31
+ const child = rel === '' ? entry.name : `${rel}/${entry.name}`;
32
+ if (entry.isDirectory())
33
+ await walk(child);
34
+ else if (entry.isFile() && matches(child)) {
35
+ out.push({
36
+ abs: join(packDir, child),
37
+ sourceRel: child,
38
+ outRel: child.replace(/\.(ts|mts|mjs|js)$/, ''),
39
+ });
40
+ }
41
+ }
42
+ };
43
+ for (const root of discoveryRoots(patterns))
44
+ await walk(root);
45
+ return out.sort((a, b) => a.outRel.localeCompare(b.outRel));
46
+ }
47
+ /**
48
+ * Local files esbuild read (metafile keys are relative to
49
+ * absWorkingDir): real files outside `node_modules`; plugin namespaces
50
+ * (`ns:…`) are not paths.
51
+ */
52
+ export async function localSourceInputs(root, inputs) {
53
+ const out = [];
54
+ for (const key of Object.keys(inputs)) {
55
+ if (key.includes('node_modules/') || /^[a-z-]+:/.test(key))
56
+ continue;
57
+ const abs = resolve(root, key);
58
+ if (await isRegularFile(abs))
59
+ out.push(abs);
60
+ }
61
+ return out.sort();
62
+ }
63
+ async function isRegularFile(path) {
64
+ try {
65
+ return (await stat(path)).isFile();
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ }
71
+ /** An ESM bundle that inlines CommonJS code needs `require`. */
72
+ export const REQUIRE_BANNER = "import { createRequire as __kindgiCreateRequire } from 'node:module'; const require = __kindgiCreateRequire(import.meta.url);";
73
+ const SKIP = Symbol('kindgi-externals-resolving');
74
+ /**
75
+ * Externals: whatever resolves into a `node_modules` directory stays
76
+ * external — loaded from the pack's own installed dependencies at
77
+ * runtime, native modules and generated clients (Prisma) included.
78
+ * Everything else, the pack's own code, what tsconfig `paths` point at,
79
+ * and a package linked from outside `node_modules` (its real path isn't
80
+ * in one), is bundled.
81
+ *
82
+ * How an external is imported:
83
+ * - `resolved` (dev): by the absolute path esbuild resolved, so it
84
+ * loads the same file no matter where the bundle sits;
85
+ * - `bare` (a pack image): by its specifier, which Node resolves from
86
+ * the bundle's folder upward into the image's own `node_modules` —
87
+ * the host's absolute paths don't exist there.
88
+ *
89
+ * Which packages are external doesn't depend on `importBy`: a dev bundle
90
+ * and an image's leave out the same ones. `onExternal` (optional) is told
91
+ * each external import: the package's name (`@scope/name` of
92
+ * `@scope/name/sub`), and the absolute path of the file importing it.
93
+ */
94
+ export function nodeModulesExternalPlugin(options = {}) {
95
+ const importBy = options.importBy ?? 'resolved';
96
+ const onExternal = options.onExternal;
97
+ return {
98
+ name: 'kindgi-node-modules-external',
99
+ setup(build) {
100
+ build.onResolve({ filter: /^[^./]/ }, async (args) => {
101
+ if (args.pluginData === SKIP)
102
+ return undefined;
103
+ const resolved = await build.resolve(args.path, {
104
+ kind: args.kind,
105
+ importer: args.importer,
106
+ resolveDir: args.resolveDir,
107
+ pluginData: SKIP,
108
+ });
109
+ if (resolved.errors.length > 0 || resolved.external)
110
+ return undefined;
111
+ if (/[\\/]node_modules[\\/]/.test(resolved.path)) {
112
+ onExternal?.(packageName(args.path), args.importer);
113
+ return { path: importBy === 'bare' ? args.path : resolved.path, external: true };
114
+ }
115
+ return undefined;
116
+ });
117
+ },
118
+ };
119
+ }
120
+ /** `@scope/name/sub` → `@scope/name`; `name/sub` → `name`. */
121
+ function packageName(specifier) {
122
+ const parts = specifier.split('/');
123
+ return specifier.startsWith('@') ? parts.slice(0, 2).join('/') : (parts[0] ?? specifier);
124
+ }
125
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/build/bundle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { HostInstall, InstallCommands } from './host-install.js';
2
+ import type { ResolvedImage } from './image-config.js';
3
+ export interface RenderContainerfileInputs {
4
+ readonly baseImageRef: string;
5
+ readonly artifactVersion: string;
6
+ readonly publishedAt: string;
7
+ readonly buildTarget: string;
8
+ readonly install: Pick<HostInstall, 'manager' | 'managerSpec' | 'packRel' | 'secrets' | 'yarnBerry'>;
9
+ readonly commands: InstallCommands;
10
+ /** What `image` in `kindgi.config` adds (`image-config.ts`). */
11
+ readonly image: ResolvedImage;
12
+ /** Whether the context has `include/` (files `bundle.include` lists). */
13
+ readonly hasIncludes: boolean;
14
+ }
15
+ /**
16
+ * pnpm's store in the install stage: the cache mount's own folder, set
17
+ * explicitly (`pnpm_config_store_dir` for pnpm 11, `npm_config_store_dir`
18
+ * before it), under ~/.cache, which the stage gives `node`.
19
+ */
20
+ export declare const PNPM_STORE_DIR = "/home/node/.cache/pnpm-store";
21
+ /** Where the pack sits in the image. */
22
+ export declare function imagePackDir(packRel: string): string;
23
+ /** The pack service's command in the image (after tini). */
24
+ export declare const PACK_SERVICE_COMMAND: readonly string[];
25
+ /** Render the Containerfile. Pure; the caller writes it. */
26
+ export declare function renderContainerfile(inputs: RenderContainerfileInputs): string;
27
+ //# sourceMappingURL=containerfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerfile.d.ts","sourceRoot":"","sources":["../../src/build/containerfile.ts"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,SAAS,GAAG,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC;IACrG,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,yEAAyE;IACzE,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,iCAAiC,CAAC;AAE7D,wCAAwC;AACxC,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,4DAA4D;AAC5D,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAUjD,CAAC;AAEF,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,yBAAyB,GAAG,MAAM,CAiH7E"}
@@ -0,0 +1,197 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * The `Containerfile` of a TypeScript pack image, which runs the pack
5
+ * service over the pack's bundles. Stages:
6
+ *
7
+ * system the Node base image, tini, CA certificates, the system
8
+ * packages `image` asks for (corepack on)
9
+ * deps the app's dependencies, with its own package manager from
10
+ * its own lockfile, frozen and scripts off; then the build
11
+ * scripts it allows; then the extensions' steps (`prisma
12
+ * generate`); then pruned to production
13
+ * code the bundles (`dist/`): the pack's, the framework's, the
14
+ * config, the bundle map
15
+ * indexer `index.json`, indexed from the bundles
16
+ * final deps + code + index.json, as the `node` user
17
+ *
18
+ * Image layout: the install root at `/app`, the pack at
19
+ * `/app/<packRel>` (the working directory) with its bundles in `dist/`,
20
+ * and the index at `/app/index.json`.
21
+ *
22
+ * Build context (`kindgi build` writes it):
23
+ * host/ what the install reads (manifests, lockfile, workspace file, patches)
24
+ * ext/ what the extensions' steps read (a Prisma schema), at the install root's paths
25
+ * dist/ the bundles
26
+ * include/ `bundle.include` files, at their pack-relative paths
27
+ * Containerfile
28
+ * Registry config that can hold credentials (`.npmrc`, `.yarnrc*`) is
29
+ * never in the context: the install reads it as a BuildKit secret.
30
+ *
31
+ * ## Reproducibility
32
+ *
33
+ * The build service passes `SOURCE_DATE_EPOCH=0` + `KINDGI_BUILD_TARGET`
34
+ * as build args. `KINDGI_PUBLISHED_AT` and `KINDGI_ARTIFACT_VERSION` are
35
+ * `ARG` defaults here, so the CLI's local index and the image's agree
36
+ * without extending the build-server contract.
37
+ *
38
+ * Attribution: the multi-stage layout follows Trigger.dev's (Apache-2.0)
39
+ * `packages/cli-v3/src/deploy/buildImage.ts`.
40
+ */
41
+ import { binCommand } from '../package-manager.js';
42
+ import { renderAptGetStep } from './apt.js';
43
+ /**
44
+ * pnpm's store in the install stage: the cache mount's own folder, set
45
+ * explicitly (`pnpm_config_store_dir` for pnpm 11, `npm_config_store_dir`
46
+ * before it), under ~/.cache, which the stage gives `node`.
47
+ */
48
+ export const PNPM_STORE_DIR = '/home/node/.cache/pnpm-store';
49
+ /** Where the pack sits in the image. */
50
+ export function imagePackDir(packRel) {
51
+ return packRel === '' ? '/app' : `/app/${packRel}`;
52
+ }
53
+ /** The pack service's command in the image (after tini). */
54
+ export const PACK_SERVICE_COMMAND = [
55
+ 'node',
56
+ '--enable-source-maps',
57
+ './dist/kindgi-pack-service.mjs',
58
+ '--index',
59
+ '/app/index.json',
60
+ '--module-root',
61
+ './dist',
62
+ '--bundle-map',
63
+ './dist/bundle-map.json',
64
+ ];
65
+ /** Render the Containerfile. Pure; the caller writes it. */
66
+ export function renderContainerfile(inputs) {
67
+ const { baseImageRef, artifactVersion, publishedAt, buildTarget, install, commands } = inputs;
68
+ const packDir = imagePackDir(install.packRel);
69
+ const corepack = install.manager !== 'npm';
70
+ const mounts = installMounts(install);
71
+ const run = (command) => mounts.length === 0 ? `RUN ${command}` : `RUN ${mounts.join(' \\\n ')} \\\n ${command}`;
72
+ const entrypoint = JSON.stringify(['/usr/bin/tini', '--', ...PACK_SERVICE_COMMAND]);
73
+ const healthcheck = JSON.stringify([
74
+ 'node',
75
+ '-e',
76
+ "fetch('http://127.0.0.1:'+(process.env.PORT||8080)+'/healthz').then(r=>process.exit(r.ok?0:1),()=>process.exit(1))",
77
+ ]);
78
+ const system = renderAptGetStep(['ca-certificates', 'tini', ...inputs.image.systemPackages].sort());
79
+ const env = Object.entries(inputs.image.buildEnv)
80
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
81
+ .map(([name, value]) => `ENV ${name}=${dockerfileString(value)}`);
82
+ const steps = inputs.image.steps.map((step) => {
83
+ const { command, args } = binCommand(install.manager, step.bin, step.args ?? []);
84
+ return `# ${step.extension}\n${run(`cd ${packDir} && ${[command, ...args].map(shellWord).join(' ')}`)}`;
85
+ });
86
+ return `# syntax=docker/dockerfile:1.7
87
+ # A Kindgi pack image: the pack service over the pack's bundles.
88
+ # Reproducible: SOURCE_DATE_EPOCH=0 and KINDGI_BUILD_TARGET come in as
89
+ # --build-arg from the build service; KINDGI_PUBLISHED_AT and
90
+ # KINDGI_ARTIFACT_VERSION are pinned here, so the CLI and the image
91
+ # agree on index.json.
92
+ #
93
+ # Written by \`kindgi build\` (@kindgi/cli). Don't edit it by hand:
94
+ # change kindgi.config.ts and run \`kindgi build\` again.
95
+
96
+ # --- stage: system ---
97
+ FROM ${baseImageRef} AS system
98
+ ${system}${corepack
99
+ ? `
100
+ RUN corepack enable
101
+ ENV COREPACK_ENABLE_DOWNLOAD_PROMPT=0`
102
+ : ''}
103
+
104
+ # --- stage: deps (${describeManager(install)}, from the lockfile) ---
105
+ FROM system AS deps
106
+ WORKDIR /app
107
+ # The install runs as node, in folders it owns: /app, and its caches
108
+ # (a cache mount would otherwise create ~/.cache as root).
109
+ RUN chown node:node /app && mkdir -p /home/node/.cache && chown node:node /home/node/.cache${install.manager === 'pnpm'
110
+ ? `
111
+ # pnpm's store, where the cache mount is: by default pnpm picks it from
112
+ # ~/.local/share, which a mount's parents (created as root) make it skip.
113
+ ENV pnpm_config_store_dir=${PNPM_STORE_DIR}
114
+ ENV npm_config_store_dir=${PNPM_STORE_DIR}`
115
+ : ''}
116
+ USER node
117
+ COPY --chown=node:node host/ ./${env.length > 0 ? `\n# Build env: the build steps and the indexer stage only, never the final image.\n${env.join('\n')}` : ''}
118
+ ${run(commands.install)}${inputs.image.contextFiles.length > 0 ? '\nCOPY --chown=node:node ext/ ./' : ''}${steps.length > 0 ? `\n${steps.join('\n')}` : ''}
119
+ ${run(commands.prune)}
120
+
121
+ # --- stage: code ---
122
+ FROM scratch AS code
123
+ COPY dist/ /dist/
124
+
125
+ # --- stage: indexer ---
126
+ FROM deps AS indexer
127
+ ARG SOURCE_DATE_EPOCH=0
128
+ ARG KINDGI_BUILD_TARGET=${buildTarget}
129
+ ARG KINDGI_ARTIFACT_VERSION=${artifactVersion}
130
+ ARG KINDGI_PUBLISHED_AT=${publishedAt}
131
+ ENV SOURCE_DATE_EPOCH=\${SOURCE_DATE_EPOCH}
132
+ ENV KINDGI_BUILD_TARGET=\${KINDGI_BUILD_TARGET}
133
+ ENV KINDGI_ARTIFACT_VERSION=\${KINDGI_ARTIFACT_VERSION}
134
+ ENV KINDGI_PUBLISHED_AT=\${KINDGI_PUBLISHED_AT}
135
+ COPY --from=code --chown=node:node /dist ${packDir}/dist
136
+ WORKDIR ${packDir}
137
+ RUN node --enable-source-maps ./dist/kindgi-index.mjs \\
138
+ --pack-dir . \\
139
+ --config ./dist/kindgi.config.mjs \\
140
+ --bundle-map ./dist/bundle-map.json \\
141
+ --module-root ./dist \\
142
+ --artifact-version "\${KINDGI_ARTIFACT_VERSION}" \\
143
+ --published-at "\${KINDGI_PUBLISHED_AT}" \\
144
+ --strict \\
145
+ --output /app/index.json
146
+
147
+ # --- stage: final ---
148
+ FROM system AS final
149
+ ARG KINDGI_ARTIFACT_VERSION=${artifactVersion}
150
+ ARG KINDGI_PUBLISHED_AT=${publishedAt}
151
+ ENV KINDGI_ARTIFACT_VERSION=\${KINDGI_ARTIFACT_VERSION}
152
+ ENV KINDGI_PUBLISHED_AT=\${KINDGI_PUBLISHED_AT}
153
+ ENV NODE_ENV=production
154
+ ENV PORT=8080
155
+ USER node
156
+ WORKDIR ${packDir}
157
+ COPY --from=deps --chown=node:node /app /app
158
+ COPY --from=code --chown=node:node /dist ./dist${inputs.hasIncludes
159
+ ? `
160
+ COPY --chown=node:node include/ ./`
161
+ : ''}
162
+ COPY --from=indexer --chown=node:node /app/index.json /app/index.json
163
+ EXPOSE 8080
164
+ HEALTHCHECK --interval=30s --timeout=3s CMD ${healthcheck}
165
+ # The pack service: serves /app/index.json's tools and checks on $PORT
166
+ # to a server holding KINDGI_PACK_SERVICE_TOKEN.
167
+ ENTRYPOINT ${entrypoint}
168
+ CMD []
169
+ `;
170
+ }
171
+ /** The secret mounts for registry config, and the package manager's download cache. */
172
+ function installMounts(install) {
173
+ const owner = 'uid=1000,gid=1000';
174
+ const mounts = install.secrets.map((s) => `--mount=type=secret,id=${s.id},target=/app/${s.file},${owner},required=false`);
175
+ if (install.manager === 'pnpm') {
176
+ mounts.push(`--mount=type=cache,id=kindgi-pnpm-store,target=${PNPM_STORE_DIR},${owner}`,
177
+ // Package metadata, so a rebuild needn't fetch it all again.
178
+ `--mount=type=cache,id=kindgi-pnpm-cache,target=/home/node/.cache/pnpm,${owner}`);
179
+ }
180
+ else if (install.manager === 'npm') {
181
+ mounts.push(`--mount=type=cache,id=kindgi-npm-cache,target=/home/node/.npm,${owner}`);
182
+ }
183
+ return mounts;
184
+ }
185
+ function describeManager(install) {
186
+ const name = install.manager === 'yarn' ? (install.yarnBerry ? 'yarn berry' : 'yarn classic') : install.manager;
187
+ return install.managerSpec !== undefined ? `${name}: ${install.managerSpec}` : name;
188
+ }
189
+ /** A Dockerfile `ENV` value: double-quoted, with `$` not expanded. */
190
+ function dockerfileString(value) {
191
+ return `"${value.replace(/[\\"$]/g, (c) => `\\${c}`)}"`;
192
+ }
193
+ /** A word for `sh`: as is when it's plain, else single-quoted. */
194
+ function shellWord(word) {
195
+ return /^[A-Za-z0-9@%+=:,./_-]+$/.test(word) ? word : `'${word.replace(/'/g, `'\\''`)}'`;
196
+ }
197
+ //# sourceMappingURL=containerfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"containerfile.js","sourceRoot":"","sources":["../../src/build/containerfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** Why a relative path must never enter the image, or `undefined`. */
2
+ export declare function forbiddenReason(relPath: string): string | undefined;
3
+ export interface BundleConfig {
4
+ /** Extra files for the image, as discovery-style globs relative to the pack root. */
5
+ readonly include: readonly string[];
6
+ }
7
+ /** `bundle` from `kindgi.config.*` — validated; `include` defaults to none. */
8
+ export declare function readBundleConfig(config: Readonly<Record<string, unknown>>): {
9
+ readonly kind: 'ok';
10
+ readonly bundle: BundleConfig;
11
+ } | {
12
+ readonly kind: 'invalid';
13
+ readonly message: string;
14
+ };
15
+ export type IncludeFilesResult = {
16
+ readonly kind: 'ok';
17
+ readonly files: readonly string[];
18
+ } | {
19
+ readonly kind: 'error';
20
+ readonly message: string;
21
+ };
22
+ /** The files `include` (`bundle.include`) matches, relative to `packDir` (`/`-separated, sorted). */
23
+ export declare function collectIncludeFiles(packDir: string, include: readonly string[]): Promise<IncludeFilesResult>;
24
+ //# sourceMappingURL=context-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-files.d.ts","sourceRoot":"","sources":["../../src/build/context-files.ts"],"names":[],"mappings":"AAoCA,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMnE;AAED,MAAM,WAAW,YAAY;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACxC;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAgBjH;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,qGAAqG;AACrG,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,kBAAkB,CAAC,CAY7B"}
@@ -0,0 +1,99 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (C) 2026 Kindgi Inc.
3
+ /**
4
+ * The pack's own files in the image — an explicit allowlist, never
5
+ * "the pack directory minus a few folders". A pack embedded in an app
6
+ * has the app's whole tree (and its `.env`) in its directory; copying
7
+ * that put the app's source and secrets into the image.
8
+ *
9
+ * The image runs the pack's bundles, so its source never ships. Of the
10
+ * pack's files, the image holds exactly what `bundle.include` in
11
+ * `kindgi.config.*` lists: files a tool reads at runtime rather than
12
+ * imports. (The install's files are `host-install.ts`'s; the bundles,
13
+ * the Containerfile and the index are the build's own.)
14
+ *
15
+ * Secret-shaped files are refused even when listed: env files,
16
+ * `.kindgirc.json`, `.npmrc`, `.yarnrc.yml`, private keys, and anything
17
+ * under `.git/`, `.kindgi/` or `node_modules/`. A build that would ship
18
+ * one fails, naming it — never a silently different image.
19
+ */
20
+ import { readdir } from 'node:fs/promises';
21
+ import { join } from 'node:path';
22
+ import { createGlobMatcher, discoveryRoots } from '@kindgi/handler-runtime';
23
+ const SECRET_BASENAMES = [
24
+ /^\.env(\..*)?$/,
25
+ /^\.kindgirc\.json$/,
26
+ /^\.npmrc$/,
27
+ /^\.yarnrc\.yml$/,
28
+ /\.(pem|key|p12|pfx)$/,
29
+ /^id_(rsa|ed25519|ecdsa)(\.pub)?$/,
30
+ ];
31
+ const FORBIDDEN_SEGMENTS = new Set(['.git', '.kindgi', 'node_modules']);
32
+ /** Why a relative path must never enter the image, or `undefined`. */
33
+ export function forbiddenReason(relPath) {
34
+ const segments = relPath.split('/');
35
+ const segment = segments.find((s) => FORBIDDEN_SEGMENTS.has(s));
36
+ if (segment !== undefined)
37
+ return `inside ${segment}/`;
38
+ const base = segments[segments.length - 1] ?? '';
39
+ return SECRET_BASENAMES.some((r) => r.test(base)) ? 'secret-shaped file' : undefined;
40
+ }
41
+ /** `bundle` from `kindgi.config.*` — validated; `include` defaults to none. */
42
+ export function readBundleConfig(config) {
43
+ const bundle = config.bundle;
44
+ if (bundle === undefined)
45
+ return { kind: 'ok', bundle: { include: [] } };
46
+ const include = bundle?.include;
47
+ if (typeof bundle !== 'object' ||
48
+ bundle === null ||
49
+ (include !== undefined &&
50
+ (!Array.isArray(include) || !include.every((g) => typeof g === 'string' && g !== '')))) {
51
+ return {
52
+ kind: 'invalid',
53
+ message: '`bundle.include` in kindgi.config.ts must be a list of file globs relative to the pack root.',
54
+ };
55
+ }
56
+ return { kind: 'ok', bundle: { include: include ?? [] } };
57
+ }
58
+ /** The files `include` (`bundle.include`) matches, relative to `packDir` (`/`-separated, sorted). */
59
+ export async function collectIncludeFiles(packDir, include) {
60
+ const files = await globFiles(packDir, include);
61
+ const refused = files
62
+ .map((rel) => ({ rel, reason: forbiddenReason(rel) }))
63
+ .filter((f) => f.reason !== undefined);
64
+ if (refused.length > 0) {
65
+ return {
66
+ kind: 'error',
67
+ message: `Refusing to put these files in the image: ${refused.map((f) => `${f.rel} (${f.reason})`).join(', ')}. Remove the \`bundle.include\` entry.`,
68
+ };
69
+ }
70
+ return { kind: 'ok', files: files.sort() };
71
+ }
72
+ async function globFiles(packDir, patterns) {
73
+ if (patterns.length === 0)
74
+ return [];
75
+ const matches = createGlobMatcher(patterns);
76
+ const out = [];
77
+ for (const root of discoveryRoots(patterns))
78
+ await walk(packDir, root, matches, out);
79
+ return out;
80
+ }
81
+ async function walk(packDir, rel, matches, out) {
82
+ let entries;
83
+ try {
84
+ entries = await readdir(rel === '' ? packDir : join(packDir, rel), { withFileTypes: true });
85
+ }
86
+ catch {
87
+ return;
88
+ }
89
+ for (const entry of entries) {
90
+ if (FORBIDDEN_SEGMENTS.has(entry.name))
91
+ continue;
92
+ const child = rel === '' ? entry.name : `${rel}/${entry.name}`;
93
+ if (entry.isDirectory())
94
+ await walk(packDir, child, matches, out);
95
+ else if (entry.isFile() && matches(child))
96
+ out.push(child);
97
+ }
98
+ }
99
+ //# sourceMappingURL=context-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-files.js","sourceRoot":"","sources":["../../src/build/context-files.ts"],"names":[],"mappings":"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"}