@proxygate/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +311 -0
  3. package/dist/commands/apis.d.ts +3 -0
  4. package/dist/commands/apis.d.ts.map +1 -0
  5. package/dist/commands/apis.js +68 -0
  6. package/dist/commands/apis.js.map +1 -0
  7. package/dist/commands/apis.test.d.ts +2 -0
  8. package/dist/commands/apis.test.d.ts.map +1 -0
  9. package/dist/commands/apis.test.js +103 -0
  10. package/dist/commands/apis.test.js.map +1 -0
  11. package/dist/commands/balance.d.ts +9 -0
  12. package/dist/commands/balance.d.ts.map +1 -0
  13. package/dist/commands/balance.js +50 -0
  14. package/dist/commands/balance.js.map +1 -0
  15. package/dist/commands/balance.test.d.ts +2 -0
  16. package/dist/commands/balance.test.d.ts.map +1 -0
  17. package/dist/commands/balance.test.js +106 -0
  18. package/dist/commands/balance.test.js.map +1 -0
  19. package/dist/commands/categories.d.ts +3 -0
  20. package/dist/commands/categories.d.ts.map +1 -0
  21. package/dist/commands/categories.js +45 -0
  22. package/dist/commands/categories.js.map +1 -0
  23. package/dist/commands/categories.test.d.ts +2 -0
  24. package/dist/commands/categories.test.d.ts.map +1 -0
  25. package/dist/commands/categories.test.js +84 -0
  26. package/dist/commands/categories.test.js.map +1 -0
  27. package/dist/commands/create.d.ts +3 -0
  28. package/dist/commands/create.d.ts.map +1 -0
  29. package/dist/commands/create.js +136 -0
  30. package/dist/commands/create.js.map +1 -0
  31. package/dist/commands/create.test.d.ts +2 -0
  32. package/dist/commands/create.test.d.ts.map +1 -0
  33. package/dist/commands/create.test.js +95 -0
  34. package/dist/commands/create.test.js.map +1 -0
  35. package/dist/commands/deposit.d.ts +9 -0
  36. package/dist/commands/deposit.d.ts.map +1 -0
  37. package/dist/commands/deposit.js +78 -0
  38. package/dist/commands/deposit.js.map +1 -0
  39. package/dist/commands/deposit.test.d.ts +2 -0
  40. package/dist/commands/deposit.test.d.ts.map +1 -0
  41. package/dist/commands/deposit.test.js +93 -0
  42. package/dist/commands/deposit.test.js.map +1 -0
  43. package/dist/commands/dev.d.ts +3 -0
  44. package/dist/commands/dev.d.ts.map +1 -0
  45. package/dist/commands/dev.js +188 -0
  46. package/dist/commands/dev.js.map +1 -0
  47. package/dist/commands/dev.test.d.ts +2 -0
  48. package/dist/commands/dev.test.d.ts.map +1 -0
  49. package/dist/commands/dev.test.js +89 -0
  50. package/dist/commands/dev.test.js.map +1 -0
  51. package/dist/commands/getting-started-steps.d.ts +12 -0
  52. package/dist/commands/getting-started-steps.d.ts.map +1 -0
  53. package/dist/commands/getting-started-steps.js +163 -0
  54. package/dist/commands/getting-started-steps.js.map +1 -0
  55. package/dist/commands/getting-started.d.ts +9 -0
  56. package/dist/commands/getting-started.d.ts.map +1 -0
  57. package/dist/commands/getting-started.js +44 -0
  58. package/dist/commands/getting-started.js.map +1 -0
  59. package/dist/commands/init.d.ts +9 -0
  60. package/dist/commands/init.d.ts.map +1 -0
  61. package/dist/commands/init.js +74 -0
  62. package/dist/commands/init.js.map +1 -0
  63. package/dist/commands/init.test.d.ts +2 -0
  64. package/dist/commands/init.test.d.ts.map +1 -0
  65. package/dist/commands/init.test.js +115 -0
  66. package/dist/commands/init.test.js.map +1 -0
  67. package/dist/commands/jobs.d.ts +11 -0
  68. package/dist/commands/jobs.d.ts.map +1 -0
  69. package/dist/commands/jobs.js +370 -0
  70. package/dist/commands/jobs.js.map +1 -0
  71. package/dist/commands/listings/create.d.ts +4 -0
  72. package/dist/commands/listings/create.d.ts.map +1 -0
  73. package/dist/commands/listings/create.js +133 -0
  74. package/dist/commands/listings/create.js.map +1 -0
  75. package/dist/commands/listings/delete.d.ts +4 -0
  76. package/dist/commands/listings/delete.d.ts.map +1 -0
  77. package/dist/commands/listings/delete.js +32 -0
  78. package/dist/commands/listings/delete.js.map +1 -0
  79. package/dist/commands/listings/docs.d.ts +4 -0
  80. package/dist/commands/listings/docs.d.ts.map +1 -0
  81. package/dist/commands/listings/docs.js +48 -0
  82. package/dist/commands/listings/docs.js.map +1 -0
  83. package/dist/commands/listings/headers.d.ts +4 -0
  84. package/dist/commands/listings/headers.d.ts.map +1 -0
  85. package/dist/commands/listings/headers.js +78 -0
  86. package/dist/commands/listings/headers.js.map +1 -0
  87. package/dist/commands/listings/helpers.d.ts +10 -0
  88. package/dist/commands/listings/helpers.d.ts.map +1 -0
  89. package/dist/commands/listings/helpers.js +64 -0
  90. package/dist/commands/listings/helpers.js.map +1 -0
  91. package/dist/commands/listings/index.d.ts +11 -0
  92. package/dist/commands/listings/index.d.ts.map +1 -0
  93. package/dist/commands/listings/index.js +46 -0
  94. package/dist/commands/listings/index.js.map +1 -0
  95. package/dist/commands/listings/list.d.ts +4 -0
  96. package/dist/commands/listings/list.d.ts.map +1 -0
  97. package/dist/commands/listings/list.js +42 -0
  98. package/dist/commands/listings/list.js.map +1 -0
  99. package/dist/commands/listings/pause-unpause.d.ts +6 -0
  100. package/dist/commands/listings/pause-unpause.d.ts.map +1 -0
  101. package/dist/commands/listings/pause-unpause.js +37 -0
  102. package/dist/commands/listings/pause-unpause.js.map +1 -0
  103. package/dist/commands/listings/rotate-key.d.ts +4 -0
  104. package/dist/commands/listings/rotate-key.d.ts.map +1 -0
  105. package/dist/commands/listings/rotate-key.js +62 -0
  106. package/dist/commands/listings/rotate-key.js.map +1 -0
  107. package/dist/commands/listings/update.d.ts +4 -0
  108. package/dist/commands/listings/update.d.ts.map +1 -0
  109. package/dist/commands/listings/update.js +57 -0
  110. package/dist/commands/listings/update.js.map +1 -0
  111. package/dist/commands/listings.d.ts +2 -0
  112. package/dist/commands/listings.d.ts.map +1 -0
  113. package/dist/commands/listings.js +3 -0
  114. package/dist/commands/listings.js.map +1 -0
  115. package/dist/commands/listings.test.d.ts +2 -0
  116. package/dist/commands/listings.test.d.ts.map +1 -0
  117. package/dist/commands/listings.test.js +166 -0
  118. package/dist/commands/listings.test.js.map +1 -0
  119. package/dist/commands/pricing.d.ts +9 -0
  120. package/dist/commands/pricing.d.ts.map +1 -0
  121. package/dist/commands/pricing.js +67 -0
  122. package/dist/commands/pricing.js.map +1 -0
  123. package/dist/commands/pricing.test.d.ts +2 -0
  124. package/dist/commands/pricing.test.d.ts.map +1 -0
  125. package/dist/commands/pricing.test.js +87 -0
  126. package/dist/commands/pricing.test.js.map +1 -0
  127. package/dist/commands/proxy.d.ts +14 -0
  128. package/dist/commands/proxy.d.ts.map +1 -0
  129. package/dist/commands/proxy.js +138 -0
  130. package/dist/commands/proxy.js.map +1 -0
  131. package/dist/commands/proxy.test.d.ts +2 -0
  132. package/dist/commands/proxy.test.d.ts.map +1 -0
  133. package/dist/commands/proxy.test.js +235 -0
  134. package/dist/commands/proxy.test.js.map +1 -0
  135. package/dist/commands/rate.d.ts +3 -0
  136. package/dist/commands/rate.d.ts.map +1 -0
  137. package/dist/commands/rate.js +46 -0
  138. package/dist/commands/rate.js.map +1 -0
  139. package/dist/commands/rate.test.d.ts +2 -0
  140. package/dist/commands/rate.test.d.ts.map +1 -0
  141. package/dist/commands/rate.test.js +74 -0
  142. package/dist/commands/rate.test.js.map +1 -0
  143. package/dist/commands/services.d.ts +3 -0
  144. package/dist/commands/services.d.ts.map +1 -0
  145. package/dist/commands/services.js +48 -0
  146. package/dist/commands/services.js.map +1 -0
  147. package/dist/commands/services.test.d.ts +2 -0
  148. package/dist/commands/services.test.d.ts.map +1 -0
  149. package/dist/commands/services.test.js +87 -0
  150. package/dist/commands/services.test.js.map +1 -0
  151. package/dist/commands/settlements.d.ts +3 -0
  152. package/dist/commands/settlements.d.ts.map +1 -0
  153. package/dist/commands/settlements.js +79 -0
  154. package/dist/commands/settlements.js.map +1 -0
  155. package/dist/commands/settlements.test.d.ts +2 -0
  156. package/dist/commands/settlements.test.d.ts.map +1 -0
  157. package/dist/commands/settlements.test.js +98 -0
  158. package/dist/commands/settlements.test.js.map +1 -0
  159. package/dist/commands/skills.d.ts +3 -0
  160. package/dist/commands/skills.d.ts.map +1 -0
  161. package/dist/commands/skills.js +96 -0
  162. package/dist/commands/skills.js.map +1 -0
  163. package/dist/commands/skills.test.d.ts +2 -0
  164. package/dist/commands/skills.test.d.ts.map +1 -0
  165. package/dist/commands/skills.test.js +89 -0
  166. package/dist/commands/skills.test.js.map +1 -0
  167. package/dist/commands/test-service.d.ts +3 -0
  168. package/dist/commands/test-service.d.ts.map +1 -0
  169. package/dist/commands/test-service.js +200 -0
  170. package/dist/commands/test-service.js.map +1 -0
  171. package/dist/commands/test-service.test.d.ts +2 -0
  172. package/dist/commands/test-service.test.d.ts.map +1 -0
  173. package/dist/commands/test-service.test.js +119 -0
  174. package/dist/commands/test-service.test.js.map +1 -0
  175. package/dist/commands/tunnel-handlers.d.ts +19 -0
  176. package/dist/commands/tunnel-handlers.d.ts.map +1 -0
  177. package/dist/commands/tunnel-handlers.js +103 -0
  178. package/dist/commands/tunnel-handlers.js.map +1 -0
  179. package/dist/commands/tunnel.d.ts +7 -0
  180. package/dist/commands/tunnel.d.ts.map +1 -0
  181. package/dist/commands/tunnel.js +184 -0
  182. package/dist/commands/tunnel.js.map +1 -0
  183. package/dist/commands/usage.d.ts +9 -0
  184. package/dist/commands/usage.d.ts.map +1 -0
  185. package/dist/commands/usage.js +78 -0
  186. package/dist/commands/usage.js.map +1 -0
  187. package/dist/commands/usage.test.d.ts +2 -0
  188. package/dist/commands/usage.test.d.ts.map +1 -0
  189. package/dist/commands/usage.test.js +102 -0
  190. package/dist/commands/usage.test.js.map +1 -0
  191. package/dist/commands/withdraw-confirm.d.ts +10 -0
  192. package/dist/commands/withdraw-confirm.d.ts.map +1 -0
  193. package/dist/commands/withdraw-confirm.js +51 -0
  194. package/dist/commands/withdraw-confirm.js.map +1 -0
  195. package/dist/commands/withdraw-confirm.test.d.ts +2 -0
  196. package/dist/commands/withdraw-confirm.test.d.ts.map +1 -0
  197. package/dist/commands/withdraw-confirm.test.js +75 -0
  198. package/dist/commands/withdraw-confirm.test.js.map +1 -0
  199. package/dist/commands/withdraw.d.ts +9 -0
  200. package/dist/commands/withdraw.d.ts.map +1 -0
  201. package/dist/commands/withdraw.js +78 -0
  202. package/dist/commands/withdraw.js.map +1 -0
  203. package/dist/commands/withdraw.test.d.ts +2 -0
  204. package/dist/commands/withdraw.test.d.ts.map +1 -0
  205. package/dist/commands/withdraw.test.js +96 -0
  206. package/dist/commands/withdraw.test.js.map +1 -0
  207. package/dist/config.d.ts +20 -0
  208. package/dist/config.d.ts.map +1 -0
  209. package/dist/config.js +38 -0
  210. package/dist/config.js.map +1 -0
  211. package/dist/config.test.d.ts +2 -0
  212. package/dist/config.test.d.ts.map +1 -0
  213. package/dist/config.test.js +54 -0
  214. package/dist/config.test.js.map +1 -0
  215. package/dist/format.d.ts +46 -0
  216. package/dist/format.d.ts.map +1 -0
  217. package/dist/format.js +101 -0
  218. package/dist/format.js.map +1 -0
  219. package/dist/format.test.d.ts +2 -0
  220. package/dist/format.test.d.ts.map +1 -0
  221. package/dist/format.test.js +85 -0
  222. package/dist/format.test.js.map +1 -0
  223. package/dist/generated/skills.d.ts +2 -0
  224. package/dist/generated/skills.d.ts.map +1 -0
  225. package/dist/generated/skills.js +23 -0
  226. package/dist/generated/skills.js.map +1 -0
  227. package/dist/helpers.d.ts +12 -0
  228. package/dist/helpers.d.ts.map +1 -0
  229. package/dist/helpers.js +21 -0
  230. package/dist/helpers.js.map +1 -0
  231. package/dist/helpers.test.d.ts +2 -0
  232. package/dist/helpers.test.d.ts.map +1 -0
  233. package/dist/helpers.test.js +59 -0
  234. package/dist/helpers.test.js.map +1 -0
  235. package/dist/index.d.ts +3 -0
  236. package/dist/index.d.ts.map +1 -0
  237. package/dist/index.js +70 -0
  238. package/dist/index.js.map +1 -0
  239. package/package.json +61 -0
  240. package/templates/http-api/README.md +20 -0
  241. package/templates/http-api/package.json +21 -0
  242. package/templates/http-api/proxygate.tunnel.yaml +9 -0
  243. package/templates/http-api/src/index.ts +77 -0
  244. package/templates/http-api/tsconfig.json +14 -0
  245. package/templates/llm-agent/README.md +23 -0
  246. package/templates/llm-agent/package.json +22 -0
  247. package/templates/llm-agent/proxygate.tunnel.yaml +13 -0
  248. package/templates/llm-agent/src/index.ts +142 -0
  249. package/templates/llm-agent/tsconfig.json +14 -0
