@indigoai-us/hq-cli 5.77.13 → 5.78.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.
- package/CHANGELOG.md +34 -0
- package/assets/scaffold/core/scripts/archive-old-threads.sh +86 -0
- package/assets/scaffold/core/scripts/backfill-company-skill-mirrors.sh +73 -0
- package/assets/scaffold/core/scripts/backfill-workspace-mirror.sh +51 -0
- package/assets/scaffold/core/scripts/codex-skill-bridge.sh +550 -0
- package/assets/scaffold/core/scripts/detect-stale-core-policy-mirror.sh +185 -0
- package/assets/scaffold/core/scripts/hq-status-summary.sh +187 -0
- package/assets/scaffold/core/scripts/ontology-readme-drift.sh +264 -0
- package/assets/scaffold/core/scripts/qmd-reindex-after-sync.sh +93 -0
- package/assets/scaffold/core/scripts/rebuild-all-indexes.sh +69 -0
- package/assets/scaffold/core/scripts/rebuild-companies-index.sh +206 -0
- package/assets/scaffold/core/scripts/rebuild-company-knowledge-index.sh +127 -0
- package/assets/scaffold/core/scripts/rebuild-orchestrator-index.sh +86 -0
- package/assets/scaffold/core/scripts/rebuild-projects-index.sh +105 -0
- package/assets/scaffold/core/scripts/rebuild-public-knowledge-index.sh +83 -0
- package/assets/scaffold/core/scripts/rebuild-reports-index.sh +114 -0
- package/assets/scaffold/core/scripts/rebuild-social-drafts-index.sh +135 -0
- package/assets/scaffold/core/scripts/rebuild-threads-index.sh +82 -0
- package/assets/scaffold/core/scripts/rebuild-workers-index.sh +97 -0
- package/assets/scaffold/core/scripts/resize-screenshot.sh +47 -0
- package/assets/scaffold/core/scripts/token-usage-report.sh +254 -0
- package/assets/scaffold/core/scripts/worktree.sh +136 -0
- package/dist/commands/agents.js +28 -12
- package/dist/commands/api-keys.js +100 -20
- package/dist/commands/core.d.ts +90 -0
- package/dist/commands/core.js +279 -0
- package/dist/commands/files-browse.d.ts +21 -0
- package/dist/commands/files-browse.js +145 -24
- package/dist/commands/files.js +33 -7
- package/dist/commands/members.js +16 -5
- package/dist/commands/pack-install.d.ts +14 -0
- package/dist/commands/pack-install.js +51 -2
- package/dist/commands/pkg-install.js +43 -0
- package/dist/commands/run.js +8 -0
- package/dist/commands/secrets.js +125 -65
- package/dist/main.js +6 -0
- package/dist/utils/api-key-command-gate.d.ts +45 -0
- package/dist/utils/api-key-command-gate.js +51 -0
- package/dist/utils/hq-roots.d.ts +91 -0
- package/dist/utils/hq-roots.js +212 -0
- package/dist/utils/resolve-vault-credential.d.ts +63 -3
- package/dist/utils/resolve-vault-credential.js +152 -6
- package/dist/utils/run-bundled-script.d.ts +66 -0
- package/dist/utils/run-bundled-script.js +80 -0
- package/dist/utils/vault-api.d.ts +21 -0
- package/dist/utils/vault-api.js +74 -3
- package/package.json +7 -1
- package/.claude/policies/hq-cli-interactive-reads-use-sts-vend.md +0 -49
- package/.github/workflows/ci.yml +0 -46
- package/.github/workflows/publish.yml +0 -36
- package/.github/workflows/scripts/smoke-test-pkg.sh +0 -97
- package/e2e/cli.test.ts +0 -128
- package/eslint.config.js +0 -37
- package/pnpm-workspace.yaml +0 -4
- package/scripts/chmod-bins.mjs +0 -49
- package/scripts/generate-dsn.mjs +0 -26
- package/scripts/generate-scan-packages-table.mjs +0 -113
- package/scripts/smoke-sources-signals.sh +0 -103
- package/src/bin/hq-auth-refresh.ts +0 -43
- package/src/cli-version.ts +0 -13
- package/src/commands/__fixtures__/make-tar.ts +0 -126
- package/src/commands/_patterns.ts +0 -10
- package/src/commands/add.ts +0 -75
- package/src/commands/agents.test.ts +0 -527
- package/src/commands/agents.ts +0 -923
- package/src/commands/api-keys.test.ts +0 -291
- package/src/commands/api-keys.ts +0 -382
- package/src/commands/artifact-verify.test.ts +0 -177
- package/src/commands/auth.test.ts +0 -82
- package/src/commands/auth.ts +0 -213
- package/src/commands/billing.test.ts +0 -158
- package/src/commands/billing.ts +0 -146
- package/src/commands/channels.test.ts +0 -74
- package/src/commands/channels.ts +0 -91
- package/src/commands/cloud-demote.test.ts +0 -401
- package/src/commands/cloud-demote.ts +0 -278
- package/src/commands/cloud-provision.test.ts +0 -1117
- package/src/commands/cloud-provision.ts +0 -942
- package/src/commands/cloud.pull-all.test.ts +0 -711
- package/src/commands/cloud.pull-per-company.test.ts +0 -188
- package/src/commands/cloud.push-all.test.ts +0 -485
- package/src/commands/cloud.scope-excluded-warning.test.ts +0 -22
- package/src/commands/cloud.selectors.test.ts +0 -208
- package/src/commands/cloud.status.test.ts +0 -160
- package/src/commands/cloud.test.ts +0 -41
- package/src/commands/cloud.ts +0 -2130
- package/src/commands/company.test.ts +0 -202
- package/src/commands/company.ts +0 -148
- package/src/commands/creators.test.ts +0 -60
- package/src/commands/creators.ts +0 -117
- package/src/commands/crm.test.ts +0 -179
- package/src/commands/crm.ts +0 -236
- package/src/commands/db-migrate.ts +0 -55
- package/src/commands/db-provision.ts +0 -114
- package/src/commands/db-sql.ts +0 -124
- package/src/commands/db-status.ts +0 -108
- package/src/commands/db.ts +0 -26
- package/src/commands/dm.test.ts +0 -748
- package/src/commands/dm.ts +0 -1226
- package/src/commands/feedback.test.ts +0 -413
- package/src/commands/feedback.ts +0 -169
- package/src/commands/files-browse.test.ts +0 -1249
- package/src/commands/files-browse.ts +0 -1506
- package/src/commands/files-delete.test.ts +0 -484
- package/src/commands/files-recovery.test.ts +0 -370
- package/src/commands/files.test.ts +0 -722
- package/src/commands/files.ts +0 -1446
- package/src/commands/group-grants.test.ts +0 -330
- package/src/commands/group-grants.ts +0 -455
- package/src/commands/groups.test.ts +0 -44
- package/src/commands/groups.ts +0 -368
- package/src/commands/integrations.test.ts +0 -633
- package/src/commands/integrations.ts +0 -507
- package/src/commands/list.ts +0 -85
- package/src/commands/login.ts +0 -52
- package/src/commands/logout.ts +0 -30
- package/src/commands/marketplace-install.test.ts +0 -543
- package/src/commands/marketplace-security.test.ts +0 -646
- package/src/commands/mcp-registration.test.ts +0 -2787
- package/src/commands/mcp-registration.ts +0 -2612
- package/src/commands/mcp-status.test.ts +0 -483
- package/src/commands/mcp-status.ts +0 -575
- package/src/commands/mcp-status.us011.test.ts +0 -243
- package/src/commands/meetings.test.ts +0 -522
- package/src/commands/meetings.ts +0 -789
- package/src/commands/members.test.ts +0 -1474
- package/src/commands/members.ts +0 -1181
- package/src/commands/onboard-identity-guard.test.ts +0 -99
- package/src/commands/onboard-identity-guard.ts +0 -103
- package/src/commands/onboard-join.test.ts +0 -96
- package/src/commands/onboard-join.ts +0 -101
- package/src/commands/onboard-warning.test.ts +0 -26
- package/src/commands/onboard-warning.ts +0 -12
- package/src/commands/onboard.ts +0 -267
- package/src/commands/outposts-heartbeat.test.ts +0 -299
- package/src/commands/outposts-heartbeat.ts +0 -310
- package/src/commands/outposts-replica-sync.test.ts +0 -272
- package/src/commands/outposts-self-deploy.test.ts +0 -243
- package/src/commands/outposts.test.ts +0 -1039
- package/src/commands/outposts.ts +0 -1935
- package/src/commands/pack-install-secret-authorization.test.ts +0 -115
- package/src/commands/pack-install.test.ts +0 -1469
- package/src/commands/pack-install.ts +0 -2247
- package/src/commands/pack-update-cache.test.ts +0 -149
- package/src/commands/packs.test.ts +0 -88
- package/src/commands/packs.ts +0 -622
- package/src/commands/people.test.ts +0 -807
- package/src/commands/people.ts +0 -422
- package/src/commands/pkg-install.dispatch.test.ts +0 -71
- package/src/commands/pkg-install.ts +0 -215
- package/src/commands/pkg-list.test.ts +0 -79
- package/src/commands/pkg-list.ts +0 -13
- package/src/commands/pkg-remove.ts +0 -71
- package/src/commands/pkg-update.ts +0 -189
- package/src/commands/publish.test.ts +0 -650
- package/src/commands/publish.ts +0 -580
- package/src/commands/reindex.test.ts +0 -259
- package/src/commands/reindex.ts +0 -274
- package/src/commands/rescue.test.ts +0 -39
- package/src/commands/rescue.ts +0 -210
- package/src/commands/run.env-local.test.ts +0 -88
- package/src/commands/run.test.ts +0 -45
- package/src/commands/run.ts +0 -184
- package/src/commands/safe-extract.test.ts +0 -459
- package/src/commands/safe-extract.ts +0 -444
- package/src/commands/secrets-scope.test.ts +0 -56
- package/src/commands/secrets-scope.ts +0 -32
- package/src/commands/secrets.parse-destination.test.ts +0 -38
- package/src/commands/secrets.test.ts +0 -2037
- package/src/commands/secrets.ts +0 -2240
- package/src/commands/signals.ts +0 -351
- package/src/commands/skill.test.ts +0 -770
- package/src/commands/skill.ts +0 -796
- package/src/commands/sources.ts +0 -362
- package/src/commands/sync-mode.test.ts +0 -366
- package/src/commands/sync-mode.ts +0 -387
- package/src/commands/sync-narrow.test.ts +0 -633
- package/src/commands/sync-narrow.ts +0 -555
- package/src/commands/sync.ts +0 -165
- package/src/commands/team-sync.ts +0 -628
- package/src/commands/update.ts +0 -71
- package/src/commands/whoami.ts +0 -83
- package/src/commands/workers.test.ts +0 -158
- package/src/commands/workers.ts +0 -301
- package/src/index.test.ts +0 -32
- package/src/index.ts +0 -20
- package/src/lib/db/control-plane.test.ts +0 -59
- package/src/lib/db/control-plane.ts +0 -113
- package/src/lib/db/local.test.ts +0 -81
- package/src/lib/db/local.ts +0 -148
- package/src/lib/db/migrate.test.ts +0 -133
- package/src/lib/db/migrate.ts +0 -137
- package/src/lib/db/paths.test.ts +0 -112
- package/src/lib/db/paths.ts +0 -128
- package/src/lib/db/remote-engine.test.ts +0 -44
- package/src/lib/db/remote-engine.ts +0 -148
- package/src/lib/db/remote-sql.test.ts +0 -32
- package/src/lib/db/remote-sql.ts +0 -62
- package/src/lib/db/sql.test.ts +0 -106
- package/src/lib/db/sql.ts +0 -192
- package/src/lib/hq-cloud-dep.smoke.test.ts +0 -75
- package/src/lib/local-tree-diff.test.ts +0 -301
- package/src/lib/local-tree-diff.ts +0 -362
- package/src/lib/narrow-hint-banner.test.ts +0 -235
- package/src/lib/narrow-hint-banner.ts +0 -212
- package/src/lib/plan-limit-nag.test.ts +0 -317
- package/src/lib/plan-limit-nag.ts +0 -264
- package/src/main.ts +0 -371
- package/src/node-preflight.test.ts +0 -60
- package/src/node-preflight.ts +0 -67
- package/src/outpost/session-heartbeat-bounds.test.ts +0 -195
- package/src/outpost/session-heartbeat-guard.test.ts +0 -105
- package/src/outpost/session-heartbeat-publisher.test.ts +0 -178
- package/src/outpost/session-heartbeat-publisher.ts +0 -186
- package/src/outpost/session-heartbeat-retain-guard.test.ts +0 -126
- package/src/outpost/session-heartbeat.test.ts +0 -459
- package/src/outpost/session-heartbeat.ts +0 -877
- package/src/packaging.test.ts +0 -109
- package/src/run/__fixtures__/discover-schemas/example.env.schema +0 -4
- package/src/run/discover-schemas.test.ts +0 -153
- package/src/run/discover-schemas.ts +0 -79
- package/src/run/hq-plugin.test.ts +0 -371
- package/src/run/hq-plugin.ts +0 -277
- package/src/run/varlock-shape.test.ts +0 -57
- package/src/schemas/hq-package.schema.json +0 -155
- package/src/sentry-before-send.test.ts +0 -359
- package/src/sentry-before-send.ts +0 -221
- package/src/sentry-epipe.test.ts +0 -37
- package/src/sentry-release.test.ts +0 -54
- package/src/sentry.test.ts +0 -24
- package/src/sentry.ts +0 -54
- package/src/strategies/link.ts +0 -62
- package/src/strategies/merge.ts +0 -142
- package/src/types.ts +0 -146
- package/src/utils/__fixtures__/scan-packages.generated-block.sh +0 -23
- package/src/utils/auth-error.test.ts +0 -40
- package/src/utils/auth-error.ts +0 -42
- package/src/utils/billing-gate.test.ts +0 -95
- package/src/utils/billing-gate.ts +0 -228
- package/src/utils/breadcrumb-buffer.ts +0 -18
- package/src/utils/cli-telemetry.test.ts +0 -153
- package/src/utils/cli-telemetry.ts +0 -61
- package/src/utils/cognito-session.machine.test.ts +0 -109
- package/src/utils/cognito-session.refresh.test.ts +0 -84
- package/src/utils/cognito-session.test.ts +0 -328
- package/src/utils/cognito-session.ts +0 -448
- package/src/utils/company-selection-error.test.ts +0 -42
- package/src/utils/company-selection-error.ts +0 -45
- package/src/utils/contribution-table.ts +0 -83
- package/src/utils/environmental-error.test.ts +0 -45
- package/src/utils/environmental-error.ts +0 -39
- package/src/utils/epipe.test.ts +0 -28
- package/src/utils/epipe.ts +0 -29
- package/src/utils/expected-cli-error.test.ts +0 -28
- package/src/utils/expected-cli-error.ts +0 -39
- package/src/utils/feedback-diagnostics.test.ts +0 -183
- package/src/utils/feedback-diagnostics.ts +0 -123
- package/src/utils/feedback-screenshots.test.ts +0 -134
- package/src/utils/feedback-screenshots.ts +0 -124
- package/src/utils/feedback-versions.test.ts +0 -98
- package/src/utils/feedback-versions.ts +0 -68
- package/src/utils/git.ts +0 -74
- package/src/utils/integrity.ts +0 -59
- package/src/utils/intercepted-process-exit.test.ts +0 -37
- package/src/utils/intercepted-process-exit.ts +0 -36
- package/src/utils/login-provider.test.ts +0 -42
- package/src/utils/login-provider.ts +0 -30
- package/src/utils/manifest.test.ts +0 -167
- package/src/utils/manifest.ts +0 -131
- package/src/utils/pack-contributions.test.ts +0 -603
- package/src/utils/pack-contributions.ts +0 -450
- package/src/utils/people.ts +0 -215
- package/src/utils/registry-client.ts +0 -204
- package/src/utils/registry.ts +0 -90
- package/src/utils/resolve-vault-credential.test.ts +0 -69
- package/src/utils/resolve-vault-credential.ts +0 -60
- package/src/utils/sandbox-runner-client.test.ts +0 -279
- package/src/utils/sandbox-runner-client.ts +0 -260
- package/src/utils/secrets-cache.ts +0 -183
- package/src/utils/sentry-identity.ts +0 -45
- package/src/utils/settle-with-timeout.test.ts +0 -21
- package/src/utils/settle-with-timeout.ts +0 -22
- package/src/utils/user-yaml-error.test.ts +0 -24
- package/src/utils/user-yaml-error.ts +0 -30
- package/src/utils/vault-api.test.ts +0 -536
- package/src/utils/vault-api.ts +0 -382
- package/src/utils/version-check.test.ts +0 -176
- package/src/utils/version-check.ts +0 -155
- package/src/utils/version-gate.test.ts +0 -1024
- package/src/utils/version-gate.ts +0 -702
- package/test/commands/db-tenant-isolation.test.ts +0 -94
- package/test/commands/db.test.ts +0 -85
- package/test/commands/signals.test.ts +0 -207
- package/test/commands/sources.test.ts +0 -231
- package/test/e2e/smoke-install-mcp.sh +0 -113
- package/test/fixtures/hq-pack-smoke-mcp/mcp/smoke-http.json +0 -1
- package/test/fixtures/hq-pack-smoke-mcp/package.yaml +0 -11
- package/test/fixtures/signals/action_item/sample.md +0 -16
- package/test/fixtures/signals/summary/sample.md +0 -12
- package/test/fixtures/sources/meetings/sample.md +0 -25
- package/test/helpers/cli-runner.ts +0 -150
- package/test/helpers/s3-list-mock.ts +0 -79
- package/test/helpers/vault-service-mock.ts +0 -295
- package/test/sources-signals/smoke.test.ts +0 -228
- package/tsconfig.json +0 -20
- package/vitest.config.ts +0 -11
- package/vitest.e2e.config.ts +0 -7
package/src/commands/crm.ts
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { Command } from "commander";
|
|
2
|
-
import chalk from "chalk";
|
|
3
|
-
import { readFileSync } from "node:fs";
|
|
4
|
-
import { ensureCognitoToken } from "../utils/cognito-session.js";
|
|
5
|
-
import { vaultApiFetch, getEntityUid } from "../utils/vault-api.js";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* `hq crm entity upsert` — agent-facing controlled entity upsert
|
|
9
|
-
* (hq-native-crm US-002). Wraps `POST /crm/entities`, which fronts the ontology
|
|
10
|
-
* write gate so an authenticated company MEMBER (or higher) can create/update
|
|
11
|
-
* canonical CRM entities in their company's vault.
|
|
12
|
-
*
|
|
13
|
-
* Conventions mirror `secrets.ts`: ensureCognitoToken() → getEntityUid() →
|
|
14
|
-
* vaultApiFetch() → error-check → chalk output.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
/** The CRM/ontology entity types the upsert route accepts via `--type`. */
|
|
18
|
-
const CRM_ENTITY_TYPES = [
|
|
19
|
-
"contact",
|
|
20
|
-
"deal",
|
|
21
|
-
"contract",
|
|
22
|
-
"invoice",
|
|
23
|
-
"company",
|
|
24
|
-
] as const;
|
|
25
|
-
type CrmEntityType = (typeof CRM_ENTITY_TYPES)[number];
|
|
26
|
-
|
|
27
|
-
/** A minimal entity payload in the write-gate ExtractedEntity shape. */
|
|
28
|
-
interface CrmEntityInput {
|
|
29
|
-
type: string;
|
|
30
|
-
canonical_name: string;
|
|
31
|
-
aliases?: string[];
|
|
32
|
-
confidence?: number;
|
|
33
|
-
domain?: string[];
|
|
34
|
-
relationships?: unknown[];
|
|
35
|
-
external_ids?: Record<string, string>;
|
|
36
|
-
web_domains?: string[];
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
interface UpsertFlags {
|
|
40
|
-
type?: string;
|
|
41
|
-
name?: string;
|
|
42
|
-
attioId?: string;
|
|
43
|
-
stripeId?: string;
|
|
44
|
-
pandadocId?: string;
|
|
45
|
-
neonId?: string;
|
|
46
|
-
json?: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* Read the `--json <file|->` payload: a single entity object or an array of
|
|
51
|
-
* entities. `-` reads from stdin. Returns the entities array (always
|
|
52
|
-
* normalized to an array) or throws a descriptive Error.
|
|
53
|
-
*/
|
|
54
|
-
function readJsonEntities(source: string): CrmEntityInput[] {
|
|
55
|
-
const raw =
|
|
56
|
-
source === "-"
|
|
57
|
-
? readFileSync(0, "utf8") // fd 0 = stdin
|
|
58
|
-
: readFileSync(source, "utf8");
|
|
59
|
-
let parsed: unknown;
|
|
60
|
-
try {
|
|
61
|
-
parsed = JSON.parse(raw);
|
|
62
|
-
} catch (err) {
|
|
63
|
-
throw new Error(
|
|
64
|
-
`--json payload is not valid JSON: ${err instanceof Error ? err.message : String(err)}`,
|
|
65
|
-
);
|
|
66
|
-
}
|
|
67
|
-
const entities = Array.isArray(parsed) ? parsed : [parsed];
|
|
68
|
-
if (entities.length === 0) {
|
|
69
|
-
throw new Error("--json payload contained no entities");
|
|
70
|
-
}
|
|
71
|
-
for (const e of entities) {
|
|
72
|
-
if (!e || typeof e !== "object") {
|
|
73
|
-
throw new Error("--json entities must be objects");
|
|
74
|
-
}
|
|
75
|
-
const obj = e as Record<string, unknown>;
|
|
76
|
-
if (typeof obj.type !== "string" || typeof obj.canonical_name !== "string") {
|
|
77
|
-
throw new Error(
|
|
78
|
-
"each --json entity needs a string `type` and `canonical_name`",
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return entities as CrmEntityInput[];
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Build a single entity from the flag form (`--type` + `--name` + optional
|
|
87
|
-
* external-id flags). The route fills the additive defaults (aliases/domain/
|
|
88
|
-
* relationships/confidence) when omitted, but we send a complete minimal shape.
|
|
89
|
-
*/
|
|
90
|
-
function buildEntityFromFlags(opts: UpsertFlags): CrmEntityInput {
|
|
91
|
-
const externalIds: Record<string, string> = {};
|
|
92
|
-
if (opts.attioId) externalIds.attio = opts.attioId;
|
|
93
|
-
if (opts.stripeId) externalIds.stripe = opts.stripeId;
|
|
94
|
-
if (opts.pandadocId) externalIds.pandadoc = opts.pandadocId;
|
|
95
|
-
if (opts.neonId) externalIds.neon = opts.neonId;
|
|
96
|
-
|
|
97
|
-
const entity: CrmEntityInput = {
|
|
98
|
-
type: opts.type as CrmEntityType,
|
|
99
|
-
canonical_name: opts.name as string,
|
|
100
|
-
aliases: [],
|
|
101
|
-
confidence: 1,
|
|
102
|
-
domain: [],
|
|
103
|
-
relationships: [],
|
|
104
|
-
};
|
|
105
|
-
if (Object.keys(externalIds).length > 0) {
|
|
106
|
-
entity.external_ids = externalIds;
|
|
107
|
-
}
|
|
108
|
-
return entity;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
export function registerCrmCommand(program: Command): void {
|
|
112
|
-
const crm = program
|
|
113
|
-
.command("crm")
|
|
114
|
-
.description("Native CRM — upsert canonical entities into a company vault")
|
|
115
|
-
.option("--company <slug>", "Company slug (resolves to companyUid)");
|
|
116
|
-
|
|
117
|
-
const entity = crm
|
|
118
|
-
.command("entity")
|
|
119
|
-
.description("CRM entity operations");
|
|
120
|
-
|
|
121
|
-
entity
|
|
122
|
-
.command("upsert")
|
|
123
|
-
.description(
|
|
124
|
-
"Create or update a canonical CRM entity (POST /crm/entities). " +
|
|
125
|
-
"Use --type/--name (+ optional external-id flags) or --json <file|-> " +
|
|
126
|
-
"to pass a full entity/array.",
|
|
127
|
-
)
|
|
128
|
-
.option(
|
|
129
|
-
"--type <type>",
|
|
130
|
-
`Entity type: ${CRM_ENTITY_TYPES.join(" | ")}`,
|
|
131
|
-
)
|
|
132
|
-
.option("--name <canonical_name>", "Canonical entity name")
|
|
133
|
-
.option("--attio-id <id>", "Attio record id → external_ids.attio")
|
|
134
|
-
.option("--stripe-id <id>", "Stripe object id → external_ids.stripe")
|
|
135
|
-
.option("--pandadoc-id <id>", "PandaDoc document id → external_ids.pandadoc")
|
|
136
|
-
.option("--neon-id <id>", "Neon row id → external_ids.neon")
|
|
137
|
-
.option(
|
|
138
|
-
"--json <file|->",
|
|
139
|
-
"Path to a JSON file (or '-' for stdin) with a full entity object or array",
|
|
140
|
-
)
|
|
141
|
-
.action(async (opts: UpsertFlags) => {
|
|
142
|
-
try {
|
|
143
|
-
const companySlug = crm.opts().company as string | undefined;
|
|
144
|
-
if (!companySlug) {
|
|
145
|
-
console.error(
|
|
146
|
-
chalk.red("Error: --company <slug> is required."),
|
|
147
|
-
);
|
|
148
|
-
process.exit(1);
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// Resolve the entity payload: --json is the alternative to flags.
|
|
152
|
-
let entities: CrmEntityInput[];
|
|
153
|
-
if (opts.json) {
|
|
154
|
-
entities = readJsonEntities(opts.json);
|
|
155
|
-
} else {
|
|
156
|
-
if (!opts.type) {
|
|
157
|
-
console.error(
|
|
158
|
-
chalk.red(
|
|
159
|
-
`Error: --type <${CRM_ENTITY_TYPES.join("|")}> is required (or pass --json).`,
|
|
160
|
-
),
|
|
161
|
-
);
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
164
|
-
if (!CRM_ENTITY_TYPES.includes(opts.type as CrmEntityType)) {
|
|
165
|
-
console.error(
|
|
166
|
-
chalk.red(
|
|
167
|
-
`Error: --type must be one of ${CRM_ENTITY_TYPES.join(", ")}.`,
|
|
168
|
-
),
|
|
169
|
-
);
|
|
170
|
-
process.exit(1);
|
|
171
|
-
}
|
|
172
|
-
if (!opts.name) {
|
|
173
|
-
console.error(
|
|
174
|
-
chalk.red("Error: --name <canonical_name> is required (or pass --json)."),
|
|
175
|
-
);
|
|
176
|
-
process.exit(1);
|
|
177
|
-
}
|
|
178
|
-
entities = [buildEntityFromFlags(opts)];
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
const token = await ensureCognitoToken();
|
|
182
|
-
const companyUid = await getEntityUid(token, { companySlug });
|
|
183
|
-
|
|
184
|
-
const res = await vaultApiFetch({
|
|
185
|
-
token,
|
|
186
|
-
path: "/crm/entities",
|
|
187
|
-
method: "POST",
|
|
188
|
-
body: { companyUid, entities },
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
if (!res.ok) {
|
|
192
|
-
const body = (await res.json().catch(() => ({}))) as Record<
|
|
193
|
-
string,
|
|
194
|
-
unknown
|
|
195
|
-
>;
|
|
196
|
-
// CrmDisabledError surfaces as a 403 with a helpful message.
|
|
197
|
-
if (res.status === 403 && body.code === "CRM_DISABLED") {
|
|
198
|
-
console.error(
|
|
199
|
-
chalk.red(
|
|
200
|
-
"CRM is not enabled for this company. Enable it first: " +
|
|
201
|
-
`hq company settings set --company ${companySlug} --crm-enabled true`,
|
|
202
|
-
),
|
|
203
|
-
);
|
|
204
|
-
process.exit(1);
|
|
205
|
-
}
|
|
206
|
-
console.error(
|
|
207
|
-
chalk.red(
|
|
208
|
-
`Failed to upsert entities: ${(body.error as string) ?? res.statusText}`,
|
|
209
|
-
),
|
|
210
|
-
);
|
|
211
|
-
process.exit(1);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
const result = (await res.json().catch(() => ({}))) as {
|
|
215
|
-
created?: number;
|
|
216
|
-
updated?: number;
|
|
217
|
-
skipped?: number;
|
|
218
|
-
status?: string;
|
|
219
|
-
};
|
|
220
|
-
console.log(
|
|
221
|
-
chalk.green(
|
|
222
|
-
`Upsert ${result.status ?? "ok"}: ` +
|
|
223
|
-
`${result.created ?? 0} created, ` +
|
|
224
|
-
`${result.updated ?? 0} updated, ` +
|
|
225
|
-
`${result.skipped ?? 0} skipped.`,
|
|
226
|
-
),
|
|
227
|
-
);
|
|
228
|
-
} catch (err) {
|
|
229
|
-
console.error(
|
|
230
|
-
chalk.red("Error:"),
|
|
231
|
-
err instanceof Error ? err.message : String(err),
|
|
232
|
-
);
|
|
233
|
-
process.exit(1);
|
|
234
|
-
}
|
|
235
|
-
});
|
|
236
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hq db migrate — apply vault text migrations to local SQLite (US-005).
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Command } from "commander";
|
|
6
|
-
import chalk from "chalk";
|
|
7
|
-
import path from "node:path";
|
|
8
|
-
|
|
9
|
-
import { migrateLocalDb } from "../lib/db/migrate.js";
|
|
10
|
-
|
|
11
|
-
const DEFAULT_HQ_ROOT = process.env.HQ_ROOT || path.resolve(process.cwd());
|
|
12
|
-
|
|
13
|
-
export function registerDbMigrateCommand(db: Command): void {
|
|
14
|
-
db.command("migrate")
|
|
15
|
-
.description(
|
|
16
|
-
"Apply pending vault text migrations (companies/{co}/db/migrations/*.sql) to the local DB",
|
|
17
|
-
)
|
|
18
|
-
.requiredOption("--company <slug>", "Company slug (tenant scope; required)")
|
|
19
|
-
.option(
|
|
20
|
-
"--hq-root <path>",
|
|
21
|
-
"HQ tree root containing companies/ (default: cwd or HQ_ROOT)",
|
|
22
|
-
DEFAULT_HQ_ROOT,
|
|
23
|
-
)
|
|
24
|
-
.option("--home <path>", "Override home for local DB root (tests)")
|
|
25
|
-
.action(
|
|
26
|
-
(opts: { company: string; hqRoot?: string; home?: string }) => {
|
|
27
|
-
try {
|
|
28
|
-
const company = String(opts.company ?? "").trim();
|
|
29
|
-
if (!company) {
|
|
30
|
-
console.error(chalk.red("Error: --company is required"));
|
|
31
|
-
process.exitCode = 1;
|
|
32
|
-
return;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const result = migrateLocalDb({
|
|
36
|
-
company,
|
|
37
|
-
hqRoot: opts.hqRoot || DEFAULT_HQ_ROOT,
|
|
38
|
-
...(opts.home ? { home: opts.home } : {}),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
console.log(`company: ${result.company}`);
|
|
42
|
-
console.log(`migrationsDir: ${result.migrationsDir}`);
|
|
43
|
-
console.log(`applied: ${result.applied.length ? result.applied.join(", ") : "(none)"}`);
|
|
44
|
-
console.log(`skipped: ${result.skipped.length ? result.skipped.join(", ") : "(none)"}`);
|
|
45
|
-
console.log(`schemaVersion: ${result.head ?? "(none)"}`);
|
|
46
|
-
} catch (error) {
|
|
47
|
-
console.error(
|
|
48
|
-
chalk.red("Error:"),
|
|
49
|
-
error instanceof Error ? error.message : "Unknown error",
|
|
50
|
-
);
|
|
51
|
-
process.exitCode = 1;
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
);
|
|
55
|
-
}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hq db provision — request remote vault DB binding (US-009).
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Command } from "commander";
|
|
6
|
-
import chalk from "chalk";
|
|
7
|
-
|
|
8
|
-
import { ControlPlaneDbClient } from "../lib/db/control-plane.js";
|
|
9
|
-
import {
|
|
10
|
-
DEFAULT_VAULT_API_URL,
|
|
11
|
-
ensureCognitoToken,
|
|
12
|
-
} from "../utils/cognito-session.js";
|
|
13
|
-
import { getCompanyUid } from "../utils/vault-api.js";
|
|
14
|
-
|
|
15
|
-
export interface DbProvisionCommandDeps {
|
|
16
|
-
resolveCompany: (slug: string) => Promise<{ companyUid: string; companySlug: string }>;
|
|
17
|
-
getAccessToken: () => Promise<string>;
|
|
18
|
-
apiBaseUrl: string;
|
|
19
|
-
fetchImpl?: typeof fetch;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const defaultDeps = (): DbProvisionCommandDeps => ({
|
|
23
|
-
async resolveCompany(slug) {
|
|
24
|
-
if (process.env.HQ_DB_MOCK_CONTROL_PLANE === "1") {
|
|
25
|
-
return { companyUid: `cmp_${slug}`, companySlug: slug };
|
|
26
|
-
}
|
|
27
|
-
const token = await ensureCognitoToken({ interactive: false });
|
|
28
|
-
const companyUid = await getCompanyUid(token, slug);
|
|
29
|
-
return { companyUid, companySlug: slug.trim().toLowerCase() };
|
|
30
|
-
},
|
|
31
|
-
async getAccessToken() {
|
|
32
|
-
if (process.env.HQ_DB_MOCK_CONTROL_PLANE === "1") {
|
|
33
|
-
return "mock-token";
|
|
34
|
-
}
|
|
35
|
-
return ensureCognitoToken({ interactive: false });
|
|
36
|
-
},
|
|
37
|
-
apiBaseUrl:
|
|
38
|
-
process.env.HQ_VAULT_API_URL ||
|
|
39
|
-
process.env.HQ_API_BASE_URL ||
|
|
40
|
-
process.env.HQ_CLOUD_API_URL ||
|
|
41
|
-
DEFAULT_VAULT_API_URL,
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
export function registerDbProvisionCommand(
|
|
45
|
-
db: Command,
|
|
46
|
-
depsFactory: () => DbProvisionCommandDeps = defaultDeps,
|
|
47
|
-
): void {
|
|
48
|
-
db.command("provision")
|
|
49
|
-
.description(
|
|
50
|
-
"Provision (or re-bind) the company remote vault DB via HQ control plane (Team plan)",
|
|
51
|
-
)
|
|
52
|
-
.requiredOption("--company <slug>", "Company slug")
|
|
53
|
-
.option("--region <region>", "AWS region", "us-east-1")
|
|
54
|
-
.action(async (opts: { company: string; region?: string }) => {
|
|
55
|
-
try {
|
|
56
|
-
const deps = depsFactory();
|
|
57
|
-
const company = String(opts.company ?? "").trim();
|
|
58
|
-
if (!company) {
|
|
59
|
-
console.error(chalk.red("Error: --company is required"));
|
|
60
|
-
process.exitCode = 1;
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const resolved = await deps.resolveCompany(company);
|
|
65
|
-
const client = new ControlPlaneDbClient({
|
|
66
|
-
baseUrl: deps.apiBaseUrl,
|
|
67
|
-
getAccessToken: deps.getAccessToken,
|
|
68
|
-
fetchImpl: deps.fetchImpl,
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
const result = await client.provision({
|
|
72
|
-
companyUid: resolved.companyUid,
|
|
73
|
-
companySlug: resolved.companySlug,
|
|
74
|
-
region: opts.region,
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
console.log(`company: ${result.companySlug}`);
|
|
78
|
-
console.log(`remote: ${result.status}`);
|
|
79
|
-
console.log(`engine: ${result.engineId}`);
|
|
80
|
-
console.log(`region: ${result.region}`);
|
|
81
|
-
console.log(`resourceArn: ${result.resourceArn}`);
|
|
82
|
-
console.log(`secretRef: ${result.secretRef}`);
|
|
83
|
-
console.log(`idempotent: ${result.idempotent ? "yes" : "no"}`);
|
|
84
|
-
} catch (error) {
|
|
85
|
-
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
86
|
-
const status = (error as { status?: number }).status;
|
|
87
|
-
if (status === 402 || /PLAN_REQUIRED|Team plan|\$500/i.test(msg)) {
|
|
88
|
-
console.error(
|
|
89
|
-
chalk.red("Error:"),
|
|
90
|
-
"Remote vault DB requires the HQ Team plan ($500/mo).",
|
|
91
|
-
);
|
|
92
|
-
console.error(
|
|
93
|
-
chalk.dim(
|
|
94
|
-
"Local databases still work: hq db status|sql|migrate — no Team plan required.",
|
|
95
|
-
),
|
|
96
|
-
);
|
|
97
|
-
} else if (status === 404 || /Unknown route|Not Found/i.test(msg)) {
|
|
98
|
-
console.error(
|
|
99
|
-
chalk.red("Error:"),
|
|
100
|
-
"Remote DB control plane is not available yet (routes not deployed).",
|
|
101
|
-
);
|
|
102
|
-
console.error(
|
|
103
|
-
chalk.dim("Local hq db status|sql|migrate still work offline."),
|
|
104
|
-
);
|
|
105
|
-
} else {
|
|
106
|
-
console.error(chalk.red("Error:"), msg);
|
|
107
|
-
}
|
|
108
|
-
if (/postgres:\/\//i.test(msg)) {
|
|
109
|
-
console.error(chalk.red("Error: refused to print secret material"));
|
|
110
|
-
}
|
|
111
|
-
process.exitCode = 1;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
package/src/commands/db-sql.ts
DELETED
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hq db sql — run SQL against the company local vault DB (US-004).
|
|
3
|
-
*
|
|
4
|
-
* Default is read-only. Prefer `hq db migrate` for schema changes.
|
|
5
|
-
* Never prints remote connection strings.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { Command } from "commander";
|
|
9
|
-
import chalk from "chalk";
|
|
10
|
-
import fs from "node:fs";
|
|
11
|
-
|
|
12
|
-
import { runRemoteSql } from "../lib/db/remote-sql.js";
|
|
13
|
-
import { formatSqlResult, runLocalSql } from "../lib/db/sql.js";
|
|
14
|
-
|
|
15
|
-
function readSqlArg(sqlArgs: string[], stdinFlag: boolean): string {
|
|
16
|
-
if (stdinFlag || sqlArgs.length === 0) {
|
|
17
|
-
if (process.stdin.isTTY && sqlArgs.length === 0) {
|
|
18
|
-
throw new Error(
|
|
19
|
-
"SQL required: pass as arguments after -- or pipe via stdin",
|
|
20
|
-
);
|
|
21
|
-
}
|
|
22
|
-
return fs.readFileSync(0, "utf8");
|
|
23
|
-
}
|
|
24
|
-
return sqlArgs.join(" ");
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export function registerDbSqlCommand(db: Command): void {
|
|
28
|
-
db.command("sql")
|
|
29
|
-
.description(
|
|
30
|
-
"Run SQL against the company vault DB (local default; --remote for secrets-injected remote; read-only by default)",
|
|
31
|
-
)
|
|
32
|
-
.requiredOption("--company <slug>", "Company slug (tenant scope; required)")
|
|
33
|
-
.option("--write", "Allow write/DDL statements (discouraged for ad-hoc DDL)", false)
|
|
34
|
-
.option(
|
|
35
|
-
"--remote",
|
|
36
|
-
"Use remote tier via vault-bound credentials (not auto-replicated with local)",
|
|
37
|
-
false,
|
|
38
|
-
)
|
|
39
|
-
.option(
|
|
40
|
-
"--db-path <path>",
|
|
41
|
-
"Dangerous: open a non-canonical DB path (denied unless --allow-cross-company-path)",
|
|
42
|
-
)
|
|
43
|
-
.option(
|
|
44
|
-
"--allow-cross-company-path",
|
|
45
|
-
"Dangerous: permit --db-path outside this company's canonical local DB",
|
|
46
|
-
false,
|
|
47
|
-
)
|
|
48
|
-
.option("--format <fmt>", "Output format: jsonl | table", "jsonl")
|
|
49
|
-
.option("--home <path>", "Override home for local DB root (tests)")
|
|
50
|
-
.option("--stdin", "Read SQL from stdin", false)
|
|
51
|
-
.argument("[sql...]", "SQL statement (or use --stdin / pipe)")
|
|
52
|
-
.action(
|
|
53
|
-
async (
|
|
54
|
-
sqlParts: string[],
|
|
55
|
-
opts: {
|
|
56
|
-
company: string;
|
|
57
|
-
write?: boolean;
|
|
58
|
-
remote?: boolean;
|
|
59
|
-
dbPath?: string;
|
|
60
|
-
allowCrossCompanyPath?: boolean;
|
|
61
|
-
format?: string;
|
|
62
|
-
home?: string;
|
|
63
|
-
stdin?: boolean;
|
|
64
|
-
},
|
|
65
|
-
) => {
|
|
66
|
-
try {
|
|
67
|
-
const company = String(opts.company ?? "").trim();
|
|
68
|
-
if (!company) {
|
|
69
|
-
console.error(chalk.red("Error: --company is required"));
|
|
70
|
-
process.exitCode = 1;
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
const sql = readSqlArg(sqlParts, !!opts.stdin).trim();
|
|
75
|
-
const format =
|
|
76
|
-
opts.format === "table" ? ("table" as const) : ("jsonl" as const);
|
|
77
|
-
|
|
78
|
-
if (opts.remote) {
|
|
79
|
-
// Local and remote are not auto-replicated (v1 limitation).
|
|
80
|
-
const remoteResult = await runRemoteSql({
|
|
81
|
-
company,
|
|
82
|
-
sql,
|
|
83
|
-
getConnectionConfig: async () => {
|
|
84
|
-
throw new Error("no remote binding");
|
|
85
|
-
},
|
|
86
|
-
});
|
|
87
|
-
console.log(
|
|
88
|
-
formatSqlResult(
|
|
89
|
-
{
|
|
90
|
-
columns:
|
|
91
|
-
remoteResult.rows[0]
|
|
92
|
-
? Object.keys(remoteResult.rows[0])
|
|
93
|
-
: [],
|
|
94
|
-
rows: remoteResult.rows,
|
|
95
|
-
changes: 0,
|
|
96
|
-
readonly: true,
|
|
97
|
-
},
|
|
98
|
-
format,
|
|
99
|
-
),
|
|
100
|
-
);
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
const result = runLocalSql({
|
|
105
|
-
company,
|
|
106
|
-
sql,
|
|
107
|
-
write: !!opts.write,
|
|
108
|
-
dbPathOverride: opts.dbPath,
|
|
109
|
-
allowCrossCompanyPath: !!opts.allowCrossCompanyPath,
|
|
110
|
-
format,
|
|
111
|
-
...(opts.home ? { home: opts.home } : {}),
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
console.log(formatSqlResult(result, format));
|
|
115
|
-
} catch (error) {
|
|
116
|
-
console.error(
|
|
117
|
-
chalk.red("Error:"),
|
|
118
|
-
error instanceof Error ? error.message : "Unknown error",
|
|
119
|
-
);
|
|
120
|
-
process.exitCode = 1;
|
|
121
|
-
}
|
|
122
|
-
},
|
|
123
|
-
);
|
|
124
|
-
}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hq db status — ensure local vault DB exists and report health.
|
|
3
|
-
* Optionally reports remote tier when control plane returns a binding (US-009).
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import { Command } from "commander";
|
|
7
|
-
import chalk from "chalk";
|
|
8
|
-
|
|
9
|
-
import { ControlPlaneDbClient } from "../lib/db/control-plane.js";
|
|
10
|
-
import {
|
|
11
|
-
ensureAndStatusLocalDb,
|
|
12
|
-
formatLocalDbStatus,
|
|
13
|
-
} from "../lib/db/local.js";
|
|
14
|
-
|
|
15
|
-
export function registerDbStatusCommand(db: Command): void {
|
|
16
|
-
db.command("status")
|
|
17
|
-
.description(
|
|
18
|
-
"Show local (and remote when bound) vault DB status; auto-creates local SQLite if missing",
|
|
19
|
-
)
|
|
20
|
-
.requiredOption(
|
|
21
|
-
"--company <slug>",
|
|
22
|
-
"Company slug (tenant scope; required)",
|
|
23
|
-
)
|
|
24
|
-
.option(
|
|
25
|
-
"--home <path>",
|
|
26
|
-
"Override home directory for local DB root (tests / advanced only)",
|
|
27
|
-
)
|
|
28
|
-
.option(
|
|
29
|
-
"--remote",
|
|
30
|
-
"Also query control plane for remote tier status (requires auth)",
|
|
31
|
-
false,
|
|
32
|
-
)
|
|
33
|
-
.option("--company-uid <uid>", "Company uid for remote status (with --remote)")
|
|
34
|
-
.action(
|
|
35
|
-
async (opts: {
|
|
36
|
-
company: string;
|
|
37
|
-
home?: string;
|
|
38
|
-
remote?: boolean;
|
|
39
|
-
companyUid?: string;
|
|
40
|
-
}) => {
|
|
41
|
-
try {
|
|
42
|
-
const company = String(opts.company ?? "").trim();
|
|
43
|
-
if (!company) {
|
|
44
|
-
console.error(chalk.red("Error: --company is required"));
|
|
45
|
-
process.exitCode = 1;
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const status = ensureAndStatusLocalDb(
|
|
50
|
-
company,
|
|
51
|
-
opts.home ? { home: opts.home } : undefined,
|
|
52
|
-
);
|
|
53
|
-
|
|
54
|
-
// Never print remote connection material.
|
|
55
|
-
console.log(formatLocalDbStatus(status));
|
|
56
|
-
|
|
57
|
-
if (opts.remote) {
|
|
58
|
-
const { DEFAULT_VAULT_API_URL, ensureCognitoToken } = await import(
|
|
59
|
-
"../utils/cognito-session.js"
|
|
60
|
-
);
|
|
61
|
-
const { getCompanyUid } = await import("../utils/vault-api.js");
|
|
62
|
-
try {
|
|
63
|
-
const token =
|
|
64
|
-
process.env.HQ_DB_MOCK_CONTROL_PLANE === "1"
|
|
65
|
-
? "mock-token"
|
|
66
|
-
: await ensureCognitoToken({ interactive: false });
|
|
67
|
-
const companyUid =
|
|
68
|
-
opts.companyUid ||
|
|
69
|
-
(process.env.HQ_DB_MOCK_CONTROL_PLANE === "1"
|
|
70
|
-
? `cmp_${company}`
|
|
71
|
-
: await getCompanyUid(token, company));
|
|
72
|
-
const baseUrl =
|
|
73
|
-
process.env.HQ_VAULT_API_URL ||
|
|
74
|
-
process.env.HQ_API_BASE_URL ||
|
|
75
|
-
process.env.HQ_CLOUD_API_URL ||
|
|
76
|
-
DEFAULT_VAULT_API_URL;
|
|
77
|
-
const client = new ControlPlaneDbClient({
|
|
78
|
-
baseUrl,
|
|
79
|
-
getAccessToken: async () => token,
|
|
80
|
-
});
|
|
81
|
-
const remote = await client.status(companyUid);
|
|
82
|
-
if (!remote.remote) {
|
|
83
|
-
console.log("remote: (none)");
|
|
84
|
-
} else {
|
|
85
|
-
console.log(`remote: ${remote.remote.status}`);
|
|
86
|
-
console.log(`remoteEngine: ${remote.remote.engineId}`);
|
|
87
|
-
console.log(`remoteRegion: ${remote.remote.region}`);
|
|
88
|
-
console.log(`remoteResourceArn: ${remote.remote.resourceArn}`);
|
|
89
|
-
}
|
|
90
|
-
} catch (e) {
|
|
91
|
-
const msg = e instanceof Error ? e.message : "remote status failed";
|
|
92
|
-
console.log(`remote: error (${msg})`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
if (!status.healthy) {
|
|
97
|
-
process.exitCode = 1;
|
|
98
|
-
}
|
|
99
|
-
} catch (error) {
|
|
100
|
-
console.error(
|
|
101
|
-
chalk.red("Error:"),
|
|
102
|
-
error instanceof Error ? error.message : "Unknown error",
|
|
103
|
-
);
|
|
104
|
-
process.exitCode = 1;
|
|
105
|
-
}
|
|
106
|
-
},
|
|
107
|
-
);
|
|
108
|
-
}
|
package/src/commands/db.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* hq db — vault database commands (local + remote tiers).
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { Command } from "commander";
|
|
6
|
-
|
|
7
|
-
import { registerDbMigrateCommand } from "./db-migrate.js";
|
|
8
|
-
import { registerDbProvisionCommand } from "./db-provision.js";
|
|
9
|
-
import { registerDbSqlCommand } from "./db-sql.js";
|
|
10
|
-
import { registerDbStatusCommand } from "./db-status.js";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Register the `hq db` command group and its subcommands.
|
|
14
|
-
*/
|
|
15
|
-
export function registerDbCommand(program: Command): void {
|
|
16
|
-
const db = program
|
|
17
|
-
.command("db")
|
|
18
|
-
.description(
|
|
19
|
-
"Vault databases — local SQLite per company and HQ-managed remote Postgres-class DBs",
|
|
20
|
-
);
|
|
21
|
-
|
|
22
|
-
registerDbStatusCommand(db);
|
|
23
|
-
registerDbSqlCommand(db);
|
|
24
|
-
registerDbMigrateCommand(db);
|
|
25
|
-
registerDbProvisionCommand(db);
|
|
26
|
-
}
|