@compozy/skeeper 0.2.0 → 0.3.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 (2) hide show
  1. package/README.md +172 -56
  2. package/package.json +16 -16
package/README.md CHANGED
@@ -29,9 +29,11 @@ It mirrors `SPEC.md`, ADRs, RFCs, and AI plan files into a sidecar Git repositor
29
29
  - **Specs stay local to their code.** Edit `SPEC.md`, `docs/specs/**`, `.claude/plans/**`, ADRs, RFCs, or custom globs where they naturally belong.
30
30
  - **Shared sidecars without collisions.** Namespaces isolate stored paths and sidecar branches inside one sidecar remote.
31
31
  - **Branch-aware history.** Namespace branches use `<namespace>/__branches__/<source-branch>`.
32
- - **Fresh-clone hydration.** `skeeper hydrate` restores files from the locked sidecar commits, not a best-effort latest branch.
33
- - **Agent-friendly commands.** `status`, `sync`, `verify`, `fsck`, `hooks check`, `repair status`, `pattern`, `adopt`, and `untrack` all support deterministic output where needed.
34
- - **Skill for AI agents.** A bundled skill at [`.agents/skills/skeeper/SKILL.md`](.agents/skills/skeeper/SKILL.md) teaches coding agents the strict-sync workflow, namespaces, and recovery commands.
32
+ - **Git-like spec sync.** `skeeper pull` brings remote docs in, `skeeper push` publishes local docs, and `skeeper sync` runs pull then push.
33
+ - **Safe by default.** Manual push does not delete remote-only docs just because this clone does not have them; destructive pruning requires `--prune`.
34
+ - **Fresh-clone restore.** `skeeper restore --all` restores files from the exact sidecar commits recorded in `skeeper.lock`.
35
+ - **Small command surface.** Daily use is `status`, `pull`, `push`, `sync`, `restore`, `track`, `untrack`, `repair`, `log`, and `version`; Git hook plumbing lives behind hidden `skeeper internal` commands.
36
+ - **Skill for AI agents.** A bundled skill at [`skills/skeeper/SKILL.md`](skills/skeeper/SKILL.md) teaches coding agents the strict-sync workflow, namespaces, and recovery commands.
35
37
 
36
38
  ## 🎯 Who Is This For
37
39
 
@@ -41,16 +43,51 @@ It mirrors `SPEC.md`, ADRs, RFCs, and AI plan files into a sidecar Git repositor
41
43
 
42
44
  ## 📦 Installation
43
45
 
46
+ #### Homebrew
47
+
48
+ ```bash
49
+ brew tap compozy/compozy
50
+ brew install --cask skeeper
51
+ ```
52
+
53
+ #### NPM
54
+
55
+ ```bash
56
+ npm install -g @compozy/skeeper
57
+ ```
58
+
59
+ #### Go
60
+
44
61
  ```bash
45
62
  go install github.com/compozy/skeeper/cmd/skeeper@latest
46
63
  ```
47
64
 
