@mean-weasel/lineage 0.1.21-rc.3 → 0.1.22

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.1.22
4
+
5
+ - Harden the landing page, README, and packaged manual dogfood guide with fail-fast first-run commands that complete the post-initialization runtime, profile, database, and service identity gate.
6
+ - Isolate bootstrap dependencies from stable and preview shims so repeat and coexisting channel installs cannot clobber their launchers.
7
+ - Package and scan the manual install runbook, and make the Node.js 22.22+ requirement explicit for the independently published Codex plugin installer.
8
+ - Stabilize the rich-demo browser readiness proof so delayed workspace discovery cannot race the media download check.
9
+ - Make plugin-installer dist-tag promotion verification tolerate npm registry propagation while still failing closed on the wrong version.
10
+
11
+ ## 0.1.21
12
+
13
+ - Make immutable annotated tags on reviewed `main` the sole authority for matching npm and GitHub releases, with verified plugin assets built before publication and stable/prerelease channels selected directly from SemVer.
14
+ - Harden the tag-triggered workflow against synthetic checkout refs and require GitHub credentials for the assets-first npm publication proof.
15
+
3
16
  ## 0.1.21-rc.3
4
17
 
5
18
  - Pass the workflow GitHub token into npm publication so the assets-first release guard can verify the matching prerelease tarball and checksum before publishing.