@@ -0,0 +1,46 @@
1
+ /** Wrap text in ANSI bold. */
2
+ export declare function bold(text: string): string;
3
+ /** Wrap text in ANSI dim. */
4
+ export declare function dim(text: string): string;
5
+ /** Wrap text in ANSI green. */
6
+ export declare function green(text: string): string;
7
+ /** Wrap text in ANSI red. */
8
+ export declare function red(text: string): string;
9
+ /** Wrap text in ANSI cyan. */
10
+ export declare function cyan(text: string): string;
11
+ /** Wrap text in ANSI yellow. */
12
+ export declare function yellow(text: string): string;
13
+ /**
14
+ * Format data as an aligned terminal table.
15
+ *
16
+ * Calculates column widths from headers and data rows, pads each cell,
17
+ * and joins columns with double-space separators.
18
+ *
19
+ * @returns A string containing the header row, a separator row, and all data rows.
20
+ */
21
+ export declare function formatTable(headers: string[], rows: string[][]): string;
22
+ /**
23
+ * Convert a micro-cents value to a human-readable dollar string.
24
+ * Trims trailing zeros for cleaner display.
25
+ *
26
+ * @example
27
+ * formatCurrency(1_500_000) // "$1.50"
28
+ * formatCurrency(123) // "$0.000123"
29
+ */
30
+ export declare function formatCurrency(microCents: number): string;
31
+ /**
32
+ * Truncate a wallet address for display.
33
+ *
34
+ * @example
35
+ * formatWallet('8Kag2c9vqVT...') // "8Kag...qVT7"
36
+ */
37
+ export declare function formatWallet(wallet: string): string;
38
+ /**
39
+ * Format a USDC amount from lamports (base units, 6 decimals).
40
+ *
41
+ * @example
42
+ * formatUsdc(5_000_000) // "5.000000 USDC"
43
+ * formatUsdc(123) // "0.000123 USDC"
44
+ */
45
+ export declare function formatUsdc(lamports: number): string;
46
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAIA,8BAA8B;AAC9B,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,6BAA6B;AAC7B,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,+BAA+B;AAC/B,wBAAgB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1C;AAED,6BAA6B;AAC7B,wBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,8BAA8B;AAC9B,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzC;AAED,gCAAgC;AAChC,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3C;AAMD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAsBvE;AAMD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAczD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEnD"}
package/dist/format.js ADDED
@@ -0,0 +1,101 @@
1
+ // ---------------------------------------------------------------------------
2
+ // ANSI color helpers (no external dependency)
3
+ // ---------------------------------------------------------------------------
4
+ /** Wrap text in ANSI bold. */
5
+ export function bold(text) {
6
+ return `\x1b[1m${text}\x1b[0m`;
7
+ }
8
+ /** Wrap text in ANSI dim. */
9
+ export function dim(text) {
10
+ return `\x1b[2m${text}\x1b[0m`;
11
+ }
12
+ /** Wrap text in ANSI green. */
13
+ export function green(text) {
14
+ return `\x1b[32m${text}\x1b[0m`;
15
+ }
16
+ /** Wrap text in ANSI red. */
17
+ export function red(text) {
18
+ return `\x1b[31m${text}\x1b[0m`;
19
+ }
20
+ /** Wrap text in ANSI cyan. */
21
+ export function cyan(text) {
22
+ return `\x1b[36m${text}\x1b[0m`;
23
+ }
24
+ /** Wrap text in ANSI yellow. */
25
+ export function yellow(text) {
26
+ return `\x1b[33m${text}\x1b[0m`;
27
+ }
28
+ // ---------------------------------------------------------------------------
29
+ // Table formatting
30
+ // ---------------------------------------------------------------------------
31
+ /**
32
+ * Format data as an aligned terminal table.
33
+ *
34
+ * Calculates column widths from headers and data rows, pads each cell,
35
+ * and joins columns with double-space separators.
36
+ *
37
+ * @returns A string containing the header row, a separator row, and all data rows.
38
+ */
39
+ export function formatTable(headers, rows) {
40
+ const widths = headers.map((h, i) => {
41
+ let max = h.length;
42
+ for (const row of rows) {
43
+ const cell = row[i] ?? '';
44
+ if (cell.length > max) {
45
+ max = cell.length;
46
+ }
47
+ }
48
+ return max;
49
+ });
50
+ const pad = (text, width) => text + ' '.repeat(Math.max(0, width - text.length));
51
+ const headerLine = headers.map((h, i) => pad(h, widths[i])).join(' ');
52
+ const separator = widths.map((w) => '-'.repeat(w)).join(' ');
53
+ const dataLines = rows.map((row) => headers.map((_, i) => pad(row[i] ?? '', widths[i])).join(' '));
54
+ return [headerLine, separator, ...dataLines].join('\n');
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Value formatting
58
+ // ---------------------------------------------------------------------------
59
+ /**
60
+ * Convert a micro-cents value to a human-readable dollar string.
61
+ * Trims trailing zeros for cleaner display.
62
+ *
63
+ * @example
64
+ * formatCurrency(1_500_000) // "$1.50"
65
+ * formatCurrency(123) // "$0.000123"
66
+ */
67
+ export function formatCurrency(microCents) {
68
+ const dollars = microCents / 1_000_000;
69
+ const raw = `$${dollars.toFixed(6)}`;
70
+ // Trim trailing zeros but keep at least 2 decimal places
71
+ const [whole, decimal] = raw.split('.');
72
+ if (!decimal)
73
+ return raw;
74
+ let trimmed = decimal.replace(/0+$/, '');
75
+ if (trimmed.length < 2) {
76
+ trimmed = trimmed.padEnd(2, '0');
77
+ }
78
+ return `${whole}.${trimmed}`;
79
+ }
80
+ /**
81
+ * Truncate a wallet address for display.
82
+ *
83
+ * @example
84
+ * formatWallet('8Kag2c9vqVT...') // "8Kag...qVT7"
85
+ */
86
+ export function formatWallet(wallet) {
87
+ if (wallet.length <= 11)
88
+ return wallet;
89
+ return `${wallet.slice(0, 4)}...${wallet.slice(-4)}`;
90
+ }
91
+ /**
92
+ * Format a USDC amount from lamports (base units, 6 decimals).
93
+ *
94
+ * @example
95
+ * formatUsdc(5_000_000) // "5.000000 USDC"
96
+ * formatUsdc(123) // "0.000123 USDC"
97
+ */
98
+ export function formatUsdc(lamports) {
99
+ return `${(lamports / 1_000_000).toFixed(6)} USDC`;
100
+ }
101
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=format.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.d.ts","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { bold, dim, green, red, cyan, yellow, formatTable, formatCurrency, formatWallet, } from './format.js';
3
+ describe('ANSI helpers', () => {
4
+ it('bold wraps text with bold escape codes', () => {
5
+ expect(bold('hello')).toBe('\x1b[1mhello\x1b[0m');
6
+ });
7
+ it('dim wraps text with dim escape codes', () => {
8
+ expect(dim('hello')).toBe('\x1b[2mhello\x1b[0m');
9
+ });
10
+ it('green wraps text with green escape codes', () => {
11
+ expect(green('hello')).toBe('\x1b[32mhello\x1b[0m');
12
+ });
13
+ it('red wraps text with red escape codes', () => {
14
+ expect(red('hello')).toBe('\x1b[31mhello\x1b[0m');
15
+ });
16
+ it('cyan wraps text with cyan escape codes', () => {
17
+ expect(cyan('hello')).toBe('\x1b[36mhello\x1b[0m');
18
+ });
19
+ it('yellow wraps text with yellow escape codes', () => {
20
+ expect(yellow('hello')).toBe('\x1b[33mhello\x1b[0m');
21
+ });
22
+ });
23
+ describe('formatTable', () => {
24
+ it('produces aligned header, separator, and data rows', () => {
25
+ const result = formatTable(['Name', 'Price'], [
26
+ ['OpenAI', '$1.50'],
27
+ ['Anthropic', '$2.00'],
28
+ ]);
29
+ const lines = result.split('\n');
30
+ expect(lines).toHaveLength(4); // header + separator + 2 rows
31
+ expect(lines[0]).toContain('Name');
32
+ expect(lines[0]).toContain('Price');
33
+ expect(lines[1]).toMatch(/^-+\s{2}-+$/);
34
+ expect(lines[2]).toContain('OpenAI');
35
+ expect(lines[3]).toContain('Anthropic');
36
+ });
37
+ it('handles empty rows', () => {
38
+ const result = formatTable(['Col1', 'Col2'], []);
39
+ const lines = result.split('\n');
40
+ expect(lines).toHaveLength(2); // header + separator only
41
+ });
42
+ it('handles single column', () => {
43
+ const result = formatTable(['ID'], [['abc'], ['def']]);
44
+ const lines = result.split('\n');
45
+ expect(lines).toHaveLength(4);
46
+ expect(lines[2]).toContain('abc');
47
+ expect(lines[3]).toContain('def');
48
+ });
49
+ it('pads columns to widest cell', () => {
50
+ const result = formatTable(['X'], [['short'], ['a much longer value']]);
51
+ const lines = result.split('\n');
52
+ // Separator should be as wide as the longest cell
53
+ expect(lines[1].length).toBe('a much longer value'.length);
54
+ });
55
+ });
56
+ describe('formatCurrency', () => {
57
+ it('converts micro-cents to dollars (1_500_000 -> "$1.50")', () => {
58
+ expect(formatCurrency(1_500_000)).toBe('$1.50');
59
+ });
60
+ it('trims trailing zeros but keeps at least 2 decimals', () => {
61
+ expect(formatCurrency(1_000_000)).toBe('$1.00');
62
+ });
63
+ it('handles small values (123 -> "$0.000123")', () => {
64
+ expect(formatCurrency(123)).toBe('$0.000123');
65
+ });
66
+ it('handles zero', () => {
67
+ expect(formatCurrency(0)).toBe('$0.00');
68
+ });
69
+ });
70
+ describe('formatWallet', () => {
71
+ it('truncates long wallets', () => {
72
+ const wallet = '8Kag2c9vqVTabcdefgh';
73
+ expect(formatWallet(wallet)).toBe('8Kag...efgh');
74
+ });
75
+ it('passes through short wallets unchanged', () => {
76
+ expect(formatWallet('short')).toBe('short');
77
+ });
78
+ it('passes through wallets of exactly 11 chars unchanged', () => {
79
+ expect(formatWallet('12345678901')).toBe('12345678901');
80
+ });
81
+ it('truncates wallets of 12 chars', () => {
82
+ expect(formatWallet('123456789012')).toBe('1234...9012');
83
+ });
84
+ });
85
+ //# sourceMappingURL=format.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.test.js","sourceRoot":"","sources":["../src/format.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const SKILLS: Record<string, Record<string, string>>;
2
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/generated/skills.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoBzD,CAAC"}
@@ -0,0 +1,23 @@
1
+ // AUTO-GENERATED by scripts/embed-skills.ts — do not edit
2
+ export const SKILLS = {
3
+ "pg-buy": {
4
+ "SKILL.md": "---\nname: pg-buy\ndescription: Use when buying API access through ProxyGate — depositing USDC, browsing available APIs, making proxy requests, or streaming responses. Make sure to use this skill whenever someone mentions \"proxy request\", \"buy API\", \"deposit USDC\", \"browse APIs\", \"call API through proxygate\", \"make an API call\", or wants to consume any API through ProxyGate, even if they don't explicitly say \"buy\".\n---\n\n# ProxyGate — Buy API Access\n\nBuyer workflow: deposit USDC, discover APIs, proxy requests, stream responses.\n\n<purpose>\nHelp the user find APIs on ProxyGate, deposit USDC credits, send proxy requests, and manage their balance. Covers the full buyer lifecycle from funding to API consumption.\n</purpose>\n\n<required_reading>\nVerify CLI is configured first: `proxygate balance`. If this fails, use `/pg-setup` before continuing.\n</required_reading>\n\n<process>\n\n<step name=\"check_balance\">\nCheck current balance to determine if deposit is needed:\n\n```bash\nproxygate balance\n```\n\nIf balance is 0 or insufficient, proceed to deposit step.\nIf balance is sufficient, skip to discover step.\n</step>\n\n<step name=\"deposit\">\nDeposit USDC from Solana wallet into ProxyGate vault:\n\n```bash\n# Amount in lamports (1 USDC = 1,000,000)\nproxygate deposit -a 5000000 # deposit 5 USDC\nproxygate deposit -a 1000000 # deposit 1 USDC\nproxygate deposit -a 10000000 # deposit 10 USDC\n```\n\nVerify deposit:\n```bash\nproxygate balance\n```\n\nThe vault auto-initializes on first deposit. User needs USDC in their Solana wallet.\n</step>\n\n<step name=\"discover_apis\">\nBrowse available APIs and find a listing ID:\n\n```bash\nproxygate pricing # all APIs with pricing\nproxygate pricing --service openai # filter by service\nproxygate pricing --json # machine-readable for parsing\nproxygate apis # list all APIs\nproxygate services # list services\nproxygate categories # list categories\n```\n\nNote the `listing-id` from the output — needed for proxy requests.\n</step>\n\n<step name=\"proxy_request\">\nSend a request through ProxyGate:\n\n```bash\n# Basic request\nproxygate proxy <listing-id> /v1/chat/completions \\\n -d '{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}]}'\n\n# GET request\nproxygate proxy <listing-id> /v1/models -X GET\n\n# Stream SSE responses\nproxygate proxy <listing-id> /v1/chat/completions --stream \\\n -d '{\"model\":\"gpt-4\",\"messages\":[{\"role\":\"user\",\"content\":\"Hello\"}],\"stream\":true}'\n\n# With shield scanning\nproxygate proxy <listing-id> /path -d '{}' --shield monitor\n```\n\nThe listing ID determines which seller and service. Get IDs with: `proxygate pricing --json`\n</step>\n\n<step name=\"check_usage\">\nReview usage and remaining balance:\n\n```bash\nproxygate balance # current balance\nproxygate usage # request history\nproxygate usage --service openai --limit 50 # filtered\nproxygate usage --json # machine-readable\n```\n</step>\n\n<step name=\"withdraw\">\nConvert credits back to USDC (optional):\n\n```bash\nproxygate withdraw -a 2000000 # withdraw 2 USDC\nproxygate withdraw # withdraw all\n```\n\nAfter initiating, confirm with TX signature:\n```bash\nproxygate withdraw-confirm -t <tx_signature>\n```\n</step>\n\n</process>\n\n## SDK (Programmatic)\n\nFor agent-to-agent use without the CLI:\n\n```typescript\nimport { ProxyGateClient } from '@proxygate/sdk';\n\nconst client = await ProxyGateClient.create({\n keypairPath: '~/.proxygate/keypair.json',\n});\n\n// Check balance\nconst balance = await client.balance();\n\n// Proxy a request\nconst res = await client.proxy('listing-id', '/v1/chat/completions', {\n model: 'gpt-4',\n messages: [{ role: 'user', content: 'Hello' }],\n});\n```\n\n<success_criteria>\n- [ ] Balance checked and sufficient for request\n- [ ] Listing ID identified from pricing/apis output\n- [ ] Proxy request returns upstream API response\n- [ ] Usage reflects the completed request\n</success_criteria>\n\n## Scope\n\n| Need | Skill |\n|------|-------|\n| First-time setup | `/pg-setup` |\n| Buy API access | **This skill** (`pg-buy`) |\n| Sell API capacity | `/pg-sell` |\n| Check status | `/pg-status` |\n| Update CLI | `/pg-update` |\n\n## Reference\n\nFor full CLI command reference, see [references/commands.md](references/commands.md).\n",
5
+ "references/commands.md": "# ProxyGate CLI Command Reference\n\nComplete reference for all `proxygate` CLI commands. Use `--json` on most commands for structured output.\n\n## Global Options\n\nAll commands accept:\n- `--gateway <url>` — Override gateway URL (default: https://gateway.proxygate.ai)\n- `--keypair <path>` — Path to Solana keypair JSON file\n- `--json` — Machine-readable JSON output\n\nConfig: `~/.proxygate/config.json`\n\n## Setup\n\n```bash\nproxygate init # save gateway URL + keypair\nproxygate init --keypair ~/.proxygate/k.json --gateway https://gateway.proxygate.ai\nproxygate getting-started # interactive setup guide\n```\n\n## Buyer Commands\n\n```bash\nproxygate balance # check USDC balance\nproxygate pricing # browse APIs with pricing\nproxygate pricing --service openai # filter by service\nproxygate apis # list all APIs\nproxygate services # list available services\nproxygate categories # list API categories\nproxygate proxy <listing-id> <path> -d '{}' # proxy a request\nproxygate proxy <id> <path> --stream -d '{}' # stream SSE responses\nproxygate deposit -a 5000000 # deposit 5 USDC\nproxygate withdraw -a 2000000 # withdraw 2 USDC\nproxygate withdraw-confirm -t <tx_sig> # confirm withdrawal TX\nproxygate usage # view usage history\nproxygate usage --service openai --limit 50\nproxygate rate <listing-id> -s 5 -c \"Great\" # rate a seller\n```\n\n## Seller Commands\n\n```bash\nproxygate listings list # list your listings\nproxygate listings list --table # table format\nproxygate listings create # create listing (interactive)\nproxygate tunnel # expose services (production)\nproxygate tunnel -c proxygate.tunnel.yaml # with config file\nproxygate dev # tunnel + request logging + config watch\nproxygate dev -c my-services.yaml\nproxygate settlements # view earnings summary\n```\n\n## Agent Builder Commands\n\n```bash\nproxygate create # scaffold agent project (interactive)\nproxygate create my-agent --template http-api --port 3000\nproxygate test # validate local endpoints\nproxygate test --endpoint \"POST /v1/analyze\" --payload '{\"code\":\"x=1\"}'\n```\n\n## Job Marketplace\n\n```bash\nproxygate jobs list # list available jobs\nproxygate jobs claim <job-id> # claim a job\nproxygate jobs submit <job-id> -d '{}' # submit job result\n```\n\n## Skills Management\n\n```bash\nproxygate skills install # install Claude Code skills\nproxygate skills install --json # JSON output\n```\n\n## Important Notes\n\n- All USDC amounts are in base units (lamports): 1 USDC = 1,000,000\n- Keypair is a standard Solana keypair (JSON array of 64 numbers)\n- Generate keypair: `solana-keygen new --outfile ~/.proxygate/keypair.json --no-bip39-passphrase`\n- Gateway docs: https://gateway.proxygate.ai/docs\n"
6
+ },
7
+ "pg-sell": {
8
+ "SKILL.md": "---\nname: pg-sell\ndescription: Use when selling API capacity on ProxyGate — creating listings, starting tunnels, managing keys, viewing earnings, or exposing local services. Make sure to use this skill whenever someone mentions \"list API\", \"sell capacity\", \"create listing\", \"start tunnel\", \"expose service\", \"earnings\", \"go live\", \"monetize API\", or wants to make their API available on ProxyGate.\n---\n\n# ProxyGate — Sell API Capacity\n\nSeller workflow: create listings, expose services via tunnel, manage earnings.\n\n<purpose>\nHelp the user list their API capacity on ProxyGate, expose services via reverse tunnel, scaffold agent projects, and track earnings.\n</purpose>\n\n<required_reading>\nVerify CLI is configured first: `proxygate balance`. If this fails, use `/pg-setup` before continuing.\n</required_reading>\n\n<process>\n\n<step name=\"scaffold_project\">\nIf building a new service, scaffold it first:\n\n```bash\nproxygate create # interactive\nproxygate create my-agent --template http-api --port 3000\nproxygate create my-agent --template llm-agent --port 8080\n```\n\nTemplates: `http-api` (generic HTTP), `llm-agent` (LLM-based agent).\n</step>\n\n<step name=\"test_locally\">\nValidate endpoints before going live:\n\n```bash\nproxygate test # auto-detect from config\nproxygate test --endpoint \"POST /v1/analyze\" --payload '{\"code\":\"x=1\"}'\n```\n</step>\n\n<step name=\"create_listing\">\nCreate a listing on ProxyGate:\n\n```bash\nproxygate listings create # interactive — walks through service, pricing, etc.\n```\n\nThis is interactive and asks for: service name, pricing model, description, and endpoint info.\n\nView existing listings:\n```bash\nproxygate listings list\nproxygate listings list --table\nproxygate listings list --json\n```\n</step>\n\n<step name=\"configure_tunnel\">\nCreate a tunnel config file (`proxygate.tunnel.yaml`):\n\n```yaml\nservices:\n - name: my-api\n port: 8080\n price_per_request: 1000 # lamports (0.001 USDC)\n description: My AI service\n docs: ./openapi.yaml\n endpoints:\n - method: POST\n path: /v1/analyze\n description: Analyze code\n```\n\nFor per-token pricing:\n```yaml\nservices:\n - name: llm-service\n port: 3000\n pricing_unit: per_token\n price_per_input_token: 100\n price_per_output_token: 300\n```\n</step>\n\n<step name=\"start_tunnel\">\nExpose services to ProxyGate:\n\n```bash\n# Development (request logging + config file watching)\nproxygate dev\nproxygate dev -c my-services.yaml\n\n# Production (stable connection, auto-reconnect)\nproxygate tunnel\nproxygate tunnel -c proxygate.tunnel.yaml\n```\n\nDev mode watches the config file for changes and shows request logs. Production mode is for stable, long-running connections.\n</step>\n\n<step name=\"check_earnings\">\nMonitor performance and earnings:\n\n```bash\nproxygate settlements # earnings summary\nproxygate balance # current balance\nproxygate listings list # check listing status\n```\n</step>\n\n</process>\n\n## SDK — One-Liner Serve\n\nFor programmatic use without CLI:\n\n```typescript\nimport { ProxyGate } from '@proxygate/sdk';\n\nconst tunnel = await ProxyGate.serve({\n keypair: '~/.proxygate/keypair.json',\n services: [\n { name: 'code-review', port: 3000, docs: './openapi.yaml' },\n ],\n onConnected(listings) { console.log('Live!', listings); },\n});\n\n// Graceful shutdown\nawait tunnel.drain(); // waits for in-flight requests\ntunnel.disconnect();\n```\n\n<success_criteria>\n- [ ] Service running locally and responding to requests\n- [ ] Listing created (visible in `proxygate listings list`)\n- [ ] Tunnel connected (dev or production mode)\n- [ ] Incoming requests visible in dev mode logs\n</success_criteria>\n\n## Scope\n\n| Need | Skill |\n|------|-------|\n| First-time setup | `/pg-setup` |\n| Buy API access | `/pg-buy` |\n| Sell API capacity | **This skill** (`pg-sell`) |\n| Check status | `/pg-status` |\n| Update CLI | `/pg-update` |\n\n## Reference\n\nFor full CLI command reference, see [references/commands.md](references/commands.md).\n",
9
+ "references/commands.md": "# ProxyGate CLI Command Reference\n\nComplete reference for all `proxygate` CLI commands. Use `--json` on most commands for structured output.\n\n## Global Options\n\nAll commands accept:\n- `--gateway <url>` — Override gateway URL (default: https://gateway.proxygate.ai)\n- `--keypair <path>` — Path to Solana keypair JSON file\n- `--json` — Machine-readable JSON output\n\nConfig: `~/.proxygate/config.json`\n\n## Setup\n\n```bash\nproxygate init # save gateway URL + keypair\nproxygate init --keypair ~/.proxygate/k.json --gateway https://gateway.proxygate.ai\nproxygate getting-started # interactive setup guide\n```\n\n## Buyer Commands\n\n```bash\nproxygate balance # check USDC balance\nproxygate pricing # browse APIs with pricing\nproxygate pricing --service openai # filter by service\nproxygate apis # list all APIs\nproxygate services # list available services\nproxygate categories # list API categories\nproxygate proxy <listing-id> <path> -d '{}' # proxy a request\nproxygate proxy <id> <path> --stream -d '{}' # stream SSE responses\nproxygate deposit -a 5000000 # deposit 5 USDC\nproxygate withdraw -a 2000000 # withdraw 2 USDC\nproxygate withdraw-confirm -t <tx_sig> # confirm withdrawal TX\nproxygate usage # view usage history\nproxygate usage --service openai --limit 50\nproxygate rate <listing-id> -s 5 -c \"Great\" # rate a seller\n```\n\n## Seller Commands\n\n```bash\nproxygate listings list # list your listings\nproxygate listings list --table # table format\nproxygate listings create # create listing (interactive)\nproxygate tunnel # expose services (production)\nproxygate tunnel -c proxygate.tunnel.yaml # with config file\nproxygate dev # tunnel + request logging + config watch\nproxygate dev -c my-services.yaml\nproxygate settlements # view earnings summary\n```\n\n## Agent Builder Commands\n\n```bash\nproxygate create # scaffold agent project (interactive)\nproxygate create my-agent --template http-api --port 3000\nproxygate test # validate local endpoints\nproxygate test --endpoint \"POST /v1/analyze\" --payload '{\"code\":\"x=1\"}'\n```\n\n## Job Marketplace\n\n```bash\nproxygate jobs list # list available jobs\nproxygate jobs claim <job-id> # claim a job\nproxygate jobs submit <job-id> -d '{}' # submit job result\n```\n\n## Skills Management\n\n```bash\nproxygate skills install # install Claude Code skills\nproxygate skills install --json # JSON output\n```\n\n## Important Notes\n\n- All USDC amounts are in base units (lamports): 1 USDC = 1,000,000\n- Keypair is a standard Solana keypair (JSON array of 64 numbers)\n- Generate keypair: `solana-keygen new --outfile ~/.proxygate/keypair.json --no-bip39-passphrase`\n- Gateway docs: https://gateway.proxygate.ai/docs\n"
10
+ },
11
+ "pg-setup": {
12
+ "SKILL.md": "---\nname: pg-setup\ndescription: Use when setting up ProxyGate for the first time, installing the CLI, configuring a Solana wallet keypair, or connecting to the gateway. Make sure to use this skill whenever someone mentions \"get started with proxygate\", \"install proxygate\", \"setup wallet\", \"configure proxygate\", or wants to start using ProxyGate APIs, even if they don't explicitly say \"setup\".\n---\n\n# ProxyGate Setup\n\nFirst-time setup for ProxyGate — install CLI, configure wallet, connect to gateway.\n\n<purpose>\nWalk the user through ProxyGate first-time setup: install the CLI, locate or create a Solana keypair, configure the gateway connection, and verify everything works.\n</purpose>\n\n<process>\n\n<step name=\"check_existing_install\">\nCheck if ProxyGate CLI is already installed:\n\n```bash\nproxygate --version 2>/dev/null || echo \"NOT_INSTALLED\"\n```\n\nIf installed, check if configured:\n```bash\ncat ~/.proxygate/config.json 2>/dev/null || echo \"NOT_CONFIGURED\"\n```\n\n- If installed and configured: skip to verify step\n- If installed but not configured: skip to configure step\n- If not installed: start from install step\n</step>\n\n<step name=\"install_cli\">\nInstall the CLI globally:\n\n```bash\nnpm install -g proxygate\nproxygate --version\n```\n\nIf npm is not available, check for pnpm or yarn:\n```bash\npnpm add -g proxygate # alternative\n```\n</step>\n\n<step name=\"find_or_create_keypair\">\nLocate an existing Solana keypair or create one.\n\nCommon locations to check:\n```bash\nls ~/.config/solana/id.json 2>/dev/null\nls ~/.proxygate/keypair.json 2>/dev/null\n```\n\nIf no keypair exists, create one:\n```bash\nsolana-keygen new --outfile ~/.proxygate/keypair.json --no-bip39-passphrase\n```\n\nIf `solana-keygen` is not installed, the CLI's `getting-started` command can generate one too.\n</step>\n\n<step name=\"configure\">\nRun the interactive setup (recommended for first time):\n\n```bash\nproxygate getting-started\n```\n\nOr configure manually:\n```bash\nproxygate init --keypair <path-to-keypair>\nproxygate init --keypair ~/.proxygate/keypair.json --gateway https://gateway.proxygate.ai\n```\n\nConfig is saved to `~/.proxygate/config.json`.\n</step>\n\n<step name=\"verify\">\nTest the connection:\n\n```bash\nproxygate balance\nproxygate pricing\n```\n\n- If balance is 0: user needs to deposit USDC — hand off to `/pg-buy`\n- If gateway unreachable: check `--gateway` URL\n- If keypair error: check path in `~/.proxygate/config.json`\n</step>\n\n</process>\n\n<troubleshooting>\n\n| Problem | Fix |\n|---------|-----|\n| `command not found: proxygate` | `npm install -g proxygate` |\n| `ENOENT keypair` | Check path in `~/.proxygate/config.json` |\n| `Gateway unreachable` | Verify URL, try `https://gateway.proxygate.ai` |\n| Balance shows 0 | Need to deposit: use `/pg-buy` |\n| `solana-keygen: command not found` | Use `proxygate getting-started` instead (handles keypair creation) |\n\n</troubleshooting>\n\n<success_criteria>\n- [ ] CLI installed and `proxygate --version` returns a version\n- [ ] Keypair file exists and is readable\n- [ ] `~/.proxygate/config.json` has `gatewayUrl` and `keypairPath`\n- [ ] `proxygate balance` returns a response (even if 0)\n- [ ] `proxygate pricing` shows available APIs\n</success_criteria>\n\n## Scope\n\n| Need | Skill |\n|------|-------|\n| First-time setup | **This skill** (`pg-setup`) |\n| Buy API access | `/pg-buy` |\n| Sell API capacity | `/pg-sell` |\n| Check status | `/pg-status` |\n| Update CLI | `/pg-update` |\n\n## Reference\n\nFor full CLI command reference, see [references/commands.md](references/commands.md).\n",
13
+ "references/commands.md": "# ProxyGate CLI Command Reference\n\nComplete reference for all `proxygate` CLI commands. Use `--json` on most commands for structured output.\n\n## Global Options\n\nAll commands accept:\n- `--gateway <url>` — Override gateway URL (default: https://gateway.proxygate.ai)\n- `--keypair <path>` — Path to Solana keypair JSON file\n- `--json` — Machine-readable JSON output\n\nConfig: `~/.proxygate/config.json`\n\n## Setup\n\n```bash\nproxygate init # save gateway URL + keypair\nproxygate init --keypair ~/.proxygate/k.json --gateway https://gateway.proxygate.ai\nproxygate getting-started # interactive setup guide\n```\n\n## Buyer Commands\n\n```bash\nproxygate balance # check USDC balance\nproxygate pricing # browse APIs with pricing\nproxygate pricing --service openai # filter by service\nproxygate apis # list all APIs\nproxygate services # list available services\nproxygate categories # list API categories\nproxygate proxy <listing-id> <path> -d '{}' # proxy a request\nproxygate proxy <id> <path> --stream -d '{}' # stream SSE responses\nproxygate deposit -a 5000000 # deposit 5 USDC\nproxygate withdraw -a 2000000 # withdraw 2 USDC\nproxygate withdraw-confirm -t <tx_sig> # confirm withdrawal TX\nproxygate usage # view usage history\nproxygate usage --service openai --limit 50\nproxygate rate <listing-id> -s 5 -c \"Great\" # rate a seller\n```\n\n## Seller Commands\n\n```bash\nproxygate listings list # list your listings\nproxygate listings list --table # table format\nproxygate listings create # create listing (interactive)\nproxygate tunnel # expose services (production)\nproxygate tunnel -c proxygate.tunnel.yaml # with config file\nproxygate dev # tunnel + request logging + config watch\nproxygate dev -c my-services.yaml\nproxygate settlements # view earnings summary\n```\n\n## Agent Builder Commands\n\n```bash\nproxygate create # scaffold agent project (interactive)\nproxygate create my-agent --template http-api --port 3000\nproxygate test # validate local endpoints\nproxygate test --endpoint \"POST /v1/analyze\" --payload '{\"code\":\"x=1\"}'\n```\n\n## Job Marketplace\n\n```bash\nproxygate jobs list # list available jobs\nproxygate jobs claim <job-id> # claim a job\nproxygate jobs submit <job-id> -d '{}' # submit job result\n```\n\n## Skills Management\n\n```bash\nproxygate skills install # install Claude Code skills\nproxygate skills install --json # JSON output\n```\n\n## Important Notes\n\n- All USDC amounts are in base units (lamports): 1 USDC = 1,000,000\n- Keypair is a standard Solana keypair (JSON array of 64 numbers)\n- Generate keypair: `solana-keygen new --outfile ~/.proxygate/keypair.json --no-bip39-passphrase`\n- Gateway docs: https://gateway.proxygate.ai/docs\n"
14
+ },
15
+ "pg-status": {
16
+ "SKILL.md": "---\nname: pg-status\ndescription: Use when checking ProxyGate status — balance, usage, listings, tunnel health, or earnings. Make sure to use this skill whenever someone mentions \"check balance\", \"proxygate status\", \"my usage\", \"my earnings\", \"what's my balance\", \"how much have I spent\", or wants any kind of status overview.\n---\n\n# ProxyGate Status\n\nQuick status checks for buyers and sellers.\n\n<process>\n\n<step name=\"buyer_status\">\n```bash\nproxygate balance # USDC balance + pending settlement\nproxygate usage # recent request history\nproxygate usage --limit 10 # last 10 requests\nproxygate usage --json # machine-readable\n```\n</step>\n\n<step name=\"seller_status\">\n```bash\nproxygate listings list # active listings\nproxygate listings list --table # table format\nproxygate settlements # earnings summary\n```\n</step>\n\n</process>\n\n<troubleshooting>\n\n| Symptom | Check |\n|---------|-------|\n| Balance 0 | `proxygate deposit -a <amount>` — see `/pg-buy` |\n| Proxy returns 503 | Listing may be paused or seller tunnel is down |\n| \"Unauthorized\" | Run `proxygate init` to reconfigure keypair — see `/pg-setup` |\n| Tunnel disconnects | Check `proxygate dev` logs, verify local port is open |\n| Gateway unreachable | Verify URL: `proxygate balance --gateway https://gateway.proxygate.ai` |\n\n</troubleshooting>\n\n## Scope\n\n| Need | Skill |\n|------|-------|\n| First-time setup | `/pg-setup` |\n| Buy API access | `/pg-buy` |\n| Sell API capacity | `/pg-sell` |\n| Check status | **This skill** (`pg-status`) |\n| Update CLI | `/pg-update` |\n"
17
+ },
18
+ "pg-update": {
19
+ "SKILL.md": "---\nname: pg-update\ndescription: Use when updating ProxyGate CLI or SDK to latest version. Also triggers proactively when ~/.claude/cache/proxygate-update-check.json indicates an update is available and the statusline shows the update indicator. Make sure to use this whenever someone says \"update proxygate\", \"upgrade cli\", or when a session starts with an update notification.\n---\n\n# ProxyGate Update\n\nCheck for and install updates to proxygate.\n\n<process>\n\n<step name=\"get_installed_version\">\n```bash\nproxygate --version 2>/dev/null || echo \"NOT_INSTALLED\"\n```\n\nIf not installed, direct user to `/pg-setup`.\n</step>\n\n<step name=\"check_latest_version\">\n```bash\nnpm view proxygate version 2>/dev/null || echo \"UNAVAILABLE\"\n```\n\nIf npm check fails, suggest manual update: `npm install -g proxygate@latest`\n</step>\n\n<step name=\"compare_versions\">\n- If installed == latest: \"You're already on the latest version.\"\n- If installed < latest: show both versions and proceed to update\n- If not installed: direct to `/pg-setup`\n</step>\n\n<step name=\"run_update\">\n```bash\nnpm install -g proxygate@latest\n```\n\nVerify:\n```bash\nproxygate --version\n```\n</step>\n\n<step name=\"update_skills\">\nSkills are bundled in the CLI, so a new version may include updated skills:\n\n```bash\nproxygate skills install\n```\n</step>\n\n<step name=\"clear_cache\">\n```bash\nrm -f ~/.claude/cache/proxygate-update-check.json\n```\n</step>\n\n</process>\n\n## SDK Update\n\nIf `@proxygate/sdk` is in the project's dependencies:\n\n```bash\nnpm install @proxygate/sdk@latest\n# or\npnpm add @proxygate/sdk@latest\n```\n\n<success_criteria>\n- [ ] Installed version detected correctly\n- [ ] Latest version checked via npm\n- [ ] Update skipped if already current\n- [ ] CLI updated successfully\n- [ ] Skills updated via `proxygate skills install`\n- [ ] Update cache cleared\n</success_criteria>\n",
20
+ "scripts/check-update.sh": "#!/usr/bin/env bash\n# ProxyGate update checker — runs on Claude Code SessionStart.\n# Writes result to ~/.claude/cache/proxygate-update-check.json.\n# Exits quickly; never blocks session startup.\n\nset -euo pipefail\n\nCACHE_DIR=\"$HOME/.claude/cache\"\nCACHE_FILE=\"$CACHE_DIR/proxygate-update-check.json\"\n\nmkdir -p \"$CACHE_DIR\"\n\n# Skip if checked within last hour\nif [ -f \"$CACHE_FILE\" ]; then\n if [ \"$(uname)\" = \"Darwin\" ]; then\n age=$(( $(date +%s) - $(stat -f %m \"$CACHE_FILE\") ))\n else\n age=$(( $(date +%s) - $(stat -c %Y \"$CACHE_FILE\") ))\n fi\n if [ \"$age\" -lt 3600 ]; then\n exit 0\n fi\nfi\n\ncurrent=$(proxygate --version 2>/dev/null || echo \"0.0.0\")\nlatest=$(npm view proxygate version 2>/dev/null || echo \"0.0.0\")\n\nif [ \"$current\" = \"$latest\" ] || [ \"$latest\" = \"0.0.0\" ]; then\n cat > \"$CACHE_FILE\" <<JSON\n{\"update_available\":false,\"current\":\"$current\",\"latest\":\"$latest\",\"checked_at\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}\nJSON\nelse\n cat > \"$CACHE_FILE\" <<JSON\n{\"update_available\":true,\"current\":\"$current\",\"latest\":\"$latest\",\"checked_at\":\"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"}\nJSON\nfi\n"
21
+ }
22
+ };
23
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/generated/skills.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,CAAC,MAAM,MAAM,GAA2C;IAC5D,QAAQ,EAAE;QACR,UAAU,EAAE,8+IAA8+I;QAC1/I,wBAAwB,EAAE,gqGAAgqG;KAC3rG;IACD,SAAS,EAAE;QACT,UAAU,EAAE,soIAAsoI;QAClpI,wBAAwB,EAAE,gqGAAgqG;KAC3rG;IACD,UAAU,EAAE;QACV,UAAU,EAAE,ykHAAykH;QACrlH,wBAAwB,EAAE,gqGAAgqG;KAC3rG;IACD,WAAW,EAAE;QACX,UAAU,EAAE,gpDAAgpD;KAC7pD;IACD,WAAW,EAAE;QACX,UAAU,EAAE,44DAA44D;QACx5D,yBAAyB,EAAE,sqCAAsqC;KAClsC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ProxyGateClient } from '@proxygate/sdk';
2
+ /**
3
+ * Resolve a ProxyGateClient from CLI flags or saved config.
4
+ *
5
+ * Exits with code 1 if neither config nor flags provide
6
+ * the required gatewayUrl and keypairPath.
7
+ */
8
+ export declare function getClient(opts: {
9
+ gateway?: string;
10
+ keypair?: string;
11
+ }): Promise<ProxyGateClient>;
12
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAIjD;;;;;GAKG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,CAAC,CAY3B"}
@@ -0,0 +1,21 @@
1
+ import { ProxyGateClient } from '@proxygate/sdk';
2
+ import { loadConfig } from './config.js';
3
+ import { red, dim } from './format.js';
4
+ /**
5
+ * Resolve a ProxyGateClient from CLI flags or saved config.
6
+ *
7
+ * Exits with code 1 if neither config nor flags provide
8
+ * the required gatewayUrl and keypairPath.
9
+ */
10
+ export async function getClient(opts) {
11
+ const config = await loadConfig();
12
+ const gatewayUrl = opts.gateway ?? config?.gatewayUrl;
13
+ const keypairPath = opts.keypair ?? config?.keypairPath;
14
+ if (!gatewayUrl || !keypairPath) {
15
+ console.error(red('Error: Not configured. Run `proxygate init` first.'));
16
+ console.error(dim('Or use --gateway and --keypair flags.'));
17
+ process.exit(1);
18
+ }
19
+ return ProxyGateClient.create({ gatewayUrl, keypairPath });
20
+ }
21
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAG/B;IACC,MAAM,MAAM,GAAG,MAAM,UAAU,EAAE,CAAC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,UAAU,CAAC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,WAAW,CAAC;IAExD,IAAI,CAAC,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,eAAe,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.test.d.ts","sourceRoot":"","sources":["../src/helpers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ const mockCreate = vi.fn();
3
+ vi.mock('@proxygate/sdk', () => ({
4
+ ProxyGateClient: {
5
+ create: (...args) => mockCreate(...args),
6
+ },
7
+ }));
8
+ vi.mock('./config.js', () => ({
9
+ loadConfig: vi.fn(),
10
+ }));
11
+ import { loadConfig } from './config.js';
12
+ import { getClient } from './helpers.js';
13
+ const mockLoadConfig = vi.mocked(loadConfig);
14
+ beforeEach(() => {
15
+ vi.clearAllMocks();
16
+ mockCreate.mockReturnValue({ proxy: {} });
17
+ });
18
+ describe('getClient', () => {
19
+ it('uses flag overrides when provided', async () => {
20
+ mockLoadConfig.mockResolvedValue(null);
21
+ await getClient({ gateway: 'http://flag-gw', keypair: '/flag/key.json' });
22
+ expect(mockCreate).toHaveBeenCalledWith({
23
+ gatewayUrl: 'http://flag-gw',
24
+ keypairPath: '/flag/key.json',
25
+ });
26
+ });
27
+ it('falls back to saved config', async () => {
28
+ mockLoadConfig.mockResolvedValue({
29
+ gatewayUrl: 'http://saved-gw',
30
+ keypairPath: '/saved/key.json',
31
+ });
32
+ await getClient({});
33
+ expect(mockCreate).toHaveBeenCalledWith({
34
+ gatewayUrl: 'http://saved-gw',
35
+ keypairPath: '/saved/key.json',
36
+ });
37
+ });
38
+ it('prefers flags over config', async () => {
39
+ mockLoadConfig.mockResolvedValue({
40
+ gatewayUrl: 'http://saved-gw',
41
+ keypairPath: '/saved/key.json',
42
+ });
43
+ await getClient({ gateway: 'http://override-gw' });
44
+ expect(mockCreate).toHaveBeenCalledWith({
45
+ gatewayUrl: 'http://override-gw',
46
+ keypairPath: '/saved/key.json',
47
+ });
48
+ });
49
+ it('calls process.exit(1) when no config and no flags', async () => {
50
+ mockLoadConfig.mockResolvedValue(null);
51
+ const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => {
52
+ throw new Error('process.exit');
53
+ });
54
+ await expect(getClient({})).rejects.toThrow('process.exit');
55
+ expect(mockExit).toHaveBeenCalledWith(1);
56
+ mockExit.mockRestore();
57
+ });
58
+ });
59
+ //# sourceMappingURL=helpers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.test.js","sourceRoot":"","sources":["../src/helpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE9D,MAAM,UAAU,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAE3B,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,eAAe,EAAE;QACf,MAAM,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC;KACpD;CACF,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,cAAc,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;AAE7C,UAAU,CAAC,GAAG,EAAE;IACd,EAAE,CAAC,aAAa,EAAE,CAAC;IACnB,UAAU,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAC5C,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC1E,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YACtC,UAAU,EAAE,gBAAgB;YAC5B,WAAW,EAAE,gBAAgB;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;QAC1C,cAAc,CAAC,iBAAiB,CAAC;YAC/B,UAAU,EAAE,iBAAiB;YAC7B,WAAW,EAAE,iBAAiB;SAC/B,CAAC,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YACtC,UAAU,EAAE,iBAAiB;YAC7B,WAAW,EAAE,iBAAiB;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,cAAc,CAAC,iBAAiB,CAAC;YAC/B,UAAU,EAAE,iBAAiB;YAC7B,WAAW,EAAE,iBAAiB;SAC/B,CAAC,CAAC;QACH,MAAM,SAAS,CAAC,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC;YACtC,UAAU,EAAE,oBAAoB;YAChC,WAAW,EAAE,iBAAiB;SAC/B,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QACjE,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACjE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;QACzC,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerInitCommand } from './commands/init.js';
4
+ import { registerGettingStartedCommand } from './commands/getting-started.js';
5
+ import { registerBalanceCommand } from './commands/balance.js';
6
+ import { registerPricingCommand } from './commands/pricing.js';
7
+ import { registerUsageCommand } from './commands/usage.js';
8
+ import { registerProxyCommand } from './commands/proxy.js';
9
+ import { registerDepositCommand } from './commands/deposit.js';
10
+ import { registerWithdrawCommand } from './commands/withdraw.js';
11
+ import { registerWithdrawConfirmCommand } from './commands/withdraw-confirm.js';
12
+ import { registerListingsCommand } from './commands/listings.js';
13
+ import { registerTunnelCommand } from './commands/tunnel.js';
14
+ import { registerSettlementsCommand } from './commands/settlements.js';
15
+ import { registerApisCommand } from './commands/apis.js';
16
+ import { registerServicesCommand } from './commands/services.js';
17
+ import { registerCategoriesCommand } from './commands/categories.js';
18
+ import { registerRateCommand } from './commands/rate.js';
19
+ import { registerJobsCommand } from './commands/jobs.js';
20
+ import { registerCreateCommand } from './commands/create.js';
21
+ import { registerTestCommand } from './commands/test-service.js';
22
+ import { registerDevCommand } from './commands/dev.js';
23
+ import { registerSkillsCommand } from './commands/skills.js';
24
+ const program = new Command('proxygate');
25
+ program
26
+ .version('0.1.0')
27
+ .description('ProxyGate CLI — the Airbnb for AI agents.\n\n' +
28
+ 'Autonomous payments, API access, and service discovery for the machine economy.\n' +
29
+ 'Sellers list unused quota, agents purchase access through a transparent proxy.\n' +
30
+ 'Keys never leave the server.')
31
+ .option('--gateway <url>', 'Override gateway URL (default: from config)')
32
+ .option('--keypair <path>', 'Path to Solana keypair JSON file (default: from config)')
33
+ .option('--json', 'Machine-readable JSON output (for scripting)')
34
+ .addHelpText('after', '\nQuick start:\n' +
35
+ ' $ proxygate getting-started First time? Start here\n' +
36
+ ' $ proxygate pricing Browse available APIs\n' +
37
+ ' $ proxygate balance Check your USDC balance\n' +
38
+ ' $ proxygate proxy <id> <path> -d \'{"model":"gpt-4",...}\'\n\n' +
39
+ 'Build & sell an agent:\n' +
40
+ ' $ proxygate create Scaffold a new agent project\n' +
41
+ ' $ proxygate test Validate your service locally\n' +
42
+ ' $ proxygate tunnel Go live on ProxyGate\n\n' +
43
+ 'Manage listings:\n' +
44
+ ' $ proxygate listings list List your seller listings\n' +
45
+ ' $ proxygate listings create Create a new listing (interactive)\n\n' +
46
+ 'Config: ~/.proxygate/config.json\n' +
47
+ 'Docs: https://gateway.proxygate.ai/docs');
48
+ registerInitCommand(program);
49
+ registerGettingStartedCommand(program);
50
+ registerBalanceCommand(program);
51
+ registerPricingCommand(program);
52
+ registerUsageCommand(program);
53
+ registerProxyCommand(program);
54
+ registerDepositCommand(program);
55
+ registerWithdrawCommand(program);
56
+ registerWithdrawConfirmCommand(program);
57
+ registerListingsCommand(program);
58
+ registerTunnelCommand(program);
59
+ registerSettlementsCommand(program);
60
+ registerApisCommand(program);
61
+ registerServicesCommand(program);
62
+ registerCategoriesCommand(program);
63
+ registerRateCommand(program);
64
+ registerJobsCommand(program);
65
+ registerCreateCommand(program);
66
+ registerTestCommand(program);
67
+ registerDevCommand(program);
68
+ registerSkillsCommand(program);
69
+ program.parse();
70
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@proxygate/cli",
3
+ "version": "0.1.0",
4
+ "description": "ProxyGate CLI — buy APIs, sell agent capacity, and post jobs on the autonomous agent marketplace. USDC on Solana.",
5
+ "type": "module",
6
+ "bin": {
7
+ "proxygate": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "templates",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "keywords": [
16
+ "proxygate",
17
+ "cli",
18
+ "api",
19
+ "proxy",
20
+ "solana",
21
+ "usdc",
22
+ "ai",
23
+ "agents",
24
+ "marketplace",
25
+ "tunnel",
26
+ "jobs",
27
+ "mcp"
28
+ ],
29
+ "license": "Apache-2.0",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/proxygate/proxygate",
33
+ "directory": "packages/cli"
34
+ },
35
+ "homepage": "https://proxygate.ai",
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "scripts": {
40
+ "build:skills": "tsx scripts/embed-skills.ts",
41
+ "build": "pnpm build:skills && tsc",
42
+ "typecheck": "tsc --noEmit",
43
+ "dev": "tsx src/index.ts",
44
+ "test": "vitest run",
45
+ "prepublishOnly": "pnpm build"
46
+ },
47
+ "dependencies": {
48
+ "@inquirer/prompts": "^8.3.0",
49
+ "@proxygate/sdk": "^0.3.0",
50
+ "commander": "^14.0.3",
51
+ "js-yaml": "^4.1.1",
52
+ "tweetnacl": "^1.0.3"
53
+ },
54
+ "devDependencies": {
55
+ "@types/js-yaml": "^4.0.9",
56
+ "@types/node": "^22.0.0",
57
+ "tsx": "^4.0.0",
58
+ "typescript": "^5.7.0",
59
+ "vitest": "^4.0.0"
60
+ }
61
+ }