@marcusrbrown/infra 0.15.3 → 0.19.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 (2) hide show
  1. package/dist/cli.js +252 -151
  2. package/package.json +2 -2
package/dist/cli.js CHANGED
@@ -4,7 +4,7 @@ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports,
4
4
  var __require = import.meta.require;
5
5
 
6
6
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/identity.js
7
- var require_identity = __commonJS((exports) => {
7
+ var require_identity = __commonJS(function(exports) {
8
8
  var ALIAS = Symbol.for("yaml.alias");
9
9
  var DOC = Symbol.for("yaml.document");
10
10
  var MAP = Symbol.for("yaml.map");
@@ -58,7 +58,7 @@ var require_identity = __commonJS((exports) => {
58
58
  });
59
59
 
60
60
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/visit.js
61
- var require_visit = __commonJS((exports) => {
61
+ var require_visit = __commonJS(function(exports) {
62
62
  var identity = require_identity();
63
63
  var BREAK = Symbol("break visit");
64
64
  var SKIP = Symbol("skip children");
@@ -213,7 +213,7 @@ var require_visit = __commonJS((exports) => {
213
213
  });
214
214
 
215
215
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/directives.js
216
- var require_directives = __commonJS((exports) => {
216
+ var require_directives = __commonJS(function(exports) {
217
217
  var identity = require_identity();
218
218
  var visit = require_visit();
219
219
  var escapeChars = {
@@ -365,7 +365,7 @@ var require_directives = __commonJS((exports) => {
365
365
  });
366
366
 
367
367
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/anchors.js
368
- var require_anchors = __commonJS((exports) => {
368
+ var require_anchors = __commonJS(function(exports) {
369
369
  var identity = require_identity();
370
370
  var visit = require_visit();
371
371
  function anchorIsValid(anchor) {
@@ -427,7 +427,7 @@ var require_anchors = __commonJS((exports) => {
427
427
  });
428
428
 
429
429
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/applyReviver.js
430
- var require_applyReviver = __commonJS((exports) => {
430
+ var require_applyReviver = __commonJS(function(exports) {
431
431
  function applyReviver(reviver, obj, key, val) {
432
432
  if (val && typeof val === "object") {
433
433
  if (Array.isArray(val)) {
@@ -474,7 +474,7 @@ var require_applyReviver = __commonJS((exports) => {
474
474
  });
475
475
 
476
476
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/toJS.js
477
- var require_toJS = __commonJS((exports) => {
477
+ var require_toJS = __commonJS(function(exports) {
478
478
  var identity = require_identity();
479
479
  function toJS(value, arg, ctx) {
480
480
  if (Array.isArray(value))
@@ -501,7 +501,7 @@ var require_toJS = __commonJS((exports) => {
501
501
  });
502
502
 
503
503
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Node.js
504
- var require_Node = __commonJS((exports) => {
504
+ var require_Node = __commonJS(function(exports) {
505
505
  var applyReviver = require_applyReviver();
506
506
  var identity = require_identity();
507
507
  var toJS = require_toJS();
@@ -538,7 +538,7 @@ var require_Node = __commonJS((exports) => {
538
538
  });
539
539
 
540
540
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Alias.js
541
- var require_Alias = __commonJS((exports) => {
541
+ var require_Alias = __commonJS(function(exports) {
542
542
  var anchors = require_anchors();
543
543
  var visit = require_visit();
544
544
  var identity = require_identity();
@@ -648,7 +648,7 @@ var require_Alias = __commonJS((exports) => {
648
648
  });
649
649
 
650
650
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Scalar.js
651
- var require_Scalar = __commonJS((exports) => {
651
+ var require_Scalar = __commonJS(function(exports) {
652
652
  var identity = require_identity();
653
653
  var Node = require_Node();
654
654
  var toJS = require_toJS();
@@ -676,7 +676,7 @@ var require_Scalar = __commonJS((exports) => {
676
676
  });
677
677
 
678
678
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/createNode.js
679
- var require_createNode = __commonJS((exports) => {
679
+ var require_createNode = __commonJS(function(exports) {
680
680
  var Alias = require_Alias();
681
681
  var identity = require_identity();
682
682
  var Scalar = require_Scalar();
@@ -748,7 +748,7 @@ var require_createNode = __commonJS((exports) => {
748
748
  });
749
749
 
750
750
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Collection.js
751
- var require_Collection = __commonJS((exports) => {
751
+ var require_Collection = __commonJS(function(exports) {
752
752
  var createNode = require_createNode();
753
753
  var identity = require_identity();
754
754
  var Node = require_Node();
@@ -863,7 +863,7 @@ var require_Collection = __commonJS((exports) => {
863
863
  });
864
864
 
865
865
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyComment.js
866
- var require_stringifyComment = __commonJS((exports) => {
866
+ var require_stringifyComment = __commonJS(function(exports) {
867
867
  var stringifyComment = (str) => str.replace(/^(?!$)(?: $)?/gm, "#");
868
868
  function indentComment(comment, indent) {
869
869
  if (/^\n+$/.test(comment))
@@ -880,7 +880,7 @@ var require_stringifyComment = __commonJS((exports) => {
880
880
  });
881
881
 
882
882
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/foldFlowLines.js
883
- var require_foldFlowLines = __commonJS((exports) => {
883
+ var require_foldFlowLines = __commonJS(function(exports) {
884
884
  var FOLD_FLOW = "flow";
885
885
  var FOLD_BLOCK = "block";
886
886
  var FOLD_QUOTED = "quoted";
@@ -1017,7 +1017,7 @@ ${indent}${text.slice(fold + 1, end2)}`;
1017
1017
  });
1018
1018
 
1019
1019
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyString.js
1020
- var require_stringifyString = __commonJS((exports) => {
1020
+ var require_stringifyString = __commonJS(function(exports) {
1021
1021
  var Scalar = require_Scalar();
1022
1022
  var foldFlowLines = require_foldFlowLines();
1023
1023
  var getFoldOptions = (ctx, isBlock) => ({
@@ -1315,7 +1315,7 @@ ${indent}`);
1315
1315
  });
1316
1316
 
1317
1317
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringify.js
1318
- var require_stringify = __commonJS((exports) => {
1318
+ var require_stringify = __commonJS(function(exports) {
1319
1319
  var anchors = require_anchors();
1320
1320
  var identity = require_identity();
1321
1321
  var stringifyComment = require_stringifyComment();
@@ -1436,7 +1436,7 @@ ${ctx.indent}${str}`;
1436
1436
  });
1437
1437
 
1438
1438
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyPair.js
1439
- var require_stringifyPair = __commonJS((exports) => {
1439
+ var require_stringifyPair = __commonJS(function(exports) {
1440
1440
  var identity = require_identity();
1441
1441
  var Scalar = require_Scalar();
1442
1442
  var stringify = require_stringify();
@@ -1572,7 +1572,7 @@ ${ctx.indent}`;
1572
1572
  });
1573
1573
 
1574
1574
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/log.js
1575
- var require_log = __commonJS((exports) => {
1575
+ var require_log = __commonJS(function(exports) {
1576
1576
  var node_process = __require("process");
1577
1577
  function debug(logLevel, ...messages) {
1578
1578
  if (logLevel === "debug")
@@ -1591,7 +1591,7 @@ var require_log = __commonJS((exports) => {
1591
1591
  });
1592
1592
 
1593
1593
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/merge.js
1594
- var require_merge = __commonJS((exports) => {
1594
+ var require_merge = __commonJS(function(exports) {
1595
1595
  var identity = require_identity();
1596
1596
  var Scalar = require_Scalar();
1597
1597
  var MERGE_KEY = "<<";
@@ -1648,7 +1648,7 @@ var require_merge = __commonJS((exports) => {
1648
1648
  });
1649
1649
 
1650
1650
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/addPairToJSMap.js
1651
- var require_addPairToJSMap = __commonJS((exports) => {
1651
+ var require_addPairToJSMap = __commonJS(function(exports) {
1652
1652
  var log = require_log();
1653
1653
  var merge = require_merge();
1654
1654
  var stringify = require_stringify();
@@ -1709,7 +1709,7 @@ var require_addPairToJSMap = __commonJS((exports) => {
1709
1709
  });
1710
1710
 
1711
1711
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/Pair.js
1712
- var require_Pair = __commonJS((exports) => {
1712
+ var require_Pair = __commonJS(function(exports) {
1713
1713
  var createNode = require_createNode();
1714
1714
  var stringifyPair = require_stringifyPair();
1715
1715
  var addPairToJSMap = require_addPairToJSMap();
@@ -1747,7 +1747,7 @@ var require_Pair = __commonJS((exports) => {
1747
1747
  });
1748
1748
 
1749
1749
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyCollection.js
1750
- var require_stringifyCollection = __commonJS((exports) => {
1750
+ var require_stringifyCollection = __commonJS(function(exports) {
1751
1751
  var identity = require_identity();
1752
1752
  var stringify = require_stringify();
1753
1753
  var stringifyComment = require_stringifyComment();
@@ -1899,7 +1899,7 @@ ${indent}${end}`;
1899
1899
  });
1900
1900
 
1901
1901
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLMap.js
1902
- var require_YAMLMap = __commonJS((exports) => {
1902
+ var require_YAMLMap = __commonJS(function(exports) {
1903
1903
  var stringifyCollection = require_stringifyCollection();
1904
1904
  var addPairToJSMap = require_addPairToJSMap();
1905
1905
  var Collection = require_Collection();
@@ -2026,7 +2026,7 @@ var require_YAMLMap = __commonJS((exports) => {
2026
2026
  });
2027
2027
 
2028
2028
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/map.js
2029
- var require_map = __commonJS((exports) => {
2029
+ var require_map = __commonJS(function(exports) {
2030
2030
  var identity = require_identity();
2031
2031
  var YAMLMap = require_YAMLMap();
2032
2032
  var map = {
@@ -2045,7 +2045,7 @@ var require_map = __commonJS((exports) => {
2045
2045
  });
2046
2046
 
2047
2047
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/nodes/YAMLSeq.js
2048
- var require_YAMLSeq = __commonJS((exports) => {
2048
+ var require_YAMLSeq = __commonJS(function(exports) {
2049
2049
  var createNode = require_createNode();
2050
2050
  var stringifyCollection = require_stringifyCollection();
2051
2051
  var Collection = require_Collection();
@@ -2138,7 +2138,7 @@ var require_YAMLSeq = __commonJS((exports) => {
2138
2138
  });
2139
2139
 
2140
2140
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/seq.js
2141
- var require_seq = __commonJS((exports) => {
2141
+ var require_seq = __commonJS(function(exports) {
2142
2142
  var identity = require_identity();
2143
2143
  var YAMLSeq = require_YAMLSeq();
2144
2144
  var seq = {
@@ -2157,7 +2157,7 @@ var require_seq = __commonJS((exports) => {
2157
2157
  });
2158
2158
 
2159
2159
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/string.js
2160
- var require_string = __commonJS((exports) => {
2160
+ var require_string = __commonJS(function(exports) {
2161
2161
  var stringifyString = require_stringifyString();
2162
2162
  var string = {
2163
2163
  identify: (value) => typeof value === "string",
@@ -2173,7 +2173,7 @@ var require_string = __commonJS((exports) => {
2173
2173
  });
2174
2174
 
2175
2175
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/common/null.js
2176
- var require_null = __commonJS((exports) => {
2176
+ var require_null = __commonJS(function(exports) {
2177
2177
  var Scalar = require_Scalar();
2178
2178
  var nullTag = {
2179
2179
  identify: (value) => value == null,
@@ -2188,7 +2188,7 @@ var require_null = __commonJS((exports) => {
2188
2188
  });
2189
2189
 
2190
2190
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/bool.js
2191
- var require_bool = __commonJS((exports) => {
2191
+ var require_bool = __commonJS(function(exports) {
2192
2192
  var Scalar = require_Scalar();
2193
2193
  var boolTag = {
2194
2194
  identify: (value) => typeof value === "boolean",
@@ -2209,7 +2209,7 @@ var require_bool = __commonJS((exports) => {
2209
2209
  });
2210
2210
 
2211
2211
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyNumber.js
2212
- var require_stringifyNumber = __commonJS((exports) => {
2212
+ var require_stringifyNumber = __commonJS(function(exports) {
2213
2213
  function stringifyNumber({ format, minFractionDigits, tag, value }) {
2214
2214
  if (typeof value === "bigint")
2215
2215
  return String(value);
@@ -2233,7 +2233,7 @@ var require_stringifyNumber = __commonJS((exports) => {
2233
2233
  });
2234
2234
 
2235
2235
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/float.js
2236
- var require_float = __commonJS((exports) => {
2236
+ var require_float = __commonJS(function(exports) {
2237
2237
  var Scalar = require_Scalar();
2238
2238
  var stringifyNumber = require_stringifyNumber();
2239
2239
  var floatNaN = {
@@ -2276,7 +2276,7 @@ var require_float = __commonJS((exports) => {
2276
2276
  });
2277
2277
 
2278
2278
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/int.js
2279
- var require_int = __commonJS((exports) => {
2279
+ var require_int = __commonJS(function(exports) {
2280
2280
  var stringifyNumber = require_stringifyNumber();
2281
2281
  var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
2282
2282
  var intResolve = (str, offset, radix, { intAsBigInt }) => intAsBigInt ? BigInt(str) : parseInt(str.substring(offset), radix);
@@ -2318,7 +2318,7 @@ var require_int = __commonJS((exports) => {
2318
2318
  });
2319
2319
 
2320
2320
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/core/schema.js
2321
- var require_schema = __commonJS((exports) => {
2321
+ var require_schema = __commonJS(function(exports) {
2322
2322
  var map = require_map();
2323
2323
  var _null = require_null();
2324
2324
  var seq = require_seq();
@@ -2343,7 +2343,7 @@ var require_schema = __commonJS((exports) => {
2343
2343
  });
2344
2344
 
2345
2345
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/json/schema.js
2346
- var require_schema2 = __commonJS((exports) => {
2346
+ var require_schema2 = __commonJS(function(exports) {
2347
2347
  var Scalar = require_Scalar();
2348
2348
  var map = require_map();
2349
2349
  var seq = require_seq();
@@ -2407,7 +2407,7 @@ var require_schema2 = __commonJS((exports) => {
2407
2407
  });
2408
2408
 
2409
2409
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/binary.js
2410
- var require_binary = __commonJS((exports) => {
2410
+ var require_binary = __commonJS(function(exports) {
2411
2411
  var node_buffer = __require("buffer");
2412
2412
  var Scalar = require_Scalar();
2413
2413
  var stringifyString = require_stringifyString();
@@ -2462,7 +2462,7 @@ var require_binary = __commonJS((exports) => {
2462
2462
  });
2463
2463
 
2464
2464
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/pairs.js
2465
- var require_pairs = __commonJS((exports) => {
2465
+ var require_pairs = __commonJS(function(exports) {
2466
2466
  var identity = require_identity();
2467
2467
  var Pair = require_Pair();
2468
2468
  var Scalar = require_Scalar();
@@ -2537,7 +2537,7 @@ ${cn.comment}` : item.comment;
2537
2537
  });
2538
2538
 
2539
2539
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/omap.js
2540
- var require_omap = __commonJS((exports) => {
2540
+ var require_omap = __commonJS(function(exports) {
2541
2541
  var identity = require_identity();
2542
2542
  var toJS = require_toJS();
2543
2543
  var YAMLMap = require_YAMLMap();
@@ -2609,7 +2609,7 @@ var require_omap = __commonJS((exports) => {
2609
2609
  });
2610
2610
 
2611
2611
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/bool.js
2612
- var require_bool2 = __commonJS((exports) => {
2612
+ var require_bool2 = __commonJS(function(exports) {
2613
2613
  var Scalar = require_Scalar();
2614
2614
  function boolStringify({ value, source }, ctx) {
2615
2615
  const boolObj = value ? trueTag : falseTag;
@@ -2638,7 +2638,7 @@ var require_bool2 = __commonJS((exports) => {
2638
2638
  });
2639
2639
 
2640
2640
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/float.js
2641
- var require_float2 = __commonJS((exports) => {
2641
+ var require_float2 = __commonJS(function(exports) {
2642
2642
  var Scalar = require_Scalar();
2643
2643
  var stringifyNumber = require_stringifyNumber();
2644
2644
  var floatNaN = {
@@ -2684,7 +2684,7 @@ var require_float2 = __commonJS((exports) => {
2684
2684
  });
2685
2685
 
2686
2686
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/int.js
2687
- var require_int2 = __commonJS((exports) => {
2687
+ var require_int2 = __commonJS(function(exports) {
2688
2688
  var stringifyNumber = require_stringifyNumber();
2689
2689
  var intIdentify = (value) => typeof value === "bigint" || Number.isInteger(value);
2690
2690
  function intResolve(str, offset, radix, { intAsBigInt }) {
@@ -2760,7 +2760,7 @@ var require_int2 = __commonJS((exports) => {
2760
2760
  });
2761
2761
 
2762
2762
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/set.js
2763
- var require_set = __commonJS((exports) => {
2763
+ var require_set = __commonJS(function(exports) {
2764
2764
  var identity = require_identity();
2765
2765
  var Pair = require_Pair();
2766
2766
  var YAMLMap = require_YAMLMap();
@@ -2843,7 +2843,7 @@ var require_set = __commonJS((exports) => {
2843
2843
  });
2844
2844
 
2845
2845
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js
2846
- var require_timestamp = __commonJS((exports) => {
2846
+ var require_timestamp = __commonJS(function(exports) {
2847
2847
  var stringifyNumber = require_stringifyNumber();
2848
2848
  function parseSexagesimal(str, asBigInt) {
2849
2849
  const sign = str[0];
@@ -2925,7 +2925,7 @@ var require_timestamp = __commonJS((exports) => {
2925
2925
  });
2926
2926
 
2927
2927
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/yaml-1.1/schema.js
2928
- var require_schema3 = __commonJS((exports) => {
2928
+ var require_schema3 = __commonJS(function(exports) {
2929
2929
  var map = require_map();
2930
2930
  var _null = require_null();
2931
2931
  var seq = require_seq();
@@ -2966,7 +2966,7 @@ var require_schema3 = __commonJS((exports) => {
2966
2966
  });
2967
2967
 
2968
2968
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/tags.js
2969
- var require_tags = __commonJS((exports) => {
2969
+ var require_tags = __commonJS(function(exports) {
2970
2970
  var map = require_map();
2971
2971
  var _null = require_null();
2972
2972
  var seq = require_seq();
@@ -3057,7 +3057,7 @@ var require_tags = __commonJS((exports) => {
3057
3057
  });
3058
3058
 
3059
3059
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/schema/Schema.js
3060
- var require_Schema = __commonJS((exports) => {
3060
+ var require_Schema = __commonJS(function(exports) {
3061
3061
  var identity = require_identity();
3062
3062
  var map = require_map();
3063
3063
  var seq = require_seq();
@@ -3087,7 +3087,7 @@ var require_Schema = __commonJS((exports) => {
3087
3087
  });
3088
3088
 
3089
3089
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/stringify/stringifyDocument.js
3090
- var require_stringifyDocument = __commonJS((exports) => {
3090
+ var require_stringifyDocument = __commonJS(function(exports) {
3091
3091
  var identity = require_identity();
3092
3092
  var stringify = require_stringify();
3093
3093
  var stringifyComment = require_stringifyComment();
@@ -3167,7 +3167,7 @@ var require_stringifyDocument = __commonJS((exports) => {
3167
3167
  });
3168
3168
 
3169
3169
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/doc/Document.js
3170
- var require_Document = __commonJS((exports) => {
3170
+ var require_Document = __commonJS(function(exports) {
3171
3171
  var Alias = require_Alias();
3172
3172
  var Collection = require_Collection();
3173
3173
  var identity = require_identity();
@@ -3402,7 +3402,7 @@ var require_Document = __commonJS((exports) => {
3402
3402
  });
3403
3403
 
3404
3404
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/errors.js
3405
- var require_errors = __commonJS((exports) => {
3405
+ var require_errors = __commonJS(function(exports) {
3406
3406
  class YAMLError extends Error {
3407
3407
  constructor(name, pos, code, message) {
3408
3408
  super();
@@ -3467,7 +3467,7 @@ ${pointer}
3467
3467
  });
3468
3468
 
3469
3469
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-props.js
3470
- var require_resolve_props = __commonJS((exports) => {
3470
+ var require_resolve_props = __commonJS(function(exports) {
3471
3471
  function resolveProps(tokens, { flow, indicator, next, offset, onError, parentIndent, startOnNewline }) {
3472
3472
  let spaceBefore = false;
3473
3473
  let atNewline = startOnNewline;
@@ -3597,7 +3597,7 @@ var require_resolve_props = __commonJS((exports) => {
3597
3597
  });
3598
3598
 
3599
3599
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-contains-newline.js
3600
- var require_util_contains_newline = __commonJS((exports) => {
3600
+ var require_util_contains_newline = __commonJS(function(exports) {
3601
3601
  function containsNewline(key) {
3602
3602
  if (!key)
3603
3603
  return null;
@@ -3637,7 +3637,7 @@ var require_util_contains_newline = __commonJS((exports) => {
3637
3637
  });
3638
3638
 
3639
3639
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-flow-indent-check.js
3640
- var require_util_flow_indent_check = __commonJS((exports) => {
3640
+ var require_util_flow_indent_check = __commonJS(function(exports) {
3641
3641
  var utilContainsNewline = require_util_contains_newline();
3642
3642
  function flowIndentCheck(indent, fc, onError) {
3643
3643
  if (fc?.type === "flow-collection") {
@@ -3652,7 +3652,7 @@ var require_util_flow_indent_check = __commonJS((exports) => {
3652
3652
  });
3653
3653
 
3654
3654
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-map-includes.js
3655
- var require_util_map_includes = __commonJS((exports) => {
3655
+ var require_util_map_includes = __commonJS(function(exports) {
3656
3656
  var identity = require_identity();
3657
3657
  function mapIncludes(ctx, items, search) {
3658
3658
  const { uniqueKeys } = ctx.options;
@@ -3665,7 +3665,7 @@ var require_util_map_includes = __commonJS((exports) => {
3665
3665
  });
3666
3666
 
3667
3667
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-map.js
3668
- var require_resolve_block_map = __commonJS((exports) => {
3668
+ var require_resolve_block_map = __commonJS(function(exports) {
3669
3669
  var Pair = require_Pair();
3670
3670
  var YAMLMap = require_YAMLMap();
3671
3671
  var resolveProps = require_resolve_props();
@@ -3772,7 +3772,7 @@ var require_resolve_block_map = __commonJS((exports) => {
3772
3772
  });
3773
3773
 
3774
3774
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-seq.js
3775
- var require_resolve_block_seq = __commonJS((exports) => {
3775
+ var require_resolve_block_seq = __commonJS(function(exports) {
3776
3776
  var YAMLSeq = require_YAMLSeq();
3777
3777
  var resolveProps = require_resolve_props();
3778
3778
  var utilFlowIndentCheck = require_util_flow_indent_check();
@@ -3820,7 +3820,7 @@ var require_resolve_block_seq = __commonJS((exports) => {
3820
3820
  });
3821
3821
 
3822
3822
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-end.js
3823
- var require_resolve_end = __commonJS((exports) => {
3823
+ var require_resolve_end = __commonJS(function(exports) {
3824
3824
  function resolveEnd(end, offset, reqSpace, onError) {
3825
3825
  let comment = "";
3826
3826
  if (end) {
@@ -3860,7 +3860,7 @@ var require_resolve_end = __commonJS((exports) => {
3860
3860
  });
3861
3861
 
3862
3862
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-collection.js
3863
- var require_resolve_flow_collection = __commonJS((exports) => {
3863
+ var require_resolve_flow_collection = __commonJS(function(exports) {
3864
3864
  var identity = require_identity();
3865
3865
  var Pair = require_Pair();
3866
3866
  var YAMLMap = require_YAMLMap();
@@ -4051,7 +4051,7 @@ var require_resolve_flow_collection = __commonJS((exports) => {
4051
4051
  });
4052
4052
 
4053
4053
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-collection.js
4054
- var require_compose_collection = __commonJS((exports) => {
4054
+ var require_compose_collection = __commonJS(function(exports) {
4055
4055
  var identity = require_identity();
4056
4056
  var Scalar = require_Scalar();
4057
4057
  var YAMLMap = require_YAMLMap();
@@ -4113,7 +4113,7 @@ var require_compose_collection = __commonJS((exports) => {
4113
4113
  });
4114
4114
 
4115
4115
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-block-scalar.js
4116
- var require_resolve_block_scalar = __commonJS((exports) => {
4116
+ var require_resolve_block_scalar = __commonJS(function(exports) {
4117
4117
  var Scalar = require_Scalar();
4118
4118
  function resolveBlockScalar(ctx, scalar, onError) {
4119
4119
  const start = scalar.offset;
@@ -4306,7 +4306,7 @@ var require_resolve_block_scalar = __commonJS((exports) => {
4306
4306
  });
4307
4307
 
4308
4308
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/resolve-flow-scalar.js
4309
- var require_resolve_flow_scalar = __commonJS((exports) => {
4309
+ var require_resolve_flow_scalar = __commonJS(function(exports) {
4310
4310
  var Scalar = require_Scalar();
4311
4311
  var resolveEnd = require_resolve_end();
4312
4312
  function resolveFlowScalar(scalar, strict, onError) {
@@ -4523,7 +4523,7 @@ var require_resolve_flow_scalar = __commonJS((exports) => {
4523
4523
  });
4524
4524
 
4525
4525
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-scalar.js
4526
- var require_compose_scalar = __commonJS((exports) => {
4526
+ var require_compose_scalar = __commonJS(function(exports) {
4527
4527
  var identity = require_identity();
4528
4528
  var Scalar = require_Scalar();
4529
4529
  var resolveBlockScalar = require_resolve_block_scalar();
@@ -4601,7 +4601,7 @@ var require_compose_scalar = __commonJS((exports) => {
4601
4601
  });
4602
4602
 
4603
4603
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/util-empty-scalar-position.js
4604
- var require_util_empty_scalar_position = __commonJS((exports) => {
4604
+ var require_util_empty_scalar_position = __commonJS(function(exports) {
4605
4605
  function emptyScalarPosition(offset, before, pos) {
4606
4606
  if (before) {
4607
4607
  pos ?? (pos = before.length);
@@ -4628,7 +4628,7 @@ var require_util_empty_scalar_position = __commonJS((exports) => {
4628
4628
  });
4629
4629
 
4630
4630
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-node.js
4631
- var require_compose_node = __commonJS((exports) => {
4631
+ var require_compose_node = __commonJS(function(exports) {
4632
4632
  var Alias = require_Alias();
4633
4633
  var identity = require_identity();
4634
4634
  var composeCollection = require_compose_collection();
@@ -4731,7 +4731,7 @@ var require_compose_node = __commonJS((exports) => {
4731
4731
  });
4732
4732
 
4733
4733
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/compose-doc.js
4734
- var require_compose_doc = __commonJS((exports) => {
4734
+ var require_compose_doc = __commonJS(function(exports) {
4735
4735
  var Document = require_Document();
4736
4736
  var composeNode = require_compose_node();
4737
4737
  var resolveEnd = require_resolve_end();
@@ -4771,7 +4771,7 @@ var require_compose_doc = __commonJS((exports) => {
4771
4771
  });
4772
4772
 
4773
4773
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/compose/composer.js
4774
- var require_composer = __commonJS((exports) => {
4774
+ var require_composer = __commonJS(function(exports) {
4775
4775
  var node_process = __require("process");
4776
4776
  var directives = require_directives();
4777
4777
  var Document = require_Document();
@@ -4962,7 +4962,7 @@ ${end.comment}` : end.comment;
4962
4962
  });
4963
4963
 
4964
4964
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-scalar.js
4965
- var require_cst_scalar = __commonJS((exports) => {
4965
+ var require_cst_scalar = __commonJS(function(exports) {
4966
4966
  var resolveBlockScalar = require_resolve_block_scalar();
4967
4967
  var resolveFlowScalar = require_resolve_flow_scalar();
4968
4968
  var errors = require_errors();
@@ -5152,7 +5152,7 @@ var require_cst_scalar = __commonJS((exports) => {
5152
5152
  });
5153
5153
 
5154
5154
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-stringify.js
5155
- var require_cst_stringify = __commonJS((exports) => {
5155
+ var require_cst_stringify = __commonJS(function(exports) {
5156
5156
  var stringify = (cst) => ("type" in cst) ? stringifyToken(cst) : stringifyItem(cst);
5157
5157
  function stringifyToken(token) {
5158
5158
  switch (token.type) {
@@ -5210,7 +5210,7 @@ var require_cst_stringify = __commonJS((exports) => {
5210
5210
  });
5211
5211
 
5212
5212
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst-visit.js
5213
- var require_cst_visit = __commonJS((exports) => {
5213
+ var require_cst_visit = __commonJS(function(exports) {
5214
5214
  var BREAK = Symbol("break visit");
5215
5215
  var SKIP = Symbol("skip children");
5216
5216
  var REMOVE = Symbol("remove item");
@@ -5269,7 +5269,7 @@ var require_cst_visit = __commonJS((exports) => {
5269
5269
  });
5270
5270
 
5271
5271
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/cst.js
5272
- var require_cst = __commonJS((exports) => {
5272
+ var require_cst = __commonJS(function(exports) {
5273
5273
  var cstScalar = require_cst_scalar();
5274
5274
  var cstStringify = require_cst_stringify();
5275
5275
  var cstVisit = require_cst_visit();
@@ -5370,7 +5370,7 @@ var require_cst = __commonJS((exports) => {
5370
5370
  });
5371
5371
 
5372
5372
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/lexer.js
5373
- var require_lexer = __commonJS((exports) => {
5373
+ var require_lexer = __commonJS(function(exports) {
5374
5374
  var cst = require_cst();
5375
5375
  function isEmpty(ch) {
5376
5376
  switch (ch) {
@@ -5967,7 +5967,7 @@ var require_lexer = __commonJS((exports) => {
5967
5967
  });
5968
5968
 
5969
5969
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/line-counter.js
5970
- var require_line_counter = __commonJS((exports) => {
5970
+ var require_line_counter = __commonJS(function(exports) {
5971
5971
  class LineCounter {
5972
5972
  constructor() {
5973
5973
  this.lineStarts = [];
@@ -5995,7 +5995,7 @@ var require_line_counter = __commonJS((exports) => {
5995
5995
  });
5996
5996
 
5997
5997
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/parse/parser.js
5998
- var require_parser = __commonJS((exports) => {
5998
+ var require_parser = __commonJS(function(exports) {
5999
5999
  var node_process = __require("process");
6000
6000
  var cst = require_cst();
6001
6001
  var lexer = require_lexer();
@@ -6851,7 +6851,7 @@ var require_parser = __commonJS((exports) => {
6851
6851
  });
6852
6852
 
6853
6853
  // ../../node_modules/.bun/yaml@2.9.0/node_modules/yaml/dist/public-api.js
6854
- var require_public_api = __commonJS((exports) => {
6854
+ var require_public_api = __commonJS(function(exports) {
6855
6855
  var composer = require_composer();
6856
6856
  var Document = require_Document();
6857
6857
  var errors = require_errors();
@@ -6949,7 +6949,7 @@ import { goke } from "goke";
6949
6949
  // package.json
6950
6950
  var package_default = {
6951
6951
  name: "@marcusrbrown/infra",
6952
- version: "0.15.3",
6952
+ version: "0.19.0",
6953
6953
  description: "Infrastructure management CLI \u2014 deploy automation, health checks, and MCP bridge",
6954
6954
  keywords: [
6955
6955
  "infra",
@@ -6985,7 +6985,7 @@ var package_default = {
6985
6985
  },
6986
6986
  dependencies: {
6987
6987
  "@clack/prompts": "^1.2.0",
6988
- "@goke/mcp": "^0.0.11",
6988
+ "@goke/mcp": "^0.0.13",
6989
6989
  goke: "^6.3.2",
6990
6990
  "string-dedent": "^3.0.2",
6991
6991
  zod: "^4.3.6"
@@ -10389,7 +10389,59 @@ import { z as z16 } from "zod";
10389
10389
 
10390
10390
  // src/commands/cliproxy/status.ts
10391
10391
  import { z as z15 } from "zod";
10392
+
10393
+ // src/lib/redact.ts
10394
+ function redactHost(text4, host) {
10395
+ if (!host)
10396
+ return text4;
10397
+ const escaped = host.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
10398
+ return text4.replaceAll(new RegExp(escaped, "gi"), "<host>");
10399
+ }
10400
+
10401
+ // ../shared/server/droplet-helpers.ts
10402
+ import { appendFileSync, chmodSync as chmodSync2, mkdtempSync, readFileSync as readFileSync2, rmSync, writeFileSync } from "fs";
10403
+ import { tmpdir } from "os";
10404
+ import { join as join5 } from "path";
10405
+ function materializeIdentityFile(privateKey) {
10406
+ const dir = mkdtempSync(join5(tmpdir(), "infra-ssh-key-"));
10407
+ const path = join5(dir, "id");
10408
+ const cleanup = () => {
10409
+ try {
10410
+ rmSync(dir, { recursive: true, force: true });
10411
+ } catch {}
10412
+ };
10413
+ try {
10414
+ const contents = privateKey.endsWith(`
10415
+ `) ? privateKey : `${privateKey}
10416
+ `;
10417
+ writeFileSync(path, contents, { mode: 384 });
10418
+ chmodSync2(path, 384);
10419
+ } catch (error) {
10420
+ cleanup();
10421
+ throw error;
10422
+ }
10423
+ return { path, cleanup };
10424
+ }
10425
+
10426
+ // src/lib/ssh-identity.ts
10427
+ function materializeIdentityFile2(privateKey) {
10428
+ return materializeIdentityFile(privateKey);
10429
+ }
10430
+ function buildIdentityArgs(privateKey) {
10431
+ if (!privateKey?.trim()) {
10432
+ return { args: [], cleanup: () => {
10433
+ return;
10434
+ } };
10435
+ }
10436
+ const { path, cleanup } = materializeIdentityFile2(privateKey);
10437
+ return { args: ["-i", path, "-o", "IdentitiesOnly=yes"], cleanup };
10438
+ }
10439
+
10440
+ // src/commands/cliproxy/status.ts
10392
10441
  var DEFAULT_CLIPROXY_URL6 = "https://cliproxy.fro.bot";
10442
+ function defaultSpawn(cmd, opts) {
10443
+ return Bun.spawn(cmd, opts);
10444
+ }
10393
10445
  function levelLabel(level) {
10394
10446
  if (level === "ok") {
10395
10447
  return "OK";
@@ -10526,14 +10578,14 @@ async function checkVersion(baseUrl, key) {
10526
10578
  });
10527
10579
  if (response.status === 429) {
10528
10580
  return {
10529
- title: "Latest version",
10581
+ title: "Latest available version",
10530
10582
  level: "warning",
10531
10583
  summary: "Rate limited by management API (HTTP 429). Retry in a few moments."
10532
10584
  };
10533
10585
  }
10534
10586
  if (!response.ok) {
10535
10587
  return {
10536
- title: "Latest version",
10588
+ title: "Latest available version",
10537
10589
  level: "error",
10538
10590
  summary: `GET /v0/management/latest-version failed with HTTP ${response.status}`
10539
10591
  };
@@ -10542,17 +10594,73 @@ async function checkVersion(baseUrl, key) {
10542
10594
  if (payload && typeof payload === "object") {
10543
10595
  const version = payload["latest-version"];
10544
10596
  if (typeof version === "string" && version.length > 0) {
10545
- return { title: "Latest version", level: "ok", summary: version };
10597
+ return { title: "Latest available version", level: "ok", summary: version };
10546
10598
  }
10547
10599
  }
10548
10600
  return {
10549
- title: "Latest version",
10601
+ title: "Latest available version",
10550
10602
  level: "warning",
10551
10603
  summary: "Response did not include a latest-version string."
10552
10604
  };
10553
10605
  } catch (error) {
10554
10606
  const message = error instanceof Error ? error.message : String(error);
10555
- return { title: "Latest version", level: "error", summary: `Unable to check latest version: ${message}` };
10607
+ return { title: "Latest available version", level: "error", summary: `Unable to check latest version: ${message}` };
10608
+ }
10609
+ }
10610
+ async function checkRunningVersion(host, spawn = defaultSpawn) {
10611
+ let cleanup = () => {
10612
+ return;
10613
+ };
10614
+ try {
10615
+ validateCliproxyHost(host);
10616
+ const knownHostsArgs = buildKnownHostsArgs();
10617
+ const identity2 = buildIdentityArgs(process.env.CLIPROXY_SSH_KEY);
10618
+ cleanup = identity2.cleanup;
10619
+ const sshCmd = [
10620
+ "ssh",
10621
+ "-o",
10622
+ "BatchMode=yes",
10623
+ "-o",
10624
+ "ConnectTimeout=10",
10625
+ "-o",
10626
+ "StrictHostKeyChecking=yes",
10627
+ ...knownHostsArgs,
10628
+ ...identity2.args,
10629
+ `root@${host}`,
10630
+ `docker ps --format '{{.Image}}'`
10631
+ ];
10632
+ const env = {
10633
+ PATH: process.env.PATH ?? "/usr/bin:/bin",
10634
+ HOME: process.env.HOME ?? "/tmp",
10635
+ ...process.env.SSH_AUTH_SOCK ? { SSH_AUTH_SOCK: process.env.SSH_AUTH_SOCK } : {}
10636
+ };
10637
+ const child = spawn(sshCmd, { env, stdout: "pipe", stderr: "pipe" });
10638
+ const [stdoutText, stderrText, exitCode] = await Promise.all([
10639
+ new Response(child.stdout).text(),
10640
+ new Response(child.stderr).text(),
10641
+ child.exited
10642
+ ]);
10643
+ if (exitCode !== 0) {
10644
+ return {
10645
+ title: "Running version",
10646
+ level: "warning",
10647
+ summary: `SSH command failed (exit ${exitCode}): ${redactHost(stderrText.trim(), host) || "unknown error"}`
10648
+ };
10649
+ }
10650
+ const imageMatch = /(?:^|\s)eceasy\/cli-proxy-api:([^\s@]+)/m.exec(stdoutText);
10651
+ if (!imageMatch) {
10652
+ return {
10653
+ title: "Running version",
10654
+ level: "warning",
10655
+ summary: "No running eceasy/cli-proxy-api container found."
10656
+ };
10657
+ }
10658
+ return { title: "Running version", level: "ok", summary: imageMatch[1] ?? "unknown" };
10659
+ } catch (error) {
10660
+ const message = error instanceof Error ? error.message : String(error);
10661
+ return { title: "Running version", level: "warning", summary: `Unable to check running version via SSH: ${message}` };
10662
+ } finally {
10663
+ cleanup();
10556
10664
  }
10557
10665
  }
10558
10666
  var DEFAULT_PROVIDER_MODEL = "claude-sonnet-4-6";
@@ -10722,6 +10830,41 @@ function printCheckResult(result, ctx) {
10722
10830
  function formatCheckSummary(result) {
10723
10831
  return `${levelLabel(result.level)}: ${result.summary}`;
10724
10832
  }
10833
+ var RUNNING_VERSION_NOT_CHECKED_SUMMARY = "Not checked for explicit URL override.";
10834
+ function formatVersionSummary(running, available) {
10835
+ const latestFailure = /429|rate limit/i.test(available.summary) ? "rate-limited" : /auth|\b40[13]\b|ip banned/i.test(available.summary) ? "auth" : "unknown";
10836
+ if (running.summary === RUNNING_VERSION_NOT_CHECKED_SUMMARY) {
10837
+ if (available.level === "ok") {
10838
+ return `not checked (latest ${available.summary})`;
10839
+ }
10840
+ if (available.summary === "Not checked (no management key).") {
10841
+ return "not checked (latest: no key)";
10842
+ }
10843
+ return `not checked (latest ${latestFailure})`;
10844
+ }
10845
+ if (running.level === "ok" && available.level === "ok") {
10846
+ return running.summary === available.summary ? `${running.summary} (latest)` : `${running.summary} (latest ${available.summary})`;
10847
+ }
10848
+ if (running.level === "ok") {
10849
+ return available.summary === "Not checked (no management key)." ? `${running.summary} (latest: no key)` : `${running.summary} (latest ${latestFailure})`;
10850
+ }
10851
+ if (available.level === "ok") {
10852
+ return `unknown (latest ${available.summary})`;
10853
+ }
10854
+ if (latestFailure === "auth") {
10855
+ return "unknown (auth)";
10856
+ }
10857
+ return latestFailure === "rate-limited" ? "unknown (latest rate-limited)" : "unknown";
10858
+ }
10859
+ function getRunningVersionNotChecked(host) {
10860
+ try {
10861
+ validateCliproxyHost(host);
10862
+ return { title: "Running version", level: "warning", summary: RUNNING_VERSION_NOT_CHECKED_SUMMARY };
10863
+ } catch (error) {
10864
+ const message = error instanceof Error ? error.message : String(error);
10865
+ return { title: "Running version", level: "warning", summary: `Unable to validate running-version host: ${message}` };
10866
+ }
10867
+ }
10725
10868
  function formatUsageSummaryLine(result) {
10726
10869
  const recentMatch = /recent:\s*(\d+)/.exec(result.summary);
10727
10870
  if (!recentMatch) {
@@ -10732,35 +10875,36 @@ function formatUsageSummaryLine(result) {
10732
10875
  const errors2 = errorMatch ? Number(errorMatch[1]) : 0;
10733
10876
  return `Recent requests: ${total}${errors2 > 0 ? `, ${errors2} errors` : ""}`;
10734
10877
  }
10735
- async function getCliproxyStatusSummary(baseUrl, key, verbose) {
10878
+ async function getCliproxyStatusSummary(baseUrl, key, verbose, spawn = defaultSpawn) {
10736
10879
  const normalizedBaseUrl = stripTrailingSlash5(baseUrl);
10737
- const [httpResult, mgmt] = await Promise.all([
10880
+ const host = new URL(normalizedBaseUrl).hostname;
10881
+ const [httpResult, mgmt, running] = await Promise.all([
10738
10882
  checkHttpReachability(`${normalizedBaseUrl}/healthz`, verbose),
10739
- runManagementChecks(normalizedBaseUrl, key || undefined)
10883
+ runManagementChecks(normalizedBaseUrl, key || undefined),
10884
+ checkRunningVersion(host, spawn)
10740
10885
  ]);
10741
- let version;
10886
+ let available;
10742
10887
  let usageStats;
10743
10888
  if (mgmt.kind === "no-key") {
10744
- version = "\u2014 (no key)";
10889
+ available = { title: "Latest available version", level: "warning", summary: "Not checked (no management key)." };
10745
10890
  usageStats = "\u2014 (no key)";
10746
10891
  } else if (mgmt.kind === "auth-failure") {
10747
- const authSummary = formatCheckSummary(mgmt.result);
10748
- version = authSummary;
10749
- usageStats = authSummary;
10892
+ available = mgmt.result;
10893
+ usageStats = formatCheckSummary(mgmt.result);
10750
10894
  } else {
10751
- version = formatCheckSummary(mgmt.version);
10895
+ available = mgmt.version;
10752
10896
  usageStats = formatCheckSummary(mgmt.usage);
10753
10897
  }
10754
10898
  return {
10755
10899
  app: "cliproxy",
10756
10900
  http: formatCheckSummary(httpResult),
10757
10901
  lastDeploy: "\u2014",
10758
- version,
10902
+ version: formatVersionSummary(running, available),
10759
10903
  contentHash: "\u2014",
10760
10904
  usageStats
10761
10905
  };
10762
10906
  }
10763
- async function cliproxyStatusAction(options, ctx) {
10907
+ async function cliproxyStatusAction(options, ctx, spawn = defaultSpawn) {
10764
10908
  let errorCount = 0;
10765
10909
  try {
10766
10910
  const verbose = options.verbose === true;
@@ -10771,7 +10915,13 @@ async function cliproxyStatusAction(options, ctx) {
10771
10915
  const providerKey = options.apiKey ?? (urlIsExplicitlyOverridden ? undefined : process.env.CLIPROXY_API_KEY);
10772
10916
  ctx.console.log("CLIProxyAPI status");
10773
10917
  ctx.console.log("");
10774
- const results = [await checkHttpReachability(`${baseUrl}/healthz`, verbose)];
10918
+ const host = new URL(baseUrl).hostname;
10919
+ const runningCheck = urlIsExplicitlyOverridden ? Promise.resolve(getRunningVersionNotChecked(host)) : checkRunningVersion(host, spawn);
10920
+ const [httpResult, runningResult] = await Promise.all([
10921
+ checkHttpReachability(`${baseUrl}/healthz`, verbose),
10922
+ runningCheck
10923
+ ]);
10924
+ const results = [httpResult, runningResult];
10775
10925
  let capturedUsageResult;
10776
10926
  const mgmt = await runManagementChecks(baseUrl, managementKey);
10777
10927
  if (mgmt.kind === "no-key") {
@@ -11380,45 +11530,6 @@ function registerDashboardDeploy(cli) {
11380
11530
  // src/commands/dashboard/logs.ts
11381
11531
  import { z as z19 } from "zod";
11382
11532
 
11383
- // ../shared/server/droplet-helpers.ts
11384
- import { appendFileSync, chmodSync as chmodSync2, mkdtempSync, readFileSync as readFileSync2, rmSync, writeFileSync } from "fs";
11385
- import { tmpdir } from "os";
11386
- import { join as join5 } from "path";
11387
- function materializeIdentityFile(privateKey) {
11388
- const dir = mkdtempSync(join5(tmpdir(), "infra-ssh-key-"));
11389
- const path = join5(dir, "id");
11390
- const cleanup = () => {
11391
- try {
11392
- rmSync(dir, { recursive: true, force: true });
11393
- } catch {}
11394
- };
11395
- try {
11396
- const contents = privateKey.endsWith(`
11397
- `) ? privateKey : `${privateKey}
11398
- `;
11399
- writeFileSync(path, contents, { mode: 384 });
11400
- chmodSync2(path, 384);
11401
- } catch (error) {
11402
- cleanup();
11403
- throw error;
11404
- }
11405
- return { path, cleanup };
11406
- }
11407
-
11408
- // src/lib/ssh-identity.ts
11409
- function materializeIdentityFile2(privateKey) {
11410
- return materializeIdentityFile(privateKey);
11411
- }
11412
- function buildIdentityArgs(privateKey) {
11413
- if (!privateKey?.trim()) {
11414
- return { args: [], cleanup: () => {
11415
- return;
11416
- } };
11417
- }
11418
- const { path, cleanup } = materializeIdentityFile2(privateKey);
11419
- return { args: ["-i", path, "-o", "IdentitiesOnly=yes"], cleanup };
11420
- }
11421
-
11422
11533
  // src/commands/dashboard/host.ts
11423
11534
  var VALID_HOST_RE3 = /^[a-z\d][a-z\d.\-]*$/i;
11424
11535
  function validateDashboardHost(host) {
@@ -11521,16 +11632,6 @@ function registerDashboardLogs(cli) {
11521
11632
 
11522
11633
  // src/commands/dashboard/status.ts
11523
11634
  import { z as z20 } from "zod";
11524
-
11525
- // src/lib/redact.ts
11526
- function redactHost(text4, host) {
11527
- if (!host)
11528
- return text4;
11529
- const escaped = host.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
11530
- return text4.replaceAll(new RegExp(escaped, "gi"), "<host>");
11531
- }
11532
-
11533
- // src/commands/dashboard/status.ts
11534
11635
  var COMPOSE_PROJECT_DIR2 = "/opt/dashboard";
11535
11636
  function parseComposePsOutput(stdoutText) {
11536
11637
  const trimmed = stdoutText.trim();
@@ -11559,10 +11660,10 @@ function parseComposePs(entries) {
11559
11660
  function isAllRunning(rows) {
11560
11661
  return rows.every((row) => row.state === "running" && (row.health === "healthy" || row.health === "n-a"));
11561
11662
  }
11562
- function defaultSpawn(cmd, opts) {
11663
+ function defaultSpawn2(cmd, opts) {
11563
11664
  return Bun.spawn(cmd, opts);
11564
11665
  }
11565
- async function getDashboardComposeStatus(host, spawn = defaultSpawn) {
11666
+ async function getDashboardComposeStatus(host, spawn = defaultSpawn2) {
11566
11667
  validateDashboardHost(host);
11567
11668
  const knownHostsArgs = buildKnownHostsArgs();
11568
11669
  const { args: identityArgs, cleanup } = buildIdentityArgs(process.env.DASHBOARD_SSH_KEY);
@@ -11736,10 +11837,10 @@ var CA_CERT_FILE = "mitmproxy-ca-cert.pem";
11736
11837
  var CA_KEY_FILE = "mitmproxy-ca.pem";
11737
11838
  var DEFAULT_OUTPUT = "apps/gateway/.local/mitmproxy-ca.tar";
11738
11839
  var SENSITIVE_WARNING3 = "Warning: Output contains the mitmproxy CA private trust anchor; treat as sensitive.";
11739
- function defaultSpawn2(cmd, opts) {
11840
+ function defaultSpawn3(cmd, opts) {
11740
11841
  return Bun.spawn(cmd, opts);
11741
11842
  }
11742
- async function backupGatewayCa(opts, spawn = defaultSpawn2, printErr) {
11843
+ async function backupGatewayCa(opts, spawn = defaultSpawn3, printErr) {
11743
11844
  if (!opts.includeCa) {
11744
11845
  return { ok: false, error: "Only CA backup is currently supported; --no-include-ca is not accepted" };
11745
11846
  }
@@ -12074,10 +12175,10 @@ function validateBackupArchive(inputPath, spawn, env) {
12074
12175
  return;
12075
12176
  });
12076
12177
  }
12077
- function defaultSpawn3(cmd, opts) {
12178
+ function defaultSpawn4(cmd, opts) {
12078
12179
  return Bun.spawn(cmd, opts);
12079
12180
  }
12080
- async function restoreGatewayCa(opts, spawn = defaultSpawn3) {
12181
+ async function restoreGatewayCa(opts, spawn = defaultSpawn4) {
12081
12182
  if (!opts.includeCa) {
12082
12183
  return { ok: false, error: "Only CA restore is currently supported; --no-include-ca is not accepted" };
12083
12184
  }
@@ -12230,10 +12331,10 @@ function parseComposePs2(entries) {
12230
12331
  function isAllRunning2(rows) {
12231
12332
  return rows.every((row) => row.state === "running");
12232
12333
  }
12233
- function defaultSpawn4(cmd, opts) {
12334
+ function defaultSpawn5(cmd, opts) {
12234
12335
  return Bun.spawn(cmd, opts);
12235
12336
  }
12236
- async function getGatewayComposeStatus(host, spawn = defaultSpawn4) {
12337
+ async function getGatewayComposeStatus(host, spawn = defaultSpawn5) {
12237
12338
  validateGatewayHost(host);
12238
12339
  const knownHostsArgs = buildKnownHostsArgs();
12239
12340
  const { args: identityArgs, cleanup } = buildIdentityArgs(process.env.GATEWAY_SSH_KEY);
@@ -12997,10 +13098,10 @@ function parseComposePs3(entries) {
12997
13098
  function isAllRunning3(rows) {
12998
13099
  return rows.every((row) => row.state === "running" && (row.health === "healthy" || row.health === "n-a"));
12999
13100
  }
13000
- function defaultSpawn5(cmd, opts) {
13101
+ function defaultSpawn6(cmd, opts) {
13001
13102
  return Bun.spawn(cmd, opts);
13002
13103
  }
13003
- async function getUmamiComposeStatus(host, spawn = defaultSpawn5) {
13104
+ async function getUmamiComposeStatus(host, spawn = defaultSpawn6) {
13004
13105
  validateUmamiHost(host);
13005
13106
  const knownHostsArgs = buildKnownHostsArgs();
13006
13107
  const { args: identityArgs, cleanup } = buildIdentityArgs(process.env.UMAMI_SSH_KEY);
@@ -13660,10 +13761,10 @@ function parseWgShowOutput(output) {
13660
13761
  peerCount
13661
13762
  };
13662
13763
  }
13663
- function defaultSpawn6(cmd, opts) {
13764
+ function defaultSpawn7(cmd, opts) {
13664
13765
  return Bun.spawn(cmd, opts);
13665
13766
  }
13666
- async function getVpnWgStatus(host, spawn = defaultSpawn6) {
13767
+ async function getVpnWgStatus(host, spawn = defaultSpawn7) {
13667
13768
  validateVpnHost(host);
13668
13769
  const knownHostsArgs = buildKnownHostsArgs();
13669
13770
  const { args: identityArgs, cleanup } = buildIdentityArgs(process.env.VPN_SSH_KEY);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@marcusrbrown/infra",
3
- "version": "0.15.3",
3
+ "version": "0.19.0",
4
4
  "description": "Infrastructure management CLI — deploy automation, health checks, and MCP bridge",
5
5
  "keywords": [
6
6
  "infra",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@clack/prompts": "^1.2.0",
39
- "@goke/mcp": "^0.0.11",
39
+ "@goke/mcp": "^0.0.13",
40
40
  "goke": "^6.3.2",
41
41
  "string-dedent": "^3.0.2",
42
42
  "zod": "^4.3.6"