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 @@
1
+ {"version":3,"file":"revoke.js","sourceRoot":"","sources":["../../src/commands/revoke.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,128 @@
1
+ import path from 'node:path';
2
+ import { colors, shortCommit, spinner } from '../services/ui.js';
3
+ import { detectGitRepo, deriveRepoName } from '../services/git.js';
4
+ import { writeFileUtf8 } from '../services/fs.js';
5
+ import { SnapshotIndex } from '../services/snapshotIndex.js';
6
+ import { buildSnapshotManifest } from "../services/manifests/snapshotManifest.js";
7
+ import { assertAuthenticated } from '../services/utilities.js';
8
+ import { apiClient } from '../services/apiClient.js';
9
+ async function fetchWorkspaceEncryptionPublicForSnapshot(repoName) {
10
+ return apiClient.get(`/v1/cli/encryption?repo_name=${encodeURIComponent(repoName)}`);
11
+ }
12
+ export async function handleSnapshot(opts) {
13
+ if (!assertAuthenticated())
14
+ return;
15
+ const git = detectGitRepo(process.cwd());
16
+ if (!git.isRepo || !git.root) {
17
+ console.error(colors.error('This command must be run inside a git repository.'));
18
+ process.exitCode = 1;
19
+ return;
20
+ }
21
+ const repoName = deriveRepoName(git.root, git.remote);
22
+ if (!repoName) {
23
+ console.error(colors.error('Unable to determine repo name from git remote.'));
24
+ process.exitCode = 1;
25
+ return;
26
+ }
27
+ const commitHash = opts.commit || git.head || null;
28
+ if (!commitHash) {
29
+ console.error(colors.error('Unable to determine commit hash.'));
30
+ process.exitCode = 1;
31
+ return;
32
+ }
33
+ const concurrency = Math.max(1, Number(opts.concurrency ?? 8));
34
+ const defaultOut = path.join('.codequill', 'snapshots', `snapshot-${shortCommit(commitHash)}.json`);
35
+ const outPath = path.resolve(defaultOut);
36
+ // 1) Fetch workspace encryption public key (needed to encrypt path map)
37
+ const sKey = spinner('Fetching workspace encryption key ...');
38
+ let encPub;
39
+ try {
40
+ encPub = await fetchWorkspaceEncryptionPublicForSnapshot(repoName);
41
+ if (!encPub?.public_key_b64)
42
+ throw new Error('Missing public_key_b64');
43
+ sKey.succeed(colors.success('Workspace encryption key loaded.'));
44
+ }
45
+ catch (e) {
46
+ sKey.fail(colors.error('Failed to load workspace encryption key.'));
47
+ console.error(colors.error(String(e?.message || e)));
48
+ process.exitCode = 1;
49
+ return;
50
+ }
51
+ // 2) Build manifest
52
+ const s = spinner(`Building snapshot manifest for ${repoName}@${commitHash}...`);
53
+ try {
54
+ const out = await buildSnapshotManifest({
55
+ repoRoot: git.root,
56
+ repoName,
57
+ commitHash,
58
+ concurrency,
59
+ workspaceEncPublic: {
60
+ public_key_b64: encPub.public_key_b64,
61
+ key_id: encPub.key_id,
62
+ workspace_id: encPub.workspace_id,
63
+ },
64
+ });
65
+ s.succeed(colors.success(`Manifest built.`));
66
+ const sOut = spinner(`Writing manifest to ${outPath}...`);
67
+ await writeFileUtf8(outPath, JSON.stringify(out.manifest, null, 2));
68
+ sOut.succeed(colors.success('Manifest saved.'));
69
+ try {
70
+ const rel = path.relative(git.root, outPath).split(path.sep).join('/');
71
+ const index = new SnapshotIndex({ repoRoot: git.root, repoName });
72
+ await index.load();
73
+ index.upsertFromManifestFile({
74
+ manifestFileRel: rel,
75
+ manifest: {
76
+ commit: out.manifest.commit,
77
+ merkle_root: out.manifest.merkle_root,
78
+ timestamp: out.manifest.timestamp,
79
+ },
80
+ kind: 'local',
81
+ });
82
+ await index.save();
83
+ }
84
+ catch (e) {
85
+ console.error(colors.warn('⚠ Could not update snapshot index.'));
86
+ console.error(colors.dim(String(e?.message || e)));
87
+ process.exitCode = 1;
88
+ }
89
+ console.log('');
90
+ console.log(colors.bold('πŸ“¦ Snapshot (local)'));
91
+ console.log(colors.dim('────────────────────────────────────────'));
92
+ console.log(out.manifest.statement);
93
+ console.log(colors.dim('\nSnapshot'));
94
+ console.log(` Repository ${repoName}`);
95
+ console.log(` Commit ${commitHash}`);
96
+ console.log(` Merkle Root ${out.manifest.merkle_root}`);
97
+ console.log(` Content Root ${out.manifest.content_root}`);
98
+ console.log(` Paths private (encrypted path map)`);
99
+ console.log('');
100
+ console.log(colors.dim('Contents'));
101
+ console.log(` Files ${out.fileCount}`);
102
+ console.log('');
103
+ console.log(colors.dim('Output'));
104
+ console.log(` Manifest ${outPath}`);
105
+ console.log(colors.dim('────────────────────────────────────────'));
106
+ console.log(colors.dim('Next: publish this snapshot to pin the manifest and anchor the Merkle root on-chain.'));
107
+ console.log(colors.dim(` codequill publish ${outPath}`));
108
+ }
109
+ catch (e) {
110
+ s.fail(colors.error('Failed to build snapshot.'));
111
+ console.error(colors.error(String(e?.message || e)));
112
+ process.exitCode = 1;
113
+ }
114
+ }
115
+ export function registerSnapshotCommand(program) {
116
+ program
117
+ .command('snapshot')
118
+ .description('Create a local snapshot manifest (Merkle root) for the current git repository')
119
+ .option('--commit <hash>', 'Commit hash to snapshot (defaults to git HEAD)')
120
+ .option('--concurrency <n>', 'Concurrent file reads (default: 8)', (v) => parseInt(v, 10))
121
+ .action(async (options) => {
122
+ await handleSnapshot({
123
+ commit: options.commit,
124
+ concurrency: options.concurrency,
125
+ });
126
+ });
127
+ }
128
+ //# sourceMappingURL=snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot.js","sourceRoot":"","sources":["../../src/commands/snapshot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { colors, fmtTime, shortAddr, spinner } from '../services/ui.js';
2
+ import { apiClient } from '../services/apiClient.js';
3
+ import { getBaseUrl } from '../services/config.js';
4
+ import { ApiError } from '../services/errors.js';
5
+ import { detectGitRepo, deriveRepoName } from '../services/git.js';
6
+ import { SnapshotIndex } from '../services/snapshotIndex.js';
7
+ import { assertAuthenticated } from "../services/utilities.js";
8
+ function safeLower(x) {
9
+ return String(x || '').trim().toLowerCase();
10
+ }
11
+ async function fetchPublishedSnapshots(repoName) {
12
+ const res = await apiClient.get(`/v1/cli/snapshots?repo_name=${encodeURIComponent(repoName)}`);
13
+ const list = Array.isArray(res?.snapshots) ? res.snapshots : [];
14
+ return list.map((p) => ({
15
+ snapshot_id: String(p.snapshot_id),
16
+ merkle_root: String(p.merkle_root ?? ''),
17
+ commit_hash: String(p.commit_hash ?? ''),
18
+ published_at: typeof p.published_at === 'number' ? p.published_at : 0,
19
+ tx_hash: p.tx_hash ?? undefined,
20
+ chain_id: typeof p.chain_id === 'number' ? p.chain_id : undefined,
21
+ manifest_cid: p.manifest_cid ?? undefined,
22
+ wallet_address: p.wallet_address ?? undefined,
23
+ }));
24
+ }
25
+ export async function handleStatus(_opts) {
26
+ if (!assertAuthenticated())
27
+ return;
28
+ // Must run inside repo (no --path)
29
+ const git = detectGitRepo(process.cwd());
30
+ if (!git.isRepo || !git.root) {
31
+ console.error(colors.error('This command must be run inside a git repository.'));
32
+ process.exitCode = 1;
33
+ return;
34
+ }
35
+ const repoName = deriveRepoName(git.root, git.remote);
36
+ if (!repoName) {
37
+ console.error(colors.error('Unable to determine repository name from git remote.'));
38
+ console.error(colors.dim('Make sure you have a GitHub origin remote configured.'));
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ const head = git.head ?? '';
43
+ // Load index (self-heals / rebuilds from disk if missing/corrupt)
44
+ const sIdx = spinner('Loading snapshot index ...');
45
+ const index = new SnapshotIndex({ repoRoot: git.root, repoName });
46
+ try {
47
+ await index.load();
48
+ sIdx.succeed(colors.success('Index loaded.'));
49
+ }
50
+ catch {
51
+ sIdx.fail(colors.warn('Could not load index (will attempt rebuild).'));
52
+ try {
53
+ await index.rebuildFromDisk();
54
+ await index.save();
55
+ }
56
+ catch {
57
+ // keep going, status can still work from backend alone
58
+ }
59
+ }
60
+ // Backend status (authoritative for claimed/workspace + latest snapshot)
61
+ const s = spinner(`Loading CodeQuill status for ${repoName} ...`);
62
+ let st;
63
+ try {
64
+ st = await apiClient.get(`/v1/cli/status?repo_name=${encodeURIComponent(repoName)}`);
65
+ s.succeed(colors.success('Status loaded.'));
66
+ }
67
+ catch (e) {
68
+ s.fail(colors.error('Failed to load status.'));
69
+ if (e instanceof ApiError && e.status === 401) {
70
+ console.error(colors.error('Unauthorized. Run `codequill login` again.'));
71
+ }
72
+ else if (e instanceof ApiError) {
73
+ console.error(colors.error(`${e.message} (${e.status})`));
74
+ if (e.requestId)
75
+ console.error(colors.dim(`Request ID: ${e.requestId}`));
76
+ if (e.method && e.url)
77
+ console.error(colors.dim(`Endpoint: ${e.method} ${e.url}`));
78
+ }
79
+ else {
80
+ console.error(colors.error(String(e?.message || e)));
81
+ }
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ // Enrich index with published data (so we can compute pending accurately even if status omits roots)
86
+ let publishedFromBackend = [];
87
+ const sPub = spinner('Loading published snapshot metadata ...');
88
+ try {
89
+ publishedFromBackend = await fetchPublishedSnapshots(repoName);
90
+ index.enrichFromBackend(publishedFromBackend);
91
+ await index.save();
92
+ sPub.succeed(colors.success(`Loaded ${publishedFromBackend.length} published snapshot${publishedFromBackend.length === 1 ? '' : 's'}.`));
93
+ }
94
+ catch (e) {
95
+ // Not fatal (status endpoint already includes latest + count)
96
+ sPub.fail(colors.warn('Could not load published snapshot list (continuing).'));
97
+ if (e instanceof ApiError) {
98
+ console.error(colors.dim(`Backend: ${e.message} (${e.status})`));
99
+ if (e.requestId)
100
+ console.error(colors.dim(`Request ID: ${e.requestId}`));
101
+ }
102
+ else {
103
+ console.error(colors.dim(String(e?.message || e)));
104
+ }
105
+ }
106
+ const items = (() => {
107
+ try {
108
+ return index.list();
109
+ }
110
+ catch {
111
+ return [];
112
+ }
113
+ })();
114
+ // Derive local/published sets from index (source of truth for "what exists locally" + published attachments)
115
+ const localItems = items.filter((it) => !!it.file && (it.kind === 'local' || it.kind === 'pulled'));
116
+ const localCount = localItems.length;
117
+ const latestLocalRoot = index.latestLocalRoot();
118
+ const latestPublishedRoot = index.latestPublishedRoot();
119
+ const publishedRootSet = new Set();
120
+ for (const it of items) {
121
+ if (it.published?.published_at) {
122
+ const r = it.merkle_root;
123
+ if (r)
124
+ publishedRootSet.add(r);
125
+ }
126
+ }
127
+ // Pending locals = local files whose roots are not in published set
128
+ const pendingLocal = localItems.filter((it) => {
129
+ const r = it.merkle_root;
130
+ if (!r)
131
+ return true;
132
+ return !publishedRootSet.has(r);
133
+ });
134
+ const latest = st.latest_snapshot ?? null;
135
+ // In sync = HEAD commit equals latest published commit (commit-based)
136
+ const inSync = !!latest && !!head && safeLower(latest.commit_hash) === safeLower(head);
137
+ const aheadOfChain = pendingLocal.length > 0 && (st.published_count > 0 || publishedRootSet.size > 0);
138
+ // --------
139
+ // Output
140
+ // --------
141
+ console.log('');
142
+ console.log(colors.bold('πŸ“¦ CodeQuill Status'));
143
+ console.log(colors.dim('────────────────────────────────────────'));
144
+ console.log(`Repository ${repoName}`);
145
+ console.log(`Workspace ${st.workspace_name} (${colors.info(st.workspace_plan)} plan)`);
146
+ if (head)
147
+ console.log(`HEAD ${head}`);
148
+ console.log('');
149
+ console.log(colors.dim('Ownership'));
150
+ if (!st.claimed) {
151
+ console.log(` Status ${colors.error('❌ not claimed')}`);
152
+ console.log(` Wallet β€”`);
153
+ console.log(` Repo ID β€”`);
154
+ }
155
+ else {
156
+ console.log(` Status ${colors.success('βœ… claimed')}`);
157
+ console.log(` Wallet ${st.claimed_wallet ? shortAddr(st.claimed_wallet) : 'β€”'}`);
158
+ console.log(` Repo ID ${st.repo_id ?? 'β€”'}`);
159
+ }
160
+ console.log('');
161
+ console.log(colors.dim('Snapshots'));
162
+ console.log(` Published ${st.published_count}`);
163
+ if (latest && st.published_count > 0) {
164
+ console.log(` Latest`);
165
+ if (latest.snapshot_id)
166
+ console.log(` Snapshot ID ${getBaseUrl() + '/s/' + latest.snapshot_id}`);
167
+ console.log(` Commit ${latest.commit_hash}`);
168
+ console.log(` Merkle Root ${latest.merkle_root}`);
169
+ if (latest.timestamp)
170
+ console.log(` Timestamp ${fmtTime(latest.timestamp)}`);
171
+ if (latest.explorer_url)
172
+ console.log(` Tx ${latest.explorer_url}`);
173
+ else if (latest.tx_hash)
174
+ console.log(` Tx ${latest.tx_hash}`);
175
+ if (inSync)
176
+ console.log(` Latest ${colors.success('βœ” in sync with HEAD')}`);
177
+ }
178
+ else {
179
+ console.log(` Latest β€”`);
180
+ }
181
+ console.log('');
182
+ console.log(colors.dim('Local'));
183
+ const unpublishedTag = pendingLocal.length > 0 ? ` (${colors.warn('unpublished')})` : '';
184
+ console.log(` Snapshots ${localCount}${unpublishedTag}`);
185
+ console.log(` Latest local ${latestLocalRoot ? (latestLocalRoot).slice(0, 12) : 'β€”'}`);
186
+ console.log(` Latest pub ${latestPublishedRoot ? (latestPublishedRoot).slice(0, 12) : 'β€”'}`);
187
+ console.log('');
188
+ console.log(colors.dim('Status'));
189
+ if (!st.claimed) {
190
+ console.log(` ${colors.warn('⚠ repository not claimed')}`);
191
+ }
192
+ else if (st.published_count === 0 && localCount > 0) {
193
+ console.log(` ${colors.warn('β†₯ local snapshots exist')} (nothing published yet)`);
194
+ }
195
+ else if (aheadOfChain) {
196
+ console.log(` ${colors.warn('β†₯ ahead of chain')} (${pendingLocal.length} local snapshot${pendingLocal.length === 1 ? '' : 's'} not published)`);
197
+ }
198
+ else if (inSync && st.claimed && st.published_count > 0 && pendingLocal.length === 0) {
199
+ console.log(` ${colors.success('βœ” Repository is fully anchored and verifiable')}`);
200
+ }
201
+ else if (st.published_count > 0) {
202
+ console.log(` ${colors.success('βœ” up to date')} (no pending local snapshots)`);
203
+ }
204
+ else {
205
+ console.log(` ${colors.info('β€’')} no snapshots yet`);
206
+ }
207
+ console.log('');
208
+ console.log(colors.dim('Next steps'));
209
+ if (!st.claimed) {
210
+ console.log(` β†’ Run \`codequill claim\``);
211
+ }
212
+ else if (pendingLocal.length > 0) {
213
+ // pick newest pending based on index ordering (already newest-first)
214
+ const next = pendingLocal[0];
215
+ console.log(` β†’ Run \`codequill publish ${next.file}\``);
216
+ }
217
+ else if (st.published_count === 0) {
218
+ console.log(` β†’ Run \`codequill snapshot\` then \`codequill publish .codequill/snapshots/snapshot-<commit>.json\``);
219
+ }
220
+ else {
221
+ console.log(` β†’ Run \`codequill snapshot\` to create a new local snapshot`);
222
+ console.log(` β†’ Run \`codequill log\` to view snapshot history`);
223
+ }
224
+ console.log(colors.dim('────────────────────────────────────────'));
225
+ }
226
+ export function registerStatusCommand(program) {
227
+ program
228
+ .command('status')
229
+ .description('Show CodeQuill status for the current repository (claimed / snapshots / local vs chain)')
230
+ .action(async () => {
231
+ await handleStatus({});
232
+ });
233
+ }
234
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,212 @@
1
+ import { colors, spinner, relativeTime, shortHash, shortCommit } from '../services/ui.js';
2
+ import { apiClient } from '../services/apiClient.js';
3
+ import { ApiError } from '../services/errors.js';
4
+ import { getBaseUrl } from '../services/config.js';
5
+ import { chainName } from '../services/utilities.js';
6
+ function normalizeHex(input) {
7
+ return String(input ?? '').trim().toLowerCase().replace(/^0x/, '');
8
+ }
9
+ function parseDigest(raw) {
10
+ const s0 = String(raw ?? '').trim();
11
+ // sha256:<hex> or sha512:<hex>
12
+ const m = s0.match(/^(sha256|sha512):([0-9a-fA-F]+)$/);
13
+ if (m) {
14
+ const algo = m[1].toLowerCase();
15
+ const dig = normalizeHex(m[2]);
16
+ if (algo === 'sha256' && !/^[0-9a-f]{64}$/.test(dig))
17
+ throw new Error(`Invalid sha256 digest: ${raw}`);
18
+ if (algo === 'sha512' && !/^[0-9a-f]{128}$/.test(dig))
19
+ throw new Error(`Invalid sha512 digest: ${raw}`);
20
+ return { algo, digest: dig };
21
+ }
22
+ // Docker style: image@sha256:<hex>
23
+ const m2 = s0.match(/@sha256:([0-9a-fA-F]{64})$/);
24
+ if (m2)
25
+ return { algo: 'sha256', digest: normalizeHex(m2[1]) };
26
+ // Raw hex: infer by length
27
+ const dig = normalizeHex(s0);
28
+ if (/^[0-9a-f]{64}$/.test(dig))
29
+ return { algo: 'sha256', digest: dig };
30
+ if (/^[0-9a-f]{128}$/.test(dig))
31
+ return { algo: 'sha512', digest: dig };
32
+ throw new Error(`Unrecognized digest format: ${raw}`);
33
+ }
34
+ function fmtUtc(ts) {
35
+ if (!ts || !Number.isFinite(ts))
36
+ return 'β€”';
37
+ try {
38
+ return new Date(ts * 1000).toUTCString();
39
+ }
40
+ catch {
41
+ return 'β€”';
42
+ }
43
+ }
44
+ function printSnapshotBlock(s) {
45
+ console.log(colors.dim('Snapshot'));
46
+ console.log(` Repo ${s.repo_name}`);
47
+ console.log(` Commit ${s.commit_hash ? shortCommit(s.commit_hash).padEnd(14) + colors.dim(` (${s.commit_hash})`) : 'β€”'}`);
48
+ console.log(` Merkle Root ${s.merkle_root}`);
49
+ console.log(` Snapshot ID ${getBaseUrl() + '/s/' + s.snapshot_id}`);
50
+ if (s.chain_id)
51
+ console.log(` Chain ${chainName(s.chain_id) ?? s.chain_id}`);
52
+ if (s.published_at)
53
+ console.log(` Published ${fmtUtc(s.published_at)} (${relativeTime(s.published_at)})`);
54
+ if (s.wallet_address)
55
+ console.log(` Authority ${s.wallet_address}`);
56
+ if (s.explorer_url)
57
+ console.log(` Tx ${s.explorer_url}`);
58
+ else if (s.tx_hash)
59
+ console.log(` Tx ${s.tx_hash}`);
60
+ }
61
+ function printAttestationBlock(a) {
62
+ console.log(colors.dim('Attestation'));
63
+ console.log(` Type ${a.type}`);
64
+ console.log(` Digest ${a.artifact_algorithm}:${a.artifact_digest}`);
65
+ console.log(` Attested ${fmtUtc(a.attested_at)} (${relativeTime(a.attested_at)})`);
66
+ if (a.chain_id)
67
+ console.log(` Chain ${chainName(a.chain_id) ?? a.chain_id}`);
68
+ console.log(` Wallet ${a.wallet_address}`);
69
+ console.log(` Contract ${a.contract_address}`);
70
+ if (a.explorer_url)
71
+ console.log(` Tx ${a.explorer_url}`);
72
+ else
73
+ console.log(` Tx ${a.tx_hash}`);
74
+ console.log(` Manifest CID ${a.manifest_cid}`);
75
+ if (a.manifest_encoding)
76
+ console.log(` Encoding ${a.manifest_encoding}`);
77
+ }
78
+ function pickBest(matches) {
79
+ if (!matches || matches.length === 0)
80
+ return null;
81
+ // Best = newest attested_at
82
+ const sorted = [...matches].sort((x, y) => (y.attestation.attested_at ?? 0) - (x.attestation.attested_at ?? 0));
83
+ return sorted[0];
84
+ }
85
+ // Proposed backend route:
86
+ // GET /v1/cli/attestations/verify?algo=sha256&digest=<hex>
87
+ // returns VerifyAttestationResponse
88
+ async function fetchVerifyReport(algo, digest) {
89
+ const url = `/v1/cli/attestations/verify?algo=${encodeURIComponent(algo)}&digest=${encodeURIComponent(digest)}`;
90
+ return apiClient.get(url);
91
+ }
92
+ export async function handleVerifyAttestation(opts) {
93
+ let parsed;
94
+ try {
95
+ parsed = parseDigest(opts.digest);
96
+ }
97
+ catch (e) {
98
+ console.error(colors.error(String(e?.message || e)));
99
+ process.exitCode = 1;
100
+ return;
101
+ }
102
+ const s = spinner('Verifying attestation ...');
103
+ let rep;
104
+ try {
105
+ rep = await fetchVerifyReport(parsed.algo, parsed.digest);
106
+ s.succeed(colors.success('Verification complete.'));
107
+ }
108
+ catch (e) {
109
+ s.fail(colors.error('Verification failed.'));
110
+ if (e instanceof ApiError) {
111
+ console.error(colors.error(`${e.message} (${e.status})`));
112
+ if (e.requestId)
113
+ console.error(colors.dim(`Request ID: ${e.requestId}`));
114
+ // Helpful hint if you decide to make verify public:
115
+ if (e.status === 401)
116
+ console.error(colors.dim('Hint: this endpoint may be public; if not, run `codequill login` first.'));
117
+ }
118
+ else {
119
+ console.error(colors.error(String(e?.message || e)));
120
+ }
121
+ process.exitCode = 1;
122
+ return;
123
+ }
124
+ // normalize best if backend didn’t provide it
125
+ if (!rep.best && rep.matches?.length) {
126
+ rep.best = pickBest(rep.matches) ?? undefined;
127
+ }
128
+ console.log('');
129
+ console.log(colors.bold('πŸ”Ž CodeQuill Attestation Verification'));
130
+ console.log(colors.dim('────────────────────────────────────────'));
131
+ console.log(`Digest ${parsed.algo}:${parsed.digest}`);
132
+ if (rep.notes?.length) {
133
+ console.log('');
134
+ console.log(colors.dim('Notes'));
135
+ for (const n of rep.notes)
136
+ console.log(colors.dim(` β€’ ${n}`));
137
+ }
138
+ if (!rep.found || !rep.best) {
139
+ console.log('');
140
+ console.log(colors.warn('No CodeQuill attestation found for this digest.'));
141
+ console.log(colors.dim('What this means:'));
142
+ console.log(colors.dim(' β€’ The artifact may be legitimate, but it was not attested (yet).'));
143
+ console.log(colors.dim(' β€’ Or you used a different digest algorithm than what was attested.'));
144
+ console.log(colors.dim('Tip: ensure you used the same algo (sha256 vs sha512).'));
145
+ console.log(colors.dim('────────────────────────────────────────'));
146
+ return;
147
+ }
148
+ const best = rep.best;
149
+ console.log('');
150
+ printAttestationBlock(best.attestation);
151
+ console.log('');
152
+ printSnapshotBlock(best.snapshot);
153
+ // If multiple matches exist, show a small list
154
+ const matches = rep.matches ?? [];
155
+ if (matches.length > 1) {
156
+ console.log('');
157
+ console.log(colors.dim(`Other matching attestations (${matches.length - 1})`));
158
+ // show up to 5 others
159
+ const others = [...matches]
160
+ .sort((a, b) => (b.attestation.attested_at ?? 0) - (a.attestation.attested_at ?? 0))
161
+ .slice(1, 6);
162
+ for (const m of others) {
163
+ const a = m.attestation;
164
+ const sMeta = m.snapshot;
165
+ const when = a.attested_at ? relativeTime(a.attested_at) : 'β€”';
166
+ console.log(` β€’ ${colors.dim(a.type.padEnd(10))} ${colors.dim(when.padEnd(14))} ` +
167
+ `${colors.dim(shortHash(sMeta.merkle_root, 10))} ${colors.dim(sMeta.repo_name)}`);
168
+ }
169
+ if (matches.length - 1 > others.length) {
170
+ console.log(colors.dim(` … ${matches.length - 1 - others.length} more`));
171
+ }
172
+ }
173
+ // Upstream (one-hop)
174
+ const upstream = best.attestation?.upstream;
175
+ const upstreamMatches = rep.upstream_matches;
176
+ if ((upstream && upstream.length) || (upstreamMatches && upstreamMatches.length)) {
177
+ console.log('');
178
+ console.log(colors.dim('Upstream (1 hop)'));
179
+ if (upstreamMatches && upstreamMatches.length) {
180
+ for (const u of upstreamMatches) {
181
+ const label = `${u.artifact.algo}:${shortHash(u.artifact.digest, 16)}`;
182
+ if (!u.found || !u.best) {
183
+ console.log(` ${colors.warn('βœ—')} ${label} ${colors.dim('no CodeQuill attestation')}`);
184
+ continue;
185
+ }
186
+ const a = u.best.attestation;
187
+ const sMeta = u.best.snapshot;
188
+ console.log(` ${colors.success('βœ”')} ${label}`);
189
+ console.log(` Repo ${colors.dim(sMeta.repo_name)}`);
190
+ console.log(` Snapshot ${colors.dim(getBaseUrl() + '/s/' + sMeta.snapshot_id)}`);
191
+ console.log(` Attested ${colors.dim(fmtUtc(a.attested_at))}`);
192
+ }
193
+ }
194
+ else {
195
+ // If backend doesn’t resolve upstream, still show declared list
196
+ for (const u of upstream ?? []) {
197
+ console.log(` β€’ ${u.algo}:${shortHash(u.digest, 24)} ${colors.dim('(declared, not resolved)')}`);
198
+ }
199
+ console.log(colors.dim(' Tip: backend can resolve these by digest to show 1-hop lineage.'));
200
+ }
201
+ }
202
+ console.log(colors.dim('────────────────────────────────────────'));
203
+ }
204
+ export function registerVerifyAttestationCommand(program) {
205
+ program
206
+ .command('verify-attestation <digest>')
207
+ .description('Verify whether a CodeQuill attestation exists for a given artifact digest and print a full lineage report')
208
+ .action(async (digest) => {
209
+ await handleVerifyAttestation({ digest });
210
+ });
211
+ }
212
+ //# sourceMappingURL=verifyAttestation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyAttestation.js","sourceRoot":"","sources":["../../src/commands/verifyAttestation.ts"],"names":[],"mappings":"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"}