codequill 0.8.1-beta.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +121 -0
  3. package/dist/commands/attest.js +442 -0
  4. package/dist/commands/attest.js.map +1 -0
  5. package/dist/commands/backup.js +370 -0
  6. package/dist/commands/backup.js.map +1 -0
  7. package/dist/commands/claim.js +104 -0
  8. package/dist/commands/claim.js.map +1 -0
  9. package/dist/commands/log.js +188 -0
  10. package/dist/commands/log.js.map +1 -0
  11. package/dist/commands/login.js +147 -0
  12. package/dist/commands/login.js.map +1 -0
  13. package/dist/commands/prove.js +244 -0
  14. package/dist/commands/prove.js.map +1 -0
  15. package/dist/commands/publish.js +243 -0
  16. package/dist/commands/publish.js.map +1 -0
  17. package/dist/commands/pull.js +174 -0
  18. package/dist/commands/pull.js.map +1 -0
  19. package/dist/commands/quota.js +94 -0
  20. package/dist/commands/quota.js.map +1 -0
  21. package/dist/commands/revoke.js +97 -0
  22. package/dist/commands/revoke.js.map +1 -0
  23. package/dist/commands/snapshot.js +128 -0
  24. package/dist/commands/snapshot.js.map +1 -0
  25. package/dist/commands/status.js +234 -0
  26. package/dist/commands/status.js.map +1 -0
  27. package/dist/commands/verifyAttestation.js +212 -0
  28. package/dist/commands/verifyAttestation.js.map +1 -0
  29. package/dist/commands/verifyProof.js +145 -0
  30. package/dist/commands/verifyProof.js.map +1 -0
  31. package/dist/commands/wait.js +36 -0
  32. package/dist/commands/wait.js.map +1 -0
  33. package/dist/commands/who.js +55 -0
  34. package/dist/commands/who.js.map +1 -0
  35. package/dist/commands/why.js +412 -0
  36. package/dist/commands/why.js.map +1 -0
  37. package/dist/index.js +50 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/launcher.js +69 -0
  40. package/dist/launcher.js.map +1 -0
  41. package/dist/services/api.js +51 -0
  42. package/dist/services/api.js.map +1 -0
  43. package/dist/services/apiClient.js +166 -0
  44. package/dist/services/apiClient.js.map +1 -0
  45. package/dist/services/authStore.js +84 -0
  46. package/dist/services/authStore.js.map +1 -0
  47. package/dist/services/config.js +19 -0
  48. package/dist/services/config.js.map +1 -0
  49. package/dist/services/confirm.js +58 -0
  50. package/dist/services/confirm.js.map +1 -0
  51. package/dist/services/crypto.js +38 -0
  52. package/dist/services/crypto.js.map +1 -0
  53. package/dist/services/errors.js +17 -0
  54. package/dist/services/errors.js.map +1 -0
  55. package/dist/services/fs.js +25 -0
  56. package/dist/services/fs.js.map +1 -0
  57. package/dist/services/git.js +121 -0
  58. package/dist/services/git.js.map +1 -0
  59. package/dist/services/manifests/attestationManifest.js +35 -0
  60. package/dist/services/manifests/attestationManifest.js.map +1 -0
  61. package/dist/services/manifests/proofManifest.js +151 -0
  62. package/dist/services/manifests/proofManifest.js.map +1 -0
  63. package/dist/services/manifests/snapshotManifest.js +214 -0
  64. package/dist/services/manifests/snapshotManifest.js.map +1 -0
  65. package/dist/services/merkle.js +92 -0
  66. package/dist/services/merkle.js.map +1 -0
  67. package/dist/services/paths.js +16 -0
  68. package/dist/services/paths.js.map +1 -0
  69. package/dist/services/snapshotIndex.js +401 -0
  70. package/dist/services/snapshotIndex.js.map +1 -0
  71. package/dist/services/txWaiter.js +84 -0
  72. package/dist/services/txWaiter.js.map +1 -0
  73. package/dist/services/ui.js +98 -0
  74. package/dist/services/ui.js.map +1 -0
  75. package/dist/services/utilities.js +45 -0
  76. package/dist/services/utilities.js.map +1 -0
  77. package/dist/services/zip.js +24 -0
  78. package/dist/services/zip.js.map +1 -0
  79. package/dist/types/api.js +2 -0
  80. package/dist/types/api.js.map +1 -0
  81. package/dist/version.js +7 -0
  82. package/dist/version.js.map +1 -0
  83. package/package.json +52 -0
