@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,79 @@
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
+ import { spawn } from 'node:child_process';
16
+ /**
17
+ * Pure: semgrep `--json` stdout'unu bulgulara + ERROR sayısına çevirir.
18
+ * Parse edilemeyen çıktı → boş (ran-but-unparseable; çağıran karar verir).
19
+ */
20
+ export function parseSemgrepJson(raw) {
21
+ let doc;
22
+ try {
23
+ doc = JSON.parse(raw);
24
+ }
25
+ catch {
26
+ return { errorCount: 0, findings: [] };
27
+ }
28
+ const results = doc?.results;
29
+ const arr = Array.isArray(results) ? results : [];
30
+ const findings = arr.map((r) => {
31
+ const rec = (r ?? {});
32
+ const extra = (rec.extra ?? {});
33
+ const start = (rec.start ?? {});
34
+ return {
35
+ checkId: String(rec.check_id ?? '?'),
36
+ path: String(rec.path ?? '?'),
37
+ severity: String(extra.severity ?? 'INFO').toUpperCase(),
38
+ line: typeof start.line === 'number' ? start.line : undefined,
39
+ };
40
+ });
41
+ const errorCount = findings.filter((f) => f.severity === 'ERROR').length;
42
+ return { errorCount, findings };
43
+ }
44
+ /**
45
+ * Semgrep SAST taramasını bir yol üzerinde koşar. Binary yoksa (ENOENT) →
46
+ * `available:false` (çağıran fail-closed ABORT eder). Asla throw etmez.
47
+ */
48
+ export function runSemgrepScan(targetPath, opts = {}) {
49
+ const config = opts.config ?? process.env.CICORE_SEMGREP_CONFIG ?? 'auto';
50
+ return new Promise((resolve) => {
51
+ let settled = false;
52
+ const done = (r) => {
53
+ if (!settled) {
54
+ settled = true;
55
+ resolve(r);
56
+ }
57
+ };
58
+ let proc;
59
+ try {
60
+ proc = spawn('semgrep', ['scan', '--json', '--quiet', '--config', config, targetPath], {
61
+ stdio: ['ignore', 'pipe', 'pipe'],
62
+ });
63
+ }
64
+ catch (e) {
65
+ done({ available: false, ran: false, errorCount: 0, findings: [], message: `semgrep spawn hata: ${String(e)}` });
66
+ return;
67
+ }
68
+ let stdout = '';
69
+ proc.on('error', (e) => {
70
+ done({ available: false, ran: false, errorCount: 0, findings: [], message: `semgrep yok/çalışmadı: ${e?.code ?? e?.message ?? 'error'}` });
71
+ });
72
+ proc.stdout?.on('data', (d) => { stdout += d.toString(); });
73
+ proc.on('close', (code) => {
74
+ const { errorCount, findings } = parseSemgrepJson(stdout);
75
+ done({ available: true, ran: true, errorCount, findings, message: `semgrep exit=${code} findings=${findings.length} errors=${errorCount}` });
76
+ });
77
+ });
78
+ }
79
+ //# sourceMappingURL=sast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sast.js","sourceRoot":"","sources":["../../src/lib/sast.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAiB3C;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACzC,CAAC;IACD,MAAM,OAAO,GAAI,GAA6B,EAAE,OAAO,CAAC;IACxD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,MAAM,QAAQ,GAAqB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAkB,EAAE;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAA4B,CAAC;QACjD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;QAC3D,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;QAC3D,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;YACpC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;YAC7B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE;YACxD,IAAI,EAAE,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC9D,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;IACzE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,OAA4B,EAAE;IAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,MAAM,CAAC;IAC1E,OAAO,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QAC5C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAG,CAAC,CAAgB,EAAQ,EAAE;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,CAAC,CAAC,CAAC;YACb,CAAC;QACH,CAAC,CAAC;QACF,IAAI,IAAI,CAAC;QACT,IAAI,CAAC;YACH,IAAI,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;gBACrF,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,uBAAuB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACjH,OAAO;QACT,CAAC;QACD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAwB,EAAE,EAAE;YAC5C,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,0BAA0B,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;QAC7I,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC1D,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,IAAI,aAAa,QAAQ,CAAC,MAAM,WAAW,UAAU,EAAE,EAAE,CAAC,CAAC;QAC/I,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sast.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sast.test.d.ts","sourceRoot":"","sources":["../../src/lib/sast.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,33 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { parseSemgrepJson } from './sast.js';
3
+ describe('sast / Semgrep gate (M3.4 P-1b)', () => {
4
+ it('boş/parse-edilemez çıktı → 0 finding (asla throw)', () => {
5
+ expect(parseSemgrepJson('')).toEqual({ errorCount: 0, findings: [] });
6
+ expect(parseSemgrepJson('not-json')).toEqual({ errorCount: 0, findings: [] });
7
+ expect(parseSemgrepJson('{}')).toEqual({ errorCount: 0, findings: [] });
8
+ });
9
+ it('results → findings + ERROR sayımı (gate kriteri)', () => {
10
+ const raw = JSON.stringify({
11
+ results: [
12
+ { check_id: 'php.lang.security.eval', path: 'Backend/X.php', start: { line: 12 }, extra: { severity: 'ERROR' } },
13
+ { check_id: 'js.audit.console', path: 'app/y.js', start: { line: 3 }, extra: { severity: 'WARNING' } },
14
+ { check_id: 'php.taint.sqli', path: 'Backend/Z.php', start: { line: 40 }, extra: { severity: 'ERROR' } },
15
+ ],
16
+ });
17
+ const { errorCount, findings } = parseSemgrepJson(raw);
18
+ expect(findings).toHaveLength(3);
19
+ expect(errorCount).toBe(2); // sadece ERROR-severity gate'i tetikler
20
+ expect(findings[0]).toMatchObject({ checkId: 'php.lang.security.eval', path: 'Backend/X.php', severity: 'ERROR', line: 12 });
21
+ });
22
+ it('temiz tarama (results boş) → errorCount 0 → gate GEÇER', () => {
23
+ expect(parseSemgrepJson(JSON.stringify({ results: [], errors: [] }))).toEqual({ errorCount: 0, findings: [] });
24
+ });
25
+ it('severity normalize (case-insensitive) + eksik alanlara güvenli default', () => {
26
+ const raw = JSON.stringify({ results: [{ check_id: 'x', extra: { severity: 'error' } }] });
27
+ const { errorCount, findings } = parseSemgrepJson(raw);
28
+ expect(errorCount).toBe(1);
29
+ expect(findings[0]).toMatchObject({ checkId: 'x', path: '?', severity: 'ERROR' });
30
+ expect(findings[0].line).toBeUndefined();
31
+ });
32
+ });
33
+ //# sourceMappingURL=sast.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sast.test.js","sourceRoot":"","sources":["../../src/lib/sast.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * CiCore CLI Shell Executor
3
+ *
4
+ * Handles local and remote command execution
5
+ */
6
+ export interface ExecResult {
7
+ stdout: string;
8
+ stderr: string;
9
+ exitCode: number;
10
+ success: boolean;
11
+ }
12
+ /**
13
+ * Execute a local command
14
+ * @param command - Command to execute
15
+ * @param args - Command arguments
16
+ * @param options - Execution options
17
+ * @param options.cwd - Working directory
18
+ * @param options.silent - Suppress command logging
19
+ * @param options.stream - Stream output to console in real-time
20
+ */
21
+ export declare function exec(command: string, args?: string[], options?: {
22
+ cwd?: string;
23
+ silent?: boolean;
24
+ stream?: boolean;
25
+ }): Promise<ExecResult>;
26
+ /**
27
+ * Execute a command on the remote server via SSH
28
+ */
29
+ export declare function ssh(command: string, options?: {
30
+ silent?: boolean;
31
+ host?: string;
32
+ }): Promise<ExecResult>;
33
+ /**
34
+ * Copy files to remote server via SCP
35
+ */
36
+ export declare function scp(localPath: string, remotePath: string, options?: {
37
+ recursive?: boolean;
38
+ silent?: boolean;
39
+ host?: string;
40
+ }): Promise<ExecResult>;
41
+ /**
42
+ * Execute Docker command (local or remote based on env)
43
+ */
44
+ export declare function docker(command: string, options?: {
45
+ silent?: boolean;
46
+ }): Promise<ExecResult>;
47
+ /**
48
+ * Execute Docker Compose command
49
+ */
50
+ export declare function dockerCompose(composeFile: string, command: string, options?: {
51
+ cwd?: string;
52
+ silent?: boolean;
53
+ }): Promise<ExecResult>;
54
+ /**
55
+ * Execute command inside a Docker container
56
+ */
57
+ export declare function dockerExec(container: string, command: string, options?: {
58
+ user?: string;
59
+ silent?: boolean;
60
+ }): Promise<ExecResult>;
61
+ //# sourceMappingURL=shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,EAAO,EACnB,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjE,OAAO,CAAC,UAAU,CAAC,CAoDrB;AAED;;GAEG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAChD,OAAO,CAAC,UAAU,CAAC,CAkCrB;AAED;;GAEG;AACH,wBAAsB,GAAG,CACvB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GACrE,OAAO,CAAC,UAAU,CAAC,CAmCrB;AAED;;GAEG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACjC,OAAO,CAAC,UAAU,CAAC,CAQrB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAC/C,OAAO,CAAC,UAAU,CAAC,CASrB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GAChD,OAAO,CAAC,UAAU,CAAC,CAcrB"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * CiCore CLI Shell Executor
3
+ *
4
+ * Handles local and remote command execution
5
+ */
6
+ import { execa } from 'execa';
7
+ import { log } from './logger.js';
8
+ import { getEnv, getSSHConnection, isDryRun } from './config.js';
9
+ /**
10
+ * Execute a local command
11
+ * @param command - Command to execute
12
+ * @param args - Command arguments
13
+ * @param options - Execution options
14
+ * @param options.cwd - Working directory
15
+ * @param options.silent - Suppress command logging
16
+ * @param options.stream - Stream output to console in real-time
17
+ */
18
+ export async function exec(command, args = [], options = {}) {
19
+ const { cwd, silent = false, stream = false } = options;
20
+ if (!silent && !stream) {
21
+ log.cmd(`${command} ${args.join(' ')}`);
22
+ }
23
+ if (isDryRun()) {
24
+ log.debug('[DRY RUN] Would execute:', command, args.join(' '));
25
+ return { stdout: '', stderr: '', exitCode: 0, success: true };
26
+ }
27
+ try {
28
+ if (stream) {
29
+ // Stream output to console in real-time
30
+ const result = await execa(command, args, {
31
+ cwd,
32
+ shell: true,
33
+ reject: false,
34
+ stdout: 'inherit',
35
+ stderr: 'inherit',
36
+ });
37
+ return {
38
+ stdout: '',
39
+ stderr: '',
40
+ exitCode: result.exitCode ?? 0,
41
+ success: result.exitCode === 0,
42
+ };
43
+ }
44
+ else {
45
+ const result = await execa(command, args, {
46
+ cwd,
47
+ shell: true,
48
+ reject: false,
49
+ });
50
+ return {
51
+ stdout: result.stdout,
52
+ stderr: result.stderr,
53
+ exitCode: result.exitCode ?? 0,
54
+ success: result.exitCode === 0,
55
+ };
56
+ }
57
+ }
58
+ catch (error) {
59
+ const execaError = error;
60
+ return {
61
+ stdout: String(execaError.stdout || ''),
62
+ stderr: String(execaError.stderr || execaError.message),
63
+ exitCode: execaError.exitCode ?? 1,
64
+ success: false,
65
+ };
66
+ }
67
+ }
68
+ /**
69
+ * Execute a command on the remote server via SSH
70
+ */
71
+ export async function ssh(command, options = {}) {
72
+ const { silent = false, host } = options;
73
+ const sshConnection = host || getSSHConnection();
74
+ if (!silent) {
75
+ log.cmd(`ssh ${sshConnection} "${command}"`);
76
+ }
77
+ if (isDryRun()) {
78
+ log.debug('[DRY RUN] Would execute on server:', command);
79
+ return { stdout: '', stderr: '', exitCode: 0, success: true };
80
+ }
81
+ try {
82
+ const result = await execa('ssh', [sshConnection, command], {
83
+ shell: false,
84
+ reject: false,
85
+ });
86
+ return {
87
+ stdout: result.stdout,
88
+ stderr: result.stderr,
89
+ exitCode: result.exitCode ?? 0,
90
+ success: result.exitCode === 0,
91
+ };
92
+ }
93
+ catch (error) {
94
+ const execaError = error;
95
+ return {
96
+ stdout: String(execaError.stdout || ''),
97
+ stderr: String(execaError.stderr || execaError.message),
98
+ exitCode: execaError.exitCode ?? 1,
99
+ success: false,
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Copy files to remote server via SCP
105
+ */
106
+ export async function scp(localPath, remotePath, options = {}) {
107
+ const { recursive = false, silent = false, host } = options;
108
+ const sshConnection = host || getSSHConnection();
109
+ const args = recursive ? ['-r', localPath, `${sshConnection}:${remotePath}`] : [localPath, `${sshConnection}:${remotePath}`];
110
+ if (!silent) {
111
+ log.cmd(`scp ${args.join(' ')}`);
112
+ }
113
+ if (isDryRun()) {
114
+ log.debug('[DRY RUN] Would copy:', localPath, '→', remotePath);
115
+ return { stdout: '', stderr: '', exitCode: 0, success: true };
116
+ }
117
+ try {
118
+ const result = await execa('scp', args, {
119
+ shell: false,
120
+ reject: false,
121
+ });
122
+ return {
123
+ stdout: result.stdout,
124
+ stderr: result.stderr,
125
+ exitCode: result.exitCode ?? 0,
126
+ success: result.exitCode === 0,
127
+ };
128
+ }
129
+ catch (error) {
130
+ const execaError = error;
131
+ return {
132
+ stdout: String(execaError.stdout || ''),
133
+ stderr: String(execaError.stderr || execaError.message),
134
+ exitCode: execaError.exitCode ?? 1,
135
+ success: false,
136
+ };
137
+ }
138
+ }
139
+ /**
140
+ * Execute Docker command (local or remote based on env)
141
+ */
142
+ export async function docker(command, options = {}) {
143
+ const env = getEnv();
144
+ if (env === 'dev') {
145
+ return exec('docker', [command], options);
146
+ }
147
+ else {
148
+ return ssh(`docker ${command}`, options);
149
+ }
150
+ }
151
+ /**
152
+ * Execute Docker Compose command
153
+ */
154
+ export async function dockerCompose(composeFile, command, options = {}) {
155
+ const env = getEnv();
156
+ const fullCommand = `docker compose -f ${composeFile} ${command}`;
157
+ if (env === 'dev') {
158
+ return exec('docker', ['compose', '-f', composeFile, ...command.split(' ')], options);
159
+ }
160
+ else {
161
+ return ssh(fullCommand, options);
162
+ }
163
+ }
164
+ /**
165
+ * Execute command inside a Docker container
166
+ */
167
+ export async function dockerExec(container, command, options = {}) {
168
+ const { user, silent = false } = options;
169
+ const env = getEnv();
170
+ const userFlag = user ? `-u ${user}` : '';
171
+ const fullCommand = `docker exec ${userFlag} ${container} sh -c '${command}'`;
172
+ if (env === 'dev') {
173
+ const args = ['exec'];
174
+ if (user)
175
+ args.push('-u', user);
176
+ args.push(container, 'sh', '-c', command);
177
+ return exec('docker', args, { silent });
178
+ }
179
+ else {
180
+ return ssh(fullCommand, { silent });
181
+ }
182
+ }
183
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/lib/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * CiCore CLI - SSH Config Parser
3
+ *
4
+ * Reads SSH config file to get host information
5
+ */
6
+ export interface SSHHost {
7
+ name: string;
8
+ hostname: string;
9
+ user: string;
10
+ port: number;
11
+ identityFile?: string;
12
+ }
13
+ /**
14
+ * Parse SSH config file and return hosts
15
+ */
16
+ export declare function parseSSHConfig(): Promise<Map<string, SSHHost>>;
17
+ /**
18
+ * Get a specific SSH host by name
19
+ */
20
+ export declare function getSSHHost(name: string): Promise<SSHHost | null>;
21
+ /**
22
+ * List all SSH hosts
23
+ */
24
+ export declare function listSSHHosts(): Promise<SSHHost[]>;
25
+ /**
26
+ * Build SSH connection string
27
+ */
28
+ export declare function buildSSHString(host: SSHHost): string;
29
+ /**
30
+ * Build SSH command with identity file
31
+ */
32
+ export declare function buildSSHCommand(host: SSHHost, command: string): string[];
33
+ /**
34
+ * Build SCP command with identity file
35
+ */
36
+ export declare function buildSCPCommand(host: SSHHost, source: string, dest: string, recursive?: boolean): string[];
37
+ //# sourceMappingURL=ssh-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-config.d.ts","sourceRoot":"","sources":["../../src/lib/ssh-config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA6DpE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAGtE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAGvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAMpD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAexE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,OAAe,GAAG,MAAM,EAAE,CAmBjH"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * CiCore CLI - SSH Config Parser
3
+ *
4
+ * Reads SSH config file to get host information
5
+ */
6
+ import fs from 'fs-extra';
7
+ import path from 'path';
8
+ import os from 'os';
9
+ /**
10
+ * Parse SSH config file and return hosts
11
+ */
12
+ export async function parseSSHConfig() {
13
+ const configPath = path.join(os.homedir(), '.ssh', 'config');
14
+ const hosts = new Map();
15
+ if (!await fs.pathExists(configPath)) {
16
+ return hosts;
17
+ }
18
+ const content = await fs.readFile(configPath, 'utf-8');
19
+ const lines = content.split('\n');
20
+ let currentHost = null;
21
+ for (const line of lines) {
22
+ const trimmed = line.trim();
23
+ if (!trimmed || trimmed.startsWith('#')) {
24
+ continue;
25
+ }
26
+ const [key, ...valueParts] = trimmed.split(/\s+/);
27
+ const value = valueParts.join(' ');
28
+ if (key.toLowerCase() === 'host') {
29
+ // Save previous host
30
+ if (currentHost) {
31
+ hosts.set(currentHost.name, currentHost);
32
+ }
33
+ // Start new host
34
+ currentHost = {
35
+ name: value,
36
+ hostname: '',
37
+ user: 'root',
38
+ port: 22,
39
+ };
40
+ }
41
+ else if (currentHost) {
42
+ switch (key.toLowerCase()) {
43
+ case 'hostname':
44
+ currentHost.hostname = value;
45
+ break;
46
+ case 'user':
47
+ currentHost.user = value;
48
+ break;
49
+ case 'port':
50
+ currentHost.port = parseInt(value) || 22;
51
+ break;
52
+ case 'identityfile':
53
+ // Expand ~ to home directory
54
+ currentHost.identityFile = value.replace(/^~/, os.homedir());
55
+ break;
56
+ }
57
+ }
58
+ }
59
+ // Save last host
60
+ if (currentHost) {
61
+ hosts.set(currentHost.name, currentHost);
62
+ }
63
+ return hosts;
64
+ }
65
+ /**
66
+ * Get a specific SSH host by name
67
+ */
68
+ export async function getSSHHost(name) {
69
+ const hosts = await parseSSHConfig();
70
+ return hosts.get(name) || null;
71
+ }
72
+ /**
73
+ * List all SSH hosts
74
+ */
75
+ export async function listSSHHosts() {
76
+ const hosts = await parseSSHConfig();
77
+ return Array.from(hosts.values());
78
+ }
79
+ /**
80
+ * Build SSH connection string
81
+ */
82
+ export function buildSSHString(host) {
83
+ let cmd = `${host.user}@${host.hostname}`;
84
+ if (host.port !== 22) {
85
+ cmd = `-p ${host.port} ${cmd}`;
86
+ }
87
+ return cmd;
88
+ }
89
+ /**
90
+ * Build SSH command with identity file
91
+ */
92
+ export function buildSSHCommand(host, command) {
93
+ const args = [];
94
+ if (host.identityFile) {
95
+ args.push('-i', host.identityFile);
96
+ }
97
+ if (host.port !== 22) {
98
+ args.push('-p', host.port.toString());
99
+ }
100
+ args.push(`${host.user}@${host.hostname}`);
101
+ args.push(command);
102
+ return args;
103
+ }
104
+ /**
105
+ * Build SCP command with identity file
106
+ */
107
+ export function buildSCPCommand(host, source, dest, recursive = false) {
108
+ const args = [];
109
+ if (host.identityFile) {
110
+ args.push('-i', host.identityFile);
111
+ }
112
+ if (host.port !== 22) {
113
+ args.push('-P', host.port.toString());
114
+ }
115
+ if (recursive) {
116
+ args.push('-r');
117
+ }
118
+ args.push(source);
119
+ args.push(`${host.user}@${host.hostname}:${dest}`);
120
+ return args;
121
+ }
122
+ //# sourceMappingURL=ssh-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ssh-config.js","sourceRoot":"","sources":["../../src/lib/ssh-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Tenant-scope static analysis — T-C trust-boundary deploy gate (task-230).
3
+ *
4
+ * Addon Backend PHP'si paylaşımlı cicore_php-FPM içinde çalışır. Yanlış yazılmış
5
+ * bir addon DatabaseService'i doğrudan çağırarak TenantContext'i bypass edip başka
6
+ * tenant'ın verisine erişebilir.
7
+ *
8
+ * Tarama iki katmanda çalışır:
9
+ * 1. Orijinal satır bazlı — kesin satır numarası üretir.
10
+ * 2. Whitespace-normalize (tek satır) — multi-line split kaçağını kapatır.
11
+ *
12
+ * Ayrıca PHP class alias (`use ... as Alias`) tespiti yapılır; her alias için
13
+ * forbidden pattern'lar dinamik olarak üretilir.
14
+ *
15
+ * Sınır: statik regex (AST değil). Obfuscated runtime bypass → FAZ-2 sandbox (Hünkar).
16
+ */
17
+ export interface TenantScopeViolation {
18
+ readonly file: string;
19
+ readonly line: number;
20
+ readonly rule: string;
21
+ readonly detail: string;
22
+ }
23
+ export interface TenantScopeResult {
24
+ readonly violations: TenantScopeViolation[];
25
+ readonly tenantContextUsed: boolean;
26
+ readonly hasBackendFiles: boolean;
27
+ readonly ok: boolean;
28
+ }
29
+ export interface FileInput {
30
+ readonly path: string;
31
+ readonly content: string;
32
+ }
33
+ /**
34
+ * Analyzes a list of Backend PHP files for tenant-scope violations.
35
+ * Pure function (no filesystem I/O) — testable without disk.
36
+ */
37
+ export declare function analyzeTenantScope(files: FileInput[]): TenantScopeResult;
38
+ //# sourceMappingURL=tenant-scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-scope.d.ts","sourceRoot":"","sources":["../../src/lib/tenant-scope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,oBAAoB,EAAE,CAAA;IAC3C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAA;IACnC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAA;IACjC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAqDD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAoGxE"}