@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,124 @@
1
+ import { readFile, writeFile, mkdir, unlink } from 'node:fs/promises';
2
+ import { homedir } from 'node:os';
3
+ import { join, dirname } from 'node:path';
4
+ import { parse, stringify } from 'yaml';
5
+ import { ConfigSchema, AuthSchema, LinkedRepoSchema, LinkedServiceSchema, } from '../types/index.js';
6
+ const CONFIG_DIR = join(homedir(), '.iec');
7
+ const CONFIG_PATH = join(CONFIG_DIR, 'config.yaml');
8
+ const AUTH_PATH = join(CONFIG_DIR, 'auth.yaml');
9
+ const PROJECT_CONFIG_NAME = '.iec.yaml';
10
+ const DEFAULT_CONFIG = {
11
+ koko_url: 'https://janus.tawa.insureco.io/koko',
12
+ builder_url: 'https://builder.tawa.insureco.io',
13
+ bio_url: 'https://bio.tawa.insureco.io',
14
+ registry: 'registry.digitalocean.com/insureco',
15
+ kubeconfig: '~/.kube/config',
16
+ anthropic_api_key: undefined,
17
+ };
18
+ export async function loadConfig() {
19
+ try {
20
+ const content = await readFile(CONFIG_PATH, 'utf-8');
21
+ const parsed = parse(content);
22
+ return ConfigSchema.parse(parsed);
23
+ }
24
+ catch (error) {
25
+ if (error.code === 'ENOENT') {
26
+ return DEFAULT_CONFIG;
27
+ }
28
+ throw error;
29
+ }
30
+ }
31
+ export async function saveConfig(config) {
32
+ const validated = ConfigSchema.parse(config);
33
+ await mkdir(dirname(CONFIG_PATH), { recursive: true });
34
+ await writeFile(CONFIG_PATH, stringify(validated), 'utf-8');
35
+ }
36
+ export async function ensureConfigExists() {
37
+ try {
38
+ return await loadConfig();
39
+ }
40
+ catch (error) {
41
+ if (error.code === 'ENOENT') {
42
+ await saveConfig(DEFAULT_CONFIG);
43
+ return DEFAULT_CONFIG;
44
+ }
45
+ throw error;
46
+ }
47
+ }
48
+ export function expandPath(path) {
49
+ if (path.startsWith('~')) {
50
+ return join(homedir(), path.slice(1));
51
+ }
52
+ return path;
53
+ }
54
+ // Auth management
55
+ export async function loadAuth() {
56
+ try {
57
+ const content = await readFile(AUTH_PATH, 'utf-8');
58
+ const parsed = parse(content);
59
+ return AuthSchema.parse(parsed);
60
+ }
61
+ catch {
62
+ return null;
63
+ }
64
+ }
65
+ export async function saveAuth(auth) {
66
+ const validated = AuthSchema.parse(auth);
67
+ await mkdir(dirname(AUTH_PATH), { recursive: true });
68
+ await writeFile(AUTH_PATH, stringify(validated), 'utf-8');
69
+ }
70
+ export async function clearAuth() {
71
+ try {
72
+ await unlink(AUTH_PATH);
73
+ }
74
+ catch {
75
+ // Ignore if file doesn't exist
76
+ }
77
+ }
78
+ export async function requireAuth() {
79
+ const auth = await loadAuth();
80
+ if (!auth) {
81
+ throw new Error('Not logged in. Run "iec login" first.');
82
+ }
83
+ return auth;
84
+ }
85
+ // Project config (.iec.yaml in project root)
86
+ export async function loadProjectConfig(dir = process.cwd()) {
87
+ try {
88
+ const content = await readFile(join(dir, PROJECT_CONFIG_NAME), 'utf-8');
89
+ const parsed = parse(content);
90
+ return LinkedRepoSchema.parse(parsed);
91
+ }
92
+ catch {
93
+ return null;
94
+ }
95
+ }
96
+ export async function saveProjectConfig(config, dir = process.cwd()) {
97
+ const validated = LinkedRepoSchema.parse(config);
98
+ await writeFile(join(dir, PROJECT_CONFIG_NAME), stringify(validated), 'utf-8');
99
+ }
100
+ // Linked service config (new builder-based approach)
101
+ export async function loadLinkedService(dir = process.cwd()) {
102
+ try {
103
+ const content = await readFile(join(dir, PROJECT_CONFIG_NAME), 'utf-8');
104
+ const parsed = parse(content);
105
+ return LinkedServiceSchema.parse(parsed);
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ export async function saveLinkedService(config, dir = process.cwd()) {
112
+ const validated = LinkedServiceSchema.parse(config);
113
+ await writeFile(join(dir, PROJECT_CONFIG_NAME), stringify(validated), 'utf-8');
114
+ }
115
+ export async function removeLinkedService(dir = process.cwd()) {
116
+ try {
117
+ await unlink(join(dir, PROJECT_CONFIG_NAME));
118
+ }
119
+ catch {
120
+ // Ignore if file doesn't exist
121
+ }
122
+ }
123
+ export { CONFIG_PATH, CONFIG_DIR, AUTH_PATH, PROJECT_CONFIG_NAME };
124
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const log: {
2
+ info: (message: string) => void;
3
+ success: (message: string) => void;
4
+ warning: (message: string) => void;
5
+ error: (message: string) => void;
6
+ dim: (message: string) => void;
7
+ };
8
+ export declare function formatTable(headers: string[], rows: string[][]): string;
9
+ export declare function spinner(message: string): {
10
+ stop: (success?: boolean) => void;
11
+ };
12
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG;oBACE,MAAM;uBACH,MAAM;uBACN,MAAM;qBACR,MAAM;mBACR,MAAM;CACtB,CAAA;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EAAE,GACf,MAAM,CAcR;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,CAoB9E"}
@@ -0,0 +1,39 @@
1
+ import chalk from 'chalk';
2
+ export const log = {
3
+ info: (message) => console.log(chalk.blue('ℹ'), message),
4
+ success: (message) => console.log(chalk.green('✓'), message),
5
+ warning: (message) => console.log(chalk.yellow('⚠'), message),
6
+ error: (message) => console.error(chalk.red('✗'), message),
7
+ dim: (message) => console.log(chalk.dim(message)),
8
+ };
9
+ export function formatTable(headers, rows) {
10
+ const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] || '').length)));
11
+ const separator = widths.map((w) => '-'.repeat(w)).join('-+-');
12
+ const formatRow = (row) => row.map((cell, i) => (cell || '').padEnd(widths[i])).join(' | ');
13
+ return [
14
+ formatRow(headers),
15
+ separator,
16
+ ...rows.map(formatRow),
17
+ ].join('\n');
18
+ }
19
+ export function spinner(message) {
20
+ const frames = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
21
+ let i = 0;
22
+ const interval = setInterval(() => {
23
+ process.stdout.write(`\r${chalk.cyan(frames[i])} ${message}`);
24
+ i = (i + 1) % frames.length;
25
+ }, 80);
26
+ return {
27
+ stop: (success = true) => {
28
+ clearInterval(interval);
29
+ process.stdout.write('\r' + ' '.repeat(message.length + 4) + '\r');
30
+ if (success) {
31
+ log.success(message);
32
+ }
33
+ else {
34
+ log.error(message);
35
+ }
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/lib/output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,IAAI,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAChE,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACpE,OAAO,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IACrE,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAClE,GAAG,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;CAC1D,CAAA;AAED,MAAM,UAAU,WAAW,CACzB,OAAiB,EACjB,IAAgB;IAEhB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAC5D,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9D,MAAM,SAAS,GAAG,CAAC,GAAa,EAAE,EAAE,CAClC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAElE,OAAO;QACL,SAAS,CAAC,OAAO,CAAC;QAClB,SAAS;QACT,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;KACvB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;IACjE,IAAI,CAAC,GAAG,CAAC,CAAA;IAET,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAA;QAC7D,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAA;IAC7B,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO;QACL,IAAI,EAAE,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;YACvB,aAAa,CAAC,QAAQ,CAAC,CAAA;YACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAA;YAClE,IAAI,OAAO,EAAE,CAAC;gBACZ,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;YACtB,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface ScaffoldOptions {
2
+ name: string;
3
+ description?: string;
4
+ skipInstall?: boolean;
5
+ skipGit?: boolean;
6
+ }
7
+ export interface TemplateVariables {
8
+ name: string;
9
+ description: string;
10
+ [key: string]: string;
11
+ }
12
+ /**
13
+ * Get the templates directory path
14
+ */
15
+ export declare function getTemplatesDir(): string;
16
+ /**
17
+ * Replace template variables in content
18
+ */
19
+ export declare function renderTemplate(content: string, variables: TemplateVariables): string;
20
+ export declare function copyTemplateDir(srcDir: string, destDir: string, variables: TemplateVariables): Promise<string[]>;
21
+ export declare function initGitRepo(targetDir: string): Promise<boolean>;
22
+ export declare function runNpmInstall(targetDir: string): Promise<boolean>;
23
+ export declare function directoryExists(path: string): Promise<boolean>;
24
+ export declare function printFileTree(files: string[], projectName: string): void;
25
+ export declare function scaffold(templateName: string, targetDir: string, options: ScaffoldOptions): Promise<{
26
+ success: boolean;
27
+ files: string[];
28
+ }>;
29
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAKpF;AAOD,wBAAsB,eAAe,CACnC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAgCnB;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAgBvE;AAED,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWpE;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAqCxE;AAED,wBAAsB,QAAQ,CAC5B,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+ChD"}
@@ -0,0 +1,166 @@
1
+ import { mkdir, readdir, readFile, writeFile, copyFile, stat } from 'node:fs/promises';
2
+ import { join, dirname, relative } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ import { execSync, spawn } from 'node:child_process';
5
+ import { log, spinner } from './output.js';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ /**
9
+ * Get the templates directory path
10
+ */
11
+ export function getTemplatesDir() {
12
+ return join(__dirname, '..', 'templates');
13
+ }
14
+ /**
15
+ * Replace template variables in content
16
+ */
17
+ export function renderTemplate(content, variables) {
18
+ return Object.entries(variables).reduce((result, [key, value]) => result.replace(new RegExp('\\{\\{' + key + '\\}\\}', 'g'), value), content);
19
+ }
20
+ function isBinaryFile(filename) {
21
+ const binaryExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.ico', '.woff', '.woff2', '.ttf', '.eot'];
22
+ return binaryExtensions.some(ext => filename.endsWith(ext));
23
+ }
24
+ export async function copyTemplateDir(srcDir, destDir, variables) {
25
+ const copiedFiles = [];
26
+ async function processDir(src, dest) {
27
+ const entries = await readdir(src, { withFileTypes: true });
28
+ for (const entry of entries) {
29
+ const renderedName = renderTemplate(entry.name, variables);
30
+ const srcPath = join(src, entry.name);
31
+ const destPath = join(dest, renderedName);
32
+ if (entry.isDirectory()) {
33
+ await mkdir(destPath, { recursive: true });
34
+ await processDir(srcPath, destPath);
35
+ }
36
+ else {
37
+ await mkdir(dirname(destPath), { recursive: true });
38
+ if (isBinaryFile(entry.name)) {
39
+ await copyFile(srcPath, destPath);
40
+ }
41
+ else {
42
+ const content = await readFile(srcPath, 'utf-8');
43
+ const rendered = renderTemplate(content, variables);
44
+ await writeFile(destPath, rendered, 'utf-8');
45
+ }
46
+ copiedFiles.push(relative(destDir, destPath));
47
+ }
48
+ }
49
+ }
50
+ await processDir(srcDir, destDir);
51
+ return copiedFiles;
52
+ }
53
+ export async function initGitRepo(targetDir) {
54
+ try {
55
+ execSync('git init', { cwd: targetDir, stdio: 'pipe' });
56
+ execSync('git add .', { cwd: targetDir, stdio: 'pipe' });
57
+ execSync('git commit -m "Initial commit from iec sample"', { cwd: targetDir, stdio: 'pipe' });
58
+ return true;
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ }
64
+ export async function runNpmInstall(targetDir) {
65
+ return new Promise((resolve) => {
66
+ const child = spawn('npm', ['install'], {
67
+ cwd: targetDir,
68
+ stdio: 'inherit',
69
+ shell: true,
70
+ });
71
+ child.on('close', (code) => {
72
+ resolve(code === 0);
73
+ });
74
+ child.on('error', () => {
75
+ resolve(false);
76
+ });
77
+ });
78
+ }
79
+ export async function directoryExists(path) {
80
+ try {
81
+ const stats = await stat(path);
82
+ if (!stats.isDirectory()) {
83
+ return false;
84
+ }
85
+ const entries = await readdir(path);
86
+ return entries.length > 0;
87
+ }
88
+ catch {
89
+ return false;
90
+ }
91
+ }
92
+ export function printFileTree(files, projectName) {
93
+ const sortedFiles = [...files].sort();
94
+ log.info('Created ' + projectName + '/');
95
+ const tree = new Map();
96
+ for (const file of sortedFiles) {
97
+ const parts = file.split('/');
98
+ if (parts.length === 1) {
99
+ if (!tree.has('')) {
100
+ tree.set('', []);
101
+ }
102
+ tree.get('').push(file);
103
+ }
104
+ else {
105
+ const dir = parts.slice(0, -1).join('/');
106
+ if (!tree.has(dir)) {
107
+ tree.set(dir, []);
108
+ }
109
+ tree.get(dir).push(parts[parts.length - 1]);
110
+ }
111
+ }
112
+ const rootFiles = tree.get('') || [];
113
+ const dirs = Array.from(tree.keys()).filter(k => k !== '').sort();
114
+ for (const file of rootFiles) {
115
+ log.dim(' ' + file);
116
+ }
117
+ for (const dir of dirs) {
118
+ log.dim(' ' + dir + '/');
119
+ const dirFiles = tree.get(dir) || [];
120
+ for (const file of dirFiles) {
121
+ log.dim(' ' + file);
122
+ }
123
+ }
124
+ }
125
+ export async function scaffold(templateName, targetDir, options) {
126
+ const templatesDir = getTemplatesDir();
127
+ const templateDir = join(templatesDir, templateName);
128
+ const variables = {
129
+ name: options.name,
130
+ description: options.description || options.name + ' service',
131
+ };
132
+ try {
133
+ await stat(templateDir);
134
+ }
135
+ catch {
136
+ throw new Error('Template "' + templateName + '" not found at ' + templateDir);
137
+ }
138
+ if (await directoryExists(targetDir)) {
139
+ throw new Error('Directory "' + options.name + '" already exists and is not empty');
140
+ }
141
+ await mkdir(targetDir, { recursive: true });
142
+ const sp = spinner('Scaffolding ' + options.name);
143
+ let files;
144
+ try {
145
+ files = await copyTemplateDir(templateDir, targetDir, variables);
146
+ sp.stop(true);
147
+ }
148
+ catch (error) {
149
+ sp.stop(false);
150
+ throw error;
151
+ }
152
+ if (!options.skipGit) {
153
+ const gitSp = spinner('Initializing git repository');
154
+ const gitSuccess = await initGitRepo(targetDir);
155
+ gitSp.stop(gitSuccess);
156
+ }
157
+ if (!options.skipInstall) {
158
+ log.info('Installing dependencies...');
159
+ const installSuccess = await runNpmInstall(targetDir);
160
+ if (!installSuccess) {
161
+ log.warning('npm install failed. You may need to run it manually.');
162
+ }
163
+ }
164
+ return { success: true, files };
165
+ }
166
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../src/lib/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Tool } from '@anthropic-ai/sdk/resources/messages';
2
+ import type { LogTimeline, TroubleshootContext, TroubleshootResult, DetectedIssue, Environment } from '../../types/index.js';
3
+ declare const TROUBLESHOOT_SYSTEM_PROMPT = "You are an AI assistant that helps diagnose and fix issues in the InsurEco Tawa platform. You analyze logs, pod status, and events to identify problems and provide actionable recommendations.\n\n## About IEC Platform\n\nThe IEC platform is a Kubernetes-based internal developer platform with these key components:\n\n1. **Koko** - Service registry that stores service metadata, routes, and OAuth configurations\n2. **Janus** - API gateway that proxies requests and handles authentication/authorization\n3. **Bio-ID** - Authentication/identity provider using OAuth 2.0\n4. **iec-builder** - CI/CD system that builds and deploys services\n5. **Helm Charts** - Each service has a Helm chart for Kubernetes deployment\n\n## Common Issues and Solutions\n\n### 1. 403 Forbidden - Missing Scopes\n**Symptoms:** Logs show \"insufficient_scope\" or \"forbidden\" errors when calling other services\n**Solution:** Add required scopes to catalog-info.yaml under spec.oauth.scopes, then run `iec register --force`\n\n### 2. 404 Not Found - Service Not Registered\n**Symptoms:** Requests to /api/{service}/* return 404, Janus logs show \"upstream not found\"\n**Solution:** Register the service with `iec register` to add it to Koko\n\n### 3. 502/503 Bad Gateway - Upstream Down\n**Symptoms:** Intermittent failures, Janus logs show \"connection refused\" or \"upstream timeout\"\n**Solution:** Check if upstream service is running, check pod health, review resource limits\n\n### 4. Connection Refused - DNS Not Propagated\n**Symptoms:** New deployments fail to connect to services, DNS resolution errors\n**Solution:** Wait for DNS propagation, verify service exists in Kubernetes, check namespace\n\n### 5. OOMKilled - Memory Limits Too Low\n**Symptoms:** Pod restarts with reason \"OOMKilled\", sudden terminations under load\n**Solution:** Increase memory limits in Helm values.yaml\n\n### 6. CrashLoopBackOff - Health Check Failing\n**Symptoms:** Pod continuously restarts, liveness probe failures in events\n**Solution:** Fix /health endpoint, check startup time, adjust probe timings\n\n### 7. Authentication Failure\n**Symptoms:** 401 errors, \"invalid_token\" or \"token_expired\" in logs\n**Solution:** Verify OAuth configuration, check token expiration, validate credentials\n\n### 8. Rate Limited\n**Symptoms:** 429 errors, \"rate_limit_exceeded\" in responses\n**Solution:** Implement backoff, review rate limit configuration in catalog-info.yaml\n\n## Your Task\n\n1. Analyze the provided logs, pod status, and events\n2. Identify specific issues and their root causes\n3. Provide actionable recommendations with auto-fix options where possible\n4. Prioritize recommendations by severity and impact\n\nUse the provided tools to report your findings.";
4
+ declare const TROUBLESHOOT_TOOLS: Tool[];
5
+ /**
6
+ * Analyze logs and context using Claude
7
+ */
8
+ export declare function analyzeLogs(timeline: LogTimeline, context: TroubleshootContext, environment: Environment): Promise<TroubleshootResult>;
9
+ /**
10
+ * Quick analysis without full AI - pattern matching for common issues
11
+ */
12
+ export declare function quickAnalysis(timeline: LogTimeline, context: TroubleshootContext): DetectedIssue[];
13
+ export { TROUBLESHOOT_SYSTEM_PROMPT, TROUBLESHOOT_TOOLS };
14
+ //# sourceMappingURL=analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/lib/troubleshoot/analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,sCAAsC,CAAA;AAEhE,OAAO,KAAK,EACV,WAAW,EACX,mBAAmB,EACnB,kBAAkB,EAElB,aAAa,EAEb,WAAW,EAEZ,MAAM,sBAAsB,CAAA;AAE7B,QAAA,MAAM,0BAA0B,osFAqDgB,CAAA;AAEhD,QAAA,MAAM,kBAAkB,EAAE,IAAI,EAkI7B,CAAA;AAuOD;;GAEG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,mBAAmB,EAC5B,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAqE7B;AA0BD;;GAEG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,mBAAmB,GAC3B,aAAa,EAAE,CAgHjB;AAED,OAAO,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,CAAA"}