devhelm 0.1.4 → 0.1.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 (95) hide show
  1. package/dist/commands/alert-channels/test.js +2 -5
  2. package/dist/commands/alert-channels/test.js.map +1 -1
  3. package/dist/commands/api-keys/revoke.js +1 -2
  4. package/dist/commands/api-keys/revoke.js.map +1 -1
  5. package/dist/commands/auth/login.js +7 -12
  6. package/dist/commands/auth/login.js.map +1 -1
  7. package/dist/commands/auth/me.js +6 -8
  8. package/dist/commands/auth/me.js.map +1 -1
  9. package/dist/commands/data/services/status.js +2 -5
  10. package/dist/commands/data/services/status.js.map +1 -1
  11. package/dist/commands/data/services/uptime.js +5 -8
  12. package/dist/commands/data/services/uptime.js.map +1 -1
  13. package/dist/commands/dependencies/track.js +2 -5
  14. package/dist/commands/dependencies/track.js.map +1 -1
  15. package/dist/commands/deploy/force-unlock.js +57 -0
  16. package/dist/commands/deploy/force-unlock.js.map +1 -0
  17. package/dist/commands/deploy/index.js +234 -0
  18. package/dist/commands/deploy/index.js.map +1 -0
  19. package/dist/commands/incidents/resolve.js +2 -7
  20. package/dist/commands/incidents/resolve.js.map +1 -1
  21. package/dist/commands/init.js +102 -27
  22. package/dist/commands/init.js.map +1 -1
  23. package/dist/commands/monitors/pause.js +2 -5
  24. package/dist/commands/monitors/pause.js.map +1 -1
  25. package/dist/commands/monitors/results.js +7 -10
  26. package/dist/commands/monitors/results.js.map +1 -1
  27. package/dist/commands/monitors/resume.js +2 -5
  28. package/dist/commands/monitors/resume.js.map +1 -1
  29. package/dist/commands/monitors/test.js +2 -5
  30. package/dist/commands/monitors/test.js.map +1 -1
  31. package/dist/commands/monitors/versions/get.js +22 -0
  32. package/dist/commands/monitors/versions/get.js.map +1 -0
  33. package/dist/commands/monitors/versions/list.js +30 -0
  34. package/dist/commands/monitors/versions/list.js.map +1 -0
  35. package/dist/commands/notification-policies/test.js +1 -2
  36. package/dist/commands/notification-policies/test.js.map +1 -1
  37. package/dist/commands/plan.js +96 -0
  38. package/dist/commands/plan.js.map +1 -0
  39. package/dist/commands/status.js +4 -6
  40. package/dist/commands/status.js.map +1 -1
  41. package/dist/commands/validate.js +79 -39
  42. package/dist/commands/validate.js.map +1 -1
  43. package/dist/commands/webhooks/test.js +2 -5
  44. package/dist/commands/webhooks/test.js.map +1 -1
  45. package/dist/lib/api-client.js +38 -4
  46. package/dist/lib/api-client.js.map +1 -1
  47. package/dist/lib/auth.js +6 -1
  48. package/dist/lib/auth.js.map +1 -1
  49. package/dist/lib/base-command.js +3 -0
  50. package/dist/lib/base-command.js.map +1 -1
  51. package/dist/lib/crud-commands.js +17 -25
  52. package/dist/lib/crud-commands.js.map +1 -1
  53. package/dist/lib/descriptions.generated.js +7 -3
  54. package/dist/lib/descriptions.generated.js.map +1 -1
  55. package/dist/lib/errors.js +2 -13
  56. package/dist/lib/errors.js.map +1 -1
  57. package/dist/lib/output.js.map +1 -1
  58. package/dist/lib/resource-types.js +2 -0
  59. package/dist/lib/resource-types.js.map +1 -0
  60. package/dist/lib/resources.js +24 -7
  61. package/dist/lib/resources.js.map +1 -1
  62. package/dist/lib/typed-api.js +33 -0
  63. package/dist/lib/typed-api.js.map +1 -0
  64. package/dist/lib/yaml/applier.js +117 -0
  65. package/dist/lib/yaml/applier.js.map +1 -0
  66. package/dist/lib/yaml/differ.js +166 -0
  67. package/dist/lib/yaml/differ.js.map +1 -0
  68. package/dist/lib/yaml/entitlements.js +69 -0
  69. package/dist/lib/yaml/entitlements.js.map +1 -0
  70. package/dist/lib/yaml/handlers.js +480 -0
  71. package/dist/lib/yaml/handlers.js.map +1 -0
  72. package/dist/lib/yaml/index.js +10 -0
  73. package/dist/lib/yaml/index.js.map +1 -0
  74. package/dist/lib/yaml/interpolation.js +77 -0
  75. package/dist/lib/yaml/interpolation.js.map +1 -0
  76. package/dist/lib/yaml/parser.js +140 -0
  77. package/dist/lib/yaml/parser.js.map +1 -0
  78. package/dist/lib/yaml/resolver.js +54 -0
  79. package/dist/lib/yaml/resolver.js.map +1 -0
  80. package/dist/lib/yaml/schema.js +42 -0
  81. package/dist/lib/yaml/schema.js.map +1 -0
  82. package/dist/lib/yaml/state.js +43 -0
  83. package/dist/lib/yaml/state.js.map +1 -0
  84. package/dist/lib/yaml/transform.js +182 -0
  85. package/dist/lib/yaml/transform.js.map +1 -0
  86. package/dist/lib/yaml/types.js +7 -0
  87. package/dist/lib/yaml/types.js.map +1 -0
  88. package/dist/lib/yaml/validator.js +433 -0
  89. package/dist/lib/yaml/validator.js.map +1 -0
  90. package/oclif.manifest.json +584 -225
  91. package/package.json +3 -1
  92. package/dist/commands/incidents/delete.js +0 -4
  93. package/dist/commands/incidents/delete.js.map +0 -1
  94. package/dist/commands/incidents/update.js +0 -4
  95. package/dist/commands/incidents/update.js.map +0 -1
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Parse a YAML string (or multiple files) into a typed DevhelmConfig.
3
+ * Handles env var interpolation, multi-file merging, and defaults application.
4
+ */
5
+ import { readFileSync, existsSync, statSync, readdirSync } from 'node:fs';
6
+ import { join, resolve } from 'node:path';
7
+ import { parse as parseYaml } from 'yaml';
8
+ import { YAML_SECTION_KEYS } from './schema.js';
9
+ import { interpolate, findMissingVariables } from './interpolation.js';
10
+ export class ParseError extends Error {
11
+ file;
12
+ constructor(message, file) {
13
+ super(file ? `${file}: ${message}` : message);
14
+ this.file = file;
15
+ this.name = 'ParseError';
16
+ }
17
+ }
18
+ /**
19
+ * Load and parse a single YAML file with env var interpolation.
20
+ */
21
+ export function parseConfigFile(filePath, resolveEnv = true) {
22
+ const absPath = resolve(filePath);
23
+ if (!existsSync(absPath)) {
24
+ throw new ParseError(`File not found: ${filePath}`);
25
+ }
26
+ const raw = readFileSync(absPath, 'utf8');
27
+ let interpolated;
28
+ if (resolveEnv) {
29
+ const missing = findMissingVariables(raw);
30
+ if (missing.length > 0) {
31
+ throw new ParseError(`Missing required environment variables: ${missing.join(', ')}. ` +
32
+ 'Set them or use ${VAR:-default} syntax for fallbacks.', filePath);
33
+ }
34
+ interpolated = interpolate(raw);
35
+ }
36
+ else {
37
+ interpolated = raw;
38
+ }
39
+ let parsed;
40
+ try {
41
+ parsed = parseYaml(interpolated);
42
+ }
43
+ catch (err) {
44
+ throw new ParseError(`Invalid YAML: ${err instanceof Error ? err.message : String(err)}`, filePath);
45
+ }
46
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
47
+ throw new ParseError('Config file is empty or not a YAML object', filePath);
48
+ }
49
+ return parsed;
50
+ }
51
+ /**
52
+ * Load config from one or more file paths (files or directories).
53
+ * Directories are scanned for *.yml and *.yaml files.
54
+ */
55
+ export function loadConfig(paths, resolveEnv = true) {
56
+ const files = expandPaths(paths);
57
+ if (files.length === 0) {
58
+ throw new ParseError('No YAML files found in the specified paths');
59
+ }
60
+ if (files.length === 1) {
61
+ const config = parseConfigFile(files[0], resolveEnv);
62
+ return applyDefaults(config);
63
+ }
64
+ const configs = files.map((f) => parseConfigFile(f, resolveEnv));
65
+ const merged = mergeConfigs(configs);
66
+ return applyDefaults(merged);
67
+ }
68
+ /**
69
+ * Expand file/directory paths into a flat list of .yml/.yaml files.
70
+ */
71
+ function expandPaths(paths) {
72
+ const files = [];
73
+ for (const p of paths) {
74
+ const absPath = resolve(p);
75
+ if (!existsSync(absPath)) {
76
+ throw new ParseError(`Path not found: ${p}`);
77
+ }
78
+ const stat = statSync(absPath);
79
+ if (stat.isDirectory()) {
80
+ const entries = readdirSync(absPath)
81
+ .filter((f) => f.endsWith('.yml') || f.endsWith('.yaml'))
82
+ .sort()
83
+ .map((f) => join(absPath, f));
84
+ files.push(...entries);
85
+ }
86
+ else {
87
+ files.push(absPath);
88
+ }
89
+ }
90
+ return files;
91
+ }
92
+ /**
93
+ * Merge multiple configs. Arrays are concatenated. Duplicate ref keys are caught by the validator.
94
+ * Uses YAML_SECTION_KEYS so adding a new section is a compile-time addition, not a manual edit here.
95
+ */
96
+ function mergeConfigs(configs) {
97
+ const merged = {};
98
+ for (const cfg of configs) {
99
+ if (cfg.version !== undefined)
100
+ merged.version = cfg.version;
101
+ if (cfg.defaults) {
102
+ merged.defaults = merged.defaults ?? {};
103
+ if (cfg.defaults.monitors) {
104
+ merged.defaults.monitors = { ...merged.defaults.monitors, ...cfg.defaults.monitors };
105
+ }
106
+ }
107
+ for (const key of YAML_SECTION_KEYS) {
108
+ const items = cfg[key];
109
+ if (items) {
110
+ const dest = merged;
111
+ dest[key] = [...(dest[key] ?? []), ...items];
112
+ }
113
+ }
114
+ }
115
+ return merged;
116
+ }
117
+ /**
118
+ * Apply defaults.monitors to each monitor that doesn't override the field.
119
+ * Shallow merge: if monitor defines a field, it wins entirely (no deep merge).
120
+ */
121
+ function applyDefaults(config) {
122
+ const defaults = config.defaults?.monitors;
123
+ if (!defaults || !config.monitors?.length)
124
+ return config;
125
+ return {
126
+ ...config,
127
+ monitors: config.monitors.map((m) => applyMonitorDefaults(m, defaults)),
128
+ };
129
+ }
130
+ function applyMonitorDefaults(monitor, defaults) {
131
+ return {
132
+ ...monitor,
133
+ frequency: monitor.frequency ?? defaults.frequency,
134
+ enabled: monitor.enabled ?? defaults.enabled,
135
+ regions: monitor.regions ?? defaults.regions,
136
+ alertChannels: monitor.alertChannels ?? defaults.alertChannels,
137
+ incidentPolicy: monitor.incidentPolicy ?? defaults.incidentPolicy,
138
+ };
139
+ }
140
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/lib/yaml/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { allHandlers } from './handlers.js';
2
+ export class ResolvedRefs {
3
+ maps = new Map();
4
+ get(type, refKey) {
5
+ return this.maps.get(type)?.get(refKey);
6
+ }
7
+ resolve(type, refKey) {
8
+ return this.maps.get(type)?.get(refKey)?.id;
9
+ }
10
+ require(type, refKey) {
11
+ const id = this.resolve(type, refKey);
12
+ if (!id) {
13
+ throw new Error(`Cannot resolve ${type} reference "${refKey}" — not found in YAML or API`);
14
+ }
15
+ return id;
16
+ }
17
+ set(type, refKey, entry) {
18
+ if (!this.maps.has(type))
19
+ this.maps.set(type, new Map());
20
+ this.maps.get(type).set(refKey, entry);
21
+ }
22
+ all(type) {
23
+ return (this.maps.get(type) ?? new Map());
24
+ }
25
+ allEntries(type) {
26
+ return [...this.all(type).values()];
27
+ }
28
+ }
29
+ /**
30
+ * Fetch all resources from the API via handler.fetchAll() and build
31
+ * reference maps using handler metadata (getApiRefKey, getApiId, etc.).
32
+ */
33
+ export async function fetchAllRefs(client) {
34
+ const refs = new ResolvedRefs();
35
+ const handlers = allHandlers();
36
+ const results = await Promise.all(handlers.map((h) => h.fetchAll(client)));
37
+ for (let i = 0; i < handlers.length; i++) {
38
+ const handler = handlers[i];
39
+ for (const item of results[i]) {
40
+ const refKey = handler.getApiRefKey(item);
41
+ // Handler.fetchAll() returns the correct DTO for its refType but TS
42
+ // can't narrow the correlation. The cast is safe — each handler's
43
+ // fetchAll returns exactly RefTypeDtoMap[handler.refType].
44
+ refs.set(handler.refType, refKey, {
45
+ id: handler.getApiId(item),
46
+ refKey,
47
+ managedBy: handler.getManagedBy?.(item),
48
+ raw: item,
49
+ });
50
+ }
51
+ }
52
+ return refs;
53
+ }
54
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/lib/yaml/resolver.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AAWzC,MAAM,OAAO,YAAY;IACf,IAAI,GAAG,IAAI,GAAG,EAAkC,CAAA;IAExD,GAAG,CAAoB,IAAO,EAAE,MAAc;QAC5C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAA4B,CAAA;IACpE,CAAC;IAED,OAAO,CAAC,IAAa,EAAE,MAAc;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAA;IAC7C,CAAC;IAED,OAAO,CAAC,IAAa,EAAE,MAAc;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QACrC,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,kBAAkB,IAAI,eAAe,MAAM,8BAA8B,CAAC,CAAA;QAC5F,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAED,GAAG,CAAoB,IAAO,EAAE,MAAc,EAAE,KAAkB;QAChE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACxD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC,GAAG,CAAC,MAAM,EAAE,KAAiB,CAAC,CAAA;IACrD,CAAC;IAED,GAAG,CAAoB,IAAO;QAC5B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAA6B,CAAA;IACvE,CAAC;IAED,UAAU,CAAoB,IAAO;QACnC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IACrC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAiB;IAClD,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAA;IAE9B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC3B,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAA;YACzC,oEAAoE;YACpE,mEAAmE;YACnE,2DAA2D;YAC3D,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE;gBAChC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC1B,MAAM;gBACN,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC;gBACvC,GAAG,EAAE,IAAuB;aAC7B,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC"}
@@ -0,0 +1,42 @@
1
+ // ── Enum constants for validation ──────────────────────────────────────
2
+ export const MONITOR_TYPES = ['HTTP', 'DNS', 'TCP', 'ICMP', 'HEARTBEAT', 'MCP_SERVER'];
3
+ export const HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD'];
4
+ export const DNS_RECORD_TYPES = ['A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SRV', 'SOA', 'CAA', 'PTR'];
5
+ export const ASSERTION_SEVERITIES = ['fail', 'warn'];
6
+ export const COMPARISON_OPERATORS = ['equals', 'contains', 'less_than', 'greater_than', 'matches', 'range'];
7
+ export const TRIGGER_RULE_TYPES = ['consecutive_failures', 'failures_in_window', 'response_time'];
8
+ export const TRIGGER_SCOPES = ['per_region', 'any_region'];
9
+ export const TRIGGER_SEVERITIES = ['down', 'degraded'];
10
+ export const TRIGGER_AGGREGATIONS = ['all_exceed', 'average', 'p95', 'max'];
11
+ export const CHANNEL_TYPES = ['slack', 'email', 'pagerduty', 'opsgenie', 'discord', 'teams', 'webhook'];
12
+ export const ALERT_SENSITIVITIES = ['ALL', 'INCIDENTS_ONLY', 'MAJOR_ONLY'];
13
+ export const HEALTH_THRESHOLD_TYPES = ['COUNT', 'PERCENTAGE'];
14
+ export const MIN_FREQUENCY = 30;
15
+ export const MAX_FREQUENCY = 86400;
16
+ // ── Assertion type names (discriminator values) ────────────────────────
17
+ export const ASSERTION_TYPES = [
18
+ 'StatusCodeAssertion', 'ResponseTimeAssertion', 'ResponseTimeWarnAssertion',
19
+ 'BodyContainsAssertion', 'RegexBodyAssertion', 'HeaderValueAssertion',
20
+ 'JsonPathAssertion', 'SslExpiryAssertion', 'ResponseSizeAssertion',
21
+ 'RedirectCountAssertion', 'RedirectTargetAssertion',
22
+ 'DnsResolvesAssertion', 'DnsResponseTimeAssertion', 'DnsResponseTimeWarnAssertion',
23
+ 'DnsExpectedIpsAssertion', 'DnsExpectedCnameAssertion',
24
+ 'DnsRecordContainsAssertion', 'DnsRecordEqualsAssertion',
25
+ 'DnsTxtContainsAssertion', 'DnsMinAnswersAssertion', 'DnsMaxAnswersAssertion',
26
+ 'DnsTtlLowAssertion', 'DnsTtlHighAssertion',
27
+ 'TcpConnectsAssertion', 'TcpResponseTimeAssertion', 'TcpResponseTimeWarnAssertion',
28
+ 'IcmpReachableAssertion', 'IcmpResponseTimeAssertion', 'IcmpResponseTimeWarnAssertion',
29
+ 'IcmpPacketLossAssertion',
30
+ 'HeartbeatReceivedAssertion', 'HeartbeatMaxIntervalAssertion',
31
+ 'HeartbeatIntervalDriftAssertion', 'HeartbeatPayloadContainsAssertion',
32
+ 'McpConnectsAssertion', 'McpResponseTimeAssertion', 'McpResponseTimeWarnAssertion',
33
+ 'McpHasCapabilityAssertion', 'McpToolAvailableAssertion',
34
+ 'McpMinToolsAssertion', 'McpProtocolVersionAssertion', 'McpToolCountChangedAssertion',
35
+ ];
36
+ // ── Section keys (for parity enforcement) ──────────────────────────────
37
+ export const YAML_SECTION_KEYS = [
38
+ 'tags', 'environments', 'secrets', 'alertChannels',
39
+ 'notificationPolicies', 'webhooks', 'resourceGroups',
40
+ 'monitors', 'dependencies',
41
+ ];
42
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/lib/yaml/schema.ts"],"names":[],"mappings":"AA4BA,0EAA0E;AAE1E,MAAM,CAAC,MAAM,aAAa,GAA2B,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAA;AAC9G,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AACxH,MAAM,CAAC,MAAM,oBAAoB,GAAiC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AAClF,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC,CAAA;AAC9H,MAAM,CAAC,MAAM,kBAAkB,GAA+B,CAAC,sBAAsB,EAAE,oBAAoB,EAAE,eAAe,CAAC,CAAA;AAC7H,MAAM,CAAC,MAAM,cAAc,GAAsB,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;AAC7E,MAAM,CAAC,MAAM,kBAAkB,GAAmC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AACtF,MAAM,CAAC,MAAM,oBAAoB,GAAsB,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAC9F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAU,CAAA;AAEhH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,gBAAgB,EAAE,YAAY,CAAU,CAAA;AACnF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,OAAO,EAAE,YAAY,CAAU,CAAA;AAEtE,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAA;AAC/B,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAA;AAElC,0EAA0E;AAE1E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,qBAAqB,EAAE,uBAAuB,EAAE,2BAA2B;IAC3E,uBAAuB,EAAE,oBAAoB,EAAE,sBAAsB;IACrE,mBAAmB,EAAE,oBAAoB,EAAE,uBAAuB;IAClE,wBAAwB,EAAE,yBAAyB;IACnD,sBAAsB,EAAE,0BAA0B,EAAE,8BAA8B;IAClF,yBAAyB,EAAE,2BAA2B;IACtD,4BAA4B,EAAE,0BAA0B;IACxD,yBAAyB,EAAE,wBAAwB,EAAE,wBAAwB;IAC7E,oBAAoB,EAAE,qBAAqB;IAC3C,sBAAsB,EAAE,0BAA0B,EAAE,8BAA8B;IAClF,wBAAwB,EAAE,2BAA2B,EAAE,+BAA+B;IACtF,yBAAyB;IACzB,4BAA4B,EAAE,+BAA+B;IAC7D,iCAAiC,EAAE,mCAAmC;IACtE,sBAAsB,EAAE,0BAA0B,EAAE,8BAA8B;IAClF,2BAA2B,EAAE,2BAA2B;IACxD,sBAAsB,EAAE,6BAA6B,EAAE,8BAA8B;CAC7E,CAAA;AAiTV,0EAA0E;AAE1E,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,eAAe;IAClD,sBAAsB,EAAE,UAAU,EAAE,gBAAgB;IACpD,UAAU,EAAE,cAAc;CAClB,CAAA"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Local state file for tracking resources managed by `devhelm deploy`.
3
+ * Reserved for future use (e.g. offline drift detection, state-aware pruning).
4
+ *
5
+ * State file: .devhelm/state.json (gitignored by convention)
6
+ */
7
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
8
+ import { join, dirname } from 'node:path';
9
+ const STATE_DIR = '.devhelm';
10
+ const STATE_FILE = 'state.json';
11
+ export const STATE_VERSION = '1';
12
+ function statePath(cwd) {
13
+ return join(cwd, STATE_DIR, STATE_FILE);
14
+ }
15
+ export function readState(cwd = process.cwd()) {
16
+ const path = statePath(cwd);
17
+ if (!existsSync(path))
18
+ return undefined;
19
+ try {
20
+ return JSON.parse(readFileSync(path, 'utf8'));
21
+ }
22
+ catch (err) {
23
+ const msg = err instanceof Error ? err.message : String(err);
24
+ console.warn(`Warning: corrupt state file at ${path} (${msg}). Treating as fresh state.`);
25
+ return undefined;
26
+ }
27
+ }
28
+ export function writeState(state, cwd = process.cwd()) {
29
+ const path = statePath(cwd);
30
+ const dir = dirname(path);
31
+ if (!existsSync(dir)) {
32
+ mkdirSync(dir, { recursive: true });
33
+ }
34
+ writeFileSync(path, JSON.stringify(state, null, 2));
35
+ }
36
+ export function buildState(entries) {
37
+ return {
38
+ version: STATE_VERSION,
39
+ lastDeployedAt: new Date().toISOString(),
40
+ resources: entries,
41
+ };
42
+ }
43
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../src/lib/yaml/state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAC,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAC,MAAM,SAAS,CAAA;AAC1E,OAAO,EAAC,IAAI,EAAE,OAAO,EAAC,MAAM,WAAW,CAAA;AAevC,MAAM,SAAS,GAAG,UAAU,CAAA;AAC5B,MAAM,UAAU,GAAG,YAAY,CAAA;AAC/B,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAA;AAEhC,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AACzC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;IACnD,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC3B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAgB,CAAA;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,kCAAkC,IAAI,KAAK,GAAG,6BAA6B,CAAC,CAAA;QACzF,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAkB,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACxE,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,IAAI,EAAC,CAAC,CAAA;IACnC,CAAC;IACD,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAqB;IAC9C,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,cAAc,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACxC,SAAS,EAAE,OAAO;KACnB,CAAA;AACH,CAAC"}
@@ -0,0 +1,182 @@
1
+ // ── Channel type discriminator mapping ─────────────────────────────────
2
+ const CHANNEL_TYPE_DISCRIMINATOR = {
3
+ slack: 'SlackChannelConfig',
4
+ discord: 'DiscordChannelConfig',
5
+ email: 'EmailChannelConfig',
6
+ webhook: 'WebhookChannelConfig',
7
+ pagerduty: 'PagerDutyChannelConfig',
8
+ opsgenie: 'OpsGenieChannelConfig',
9
+ teams: 'TeamsChannelConfig',
10
+ };
11
+ // ── Tag ────────────────────────────────────────────────────────────────
12
+ export function toCreateTagRequest(tag) {
13
+ return {
14
+ name: tag.name,
15
+ color: tag.color ?? null,
16
+ };
17
+ }
18
+ // ── Environment ────────────────────────────────────────────────────────
19
+ export function toCreateEnvironmentRequest(env) {
20
+ return {
21
+ name: env.name,
22
+ slug: env.slug,
23
+ variables: env.variables ?? null,
24
+ isDefault: env.isDefault,
25
+ };
26
+ }
27
+ // ── Secret ─────────────────────────────────────────────────────────────
28
+ export function toCreateSecretRequest(secret) {
29
+ return { key: secret.key, value: secret.value };
30
+ }
31
+ // ── Alert Channel ──────────────────────────────────────────────────────
32
+ export function toCreateAlertChannelRequest(channel) {
33
+ const channelType = CHANNEL_TYPE_DISCRIMINATOR[channel.type];
34
+ const config = { channelType, ...channel.config };
35
+ return { name: channel.name, config };
36
+ }
37
+ // ── Notification Policy ────────────────────────────────────────────────
38
+ export function toCreateNotificationPolicyRequest(policy, refs) {
39
+ return {
40
+ name: policy.name,
41
+ enabled: policy.enabled ?? true,
42
+ priority: policy.priority ?? 0,
43
+ matchRules: policy.matchRules?.map((r) => toMatchRule(r, refs)),
44
+ escalation: {
45
+ steps: policy.escalation.steps.map((s) => toEscalationStep(s, refs)),
46
+ onResolve: policy.escalation.onResolve ?? null,
47
+ onReopen: policy.escalation.onReopen ?? null,
48
+ },
49
+ };
50
+ }
51
+ function toEscalationStep(step, refs) {
52
+ return {
53
+ channelIds: step.channels.map((name) => refs.require('alertChannels', name)),
54
+ delayMinutes: step.delayMinutes ?? 0,
55
+ requireAck: step.requireAck ?? null,
56
+ repeatIntervalSeconds: step.repeatIntervalSeconds ?? null,
57
+ };
58
+ }
59
+ function toMatchRule(rule, refs) {
60
+ return {
61
+ type: rule.type,
62
+ value: rule.value ?? null,
63
+ monitorIds: rule.monitorNames?.map((name) => refs.require('monitors', name)) ?? null,
64
+ regions: rule.regions ?? null,
65
+ values: rule.values ?? null,
66
+ };
67
+ }
68
+ // ── Webhook ────────────────────────────────────────────────────────────
69
+ export function toCreateWebhookRequest(webhook) {
70
+ return {
71
+ url: webhook.url,
72
+ subscribedEvents: webhook.events,
73
+ description: webhook.description,
74
+ };
75
+ }
76
+ // ── Resource Group ─────────────────────────────────────────────────────
77
+ export function toCreateResourceGroupRequest(group, refs) {
78
+ return {
79
+ name: group.name,
80
+ description: group.description ?? null,
81
+ alertPolicyId: group.alertPolicy ? refs.resolve('notificationPolicies', group.alertPolicy) ?? null : null,
82
+ defaultFrequency: group.defaultFrequency ?? null,
83
+ defaultRegions: group.defaultRegions ?? null,
84
+ defaultRetryStrategy: group.defaultRetryStrategy ? {
85
+ type: group.defaultRetryStrategy.type,
86
+ maxRetries: group.defaultRetryStrategy.maxRetries,
87
+ interval: group.defaultRetryStrategy.interval,
88
+ } : undefined,
89
+ defaultAlertChannels: group.defaultAlertChannels?.map((n) => refs.resolve('alertChannels', n) ?? n) ?? null,
90
+ defaultEnvironmentId: group.defaultEnvironment ? refs.resolve('environments', group.defaultEnvironment) ?? null : null,
91
+ healthThresholdType: group.healthThresholdType ?? null,
92
+ healthThresholdValue: group.healthThresholdValue ?? null,
93
+ suppressMemberAlerts: group.suppressMemberAlerts,
94
+ confirmationDelaySeconds: group.confirmationDelaySeconds ?? null,
95
+ recoveryCooldownMinutes: group.recoveryCooldownMinutes ?? null,
96
+ };
97
+ }
98
+ // ── Monitor ────────────────────────────────────────────────────────────
99
+ export function toCreateMonitorRequest(monitor, refs) {
100
+ return {
101
+ name: monitor.name,
102
+ type: monitor.type,
103
+ config: monitor.config,
104
+ managedBy: 'CLI',
105
+ frequencySeconds: monitor.frequency,
106
+ enabled: monitor.enabled,
107
+ regions: monitor.regions ?? null,
108
+ environmentId: monitor.environment ? refs.resolve('environments', monitor.environment) ?? null : null,
109
+ assertions: monitor.assertions?.map(toCreateAssertionRequest) ?? null,
110
+ auth: monitor.auth ? toAuthConfig(monitor.auth, refs) : undefined,
111
+ incidentPolicy: monitor.incidentPolicy ? toIncidentPolicy(monitor.incidentPolicy) : undefined,
112
+ alertChannelIds: monitor.alertChannels?.map((n) => refs.require('alertChannels', n)) ?? null,
113
+ tags: monitor.tags ? {
114
+ tagIds: monitor.tags.map((n) => refs.resolve('tags', n)).filter((id) => id !== undefined),
115
+ newTags: monitor.tags
116
+ .filter((n) => !refs.resolve('tags', n))
117
+ .map((n) => ({ name: n })),
118
+ } : undefined,
119
+ };
120
+ }
121
+ export function toUpdateMonitorRequest(monitor, refs) {
122
+ return {
123
+ name: monitor.name,
124
+ config: monitor.config,
125
+ managedBy: 'CLI',
126
+ frequencySeconds: monitor.frequency,
127
+ enabled: monitor.enabled,
128
+ regions: monitor.regions ?? null,
129
+ environmentId: monitor.environment ? refs.resolve('environments', monitor.environment) ?? null : null,
130
+ assertions: monitor.assertions?.map(toCreateAssertionRequest) ?? null,
131
+ auth: monitor.auth ? toAuthConfig(monitor.auth, refs) : undefined,
132
+ incidentPolicy: monitor.incidentPolicy ? toIncidentPolicy(monitor.incidentPolicy) : undefined,
133
+ alertChannelIds: monitor.alertChannels?.map((n) => refs.require('alertChannels', n)) ?? null,
134
+ tags: monitor.tags ? {
135
+ tagIds: monitor.tags.map((n) => refs.resolve('tags', n)).filter((id) => id !== undefined),
136
+ newTags: monitor.tags
137
+ .filter((n) => !refs.resolve('tags', n))
138
+ .map((n) => ({ name: n })),
139
+ } : undefined,
140
+ };
141
+ }
142
+ export function toCreateAssertionRequest(a) {
143
+ const config = { type: a.type, ...(a.config ?? {}) };
144
+ return { config, severity: a.severity };
145
+ }
146
+ export function toAuthConfig(auth, refs) {
147
+ const secretId = refs.resolve('secrets', auth.secret) ?? undefined;
148
+ switch (auth.type) {
149
+ case 'BearerAuthConfig':
150
+ return { type: 'BearerAuthConfig', vaultSecretId: secretId ?? null };
151
+ case 'BasicAuthConfig':
152
+ return { type: 'BasicAuthConfig', vaultSecretId: secretId ?? null };
153
+ case 'ApiKeyAuthConfig':
154
+ return { type: 'ApiKeyAuthConfig', headerName: auth.headerName, vaultSecretId: secretId ?? null };
155
+ case 'HeaderAuthConfig':
156
+ return { type: 'HeaderAuthConfig', headerName: auth.headerName, vaultSecretId: secretId ?? null };
157
+ }
158
+ }
159
+ export function toIncidentPolicy(policy) {
160
+ return {
161
+ triggerRules: policy.triggerRules.map((r) => ({
162
+ type: r.type,
163
+ count: r.count ?? null,
164
+ windowMinutes: r.windowMinutes ?? null,
165
+ scope: r.scope,
166
+ thresholdMs: r.thresholdMs ?? null,
167
+ severity: r.severity,
168
+ aggregationType: r.aggregationType ?? null,
169
+ })),
170
+ confirmation: {
171
+ type: policy.confirmation.type,
172
+ minRegionsFailing: policy.confirmation.minRegionsFailing,
173
+ maxWaitSeconds: policy.confirmation.maxWaitSeconds,
174
+ },
175
+ recovery: {
176
+ consecutiveSuccesses: policy.recovery.consecutiveSuccesses,
177
+ minRegionsPassing: policy.recovery.minRegionsPassing,
178
+ cooldownMinutes: policy.recovery.cooldownMinutes,
179
+ },
180
+ };
181
+ }
182
+ //# sourceMappingURL=transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../src/lib/yaml/transform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /** Dependency order for topological sort (creates ascending, deletes descending). */
2
+ export const RESOURCE_ORDER = [
3
+ 'tag', 'environment', 'secret', 'alertChannel',
4
+ 'notificationPolicy', 'webhook', 'resourceGroup',
5
+ 'monitor', 'dependency', 'groupMembership',
6
+ ];
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/yaml/types.ts"],"names":[],"mappings":"AA2DA,qFAAqF;AACrF,MAAM,CAAC,MAAM,cAAc,GAAmB;IAC5C,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc;IAC9C,oBAAoB,EAAE,SAAS,EAAE,eAAe;IAChD,SAAS,EAAE,YAAY,EAAE,iBAAiB;CAC3C,CAAA"}