@indigoai-us/hq-cli 5.77.14 → 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 +23 -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 +42 -2
- package/dist/commands/pkg-install.js +39 -2
- package/dist/commands/run.js +6 -2
- package/dist/commands/secrets.js +120 -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 -2256
- package/src/commands/pack-update-cache.test.ts +0 -149
- package/src/commands/packs-update-api-key.test.ts +0 -105
- 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 -103
- package/src/commands/pkg-install.ts +0 -221
- 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 -190
- 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 -2050
- package/src/commands/secrets.ts +0 -2249
- 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
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as os from 'os';
|
|
4
|
-
import * as path from 'path';
|
|
5
|
-
import { execFileSync } from 'child_process';
|
|
6
|
-
|
|
7
|
-
vi.mock('child_process', () => ({
|
|
8
|
-
execFileSync: vi.fn(),
|
|
9
|
-
spawnSync: vi.fn(() => ({ status: 0 })),
|
|
10
|
-
}));
|
|
11
|
-
|
|
12
|
-
vi.mock('../utils/vault-api.js', () => ({
|
|
13
|
-
vaultApiFetchPublic: vi.fn(),
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
const tmpHome = path.join(os.tmpdir(), `hq-pack-update-cache-${process.pid}`);
|
|
17
|
-
|
|
18
|
-
beforeEach(() => {
|
|
19
|
-
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
20
|
-
fs.mkdirSync(tmpHome, { recursive: true });
|
|
21
|
-
vi.stubEnv('HOME', tmpHome);
|
|
22
|
-
vi.mocked(execFileSync).mockReset();
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
afterEach(() => {
|
|
26
|
-
vi.unstubAllEnvs();
|
|
27
|
-
vi.restoreAllMocks();
|
|
28
|
-
vi.unstubAllGlobals();
|
|
29
|
-
fs.rmSync(tmpHome, { recursive: true, force: true });
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
async function loadModule() {
|
|
33
|
-
vi.resetModules();
|
|
34
|
-
return await import('./pack-install.js');
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
describe('resolveLatest pack update cache', () => {
|
|
38
|
-
it('fetches npm registry metadata over HTTP once, then compares cached latest against the installed version at read time', async () => {
|
|
39
|
-
const fetchMock = vi.fn().mockResolvedValue({
|
|
40
|
-
ok: true,
|
|
41
|
-
json: async () => ({ version: '2.0.0' }),
|
|
42
|
-
} as unknown as Response);
|
|
43
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
44
|
-
|
|
45
|
-
const { resolveLatest } = await loadModule();
|
|
46
|
-
|
|
47
|
-
const staleInstall = await resolveLatest('@scope/pack@1.0.0', '1.0.0', {
|
|
48
|
-
forceRefresh: true,
|
|
49
|
-
});
|
|
50
|
-
const currentInstall = await resolveLatest('@scope/pack@1.0.0', '2.0.0');
|
|
51
|
-
|
|
52
|
-
expect(staleInstall).toMatchObject({
|
|
53
|
-
transport: 'npm',
|
|
54
|
-
current: '1.0.0',
|
|
55
|
-
latest: '2.0.0',
|
|
56
|
-
updateAvailable: true,
|
|
57
|
-
});
|
|
58
|
-
expect(currentInstall).toMatchObject({
|
|
59
|
-
transport: 'npm',
|
|
60
|
-
current: '2.0.0',
|
|
61
|
-
latest: '2.0.0',
|
|
62
|
-
updateAvailable: false,
|
|
63
|
-
});
|
|
64
|
-
expect(fetchMock).toHaveBeenCalledTimes(1);
|
|
65
|
-
expect(vi.mocked(execFileSync)).not.toHaveBeenCalledWith(
|
|
66
|
-
'npm',
|
|
67
|
-
['view', '@scope/pack', 'version'],
|
|
68
|
-
expect.anything(),
|
|
69
|
-
);
|
|
70
|
-
expect(fs.existsSync(path.join(tmpHome, '.hq', 'pack-update-cache.json'))).toBe(true);
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('bypasses a fresh npm cache entry when forceRefresh is set', async () => {
|
|
74
|
-
const fetchMock = vi
|
|
75
|
-
.fn()
|
|
76
|
-
.mockResolvedValueOnce({
|
|
77
|
-
ok: true,
|
|
78
|
-
json: async () => ({ version: '2.0.0' }),
|
|
79
|
-
} as unknown as Response)
|
|
80
|
-
.mockResolvedValueOnce({
|
|
81
|
-
ok: true,
|
|
82
|
-
json: async () => ({ version: '3.0.0' }),
|
|
83
|
-
} as unknown as Response);
|
|
84
|
-
vi.stubGlobal('fetch', fetchMock);
|
|
85
|
-
|
|
86
|
-
const { resolveLatest } = await loadModule();
|
|
87
|
-
|
|
88
|
-
await resolveLatest('@scope/pack@1.0.0', '1.0.0', { forceRefresh: true });
|
|
89
|
-
const refreshed = await resolveLatest('@scope/pack@1.0.0', '1.0.0', {
|
|
90
|
-
forceRefresh: true,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
expect(refreshed).toMatchObject({
|
|
94
|
-
latest: '3.0.0',
|
|
95
|
-
updateAvailable: true,
|
|
96
|
-
});
|
|
97
|
-
expect(fetchMock).toHaveBeenCalledTimes(2);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('shares git ls-remote probes by URL and ref within one process', async () => {
|
|
101
|
-
vi.mocked(execFileSync).mockImplementation((_cmd, args) => {
|
|
102
|
-
const argv = args as string[];
|
|
103
|
-
if (argv[1] === '--heads') return '';
|
|
104
|
-
if (argv[0] === 'ls-remote') return 'abcdef1234567890\tHEAD\n';
|
|
105
|
-
throw new Error(`unexpected command: ${argv.join(' ')}`);
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
const { resolveLatest } = await loadModule();
|
|
109
|
-
|
|
110
|
-
const first = await resolveLatest('https://example.test/repo.git#123456', '1.0.0');
|
|
111
|
-
const second = await resolveLatest('https://example.test/repo.git#123456', '1.0.0');
|
|
112
|
-
|
|
113
|
-
expect(first.latest).toBe('abcdef1234567890');
|
|
114
|
-
expect(second.latest).toBe('abcdef1234567890');
|
|
115
|
-
const lsRemoteCalls = vi
|
|
116
|
-
.mocked(execFileSync)
|
|
117
|
-
.mock.calls.filter(([cmd, args]) => cmd === 'git' && (args as string[])[0] === 'ls-remote');
|
|
118
|
-
expect(lsRemoteCalls).toHaveLength(2);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('uses a fresh git disk cache entry without probing git for SHA-pinned sources', async () => {
|
|
122
|
-
const installedSha = '1111111111111111111111111111111111111111';
|
|
123
|
-
vi.mocked(execFileSync).mockImplementation((_cmd, args) => {
|
|
124
|
-
const argv = args as string[];
|
|
125
|
-
if (argv[0] === 'ls-remote') return 'abcdef1234567890\tHEAD\n';
|
|
126
|
-
throw new Error(`unexpected command: ${argv.join(' ')}`);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
const firstModule = await loadModule();
|
|
130
|
-
await firstModule.resolveLatest(`https://example.test/repo.git#${installedSha}`, '1.0.0', {
|
|
131
|
-
forceRefresh: true,
|
|
132
|
-
});
|
|
133
|
-
|
|
134
|
-
vi.mocked(execFileSync).mockReset();
|
|
135
|
-
const secondModule = await loadModule();
|
|
136
|
-
const cached = await secondModule.resolveLatest(
|
|
137
|
-
`https://example.test/repo.git#${installedSha}`,
|
|
138
|
-
'1.0.0',
|
|
139
|
-
);
|
|
140
|
-
|
|
141
|
-
expect(cached).toMatchObject({
|
|
142
|
-
transport: 'git',
|
|
143
|
-
current: installedSha,
|
|
144
|
-
latest: 'abcdef1234567890',
|
|
145
|
-
updateAvailable: true,
|
|
146
|
-
});
|
|
147
|
-
expect(vi.mocked(execFileSync)).not.toHaveBeenCalled();
|
|
148
|
-
});
|
|
149
|
-
});
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
// @vitest-environment node
|
|
2
|
-
/**
|
|
3
|
-
* Regression (Codex P1 follow-up on hq-cli#273): `hq packs update` un-wires a
|
|
4
|
-
* pack's existing contributions BEFORE calling `installPack()` to re-wire
|
|
5
|
-
* them. The Cognito-only `HQ_API_KEY` fail-closed gate added for `hq install`
|
|
6
|
-
* must live ONLY at that top-level CLI route (pkg-install.ts) — NOT inside
|
|
7
|
-
* the shared `installPack()` primitive `hq packs update` also calls. If it
|
|
8
|
-
* lived inside `installPack()`, a vault-key session would un-wire a pack and
|
|
9
|
-
* then throw before re-installing it, leaving the pack unwired with no
|
|
10
|
-
* symlinks and no rollback.
|
|
11
|
-
*/
|
|
12
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
13
|
-
import * as os from 'os';
|
|
14
|
-
import { Command } from 'commander';
|
|
15
|
-
|
|
16
|
-
const { listInstalledPacks, unwirePack, installPack, resolveLatest } = vi.hoisted(() => ({
|
|
17
|
-
listInstalledPacks: vi.fn(),
|
|
18
|
-
unwirePack: vi.fn(() => ({ unlinked: [], skipped: [] })),
|
|
19
|
-
installPack: vi.fn(async () => {}),
|
|
20
|
-
resolveLatest: vi.fn(async () => ({
|
|
21
|
-
transport: 'git',
|
|
22
|
-
current: 'aaa',
|
|
23
|
-
latest: 'bbb',
|
|
24
|
-
updateAvailable: true,
|
|
25
|
-
})),
|
|
26
|
-
}));
|
|
27
|
-
|
|
28
|
-
vi.mock('./pack-install.js', () => ({
|
|
29
|
-
classify: vi.fn(() => 'git'),
|
|
30
|
-
resolveLatest,
|
|
31
|
-
resolveLatestMarketplace: vi.fn(),
|
|
32
|
-
runScanPackages: vi.fn(),
|
|
33
|
-
installPack,
|
|
34
|
-
}));
|
|
35
|
-
|
|
36
|
-
vi.mock('../utils/pack-contributions.js', () => ({
|
|
37
|
-
contributionLinks: vi.fn(() => []),
|
|
38
|
-
linkStatus: vi.fn(() => 'live'),
|
|
39
|
-
listInstalledPacks,
|
|
40
|
-
findDependentPacks: vi.fn(() => []),
|
|
41
|
-
readPackManifest: vi.fn(() => ({ manifest: null })),
|
|
42
|
-
unwirePack,
|
|
43
|
-
unwirePackMcp: vi.fn(),
|
|
44
|
-
readHqVersion: vi.fn(() => '15.0.0'),
|
|
45
|
-
readRecommendedPackages: vi.fn(() => []),
|
|
46
|
-
packagesDir: vi.fn((root: string) => `${root}/core/packages`),
|
|
47
|
-
}));
|
|
48
|
-
|
|
49
|
-
// resolveRoot() falls back to findHqRoot() when --hq-root isn't passed; stub
|
|
50
|
-
// it to a real, existing directory so packs.ts never chdir()s into one.
|
|
51
|
-
vi.mock('../utils/manifest.js', () => ({
|
|
52
|
-
findHqRoot: vi.fn(() => os.tmpdir()),
|
|
53
|
-
}));
|
|
54
|
-
|
|
55
|
-
import { registerPacksCommand } from './packs.js';
|
|
56
|
-
|
|
57
|
-
async function runUpdateCli(...args: string[]): Promise<void> {
|
|
58
|
-
const program = new Command();
|
|
59
|
-
program.exitOverride();
|
|
60
|
-
registerPacksCommand(program);
|
|
61
|
-
await program.parseAsync(['packs', 'update', ...args], { from: 'user' });
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
describe('hq packs update leaves no pack unwired under HQ_API_KEY', () => {
|
|
65
|
-
beforeEach(() => {
|
|
66
|
-
listInstalledPacks.mockReturnValue([
|
|
67
|
-
{
|
|
68
|
-
name: 'hq-pack-demo',
|
|
69
|
-
dir: '/tmp/hq/core/packages/hq-pack-demo',
|
|
70
|
-
manifest: {
|
|
71
|
-
name: 'hq-pack-demo',
|
|
72
|
-
version: '1.0.0',
|
|
73
|
-
source: 'https://example.com/demo.git#aaa',
|
|
74
|
-
contributes: { skills: ['demo'] },
|
|
75
|
-
},
|
|
76
|
-
},
|
|
77
|
-
]);
|
|
78
|
-
unwirePack.mockClear();
|
|
79
|
-
installPack.mockClear();
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
afterEach(() => {
|
|
83
|
-
delete process.env.HQ_API_KEY;
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
it('still calls installPack after unwirePack when HQ_API_KEY is set', async () => {
|
|
87
|
-
process.env.HQ_API_KEY = 'hqk_probe';
|
|
88
|
-
await runUpdateCli('hq-pack-demo', '--json');
|
|
89
|
-
|
|
90
|
-
expect(unwirePack).toHaveBeenCalledTimes(1);
|
|
91
|
-
// The regression: installPack must run to completion right after
|
|
92
|
-
// unwirePack -- it must NOT throw due to a Cognito-only gate, which would
|
|
93
|
-
// leave the pack unwired with nothing re-installed in its place.
|
|
94
|
-
expect(installPack).toHaveBeenCalledTimes(1);
|
|
95
|
-
const unwireOrder = unwirePack.mock.invocationCallOrder[0];
|
|
96
|
-
const installOrder = installPack.mock.invocationCallOrder[0];
|
|
97
|
-
expect(unwireOrder).toBeLessThan(installOrder);
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('still updates without HQ_API_KEY set (baseline, unchanged behavior)', async () => {
|
|
101
|
-
await runUpdateCli('hq-pack-demo', '--json');
|
|
102
|
-
expect(unwirePack).toHaveBeenCalledTimes(1);
|
|
103
|
-
expect(installPack).toHaveBeenCalledTimes(1);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* packs list view tests — guards the machine-facing `hq packs list --json`
|
|
3
|
-
* shape consumed by the HQ Sync menubar app.
|
|
4
|
-
*
|
|
5
|
-
* US-005: `buildInstalledView` must surface a pack's `initialization` block so
|
|
6
|
-
* the desktop "Installed" panel can render its get-started affordance. The
|
|
7
|
-
* field is OPTIONAL — absent on legacy packs, in which case it is omitted from
|
|
8
|
-
* the view entirely (no null noise in the JSON).
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { describe, it, expect } from 'vitest';
|
|
12
|
-
import { buildInstalledView } from './packs.js';
|
|
13
|
-
import type {
|
|
14
|
-
InstalledPack,
|
|
15
|
-
InstalledPackManifest,
|
|
16
|
-
} from '../utils/pack-contributions.js';
|
|
17
|
-
|
|
18
|
-
// ---------------------------------------------------------------------------
|
|
19
|
-
// Fixtures
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
|
|
22
|
-
function fakeInstalledPack(
|
|
23
|
-
manifestOverrides: Partial<InstalledPackManifest>,
|
|
24
|
-
): InstalledPack {
|
|
25
|
-
const manifest: InstalledPackManifest = {
|
|
26
|
-
name: 'hq-pack-test',
|
|
27
|
-
version: '1.0.0',
|
|
28
|
-
publisher: '@indigoai-us',
|
|
29
|
-
access: 'public',
|
|
30
|
-
requires: { hqCore: '>=12.0.0' },
|
|
31
|
-
contributes: { skills: ['email-assistant'] },
|
|
32
|
-
...manifestOverrides,
|
|
33
|
-
} as InstalledPackManifest;
|
|
34
|
-
return {
|
|
35
|
-
name: 'hq-pack-test',
|
|
36
|
-
// A non-existent dir is fine — contributionLinks classifies missing links
|
|
37
|
-
// without throwing, and we never check updates (no network).
|
|
38
|
-
dir: '/tmp/does-not-exist/hq-pack-test',
|
|
39
|
-
manifest,
|
|
40
|
-
};
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// `checkUpdates: false` keeps the call offline (no resolveLatest network hop).
|
|
44
|
-
function build(pack: InstalledPack) {
|
|
45
|
-
return buildInstalledView('/tmp/does-not-exist', '12.0.0', pack, new Set(), false);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// Tests
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
describe('buildInstalledView: initialization surfacing (US-005)', () => {
|
|
53
|
-
it('surfaces the initialization block when the pack declares one', () => {
|
|
54
|
-
const view = build(
|
|
55
|
-
fakeInstalledPack({
|
|
56
|
-
initialization: { entrypoint: 'email-assistant', prompt: 'hi there' },
|
|
57
|
-
}),
|
|
58
|
-
);
|
|
59
|
-
expect(view.initialization).toEqual({
|
|
60
|
-
entrypoint: 'email-assistant',
|
|
61
|
-
prompt: 'hi there',
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
it('surfaces initialization with no prompt (entrypoint only)', () => {
|
|
66
|
-
const view = build(
|
|
67
|
-
fakeInstalledPack({ initialization: { entrypoint: '/email-assistant' } }),
|
|
68
|
-
);
|
|
69
|
-
expect(view.initialization).toEqual({ entrypoint: '/email-assistant' });
|
|
70
|
-
expect(view.initialization).not.toHaveProperty('prompt');
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('omits the initialization field entirely when the pack declares none', () => {
|
|
74
|
-
const view = build(fakeInstalledPack({}));
|
|
75
|
-
expect(view.initialization).toBeUndefined();
|
|
76
|
-
expect(Object.prototype.hasOwnProperty.call(view, 'initialization')).toBe(false);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
it('tolerates a malformed initialization block by omitting the field', () => {
|
|
80
|
-
const view = build(
|
|
81
|
-
fakeInstalledPack({
|
|
82
|
-
// An empty entrypoint is not a usable get-started target.
|
|
83
|
-
initialization: { entrypoint: ' ' },
|
|
84
|
-
}),
|
|
85
|
-
);
|
|
86
|
-
expect(view.initialization).toBeUndefined();
|
|
87
|
-
});
|
|
88
|
-
});
|