@hs-x/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 (302) hide show
  1. package/README.md +1001 -0
  2. package/dist/account-store.d.ts +51 -0
  3. package/dist/account-store.d.ts.map +1 -0
  4. package/dist/account-store.js +138 -0
  5. package/dist/account-store.js.map +1 -0
  6. package/dist/bin/hs-x.d.ts +3 -0
  7. package/dist/bin/hs-x.d.ts.map +1 -0
  8. package/dist/bin/hs-x.js +47 -0
  9. package/dist/bin/hs-x.js.map +1 -0
  10. package/dist/cli/index.d.ts +3 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +595 -0
  13. package/dist/cli/index.js.map +1 -0
  14. package/dist/cli-error.d.ts +36 -0
  15. package/dist/cli-error.d.ts.map +1 -0
  16. package/dist/cli-error.js +40 -0
  17. package/dist/cli-error.js.map +1 -0
  18. package/dist/cloudflare-auth.d.ts +25 -0
  19. package/dist/cloudflare-auth.d.ts.map +1 -0
  20. package/dist/cloudflare-auth.js +251 -0
  21. package/dist/cloudflare-auth.js.map +1 -0
  22. package/dist/cloudflare-kv.d.ts +23 -0
  23. package/dist/cloudflare-kv.d.ts.map +1 -0
  24. package/dist/cloudflare-kv.js +101 -0
  25. package/dist/cloudflare-kv.js.map +1 -0
  26. package/dist/cloudflare-oauth-store.d.ts +16 -0
  27. package/dist/cloudflare-oauth-store.d.ts.map +1 -0
  28. package/dist/cloudflare-oauth-store.js +80 -0
  29. package/dist/cloudflare-oauth-store.js.map +1 -0
  30. package/dist/cloudflare-oauth.d.ts +82 -0
  31. package/dist/cloudflare-oauth.d.ts.map +1 -0
  32. package/dist/cloudflare-oauth.js +336 -0
  33. package/dist/cloudflare-oauth.js.map +1 -0
  34. package/dist/cloudflare-pointer.d.ts +13 -0
  35. package/dist/cloudflare-pointer.d.ts.map +1 -0
  36. package/dist/cloudflare-pointer.js +46 -0
  37. package/dist/cloudflare-pointer.js.map +1 -0
  38. package/dist/command-history.d.ts +7 -0
  39. package/dist/command-history.d.ts.map +1 -0
  40. package/dist/command-history.js +34 -0
  41. package/dist/command-history.js.map +1 -0
  42. package/dist/commands/account.d.ts +7 -0
  43. package/dist/commands/account.d.ts.map +1 -0
  44. package/dist/commands/account.js +315 -0
  45. package/dist/commands/account.js.map +1 -0
  46. package/dist/commands/api.d.ts +36 -0
  47. package/dist/commands/api.d.ts.map +1 -0
  48. package/dist/commands/api.js +521 -0
  49. package/dist/commands/api.js.map +1 -0
  50. package/dist/commands/completion.d.ts +7 -0
  51. package/dist/commands/completion.d.ts.map +1 -0
  52. package/dist/commands/completion.js +121 -0
  53. package/dist/commands/completion.js.map +1 -0
  54. package/dist/commands/connect.d.ts +7 -0
  55. package/dist/commands/connect.d.ts.map +1 -0
  56. package/dist/commands/connect.js +1123 -0
  57. package/dist/commands/connect.js.map +1 -0
  58. package/dist/commands/control-plane-read.d.ts +22 -0
  59. package/dist/commands/control-plane-read.d.ts.map +1 -0
  60. package/dist/commands/control-plane-read.js +350 -0
  61. package/dist/commands/control-plane-read.js.map +1 -0
  62. package/dist/commands/deploy-promote.d.ts +14 -0
  63. package/dist/commands/deploy-promote.d.ts.map +1 -0
  64. package/dist/commands/deploy-promote.js +105 -0
  65. package/dist/commands/deploy-promote.js.map +1 -0
  66. package/dist/commands/deploy.d.ts +18 -0
  67. package/dist/commands/deploy.d.ts.map +1 -0
  68. package/dist/commands/deploy.js +2764 -0
  69. package/dist/commands/deploy.js.map +1 -0
  70. package/dist/commands/dev.d.ts +7 -0
  71. package/dist/commands/dev.d.ts.map +1 -0
  72. package/dist/commands/dev.js +913 -0
  73. package/dist/commands/dev.js.map +1 -0
  74. package/dist/commands/doctor.d.ts +8 -0
  75. package/dist/commands/doctor.d.ts.map +1 -0
  76. package/dist/commands/doctor.js +258 -0
  77. package/dist/commands/doctor.js.map +1 -0
  78. package/dist/commands/flags.d.ts +22 -0
  79. package/dist/commands/flags.d.ts.map +1 -0
  80. package/dist/commands/flags.js +185 -0
  81. package/dist/commands/flags.js.map +1 -0
  82. package/dist/commands/help-command.d.ts +13 -0
  83. package/dist/commands/help-command.d.ts.map +1 -0
  84. package/dist/commands/help-command.js +482 -0
  85. package/dist/commands/help-command.js.map +1 -0
  86. package/dist/commands/history.d.ts +6 -0
  87. package/dist/commands/history.d.ts.map +1 -0
  88. package/dist/commands/history.js +42 -0
  89. package/dist/commands/history.js.map +1 -0
  90. package/dist/commands/init.d.ts +8 -0
  91. package/dist/commands/init.d.ts.map +1 -0
  92. package/dist/commands/init.js +233 -0
  93. package/dist/commands/init.js.map +1 -0
  94. package/dist/commands/link.d.ts +26 -0
  95. package/dist/commands/link.d.ts.map +1 -0
  96. package/dist/commands/link.js +441 -0
  97. package/dist/commands/link.js.map +1 -0
  98. package/dist/commands/login.d.ts +8 -0
  99. package/dist/commands/login.d.ts.map +1 -0
  100. package/dist/commands/login.js +381 -0
  101. package/dist/commands/login.js.map +1 -0
  102. package/dist/commands/migrate.d.ts +8 -0
  103. package/dist/commands/migrate.d.ts.map +1 -0
  104. package/dist/commands/migrate.js +258 -0
  105. package/dist/commands/migrate.js.map +1 -0
  106. package/dist/commands/rollback.d.ts +21 -0
  107. package/dist/commands/rollback.d.ts.map +1 -0
  108. package/dist/commands/rollback.js +301 -0
  109. package/dist/commands/rollback.js.map +1 -0
  110. package/dist/commands/secrets.d.ts +7 -0
  111. package/dist/commands/secrets.d.ts.map +1 -0
  112. package/dist/commands/secrets.js +230 -0
  113. package/dist/commands/secrets.js.map +1 -0
  114. package/dist/commands/status.d.ts +7 -0
  115. package/dist/commands/status.d.ts.map +1 -0
  116. package/dist/commands/status.js +241 -0
  117. package/dist/commands/status.js.map +1 -0
  118. package/dist/commands/unlink.d.ts +21 -0
  119. package/dist/commands/unlink.d.ts.map +1 -0
  120. package/dist/commands/unlink.js +83 -0
  121. package/dist/commands/unlink.js.map +1 -0
  122. package/dist/commands/update.d.ts +11 -0
  123. package/dist/commands/update.d.ts.map +1 -0
  124. package/dist/commands/update.js +154 -0
  125. package/dist/commands/update.js.map +1 -0
  126. package/dist/commands/validate.d.ts +9 -0
  127. package/dist/commands/validate.d.ts.map +1 -0
  128. package/dist/commands/validate.js +39 -0
  129. package/dist/commands/validate.js.map +1 -0
  130. package/dist/config.d.ts +12 -0
  131. package/dist/config.d.ts.map +1 -0
  132. package/dist/config.js +64 -0
  133. package/dist/config.js.map +1 -0
  134. package/dist/constants.d.ts +4 -0
  135. package/dist/constants.d.ts.map +1 -0
  136. package/dist/constants.js +4 -0
  137. package/dist/constants.js.map +1 -0
  138. package/dist/control-plane-fetch.d.ts +34 -0
  139. package/dist/control-plane-fetch.d.ts.map +1 -0
  140. package/dist/control-plane-fetch.js +73 -0
  141. package/dist/control-plane-fetch.js.map +1 -0
  142. package/dist/control-plane-loader.d.ts +16 -0
  143. package/dist/control-plane-loader.d.ts.map +1 -0
  144. package/dist/control-plane-loader.js +24 -0
  145. package/dist/control-plane-loader.js.map +1 -0
  146. package/dist/dev/compat-shim.d.ts +40 -0
  147. package/dist/dev/compat-shim.d.ts.map +1 -0
  148. package/dist/dev/compat-shim.js +65 -0
  149. package/dist/dev/compat-shim.js.map +1 -0
  150. package/dist/dev/event-bus.d.ts +27 -0
  151. package/dist/dev/event-bus.d.ts.map +1 -0
  152. package/dist/dev/event-bus.js +32 -0
  153. package/dist/dev/event-bus.js.map +1 -0
  154. package/dist/dev/log-server.d.ts +52 -0
  155. package/dist/dev/log-server.d.ts.map +1 -0
  156. package/dist/dev/log-server.js +216 -0
  157. package/dist/dev/log-server.js.map +1 -0
  158. package/dist/dev/session-manager.d.ts +33 -0
  159. package/dist/dev/session-manager.d.ts.map +1 -0
  160. package/dist/dev/session-manager.js +132 -0
  161. package/dist/dev/session-manager.js.map +1 -0
  162. package/dist/dev/stream-renderer.d.ts +22 -0
  163. package/dist/dev/stream-renderer.d.ts.map +1 -0
  164. package/dist/dev/stream-renderer.js +65 -0
  165. package/dist/dev/stream-renderer.js.map +1 -0
  166. package/dist/dev/tunnel.d.ts +40 -0
  167. package/dist/dev/tunnel.d.ts.map +1 -0
  168. package/dist/dev/tunnel.js +139 -0
  169. package/dist/dev/tunnel.js.map +1 -0
  170. package/dist/effect-http.d.ts +10 -0
  171. package/dist/effect-http.d.ts.map +1 -0
  172. package/dist/effect-http.js +38 -0
  173. package/dist/effect-http.js.map +1 -0
  174. package/dist/errors-registry.d.ts +11 -0
  175. package/dist/errors-registry.d.ts.map +1 -0
  176. package/dist/errors-registry.js +554 -0
  177. package/dist/errors-registry.js.map +1 -0
  178. package/dist/errors.d.ts +58 -0
  179. package/dist/errors.d.ts.map +1 -0
  180. package/dist/errors.js +30 -0
  181. package/dist/errors.js.map +1 -0
  182. package/dist/help.d.ts +6 -0
  183. package/dist/help.d.ts.map +1 -0
  184. package/dist/help.js +100 -0
  185. package/dist/help.js.map +1 -0
  186. package/dist/history.d.ts +15 -0
  187. package/dist/history.d.ts.map +1 -0
  188. package/dist/history.js +69 -0
  189. package/dist/history.js.map +1 -0
  190. package/dist/hubspot-auth.d.ts +53 -0
  191. package/dist/hubspot-auth.d.ts.map +1 -0
  192. package/dist/hubspot-auth.js +301 -0
  193. package/dist/hubspot-auth.js.map +1 -0
  194. package/dist/hubspot-developer-client.d.ts +10 -0
  195. package/dist/hubspot-developer-client.d.ts.map +1 -0
  196. package/dist/hubspot-developer-client.js +212 -0
  197. package/dist/hubspot-developer-client.js.map +1 -0
  198. package/dist/index.d.ts +5 -0
  199. package/dist/index.d.ts.map +1 -0
  200. package/dist/index.js +4 -0
  201. package/dist/index.js.map +1 -0
  202. package/dist/init/templates.d.ts +18 -0
  203. package/dist/init/templates.d.ts.map +1 -0
  204. package/dist/init/templates.js +239 -0
  205. package/dist/init/templates.js.map +1 -0
  206. package/dist/load-env.d.ts +16 -0
  207. package/dist/load-env.d.ts.map +1 -0
  208. package/dist/load-env.js +69 -0
  209. package/dist/load-env.js.map +1 -0
  210. package/dist/machine-id.d.ts +3 -0
  211. package/dist/machine-id.d.ts.map +1 -0
  212. package/dist/machine-id.js +41 -0
  213. package/dist/machine-id.js.map +1 -0
  214. package/dist/paths.d.ts +4 -0
  215. package/dist/paths.d.ts.map +1 -0
  216. package/dist/paths.js +19 -0
  217. package/dist/paths.js.map +1 -0
  218. package/dist/prompt.d.ts +43 -0
  219. package/dist/prompt.d.ts.map +1 -0
  220. package/dist/prompt.js +379 -0
  221. package/dist/prompt.js.map +1 -0
  222. package/dist/reporter/human.d.ts +28 -0
  223. package/dist/reporter/human.d.ts.map +1 -0
  224. package/dist/reporter/human.js +126 -0
  225. package/dist/reporter/human.js.map +1 -0
  226. package/dist/reporter/index.d.ts +14 -0
  227. package/dist/reporter/index.d.ts.map +1 -0
  228. package/dist/reporter/index.js +37 -0
  229. package/dist/reporter/index.js.map +1 -0
  230. package/dist/reporter/json.d.ts +43 -0
  231. package/dist/reporter/json.d.ts.map +1 -0
  232. package/dist/reporter/json.js +146 -0
  233. package/dist/reporter/json.js.map +1 -0
  234. package/dist/reporter/style.d.ts +34 -0
  235. package/dist/reporter/style.d.ts.map +1 -0
  236. package/dist/reporter/style.js +97 -0
  237. package/dist/reporter/style.js.map +1 -0
  238. package/dist/reporter/types.d.ts +41 -0
  239. package/dist/reporter/types.d.ts.map +1 -0
  240. package/dist/reporter/types.js +2 -0
  241. package/dist/reporter/types.js.map +1 -0
  242. package/dist/result.d.ts +4 -0
  243. package/dist/result.d.ts.map +1 -0
  244. package/dist/result.js +2 -0
  245. package/dist/result.js.map +1 -0
  246. package/dist/services/account-store.d.ts +31 -0
  247. package/dist/services/account-store.d.ts.map +1 -0
  248. package/dist/services/account-store.js +135 -0
  249. package/dist/services/account-store.js.map +1 -0
  250. package/dist/services/app-paths.d.ts +25 -0
  251. package/dist/services/app-paths.d.ts.map +1 -0
  252. package/dist/services/app-paths.js +34 -0
  253. package/dist/services/app-paths.js.map +1 -0
  254. package/dist/services/cloudflare-auth.d.ts +83 -0
  255. package/dist/services/cloudflare-auth.d.ts.map +1 -0
  256. package/dist/services/cloudflare-auth.js +30 -0
  257. package/dist/services/cloudflare-auth.js.map +1 -0
  258. package/dist/services/cloudflare-kv.d.ts +45 -0
  259. package/dist/services/cloudflare-kv.d.ts.map +1 -0
  260. package/dist/services/cloudflare-kv.js +151 -0
  261. package/dist/services/cloudflare-kv.js.map +1 -0
  262. package/dist/services/command-history.d.ts +29 -0
  263. package/dist/services/command-history.d.ts.map +1 -0
  264. package/dist/services/command-history.js +62 -0
  265. package/dist/services/command-history.js.map +1 -0
  266. package/dist/services/control-plane.d.ts +32 -0
  267. package/dist/services/control-plane.d.ts.map +1 -0
  268. package/dist/services/control-plane.js +57 -0
  269. package/dist/services/control-plane.js.map +1 -0
  270. package/dist/services/env-loader.d.ts +18 -0
  271. package/dist/services/env-loader.d.ts.map +1 -0
  272. package/dist/services/env-loader.js +34 -0
  273. package/dist/services/env-loader.js.map +1 -0
  274. package/dist/services/http.d.ts +19 -0
  275. package/dist/services/http.d.ts.map +1 -0
  276. package/dist/services/http.js +9 -0
  277. package/dist/services/http.js.map +1 -0
  278. package/dist/services/live.d.ts +16 -0
  279. package/dist/services/live.d.ts.map +1 -0
  280. package/dist/services/live.js +26 -0
  281. package/dist/services/live.js.map +1 -0
  282. package/dist/services/machine-id.d.ts +18 -0
  283. package/dist/services/machine-id.d.ts.map +1 -0
  284. package/dist/services/machine-id.js +39 -0
  285. package/dist/services/machine-id.js.map +1 -0
  286. package/dist/services/reporter.d.ts +55 -0
  287. package/dist/services/reporter.d.ts.map +1 -0
  288. package/dist/services/reporter.js +49 -0
  289. package/dist/services/reporter.js.map +1 -0
  290. package/dist/state-store.d.ts +39 -0
  291. package/dist/state-store.d.ts.map +1 -0
  292. package/dist/state-store.js +89 -0
  293. package/dist/state-store.js.map +1 -0
  294. package/dist/telemetry.d.ts +13 -0
  295. package/dist/telemetry.d.ts.map +1 -0
  296. package/dist/telemetry.js +129 -0
  297. package/dist/telemetry.js.map +1 -0
  298. package/dist/tenant-state.d.ts +69 -0
  299. package/dist/tenant-state.d.ts.map +1 -0
  300. package/dist/tenant-state.js +161 -0
  301. package/dist/tenant-state.js.map +1 -0
  302. package/package.json +38 -0
