@hs-x/cli 0.1.1 → 0.1.2

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 (141) hide show
  1. package/README.md +59 -33
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +152 -334
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/kit.d.ts +36 -0
  6. package/dist/cli/kit.d.ts.map +1 -0
  7. package/dist/cli/kit.js +64 -0
  8. package/dist/cli/kit.js.map +1 -0
  9. package/dist/cli-error.d.ts +19 -1
  10. package/dist/cli-error.d.ts.map +1 -1
  11. package/dist/cli-error.js +19 -4
  12. package/dist/cli-error.js.map +1 -1
  13. package/dist/commands/account.d.ts +55 -6
  14. package/dist/commands/account.d.ts.map +1 -1
  15. package/dist/commands/account.js +254 -252
  16. package/dist/commands/account.js.map +1 -1
  17. package/dist/commands/api.d.ts +16 -0
  18. package/dist/commands/api.d.ts.map +1 -1
  19. package/dist/commands/api.js +173 -0
  20. package/dist/commands/api.js.map +1 -1
  21. package/dist/commands/completion.d.ts +6 -0
  22. package/dist/commands/completion.d.ts.map +1 -1
  23. package/dist/commands/completion.js +34 -0
  24. package/dist/commands/completion.js.map +1 -1
  25. package/dist/commands/connect.d.ts +32 -0
  26. package/dist/commands/connect.d.ts.map +1 -1
  27. package/dist/commands/connect.js +126 -1
  28. package/dist/commands/connect.js.map +1 -1
  29. package/dist/commands/control-plane-read.d.ts +60 -17
  30. package/dist/commands/control-plane-read.d.ts.map +1 -1
  31. package/dist/commands/control-plane-read.js +269 -231
  32. package/dist/commands/control-plane-read.js.map +1 -1
  33. package/dist/commands/deploy-promote.d.ts +14 -0
  34. package/dist/commands/deploy-promote.d.ts.map +1 -1
  35. package/dist/commands/deploy-promote.js +128 -0
  36. package/dist/commands/deploy-promote.js.map +1 -1
  37. package/dist/commands/deploy.d.ts +57 -0
  38. package/dist/commands/deploy.d.ts.map +1 -1
  39. package/dist/commands/deploy.js +154 -1
  40. package/dist/commands/deploy.js.map +1 -1
  41. package/dist/commands/dev.d.ts +25 -0
  42. package/dist/commands/dev.d.ts.map +1 -1
  43. package/dist/commands/dev.js +108 -0
  44. package/dist/commands/dev.js.map +1 -1
  45. package/dist/commands/doctor.d.ts +7 -7
  46. package/dist/commands/doctor.d.ts.map +1 -1
  47. package/dist/commands/doctor.js +144 -143
  48. package/dist/commands/doctor.js.map +1 -1
  49. package/dist/commands/flags.d.ts +35 -0
  50. package/dist/commands/flags.d.ts.map +1 -1
  51. package/dist/commands/flags.js +229 -0
  52. package/dist/commands/flags.js.map +1 -1
  53. package/dist/commands/history.d.ts +8 -5
  54. package/dist/commands/history.d.ts.map +1 -1
  55. package/dist/commands/history.js +46 -40
  56. package/dist/commands/history.js.map +1 -1
  57. package/dist/commands/init.d.ts +30 -0
  58. package/dist/commands/init.d.ts.map +1 -1
  59. package/dist/commands/init.js +89 -0
  60. package/dist/commands/init.js.map +1 -1
  61. package/dist/commands/link.d.ts +15 -0
  62. package/dist/commands/link.d.ts.map +1 -1
  63. package/dist/commands/link.js +284 -0
  64. package/dist/commands/link.js.map +1 -1
  65. package/dist/commands/login.d.ts +17 -1
  66. package/dist/commands/login.d.ts.map +1 -1
  67. package/dist/commands/login.js +79 -21
  68. package/dist/commands/login.js.map +1 -1
  69. package/dist/commands/migrate.d.ts +32 -0
  70. package/dist/commands/migrate.d.ts.map +1 -1
  71. package/dist/commands/migrate.js +255 -0
  72. package/dist/commands/migrate.js.map +1 -1
  73. package/dist/commands/rollback.d.ts +22 -0
  74. package/dist/commands/rollback.d.ts.map +1 -1
  75. package/dist/commands/rollback.js +271 -0
  76. package/dist/commands/rollback.js.map +1 -1
  77. package/dist/commands/secrets.d.ts +35 -5
  78. package/dist/commands/secrets.d.ts.map +1 -1
  79. package/dist/commands/secrets.js +94 -196
  80. package/dist/commands/secrets.js.map +1 -1
  81. package/dist/commands/status.d.ts +8 -5
  82. package/dist/commands/status.d.ts.map +1 -1
  83. package/dist/commands/status.js +162 -121
  84. package/dist/commands/status.js.map +1 -1
  85. package/dist/commands/unlink.d.ts +11 -0
  86. package/dist/commands/unlink.d.ts.map +1 -1
  87. package/dist/commands/unlink.js +75 -0
  88. package/dist/commands/unlink.js.map +1 -1
  89. package/dist/commands/update.d.ts +8 -4
  90. package/dist/commands/update.d.ts.map +1 -1
  91. package/dist/commands/update.js +83 -35
  92. package/dist/commands/update.js.map +1 -1
  93. package/dist/commands/validate.d.ts +12 -6
  94. package/dist/commands/validate.d.ts.map +1 -1
  95. package/dist/commands/validate.js +50 -23
  96. package/dist/commands/validate.js.map +1 -1
  97. package/dist/config.d.ts +8 -0
  98. package/dist/config.d.ts.map +1 -1
  99. package/dist/config.js +1 -1
  100. package/dist/config.js.map +1 -1
  101. package/dist/constants.d.ts +1 -1
  102. package/dist/constants.js +1 -1
  103. package/dist/init/templates.js +1 -1
  104. package/dist/init/templates.js.map +1 -1
  105. package/dist/services/cloudflare-kv.d.ts +2 -2
  106. package/dist/services/cloudflare-kv.d.ts.map +1 -1
  107. package/dist/services/cloudflare-kv.js +10 -6
  108. package/dist/services/cloudflare-kv.js.map +1 -1
  109. package/dist/services/command-history.d.ts +2 -0
  110. package/dist/services/command-history.d.ts.map +1 -1
  111. package/dist/services/command-history.js +1 -1
  112. package/dist/services/command-history.js.map +1 -1
  113. package/dist/services/config.d.ts +24 -0
  114. package/dist/services/config.d.ts.map +1 -0
  115. package/dist/services/config.js +41 -0
  116. package/dist/services/config.js.map +1 -0
  117. package/dist/services/cwd.d.ts +12 -0
  118. package/dist/services/cwd.d.ts.map +1 -0
  119. package/dist/services/cwd.js +10 -0
  120. package/dist/services/cwd.js.map +1 -0
  121. package/dist/services/hubspot-dev-client.d.ts +38 -0
  122. package/dist/services/hubspot-dev-client.d.ts.map +1 -0
  123. package/dist/services/hubspot-dev-client.js +256 -0
  124. package/dist/services/hubspot-dev-client.js.map +1 -0
  125. package/dist/services/live.d.ts +7 -1
  126. package/dist/services/live.d.ts.map +1 -1
  127. package/dist/services/live.js +20 -8
  128. package/dist/services/live.js.map +1 -1
  129. package/dist/services/reporter.d.ts +14 -0
  130. package/dist/services/reporter.d.ts.map +1 -1
  131. package/dist/services/reporter.js +20 -0
  132. package/dist/services/reporter.js.map +1 -1
  133. package/dist/services/telemetry.d.ts +43 -0
  134. package/dist/services/telemetry.d.ts.map +1 -0
  135. package/dist/services/telemetry.js +93 -0
  136. package/dist/services/telemetry.js.map +1 -0
  137. package/dist/services/tenant-state.d.ts +85 -0
  138. package/dist/services/tenant-state.d.ts.map +1 -0
  139. package/dist/services/tenant-state.js +98 -0
  140. package/dist/services/tenant-state.js.map +1 -0
  141. package/package.json +3 -2