@@ -0,0 +1,340 @@
1
+ # Hermetic manual install dogfood
2
+
3
+ Use this runbook to exercise the public first-user journey without modifying an
4
+ existing Lineage runtime, profile, database, service, npm prefix, cache, or
5
+ Codex home. Use synthetic demo data only. Never place credentials, customer
6
+ content, private media, or a live SQLite database in the dogfood root.
7
+
8
+ Run one channel at a time. The primary public journey is `stable`; stop it and
9
+ finish its evidence before beginning a separate checkout-only `dev` journey.
10
+
11
+ ## Prepare isolated roots
12
+
13
+ Create one owner-only temporary root:
14
+
15
+ ```bash
16
+ DOGFOOD_ROOT="$(mktemp -d /tmp/lineage-manual-dogfood.XXXXXX)"
17
+ chmod 700 "$DOGFOOD_ROOT"
18
+
19
+ DOGFOOD_HOME="$DOGFOOD_ROOT/home"
20
+ DOGFOOD_NPM_PREFIX="$DOGFOOD_ROOT/npm-global"
21
+ DOGFOOD_NPM_CACHE="$DOGFOOD_ROOT/npm-cache"
22
+ DOGFOOD_RUNTIME_ROOT="$DOGFOOD_ROOT/runtimes"
23
+ DOGFOOD_PROFILE_ROOT="$DOGFOOD_ROOT/profiles"
24
+ DOGFOOD_SERVICE_ROOT="$DOGFOOD_ROOT/services"
25
+ DOGFOOD_CODEX_HOME="$DOGFOOD_ROOT/codex-home"
26
+ DOGFOOD_BASE_PATH="$PATH"
27
+ DOGFOOD_PROFILE="manual-stable"
28
+ DOGFOOD_PORT="5297"
29
+ DOGFOOD_ORIGIN="http://127.0.0.1:$DOGFOOD_PORT"
30
+
31
+ mkdir -p \
32
+ "$DOGFOOD_HOME" \
33
+ "$DOGFOOD_NPM_PREFIX" \
34
+ "$DOGFOOD_NPM_CACHE" \
35
+ "$DOGFOOD_RUNTIME_ROOT" \
36
+ "$DOGFOOD_PROFILE_ROOT" \
37
+ "$DOGFOOD_SERVICE_ROOT" \
38
+ "$DOGFOOD_CODEX_HOME"
39
+ ```
40
+
41
+ Keep isolation scoped to each child process instead of exporting it over the
42
+ maintainer's normal shell:
43
+
44
+ ```bash
45
+ run_lineage_dogfood() {
46
+ env \
47
+ HOME="$DOGFOOD_HOME" \
48
+ CODEX_HOME="$DOGFOOD_CODEX_HOME" \
49
+ LINEAGE_RUNTIME_ROOT="$DOGFOOD_RUNTIME_ROOT" \
50
+ LINEAGE_PROFILE_ROOT="$DOGFOOD_PROFILE_ROOT" \
51
+ LINEAGE_SERVICE_ROOT="$DOGFOOD_SERVICE_ROOT" \
52
+ npm_config_cache="$DOGFOOD_NPM_CACHE" \
53
+ npm_config_prefix="$DOGFOOD_NPM_PREFIX" \
54
+ PATH="$DOGFOOD_NPM_PREFIX/bin:$DOGFOOD_RUNTIME_ROOT/bin:$DOGFOOD_BASE_PATH" \
55
+ "$@"
56
+ }
57
+ ```
58
+
59
+ Confirm the chosen port is unused before profile initialization:
60
+
61
+ ```bash
62
+ lsof -nP -iTCP:"$DOGFOOD_PORT" -sTCP:LISTEN
63
+ ```
64
+
65
+ Choose another port if that prints a listener. The service origin becomes part
66
+ of the immutable profile identity.
67
+
68
+ ## Install the published stable channel
69
+
70
+ Record the prerequisites and registry selection:
71
+
72
+ ```bash
73
+ run_lineage_dogfood node --version
74
+ run_lineage_dogfood npm --version
75
+ run_lineage_dogfood codex --version
76
+ run_lineage_dogfood npm view @mean-weasel/lineage dist-tags version engines --json
77
+ ```
78
+
79
+ Install the same global bootstrap and isolated stable runtime documented in the
80
+ public first run:
81
+
82
+ ```bash
83
+ run_lineage_dogfood npm install --global @mean-weasel/lineage@latest
84
+ run_lineage_dogfood lineage-channel install stable \
85
+ --root "$DOGFOOD_RUNTIME_ROOT" \
86
+ --shim-dir "$DOGFOOD_RUNTIME_ROOT/bin" \
87
+ --json
88
+ run_lineage_dogfood lineage-stable runtime doctor --json
89
+ ```
90
+
91
+ Require `stable`, `package`, `verified: true`, and code/receipt paths beneath
92
+ `$DOGFOOD_RUNTIME_ROOT`. Stop if the launcher resolves into a checkout or any
93
+ normal user data root.
94
+
95
+ ## Initialize and gate the fresh profile
96
+
97
+ Fresh-profile bootstrap exception: profile doctor and `db info` cannot pass
98
+ before the profile exists. Runtime doctor is therefore the only pre-init
99
+ identity check. Initialize atomically, then immediately complete the full gate:
100
+
101
+ ```bash
102
+ run_lineage_dogfood lineage-stable profile init \
103
+ --profile "$DOGFOOD_PROFILE" \
104
+ --service-origin "$DOGFOOD_ORIGIN" \
105
+ --confirm-write \
106
+ --json
107
+
108
+ run_lineage_dogfood lineage-stable runtime doctor --json
109
+ run_lineage_dogfood lineage-stable profile doctor \
110
+ --profile "$DOGFOOD_PROFILE" \
111
+ --json
112
+ run_lineage_dogfood lineage-stable db info \
113
+ --profile "$DOGFOOD_PROFILE" \
114
+ --json
115
+ ```
116
+
117
+ Require the runtime fingerprint, profile ID/environment/fingerprint, database
118
+ identity, and service origin to agree. Database and media paths must remain
119
+ beneath `$DOGFOOD_PROFILE_ROOT`. Offline database information should report
120
+ `process.role: command` and no live service object.
121
+
122
+ Repeat `profile init` once as a negative check. It must refuse to overwrite the
123
+ existing profile and print reuse or profile doctor guidance.
124
+
125
+ ## Exercise foreground startup and the app
126
+
127
+ Start the exact public foreground command:
128
+
129
+ ```bash
130
+ run_lineage_dogfood lineage-stable start --profile "$DOGFOOD_PROFILE"
131
+ ```
132
+
133
+ Open `$DOGFOOD_ORIGIN` in a browser. Record:
134
+
135
+ 1. Runtime Settings show the exact stable package, profile, database, media
136
+ root, and service origin from the gate.
137
+ 2. **Load demo lineage** produces 10 nodes and 9 edges.
138
+ 3. **Load rich image demo** produces 14 nodes, 13 edges, and 14 PNG previews.
139
+ 4. No preview is broken and no stale empty-lineage message remains.
140
+ 5. Browser console errors and terminal warnings are copied verbatim.
141
+ 6. A screenshot contains only synthetic demo content and temporary paths.
142
+
143
+ Stop with Ctrl-C and confirm the port closes.
144
+
145
+ ## Exercise managed lifecycle and CLI handoff
146
+
147
+ ```bash
148
+ run_lineage_dogfood lineage-stable-service start \
149
+ --channel stable \
150
+ --profile "$DOGFOOD_PROFILE" \
151
+ --json
152
+ run_lineage_dogfood lineage-stable-service status \
153
+ --channel stable \
154
+ --profile "$DOGFOOD_PROFILE" \
155
+ --json
156
+ ```
157
+
158
+ Require the managed receipt and `/api/runtime` to agree on the service instance,
159
+ code fingerprint, profile/database fingerprints, and origin. Repeat `start` and
160
+ require the same healthy instance. Confirm both demo workspaces survived the
161
+ foreground restart.
162
+
163
+ Use the rich-demo root returned by the app:
164
+
165
+ ```bash
166
+ run_lineage_dogfood lineage-stable next \
167
+ --profile "$DOGFOOD_PROFILE" \
168
+ --project demo-project \
169
+ --root "<rich-root-id>" \
170
+ --json
171
+ run_lineage_dogfood lineage-stable brief \
172
+ --profile "$DOGFOOD_PROFILE" \
173
+ --project demo-project \
174
+ --root "<rich-root-id>" \
175
+ --json
176
+ ```
177
+
178
+ Generated handoff commands must retain `lineage-stable` and the selected
179
+ temporary profile.
180
+
181
+ ## Exercise the optional Codex plugin
182
+
183
+ Install and doctor only the temporary Codex home:
184
+
185
+ ```bash
186
+ run_lineage_dogfood npx --yes \
187
+ @mean-weasel/lineage-plugin-installer@latest \
188
+ install \
189
+ --channel latest \
190
+ --codex-home "$DOGFOOD_CODEX_HOME" \
191
+ --json
192
+ run_lineage_dogfood npx --yes \
193
+ @mean-weasel/lineage-plugin-installer@latest \
194
+ doctor \
195
+ --channel latest \
196
+ --codex-home "$DOGFOOD_CODEX_HOME" \
197
+ --json
198
+ run_lineage_dogfood codex plugin list --json
199
+ ```
200
+
201
+ Require `lineage-codex-plugin@lineage` at the exact installed Lineage version,
202
+ installed and enabled. Repeat installation once to prove safe reinstall, then
203
+ remove only the temporary registration:
204
+
205
+ ```bash
206
+ run_lineage_dogfood codex plugin remove \
207
+ lineage-codex-plugin@lineage \
208
+ --json
209
+ run_lineage_dogfood codex plugin marketplace remove lineage --json
210
+ ```
211
+
212
+ Do not restart a normal Codex desktop session against this temporary home.
213
+
214
+ ## Stop, recheck, and clean up
215
+
216
+ ```bash
217
+ run_lineage_dogfood lineage-stable-service stop \
218
+ --channel stable \
219
+ --profile "$DOGFOOD_PROFILE" \
220
+ --json
221
+ run_lineage_dogfood lineage-stable profile doctor \
222
+ --profile "$DOGFOOD_PROFILE" \
223
+ --json
224
+ run_lineage_dogfood lineage-stable db info \
225
+ --profile "$DOGFOOD_PROFILE" \
226
+ --json
227
+ ```
228
+
229
+ The origin must be unreachable after stop, while the offline profile and
230
+ database checks still pass. Preserve the root for inspection on any failure.
231
+ After a clean pass and sanitized report, remove only the validated target:
232
+
233
+ ```bash
234
+ case "$DOGFOOD_ROOT" in
235
+ /tmp/lineage-manual-dogfood.*)
236
+ rm -rf -- "$DOGFOOD_ROOT"
237
+ ;;
238
+ *)
239
+ echo "Refusing unexpected cleanup target: $DOGFOOD_ROOT"
240
+ exit 1
241
+ ;;
242
+ esac
243
+ ```
244
+
245
+ ## Separate source-development journey
246
+
247
+ Create a second temporary root with a different profile, service origin, npm
248
+ cache, and Codex home. Do not reuse the stable profile or database:
249
+
250
+ ```bash
251
+ DEV_DOGFOOD_ROOT="$(mktemp -d /tmp/lineage-manual-dev-dogfood.XXXXXX)"
252
+ chmod 700 "$DEV_DOGFOOD_ROOT"
253
+
254
+ DEV_DOGFOOD_HOME="$DEV_DOGFOOD_ROOT/home"
255
+ DEV_DOGFOOD_NPM_CACHE="$DEV_DOGFOOD_ROOT/npm-cache"
256
+ DEV_DOGFOOD_RUNTIME_ROOT="$DEV_DOGFOOD_ROOT/runtimes"
257
+ DEV_DOGFOOD_PROFILE_ROOT="$DEV_DOGFOOD_ROOT/profiles"
258
+ DEV_DOGFOOD_SERVICE_ROOT="$DEV_DOGFOOD_ROOT/services"
259
+ DEV_DOGFOOD_CODEX_HOME="$DEV_DOGFOOD_ROOT/codex-home"
260
+ DEV_DOGFOOD_BASE_PATH="$PATH"
261
+ DEV_DOGFOOD_PROFILE="manual-development"
262
+ DEV_DOGFOOD_PORT="5298"
263
+ DEV_DOGFOOD_ORIGIN="http://127.0.0.1:$DEV_DOGFOOD_PORT"
264
+
265
+ mkdir -p \
266
+ "$DEV_DOGFOOD_HOME" \
267
+ "$DEV_DOGFOOD_NPM_CACHE" \
268
+ "$DEV_DOGFOOD_RUNTIME_ROOT" \
269
+ "$DEV_DOGFOOD_PROFILE_ROOT" \
270
+ "$DEV_DOGFOOD_SERVICE_ROOT" \
271
+ "$DEV_DOGFOOD_CODEX_HOME"
272
+
273
+ run_lineage_dev_dogfood() {
274
+ env \
275
+ HOME="$DEV_DOGFOOD_HOME" \
276
+ CODEX_HOME="$DEV_DOGFOOD_CODEX_HOME" \
277
+ LINEAGE_RUNTIME_ROOT="$DEV_DOGFOOD_RUNTIME_ROOT" \
278
+ LINEAGE_PROFILE_ROOT="$DEV_DOGFOOD_PROFILE_ROOT" \
279
+ LINEAGE_SERVICE_ROOT="$DEV_DOGFOOD_SERVICE_ROOT" \
280
+ npm_config_cache="$DEV_DOGFOOD_NPM_CACHE" \
281
+ PATH="$DEV_DOGFOOD_HOME/.local/bin:$DEV_DOGFOOD_BASE_PATH" \
282
+ "$@"
283
+ }
284
+ ```
285
+
286
+ Confirm that `$DEV_DOGFOOD_PORT` is unused, choosing a different port if
287
+ necessary. Then perform every source command through the wrapper:
288
+
289
+ ```bash
290
+ run_lineage_dev_dogfood git clone \
291
+ https://github.com/mean-weasel/lineage.git \
292
+ "$DEV_DOGFOOD_ROOT/lineage"
293
+ cd "$DEV_DOGFOOD_ROOT/lineage"
294
+ run_lineage_dev_dogfood npm ci
295
+ run_lineage_dev_dogfood npm run lineage:dev -- runtime doctor --json
296
+ run_lineage_dev_dogfood npm run lineage:dev -- profile init \
297
+ --profile "$DEV_DOGFOOD_PROFILE" \
298
+ --service-origin "$DEV_DOGFOOD_ORIGIN" \
299
+ --confirm-write \
300
+ --json
301
+ run_lineage_dev_dogfood npm run lineage:dev -- runtime doctor --json
302
+ run_lineage_dev_dogfood npm run lineage:dev -- profile doctor \
303
+ --profile "$DEV_DOGFOOD_PROFILE" \
304
+ --json
305
+ run_lineage_dev_dogfood npm run lineage:dev -- db info \
306
+ --profile "$DEV_DOGFOOD_PROFILE" \
307
+ --json
308
+ run_lineage_dev_dogfood npm run dev -- --profile "$DEV_DOGFOOD_PROFILE"
309
+ ```
310
+
311
+ Repeat the synthetic demo, restart, Settings, and CLI checks. Then stop the
312
+ foreground process and prove the bundled managed-development path:
313
+
314
+ ```bash
315
+ run_lineage_dev_dogfood make install-dev
316
+ run_lineage_dev_dogfood npm run lineage:dev -- runtime doctor --json
317
+ run_lineage_dev_dogfood make start-dev-bg \
318
+ LINEAGE_DEV_PROFILE="$DEV_DOGFOOD_PROFILE"
319
+ run_lineage_dev_dogfood make status-dev \
320
+ LINEAGE_DEV_PROFILE="$DEV_DOGFOOD_PROFILE"
321
+ run_lineage_dev_dogfood make stop-dev \
322
+ LINEAGE_DEV_PROFILE="$DEV_DOGFOOD_PROFILE"
323
+ ```
324
+
325
+ The final evidence must identify `dev`, `checkout`, and the fresh clone's
326
+ canonical root and fingerprint. It must not match or open the stable database.
327
+ Preserve the temporary root on failure. After a clean pass, remove only the
328
+ guarded development target:
329
+
330
+ ```bash
331
+ case "$DEV_DOGFOOD_ROOT" in
332
+ /tmp/lineage-manual-dev-dogfood.*)
333
+ rm -rf -- "$DEV_DOGFOOD_ROOT"
334
+ ;;
335
+ *)
336
+ echo "Refusing unexpected cleanup target: $DEV_DOGFOOD_ROOT"
337
+ exit 1
338
+ ;;
339
+ esac
340
+ ```
package/README.md CHANGED
@@ -68,6 +68,11 @@ app, but required to install and activate the Codex plugin; verify that
68
68
  additional prerequisite with `codex --version` before following the plugin
