iec-cli 0.6.6

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 (443) hide show
  1. package/README.md +159 -0
  2. package/dist/commands/backup.d.ts +11 -0
  3. package/dist/commands/backup.d.ts.map +1 -0
  4. package/dist/commands/backup.js +112 -0
  5. package/dist/commands/backup.js.map +1 -0
  6. package/dist/commands/config.d.ts +28 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +190 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/deploy.d.ts +16 -0
  11. package/dist/commands/deploy.d.ts.map +1 -0
  12. package/dist/commands/deploy.js +235 -0
  13. package/dist/commands/deploy.js.map +1 -0
  14. package/dist/commands/destroy.d.ts +12 -0
  15. package/dist/commands/destroy.d.ts.map +1 -0
  16. package/dist/commands/destroy.js +62 -0
  17. package/dist/commands/destroy.js.map +1 -0
  18. package/dist/commands/domains.d.ts +36 -0
  19. package/dist/commands/domains.d.ts.map +1 -0
  20. package/dist/commands/domains.js +323 -0
  21. package/dist/commands/domains.js.map +1 -0
  22. package/dist/commands/env.d.ts +7 -0
  23. package/dist/commands/env.d.ts.map +1 -0
  24. package/dist/commands/env.js +42 -0
  25. package/dist/commands/env.js.map +1 -0
  26. package/dist/commands/git.d.ts +32 -0
  27. package/dist/commands/git.d.ts.map +1 -0
  28. package/dist/commands/git.js +340 -0
  29. package/dist/commands/git.js.map +1 -0
  30. package/dist/commands/init-ai.d.ts +7 -0
  31. package/dist/commands/init-ai.d.ts.map +1 -0
  32. package/dist/commands/init-ai.js +257 -0
  33. package/dist/commands/init-ai.js.map +1 -0
  34. package/dist/commands/init.d.ts +8 -0
  35. package/dist/commands/init.d.ts.map +1 -0
  36. package/dist/commands/init.js +228 -0
  37. package/dist/commands/init.js.map +1 -0
  38. package/dist/commands/link.d.ts +10 -0
  39. package/dist/commands/link.d.ts.map +1 -0
  40. package/dist/commands/link.js +193 -0
  41. package/dist/commands/link.js.map +1 -0
  42. package/dist/commands/login.d.ts +16 -0
  43. package/dist/commands/login.d.ts.map +1 -0
  44. package/dist/commands/login.js +468 -0
  45. package/dist/commands/login.js.map +1 -0
  46. package/dist/commands/logs.d.ts +16 -0
  47. package/dist/commands/logs.d.ts.map +1 -0
  48. package/dist/commands/logs.js +362 -0
  49. package/dist/commands/logs.js.map +1 -0
  50. package/dist/commands/oauth.d.ts +33 -0
  51. package/dist/commands/oauth.d.ts.map +1 -0
  52. package/dist/commands/oauth.js +181 -0
  53. package/dist/commands/oauth.js.map +1 -0
  54. package/dist/commands/preflight.d.ts +8 -0
  55. package/dist/commands/preflight.d.ts.map +1 -0
  56. package/dist/commands/preflight.js +190 -0
  57. package/dist/commands/preflight.js.map +1 -0
  58. package/dist/commands/program.d.ts +7 -0
  59. package/dist/commands/program.d.ts.map +1 -0
  60. package/dist/commands/program.js +59 -0
  61. package/dist/commands/program.js.map +1 -0
  62. package/dist/commands/programs.d.ts +7 -0
  63. package/dist/commands/programs.d.ts.map +1 -0
  64. package/dist/commands/programs.js +42 -0
  65. package/dist/commands/programs.js.map +1 -0
  66. package/dist/commands/push.d.ts +12 -0
  67. package/dist/commands/push.d.ts.map +1 -0
  68. package/dist/commands/push.js +166 -0
  69. package/dist/commands/push.js.map +1 -0
  70. package/dist/commands/register-scaffold.test.d.ts +2 -0
  71. package/dist/commands/register-scaffold.test.d.ts.map +1 -0
  72. package/dist/commands/register-scaffold.test.js +291 -0
  73. package/dist/commands/register-scaffold.test.js.map +1 -0
  74. package/dist/commands/register.d.ts +7 -0
  75. package/dist/commands/register.d.ts.map +1 -0
  76. package/dist/commands/register.js +304 -0
  77. package/dist/commands/register.js.map +1 -0
  78. package/dist/commands/rollback.d.ts +11 -0
  79. package/dist/commands/rollback.d.ts.map +1 -0
  80. package/dist/commands/rollback.js +147 -0
  81. package/dist/commands/rollback.js.map +1 -0
  82. package/dist/commands/sample.d.ts +15 -0
  83. package/dist/commands/sample.d.ts.map +1 -0
  84. package/dist/commands/sample.js +312 -0
  85. package/dist/commands/sample.js.map +1 -0
  86. package/dist/commands/scopes.d.ts +29 -0
  87. package/dist/commands/scopes.d.ts.map +1 -0
  88. package/dist/commands/scopes.js +203 -0
  89. package/dist/commands/scopes.js.map +1 -0
  90. package/dist/commands/services.d.ts +13 -0
  91. package/dist/commands/services.d.ts.map +1 -0
  92. package/dist/commands/services.js +95 -0
  93. package/dist/commands/services.js.map +1 -0
  94. package/dist/commands/settings.d.ts +10 -0
  95. package/dist/commands/settings.d.ts.map +1 -0
  96. package/dist/commands/settings.js +41 -0
  97. package/dist/commands/settings.js.map +1 -0
  98. package/dist/commands/signup.d.ts +9 -0
  99. package/dist/commands/signup.d.ts.map +1 -0
  100. package/dist/commands/signup.js +192 -0
  101. package/dist/commands/signup.js.map +1 -0
  102. package/dist/commands/status.d.ts +9 -0
  103. package/dist/commands/status.d.ts.map +1 -0
  104. package/dist/commands/status.js +170 -0
  105. package/dist/commands/status.js.map +1 -0
  106. package/dist/commands/troubleshoot.d.ts +19 -0
  107. package/dist/commands/troubleshoot.d.ts.map +1 -0
  108. package/dist/commands/troubleshoot.js +465 -0
  109. package/dist/commands/troubleshoot.js.map +1 -0
  110. package/dist/commands/update.d.ts +6 -0
  111. package/dist/commands/update.d.ts.map +1 -0
  112. package/dist/commands/update.js +64 -0
  113. package/dist/commands/update.js.map +1 -0
  114. package/dist/commands/user.d.ts +17 -0
  115. package/dist/commands/user.d.ts.map +1 -0
  116. package/dist/commands/user.js +126 -0
  117. package/dist/commands/user.js.map +1 -0
  118. package/dist/commands/versions.d.ts +16 -0
  119. package/dist/commands/versions.d.ts.map +1 -0
  120. package/dist/commands/versions.js +116 -0
  121. package/dist/commands/versions.js.map +1 -0
  122. package/dist/index.d.ts +3 -0
  123. package/dist/index.d.ts.map +1 -0
  124. package/dist/index.js +556 -0
  125. package/dist/index.js.map +1 -0
  126. package/dist/lib/__tests__/scaffold-integration.test.d.ts +2 -0
  127. package/dist/lib/__tests__/scaffold-integration.test.d.ts.map +1 -0
  128. package/dist/lib/__tests__/scaffold-integration.test.js +321 -0
  129. package/dist/lib/__tests__/scaffold-integration.test.js.map +1 -0
  130. package/dist/lib/ai/client.d.ts +39 -0
  131. package/dist/lib/ai/client.d.ts.map +1 -0
  132. package/dist/lib/ai/client.js +236 -0
  133. package/dist/lib/ai/client.js.map +1 -0
  134. package/dist/lib/ai/generator.d.ts +17 -0
  135. package/dist/lib/ai/generator.d.ts.map +1 -0
  136. package/dist/lib/ai/generator.js +338 -0
  137. package/dist/lib/ai/generator.js.map +1 -0
  138. package/dist/lib/ai/prompts.d.ts +47 -0
  139. package/dist/lib/ai/prompts.d.ts.map +1 -0
  140. package/dist/lib/ai/prompts.js +247 -0
  141. package/dist/lib/ai/prompts.js.map +1 -0
  142. package/dist/lib/ai/scanner.d.ts +50 -0
  143. package/dist/lib/ai/scanner.d.ts.map +1 -0
  144. package/dist/lib/ai/scanner.js +237 -0
  145. package/dist/lib/ai/scanner.js.map +1 -0
  146. package/dist/lib/api.d.ts +18 -0
  147. package/dist/lib/api.d.ts.map +1 -0
  148. package/dist/lib/api.js +67 -0
  149. package/dist/lib/api.js.map +1 -0
  150. package/dist/lib/auto-register.d.ts +12 -0
  151. package/dist/lib/auto-register.d.ts.map +1 -0
  152. package/dist/lib/auto-register.js +42 -0
  153. package/dist/lib/auto-register.js.map +1 -0
  154. package/dist/lib/bio.d.ts +90 -0
  155. package/dist/lib/bio.d.ts.map +1 -0
  156. package/dist/lib/bio.js +247 -0
  157. package/dist/lib/bio.js.map +1 -0
  158. package/dist/lib/builder.d.ts +65 -0
  159. package/dist/lib/builder.d.ts.map +1 -0
  160. package/dist/lib/builder.js +192 -0
  161. package/dist/lib/builder.js.map +1 -0
  162. package/dist/lib/catalog.d.ts +3 -0
  163. package/dist/lib/catalog.d.ts.map +1 -0
  164. package/dist/lib/catalog.js +17 -0
  165. package/dist/lib/catalog.js.map +1 -0
  166. package/dist/lib/config.d.ts +20 -0
  167. package/dist/lib/config.d.ts.map +1 -0
  168. package/dist/lib/config.js +124 -0
  169. package/dist/lib/config.js.map +1 -0
  170. package/dist/lib/forgejo.d.ts +188 -0
  171. package/dist/lib/forgejo.d.ts.map +1 -0
  172. package/dist/lib/forgejo.js +305 -0
  173. package/dist/lib/forgejo.js.map +1 -0
  174. package/dist/lib/output.d.ts +12 -0
  175. package/dist/lib/output.d.ts.map +1 -0
  176. package/dist/lib/output.js +39 -0
  177. package/dist/lib/output.js.map +1 -0
  178. package/dist/lib/scaffold.d.ts +30 -0
  179. package/dist/lib/scaffold.d.ts.map +1 -0
  180. package/dist/lib/scaffold.js +180 -0
  181. package/dist/lib/scaffold.js.map +1 -0
  182. package/dist/lib/scope-requests.d.ts +17 -0
  183. package/dist/lib/scope-requests.d.ts.map +1 -0
  184. package/dist/lib/scope-requests.js +78 -0
  185. package/dist/lib/scope-requests.js.map +1 -0
  186. package/dist/lib/scope-requests.test.d.ts +2 -0
  187. package/dist/lib/scope-requests.test.d.ts.map +1 -0
  188. package/dist/lib/scope-requests.test.js +239 -0
  189. package/dist/lib/scope-requests.test.js.map +1 -0
  190. package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
  191. package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
  192. package/dist/lib/troubleshoot/analyzer.js +541 -0
  193. package/dist/lib/troubleshoot/analyzer.js.map +1 -0
  194. package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
  195. package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
  196. package/dist/lib/troubleshoot/auto-fix.js +373 -0
  197. package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
  198. package/dist/lib/troubleshoot/index.d.ts +5 -0
  199. package/dist/lib/troubleshoot/index.d.ts.map +1 -0
  200. package/dist/lib/troubleshoot/index.js +6 -0
  201. package/dist/lib/troubleshoot/index.js.map +1 -0
  202. package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
  203. package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
  204. package/dist/lib/troubleshoot/log-fetcher.js +431 -0
  205. package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
  206. package/dist/lib/troubleshoot/redactor.d.ts +35 -0
  207. package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
  208. package/dist/lib/troubleshoot/redactor.js +208 -0
  209. package/dist/lib/troubleshoot/redactor.js.map +1 -0
  210. package/dist/lib/validators/catalog-schemas.d.ts +59 -0
  211. package/dist/lib/validators/catalog-schemas.d.ts.map +1 -0
  212. package/dist/lib/validators/catalog-schemas.js +32 -0
  213. package/dist/lib/validators/catalog-schemas.js.map +1 -0
  214. package/dist/lib/validators/catalog-validator.d.ts +3 -0
  215. package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
  216. package/dist/lib/validators/catalog-validator.js +247 -0
  217. package/dist/lib/validators/catalog-validator.js.map +1 -0
  218. package/dist/lib/validators/catalog-validator.test.d.ts +2 -0
  219. package/dist/lib/validators/catalog-validator.test.d.ts.map +1 -0
  220. package/dist/lib/validators/catalog-validator.test.js +420 -0
  221. package/dist/lib/validators/catalog-validator.test.js.map +1 -0
  222. package/dist/lib/validators/dockerfile-validator.d.ts +5 -0
  223. package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
  224. package/dist/lib/validators/dockerfile-validator.js +295 -0
  225. package/dist/lib/validators/dockerfile-validator.js.map +1 -0
  226. package/dist/lib/validators/dockerfile-validator.test.d.ts +2 -0
  227. package/dist/lib/validators/dockerfile-validator.test.d.ts.map +1 -0
  228. package/dist/lib/validators/dockerfile-validator.test.js +161 -0
  229. package/dist/lib/validators/dockerfile-validator.test.js.map +1 -0
  230. package/dist/lib/validators/env-validator.d.ts +3 -0
  231. package/dist/lib/validators/env-validator.d.ts.map +1 -0
  232. package/dist/lib/validators/env-validator.js +268 -0
  233. package/dist/lib/validators/env-validator.js.map +1 -0
  234. package/dist/lib/validators/git-validator.d.ts +3 -0
  235. package/dist/lib/validators/git-validator.d.ts.map +1 -0
  236. package/dist/lib/validators/git-validator.js +236 -0
  237. package/dist/lib/validators/git-validator.js.map +1 -0
  238. package/dist/lib/validators/health-detector.d.ts +4 -0
  239. package/dist/lib/validators/health-detector.d.ts.map +1 -0
  240. package/dist/lib/validators/health-detector.js +172 -0
  241. package/dist/lib/validators/health-detector.js.map +1 -0
  242. package/dist/lib/validators/health-detector.test.d.ts +2 -0
  243. package/dist/lib/validators/health-detector.test.d.ts.map +1 -0
  244. package/dist/lib/validators/health-detector.test.js +118 -0
  245. package/dist/lib/validators/health-detector.test.js.map +1 -0
  246. package/dist/lib/validators/index.d.ts +8 -0
  247. package/dist/lib/validators/index.d.ts.map +1 -0
  248. package/dist/lib/validators/index.js +8 -0
  249. package/dist/lib/validators/index.js.map +1 -0
  250. package/dist/lib/validators/route-validator.d.ts +3 -0
  251. package/dist/lib/validators/route-validator.d.ts.map +1 -0
  252. package/dist/lib/validators/route-validator.js +238 -0
  253. package/dist/lib/validators/route-validator.js.map +1 -0
  254. package/dist/lib/validators/scope-validator.d.ts +3 -0
  255. package/dist/lib/validators/scope-validator.d.ts.map +1 -0
  256. package/dist/lib/validators/scope-validator.js +141 -0
  257. package/dist/lib/validators/scope-validator.js.map +1 -0
  258. package/dist/lib/watch.d.ts +35 -0
  259. package/dist/lib/watch.d.ts.map +1 -0
  260. package/dist/lib/watch.js +171 -0
  261. package/dist/lib/watch.js.map +1 -0
  262. package/dist/templates/api/.env.example +15 -0
  263. package/dist/templates/api/Dockerfile +45 -0
  264. package/dist/templates/api/README.md +85 -0
  265. package/dist/templates/api/catalog-info.yaml +22 -0
  266. package/dist/templates/api/gitignore +31 -0
  267. package/dist/templates/api/helm/{{name}}/Chart.yaml +9 -0
  268. package/dist/templates/api/helm/{{name}}/templates/deployment.yaml +72 -0
  269. package/dist/templates/api/helm/{{name}}/templates/ingress.yaml +43 -0
  270. package/dist/templates/api/helm/{{name}}/templates/service.yaml +17 -0
  271. package/dist/templates/api/helm/{{name}}/values.yaml +64 -0
  272. package/dist/templates/api/package.json +33 -0
  273. package/dist/templates/api/src/index.ts +61 -0
  274. package/dist/templates/api/src/routes/example.ts +165 -0
  275. package/dist/templates/api/tsconfig.json +18 -0
  276. package/dist/templates/crosspod/README.md +87 -0
  277. package/dist/templates/crosspod/service-a/Dockerfile +27 -0
  278. package/dist/templates/crosspod/service-a/catalog-info.yaml +54 -0
  279. package/dist/templates/crosspod/service-a/gitignore +5 -0
  280. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/Chart.yaml +6 -0
  281. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/deployment.yaml +72 -0
  282. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/ingress.yaml +43 -0
  283. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/templates/service.yaml +17 -0
  284. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/values.yaml +44 -0
  285. package/dist/templates/crosspod/service-a/package.json +29 -0
  286. package/dist/templates/crosspod/service-a/src/index.ts +89 -0
  287. package/dist/templates/crosspod/service-a/tsconfig.json +14 -0
  288. package/dist/templates/crosspod/service-b/Dockerfile +27 -0
  289. package/dist/templates/crosspod/service-b/catalog-info.yaml +27 -0
  290. package/dist/templates/crosspod/service-b/gitignore +5 -0
  291. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/Chart.yaml +6 -0
  292. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/deployment.yaml +72 -0
  293. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/ingress.yaml +43 -0
  294. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/templates/service.yaml +17 -0
  295. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/values.yaml +47 -0
  296. package/dist/templates/crosspod/service-b/package.json +26 -0
  297. package/dist/templates/crosspod/service-b/src/index.ts +143 -0
  298. package/dist/templates/crosspod/service-b/tsconfig.json +14 -0
  299. package/dist/templates/mga/{{name}}-api/.env.example +5 -0
  300. package/dist/templates/mga/{{name}}-api/Dockerfile +45 -0
  301. package/dist/templates/mga/{{name}}-api/catalog-info.yaml +44 -0
  302. package/dist/templates/mga/{{name}}-api/gitignore +31 -0
  303. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/Chart.yaml +9 -0
  304. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/deployment.yaml +72 -0
  305. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/ingress.yaml +43 -0
  306. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/templates/service.yaml +17 -0
  307. package/dist/templates/mga/{{name}}-api/helm/{{name}}-api/values.yaml +65 -0
  308. package/dist/templates/mga/{{name}}-api/package.json +37 -0
  309. package/dist/templates/mga/{{name}}-api/src/index.ts +82 -0
  310. package/dist/templates/mga/{{name}}-api/src/lib/mongo.ts +19 -0
  311. package/dist/templates/mga/{{name}}-api/src/middleware/auth.ts +133 -0
  312. package/dist/templates/mga/{{name}}-api/src/models/agent.ts +45 -0
  313. package/dist/templates/mga/{{name}}-api/src/models/application.ts +58 -0
  314. package/dist/templates/mga/{{name}}-api/src/models/invite.ts +39 -0
  315. package/dist/templates/mga/{{name}}-api/src/models/policy.ts +59 -0
  316. package/dist/templates/mga/{{name}}-api/src/models/product.ts +51 -0
  317. package/dist/templates/mga/{{name}}-api/src/models/quote.ts +68 -0
  318. package/dist/templates/mga/{{name}}-api/src/routes/agents.ts +98 -0
  319. package/dist/templates/mga/{{name}}-api/src/routes/applications.ts +170 -0
  320. package/dist/templates/mga/{{name}}-api/src/routes/invites.ts +146 -0
  321. package/dist/templates/mga/{{name}}-api/src/routes/policies.ts +70 -0
  322. package/dist/templates/mga/{{name}}-api/src/routes/products.ts +154 -0
  323. package/dist/templates/mga/{{name}}-api/src/routes/quotes.ts +263 -0
  324. package/dist/templates/mga/{{name}}-api/src/routes/reports.ts +199 -0
  325. package/dist/templates/mga/{{name}}-api/tsconfig.json +18 -0
  326. package/dist/templates/mga/{{name}}-web/.dockerignore +6 -0
  327. package/dist/templates/mga/{{name}}-web/.env.example +6 -0
  328. package/dist/templates/mga/{{name}}-web/Dockerfile +51 -0
  329. package/dist/templates/mga/{{name}}-web/catalog-info.yaml +24 -0
  330. package/dist/templates/mga/{{name}}-web/dockerignore +6 -0
  331. package/dist/templates/mga/{{name}}-web/gitignore +36 -0
  332. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/Chart.yaml +9 -0
  333. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/_helpers.tpl +49 -0
  334. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/configmap.yaml +10 -0
  335. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/deployment.yaml +56 -0
  336. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/ingress.yaml +41 -0
  337. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/templates/service.yaml +15 -0
  338. package/dist/templates/mga/{{name}}-web/helm/{{name}}-web/values.yaml +70 -0
  339. package/dist/templates/mga/{{name}}-web/next.config.js +8 -0
  340. package/dist/templates/mga/{{name}}-web/package.json +30 -0
  341. package/dist/templates/mga/{{name}}-web/public/.gitkeep +0 -0
  342. package/dist/templates/mga/{{name}}-web/public/gitkeep +0 -0
  343. package/dist/templates/mga/{{name}}-web/src/app/api/auth/callback/route.ts +77 -0
  344. package/dist/templates/mga/{{name}}-web/src/app/api/auth/login/route.ts +16 -0
  345. package/dist/templates/mga/{{name}}-web/src/app/api/auth/logout/route.ts +7 -0
  346. package/dist/templates/mga/{{name}}-web/src/app/api/auth/session/route.ts +42 -0
  347. package/dist/templates/mga/{{name}}-web/src/app/api/health/route.ts +10 -0
  348. package/dist/templates/mga/{{name}}-web/src/app/api/proxy/applications/route.ts +47 -0
  349. package/dist/templates/mga/{{name}}-web/src/app/applications/layout.tsx +17 -0
  350. package/dist/templates/mga/{{name}}-web/src/app/applications/new/page.tsx +374 -0
  351. package/dist/templates/mga/{{name}}-web/src/app/applications/page.tsx +109 -0
  352. package/dist/templates/mga/{{name}}-web/src/app/dashboard/admin/page.tsx +179 -0
  353. package/dist/templates/mga/{{name}}-web/src/app/dashboard/agent/page.tsx +125 -0
  354. package/dist/templates/mga/{{name}}-web/src/app/dashboard/insured/page.tsx +145 -0
  355. package/dist/templates/mga/{{name}}-web/src/app/dashboard/layout.tsx +17 -0
  356. package/dist/templates/mga/{{name}}-web/src/app/dashboard/page.tsx +27 -0
  357. package/dist/templates/mga/{{name}}-web/src/app/dashboard/shell.tsx +89 -0
  358. package/dist/templates/mga/{{name}}-web/src/app/globals.css +477 -0
  359. package/dist/templates/mga/{{name}}-web/src/app/layout.tsx +19 -0
  360. package/dist/templates/mga/{{name}}-web/src/app/page.tsx +74 -0
  361. package/dist/templates/mga/{{name}}-web/src/app/reports/layout.tsx +21 -0
  362. package/dist/templates/mga/{{name}}-web/src/app/reports/page.tsx +231 -0
  363. package/dist/templates/mga/{{name}}-web/src/lib/api.ts +79 -0
  364. package/dist/templates/mga/{{name}}-web/src/lib/auth.ts +285 -0
  365. package/dist/templates/mga/{{name}}-web/src/middleware.ts +71 -0
  366. package/dist/templates/mga/{{name}}-web/tsconfig.json +26 -0
  367. package/dist/templates/nextjs/.env.example +11 -0
  368. package/dist/templates/nextjs/Dockerfile +51 -0
  369. package/dist/templates/nextjs/README.md +87 -0
  370. package/dist/templates/nextjs/catalog-info.yaml +16 -0
  371. package/dist/templates/nextjs/gitignore +36 -0
  372. package/dist/templates/nextjs/helm/{{name}}/Chart.yaml +9 -0
  373. package/dist/templates/nextjs/helm/{{name}}/templates/deployment.yaml +72 -0
  374. package/dist/templates/nextjs/helm/{{name}}/templates/ingress.yaml +43 -0
  375. package/dist/templates/nextjs/helm/{{name}}/templates/service.yaml +17 -0
  376. package/dist/templates/nextjs/helm/{{name}}/values.yaml +60 -0
  377. package/dist/templates/nextjs/next.config.js +23 -0
  378. package/dist/templates/nextjs/package.json +29 -0
  379. package/dist/templates/nextjs/public/.gitkeep +0 -0
  380. package/dist/templates/nextjs/public/gitkeep +0 -0
  381. package/dist/templates/nextjs/src/app/api/example/route.ts +63 -0
  382. package/dist/templates/nextjs/src/app/api/health/route.ts +10 -0
  383. package/dist/templates/nextjs/src/app/layout.tsx +18 -0
  384. package/dist/templates/nextjs/src/app/page.tsx +49 -0
  385. package/dist/templates/nextjs/tsconfig.json +26 -0
  386. package/dist/templates/nextjs-oauth/.dockerignore +6 -0
  387. package/dist/templates/nextjs-oauth/.env.example +12 -0
  388. package/dist/templates/nextjs-oauth/Dockerfile +51 -0
  389. package/dist/templates/nextjs-oauth/README.md +115 -0
  390. package/dist/templates/nextjs-oauth/catalog-info.yaml +17 -0
  391. package/dist/templates/nextjs-oauth/dockerignore +6 -0
  392. package/dist/templates/nextjs-oauth/gitignore +36 -0
  393. package/dist/templates/nextjs-oauth/helm/Chart.yaml +6 -0
  394. package/dist/templates/nextjs-oauth/helm/templates/_helpers.tpl +49 -0
  395. package/dist/templates/nextjs-oauth/helm/templates/configmap.yaml +10 -0
  396. package/dist/templates/nextjs-oauth/helm/templates/deployment.yaml +56 -0
  397. package/dist/templates/nextjs-oauth/helm/templates/ingress.yaml +41 -0
  398. package/dist/templates/nextjs-oauth/helm/templates/service.yaml +15 -0
  399. package/dist/templates/nextjs-oauth/helm/values.yaml +69 -0
  400. package/dist/templates/nextjs-oauth/helm/{{name}}/Chart.yaml +9 -0
  401. package/dist/templates/nextjs-oauth/helm/{{name}}/templates/deployment.yaml +68 -0
  402. package/dist/templates/nextjs-oauth/helm/{{name}}/templates/service.yaml +17 -0
  403. package/dist/templates/nextjs-oauth/helm/{{name}}/values.yaml +51 -0
  404. package/dist/templates/nextjs-oauth/next.config.js +23 -0
  405. package/dist/templates/nextjs-oauth/package.json +30 -0
  406. package/dist/templates/nextjs-oauth/public/.gitkeep +0 -0
  407. package/dist/templates/nextjs-oauth/public/gitkeep +0 -0
  408. package/dist/templates/nextjs-oauth/src/app/api/auth/callback/route.ts +77 -0
  409. package/dist/templates/nextjs-oauth/src/app/api/auth/login/route.ts +16 -0
  410. package/dist/templates/nextjs-oauth/src/app/api/auth/logout/route.ts +7 -0
  411. package/dist/templates/nextjs-oauth/src/app/api/auth/session/route.ts +42 -0
  412. package/dist/templates/nextjs-oauth/src/app/api/example/route.ts +63 -0
  413. package/dist/templates/nextjs-oauth/src/app/api/health/route.ts +10 -0
  414. package/dist/templates/nextjs-oauth/src/app/dashboard/page.tsx +92 -0
  415. package/dist/templates/nextjs-oauth/src/app/layout.tsx +18 -0
  416. package/dist/templates/nextjs-oauth/src/app/page.tsx +110 -0
  417. package/dist/templates/nextjs-oauth/src/lib/auth.ts +285 -0
  418. package/dist/templates/nextjs-oauth/src/middleware.ts +71 -0
  419. package/dist/templates/nextjs-oauth/tsconfig.json +26 -0
  420. package/dist/templates/static/catalog-info.yaml +14 -0
  421. package/dist/templates/static/index.html +16 -0
  422. package/dist/templates/static/styles.css +39 -0
  423. package/dist/templates/worker/.env.example +13 -0
  424. package/dist/templates/worker/Dockerfile +26 -0
  425. package/dist/templates/worker/README.md +106 -0
  426. package/dist/templates/worker/catalog-info.yaml +19 -0
  427. package/dist/templates/worker/gitignore +5 -0
  428. package/dist/templates/worker/helm/{{name}}/Chart.yaml +9 -0
  429. package/dist/templates/worker/helm/{{name}}/templates/deployment.yaml +68 -0
  430. package/dist/templates/worker/helm/{{name}}/templates/ingress.yaml +43 -0
  431. package/dist/templates/worker/helm/{{name}}/values.yaml +64 -0
  432. package/dist/templates/worker/package.json +26 -0
  433. package/dist/templates/worker/src/index.ts +185 -0
  434. package/dist/templates/worker/tsconfig.json +14 -0
  435. package/dist/types/index.d.ts +596 -0
  436. package/dist/types/index.d.ts.map +1 -0
  437. package/dist/types/index.js +41 -0
  438. package/dist/types/index.js.map +1 -0
  439. package/dist/types/platform.d.ts +191 -0
  440. package/dist/types/platform.d.ts.map +1 -0
  441. package/dist/types/platform.js +17 -0
  442. package/dist/types/platform.js.map +1 -0
  443. package/package.json +62 -0