48
- Other release channels are available through GitHub Releases, Homebrew, NPM, and the distroless Docker image.
65
+ #### GitHub Releases
66
+
67
+ Download the archive for your OS and architecture from [GitHub Releases](https://github.com/compozy/skeeper/releases), then place the `skeeper` binary on your `PATH`.
68
+
69
+ #### From Source
70
+
71
+ ```bash
72
+ git clone git@github.com:compozy/skeeper.git
73
+ cd skeeper
74
+ make verify
75
+ go build -o bin/skeeper ./cmd/skeeper
76
+ ```
77
+
78
+ #### Docker
79
+
80
+ ```bash
81
+ git clone git@github.com:compozy/skeeper.git
82
+ cd skeeper
83
+ make docker-build
84
+ docker run --rm -v "$PWD:/workspace" -w /workspace skeeper:dev status
85
+ ```
49
86
 
50
87
  Prerequisites:
51
88
 
52
89
  - `git` on `PATH`
53
- - `gh` only when `skeeper init` creates a new GitHub sidecar repo
90
+ - `gh` only when `skeeper init` creates a new GitHub sidecar repo; existing sidecars can be reused with `--sidecar`
54
91
 
55
92
  ## 🔄 How It Works
56
93
 
@@ -73,8 +110,8 @@ flowchart TD
73
110
 
74
111
  Block --> Commit[✅ Main commit proceeds]:::ok
75
112
  Commit --> Push([🚀 git push]):::user
76
- Push --> Verify[🔍 Skeeper pre-push verify]:::skeeper
77
- Verify --> Done([🎉 Sidecar verified]):::ok
113
+ Push --> Verify[🔍 Skeeper pre-push status check]:::skeeper
114
+ Verify --> Done([🎉 Sidecar checked]):::ok
78
115
 
79
116
  classDef user fill:#dbeafe,stroke:#1d4ed8,color:#0c1e3e
80
117
  classDef skeeper fill:#fef3c7,stroke:#b45309,color:#3b2c00
@@ -82,7 +119,7 @@ flowchart TD
82
119
  class S1,S2,S3,S4,S5 skeeper
83
120
  ```
84
121
 
85
- If sync fails, the commit fails. This is intentional: a committed main change should not silently drift from the sidecar. The audited bypass is `SKEEPER_SKIP=1`; it records `.git/skeeper/bypass.json`, prints a warning, and `pre-push`, `status`, `fsck`, and `verify` continue to surface stale-lock diagnostics until `skeeper sync` repairs the state. `git commit --no-verify` is unsupported because Git skips all hook code and cannot record an audit trail.
122
+ If sync fails, the commit fails. This is intentional: a committed main change should not silently drift from the sidecar. The audited bypass is `SKEEPER_SKIP=1`; it records `.git/skeeper/bypass.json`, prints a warning, and `status --check`, `repair`, and the managed `pre-push` hook continue to surface stale-lock diagnostics until `skeeper sync` or `skeeper repair` repairs the state. `git commit --no-verify` is unsupported because Git skips all hook code and cannot record an audit trail.
86
123
 
87
124
  ## ⚙️ Configuration
88
125
 
@@ -100,8 +137,6 @@ namespaces:
100
137
  - "**/*.spec.md"
101
138
  exclude:
102
139
  - "docs/specs/private/**"
103
-
104
- bootstrap: brew tap compozy/compozy && brew install --cask skeeper
105
140
  ```
106
141
 
107
142
  Advanced operational defaults are optional:
@@ -136,6 +171,8 @@ Local-only state lives under `.git/skeeper/`:
136
171
  | ------------------ | ---------------------------------------------- |
137
172
  | `transaction.json` | Current resumable mutating operation and phase |
138
173
  | `bypass.json` | Latest audited strict-hook bypass |
174
+ | `hydration.json` | Last locked sidecar blobs hydrated locally |
175
+ | `rescue/` | Local files moved aside before prune/overwrite |
139
176
 
140
177
  ## 🚀 Quick Start
141
178
 
@@ -150,8 +187,8 @@ skeeper init \
150
187
  --sidecar-name myproject-specs \
151
188
  --visibility private \
152
189
  --namespace project \
153
- --patterns "**/SPEC.md" \
154
- --patterns "docs/specs/**"
190
+ --track "**/SPEC.md" \
191
+ --track "docs/specs/**"
155
192
  ```
156
193
 
157
194
  Use an existing shared sidecar:
@@ -160,7 +197,7 @@ Use an existing shared sidecar:
160
197
  skeeper init \
161
198
  --sidecar git@github.com:user/shared-specs.git \
162
199
  --namespace project \
163
- --patterns "**/SPEC.md"
200
+ --track "**/SPEC.md"
164
201
  ```
165
202
 
166
203
  Then edit specs and commit normally:
@@ -175,66 +212,140 @@ The `pre-commit` and `pre-merge-commit` hooks mirror specs and stage `skeeper.lo
175
212
 
176
213
  ## 🛟 Failed Sync Recovery
177
214
 
178
- Inspect local repair state:
215
+ Start with status. It prints the health summary and the next action:
179
216
 
180
217
  ```bash
181
- skeeper repair status
218
+ skeeper status --paths
182
219
  ```
183
220
 
184
- Resume the recorded operation when network/auth/sidecar contention has been fixed:
221
+ Use repair as the single recovery door for broken local state, stale bypasses, hook drift, missing sidecar objects, and interrupted transactions:
185
222
 
186
223
  ```bash
187
- skeeper repair resume
224
+ skeeper repair
225
+ skeeper status --check
188
226
  ```
189
227
 
190
- Abort only before the main index has been mutated:
228
+ When two clones have different docs and both sides should be preserved, use the union workflow:
191
229
 
192
230
  ```bash
193
- skeeper repair abort
231
+ skeeper sync
232
+ git add skeeper.lock
233
+ git commit -m "skeeper: sync docs"
234
+ git push
194
235
  ```
195
236
 
196
- Run a fresh repair sync when a bypass or stale lock is reported:
237
+ ## 📖 CLI Reference
238
+
239
+ The public surface is intentionally small. `status` tells you what is wrong and what to run next; `repair` is the only public recovery door; Git hook and merge-driver plumbing runs through hidden `skeeper internal` commands.
240
+
241
+ <details>
242
+ <summary><code>skeeper init</code> — Create or connect a sidecar repository</summary>
197
243
 
198
244
  ```bash
199
- skeeper sync
200
- skeeper verify
245
+ skeeper init [flags]
201
246
  ```
202
247
 
203
- ## 📖 CLI Reference
248
+ Run `init` once per main repository. Without flags in an interactive terminal, it opens the guided setup. With flags, it can create a GitHub sidecar or connect an existing remote. `init` installs hooks and merge-driver wiring.
249
+
250
+ | Flag | Default | Description |
251
+ | ---------------- | --------- | ------------------------------------------------- |
252
+ | `--sidecar` | | Existing sidecar repository URL |
253
+ | `--sidecar-name` | | GitHub sidecar repository name or `OWNER/REPO` |
254
+ | `--visibility` | `private` | GitHub repository visibility |
255
+ | `--namespace` | | Sidecar namespace for this project |
256
+ | `--track` | | Managed spec glob; repeat for multiple globs |
257
+ | `--patterns` | | Compatibility spelling for managed spec globs |
258
+ | `--bootstrap` | | Optional install command stored in `.skeeper.yml` |
259
+
260
+ </details>
261
+
262
+ <details>
263
+ <summary><code>skeeper status</code> — Inspect sync health and next action</summary>
204
264
 
205
265
  ```bash
206
- skeeper init [flags]
207
- skeeper sync [--dry-run] [--json] [--commit --message <msg>] [--force]
208
- skeeper adopt <path-or-glob>... [--dry-run] [--json] [--force] [--commit --message <msg>]
266
+ skeeper status [--json] [--check] [--paths]
267
+ ```
268
+
269
+ Use `status` before guessing. It reports sidecar URL, current branch, lock state, hook health, namespace drift counts, bypass state, active transactions, diagnostics, and a next-action line. `--check` exits non-zero when Skeeper needs action, making it the CI health check. `--paths` includes per-path drift classes such as `local_only`, `missing_local`, `local_modified`, and `both_modified_conflict`.
270
+
271
+ </details>
272
+
273
+ <details>
274
+ <summary><code>skeeper pull</code>, <code>push</code>, and <code>sync</code> — Git-like spec convergence</summary>
275
+
276
+ ```bash
277
+ skeeper pull [--json] [--no-git]
278
+ skeeper push [--dry-run] [--json] [--commit --message <msg>] [--force] [--prune]
279
+ skeeper sync [--dry-run] [--json] [--commit --message <msg>] [--force] [--prune]
280
+ ```
281
+
282
+ Use `pull` to fetch sidecar refs and materialize remote docs into the working tree while preserving local docs. It fast-forwards the main repo unless `--no-git` is set.
283
+
284
+ Use `push` to publish local managed docs, write `skeeper.lock`, and stage the lockfile. By default `push` is non-destructive: remote-only docs stay in the sidecar.
285
+
286
+ Use `sync` for the common two-clone flow. It runs a sidecar pull, then a push, so disjoint docs from two clones converge to the union.
287
+
288
+ `--prune` is explicit and destructive: it deletes remote-only sidecar files that are absent locally.
289
+
290
+ </details>
291
+
292
+ <details>
293
+ <summary><code>skeeper restore</code> — Restore local files from locked sidecar state</summary>
294
+
295
+ ```bash
296
+ skeeper restore <path...> [--dry-run] [--json]
297
+ skeeper restore --all [--dry-run] [--json]
298
+ ```
299
+
300
+ Use `restore <path>` to overwrite selected local files with the content pinned by `skeeper.lock`. Existing local content is moved into rescue storage before overwrite. Use `restore --all` after a fresh clone, bisect, or checkout when you need every locked managed file materialized locally. Use `pull` when you want the latest remote sidecar tip instead of the locked state.
301
+
302
+ </details>
303
+
304
+ <details>
305
+ <summary><code>skeeper track</code> and <code>untrack</code> — Change managed coverage</summary>
306
+
307
+ ```bash
308
+ skeeper track <glob> [--namespace <name>] [--exclude <glob>]... [--sync] [--dry-run] [--json] [--force] [--commit --message <msg>]
209
309
  skeeper untrack <path-or-glob>... [--dry-run] [--json] [--force] [--commit --message <msg>]
210
- skeeper pattern test <glob> [--namespace <name>] [--json]
211
- skeeper pattern add <glob> [--namespace <name>] [--exclude <glob>]... [--adopt-existing] [--dry-run] [--json] [--force] [--commit --message <msg>]
212
- skeeper hydrate
213
- skeeper status [--json]
214
- skeeper log <path> [--latest]
215
- skeeper fsck [--json] [--source-branch <branch>]
216
- skeeper verify [--json] [--source-branch <branch>]
217
- skeeper hooks install [--json]
218
- skeeper hooks check [--json]
219
- skeeper merge-driver [--json]
220
- skeeper repair status|resume|abort [--json]
310
+ ```
311
+
312
+ Use `track` to add a managed glob to `.skeeper.yml` and the managed `.gitignore` block. Add `--sync` when matching files already exist and should be published into the sidecar immediately.
313
+
314
+ Use `untrack` when a managed path should stop being tracked in the main repository after the sidecar has the content.
315
+
316
+ </details>
317
+
318
+ <details>
319
+ <summary><code>skeeper repair</code> — Diagnose and repair local Skeeper state</summary>
320
+
321
+ ```bash
322
+ skeeper repair [--check] [--json]
323
+ ```
324
+
325
+ `repair` handles hook drift, strict-hook bypasses, interrupted transactions, missing local sidecar objects, and rescue reporting. It applies safe repairs automatically and stops on ambiguous overwrite/delete decisions. Use `repair --check` for read-only diagnosis.
326
+
327
+ </details>
328
+
329
+ <details>
330
+ <summary><code>skeeper log</code>, <code>version</code>, and <code>completion</code> — Utility commands</summary>
331
+
332
+ ```bash
333
+ skeeper log <path> [--latest] [--source-branch <branch>]
221
334
  skeeper version
335
+ skeeper completion <bash|fish|powershell|zsh>
222
336
  ```
223
337
 
224
- Command notes:
338
+ `log` shows sidecar history for one managed spec path. By default it reads the locked commit; use `--latest` to fetch and inspect the latest namespace branch instead.
225
339
 
226
- - `sync` uses working-tree content and stages `skeeper.lock`. Hook mode uses staged index content.
227
- - `adopt` and `untrack` push sidecar coverage before removing main-index tracking.
228
- - `pattern add --adopt-existing` updates `.skeeper.yml`, updates the managed `.gitignore` block, then runs the same adoption transaction.
229
- - `verify` checks `skeeper.lock` against the sidecar remote and does not require hooks.
230
- - `fsck` compares current working-tree specs against locked sidecar content and does not mutate files or refs.
231
- - `hydrate` restores from locked sidecar commits by default.
232
- - `log --latest` fetches the namespace branch and reads its latest history instead of the locked commit.
233
- - `hooks install` removes legacy Skeeper post-commit blocks, installs strict pre-commit/pre-merge-commit/pre-push blocks, writes `.gitattributes`, and configures the `skeeper.lock` merge driver.
340
+ `version` prints build version, commit, and build date.
341
+
342
+ `completion` is provided by Cobra and generates shell completion scripts.
343
+
344
+ </details>
234
345
 
235
346
  ## 🤖 CI Action
236
347
 
237
- Use the same-repository Action to verify `skeeper.lock` in CI:
348
+ Use the same-repository Action to check Skeeper health in CI:
238
349
 
239
350
  ```yaml
240
351
  name: skeeper
@@ -245,16 +356,17 @@ on:
245
356
  branches: [main]
246
357
 
247
358
  jobs:
248
- verify:
359
+ check:
249
360
  runs-on: ubuntu-latest
250
361
  steps:
251
362
  - uses: actions/checkout@v4
252
363
  with:
253
364
  fetch-depth: 0
254
- - uses: compozy/skeeper@v0.1.1
365
+ - uses: compozy/skeeper@v0.2.1
255
366
  with:
256
367
  args: |
257
- verify
368
+ status
369
+ --check
258
370
  --json
259
371
  ssh-private-key: ${{ secrets.SKEEPER_SSH_PRIVATE_KEY }}
260
372
  ```
@@ -265,25 +377,29 @@ Credential precedence:
265
377
  2. `token` configures HTTPS GitHub credentials.
266
378
  3. Existing runner Git/SSH credentials are used when neither input is provided.
267
379
 
268
- Secrets are masked before configuration. The wrapper downloads the released Skeeper binary for the action ref/tag and delegates verification to the CLI.
380
+ Secrets are masked before configuration. The wrapper downloads the released Skeeper binary for the action ref/tag and delegates the status check to the CLI.
269
381
 
270
382
  ## 🩺 Troubleshooting
271
383
 
272
384
  **`SKEEPER_SKIP=1` was used**
273
385
 
274
- Run `skeeper status`, then `skeeper sync`, then `skeeper verify`. The bypass journal remains visible until sync clears it.
386
+ Run `skeeper status`, then `skeeper sync`, then `skeeper status --check`. The bypass journal remains visible until sync clears it.
275
387
 
276
388
  **Sidecar push was rejected**
277
389
 
278
- Run `skeeper repair status`. If the failure happened before main-index mutation, fix network/auth or sidecar contention and run `skeeper repair resume`. If the main index was already mutated, inspect the listed files manually.
390
+ Run `skeeper repair --check`. If the failure is safe to repair automatically, run `skeeper repair` after fixing network/auth or sidecar contention. If the report names an ambiguous overwrite/delete decision, inspect the listed files manually and use `skeeper sync` after resolving it.
279
391
 
280
392
  **`skeeper.lock` conflicts during merge**
281
393
 
282
- Run `skeeper hooks install` to ensure the merge driver is configured, then rerun the merge. Manual editing of scalar sidecar SHAs is unsupported; regenerate the lock through `skeeper merge-driver` or `skeeper sync`.
394
+ Run `skeeper repair` to ensure hooks and merge-driver wiring are configured, then rerun the merge. Manual editing of scalar sidecar SHAs is unsupported; regenerate the lock through `skeeper sync`.
395
+
396
+ **`skeeper pull` or `skeeper restore` is blocked by local managed files**
397
+
398
+ Run `skeeper status --paths` to inspect exact paths. Use `skeeper sync` when local-only docs should be merged with remote docs. Use `skeeper push --prune` only when the local set is intentionally authoritative and remote-only docs should be pruned.
283
399
 
284
- **`verify` reports a lock mismatch**
400
+ **`status --check` reports a lock mismatch**
285
401
 
286
- The main commit and sidecar remote disagree. Run `skeeper sync`, include the updated `skeeper.lock`, and rerun `skeeper verify`.
402
+ The main commit and sidecar remote disagree. Run `skeeper sync`, include the updated `skeeper.lock`, and rerun `skeeper status --check`.
287
403
 
288
404
  **A namespace overlaps another namespace**
289
405
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@compozy/skeeper",
3
3
  "type": "module",
4
- "version": "0.2.0",
4
+ "version": "0.3.0",
5
5
  "description": "Sidecar Git versioning for spec artifacts",
6
6
  "scripts": {
7
7
  "postinstall": "node install.js",
@@ -27,63 +27,63 @@
27
27
  },
28
28
  "archives": {
29
29
  "darwin-arm64": {
30
- "name": "skeeper_0.2.0_darwin_arm64.tar.gz",
31
- "url": "https://github.com/compozy/skeeper/releases/download/v0.2.0/skeeper_0.2.0_darwin_arm64.tar.gz",
30
+ "name": "skeeper_0.3.0_darwin_arm64.tar.gz",
31
+ "url": "https://github.com/compozy/skeeper/releases/download/v0.3.0/skeeper_0.3.0_darwin_arm64.tar.gz",
32
32
  "bins": [
33
33
  "skeeper"
34
34
  ],
35
35
  "format": "tar.gz",
36
36
  "checksum": {
37
37
  "algorithm": "sha256",
38
- "digest": "0b989d71f5cf6dc929bcf18d9f86fbe827ba74231b38b98fe268a299ba56d7da"
38
+ "digest": "3aa2e55272c6de252f6064cd35fbf4ce328715f6835c3810b6b18be2ba23cd84"
39
39
  }
40
40
  },
41
41
  "darwin-x64": {
42
- "name": "skeeper_0.2.0_darwin_x86_64.tar.gz",
43
- "url": "https://github.com/compozy/skeeper/releases/download/v0.2.0/skeeper_0.2.0_darwin_x86_64.tar.gz",
42
+ "name": "skeeper_0.3.0_darwin_x86_64.tar.gz",
43
+ "url": "https://github.com/compozy/skeeper/releases/download/v0.3.0/skeeper_0.3.0_darwin_x86_64.tar.gz",
44
44
  "bins": [
45
45
  "skeeper"
46
46
  ],
47
47
  "format": "tar.gz",
48
48
  "checksum": {
49
49
  "algorithm": "sha256",
50
- "digest": "fced98b16ffae5f72d843dfe532b989ee4f4c6df59973167f38a8e68fde1385c"
50
+ "digest": "d56c7ab028576cc50f6e9f3dd4b7c84909ef4baee6dfa9dcb9e98e32d77b0319"
51
51
  }
52
52
  },
53
53
  "linux-arm64": {
54
- "name": "skeeper_0.2.0_linux_arm64.tar.gz",
55
- "url": "https://github.com/compozy/skeeper/releases/download/v0.2.0/skeeper_0.2.0_linux_arm64.tar.gz",
54
+ "name": "skeeper_0.3.0_linux_arm64.tar.gz",
55
+ "url": "https://github.com/compozy/skeeper/releases/download/v0.3.0/skeeper_0.3.0_linux_arm64.tar.gz",
56
56
  "bins": [
57
57
  "skeeper"
58
58
  ],
59
59
  "format": "tar.gz",
60
60
  "checksum": {
61
61
  "algorithm": "sha256",
62
- "digest": "04ab4382e4a01cb7a9165c055b8cf3b9675d03fbebe056ff67e2b04450c02a54"
62
+ "digest": "457f1b62137886afa56cdbf48b902b01fc81abc10e4431619ca1a8bbca5b73e1"
63
63
  }
64
64
  },
65
65
  "linux-x64": {
66
- "name": "skeeper_0.2.0_linux_x86_64.tar.gz",
67
- "url": "https://github.com/compozy/skeeper/releases/download/v0.2.0/skeeper_0.2.0_linux_x86_64.tar.gz",
66
+ "name": "skeeper_0.3.0_linux_x86_64.tar.gz",
67
+ "url": "https://github.com/compozy/skeeper/releases/download/v0.3.0/skeeper_0.3.0_linux_x86_64.tar.gz",
68
68
  "bins": [
69
69
  "skeeper"
70
70
  ],
71
71
  "format": "tar.gz",
72
72
  "checksum": {
73
73
  "algorithm": "sha256",
74
- "digest": "f1e0426e926fc654fccf23a6744cebc9313bf43cd5cc14576adef6cdf5612583"
74
+ "digest": "58697a19879045eb0c6f5d92711697f58f78926dc87e772608e8cf99bc614525"
75
75
  }
76
76
  },
77
77
  "win32-x64": {
78
- "name": "skeeper_0.2.0_windows_x86_64.zip",
79
- "url": "https://github.com/compozy/skeeper/releases/download/v0.2.0/skeeper_0.2.0_windows_x86_64.zip",
78
+ "name": "skeeper_0.3.0_windows_x86_64.zip",
79
+ "url": "https://github.com/compozy/skeeper/releases/download/v0.3.0/skeeper_0.3.0_windows_x86_64.zip",
80
80
  "bins": [
81
81
  "skeeper.exe"
82
82
  ],
83
83
  "format": "zip",
84
84
  "checksum": {
85
85
  "algorithm": "sha256",
86
- "digest": "7dc1569a187eecaccc5e79e5f69be4da95acf050a6b58816bb790a38303e8733"
86
+ "digest": "630c98e8f22fb91777602c704a4e21a70532dfada3bb604477a1997d95951768"
87
87
  }
88
88
  }
89
89
  }