69
69
  step.
70
70
 
71
+ On the minimum supported Node 22 line, foreground startup can print one
72
+ `ExperimentalWarning` for Node's built-in SQLite module before the healthy
73
+ `Lineage listening` line. Lineage keeps that category-specific warning visible;
74
+ it does not indicate an identity or database failure.
75
+
71
76
  ### Develop from a fresh clone
72
77
 
73
78
  This is the shortest source-development path with hot reload and isolated
@@ -76,8 +81,12 @@ development data:
76
81
  ```bash
77
82
  git clone https://github.com/mean-weasel/lineage.git
78
83
  cd lineage
79
- npm ci
80
- npm run lineage:dev -- profile init --profile team-development --confirm-write --json
84
+ npm ci &&
85
+ npm run lineage:dev -- runtime doctor --json &&
86
+ npm run lineage:dev -- profile init --profile team-development --confirm-write --json &&
87
+ npm run lineage:dev -- runtime doctor --json &&
88
+ npm run lineage:dev -- profile doctor --profile team-development --json &&
89
+ npm run lineage:dev -- db info --profile team-development --json &&
81
90
  npm run dev -- --profile team-development
82
91
  ```
83
92
 
@@ -94,19 +103,25 @@ Use the currently published npm dist-tags when you want installed rather than
94
103
  checkout code:
