@cat-indev/catops-cli 0.0.1-alpha.5

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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +397 -0
  3. package/dist/bin/devops-cli.d.ts +2 -0
  4. package/dist/bin/devops-cli.js +132 -0
  5. package/dist/bin/devops-cli.js.map +1 -0
  6. package/dist/core/Context.d.ts +42 -0
  7. package/dist/core/Context.js +153 -0
  8. package/dist/core/Context.js.map +1 -0
  9. package/dist/core/Menu.d.ts +23 -0
  10. package/dist/core/Menu.js +159 -0
  11. package/dist/core/Menu.js.map +1 -0
  12. package/dist/core/Notifier.d.ts +27 -0
  13. package/dist/core/Notifier.js +93 -0
  14. package/dist/core/Notifier.js.map +1 -0
  15. package/dist/core/classifiers.d.ts +31 -0
  16. package/dist/core/classifiers.js +53 -0
  17. package/dist/core/classifiers.js.map +1 -0
  18. package/dist/core/logger.d.ts +8 -0
  19. package/dist/core/logger.js +37 -0
  20. package/dist/core/logger.js.map +1 -0
  21. package/dist/core/prompt.d.ts +10 -0
  22. package/dist/core/prompt.js +87 -0
  23. package/dist/core/prompt.js.map +1 -0
  24. package/dist/core/senders.d.ts +27 -0
  25. package/dist/core/senders.js +109 -0
  26. package/dist/core/senders.js.map +1 -0
  27. package/dist/core/types.d.ts +105 -0
  28. package/dist/core/types.js +3 -0
  29. package/dist/core/types.js.map +1 -0
  30. package/dist/index.d.ts +12 -0
  31. package/dist/index.js +50 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/services/ansible.d.ts +11 -0
  34. package/dist/services/ansible.js +35 -0
  35. package/dist/services/ansible.js.map +1 -0
  36. package/dist/services/archive.d.ts +4 -0
  37. package/dist/services/archive.js +16 -0
  38. package/dist/services/archive.js.map +1 -0
  39. package/dist/services/argocd.d.ts +20 -0
  40. package/dist/services/argocd.js +48 -0
  41. package/dist/services/argocd.js.map +1 -0
  42. package/dist/services/az.d.ts +33 -0
  43. package/dist/services/az.js +48 -0
  44. package/dist/services/az.js.map +1 -0
  45. package/dist/services/azdo.d.ts +13 -0
  46. package/dist/services/azdo.js +57 -0
  47. package/dist/services/azdo.js.map +1 -0
  48. package/dist/services/docker.d.ts +18 -0
  49. package/dist/services/docker.js +36 -0
  50. package/dist/services/docker.js.map +1 -0
  51. package/dist/services/git.d.ts +9 -0
  52. package/dist/services/git.js +36 -0
  53. package/dist/services/git.js.map +1 -0
  54. package/dist/services/helm.d.ts +4 -0
  55. package/dist/services/helm.js +24 -0
  56. package/dist/services/helm.js.map +1 -0
  57. package/dist/services/index.d.ts +32 -0
  58. package/dist/services/index.js +81 -0
  59. package/dist/services/index.js.map +1 -0
  60. package/dist/services/kubectl.d.ts +135 -0
  61. package/dist/services/kubectl.js +266 -0
  62. package/dist/services/kubectl.js.map +1 -0
  63. package/dist/services/npm.d.ts +5 -0
  64. package/dist/services/npm.js +20 -0
  65. package/dist/services/npm.js.map +1 -0
  66. package/dist/services/oc.d.ts +146 -0
  67. package/dist/services/oc.js +296 -0
  68. package/dist/services/oc.js.map +1 -0
  69. package/dist/services/shell.d.ts +20 -0
  70. package/dist/services/shell.js +195 -0
  71. package/dist/services/shell.js.map +1 -0
  72. package/dist/services/tekton.d.ts +14 -0
  73. package/dist/services/tekton.js +46 -0
  74. package/dist/services/tekton.js.map +1 -0
  75. package/dist/services/terraform.d.ts +26 -0
  76. package/dist/services/terraform.js +63 -0
  77. package/dist/services/terraform.js.map +1 -0
  78. package/package.json +58 -0
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Context = void 0;
37
+ const logger_1 = require("./logger");
38
+ const prompt = __importStar(require("./prompt"));
39
+ const services_1 = require("../services");
40
+ const Notifier_1 = require("./Notifier");
41
+ class Context {
42
+ constructor() {
43
+ this.flags = {};
44
+ this.params = {};
45
+ this.env = { ...process.env };
46
+ this.vars = {};
47
+ this.results = {};
48
+ this.logger = logger_1.logger;
49
+ this.services = services_1.services;
50
+ this.notifier = new Notifier_1.Notifier();
51
+ this.config = {};
52
+ this.state = {};
53
+ }
54
+ static current() {
55
+ if (!Context.instance) {
56
+ Context.instance = new Context();
57
+ }
58
+ return Context.instance;
59
+ }
60
+ /** Reinicia el singleton. Útil sobre todo en tests. */
61
+ static reset() {
62
+ Context.instance = new Context();
63
+ return Context.instance;
64
+ }
65
+ // ---- flags ----
66
+ setFlag(name, value = true) {
67
+ this.flags[name] = value;
68
+ return this;
69
+ }
70
+ getFlag(name) {
71
+ return this.flags[name];
72
+ }
73
+ hasFlag(name) {
74
+ return Boolean(this.flags[name]);
75
+ }
76
+ // ---- vars ----
77
+ set(name, value) {
78
+ this.vars[name] = value;
79
+ return this;
80
+ }
81
+ get(name) {
82
+ return this.vars[name];
83
+ }
84
+ // ---- results del pipe ----
85
+ /**
86
+ * Ejecuta una task, guarda su resultado en `ctx.results[taskId]`, y
87
+ * dispara los callbacks de éxito/error correspondientes:
88
+ * 1. `hooks.onSuccess` / `hooks.onError` (si los pasaste), y
89
+ * 2. el `notifier` global (clasifica el error por área de TI y
90
+ * lo reporta a los canales registrados con `ctx.notifier.channel(...)`).
91
+ *
92
+ * Si la task lanza, el error se re-lanza después de notificar, para no
93
+ * esconder fallas silenciosamente.
94
+ */
95
+ async run(taskId, callback, hooks = {}) {
96
+ try {
97
+ const value = await callback(this);
98
+ this.results[taskId] = value;
99
+ await hooks.onSuccess?.(value, this);
100
+ await this.notifier.reportSuccess(taskId, value, this);
101
+ return value;
102
+ }
103
+ catch (error) {
104
+ await hooks.onError?.(error, this);
105
+ await this.notifier.reportError(taskId, error, this);
106
+ throw error;
107
+ }
108
+ }
109
+ // ---- prompts ----
110
+ async ask(question, options) {
111
+ return prompt.ask(question, options);
112
+ }
113
+ async confirm(question, options) {
114
+ return prompt.confirm(question, options);
115
+ }
116
+ async select(title, choices) {
117
+ return prompt.select(title, choices);
118
+ }
119
+ // ---- inicialización desde argv ----
120
+ static parseArgv(argv = process.argv.slice(2)) {
121
+ const ctx = Context.current();
122
+ argv.forEach(arg => {
123
+ if (arg.startsWith("--")) {
124
+ const [key, value] = arg.slice(2).split("=");
125
+ if (value === undefined) {
126
+ ctx.setFlag(key, true);
127
+ }
128
+ else {
129
+ ctx.params[key] = value;
130
+ }
131
+ }
132
+ });
133
+ // Flags globales que reconfiguran shell.exec para todo el proceso,
134
+ // sin que ninguna task tenga que pasarlos manualmente.
135
+ const shellOptions = {};
136
+ if (ctx.hasFlag("dry-run") || ctx.hasFlag("dryRun")) {
137
+ shellOptions.dryRun = true;
138
+ }
139
+ if (ctx.params.retry !== undefined) {
140
+ shellOptions.retry = parseInt(ctx.params.retry, 10);
141
+ }
142
+ if (ctx.params.timeout !== undefined) {
143
+ shellOptions.timeout = parseInt(ctx.params.timeout, 10);
144
+ }
145
+ if (Object.keys(shellOptions).length) {
146
+ ctx.services.shell.configure(shellOptions);
147
+ }
148
+ return ctx;
149
+ }
150
+ }
151
+ exports.Context = Context;
152
+ Context.instance = null;
153
+ //# sourceMappingURL=Context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/core/Context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { Context } from "./Context";
2
+ import type { MenuDefinition } from "./types";
3
+ export declare const EXIT: unique symbol;
4
+ export declare class Menu {
5
+ static readonly EXIT: symbol;
6
+ /**
7
+ * Ejecuta un item ya resuelto: si es una task, la corre, guarda su
8
+ * resultado en `ctx.results[label]`, dispara `onSuccess`/`onError`
9
+ * propios del item (si se pasaron) y reporta el resultado al
10
+ * `ctx.notifier` (clasificación por área de TI + canales). Si es un
11
+ * submenú, simplemente lo renderiza (y así hereda su propio manejo de
12
+ * flag-selector/hooks).
13
+ */
14
+ private static executeEntry;
15
+ /**
16
+ * Renderiza un menú. Si `definition["flag-selector"]` está presente y el
17
+ * Context trae un param que matchea el `selector` de alguno de los
18
+ * items, esa opción se ejecuta automáticamente sin pedir input al
19
+ * usuario (y, si es un submenú, este a su vez revisa su propio
20
+ * "flag-selector", permitiendo encadenar varios niveles).
21
+ */
22
+ static render(definition: MenuDefinition, ctx?: Context): Promise<typeof EXIT | void>;
23
+ }
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.Menu = exports.EXIT = void 0;
37
+ const prompt = __importStar(require("./prompt"));
38
+ const logger_1 = require("./logger");
39
+ const Context_1 = require("./Context");
40
+ exports.EXIT = Symbol("exit");
41
+ function isMenuDefinition(value) {
42
+ return Boolean(value)
43
+ && typeof value === "object"
44
+ && "title" in value
45
+ && "options" in value;
46
+ }
47
+ function resolveEntry(value) {
48
+ if (typeof value === "function") {
49
+ return { kind: "task", run: value };
50
+ }
51
+ if (isMenuDefinition(value)) {
52
+ return { kind: "menu", menu: value };
53
+ }
54
+ if (value && typeof value === "object") {
55
+ const wrapped = value;
56
+ if (wrapped.menu) {
57
+ return { kind: "menu", menu: wrapped.menu, selector: wrapped.selector };
58
+ }
59
+ if (typeof wrapped.action === "function") {
60
+ return {
61
+ kind: "task",
62
+ run: wrapped.action,
63
+ selector: wrapped.selector,
64
+ onSuccess: wrapped.onSuccess,
65
+ onError: wrapped.onError
66
+ };
67
+ }
68
+ }
69
+ throw new Error(`Item de menú inválido: ${JSON.stringify(value)}`);
70
+ }
71
+ function normalizeFlagName(flagSelector) {
72
+ return flagSelector.replace(/^--?/, "");
73
+ }
74
+ function errorMessage(error) {
75
+ return error instanceof Error
76
+ ? error.message
77
+ : error?.stderr ?? String(error);
78
+ }
79
+ class Menu {
80
+ /**
81
+ * Ejecuta un item ya resuelto: si es una task, la corre, guarda su
82
+ * resultado en `ctx.results[label]`, dispara `onSuccess`/`onError`
83
+ * propios del item (si se pasaron) y reporta el resultado al
84
+ * `ctx.notifier` (clasificación por área de TI + canales). Si es un
85
+ * submenú, simplemente lo renderiza (y así hereda su propio manejo de
86
+ * flag-selector/hooks).
87
+ */
88
+ static async executeEntry(entry, label, ctx) {
89
+ if (entry.kind === "menu" && entry.menu) {
90
+ return Menu.render(entry.menu, ctx);
91
+ }
92
+ if (entry.kind === "task" && entry.run) {
93
+ try {
94
+ const result = await entry.run(ctx);
95
+ ctx.results[label] = result;
96
+ await entry.onSuccess?.(result, ctx);
97
+ await ctx.notifier.reportSuccess(label, result, ctx);
98
+ }
99
+ catch (error) {
100
+ await entry.onError?.(error, ctx);
101
+ await ctx.notifier.reportError(label, error, ctx);
102
+ logger_1.logger.error(errorMessage(error));
103
+ if (ctx.params.catch === "throw" || ctx.flags.catch === "throw")
104
+ throw error;
105
+ }
106
+ return;
107
+ }
108
+ logger_1.logger.warn(`Opción "${label}" no tiene acción definida.`);
109
+ }
110
+ /**
111
+ * Renderiza un menú. Si `definition["flag-selector"]` está presente y el
112
+ * Context trae un param que matchea el `selector` de alguno de los
113
+ * items, esa opción se ejecuta automáticamente sin pedir input al
114
+ * usuario (y, si es un submenú, este a su vez revisa su propio
115
+ * "flag-selector", permitiendo encadenar varios niveles).
116
+ */
117
+ static async render(definition, ctx) {
118
+ const activeCtx = ctx ?? Context_1.Context.current();
119
+ const { title, options } = definition;
120
+ const flagSelector = definition["flag-selector"];
121
+ if (flagSelector) {
122
+ const flagKey = normalizeFlagName(flagSelector);
123
+ const wantedValue = activeCtx.params[flagKey];
124
+ if (wantedValue !== undefined) {
125
+ const match = Object.entries(options).find(([, value]) => {
126
+ try {
127
+ return resolveEntry(value).selector === wantedValue;
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ });
133
+ if (match) {
134
+ const [label, value] = match;
135
+ const entry = resolveEntry(value);
136
+ logger_1.logger.info(`Selector automático: "${label}" (${flagSelector}=${wantedValue})`);
137
+ return Menu.executeEntry(entry, label, activeCtx);
138
+ }
139
+ logger_1.logger.warn(`Ningún item de "${title}" coincide con ${flagSelector}=${wantedValue}; se muestra el menú interactivo.`);
140
+ }
141
+ }
142
+ const labels = Object.keys(options);
143
+ labels.push("Salir");
144
+ while (true) {
145
+ const choiceKey = await prompt.select(title, labels);
146
+ const label = labels[Number(choiceKey)];
147
+ if (label === "Salir") {
148
+ return exports.EXIT;
149
+ }
150
+ const entry = resolveEntry(options[label]);
151
+ const result = await Menu.executeEntry(entry, label, activeCtx);
152
+ if (result === exports.EXIT)
153
+ continue;
154
+ }
155
+ }
156
+ }
157
+ exports.Menu = Menu;
158
+ Menu.EXIT = exports.EXIT;
159
+ //# sourceMappingURL=Menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Menu.js","sourceRoot":"","sources":["../../src/core/Menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { Context } from "./Context";
2
+ import type { ErrorClassifier, Sender } from "./types";
3
+ export declare class Notifier {
4
+ private classifiers;
5
+ private channels;
6
+ private successSenders;
7
+ private defaultArea;
8
+ /**
9
+ * Registra una función que decide a qué área de TI corresponde un
10
+ * error. Se prueban en el orden en que se registraron; gana la primera
11
+ * que devuelva un string. Si ninguna matchea, se usa el área "unclassified"
12
+ * (configurable con `setDefaultArea`).
13
+ */
14
+ classify(classifier: ErrorClassifier): this;
15
+ setDefaultArea(area: string): this;
16
+ /**
17
+ * Asocia uno o más senders a un área. Puedes registrar el mismo sender
18
+ * en varias áreas, o usar el área especial "*" para que reciba TODOS
19
+ * los errores sin importar la clasificación.
20
+ */
21
+ channel(area: string, ...senders: Sender[]): this;
22
+ /** Senders que se disparan en cada tarea exitosa, sin clasificación. */
23
+ onSuccess(...senders: Sender[]): this;
24
+ private resolveArea;
25
+ reportSuccess(taskId: string, result: unknown, ctx: Context): Promise<void>;
26
+ reportError(taskId: string, error: unknown, ctx: Context): Promise<string>;
27
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Notifier = void 0;
4
+ const WILDCARD = "*";
5
+ function toMessage(error) {
6
+ if (error instanceof Error) {
7
+ return error.message;
8
+ }
9
+ const maybeExecError = error;
10
+ if (maybeExecError?.stderr) {
11
+ return maybeExecError.stderr.trim().split("\n").pop() || maybeExecError.stderr;
12
+ }
13
+ if (maybeExecError?.message) {
14
+ return maybeExecError.message;
15
+ }
16
+ return String(error);
17
+ }
18
+ class Notifier {
19
+ constructor() {
20
+ this.classifiers = [];
21
+ this.channels = new Map();
22
+ this.successSenders = [];
23
+ this.defaultArea = "unclassified";
24
+ }
25
+ /**
26
+ * Registra una función que decide a qué área de TI corresponde un
27
+ * error. Se prueban en el orden en que se registraron; gana la primera
28
+ * que devuelva un string. Si ninguna matchea, se usa el área "unclassified"
29
+ * (configurable con `setDefaultArea`).
30
+ */
31
+ classify(classifier) {
32
+ this.classifiers.push(classifier);
33
+ return this;
34
+ }
35
+ setDefaultArea(area) {
36
+ this.defaultArea = area;
37
+ return this;
38
+ }
39
+ /**
40
+ * Asocia uno o más senders a un área. Puedes registrar el mismo sender
41
+ * en varias áreas, o usar el área especial "*" para que reciba TODOS
42
+ * los errores sin importar la clasificación.
43
+ */
44
+ channel(area, ...senders) {
45
+ const existing = this.channels.get(area) ?? [];
46
+ this.channels.set(area, [...existing, ...senders]);
47
+ return this;
48
+ }
49
+ /** Senders que se disparan en cada tarea exitosa, sin clasificación. */
50
+ onSuccess(...senders) {
51
+ this.successSenders.push(...senders);
52
+ return this;
53
+ }
54
+ resolveArea(error, ctx) {
55
+ for (const classifier of this.classifiers) {
56
+ const area = classifier(error, ctx);
57
+ if (area)
58
+ return area;
59
+ }
60
+ return this.defaultArea;
61
+ }
62
+ async reportSuccess(taskId, result, ctx) {
63
+ if (!this.successSenders.length)
64
+ return;
65
+ const event = {
66
+ type: "success",
67
+ taskId,
68
+ result,
69
+ message: `Tarea "${taskId}" finalizó correctamente`,
70
+ timestamp: new Date().toISOString()
71
+ };
72
+ await Promise.allSettled(this.successSenders.map(sender => sender(event)));
73
+ }
74
+ async reportError(taskId, error, ctx) {
75
+ const area = this.resolveArea(error, ctx);
76
+ const senders = [
77
+ ...(this.channels.get(area) ?? []),
78
+ ...(area !== WILDCARD ? this.channels.get(WILDCARD) ?? [] : [])
79
+ ];
80
+ const event = {
81
+ type: "error",
82
+ taskId,
83
+ area,
84
+ error,
85
+ message: toMessage(error),
86
+ timestamp: new Date().toISOString()
87
+ };
88
+ await Promise.allSettled(senders.map(sender => sender(event)));
89
+ return area;
90
+ }
91
+ }
92
+ exports.Notifier = Notifier;
93
+ //# sourceMappingURL=Notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Notifier.js","sourceRoot":"","sources":["../../src/core/Notifier.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { ErrorClassifier } from "./types";
2
+ /**
3
+ * Clasificador de fábrica: mapea el comando que falló (el primer argumento
4
+ * que le pasaste a shell.exec / docker.*, git.*, etc.) a un área de TI.
5
+ *
6
+ * Ejemplo:
7
+ * notifier.classify(classifiers.byCommand({
8
+ * docker: "containers",
9
+ * kubectl: "kubernetes",
10
+ * oc: "kubernetes",
11
+ * terraform: "infra",
12
+ * ansible: "infra",
13
+ * git: "scm",
14
+ * argocd: "cd-pipeline",
15
+ * tkn: "cd-pipeline",
16
+ * az: "cloud-azure"
17
+ * }));
18
+ */
19
+ export declare function byCommand(map: Record<string, string>): ErrorClassifier;
20
+ /**
21
+ * Clasificador de fábrica: prueba una lista de [regex, área] contra el
22
+ * stderr/mensaje del error y devuelve el área del primer patrón que matchee.
23
+ *
24
+ * Ejemplo:
25
+ * notifier.classify(classifiers.byPattern([
26
+ * [/permission denied|unauthorized/i, "security"],
27
+ * [/timeout|ETIMEDOUT|ECONNREFUSED/i, "networking"],
28
+ * [/no space left|ENOSPC/i, "infra"]
29
+ * ]));
30
+ */
31
+ export declare function byPattern(rules: Array<[RegExp, string]>): ErrorClassifier;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.byCommand = byCommand;
4
+ exports.byPattern = byPattern;
5
+ /**
6
+ * Clasificador de fábrica: mapea el comando que falló (el primer argumento
7
+ * que le pasaste a shell.exec / docker.*, git.*, etc.) a un área de TI.
8
+ *
9
+ * Ejemplo:
10
+ * notifier.classify(classifiers.byCommand({
11
+ * docker: "containers",
12
+ * kubectl: "kubernetes",
13
+ * oc: "kubernetes",
14
+ * terraform: "infra",
15
+ * ansible: "infra",
16
+ * git: "scm",
17
+ * argocd: "cd-pipeline",
18
+ * tkn: "cd-pipeline",
19
+ * az: "cloud-azure"
20
+ * }));
21
+ */
22
+ function byCommand(map) {
23
+ return (error) => {
24
+ const command = error?.command;
25
+ if (!command)
26
+ return undefined;
27
+ return map[command];
28
+ };
29
+ }
30
+ /**
31
+ * Clasificador de fábrica: prueba una lista de [regex, área] contra el
32
+ * stderr/mensaje del error y devuelve el área del primer patrón que matchee.
33
+ *
34
+ * Ejemplo:
35
+ * notifier.classify(classifiers.byPattern([
36
+ * [/permission denied|unauthorized/i, "security"],
37
+ * [/timeout|ETIMEDOUT|ECONNREFUSED/i, "networking"],
38
+ * [/no space left|ENOSPC/i, "infra"]
39
+ * ]));
40
+ */
41
+ function byPattern(rules) {
42
+ return (error) => {
43
+ const execError = error;
44
+ const text = execError?.stderr || execError?.message || String(error);
45
+ for (const [pattern, area] of rules) {
46
+ if (pattern.test(text)) {
47
+ return area;
48
+ }
49
+ }
50
+ return undefined;
51
+ };
52
+ }
53
+ //# sourceMappingURL=classifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classifiers.js","sourceRoot":"","sources":["../../src/core/classifiers.ts"],"names":[],"mappings":";;AAyBA,8BAYC;AAaD,8BAiBC;AA3DD;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,SAAS,CAAC,GAA2B;IAEjD,OAAO,CAAC,KAAc,EAAE,EAAE;QAEtB,MAAM,OAAO,GAAI,KAAuB,EAAE,OAAO,CAAC;QAElD,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,CAAC,CAAC;AAEN,CAAC;AAED;;;;;;;;;;GAUG;AACH,SAAgB,SAAS,CAAC,KAA8B;IAEpD,OAAO,CAAC,KAAc,EAAE,EAAE;QAEtB,MAAM,SAAS,GAAG,KAAsB,CAAC;QACzC,MAAM,IAAI,GAAG,SAAS,EAAE,MAAM,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;QAEtE,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,IAAI,CAAC;YAChB,CAAC;QACL,CAAC;QAED,OAAO,SAAS,CAAC;IAErB,CAAC,CAAC;AAEN,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface Logger {
2
+ debug(message: string): void;
3
+ info(message: string): void;
4
+ success(message: string): void;
5
+ warn(message: string): void;
6
+ error(message: string): void;
7
+ }
8
+ export declare const logger: Logger;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.logger = void 0;
4
+ const COLORS = {
5
+ reset: "\x1b[0m",
6
+ gray: "\x1b[90m",
7
+ cyan: "\x1b[36m",
8
+ green: "\x1b[32m",
9
+ yellow: "\x1b[33m",
10
+ red: "\x1b[31m"
11
+ };
12
+ function timestamp() {
13
+ return new Date().toISOString().split("T")[1].replace("Z", "");
14
+ }
15
+ function paint(color, label, message) {
16
+ return `${COLORS.gray}[${timestamp()}]${COLORS.reset} ${color}${label}${COLORS.reset} ${message}`;
17
+ }
18
+ exports.logger = {
19
+ debug(message) {
20
+ if (!process.env.DEBUG)
21
+ return;
22
+ console.log(paint(COLORS.gray, "DEBUG", message));
23
+ },
24
+ info(message) {
25
+ console.log(paint(COLORS.cyan, "INFO ", message));
26
+ },
27
+ success(message) {
28
+ console.log(paint(COLORS.green, "OK ", message));
29
+ },
30
+ warn(message) {
31
+ console.warn(paint(COLORS.yellow, "WARN ", message));
32
+ },
33
+ error(message) {
34
+ console.error(paint(COLORS.red, "ERROR", message));
35
+ }
36
+ };
37
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":";;;AAAA,MAAM,MAAM,GAAG;IACX,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,MAAM,EAAE,UAAU;IAClB,GAAG,EAAE,UAAU;CACT,CAAC;AAEX,SAAS,SAAS;IACd,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,KAAK,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe;IACxD,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,SAAS,EAAE,IAAI,MAAM,CAAC,KAAK,IAAI,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;AACtG,CAAC;AAUY,QAAA,MAAM,GAAW;IAE1B,KAAK,CAAC,OAAe;QACjB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,CAAC,OAAe;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,IAAI,CAAC,OAAe;QAChB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,OAAe;QACjB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;CAEJ,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface AskOptions {
2
+ defaultValue?: string;
3
+ }
4
+ export declare function ask(question: string, options?: AskOptions): Promise<string | undefined>;
5
+ export interface ConfirmOptions {
6
+ defaultValue?: boolean;
7
+ }
8
+ export declare function confirm(question: string, options?: ConfirmOptions): Promise<boolean>;
9
+ export type SelectChoices = string[] | Record<string, string>;
10
+ export declare function select(title: string, choices: SelectChoices): Promise<string>;