@mean-weasel/lineage 0.1.21 → 0.1.23

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 (220) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/MANUAL_INSTALL_DOGFOOD.md +341 -0
  3. package/README.md +46 -14
  4. package/dist/cli/lineage-dev.js +27 -21
  5. package/dist/cli/lineage-dev.js.map +3 -3
  6. package/dist/cli/lineage-preview.js +27 -21
  7. package/dist/cli/lineage-preview.js.map +3 -3
  8. package/dist/cli/lineage.js +27 -21
  9. package/dist/cli/lineage.js.map +3 -3
  10. package/dist/docs-site/404.html +41 -0
  11. package/dist/docs-site/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js +1 -0
  12. package/dist/docs-site/_astro/Search.astro_astro_type_script_index_0_lang.x2pVooPA.js +1 -0
  13. package/dist/docs-site/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js +1 -0
  14. package/dist/docs-site/_astro/common.DarLW4Vf.css +3 -0
  15. package/dist/docs-site/_astro/ec.0vx5m.js +3 -0
  16. package/dist/docs-site/_astro/ec.w36nc.css +1 -0
  17. package/dist/docs-site/_astro/page.LAbJoB63.js +1 -0
  18. package/dist/docs-site/_astro/print.ehPL0gv-.css +1 -0
  19. package/dist/docs-site/_astro/starlight-toc.CTCQXEge.js +1 -0
  20. package/dist/docs-site/_astro/ui-core.DWIqd25E.js +2 -0
  21. package/dist/docs-site/concepts/agent-claims-handoffs/index.html +99 -0
  22. package/dist/docs-site/concepts/attempts-current-version/index.html +86 -0
  23. package/dist/docs-site/concepts/branches-vs-rerolls/index.html +114 -0
  24. package/dist/docs-site/concepts/projects-workspaces-assets/index.html +89 -0
  25. package/dist/docs-site/concepts/selections-next-variations/index.html +86 -0
  26. package/dist/docs-site/index.html +92 -0
  27. package/dist/docs-site/integrations/cloud-storage/index.html +92 -0
  28. package/dist/docs-site/integrations/image-generation/index.html +93 -0
  29. package/dist/docs-site/integrations/index.html +112 -0
  30. package/dist/docs-site/integrations/social-scheduling/index.html +89 -0
  31. package/dist/docs-site/operations/backup-recovery/index.html +87 -0
  32. package/dist/docs-site/operations/channels/index.html +88 -0
  33. package/dist/docs-site/operations/local-first-data/index.html +90 -0
  34. package/dist/docs-site/operations/profiles-database-identity/index.html +90 -0
  35. package/dist/docs-site/operations/troubleshooting/index.html +89 -0
  36. package/dist/docs-site/pagefind/fragment/en_1126abb.pf_fragment +0 -0
  37. package/dist/docs-site/pagefind/fragment/en_19b3f6c.pf_fragment +0 -0
  38. package/dist/docs-site/pagefind/fragment/en_31aa611.pf_fragment +0 -0
  39. package/dist/docs-site/pagefind/fragment/en_38817cc.pf_fragment +0 -0
  40. package/dist/docs-site/pagefind/fragment/en_4184ad1.pf_fragment +0 -0
  41. package/dist/docs-site/pagefind/fragment/en_41db543.pf_fragment +0 -0
  42. package/dist/docs-site/pagefind/fragment/en_469f895.pf_fragment +0 -0
  43. package/dist/docs-site/pagefind/fragment/en_4db923b.pf_fragment +0 -0
  44. package/dist/docs-site/pagefind/fragment/en_56e45b6.pf_fragment +0 -0
  45. package/dist/docs-site/pagefind/fragment/en_56fe7ca.pf_fragment +0 -0
  46. package/dist/docs-site/pagefind/fragment/en_581a7cb.pf_fragment +0 -0
  47. package/dist/docs-site/pagefind/fragment/en_5be5e44.pf_fragment +0 -0
  48. package/dist/docs-site/pagefind/fragment/en_603c2be.pf_fragment +0 -0
  49. package/dist/docs-site/pagefind/fragment/en_66b3118.pf_fragment +0 -0
  50. package/dist/docs-site/pagefind/fragment/en_6a19c31.pf_fragment +0 -0
  51. package/dist/docs-site/pagefind/fragment/en_74e9307.pf_fragment +0 -0
  52. package/dist/docs-site/pagefind/fragment/en_7c9d5a2.pf_fragment +0 -0
  53. package/dist/docs-site/pagefind/fragment/en_818744b.pf_fragment +0 -0
  54. package/dist/docs-site/pagefind/fragment/en_8269752.pf_fragment +0 -0
  55. package/dist/docs-site/pagefind/fragment/en_88b38c1.pf_fragment +0 -0
  56. package/dist/docs-site/pagefind/fragment/en_8c1c735.pf_fragment +0 -0
  57. package/dist/docs-site/pagefind/fragment/en_98d9b16.pf_fragment +0 -0
  58. package/dist/docs-site/pagefind/fragment/en_a3d636e.pf_fragment +0 -0
  59. package/dist/docs-site/pagefind/fragment/en_b15ecf0.pf_fragment +0 -0
  60. package/dist/docs-site/pagefind/fragment/en_bcc29c5.pf_fragment +0 -0
  61. package/dist/docs-site/pagefind/fragment/en_bfb13e9.pf_fragment +0 -0
  62. package/dist/docs-site/pagefind/fragment/en_d0fca9e.pf_fragment +0 -0
  63. package/dist/docs-site/pagefind/fragment/en_d49ed00.pf_fragment +0 -0
  64. package/dist/docs-site/pagefind/fragment/en_e0786b9.pf_fragment +0 -0
  65. package/dist/docs-site/pagefind/fragment/en_e298dee.pf_fragment +0 -0
  66. package/dist/docs-site/pagefind/fragment/en_f6179a8.pf_fragment +0 -0
  67. package/dist/docs-site/pagefind/index/en_f279b04.pf_index +0 -0
  68. package/dist/docs-site/pagefind/pagefind-component-ui.css +1509 -0
  69. package/dist/docs-site/pagefind/pagefind-component-ui.js +56 -0
  70. package/dist/docs-site/pagefind/pagefind-entry.json +1 -0
  71. package/dist/docs-site/pagefind/pagefind-highlight.js +1070 -0
  72. package/dist/docs-site/pagefind/pagefind-modular-ui.css +214 -0
  73. package/dist/docs-site/pagefind/pagefind-modular-ui.js +8 -0
  74. package/dist/docs-site/pagefind/pagefind-ui.css +1 -0
  75. package/dist/docs-site/pagefind/pagefind-ui.js +2 -0
  76. package/dist/docs-site/pagefind/pagefind-worker.js +6 -0
  77. package/dist/docs-site/pagefind/pagefind.en_74951c3ca7.pf_meta +0 -0
  78. package/dist/docs-site/pagefind/pagefind.js +6 -0
  79. package/dist/docs-site/pagefind/wasm.en.pagefind +0 -0
  80. package/dist/docs-site/pagefind/wasm.unknown.pagefind +0 -0
  81. package/dist/docs-site/reference/cli/index.html +86 -0
  82. package/dist/docs-site/reference/interface-guide/index.html +86 -0
  83. package/dist/docs-site/reference/release-notes/index.html +80 -0
  84. package/dist/docs-site/reference/settings/index.html +86 -0
  85. package/dist/docs-site/reference/terminology/index.html +94 -0
  86. package/dist/docs-site/sitemap-0.xml +1 -0
  87. package/dist/docs-site/sitemap-index.xml +1 -0
  88. package/dist/docs-site/start-here/example-projects/index.html +88 -0
  89. package/dist/docs-site/start-here/first-workspace/index.html +91 -0
  90. package/dist/docs-site/start-here/installation-first-run/index.html +86 -0
  91. package/dist/docs-site/start-here/what-is-lineage/index.html +96 -0
  92. package/dist/docs-site/workflows/back-up-approved-assets/index.html +88 -0
  93. package/dist/docs-site/workflows/content-batches/index.html +88 -0
  94. package/dist/docs-site/workflows/continue-new-agent-session/index.html +89 -0
  95. package/dist/docs-site/workflows/create-grow-lineage/index.html +89 -0
  96. package/dist/docs-site/workflows/generate-import-variations/index.html +92 -0
  97. package/dist/docs-site/workflows/restore-earlier-attempt/index.html +87 -0
  98. package/dist/docs-site/workflows/review-approve-assets/index.html +87 -0
  99. package/dist/pages/.nojekyll +0 -0
  100. package/dist/pages/assets/agent-shared-state-DOfpTLiw.webp +0 -0
  101. package/dist/pages/assets/agent-to-canvas-DtIu_cPq.mp4 +0 -0
  102. package/dist/pages/assets/app-B-fAyNsU.css +1 -0
  103. package/dist/{web/assets/app-DX744BME.js → pages/assets/app-DdU93vp2.js} +36 -2
  104. package/dist/pages/assets/attempt-history-D6wdic6n.webp +0 -0
  105. package/dist/pages/assets/branching-tree-B8I5_S6D.png +0 -0
  106. package/dist/pages/assets/canvas-cli-DHBacq7r.png +0 -0
  107. package/dist/pages/assets/hero-agent-sync-D8ibW83E.mp4 +0 -0
  108. package/dist/pages/assets/hero-agent-sync-poster-zBB3KpbO.png +0 -0
  109. package/dist/pages/assets/hero-board-DG3ED4AW.webp +0 -0
  110. package/dist/pages/assets/hero-lineage-growth-Bsl9tiq-.mp4 +0 -0
  111. package/dist/pages/assets/hero-trace-connections-Bb52ABBc.mp4 +0 -0
  112. package/dist/pages/assets/human-selection-BdDBDE-I.webp +0 -0
  113. package/dist/pages/assets/human-to-agent-D1z92ZO9.mp4 +0 -0
  114. package/dist/pages/assets/jsx-runtime-DAFSxiwi.js +8 -0
  115. package/dist/pages/assets/landing-MwOFmHoi.js +2 -0
  116. package/dist/{web/assets/landing-Dmkx4R_N.css → pages/assets/landing-wy4L-yBm.css} +1 -1
  117. package/dist/pages/assets/reroll-history-DQcEH42R.mp4 +0 -0
  118. package/dist/pages/docs/404.html +41 -0
  119. package/dist/pages/docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js +1 -0
  120. package/dist/pages/docs/_astro/Search.astro_astro_type_script_index_0_lang.x2pVooPA.js +1 -0
  121. package/dist/pages/docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js +1 -0
  122. package/dist/pages/docs/_astro/common.DarLW4Vf.css +3 -0
  123. package/dist/pages/docs/_astro/ec.0vx5m.js +3 -0
  124. package/dist/pages/docs/_astro/ec.w36nc.css +1 -0
  125. package/dist/pages/docs/_astro/page.LAbJoB63.js +1 -0
  126. package/dist/pages/docs/_astro/print.ehPL0gv-.css +1 -0
  127. package/dist/pages/docs/_astro/starlight-toc.CTCQXEge.js +1 -0
  128. package/dist/pages/docs/_astro/ui-core.DWIqd25E.js +2 -0
  129. package/dist/pages/docs/concepts/agent-claims-handoffs/index.html +99 -0
  130. package/dist/pages/docs/concepts/attempts-current-version/index.html +86 -0
  131. package/dist/pages/docs/concepts/branches-vs-rerolls/index.html +114 -0
  132. package/dist/pages/docs/concepts/projects-workspaces-assets/index.html +89 -0
  133. package/dist/pages/docs/concepts/selections-next-variations/index.html +86 -0
  134. package/dist/pages/docs/index.html +92 -0
  135. package/dist/pages/docs/integrations/cloud-storage/index.html +92 -0
  136. package/dist/pages/docs/integrations/image-generation/index.html +93 -0
  137. package/dist/pages/docs/integrations/index.html +112 -0
  138. package/dist/pages/docs/integrations/social-scheduling/index.html +89 -0
  139. package/dist/pages/docs/operations/backup-recovery/index.html +87 -0
  140. package/dist/pages/docs/operations/channels/index.html +88 -0
  141. package/dist/pages/docs/operations/local-first-data/index.html +90 -0
  142. package/dist/pages/docs/operations/profiles-database-identity/index.html +90 -0
  143. package/dist/pages/docs/operations/troubleshooting/index.html +89 -0
  144. package/dist/pages/docs/pagefind/fragment/en_1126abb.pf_fragment +0 -0
  145. package/dist/pages/docs/pagefind/fragment/en_19b3f6c.pf_fragment +0 -0
  146. package/dist/pages/docs/pagefind/fragment/en_31aa611.pf_fragment +0 -0
  147. package/dist/pages/docs/pagefind/fragment/en_38817cc.pf_fragment +0 -0
  148. package/dist/pages/docs/pagefind/fragment/en_4184ad1.pf_fragment +0 -0
  149. package/dist/pages/docs/pagefind/fragment/en_41db543.pf_fragment +0 -0
  150. package/dist/pages/docs/pagefind/fragment/en_469f895.pf_fragment +0 -0
  151. package/dist/pages/docs/pagefind/fragment/en_4db923b.pf_fragment +0 -0
  152. package/dist/pages/docs/pagefind/fragment/en_56e45b6.pf_fragment +0 -0
  153. package/dist/pages/docs/pagefind/fragment/en_56fe7ca.pf_fragment +0 -0
  154. package/dist/pages/docs/pagefind/fragment/en_581a7cb.pf_fragment +0 -0
  155. package/dist/pages/docs/pagefind/fragment/en_5be5e44.pf_fragment +0 -0
  156. package/dist/pages/docs/pagefind/fragment/en_603c2be.pf_fragment +0 -0
  157. package/dist/pages/docs/pagefind/fragment/en_66b3118.pf_fragment +0 -0
  158. package/dist/pages/docs/pagefind/fragment/en_6a19c31.pf_fragment +0 -0
  159. package/dist/pages/docs/pagefind/fragment/en_74e9307.pf_fragment +0 -0
  160. package/dist/pages/docs/pagefind/fragment/en_7c9d5a2.pf_fragment +0 -0
  161. package/dist/pages/docs/pagefind/fragment/en_818744b.pf_fragment +0 -0
  162. package/dist/pages/docs/pagefind/fragment/en_8269752.pf_fragment +0 -0
  163. package/dist/pages/docs/pagefind/fragment/en_88b38c1.pf_fragment +0 -0
  164. package/dist/pages/docs/pagefind/fragment/en_8c1c735.pf_fragment +0 -0
  165. package/dist/pages/docs/pagefind/fragment/en_98d9b16.pf_fragment +0 -0
  166. package/dist/pages/docs/pagefind/fragment/en_a3d636e.pf_fragment +0 -0
  167. package/dist/pages/docs/pagefind/fragment/en_b15ecf0.pf_fragment +0 -0
  168. package/dist/pages/docs/pagefind/fragment/en_bcc29c5.pf_fragment +0 -0
  169. package/dist/pages/docs/pagefind/fragment/en_bfb13e9.pf_fragment +0 -0
  170. package/dist/pages/docs/pagefind/fragment/en_d0fca9e.pf_fragment +0 -0
  171. package/dist/pages/docs/pagefind/fragment/en_d49ed00.pf_fragment +0 -0
  172. package/dist/pages/docs/pagefind/fragment/en_e0786b9.pf_fragment +0 -0
  173. package/dist/pages/docs/pagefind/fragment/en_e298dee.pf_fragment +0 -0
  174. package/dist/pages/docs/pagefind/fragment/en_f6179a8.pf_fragment +0 -0
  175. package/dist/pages/docs/pagefind/index/en_f279b04.pf_index +0 -0
  176. package/dist/pages/docs/pagefind/pagefind-component-ui.css +1509 -0
  177. package/dist/pages/docs/pagefind/pagefind-component-ui.js +56 -0
  178. package/dist/pages/docs/pagefind/pagefind-entry.json +1 -0
  179. package/dist/pages/docs/pagefind/pagefind-highlight.js +1070 -0
  180. package/dist/pages/docs/pagefind/pagefind-modular-ui.css +214 -0
  181. package/dist/pages/docs/pagefind/pagefind-modular-ui.js +8 -0
  182. package/dist/pages/docs/pagefind/pagefind-ui.css +1 -0
  183. package/dist/pages/docs/pagefind/pagefind-ui.js +2 -0
  184. package/dist/pages/docs/pagefind/pagefind-worker.js +6 -0
  185. package/dist/pages/docs/pagefind/pagefind.en_74951c3ca7.pf_meta +0 -0
  186. package/dist/pages/docs/pagefind/pagefind.js +6 -0
  187. package/dist/pages/docs/pagefind/wasm.en.pagefind +0 -0
  188. package/dist/pages/docs/pagefind/wasm.unknown.pagefind +0 -0
  189. package/dist/pages/docs/reference/cli/index.html +86 -0
  190. package/dist/pages/docs/reference/interface-guide/index.html +86 -0
  191. package/dist/pages/docs/reference/release-notes/index.html +80 -0
  192. package/dist/pages/docs/reference/settings/index.html +86 -0
  193. package/dist/pages/docs/reference/terminology/index.html +94 -0
  194. package/dist/pages/docs/sitemap-0.xml +1 -0
  195. package/dist/pages/docs/sitemap-index.xml +1 -0
  196. package/dist/pages/docs/start-here/example-projects/index.html +88 -0
  197. package/dist/pages/docs/start-here/first-workspace/index.html +91 -0
  198. package/dist/pages/docs/start-here/installation-first-run/index.html +86 -0
  199. package/dist/pages/docs/start-here/what-is-lineage/index.html +96 -0
  200. package/dist/pages/docs/workflows/back-up-approved-assets/index.html +88 -0
  201. package/dist/pages/docs/workflows/content-batches/index.html +88 -0
  202. package/dist/pages/docs/workflows/continue-new-agent-session/index.html +89 -0
  203. package/dist/pages/docs/workflows/create-grow-lineage/index.html +89 -0
  204. package/dist/pages/docs/workflows/generate-import-variations/index.html +92 -0
  205. package/dist/pages/docs/workflows/restore-earlier-attempt/index.html +87 -0
  206. package/dist/pages/docs/workflows/review-approve-assets/index.html +87 -0
  207. package/dist/pages/index.html +42 -0
  208. package/dist/pages/landing/index.html +42 -0
  209. package/dist/pages/lineage-showcase-cover-16x9.png +0 -0
  210. package/dist/runtime-build.json +5 -5
  211. package/dist/server.js +73 -24
  212. package/dist/server.js.map +4 -4
  213. package/dist/web/assets/app-DdU93vp2.js +50 -0
  214. package/dist/web/assets/landing-MwOFmHoi.js +2 -0
  215. package/dist/web/assets/landing-wy4L-yBm.css +1 -0
  216. package/dist/web/index.html +3 -3
  217. package/dist/web/landing/index.html +26 -3
  218. package/dist/web/lineage-showcase-cover-16x9.png +0 -0
  219. package/package.json +11 -2
  220. package/dist/web/assets/landing-CPZnU7M8.js +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## Unreleased
