@indigoai-us/hq-cli 5.3.1 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/bin/hq-auth-refresh.d.ts +13 -0
  2. package/dist/bin/hq-auth-refresh.d.ts.map +1 -0
  3. package/dist/bin/hq-auth-refresh.js +27 -0
  4. package/dist/bin/hq-auth-refresh.js.map +1 -0
  5. package/dist/commands/auth.d.ts +17 -13
  6. package/dist/commands/auth.d.ts.map +1 -1
  7. package/dist/commands/auth.js +83 -238
  8. package/dist/commands/auth.js.map +1 -1
  9. package/dist/commands/cloud.d.ts +3 -12
  10. package/dist/commands/cloud.d.ts.map +1 -1
  11. package/dist/commands/cloud.js +55 -212
  12. package/dist/commands/cloud.js.map +1 -1
  13. package/dist/commands/login.d.ts +6 -0
  14. package/dist/commands/login.d.ts.map +1 -0
  15. package/dist/commands/login.js +25 -0
  16. package/dist/commands/login.js.map +1 -0
  17. package/dist/commands/logout.d.ts +6 -0
  18. package/dist/commands/logout.d.ts.map +1 -0
  19. package/dist/commands/logout.js +21 -0
  20. package/dist/commands/logout.js.map +1 -0
  21. package/dist/commands/pkg-install.d.ts +17 -0
  22. package/dist/commands/pkg-install.d.ts.map +1 -0
  23. package/dist/commands/pkg-install.js +144 -0
  24. package/dist/commands/pkg-install.js.map +1 -0
  25. package/dist/commands/pkg-list.d.ts +8 -0
  26. package/dist/commands/pkg-list.d.ts.map +1 -0
  27. package/dist/commands/pkg-list.js +70 -0
  28. package/dist/commands/pkg-list.js.map +1 -0
  29. package/dist/commands/pkg-remove.d.ts +10 -0
  30. package/dist/commands/pkg-remove.d.ts.map +1 -0
  31. package/dist/commands/pkg-remove.js +53 -0
  32. package/dist/commands/pkg-remove.js.map +1 -0
  33. package/dist/commands/pkg-update.d.ts +9 -0
  34. package/dist/commands/pkg-update.d.ts.map +1 -0
  35. package/dist/commands/pkg-update.js +124 -0
  36. package/dist/commands/pkg-update.js.map +1 -0
  37. package/dist/commands/team-sync.d.ts +14 -0
  38. package/dist/commands/team-sync.d.ts.map +1 -0
  39. package/dist/commands/team-sync.js +422 -0
  40. package/dist/commands/team-sync.js.map +1 -0
  41. package/dist/commands/whoami.d.ts +6 -0
  42. package/dist/commands/whoami.d.ts.map +1 -0
  43. package/dist/commands/whoami.js +29 -0
  44. package/dist/commands/whoami.js.map +1 -0
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.js +33 -13
  47. package/dist/index.js.map +1 -1
  48. package/dist/strategies/merge.js +2 -2
  49. package/dist/strategies/merge.js.map +1 -1
  50. package/dist/utils/auth.d.ts +27 -0
  51. package/dist/utils/auth.d.ts.map +1 -0
  52. package/dist/utils/auth.js +155 -0
  53. package/dist/utils/auth.js.map +1 -0
  54. package/dist/utils/cognito-session.d.ts +35 -0
  55. package/dist/utils/cognito-session.d.ts.map +1 -0
  56. package/dist/utils/cognito-session.js +72 -0
  57. package/dist/utils/cognito-session.js.map +1 -0
  58. package/dist/utils/git.js +1 -1
  59. package/dist/utils/git.js.map +1 -1
  60. package/dist/utils/hq-root.d.ts +10 -0
  61. package/dist/utils/hq-root.d.ts.map +1 -0
  62. package/dist/utils/hq-root.js +22 -0
  63. package/dist/utils/hq-root.js.map +1 -0
  64. package/dist/utils/integrity.d.ts +14 -0
  65. package/dist/utils/integrity.d.ts.map +1 -0
  66. package/dist/utils/integrity.js +40 -0
  67. package/dist/utils/integrity.js.map +1 -0
  68. package/dist/utils/manifest.d.ts.map +1 -1
  69. package/dist/utils/manifest.js +2 -5
  70. package/dist/utils/manifest.js.map +1 -1
  71. package/dist/utils/registry-client.d.ts +65 -0
  72. package/dist/utils/registry-client.d.ts.map +1 -0
  73. package/dist/utils/registry-client.js +102 -0
  74. package/dist/utils/registry-client.js.map +1 -0
  75. package/dist/utils/registry.d.ts +33 -0
  76. package/dist/utils/registry.d.ts.map +1 -0
  77. package/dist/utils/registry.js +58 -0
  78. package/dist/utils/registry.js.map +1 -0
  79. package/dist/utils/token-store.d.ts +28 -0
  80. package/dist/utils/token-store.d.ts.map +1 -0
  81. package/dist/utils/token-store.js +68 -0
  82. package/dist/utils/token-store.js.map +1 -0
  83. package/package.json +35 -45
  84. package/src/bin/hq-auth-refresh.ts +32 -0
  85. package/src/commands/add.ts +74 -0
  86. package/src/commands/auth.ts +153 -0
  87. package/src/commands/cloud.ts +125 -0
  88. package/src/commands/list.ts +66 -0
  89. package/src/commands/login.ts +29 -0
  90. package/src/commands/logout.ts +25 -0
  91. package/src/commands/pkg-install.ts +181 -0
  92. package/src/commands/pkg-list.ts +98 -0
  93. package/src/commands/pkg-remove.ts +71 -0
  94. package/src/commands/pkg-update.ts +189 -0
  95. package/src/commands/sync.ts +149 -0
  96. package/src/commands/team-sync.ts +629 -0
  97. package/src/commands/update.ts +71 -0
  98. package/src/commands/whoami.ts +38 -0
  99. package/src/index.ts +72 -0
  100. package/src/schemas/hq-package.schema.json +137 -0
  101. package/src/strategies/link.ts +62 -0
  102. package/src/strategies/merge.ts +142 -0
  103. package/src/types.ts +47 -0
  104. package/src/utils/auth.ts +193 -0
  105. package/src/utils/cognito-session.ts +94 -0
  106. package/src/utils/git.ts +74 -0
  107. package/src/utils/hq-root.ts +27 -0
  108. package/src/utils/integrity.ts +54 -0
  109. package/src/utils/manifest.ts +109 -0
  110. package/src/utils/registry-client.ts +204 -0
  111. package/src/utils/registry.ts +89 -0
  112. package/src/utils/token-store.ts +83 -0
  113. package/tsconfig.json +8 -0
  114. package/dist/commands/cloud-setup.d.ts +0 -19
  115. package/dist/commands/cloud-setup.d.ts.map +0 -1
  116. package/dist/commands/cloud-setup.js +0 -206
  117. package/dist/commands/cloud-setup.js.map +0 -1
  118. package/dist/commands/initial-upload.d.ts +0 -67
  119. package/dist/commands/initial-upload.d.ts.map +0 -1
  120. package/dist/commands/initial-upload.js +0 -205
  121. package/dist/commands/initial-upload.js.map +0 -1
  122. package/dist/sync-worker.d.ts +0 -11
  123. package/dist/sync-worker.d.ts.map +0 -1
  124. package/dist/sync-worker.js +0 -77
  125. package/dist/sync-worker.js.map +0 -1
  126. package/dist/utils/api-client.d.ts +0 -26
  127. package/dist/utils/api-client.d.ts.map +0 -1
  128. package/dist/utils/api-client.js +0 -87
  129. package/dist/utils/api-client.js.map +0 -1
  130. package/dist/utils/credentials.d.ts +0 -44
  131. package/dist/utils/credentials.d.ts.map +0 -1
  132. package/dist/utils/credentials.js +0 -101
  133. package/dist/utils/credentials.js.map +0 -1
  134. package/dist/utils/sync.d.ts +0 -125
  135. package/dist/utils/sync.d.ts.map +0 -1
  136. package/dist/utils/sync.js +0 -291
  137. package/dist/utils/sync.js.map +0 -1