@@ -0,0 +1,521 @@
1
+ import { createReporter } from '../reporter/index.js';
2
+ const HUBSPOT_BASE_URL = 'https://api.hubapi.com';
3
+ const DOCS_BASE = 'https://hs-x.dev/errors';
4
+ const METHODS_WITH_BODY = new Set(['POST', 'PUT', 'PATCH', 'DELETE']);
5
+ export async function apiCommand(input) {
6
+ const env = input.env ?? process.env;
7
+ const reporter = createReporter({
8
+ command: 'api',
9
+ argv: input.argv,
10
+ ...(input.stdout === undefined ? {} : { stdout: input.stdout }),
11
+ ...(input.stderr === undefined ? {} : { stderr: input.stderr }),
12
+ ...(input.isTTY === undefined ? {} : { isTTY: input.isTTY }),
13
+ env,
14
+ });
15
+ if (input.argv[1] === 'help' ||
16
+ input.argv.includes('--help') ||
17
+ input.argv.includes('--help-all')) {
18
+ const { emitHelp } = await import('../help.js');
19
+ emitHelp(apiHelpText(), input.argv.includes('--json'), { argv: input.argv });
20
+ return { exitCode: 0 };
21
+ }
22
+ const target = input.argv[1] === 'hubspot' ? 'hubspot' : 'hsx';
23
+ const argvForParse = target === 'hubspot' ? input.argv.slice(2) : input.argv.slice(1);
24
+ const parsed = parseApiArgs(argvForParse);
25
+ if (parsed.kind === 'error') {
26
+ reporter.error(parsed.code, parsed.message, {
27
+ hint: parsed.hint,
28
+ docs_url: docsUrl(parsed.code),
29
+ });
30
+ reporter.done(undefined, parsed.exitCode);
31
+ return { exitCode: parsed.exitCode };
32
+ }
33
+ let effectiveEnv = env;
34
+ if (target === 'hubspot' &&
35
+ input.env === undefined &&
36
+ !parsed.flags.pak &&
37
+ !env.HSX_HUBSPOT_PAK &&
38
+ !parsed.flags.developerApiKey &&
39
+ !env.HSX_HUBSPOT_DEVELOPER_API_KEY) {
40
+ const { discoverHubSpotPak } = await import('../hubspot-auth.js');
41
+ const discovered = await discoverHubSpotPak(input.cwd ?? process.cwd());
42
+ if (discovered) {
43
+ effectiveEnv = { ...env, HSX_HUBSPOT_PAK: discovered.pak };
44
+ reporter.info(`Using HubSpot PAK from ${discovered.source}`);
45
+ reporter.event('api.auth.discovered', { source: discovered.source });
46
+ }
47
+ }
48
+ const targetConfig = resolveTarget(target, parsed, effectiveEnv);
49
+ if (targetConfig.kind === 'error') {
50
+ reporter.error(targetConfig.code, targetConfig.message, {
51
+ hint: targetConfig.hint,
52
+ docs_url: docsUrl(targetConfig.code),
53
+ });
54
+ reporter.done(undefined, 10);
55
+ return { exitCode: 10 };
56
+ }
57
+ const cfg = targetConfig.config;
58
+ const method = parsed.flags.method;
59
+ const path = parsed.path.startsWith('/') ? parsed.path : `/${parsed.path}`;
60
+ const url = new URL(path, cfg.baseUrl);
61
+ for (const [k, v] of cfg.authQuery)
62
+ url.searchParams.append(k, v);
63
+ for (const [k, v] of parsed.query)
64
+ url.searchParams.append(k, v);
65
+ const headers = new Headers();
66
+ for (const [k, v] of Object.entries(cfg.authHeaders))
67
+ headers.set(k, v);
68
+ headers.set('accept', 'application/json');
69
+ for (const [k, v] of parsed.headers)
70
+ headers.set(k, v);
71
+ let body;
72
+ if (METHODS_WITH_BODY.has(method) && Object.keys(parsed.body).length > 0) {
73
+ body = JSON.stringify(parsed.body);
74
+ if (!headers.has('content-type'))
75
+ headers.set('content-type', 'application/json');
76
+ }
77
+ reporter.event('api.request', { target, method, url: redactUrl(url) });
78
+ const now = input.now ?? (() => Date.now());
79
+ const fetchImpl = input.fetchImpl ?? fetch;
80
+ const started = now();
81
+ let response;
82
+ try {
83
+ response = await fetchImpl(url.toString(), {
84
+ method,
85
+ headers,
86
+ ...(body === undefined ? {} : { body }),
87
+ });
88
+ }
89
+ catch (error) {
90
+ const message = error instanceof Error ? error.message : String(error);
91
+ const code = 'HSX_E_API_NETWORK';
92
+ reporter.error(code, `Request failed before reaching ${cfg.name}.`, {
93
+ hint: 'Check connectivity, base URL, and any proxy configuration.',
94
+ cause: message,
95
+ docs_url: docsUrl(code),
96
+ });
97
+ reporter.done(undefined, 40);
98
+ return { exitCode: 40 };
99
+ }
100
+ const elapsed = now() - started;
101
+ const text = await response.text();
102
+ const parsedBody = tryParseJson(text);
103
+ reporter.event('api.response', {
104
+ status: response.status,
105
+ elapsed_ms: elapsed,
106
+ bytes: text.length,
107
+ });
108
+ emitTrace(reporter, method, url, response.status, elapsed);
109
+ if (!response.ok) {
110
+ const code = errorCodeForStatus(response.status);
111
+ const exitCode = exitCodeForStatus(response.status);
112
+ const upstreamMessage = extractUpstreamMessage(parsedBody);
113
+ reporter.error(code, `${cfg.name} returned ${response.status} ${response.statusText}.`, {
114
+ hint: hintForStatus(target, response.status),
115
+ ...(upstreamMessage === undefined ? {} : { cause: upstreamMessage }),
116
+ wire: {
117
+ request: { method, url: redactUrl(url), headers: redactHeaders(headers) },
118
+ response: {
119
+ status: response.status,
120
+ headers: headersToObject(response.headers),
121
+ body: parsedBody ?? text,
122
+ },
123
+ },
124
+ docs_url: docsUrl(code),
125
+ });
126
+ if (parsedBody !== undefined)
127
+ reporter.data(parsedBody);
128
+ else if (text.length > 0)
129
+ reporter.data(text);
130
+ reporter.done(undefined, exitCode);
131
+ return { exitCode };
132
+ }
133
+ if (parsedBody !== undefined)
134
+ reporter.data(parsedBody);
135
+ else if (text.length > 0)
136
+ reporter.data(text);
137
+ reporter.done(`${method} ${url.pathname}`);
138
+ return { exitCode: 0 };
139
+ }
140
+ function resolveTarget(target, parsed, env) {
141
+ if (target === 'hubspot') {
142
+ const pak = parsed.flags.pak ?? env.HSX_HUBSPOT_PAK;
143
+ const devApiKey = parsed.flags.developerApiKey ?? env.HSX_HUBSPOT_DEVELOPER_API_KEY;
144
+ if (!pak && !devApiKey) {
145
+ return {
146
+ kind: 'error',
147
+ code: 'HSX_E_API_NO_HUBSPOT_AUTH',
148
+ message: 'No HubSpot API credential found.',
149
+ hint: 'Pass --pak <token>, set HSX_HUBSPOT_PAK, pass --developer-api-key <key>, or set HSX_HUBSPOT_DEVELOPER_API_KEY.',
150
+ };
151
+ }
152
+ return {
153
+ kind: 'ok',
154
+ config: {
155
+ name: 'HubSpot',
156
+ baseUrl: parsed.flags.baseUrl ?? env.HSX_HUBSPOT_BASE_URL ?? HUBSPOT_BASE_URL,
157
+ authHeaders: pak ? { authorization: `Bearer ${pak}` } : {},
158
+ authQuery: devApiKey ? [['hapikey', devApiKey]] : [],
159
+ errorAuthCode: 'HSX_E_API_NO_HUBSPOT_AUTH',
160
+ errorAuthMessage: 'No HubSpot API credential found.',
161
+ errorAuthHint: 'Pass --pak, set HSX_HUBSPOT_PAK, or provide a developer API key.',
162
+ },
163
+ };
164
+ }
165
+ const controlPlaneUrl = parsed.flags.baseUrl ??
166
+ (env.HSX_CONTROL_PLANE_URL && env.HSX_CONTROL_PLANE_URL.length > 0
167
+ ? env.HSX_CONTROL_PLANE_URL
168
+ : undefined);
169
+ if (!controlPlaneUrl) {
170
+ return {
171
+ kind: 'error',
172
+ code: 'HSX_E_API_NO_CONTROL_PLANE',
173
+ message: 'No HS-X control plane URL configured.',
174
+ hint: 'Pass --base-url <url>, set HSX_CONTROL_PLANE_URL, or use `hs-x api hubspot <path>` to call HubSpot instead.',
175
+ };
176
+ }
177
+ const userId = env.HSX_USER_ID ?? 'local-cli-user';
178
+ const accountId = env.HSX_ACCOUNT_ID;
179
+ return {
180
+ kind: 'ok',
181
+ config: {
182
+ name: 'HS-X',
183
+ baseUrl: controlPlaneUrl,
184
+ authHeaders: {
185
+ 'x-hsx-user-id': userId,
186
+ ...(accountId ? { 'x-hsx-account-id': accountId } : {}),
187
+ },
188
+ authQuery: [],
189
+ errorAuthCode: 'HSX_E_API_NO_CONTROL_PLANE',
190
+ errorAuthMessage: 'No HS-X control plane URL configured.',
191
+ errorAuthHint: 'Set HSX_CONTROL_PLANE_URL or pass --base-url.',
192
+ },
193
+ };
194
+ }
195
+ export function parseApiArgs(args) {
196
+ let method = 'GET';
197
+ let pak;
198
+ let baseUrl;
199
+ let developerApiKey;
200
+ const body = {};
201
+ const headers = [];
202
+ const query = [];
203
+ const positional = [];
204
+ for (let i = 0; i < args.length; i++) {
205
+ const arg = args[i] ?? '';
206
+ const equals = arg.match(/^(--[^=]+)=(.*)$/);
207
+ if (equals) {
208
+ const flag = equals[1] ?? '';
209
+ const value = equals[2] ?? '';
210
+ if (flag === '--method') {
211
+ if (!value)
212
+ return missingValue('--method');
213
+ method = value.toUpperCase();
214
+ continue;
215
+ }
216
+ if (flag === '--pak') {
217
+ if (!value)
218
+ return missingValue('--pak');
219
+ pak = value;
220
+ continue;
221
+ }
222
+ if (flag === '--base-url') {
223
+ if (!value)
224
+ return missingValue('--base-url');
225
+ baseUrl = value;
226
+ continue;
227
+ }
228
+ if (flag === '--developer-api-key') {
229
+ if (!value)
230
+ return missingValue('--developer-api-key');
231
+ developerApiKey = value;
232
+ continue;
233
+ }
234
+ }
235
+ if (arg === '-X' || arg === '--method') {
236
+ const next = args[i + 1];
237
+ if (!next)
238
+ return missingValue('-X');
239
+ method = next.toUpperCase();
240
+ i++;
241
+ continue;
242
+ }
243
+ if (arg === '--pak') {
244
+ const next = args[i + 1];
245
+ if (!next)
246
+ return missingValue('--pak');
247
+ pak = next;
248
+ i++;
249
+ continue;
250
+ }
251
+ if (arg === '--base-url') {
252
+ const next = args[i + 1];
253
+ if (!next)
254
+ return missingValue('--base-url');
255
+ baseUrl = next;
256
+ i++;
257
+ continue;
258
+ }
259
+ if (arg === '--developer-api-key') {
260
+ const next = args[i + 1];
261
+ if (!next)
262
+ return missingValue('--developer-api-key');
263
+ developerApiKey = next;
264
+ i++;
265
+ continue;
266
+ }
267
+ if (arg === '--json' ||
268
+ arg === '--json-stream' ||
269
+ arg === '--verbose' ||
270
+ arg === '-v' ||
271
+ arg === '--quiet' ||
272
+ arg === '-q' ||
273
+ arg === '--no-telemetry' ||
274
+ arg === '--debug') {
275
+ continue;
276
+ }
277
+ if (arg.startsWith('-')) {
278
+ return {
279
+ kind: 'error',
280
+ code: 'HSX_E_INPUT_UNKNOWN_FLAG',
281
+ message: `Unknown flag: ${arg}`,
282
+ hint: 'Run `hs-x api --help` for supported flags.',
283
+ exitCode: 10,
284
+ };
285
+ }
286
+ positional.push(arg);
287
+ }
288
+ if (positional.length === 0) {
289
+ return {
290
+ kind: 'error',
291
+ code: 'HSX_E_INPUT_MISSING_PATH',
292
+ message: 'Missing API path.',
293
+ hint: 'Usage: hs-x api <path> [field=value ...] [-X METHOD]',
294
+ exitCode: 10,
295
+ };
296
+ }
297
+ const [path, ...fields] = positional;
298
+ for (const f of fields) {
299
+ const parsed = parseField(f);
300
+ if (parsed.kind === 'error')
301
+ return parsed;
302
+ switch (parsed.target) {
303
+ case 'header':
304
+ headers.push([parsed.key, String(parsed.value)]);
305
+ break;
306
+ case 'query':
307
+ query.push([parsed.key, String(parsed.value)]);
308
+ break;
309
+ case 'body':
310
+ body[parsed.key] = parsed.value;
311
+ break;
312
+ }
313
+ }
314
+ return {
315
+ kind: 'ok',
316
+ path: path ?? '',
317
+ flags: {
318
+ method,
319
+ ...(pak === undefined ? {} : { pak }),
320
+ ...(baseUrl === undefined ? {} : { baseUrl }),
321
+ ...(developerApiKey === undefined ? {} : { developerApiKey }),
322
+ },
323
+ body,
324
+ headers,
325
+ query,
326
+ };
327
+ }
328
+ function parseField(raw) {
329
+ const queryMatch = raw.match(/^([^=:@]+)==(.*)$/);
330
+ if (queryMatch)
331
+ return { kind: 'ok', target: 'query', key: queryMatch[1] ?? '', value: queryMatch[2] ?? '' };
332
+ const typedMatch = raw.match(/^([^=:@]+):=(.*)$/);
333
+ if (typedMatch) {
334
+ const key = typedMatch[1] ?? '';
335
+ const rawValue = typedMatch[2] ?? '';
336
+ try {
337
+ return { kind: 'ok', target: 'body', key, value: JSON.parse(rawValue) };
338
+ }
339
+ catch {
340
+ return {
341
+ kind: 'error',
342
+ code: 'HSX_E_INPUT_BAD_JSON',
343
+ message: `Field "${key}:=${rawValue}" is not valid JSON.`,
344
+ hint: 'Use field=value for strings, field:=value for typed JSON (booleans, numbers, objects).',
345
+ exitCode: 10,
346
+ };
347
+ }
348
+ }
349
+ const headerMatch = raw.match(/^([^=:@]+):(.+)$/);
350
+ if (headerMatch)
351
+ return { kind: 'ok', target: 'header', key: headerMatch[1] ?? '', value: headerMatch[2] ?? '' };
352
+ const stringMatch = raw.match(/^([^=:@]+)=(.*)$/);
353
+ if (stringMatch)
354
+ return { kind: 'ok', target: 'body', key: stringMatch[1] ?? '', value: stringMatch[2] ?? '' };
355
+ return {
356
+ kind: 'error',
357
+ code: 'HSX_E_INPUT_BAD_FIELD',
358
+ message: `Cannot parse field "${raw}".`,
359
+ hint: 'Use key=value (string), key:=value (typed), key==value (query), or Header:Value.',
360
+ exitCode: 10,
361
+ };
362
+ }
363
+ function missingValue(flag) {
364
+ return {
365
+ kind: 'error',
366
+ code: 'HSX_E_INPUT_MISSING_VALUE',
367
+ message: `Flag ${flag} requires a value.`,
368
+ hint: `Pass a value: ${flag} <value>`,
369
+ exitCode: 10,
370
+ };
371
+ }
372
+ function tryParseJson(text) {
373
+ if (text.length === 0)
374
+ return undefined;
375
+ try {
376
+ return JSON.parse(text);
377
+ }
378
+ catch {
379
+ return undefined;
380
+ }
381
+ }
382
+ function emitTrace(reporter, method, url, status, ms) {
383
+ const symbol = status >= 200 && status < 400 ? '▸' : '✗';
384
+ const redacted = new URL(redactUrl(url));
385
+ reporter.info(`${symbol} ${method} ${redacted.pathname}${redacted.search} ${status} ${ms}ms`);
386
+ }
387
+ function errorCodeForStatus(status) {
388
+ if (status === 401 || status === 403)
389
+ return 'HSX_E_API_UNAUTHORIZED';
390
+ if (status === 404)
391
+ return 'HSX_E_API_NOT_FOUND';
392
+ if (status === 409)
393
+ return 'HSX_E_API_CONFLICT';
394
+ if (status === 429)
395
+ return 'HSX_E_API_RATE_LIMITED';
396
+ if (status >= 400 && status < 500)
397
+ return 'HSX_E_API_BAD_REQUEST';
398
+ if (status >= 500)
399
+ return 'HSX_E_API_SERVER';
400
+ return 'HSX_E_API_UNEXPECTED';
401
+ }
402
+ function exitCodeForStatus(status) {
403
+ if (status === 401 || status === 403)
404
+ return 10;
405
+ if (status >= 400 && status < 500)
406
+ return 50;
407
+ if (status >= 500)
408
+ return 51;
409
+ return 50;
410
+ }
411
+ function hintForStatus(target, status) {
412
+ if (target === 'hubspot') {
413
+ if (status === 401)
414
+ return 'Your HubSpot developer credential is invalid or expired. Check --pak / HSX_HUBSPOT_PAK or --developer-api-key / HSX_HUBSPOT_DEVELOPER_API_KEY.';
415
+ if (status === 403)
416
+ return 'HubSpot developer-account credentials cannot access per-portal CRM data (contacts/companies/deals). Reach those via the HS-X control plane after connecting the install account.';
417
+ if (status === 404)
418
+ return 'No such endpoint, or this endpoint is not reachable with the provided HubSpot developer credential.';
419
+ if (status === 409)
420
+ return 'A conflicting resource state exists. Refetch and retry, or pass a force flag if the endpoint supports one.';
421
+ if (status === 429)
422
+ return 'Rate limited. Back off and retry; consider increasing app rate limits.';
423
+ if (status >= 500)
424
+ return 'HubSpot returned a server error. Retry with --debug to inspect the response.';
425
+ return "Inspect the response body for HubSpot's error detail. Re-run with --debug to see the full request.";
426
+ }
427
+ if (status === 401)
428
+ return 'HSX_USER_ID is missing or unrecognized. Set it and retry.';
429
+ if (status === 403)
430
+ return 'Your user does not have access to this account. Check HSX_ACCOUNT_ID.';
431
+ if (status === 404)
432
+ return 'No such control-plane resource. Confirm IDs and base URL.';
433
+ if (status === 409)
434
+ return 'Concurrent modification or precondition failed. Refetch and retry.';
435
+ if (status >= 500)
436
+ return 'HS-X control plane returned a server error. Retry with --debug to inspect.';
437
+ return 'Inspect the response body. Re-run with --debug to see the full request.';
438
+ }
439
+ function extractUpstreamMessage(body) {
440
+ if (body === null || typeof body !== 'object')
441
+ return undefined;
442
+ const obj = body;
443
+ if (typeof obj.message === 'string')
444
+ return obj.message;
445
+ if (typeof obj.error === 'string')
446
+ return obj.error;
447
+ return undefined;
448
+ }
449
+ function redactHeaders(headers) {
450
+ const out = {};
451
+ headers.forEach((value, key) => {
452
+ out[key] = key.toLowerCase() === 'authorization' ? 'Bearer <redacted>' : value;
453
+ });
454
+ return out;
455
+ }
456
+ function redactUrl(url) {
457
+ const redacted = new URL(url.toString());
458
+ if (redacted.searchParams.has('hapikey')) {
459
+ redacted.searchParams.set('hapikey', '<redacted>');
460
+ }
461
+ return redacted.toString();
462
+ }
463
+ function headersToObject(headers) {
464
+ const out = {};
465
+ headers.forEach((value, key) => {
466
+ out[key] = value;
467
+ });
468
+ return out;
469
+ }
470
+ function docsUrl(code) {
471
+ return `${DOCS_BASE}/${code}`;
472
+ }
473
+ export function apiHelpText() {
474
+ return `Usage:
475
+ hs-x api <path> [field ...] [-X METHOD] [flags] HS-X control plane
476
+ hs-x api hubspot <path> [field ...] [-X METHOD] [flags] HubSpot developer-account API
477
+
478
+ The hubspot target accepts either a developer personal access key (PAK, sent
479
+ as a bearer token) or a developer API key (sent as the hapikey query param).
480
+ PAKs cover developer-account operations: apps, projects, builds, deploys, and
481
+ migrations. The developer API key is for endpoints that explicitly document
482
+ hapikey access. Per-portal CRM data (contacts, companies, deals, etc.) is not
483
+ reachable with either — connect the install account first and call it through
484
+ the HS-X control plane.
485
+
486
+ Arguments:
487
+ path Endpoint path, e.g. v1/deploys (HS-X) or
488
+ crm-dev-applications/v3/apps (HubSpot developer)
489
+ field=value JSON body field (string)
490
+ field:=value JSON body field (typed: numbers, booleans, objects)
491
+ field==value Query-string parameter
492
+ Header:Value Request header
493
+
494
+ Flags:
495
+ -X, --method <verb> HTTP method (default: GET)
496
+ --pak <token> HubSpot developer PAK (HubSpot target only)
497
+ --json JSON envelope on stdout, nothing on stderr
498
+ --verbose Include inferred error cause
499
+
500
+ Advanced:
501
+ --developer-api-key <key> HubSpot developer API key (hapikey endpoints)
502
+ --base-url <url> Override API base URL
503
+ --json-stream NDJSON event stream on stdout
504
+ --debug Include wire-level request/response on errors
505
+
506
+ Environment:
507
+ HSX_CONTROL_PLANE_URL HS-X control plane base URL
508
+ HSX_USER_ID User identity sent as x-hsx-user-id
509
+ HSX_ACCOUNT_ID Account identity sent as x-hsx-account-id
510
+ HSX_HUBSPOT_PAK HubSpot developer personal access key
511
+ HSX_HUBSPOT_DEVELOPER_API_KEY HubSpot developer API key
512
+
513
+ Examples:
514
+ hs-x api v1/accounts/me
515
+ hs-x api v1/deploys --json
516
+ hs-x api hubspot crm-dev-applications/v3/apps
517
+ hs-x api hubspot feature-flags/v3/<appId>/flags
518
+ hs-x api hubspot crm-dev-platform/v3/projects/<projectId>/builds
519
+ `;
520
+ }
521
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/commands/api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CliResult } from '../result.js';
2
+ export declare function completionCommand({ argv, json, }: {
3
+ readonly argv: readonly string[];
4
+ readonly json: boolean;
5
+ }): CliResult;
6
+ export declare function completionHelpText(): string;
7
+ //# sourceMappingURL=completion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"completion.d.ts","sourceRoot":"","sources":["../../src/commands/completion.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,IAAI,GACL,EAAE;IACD,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;CACxB,GAAG,SAAS,CA4BZ;AAoFD,wBAAgB,kBAAkB,IAAI,MAAM,CAU3C"}
@@ -0,0 +1,121 @@
1
+ import { emitHelp } from '../help.js';
2
+ import { createReporter } from '../reporter/index.js';
3
+ export function completionCommand({ argv, json, }) {
4
+ const shell = argv[1];
5
+ if (shell === 'help' || shell === '--help' || shell === '-h' || argv.includes('--help')) {
6
+ emitHelp(completionHelpText(), json);
7
+ return { exitCode: 0 };
8
+ }
9
+ if (shell !== 'bash' && shell !== 'zsh' && shell !== 'fish') {
10
+ const code = 'HSX_E_INPUT_BAD_FIELD';
11
+ const message = 'Missing or unsupported shell.';
12
+ const hint = 'Usage: hs-x completion <bash|zsh|fish>';
13
+ if (json) {
14
+ process.stdout.write(`${JSON.stringify({
15
+ schema_version: 1,
16
+ command: 'completion',
17
+ ok: false,
18
+ error: { code, message, hint },
19
+ })}\n`);
20
+ }
21
+ else {
22
+ const reporter = createReporter({ command: 'completion', argv });
23
+ reporter.error(code, message, { hint, docs_url: `https://hs-x.dev/errors/${code}` });
24
+ reporter.done(undefined, 10);
25
+ }
26
+ return { exitCode: 10 };
27
+ }
28
+ process.stdout.write(renderCompletion(shell));
29
+ return { exitCode: 0 };
30
+ }
31
+ const COMPLETION_COMMANDS = [
32
+ 'init',
33
+ 'connect',
34
+ 'secrets',
35
+ 'secret',
36
+ 'dev',
37
+ 'deploy',
38
+ 'status',
39
+ 'logs',
40
+ 'drift',
41
+ 'routes',
42
+ 'promote',
43
+ 'rollback',
44
+ 'accounts',
45
+ 'whoami',
46
+ 'logout',
47
+ 'check',
48
+ 'doctor',
49
+ 'migrate',
50
+ 'api',
51
+ 'audit',
52
+ 'history',
53
+ 'completion',
54
+ 'update',
55
+ 'help',
56
+ ];
57
+ const COMPLETION_FLAGS = [
58
+ '--help',
59
+ '--help-all',
60
+ '--json',
61
+ '--json-stream',
62
+ '--quiet',
63
+ '--verbose',
64
+ '--debug',
65
+ '--cwd',
66
+ '--no-telemetry',
67
+ '--no-update-check',
68
+ '--project',
69
+ '--account-id',
70
+ '--project-id',
71
+ '--env',
72
+ '--yes',
73
+ '--force',
74
+ ];
75
+ function renderCompletion(shell) {
76
+ const commands = COMPLETION_COMMANDS.join(' ');
77
+ const flags = COMPLETION_FLAGS.join(' ');
78
+ switch (shell) {
79
+ case 'bash':
80
+ return `_hs_x_completion() {
81
+ local cur="\${COMP_WORDS[COMP_CWORD]}"
82
+ if [[ "\${cur}" == -* ]]; then
83
+ COMPREPLY=( $(compgen -W "${flags}" -- "\${cur}") )
84
+ else
85
+ COMPREPLY=( $(compgen -W "${commands}" -- "\${cur}") )
86
+ fi
87
+ }
88
+ complete -F _hs_x_completion hs-x
89
+ `;
90
+ case 'zsh':
91
+ return `#compdef hs-x
92
+ _hs_x() {
93
+ local -a commands flags
94
+ commands=(${commands})
95
+ flags=(${flags})
96
+ if [[ "$words[CURRENT]" == -* ]]; then
97
+ _describe 'flags' flags
98
+ else
99
+ _describe 'commands' commands
100
+ fi
101
+ }
102
+ compdef _hs_x hs-x
103
+ `;
104
+ case 'fish':
105
+ return `${COMPLETION_COMMANDS.map((command) => `complete -c hs-x -f -n "__fish_use_subcommand" -a ${command}`).join('\n')}
106
+ ${COMPLETION_FLAGS.map((flag) => `complete -c hs-x -f -l ${flag.slice(2)}`).join('\n')}
107
+ `;
108
+ }
109
+ }
110
+ export function completionHelpText() {
111
+ return `hs-x completion <shell>
112
+
113
+ Generate shell completion.
114
+
115
+ Shells:
116
+ bash
117
+ zsh
118
+ fish
119
+ `;
120
+ }
121
+ //# sourceMappingURL=completion.js.map