@indigoai-us/hq-cli 5.1.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/dist/__tests__/credentials.test.d.ts +5 -0
- package/dist/__tests__/credentials.test.d.ts.map +1 -0
- package/dist/__tests__/credentials.test.js +169 -0
- package/dist/__tests__/credentials.test.js.map +1 -0
- package/dist/commands/add.d.ts +6 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +60 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/auth.d.ts +17 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +269 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/cloud-setup.d.ts +19 -0
- package/dist/commands/cloud-setup.d.ts.map +1 -0
- package/dist/commands/cloud-setup.js +206 -0
- package/dist/commands/cloud-setup.js.map +1 -0
- package/dist/commands/cloud.d.ts +16 -0
- package/dist/commands/cloud.d.ts.map +1 -0
- package/dist/commands/cloud.js +263 -0
- package/dist/commands/cloud.js.map +1 -0
- package/dist/commands/initial-upload.d.ts +67 -0
- package/dist/commands/initial-upload.d.ts.map +1 -0
- package/dist/commands/initial-upload.js +205 -0
- package/dist/commands/initial-upload.js.map +1 -0
- package/dist/commands/list.d.ts +6 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +55 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/sync.d.ts +6 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +104 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +7 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +60 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/strategies/link.d.ts +7 -0
- package/dist/strategies/link.d.ts.map +1 -0
- package/dist/strategies/link.js +51 -0
- package/dist/strategies/link.js.map +1 -0
- package/dist/strategies/merge.d.ts +7 -0
- package/dist/strategies/merge.d.ts.map +1 -0
- package/dist/strategies/merge.js +110 -0
- package/dist/strategies/merge.js.map +1 -0
- package/dist/sync-worker.d.ts +11 -0
- package/dist/sync-worker.d.ts.map +1 -0
- package/dist/sync-worker.js +77 -0
- package/dist/sync-worker.js.map +1 -0
- package/dist/types.d.ts +41 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/api-client.d.ts +26 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +87 -0
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/credentials.d.ts +44 -0
- package/dist/utils/credentials.d.ts.map +1 -0
- package/dist/utils/credentials.js +101 -0
- package/dist/utils/credentials.js.map +1 -0
- package/dist/utils/git.d.ts +13 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +70 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/manifest.d.ts +16 -0
- package/dist/utils/manifest.d.ts.map +1 -0
- package/dist/utils/manifest.js +95 -0
- package/dist/utils/manifest.js.map +1 -0
- package/dist/utils/sync.d.ts +125 -0
- package/dist/utils/sync.d.ts.map +1 -0
- package/dist/utils/sync.js +291 -0
- package/dist/utils/sync.js.map +1 -0
- package/package.json +36 -0
- package/src/__tests__/cloud-setup.test.ts +117 -0
- package/src/__tests__/credentials.test.ts +203 -0
- package/src/__tests__/initial-upload.test.ts +414 -0
- package/src/__tests__/sync.test.ts +627 -0
- package/src/commands/add.ts +74 -0
- package/src/commands/auth.ts +303 -0
- package/src/commands/cloud-setup.ts +251 -0
- package/src/commands/cloud.ts +300 -0
- package/src/commands/initial-upload.ts +263 -0
- package/src/commands/list.ts +66 -0
- package/src/commands/sync.ts +149 -0
- package/src/commands/update.ts +71 -0
- package/src/hq-cloud.d.ts +19 -0
- package/src/index.ts +46 -0
- package/src/strategies/link.ts +62 -0
- package/src/strategies/merge.ts +142 -0
- package/src/sync-worker.ts +82 -0
- package/src/types.ts +47 -0
- package/src/utils/api-client.ts +111 -0
- package/src/utils/credentials.ts +124 -0
- package/src/utils/git.ts +74 -0
- package/src/utils/manifest.ts +111 -0
- package/src/utils/sync.ts +381 -0
- package/tsconfig.json +9 -0
- package/vitest.config.ts +8 -0
|
@@ -0,0 +1,206 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-setup.js","sourceRoot":"","sources":["../../src/commands/cloud-setup.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,SAAS,GACV,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,gDAAgD;AAChD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAa;IAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxC,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE7B,IAAI,OAAO,CAAC,MAAM,GAAG,gBAAgB,EAAE,CAAC;QACtC,OAAO,uBAAuB,OAAO,CAAC,MAAM,2FAA2F,CAAC;IAC1I,CAAC;IAED,4FAA4F;IAC5F,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACvB,OAAO,uFAAuF,CAAC;IACjG,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/B,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mDAAmD,CAAC,CAAC;IAEpE,+BAA+B;IAC/B,QAAQ;SACL,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,mDAAmD,CAAC;SAChE,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,2BAA2B;YAC3B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,2BAA2B,CAAC,CAAC;YACnE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,4CAA4C,CAAC,CAAC;YACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,uBAAuB;YACvB,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,2BAA2B,CAAC,CAAC;YAE5D,0BAA0B;YAC1B,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACnD,IAAI,eAAe,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,eAAe,CAAC,CAAC;gBAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,sBAAsB;YACtB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC,CAAC;YAEpD,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,MAAM,EACN,4BAA4B,EAC5B,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CACxB,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,kBAAkB;YAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC1D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,6DAA6D,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,0BAA0B;IAC1B,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,iBAAiB;YACjB,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;gBAC9D,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;gBAChE,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;gBACvD,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,EAAE,EAAE,CAAC,CAAC;YAE/C,iCAAiC;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAC3B,KAAK,EACL,4BAA4B,CAC7B,CAAC;gBAEF,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACvB,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;wBAC7D,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;4BACpB,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;wBACrD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;wBAClE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;oBAC5E,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,kBAAkB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;gBACnG,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EACnB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,0BAA0B;IAC1B,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wDAAwD,CAAC;SACrE,MAAM,CAAC,kBAAkB,EAAE,sDAAsD,CAAC;SAClF,MAAM,CAAC,wBAAwB,EAAE,uDAAuD,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,IAA8C,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,eAAe;YACf,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;gBACrD,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,UAAU,EAAE,CAAC;YAE3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAsD,CAAC;YAE/E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE;gBAC5C,UAAU;aACX,CAAC,CAAC;YAEH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,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,KAAK,CAC/C,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hq sync commands — cloud sync management via API proxy
|
|
3
|
+
*
|
|
4
|
+
* All sync operations go through the hq-cloud API (authenticated with Clerk
|
|
5
|
+
* tokens from US-002). No AWS credentials or direct S3 access needed.
|
|
6
|
+
*
|
|
7
|
+
* Commands:
|
|
8
|
+
* hq sync push — Upload changed local files to cloud
|
|
9
|
+
* hq sync pull — Download changed cloud files to local
|
|
10
|
+
* hq sync start — Begin background auto-sync watcher
|
|
11
|
+
* hq sync stop — Halt the background watcher
|
|
12
|
+
* hq sync status — Show sync state, last sync time, file counts
|
|
13
|
+
*/
|
|
14
|
+
import { Command } from 'commander';
|
|
15
|
+
export declare function registerCloudCommands(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=cloud.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.d.ts","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6CpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgP5D"}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hq sync commands — cloud sync management via API proxy
|
|
3
|
+
*
|
|
4
|
+
* All sync operations go through the hq-cloud API (authenticated with Clerk
|
|
5
|
+
* tokens from US-002). No AWS credentials or direct S3 access needed.
|
|
6
|
+
*
|
|
7
|
+
* Commands:
|
|
8
|
+
* hq sync push — Upload changed local files to cloud
|
|
9
|
+
* hq sync pull — Download changed cloud files to local
|
|
10
|
+
* hq sync start — Begin background auto-sync watcher
|
|
11
|
+
* hq sync stop — Halt the background watcher
|
|
12
|
+
* hq sync status — Show sync state, last sync time, file counts
|
|
13
|
+
*/
|
|
14
|
+
import { fork } from 'child_process';
|
|
15
|
+
import * as path from 'path';
|
|
16
|
+
import { fileURLToPath } from 'url';
|
|
17
|
+
import chalk from 'chalk';
|
|
18
|
+
import { findHqRoot } from '../utils/manifest.js';
|
|
19
|
+
import { readCredentials, isExpired } from '../utils/credentials.js';
|
|
20
|
+
import { pushChanges, pullChanges, computeLocalManifest, readSyncState, writeSyncState, getQuota, } from '../utils/sync.js';
|
|
21
|
+
/**
|
|
22
|
+
* Verify that the user is authenticated before running sync commands.
|
|
23
|
+
* Throws if not logged in or token is expired.
|
|
24
|
+
*/
|
|
25
|
+
function requireAuth() {
|
|
26
|
+
const creds = readCredentials();
|
|
27
|
+
if (!creds) {
|
|
28
|
+
throw new Error('Not logged in. Run "hq auth login" first.');
|
|
29
|
+
}
|
|
30
|
+
if (isExpired(creds)) {
|
|
31
|
+
throw new Error('Session expired. Run "hq auth login" to re-authenticate.');
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Check if a background sync process is actually running (not just recorded).
|
|
36
|
+
*/
|
|
37
|
+
function isProcessRunning(pid) {
|
|
38
|
+
try {
|
|
39
|
+
// Sending signal 0 checks if process exists without killing it
|
|
40
|
+
process.kill(pid, 0);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
export function registerCloudCommands(program) {
|
|
48
|
+
// ── hq sync push ────────────────────────────────────────────────────────
|
|
49
|
+
program
|
|
50
|
+
.command('push')
|
|
51
|
+
.description('Upload changed local files to cloud via API proxy')
|
|
52
|
+
.action(async () => {
|
|
53
|
+
try {
|
|
54
|
+
requireAuth();
|
|
55
|
+
const hqRoot = findHqRoot();
|
|
56
|
+
console.log(chalk.blue('Computing local manifest...'));
|
|
57
|
+
const manifest = computeLocalManifest(hqRoot);
|
|
58
|
+
console.log(chalk.dim(` ${manifest.length} local files scanned`));
|
|
59
|
+
console.log(chalk.blue('Checking for changes...'));
|
|
60
|
+
const result = await pushChanges(hqRoot);
|
|
61
|
+
if (result.uploaded === 0 && result.errors.length === 0) {
|
|
62
|
+
console.log(chalk.green('Already up to date. No files to push.'));
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
console.log(chalk.green(`Pushed ${result.uploaded} file${result.uploaded !== 1 ? 's' : ''} to cloud.`));
|
|
66
|
+
}
|
|
67
|
+
if (result.errors.length > 0) {
|
|
68
|
+
console.log(chalk.yellow(` ${result.errors.length} error${result.errors.length !== 1 ? 's' : ''}:`));
|
|
69
|
+
for (const err of result.errors.slice(0, 5)) {
|
|
70
|
+
console.log(chalk.red(` - ${err}`));
|
|
71
|
+
}
|
|
72
|
+
if (result.errors.length > 5) {
|
|
73
|
+
console.log(chalk.dim(` ... and ${result.errors.length - 5} more`));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// Update sync state
|
|
77
|
+
const state = readSyncState(hqRoot);
|
|
78
|
+
state.lastSync = new Date().toISOString();
|
|
79
|
+
state.fileCount = manifest.length;
|
|
80
|
+
state.errors = result.errors;
|
|
81
|
+
writeSyncState(hqRoot, state);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
console.error(chalk.red('Push failed:'), error instanceof Error ? error.message : error);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// ── hq sync pull ────────────────────────────────────────────────────────
|
|
89
|
+
program
|
|
90
|
+
.command('pull')
|
|
91
|
+
.description('Download changed cloud files to local via API proxy')
|
|
92
|
+
.action(async () => {
|
|
93
|
+
try {
|
|
94
|
+
requireAuth();
|
|
95
|
+
const hqRoot = findHqRoot();
|
|
96
|
+
console.log(chalk.blue('Computing local manifest...'));
|
|
97
|
+
const manifest = computeLocalManifest(hqRoot);
|
|
98
|
+
console.log(chalk.dim(` ${manifest.length} local files scanned`));
|
|
99
|
+
console.log(chalk.blue('Checking for changes...'));
|
|
100
|
+
const result = await pullChanges(hqRoot);
|
|
101
|
+
if (result.downloaded === 0 && result.errors.length === 0) {
|
|
102
|
+
console.log(chalk.green('Already up to date. No files to pull.'));
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
console.log(chalk.green(`Pulled ${result.downloaded} file${result.downloaded !== 1 ? 's' : ''} from cloud.`));
|
|
106
|
+
}
|
|
107
|
+
if (result.errors.length > 0) {
|
|
108
|
+
console.log(chalk.yellow(` ${result.errors.length} error${result.errors.length !== 1 ? 's' : ''}:`));
|
|
109
|
+
for (const err of result.errors.slice(0, 5)) {
|
|
110
|
+
console.log(chalk.red(` - ${err}`));
|
|
111
|
+
}
|
|
112
|
+
if (result.errors.length > 5) {
|
|
113
|
+
console.log(chalk.dim(` ... and ${result.errors.length - 5} more`));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Update sync state
|
|
117
|
+
const state = readSyncState(hqRoot);
|
|
118
|
+
state.lastSync = new Date().toISOString();
|
|
119
|
+
state.fileCount = manifest.length;
|
|
120
|
+
state.errors = result.errors;
|
|
121
|
+
writeSyncState(hqRoot, state);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
console.error(chalk.red('Pull failed:'), error instanceof Error ? error.message : error);
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
// ── hq sync start ──────────────────────────────────────────────────────
|
|
129
|
+
program
|
|
130
|
+
.command('start')
|
|
131
|
+
.description('Start background auto-sync watcher (polls every 30s)')
|
|
132
|
+
.option('-i, --interval <seconds>', 'Polling interval in seconds', '30')
|
|
133
|
+
.action(async (opts) => {
|
|
134
|
+
try {
|
|
135
|
+
requireAuth();
|
|
136
|
+
const hqRoot = findHqRoot();
|
|
137
|
+
const intervalSec = parseInt(opts.interval, 10);
|
|
138
|
+
if (isNaN(intervalSec) || intervalSec < 5) {
|
|
139
|
+
throw new Error('Interval must be at least 5 seconds.');
|
|
140
|
+
}
|
|
141
|
+
// Check if already running
|
|
142
|
+
const existingState = readSyncState(hqRoot);
|
|
143
|
+
if (existingState.running && existingState.pid && isProcessRunning(existingState.pid)) {
|
|
144
|
+
console.log(chalk.yellow(`Sync watcher already running (PID ${existingState.pid}).`));
|
|
145
|
+
console.log('Use "hq sync stop" to stop it first.');
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
// Fork a background worker process
|
|
149
|
+
// The worker script path is relative to the compiled output
|
|
150
|
+
const thisFile = fileURLToPath(import.meta.url);
|
|
151
|
+
const workerScript = path.join(path.dirname(thisFile), '..', 'sync-worker.js');
|
|
152
|
+
const child = fork(workerScript, [hqRoot, String(intervalSec * 1000)], {
|
|
153
|
+
detached: true,
|
|
154
|
+
stdio: 'ignore',
|
|
155
|
+
});
|
|
156
|
+
if (!child.pid) {
|
|
157
|
+
throw new Error('Failed to start background sync process.');
|
|
158
|
+
}
|
|
159
|
+
// Allow the parent to exit without waiting for the child
|
|
160
|
+
child.unref();
|
|
161
|
+
// Record state
|
|
162
|
+
const state = {
|
|
163
|
+
running: true,
|
|
164
|
+
pid: child.pid,
|
|
165
|
+
lastSync: existingState.lastSync,
|
|
166
|
+
fileCount: existingState.fileCount,
|
|
167
|
+
errors: [],
|
|
168
|
+
};
|
|
169
|
+
writeSyncState(hqRoot, state);
|
|
170
|
+
console.log(chalk.green(`Sync watcher started (PID ${child.pid}, interval: ${intervalSec}s).`));
|
|
171
|
+
console.log('Use "hq sync status" to check, "hq sync stop" to halt.');
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
console.error(chalk.red('Start failed:'), error instanceof Error ? error.message : error);
|
|
175
|
+
process.exit(1);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
// ── hq sync stop ───────────────────────────────────────────────────────
|
|
179
|
+
program
|
|
180
|
+
.command('stop')
|
|
181
|
+
.description('Stop the background sync watcher')
|
|
182
|
+
.action(async () => {
|
|
183
|
+
try {
|
|
184
|
+
const hqRoot = findHqRoot();
|
|
185
|
+
const state = readSyncState(hqRoot);
|
|
186
|
+
if (!state.running || !state.pid) {
|
|
187
|
+
console.log(chalk.yellow('No sync watcher is running.'));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (isProcessRunning(state.pid)) {
|
|
191
|
+
try {
|
|
192
|
+
process.kill(state.pid, 'SIGTERM');
|
|
193
|
+
console.log(chalk.green(`Sync watcher stopped (PID ${state.pid}).`));
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
console.log(chalk.yellow(`Could not stop process ${state.pid} — it may have already exited.`));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
console.log(chalk.dim(`Sync watcher process ${state.pid} is no longer running. Cleaning up state.`));
|
|
201
|
+
}
|
|
202
|
+
// Update state
|
|
203
|
+
state.running = false;
|
|
204
|
+
state.pid = undefined;
|
|
205
|
+
writeSyncState(hqRoot, state);
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
console.error(chalk.red('Stop failed:'), error instanceof Error ? error.message : error);
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
// ── hq sync status ─────────────────────────────────────────────────────
|
|
213
|
+
program
|
|
214
|
+
.command('status')
|
|
215
|
+
.description('Show sync state, last sync time, and file counts')
|
|
216
|
+
.action(async () => {
|
|
217
|
+
try {
|
|
218
|
+
const hqRoot = findHqRoot();
|
|
219
|
+
const state = readSyncState(hqRoot);
|
|
220
|
+
// Check if the recorded PID is actually alive
|
|
221
|
+
const actuallyRunning = state.running && state.pid
|
|
222
|
+
? isProcessRunning(state.pid)
|
|
223
|
+
: false;
|
|
224
|
+
if (state.running && !actuallyRunning) {
|
|
225
|
+
// Stale state — clean it up
|
|
226
|
+
state.running = false;
|
|
227
|
+
state.pid = undefined;
|
|
228
|
+
writeSyncState(hqRoot, state);
|
|
229
|
+
}
|
|
230
|
+
console.log(chalk.bold('HQ Cloud Sync Status'));
|
|
231
|
+
console.log();
|
|
232
|
+
console.log(` Watcher: ${actuallyRunning ? chalk.green('running') + ` (PID ${state.pid})` : chalk.dim('stopped')}`);
|
|
233
|
+
console.log(` Last sync: ${state.lastSync ? state.lastSync : chalk.dim('never')}`);
|
|
234
|
+
console.log(` Files: ${state.fileCount != null ? `${state.fileCount} tracked` : chalk.dim('unknown')}`);
|
|
235
|
+
console.log(` HQ root: ${hqRoot}`);
|
|
236
|
+
if (state.errors.length > 0) {
|
|
237
|
+
console.log(` Errors: ${chalk.yellow(String(state.errors.length))}`);
|
|
238
|
+
for (const err of state.errors.slice(0, 5)) {
|
|
239
|
+
console.log(chalk.red(` - ${err}`));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
// Try to fetch quota info (non-fatal if it fails)
|
|
243
|
+
try {
|
|
244
|
+
requireAuth();
|
|
245
|
+
const quota = await getQuota();
|
|
246
|
+
console.log();
|
|
247
|
+
console.log(chalk.bold(' Storage Quota'));
|
|
248
|
+
const usedMB = (quota.used / (1024 * 1024)).toFixed(1);
|
|
249
|
+
const limitMB = (quota.limit / (1024 * 1024)).toFixed(1);
|
|
250
|
+
const pctColor = quota.percentage > 90 ? chalk.red : quota.percentage > 70 ? chalk.yellow : chalk.green;
|
|
251
|
+
console.log(` Used: ${usedMB} MB / ${limitMB} MB (${pctColor(quota.percentage + '%')})`);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// Quota info is optional — skip silently
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
console.error(chalk.red('Status check failed:'), error instanceof Error ? error.message : error);
|
|
259
|
+
process.exit(1);
|
|
260
|
+
}
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=cloud.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud.js","sourceRoot":"","sources":["../../src/commands/cloud.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|