@cicore/cli 1.0.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 (337) hide show
  1. package/bin/ci.js +13 -0
  2. package/dist/commands/addon/api-actions.d.ts +45 -0
  3. package/dist/commands/addon/api-actions.d.ts.map +1 -0
  4. package/dist/commands/addon/api-actions.js +281 -0
  5. package/dist/commands/addon/api-actions.js.map +1 -0
  6. package/dist/commands/addon/build.d.ts +11 -0
  7. package/dist/commands/addon/build.d.ts.map +1 -0
  8. package/dist/commands/addon/build.js +182 -0
  9. package/dist/commands/addon/build.js.map +1 -0
  10. package/dist/commands/addon/create.d.ts +11 -0
  11. package/dist/commands/addon/create.d.ts.map +1 -0
  12. package/dist/commands/addon/create.js +1186 -0
  13. package/dist/commands/addon/create.js.map +1 -0
  14. package/dist/commands/addon/delete.d.ts +13 -0
  15. package/dist/commands/addon/delete.d.ts.map +1 -0
  16. package/dist/commands/addon/delete.js +83 -0
  17. package/dist/commands/addon/delete.js.map +1 -0
  18. package/dist/commands/addon/deploy.d.ts +27 -0
  19. package/dist/commands/addon/deploy.d.ts.map +1 -0
  20. package/dist/commands/addon/deploy.js +459 -0
  21. package/dist/commands/addon/deploy.js.map +1 -0
  22. package/dist/commands/addon/dev-deploy.d.ts +31 -0
  23. package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
  24. package/dist/commands/addon/dev-deploy.js +128 -0
  25. package/dist/commands/addon/dev-deploy.js.map +1 -0
  26. package/dist/commands/addon/dev.d.ts +36 -0
  27. package/dist/commands/addon/dev.d.ts.map +1 -0
  28. package/dist/commands/addon/dev.js +323 -0
  29. package/dist/commands/addon/dev.js.map +1 -0
  30. package/dist/commands/addon/extract-classes.d.ts +23 -0
  31. package/dist/commands/addon/extract-classes.d.ts.map +1 -0
  32. package/dist/commands/addon/extract-classes.js +281 -0
  33. package/dist/commands/addon/extract-classes.js.map +1 -0
  34. package/dist/commands/addon/generate-safelist.d.ts +24 -0
  35. package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
  36. package/dist/commands/addon/generate-safelist.js +276 -0
  37. package/dist/commands/addon/generate-safelist.js.map +1 -0
  38. package/dist/commands/addon/index.d.ts +19 -0
  39. package/dist/commands/addon/index.d.ts.map +1 -0
  40. package/dist/commands/addon/index.js +296 -0
  41. package/dist/commands/addon/index.js.map +1 -0
  42. package/dist/commands/addon/init-repo.d.ts +25 -0
  43. package/dist/commands/addon/init-repo.d.ts.map +1 -0
  44. package/dist/commands/addon/init-repo.js +171 -0
  45. package/dist/commands/addon/init-repo.js.map +1 -0
  46. package/dist/commands/addon/install.d.ts +23 -0
  47. package/dist/commands/addon/install.d.ts.map +1 -0
  48. package/dist/commands/addon/install.js +84 -0
  49. package/dist/commands/addon/install.js.map +1 -0
  50. package/dist/commands/addon/list.d.ts +10 -0
  51. package/dist/commands/addon/list.d.ts.map +1 -0
  52. package/dist/commands/addon/list.js +102 -0
  53. package/dist/commands/addon/list.js.map +1 -0
  54. package/dist/commands/addon/manifest-refresh.d.ts +17 -0
  55. package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
  56. package/dist/commands/addon/manifest-refresh.js +48 -0
  57. package/dist/commands/addon/manifest-refresh.js.map +1 -0
  58. package/dist/commands/addon/migrate.d.ts +40 -0
  59. package/dist/commands/addon/migrate.d.ts.map +1 -0
  60. package/dist/commands/addon/migrate.js +236 -0
  61. package/dist/commands/addon/migrate.js.map +1 -0
  62. package/dist/commands/addon/publish.d.ts +33 -0
  63. package/dist/commands/addon/publish.d.ts.map +1 -0
  64. package/dist/commands/addon/publish.js +236 -0
  65. package/dist/commands/addon/publish.js.map +1 -0
  66. package/dist/commands/addon/scaffold-quality.d.ts +21 -0
  67. package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
  68. package/dist/commands/addon/scaffold-quality.js +90 -0
  69. package/dist/commands/addon/scaffold-quality.js.map +1 -0
  70. package/dist/commands/addon/sign.d.ts +9 -0
  71. package/dist/commands/addon/sign.d.ts.map +1 -0
  72. package/dist/commands/addon/sign.js +83 -0
  73. package/dist/commands/addon/sign.js.map +1 -0
  74. package/dist/commands/addon/toggle.d.ts +6 -0
  75. package/dist/commands/addon/toggle.d.ts.map +1 -0
  76. package/dist/commands/addon/toggle.js +46 -0
  77. package/dist/commands/addon/toggle.js.map +1 -0
  78. package/dist/commands/agent/index.d.ts +34 -0
  79. package/dist/commands/agent/index.d.ts.map +1 -0
  80. package/dist/commands/agent/index.js +564 -0
  81. package/dist/commands/agent/index.js.map +1 -0
  82. package/dist/commands/brand/index.d.ts +54 -0
  83. package/dist/commands/brand/index.d.ts.map +1 -0
  84. package/dist/commands/brand/index.js +367 -0
  85. package/dist/commands/brand/index.js.map +1 -0
  86. package/dist/commands/build/index.d.ts +53 -0
  87. package/dist/commands/build/index.d.ts.map +1 -0
  88. package/dist/commands/build/index.js +726 -0
  89. package/dist/commands/build/index.js.map +1 -0
  90. package/dist/commands/cache/flush-local.d.ts +31 -0
  91. package/dist/commands/cache/flush-local.d.ts.map +1 -0
  92. package/dist/commands/cache/flush-local.js +161 -0
  93. package/dist/commands/cache/flush-local.js.map +1 -0
  94. package/dist/commands/cache/index.d.ts +14 -0
  95. package/dist/commands/cache/index.d.ts.map +1 -0
  96. package/dist/commands/cache/index.js +453 -0
  97. package/dist/commands/cache/index.js.map +1 -0
  98. package/dist/commands/check/index.d.ts +8 -0
  99. package/dist/commands/check/index.d.ts.map +1 -0
  100. package/dist/commands/check/index.js +1316 -0
  101. package/dist/commands/check/index.js.map +1 -0
  102. package/dist/commands/cloudflare/index.d.ts +8 -0
  103. package/dist/commands/cloudflare/index.d.ts.map +1 -0
  104. package/dist/commands/cloudflare/index.js +453 -0
  105. package/dist/commands/cloudflare/index.js.map +1 -0
  106. package/dist/commands/core/create.d.ts +12 -0
  107. package/dist/commands/core/create.d.ts.map +1 -0
  108. package/dist/commands/core/create.js +206 -0
  109. package/dist/commands/core/create.js.map +1 -0
  110. package/dist/commands/core/delete.d.ts +11 -0
  111. package/dist/commands/core/delete.d.ts.map +1 -0
  112. package/dist/commands/core/delete.js +64 -0
  113. package/dist/commands/core/delete.js.map +1 -0
  114. package/dist/commands/core/env.d.ts +12 -0
  115. package/dist/commands/core/env.d.ts.map +1 -0
  116. package/dist/commands/core/env.js +95 -0
  117. package/dist/commands/core/env.js.map +1 -0
  118. package/dist/commands/core/health.d.ts +6 -0
  119. package/dist/commands/core/health.d.ts.map +1 -0
  120. package/dist/commands/core/health.js +215 -0
  121. package/dist/commands/core/health.js.map +1 -0
  122. package/dist/commands/core/index.d.ts +15 -0
  123. package/dist/commands/core/index.d.ts.map +1 -0
  124. package/dist/commands/core/index.js +86 -0
  125. package/dist/commands/core/index.js.map +1 -0
  126. package/dist/commands/core/list.d.ts +11 -0
  127. package/dist/commands/core/list.d.ts.map +1 -0
  128. package/dist/commands/core/list.js +58 -0
  129. package/dist/commands/core/list.js.map +1 -0
  130. package/dist/commands/core/rebuild.d.ts +13 -0
  131. package/dist/commands/core/rebuild.d.ts.map +1 -0
  132. package/dist/commands/core/rebuild.js +119 -0
  133. package/dist/commands/core/rebuild.js.map +1 -0
  134. package/dist/commands/db/index.d.ts +23 -0
  135. package/dist/commands/db/index.d.ts.map +1 -0
  136. package/dist/commands/db/index.js +355 -0
  137. package/dist/commands/db/index.js.map +1 -0
  138. package/dist/commands/db/promote-silo.d.ts +320 -0
  139. package/dist/commands/db/promote-silo.d.ts.map +1 -0
  140. package/dist/commands/db/promote-silo.js +930 -0
  141. package/dist/commands/db/promote-silo.js.map +1 -0
  142. package/dist/commands/db/relocate.d.ts +41 -0
  143. package/dist/commands/db/relocate.d.ts.map +1 -0
  144. package/dist/commands/db/relocate.js +482 -0
  145. package/dist/commands/db/relocate.js.map +1 -0
  146. package/dist/commands/db/rollback-silo.d.ts +44 -0
  147. package/dist/commands/db/rollback-silo.d.ts.map +1 -0
  148. package/dist/commands/db/rollback-silo.js +402 -0
  149. package/dist/commands/db/rollback-silo.js.map +1 -0
  150. package/dist/commands/deploy/index.d.ts +26 -0
  151. package/dist/commands/deploy/index.d.ts.map +1 -0
  152. package/dist/commands/deploy/index.js +107 -0
  153. package/dist/commands/deploy/index.js.map +1 -0
  154. package/dist/commands/devops/index.d.ts +6 -0
  155. package/dist/commands/devops/index.d.ts.map +1 -0
  156. package/dist/commands/devops/index.js +220 -0
  157. package/dist/commands/devops/index.js.map +1 -0
  158. package/dist/commands/domain/index.d.ts +8 -0
  159. package/dist/commands/domain/index.d.ts.map +1 -0
  160. package/dist/commands/domain/index.js +386 -0
  161. package/dist/commands/domain/index.js.map +1 -0
  162. package/dist/commands/image/index.d.ts +8 -0
  163. package/dist/commands/image/index.d.ts.map +1 -0
  164. package/dist/commands/image/index.js +308 -0
  165. package/dist/commands/image/index.js.map +1 -0
  166. package/dist/commands/install/factory-reset.d.ts +21 -0
  167. package/dist/commands/install/factory-reset.d.ts.map +1 -0
  168. package/dist/commands/install/factory-reset.js +83 -0
  169. package/dist/commands/install/factory-reset.js.map +1 -0
  170. package/dist/commands/install/index.d.ts +17 -0
  171. package/dist/commands/install/index.d.ts.map +1 -0
  172. package/dist/commands/install/index.js +44 -0
  173. package/dist/commands/install/index.js.map +1 -0
  174. package/dist/commands/install/install.d.ts +35 -0
  175. package/dist/commands/install/install.d.ts.map +1 -0
  176. package/dist/commands/install/install.js +171 -0
  177. package/dist/commands/install/install.js.map +1 -0
  178. package/dist/commands/login/index.d.ts +15 -0
  179. package/dist/commands/login/index.d.ts.map +1 -0
  180. package/dist/commands/login/index.js +58 -0
  181. package/dist/commands/login/index.js.map +1 -0
  182. package/dist/commands/nginx/index.d.ts +11 -0
  183. package/dist/commands/nginx/index.d.ts.map +1 -0
  184. package/dist/commands/nginx/index.js +580 -0
  185. package/dist/commands/nginx/index.js.map +1 -0
  186. package/dist/commands/server/bootstrap.d.ts +25 -0
  187. package/dist/commands/server/bootstrap.d.ts.map +1 -0
  188. package/dist/commands/server/bootstrap.js +260 -0
  189. package/dist/commands/server/bootstrap.js.map +1 -0
  190. package/dist/commands/server/index.d.ts +8 -0
  191. package/dist/commands/server/index.d.ts.map +1 -0
  192. package/dist/commands/server/index.js +2524 -0
  193. package/dist/commands/server/index.js.map +1 -0
  194. package/dist/commands/setup/index.d.ts +34 -0
  195. package/dist/commands/setup/index.d.ts.map +1 -0
  196. package/dist/commands/setup/index.js +423 -0
  197. package/dist/commands/setup/index.js.map +1 -0
  198. package/dist/commands/ssl/index.d.ts +8 -0
  199. package/dist/commands/ssl/index.d.ts.map +1 -0
  200. package/dist/commands/ssl/index.js +275 -0
  201. package/dist/commands/ssl/index.js.map +1 -0
  202. package/dist/commands/superadmin/index.d.ts +16 -0
  203. package/dist/commands/superadmin/index.d.ts.map +1 -0
  204. package/dist/commands/superadmin/index.js +81 -0
  205. package/dist/commands/superadmin/index.js.map +1 -0
  206. package/dist/commands/tenant/index.d.ts +6 -0
  207. package/dist/commands/tenant/index.d.ts.map +1 -0
  208. package/dist/commands/tenant/index.js +192 -0
  209. package/dist/commands/tenant/index.js.map +1 -0
  210. package/dist/index.d.ts +11 -0
  211. package/dist/index.d.ts.map +1 -0
  212. package/dist/index.js +107 -0
  213. package/dist/index.js.map +1 -0
  214. package/dist/lib/addon-sign.d.ts +23 -0
  215. package/dist/lib/addon-sign.d.ts.map +1 -0
  216. package/dist/lib/addon-sign.js +39 -0
  217. package/dist/lib/addon-sign.js.map +1 -0
  218. package/dist/lib/addon-sign.test.d.ts +2 -0
  219. package/dist/lib/addon-sign.test.d.ts.map +1 -0
  220. package/dist/lib/addon-sign.test.js +27 -0
  221. package/dist/lib/addon-sign.test.js.map +1 -0
  222. package/dist/lib/cdn.d.ts +25 -0
  223. package/dist/lib/cdn.d.ts.map +1 -0
  224. package/dist/lib/cdn.js +131 -0
  225. package/dist/lib/cdn.js.map +1 -0
  226. package/dist/lib/cloudflare.d.ts +133 -0
  227. package/dist/lib/cloudflare.d.ts.map +1 -0
  228. package/dist/lib/cloudflare.js +435 -0
  229. package/dist/lib/cloudflare.js.map +1 -0
  230. package/dist/lib/config.d.ts +96 -0
  231. package/dist/lib/config.d.ts.map +1 -0
  232. package/dist/lib/config.js +132 -0
  233. package/dist/lib/config.js.map +1 -0
  234. package/dist/lib/env.d.ts +8 -0
  235. package/dist/lib/env.d.ts.map +1 -0
  236. package/dist/lib/env.js +64 -0
  237. package/dist/lib/env.js.map +1 -0
  238. package/dist/lib/hosts.d.ts +194 -0
  239. package/dist/lib/hosts.d.ts.map +1 -0
  240. package/dist/lib/hosts.js +183 -0
  241. package/dist/lib/hosts.js.map +1 -0
  242. package/dist/lib/logger.d.ts +68 -0
  243. package/dist/lib/logger.d.ts.map +1 -0
  244. package/dist/lib/logger.js +130 -0
  245. package/dist/lib/logger.js.map +1 -0
  246. package/dist/lib/nginx-config.d.ts +78 -0
  247. package/dist/lib/nginx-config.d.ts.map +1 -0
  248. package/dist/lib/nginx-config.js +736 -0
  249. package/dist/lib/nginx-config.js.map +1 -0
  250. package/dist/lib/ops/addon-dev.d.ts +93 -0
  251. package/dist/lib/ops/addon-dev.d.ts.map +1 -0
  252. package/dist/lib/ops/addon-dev.js +237 -0
  253. package/dist/lib/ops/addon-dev.js.map +1 -0
  254. package/dist/lib/ops/addon-quality.d.ts +38 -0
  255. package/dist/lib/ops/addon-quality.d.ts.map +1 -0
  256. package/dist/lib/ops/addon-quality.js +338 -0
  257. package/dist/lib/ops/addon-quality.js.map +1 -0
  258. package/dist/lib/ops/addon-routes.d.ts +49 -0
  259. package/dist/lib/ops/addon-routes.d.ts.map +1 -0
  260. package/dist/lib/ops/addon-routes.js +189 -0
  261. package/dist/lib/ops/addon-routes.js.map +1 -0
  262. package/dist/lib/ops/addon.d.ts +120 -0
  263. package/dist/lib/ops/addon.d.ts.map +1 -0
  264. package/dist/lib/ops/addon.js +260 -0
  265. package/dist/lib/ops/addon.js.map +1 -0
  266. package/dist/lib/ops/cdn.d.ts +87 -0
  267. package/dist/lib/ops/cdn.d.ts.map +1 -0
  268. package/dist/lib/ops/cdn.js +170 -0
  269. package/dist/lib/ops/cdn.js.map +1 -0
  270. package/dist/lib/ops/cf.d.ts +36 -0
  271. package/dist/lib/ops/cf.d.ts.map +1 -0
  272. package/dist/lib/ops/cf.js +114 -0
  273. package/dist/lib/ops/cf.js.map +1 -0
  274. package/dist/lib/ops/compose.d.ts +95 -0
  275. package/dist/lib/ops/compose.d.ts.map +1 -0
  276. package/dist/lib/ops/compose.js +165 -0
  277. package/dist/lib/ops/compose.js.map +1 -0
  278. package/dist/lib/ops/core.d.ts +117 -0
  279. package/dist/lib/ops/core.d.ts.map +1 -0
  280. package/dist/lib/ops/core.js +322 -0
  281. package/dist/lib/ops/core.js.map +1 -0
  282. package/dist/lib/ops/db.d.ts +116 -0
  283. package/dist/lib/ops/db.d.ts.map +1 -0
  284. package/dist/lib/ops/db.js +351 -0
  285. package/dist/lib/ops/db.js.map +1 -0
  286. package/dist/lib/ops/dns.d.ts +111 -0
  287. package/dist/lib/ops/dns.d.ts.map +1 -0
  288. package/dist/lib/ops/dns.js +306 -0
  289. package/dist/lib/ops/dns.js.map +1 -0
  290. package/dist/lib/ops/image.d.ts +94 -0
  291. package/dist/lib/ops/image.d.ts.map +1 -0
  292. package/dist/lib/ops/image.js +159 -0
  293. package/dist/lib/ops/image.js.map +1 -0
  294. package/dist/lib/ops/nginx.d.ts +114 -0
  295. package/dist/lib/ops/nginx.d.ts.map +1 -0
  296. package/dist/lib/ops/nginx.js +388 -0
  297. package/dist/lib/ops/nginx.js.map +1 -0
  298. package/dist/lib/ops/redis.d.ts +7 -0
  299. package/dist/lib/ops/redis.d.ts.map +1 -0
  300. package/dist/lib/ops/redis.js +35 -0
  301. package/dist/lib/ops/redis.js.map +1 -0
  302. package/dist/lib/ops/ssh.d.ts +127 -0
  303. package/dist/lib/ops/ssh.d.ts.map +1 -0
  304. package/dist/lib/ops/ssh.js +269 -0
  305. package/dist/lib/ops/ssh.js.map +1 -0
  306. package/dist/lib/prompts.d.ts +46 -0
  307. package/dist/lib/prompts.d.ts.map +1 -0
  308. package/dist/lib/prompts.js +113 -0
  309. package/dist/lib/prompts.js.map +1 -0
  310. package/dist/lib/sast.d.ts +43 -0
  311. package/dist/lib/sast.d.ts.map +1 -0
  312. package/dist/lib/sast.js +79 -0
  313. package/dist/lib/sast.js.map +1 -0
  314. package/dist/lib/sast.test.d.ts +2 -0
  315. package/dist/lib/sast.test.d.ts.map +1 -0
  316. package/dist/lib/sast.test.js +33 -0
  317. package/dist/lib/sast.test.js.map +1 -0
  318. package/dist/lib/shell.d.ts +61 -0
  319. package/dist/lib/shell.d.ts.map +1 -0
  320. package/dist/lib/shell.js +183 -0
  321. package/dist/lib/shell.js.map +1 -0
  322. package/dist/lib/ssh-config.d.ts +37 -0
  323. package/dist/lib/ssh-config.d.ts.map +1 -0
  324. package/dist/lib/ssh-config.js +122 -0
  325. package/dist/lib/ssh-config.js.map +1 -0
  326. package/dist/lib/tenant-scope.d.ts +38 -0
  327. package/dist/lib/tenant-scope.d.ts.map +1 -0
  328. package/dist/lib/tenant-scope.js +129 -0
  329. package/dist/lib/tenant-scope.js.map +1 -0
  330. package/dist/lib/tenant-scope.test.d.ts +2 -0
  331. package/dist/lib/tenant-scope.test.d.ts.map +1 -0
  332. package/dist/lib/tenant-scope.test.js +223 -0
  333. package/dist/lib/tenant-scope.test.js.map +1 -0
  334. package/package.json +58 -0
  335. package/templates/bootstrap/.env.template +54 -0
  336. package/templates/bootstrap/docker-compose.yml +145 -0
  337. package/templates/vhost.conf.tmpl +446 -0