4
+
5
+ ## 0.1.23
6
+
7
+ - Make missing Codex CLI failures explain how to restore `PATH`, verify `npx` and Codex prerequisites explicitly, and gate releases on compatibility with the independently published plugin installer.
8
+ - Add a reusable Lineage showcase cover and refine its presentation without browser text-selection artifacts.
9
+ - Show absolute local paths in asset details while preserving safe relative paths in persisted lineage data.
10
+ - Add the public documentation hub, freshness checks, CI routing, and GitHub Pages deployment workflow.
11
+ - Refresh vulnerable transitive dependencies for `brace-expansion`, `postcss`, and `nanoid`.
12
+
13
+ ## 0.1.22
14
+
15
+ - 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.
16
+ - Isolate bootstrap dependencies from stable and preview shims so repeat and coexisting channel installs cannot clobber their launchers.
17
+ - Package and scan the manual install runbook, and make the Node.js 22.22+ requirement explicit for the independently published Codex plugin installer.
18
+ - Stabilize the rich-demo browser readiness proof so delayed workspace discovery cannot race the media download check.
19
+ - Make plugin-installer dist-tag promotion verification tolerate npm registry propagation while still failing closed on the wrong version.
20
+
3
21
  ## 0.1.21
4
22
 
5
23
  - 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.
