bulletin-deploy 0.6.7-rc.0 → 0.6.7

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 CHANGED
@@ -15,7 +15,7 @@ Your site is live at `https://my-app00.dot.li`
15
15
  ## Prerequisites
16
16
 
17
17
  - **Node.js 22+**
18
- - **IPFS Kubo** (for merkleizing directories)
18
+ - **IPFS Kubo** (for merkleizing directories — not needed with `--js-merkle`)
19
19
 
20
20
  ```bash
21
21
  # macOS
@@ -29,6 +29,8 @@ sudo bash kubo/install.sh
29
29
  ipfs init
30
30
  ```
31
31
 
32
+ > **No Kubo?** Use `--js-merkle` to skip the Kubo requirement entirely. See [Merkleization modes](#merkleization-modes) below.
33
+
32
34
  ## CLI Usage
33
35
 
34
36
  ```bash
@@ -55,6 +57,7 @@ Options:
55
57
  --rpc wss://... Bulletin RPC (or set BULLETIN_RPC env var)
56
58
  --mnemonic "..." DotNS owner mnemonic (or set MNEMONIC env var)
57
59
  --playground Publish to the Playground remix registry
60
+ --js-merkle Use pure-JS merkleization (no IPFS Kubo binary required)
58
61
  --pool-size N Number of pool accounts (default: 10)
59
62
  --help Show help
60
63
  ```
@@ -92,6 +95,20 @@ const result = await deploy("./dist", "my-app00.dot");
92
95
  console.log(result.cid, result.domainName);
93
96
  ```
94
97
 
98
+ ### JS merkleization and custom telemetry
99
+
100
+ For environments without Kubo (WebContainers, serverless), use `jsMerkle`. The optional `attributes` field lets you inject telemetry context when git is unavailable:
101
+
102
+ ```javascript
103
+ const result = await deploy("./dist", "my-app00.dot", {
104
+ jsMerkle: true,
105
+ attributes: {
106
+ "deploy.source": "revx",
107
+ "deploy.repo": "user/project",
108
+ },
109
+ });
110
+ ```
111
+
95
112
  ## Domain Names and Proof of Personhood
96
113
 
97
114
  DotNS domain names are classified by the PopOracle contract on Asset Hub. The classification determines what level of **Proof of Personhood (PoP)** is required to register:
@@ -124,18 +141,53 @@ If you see **"Requires Full Personhood verification"**, the deploy will fail ear
124
141
  ## How It Works
125
142
 
126
143
  ```
127
- Build output ──> IPFS merkleize ──> CAR file ──> Chunk upload ──> DotNS
128
- ./dist ipfs add .car Bulletin Asset Hub
129
- Storage Registry
144
+ Build output ──> Merkleize ──> CAR file ──> Chunk upload ──> DotNS
145
+ ./dist (Kubo or JS) .car Bulletin Asset Hub
146
+ Storage Registry
130
147
  ```
131
148
 
132
- 1. **Merkleize** your build directory with IPFS to produce a content-addressed CAR file
149
+ 1. **Merkleize** your build directory to produce a content-addressed CAR file
133
150
  2. **Chunk and upload** the CAR file to Bulletin's TransactionStorage (1MB chunks, 2 per batch)
134
151
  3. **Store the DAG root** that links all chunks together under a single CID
135
152
  4. **Register or update** your `.dot` domain on Asset Hub with the new contenthash
136
153
 
137
154
  Your site is immediately accessible at `https://your-domain.dot.li`
138
155
 
156
+ ## Merkleization modes
157
+
158
+ bulletin-deploy supports two ways to merkleize your build directory into a CAR file:
159
+
160
+ | Mode | Flag | Requires | Best for |
161
+ |---|---|---|---|
162
+ | **Kubo** (default) | _(none)_ | IPFS Kubo binary installed | CI pipelines, local development |
163
+ | **JS** | `--js-merkle` | Nothing beyond Node.js | WebContainers, serverless, environments without system binaries |
164
+
165
+ Both modes produce valid IPFS UnixFS DAGs. The CIDs may differ between modes for the same input (different chunking implementations), but this is fine — each deploy sets a fresh contenthash on DotNS regardless.
166
+
167
+ ### CLI
168
+
169
+ ```bash
170
+ # Default (Kubo)
171
+ bulletin-deploy ./dist my-app00.dot
172
+
173
+ # JS merkleization
174
+ bulletin-deploy --js-merkle ./dist my-app00.dot
175
+ ```
176
+
177
+ ### Programmatic
178
+
179
+ ```javascript
180
+ import { deploy } from "bulletin-deploy";
181
+
182
+ // Default (Kubo)
183
+ await deploy("./dist", "my-app00.dot");
184
+
185
+ // JS merkleization
186
+ await deploy("./dist", "my-app00.dot", { jsMerkle: true });
187
+ ```
188
+
189
+ The JS mode uses `ipfs-unixfs-importer` (the same chunker Kubo uses internally) and `@ipld/car` for CAR serialization. It runs entirely in-memory with no temp files.
190
+
139
191
  ## Resilience Features
140
192
 
141
193
  ### Chunk-level retry
@@ -161,7 +213,9 @@ What's tracked:
161
213
  - Pool account selection
162
214
  - Source metadata (repo, branch, PR number, CI vs local)
163
215
 
164
- Dashboard: https://polkadot-community-foundation.sentry.io/dashboards/92523/
216
+ Dashboard:
217
+ - Bulletin Deploy Health: https://paritytech.sentry.io/dashboard/1669817/
218
+ - Deploy Failures Detail: https://paritytech.sentry.io/dashboard/1669818/
165
219
 
166
220
  ## Troubleshooting
167
221
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  captureWarning,
3
3
  withSpan
4
- } from "./chunk-DOBGWPA3.js";
4
+ } from "./chunk-ZGP4DMFK.js";
5
5
 