@@ -0,0 +1,127 @@
1
+ /**
2
+ * CiCore CLI — SSH/SCP primitives
3
+ *
4
+ * Host-aware command execution. Every function takes a {@link HostConfig}
5
+ * and uses its `sshAlias`, `sshKeyPath`, and optional `deployUser` to build
6
+ * the SSH target — no global SSH state, no environment-based dispatch.
7
+ *
8
+ * All commands run through execa with `reject: false` so callers can branch
9
+ * on the typed `ExecResult` instead of catching exceptions. Streaming is
10
+ * supported for interactive long-running commands (deploys, compose up).
11
+ *
12
+ * Dry-run is honored: when `--dry-run` is set on the CLI, every primitive
13
+ * logs what it would do and returns a success result without touching the
14
+ * remote host.
15
+ */
16
+ import type { HostConfig } from '../hosts.js';
17
+ export interface ExecResult {
18
+ readonly stdout: string;
19
+ readonly stderr: string;
20
+ readonly exitCode: number;
21
+ readonly success: boolean;
22
+ }
23
+ export interface RunOptions {
24
+ /** Suppress the `▸ <cmd>` log line before execution. Result still returns. */
25
+ readonly silent?: boolean;
26
+ /**
27
+ * Stream stdout/stderr to the terminal in real time (inherits parent FDs).
28
+ * Resulting `stdout`/`stderr` strings will be empty — the output went to
29
+ * the screen instead of being captured. Use for long-running deploys.
30
+ */
31
+ readonly stream?: boolean;
32
+ /** Working directory for local commands. Ignored for remote. */
33
+ readonly cwd?: string;
34
+ /**
35
+ * stdin payload piped to the command. Useful for `bash -s` heredoc-style
36
+ * remote scripts: pass the script body as `input`, pass `bash -s` as the
37
+ * command. Avoids shell-quoting hazards in heredoc embedding.
38
+ */
39
+ readonly input?: string;
40
+ /**
41
+ * Environment variables overlaid on the inherited environment for the
42
+ * local command only — remote commands need to receive env via `VAR=val`
43
+ * prefix or `export` in the script body.
44
+ */
45
+ readonly env?: Readonly<Record<string, string>>;
46
+ }
47
+ export interface RemoteOptions extends RunOptions {
48
+ /**
49
+ * Connect as `cfg.deployUser` (the forced-command receiver) instead of
50
+ * `cfg.sshUser`. Only valid for hosts that have a deployUser configured —
51
+ * other hosts ignore this flag and fall back to sshUser. Use for addon /
52
+ * core install scripts that go through the wrapper.
53
+ */
54
+ readonly asDeployUser?: boolean;
55
+ /**
56
+ * Execute even when global dry-run is on. For salt-okunur (SELECT) komutlar:
57
+ * bir dry-run *planı* gerçek veriyi okuyabilmeli (validate/inventory/discovery).
58
+ * Yazı yollarında ASLA set edilmez — sadece dbSelectJson gibi read-only
59
+ * helper'lar geçer. Bkz docs/planning/2026-06-02-cli-dryrun-selfloop-fix.md (Part A).
60
+ */
61
+ readonly allowInDryRun?: boolean;
62
+ }
63
+ /**
64
+ * Run a command on the local machine.
65
+ *
66
+ * Arguments go through execa's argv-array path — no shell, no implicit
67
+ * expansion, no injection risk. If you need shell features (pipes, glob),
68
+ * invoke `bash -c "<script>"` explicitly with the script in `args`.
69
+ */
70
+ export declare function runLocal(command: string, args?: readonly string[], opts?: RunOptions): Promise<ExecResult>;
71
+ /**
72
+ * Run a single shell command on the host described by `cfg` via SSH.
73
+ *
74
+ * Connection target is built from `cfg.deployUser ?? <sshAlias's User>` and
75
+ * `cfg.sshAlias`. The identity file (`cfg.sshKeyPath`) is passed explicitly
76
+ * with `-i`, so even if `~/.ssh/config` selects a different key for the
77
+ * alias, we use the configured one. ConnectTimeout caps stalled connects
78
+ * at 10 seconds.
79
+ *
80
+ * `command` is sent as a single argument to the remote shell. Quote-aware
81
+ * callers should use {@link runRemoteScript} for multi-line scripts.
82
+ */
83
+ export declare function runRemote(cfg: HostConfig, command: string, opts?: RemoteOptions): Promise<ExecResult>;
84
+ /**
85
+ * Run a multi-line shell script on the remote host by piping it to `bash -s`.
86
+ *
87
+ * Avoids the quoting hazards of embedding scripts in a single `ssh "<script>"`
88
+ * argument: the script body goes through stdin, so quotes and `$` inside it
89
+ * mean what they look like.
90
+ *
91
+ * `env` is exported into the remote shell before the script runs. Keys are
92
+ * validated as `[A-Z_][A-Z0-9_]*` to prevent injection through env-name; values
93
+ * are single-quote-escaped.
94
+ */
95
+ export declare function runRemoteScript(cfg: HostConfig, script: string, opts?: RemoteOptions & {
96
+ readonly env?: Readonly<Record<string, string>>;
97
+ }): Promise<ExecResult>;
98
+ /**
99
+ * Copy a local file or directory to the remote host via SCP.
100
+ *
101
+ * Uses `-O` (legacy SCP protocol) which is required by ssh-wrapper.sh
102
+ * forced-command pattern — the newer SFTP protocol skips the command guard.
103
+ * Recursive flag enables directory copy.
104
+ *
105
+ * `remotePath` is interpreted relative to the deploy user's home unless
106
+ * absolute. Callers should pass absolute paths to avoid surprises.
107
+ */
108
+ export declare function uploadFile(cfg: HostConfig, localPath: string, remotePath: string, opts?: {
109
+ readonly recursive?: boolean;
110
+ readonly silent?: boolean;
111
+ readonly asDeployUser?: boolean;
112
+ }): Promise<ExecResult>;
113
+ /**
114
+ * Quick connectivity probe — runs `true` on the remote and reports success.
115
+ * Useful as a preflight step before a long deploy. Forced-command hosts
116
+ * (cicore-deploy@) reject arbitrary commands, so use {@link sshReachable}
117
+ * instead when targeting such hosts.
118
+ */
119
+ export declare function sshAlive(cfg: HostConfig): Promise<boolean>;
120
+ /**
121
+ * TCP-level reachability check for hosts whose SSH refuses arbitrary cmds.
122
+ * Returns true if `ssh -o BatchMode=yes -o ConnectTimeout=5 <target> exit`
123
+ * exits cleanly (auth + connection established, command rejected is fine).
124
+ * Probes the deploy-user path because that's where the wrapper sits.
125
+ */
126
+ export declare function sshReachable(cfg: HostConfig): Promise<boolean>;
127
+ //# sourceMappingURL=ssh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.d.ts","sourceRoot":"","sources":["../../../src/lib/ops/ssh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAQ7C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAC1B;AAaD,MAAM,WAAW,UAAU;IACzB,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,gEAAgE;IAChE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAChD;AAED,MAAM,WAAW,aAAc,SAAQ,UAAU;IAC/C;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;IAE/B;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CACjC;AAMD;;;;;;GAMG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,EAC5B,IAAI,GAAE,UAAe,GACpB,OAAO,CAAC,UAAU,CAAC,CAerB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,aAAkB,GACvB,OAAO,CAAC,UAAU,CAAC,CAgBrB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAO,GAC7E,OAAO,CAAC,UAAU,CAAC,CAmBrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAA;CAAO,GACtG,OAAO,CAAC,UAAU,CAAC,CAkBrB;AAED;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAKhE;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAQpE"}
@@ -0,0 +1,269 @@
1
+ /**
2
+ * CiCore CLI — SSH/SCP primitives
3
+ *
4
+ * Host-aware command execution. Every function takes a {@link HostConfig}
5
+ * and uses its `sshAlias`, `sshKeyPath`, and optional `deployUser` to build
6
+ * the SSH target — no global SSH state, no environment-based dispatch.
7
+ *
8
+ * All commands run through execa with `reject: false` so callers can branch
9
+ * on the typed `ExecResult` instead of catching exceptions. Streaming is
10
+ * supported for interactive long-running commands (deploys, compose up).
11
+ *
12
+ * Dry-run is honored: when `--dry-run` is set on the CLI, every primitive
13
+ * logs what it would do and returns a success result without touching the
14
+ * remote host.
15
+ */
16
+ import { execa } from 'execa';
17
+ import { homedir } from 'node:os';
18
+ import { resolve as resolvePath } from 'node:path';
19
+ import { isDryRun, isVerbose } from '../config.js';
20
+ import { log } from '../logger.js';
21
+ const DRY_RUN_OK = Object.freeze({
22
+ stdout: '',
23
+ stderr: '',
24
+ exitCode: 0,
25
+ success: true,
26
+ });
27
+ // ─────────────────────────────────────────────────────────────────────────
28
+ // Local execution
29
+ // ─────────────────────────────────────────────────────────────────────────
30
+ /**
31
+ * Run a command on the local machine.
32
+ *
33
+ * Arguments go through execa's argv-array path — no shell, no implicit
34
+ * expansion, no injection risk. If you need shell features (pipes, glob),
35
+ * invoke `bash -c "<script>"` explicitly with the script in `args`.
36
+ */
37
+ export async function runLocal(command, args = [], opts = {}) {
38
+ if (!opts.silent && !opts.stream) {
39
+ log.cmd(`${command} ${args.join(' ')}`);
40
+ }
41
+ if (isDryRun()) {
42
+ log.debug('[dry-run] local:', command, args.join(' '));
43
+ return DRY_RUN_OK;
44
+ }
45
+ return invokeExeca(command, args, {
46
+ cwd: opts.cwd,
47
+ input: opts.input,
48
+ env: opts.env,
49
+ streamOutput: opts.stream === true,
50
+ });
51
+ }
52
+ // ─────────────────────────────────────────────────────────────────────────
53
+ // Remote execution (SSH)
54
+ // ─────────────────────────────────────────────────────────────────────────
55
+ /**
56
+ * Run a single shell command on the host described by `cfg` via SSH.
57
+ *
58
+ * Connection target is built from `cfg.deployUser ?? <sshAlias's User>` and
59
+ * `cfg.sshAlias`. The identity file (`cfg.sshKeyPath`) is passed explicitly
60
+ * with `-i`, so even if `~/.ssh/config` selects a different key for the
61
+ * alias, we use the configured one. ConnectTimeout caps stalled connects
62
+ * at 10 seconds.
63
+ *
64
+ * `command` is sent as a single argument to the remote shell. Quote-aware
65
+ * callers should use {@link runRemoteScript} for multi-line scripts.
66
+ */
67
+ export async function runRemote(cfg, command, opts = {}) {
68
+ const target = sshTarget(cfg, opts.asDeployUser === true);
69
+ const sshArgs = buildSshArgs(cfg, target, [command]);
70
+ if (!opts.silent && !opts.stream) {
71
+ log.cmd(`ssh ${target} "${command}"`);
72
+ }
73
+ if (isDryRun() && opts.allowInDryRun !== true) {
74
+ log.debug('[dry-run] remote:', target, command);
75
+ return DRY_RUN_OK;
76
+ }
77
+ return invokeExeca('ssh', sshArgs, {
78
+ input: opts.input,
79
+ streamOutput: opts.stream === true,
80
+ });
81
+ }
82
+ /**
83
+ * Run a multi-line shell script on the remote host by piping it to `bash -s`.
84
+ *
85
+ * Avoids the quoting hazards of embedding scripts in a single `ssh "<script>"`
86
+ * argument: the script body goes through stdin, so quotes and `$` inside it
87
+ * mean what they look like.
88
+ *
89
+ * `env` is exported into the remote shell before the script runs. Keys are
90
+ * validated as `[A-Z_][A-Z0-9_]*` to prevent injection through env-name; values
91
+ * are single-quote-escaped.
92
+ */
93
+ export async function runRemoteScript(cfg, script, opts = {}) {
94
+ const envPrefix = renderEnvExports(opts.env);
95
+ const body = envPrefix + script;
96
+ const target = sshTarget(cfg, opts.asDeployUser === true);
97
+ if (!opts.silent && !opts.stream) {
98
+ const preview = script.split('\n').slice(0, 3).join(' / ');
99
+ log.cmd(`ssh ${target} bash -s # ${preview.slice(0, 80)}${preview.length > 80 ? '…' : ''}`);
100
+ }
101
+ if (isDryRun() && opts.allowInDryRun !== true) {
102
+ log.debug('[dry-run] remote script (', script.length, 'chars) on', target);
103
+ return DRY_RUN_OK;
104
+ }
105
+ const sshArgs = buildSshArgs(cfg, target, ['bash', '-s']);
106
+ return invokeExeca('ssh', sshArgs, {
107
+ input: body,
108
+ streamOutput: opts.stream === true,
109
+ });
110
+ }
111
+ /**
112
+ * Copy a local file or directory to the remote host via SCP.
113
+ *
114
+ * Uses `-O` (legacy SCP protocol) which is required by ssh-wrapper.sh
115
+ * forced-command pattern — the newer SFTP protocol skips the command guard.
116
+ * Recursive flag enables directory copy.
117
+ *
118
+ * `remotePath` is interpreted relative to the deploy user's home unless
119
+ * absolute. Callers should pass absolute paths to avoid surprises.
120
+ */
121
+ export async function uploadFile(cfg, localPath, remotePath, opts = {}) {
122
+ const target = sshTarget(cfg, opts.asDeployUser === true);
123
+ const args = ['-O'];
124
+ if (opts.recursive)
125
+ args.push('-r');
126
+ args.push('-i', expandHome(cfg.sshKeyPath));
127
+ args.push('-o', 'ConnectTimeout=10');
128
+ args.push('-o', 'StrictHostKeyChecking=accept-new');
129
+ args.push(localPath, `${target}:${remotePath}`);
130
+ if (!opts.silent) {
131
+ log.cmd(`scp ${args.join(' ')}`);
132
+ }
133
+ if (isDryRun()) {
134
+ log.debug('[dry-run] upload:', localPath, '→', `${target}:${remotePath}`);
135
+ return DRY_RUN_OK;
136
+ }
137
+ return invokeExeca('scp', args, {});
138
+ }
139
+ /**
140
+ * Quick connectivity probe — runs `true` on the remote and reports success.
141
+ * Useful as a preflight step before a long deploy. Forced-command hosts
142
+ * (cicore-deploy@) reject arbitrary commands, so use {@link sshReachable}
143
+ * instead when targeting such hosts.
144
+ */
145
+ export async function sshAlive(cfg) {
146
+ // Probes the normal sshUser path — that's the one orchestration relies on.
147
+ // For deploy-user reachability (forced-command wrapper), use sshReachable.
148
+ const result = await runRemote(cfg, 'true', { silent: true });
149
+ return result.success;
150
+ }
151
+ /**
152
+ * TCP-level reachability check for hosts whose SSH refuses arbitrary cmds.
153
+ * Returns true if `ssh -o BatchMode=yes -o ConnectTimeout=5 <target> exit`
154
+ * exits cleanly (auth + connection established, command rejected is fine).
155
+ * Probes the deploy-user path because that's where the wrapper sits.
156
+ */
157
+ export async function sshReachable(cfg) {
158
+ const target = sshTarget(cfg, true /* deploy user */);
159
+ const args = buildSshArgs(cfg, target, ['exit'], { extraOpts: ['-o', 'BatchMode=yes'] });
160
+ const result = await invokeExeca('ssh', args, {});
161
+ // Exit code 0 = ssh OK + remote `exit` succeeded.
162
+ // Exit code 64 = forced-command wrapper rejected `exit` (still reachable).
163
+ // Any other code = real connectivity failure.
164
+ return result.exitCode === 0 || result.exitCode === 64;
165
+ }
166
+ // ─────────────────────────────────────────────────────────────────────────
167
+ // Internal helpers
168
+ // ─────────────────────────────────────────────────────────────────────────
169
+ /**
170
+ * Build the `ssh <opts> <target> <cmd> [args...]` argv array for execa.
171
+ *
172
+ * Caller passes the resolved `target` so the same routine serves both
173
+ * the regular `sshUser@sshHostname` and the deploy-user variant.
174
+ *
175
+ * Always passes `-i <keyPath>` and `-o ConnectTimeout=10` /
176
+ * `-o StrictHostKeyChecking=accept-new` so the first connect to a new
177
+ * host (e.g. setup flow) doesn't hang on host-key prompts.
178
+ */
179
+ function buildSshArgs(cfg, target, trailing, opts = {}) {
180
+ return [
181
+ '-i',
182
+ expandHome(cfg.sshKeyPath),
183
+ '-o',
184
+ 'ConnectTimeout=10',
185
+ '-o',
186
+ 'StrictHostKeyChecking=accept-new',
187
+ ...(opts.extraOpts ?? []),
188
+ target,
189
+ ...trailing,
190
+ ];
191
+ }
192
+ /**
193
+ * Build the `user@host` target for SSH/SCP.
194
+ *
195
+ * `asDeployUser` = true selects the forced-command receiver account
196
+ * (`cfg.deployUser@cfg.sshHostname`); used only by addon/core install
197
+ * primitives. Default (false) uses the normal sshUser. Hosts without a
198
+ * deployUser configured fall back to sshUser regardless of the flag.
199
+ */
200
+ function sshTarget(cfg, asDeployUser) {
201
+ const user = asDeployUser && cfg.deployUser !== undefined ? cfg.deployUser : cfg.sshUser;
202
+ return `${user}@${cfg.sshHostname}`;
203
+ }
204
+ /** Expand a leading `~/` or bare `~` to the current user's home directory. */
205
+ function expandHome(p) {
206
+ if (p === '~')
207
+ return homedir();
208
+ if (p.startsWith('~/'))
209
+ return resolvePath(homedir(), p.slice(2));
210
+ return p;
211
+ }
212
+ /** Validate env var name and single-quote-escape value for safe export. */
213
+ function renderEnvExports(env) {
214
+ if (!env || Object.keys(env).length === 0)
215
+ return '';
216
+ const lines = [];
217
+ for (const [key, value] of Object.entries(env)) {
218
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(key)) {
219
+ throw new Error(`Invalid env var name '${key}' — must match /^[A-Z_][A-Z0-9_]*$/`);
220
+ }
221
+ // Single-quote, replace embedded `'` with `'\''` — POSIX-safe quoting.
222
+ const escaped = value.replace(/'/g, `'\\''`);
223
+ lines.push(`export ${key}='${escaped}'`);
224
+ }
225
+ return lines.join('\n') + '\n';
226
+ }
227
+ /**
228
+ * Thin execa wrapper that returns a {@link ExecResult} for both success
229
+ * and failure, never throws. Verbose mode echoes stderr on non-zero exit.
230
+ */
231
+ async function invokeExeca(file, args, opts) {
232
+ try {
233
+ const result = opts.streamOutput
234
+ ? await execa(file, args, {
235
+ cwd: opts.cwd,
236
+ input: opts.input,
237
+ env: opts.env,
238
+ shell: false,
239
+ reject: false,
240
+ stdout: 'inherit',
241
+ stderr: 'inherit',
242
+ })
243
+ : await execa(file, args, {
244
+ cwd: opts.cwd,
245
+ input: opts.input,
246
+ env: opts.env,
247
+ shell: false,
248
+ reject: false,
249
+ });
250
+ const stdout = opts.streamOutput ? '' : String(result.stdout ?? '');
251
+ const stderr = opts.streamOutput ? '' : String(result.stderr ?? '');
252
+ const exitCode = result.exitCode ?? 0;
253
+ const success = exitCode === 0;
254
+ if (!success && isVerbose() && stderr) {
255
+ log.debug('stderr:', stderr.trim());
256
+ }
257
+ return Object.freeze({ stdout, stderr, exitCode, success });
258
+ }
259
+ catch (error) {
260
+ const execaError = error;
261
+ return Object.freeze({
262
+ stdout: String(execaError.stdout ?? ''),
263
+ stderr: String(execaError.stderr ?? execaError.message ?? ''),
264
+ exitCode: typeof execaError.exitCode === 'number' ? execaError.exitCode : 1,
265
+ success: false,
266
+ });
267
+ }
268
+ }
269
+ //# sourceMappingURL=ssh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh.js","sourceRoot":"","sources":["../../../src/lib/ops/ssh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * CiCore CLI Interactive Prompts
3
+ *
4
+ * Handles user input and confirmations
5
+ */
6
+ /**
7
+ * Ask for text input
8
+ */
9
+ export declare function input(message: string, defaultValue?: string): Promise<string>;
10
+ /**
11
+ * Ask for confirmation (yes/no)
12
+ */
13
+ export declare function confirm(message: string, defaultValue?: boolean): Promise<boolean>;
14
+ /**
15
+ * Ask for selection from a list
16
+ */
17
+ export declare function select<T extends string>(message: string, choices: Array<{
18
+ name: T;
19
+ message?: string;
20
+ hint?: string;
21
+ }>): Promise<T>;
22
+ /**
23
+ * Ask for multiple selections
24
+ */
25
+ export declare function multiSelect<T extends string>(message: string, choices: Array<{
26
+ name: T;
27
+ message?: string;
28
+ hint?: string;
29
+ }>): Promise<T[]>;
30
+ /**
31
+ * Ask for password (hidden input)
32
+ */
33
+ export declare function password(message: string): Promise<string>;
34
+ /**
35
+ * Double confirmation for dangerous operations
36
+ */
37
+ export declare function dangerConfirm(message: string, confirmText?: string): Promise<boolean>;
38
+ /**
39
+ * Ask for core name selection
40
+ */
41
+ export declare function selectCore(cores: string[]): Promise<string>;
42
+ /**
43
+ * Ask for addon name selection
44
+ */
45
+ export declare function selectAddon(addons: string[]): Promise<string>;
46
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH;;GAEG;AACH,wBAAsB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQnF;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,GAAE,OAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ9F;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,CAAC,SAAS,MAAM,EAC3C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3D,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,SAAS,MAAM,EAChD,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAC3D,OAAO,CAAC,CAAC,EAAE,CAAC,CAYd;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAO/D;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAiB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAalB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAUnE"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * CiCore CLI Interactive Prompts
3
+ *
4
+ * Handles user input and confirmations
5
+ */
6
+ import enquirer from 'enquirer';
7
+ import chalk from 'chalk';
8
+ const { prompt } = enquirer;
9
+ /**
10
+ * Ask for text input
11
+ */
12
+ export async function input(message, defaultValue) {
13
+ const response = await prompt({
14
+ type: 'input',
15
+ name: 'value',
16
+ message,
17
+ initial: defaultValue,
18
+ });
19
+ return response.value;
20
+ }
21
+ /**
22
+ * Ask for confirmation (yes/no)
23
+ */
24
+ export async function confirm(message, defaultValue = false) {
25
+ const response = await prompt({
26
+ type: 'confirm',
27
+ name: 'value',
28
+ message,
29
+ initial: defaultValue,
30
+ });
31
+ return response.value;
32
+ }
33
+ /**
34
+ * Ask for selection from a list
35
+ */
36
+ export async function select(message, choices) {
37
+ const response = await prompt({
38
+ type: 'select',
39
+ name: 'value',
40
+ message,
41
+ choices: choices.map(c => ({
42
+ name: c.name,
43
+ message: c.message || c.name,
44
+ hint: c.hint,
45
+ })),
46
+ });
47
+ return response.value;
48
+ }
49
+ /**
50
+ * Ask for multiple selections
51
+ */
52
+ export async function multiSelect(message, choices) {
53
+ const response = await prompt({
54
+ type: 'multiselect',
55
+ name: 'value',
56
+ message,
57
+ choices: choices.map(c => ({
58
+ name: c.name,
59
+ message: c.message || c.name,
60
+ hint: c.hint,
61
+ })),
62
+ });
63
+ return response.value;
64
+ }
65
+ /**
66
+ * Ask for password (hidden input)
67
+ */
68
+ export async function password(message) {
69
+ const response = await prompt({
70
+ type: 'password',
71
+ name: 'value',
72
+ message,
73
+ });
74
+ return response.value;
75
+ }
76
+ /**
77
+ * Double confirmation for dangerous operations
78
+ */
79
+ export async function dangerConfirm(message, confirmText = 'DELETE') {
80
+ console.log(chalk.red.bold('\n⚠️ DANGER ZONE'));
81
+ console.log(chalk.red(`This action is irreversible!`));
82
+ console.log();
83
+ const firstConfirm = await confirm(message, false);
84
+ if (!firstConfirm)
85
+ return false;
86
+ const typeConfirm = await input(`Type "${chalk.red(confirmText)}" to confirm:`);
87
+ return typeConfirm === confirmText;
88
+ }
89
+ /**
90
+ * Ask for core name selection
91
+ */
92
+ export async function selectCore(cores) {
93
+ if (cores.length === 0) {
94
+ throw new Error('No cores available');
95
+ }
96
+ if (cores.length === 1) {
97
+ return cores[0];
98
+ }
99
+ return select('Select core:', cores.map(c => ({ name: c })));
100
+ }
101
+ /**
102
+ * Ask for addon name selection
103
+ */
104
+ export async function selectAddon(addons) {
105
+ if (addons.length === 0) {
106
+ throw new Error('No addons available');
107
+ }
108
+ if (addons.length === 1) {
109
+ return addons[0];
110
+ }
111
+ return select('Select addon:', addons.map(a => ({ name: a })));
112
+ }
113
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/lib/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * CiCore CLI — Semgrep SAST gate (M3.4 P-1b, K8 signed marketplace)
3
+ *
4
+ * Üçüncü-taraf addon PHP'si/JS'i çekirdekte çalışır → publish ÖNCESİ statik analiz
5
+ * KRİTİK kontrol. Bu lib `ci addon publish`'in pre-flight gate'idir (geliştirici
6
+ * tarafı, fail-closed): ERROR-severity bulgu VAR ya da semgrep YOK → publish ABORT
7
+ * (bilinçli `--skip-scan` ile audit'li bypass).
8
+ *
9
+ * NOT (otoriter katman): bu CLI gate'i CLI-run = teorik bypass-edilebilir. OTORİTER
10
+ * tarama (DB scan_status='passed' yazan) ayrı katmandır: publish-addon-job.php
11
+ * (agent, container-içi) — semgrep IMAGE'a eklenince (mehmet/infra) çalışır; o gün
12
+ * gelene dek scan_status server-otoritesiyle 'pending' kalır (P-1, fail-closed: P-2
13
+ * manifest 'passed' istediğinde pending sürüm gated-servable olmaz). KARAR-ENT/seam.
14
+ */
15
+ export interface SemgrepFinding {
16
+ checkId: string;
17
+ path: string;
18
+ severity: string;
19
+ line?: number;
20
+ }
21
+ export interface SemgrepResult {
22
+ available: boolean;
23
+ ran: boolean;
24
+ errorCount: number;
25
+ findings: SemgrepFinding[];
26
+ message: string;
27
+ }
28
+ /**
29
+ * Pure: semgrep `--json` stdout'unu bulgulara + ERROR sayısına çevirir.
30
+ * Parse edilemeyen çıktı → boş (ran-but-unparseable; çağıran karar verir).
31
+ */
32
+ export declare function parseSemgrepJson(raw: string): {
33
+ errorCount: number;
34
+ findings: SemgrepFinding[];
35
+ };
36
+ /**
37
+ * Semgrep SAST taramasını bir yol üzerinde koşar. Binary yoksa (ENOENT) →
38
+ * `available:false` (çağıran fail-closed ABORT eder). Asla throw etmez.
39
+ */
40
+ export declare function runSemgrepScan(targetPath: string, opts?: {
41
+ config?: string;
42
+ }): Promise<SemgrepResult>;
43
+ //# sourceMappingURL=sast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sast.d.ts","sourceRoot":"","sources":["../../src/lib/sast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,cAAc,EAAE,CAAA;CAAE,CAsBhG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,aAAa,CAAC,CA6BzG"}