@@ -0,0 +1,341 @@
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 npx --version
76
+ run_lineage_dogfood codex --version
77
+ run_lineage_dogfood npm view @mean-weasel/lineage dist-tags version engines --json
78
+ ```
79
+
80
+ Install the same global bootstrap and isolated stable runtime documented in the
81
+ public first run:
82
+
83
+ ```bash
84
+ run_lineage_dogfood npm install --global @mean-weasel/lineage@latest
85
+ run_lineage_dogfood lineage-channel install stable \
86
+ --root "$DOGFOOD_RUNTIME_ROOT" \
87
+ --shim-dir "$DOGFOOD_RUNTIME_ROOT/bin" \
88
+ --json
89
+ run_lineage_dogfood lineage-stable runtime doctor --json
90
+ ```
91
+
92
+ Require `stable`, `package`, `verified: true`, and code/receipt paths beneath
93
+ `$DOGFOOD_RUNTIME_ROOT`. Stop if the launcher resolves into a checkout or any
94
+ normal user data root.
95
+
96
+ ## Initialize and gate the fresh profile
97
+
98
+ Fresh-profile bootstrap exception: profile doctor and `db info` cannot pass
99
+ before the profile exists. Runtime doctor is therefore the only pre-init
100
+ identity check. Initialize atomically, then immediately complete the full gate:
101
+
102
+ ```bash
103
+ run_lineage_dogfood lineage-stable profile init \
104
+ --profile "$DOGFOOD_PROFILE" \
105
+ --service-origin "$DOGFOOD_ORIGIN" \
106
+ --confirm-write \
107
+ --json
108
+
109
+ run_lineage_dogfood lineage-stable runtime doctor --json
110
+ run_lineage_dogfood lineage-stable profile doctor \
111
+ --profile "$DOGFOOD_PROFILE" \
112
+ --json
113
+ run_lineage_dogfood lineage-stable db info \
114
+ --profile "$DOGFOOD_PROFILE" \
115
+ --json
116
+ ```
117
+
118
+ Require the runtime fingerprint, profile ID/environment/fingerprint, database
119
+ identity, and service origin to agree. Database and media paths must remain
120
+ beneath `$DOGFOOD_PROFILE_ROOT`. Offline database information should report
121
+ `process.role: command` and no live service object.
122
+
123
+ Repeat `profile init` once as a negative check. It must refuse to overwrite the
124
+ existing profile and print reuse or profile doctor guidance.
125
+
126
+ ## Exercise foreground startup and the app
127
+
128
+ Start the exact public foreground command:
129
+
130
+ ```bash
131
+ run_lineage_dogfood lineage-stable start --profile "$DOGFOOD_PROFILE"
132
+ ```
133
+
134
+ Open `$DOGFOOD_ORIGIN` in a browser. Record:
135
+
136
+ 1. Runtime Settings show the exact stable package, profile, database, media
137
+ root, and service origin from the gate.
138
+ 2. **Load demo lineage** produces 10 nodes and 9 edges.
139
+ 3. **Load rich image demo** produces 14 nodes, 13 edges, and 14 PNG previews.
140
+ 4. No preview is broken and no stale empty-lineage message remains.
141
+ 5. Browser console errors and terminal warnings are copied verbatim.
142
+ 6. A screenshot contains only synthetic demo content and temporary paths.
143
+
144
+ Stop with Ctrl-C and confirm the port closes.
145
+
146
+ ## Exercise managed lifecycle and CLI handoff
147
+
148
+ ```bash
149
+ run_lineage_dogfood lineage-stable-service start \
150
+ --channel stable \
151
+ --profile "$DOGFOOD_PROFILE" \
152
+ --json
153
+ run_lineage_dogfood lineage-stable-service status \
154
+ --channel stable \
155
+ --profile "$DOGFOOD_PROFILE" \
156
+ --json
157
+ ```
158
+
159
+ Require the managed receipt and `/api/runtime` to agree on the service instance,
160
+ code fingerprint, profile/database fingerprints, and origin. Repeat `start` and
161
+ require the same healthy instance. Confirm both demo workspaces survived the
162
+ foreground restart.
163
+
164
+ Use the rich-demo root returned by the app:
165
+
166
+ ```bash
167
+ run_lineage_dogfood lineage-stable next \
168
+ --profile "$DOGFOOD_PROFILE" \
169
+ --project demo-project \
170
+ --root "<rich-root-id>" \
171
+ --json
172
+ run_lineage_dogfood lineage-stable brief \
173
+ --profile "$DOGFOOD_PROFILE" \
174
+ --project demo-project \
175
+ --root "<rich-root-id>" \
176
+ --json
177
+ ```
178
+
179
+ Generated handoff commands must retain `lineage-stable` and the selected
180
+ temporary profile.
181
+
182
+ ## Exercise the optional Codex plugin
183
+
184
+ Install and doctor only the temporary Codex home:
185
+
186
+ ```bash
187
+ run_lineage_dogfood npx --yes \
188
+ @mean-weasel/lineage-plugin-installer@latest \
189
+ install \
190
+ --channel latest \
191
+ --codex-home "$DOGFOOD_CODEX_HOME" \
192
+ --json
193
+ run_lineage_dogfood npx --yes \
194
+ @mean-weasel/lineage-plugin-installer@latest \
195
+ doctor \
196
+ --channel latest \
197
+ --codex-home "$DOGFOOD_CODEX_HOME" \
198
+ --json
199
+ run_lineage_dogfood codex plugin list --json
200
+ ```
201
+
202
+ Require `lineage-codex-plugin@lineage` at the exact installed Lineage version,
203
+ installed and enabled. Repeat installation once to prove safe reinstall, then
204
+ remove only the temporary registration:
205
+
206
+ ```bash
207
+ run_lineage_dogfood codex plugin remove \
208
+ lineage-codex-plugin@lineage \
209
+ --json
210
+ run_lineage_dogfood codex plugin marketplace remove lineage --json
211
+ ```
212
+
213
+ Do not restart a normal Codex desktop session against this temporary home.
214
+
215
+ ## Stop, recheck, and clean up
216
+
217
+ ```bash
218
+ run_lineage_dogfood lineage-stable-service stop \
219
+ --channel stable \
220
+ --profile "$DOGFOOD_PROFILE" \
221
+ --json
222
+ run_lineage_dogfood lineage-stable profile doctor \
223
+ --profile "$DOGFOOD_PROFILE" \
224
+ --json
225
+ run_lineage_dogfood lineage-stable db info \
226
+ --profile "$DOGFOOD_PROFILE" \
227
+ --json
228
+ ```
229
+
230
+ The origin must be unreachable after stop, while the offline profile and
231
+ database checks still pass. Preserve the root for inspection on any failure.
232
+ After a clean pass and sanitized report, remove only the validated target:
233
+
234
+ ```bash
235
+ case "$DOGFOOD_ROOT" in
236
+ /tmp/lineage-manual-dogfood.*)
237
+ rm -rf -- "$DOGFOOD_ROOT"
238
+ ;;
239
+ *)
240
+ echo "Refusing unexpected cleanup target: $DOGFOOD_ROOT"
241
+ exit 1
242
+ ;;
243
+ esac
244
+ ```
245
+
246
+ ## Separate source-development journey
247
+
248
+ Create a second temporary root with a different profile, service origin, npm
249
+ cache, and Codex home. Do not reuse the stable profile or database:
250
+
251
+ ```bash
252
+ DEV_DOGFOOD_ROOT="$(mktemp -d /tmp/lineage-manual-dev-dogfood.XXXXXX)"
253
+ chmod 700 "$DEV_DOGFOOD_ROOT"
254
+
255
+ DEV_DOGFOOD_HOME="$DEV_DOGFOOD_ROOT/home"
256
+ DEV_DOGFOOD_NPM_CACHE="$DEV_DOGFOOD_ROOT/npm-cache"
257
+ DEV_DOGFOOD_RUNTIME_ROOT="$DEV_DOGFOOD_ROOT/runtimes"
258
+ DEV_DOGFOOD_PROFILE_ROOT="$DEV_DOGFOOD_ROOT/profiles"
259
+ DEV_DOGFOOD_SERVICE_ROOT="$DEV_DOGFOOD_ROOT/services"
260
+ DEV_DOGFOOD_CODEX_HOME="$DEV_DOGFOOD_ROOT/codex-home"
261
+ DEV_DOGFOOD_BASE_PATH="$PATH"
262
+ DEV_DOGFOOD_PROFILE="manual-development"
263
+ DEV_DOGFOOD_PORT="5298"
264
+ DEV_DOGFOOD_ORIGIN="http://127.0.0.1:$DEV_DOGFOOD_PORT"
265
+
266
+ mkdir -p \
267
+ "$DEV_DOGFOOD_HOME" \
268
+ "$DEV_DOGFOOD_NPM_CACHE" \
269
+ "$DEV_DOGFOOD_RUNTIME_ROOT" \
270
+ "$DEV_DOGFOOD_PROFILE_ROOT" \
271
+ "$DEV_DOGFOOD_SERVICE_ROOT" \
272
+ "$DEV_DOGFOOD_CODEX_HOME"
273
+
274
+ run_lineage_dev_dogfood() {
275
+ env \
276
+ HOME="$DEV_DOGFOOD_HOME" \
277
+ CODEX_HOME="$DEV_DOGFOOD_CODEX_HOME" \
278
+ LINEAGE_RUNTIME_ROOT="$DEV_DOGFOOD_RUNTIME_ROOT" \
279
+ LINEAGE_PROFILE_ROOT="$DEV_DOGFOOD_PROFILE_ROOT" \
280
+ LINEAGE_SERVICE_ROOT="$DEV_DOGFOOD_SERVICE_ROOT" \
281
+ npm_config_cache="$DEV_DOGFOOD_NPM_CACHE" \
282
+ PATH="$DEV_DOGFOOD_HOME/.local/bin:$DEV_DOGFOOD_BASE_PATH" \
283
+ "$@"
284
+ }
285
+ ```
286
+
287
+ Confirm that `$DEV_DOGFOOD_PORT` is unused, choosing a different port if
288
+ necessary. Then perform every source command through the wrapper:
289
+
290
+ ```bash
291
+ run_lineage_dev_dogfood git clone \
292
+ https://github.com/mean-weasel/lineage.git \
293
+ "$DEV_DOGFOOD_ROOT/lineage"
294
+ cd "$DEV_DOGFOOD_ROOT/lineage"
295
+ run_lineage_dev_dogfood npm ci
296
+ run_lineage_dev_dogfood npm run lineage:dev -- runtime doctor --json
297
+ run_lineage_dev_dogfood npm run lineage:dev -- profile init \
298
+ --profile "$DEV_DOGFOOD_PROFILE" \
299
+ --service-origin "$DEV_DOGFOOD_ORIGIN" \
300
+ --confirm-write \
301
+ --json
302
+ run_lineage_dev_dogfood npm run lineage:dev -- runtime doctor --json
303
+ run_lineage_dev_dogfood npm run lineage:dev -- profile doctor \
304
+ --profile "$DEV_DOGFOOD_PROFILE" \
305
+ --json
306
+ run_lineage_dev_dogfood npm run lineage:dev -- db info \
307
+ --profile "$DEV_DOGFOOD_PROFILE" \
308
+ --json
309
+ run_lineage_dev_dogfood npm run dev -- --profile "$DEV_DOGFOOD_PROFILE"
310
+ ```
311
+
312
+ Repeat the synthetic demo, restart, Settings, and CLI checks. Then stop the
313
+ foreground process and prove the bundled managed-development path:
314
+
315
+ ```bash
316
+ run_lineage_dev_dogfood make install-dev
317
+ run_lineage_dev_dogfood npm run lineage:dev -- runtime doctor --json
318
+ run_lineage_dev_dogfood make start-dev-bg \
319
+ LINEAGE_DEV_PROFILE="$DEV_DOGFOOD_PROFILE"
320
+ run_lineage_dev_dogfood make status-dev \
321
+ LINEAGE_DEV_PROFILE="$DEV_DOGFOOD_PROFILE"
322
+ run_lineage_dev_dogfood make stop-dev \
323
+ LINEAGE_DEV_PROFILE="$DEV_DOGFOOD_PROFILE"
324
+ ```
325
+
326
+ The final evidence must identify `dev`, `checkout`, and the fresh clone's
327
+ canonical root and fingerprint. It must not match or open the stable database.
328
+ Preserve the temporary root on failure. After a clean pass, remove only the
329
+ guarded development target:
330
+
331
+ ```bash
332
+ case "$DEV_DOGFOOD_ROOT" in
333
+ /tmp/lineage-manual-dev-dogfood.*)
334
+ rm -rf -- "$DEV_DOGFOOD_ROOT"
335
+ ;;
336
+ *)
337
+ echo "Refusing unexpected cleanup target: $DEV_DOGFOOD_ROOT"
338
+ exit 1
339
+ ;;
340
+ esac
341
+ ```
package/README.md CHANGED
@@ -59,14 +59,22 @@ Before installing anything, verify the tools used by the path you choose:
59
59
  ```bash
