@insureco/cli 0.1.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 (174) hide show
  1. package/README.md +168 -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 +10 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +41 -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 +219 -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/env.d.ts +7 -0
  19. package/dist/commands/env.d.ts.map +1 -0
  20. package/dist/commands/env.js +42 -0
  21. package/dist/commands/env.js.map +1 -0
  22. package/dist/commands/init-ai.d.ts +7 -0
  23. package/dist/commands/init-ai.d.ts.map +1 -0
  24. package/dist/commands/init-ai.js +257 -0
  25. package/dist/commands/init-ai.js.map +1 -0
  26. package/dist/commands/init.d.ts +8 -0
  27. package/dist/commands/init.d.ts.map +1 -0
  28. package/dist/commands/init.js +228 -0
  29. package/dist/commands/init.js.map +1 -0
  30. package/dist/commands/link.d.ts +10 -0
  31. package/dist/commands/link.d.ts.map +1 -0
  32. package/dist/commands/link.js +193 -0
  33. package/dist/commands/link.js.map +1 -0
  34. package/dist/commands/login.d.ts +8 -0
  35. package/dist/commands/login.d.ts.map +1 -0
  36. package/dist/commands/login.js +164 -0
  37. package/dist/commands/login.js.map +1 -0
  38. package/dist/commands/logs.d.ts +16 -0
  39. package/dist/commands/logs.d.ts.map +1 -0
  40. package/dist/commands/logs.js +362 -0
  41. package/dist/commands/logs.js.map +1 -0
  42. package/dist/commands/preflight.d.ts +8 -0
  43. package/dist/commands/preflight.d.ts.map +1 -0
  44. package/dist/commands/preflight.js +188 -0
  45. package/dist/commands/preflight.js.map +1 -0
  46. package/dist/commands/program.d.ts +7 -0
  47. package/dist/commands/program.d.ts.map +1 -0
  48. package/dist/commands/program.js +59 -0
  49. package/dist/commands/program.js.map +1 -0
  50. package/dist/commands/push.d.ts +12 -0
  51. package/dist/commands/push.d.ts.map +1 -0
  52. package/dist/commands/push.js +171 -0
  53. package/dist/commands/push.js.map +1 -0
  54. package/dist/commands/register.d.ts +7 -0
  55. package/dist/commands/register.d.ts.map +1 -0
  56. package/dist/commands/register.js +124 -0
  57. package/dist/commands/register.js.map +1 -0
  58. package/dist/commands/rollback.d.ts +11 -0
  59. package/dist/commands/rollback.d.ts.map +1 -0
  60. package/dist/commands/rollback.js +172 -0
  61. package/dist/commands/rollback.js.map +1 -0
  62. package/dist/commands/sample.d.ts +11 -0
  63. package/dist/commands/sample.d.ts.map +1 -0
  64. package/dist/commands/sample.js +114 -0
  65. package/dist/commands/sample.js.map +1 -0
  66. package/dist/commands/services.d.ts +13 -0
  67. package/dist/commands/services.d.ts.map +1 -0
  68. package/dist/commands/services.js +95 -0
  69. package/dist/commands/services.js.map +1 -0
  70. package/dist/commands/status.d.ts +9 -0
  71. package/dist/commands/status.d.ts.map +1 -0
  72. package/dist/commands/status.js +170 -0
  73. package/dist/commands/status.js.map +1 -0
  74. package/dist/commands/troubleshoot.d.ts +19 -0
  75. package/dist/commands/troubleshoot.d.ts.map +1 -0
  76. package/dist/commands/troubleshoot.js +465 -0
  77. package/dist/commands/troubleshoot.js.map +1 -0
  78. package/dist/commands/versions.d.ts +16 -0
  79. package/dist/commands/versions.d.ts.map +1 -0
  80. package/dist/commands/versions.js +162 -0
  81. package/dist/commands/versions.js.map +1 -0
  82. package/dist/index.d.ts +3 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +294 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/lib/ai/client.d.ts +36 -0
  87. package/dist/lib/ai/client.d.ts.map +1 -0
  88. package/dist/lib/ai/client.js +140 -0
  89. package/dist/lib/ai/client.js.map +1 -0
  90. package/dist/lib/ai/generator.d.ts +17 -0
  91. package/dist/lib/ai/generator.d.ts.map +1 -0
  92. package/dist/lib/ai/generator.js +338 -0
  93. package/dist/lib/ai/generator.js.map +1 -0
  94. package/dist/lib/ai/prompts.d.ts +47 -0
  95. package/dist/lib/ai/prompts.d.ts.map +1 -0
  96. package/dist/lib/ai/prompts.js +247 -0
  97. package/dist/lib/ai/prompts.js.map +1 -0
  98. package/dist/lib/ai/scanner.d.ts +50 -0
  99. package/dist/lib/ai/scanner.d.ts.map +1 -0
  100. package/dist/lib/ai/scanner.js +237 -0
  101. package/dist/lib/ai/scanner.js.map +1 -0
  102. package/dist/lib/api.d.ts +18 -0
  103. package/dist/lib/api.d.ts.map +1 -0
  104. package/dist/lib/api.js +67 -0
  105. package/dist/lib/api.js.map +1 -0
  106. package/dist/lib/builder.d.ts +34 -0
  107. package/dist/lib/builder.d.ts.map +1 -0
  108. package/dist/lib/builder.js +132 -0
  109. package/dist/lib/builder.js.map +1 -0
  110. package/dist/lib/config.d.ts +20 -0
  111. package/dist/lib/config.d.ts.map +1 -0
  112. package/dist/lib/config.js +124 -0
  113. package/dist/lib/config.js.map +1 -0
  114. package/dist/lib/output.d.ts +12 -0
  115. package/dist/lib/output.d.ts.map +1 -0
  116. package/dist/lib/output.js +39 -0
  117. package/dist/lib/output.js.map +1 -0
  118. package/dist/lib/scaffold.d.ts +29 -0
  119. package/dist/lib/scaffold.d.ts.map +1 -0
  120. package/dist/lib/scaffold.js +166 -0
  121. package/dist/lib/scaffold.js.map +1 -0
  122. package/dist/lib/troubleshoot/analyzer.d.ts +14 -0
  123. package/dist/lib/troubleshoot/analyzer.d.ts.map +1 -0
  124. package/dist/lib/troubleshoot/analyzer.js +541 -0
  125. package/dist/lib/troubleshoot/analyzer.js.map +1 -0
  126. package/dist/lib/troubleshoot/auto-fix.d.ts +29 -0
  127. package/dist/lib/troubleshoot/auto-fix.d.ts.map +1 -0
  128. package/dist/lib/troubleshoot/auto-fix.js +373 -0
  129. package/dist/lib/troubleshoot/auto-fix.js.map +1 -0
  130. package/dist/lib/troubleshoot/index.d.ts +5 -0
  131. package/dist/lib/troubleshoot/index.d.ts.map +1 -0
  132. package/dist/lib/troubleshoot/index.js +6 -0
  133. package/dist/lib/troubleshoot/index.js.map +1 -0
  134. package/dist/lib/troubleshoot/log-fetcher.d.ts +43 -0
  135. package/dist/lib/troubleshoot/log-fetcher.d.ts.map +1 -0
  136. package/dist/lib/troubleshoot/log-fetcher.js +431 -0
  137. package/dist/lib/troubleshoot/log-fetcher.js.map +1 -0
  138. package/dist/lib/troubleshoot/redactor.d.ts +35 -0
  139. package/dist/lib/troubleshoot/redactor.d.ts.map +1 -0
  140. package/dist/lib/troubleshoot/redactor.js +208 -0
  141. package/dist/lib/troubleshoot/redactor.js.map +1 -0
  142. package/dist/lib/validators/catalog-validator.d.ts +3 -0
  143. package/dist/lib/validators/catalog-validator.d.ts.map +1 -0
  144. package/dist/lib/validators/catalog-validator.js +205 -0
  145. package/dist/lib/validators/catalog-validator.js.map +1 -0
  146. package/dist/lib/validators/dockerfile-validator.d.ts +4 -0
  147. package/dist/lib/validators/dockerfile-validator.d.ts.map +1 -0
  148. package/dist/lib/validators/dockerfile-validator.js +262 -0
  149. package/dist/lib/validators/dockerfile-validator.js.map +1 -0
  150. package/dist/lib/validators/env-validator.d.ts +3 -0
  151. package/dist/lib/validators/env-validator.d.ts.map +1 -0
  152. package/dist/lib/validators/env-validator.js +268 -0
  153. package/dist/lib/validators/env-validator.js.map +1 -0
  154. package/dist/lib/validators/git-validator.d.ts +3 -0
  155. package/dist/lib/validators/git-validator.d.ts.map +1 -0
  156. package/dist/lib/validators/git-validator.js +236 -0
  157. package/dist/lib/validators/git-validator.js.map +1 -0
  158. package/dist/lib/validators/health-detector.d.ts +4 -0
  159. package/dist/lib/validators/health-detector.d.ts.map +1 -0
  160. package/dist/lib/validators/health-detector.js +159 -0
  161. package/dist/lib/validators/health-detector.js.map +1 -0
  162. package/dist/lib/validators/index.d.ts +7 -0
  163. package/dist/lib/validators/index.d.ts.map +1 -0
  164. package/dist/lib/validators/index.js +7 -0
  165. package/dist/lib/validators/index.js.map +1 -0
  166. package/dist/lib/validators/route-validator.d.ts +3 -0
  167. package/dist/lib/validators/route-validator.d.ts.map +1 -0
  168. package/dist/lib/validators/route-validator.js +238 -0
  169. package/dist/lib/validators/route-validator.js.map +1 -0
  170. package/dist/types/index.d.ts +455 -0
  171. package/dist/types/index.d.ts.map +1 -0
  172. package/dist/types/index.js +37 -0
  173. package/dist/types/index.js.map +1 -0
  174. package/package.json +58 -0
