forgetrail 0.5.9 → 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 +1 -0
- package/content/COMPANION_TOOLS.md +76 -3
- package/content/FORGETRAIL_LITE.md +9 -3
- package/content/NEW_PROJECT_BOOTSTRAP.md +6 -2
- package/content/companion-tools.json +7 -4
- package/docs/DEPLOYMENT.md +38 -0
- package/docs/PHASE_1_BRIEF.md +20 -0
- package/package.json +1 -1
- package/scripts/publish-gate.mjs +6 -3
- package/scripts/tracking-cutover.test.mjs +1 -1
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
|
-
##
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
-
|
|
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
|
},
|
package/docs/DEPLOYMENT.md
CHANGED
|
@@ -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.
|
package/docs/PHASE_1_BRIEF.md
CHANGED
|
@@ -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
package/scripts/publish-gate.mjs
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
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\.
|
|
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);
|