@@ -0,0 +1,370 @@
1
+ import path from 'node:path';
2
+ import fs from 'node:fs/promises';
3
+ import os from 'node:os';
4
+ import crypto, { createCipheriv, randomBytes } from 'node:crypto';
5
+ import { spawn } from 'node:child_process';
6
+ import { createWriteStream } from 'node:fs';
7
+ import sodium from 'libsodium-wrappers';
8
+ import { colors, shortCommit, spinner } from '../services/ui.js';
9
+ import { apiClient } from '../services/apiClient.js';
10
+ import { assertAuthenticated, getCliVersion } from '../services/utilities.js';
11
+ import { deriveRepoName, detectGitRepo } from '../services/git.js';
12
+ import { getBaseUrl } from '../services/config.js';
13
+ import { waitForTxConfirmation } from '../services/txWaiter.js';
14
+ import { fetchSnapshot, fetchSnapshotBundle } from '../services/api.js';
15
+ import { confirmDangerousAction } from "../services/confirm.js";
16
+ import { buildSnapshotManifest } from "../services/manifests/snapshotManifest.js";
17
+ export async function handleBackup(snapshotId, opts) {
18
+ if (!assertAuthenticated())
19
+ return;
20
+ const log = (...args) => { if (!opts.json)
21
+ console.log(...args); };
22
+ const git = detectGitRepo(process.cwd());
23
+ if (!git.isRepo || !git.root) {
24
+ console.error(colors.error('This command must be run inside a git repository.'));
25
+ process.exitCode = 1;
26
+ return;
27
+ }
28
+ const repoName = deriveRepoName(git.root, git.remote);
29
+ if (!repoName) {
30
+ console.error(colors.error('Unable to determine repository name from git remote.'));
31
+ if (!opts.json) {
32
+ console.error(colors.dim('Make sure you have a GitHub origin remote configured.'));
33
+ }
34
+ process.exitCode = 1;
35
+ return;
36
+ }
37
+ const snapId = String(snapshotId || '').trim();
38
+ if (!snapId) {
39
+ console.error(colors.error('Missing <snapshotId>.'));
40
+ process.exitCode = 1;
41
+ return;
42
+ }
43
+ // 1) Fetch published snapshot info (must be anchored)
44
+ const sSnap = spinner('Fetching published snapshot info ...', opts.json);
45
+ let snapshotMeta;
46
+ let publishedManifest = null;
47
+ try {
48
+ const bundle = await fetchSnapshotBundle(snapId);
49
+ snapshotMeta = bundle.meta;
50
+ publishedManifest = bundle.manifest;
51
+ // fallback meta-only
52
+ if (!snapshotMeta?.snapshot_id) {
53
+ snapshotMeta = (await fetchSnapshot(snapId));
54
+ }
55
+ if (!snapshotMeta?.commit_hash) {
56
+ throw new Error('Snapshot metadata missing required field: commit_hash.');
57
+ }
58
+ sSnap.succeed(colors.success('Snapshot is published & anchored.'));
59
+ }
60
+ catch (e) {
61
+ sSnap.fail(colors.error('Failed to fetch snapshot (or snapshot not anchored).'));
62
+ console.error(colors.error(String(e?.message || e)));
63
+ process.exitCode = 1;
64
+ return;
65
+ }
66
+ // 2) Basic repo sanity check (optional but helpful)
67
+ if (snapshotMeta.repository_name) {
68
+ if (String(snapshotMeta.repository_name) !== repoName) {
69
+ console.error(colors.error('Local repo remote does not match snapshot repository_name.'));
70
+ process.exitCode = 1;
71
+ return;
72
+ }
73
+ }
74
+ // 2.1) Determine expected content_root (required for backup verification without salt/decryption)
75
+ const expectedContentRoot = String(snapshotMeta.content_root || '').trim() ||
76
+ String(publishedManifest?.content_root || '').trim() ||
77
+ '';
78
+ if (!expectedContentRoot) {
79
+ console.error(colors.error('Snapshot does not provide content_root (required for backup verification).'));
80
+ console.error(colors.dim('Fix: update backend + publish pipeline to store/return content_root in snapshot meta or bundle manifest.'));
81
+ process.exitCode = 1;
82
+ return;
83
+ }
84
+ async function fetchWorkspaceEncryptionPublicForSnapshot(repoName) {
85
+ return apiClient.get(`/v1/cli/encryption?repo_name=${encodeURIComponent(repoName)}`);
86
+ }
87
+ const sKey = spinner('Fetching workspace encryption key ...', opts.json);
88
+ let encPub;
89
+ try {
90
+ encPub = await fetchWorkspaceEncryptionPublicForSnapshot(snapshotMeta.repository_name);
91
+ if (!encPub?.public_key_b64)
92
+ throw new Error('Missing public_key_b64');
93
+ sKey.succeed(colors.success('Workspace encryption key loaded.'));
94
+ }
95
+ catch (e) {
96
+ sKey.fail(colors.error('Failed to load workspace encryption key.'));
97
+ console.error(colors.error(String(e?.message || e)));
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ // 3) Verify local repo content matches snapshot via PUBLIC content_root (no salt, no paths)
102
+ const sVerify = spinner(`Verifying local repo content_root matches snapshot (${shortCommit(snapshotMeta.commit_hash)}) ...`, opts.json);
103
+ try {
104
+ const { contentRoot } = await buildSnapshotManifest({
105
+ repoRoot: git.root,
106
+ repoName,
107
+ commitHash: snapshotMeta.commit_hash,
108
+ concurrency: 8,
109
+ workspaceEncPublic: {
110
+ public_key_b64: encPub.public_key_b64,
111
+ key_id: encPub.key_id,
112
+ workspace_id: snapshotMeta.workspace_id,
113
+ },
114
+ });
115
+ const local = String(contentRoot).toLowerCase();
116
+ const expected = String(expectedContentRoot).toLowerCase();
117
+ if (local !== expected) {
118
+ throw new Error(`content_root mismatch.\n` +
119
+ ` Local: ${local}\n` +
120
+ ` Snapshot: ${expected}\n` +
121
+ `Tip: ensure you are in the correct repository and that the commit exists locally.`);
122
+ }
123
+ sVerify.succeed(colors.success(`content_root verified (${expected.slice(0, 16)}…).`));
124
+ }
125
+ catch (e) {
126
+ sVerify.fail(colors.error('Snapshot verification failed (content_root mismatch).'));
127
+ console.error(colors.error(String(e?.message || e)));
128
+ process.exitCode = 1;
129
+ return;
130
+ }
131
+ // 4) Create deterministic git-archive tar.gz of the commit
132
+ const sPack = spinner('Packaging source from commit (git archive → tar.gz) ...', opts.json);
133
+ const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'codequill-backup-'));
134
+ const tarGzAbs = path.join(tmpDir, `backup-${snapshotMeta.snapshot_id}.tar.gz`);
135
+ try {
136
+ await gitArchiveToTarGz({
137
+ repoRoot: git.root,
138
+ commitHash: snapshotMeta.commit_hash,
139
+ outTarGzAbs: tarGzAbs,
140
+ });
141
+ const st = await fs.stat(tarGzAbs);
142
+ sPack.succeed(colors.success(`Packed ${(st.size / (1024 * 1024)).toFixed(2)} MB.`));
143
+ }
144
+ catch (e) {
145
+ sPack.fail(colors.error('Failed to package source.'));
146
+ console.error(colors.error(String(e?.message || e)));
147
+ process.exitCode = 1;
148
+ return;
149
+ }
150
+ // 5) Read bytes + hash archive (sha256) to bind backup bytes
151
+ const sHash = spinner('Hashing archive (sha256) ...', opts.json);
152
+ let archiveSha256;
153
+ let archiveBytes;
154
+ try {
155
+ archiveBytes = await fs.readFile(tarGzAbs);
156
+ archiveSha256 = sha256Hex(archiveBytes);
157
+ sHash.succeed(colors.success(`sha256: ${archiveSha256.slice(0, 16)}…`));
158
+ }
159
+ catch (e) {
160
+ sHash.fail(colors.error('Failed to hash archive.'));
161
+ console.error(colors.error(String(e?.message || e)));
162
+ process.exitCode = 1;
163
+ return;
164
+ }
165
+ if (!opts.noConfirm && !opts.json) {
166
+ const ok = await confirmDangerousAction('You are about to create an encrypted preservation', [
167
+ ` Snapshot ID ${snapshotMeta.snapshot_id}`,
168
+ ` Repo ${snapshotMeta.repository_name}`,
169
+ ` Commit ${shortCommit(snapshotMeta.commit_hash)}`,
170
+ ` Merkle Root ${snapshotMeta.merkle_root}`,
171
+ ` Content Root ${expectedContentRoot}`,
172
+ ` Archive sha256 ${archiveSha256}`,
173
+ ` Size ${(archiveBytes.length / (1024 * 1024)).toFixed(2)} MB`,
174
+ ], 'This will upload encrypted bytes and store decryption metadata.');
175
+ if (!ok) {
176
+ log(colors.dim('Preservation cancelled.'));
177
+ return;
178
+ }
179
+ }
180
+ // 6) Encrypt (Envelope v1): AES-256-GCM + wrap DEK to workspace encryption public key
181
+ const sEnc = spinner('Encrypting (AES-256-GCM + workspace key wrap) ...', opts.json);
182
+ let backupMetadata;
183
+ let encryptedBytes;
184
+ try {
185
+ // Generate DEK and encrypt archive with AES-256-GCM
186
+ const dek = randomBytes(32);
187
+ const iv = randomBytes(12);
188
+ const { ciphertext, tag } = aes256gcmEncrypt(archiveBytes, dek, iv);
189
+ encryptedBytes = ciphertext;
190
+ const wrappedDek = await wrapDekForWorkspace(encPub.public_key_b64, dek);
191
+ backupMetadata = {
192
+ version: 'codequill-backup:v1',
193
+ snapshot: {
194
+ snapshot_id: snapshotMeta.snapshot_id,
195
+ repo: snapshotMeta.repository_name,
196
+ commit: snapshotMeta.commit_hash,
197
+ merkle_root: snapshotMeta.merkle_root,
198
+ content_root: expectedContentRoot,
199
+ published_at: snapshotMeta.published_at,
200
+ chain_id: snapshotMeta.chain_id,
201
+ tx_hash: snapshotMeta.tx_hash,
202
+ explorer_url: snapshotMeta.explorer_url,
203
+ authority_wallet: snapshotMeta.wallet_address,
204
+ manifest_cid: snapshotMeta.manifest_cid,
205
+ manifest_encoding: snapshotMeta.manifest_encoding,
206
+ },
207
+ archive: {
208
+ format: 'tar.gz',
209
+ sha256: archiveSha256,
210
+ bytes: archiveBytes.length,
211
+ plaintext_media_type: 'application/gzip',
212
+ },
213
+ encryption: {
214
+ scheme: 'codequill-envelope:v1',
215
+ cipher: 'aes-256-gcm',
216
+ iv_b64: iv.toString('base64'),
217
+ tag_b64: tag.toString('base64'),
218
+ dek_wrap: wrappedDek.version,
219
+ wrapped_dek_b64: wrappedDek.ciphertext_b64,
220
+ recipient: {
221
+ type: 'workspace',
222
+ workspace_id: snapshotMeta.workspace_id,
223
+ key_id: encPub.key_id ?? undefined,
224
+ },
225
+ },
226
+ generator: {
227
+ name: 'codequill-cli',
228
+ version: getCliVersion(),
229
+ },
230
+ timestamp: Math.floor(Date.now() / 1000),
231
+ };
232
+ sEnc.succeed(colors.success(`Encrypted (${encryptedBytes.length} bytes).`));
233
+ }
234
+ catch (e) {
235
+ sEnc.fail(colors.error('Encryption failed.'));
236
+ console.error(colors.error(String(e?.message || e)));
237
+ process.exitCode = 1;
238
+ return;
239
+ }
240
+ // 7) Upload encrypted backup
241
+ const sUp = spinner('Uploading encrypted preservation ...', opts.json);
242
+ let uploadRes;
243
+ try {
244
+ const form = new FormData();
245
+ form.append('snapshot_id', snapshotMeta.snapshot_id);
246
+ form.append('archive_sha256', archiveSha256);
247
+ form.append('backup_plaintext_format', 'tar.gz');
248
+ form.append('backup_plaintext_media_type', 'application/gzip');
249
+ form.append('backup_encoding', 'codequill-envelope:v1');
250
+ form.append('backup_metadata', JSON.stringify(backupMetadata));
251
+ const fname = `backup-${shortCommit(snapshotMeta.commit_hash)}-${expectedContentRoot.slice(0, 8)}.enc`;
252
+ const encFile = new File([new Uint8Array(encryptedBytes)], fname, { type: 'application/octet-stream' });
253
+ form.append('backup', encFile);
254
+ uploadRes = await apiClient.postMultipart('/v1/cli/backup', form);
255
+ if (!uploadRes?.backup_id || !uploadRes?.backup_cid) {
256
+ throw new Error('Malformed upload response.');
257
+ }
258
+ sUp.succeed(colors.success('Preservation uploaded.'));
259
+ }
260
+ catch (e) {
261
+ sUp.fail(colors.error('Preservation upload failed.'));
262
+ console.error(colors.error(String(e?.message || e)));
263
+ process.exitCode = 1;
264
+ return;
265
+ }
266
+ // 7) Output
267
+ if (opts.json) {
268
+ console.log(JSON.stringify(uploadRes, null, 2));
269
+ }
270
+ else {
271
+ console.log('');
272
+ console.log(colors.bold('🗄️ Preservation created'));
273
+ console.log(colors.dim('────────────────────────────────────────'));
274
+ console.log(colors.dim('Snapshot'));
275
+ console.log(` Snapshot ID ${snapshotMeta.snapshot_id}`);
276
+ console.log(` Repo ${snapshotMeta.repository_name}`);
277
+ console.log(` Commit ${shortCommit(snapshotMeta.commit_hash)}`);
278
+ console.log(` Merkle Root ${snapshotMeta.merkle_root ?? '(private root)'}`);
279
+ console.log(` Content Root ${expectedContentRoot}`);
280
+ console.log(` Snapshot URL ${getBaseUrl() + '/s/' + snapshotMeta.snapshot_id}`);
281
+ console.log('');
282
+ console.log(colors.dim('Backup'));
283
+ console.log(` Backup ID ${uploadRes.backup_id}`);
284
+ console.log(` Backup CID ${uploadRes.backup_cid}`);
285
+ console.log(` Tx Hash ${uploadRes.tx_hash}`);
286
+ console.log(` Explorer ${uploadRes.explorer_url}`);
287
+ console.log(colors.dim('────────────────────────────────────────'));
288
+ }
289
+ if (opts.noWait)
290
+ return;
291
+ const confTarget = Math.max(1, Number(opts.confirmations ?? 1));
292
+ try {
293
+ await waitForTxConfirmation({
294
+ txHash: uploadRes.tx_hash,
295
+ confirmations: confTarget,
296
+ timeoutMs: opts.timeoutMs,
297
+ silent: opts.json,
298
+ });
299
+ log(colors.success(`✓ Confirmed on-chain (${confTarget} confirmation${confTarget > 1 ? 's' : ''}).`));
300
+ }
301
+ catch (e) {
302
+ console.error(colors.error(String(e?.message || e)));
303
+ process.exitCode = 1;
304
+ }
305
+ }
306
+ export function registerBackupCommand(program) {
307
+ program
308
+ .command('preserve <snapshotId>')
309
+ .description('Create an encrypted backup of the exact source state for a published snapshot')
310
+ .option('--no-confirm', 'Skip interactive confirmation (CI / scripts)', false)
311
+ .option('--confirmations <n>', 'Wait for N confirmations (default: 1)', (v) => parseInt(v, 10))
312
+ .option('--timeout <ms>', 'Timeout waiting for confirmation (ms)', (v) => parseInt(v, 10))
313
+ .option('--no-wait', 'Do not wait for confirmation')
314
+ .option('--json', 'Output result in JSON format', false)
315
+ .action(async (snapshotId, options) => {
316
+ await handleBackup(snapshotId, {
317
+ confirmations: options.confirmations,
318
+ timeoutMs: options.timeout,
319
+ noWait: options.wait === false,
320
+ noConfirm: !!options.noConfirm,
321
+ json: !!options.json,
322
+ });
323
+ });
324
+ }
325
+ async function wrapDekForWorkspace(publicKeyB64, dek) {
326
+ await sodium.ready;
327
+ const pub = Buffer.from(publicKeyB64, 'base64');
328
+ if (pub.length !== 32)
329
+ throw new Error('Workspace public key must be 32 bytes (X25519).');
330
+ const wrapped = sodium.crypto_box_seal(new Uint8Array(dek), new Uint8Array(pub));
331
+ return {
332
+ version: 'x25519-sealedbox',
333
+ ciphertext_b64: Buffer.from(wrapped).toString('base64'),
334
+ };
335
+ }
336
+ async function gitArchiveToTarGz(args) {
337
+ await new Promise((resolve, reject) => {
338
+ const git = spawn('git', ['archive', '--format=tar', args.commitHash], { cwd: args.repoRoot });
339
+ const gzip = spawn('gzip', ['-9'], { cwd: args.repoRoot });
340
+ const out = createWriteStream(args.outTarGzAbs);
341
+ let err = '';
342
+ git.stderr.on('data', (d) => (err += d.toString()));
343
+ gzip.stderr.on('data', (d) => (err += d.toString()));
344
+ git.stdout.pipe(gzip.stdin);
345
+ gzip.stdout.pipe(out);
346
+ const fail = (code, label) => reject(new Error(err || `${label} failed (code=${code})`));
347
+ git.on('error', reject);
348
+ gzip.on('error', reject);
349
+ git.on('close', (code) => { if (code && code !== 0)
350
+ fail(code, 'git archive'); });
351
+ gzip.on('close', (code) => { if (code && code !== 0)
352
+ fail(code, 'gzip');
353
+ else
354
+ resolve(); });
355
+ });
356
+ }
357
+ function sha256Hex(buf) {
358
+ return crypto.createHash('sha256').update(buf).digest('hex');
359
+ }
360
+ function aes256gcmEncrypt(plaintext, key32, iv12) {
361
+ if (key32.length !== 32)
362
+ throw new Error('AES-256-GCM key must be 32 bytes.');
363
+ if (iv12.length !== 12)
364
+ throw new Error('AES-256-GCM iv must be 12 bytes.');
365
+ const cipher = createCipheriv('aes-256-gcm', key32, iv12);
366
+ const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
367
+ const tag = cipher.getAuthTag();
368
+ return { ciphertext, tag };
369
+ }
370
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/commands/backup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { apiClient } from '../services/apiClient.js';
2
+ import { colors, spinner } from '../services/ui.js';
3
+ import { ApiError } from '../services/errors.js';
4
+ import { waitForTxConfirmation } from '../services/txWaiter.js';
5
+ import { detectGitRepo, deriveRepoName } from '../services/git.js';
6
+ import { assertAuthenticated } from "../services/utilities.js";
7
+ export async function handleClaim(opts) {
8
+ if (!assertAuthenticated())
9
+ return;
10
+ // ─────────────────────────────────────────
11
+ // Detect git repository
12
+ // ─────────────────────────────────────────
13
+ const git = detectGitRepo(process.cwd());
14
+ if (!git.isRepo || !git.root) {
15
+ console.error(colors.error('This command must be run inside a git repository.'));
16
+ process.exitCode = 1;
17
+ return;
18
+ }
19
+ const repoName = deriveRepoName(git.root, git.remote);
20
+ if (!repoName) {
21
+ console.error(colors.error('Unable to determine repository name from git remote.'));
22
+ console.error(colors.dim('Make sure you have a GitHub origin remote configured.'));
23
+ process.exitCode = 1;
24
+ return;
25
+ }
26
+ // ─────────────────────────────────────────
27
+ // Submit claim
28
+ // ─────────────────────────────────────────
29
+ const s = spinner(`Claiming ${repoName} ...`);
30
+ let res;
31
+ try {
32
+ res = await apiClient.post('/v1/cli/claim', {
33
+ repo_name: repoName,
34
+ });
35
+ if (!res?.tx_hash || !res.tx_hash.startsWith('0x')) {
36
+ throw new Error('Backend did not return a valid tx_hash.');
37
+ }
38
+ s.succeed(colors.success('Claim submitted.'));
39
+ }
40
+ catch (e) {
41
+ s.fail(colors.error('Claim failed.'));
42
+ if (e instanceof ApiError && e.status === 401) {
43
+ console.error(colors.error('Unauthorized. Run `codequill login` again.'));
44
+ }
45
+ else if (e instanceof ApiError) {
46
+ console.error(colors.error(`${e.message} (${e.status})`));
47
+ }
48
+ else {
49
+ console.error(colors.error(String(e?.message || e)));
50
+ }
51
+ process.exitCode = 1;
52
+ return;
53
+ }
54
+ // ─────────────────────────────────────────
55
+ // UX output
56
+ // ─────────────────────────────────────────
57
+ console.log('');
58
+ console.log(colors.bold('🪶 Repository claim started'));
59
+ console.log(colors.dim('────────────────────────────────────────'));
60
+ console.log(colors.dim('Claim'));
61
+ console.log(` Repository ${res.repository_name}`);
62
+ console.log(` Repo ID ${res.repository_id}`);
63
+ console.log(` Tx Hash ${res.tx_hash}`);
64
+ if (res.explorer_url)
65
+ console.log(` Explorer ${res.explorer_url}`);
66
+ console.log(colors.dim('────────────────────────────────────────'));
67
+ if (opts.noWait) {
68
+ console.log(colors.dim('Note: skipping confirmation wait (--no-wait).'));
69
+ return;
70
+ }
71
+ // ─────────────────────────────────────────
72
+ // Wait for confirmations
73
+ // ─────────────────────────────────────────
74
+ const confTarget = Math.max(1, Number(opts.confirmations ?? 1));
75
+ try {
76
+ await waitForTxConfirmation({
77
+ txHash: res.tx_hash,
78
+ confirmations: confTarget,
79
+ timeoutMs: opts.timeoutMs,
80
+ });
81
+ console.log('');
82
+ console.log(colors.success('✔ Repository successfully claimed on-chain.'));
83
+ }
84
+ catch (e) {
85
+ console.error(colors.error(String(e?.message || e)));
86
+ process.exitCode = 1;
87
+ }
88
+ }
89
+ export function registerClaimCommand(program) {
90
+ program
91
+ .command('claim')
92
+ .description('Claim authorship of the current git repository (gasless, relayed)')
93
+ .option('--confirmations <n>', 'Wait for N confirmations (default: 1)', (v) => parseInt(v, 10))
94
+ .option('--timeout <ms>', 'Timeout waiting for confirmation (ms)', (v) => parseInt(v, 10))
95
+ .option('--no-wait', 'Do not wait for confirmation')
96
+ .action(async (options) => {
97
+ await handleClaim({
98
+ confirmations: options.confirmations,
99
+ timeoutMs: options.timeout,
100
+ noWait: options.wait === false
101
+ });
102
+ });
103
+ }
104
+ //# sourceMappingURL=claim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claim.js","sourceRoot":"","sources":["../../src/commands/claim.ts"],"names":[],"mappings":"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"}