60
60
  node --version
61
61
  npm --version
62
+ npx --version
62
63
  make --version
63
64
  ```
64
65
 
65
- Lineage requires Node.js 22.22.0 or newer and npm. Make is required only for
66
- the documented `make` shortcuts. A real Codex installation is optional for the
67
- app, but required to install and activate the Codex plugin; verify that
68
- additional prerequisite with `codex --version` before following the plugin
69
- step.
66
+ Lineage requires Node.js 22.22.0 or newer and npm, including the accompanying
67
+ `npx` command used by the plugin installer. Make is required only for the
68
+ documented `make` shortcuts. A real Codex installation is optional for the app,
69
+ but required to install and activate the Codex plugin; verify that additional
70
+ prerequisite with `codex --version` in the same shell before following the
71
+ plugin step. If either command is missing, restore its executable directory on
72
+ `PATH` before installing.
73
+
74
+ On the minimum supported Node 22 line, foreground startup can print one
75
+ `ExperimentalWarning` for Node's built-in SQLite module before the healthy
76
+ `Lineage listening` line. Lineage keeps that category-specific warning visible;
77
+ it does not indicate an identity or database failure.
70
78
 
71
79
  ### Develop from a fresh clone
72
80
 
@@ -76,8 +84,12 @@ development data:
76
84
  ```bash
