@indigoai-us/hq-cli 5.3.1 → 5.4.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 (141) 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/onboard.d.ts +23 -0
  22. package/dist/commands/onboard.d.ts.map +1 -0
  23. package/dist/commands/onboard.js +142 -0
  24. package/dist/commands/onboard.js.map +1 -0
  25. package/dist/commands/pkg-install.d.ts +17 -0
  26. package/dist/commands/pkg-install.d.ts.map +1 -0
  27. package/dist/commands/pkg-install.js +144 -0
  28. package/dist/commands/pkg-install.js.map +1 -0
  29. package/dist/commands/pkg-list.d.ts +8 -0
  30. package/dist/commands/pkg-list.d.ts.map +1 -0
  31. package/dist/commands/pkg-list.js +70 -0
  32. package/dist/commands/pkg-list.js.map +1 -0
  33. package/dist/commands/pkg-remove.d.ts +10 -0
  34. package/dist/commands/pkg-remove.d.ts.map +1 -0
  35. package/dist/commands/pkg-remove.js +53 -0
  36. package/dist/commands/pkg-remove.js.map +1 -0
  37. package/dist/commands/pkg-update.d.ts +9 -0
  38. package/dist/commands/pkg-update.d.ts.map +1 -0
  39. package/dist/commands/pkg-update.js +124 -0
  40. package/dist/commands/pkg-update.js.map +1 -0
  41. package/dist/commands/team-sync.d.ts +14 -0
  42. package/dist/commands/team-sync.d.ts.map +1 -0
  43. package/dist/commands/team-sync.js +422 -0
  44. package/dist/commands/team-sync.js.map +1 -0
  45. package/dist/commands/whoami.d.ts +6 -0
  46. package/dist/commands/whoami.d.ts.map +1 -0
  47. package/dist/commands/whoami.js +29 -0
  48. package/dist/commands/whoami.js.map +1 -0
  49. package/dist/index.d.ts +1 -1
  50. package/dist/index.js +33 -13
  51. package/dist/index.js.map +1 -1
  52. package/dist/strategies/merge.js +2 -2
  53. package/dist/strategies/merge.js.map +1 -1
  54. package/dist/utils/auth.d.ts +27 -0
  55. package/dist/utils/auth.d.ts.map +1 -0
  56. package/dist/utils/auth.js +155 -0
  57. package/dist/utils/auth.js.map +1 -0
  58. package/dist/utils/cognito-session.d.ts +35 -0
  59. package/dist/utils/cognito-session.d.ts.map +1 -0
  60. package/dist/utils/cognito-session.js +72 -0
  61. package/dist/utils/cognito-session.js.map +1 -0
  62. package/dist/utils/git.js +1 -1
  63. package/dist/utils/git.js.map +1 -1
  64. package/dist/utils/hq-root.d.ts +10 -0
  65. package/dist/utils/hq-root.d.ts.map +1 -0
  66. package/dist/utils/hq-root.js +22 -0
  67. package/dist/utils/hq-root.js.map +1 -0
  68. package/dist/utils/integrity.d.ts +14 -0
  69. package/dist/utils/integrity.d.ts.map +1 -0
  70. package/dist/utils/integrity.js +40 -0
  71. package/dist/utils/integrity.js.map +1 -0
  72. package/dist/utils/manifest.d.ts.map +1 -1
  73. package/dist/utils/manifest.js +2 -5
  74. package/dist/utils/manifest.js.map +1 -1
  75. package/dist/utils/registry-client.d.ts +65 -0
  76. package/dist/utils/registry-client.d.ts.map +1 -0
  77. package/dist/utils/registry-client.js +102 -0
  78. package/dist/utils/registry-client.js.map +1 -0
  79. package/dist/utils/registry.d.ts +33 -0
  80. package/dist/utils/registry.d.ts.map +1 -0
  81. package/dist/utils/registry.js +58 -0
  82. package/dist/utils/registry.js.map +1 -0
  83. package/dist/utils/token-store.d.ts +28 -0
  84. package/dist/utils/token-store.d.ts.map +1 -0
  85. package/dist/utils/token-store.js +68 -0
  86. package/dist/utils/token-store.js.map +1 -0
  87. package/package.json +35 -45
  88. package/src/bin/hq-auth-refresh.ts +32 -0
  89. package/src/commands/add.ts +74 -0
  90. package/src/commands/auth.ts +153 -0
  91. package/src/commands/cloud.ts +125 -0
  92. package/src/commands/list.ts +66 -0
  93. package/src/commands/login.ts +29 -0
  94. package/src/commands/logout.ts +25 -0
  95. package/src/commands/pkg-install.ts +181 -0
  96. package/src/commands/pkg-list.ts +98 -0
  97. package/src/commands/pkg-remove.ts +71 -0
  98. package/src/commands/pkg-update.ts +189 -0
  99. package/src/commands/sync.ts +149 -0
  100. package/src/commands/team-sync.ts +629 -0
  101. package/src/commands/update.ts +71 -0
  102. package/src/commands/whoami.ts +38 -0
  103. package/src/index.ts +72 -0
  104. package/src/schemas/hq-package.schema.json +137 -0
  105. package/src/strategies/link.ts +62 -0
  106. package/src/strategies/merge.ts +142 -0
  107. package/src/types.ts +47 -0
  108. package/src/utils/auth.ts +193 -0
  109. package/src/utils/cognito-session.ts +94 -0
  110. package/src/utils/git.ts +74 -0
  111. package/src/utils/hq-root.ts +27 -0
  112. package/src/utils/integrity.ts +54 -0
  113. package/src/utils/manifest.ts +109 -0
  114. package/src/utils/registry-client.ts +204 -0
  115. package/src/utils/registry.ts +89 -0
  116. package/src/utils/token-store.ts +83 -0
  117. package/tsconfig.json +8 -0
  118. package/dist/commands/cloud-setup.d.ts +0 -19
  119. package/dist/commands/cloud-setup.d.ts.map +0 -1
  120. package/dist/commands/cloud-setup.js +0 -206
  121. package/dist/commands/cloud-setup.js.map +0 -1
  122. package/dist/commands/initial-upload.d.ts +0 -67
  123. package/dist/commands/initial-upload.d.ts.map +0 -1
  124. package/dist/commands/initial-upload.js +0 -205
  125. package/dist/commands/initial-upload.js.map +0 -1
  126. package/dist/sync-worker.d.ts +0 -11
  127. package/dist/sync-worker.d.ts.map +0 -1
  128. package/dist/sync-worker.js +0 -77
  129. package/dist/sync-worker.js.map +0 -1
  130. package/dist/utils/api-client.d.ts +0 -26
  131. package/dist/utils/api-client.d.ts.map +0 -1
  132. package/dist/utils/api-client.js +0 -87
  133. package/dist/utils/api-client.js.map +0 -1
  134. package/dist/utils/credentials.d.ts +0 -44
  135. package/dist/utils/credentials.d.ts.map +0 -1
  136. package/dist/utils/credentials.js +0 -101
  137. package/dist/utils/credentials.js.map +0 -1
  138. package/dist/utils/sync.d.ts +0 -125
  139. package/dist/utils/sync.d.ts.map +0 -1
  140. package/dist/utils/sync.js +0 -291
  141. package/dist/utils/sync.js.map +0 -1
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Auth token store — manages ~/.hq/auth.json with secure file permissions (US-004)
3
+ */
4
+
5
+ import * as fs from 'fs';
6
+ import * as path from 'path';
7
+ import * as os from 'os';
8
+
9
+ export interface AuthToken {
10
+ clerk_session_token: string;
11
+ user_id: string;
12
+ email: string;
13
+ expires_at: string;
14
+ }
15
+
16
+ const HQ_DIR = path.join(os.homedir(), '.hq');
17
+ const AUTH_FILE = path.join(HQ_DIR, 'auth.json');
18
+
19
+ function ensureHqDir(): void {
20
+ if (!fs.existsSync(HQ_DIR)) {
21
+ fs.mkdirSync(HQ_DIR, { recursive: true, mode: 0o700 });
22
+ }
23
+ }
24
+
25
+ /**
26
+ * Save auth token to ~/.hq/auth.json with 0600 permissions.
27
+ * Token content is never logged or written to stdout.
28
+ */
29
+ export async function saveToken(token: AuthToken): Promise<void> {
30
+ ensureHqDir();
31
+ const content = JSON.stringify(token, null, 2);
32
+ fs.writeFileSync(AUTH_FILE, content, { mode: 0o600 });
33
+ }
34
+
35
+ /**
36
+ * Load auth token from ~/.hq/auth.json.
37
+ * Returns null if file is missing, unreadable, or contains invalid JSON.
38
+ */
39
+ export async function loadToken(): Promise<AuthToken | null> {
40
+ try {
41
+ if (!fs.existsSync(AUTH_FILE)) {
42
+ return null;
43
+ }
44
+ const content = fs.readFileSync(AUTH_FILE, 'utf-8');
45
+ const parsed = JSON.parse(content);
46
+
47
+ // Validate required fields
48
+ if (
49
+ typeof parsed.clerk_session_token !== 'string' ||
50
+ typeof parsed.user_id !== 'string' ||
51
+ typeof parsed.email !== 'string' ||
52
+ typeof parsed.expires_at !== 'string'
53
+ ) {
54
+ return null;
55
+ }
56
+
57
+ return parsed as AuthToken;
58
+ } catch {
59
+ return null;
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Delete the auth token file.
65
+ */
66
+ export async function clearToken(): Promise<void> {
67
+ try {
68
+ if (fs.existsSync(AUTH_FILE)) {
69
+ fs.unlinkSync(AUTH_FILE);
70
+ }
71
+ } catch {
72
+ // Ignore errors — file may already be gone
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Check if a token is expired or within 5 minutes of expiry.
78
+ */
79
+ export function isTokenExpired(token: AuthToken): boolean {
80
+ const expiresAt = new Date(token.expires_at).getTime();
81
+ const bufferMs = 5 * 60 * 1000; // 5 minutes
82
+ return Date.now() >= expiresAt - bufferMs;
83
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src"
6
+ },
7
+ "include": ["src"]
8
+ }
@@ -1,19 +0,0 @@
1
- /**
2
- * hq cloud commands — cloud session management
3
- *
4
- * Subcommands:
5
- * - setup-token: Walk user through generating and storing a Claude OAuth token
6
- * - status: Show cloud readiness (auth state + Claude token state)
7
- * - upload: Initial HQ file upload to cloud storage
8
- */
9
- import { Command } from 'commander';
10
- /**
11
- * Validate a Claude OAuth token string.
12
- * Returns null if valid, or an error message string if invalid.
13
- */
14
- export declare function validateClaudeToken(token: string): string | null;
15
- /**
16
- * Register the "hq cloud" command group with setup-token and status subcommands.
17
- */
18
- export declare function registerCloudSetupCommand(program: Command): void;
19
- //# sourceMappingURL=cloud-setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-setup.d.ts","sourceRoot":"","sources":["../../src/commands/cloud-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiBhE;AAoBD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuLhE"}
@@ -1,206 +0,0 @@
1
- /**
2
- * hq cloud commands — cloud session management
3
- *
4
- * Subcommands:
5
- * - setup-token: Walk user through generating and storing a Claude OAuth token
6
- * - status: Show cloud readiness (auth state + Claude token state)
7
- * - upload: Initial HQ file upload to cloud storage
8
- */
9
- import * as readline from 'readline';
10
- import chalk from 'chalk';
11
- import { readCredentials, isExpired, } from '../utils/credentials.js';
12
- import { apiRequest, getApiUrl } from '../utils/api-client.js';
13
- import { findHqRoot } from '../utils/manifest.js';
14
- import { runInitialUpload } from './initial-upload.js';
15
- /** Minimum token length for basic validation */
16
- const MIN_TOKEN_LENGTH = 20;
17
- /**
18
- * Validate a Claude OAuth token string.
19
- * Returns null if valid, or an error message string if invalid.
20
- */
21
- export function validateClaudeToken(token) {
22
- if (!token || token.trim().length === 0) {
23
- return 'Token cannot be empty.';
24
- }
25
- const trimmed = token.trim();
26
- if (trimmed.length < MIN_TOKEN_LENGTH) {
27
- return `Token is too short (${trimmed.length} chars). Claude tokens are typically much longer. Please check you copied the full token.`;
28
- }
29
- // Reject tokens that look like they contain whitespace in the middle (copy-paste artifacts)
30
- if (/\s/.test(trimmed)) {
31
- return 'Token contains whitespace. Please ensure you copied it correctly without line breaks.';
32
- }
33
- return null;
34
- }
35
- /**
36
- * Prompt the user for input on stdin.
37
- * Returns the entered string (trimmed).
38
- */
39
- function promptUser(question) {
40
- const rl = readline.createInterface({
41
- input: process.stdin,
42
- output: process.stdout,
43
- });
44
- return new Promise((resolve) => {
45
- rl.question(question, (answer) => {
46
- rl.close();
47
- resolve(answer.trim());
48
- });
49
- });
50
- }
51
- /**
52
- * Register the "hq cloud" command group with setup-token and status subcommands.
53
- */
54
- export function registerCloudSetupCommand(program) {
55
- const cloudCmd = program
56
- .command('cloud')
57
- .description('Cloud session management — token setup and status');
58
- // --- hq cloud setup-token ---
59
- cloudCmd
60
- .command('setup-token')
61
- .description('Set up your Claude OAuth token for cloud sessions')
62
- .action(async () => {
63
- try {
64
- // Check auth first (AC #6)
65
- const creds = readCredentials();
66
- if (!creds || isExpired(creds)) {
67
- console.log(chalk.red('Not logged in to HQ Cloud.'));
68
- console.log('Run "hq auth login" first, then try again.');
69
- process.exit(1);
70
- }
71
- console.log(chalk.blue('Claude Token Setup'));
72
- console.log('');
73
- console.log('To launch cloud sessions, HQ needs your Claude OAuth token.');
74
- console.log('This token lets cloud containers run Claude on your behalf.');
75
- console.log('');
76
- console.log(chalk.yellow('Step 1:') + ' Open a terminal and run:');
77
- console.log('');
78
- console.log(chalk.cyan(' claude setup-token'));
79
- console.log('');
80
- console.log(chalk.yellow('Step 2:') + ' Copy the token output and paste it below.');
81
- console.log('');
82
- // Prompt for the token
83
- const token = await promptUser('Paste your Claude token: ');
84
- // Validate format (AC #2)
85
- const validationError = validateClaudeToken(token);
86
- if (validationError) {
87
- console.log('');
88
- console.log(chalk.red('Invalid token: ') + validationError);
89
- process.exit(1);
90
- }
91
- // Send to API (AC #3)
92
- console.log('');
93
- console.log(chalk.dim('Storing token securely...'));
94
- const resp = await apiRequest('POST', '/api/settings/claude-token', { token: token.trim() });
95
- if (!resp.ok) {
96
- console.log(chalk.red('Failed to store token: ') + (resp.error ?? `HTTP ${resp.status}`));
97
- process.exit(1);
98
- }
99
- // Success (AC #4)
100
- console.log('');
101
- console.log(chalk.green('Claude token stored securely.'));
102
- if (resp.data?.setAt) {
103
- console.log(chalk.dim(` Set at: ${resp.data.setAt}`));
104
- }
105
- console.log('');
106
- console.log('You can now launch cloud sessions with "hq cloud" commands.');
107
- }
108
- catch (error) {
109
- console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
110
- process.exit(1);
111
- }
112
- });
113
- // --- hq cloud status ---
114
- cloudCmd
115
- .command('status')
116
- .description('Show cloud readiness — authentication and Claude token status')
117
- .action(async () => {
118
- try {
119
- console.log(chalk.blue('HQ Cloud Status'));
120
- console.log('');
121
- // 1. Auth status
122
- const creds = readCredentials();
123
- if (!creds) {
124
- console.log(` Auth: ${chalk.red('Not logged in')}`);
125
- console.log(` Claude Token: ${chalk.dim('unknown (login first)')}`);
126
- console.log('');
127
- console.log('Run "hq auth login" to get started.');
128
- return;
129
- }
130
- if (isExpired(creds)) {
131
- console.log(` Auth: ${chalk.red('Session expired')}`);
132
- console.log(` Claude Token: ${chalk.dim('unknown (login first)')}`);
133
- console.log('');
134
- console.log('Run "hq auth login" to re-authenticate.');
135
- return;
136
- }
137
- const label = creds.email ?? creds.userId;
138
- console.log(` Auth: ${chalk.green('Logged in')} as ${label}`);
139
- console.log(` API: ${getApiUrl()}`);
140
- // 2. Claude token status (AC #5)
141
- try {
142
- const resp = await apiRequest('GET', '/api/settings/claude-token');
143
- if (resp.ok && resp.data) {
144
- if (resp.data.hasToken) {
145
- console.log(` Claude Token: ${chalk.green('Configured')}`);
146
- if (resp.data.setAt) {
147
- console.log(` Token Set At: ${resp.data.setAt}`);
148
- }
149
- }
150
- else {
151
- console.log(` Claude Token: ${chalk.yellow('Not configured')}`);
152
- console.log('');
153
- console.log('Run "hq cloud setup-token" to configure your Claude token.');
154
- }
155
- }
156
- else {
157
- console.log(` Claude Token: ${chalk.yellow('Could not check')} (API returned ${resp.status})`);
158
- }
159
- }
160
- catch {
161
- console.log(` Claude Token: ${chalk.dim('Could not reach API')}`);
162
- }
163
- console.log('');
164
- }
165
- catch (error) {
166
- console.error(chalk.red('Error:'), error instanceof Error ? error.message : error);
167
- process.exit(1);
168
- }
169
- });
170
- // --- hq cloud upload ---
171
- cloudCmd
172
- .command('upload')
173
- .description('Upload local HQ files to cloud storage (initial setup)')
174
- .option('--hq-root <path>', 'Path to HQ root directory (auto-detected if omitted)')
175
- .option('--on-conflict <action>', 'Action when remote has files: merge, replace, or skip')
176
- .action(async (opts) => {
177
- try {
178
- // Require auth
179
- const creds = readCredentials();
180
- if (!creds || isExpired(creds)) {
181
- console.log(chalk.red('Not logged in to HQ Cloud.'));
182
- console.log('Run "hq auth login" first, then try again.');
183
- process.exit(1);
184
- }
185
- const hqRoot = opts.hqRoot ?? findHqRoot();
186
- console.log(chalk.blue('HQ Cloud — Initial Upload'));
187
- console.log(chalk.dim(` HQ root: ${hqRoot}`));
188
- console.log('');
189
- const onConflict = opts.onConflict;
190
- const result = await runInitialUpload(hqRoot, {
191
- onConflict,
192
- });
193
- if (result.skipped) {
194
- process.exit(0);
195
- }
196
- if (result.failed > 0) {
197
- process.exit(1);
198
- }
199
- }
200
- catch (error) {
201
- console.error(chalk.red('Upload failed:'), error instanceof Error ? error.message : error);
202
- process.exit(1);
203
- }
204
- });
205
- }
206
- //# sourceMappingURL=cloud-setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cloud-setup.js","sourceRoot":"","sources":["../../src/commands/cloud-setup.ts"],"names":[],"mappings":"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"}
@@ -1,67 +0,0 @@
1
- /**
2
- * Initial HQ file upload for first-time cloud setup.
3
- *
4
- * After Clerk auth and Claude token setup, this command uploads the user's
5
- * local HQ files to the cloud so the first session has access to the workspace.
6
- *
7
- * Respects the same ignore rules as sync (shouldIgnore from utils/sync.ts):
8
- * - .git/, node_modules/, .claude/, dist/, cdk.out/, etc.
9
- * - .log files, .env files, .DS_Store, Thumbs.db
10
- *
11
- * Exports `runInitialUpload` so it can be called programmatically from the
12
- * create-hq installer (US-004) or other commands.
13
- */
14
- /** Response shape from GET /api/files/list */
15
- export interface RemoteFileList {
16
- files: string[];
17
- }
18
- /** Result returned by runInitialUpload */
19
- export interface InitialUploadResult {
20
- /** Total local files discovered (after ignore filtering) */
21
- totalFiles: number;
22
- /** Number of files successfully uploaded */
23
- uploaded: number;
24
- /** Number of files that failed to upload */
25
- failed: number;
26
- /** Error messages for failed uploads */
27
- errors: string[];
28
- /** Whether the user chose to skip (remote had files and user declined) */
29
- skipped: boolean;
30
- }
31
- /**
32
- * Prompt the user with a yes/no question on stdin.
33
- * Returns true for 'y'/'yes', false for 'n'/'no'.
34
- * Defaults to defaultAnswer if user just presses Enter.
35
- */
36
- export declare function promptYesNo(question: string, defaultAnswer?: boolean): Promise<boolean>;
37
- /**
38
- * Prompt the user to choose between merge and replace.
39
- * Returns 'merge' or 'replace'.
40
- */
41
- export declare function promptMergeOrReplace(): Promise<'merge' | 'replace'>;
42
- /**
43
- * Write a progress line that overwrites the previous line.
44
- * Falls back to newline output if stdout is not a TTY (e.g., in tests or pipes).
45
- */
46
- export declare function writeProgress(current: number, total: number): void;
47
- /**
48
- * Run the initial HQ file upload.
49
- *
50
- * This is the core function that:
51
- * 1. Lists remote files via GET /api/files/list
52
- * 2. If remote has files, asks user to merge or replace
53
- * 3. Walks local files (respecting ignore rules)
54
- * 4. Uploads all files with progress indicator
55
- * 5. Updates sync state
56
- *
57
- * @param hqRoot - Absolute path to the HQ root directory
58
- * @param options - Optional overrides (for testing / programmatic use)
59
- * @returns Upload result with counts and any errors
60
- */
61
- export declare function runInitialUpload(hqRoot: string, options?: {
62
- /** Override the merge/replace prompt (for non-interactive use) */
63
- onConflict?: 'merge' | 'replace' | 'skip';
64
- /** Suppress console output */
65
- quiet?: boolean;
66
- }): Promise<InitialUploadResult>;
67
- //# sourceMappingURL=initial-upload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"initial-upload.d.ts","sourceRoot":"","sources":["../../src/commands/initial-upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAaH,8CAA8C;AAC9C,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,0EAA0E;IAC1E,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,OAAc,GAC5B,OAAO,CAAC,OAAO,CAAC,CAkBlB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC,CAiBnE;AAYD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOlE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IACR,kEAAkE;IAClE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IAC1C,8BAA8B;IAC9B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GACA,OAAO,CAAC,mBAAmB,CAAC,CA0H9B"}
@@ -1,205 +0,0 @@
1
- /**
2
- * Initial HQ file upload for first-time cloud setup.
3
- *
4
- * After Clerk auth and Claude token setup, this command uploads the user's
5
- * local HQ files to the cloud so the first session has access to the workspace.
6
- *
7
- * Respects the same ignore rules as sync (shouldIgnore from utils/sync.ts):
8
- * - .git/, node_modules/, .claude/, dist/, cdk.out/, etc.
9
- * - .log files, .env files, .DS_Store, Thumbs.db
10
- *
11
- * Exports `runInitialUpload` so it can be called programmatically from the
12
- * create-hq installer (US-004) or other commands.
13
- */
14
- import * as readline from 'readline';
15
- import chalk from 'chalk';
16
- import { apiRequest } from '../utils/api-client.js';
17
- import { walkDir, uploadFile, computeLocalManifest, readSyncState, writeSyncState, } from '../utils/sync.js';
18
- /**
19
- * Prompt the user with a yes/no question on stdin.
20
- * Returns true for 'y'/'yes', false for 'n'/'no'.
21
- * Defaults to defaultAnswer if user just presses Enter.
22
- */
23
- export function promptYesNo(question, defaultAnswer = true) {
24
- const hint = defaultAnswer ? '[Y/n]' : '[y/N]';
25
- const rl = readline.createInterface({
26
- input: process.stdin,
27
- output: process.stdout,
28
- });
29
- return new Promise((resolve) => {
30
- rl.question(`${question} ${hint} `, (answer) => {
31
- rl.close();
32
- const trimmed = answer.trim().toLowerCase();
33
- if (trimmed === '') {
34
- resolve(defaultAnswer);
35
- }
36
- else {
37
- resolve(trimmed === 'y' || trimmed === 'yes');
38
- }
39
- });
40
- });
41
- }
42
- /**
43
- * Prompt the user to choose between merge and replace.
44
- * Returns 'merge' or 'replace'.
45
- */
46
- export function promptMergeOrReplace() {
47
- const rl = readline.createInterface({
48
- input: process.stdin,
49
- output: process.stdout,
50
- });
51
- return new Promise((resolve) => {
52
- rl.question('Choose [m]erge or [r]eplace: ', (answer) => {
53
- rl.close();
54
- const trimmed = answer.trim().toLowerCase();
55
- if (trimmed === 'r' || trimmed === 'replace') {
56
- resolve('replace');
57
- }
58
- else {
59
- resolve('merge');
60
- }
61
- });
62
- });
63
- }
64
- /**
65
- * Delete all remote files (used when user chooses 'replace').
66
- */
67
- async function deleteRemoteFiles() {
68
- const resp = await apiRequest('DELETE', '/api/files/all');
69
- if (!resp.ok) {
70
- throw new Error(`Failed to clear remote files: ${resp.error ?? `HTTP ${resp.status}`}`);
71
- }
72
- }
73
- /**
74
- * Write a progress line that overwrites the previous line.
75
- * Falls back to newline output if stdout is not a TTY (e.g., in tests or pipes).
76
- */
77
- export function writeProgress(current, total) {
78
- const pct = total > 0 ? Math.round((current / total) * 100) : 0;
79
- const line = `Uploading: ${current}/${total} files (${pct}%)`;
80
- if (process.stdout.isTTY) {
81
- process.stdout.write(`\r${line}`);
82
- }
83
- }
84
- /**
85
- * Run the initial HQ file upload.
86
- *
87
- * This is the core function that:
88
- * 1. Lists remote files via GET /api/files/list
89
- * 2. If remote has files, asks user to merge or replace
90
- * 3. Walks local files (respecting ignore rules)
91
- * 4. Uploads all files with progress indicator
92
- * 5. Updates sync state
93
- *
94
- * @param hqRoot - Absolute path to the HQ root directory
95
- * @param options - Optional overrides (for testing / programmatic use)
96
- * @returns Upload result with counts and any errors
97
- */
98
- export async function runInitialUpload(hqRoot, options) {
99
- const quiet = options?.quiet ?? false;
100
- const log = (msg) => {
101
- if (!quiet)
102
- console.log(msg);
103
- };
104
- // 1. Check remote state
105
- log(chalk.blue('Checking cloud storage...'));
106
- let remoteFiles = [];
107
- try {
108
- const resp = await apiRequest('GET', '/api/files/list');
109
- if (resp.ok && resp.data) {
110
- remoteFiles = resp.data.files ?? [];
111
- }
112
- }
113
- catch {
114
- // If the endpoint doesn't exist yet or fails, treat as empty
115
- }
116
- // 2. Handle existing remote files
117
- if (remoteFiles.length > 0) {
118
- log('');
119
- log(chalk.yellow(`Cloud storage already has ${remoteFiles.length} file${remoteFiles.length !== 1 ? 's' : ''}.`));
120
- let action;
121
- if (options?.onConflict) {
122
- action = options.onConflict;
123
- }
124
- else {
125
- log(' merge — Upload local files, keeping existing remote files');
126
- log(' replace — Delete all remote files first, then upload');
127
- log('');
128
- action = await promptMergeOrReplace();
129
- }
130
- if (action === 'skip') {
131
- log(chalk.dim('Skipping upload.'));
132
- return { totalFiles: 0, uploaded: 0, failed: 0, errors: [], skipped: true };
133
- }
134
- if (action === 'replace') {
135
- log(chalk.dim('Clearing remote files...'));
136
- await deleteRemoteFiles();
137
- log(chalk.dim('Remote files cleared.'));
138
- }
139
- else {
140
- log(chalk.dim('Merging: existing remote files will be preserved.'));
141
- }
142
- }
143
- // 3. Walk local files
144
- log(chalk.blue('Scanning local HQ files...'));
145
- const localFiles = walkDir(hqRoot);
146
- if (localFiles.length === 0) {
147
- log(chalk.yellow('No files found to upload.'));
148
- return { totalFiles: 0, uploaded: 0, failed: 0, errors: [], skipped: false };
149
- }
150
- log(chalk.dim(` Found ${localFiles.length} file${localFiles.length !== 1 ? 's' : ''} to upload`));
151
- log('');
152
- // 4. Upload with progress
153
- const errors = [];
154
- let uploaded = 0;
155
- for (let i = 0; i < localFiles.length; i++) {
156
- const filePath = localFiles[i];
157
- if (!quiet) {
158
- writeProgress(i + 1, localFiles.length);
159
- }
160
- try {
161
- await uploadFile(filePath, hqRoot);
162
- uploaded++;
163
- }
164
- catch (err) {
165
- errors.push(`${filePath}: ${err instanceof Error ? err.message : String(err)}`);
166
- }
167
- }
168
- // Clear the progress line
169
- if (!quiet && process.stdout.isTTY) {
170
- process.stdout.write('\r' + ' '.repeat(60) + '\r');
171
- }
172
- // 5. Report results
173
- if (errors.length === 0) {
174
- log(chalk.green(`Uploaded ${uploaded}/${localFiles.length} files successfully.`));
175
- }
176
- else {
177
- log(chalk.green(`Uploaded ${uploaded}/${localFiles.length} files.`));
178
- log(chalk.yellow(` ${errors.length} error${errors.length !== 1 ? 's' : ''}:`));
179
- for (const err of errors.slice(0, 5)) {
180
- log(chalk.red(` - ${err}`));
181
- }
182
- if (errors.length > 5) {
183
- log(chalk.dim(` ... and ${errors.length - 5} more`));
184
- }
185
- }
186
- // 6. Update sync state
187
- const manifest = computeLocalManifest(hqRoot);
188
- const state = readSyncState(hqRoot);
189
- state.lastSync = new Date().toISOString();
190
- state.fileCount = manifest.length;
191
- state.errors = errors;
192
- writeSyncState(hqRoot, state);
193
- if (errors.length === 0) {
194
- log('');
195
- log(chalk.green('Sync status: in sync'));
196
- }
197
- return {
198
- totalFiles: localFiles.length,
199
- uploaded,
200
- failed: errors.length,
201
- errors,
202
- skipped: false,
203
- };
204
- }
205
- //# sourceMappingURL=initial-upload.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"initial-upload.js","sourceRoot":"","sources":["../../src/commands/initial-upload.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- /**
2
- * Background sync worker for "hq sync start".
3
- *
4
- * Forked as a detached child process. Polls for changes at a configurable
5
- * interval and runs a full bidirectional sync each cycle.
6
- *
7
- * Usage (internal — called by cloud.ts):
8
- * node sync-worker.js <hqRoot> <intervalMs>
9
- */
10
- export {};
11
- //# sourceMappingURL=sync-worker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-worker.d.ts","sourceRoot":"","sources":["../src/sync-worker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}