forgetrail 0.5.10 → 0.5.11

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/WORKFLOW.md CHANGED
@@ -369,6 +369,7 @@ Where the host supports hooks, tool-level denial and injection take the load off
369
369
  **What to ask Claude to do:**
370
370
 
371
371
  - Build the entire skeleton in one pass (project init, deps, services, routes, components)
372
+ - For an npm distribution, establish the release contract: public package directory, version source, build/pack commands, README source, and release command. Follow `content/COMPANION_TOOLS.md`, "Wire npm releases for LocalHelm". If enrolled, verify read-only status and Publish plan target the actual public package. Current LocalHelm reads `package.json` at the enrolled path; it does not infer a generated release behind a private harness. Use a stable publishable package root, or record verified release-target support/manual release and pending LocalHelm support. A quiet/private/skipped row does not prove npm is current.
372
373
  - Include an import script for existing data
373
374
  - Wire up the happy path end to end
374
375
 
@@ -31,7 +31,7 @@ Public shelf (current versions and install): [catalystforge.com/tools](https://c
31
31
 
32
32
  ---
33
33
 
34
- ## Wire LocalSlip (agents)
34
+ ## Wire LocalSlip (agents)
35
35
 
36
36
  Human offer stays one sentence. Wire it this way:
37
37
 
@@ -43,11 +43,84 @@ Human offer stays one sentence. Wire it this way:
43
43
 
44
44
  Do not write `scripts/ensure-lease.mjs`. Do not add the `localslip` npm package just to read a port. `localslip/port` only if the app already depends on LocalSlip.
45
45
 
46
- Same recipes: [localslip.dev](https://localslip.dev) (FilePress + Vite pages) and FilePress `docs/LOCALSLIP.md`.
46
+ Same recipes: [localslip.dev](https://localslip.dev) (FilePress + Vite pages) and FilePress `docs/LOCALSLIP.md`.
47
+
48
+ ## Wire FilePress publishing (agents)
49
+
50
+ When FilePress is selected, establish the deployment contract during scaffolding
51
+ and verify it before release. A successful build alone does not complete publishing setup.
52
+
53
+ 1. Record the actual site path, hosting account, Pages project (or chosen provider),
54
+ production branch, output directory and live URL in the brief/decision and deployment runbook.
55
+ Do not infer the project from the domain or a folder suffix such as `-dev`.
56
+ 2. Install the deployment CLI in the site with pnpm. For Pages, use local Wrangler.
57
+ 3. Add site `package.json` `scripts.ship`: build first, then upload to the explicit
58
+ project and production branch. Example: `pnpm build && wrangler pages deploy build --project-name <project> --branch <branch>`.
59
+ 4. For a nested site, add repository-root `scripts.ship` delegation, for example
60
+ `pnpm --dir site run ship` or `pnpm --dir sites/<name> run ship`. Preserve an
61
+ existing app Ship command; explicitly select or compose targets for multi-site repos.
62
+ A standalone FilePress site needs only its own root/site command.
63
+ 5. Confirm the local dependencies are installed, build succeeds, the authenticated
64
+ account is correct, and the hosting project exists. Verify LocalHelm discovers
65
+ the repository Ship and site Ship when enrolled. Mark missing setup as pending.
66
+
67
+ FilePress's external scaffold supports `--pages-project <project>` together with
68
+ `--production-branch <branch>`, and optional `--root-package <ancestor/package.json>`
69
+ for root delegation. See [FilePress deployment instructions](https://getfilepress.com/deploy).
70
+ For other providers, keep the same two-command contract with their upload command.
71
+
72
+ Preparing scripts does not create cloud resources or deploy. Perform those actions
73
+ only within the user's authorization. LocalHelm Land updates the FilePress engine
74
+ and calls the site's Ship; it does not supply missing scripts, add a missing deployment
75
+ CLI dependency, or create a hosting project. An exact engine pin must be updated to the selected
76
+ version explicitly rather than relying on an unqualified dependency update.
47
77
 
48
78
  ---
49
79
 
50
- ## Default DNS and hosting (when unspecified)
80
+ ## Wire npm releases for LocalHelm (agents)
81
+
82
+ For products distributed through npm, establish the package release contract in
83
+ the brief and scaffolding. Verify it again before release. LocalHelm is optional;
84
+ when it is selected, its enrolled package must be the actual release target.
85
+
86
+ 1. Record the public npm name, stable package directory, authoritative version
87
+ file, build/pack commands, README source, and release command. Distinguish a
88
+ private development harness from the package consumers install. Record each
89
+ package separately in a repository with multiple releases.
90
+ 2. Prefer a checked-in publishable `package.json` at the enrolled directory,
91
+ whether the repository root or a stable package subdirectory. LocalHelm defaults
92
+ to that directory's `package.json` for name, version, and `private` status;
93
+ it does not infer a generated release from an arbitrary `release.json` or build script.
94
+ An `npm` name override does not make a private package publishable.
95
+ 3. If the chosen layout generates the manifest or tarball elsewhere, provide and
96
+ verify explicit release-target support before relying on LocalHelm Publish.
97
+ Otherwise record the manual release path and the missing LocalHelm support as
98
+ pending. Do not enroll an ignored, disposable build directory as a durable
99
+ substitute, or remove `private` from a harness just to enable Publish.
100
+ LocalHelm's explicit release-target contract uses a checked-in
101
+ `localhelm.release.json` with configuration version `1`, `directory`, `manifest`,
102
+ `readme`, and optional `buildScript`, `kind`, and `executables`. Paths stay within
103
+ the enrolled checkout. Status/Bump use the authoritative manifest; confirmed
104
+ Publish builds, packs, verifies, then publishes the exact archive. Verify the
105
+ installed LocalHelm supports this contract; a newer checkout does not update
106
+ an older global installation. See [LocalHelm release targets](https://github.com/Catalyst-Forge-LLC/localhelm/blob/main/docs/NPM_RELEASES.md).
107
+ 4. Build and inspect the packed package: its name, version, license, README, and
108
+ allowed contents must match the release contract. Compare the version and
109
+ published contents with npm; changed README/skill files need a new package
110
+ version and release. A commit, site Ship, or personal skill update does not
111
+ update npm. If version metadata generates an artifact, bump its source and
112
+ regenerate rather than editing only the generated manifest.
113
+ 5. For an enrolled package, run read-only status and the Publish plan. Check the
114
+ target name, directory, version/bump source, and planned build/publish path
115
+ against the contract. Investigate `private`, a skipped plan, or a quiet row
116
+ when the packed contents differ from npm; those are not proof it is current.
117
+ Save the result and any unsupported layout in the release checklist/session.
118
+
119
+ Planning, building, packing, and inspecting do not authorize npm publication or
120
+ Git push. Apply only within the user's existing authorization. Keep package
121
+ Publish and site Ship as separate release operations.
122
+
123
+ ## Default DNS and hosting (when unspecified)
51
124
 
52
125
  If the user has **not** already named a registrar, DNS, git host, or production host, prefer:
53
126
 
@@ -1,6 +1,6 @@
1
1
  # ForgeTrail Lite — portable kickoff for any agentic chat
2
2
 
3
- > **ForgeTrail Lite v2.2.2**
3
+ > **ForgeTrail Lite v2.2.4**
4
4
  > © Catalyst Forge, LLC — [www.catalystforge.com](https://www.catalystforge.com)
5
5
  > Part of the **ForgeTrail** open-source methodology ([Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) in the upstream ForgeTrail repo).
6
6
  >
@@ -365,6 +365,10 @@ Record anything non-obvious as a lesson in **`appledger/`** (for example, Playwr
365
365
  **Default B + separate UI (web app + API, not PocketBase):** when the brief is **UI + backend** but not Default A, use a **pnpm workspace** with committed packages — e.g. `backend/` (or `packages/api`) + `frontend/` (or `packages/web`) — instead of fighting `sv create .` at the repo root. The **`sv create app`** shortcut (A.2) into an **empty** subfolder is the first-class path for the frontend; init the API package with `pnpm init` + A.3 in its folder. Record the layout as a decision in `appledger/` and `README.md` (§14). Load env per §4.2.1.
366
366
 
367
367
  **Both paths:** always use **`pnpm`**, never `npm` or `yarn`. Never hand-edit `package.json` to add deps — use `pnpm add` / `pnpm add -D` so `pnpm-lock.yaml` stays in sync. If `pnpm` is suddenly missing here (it was verified at §4.1 preflight but the machine changed), re-run the preflight rather than silently falling back to `npm`.
368
+
369
+ **FilePress publishing (when selected):** during scaffolding, record the actual site path, hosting account, project, production branch and URL. Install the deployment CLI locally in the site. Add site `scripts.ship` that builds then uploads to that explicit target; for Pages: `pnpm build && wrangler pages deploy build --project-name <project> --branch <branch>`. A nested site also needs root `scripts.ship` delegation (`pnpm --dir site run ship`, or the actual `sites/<name>` path). Preserve any existing app deployment command and explicitly choose targets for multi-site repos. FilePress's external scaffold supports `--pages-project`, `--production-branch` and optional `--root-package` for this wiring. Confirm local installation/build, authenticated account and existing hosting project; verify both LocalHelm Ship actions if enrolled. If hosting is undecided, record setup as pending and complete it before release. Preparing scripts does not provision or deploy. LocalHelm Land updates the engine and calls site Ship; it does not create missing scripts, add a missing deployment CLI dependency or provision hosting. Folder suffixes such as `-dev` and domain names do not determine the production target.
370
+ **npm distributions (when selected):** establish the package release contract during scaffolding, per §8 rule 15: actual public package directory, authoritative version file, build/pack steps, README source, and release command. Keep private harnesses separate. If LocalHelm is selected, verify a read-only status/Publish plan targets the public package; current LocalHelm does not infer generated packages behind a private root. Use a stable publishable package root or record verified target support/manual release and pending LocalHelm support. Packing and release preparation do not authorize publication.
371
+
368
372
  11. **Build the full runnable spine in one pass** (Phase 2 exit criteria in §3). As files are needed, also create the **Phase 2 baseline docs** from §14: `README.md`, `TODO.md` (seeded from brief §11), `.forgetrail/IDEAS.md`, `.env.example`, the full `.gitignore`, **one-click launchers** (§4.5), **`docs/FORGETRAIL_PROGRESS.md`** (§4.6), and PocketBase install scripts per §4.2.2 when Default A uses PocketBase.
369
373
  12. **At every subsequent phase transition**, pause for the user's explicit "go" before updating the profile phase. Update the session record at the end of each substantive session. *(If git is enabled)* commit (`git add -A && git commit -m "<phase>: <summary>"`) at natural stopping points so history mirrors the phase log. In no-git mode, skip the commit and note progress in the session record only — and remind the user each session that git is still deferred.
370
374
 
@@ -847,6 +851,7 @@ Full ForgeTrail expands this under **`docs/TECHNICAL_REFERENCE.md`** (*URL impor
847
851
  12. **PocketBase (and similar binaries) — resolve version at install.** Never hardcode a stale semver in methodology or scripts only; use §4.2.2 (`POCKETBASE_VERSION`, GitHub latest).
848
852
  13. **Isolated health checks for key systems.** PocketBase (and Ollama when used) get **`test-*.mjs`** + **`test-*.bat`** (§4.7–§4.8, **`SYSTEM_HEALTH_CHECKS.md`**) — not only "start the whole app and see what breaks."
849
853
  14. **Local Ollama — non-thinking defaults.** Install/pull Granite 4.1 or Gemma 3 instruct sizes from VRAM; avoid reasoning models unless **`OLLAMA_USE_THINKING=1`** and the user explicitly needs them.
854
+ 15. **npm releases must have an explicit package contract.** Record the public package directory, authoritative version source, build/pack commands, README source, and release command during planning/scaffolding. Prefer a stable checked-in publishable `package.json` at the enrolled directory. When LocalHelm is selected, verify its read-only status and Publish plan match that target. Current LocalHelm reads that directory's `package.json`; an `npm` override does not bypass `private`, and generated release metadata is not inferred. Generated layouts need verified release-target support or a documented manual release path with LocalHelm support pending. Never enroll disposable build output or make a private harness public to force Publish. Inspect the packed contents and compare with npm before release; a quiet row, commit, site Ship, or personal skill update does not mean npm is current. Changed published content requires a new package version. Preparing the release does not authorize publication or push. Recipe: `content/COMPANION_TOOLS.md`, "Wire npm releases for LocalHelm" in the methodology distribution.
850
855
 
851
856
  ### 8.9 Git commit practices
852
857
 
@@ -957,7 +962,7 @@ Save this as `.forgetrail/AGENTS.md` so agents that auto-load it (Codex, Cursor,
957
962
 
958
963
  ```markdown
959
964
  <!--
960
- Agent protocol based on ForgeTrail Lite v2.2.2.
965
+ Agent protocol based on ForgeTrail Lite v2.2.4.
961
966
  © Catalyst Forge, LLC — www.catalystforge.com
962
967
  Licensed under Apache License 2.0 (upstream ForgeTrail repo).
963
968
  -->
@@ -977,6 +982,7 @@ This repository uses **ForgeTrail Lite** as its project kickoff and operating pr
977
982
  - **Lists:** numbered = ordered steps or questions, bullets = parallel options, letters (A/B/C) = pick-one. See §8 rule 5.
978
983
  - **No interactive CLIs** in scripted commands — pass every flag.
979
984
  - **Five-turn rule:** if a problem has not converged in ~5 turns, propose a different approach, not more patches.
985
+ - **npm release layout:** record the actual public package root, version source, build/pack path, and README source. If LocalHelm is selected, verify status/Publish plan targets the public package; a private harness or generated output is not automatically a release target. See §8 rule 15.
980
986
 
981
987
  ## Conventions
982
988
  - Package manager: **pnpm**. Add deps with `pnpm add` / `pnpm add -D` — never hand-edit `package.json`, never `npm`/`yarn`.
@@ -1132,4 +1138,4 @@ ForgeTrail Lite covers the shape of a project. The full **ForgeTrail MCP server*
1132
1138
 
1133
1139
  ---
1134
1140
 
1135
- **ForgeTrail Lite v2.2.2** · © Catalyst Forge, LLC · [www.catalystforge.com](https://www.catalystforge.com) · [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
1141
+ **ForgeTrail Lite v2.2.4** · © Catalyst Forge, LLC · [www.catalystforge.com](https://www.catalystforge.com) · [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0)
@@ -115,9 +115,13 @@ Call **`getProgressiveDocSchedule`** for the canonical phase → doc matrix (WOR
115
115
 
116
116
  - **`docs/PHASE_1_BRIEF.md`** — complete and locked; **`appledger/`** — decision records and the plan phase updated. Do not mark criteria met without evidence.
117
117
 
118
- **During Phase 2 (scaffolding), after architecture lock:**
118
+ **During Phase 2 (scaffolding), after architecture lock:**
119
+
120
+ - **FilePress publishing, when selected:** follow `COMPANION_TOOLS.md` "Wire FilePress publishing": record the hosting account/project/production branch and actual site path; install a local deployment CLI; add site `scripts.ship` (build then upload) and repository-root delegation for a nested site. Preserve an existing app Ship command. Do not defer both scripts until release or assume LocalHelm Land creates them. If hosting is undecided, record deployment setup as pending and complete it before release. Provisioning and deploying remain separate authorized actions.
119
121
 
120
- - `.env.example`, `.gitignore`
122
+ - **npm distributions, when selected:** record the public package directory, version source, build/pack commands, README source, and release command. Follow `COMPANION_TOOLS.md`, "Wire npm releases for LocalHelm". If enrolled, verify status and a read-only Publish plan target the actual publishable package. Current LocalHelm reads that directory's `package.json`; a private harness plus a separately generated release is not inferred. Prefer a stable publishable package root, or record verified generated-target support/manual release and pending LocalHelm support. Never make a harness public or enroll disposable output to force Publish.
123
+
124
+ - `.env.example`, `.gitignore`
121
125
  - **Scripted local services (recommended):** call **`getScaffoldInstallParams`** and align app install scripts with the returned JSON. **Never hardcode a stale PocketBase semver** — install scripts resolve **`POCKETBASE_VERSION=latest`** from GitHub at setup time (§**FORGETRAIL_LITE.md** §4.2.2, **`ONE_CLICK_DEV_SETUP.md`**). Create **setup.bat** / **setup.sh**, **run.bat** / **run.sh**, **status.bat** / **status.sh**, plus **test-pocketbase.bat** (§4.7, **`SYSTEM_HEALTH_CHECKS.md`**) so non-technical users are not given a wall of terminal commands. If the brief uses **local Ollama**, add **setup-ollama.bat** / **test-ollama.bat** (§4.8 — Granite 4.1 / Gemma 3, not thinking models by default). The agent runs first-time setup when possible; launchers are for repeat use. PocketBase lands in **`./pocketbase/`**, data in **`pb_data`**, port explicit in **`.env`** (default **8096** in reference defaults — change if **8090** or another project is already listening).
122
126
  - **PocketBase collections:** prefer a **schema script** (admin auth from **`POCKETBASE_ADMIN_EMAIL` / `POCKETBASE_ADMIN_PASSWORD`** in `.env`) that idempotently creates/updates collections per **`docs/pocketbase-setup.md`** — see **`POCKETBASE_SCHEMA_SCRIPT.md`** (ForgeTrail) and **`schemaAutomation`** in **`getScaffoldInstallParams`** output — instead of manual Admin UI steps for each collection.
123
127
  - **Dev automation (recommended):** add **`pnpm`** scripts for anything you’d otherwise ask the user to do repeatedly: **env validation** (`env:check`), **generated types** (`gen:types`), **seed data** (`db:seed`), **Playwright browser install** (`test:e2e:install`), **git hooks** (`prepare` + Husky). See **`DEV_AUTOMATION_SCRIPTS.md`** (ForgeTrail) and **`devAutomation`** in **`getScaffoldInstallParams`** — no cloud “infrastructure as code” required; these run on the developer machine.
@@ -18,20 +18,22 @@
18
18
  {
19
19
  "name": "FilePress",
20
20
  "homepage": "https://getfilepress.com",
21
- "offer": "FilePress turns a Markdown folder into a static site. Cloudflare Pages with Wrangler is a free publish path."
21
+ "offer": "FilePress turns a Markdown folder into a static site. Cloudflare Pages with Wrangler is a free publish path.",
22
+ "how": "When selected, record the actual site path, hosting account, project, production branch and URL. Install a site-local deployment CLI. Add site scripts.ship that builds then uploads to the explicit target; for nested sites also add repository-root ship delegation (pnpm --dir site run ship or the actual sites/<name> path). Preserve existing app Ship commands. FilePress external scaffold accepts --pages-project and --production-branch, plus --root-package for delegation. Verify build and both LocalHelm Ship actions if enrolled. Missing hosting setup remains pending; scripts do not authorize provisioning or deployment. Land updates the engine and calls site Ship; it does not create scripts, add a missing deployment CLI dependency or provision hosting. See COMPANION_TOOLS.md: Wire FilePress publishing."
22
23
  }
23
24
  ]
24
25
  },
25
26
  {
26
27
  "id": "static-publish",
27
28
  "tier": "A",
28
- "phases": ["1", "7"],
29
+ "phases": ["1", "2", "7"],
29
30
  "trigger": "An interactive app still needs a marketing or docs site beside the product.",
30
31
  "tools": [
31
32
  {
32
33
  "name": "FilePress",
33
34
  "homepage": "https://getfilepress.com",
34
- "offer": "Keep the app on its own stack. Add a site/ folder with FilePress for docs and marketing, the same pattern forgetrail.dev uses."
35
+ "offer": "Keep the app on its own stack. Add a site/ folder with FilePress for docs and marketing, the same pattern forgetrail.dev uses.",
36
+ "how": "During scaffolding follow COMPANION_TOOLS.md: Wire FilePress publishing. Record hosting account/project/production branch and actual site path; install local Wrangler (or chosen provider CLI), add site ship (build then upload), and root ship delegation. Preserve existing app deployment commands. FilePress scaffold supports --pages-project, --production-branch and --root-package. Verify build and LocalHelm root/site Ship discovery if enrolled; unresolved hosting remains pending. Preparing scripts does not provision or deploy; Land cannot fill in missing deployment setup."
35
37
  }
36
38
  ]
37
39
  },
@@ -63,7 +65,8 @@
63
65
  {
64
66
  "name": "LocalHelm",
65
67
  "homepage": "https://localhelm.dev",
66
- "offer": "LocalHelm shows status across the repos you enroll. Inspection does not publish."
68
+ "offer": "LocalHelm shows status across the repos you enroll. Inspection does not publish.",
69
+ "how": "For npm products follow COMPANION_TOOLS.md: Wire npm releases for LocalHelm. Record the actual public package directory, name, version source, build/pack path and README source in the brief/release runbook. Current LocalHelm reads package.json at the enrolled directory; an npm name override does not bypass private, and generated release.json/artifacts are not inferred. Prefer a stable checked-in publishable package root. Generated layouts require verified release-target support or an explicit manual release path with LocalHelm support pending; do not enroll disposable build output or make a harness public to force Publish. Inspect packed contents and run read-only status/Publish plan against the real target. A quiet/private/skipped row does not prove npm is current. README/skill changes require a new version and package release; site Ship and personal installs do not update npm. Publication and pushes require existing user authorization."
67
70
  }
68
71
  ]
69
72
  },
@@ -72,6 +72,44 @@ If the project has **not** already locked providers: **GitHub** for git, **Cloud
72
72
  | CI/CD | [e.g., GitHub Actions] | [free tier] | $0 |
73
73
  | Monitoring | [e.g., UptimeRobot] | [free tier] | $0 |
74
74
 
75
+ ### Repeatable Ship contract
76
+
77
+ For a FilePress site, complete this during scaffolding and verify before launch.
78
+ See the methodology's `content/COMPANION_TOOLS.md`, "Wire FilePress publishing".
79
+
80
+ - [ ] Actual site directory: [standalone root, `site/`, or `sites/<name>/`]
81
+ - [ ] Hosting provider and authenticated account: [confirmed account]
82
+ - [ ] Existing hosting project and production branch: [explicit target; do not infer from domain]
83
+ - [ ] Site `package.json` has `ship` that builds then uploads `build/` to that target
84
+ - [ ] Deployment CLI is a site-local dependency and is installed
85
+ - [ ] Nested site has repository-root `ship` delegation, preserving any existing app deployment
86
+ - [ ] Build passes; LocalHelm repository/site Ship discovery verified if enrolled
87
+ - [ ] Missing project/credentials/setup recorded as pending; resource creation and first deployment authorized separately
88
+
89
+ Example site command: `pnpm build && wrangler pages deploy build --project-name <project> --branch <branch>`.
90
+ Example root command: `pnpm --dir site run ship` (use the actual path).
91
+ Land synchronizes the FilePress engine and calls site Ship; it cannot fill in missing
92
+ deployment commands, a deployment CLI dependency, or a hosting project.
93
+
94
+ ### npm package release contract (if applicable)
95
+
96
+ See the methodology's `content/COMPANION_TOOLS.md`, "Wire npm releases for
97
+ LocalHelm". Complete one checklist per public package, separate from site Ship.
98
+
99
+ - [ ] Public npm name and stable package directory recorded
100
+ - [ ] Authoritative version file, build/pack commands, artifact path, and README source recorded
101
+ - [ ] Private development harness distinguished from the public release target
102
+ - [ ] Packed name/version/license/README and allowed contents inspected against the release contract
103
+ - [ ] Current npm version/contents compared; changed published content assigned a new release version
104
+ - [ ] If enrolled, LocalHelm read-only status and Publish plan target the correct directory and version/bump source
105
+ - [ ] Generated layouts have verified release-target support, or a manual release path and LocalHelm support marked pending
106
+ - [ ] Publication and any Git push stay within the user's authorization
107
+
108
+ A quiet, private, or skipped LocalHelm row does not establish that npm is current.
109
+ Do not enroll disposable generated output or remove `private` from a development
110
+ harness as a workaround. A personal skill update or site Ship does not publish
111
+ the npm package.
112
+
75
113
  ### DNS delegation order (registrar + Cloudflare + origin)
76
114
 
77
115
  Typical stack: domain at **Namecheap** (or any registrar), **Cloudflare** for DNS and edge TLS. Origin is **Cloudflare Pages** for static, or **DigitalOcean** (or similar) when the app needs a server.
@@ -62,6 +62,26 @@ _Confirmed choices only after user sign-off. Mirror the same choices into `CONTE
62
62
 
63
63
  ---
64
64
 
65
+ ## 4a. npm release contract (if applicable)
66
+
67
+ _Skip for products not distributed through npm. Fill one row per public package.
68
+ Keep private development harnesses separate from the package consumers install._
69
+
70
+ | Public npm name | Stable package directory | Version source | Build / pack and artifact | README source | Release command |
71
+ | --- | --- | --- | --- | --- | --- |
72
+ | | | | | | |
73
+
74
+ **LocalHelm, if selected:** record the enrolled package path and verify its
75
+ read-only status and Publish plan. Current LocalHelm reads `package.json` at that
76
+ path; a private root with a separately generated release is not discovered by an
77
+ `npm` name override. Prefer a stable publishable package root. Generated layouts
78
+ need verified release-target support or a documented manual release path with
79
+ LocalHelm support pending. See the methodology's `content/COMPANION_TOOLS.md`,
80
+ "Wire npm releases for LocalHelm". Do not change a harness to public just to
81
+ expose Publish.
82
+
83
+ ---
84
+
65
85
  ## 5. Data model (sketch)
66
86
 
67
87
  _Entities and relationships — not full schemas. Enough for Phase 2 scaffolding._
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "forgetrail",
3
- "version": "0.5.10",
3
+ "version": "0.5.11",
4
4
  "private": false,
5
5
  "description": "ForgeTrail: a persistent development system for building software with AI agents. CLI, Lite protocol, and methodology templates.",
6
6
  "license": "Apache-2.0",
@@ -76,14 +76,17 @@ const build = spawnSync("pnpm", ["run", "build"], {
76
76
  if (build.status !== 0) fail("mcp-server build failed");
77
77
  mustExist(MCP_ENTRY, "mcp-server/dist/index.js");
78
78
 
79
- const pack = spawnSync("pnpm", ["pack", "--dry-run", "--json"], {
79
+ // pnpm 9 pack has no --dry-run or --json. npm pack is what actually publishes.
80
+ const pack = spawnSync("npm", ["pack", "--dry-run", "--json"], {
80
81
  cwd: FORGETRAIL_ROOT,
81
82
  encoding: "utf8",
82
83
  shell: true,
83
84
  });
84
85
  if (pack.status !== 0) {
85
- console.error(pack.stderr);
86
- fail("pnpm pack --dry-run failed for forgetrail");
86
+ const detail = [pack.stderr, pack.stdout].map((part) => (part ?? "").trim()).filter(Boolean).join("\n");
87
+ if (detail) console.error(detail);
88
+ const line = detail.split("\n").find((item) => /error|unknown option/i.test(item));
89
+ fail(line ? `npm pack --dry-run failed for forgetrail: ${line}` : "npm pack --dry-run failed for forgetrail");
87
90
  }
88
91
 
89
92
  const packed = pack.stdout ?? "";
@@ -165,7 +165,7 @@ test("Lite and workflow instructions name the ledger", () => {
165
165
  assert.ok(legacyAt > 0 && resumeAt > legacyAt);
166
166
  const instructional = `${lite.slice(0, legacyAt)}\n${lite.slice(resumeAt)}`;
167
167
  assert.doesNotMatch(lite, /"schemaVersion": "lite-1"/);
168
- assert.match(instructional, /ForgeTrail Lite v2\.2\.2/);
168
+ assert.match(instructional, /ForgeTrail Lite v2\.2\.4/);
169
169
  for (const line of instructional.split("\n")) {
170
170
  if (!line.includes("workflow_tracking.json")) continue;
171
171
  assert.match(line, /legacy/, line);