@homeflare/alchemy 0.21.0 → 0.23.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/README.md +3 -1
- package/dist/launchd/index.d.ts +2 -0
- package/dist/launchd/index.d.ts.map +1 -1
- package/dist/launchd/index.js +53 -1
- package/dist/launchd/index.js.map +4 -3
- package/dist/launchd/port-claims.d.ts +31 -0
- package/dist/launchd/port-claims.d.ts.map +1 -0
- package/dist/proxmox/api-token-form.d.ts +12 -1
- package/dist/proxmox/api-token-form.d.ts.map +1 -1
- package/dist/proxmox/api-token.d.ts +8 -3
- package/dist/proxmox/api-token.d.ts.map +1 -1
- package/dist/proxmox/generated/pve/cluster-sdn-fabrics.d.ts +13 -13
- package/dist/proxmox/generated/pve/cluster-sdn-fabrics.d.ts.map +1 -1
- package/dist/proxmox/index.d.ts +9 -2
- package/dist/proxmox/index.d.ts.map +1 -1
- package/dist/proxmox/index.js +17 -9
- package/dist/proxmox/index.js.map +8 -7
- package/dist/proxmox/zfs-pool-spec.d.ts +27 -0
- package/dist/proxmox/zfs-pool-spec.d.ts.map +1 -0
- package/dist/proxmox/zfs-pool-write.d.ts +48 -7
- package/dist/proxmox/zfs-pool-write.d.ts.map +1 -1
- package/dist/proxmox/zfs-pool.d.ts +42 -20
- package/dist/proxmox/zfs-pool.d.ts.map +1 -1
- package/dist/release/catalog.d.ts +37 -0
- package/dist/release/catalog.d.ts.map +1 -1
- package/dist/release/index.d.ts +2 -1
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +75 -15
- package/dist/release/index.js.map +5 -4
- package/dist/release/openbao.d.ts +35 -0
- package/dist/release/openbao.d.ts.map +1 -0
- package/docs/adopted-deploys.md +14 -0
- package/docs/launchd-ports.md +109 -0
- package/docs/launchd.md +5 -0
- package/docs/release-binary-catalogs.md +32 -7
- package/docs/release-binary-openbao.md +151 -0
- package/docs/release-binary.md +13 -2
- package/package.json +1 -1
- package/src/launchd/index.ts +2 -0
- package/src/launchd/port-claims.test.ts +124 -0
- package/src/launchd/port-claims.ts +102 -0
- package/src/launchd/providers.test.ts +3 -0
- package/src/proxmox/api-token-adopt.test.ts +138 -0
- package/src/proxmox/api-token-form.ts +19 -2
- package/src/proxmox/api-token.ts +8 -3
- package/src/proxmox/generated/pve/cluster-sdn-fabrics.ts +23 -13
- package/src/proxmox/index.test.ts +5 -2
- package/src/proxmox/index.ts +9 -2
- package/src/proxmox/zfs-pool-adopt.test.ts +141 -0
- package/src/proxmox/zfs-pool-spec.ts +76 -0
- package/src/proxmox/zfs-pool-write.ts +63 -9
- package/src/proxmox/zfs-pool.ts +45 -95
- package/src/release/catalog.test.ts +71 -0
- package/src/release/catalog.ts +68 -5
- package/src/release/fixtures/openbao/checksums.txt +83 -0
- package/src/release/fixtures/openbao/checksums.txt.gpgsig +0 -0
- package/src/release/fixtures/openbao/darwin-assets.txt +12 -0
- package/src/release/fixtures/openbao/openbao-gpg-pub-20240618.asc +109 -0
- package/src/release/index.ts +3 -0
- package/src/release/openbao.test.ts +120 -0
- package/src/release/openbao.ts +86 -0
- package/src/release/providers.test.ts +1 -0
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The REAL OpenBao data set against the vendor's own files — no network: fixtures/openbao/ holds
|
|
3
|
+
* checksums.txt, its detached GPG signature and the signing key byte-for-byte as fetched
|
|
4
|
+
* 2026-09-23 (each one's SHA-256 equals GitHub's / openbao.org's digest for it that day).
|
|
5
|
+
*
|
|
6
|
+
* ★ THE CHAIN THIS PROVES: fixture bytes = the recorded digest → the strict parser reads exactly
|
|
7
|
+
* its 83 lines → none of them names `bao` → the pin is filed under `computed`, never `members`.
|
|
8
|
+
* The GPG check is NOT re-run here (gpgv needs a binary this repo does not vendor); it is a
|
|
9
|
+
* recorded one-time measurement (docs/release-binary-openbao.md), same status as Victoria's
|
|
10
|
+
* "consistency, not provenance" note.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, expect, test } from 'bun:test';
|
|
13
|
+
import { sha256Hex } from '../launchd/job-form.ts';
|
|
14
|
+
import { releaseUrl } from './binary-form.ts';
|
|
15
|
+
import { catalogBinary } from './catalog.ts';
|
|
16
|
+
import { parseChecksums } from './checksums.ts';
|
|
17
|
+
import { OPENBAO_RELEASES } from './openbao.ts';
|
|
18
|
+
|
|
19
|
+
const fixture = (name: string) => Bun.file(new URL(`fixtures/openbao/${name}`, import.meta.url));
|
|
20
|
+
const PLATFORM = 'darwin_arm64';
|
|
21
|
+
const archive = OPENBAO_RELEASES.packages.openbao?.versions['2.6.2']?.[PLATFORM];
|
|
22
|
+
if (archive === undefined)
|
|
23
|
+
throw new Error('fixture setup: OPENBAO_RELEASES has no darwin_arm64 pin');
|
|
24
|
+
|
|
25
|
+
describe('the OpenBao data set is the vendor checksum file', () => {
|
|
26
|
+
test('one package, one version, one platform', () => {
|
|
27
|
+
expect(Object.keys(OPENBAO_RELEASES.packages)).toEqual(['openbao']);
|
|
28
|
+
expect(Object.keys(OPENBAO_RELEASES.packages.openbao?.versions ?? {})).toEqual(['2.6.2']);
|
|
29
|
+
expect(Object.keys(OPENBAO_RELEASES.packages.openbao?.versions['2.6.2'] ?? {})).toEqual([
|
|
30
|
+
PLATFORM,
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('archive pin: repo, tag, asset, URL', () => {
|
|
35
|
+
expect([archive.repo, archive.tag, archive.asset]).toEqual([
|
|
36
|
+
'openbao/openbao',
|
|
37
|
+
'v2.6.2',
|
|
38
|
+
'openbao_2.6.2_darwin_arm64.tar.gz',
|
|
39
|
+
]);
|
|
40
|
+
expect(releaseUrl(archive.repo, archive.tag, archive.asset)).toBe(
|
|
41
|
+
`https://github.com/openbao/openbao/releases/download/v2.6.2/openbao_2.6.2_darwin_arm64.tar.gz`,
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('checksums.txt: 83 lines, byte-identical to the recorded digest, archive line equals the pin', async () => {
|
|
46
|
+
const bytes = new Uint8Array(await fixture('checksums.txt').arrayBuffer());
|
|
47
|
+
expect(sha256Hex(bytes)).toBe(archive.checksums.sha256);
|
|
48
|
+
expect(archive.checksums.url).toBe(
|
|
49
|
+
'https://github.com/openbao/openbao/releases/download/v2.6.2/checksums.txt',
|
|
50
|
+
);
|
|
51
|
+
const lines = parseChecksums(new TextDecoder().decode(bytes));
|
|
52
|
+
expect(lines.size).toBe(83);
|
|
53
|
+
expect(lines.get(archive.asset)).toBe(archive.sha256);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test('no line names the `bao` member — it is not a vendor fact', async () => {
|
|
57
|
+
const bytes = new Uint8Array(await fixture('checksums.txt').arrayBuffer());
|
|
58
|
+
const lines = parseChecksums(new TextDecoder().decode(bytes));
|
|
59
|
+
expect(lines.has('bao')).toBe(false);
|
|
60
|
+
expect(archive.members).toEqual({});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
test('the member digest is filed under `computed`, dated, not under `members`', () => {
|
|
64
|
+
expect(archive.computed?.bao).toEqual({
|
|
65
|
+
recorded: '2026-09-23',
|
|
66
|
+
sha256: 'd476d17e81a35e6d70dd7e86a8ab2a3664313525118f1f1cfe0130e7a2b95f3a',
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('the checksums file is GPG-signed, and the signature and key are pinned', async () => {
|
|
71
|
+
const sigBytes = new Uint8Array(await fixture('checksums.txt.gpgsig').arrayBuffer());
|
|
72
|
+
const keyBytes = new Uint8Array(await fixture('openbao-gpg-pub-20240618.asc').arrayBuffer());
|
|
73
|
+
const sig = archive.checksums.signature;
|
|
74
|
+
if (sig === undefined) throw new Error('fixture setup: no checksums.signature pinned');
|
|
75
|
+
expect(sig.kind).toBe('openpgp');
|
|
76
|
+
expect(sha256Hex(sigBytes)).toBe(sig.sha256);
|
|
77
|
+
expect(sha256Hex(keyBytes)).toBe(sig.key.sha256);
|
|
78
|
+
expect(sig.key.fingerprint).toBe('66D15FDD87287219C8E15478D200CD702853E6D0');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
test('the asset is in the committed darwin listing, and no sibling is pinned', async () => {
|
|
82
|
+
const assets = (await fixture('darwin-assets.txt').text()).trim().split('\n');
|
|
83
|
+
expect(assets).toContain(archive.asset);
|
|
84
|
+
// ★ Every OTHER darwin asset (the amd64 archive, and every .sbom.json / .gpgsig / .sigstore.json
|
|
85
|
+
// next to both) is listed here so a reviewer can see what was excluded, but pinned nowhere.
|
|
86
|
+
const siblings = assets.filter((name) => name !== archive.asset);
|
|
87
|
+
expect(siblings).toEqual([
|
|
88
|
+
'openbao_2.6.2_darwin_amd64.tar.gz',
|
|
89
|
+
'openbao_2.6.2_darwin_amd64.tar.gz.gpgsig',
|
|
90
|
+
'openbao_2.6.2_darwin_amd64.tar.gz.sbom.json',
|
|
91
|
+
'openbao_2.6.2_darwin_amd64.tar.gz.sbom.json.gpgsig',
|
|
92
|
+
'openbao_2.6.2_darwin_amd64.tar.gz.sbom.json.sigstore.json',
|
|
93
|
+
'openbao_2.6.2_darwin_amd64.tar.gz.sigstore.json',
|
|
94
|
+
'openbao_2.6.2_darwin_arm64.tar.gz.gpgsig',
|
|
95
|
+
'openbao_2.6.2_darwin_arm64.tar.gz.sbom.json',
|
|
96
|
+
'openbao_2.6.2_darwin_arm64.tar.gz.sbom.json.gpgsig',
|
|
97
|
+
'openbao_2.6.2_darwin_arm64.tar.gz.sbom.json.sigstore.json',
|
|
98
|
+
'openbao_2.6.2_darwin_arm64.tar.gz.sigstore.json',
|
|
99
|
+
]);
|
|
100
|
+
expect(siblings.some((name) => name.startsWith('openbao-hsm_'))).toBe(false);
|
|
101
|
+
const pinnedPlatforms = Object.keys(OPENBAO_RELEASES.packages.openbao?.versions['2.6.2'] ?? {});
|
|
102
|
+
expect(pinnedPlatforms).not.toContain('darwin_amd64');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('bao out of the data set: the computed member of the one pinned archive', () => {
|
|
106
|
+
const request = { binary: 'bao', package: 'openbao', platform: PLATFORM, version: '2.6.2' };
|
|
107
|
+
expect(catalogBinary(OPENBAO_RELEASES, request)).toEqual({
|
|
108
|
+
archive: {
|
|
109
|
+
asset: 'openbao_2.6.2_darwin_arm64.tar.gz',
|
|
110
|
+
repo: 'openbao/openbao',
|
|
111
|
+
sha256: '4e495376174accc0e014d31e9901f518a974f966850c839f626347eaac05fd52',
|
|
112
|
+
size: 76_833_570,
|
|
113
|
+
tag: 'v2.6.2',
|
|
114
|
+
},
|
|
115
|
+
member: 'bao',
|
|
116
|
+
name: 'bao',
|
|
117
|
+
sha256: 'd476d17e81a35e6d70dd7e86a8ab2a3664313525118f1f1cfe0130e7a2b95f3a',
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
});
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenBao's release archives, pinned — the second data set for Release.Binary, walked down
|
|
3
|
+
* 2026-09-23 (packages/alchemy/docs/release-binary-openbao.md has every command).
|
|
4
|
+
*
|
|
5
|
+
* ★ THE MEMBER DIGEST IS OURS, NOT THE VENDOR'S. `checksums.txt` lists 83 lines: every archive and
|
|
6
|
+
* every `.sbom.json`, never `bao` itself (measured 2026-09-23 — see checksums.ts's header on why
|
|
7
|
+
* that is normal for this vendor). So `bao`'s SHA-256 sits under `computed`, hashed from the one
|
|
8
|
+
* archive whose OWN SHA-256 already matched the checksums-file pin — never filed under `members`,
|
|
9
|
+
* which is vendor lines only.
|
|
10
|
+
* ★ PLATFORM KEY IS THE VENDOR'S OWN SPELLING: `darwin_arm64`, underscore — OpenBao's asset names
|
|
11
|
+
* read `openbao_2.6.2_darwin_arm64.tar.gz`. Victoria's catalog spells the same idea
|
|
12
|
+
* `darwin-arm64`, hyphen, because THAT vendor's asset names use a hyphen. Nothing here picks one
|
|
13
|
+
* estate-wide convention; a consumer names the platform its data set actually uses. If a reviewer
|
|
14
|
+
* would rather the estate pick one spelling, that is a one-line change to this rule, not to any
|
|
15
|
+
* consumer, made in the same PR that adds the second spelling.
|
|
16
|
+
* ★ GPG, MEASURED, TWO INDEPENDENT CHANNELS: `gpgv` against the dearmored key from openbao.org
|
|
17
|
+
* returned "Good signature from OpenBao <openbao@lists.lfedge.org>" over `checksums.txt` using
|
|
18
|
+
* subkey E617DCD4065C2AFC0B2CF7A7BA8BC08C0F691F94 of primary 66D15FDD87287219C8E15478D200CD702853E6D0
|
|
19
|
+
* (both fingerprints published in OpenBao's own install.mdx at this tag). ⚠️ TRUST ON FIRST USE
|
|
20
|
+
* ACROSS TWO CHANNELS ONE PROJECT RUNS: the release asset and openbao.org are both OpenBao's own
|
|
21
|
+
* infrastructure, so this is not a third party attesting to the key — it raises the bar over no
|
|
22
|
+
* check at all (a swap needs both channels, not one), it does not reach independent provenance.
|
|
23
|
+
* ⛔ SIGSTORE WAS NOT CHECKED: `cosign` is not installed on the mini (measured 2026-09-23). The
|
|
24
|
+
* bundle's certificate SAN (read, not verified) names
|
|
25
|
+
* `https://github.com/openbao/openbao/.github/workflows/release.yml@refs/heads/release/2.6.x`,
|
|
26
|
+
* issuer `https://token.actions.githubusercontent.com` — recorded here as an UNVERIFIED identity,
|
|
27
|
+
* never as a passing check. "GPG or Sigstore" is met by the GPG half alone.
|
|
28
|
+
* ⚠️ THE BUILD THIS PINS IS NOT THE ONE THE VAULT SERVER RUNS. Read from goreleaser.other.yaml at
|
|
29
|
+
* v2.6.2: `CGO_ENABLED=0`, build tag `ui`. Expected to differ from the Nix build in nothing an
|
|
30
|
+
* agent (approle auto-auth, templates, exec) depends on; nobody has run this binary to confirm —
|
|
31
|
+
* docs/release-binary-openbao.md says so and stops there, by house rule (never execute `bao`).
|
|
32
|
+
*/
|
|
33
|
+
import type { ReleaseCatalog } from './catalog.ts';
|
|
34
|
+
|
|
35
|
+
const RECORDED = '2026-09-23';
|
|
36
|
+
const REPO = 'openbao/openbao';
|
|
37
|
+
const TAG = 'v2.6.2';
|
|
38
|
+
const DOWNLOAD = `https://github.com/${REPO}/releases/download/${TAG}`;
|
|
39
|
+
|
|
40
|
+
export const OPENBAO_RELEASES: ReleaseCatalog = {
|
|
41
|
+
packages: {
|
|
42
|
+
openbao: {
|
|
43
|
+
// ★ The member is named `bao` itself — no `-prod`-style suffix; the vendor tarball unpacks
|
|
44
|
+
// CHANGELOG.md, LICENSE, README.md and `bao` at its root (measured, full stream, 2026-09-23).
|
|
45
|
+
binaries: { bao: 'bao' },
|
|
46
|
+
versions: {
|
|
47
|
+
'2.6.2': {
|
|
48
|
+
darwin_arm64: {
|
|
49
|
+
asset: 'openbao_2.6.2_darwin_arm64.tar.gz',
|
|
50
|
+
checksums: {
|
|
51
|
+
recorded: RECORDED,
|
|
52
|
+
sha256: '3d4a19fdc54a86fd94ce59ea91316dbf4304180bb27ae818e78e85c7f2164645',
|
|
53
|
+
signature: {
|
|
54
|
+
kind: 'openpgp',
|
|
55
|
+
key: {
|
|
56
|
+
fingerprint: '66D15FDD87287219C8E15478D200CD702853E6D0',
|
|
57
|
+
sha256: '1862a196422947124282e026ea4e09d6f7c5d383b628d90c17906936e6e5a8e0',
|
|
58
|
+
url: 'https://openbao.org/assets/openbao-gpg-pub-20240618.asc',
|
|
59
|
+
},
|
|
60
|
+
sha256: '40f294d642a2b4e9adac766ca6b8b2633e15b3dbfdf63969dedbf46d94df53e8',
|
|
61
|
+
url: `${DOWNLOAD}/checksums.txt.gpgsig`,
|
|
62
|
+
verified: RECORDED,
|
|
63
|
+
},
|
|
64
|
+
url: `${DOWNLOAD}/checksums.txt`,
|
|
65
|
+
},
|
|
66
|
+
// ★ NOT a vendor fact — see the header. Hashed from THIS archive after its own SHA-256
|
|
67
|
+
// (below) already matched the checksums.txt pin; confirmed two ways
|
|
68
|
+
// (extractMembers and `tar -xzOf … bao | shasum -a 256`) and against `tar -tvzf -`.
|
|
69
|
+
computed: {
|
|
70
|
+
bao: {
|
|
71
|
+
recorded: RECORDED,
|
|
72
|
+
sha256: 'd476d17e81a35e6d70dd7e86a8ab2a3664313525118f1f1cfe0130e7a2b95f3a',
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
members: {},
|
|
76
|
+
repo: REPO,
|
|
77
|
+
sha256: '4e495376174accc0e014d31e9901f518a974f966850c839f626347eaac05fd52',
|
|
78
|
+
size: 76_833_570,
|
|
79
|
+
tag: TAG,
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
vendor: 'OpenBao',
|
|
86
|
+
};
|