77
85
  git clone https://github.com/mean-weasel/lineage.git
78
86
  cd lineage
79
- npm ci
80
- npm run lineage:dev -- profile init --profile team-development --confirm-write --json
87
+ npm ci &&
88
+ npm run lineage:dev -- runtime doctor --json &&
89
+ npm run lineage:dev -- profile init --profile team-development --confirm-write --json &&
90
+ npm run lineage:dev -- runtime doctor --json &&
91
+ npm run lineage:dev -- profile doctor --profile team-development --json &&
92
+ npm run lineage:dev -- db info --profile team-development --json &&
81
93
  npm run dev -- --profile team-development
82
94
  ```
83
95
 
@@ -94,19 +106,25 @@ Use the currently published npm dist-tags when you want installed rather than
94
106
  checkout code:
95
107
 
96
108
  ```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
109
+ npm install -g @mean-weasel/lineage@latest &&
110
+ lineage-channel install stable &&
111
+ lineage-stable runtime doctor --json &&
112
+ lineage-stable profile init --profile team-production --confirm-write --json &&
113
+ lineage-stable runtime doctor --json &&
114
+ lineage-stable profile doctor --profile team-production --json &&
115
+ lineage-stable db info --profile team-production --json &&
101
116
  lineage-stable start --profile team-production
