@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.
- package/CHANGELOG.md +18 -0
- package/MANUAL_INSTALL_DOGFOOD.md +341 -0
- package/README.md +46 -14
- package/dist/cli/lineage-dev.js +27 -21
- package/dist/cli/lineage-dev.js.map +3 -3
- package/dist/cli/lineage-preview.js +27 -21
- package/dist/cli/lineage-preview.js.map +3 -3
- package/dist/cli/lineage.js +27 -21
- package/dist/cli/lineage.js.map +3 -3
- package/dist/docs-site/404.html +41 -0
- package/dist/docs-site/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js +1 -0
- package/dist/docs-site/_astro/Search.astro_astro_type_script_index_0_lang.x2pVooPA.js +1 -0
- package/dist/docs-site/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js +1 -0
- package/dist/docs-site/_astro/common.DarLW4Vf.css +3 -0
- package/dist/docs-site/_astro/ec.0vx5m.js +3 -0
- package/dist/docs-site/_astro/ec.w36nc.css +1 -0
- package/dist/docs-site/_astro/page.LAbJoB63.js +1 -0
- package/dist/docs-site/_astro/print.ehPL0gv-.css +1 -0
- package/dist/docs-site/_astro/starlight-toc.CTCQXEge.js +1 -0
- package/dist/docs-site/_astro/ui-core.DWIqd25E.js +2 -0
- package/dist/docs-site/concepts/agent-claims-handoffs/index.html +99 -0
- package/dist/docs-site/concepts/attempts-current-version/index.html +86 -0
- package/dist/docs-site/concepts/branches-vs-rerolls/index.html +114 -0
- package/dist/docs-site/concepts/projects-workspaces-assets/index.html +89 -0
- package/dist/docs-site/concepts/selections-next-variations/index.html +86 -0
- package/dist/docs-site/index.html +92 -0
- package/dist/docs-site/integrations/cloud-storage/index.html +92 -0
- package/dist/docs-site/integrations/image-generation/index.html +93 -0
- package/dist/docs-site/integrations/index.html +112 -0
- package/dist/docs-site/integrations/social-scheduling/index.html +89 -0
- package/dist/docs-site/operations/backup-recovery/index.html +87 -0
- package/dist/docs-site/operations/channels/index.html +88 -0
- package/dist/docs-site/operations/local-first-data/index.html +90 -0
- package/dist/docs-site/operations/profiles-database-identity/index.html +90 -0
- package/dist/docs-site/operations/troubleshooting/index.html +89 -0
- package/dist/docs-site/pagefind/fragment/en_1126abb.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_19b3f6c.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_31aa611.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_38817cc.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_4184ad1.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_41db543.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_469f895.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_4db923b.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_56e45b6.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_56fe7ca.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_581a7cb.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_5be5e44.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_603c2be.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_66b3118.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_6a19c31.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_74e9307.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_7c9d5a2.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_818744b.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_8269752.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_88b38c1.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_8c1c735.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_98d9b16.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_a3d636e.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_b15ecf0.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_bcc29c5.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_bfb13e9.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_d0fca9e.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_d49ed00.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_e0786b9.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_e298dee.pf_fragment +0 -0
- package/dist/docs-site/pagefind/fragment/en_f6179a8.pf_fragment +0 -0
- package/dist/docs-site/pagefind/index/en_f279b04.pf_index +0 -0
- package/dist/docs-site/pagefind/pagefind-component-ui.css +1509 -0
- package/dist/docs-site/pagefind/pagefind-component-ui.js +56 -0
- package/dist/docs-site/pagefind/pagefind-entry.json +1 -0
- package/dist/docs-site/pagefind/pagefind-highlight.js +1070 -0
- package/dist/docs-site/pagefind/pagefind-modular-ui.css +214 -0
- package/dist/docs-site/pagefind/pagefind-modular-ui.js +8 -0
- package/dist/docs-site/pagefind/pagefind-ui.css +1 -0
- package/dist/docs-site/pagefind/pagefind-ui.js +2 -0
- package/dist/docs-site/pagefind/pagefind-worker.js +6 -0
- package/dist/docs-site/pagefind/pagefind.en_74951c3ca7.pf_meta +0 -0
- package/dist/docs-site/pagefind/pagefind.js +6 -0
- package/dist/docs-site/pagefind/wasm.en.pagefind +0 -0
- package/dist/docs-site/pagefind/wasm.unknown.pagefind +0 -0
- package/dist/docs-site/reference/cli/index.html +86 -0
- package/dist/docs-site/reference/interface-guide/index.html +86 -0
- package/dist/docs-site/reference/release-notes/index.html +80 -0
- package/dist/docs-site/reference/settings/index.html +86 -0
- package/dist/docs-site/reference/terminology/index.html +94 -0
- package/dist/docs-site/sitemap-0.xml +1 -0
- package/dist/docs-site/sitemap-index.xml +1 -0
- package/dist/docs-site/start-here/example-projects/index.html +88 -0
- package/dist/docs-site/start-here/first-workspace/index.html +91 -0
- package/dist/docs-site/start-here/installation-first-run/index.html +86 -0
- package/dist/docs-site/start-here/what-is-lineage/index.html +96 -0
- package/dist/docs-site/workflows/back-up-approved-assets/index.html +88 -0
- package/dist/docs-site/workflows/content-batches/index.html +88 -0
- package/dist/docs-site/workflows/continue-new-agent-session/index.html +89 -0
- package/dist/docs-site/workflows/create-grow-lineage/index.html +89 -0
- package/dist/docs-site/workflows/generate-import-variations/index.html +92 -0
- package/dist/docs-site/workflows/restore-earlier-attempt/index.html +87 -0
- package/dist/docs-site/workflows/review-approve-assets/index.html +87 -0
- package/dist/pages/.nojekyll +0 -0
- package/dist/pages/assets/agent-shared-state-DOfpTLiw.webp +0 -0
- package/dist/pages/assets/agent-to-canvas-DtIu_cPq.mp4 +0 -0
- package/dist/pages/assets/app-B-fAyNsU.css +1 -0
- package/dist/{web/assets/app-DX744BME.js → pages/assets/app-DdU93vp2.js} +36 -2
- package/dist/pages/assets/attempt-history-D6wdic6n.webp +0 -0
- package/dist/pages/assets/branching-tree-B8I5_S6D.png +0 -0
- package/dist/pages/assets/canvas-cli-DHBacq7r.png +0 -0
- package/dist/pages/assets/hero-agent-sync-D8ibW83E.mp4 +0 -0
- package/dist/pages/assets/hero-agent-sync-poster-zBB3KpbO.png +0 -0
- package/dist/pages/assets/hero-board-DG3ED4AW.webp +0 -0
- package/dist/pages/assets/hero-lineage-growth-Bsl9tiq-.mp4 +0 -0
- package/dist/pages/assets/hero-trace-connections-Bb52ABBc.mp4 +0 -0
- package/dist/pages/assets/human-selection-BdDBDE-I.webp +0 -0
- package/dist/pages/assets/human-to-agent-D1z92ZO9.mp4 +0 -0
- package/dist/pages/assets/jsx-runtime-DAFSxiwi.js +8 -0
- package/dist/pages/assets/landing-MwOFmHoi.js +2 -0
- package/dist/{web/assets/landing-Dmkx4R_N.css → pages/assets/landing-wy4L-yBm.css} +1 -1
- package/dist/pages/assets/reroll-history-DQcEH42R.mp4 +0 -0
- package/dist/pages/docs/404.html +41 -0
- package/dist/pages/docs/_astro/MobileTableOfContents.astro_astro_type_script_index_0_lang.BcSo_yiZ.js +1 -0
- package/dist/pages/docs/_astro/Search.astro_astro_type_script_index_0_lang.x2pVooPA.js +1 -0
- package/dist/pages/docs/_astro/TableOfContents.astro_astro_type_script_index_0_lang.Csloo1VZ.js +1 -0
- package/dist/pages/docs/_astro/common.DarLW4Vf.css +3 -0
- package/dist/pages/docs/_astro/ec.0vx5m.js +3 -0
- package/dist/pages/docs/_astro/ec.w36nc.css +1 -0
- package/dist/pages/docs/_astro/page.LAbJoB63.js +1 -0
- package/dist/pages/docs/_astro/print.ehPL0gv-.css +1 -0
- package/dist/pages/docs/_astro/starlight-toc.CTCQXEge.js +1 -0
- package/dist/pages/docs/_astro/ui-core.DWIqd25E.js +2 -0
- package/dist/pages/docs/concepts/agent-claims-handoffs/index.html +99 -0
- package/dist/pages/docs/concepts/attempts-current-version/index.html +86 -0
- package/dist/pages/docs/concepts/branches-vs-rerolls/index.html +114 -0
- package/dist/pages/docs/concepts/projects-workspaces-assets/index.html +89 -0
- package/dist/pages/docs/concepts/selections-next-variations/index.html +86 -0
- package/dist/pages/docs/index.html +92 -0
- package/dist/pages/docs/integrations/cloud-storage/index.html +92 -0
- package/dist/pages/docs/integrations/image-generation/index.html +93 -0
- package/dist/pages/docs/integrations/index.html +112 -0
- package/dist/pages/docs/integrations/social-scheduling/index.html +89 -0
- package/dist/pages/docs/operations/backup-recovery/index.html +87 -0
- package/dist/pages/docs/operations/channels/index.html +88 -0
- package/dist/pages/docs/operations/local-first-data/index.html +90 -0
- package/dist/pages/docs/operations/profiles-database-identity/index.html +90 -0
- package/dist/pages/docs/operations/troubleshooting/index.html +89 -0
- package/dist/pages/docs/pagefind/fragment/en_1126abb.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_19b3f6c.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_31aa611.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_38817cc.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_4184ad1.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_41db543.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_469f895.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_4db923b.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_56e45b6.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_56fe7ca.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_581a7cb.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_5be5e44.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_603c2be.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_66b3118.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_6a19c31.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_74e9307.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_7c9d5a2.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_818744b.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_8269752.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_88b38c1.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_8c1c735.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_98d9b16.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_a3d636e.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_b15ecf0.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_bcc29c5.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_bfb13e9.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_d0fca9e.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_d49ed00.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_e0786b9.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_e298dee.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/fragment/en_f6179a8.pf_fragment +0 -0
- package/dist/pages/docs/pagefind/index/en_f279b04.pf_index +0 -0
- package/dist/pages/docs/pagefind/pagefind-component-ui.css +1509 -0
- package/dist/pages/docs/pagefind/pagefind-component-ui.js +56 -0
- package/dist/pages/docs/pagefind/pagefind-entry.json +1 -0
- package/dist/pages/docs/pagefind/pagefind-highlight.js +1070 -0
- package/dist/pages/docs/pagefind/pagefind-modular-ui.css +214 -0
- package/dist/pages/docs/pagefind/pagefind-modular-ui.js +8 -0
- package/dist/pages/docs/pagefind/pagefind-ui.css +1 -0
- package/dist/pages/docs/pagefind/pagefind-ui.js +2 -0
- package/dist/pages/docs/pagefind/pagefind-worker.js +6 -0
- package/dist/pages/docs/pagefind/pagefind.en_74951c3ca7.pf_meta +0 -0
- package/dist/pages/docs/pagefind/pagefind.js +6 -0
- package/dist/pages/docs/pagefind/wasm.en.pagefind +0 -0
- package/dist/pages/docs/pagefind/wasm.unknown.pagefind +0 -0
- package/dist/pages/docs/reference/cli/index.html +86 -0
- package/dist/pages/docs/reference/interface-guide/index.html +86 -0
- package/dist/pages/docs/reference/release-notes/index.html +80 -0
- package/dist/pages/docs/reference/settings/index.html +86 -0
- package/dist/pages/docs/reference/terminology/index.html +94 -0
- package/dist/pages/docs/sitemap-0.xml +1 -0
- package/dist/pages/docs/sitemap-index.xml +1 -0
- package/dist/pages/docs/start-here/example-projects/index.html +88 -0
- package/dist/pages/docs/start-here/first-workspace/index.html +91 -0
- package/dist/pages/docs/start-here/installation-first-run/index.html +86 -0
- package/dist/pages/docs/start-here/what-is-lineage/index.html +96 -0
- package/dist/pages/docs/workflows/back-up-approved-assets/index.html +88 -0
- package/dist/pages/docs/workflows/content-batches/index.html +88 -0
- package/dist/pages/docs/workflows/continue-new-agent-session/index.html +89 -0
- package/dist/pages/docs/workflows/create-grow-lineage/index.html +89 -0
- package/dist/pages/docs/workflows/generate-import-variations/index.html +92 -0
- package/dist/pages/docs/workflows/restore-earlier-attempt/index.html +87 -0
- package/dist/pages/docs/workflows/review-approve-assets/index.html +87 -0
- package/dist/pages/index.html +42 -0
- package/dist/pages/landing/index.html +42 -0
- package/dist/pages/lineage-showcase-cover-16x9.png +0 -0
- package/dist/runtime-build.json +5 -5
- package/dist/server.js +73 -24
- package/dist/server.js.map +4 -4
- package/dist/web/assets/app-DdU93vp2.js +50 -0
- package/dist/web/assets/landing-MwOFmHoi.js +2 -0
- package/dist/web/assets/landing-wy4L-yBm.css +1 -0
- package/dist/web/index.html +3 -3
- package/dist/web/landing/index.html +26 -3
- package/dist/web/lineage-showcase-cover-16x9.png +0 -0
- package/package.json +11 -2
- 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
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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 --
|
|
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
|
package/dist/cli/lineage-dev.js
CHANGED
|
@@ -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
|
|
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
|
|
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 =
|
|
4900
|
-
const candidate = file.startsWith(".asset-scratch/") ||
|
|
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
|
|
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 (
|
|
5202
|
-
const repoRelative =
|
|
5207
|
+
if (isAbsolute3(reference)) return reference;
|
|
5208
|
+
const repoRelative = resolve7(repoRoot, reference);
|
|
5203
5209
|
if (existsSync9(repoRelative)) return repoRelative;
|
|
5204
|
-
return
|
|
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
|
|
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 = [
|
|
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
|
|
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 =
|
|
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 (!
|
|
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
|
|
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(
|
|
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
|
|
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 &&
|
|
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 &&
|
|
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 (
|
|
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 =
|
|
6397
|
+
const outPath = resolve9(out);
|
|
6392
6398
|
mkdirSync6(dirname6(outPath), { recursive: true });
|
|
6393
6399
|
writeFileSync4(outPath, `${JSON.stringify(packet, null, 2)}
|
|
6394
6400
|
`);
|