@@ -0,0 +1,62 @@
1
+ import { execSync } from 'child_process';
2
+ import { loadLinkedService } from '../lib/config.js';
3
+ import { log, spinner } from '../lib/output.js';
4
+ export async function destroyCommand(options) {
5
+ let namespace = options.namespace;
6
+ // If no namespace specified, try to infer from linked service + environment
7
+ if (!namespace) {
8
+ const linkedService = await loadLinkedService();
9
+ if (!linkedService) {
10
+ log.error('No namespace specified and not linked to a service');
11
+ log.dim('Use --namespace or run from a linked service directory');
12
+ process.exit(1);
13
+ }
14
+ // Resolve environment
15
+ let environment = 'sandbox';
16
+ if (options.prod) {
17
+ environment = 'prod';
18
+ }
19
+ else if (options.sandbox) {
20
+ environment = 'sandbox';
21
+ }
22
+ else if (options.uat) {
23
+ environment = 'uat';
24
+ }
25
+ else if (options.env) {
26
+ environment = options.env;
27
+ }
28
+ namespace = `${linkedService.serviceName}-${environment}`;
29
+ }
30
+ // Safety check for prod
31
+ if (namespace.endsWith('-prod') && !options.force) {
32
+ log.error('Refusing to destroy production namespace without --force');
33
+ log.dim(`Run: iec destroy --namespace ${namespace} --force`);
34
+ process.exit(1);
35
+ }
36
+ log.warning(`About to delete namespace: ${namespace}`);
37
+ const sp = spinner(`Deleting namespace ${namespace}`);
38
+ try {
39
+ // Check if namespace exists
40
+ try {
41
+ execSync(`kubectl get namespace ${namespace}`, { stdio: 'pipe' });
42
+ }
43
+ catch {
44
+ sp.stop(false);
45
+ log.error(`Namespace ${namespace} does not exist`);
46
+ process.exit(1);
47
+ }
48
+ // Delete the namespace (this removes all resources in it)
49
+ execSync(`kubectl delete namespace ${namespace}`, { stdio: 'pipe' });
50
+ sp.stop(true);
51
+ log.success(`Namespace ${namespace} deleted`);
52
+ log.dim('All deployments, services, and ingresses in this namespace have been removed');
53
+ }
54
+ catch (error) {
55
+ sp.stop(false);
56
+ if (error instanceof Error) {
57
+ log.error(`Failed to delete namespace: ${error.message}`);
58
+ }
59
+ process.exit(1);
60
+ }
61
+ }
62
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAY/C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,IAAI,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IAEjC,4EAA4E;IAC5E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,MAAM,iBAAiB,EAAE,CAAA;QAC/C,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,GAAG,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAA;YAC/D,GAAG,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAA;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,sBAAsB;QACtB,IAAI,WAAW,GAAgB,SAAS,CAAA;QACxC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,WAAW,GAAG,MAAM,CAAA;QACtB,CAAC;aAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YAC3B,WAAW,GAAG,SAAS,CAAA;QACzB,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACvB,WAAW,GAAG,KAAK,CAAA;QACrB,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACvB,WAAW,GAAG,OAAO,CAAC,GAAG,CAAA;QAC3B,CAAC;QAED,SAAS,GAAG,GAAG,aAAa,CAAC,WAAW,IAAI,WAAW,EAAE,CAAA;IAC3D,CAAC;IAED,wBAAwB;IACxB,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAA;QACrE,GAAG,CAAC,GAAG,CAAC,gCAAgC,SAAS,UAAU,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,8BAA8B,SAAS,EAAE,CAAC,CAAA;IAEtD,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,SAAS,EAAE,CAAC,CAAA;IAErD,IAAI,CAAC;QACH,4BAA4B;QAC5B,IAAI,CAAC;YACH,QAAQ,CAAC,yBAAyB,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACd,GAAG,CAAC,KAAK,CAAC,aAAa,SAAS,iBAAiB,CAAC,CAAA;YAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,0DAA0D;QAC1D,QAAQ,CAAC,4BAA4B,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACpE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEb,GAAG,CAAC,OAAO,CAAC,aAAa,SAAS,UAAU,CAAC,CAAA;QAC7C,GAAG,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;IACzF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACd,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,GAAG,CAAC,KAAK,CAAC,+BAA+B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface EnvOptions {
2
+ set?: string[];
3
+ delete?: string[];
4
+ }
5
+ export declare function envCommand(programId: string | undefined, options: EnvOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAIA,UAAU,UAAU;IAClB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAClB;AAED,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,IAAI,CAAC,CA8Cf"}
@@ -0,0 +1,42 @@
1
+ import { KokoClient } from '../lib/api.js';
2
+ import { loadConfig } from '../lib/config.js';
3
+ import { log, formatTable } from '../lib/output.js';
4
+ export async function envCommand(programId, options) {
5
+ const config = await loadConfig();
6
+ log.info('Environment management');
7
+ log.dim(`Koko URL: ${config.koko_url}`);
8
+ log.info('');
9
+ if (!programId) {
10
+ // List all environments (programs)
11
+ const client = await KokoClient.create();
12
+ const result = await client.listPrograms();
13
+ if (!result.success) {
14
+ log.error(`Failed to list programs: ${result.error?.message}`);
15
+ process.exit(1);
16
+ }
17
+ if (!result.data || result.data.length === 0) {
18
+ log.warning('No programs found');
19
+ return;
20
+ }
21
+ const rows = result.data.map((p) => [p.code, p.name, p.status, p.tier]);
22
+ console.log(formatTable(['CODE', 'NAME', 'STATUS', 'TIER'], rows));
23
+ return;
24
+ }
25
+ // Get specific program
26
+ const client = await KokoClient.create();
27
+ const result = await client.getProgram(programId);
28
+ if (!result.success) {
29
+ log.error(`Failed to get program: ${result.error?.message}`);
30
+ process.exit(1);
31
+ }
32
+ const program = result.data;
33
+ if (!program) {
34
+ log.error(`Program "${programId}" not found`);
35
+ process.exit(1);
36
+ }
37
+ log.info(`Program: ${program.name} (${program.code})`);
38
+ log.dim(` Status: ${program.status}`);
39
+ log.dim(` Tier: ${program.tier}`);
40
+ log.dim(` ID: ${program.id}`);
41
+ }
42
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA;AAOnD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,SAA6B,EAC7B,OAAmB;IAEnB,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAA;IAEjC,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IAClC,GAAG,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IACvC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAEZ,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAA;QACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,CAAA;QAE1C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,GAAG,CAAC,KAAK,CAAC,4BAA4B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAA;YAChC,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACvE,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;QAClE,OAAM;IACR,CAAC;IAED,uBAAuB;IACvB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAA;IACxC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAA;IAEjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAA;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,YAAY,SAAS,aAAa,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,GAAG,CAAC,CAAA;IACtD,GAAG,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACtC,GAAG,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACpC,GAAG,CAAC,GAAG,CAAC,aAAa,OAAO,CAAC,EAAE,EAAE,CAAC,CAAA;AACpC,CAAC"}
@@ -0,0 +1,7 @@
1
+ interface InitAiOptions {
2
+ dryRun?: boolean;
3
+ yes?: boolean;
4
+ }
5
+ export declare function initAiCommand(options: InitAiOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=init-ai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-ai.d.ts","sourceRoot":"","sources":["../../src/commands/init-ai.ts"],"names":[],"mappings":"AAQA,UAAU,aAAa;IACrB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AA4ND,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmFzE"}
@@ -0,0 +1,257 @@
1
+ import chalk from 'chalk';
2
+ import { createInterface } from 'node:readline';
3
+ import { ClaudeClient } from '../lib/ai/client.js';
4
+ import { SYSTEM_PROMPT, AI_TOOLS } from '../lib/ai/prompts.js';
5
+ import { scanCodebase, formatScanResult } from '../lib/ai/scanner.js';
6
+ import { generateCatalogInfo, generateHelmChart, generateHealthEndpoint, writeGeneratedFile, formatFilePreview } from '../lib/ai/generator.js';
7
+ import { log, spinner } from '../lib/output.js';
8
+ async function prompt(question, defaultValue) {
9
+ const rl = createInterface({
10
+ input: process.stdin,
11
+ output: process.stdout,
12
+ });
13
+ return new Promise((resolve) => {
14
+ const promptText = defaultValue
15
+ ? `${question} ${chalk.dim(`(${defaultValue})`)} `
16
+ : `${question} `;
17
+ rl.question(promptText, (answer) => {
18
+ rl.close();
19
+ resolve(answer.trim() || defaultValue || '');
20
+ });
21
+ });
22
+ }
23
+ async function promptChoice(question, choices, defaultIndex = 0) {
24
+ console.log(`\n${question}`);
25
+ for (let i = 0; i < choices.length; i++) {
26
+ const marker = i === defaultIndex ? chalk.cyan('> ') : ' ';
27
+ const choiceText = i === defaultIndex ? chalk.cyan(choices[i]) : choices[i];
28
+ console.log(`${marker}${i + 1}. ${choiceText}`);
29
+ }
30
+ const rl = createInterface({
31
+ input: process.stdin,
32
+ output: process.stdout,
33
+ });
34
+ return new Promise((resolve) => {
35
+ rl.question(`\nChoice ${chalk.dim(`[1-${choices.length}]`)}: `, (answer) => {
36
+ rl.close();
37
+ const index = parseInt(answer, 10) - 1;
38
+ if (index >= 0 && index < choices.length) {
39
+ resolve(choices[index]);
40
+ }
41
+ else {
42
+ resolve(choices[defaultIndex]);
43
+ }
44
+ });
45
+ });
46
+ }
47
+ async function promptConfirm(question, defaultValue = true) {
48
+ const rl = createInterface({
49
+ input: process.stdin,
50
+ output: process.stdout,
51
+ });
52
+ const defaultHint = defaultValue ? 'Y/n' : 'y/N';
53
+ return new Promise((resolve) => {
54
+ rl.question(`${question} ${chalk.dim(`[${defaultHint}]`)} `, (answer) => {
55
+ rl.close();
56
+ if (!answer.trim()) {
57
+ resolve(defaultValue);
58
+ }
59
+ else {
60
+ resolve(answer.toLowerCase() === 'y' || answer.toLowerCase() === 'yes');
61
+ }
62
+ });
63
+ });
64
+ }
65
+ async function handleToolCall(toolName, toolInput, state, options) {
66
+ switch (toolName) {
67
+ case 'scan_codebase': {
68
+ const sp = spinner('Analyzing codebase');
69
+ try {
70
+ state.scanResult = await scanCodebase(process.cwd());
71
+ sp.stop(true);
72
+ return {
73
+ toolUseId: '',
74
+ result: formatScanResult(state.scanResult),
75
+ };
76
+ }
77
+ catch (error) {
78
+ sp.stop(false);
79
+ return {
80
+ toolUseId: '',
81
+ result: `Error scanning codebase: ${error instanceof Error ? error.message : String(error)}`,
82
+ isError: true,
83
+ };
84
+ }
85
+ }
86
+ case 'ask_question': {
87
+ const input = toolInput;
88
+ let answer;
89
+ console.log('');
90
+ if (input.choices && input.choices.length > 0) {
91
+ const defaultIndex = input.default
92
+ ? input.choices.indexOf(input.default)
93
+ : 0;
94
+ answer = await promptChoice(chalk.cyan('?') + ' ' + input.question, input.choices, Math.max(0, defaultIndex));
95
+ }
96
+ else {
97
+ answer = await prompt(chalk.cyan('?') + ' ' + input.question, input.default);
98
+ }
99
+ return {
100
+ toolUseId: '',
101
+ result: answer,
102
+ };
103
+ }
104
+ case 'generate_catalog': {
105
+ const input = toolInput;
106
+ const file = generateCatalogInfo(input, process.cwd());
107
+ state.generatedFiles.push(file);
108
+ return {
109
+ toolUseId: '',
110
+ result: `Generated catalog-info.yaml for service "${input.name}"`,
111
+ };
112
+ }
113
+ case 'generate_helm': {
114
+ const input = toolInput;
115
+ const files = generateHelmChart(input, process.cwd());
116
+ state.generatedFiles.push(...files);
117
+ return {
118
+ toolUseId: '',
119
+ result: `Generated Helm chart with ${files.length} files for service "${input.name}"`,
120
+ };
121
+ }
122
+ case 'add_health_endpoint': {
123
+ const input = toolInput;
124
+ const file = generateHealthEndpoint(input, process.cwd());
125
+ state.generatedFiles.push(file);
126
+ return {
127
+ toolUseId: '',
128
+ result: `Generated health endpoint for ${input.framework} at ${input.path || '/health'}`,
129
+ };
130
+ }
131
+ case 'complete_setup': {
132
+ const input = toolInput;
133
+ state.isComplete = true;
134
+ // Show files to be generated
135
+ if (state.generatedFiles.length > 0) {
136
+ console.log(formatFilePreview(state.generatedFiles));
137
+ console.log('');
138
+ if (options.dryRun) {
139
+ log.info('Dry run mode - files not written');
140
+ console.log('');
141
+ for (const file of state.generatedFiles) {
142
+ console.log(chalk.dim(`\n--- ${file.path} ---`));
143
+ console.log(file.content);
144
+ }
145
+ }
146
+ else {
147
+ const shouldWrite = options.yes || await promptConfirm('Write these files?', true);
148
+ if (shouldWrite) {
149
+ const sp = spinner('Writing files');
150
+ try {
151
+ for (const file of state.generatedFiles) {
152
+ await writeGeneratedFile(file, false);
153
+ }
154
+ sp.stop(true);
155
+ }
156
+ catch (error) {
157
+ sp.stop(false);
158
+ log.error(`Failed to write files: ${error instanceof Error ? error.message : String(error)}`);
159
+ }
160
+ }
161
+ else {
162
+ log.warning('File generation cancelled');
163
+ }
164
+ }
165
+ }
166
+ // Show summary and next steps
167
+ console.log('');
168
+ console.log(chalk.bold.green(input.summary));
169
+ console.log('');
170
+ console.log(chalk.bold('Next steps:'));
171
+ for (const step of input.nextSteps) {
172
+ console.log(chalk.dim(` ${step}`));
173
+ }
174
+ return {
175
+ toolUseId: '',
176
+ result: 'Setup complete',
177
+ };
178
+ }
179
+ default:
180
+ return {
181
+ toolUseId: '',
182
+ result: `Unknown tool: ${toolName}`,
183
+ isError: true,
184
+ };
185
+ }
186
+ }
187
+ export async function initAiCommand(options) {
188
+ console.log('');
189
+ console.log(chalk.bold.blue('AI-Powered Project Setup'));
190
+ console.log(chalk.dim('Analyzing your project and generating IEC configuration...'));
191
+ console.log('');
192
+ let client;
193
+ try {
194
+ client = await ClaudeClient.create();
195
+ }
196
+ catch (error) {
197
+ log.error(error instanceof Error ? error.message : String(error));
198
+ console.log('');
199
+ console.log(chalk.dim('To configure your API key:'));
200
+ console.log(chalk.dim(' export ANTHROPIC_API_KEY=your-key'));
201
+ console.log(chalk.dim(' # or'));
202
+ console.log(chalk.dim(' iec config --anthropic-key your-key'));
203
+ process.exit(1);
204
+ }
205
+ const state = {
206
+ scanResult: null,
207
+ generatedFiles: [],
208
+ isComplete: false,
209
+ };
210
+ // Start conversation
211
+ client.addUserMessage('Please help me set up this project for deployment on IEC. Start by scanning the codebase.');
212
+ let iteration = 0;
213
+ const maxIterations = 20; // Safety limit
214
+ while (!state.isComplete && iteration < maxIterations) {
215
+ iteration++;
216
+ try {
217
+ const response = await client.sendMessage(SYSTEM_PROMPT, AI_TOOLS, {
218
+ onText: (text) => {
219
+ process.stdout.write(text);
220
+ },
221
+ });
222
+ // Handle any text output
223
+ const textContent = client.getTextContent(response);
224
+ if (textContent && !textContent.endsWith('\n')) {
225
+ console.log('');
226
+ }
227
+ // Process tool calls
228
+ const toolUses = client.getToolUses(response);
229
+ if (toolUses.length === 0) {
230
+ // No tool calls, conversation might be stuck
231
+ break;
232
+ }
233
+ const toolResults = [];
234
+ for (const toolUse of toolUses) {
235
+ const result = await handleToolCall(toolUse.name, toolUse.input, state, options);
236
+ toolResults.push({
237
+ ...result,
238
+ toolUseId: toolUse.id,
239
+ });
240
+ }
241
+ // Add tool results to conversation
242
+ client.addToolResults(toolResults);
243
+ }
244
+ catch (error) {
245
+ log.error(`AI error: ${error instanceof Error ? error.message : String(error)}`);
246
+ if (error instanceof Error && error.message.includes('API key')) {
247
+ break;
248
+ }
249
+ // Try to continue
250
+ client.addUserMessage('There was an error. Please continue with what you were doing.');
251
+ }
252
+ }
253
+ if (!state.isComplete) {
254
+ log.warning('Setup did not complete normally. Some files may not have been generated.');
255
+ }
256
+ }
257
+ //# sourceMappingURL=init-ai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-ai.js","sourceRoot":"","sources":["../../src/commands/init-ai.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface InitOptions {
2
+ owner?: string;
3
+ description?: string;
4
+ database?: boolean;
5
+ }
6
+ export declare function initCommand(serviceName: string, options: InitOptions): Promise<void>;
7
+ export {};
8
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAMA,UAAU,WAAW;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC,CAuQf"}
@@ -0,0 +1,228 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { stringify } from 'yaml';
4
+ import { log, spinner } from '../lib/output.js';
5
+ export async function initCommand(serviceName, options) {
6
+ const targetDir = join(process.cwd(), serviceName);
7
+ const sp = spinner(`Scaffolding ${serviceName}`);
8
+ try {
9
+ // Create directories
10
+ await mkdir(targetDir, { recursive: true });
11
+ await mkdir(join(targetDir, 'src'), { recursive: true });
12
+ await mkdir(join(targetDir, 'helm', serviceName, 'templates'), { recursive: true });
13
+ // Create catalog-info.yaml (Backstage pattern)
14
+ const catalogInfo = {
15
+ apiVersion: 'backstage.io/v1alpha1',
16
+ kind: 'Component',
17
+ metadata: {
18
+ name: serviceName,
19
+ description: options.description || `${serviceName} service`,
20
+ tags: ['tawa'],
21
+ annotations: {
22
+ 'insureco.io/database': options.database ? serviceName : '',
23
+ },
24
+ },
25
+ spec: {
26
+ type: 'service',
27
+ lifecycle: 'experimental',
28
+ owner: options.owner || 'team-platform',
29
+ },
30
+ };
31
+ await writeFile(join(targetDir, 'catalog-info.yaml'), stringify(catalogInfo), 'utf-8');
32
+ // Create Dockerfile
33
+ const dockerfile = `FROM node:22-alpine AS builder
34
+ WORKDIR /app
35
+ COPY package*.json ./
36
+ RUN npm ci
37
+ COPY . .
38
+ RUN npm run build
39
+
40
+ FROM node:22-alpine
41
+ WORKDIR /app
42
+ COPY --from=builder /app/dist ./dist
43
+ COPY --from=builder /app/node_modules ./node_modules
44
+ COPY package*.json ./
45
+ ENV NODE_ENV=production
46
+ EXPOSE 3000
47
+ CMD ["node", "dist/index.js"]
48
+ `;
49
+ await writeFile(join(targetDir, 'Dockerfile'), dockerfile, 'utf-8');
50
+ // Create Helm chart
51
+ const chartYaml = {
52
+ apiVersion: 'v2',
53
+ name: serviceName,
54
+ description: `Helm chart for ${serviceName}`,
55
+ type: 'application',
56
+ version: '0.1.0',
57
+ appVersion: '0.1.0',
58
+ };
59
+ await writeFile(join(targetDir, 'helm', serviceName, 'Chart.yaml'), stringify(chartYaml), 'utf-8');
60
+ const valuesYaml = {
61
+ replicaCount: 1,
62
+ image: {
63
+ repository: `registry.digitalocean.com/insureco/${serviceName}`,
64
+ tag: 'latest',
65
+ pullPolicy: 'IfNotPresent',
66
+ },
67
+ service: {
68
+ type: 'ClusterIP',
69
+ port: 3000,
70
+ },
71
+ resources: {
72
+ limits: { cpu: '500m', memory: '512Mi' },
73
+ requests: { cpu: '100m', memory: '128Mi' },
74
+ },
75
+ env: {},
76
+ };
77
+ await writeFile(join(targetDir, 'helm', serviceName, 'values.yaml'), stringify(valuesYaml), 'utf-8');
78
+ const deploymentYaml = `apiVersion: apps/v1
79
+ kind: Deployment
80
+ metadata:
81
+ name: {{ .Release.Name }}
82
+ labels:
83
+ app: {{ .Release.Name }}
84
+ spec:
85
+ replicas: {{ .Values.replicaCount }}
86
+ selector:
87
+ matchLabels:
88
+ app: {{ .Release.Name }}
89
+ template:
90
+ metadata:
91
+ labels:
92
+ app: {{ .Release.Name }}
93
+ spec:
94
+ containers:
95
+ - name: {{ .Chart.Name }}
96
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
97
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
98
+ ports:
99
+ - containerPort: {{ .Values.service.port }}
100
+ envFrom:
101
+ - configMapRef:
102
+ name: {{ .Release.Name }}-config
103
+ optional: true
104
+ - secretRef:
105
+ name: {{ .Release.Name }}-secrets
106
+ optional: true
107
+ resources:
108
+ {{- toYaml .Values.resources | nindent 12 }}
109
+ livenessProbe:
110
+ httpGet:
111
+ path: /health
112
+ port: {{ .Values.service.port }}
113
+ initialDelaySeconds: 10
114
+ periodSeconds: 10
115
+ readinessProbe:
116
+ httpGet:
117
+ path: /health
118
+ port: {{ .Values.service.port }}
119
+ initialDelaySeconds: 5
120
+ periodSeconds: 5
121
+ `;
122
+ await writeFile(join(targetDir, 'helm', serviceName, 'templates', 'deployment.yaml'), deploymentYaml, 'utf-8');
123
+ const serviceYaml = `apiVersion: v1
124
+ kind: Service
125
+ metadata:
126
+ name: {{ .Release.Name }}
127
+ spec:
128
+ type: {{ .Values.service.type }}
129
+ ports:
130
+ - port: {{ .Values.service.port }}
131
+ targetPort: {{ .Values.service.port }}
132
+ protocol: TCP
133
+ selector:
134
+ app: {{ .Release.Name }}
135
+ `;
136
+ await writeFile(join(targetDir, 'helm', serviceName, 'templates', 'service.yaml'), serviceYaml, 'utf-8');
137
+ // Create basic src structure
138
+ const indexTs = `import { createServer } from 'node:http'
139
+
140
+ const PORT = process.env.PORT || 3000
141
+
142
+ const server = createServer((req, res) => {
143
+ if (req.url === '/health') {
144
+ res.writeHead(200, { 'Content-Type': 'application/json' })
145
+ res.end(JSON.stringify({ status: 'ok' }))
146
+ return
147
+ }
148
+
149
+ res.writeHead(200, { 'Content-Type': 'application/json' })
150
+ res.end(JSON.stringify({ message: 'Hello from ${serviceName}' }))
151
+ })
152
+
153
+ server.listen(PORT, () => {
154
+ console.log(\`Server running on port \${PORT}\`)
155
+ })
156
+ `;
157
+ await writeFile(join(targetDir, 'src', 'index.ts'), indexTs, 'utf-8');
158
+ // Create package.json
159
+ const packageJson = {
160
+ name: serviceName,
161
+ version: '0.1.0',
162
+ type: 'module',
163
+ scripts: {
164
+ build: 'tsc',
165
+ dev: 'tsx watch src/index.ts',
166
+ start: 'node dist/index.js',
167
+ },
168
+ devDependencies: {
169
+ '@types/node': '^22.0.0',
170
+ tsx: '^4.0.0',
171
+ typescript: '^5.7.0',
172
+ },
173
+ };
174
+ await writeFile(join(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2), 'utf-8');
175
+ // Create tsconfig.json
176
+ const tsconfig = {
177
+ compilerOptions: {
178
+ target: 'ES2022',
179
+ module: 'NodeNext',
180
+ moduleResolution: 'NodeNext',
181
+ outDir: './dist',
182
+ rootDir: './src',
183
+ strict: true,
184
+ esModuleInterop: true,
185
+ skipLibCheck: true,
186
+ },
187
+ include: ['src/**/*'],
188
+ exclude: ['node_modules', 'dist'],
189
+ };
190
+ await writeFile(join(targetDir, 'tsconfig.json'), JSON.stringify(tsconfig, null, 2), 'utf-8');
191
+ // Create .gitignore
192
+ const gitignore = `node_modules/
193
+ dist/
194
+ .env
195
+ .env.local
196
+ *.log
197
+ `;
198
+ await writeFile(join(targetDir, '.gitignore'), gitignore, 'utf-8');
199
+ sp.stop(true);
200
+ log.info(`Created ${serviceName}/`);
201
+ log.dim(' ├── catalog-info.yaml');
202
+ log.dim(' ├── Dockerfile');
203
+ log.dim(' ├── package.json');
204
+ log.dim(' ├── tsconfig.json');
205
+ log.dim(' ├── .gitignore');
206
+ log.dim(' ├── src/');
207
+ log.dim(' │ └── index.ts');
208
+ log.dim(' └── helm/');
209
+ log.dim(` └── ${serviceName}/`);
210
+ log.dim(' ├── Chart.yaml');
211
+ log.dim(' ├── values.yaml');
212
+ log.dim(' └── templates/');
213
+ log.info('');
214
+ log.info('Next steps:');
215
+ log.dim(` cd ${serviceName}`);
216
+ log.dim(' npm install');
217
+ log.info('');
218
+ log.info('Deploy options:');
219
+ log.dim(' iec deploy # Manual deploy from local');
220
+ log.dim(' -- or --');
221
+ log.dim(' iec link && git push # Auto-deploy on push (Vercel style)');
222
+ }
223
+ catch (error) {
224
+ sp.stop(false);
225
+ throw error;
226
+ }
227
+ }
228
+ //# sourceMappingURL=init.js.map