102
117
  ```
103
118
 
104
119
  Preview is independent and must use its own runtime root and profile:
105
120
 
106
121
  ```bash
107
- lineage-channel install preview
108
- lineage-preview runtime doctor --json
109
- lineage-preview profile init --profile team-preview --confirm-write --json
122
+ lineage-channel install preview &&
123
+ lineage-preview runtime doctor --json &&
124
+ lineage-preview profile init --profile team-preview --confirm-write --json &&
125
+ lineage-preview runtime doctor --json &&
126
+ lineage-preview profile doctor --profile team-preview --json &&
127
+ lineage-preview db info --profile team-preview --json &&
110
128
  lineage-preview start --profile team-preview
111
129
  ```
112
130
 
@@ -128,6 +146,10 @@ If doctor fails, it prints a version-pinned remediation command for that same
128
146
  Codex home. For verification, use a temporary `--codex-home`; do not test an
129
147
  installer against your real Codex profile.
130
148
 
149
+ Maintainers can exercise the complete published and source journeys without
150
+ touching an existing Lineage or Codex installation by following the
151
+ [hermetic manual install dogfood runbook](MANUAL_INSTALL_DOGFOOD.md).
152
+
131
153
  ## Package Channels
132
154
 
133
155
  Lineage is packaged as `@mean-weasel/lineage`, but stable and preview must not
@@ -175,6 +197,12 @@ lineage-preview profile init --profile team-preview --confirm-write --json
175
197
  npm run lineage:dev -- profile init --profile team-development --confirm-write --json
176
198
  ```
177
199
 
200
+ Fresh-profile bootstrap exception: because profile doctor and `db info` cannot
201
+ pass before a profile and database exist, run runtime doctor first, perform the
202
+ atomic `profile init`, and then immediately run runtime doctor, profile doctor,
203
+ and `db info --profile <profile> --json`. Do not start a service or perform
204
+ another write until that post-init gate passes.
205
+
178
206
  `profile init` derives the environment and exact verified code pin from the
179
207
  launcher, creates owner-only media and SQLite paths, binds the new database
180
208
  identity, and publishes the profile manifest only after those steps succeed.
@@ -614,6 +642,10 @@ and then cleans up.
614
642
 
615
643
  The root `Makefile` provides memorable wrappers for common setup, startup, and
616
644
  verification commands. Run `make` or `make help` to list the available targets.
645
+ `make install-prod` and `make install-preview` bootstrap the published
646
+ `@mean-weasel/lineage@latest` package under the isolated runtime root before
647
+ creating the channel runtime and its launchers, so they work from a fresh clone
648
+ without checkout build artifacts or overwriting an existing channel launcher.
617
649
 