@@ -1,72 +1,157 @@
1
+ import * as Command from '@effect/cli/Command';
2
+ import { HttpClientRequest } from '@hs-x/types';
3
+ import { Config, Effect } from 'effect';
1
4
  import { defaultStorePath, isActiveUserSession, loadStore } from '../account-store.js';
5
+ import { jsonOption, runHandler } from '../cli/kit.js';
2
6
  import { formatRelative, readHistory } from '../history.js';
3
7
  import { discoverHubSpotAccounts, discoverHubSpotPak } from '../hubspot-auth.js';
4
8
  import { getMachineId } from '../machine-id.js';
5
- import { createReporter } from '../reporter/index.js';
6
- export async function doctorCommand(input) {
7
- const json = input.argv.includes('--json');
8
- const cwd = input.cwd ?? process.cwd();
9
- const fetchImpl = input.fetchImpl ?? fetch;
10
- const reporter = createReporter({ command: 'doctor', argv: input.argv });
11
- if (!json)
12
- reporter.header();
13
- const checks = [];
14
- // 1. HS-X account store
15
- const storeCheck = await checkAccountStore();
16
- checks.push(storeCheck);
17
- if (!json)
18
- renderStep(reporter, storeCheck);
19
- // 2. Link state and machine identity
20
- const linkCheck = await checkLinkState();
21
- checks.push(linkCheck);
22
- if (!json)
23
- renderStep(reporter, linkCheck);
24
- const machineCheck = await checkMachineId();
25
- checks.push(machineCheck);
26
- if (!json)
27
- renderStep(reporter, machineCheck);
28
- // 3. HubSpot CLI config (where we discover PAKs)
29
- const hsCheck = await checkHubSpotCli(cwd);
30
- checks.push(hsCheck);
31
- if (!json)
32
- renderStep(reporter, hsCheck);
33
- // 4. HubSpot PAK validity
34
- const pakCheck = await checkHubSpotPak(cwd, fetchImpl);
35
- checks.push(pakCheck);
36
- if (!json)
37
- renderStep(reporter, pakCheck);
38
- // 5. HS-X control plane reachability
39
- const cpCheck = await checkControlPlane(fetchImpl);
40
- checks.push(cpCheck);
41
- if (!json)
42
- renderStep(reporter, cpCheck);
43
- // 6. Recent activity from history log
44
- const activityCheck = await checkRecentActivity();
45
- checks.push(activityCheck);
46
- if (!json)
47
- renderStep(reporter, activityCheck);
48
- const pass = checks.filter((c) => c.status === 'ok').length;
49
- const warn = checks.filter((c) => c.status === 'warn').length;
50
- const fail = checks.filter((c) => c.status === 'fail').length;
51
- const exitCode = fail > 0 ? 1 : 0;
52
- if (json) {
53
- process.stdout.write(`${JSON.stringify({
54
- schema_version: 1,
55
- command: 'doctor',
56
- ok: exitCode === 0,
57
- data: { checks, summary: { pass, warn, fail } },
58
- })}\n`);
59
- }
60
- else {
9
+ import { Cwd } from '../services/cwd.js';
10
+ import { CliHttp } from '../services/http.js';
11
+ import { Reporter } from '../services/reporter.js';
12
+ // ─── Native @effect/cli command (Phase 4) ───────────────────────────────────
13
+ // Diagnostic checks rebuilt as an Effect handler over services: `Cwd` (project
14
+ // root), `CliHttp` (PAK + control-plane probes no raw fetch), `Reporter`
15
+ // (steps + JSON envelope), `Config` (env reads). The check ordering, pass/warn/
16
+ // fail detail strings, JSON shape, and exit-code semantics are preserved exactly
17
+ // against the legacy body so the subprocess tests keep matching.
18
+ //
19
+ // JSON shape note: the `JsonReporter` envelope is
20
+ // { schema_version, command, ok, data, warnings? }
21
+ // and `reporter.data({ checks, summary })` + `reporter.done(summary, exitCode)`
22
+ // reproduces the legacy `{schema_version:1, command:'doctor', ok, data:{checks,
23
+ // summary:{pass,warn,fail}}}` verbatim (`ok` is `exitCode === 0`). No mismatch.
24
+ export const doctorCmd = Command.make('doctor', { json: jsonOption }, (opts) => runHandler('doctor', { json: opts.json }, doctorBody(opts)));
25
+ function doctorBody(opts) {
26
+ return Effect.gen(function* () {
27
+ const reporter = yield* Reporter;
28
+ const cwd = yield* Cwd;
29
+ if (!opts.json)
30
+ yield* reporter.header();
31
+ const checks = [];
32
+ const run = (effect) => Effect.gen(function* () {
33
+ const check = yield* effect;
34
+ checks.push(check);
35
+ if (!opts.json)
36
+ yield* renderStepEffect(reporter, check);
37
+ });
38
+ // 1. HS-X account store
39
+ yield* run(checkAccountStoreEffect);
40
+ // 2. Link state and machine identity
41
+ yield* run(checkLinkStateEffect);
42
+ yield* run(checkMachineIdEffect);
43
+ // 3. HubSpot CLI config (where we discover PAKs)
44
+ yield* run(checkHubSpotCliEffect(cwd));
45
+ // 4. HubSpot PAK validity
46
+ yield* run(checkHubSpotPakEffect(cwd));
47
+ // 5. HS-X control plane reachability
48
+ yield* run(checkControlPlaneEffect);
49
+ // 6. Recent activity from history log
50
+ yield* run(checkRecentActivityEffect);
51
+ const pass = checks.filter((c) => c.status === 'ok').length;
52
+ const warn = checks.filter((c) => c.status === 'warn').length;
53
+ const fail = checks.filter((c) => c.status === 'fail').length;
54
+ const exitCode = fail > 0 ? 1 : 0;
55
+ if (opts.json) {
56
+ yield* reporter.data({ checks, summary: { pass, warn, fail } });
57
+ yield* reporter.done(undefined, exitCode);
58
+ return;
59
+ }
61
60
  const summary = fail > 0
62
61
  ? `${fail} issue${fail === 1 ? '' : 's'}`
63
62
  : warn > 0
64
63
  ? `${pass} ok, ${warn} warning${warn === 1 ? '' : 's'}`
65
64
  : `${pass} ok`;
66
- reporter.done(summary, exitCode);
67
- }
68
- return { exitCode };
65
+ yield* reporter.done(summary, exitCode);
66
+ });
67
+ }
68
+ function renderStepEffect(reporter, check) {
69
+ return Effect.gen(function* () {
70
+ const step = yield* reporter.step(check.name);
71
+ if (check.status === 'ok')
72
+ yield* step.ok(check.detail);
73
+ else if (check.status === 'warn')
74
+ yield* step.warn(check.detail);
75
+ else if (check.status === 'fail')
76
+ yield* step.fail(check.detail);
77
+ else
78
+ yield* step.warn('skipped');
79
+ });
80
+ }
81
+ const checkLinkStateEffect = Effect.promise(() => checkLinkState());
82
+ const checkMachineIdEffect = Effect.promise(() => checkMachineId());
83
+ const checkAccountStoreEffect = Effect.promise(() => checkAccountStore());
84
+ const checkRecentActivityEffect = Effect.promise(() => checkRecentActivity());
85
+ function checkHubSpotCliEffect(cwd) {
86
+ return Effect.promise(() => checkHubSpotCli(cwd));
87
+ }
88
+ function checkHubSpotPakEffect(cwd) {
89
+ return Effect.gen(function* () {
90
+ const http = yield* CliHttp;
91
+ const fromEnv = yield* Config.string('HSX_HUBSPOT_PAK')
92
+ .pipe(Config.withDefault(''))
93
+ .pipe(Effect.orDie);
94
+ const pak = fromEnv.length > 0 ? fromEnv : (yield* Effect.promise(() => discoverHubSpotPak(cwd)))?.pak;
95
+ if (!pak) {
96
+ return {
97
+ name: 'HubSpot PAK',
98
+ status: 'warn',
99
+ detail: 'no PAK in env or HubSpot CLI config',
100
+ };
101
+ }
102
+ const request = HttpClientRequest.get('https://api.hubapi.com/integrators/v1/timeline/event-types').pipe(HttpClientRequest.setHeaders({
103
+ authorization: `Bearer ${pak}`,
104
+ accept: 'application/json',
105
+ }));
106
+ const result = yield* http
107
+ .execute(request, { abortSignal: AbortSignal.timeout(4000) })
108
+ .pipe(Effect.either);
109
+ if (result._tag === 'Left') {
110
+ return { name: 'HubSpot PAK', status: 'warn', detail: result.left.message };
111
+ }
112
+ const response = result.right;
113
+ if (response.status === 401 || response.status === 403) {
114
+ return {
115
+ name: 'HubSpot PAK',
116
+ status: 'fail',
117
+ detail: `auth check returned ${response.status}`,
118
+ };
119
+ }
120
+ if (response.status >= 500) {
121
+ return { name: 'HubSpot PAK', status: 'warn', detail: `HubSpot ${response.status}` };
122
+ }
123
+ return { name: 'HubSpot PAK', status: 'ok', detail: 'authenticated' };
124
+ });
69
125
  }
126
+ const checkControlPlaneEffect = Effect.gen(function* () {
127
+ const http = yield* CliHttp;
128
+ const url = yield* Config.string('HSX_CONTROL_PLANE_URL')
129
+ .pipe(Config.withDefault(''))
130
+ .pipe(Effect.orDie);
131
+ if (url.length === 0) {
132
+ return {
133
+ name: 'HS-X control plane',
134
+ status: 'warn',
135
+ detail: 'HSX_CONTROL_PLANE_URL not set',
136
+ };
137
+ }
138
+ const request = HttpClientRequest.get(new URL('/_hsx/health', url));
139
+ const result = yield* http
140
+ .execute(request, { abortSignal: AbortSignal.timeout(3000) })
141
+ .pipe(Effect.either);
142
+ if (result._tag === 'Left') {
143
+ return { name: 'HS-X control plane', status: 'fail', detail: result.left.message };
144
+ }
145
+ const response = result.right;
146
+ if (response.ok) {
147
+ return { name: 'HS-X control plane', status: 'ok', detail: url };
148
+ }
149
+ return {
150
+ name: 'HS-X control plane',
151
+ status: 'fail',
152
+ detail: `${url} returned ${response.status}`,
153
+ };
154
+ });
70
155
  async function checkLinkState() {
71
156
  try {
72
157
  const store = await loadStore();
@@ -105,17 +190,6 @@ async function checkMachineId() {
105
190
  };
106
191
  }
107
192
  }
108
- function renderStep(reporter, check) {
109
- const step = reporter.step(check.name);
110
- if (check.status === 'ok')
111
- step.ok(check.detail);
112
- else if (check.status === 'warn')
113
- step.warn(check.detail);
114
- else if (check.status === 'fail')
115
- step.fail(check.detail);
116
- else
117
- step.warn('skipped');
118
- }
119
193
  async function checkAccountStore() {
120
194
  try {
121
195
  const store = await loadStore();
@@ -157,45 +231,6 @@ async function checkHubSpotCli(cwd) {
157
231
  detail: `${discovered.accounts.length} account${discovered.accounts.length === 1 ? '' : 's'} in ${discovered.source}`,
158
232
  };
159
233
  }
160
- async function checkHubSpotPak(cwd, fetchImpl) {
161
- const fromEnv = process.env.HSX_HUBSPOT_PAK;
162
- const pak = fromEnv && fromEnv.length > 0 ? fromEnv : (await discoverHubSpotPak(cwd))?.pak;
163
- if (!pak) {
164
- return {
165
- name: 'HubSpot PAK',
166
- status: 'warn',
167
- detail: 'no PAK in env or HubSpot CLI config',
168
- };
169
- }
170
- try {
171
- const controller = new AbortController();
172
- const timer = setTimeout(() => controller.abort(), 4000);
173
- const response = await fetchImpl('https://api.hubapi.com/integrators/v1/timeline/event-types', {
174
- method: 'GET',
175
- headers: { authorization: `Bearer ${pak}`, accept: 'application/json' },
176
- signal: controller.signal,
177
- });
178
- clearTimeout(timer);
179
- if (response.status === 401 || response.status === 403) {
180
- return {
181
- name: 'HubSpot PAK',
182
- status: 'fail',
183
- detail: `auth check returned ${response.status}`,
184
- };
185
- }
186
- if (response.status >= 500) {
187
- return { name: 'HubSpot PAK', status: 'warn', detail: `HubSpot ${response.status}` };
188
- }
189
- return { name: 'HubSpot PAK', status: 'ok', detail: 'authenticated' };
190
- }
191
- catch (error) {
192
- return {
193
- name: 'HubSpot PAK',
194
- status: 'warn',
195
- detail: error instanceof Error ? error.message : 'request failed',
196
- };
197
- }
198
- }
199
234
  async function checkRecentActivity() {
200
235
  const entries = await readHistory({ limit: 50 });
201
236
  if (entries.length === 0) {
@@ -221,38 +256,4 @@ async function checkRecentActivity() {
221
256
  }
222
257
  return { name: 'Recent activity', status: 'ok', detail: parts.join(', ') };
223
258
  }
224
- async function checkControlPlane(fetchImpl) {
225
- const url = process.env.HSX_CONTROL_PLANE_URL;
226
- if (!url || url.length === 0) {
227
- return {
228
- name: 'HS-X control plane',
229
- status: 'warn',
230
- detail: 'HSX_CONTROL_PLANE_URL not set',
231
- };
232
- }
233
- try {
234
- const controller = new AbortController();
235
- const timer = setTimeout(() => controller.abort(), 3000);
236
- const response = await fetchImpl(new URL('/_hsx/health', url), {
237
- method: 'GET',
238
- signal: controller.signal,
239
- });
240
- clearTimeout(timer);
241
- if (response.ok) {
242
- return { name: 'HS-X control plane', status: 'ok', detail: url };
243
- }
244
- return {
245
- name: 'HS-X control plane',
246
- status: 'fail',
247
- detail: `${url} returned ${response.status}`,
248
- };
249
- }
250
- catch (error) {
251
- return {
252
- name: 'HS-X control plane',
253
- status: 'fail',
254
- detail: error instanceof Error ? error.message : 'unreachable',
255
- };
256
- }
257
- }
258
259
  //# sourceMappingURL=doctor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,9 @@
1
+ import * as Command from '@effect/cli/Command';
2
+ import { FileSystem } from '@effect/platform';
3
+ import { Option } from 'effect';
4
+ import { CliError } from '../cli-error.js';
1
5
  import type { CliResult } from '../result.js';
6
+ import { Cwd } from '../services/cwd.js';
2
7
  /**
3
8
  * ADR-015 §5 `hs-x flags` — the leaveable, direct-to-tenant flag authoring CLI.
4
9
  * It reads the per-install grant secret + InstallationKey scope a linked deploy
@@ -19,4 +24,34 @@ export declare function flagsCommand(input: {
19
24
  readonly json: boolean;
20
25
  readonly root?: string;
21
26
  }): Promise<CliResult>;
27
+ export declare const flagsCmd: Command.Command<"flags", FileSystem.FileSystem | Cwd, CliError, {
28
+ readonly subcommand: Option.Option<{
29
+ readonly limit: Option.Option<number>;
30
+ readonly json: boolean;
31
+ readonly projectId: Option.Option<string>;
32
+ readonly appId: Option.Option<number>;
33
+ readonly environment: Option.Option<string>;
34
+ readonly env: Option.Option<string>;
35
+ readonly runtimeOrigin: Option.Option<string>;
36
+ readonly cloudflareApiToken: Option.Option<string>;
37
+ } | {
38
+ readonly file: Option.Option<string>;
39
+ readonly json: boolean;
40
+ readonly projectId: Option.Option<string>;
41
+ readonly appId: Option.Option<number>;
42
+ readonly environment: Option.Option<string>;
43
+ readonly env: Option.Option<string>;
44
+ readonly runtimeOrigin: Option.Option<string>;
45
+ readonly cloudflareApiToken: Option.Option<string>;
46
+ } | {
47
+ readonly key: Option.Option<string>;
48
+ readonly json: boolean;
49
+ readonly projectId: Option.Option<string>;
50
+ readonly appId: Option.Option<number>;
51
+ readonly environment: Option.Option<string>;
52
+ readonly env: Option.Option<string>;
53
+ readonly runtimeOrigin: Option.Option<string>;
54
+ readonly cloudflareApiToken: Option.Option<string>;
55
+ }>;
56
+ }>;
22
57
  //# sourceMappingURL=flags.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/commands/flags.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAsB9C;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,CAAC,CA4ErB"}
1
+ {"version":3,"file":"flags.d.ts","sourceRoot":"","sources":["../../src/commands/flags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,qBAAqB,CAAC;AAE/C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAS9C,OAAO,EAAkB,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAY,MAAM,iBAAiB,CAAC;AAGrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAuBzC;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,SAAS,CAAC,CA4ErB;AA2WD,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASpB,CAAC"}
@@ -1,7 +1,15 @@
1
1
  import { readFile } from 'node:fs/promises';
2
+ import * as Command from '@effect/cli/Command';
3
+ import * as Options from '@effect/cli/Options';
4
+ import { FileSystem } from '@effect/platform';
2
5
  import { Schema, schemas } from '@hs-x/types';
3
6
  import { RuntimeFlagAuthoringError, createFlagAuthoringClient, } from '@hs-x/runtime';
7
+ import { Config, Effect, Option } from 'effect';
8
+ import { CliError, exitWith } from '../cli-error.js';
9
+ import { jsonOption, runHandler } from '../cli/kit.js';
4
10
  import { loadTenantStateStore } from '../tenant-state.js';
11
+ import { Cwd } from '../services/cwd.js';
12
+ import { Reporter } from '../services/reporter.js';
5
13
  const SUBCOMMANDS = new Set(['list', 'create', 'define', 'enable', 'disable', 'archive']);
6
14
  function resolveFlag(argv, flag) {
7
15
  for (let index = 0; index < argv.length; index += 1) {
@@ -182,4 +190,225 @@ async function runSetState(input) {
182
190
  }
183
191
  return { exitCode: 0 };
184
192
  }
193
+ // ─── Native @effect/cli command (Phase 4) ───────────────────────────────────
194
+ // `flags` rebuilt as a parent command with one subcommand per flag action. The
195
+ // `--file` JSON read is lifted onto `@effect/platform` `FileSystem` (no
196
+ // `node:fs`); `Cwd` supplies the project root; identity falls back to
197
+ // `HSX_PROJECT_ID` / `HSX_APP_ID` / `HSX_RUNTIME_BASE_URL` via `Config`. The pure
198
+ // `runList`/`runCreate`/`runSetState` bodies and the `createFlagAuthoringClient`
199
+ // transport are reused verbatim from the legacy path.
200
+ //
201
+ // JSON-shape MISMATCH (flagged, NOT changed): every flags output is a bespoke
202
+ // shape — `{ ok, flags }`, `{ ok, flag, syncedSnapshots }`, `{ ok:false, error }`,
203
+ // all pretty-printed (2-space) — and NOT the `JsonReporter`
204
+ // `{schema_version, command, ok, data}` envelope. Errors in human mode print
205
+ // `Error: <msg>` to stderr. To preserve the exact bytes the subprocess tests
206
+ // assert, the bodies emit through the legacy `fail()` / `process.stdout` writers
207
+ // and the handler fails with a silent `exitWith(1)` so `runHandler` does not
208
+ // re-render. TODO(phase-5): reconcile these payloads with the standard envelope
209
+ // once the dispatch swap lets the fixtures move in lockstep.
210
+ const projectIdOption = Options.text('project-id').pipe(Options.optional);
211
+ const appIdOption = Options.integer('app-id').pipe(Options.optional);
212
+ const environmentOption = Options.text('environment').pipe(Options.optional);
213
+ const envOption = Options.text('env').pipe(Options.optional);
214
+ const runtimeOriginOption = Options.text('runtime-origin').pipe(Options.optional);
215
+ const cloudflareApiTokenOption = Options.text('cloudflare-api-token').pipe(Options.optional);
216
+ const limitOption = Options.integer('limit').pipe(Options.optional);
217
+ const fileOption = Options.text('file').pipe(Options.optional);
218
+ const keyOption = Options.text('key').pipe(Options.optional);
219
+ const identityOptions = {
220
+ json: jsonOption,
221
+ projectId: projectIdOption,
222
+ appId: appIdOption,
223
+ environment: environmentOption,
224
+ env: envOption,
225
+ runtimeOrigin: runtimeOriginOption,
226
+ cloudflareApiToken: cloudflareApiTokenOption,
227
+ };
228
+ /** Effect twin of `fail()` for the native path: emit the bespoke output, then fail silently. */
229
+ function failEff(json, message) {
230
+ return Effect.sync(() => fail(json, message)).pipe(Effect.zipRight(Effect.fail(exitWith(1))));
231
+ }
232
+ /**
233
+ * Resolve the {@link FlagAuthoringClient} from options + env (mirrors the legacy
234
+ * preamble). Reuses `loadTenantStateStore`/`createFlagAuthoringClient`; identity
235
+ * env fallbacks are read through `Config`. Cloudflare creds resolve from
236
+ * `--cloudflare-api-token` (reconstructed into a minimal argv) or env.
237
+ */
238
+ function resolveClient(opts) {
239
+ return Effect.gen(function* () {
240
+ const json = opts.json;
241
+ const root = yield* Cwd;
242
+ const envProjectId = yield* Config.string('HSX_PROJECT_ID')
243
+ .pipe(Config.withDefault(''))
244
+ .pipe(Effect.orDie);
245
+ const envAppId = yield* Config.string('HSX_APP_ID').pipe(Config.withDefault('')).pipe(Effect.orDie);
246
+ const envRuntimeBaseUrl = yield* Config.string('HSX_RUNTIME_BASE_URL')
247
+ .pipe(Config.withDefault(''))
248
+ .pipe(Effect.orDie);
249
+ const projectId = Option.getOrElse(opts.projectId, () => (envProjectId.length > 0 ? envProjectId : undefined));
250
+ const environment = Option.getOrElse(opts.environment, () => Option.getOrElse(opts.env, () => 'production'));
251
+ const appIdRaw = Option.match(opts.appId, {
252
+ onNone: () => (envAppId.length > 0 ? Number(envAppId) : undefined),
253
+ onSome: (value) => value,
254
+ });
255
+ const runtimeBaseUrl = Option.getOrElse(opts.runtimeOrigin, () => envRuntimeBaseUrl.length > 0 ? envRuntimeBaseUrl : undefined);
256
+ if (!projectId)
257
+ return yield* failEff(json, 'Require --project-id (or HSX_PROJECT_ID).');
258
+ if (appIdRaw === undefined || !Number.isInteger(appIdRaw)) {
259
+ return yield* failEff(json, 'Require an integer --app-id (or HSX_APP_ID).');
260
+ }
261
+ const hubSpotAppId = appIdRaw;
262
+ if (!runtimeBaseUrl) {
263
+ return yield* failEff(json, 'Require --runtime-origin (or HSX_RUNTIME_BASE_URL) — the deployed Worker URL.');
264
+ }
265
+ // loadTenantStateStore reads Cloudflare creds from argv-style flags or env;
266
+ // forward an explicit --cloudflare-api-token when provided, else rely on env.
267
+ const argv = Option.match(opts.cloudflareApiToken, {
268
+ onNone: () => [],
269
+ onSome: (token) => ['--cloudflare-api-token', token],
270
+ });
271
+ const context = yield* Effect.tryPromise({
272
+ try: () => loadTenantStateStore({ argv, root }),
273
+ catch: (cause) => cause,
274
+ }).pipe(Effect.catchAll((cause) => failEff(json, cause instanceof Error ? cause.message : String(cause))));
275
+ if (!context) {
276
+ return yield* failEff(json, 'No .hs-x/cloudflare.json found. Deploy this project first with `hs-x deploy`.');
277
+ }
278
+ const binding = yield* Effect.tryPromise({
279
+ try: () => context.stateStore.getBinding({
280
+ projectId,
281
+ environment,
282
+ hubSpotAppId: hubSpotAppId,
283
+ }),
284
+ catch: (cause) => cause,
285
+ }).pipe(Effect.catchAll((cause) => failEff(json, cause instanceof Error ? cause.message : String(cause))));
286
+ if (!binding?.syncGrantSecretValue || !binding.tenantScopeAccountId) {
287
+ return yield* failEff(json, `No flag-authoring credentials for ${projectId}/${environment} (app ${hubSpotAppId}). Re-deploy as a linked project to provision the tenant data plane.`);
288
+ }
289
+ const scope = {
290
+ accountId: binding.tenantScopeAccountId,
291
+ projectId,
292
+ environment,
293
+ hubSpotAppId,
294
+ };
295
+ const client = createFlagAuthoringClient({
296
+ runtimeBaseUrl,
297
+ grantSecret: binding.syncGrantSecretValue,
298
+ scope,
299
+ });
300
+ return { client, scope };
301
+ });
302
+ }
303
+ /**
304
+ * Map a thrown `RuntimeFlagAuthoringError`/`Error` to the legacy bespoke
305
+ * failure. A `CliError` (an already-rendered `failEff`) is re-raised untouched;
306
+ * anything else is rendered like the legacy `try/catch` around the dispatch.
307
+ */
308
+ function withClientErrors(json, body) {
309
+ return body.pipe(Effect.catchAll((error) => error instanceof CliError
310
+ ? Effect.fail(error)
311
+ : error instanceof RuntimeFlagAuthoringError
312
+ ? failEff(json, `Tenant Worker rejected the request (${error.status}): ${error.message}`)
313
+ : failEff(json, error instanceof Error ? error.message : String(error))));
314
+ }
315
+ const flagsListCmd = Command.make('list', { ...identityOptions, limit: limitOption }, (opts) => runHandler('flags', { json: opts.json }, Effect.gen(function* () {
316
+ const { client } = yield* resolveClient(opts);
317
+ const limit = Option.getOrUndefined(opts.limit);
318
+ yield* withClientErrors(opts.json, Effect.tryPromise({
319
+ try: () => runList({
320
+ argv: limit !== undefined ? ['flags', 'list', '--limit', String(limit)] : ['flags', 'list'],
321
+ json: opts.json,
322
+ client,
323
+ }),
324
+ catch: (cause) => cause,
325
+ }).pipe(Effect.asVoid));
326
+ })));
327
+ function makeCreateCmd(name) {
328
+ return Command.make(name, { ...identityOptions, file: fileOption }, (opts) => runHandler('flags', { json: opts.json }, Effect.gen(function* () {
329
+ const { client, scope } = yield* resolveClient(opts);
330
+ const file = Option.getOrUndefined(opts.file);
331
+ if (!file) {
332
+ return yield* failEff(opts.json, 'Require --file <flag-definition.json> for `flags create`.');
333
+ }
334
+ // Read via FileSystem (no node:fs); a read failure mirrors the legacy
335
+ // "could not read/parse" bespoke failure.
336
+ const fs = yield* FileSystem.FileSystem;
337
+ const source = yield* fs.readFileString(file).pipe(Effect.mapError((cause) => ({ kind: 'read', cause })), Effect.either);
338
+ if (source._tag === 'Left') {
339
+ return yield* failEff(opts.json, `Could not read/parse ${file}: ${String(source.left.cause)}`);
340
+ }
341
+ yield* withClientErrors(opts.json, runCreateFromSource({ source: source.right, file, json: opts.json, client, scope }));
342
+ })));
343
+ }
344
+ const flagsCreateCmd = makeCreateCmd('create');
345
+ const flagsDefineCmd = makeCreateCmd('define');
346
+ function makeSetStateCmd(name, state) {
347
+ return Command.make(name, { ...identityOptions, key: keyOption }, (opts) => runHandler('flags', { json: opts.json }, Effect.gen(function* () {
348
+ const { client } = yield* resolveClient(opts);
349
+ const key = Option.getOrUndefined(opts.key);
350
+ yield* withClientErrors(opts.json, Effect.tryPromise({
351
+ try: () => runSetState({
352
+ argv: key !== undefined ? ['flags', name, '--key', key] : ['flags', name],
353
+ json: opts.json,
354
+ client,
355
+ state,
356
+ }),
357
+ catch: (cause) => cause,
358
+ }).pipe(Effect.asVoid));
359
+ })));
360
+ }
361
+ const flagsEnableCmd = makeSetStateCmd('enable', 'enabled');
362
+ const flagsDisableCmd = makeSetStateCmd('disable', 'disabled');
363
+ const flagsArchiveCmd = makeSetStateCmd('archive', 'archived');
364
+ export const flagsCmd = Command.make('flags').pipe(Command.withSubcommands([
365
+ flagsListCmd,
366
+ flagsCreateCmd,
367
+ flagsDefineCmd,
368
+ flagsEnableCmd,
369
+ flagsDisableCmd,
370
+ flagsArchiveCmd,
371
+ ]));
372
+ /**
373
+ * Effect-native `flags create` body: parses the already-read source string and
374
+ * stamps identity from the resolved scope, mirroring `runCreate` byte-for-byte
375
+ * but with the file read hoisted to the caller (so it can go through FileSystem).
376
+ */
377
+ function runCreateFromSource(input) {
378
+ return Effect.gen(function* () {
379
+ let parsed;
380
+ try {
381
+ parsed = JSON.parse(input.source);
382
+ }
383
+ catch (error) {
384
+ return yield* failEff(input.json, `Could not read/parse ${input.file}: ${error instanceof Error ? error.message : String(error)}`);
385
+ }
386
+ if (typeof parsed !== 'object' || parsed === null) {
387
+ return yield* failEff(input.json, `${input.file} must contain a JSON flag definition object.`);
388
+ }
389
+ const candidate = {
390
+ version: 1,
391
+ ...parsed,
392
+ accountId: input.scope.accountId,
393
+ projectId: input.scope.projectId,
394
+ environment: input.scope.environment,
395
+ hubSpotAppId: input.scope.hubSpotAppId,
396
+ updatedAt: new Date().toISOString(),
397
+ };
398
+ const decoded = Schema.decodeUnknownEither(schemas.FlagDefinition)(candidate);
399
+ if (decoded._tag === 'Left') {
400
+ return yield* failEff(input.json, `Invalid flag definition: ${String(decoded.left)}`);
401
+ }
402
+ const result = yield* Effect.tryPromise({
403
+ try: () => input.client.defineFlag(decoded.right),
404
+ catch: (cause) => cause,
405
+ });
406
+ if (input.json) {
407
+ process.stdout.write(`${JSON.stringify({ ok: true, flag: result.flag, syncedSnapshots: result.syncedSnapshots }, null, 2)}\n`);
408
+ }
409
+ else {
410
+ process.stdout.write(`Defined "${result.flag.key}" [${result.flag.type}, ${result.flag.state}, v${result.flag.version}] — synced ${result.syncedSnapshots} snapshot(s).\n`);
411
+ }
412
+ });
413
+ }
185
414
  //# sourceMappingURL=flags.js.map