codequill 0.9.1 → 0.9.2

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.
@@ -1,9 +1,7 @@
1
1
  import { promises as fs } from 'node:fs';
2
2
  import path from 'node:path';
3
3
  import os from 'node:os';
4
- import { execFile } from 'node:child_process';
5
- import { promisify } from 'node:util';
6
- const execFileAsync = promisify(execFile);
4
+ import * as tar from 'tar';
7
5
  export async function readFileUtf8(filePath) {
8
6
  return await fs.readFile(filePath, 'utf8');
9
7
  }
@@ -27,55 +25,27 @@ export async function fileExists(p) {
27
25
  }
28
26
  }
29
27
  /**
30
- * Create a deterministic .tar.gz from a directory using GNU tar.
28
+ * Create a deterministic .tar.gz from a directory.
31
29
  *
32
30
  * Determinism guarantees:
33
- * - Entries sorted lexicographically (--sort=name)
34
- * - All timestamps zeroed (--mtime=@0)
35
- * - Ownership normalized to 0:0 (--owner=0 --group=0 --numeric-owner)
36
- * - Gzip header timestamp omitted (-n via env GZIP=-n)
31
+ * - Ownership normalized (portable: true sets uid/gid to 0)
32
+ * - All timestamps zeroed (mtime set to Unix epoch)
37
33
  *
38
- * Requires GNU tar. BSD tar (macOS default) is not supported;
39
- * install GNU tar with: brew install gnu-tar
34
+ * Uses the `tar` npm package — fully cross-platform (macOS, Linux, Windows).
35
+ * No system binary dependency.
40
36
  *
41
37
  * @returns Absolute path to the temporary .tar.gz file.
42
38
  */
43
39
  export async function createDeterministicTarGz(dirAbs) {
44
- const tarBin = await resolveGnuTar();
45
40
  const dirName = path.basename(dirAbs);
46
41
  const outPath = path.join(os.tmpdir(), `codequill-attest-${dirName}-${Date.now()}.tar.gz`);
47
- await execFileAsync(tarBin, [
48
- '-czf', outPath,
49
- '--sort=name',
50
- '--mtime=@0',
51
- '--owner=0',
52
- '--group=0',
53
- '--numeric-owner',
54
- '-C', path.dirname(dirAbs),
55
- dirName,
56
- ], {
57
- env: { ...process.env, GZIP: '-n' },
58
- });
42
+ await tar.create({
43
+ gzip: { level: 9 },
44
+ file: outPath,
45
+ cwd: path.dirname(dirAbs),
46
+ portable: true,
47
+ mtime: new Date(0),
48
+ }, [dirName]);
59
49
  return outPath;
60
50
  }
61
- /**
62
- * Resolve the path to a GNU tar binary.
63
- * On macOS, GNU tar is typically installed via Homebrew as `gtar`.
64
- * On Linux, the system `tar` is usually GNU tar.
65
- */
66
- async function resolveGnuTar() {
67
- // Try gtar first (Homebrew GNU tar on macOS)
68
- for (const bin of ['gtar', 'tar']) {
69
- try {
70
- const { stdout } = await execFileAsync(bin, ['--version']);
71
- if (stdout.includes('GNU'))
72
- return bin;
73
- }
74
- catch {
75
- // binary not found or failed, try next
76
- }
77
- }
78
- throw new Error('Directory attestation requires GNU tar.\n' +
79
- 'On macOS, install with: brew install gnu-tar');
80
- }
81
51
  //# sourceMappingURL=fs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/services/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC/C,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,4CAA4C;IAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,uDAAuD;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAS;IACrC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACtC,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc;IACzD,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACrB,EAAE,CAAC,MAAM,EAAE,EACX,oBAAoB,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,CACrD,CAAC;IAEF,MAAM,aAAa,CAAC,MAAM,EAAE;QACxB,MAAM,EAAE,OAAO;QACf,aAAa;QACb,YAAY;QACZ,WAAW;QACX,WAAW;QACX,iBAAiB;QACjB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC1B,OAAO;KACV,EAAE;QACC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;KACtC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,aAAa;IACxB,6CAA6C;IAC7C,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QAChC,IAAI,CAAC;YACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;YAC3D,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACL,uCAAuC;QAC3C,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CACX,2CAA2C;QAC3C,8CAA8C,CACjD,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/services/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAG3B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC/C,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,IAAY;IAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,4CAA4C;IAC5C,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,uDAAuD;IACvD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,CAAS;IACrC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAS;IACtC,IAAI,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,KAAK,CAAC;IACjB,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,MAAc;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACrB,EAAE,CAAC,MAAM,EAAE,EACX,oBAAoB,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,SAAS,CACrD,CAAC;IAEF,MAAM,GAAG,CAAC,MAAM,CACZ;QACI,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAClB,IAAI,EAAE,OAAO;QACb,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACzB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC;KACrB,EACD,CAAC,OAAO,CAAC,CACZ,CAAC;IAEF,OAAO,OAAO,CAAC;AACnB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codequill",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "CodeQuill CLI — claim authorship, create snapshots, attest artifact and push preservations",
5
5
  "type": "module",
6
6
  "bin": {
@@ -38,7 +38,8 @@
38
38
  "ethers": "^6.13.0",
39
39
  "kleur": "^4.1.5",
40
40
  "libsodium-wrappers": "^0.8.0",
41
- "ora": "^8.0.1"
41
+ "ora": "^8.0.1",
42
+ "tar": "^7.5.13"
42
43
  },
43
44
  "devDependencies": {
44
45
  "@types/libsodium-wrappers": "^0.7.14",