95
104
 
96
105
  ```bash
97
- npm install -g @mean-weasel/lineage@latest
98
- lineage-channel install stable
99
- lineage-stable runtime doctor --json
100
- lineage-stable profile init --profile team-production --confirm-write --json
106
+ npm install -g @mean-weasel/lineage@latest &&
107
+ lineage-channel install stable &&
108
+ lineage-stable runtime doctor --json &&
109
+ lineage-stable profile init --profile team-production --confirm-write --json &&
110
+ lineage-stable runtime doctor --json &&
111
+ lineage-stable profile doctor --profile team-production --json &&
112
+ lineage-stable db info --profile team-production --json &&
101
113
  lineage-stable start --profile team-production
102
114
  ```
103
115
 
104
116
  Preview is independent and must use its own runtime root and profile:
105
117
 
106
118
  ```bash
107
- lineage-channel install preview
108
- lineage-preview runtime doctor --json
109
- lineage-preview profile init --profile team-preview --confirm-write --json
119
+ lineage-channel install preview &&
120
+ lineage-preview runtime doctor --json &&
121
+ lineage-preview profile init --profile team-preview --confirm-write --json &&
122
+ lineage-preview runtime doctor --json &&
123
+ lineage-preview profile doctor --profile team-preview --json &&
124
+ lineage-preview db info --profile team-preview --json &&
110
125
  lineage-preview start --profile team-preview
111
126
  ```