618
650
  ```bash
619
651
  make install-prod
@@ -4,7 +4,7 @@
4
4
  import { existsSync as existsSync11, mkdirSync as mkdirSync6, readFileSync as readFileSync6, writeFileSync as writeFileSync4 } from "node:fs";
5
5
  import { randomUUID as randomUUID4 } from "node:crypto";
6
6
  import { homedir as homedir2, platform as platform2 } from "node:os";
7
- import { dirname as dirname6, join as join10, resolve as resolve8 } from "node:path";
7
+ import { dirname as dirname6, join as join10, resolve as resolve9 } from "node:path";
8
8
  import { spawn } from "node:child_process";
9
9
  import { fileURLToPath as fileURLToPath3 } from "node:url";
10
10
 
@@ -2810,7 +2810,7 @@ function validateAgentClaimForWrite(fields) {
2810
2810
  }
2811
2811
 
2812
2812
  // src/server/assetLineage.ts
2813
- import { join as join7 } from "node:path";
2813
+ import { isAbsolute as isAbsolute2, join as join7, resolve as resolve5 } from "node:path";
2814
2814
 
2815
2815
  // src/server/assetLineageSelection.ts
2816
2816
  function selectedRows(database, project, root) {
@@ -3515,6 +3515,11 @@ function collectAssets(project, source) {
3515
3515
  }
3516
3516
  return assets;
3517
3517
  }
3518
+ function absoluteLocalPath(localPath) {
3519
+ if (!localPath) return void 0;
3520
+ if (isAbsolute2(localPath)) return localPath;
3521
+ return resolve5(repoRoot, ".asset-scratch", localPath);
3522
+ }
3518
3523
  function upsertProject(database, project) {
3519
3524
  const timestamp = nowIso();
3520
3525
  database.prepare(`
