@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
@@ -0,0 +1,93 @@
1
+ import { FileSystem, Path } from '@effect/platform';
2
+ import { HttpClientRequest } from '@hs-x/types';
3
+ import { Config, Context, Duration, Effect, Layer } from 'effect';
4
+ import { CLI_VERSION } from '../constants.js';
5
+ import { AppPaths } from './app-paths.js';
6
+ import { CliConfig } from './config.js';
7
+ import { CliHttp } from './http.js';
8
+ import { MachineId } from './machine-id.js';
9
+ export class Telemetry extends Context.Tag('cli/Telemetry')() {
10
+ }
11
+ const truthy = (value) => value === '1' || value === 'true' || value === 'yes';
12
+ export const layer = Layer.effect(Telemetry, Effect.gen(function* () {
13
+ const fs = yield* FileSystem.FileSystem;
14
+ const path = yield* Path.Path;
15
+ const paths = yield* AppPaths;
16
+ const http = yield* CliHttp;
17
+ const machine = yield* MachineId;
18
+ const config = yield* CliConfig;
19
+ const env = yield* Config.all({
20
+ disabled: Config.string('HSX_TELEMETRY_DISABLED').pipe(Config.withDefault('')),
21
+ optout: Config.string('HSX_TELEMETRY_OPTOUT').pipe(Config.withDefault('')),
22
+ doNotTrack: Config.string('DO_NOT_TRACK').pipe(Config.withDefault('')),
23
+ force: Config.string('HSX_TELEMETRY_FORCE').pipe(Config.withDefault('')),
24
+ url: Config.string('HSX_TELEMETRY_URL').pipe(Config.withDefault('')),
25
+ noticePath: Config.string('HSX_TELEMETRY_NOTICE_PATH').pipe(Config.withDefault('')),
26
+ }).pipe(Effect.orDie);
27
+ // Edge capture of platform facts — the single sanctioned `process` read.
28
+ const platform = process.platform;
29
+ const arch = process.arch;
30
+ const runtime = process.versions.bun ? 'bun' : 'node';
31
+ const ci = truthy(process.env.CI ?? '');
32
+ const enabled = (optedOutByFlag, isSourceTreeRun) => {
33
+ if (optedOutByFlag)
34
+ return false;
35
+ if (truthy(env.disabled) || truthy(env.optout) || truthy(env.doNotTrack))
36
+ return false;
37
+ if (truthy(env.force))
38
+ return true;
39
+ return !isSourceTreeRun;
40
+ };
41
+ const endpoint = () => env.url.length > 0
42
+ ? env.url
43
+ : new URL('/v1/telemetry/cli', config.controlPlaneUrl).toString();
44
+ const machineId = machine.get.pipe(Effect.catchAll(() => Effect.succeed(undefined)));
45
+ const emit = (input) => Effect.gen(function* () {
46
+ if (!enabled(input.optedOutByFlag, input.isSourceTreeRun))
47
+ return;
48
+ const id = yield* machineId;
49
+ const request = HttpClientRequest.post(endpoint()).pipe(HttpClientRequest.setHeaders({
50
+ 'content-type': 'application/json',
51
+ accept: 'application/json',
52
+ }), HttpClientRequest.bodyText(JSON.stringify({
53
+ schema_version: 1,
54
+ event: 'cli.command',
55
+ cli_version: CLI_VERSION,
56
+ command: input.command,
57
+ ...(input.subcommand ? { subcommand: input.subcommand } : {}),
58
+ ...(id ? { machine_id: id } : {}),
59
+ exit_code: input.exitCode,
60
+ duration_ms: input.durationMs,
61
+ mode: input.mode,
62
+ os: platform,
63
+ arch,
64
+ runtime,
65
+ ci,
66
+ }), 'application/json'));
67
+ yield* http.execute(request).pipe(Effect.timeout(Duration.millis(350)));
68
+ }).pipe(Effect.ignore);
69
+ const noticeLines = (input) => Effect.gen(function* () {
70
+ if (input.json)
71
+ return [];
72
+ if (!enabled(input.optedOutByFlag, input.isSourceTreeRun))
73
+ return [];
74
+ if (['help', '--help', '-h', '--version', '-v'].includes(input.command))
75
+ return [];
76
+ const stamp = env.noticePath.length > 0 ? env.noticePath : paths.cachePath('telemetry-notice.stamp');
77
+ if (yield* fs.exists(stamp))
78
+ return [];
79
+ const id = yield* machineId;
80
+ const lines = [
81
+ 'hs-x sends anonymous usage telemetry (command name, exit code, duration, os/arch, machine_id).',
82
+ ...(id
83
+ ? [`Machine id ${id} lets \`hs-x link\` later claim this machine's deploy history.`]
84
+ : []),
85
+ 'Opt out with --no-telemetry, HSX_TELEMETRY_OPTOUT=1, or DO_NOT_TRACK=1.',
86
+ ];
87
+ yield* fs.makeDirectory(path.dirname(stamp), { recursive: true });
88
+ yield* fs.writeFileString(stamp, 'shown\n');
89
+ return lines;
90
+ }).pipe(Effect.orElseSucceed(() => []));
91
+ return { emit, noticeLines };
92
+ }));
93
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/services/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import { Schema, schemas } from '@hs-x/types';
2
+ import { Context, Effect, Layer } from 'effect';
3
+ import { type CliError } from '../cli-error.js';
4
+ import { CloudflareKv } from './cloudflare-kv.js';
5
+ type CloudflarePointer = Schema.Schema.Type<typeof schemas.CloudflarePointer>;
6
+ type LocalDeployEntry = Schema.Schema.Type<typeof schemas.LocalDeployEntry>;
7
+ type LocalActiveDeploy = Schema.Schema.Type<typeof schemas.LocalActiveDeploy>;
8
+ type LocalAppRuntimeBinding = Schema.Schema.Type<typeof schemas.LocalAppRuntimeBinding>;
9
+ type LocalOwnerMeta = Schema.Schema.Type<typeof schemas.LocalOwnerMeta>;
10
+ type HubSpotAppId = Schema.Schema.Type<typeof schemas.HubSpotAppId>;
11
+ /**
12
+ * A tenant state store bound to one project's Cloudflare pointer, backed by a
13
+ * `CloudflareKvHandle`. Mirrors the original `StateStore` shape from
14
+ * `state-store.ts` with every method returning an Effect that fails with a
15
+ * typed `CliError` (KV transport errors propagate; schema decode failures are
16
+ * mapped to `HSX_E_INTERNAL`).
17
+ */
18
+ export interface TenantStateStoreHandle {
19
+ readonly getOwnerMeta: () => Effect.Effect<LocalOwnerMeta | undefined, CliError>;
20
+ readonly putOwnerMeta: (meta: LocalOwnerMeta) => Effect.Effect<void, CliError>;
21
+ readonly recordDeploy: (entry: LocalDeployEntry) => Effect.Effect<void, CliError>;
22
+ readonly getDeploy: (input: {
23
+ readonly projectId: string;
24
+ readonly deployId: string;
25
+ }) => Effect.Effect<LocalDeployEntry | undefined, CliError>;
26
+ readonly listDeploys: (input: {
27
+ readonly projectId: string;
28
+ }) => Effect.Effect<readonly LocalDeployEntry[], CliError>;
29
+ readonly getActive: (input: {
30
+ readonly projectId: string;
31
+ readonly environment: string;
32
+ }) => Effect.Effect<LocalActiveDeploy | undefined, CliError>;
33
+ readonly setActive: (active: LocalActiveDeploy) => Effect.Effect<void, CliError>;
34
+ readonly getBinding: (input: {
35
+ readonly projectId: string;
36
+ readonly environment: string;
37
+ readonly hubSpotAppId: HubSpotAppId;
38
+ }) => Effect.Effect<LocalAppRuntimeBinding | undefined, CliError>;
39
+ readonly putBinding: (binding: LocalAppRuntimeBinding) => Effect.Effect<void, CliError>;
40
+ readonly listOwners: () => Effect.Effect<readonly string[], CliError>;
41
+ readonly listProjects: () => Effect.Effect<readonly string[], CliError>;
42
+ }
43
+ /** Result of provisioning/binding the `hsx-state` namespace for a pointer. */
44
+ export interface TenantStateContext {
45
+ readonly pointer: CloudflarePointer;
46
+ readonly stateStore: TenantStateStoreHandle;
47
+ }
48
+ /** Cloudflare credentials + optional API base URL needed to reach KV. */
49
+ export interface TenantStateCredentials {
50
+ readonly apiToken: string;
51
+ readonly accountId: string;
52
+ readonly baseUrl?: string;
53
+ }
54
+ /**
55
+ * Tenant KV state as an injectable service. `store` binds a state-store to an
56
+ * already-resolved pointer + credentials; `ensureNamespace` provisions the
57
+ * `hsx-state` namespace and returns the namespace id/title so the caller can
58
+ * persist a pointer. `ensureStore` chains both, caching the resulting context
59
+ * per (cacheKey, accountId, apiToken, baseUrl) within the process (replacing
60
+ * the old module-level `Map`). KV access flows through the injected
61
+ * `CloudflareKv` service — never `createCloudflareKvClient`.
62
+ */
63
+ export interface TenantStateApi {
64
+ readonly store: (input: {
65
+ readonly pointer: CloudflarePointer;
66
+ readonly credentials: TenantStateCredentials;
67
+ }) => Effect.Effect<TenantStateStoreHandle, CliError>;
68
+ readonly ensureNamespace: (input: {
69
+ readonly credentials: TenantStateCredentials;
70
+ }) => Effect.Effect<{
71
+ readonly id: string;
72
+ readonly title: string;
73
+ }, CliError>;
74
+ readonly ensureStore: (input: {
75
+ readonly cacheKey: string;
76
+ readonly pointer: CloudflarePointer;
77
+ readonly credentials: TenantStateCredentials;
78
+ }) => Effect.Effect<TenantStateContext, CliError>;
79
+ }
80
+ declare const TenantState_base: Context.TagClass<TenantState, "cli/TenantState", TenantStateApi>;
81
+ export declare class TenantState extends TenantState_base {
82
+ }
83
+ export declare const layer: Layer.Layer<TenantState, never, CloudflareKv>;
84
+ export {};
85
+ //# sourceMappingURL=tenant-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-state.d.ts","sourceRoot":"","sources":["../../src/services/tenant-state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ import { Schema, schemas } from '@hs-x/types';
2
+ import { Context, Effect, Layer, Ref } from 'effect';
3
+ import { cliError } from '../cli-error.js';
4
+ import { CloudflareKv } from './cloudflare-kv.js';
5
+ export class TenantState extends Context.Tag('cli/TenantState')() {
6
+ }
7
+ export const layer = Layer.effect(TenantState, Effect.gen(function* () {
8
+ const kv = yield* CloudflareKv;
9
+ // Replaces the module-level `tenantStateStoreCache` Map from tenant-state.ts.
10
+ const cache = yield* Ref.make(new Map());
11
+ // Build a KV handle bound to the state namespace for the given pointer.
12
+ const boundHandle = (input) => kv.make({
13
+ accountId: input.pointer.cloudflareAccountId,
14
+ apiToken: input.credentials.apiToken,
15
+ namespaceId: input.pointer.stateKvNamespaceId,
16
+ ...(input.credentials.baseUrl ? { baseUrl: input.credentials.baseUrl } : {}),
17
+ });
18
+ const buildStore = (handle, ownerId) => {
19
+ const readDecoded = (key, schema) => Effect.gen(function* () {
20
+ const raw = yield* handle.get(key);
21
+ if (raw === undefined)
22
+ return undefined;
23
+ return yield* decodeJson(raw, schema);
24
+ });
25
+ const writeJson = (key, value) => handle.put(key, JSON.stringify(value));
26
+ return {
27
+ getOwnerMeta: () => readDecoded(ownerMetaKey(ownerId), schemas.LocalOwnerMeta),
28
+ putOwnerMeta: (meta) => writeJson(ownerMetaKey(ownerId), meta),
29
+ recordDeploy: (entry) => writeJson(deployKey(ownerId, entry.projectId, entry.deployId), entry),
30
+ getDeploy: (input) => readDecoded(deployKey(ownerId, input.projectId, input.deployId), schemas.LocalDeployEntry),
31
+ listDeploys: (input) => Effect.gen(function* () {
32
+ const prefix = `owners/${ownerId}/projects/${input.projectId}/deploys/`;
33
+ const keys = yield* handle.list(prefix);
34
+ const entries = yield* Effect.forEach(keys, (key) => readDecoded(key, schemas.LocalDeployEntry), { concurrency: 'unbounded' });
35
+ return entries
36
+ .filter((entry) => entry !== undefined)
37
+ .sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));
38
+ }),
39
+ getActive: (input) => readDecoded(activeDeployKey(ownerId, input.projectId, input.environment), schemas.LocalActiveDeploy),
40
+ setActive: (active) => writeJson(activeDeployKey(ownerId, active.projectId, active.environment), active),
41
+ getBinding: (input) => readDecoded(bindingKey(ownerId, input.projectId, input.environment, input.hubSpotAppId), schemas.LocalAppRuntimeBinding),
42
+ putBinding: (binding) => writeJson(bindingKey(ownerId, binding.projectId, binding.environment, String(binding.hubSpotAppId)), binding),
43
+ listOwners: () => Effect.gen(function* () {
44
+ const keys = yield* handle.list('owners/');
45
+ return [...new Set(keys.map((key) => key.split('/')[1]).filter(isPresent))].sort();
46
+ }),
47
+ listProjects: () => Effect.gen(function* () {
48
+ const keys = yield* handle.list(`owners/${ownerId}/projects/`);
49
+ return [...new Set(keys.map((key) => key.split('/')[3]).filter(isPresent))].sort();
50
+ }),
51
+ };
52
+ };
53
+ const store = (input) => Effect.map(boundHandle(input), (handle) => buildStore(handle, input.pointer.ownerId));
54
+ const ensureNamespace = (input) => Effect.gen(function* () {
55
+ const handle = yield* kv.make({
56
+ accountId: input.credentials.accountId,
57
+ apiToken: input.credentials.apiToken,
58
+ ...(input.credentials.baseUrl ? { baseUrl: input.credentials.baseUrl } : {}),
59
+ });
60
+ const namespace = yield* handle.ensureNamespace('hsx-state');
61
+ return { id: namespace.id, title: namespace.title };
62
+ });
63
+ const ensureStore = (input) => Effect.gen(function* () {
64
+ const cached = (yield* Ref.get(cache)).get(input.cacheKey);
65
+ if (cached)
66
+ return cached;
67
+ const handle = yield* boundHandle(input);
68
+ const context = {
69
+ pointer: input.pointer,
70
+ stateStore: buildStore(handle, input.pointer.ownerId),
71
+ };
72
+ yield* Ref.update(cache, (map) => new Map(map).set(input.cacheKey, context));
73
+ return context;
74
+ });
75
+ return { store, ensureNamespace, ensureStore };
76
+ }));
77
+ function decodeJson(raw, schema) {
78
+ return Effect.try({
79
+ try: () => Schema.decodeUnknownSync(schema)(JSON.parse(raw)),
80
+ catch: (cause) => cliError('HSX_E_INTERNAL', `Failed to decode tenant state value: ${String(cause)}`),
81
+ });
82
+ }
83
+ function isPresent(value) {
84
+ return value !== undefined && value.length > 0;
85
+ }
86
+ function ownerMetaKey(ownerId) {
87
+ return `owners/${ownerId}/meta`;
88
+ }
89
+ function activeDeployKey(ownerId, projectId, environment) {
90
+ return `owners/${ownerId}/projects/${projectId}/active/${environment}`;
91
+ }
92
+ function deployKey(ownerId, projectId, deployId) {
93
+ return `owners/${ownerId}/projects/${projectId}/deploys/${deployId}`;
94
+ }
95
+ function bindingKey(ownerId, projectId, environment, hubSpotAppId) {
96
+ return `owners/${ownerId}/projects/${projectId}/bindings/${environment}/${hubSpotAppId}`;
97
+ }
98
+ //# sourceMappingURL=tenant-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-state.js","sourceRoot":"","sources":["../../src/services/tenant-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hs-x/cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "HS-X CLI — init, validate, connect, dev, deploy, promote, rollback, doctor, sync. Installs the `hs-x` command.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -35,5 +35,6 @@
35
35
  "@hs-x/fixtures": "0.1.0",
36
36
  "@types/node": "^25.8.0",
37
37
  "@hs-x/control-plane": "0.1.0"
38
- }
38
+ },
39
+ "license": "Apache-2.0"
39
40
  }