112
127
 
@@ -128,6 +143,10 @@ If doctor fails, it prints a version-pinned remediation command for that same
128
143
  Codex home. For verification, use a temporary `--codex-home`; do not test an
129
144
  installer against your real Codex profile.
130
145
 
146
+ Maintainers can exercise the complete published and source journeys without
147
+ touching an existing Lineage or Codex installation by following the
148
+ [hermetic manual install dogfood runbook](MANUAL_INSTALL_DOGFOOD.md).
149
+
131
150
  ## Package Channels
132
151
 
133
152
  Lineage is packaged as `@mean-weasel/lineage`, but stable and preview must not
@@ -175,6 +194,12 @@ lineage-preview profile init --profile team-preview --confirm-write --json
175
194
  npm run lineage:dev -- profile init --profile team-development --confirm-write --json
176
195
  ```
177
196
 
197
+ Fresh-profile bootstrap exception: because profile doctor and `db info` cannot
198
+ pass before a profile and database exist, run runtime doctor first, perform the
199
+ atomic `profile init`, and then immediately run runtime doctor, profile doctor,
200
+ and `db info --profile <profile> --json`. Do not start a service or perform
201
+ another write until that post-init gate passes.
202
+
178
203
  `profile init` derives the environment and exact verified code pin from the
179
204
  launcher, creates owner-only media and SQLite paths, binds the new database
180
205
  identity, and publishes the profile manifest only after those steps succeed.
@@ -614,6 +639,10 @@ and then cleans up.
614
639
 
615
640
  The root `Makefile` provides memorable wrappers for common setup, startup, and
616
641
  verification commands. Run `make` or `make help` to list the available targets.
642
+ `make install-prod` and `make install-preview` bootstrap the published
643
+ `@mean-weasel/lineage@latest` package under the isolated runtime root before
644
+ creating the channel runtime and its launchers, so they work from a fresh clone
645
+ without checkout build artifacts or overwriting an existing channel launcher.
617
646
 
618
647
  ```bash
619
648
  make install-prod
@@ -1,9 +1,9 @@
1
1
  {
2
- "build_fingerprint": "246179c9f4ebe132f285b40fc9562382b5bdb78196b4fed1a2b45d195a8b254a",
2
+ "build_fingerprint": "f1dd9715d725c348a752b41311a8ea775d69046bb4455a1541d5a991c606cfc2",
3
3
  "package_name": "@mean-weasel/lineage",
4
- "package_version": "0.1.21-rc.3",
4
+ "package_version": "0.1.22",
5
5
  "schema_version": "lineage.runtime_build.v1",
6
6
  "source_dirty": false,
7
- "source_fingerprint": "4d48d444fce99e2c91e7d09a89289429e9be5e3b2d647580d288aaf583d2473b",
8
- "source_git_sha": "270645f776cad017c1688659f3efcf03b24a5553"
7
+ "source_fingerprint": "196c2f9e492cb0eb22a485c74a2747fc2179315a2746466e970f89c507e6048b",
8
+ "source_git_sha": "ff38ca8fca7fa4c8ad1cde6a700332a9118b1f00"
9
9
  }