@@ -0,0 +1,70 @@
1
+ /**
2
+ * hq packages list — show installed packages and available entitlements (US-005)
3
+ *
4
+ * Graceful offline: if registry is unreachable, show cached data with a note.
5
+ */
6
+ import chalk from 'chalk';
7
+ import { findHqRoot } from '../utils/hq-root.js';
8
+ import { readRegistry } from '../utils/registry.js';
9
+ import { loadToken, isTokenExpired } from '../utils/token-store.js';
10
+ import { getRegistryUrl, RegistryClient, } from '../utils/registry-client.js';
11
+ export function registerPackageListCommand(parent) {
12
+ parent
13
+ .command('list')
14
+ .alias('ls')
15
+ .description('List installed and available packages')
16
+ .action(async () => {
17
+ try {
18
+ await listPackages();
19
+ }
20
+ catch (error) {
21
+ console.error(chalk.red('List failed:'), error instanceof Error ? error.message : 'Unknown error');
22
+ process.exit(1);
23
+ }
24
+ });
25
+ }
26
+ async function listPackages() {
27
+ const hqRoot = findHqRoot();
28
+ const installed = readRegistry(hqRoot);
29
+ // Print installed packages
30
+ if (installed.length > 0) {
31
+ console.log(chalk.bold('Installed packages:\n'));
32
+ for (const pkg of installed) {
33
+ const scope = pkg.scope ? chalk.dim(` (${pkg.scope})`) : '';
34
+ console.log(` ${chalk.green(pkg.slug)}@${pkg.version}${scope}`);
35
+ console.log(chalk.dim(` Installed: ${pkg.installed_at.slice(0, 10)} Updated: ${pkg.updated_at.slice(0, 10)}`));
36
+ }
37
+ console.log();
38
+ }
39
+ else {
40
+ console.log(chalk.dim('No packages installed.\n'));
41
+ }
42
+ // Try to show available (but not installed) packages from entitlements
43
+ let entitlements = [];
44
+ let offline = false;
45
+ try {
46
+ const token = await loadToken();
47
+ if (token && !isTokenExpired(token)) {
48
+ const registryUrl = getRegistryUrl();
49
+ const client = new RegistryClient(registryUrl, token.clerk_session_token);
50
+ const result = await client.getMyEntitlements();
51
+ entitlements = result.entitlements;
52
+ }
53
+ }
54
+ catch {
55
+ offline = true;
56
+ }
57
+ const installedSlugs = new Set(installed.map((p) => p.slug));
58
+ const available = entitlements.filter((e) => !installedSlugs.has(e.slug));
59
+ if (available.length > 0) {
60
+ console.log(chalk.bold('Available (not installed):\n'));
61
+ for (const ent of available) {
62
+ console.log(` ${chalk.cyan(ent.slug)} ${chalk.dim(`[${ent.tier}]`)} ${chalk.yellow('available')}`);
63
+ }
64
+ console.log(chalk.dim('\nRun "hq packages install <slug>" to install.\n'));
65
+ }
66
+ if (offline) {
67
+ console.log(chalk.yellow('Note: Could not reach registry — showing cached data only.'));
68
+ }
69
+ }
70
+ //# sourceMappingURL=pkg-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-list.js","sourceRoot":"","sources":["../../src/commands/pkg-list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * hq packages remove <slug> — archive and unregister a package (US-005)
3
+ *
4
+ * 1. Archive packages/installed/<slug>/ to packages/.archive/<slug>-<timestamp>/
5
+ * 2. Remove entry from packages/registry.yaml
6
+ * 3. Print next-step message
7
+ */
8
+ import { Command } from 'commander';
9
+ export declare function registerPackageRemoveCommand(parent: Command): void;
10
+ //# sourceMappingURL=pkg-remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-remove.d.ts","sourceRoot":"","sources":["../../src/commands/pkg-remove.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAelE"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * hq packages remove <slug> — archive and unregister a package (US-005)
3
+ *
4
+ * 1. Archive packages/installed/<slug>/ to packages/.archive/<slug>-<timestamp>/
5
+ * 2. Remove entry from packages/registry.yaml
6
+ * 3. Print next-step message
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import chalk from 'chalk';
11
+ import { findHqRoot } from '../utils/hq-root.js';
12
+ import { removeFromRegistry, readRegistry } from '../utils/registry.js';
13
+ export function registerPackageRemoveCommand(parent) {
14
+ parent
15
+ .command('remove <slug>')
16
+ .description('Remove an installed package (archives it first)')
17
+ .action(async (slug) => {
18
+ try {
19
+ await removePackage(slug);
20
+ }
21
+ catch (error) {
22
+ console.error(chalk.red('Remove failed:'), error instanceof Error ? error.message : 'Unknown error');
23
+ process.exit(1);
24
+ }
25
+ });
26
+ }
27
+ async function removePackage(slug) {
28
+ const hqRoot = findHqRoot();
29
+ const installDir = path.resolve(hqRoot, 'packages', 'installed', slug);
30
+ // Verify it is actually installed
31
+ const entries = readRegistry(hqRoot);
32
+ const entry = entries.find((e) => e.slug === slug);
33
+ if (!entry && !fs.existsSync(installDir)) {
34
+ throw new Error(`Package "${slug}" is not installed.`);
35
+ }
36
+ // 1. Archive
37
+ if (fs.existsSync(installDir)) {
38
+ const timestamp = new Date()
39
+ .toISOString()
40
+ .replace(/[:.]/g, '-')
41
+ .replace('T', '_')
42
+ .slice(0, 19);
43
+ const archiveDir = path.resolve(hqRoot, 'packages', '.archive', `${slug}-${timestamp}`);
44
+ fs.mkdirSync(path.dirname(archiveDir), { recursive: true });
45
+ fs.renameSync(installDir, archiveDir);
46
+ console.log(chalk.dim(`Archived to packages/.archive/${slug}-${timestamp}/`));
47
+ }
48
+ // 2. Remove from registry.yaml
49
+ removeFromRegistry(hqRoot, slug);
50
+ console.log(chalk.green(`\nRemoved ${slug}.`));
51
+ console.log(chalk.cyan('Run /package-remove ' + slug + ' in Claude to clean up merged content.'));
52
+ }
53
+ //# sourceMappingURL=pkg-remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-remove.js","sourceRoot":"","sources":["../../src/commands/pkg-remove.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,4BAA4B,CAAC,MAAe;IAC1D,MAAM;SACH,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE;QAC7B,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAC3B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CACzD,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAEvE,kCAAkC;IAClC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,YAAY,IAAI,qBAAqB,CAAC,CAAC;IACzD,CAAC;IAED,aAAa;IACb,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE;aACzB,WAAW,EAAE;aACb,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;aACjB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAC7B,MAAM,EACN,UAAU,EACV,UAAU,EACV,GAAG,IAAI,IAAI,SAAS,EAAE,CACvB,CAAC;QACF,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,IAAI,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,+BAA+B;IAC/B,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC;IAC/C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CACR,sBAAsB,GAAG,IAAI,GAAG,wCAAwC,CACzE,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * hq packages update [slug] — check for and apply package updates (US-005)
3
+ *
4
+ * If no slug: check all installed packages for updates.
5
+ * If slug given: update only that package.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function registerPackageUpdateCommand(parent: Command): void;
9
+ //# sourceMappingURL=pkg-update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-update.d.ts","sourceRoot":"","sources":["../../src/commands/pkg-update.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAelE"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * hq packages update [slug] — check for and apply package updates (US-005)
3
+ *
4
+ * If no slug: check all installed packages for updates.
5
+ * If slug given: update only that package.
6
+ */
7
+ import * as fs from 'fs';
8
+ import * as os from 'os';
9
+ import * as path from 'path';
10
+ import * as yaml from 'js-yaml';
11
+ import { execSync } from 'child_process';
12
+ import chalk from 'chalk';
13
+ import { getAuthToken } from '../utils/auth.js';
14
+ import { findHqRoot } from '../utils/hq-root.js';
15
+ import { getRegistryUrl, RegistryClient, } from '../utils/registry-client.js';
16
+ import { verifySha256, verifyRsaSignature } from '../utils/integrity.js';
17
+ import { readRegistry, addToRegistry, } from '../utils/registry.js';
18
+ export function registerPackageUpdateCommand(parent) {
19
+ parent
20
+ .command('update [slug]')
21
+ .description('Check for and apply package updates')
22
+ .action(async (slug) => {
23
+ try {
24
+ await updatePackages(slug);
25
+ }
26
+ catch (error) {
27
+ console.error(chalk.red('Update failed:'), error instanceof Error ? error.message : 'Unknown error');
28
+ process.exit(1);
29
+ }
30
+ });
31
+ }
32
+ async function updatePackages(slug) {
33
+ const hqRoot = findHqRoot();
34
+ const entries = readRegistry(hqRoot);
35
+ if (entries.length === 0) {
36
+ console.log('No packages installed. Use "hq packages install <slug>" to install one.');
37
+ return;
38
+ }
39
+ const token = await getAuthToken();
40
+ const registryUrl = getRegistryUrl();
41
+ const client = new RegistryClient(registryUrl, token.clerk_session_token);
42
+ const toCheck = slug
43
+ ? entries.filter((e) => e.slug === slug)
44
+ : entries;
45
+ if (slug && toCheck.length === 0) {
46
+ throw new Error(`Package "${slug}" is not installed.`);
47
+ }
48
+ let updatedCount = 0;
49
+ for (const entry of toCheck) {
50
+ try {
51
+ const pkgInfo = await client.getPackage(entry.slug);
52
+ const latestVersion = pkgInfo.package.latest_version;
53
+ if (latestVersion === entry.version) {
54
+ console.log(chalk.dim(`${entry.slug}@${entry.version} — up to date`));
55
+ continue;
56
+ }
57
+ console.log(chalk.yellow(`${entry.slug}: ${entry.version} → ${latestVersion}`));
58
+ // Download new version
59
+ const download = await client.getDownloadUrl(entry.slug, latestVersion);
60
+ const tmpFile = path.resolve(os.tmpdir(), `hq-pkg-${entry.slug}-${Date.now()}.tar.gz`);
61
+ try {
62
+ const response = await fetch(download.url, {
63
+ signal: AbortSignal.timeout(120_000),
64
+ });
65
+ if (!response.ok) {
66
+ throw new Error(`Download failed (${response.status})`);
67
+ }
68
+ const buffer = Buffer.from(await response.arrayBuffer());
69
+ fs.writeFileSync(tmpFile, buffer);
70
+ // Verify SHA256
71
+ const hashValid = await verifySha256(tmpFile, download.sha256);
72
+ if (!hashValid) {
73
+ throw new Error('SHA256 hash mismatch');
74
+ }
75
+ // Verify RSA signature (if provided)
76
+ if (download.signature) {
77
+ const sigValid = verifyRsaSignature(download.sha256, download.signature);
78
+ if (!sigValid) {
79
+ console.warn(chalk.yellow(` Warning: RSA signature verification failed for ${entry.slug}. Proceeding with SHA256-only.`));
80
+ }
81
+ }
82
+ // Extract over existing
83
+ const installDir = path.resolve(hqRoot, 'packages', 'installed', entry.slug);
84
+ if (fs.existsSync(installDir)) {
85
+ fs.rmSync(installDir, { recursive: true, force: true });
86
+ }
87
+ fs.mkdirSync(installDir, { recursive: true });
88
+ execSync(`tar -xzf "${tmpFile}" -C "${installDir}"`, {
89
+ stdio: 'pipe',
90
+ });
91
+ // Validate package.yaml slug
92
+ const packageYamlPath = path.resolve(installDir, 'package.yaml');
93
+ if (fs.existsSync(packageYamlPath)) {
94
+ const pkgContent = fs.readFileSync(packageYamlPath, 'utf-8');
95
+ const pkgMeta = yaml.load(pkgContent);
96
+ if (pkgMeta?.slug && pkgMeta.slug !== entry.slug) {
97
+ fs.rmSync(installDir, { recursive: true, force: true });
98
+ throw new Error(`Package slug mismatch: expected "${entry.slug}", got "${pkgMeta.slug}"`);
99
+ }
100
+ }
101
+ // Update registry entry — preserve scope
102
+ const now = new Date().toISOString();
103
+ const updated = {
104
+ ...entry,
105
+ version: latestVersion,
106
+ updated_at: now,
107
+ };
108
+ addToRegistry(hqRoot, updated);
109
+ console.log(chalk.green(` Updated ${entry.slug} to ${latestVersion}`));
110
+ updatedCount++;
111
+ }
112
+ finally {
113
+ if (fs.existsSync(tmpFile)) {
114
+ fs.unlinkSync(tmpFile);
115
+ }
116
+ }
117
+ }
118
+ catch (error) {
119
+ console.error(chalk.red(` Error updating ${entry.slug}:`), error instanceof Error ? error.message : 'Unknown error');
120
+ }
121
+ }
122
+ console.log(`\n${updatedCount} package(s) updated${updatedCount > 0 ? '.' : ' — everything is current.'}`);
123
+ }
124
+ //# sourceMappingURL=pkg-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg-update.js","sourceRoot":"","sources":["../../src/commands/pkg-update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * hq team-sync — pull latest team content with entitlement refresh (US-006)
3
+ *
4
+ * For each companies/{slug}/ directory that has a team.json:
5
+ * 1. Re-authenticate if token is expired (Cognito → device code flow)
6
+ * 2. Fetch current entitlements from API and update sparse checkout if changed
7
+ * 3. Configure git credentials for the pull
8
+ * 4. Git pull latest content
9
+ * 5. Report what changed (new, updated, removed files)
10
+ * 6. Gracefully handle conflicts (warn, don't force overwrite)
11
+ */
12
+ import { Command } from 'commander';
13
+ export declare function registerTeamSyncCommand(program: Command): void;
14
+ //# sourceMappingURL=team-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-sync.d.ts","sourceRoot":"","sources":["../../src/commands/team-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4ZpC,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyM9D"}