6
6
  // src/dotns.ts
7
7
  import crypto from "crypto";
@@ -4,7 +4,7 @@ import {
4
4
  TX_TIMEOUT_MS,
5
5
  fetchNonce,
6
6
  validateDomainLabel
7
- } from "./chunk-HMCNHEMO.js";
7
+ } from "./chunk-FBXG7YMT.js";
8
8
  import {
9
9
  merkleizeJS
10
10
  } from "./chunk-GZ5UUECB.js";
@@ -21,7 +21,7 @@ import {
21
21
  setDeployAttribute,
22
22
  withDeploySpan,
23
23
  withSpan
24
- } from "./chunk-DOBGWPA3.js";
24
+ } from "./chunk-ZGP4DMFK.js";
25
25
 
26
26
  // src/deploy.ts
27
27
  import { Buffer } from "buffer";
@@ -6,7 +6,7 @@ import * as path from "path";
6
6
  // package.json
7
7
  var package_default = {
8
8
  name: "bulletin-deploy",
9
- version: "0.6.7-rc.0",
9
+ version: "0.6.7",
10
10
  private: false,
11
11
  repository: {
12
12
  type: "git",
@@ -175,6 +175,8 @@ function captureWarning(message, context) {
175
175
  try {
176
176
  Sentry.addBreadcrumb({ level: "warning", message, data: context });
177
177
  Sentry.captureMessage(message, { level: "warning", extra: context });
178
+ const root = Sentry.getRootSpan(Sentry.getActiveSpan());
179
+ if (root) root.setAttribute("deploy.sad", true);
178
180
  } catch {
179
181
  }
180
182
  }
package/dist/deploy.js CHANGED
@@ -21,11 +21,11 @@ import {
21
21
  storeChunkedContent,
22
22
  storeDirectory,
23
23
  storeFile
24
- } from "./chunk-5B6UCUSH.js";
25
- import "./chunk-HMCNHEMO.js";
24
+ } from "./chunk-TD73EZ5I.js";
25
+ import "./chunk-FBXG7YMT.js";
26
26
  import "./chunk-GZ5UUECB.js";
27
27
  import "./chunk-LGPTJYA3.js";
28
- import "./chunk-DOBGWPA3.js";
28
+ import "./chunk-ZGP4DMFK.js";
29
29
  import "./chunk-QGM4M3NI.js";
30
30
  export {
31
31
  DEFAULT_BULLETIN_RPC,
package/dist/dotns.js CHANGED
@@ -19,8 +19,8 @@ import {
19
19
  sanitizeDomainLabel,
20
20
  stripTrailingDigits,
21
21
  validateDomainLabel
22
- } from "./chunk-HMCNHEMO.js";
23
- import "./chunk-DOBGWPA3.js";
22
+ } from "./chunk-FBXG7YMT.js";
23
+ import "./chunk-ZGP4DMFK.js";
24
24
  import "./chunk-QGM4M3NI.js";
25
25
  export {
26
26
  CONNECTION_TIMEOUT_MS,
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  deploy
3
- } from "./chunk-5B6UCUSH.js";
3
+ } from "./chunk-TD73EZ5I.js";
4
4
  import {
5
5
  DotNS
6
- } from "./chunk-HMCNHEMO.js";
6
+ } from "./chunk-FBXG7YMT.js";
7
7
  import {
8
8
  merkleizeJS
9
9
  } from "./chunk-GZ5UUECB.js";
@@ -14,7 +14,7 @@ import {
14
14
  fetchPoolAuthorizations,
15
15
  selectAccount
16
16
  } from "./chunk-LGPTJYA3.js";
17
- import "./chunk-DOBGWPA3.js";
17
+ import "./chunk-ZGP4DMFK.js";
18
18
  import "./chunk-QGM4M3NI.js";
19
19
  export {
20
20
  DotNS,
package/dist/telemetry.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  setDeployAttribute,
9
9
  withDeploySpan,
10
10
  withSpan
11
- } from "./chunk-DOBGWPA3.js";
11
+ } from "./chunk-ZGP4DMFK.js";
12
12
  import "./chunk-QGM4M3NI.js";
13
13
  export {
14
14
  VERSION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bulletin-deploy",
3
- "version": "0.6.7-rc.0",
3
+ "version": "0.6.7",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",