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,145 @@
1
+ import fs from "node:fs/promises";
2
+ import { resolvePath } from "../services/paths.js";
3
+ import { colors, spinner } from "../services/ui.js";
4
+ import { parentHash } from "../services/merkle.js";
5
+ import { hexToBytes, concatBytes, keccakHex } from "../services/crypto.js";
6
+ function isHex64(x) {
7
+ return typeof x === "string" && /^[0-9a-f]{64}$/i.test(x);
8
+ }
9
+ function leafHashFromInputs(pathHash, fileHash) {
10
+ // leaf = keccak(0x00 || pathHash || fileHash)
11
+ const leafBytes = concatBytes(concatBytes(new Uint8Array([0x00]), hexToBytes(pathHash)), hexToBytes(fileHash));
12
+ return keccakHex(leafBytes).toLowerCase();
13
+ }
14
+ function fmtChainId(chainId) {
15
+ if (!chainId)
16
+ return "unknown chain";
17
+ if (chainId === 1)
18
+ return "Ethereum Mainnet";
19
+ if (chainId === 11155111)
20
+ return "Sepolia Testnet";
21
+ return `chain ${chainId}`;
22
+ }
23
+ export async function handleVerifyProof(opts) {
24
+ const p = resolvePath(opts.proofFile);
25
+ const s = spinner("Verifying proof…");
26
+ try {
27
+ const raw = await fs.readFile(p, "utf8");
28
+ const proof = JSON.parse(raw);
29
+ // ---- basic structure checks ----
30
+ if (!proof || proof.version !== "codequill-proof:v1") {
31
+ throw new Error("Invalid proof: version mismatch (expected codequill-proof:v1)");
32
+ }
33
+ const root = String(proof.merkle_root ?? "").toLowerCase();
34
+ const fileHash = String(proof.file?.hash ?? "").toLowerCase();
35
+ const pathHash = String(proof.file?.path_hash ?? "").toLowerCase();
36
+ const leafIn = String(proof.leaf ?? "").toLowerCase();
37
+ if (!isHex64(root))
38
+ throw new Error("Invalid proof: merkle_root must be 64 hex (no 0x)");
39
+ if (!isHex64(fileHash))
40
+ throw new Error("Invalid proof: file.hash must be 64 hex (no 0x)");
41
+ if (!isHex64(pathHash))
42
+ throw new Error("Invalid proof: file.path_hash must be 64 hex (no 0x)");
43
+ if (!isHex64(leafIn))
44
+ throw new Error("Invalid proof: leaf must be 64 hex (no 0x)");
45
+ if (!Array.isArray(proof.proof) || proof.proof.length === 0) {
46
+ throw new Error("Invalid proof: proof[] must be non-empty");
47
+ }
48
+ // ---- recompute leaf ----
49
+ const expectedLeaf = leafHashFromInputs(pathHash, fileHash);
50
+ if (expectedLeaf !== leafIn) {
51
+ throw new Error(`Leaf mismatch: computed ${expectedLeaf} != proof ${leafIn}`);
52
+ }
53
+ // ---- fold proof steps ----
54
+ let acc = expectedLeaf;
55
+ for (let i = 0; i < proof.proof.length; i++) {
56
+ const step = proof.proof[i];
57
+ const h = String(step?.hash ?? "").toLowerCase();
58
+ const side = step?.side;
59
+ if (!/^[0-9a-f]{64}$/.test(h)) {
60
+ throw new Error(`Invalid proof step hash at index ${i} (must be 64 hex)`);
61
+ }
62
+ if (side !== "left" && side !== "right") {
63
+ throw new Error(`Invalid proof step side at index ${i} (left|right)`);
64
+ }
65
+ acc = side === "left" ? parentHash(h, acc) : parentHash(acc, h);
66
+ }
67
+ if (acc !== root) {
68
+ throw new Error(`Root mismatch: computed ${acc} != expected ${root}`);
69
+ }
70
+ // ---- success UX ----
71
+ s.succeed(colors.success("Proof is valid."));
72
+ // Print the manifest's statement if present
73
+ const stmt = typeof proof.statement === "string" ? proof.statement.trim() : "";
74
+ if (stmt) {
75
+ console.log("");
76
+ console.log(colors.bold("Statement"));
77
+ console.log(colors.dim("────────────────────────────────────────"));
78
+ console.log(stmt);
79
+ console.log(colors.dim("────────────────────────────────────────"));
80
+ }
81
+ console.log("");
82
+ console.log(colors.dim("Proof details"));
83
+ if (proof.repo)
84
+ console.log(` Repo ${proof.repo}`);
85
+ if (proof.commit)
86
+ console.log(` Commit ${proof.commit}`);
87
+ console.log(` Root ${root}`);
88
+ console.log(` Leaf ${expectedLeaf}`);
89
+ console.log(` Steps ${proof.proof.length}`);
90
+ // privacy summary
91
+ const priv = proof.privacy;
92
+ if (priv) {
93
+ const disclosed = !!priv.disclosed_path;
94
+ const binding = priv.path_binding ?? "not_provided";
95
+ console.log("");
96
+ console.log(colors.dim("Privacy"));
97
+ console.log(` Disclosed path ${disclosed ? "yes" : "no"}`);
98
+ console.log(` Path binding ${binding}`);
99
+ if (disclosed) {
100
+ // Make the tradeoff explicit (since users will paste/share proofs)
101
+ console.log(colors.warn(" Warning plaintext path is included; share carefully"));
102
+ }
103
+ if (disclosed && typeof priv.path_plaintext === "string" && priv.path_plaintext.length) {
104
+ console.log(` Path (plaintext) ${priv.path_plaintext}`);
105
+ }
106
+ }
107
+ // On-chain block (if present)
108
+ if (proof.snapshot && (proof.snapshot.snapshot_id || proof.snapshot.tx_hash || proof.snapshot.explorer_url)) {
109
+ console.log("");
110
+ console.log(colors.dim("Snapshot"));
111
+ if (proof.snapshot.snapshot_id)
112
+ console.log(` Snapshot ID ${proof.snapshot.snapshot_id}`);
113
+ if (proof.snapshot.chain_id)
114
+ console.log(` Chain ${fmtChainId(proof.snapshot.chain_id)}`);
115
+ if (proof.snapshot.published_at)
116
+ console.log(` Published ${new Date(proof.snapshot.published_at * 1000).toUTCString()}`);
117
+ if (proof.snapshot.publisher_wallet)
118
+ console.log(` Authority ${proof.snapshot.publisher_wallet}`);
119
+ if (proof.snapshot.explorer_url)
120
+ console.log(` Tx ${proof.snapshot.explorer_url}`);
121
+ else if (proof.snapshot.tx_hash)
122
+ console.log(` Tx ${proof.snapshot.tx_hash}`);
123
+ if (proof.snapshot.manifest_cid)
124
+ console.log(` Manifest ${proof.snapshot.manifest_cid}`);
125
+ }
126
+ console.log("");
127
+ }
128
+ catch (e) {
129
+ try {
130
+ s.fail(colors.error("Proof invalid."));
131
+ }
132
+ catch { }
133
+ console.error(colors.error(String(e?.message || e)));
134
+ process.exitCode = 1;
135
+ }
136
+ }
137
+ export function registerVerifyProofCommand(program) {
138
+ program
139
+ .command("verify-proof <proofFile>")
140
+ .description("Verify a CodeQuill proof manifest (public verification, no auth required).")
141
+ .action(async (proofFile) => {
142
+ await handleVerifyProof({ proofFile });
143
+ });
144
+ }
145
+ //# sourceMappingURL=verifyProof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyProof.js","sourceRoot":"","sources":["../../src/commands/verifyProof.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { colors } from '../services/ui.js';
2
+ import { waitForTxConfirmation } from '../services/txWaiter.js';
3
+ /**
4
+ * Handle the "wait" command
5
+ */
6
+ async function handleWait(txHash, opts) {
7
+ const confTarget = Math.max(1, Number(opts.confirmations ?? 1));
8
+ try {
9
+ await waitForTxConfirmation({
10
+ txHash: txHash,
11
+ confirmations: confTarget,
12
+ timeoutMs: opts.timeout,
13
+ });
14
+ console.log(colors.success(`✓ Confirmed on-chain (${confTarget} confirmation${confTarget > 1 ? 's' : ''}).`));
15
+ }
16
+ catch (e) {
17
+ // waitForTxConfirmation already handles some spinner error output,
18
+ // but we catch to ensure we report the error and set exit code.
19
+ console.error(colors.error(String(e?.message || e)));
20
+ process.exitCode = 1;
21
+ }
22
+ }
23
+ /**
24
+ * Register the "wait" command
25
+ */
26
+ export function registerWaitCommand(program) {
27
+ program
28
+ .command('wait <tx_hash>')
29
+ .description('Wait for a transaction to be confirmed on-chain')
30
+ .option('--confirmations <n>', 'Wait for N confirmations (default: 1)', (v) => parseInt(v, 10))
31
+ .option('--timeout <ms>', 'Timeout waiting for confirmation (ms)', (v) => parseInt(v, 10))
32
+ .action(async (txHash, options) => {
33
+ await handleWait(txHash, options);
34
+ });
35
+ }
36
+ //# sourceMappingURL=wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.js","sourceRoot":"","sources":["../../src/commands/wait.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,MAAc,EAAE,IAAkD;IACxF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,CAAC;QACD,MAAM,qBAAqB,CAAC;YACxB,MAAM,EAAE,MAAM;YACd,aAAa,EAAE,UAAU;YACzB,SAAS,EAAE,IAAI,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,yBAAyB,UAAU,gBAAgB,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAClH,CAAC;IAAC,OAAO,CAAM,EAAE,CAAC;QACd,oEAAoE;QACpE,gEAAgE;QAChE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACrD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACzB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAChD,OAAO;SACF,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SAC9F,MAAM,CAAC,gBAAgB,EAAE,uCAAuC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;SACzF,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,OAAY,EAAE,EAAE;QAC3C,MAAM,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,55 @@
1
+ import { apiClient } from '../services/apiClient.js';
2
+ import { colors } from '../services/ui.js';
3
+ import { ApiError } from '../services/errors.js';
4
+ import { assertAuthenticated } from "../services/utilities.js";
5
+ export async function handleWho() {
6
+ if (!assertAuthenticated())
7
+ return;
8
+ try {
9
+ const me = await apiClient.get('/v1/cli/who');
10
+ const username = me.username ?? '(unknown)';
11
+ console.log(colors.bold('You are logged in as'), colors.info(username));
12
+ if (me.fullname)
13
+ console.log('Name:', me.fullname);
14
+ if (me.email)
15
+ console.log('Email:', me.email);
16
+ }
17
+ catch (e) {
18
+ if (e instanceof ApiError && e.status === 401) {
19
+ console.error(colors.error('Unauthorized. Run `codequill login` again.'));
20
+ }
21
+ else if (e instanceof ApiError) {
22
+ console.error(colors.error(`Failed to load profile: ${e.message} (${e.status})`));
23
+ if (e.requestId) {
24
+ console.error(colors.dim(`Request ID: ${e.requestId}`));
25
+ }
26
+ if (e.method && e.url) {
27
+ console.error(colors.dim(`Endpoint: ${e.method} ${e.url}`));
28
+ }
29
+ if (typeof e.body !== 'undefined') {
30
+ try {
31
+ const bodyStr = typeof e.body === 'string' ? e.body : JSON.stringify(e.body, null, 2);
32
+ const preview = bodyStr.length > 2000 ? bodyStr.slice(0, 2000) + '…' : bodyStr;
33
+ console.error(colors.dim('Response body:'));
34
+ console.error(colors.dim(preview));
35
+ }
36
+ catch {
37
+ // ignore formatting issues
38
+ }
39
+ }
40
+ }
41
+ else {
42
+ console.error(colors.error(`Failed to load profile: ${String(e?.message || e)}`));
43
+ }
44
+ process.exitCode = 1;
45
+ }
46
+ }
47
+ export function registerWhoCommand(program) {
48
+ program
49
+ .command('who')
50
+ .description('Show the current authenticated user')
51
+ .action(async () => {
52
+ await handleWho();
53
+ });
54
+ }
55
+ //# sourceMappingURL=who.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"who.js","sourceRoot":"","sources":["../../src/commands/who.ts"],"names":[],"mappings":"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"}