@@ -3929,6 +3934,7 @@ function getLineageSnapshot(project, assetId) {
3929
3934
  const lineageTasks = lineageTasksByNode.get(row.asset_id);
3930
3935
  return {
3931
3936
  ...node,
3937
+ absolute_path: absoluteLocalPath(row.local_path),
3932
3938
  attempt_count: attempts.length,
3933
3939
  current_attempt: currentAttempt,
3934
3940
  is_latest: !childIds.has(row.asset_id),
@@ -4361,7 +4367,7 @@ function linkSelectedLineageChild(project, fields) {
4361
4367
 
4362
4368
  // src/server/generationReceipts.ts
4363
4369
  import { existsSync as existsSync8, realpathSync as realpathSync2, statSync as statSync4 } from "node:fs";
4364
- import { relative as relative3, resolve as resolve5 } from "node:path";
4370
+ import { relative as relative3, resolve as resolve6 } from "node:path";
4365
4371
  import { randomUUID as randomUUID3 } from "node:crypto";
4366
4372
 
4367
4373
  // src/shared/generationOutputManifest.ts
@@ -4896,8 +4902,8 @@ function isPathInside(child, parent) {
4896
4902
  return Boolean(rel) && !rel.startsWith("..") && !rel.startsWith("/");
4897
4903
  }
4898
4904
  function scratchCandidate(file) {
4899
- const scratchRoot = resolve5(repoRoot, ".asset-scratch");
4900
- const candidate = file.startsWith(".asset-scratch/") || resolve5(file).startsWith(scratchRoot) ? resolve5(repoRoot, file) : resolve5(scratchRoot, file);
4905
+ const scratchRoot = resolve6(repoRoot, ".asset-scratch");
4906
+ const candidate = file.startsWith(".asset-scratch/") || resolve6(file).startsWith(scratchRoot) ? resolve6(repoRoot, file) : resolve6(scratchRoot, file);
4901
4907
  if (!isPathInside(candidate, scratchRoot)) throw new GenerationReceiptError(`Import file must be under .asset-scratch: ${file}`);
4902
4908
  return { candidate, scratchRoot };
4903
4909
  }
@@ -5152,7 +5158,7 @@ function importImageRerollOutput(project = defaultProject, fields) {
5152
5158
  // src/server/lineageSelectionPacket.ts
5153
5159
  import { createHash as createHash5 } from "node:crypto";
5154
5160
  import { existsSync as existsSync9, statSync as statSync5 } from "node:fs";
5155
- import { isAbsolute as isAbsolute2, resolve as resolve6 } from "node:path";
5161
+ import { isAbsolute as isAbsolute3, resolve as resolve7 } from "node:path";
5156
5162
  var LineageSelectionPacketError = class extends Error {
5157
5163
  constructor(message, warnings = [], errors = [], diagnostics = []) {
5158
5164
  super(message);
@@ -5198,10 +5204,10 @@ function resolveWorkspace(project, options) {
5198
5204
  }
5199
5205
  function resolveLocalReference(reference) {
5200
5206
  if (!reference) return void 0;
5201
- if (isAbsolute2(reference)) return reference;
5202
- const repoRelative = resolve6(repoRoot, reference);
5207
+ if (isAbsolute3(reference)) return reference;
5208
+ const repoRelative = resolve7(repoRoot, reference);
5203
5209
  if (existsSync9(repoRelative)) return repoRelative;
5204
- return resolve6(repoRoot, ".asset-scratch", reference);
5210
+ return resolve7(repoRoot, ".asset-scratch", reference);
5205
5211
  }
5206
5212
  function fileSize(path) {
5207
5213
  if (!path || !existsSync9(path)) return void 0;
@@ -5656,7 +5662,7 @@ function getLineageSelectionPacket(project, options = {}) {
5656
5662
  import { createHash as createHash6 } from "node:crypto";
5657
5663
  import { spawnSync as spawnSync2 } from "node:child_process";
5658
5664
  import { existsSync as existsSync10, lstatSync as lstatSync3, readFileSync as readFileSync5, readdirSync as readdirSync3, readlinkSync, realpathSync as realpathSync3, statSync as statSync6 } from "node:fs";
5659
- import { dirname as dirname5, isAbsolute as isAbsolute3, join as join9, resolve as resolve7 } from "node:path";
5665
+ import { dirname as dirname5, isAbsolute as isAbsolute4, join as join9, resolve as resolve8 } from "node:path";
5660
5666
  import { fileURLToPath as fileURLToPath2 } from "node:url";
5661
5667
 
5662
5668
  // src/shared/runtimeInfoTypes.ts
@@ -5675,7 +5681,7 @@ function isLineagePackageRoot(root) {
5675
5681
  }
5676
5682
  function executingCodeRoot() {
5677
5683
  const moduleDirectory = dirname5(fileURLToPath2(import.meta.url));
5678
- const candidates = [resolve7(moduleDirectory, "../.."), resolve7(moduleDirectory, "..")];
5684
+ const candidates = [resolve8(moduleDirectory, "../.."), resolve8(moduleDirectory, "..")];
5679
5685
  const root = candidates.find(isLineagePackageRoot);
5680
5686
  if (!root) throw new Error(`Unable to derive Lineage code root from executing module ${fileURLToPath2(import.meta.url)}`);
5681
5687
  return canonicalRoot(root);
@@ -5688,7 +5694,7 @@ function canonicalRoot(root) {
5688
5694
  try {
5689
5695
  return realpathSync3(root);
5690
5696
  } catch {
5691
- return resolve7(root);
5697
+ return resolve8(root);
5692
5698
  }
5693
5699
  }
5694
5700
  function packageInfo(root = codeRoot) {
@@ -5788,7 +5794,7 @@ function readInstallReceipt(path, errors) {
5788
5794
  return void 0;
5789
5795
  }
5790
5796
  let receipt;
5791
- const receiptPath = resolve7(path);
5797
+ const receiptPath = resolve8(path);
5792
5798
  try {
5793
5799
  receipt = JSON.parse(readFileSync5(receiptPath, "utf8"));
5794
5800
  } catch (error) {
@@ -5796,7 +5802,7 @@ function readInstallReceipt(path, errors) {
5796
5802
  return void 0;
5797
5803
  }
5798
5804
  if (receipt.schema_version !== lineageRuntimeInstallSchemaVersion) errors.push(`Unsupported runtime install receipt schema: ${String(receipt.schema_version)}`);
5799
- if (!isAbsolute3(receipt.package_root || "")) errors.push("Runtime install receipt package_root must be absolute");
5805
+ if (!isAbsolute4(receipt.package_root || "")) errors.push("Runtime install receipt package_root must be absolute");
5800
5806
  if (!receipt.package_integrity?.startsWith("sha512-")) errors.push("Runtime install receipt package integrity is invalid");
5801
5807
  if (receipt.package_source !== "registry" && receipt.package_source !== "local") errors.push("Runtime install receipt package source is invalid");
5802
5808
  if (typeof receipt.package_spec !== "string" || !receipt.package_spec) errors.push("Runtime install receipt package spec is invalid");
@@ -6074,7 +6080,7 @@ var signalExitCodes = {
6074
6080
  SIGTERM: 143
6075
6081
  };
6076
6082
  function packageRoot2() {
6077
- return resolve8(dirname6(fileURLToPath3(import.meta.url)), "..", "..");
6083
+ return resolve9(dirname6(fileURLToPath3(import.meta.url)), "..", "..");
6078
6084
  }
6079
6085
  function packageVersion() {
6080
6086
  try {
@@ -6113,7 +6119,7 @@ function readOptions(args, name) {
6113
6119
  }
6114
6120
  function readJsonFile(path, label) {
6115
6121
  try {
6116
- return JSON.parse(readFileSync6(resolve8(path), "utf8"));
6122
+ return JSON.parse(readFileSync6(resolve9(path), "utf8"));
6117
6123
  } catch (error) {
6118
6124
  throw new Error(`${label} must be a readable JSON file: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
6119
6125
  }
@@ -6157,7 +6163,7 @@ function resolveStartOptions(config, args) {
6157
6163
  };
6158
6164
  }
6159
6165
  function resolveCliAssetRoot(args) {
6160
- return resolve8(readOption(args, "--asset-root") || process.env.LINEAGE_ASSET_ROOT || packageRoot);
6166
+ return resolve9(readOption(args, "--asset-root") || process.env.LINEAGE_ASSET_ROOT || packageRoot);
6161
6167
  }
6162
6168
  function configureCliAssetRoot(args) {
6163
6169
  const assetRoot = resolveCliAssetRoot(args);
@@ -6189,10 +6195,10 @@ function prepareCliProfile(config, args) {
6189
6195
  if (hasOption(args, "--db")) throw new Error("A named profile cannot be combined with --db");
6190
6196
  if (hasOption(args, "--asset-root")) throw new Error("A named profile cannot be combined with --asset-root");
6191
6197
  const profile = resolveLineageProfile(selector);
6192
- if (process.env.LINEAGE_DB && resolve8(process.env.LINEAGE_DB) !== profile.database_path) {
6198
+ if (process.env.LINEAGE_DB && resolve9(process.env.LINEAGE_DB) !== profile.database_path) {
6193
6199
  throw new Error(`Profile ${profile.profile_id} database_path conflicts with LINEAGE_DB`);
6194
6200
  }
6195
- if (process.env.LINEAGE_ASSET_ROOT && resolve8(process.env.LINEAGE_ASSET_ROOT) !== profile.asset_root) {
6201
+ if (process.env.LINEAGE_ASSET_ROOT && resolve9(process.env.LINEAGE_ASSET_ROOT) !== profile.asset_root) {
6196
6202
  throw new Error(`Profile ${profile.profile_id} asset_root conflicts with LINEAGE_ASSET_ROOT`);
6197
6203
  }
6198
6204
  assertProfileChannel(profile, config.channel);
@@ -6293,7 +6299,7 @@ function lineageServiceIdentityErrors(runtime, expected) {
6293
6299
  if (runtime.channel !== expected.channel) errors.push(`channel ${runtime.channel} != ${expected.channel}`);
6294
6300
  if (!runtime.code?.verified) errors.push("service code identity is not verified");
6295
6301
  if (runtime.code?.fingerprint !== expected.code_fingerprint) errors.push(`code fingerprint ${runtime.code?.fingerprint || "missing"} != ${expected.code_fingerprint}`);
6296
- if (resolve8(runtime.database.path) !== resolve8(expected.database_path)) errors.push(`database ${runtime.database.path} != ${expected.database_path}`);
6302
+ if (resolve9(runtime.database.path) !== resolve9(expected.database_path)) errors.push(`database ${runtime.database.path} != ${expected.database_path}`);
6297
6303
  if (runtime.service?.instance_id !== expected.instance_id) errors.push(`service instance ${runtime.service?.instance_id || "missing"} != ${expected.instance_id}`);
6298
6304
  if (runtime.service?.launcher_pid !== expected.launcher_pid) errors.push(`launcher pid ${runtime.service?.launcher_pid || "missing"} != ${expected.launcher_pid}`);
6299
6305
  if (expected.profile) {
@@ -6388,7 +6394,7 @@ function runLineageDataCommand(command, args) {
6388
6394
  });
6389
6395
  const out = readOption(args, "--out");
6390
6396
  if (out) {
6391
- const outPath = resolve8(out);
6397
+ const outPath = resolve9(out);
6392
6398
  mkdirSync6(dirname6(outPath), { recursive: true });
6393
6399
  writeFileSync4(outPath, `${JSON.stringify(packet, null, 2)}
6394
6400
  `);