@@ -0,0 +1,170 @@
1
+ import { exec } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { readFile } from 'node:fs/promises';
4
+ import { join } from 'node:path';
5
+ import { parse } from 'yaml';
6
+ import { loadConfig, expandPath, loadLinkedService } from '../lib/config.js';
7
+ import { BuilderClient } from '../lib/builder.js';
8
+ import { log, formatTable, spinner } from '../lib/output.js';
9
+ const execAsync = promisify(exec);
10
+ export async function statusCommand(options) {
11
+ // If specific build ID provided, show that build's status
12
+ if (options.build) {
13
+ await showBuildStatus(options.build);
14
+ return;
15
+ }
16
+ // Get service info
17
+ const linkedService = await loadLinkedService();
18
+ let serviceName = options.service;
19
+ if (!serviceName && linkedService) {
20
+ serviceName = linkedService.serviceName;
21
+ }
22
+ if (!serviceName) {
23
+ try {
24
+ const catalogPath = join(process.cwd(), 'catalog-info.yaml');
25
+ const content = await readFile(catalogPath, 'utf-8');
26
+ const catalogInfo = parse(content);
27
+ serviceName = catalogInfo.metadata.name;
28
+ }
29
+ catch {
30
+ log.error('No service specified');
31
+ log.dim('Use --service <name> or run from a linked service directory');
32
+ process.exit(1);
33
+ }
34
+ }
35
+ // Show service and recent builds
36
+ await showServiceStatus(serviceName, linkedService?.serviceId);
37
+ // Optionally show K8s pod status
38
+ if (options.pods) {
39
+ log.info('');
40
+ await showPodStatus(serviceName, options.namespace || 'iec-platform');
41
+ }
42
+ }
43
+ async function showBuildStatus(buildId) {
44
+ const builder = await BuilderClient.create();
45
+ const sp = spinner('Fetching build');
46
+ const result = await builder.getBuild(buildId);
47
+ sp.stop(true);
48
+ if (!result.success || !result.data) {
49
+ log.error(`Build not found: ${result.error?.message || 'Unknown error'}`);
50
+ process.exit(1);
51
+ }
52
+ const build = result.data;
53
+ printBuildDetails(build);
54
+ }
55
+ async function showServiceStatus(serviceName, serviceId) {
56
+ const builder = await BuilderClient.create();
57
+ log.info(`Service: ${serviceName}`);
58
+ log.info('');
59
+ // Get service details from builder
60
+ const serviceResult = await builder.getService(serviceId || serviceName);
61
+ if (serviceResult.success && serviceResult.data) {
62
+ const service = serviceResult.data;
63
+ log.dim(` Repo: ${service.repoUrl}`);
64
+ log.dim(` Branch: ${service.branch}`);
65
+ log.dim(` Dockerfile: ${service.dockerfilePath}`);
66
+ }
67
+ else {
68
+ log.warning('Service not registered with iec-builder');
69
+ log.dim('Run "iec link" to register');
70
+ return;
71
+ }
72
+ // Get recent builds
73
+ log.info('');
74
+ log.info('Recent builds:');
75
+ const buildsResult = await builder.listBuilds(serviceId || serviceName);
76
+ if (!buildsResult.success || !buildsResult.data || buildsResult.data.length === 0) {
77
+ log.dim(' No builds yet');
78
+ log.dim(' Run "iec deploy" to trigger a build');
79
+ return;
80
+ }
81
+ const builds = buildsResult.data.slice(0, 5);
82
+ const rows = builds.map(b => [
83
+ b.id.substring(0, 8),
84
+ formatStatus(b.status),
85
+ b.branch,
86
+ b.commitSha?.substring(0, 7) || '-',
87
+ formatTime(b.createdAt),
88
+ ]);
89
+ console.log(formatTable(['BUILD', 'STATUS', 'BRANCH', 'COMMIT', 'CREATED'], rows));
90
+ }
91
+ async function showPodStatus(serviceName, namespace) {
92
+ const config = await loadConfig();
93
+ const kubeconfigPath = expandPath(config.kubeconfig || '~/.kube/config');
94
+ log.info('Kubernetes pods:');
95
+ try {
96
+ const podsCmd = `kubectl get pods -n ${namespace} -l app=${serviceName} -o json --kubeconfig ${kubeconfigPath}`;
97
+ const { stdout: podsJson } = await execAsync(podsCmd);
98
+ const pods = JSON.parse(podsJson);
99
+ if (pods.items.length === 0) {
100
+ log.dim(' No pods found');
101
+ return;
102
+ }
103
+ const podRows = pods.items.map((pod) => [
104
+ pod.metadata.name,
105
+ pod.status.phase,
106
+ pod.status.containerStatuses?.[0]?.ready ? 'Ready' : 'Not Ready',
107
+ String(pod.status.containerStatuses?.[0]?.restartCount || 0),
108
+ ]);
109
+ console.log(formatTable(['POD', 'PHASE', 'READY', 'RESTARTS'], podRows));
110
+ }
111
+ catch (error) {
112
+ if (error instanceof Error) {
113
+ log.warning(`Could not get pod status: ${error.message}`);
114
+ }
115
+ }
116
+ }
117
+ function printBuildDetails(build) {
118
+ log.info(`Build: ${build.id}`);
119
+ log.info('');
120
+ log.info(` Status: ${formatStatus(build.status)}`);
121
+ log.info(` Branch: ${build.branch}`);
122
+ if (build.commitSha) {
123
+ log.info(` Commit: ${build.commitSha.substring(0, 7)}`);
124
+ }
125
+ if (build.commitMessage) {
126
+ log.info(` Message: ${build.commitMessage.substring(0, 60)}`);
127
+ }
128
+ if (build.imageTag) {
129
+ log.info(` Image: ${build.imageTag}`);
130
+ }
131
+ if (build.startedAt) {
132
+ log.info(` Started: ${new Date(build.startedAt).toLocaleString()}`);
133
+ }
134
+ if (build.completedAt) {
135
+ log.info(` Completed: ${new Date(build.completedAt).toLocaleString()}`);
136
+ }
137
+ if (build.error) {
138
+ log.info('');
139
+ log.error(`Error: ${build.error}`);
140
+ }
141
+ }
142
+ function formatStatus(status) {
143
+ const colors = {
144
+ queued: (s) => `\x1b[33m${s}\x1b[0m`, // yellow
145
+ cloning: (s) => `\x1b[36m${s}\x1b[0m`, // cyan
146
+ building: (s) => `\x1b[36m${s}\x1b[0m`, // cyan
147
+ pushing: (s) => `\x1b[36m${s}\x1b[0m`, // cyan
148
+ deploying: (s) => `\x1b[35m${s}\x1b[0m`, // magenta
149
+ completed: (s) => `\x1b[32m${s}\x1b[0m`, // green
150
+ failed: (s) => `\x1b[31m${s}\x1b[0m`, // red
151
+ };
152
+ const colorFn = colors[status] || ((s) => s);
153
+ return colorFn(status);
154
+ }
155
+ function formatTime(isoString) {
156
+ const date = new Date(isoString);
157
+ const now = new Date();
158
+ const diffMs = now.getTime() - date.getTime();
159
+ const diffMins = Math.floor(diffMs / 60000);
160
+ if (diffMins < 1)
161
+ return 'just now';
162
+ if (diffMins < 60)
163
+ return `${diffMins}m ago`;
164
+ const diffHours = Math.floor(diffMins / 60);
165
+ if (diffHours < 24)
166
+ return `${diffHours}h ago`;
167
+ const diffDays = Math.floor(diffHours / 24);
168
+ return `${diffDays}d ago`;
169
+ }
170
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Environment } from '../types/index.js';
2
+ interface TroubleshootOptions {
3
+ service?: string;
4
+ env?: Environment;
5
+ prod?: boolean;
6
+ sandbox?: boolean;
7
+ uat?: boolean;
8
+ quick?: boolean;
9
+ fix?: boolean;
10
+ lines?: string;
11
+ since?: string;
12
+ json?: boolean;
13
+ }
14
+ /**
15
+ * Main troubleshoot command
16
+ */
17
+ export declare function troubleshootCommand(options: TroubleshootOptions): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=troubleshoot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"troubleshoot.d.ts","sourceRoot":"","sources":["../../src/commands/troubleshoot.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAEV,WAAW,EAKZ,MAAM,mBAAmB,CAAA;AAE1B,UAAU,mBAAmB;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;CACf;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GrF"}
@@ -0,0 +1,465 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { parse } from 'yaml';
4
+ import { createInterface } from 'node:readline';
5
+ import chalk from 'chalk';
6
+ import { loadLinkedService } from '../lib/config.js';
7
+ import { BuilderClient } from '../lib/builder.js';
8
+ import { KokoClient } from '../lib/api.js';
9
+ import { log, spinner } from '../lib/output.js';
10
+ import { fetchLogs, getPodStatus, getRecentEvents, } from '../lib/troubleshoot/log-fetcher.js';
11
+ import { analyzeLogs, quickAnalysis, } from '../lib/troubleshoot/analyzer.js';
12
+ import { previewFix, applyFix, formatPreview, getAutoFixableRecommendations, explainFix, } from '../lib/troubleshoot/auto-fix.js';
13
+ /**
14
+ * Main troubleshoot command
15
+ */
16
+ export async function troubleshootCommand(options) {
17
+ const environment = resolveEnvironment(options);
18
+ const tailLines = parseInt(options.lines || '500', 10);
19
+ // Get service name
20
+ let serviceName;
21
+ try {
22
+ serviceName = await getServiceName(options);
23
+ }
24
+ catch (error) {
25
+ log.error(error.message);
26
+ process.exit(1);
27
+ }
28
+ console.log('');
29
+ log.info(`${chalk.bold('Troubleshooting')} ${chalk.cyan(serviceName)} ${chalk.dim(`(${environment})`)}`);
30
+ console.log('');
31
+ // Gather context
32
+ const contextSpinner = spinner('Gathering service context');
33
+ let context;
34
+ try {
35
+ context = await gatherContext(serviceName, environment);
36
+ contextSpinner.stop(true);
37
+ }
38
+ catch (error) {
39
+ contextSpinner.stop(false);
40
+ log.error(`Failed to gather context: ${error.message}`);
41
+ process.exit(1);
42
+ }
43
+ // Display context summary
44
+ displayContextSummary(context);
45
+ // Fetch logs
46
+ const logsSpinner = spinner('Fetching logs from services');
47
+ try {
48
+ const timeline = await fetchLogs({
49
+ serviceName,
50
+ namespace: `${serviceName}-${environment}`,
51
+ environment,
52
+ tailLines,
53
+ since: options.since,
54
+ includeJanus: true,
55
+ includeDependencies: true,
56
+ });
57
+ logsSpinner.stop(true);
58
+ log.dim(` Collected ${timeline.entries.length} log entries from ${timeline.services.length} services`);
59
+ console.log('');
60
+ // Analyze logs
61
+ let result;
62
+ if (options.quick) {
63
+ // Quick pattern-matching analysis
64
+ log.info('Running quick analysis...');
65
+ const issues = quickAnalysis(timeline, context);
66
+ result = {
67
+ timestamp: new Date().toISOString(),
68
+ service: serviceName,
69
+ environment,
70
+ status: determineStatus(issues),
71
+ issues,
72
+ recommendations: generateQuickRecommendations(issues),
73
+ context,
74
+ };
75
+ }
76
+ else {
77
+ // Full AI analysis
78
+ const analysisSpinner = spinner('Analyzing with AI');
79
+ try {
80
+ result = await analyzeLogs(timeline, context, environment);
81
+ analysisSpinner.stop(true);
82
+ }
83
+ catch (error) {
84
+ analysisSpinner.stop(false);
85
+ log.warning('AI analysis failed, falling back to quick analysis');
86
+ const issues = quickAnalysis(timeline, context);
87
+ result = {
88
+ timestamp: new Date().toISOString(),
89
+ service: serviceName,
90
+ environment,
91
+ status: determineStatus(issues),
92
+ issues,
93
+ recommendations: generateQuickRecommendations(issues),
94
+ context,
95
+ };
96
+ }
97
+ }
98
+ // Output results
99
+ if (options.json) {
100
+ console.log(JSON.stringify(result, null, 2));
101
+ return;
102
+ }
103
+ displayResults(result);
104
+ // Offer auto-fix if requested
105
+ if (options.fix && result.recommendations.length > 0) {
106
+ await handleAutoFix(result.recommendations);
107
+ }
108
+ else if (result.recommendations.some((r) => r.autoFixAvailable)) {
109
+ console.log('');
110
+ log.dim('Run with --fix to apply recommended fixes automatically');
111
+ }
112
+ }
113
+ catch (error) {
114
+ logsSpinner.stop(false);
115
+ log.error(`Failed to fetch logs: ${error.message}`);
116
+ process.exit(1);
117
+ }
118
+ }
119
+ /**
120
+ * Resolve environment from options
121
+ */
122
+ function resolveEnvironment(options) {
123
+ if (options.prod)
124
+ return 'prod';
125
+ if (options.uat)
126
+ return 'uat';
127
+ if (options.env)
128
+ return options.env;
129
+ return 'sandbox';
130
+ }
131
+ /**
132
+ * Get service name from options or project config
133
+ */
134
+ async function getServiceName(options) {
135
+ if (options.service) {
136
+ return options.service;
137
+ }
138
+ // Try linked service
139
+ const linkedService = await loadLinkedService();
140
+ if (linkedService) {
141
+ return linkedService.serviceName;
142
+ }
143
+ // Try catalog-info.yaml
144
+ try {
145
+ const catalogPath = join(process.cwd(), 'catalog-info.yaml');
146
+ const content = await readFile(catalogPath, 'utf-8');
147
+ const catalogInfo = parse(content);
148
+ return catalogInfo.metadata.name;
149
+ }
150
+ catch {
151
+ throw new Error('Could not determine service name. Use --service <name> or run from a service directory.');
152
+ }
153
+ }
154
+ /**
155
+ * Gather context about the service
156
+ */
157
+ async function gatherContext(serviceName, environment) {
158
+ const context = {
159
+ service: {
160
+ name: serviceName,
161
+ },
162
+ recentBuilds: [],
163
+ dependencies: [],
164
+ };
165
+ // Get service info from Koko
166
+ try {
167
+ const koko = await KokoClient.create();
168
+ const serviceResult = await koko.getService(serviceName);
169
+ if (serviceResult.success && serviceResult.data) {
170
+ context.service.id = serviceResult.data.id;
171
+ context.service.upstream = serviceResult.data.upstream;
172
+ context.service.routes = serviceResult.data.routes;
173
+ }
174
+ }
175
+ catch {
176
+ // Continue without Koko data
177
+ }
178
+ // Get recent builds
179
+ try {
180
+ const builder = await BuilderClient.create();
181
+ const buildsResult = await builder.listBuilds(serviceName);
182
+ if (buildsResult.success && buildsResult.data) {
183
+ context.recentBuilds = buildsResult.data.slice(0, 5).map((b) => ({
184
+ id: b.id.substring(0, 8),
185
+ status: b.status,
186
+ createdAt: b.createdAt,
187
+ }));
188
+ }
189
+ }
190
+ catch {
191
+ // Continue without build data
192
+ }
193
+ // Get pod status
194
+ try {
195
+ context.podStatus = await getPodStatus(serviceName, environment);
196
+ }
197
+ catch {
198
+ // Continue without pod status
199
+ }
200
+ // Get recent events
201
+ try {
202
+ context.recentEvents = await getRecentEvents(serviceName, environment);
203
+ }
204
+ catch {
205
+ // Continue without events
206
+ }
207
+ return context;
208
+ }
209
+ /**
210
+ * Display context summary
211
+ */
212
+ function displayContextSummary(context) {
213
+ log.dim('Context:');
214
+ if (context.service.upstream) {
215
+ log.dim(` Upstream: ${context.service.upstream}`);
216
+ }
217
+ if (context.recentBuilds.length > 0) {
218
+ const latestBuild = context.recentBuilds[0];
219
+ log.dim(` Latest build: ${latestBuild.id} (${latestBuild.status})`);
220
+ }
221
+ if (context.podStatus && context.podStatus.length > 0) {
222
+ const runningPods = context.podStatus.filter((p) => p.status === 'Running').length;
223
+ const totalRestarts = context.podStatus.reduce((sum, p) => sum + p.restarts, 0);
224
+ log.dim(` Pods: ${runningPods}/${context.podStatus.length} running, ${totalRestarts} total restarts`);
225
+ }
226
+ console.log('');
227
+ }
228
+ /**
229
+ * Determine overall status from issues
230
+ */
231
+ function determineStatus(issues) {
232
+ if (issues.length === 0)
233
+ return 'healthy';
234
+ if (issues.some((i) => i.severity === 'critical'))
235
+ return 'unhealthy';
236
+ if (issues.some((i) => i.severity === 'high'))
237
+ return 'degraded';
238
+ return 'degraded';
239
+ }
240
+ /**
241
+ * Generate recommendations from quick analysis issues
242
+ */
243
+ function generateQuickRecommendations(issues) {
244
+ const recommendations = [];
245
+ let priority = 1;
246
+ for (const issue of issues) {
247
+ switch (issue.type) {
248
+ case 'missing_scope':
249
+ recommendations.push({
250
+ id: `rec-${priority}`,
251
+ priority: priority++,
252
+ title: 'Add required OAuth scope',
253
+ description: 'Add the missing scope to catalog-info.yaml and re-register the service.',
254
+ action: {
255
+ type: 'add_scope',
256
+ scope: 'read:unknown', // Would need to parse from evidence
257
+ service: issue.affectedService,
258
+ },
259
+ autoFixAvailable: false, // Need scope name from logs
260
+ estimatedImpact: 'Enables cross-service API calls',
261
+ });
262
+ break;
263
+ case 'oom_killed':
264
+ recommendations.push({
265
+ id: `rec-${priority}`,
266
+ priority: priority++,
267
+ title: 'Increase memory limit',
268
+ description: 'The container is running out of memory. Increase the memory limit in Helm values.',
269
+ action: {
270
+ type: 'increase_memory',
271
+ currentLimit: '256Mi',
272
+ suggestedLimit: '512Mi',
273
+ },
274
+ autoFixAvailable: true,
275
+ estimatedImpact: 'Prevents OOMKilled crashes',
276
+ });
277
+ break;
278
+ case 'crash_loop':
279
+ recommendations.push({
280
+ id: `rec-${priority}`,
281
+ priority: priority++,
282
+ title: 'Check application startup',
283
+ description: 'Review application logs for startup errors and fix the root cause.',
284
+ action: {
285
+ type: 'manual',
286
+ instructions: 'Check logs with "iec logs" and fix any startup errors.',
287
+ },
288
+ autoFixAvailable: false,
289
+ estimatedImpact: 'Stabilizes pod lifecycle',
290
+ });
291
+ break;
292
+ case 'health_check_failure':
293
+ recommendations.push({
294
+ id: `rec-${priority}`,
295
+ priority: priority++,
296
+ title: 'Fix health endpoint',
297
+ description: 'The /health endpoint is not responding correctly.',
298
+ action: {
299
+ type: 'fix_health_endpoint',
300
+ path: '/health',
301
+ },
302
+ autoFixAvailable: false,
303
+ estimatedImpact: 'Prevents unnecessary pod restarts',
304
+ });
305
+ break;
306
+ case 'connection_refused':
307
+ recommendations.push({
308
+ id: `rec-${priority}`,
309
+ priority: priority++,
310
+ title: 'Check upstream service',
311
+ description: 'The upstream service is not reachable. Verify it is deployed and running.',
312
+ action: {
313
+ type: 'check_upstream',
314
+ upstream: 'unknown',
315
+ },
316
+ autoFixAvailable: false,
317
+ estimatedImpact: 'Restores service connectivity',
318
+ });
319
+ break;
320
+ case 'rate_limited':
321
+ recommendations.push({
322
+ id: `rec-${priority}`,
323
+ priority: priority++,
324
+ title: 'Implement request backoff',
325
+ description: 'Add exponential backoff to requests that are being rate limited.',
326
+ action: {
327
+ type: 'manual',
328
+ instructions: 'Implement retry logic with exponential backoff in your API client.',
329
+ },
330
+ autoFixAvailable: false,
331
+ estimatedImpact: 'Prevents cascading failures',
332
+ });
333
+ break;
334
+ }
335
+ }
336
+ return recommendations;
337
+ }
338
+ /**
339
+ * Display analysis results
340
+ */
341
+ function displayResults(result) {
342
+ // Status header
343
+ const statusColor = {
344
+ healthy: chalk.green,
345
+ degraded: chalk.yellow,
346
+ unhealthy: chalk.red,
347
+ };
348
+ const statusIcon = {
349
+ healthy: '[OK]',
350
+ degraded: '[!]',
351
+ unhealthy: '[X]',
352
+ };
353
+ console.log(statusColor[result.status](`${statusIcon[result.status]} Status: ${result.status.toUpperCase()}`));
354
+ console.log('');
355
+ // Issues
356
+ if (result.issues.length === 0) {
357
+ log.success('No issues detected');
358
+ }
359
+ else {
360
+ log.info(`Found ${result.issues.length} issue(s):`);
361
+ console.log('');
362
+ for (const issue of result.issues) {
363
+ const severityColor = {
364
+ critical: chalk.red,
365
+ high: chalk.yellow,
366
+ medium: chalk.cyan,
367
+ low: chalk.dim,
368
+ };
369
+ console.log(` ${severityColor[issue.severity](`[${issue.severity.toUpperCase()}]`)} ${chalk.bold(issue.title)}`);
370
+ console.log(` ${issue.description}`);
371
+ if (issue.evidence.length > 0) {
372
+ console.log(chalk.dim(' Evidence:'));
373
+ for (const ev of issue.evidence.slice(0, 3)) {
374
+ console.log(chalk.dim(` - ${ev.substring(0, 100)}${ev.length > 100 ? '...' : ''}`));
375
+ }
376
+ }
377
+ console.log('');
378
+ }
379
+ }
380
+ // Recommendations
381
+ if (result.recommendations.length > 0) {
382
+ console.log(chalk.cyan.bold('Recommendations:'));
383
+ console.log('');
384
+ for (const rec of result.recommendations) {
385
+ const autoFixBadge = rec.autoFixAvailable
386
+ ? chalk.green(' [auto-fix]')
387
+ : '';
388
+ console.log(` ${chalk.bold(`${rec.priority}.`)} ${rec.title}${autoFixBadge}`);
389
+ console.log(` ${rec.description}`);
390
+ console.log(chalk.dim(` Impact: ${rec.estimatedImpact}`));
391
+ console.log('');
392
+ }
393
+ }
394
+ }
395
+ /**
396
+ * Handle auto-fix flow
397
+ */
398
+ async function handleAutoFix(recommendations) {
399
+ const autoFixable = getAutoFixableRecommendations(recommendations);
400
+ if (autoFixable.length === 0) {
401
+ log.warning('No auto-fixable recommendations available');
402
+ return;
403
+ }
404
+ console.log('');
405
+ log.info(`${autoFixable.length} fix(es) can be applied automatically:`);
406
+ console.log('');
407
+ for (const rec of autoFixable) {
408
+ console.log(` ${rec.priority}. ${rec.title}`);
409
+ console.log(` ${explainFix(rec.action)}`);
410
+ }
411
+ console.log('');
412
+ // Prompt for confirmation
413
+ const rl = createInterface({
414
+ input: process.stdin,
415
+ output: process.stdout,
416
+ });
417
+ const answer = await new Promise((resolve) => {
418
+ rl.question(chalk.yellow('Apply these fixes? [y/N/number to select]: '), (ans) => {
419
+ rl.close();
420
+ resolve(ans.trim().toLowerCase());
421
+ });
422
+ });
423
+ if (answer === '' || answer === 'n' || answer === 'no') {
424
+ log.dim('No fixes applied');
425
+ return;
426
+ }
427
+ const toApply = [];
428
+ if (answer === 'y' || answer === 'yes') {
429
+ toApply.push(...autoFixable);
430
+ }
431
+ else {
432
+ const num = parseInt(answer, 10);
433
+ if (!isNaN(num)) {
434
+ const selected = autoFixable.find((r) => r.priority === num);
435
+ if (selected) {
436
+ toApply.push(selected);
437
+ }
438
+ }
439
+ }
440
+ if (toApply.length === 0) {
441
+ log.dim('No fixes selected');
442
+ return;
443
+ }
444
+ // Apply fixes
445
+ for (const rec of toApply) {
446
+ console.log('');
447
+ log.info(`Applying: ${rec.title}`);
448
+ try {
449
+ const preview = await previewFix(rec);
450
+ console.log(formatPreview(preview));
451
+ console.log('');
452
+ const applyResult = await applyFix(preview);
453
+ if (applyResult.success) {
454
+ log.success('Fix applied successfully');
455
+ }
456
+ else {
457
+ log.error(`Failed: ${applyResult.error}`);
458
+ }
459
+ }
460
+ catch (error) {
461
+ log.error(`Failed to apply fix: ${error.message}`);
462
+ }
463
+ }
464
+ }
465
+ //# sourceMappingURL=troubleshoot.js.map