@weftlet/toolkit 0.1.0 → 0.1.2

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/README.md CHANGED
@@ -1,17 +1,18 @@
1
1
  # Weftlet — Context Graph Toolkit
2
2
 
3
- An extracted Apache-2.0 toolkit for connecting product intent, contracts, implementation,
4
- tests and observed runtime evidence. Derived from LaunchEcho Context Graph; see
5
- [NOTICE](NOTICE) and the [source inventory](docs/SOURCE-INVENTORY.md).
3
+ Weftlet is an open-source context-graph toolkit that helps AI development agents understand
4
+ how a local change affects the broader product. It connects approved product intent, shared
5
+ contracts, implementing code, downstream consumers, tests and observed runtime evidence.
6
6
 
7
- This standalone implementation uses small, recorded delivery milestones. See [roadmap](docs/ROADMAP.md) and
8
- [validation](docs/VALIDATION.md) for completed checks and limitations.
7
+ Agents can query cited evidence and explore dependencies across module and asynchronous
8
+ boundaries. See the [roadmap](docs/ROADMAP.md) and [validation](docs/VALIDATION.md) for
9
+ supported capabilities and limitations.
9
10
 
10
11
  ## Set up a project
11
12
 
12
13
  Weftlet uses `@weftlet/toolkit`; its neutral `@weftlet/core` dependency is installed
13
- automatically. The initial Weftlet release targets `0.1.0`. Check [release status](docs/RELEASING.md)
14
- for public availability before using the npm commands below. Existing Tently users should follow
14
+ automatically. Both packages are available on npm at `0.1.1`.
15
+ See [release status](docs/RELEASING.md). Existing Tently users should follow
15
16
  the [migration guide](docs/MIGRATING-TO-WEFTLET.md).
16
17
 
17
18
  From your TypeScript project's directory (Node 24+):
@@ -59,7 +60,8 @@ For a project-local dependency, install `npm install --save-dev @weftlet/toolkit
59
60
  the project's absolute configuration path. Pin a reviewed version for reproducible agent setup.
60
61
 
61
62
  Linux/WSL is the validated full-suite path. Native Windows has a recorded live Codex pass;
62
- archive-byte, snapshot replacement and MCP fixture fixes await native confirmation.
63
+ the archive-byte, snapshot replacement and MCP startup regression suite also passes hosted
64
+ Windows CI. Full native Windows release preparation remains separately unvalidated.
63
65
  See the [validation record](docs/VALIDATION.md).
64
66
 
65
67
  ## Development
@@ -103,7 +105,7 @@ Install the locally packed core and toolkit tarballs together. The installed com
103
105
  `weftlet`, `weftlet-mcp`, and the compatible `context-graph` / `context-graph-mcp` aliases. For example, after preparing a release:
104
106
 
105
107
  ```sh
106
- npm install --save-dev /path/to/tently/.release/weftlet-core-0.1.0.tgz /path/to/tently/.release/weftlet-toolkit-0.1.0.tgz
108
+ npm install --save-dev /path/to/weftlet/.release/weftlet-core-0.1.1.tgz /path/to/weftlet/.release/weftlet-toolkit-0.1.1.tgz
107
109
  npx weftlet init
108
110
  ```
109
111
 
@@ -147,10 +149,16 @@ Live provider tests are separate from deterministic CI. The maintainer authorize
147
149
  export and migration from the published `@launch-echo` names to `@weftlet`. Registry publication requires
148
150
  an authorized npm identity. Repository visibility changes require separate authorization.
149
151
 
150
- See [npm release instructions](docs/RELEASING.md) for prepared archives, integrity checks and
151
- the core-before-toolkit publication sequence.
152
+ For changes that should ship, run `pnpm changeset` and commit the generated release note.
153
+ The bot prepares a version PR; merging it publishes those committed versions and records release
154
+ tags. See [npm release instructions](docs/RELEASING.md) for checks, trust settings and recovery.
152
155
 
153
156
  See [provider contract](docs/PROVIDERS.md) for bounded extraction and adapters, and
154
157
  [architecture policy](docs/architecture-policy.md) for deterministic governance.
155
158
 
156
159
  See the [bounded viewer guide](docs/VIEWER.md) and [cloud setup](docs/CLOUD-ENVIRONMENT.md).
160
+
161
+ ## License and provenance
162
+
163
+ Apache-2.0. See [LICENSE](LICENSE), [NOTICE](NOTICE), and the
164
+ [source inventory](docs/SOURCE-INVENTORY.md) for attribution and extraction history.
@@ -1,6 +1,7 @@
1
1
  # ADR 008: Weftlet package identity and publishing
2
2
 
3
- Status: accepted by the maintainer, 2026-10-21. Publication and trusted-publisher validation are pending.
3
+ Status: accepted by the maintainer, 2026-10-21. Both packages are published; trusted publishing passed for 0.1.1.
4
+ Release initiation/versioning is superseded by [ADR 009](ADR-009-release-automation.md).
4
5
 
5
6
  Use `@weftlet/core` for neutral contracts and `@weftlet/toolkit` for the implementation, CLI and
6
7
  MCP server. Both new package names start at 0.1.0; npm versions belong to each package name, so
@@ -0,0 +1,39 @@
1
+ # ADR 009: Committed release versions and verified publication records
2
+
3
+ Status: accepted by the maintainer, 2026-10-21.
4
+
5
+ Contributors use Changesets to declare release intent. A bot opens a release PR containing
6
+ versions, changelogs, lockfile updates and extraction inventory. Core and toolkit form a fixed
7
+ release group while the publication process handles both together. This is a release policy;
8
+ it does not merge their source or interface boundaries. Independent versioning would require
9
+ an explicit change to publication selection and recovery.
10
+
11
+ The toolkit lives at repository root. Include `.` explicitly in the pnpm workspace so Changesets
12
+ sees both packages. The custom version command wraps the real Changesets CLI, records the
13
+ previous/new versions in `.changeset/release-plan.json` and updates inventory after changeset
14
+ consumption. Original extraction hashes are never regenerated from destination files.
15
+
16
+ Merge the version PR before publishing. Main therefore records the intended npm version without
17
+ a post-publication bot commit. The generated plan triggers the existing `publish.yml`, retaining
18
+ npm's configured trusted-publisher identity and optional environment protection. Pending changesets
19
+ or mismatched/non-advancing plans block publication. Failed releases may leave main ahead of npm;
20
+ recover the same version rather than issuing another bump. No cross-system transaction is claimed.
21
+
22
+ The version bot has contents, PR and workflow-dispatch permissions. It explicitly dispatches checks
23
+ on its PR branch because GitHub suppresses ordinary workflow events from GITHUB_TOKEN writes.
24
+ It never merges or approves PRs. Publication uses read-only source permissions plus OIDC; a separate
25
+ job receives contents-write permission only after both public archive integrities match. That job
26
+ creates package/version tags and GitHub Releases at the published commit. Existing tags are never
27
+ retargeted and retries complete missing records idempotently.
28
+
29
+ Retain per-attempt archives and acceptance receipts. A retry of the same run restores its latest
30
+ earlier state before uploading; unreadable/expired/ambiguous recovery evidence fails explicitly.
31
+ A new run does not inherit receipts. This preserves delayed-registry handling without treating
32
+ authentication/network errors as absence. Publishing both packages and creating records are not
33
+ atomic operations; the documented recovery route retains their exact source and archive identity.
34
+
35
+ Deterministic fixtures exercise the actual CLI with root/core packages, patch/minor changes,
36
+ changelogs, generated plan, lockfile and inventory. Record tests cover npm integrity failures,
37
+ existing-tag conflicts, interrupted creation and repeated calls. Artifact-selection tests cover
38
+ attempt ordering and expired/ambiguous state. Hosted bot operation and live publication evidence
39
+ are recorded separately in [validation](VALIDATION.md); tests alone do not establish npm authorization.
@@ -12,6 +12,11 @@ ran checkout and the repository's composite action. That action selects Node 24
12
12
  packed-consumer smoke. It neither publishes packages nor invokes a live model. Codex/npm
13
13
  publication credentials and the managed cloud filesystem are not needed by this job.
14
14
 
15
+ A subsequent hosted [run 39656137105](https://github.com/jchewitt/weftlet/actions/runs/39656137105)
16
+ passed at `4cdc4e5bc8b53bde3b23ce0be550146ac6ae817c`: the full Ubuntu job and a focused
17
+ Windows job covering storage contention, committed archive bytes and all original MCP startup
18
+ cases. This Windows subset does not establish full Windows release-preparation readiness.
19
+
15
20
  ## Fresh cloud: requires a new task
16
21
 
17
22
  Before publishing the current environment snapshot:
@@ -1,8 +1,8 @@
1
1
  # Migrating from Tently to Weftlet
2
2
 
3
3
  The project is now Weftlet. LaunchEcho remains the maintainer; the GitHub repository remains
4
- [jchewitt/weftlet](https://github.com/jchewitt/weftlet). Check [release status](RELEASING.md) before
5
- installing the new names: source preparation is not proof of public npm availability.
4
+ [jchewitt/weftlet](https://github.com/jchewitt/weftlet). Both new package names are published
5
+ at 0.1.0; see [release status](RELEASING.md) for subsequent releases.
6
6
 
7
7
  | Previous package / command | Replacement |
8
8
  | --- | --- |
@@ -12,7 +12,7 @@ installing the new names: source preparation is not proof of public npm availabi
12
12
  | `context-graph` | Still supported; `weftlet` is the primary CLI |
13
13
  | `context-graph-mcp` | Still supported; `weftlet-mcp` is the primary MCP binary |
14
14
 
15
- After the new release is public, replace the old dependency using your package manager. For
15
+ Replace the old dependency using your package manager. For
16
16
  an npm project that installed the toolkit as a development dependency:
17
17
 
18
18
  ```sh
@@ -51,4 +51,4 @@ Native Windows limitations remain documented in [validation](VALIDATION.md).
51
51
 
52
52
  The old `@launch-echo` releases remain immutable and usable. Do not unpublish them. Deprecation
53
53
  is a later registry action, only after both replacements and a fresh public installation are
54
- verified. This migration does not modify or reintegrate the original TradePilot repository.
54
+ verified. Existing consumer integrations can migrate independently.
package/docs/PROVIDERS.md CHANGED
@@ -21,9 +21,9 @@ Artifact storage contains model output and must remain private with the source r
21
21
 
22
22
  ## Codex authentication
23
23
 
24
- Status: implemented in unreleased source; live validation is **tentative and non-blocking for
25
- release**, as accepted by the maintainer. Follow-up is planned after publication and adoption into
26
- Banditrade using the maintainer's existing ChatGPT login; API-key testing may remain deferred.
24
+ Status: included in `@weftlet/toolkit@0.1.0`; live validation is **tentative and non-blocking for
25
+ release**, as accepted by the maintainer. Follow-up is planned in a consumer project using an
26
+ existing ChatGPT login; API-key testing may remain deferred.
27
27
  The earlier `@launch-echo/tently@0.1.0` release does not contain this option. Both modes still use Codex CLI;
28
28
  this is not a direct OpenAI API provider or a fix for the managed-cloud filesystem issue.
29
29
 
package/docs/RELEASING.md CHANGED
@@ -1,144 +1,156 @@
1
1
  # Weftlet npm releases
2
2
 
3
- Current source prepares the first `@weftlet/core@0.1.0` and `@weftlet/toolkit@0.1.0` release.
4
- The maintainer created the `weftlet` npm organization. Neither new package is claimed published
5
- by this document. The earlier `@launch-echo/tently-core@0.1.0` and `@launch-echo/tently@0.1.0`
6
- releases remain available and undeprecated; their public installation evidence is in
7
- [validation](VALIDATION.md). GitHub is now `jchewitt/weftlet`; npm and GitHub owner names need not match.
8
-
9
- Live Codex authentication validation is tentative and non-blocking for release, as accepted by
10
- the maintainer. Deterministic release checks still apply. Native Windows limitations remain
11
- recorded; use Linux or WSL for the full release gate. See [consumer migration](MIGRATING-TO-WEFTLET.md).
12
-
13
- ## First publication and maintainer setup
14
-
15
- Creating an npm organization does not publish its packages or configure package-level trusted
16
- publishers. Use an npm account with permission to publish both names in `@weftlet`. The initial
17
- publication can use the normal npm login/2FA flow below. Once the packages exist, configure each
18
- package's Settings → Trusted Publisher with the following GitHub Actions identity:
3
+ `@weftlet/core@0.1.1` and `@weftlet/toolkit@0.1.1` are published. Their first trusted
4
+ publication passed in [run 39661957651](https://github.com/jchewitt/weftlet/actions/runs/39661957651)
5
+ from commit `720a5f964fe3cb6c438be6d22b4aa8b4ad44de17`, with matching registry archive integrity,
6
+ npm provenance and a fresh public CLI installation. Earlier Weftlet and `@launch-echo` releases
7
+ remain available and undeprecated. GitHub and npm owner names need not match.
8
+
9
+ Live Codex authentication follow-up remains tentative and non-blocking, as accepted by the
10
+ maintainer. Deterministic release checks still apply. Linux/WSL is the validated full release
11
+ preparation route; native Windows has focused CI coverage. See [validation](VALIDATION.md).
12
+
13
+ ## Normal development and release
14
+
15
+ 1. For a change that should ship, run `pnpm changeset`, choose patch/minor/major and write a short
16
+ user-facing description. Commit the generated Markdown with the change. The bump type is a
17
+ contributor decision, not inferred from commit messages. Documentation-only work that does not
18
+ need an npm release can omit a changeset.
19
+ 2. On main pushes, **Release version PR** opens or updates a bot PR. Core and toolkit are a fixed
20
+ release group: a release of either advances both to the same version. The PR contains package
21
+ versions, dependency/lockfile updates, changelogs, a generated `.changeset/release-plan.json`,
22
+ and an updated extraction inventory. Original source hashes remain unchanged.
23
+ 3. Review the version PR and its checks, then merge it. This commits the versions to `main`
24
+ **before** npm publication. Do not manually bump manifests or edit the generated plan.
25
+ 4. The plan change triggers **Weftlet release**. It validates and prepares both archives, publishes
26
+ core followed by toolkit using npm trusted publishing, then verifies registry integrity.
27
+ 5. After both versions are verified, a separate job creates tags such as `@weftlet/core@0.1.2`
28
+ and `@weftlet/toolkit@0.1.2`, plus corresponding GitHub Releases, at that exact source commit.
29
+ Existing tags are never moved. The publication job does not commit back to main.
30
+
31
+ The bot uses GitHub's built-in token, not a personal access token. GitHub may require Settings →
32
+ Actions → General → Workflow permissions → **Allow GitHub Actions to create and approve pull
33
+ requests**. The workflow grants its own explicit permissions; the repository default need not
34
+ be changed to write. The bot creates PRs; it does not approve or merge them. Since commits made
35
+ with `GITHUB_TOKEN` do not trigger ordinary PR workflows, it explicitly dispatches `check.yml`
36
+ on the release PR branch. Inspect the checks for the current PR commit before merging.
37
+
38
+ Versioning is automatic once changesets are supplied; publication remains dependent on passing
39
+ checks and configured environment rules. A failed publish can temporarily leave main ahead of
40
+ npm. Retry that release at the same commit/version instead of generating another bump.
41
+
42
+ ## npm trust and GitHub environment
43
+
44
+ Trust is configured separately for both [core](https://www.npmjs.com/package/@weftlet/core) and
45
+ [toolkit](https://www.npmjs.com/package/@weftlet/toolkit), with these settings:
19
46
 
20
47
  | npm setting | Value |
21
48
  | --- | --- |
22
49
  | Organization or user | `jchewitt` |
23
50
  | Repository | `weftlet` |
24
- | Workflow filename | `publish.yml` (filename only) |
51
+ | Workflow filename | `publish.yml` |
25
52
  | Environment name | `npm-release` |
26
- | Allowed action | Enable direct `npm publish` |
53
+ | Allowed action | Direct `npm publish` enabled |
27
54
 
28
- On GitHub, create repository Settings → Environments → `npm-release`. Restrict deployment branches
29
- to `main` and configure a required reviewer. A sole maintainer must be allowed to approve their own
30
- release. Do not rely on the YAML environment name alone: an automatically created environment has
31
- no review protection until you configure it. No npm token secret is required for OIDC publication.
32
- Keep npm account 2FA enabled. The package's repository metadata already identifies `jchewitt/weftlet`.
55
+ The automation retains this identity, so existing npm trust needs no change. Keep npm account
56
+ 2FA enabled. No npm token secret is required. If configuring a new trust relationship, consult
57
+ [npm's current requirements](https://docs.npmjs.com/trusted-publishers/), including its initial-use deadline.
33
58
 
34
- npm trusted-publisher setup is not validated merely by saving these settings. Test with a later,
35
- intentional versioned publication. Current npm documentation says a new trust configuration must
36
- be used within two days or it expires; configure it close to the intended release, and reconfirm
37
- that behavior in [npm's documentation](https://docs.npmjs.com/trusted-publishers/).
59
+ `npm-release` is a GitHub deployment environment, not a machine or npm account. Its existing
60
+ configuration has no required reviewer or branch rules. The workflow itself requires main.
61
+ To add an approval pause, configure a required reviewer and main-only deployment branches under
62
+ Settings → Environments → npm-release. A sole maintainer approving their own releases must leave
63
+ **Prevent self-review** unchecked. The workflow honors those rules if configured; its YAML name
64
+ alone does not create review protection.
38
65
 
39
- ## Prepare reviewed archives
66
+ ## Validation and manual preparation
40
67
 
41
- Use Node 24 and pnpm 10.18.2 in a clean, committed checkout. The new namespace starts at 0.1.0;
42
- subsequent content changes require a new version for the affected packages. Update the lockfile
43
- when changing workspace dependency versions. Never overwrite or republish an existing version.
68
+ Use Node 24 and pnpm 10.18.2. The full gate can run during ordinary development without a release plan:
44
69
 
45
70
  ```sh
46
- nvm install
47
- nvm use
48
71
  pnpm install --frozen-lockfile
49
- pnpm release:prepare
72
+ pnpm context-graph:publication-check
50
73
  ```
51
74
 
52
- This runs build, deterministic tests, architecture checks, extraction inventory, license checks
53
- and a fresh packed-consumer smoke. The smoke uses a disposable registry for the two local packages,
54
- exercises npx inference and automatic core installation, and checks SCIP, RDF/SHACL, visualization
55
- and MCP. No live model or public npm upload is invoked.
75
+ It runs build, deterministic tests, architecture, inventory, licenses and a fresh packed-consumer
76
+ smoke. The smoke exercises setup/config, automatic core installation, real TypeScript SCIP,
77
+ RDF/SHACL, visualization and MCP. No live model or public npm upload is invoked.
78
+
79
+ After the generated release PR is committed, `pnpm release:prepare` also packs both packages,
80
+ resolves workspace ranges, dry-runs unpublished versions and records source commit, versions and
81
+ SHA-512 integrity in `.release/manifest.json`. Review the manifest, tarball file lists and extraction
82
+ inventory. Preparation refuses pending changesets and stale release plans. It requires a clean
83
+ checkout. An existing npm version must match exactly; different bytes stop the release.
84
+
85
+ Actions → **Weftlet release** → **Run workflow** remains available on main. Leave **publish**
86
+ unchecked for preparation only, or select it for an intentional release of the committed plan.
87
+ The preparation job has read-only repository permissions and no OIDC permission. Its uploaded
88
+ `weftlet-release-N` artifact (`N` is the run attempt) is the exact publication input. The publish
89
+ job installs no project dependencies and performs no build. It alone has `id-token: write`;
90
+ the separate release-record job has `contents: write` and no npm publishing permission.
91
+
92
+ Actions and npm are pinned; npm 11.21.1 is used for OIDC. OIDC preconditions require the expected
93
+ repository, main, a push/manual trigger, hosted runner and OIDC request variables. Ambient npm
94
+ tokens are rejected and npm configuration is isolated. `npm whoami` is skipped because it cannot
95
+ validate trusted publishing. npm verifies the identity and creates provenance. There is no token
96
+ fallback. JavaScript pnpm and standalone `@pnpm/exe` are supported for local tooling.
97
+
98
+ ## Delayed visibility and failed releases
99
+
100
+ Publication is sequential, not atomic across packages. Registry visibility and integrity of core
101
+ are checked before toolkit is uploaded. An identical existing release is skipped. Only HTTP 404
102
+ is treated as pending; authentication, network and integrity failures stop publication.
103
+
104
+ After npm accepts an upload, the publisher writes a package/integrity-specific `.accepted.json`
105
+ receipt and polls public metadata up to 21 times, 15 seconds apart. It never intentionally uploads
106
+ an accepted version again. A process interruption between acceptance and receipt writing still
107
+ requires inspection of npm state.
108
+
109
+ For a failed GitHub run, use **Re-run failed jobs** on the original run. Each attempt saves
110
+ `weftlet-publication-state-N` with exact archives and receipts, even on failure. The next attempt
111
+ restores the latest earlier receipt artifact from that same run before publishing. Artifact lookup
112
+ errors, expired latest receipts or ambiguous state fail instead of silently discarding evidence.
113
+ Artifacts are retained for 30 days. Release-record creation is also idempotent: a retry completes
114
+ missing records without moving tags or duplicating releases.
115
+
116
+ Do not start a new workflow run while an accepted package is still processing: different runs do
117
+ not share receipts. If artifacts expired, inspect npm and recover the original archives/receipts
118
+ before proceeding. Do not bump versions to hide a partially published release. Once both versions
119
+ are visible, exact integrity checks make retries safe. A newly prepared archive that differs from
120
+ the original is an error, even if its package version is the same.
121
+
122
+ For authorized local recovery, restore the original `.release/` at its manifest's commit, then:
56
123
 
57
- Preparation packs with pnpm, resolves workspace dependency ranges and records commit, names,
58
- versions and SHA-512 integrity in `.release/manifest.json`. Review it, the tarball file lists and
59
- `docs/extraction-manifest.json`. Existing versions must match the prepared archive exactly;
60
- unpublished versions receive an npm dry run. A dry run does not establish OIDC authorization.
124
+ ```sh
125
+ npm login --registry=https://registry.npmjs.org
126
+ pnpm release:publish
127
+ ```
61
128
 
62
- Both JavaScript pnpm and standalone `@pnpm/exe` are supported. The publisher must find npm's
63
- JavaScript entry point beside Node. The workflow pins npm 11.21.1; trusted publishing requires
64
- at least npm 11.5.1. Use the workflow's pinned tools when reproducing CI release preparation.
129
+ Use an interactive terminal for npm browser/2FA challenges. Local publication uses normal login
130
+ and disables CI provenance. `WEFTLET_NPM_TOKEN` (legacy `TENTLY_NPM_TOKEN`) remains available for
131
+ an explicitly authorized token environment; never commit tokens or pass them to the OIDC workflow.
132
+ Local publication does not create GitHub tags/releases automatically; the verified workflow's
133
+ record job is the normal route.
65
134
 
66
- ## Initial or local publication with npm login
135
+ ## Inspecting and consuming releases
67
136
 
68
- From the same clean checkout and reviewed archives, in an interactive terminal:
137
+ Package-specific tags identify the exact published source, for example:
69
138
 
70
139
  ```sh
71
- npm login --registry=https://registry.npmjs.org
72
- npm whoami --registry=https://registry.npmjs.org
73
- pnpm release:publish
140
+ git fetch --tags
141
+ git switch --detach '@weftlet/toolkit@0.1.2'
74
142
  ```
75
143
 
76
- Complete npm's browser/2FA challenge when requested. Do not pipe or redirect the publication
77
- command: npm needs terminal input and output for the interactive flow. The default `login` mode
78
- retains npm's normal credentials and uses `whoami`; it does not silently select OIDC.
79
-
80
- For an authorized token environment, `WEFTLET_NPM_TOKEN` is supported through a temporary,
81
- restricted-permission npm configuration containing only the literal variable reference. Legacy
82
- `TENTLY_NPM_TOKEN` remains accepted if the new variable is absent. Never paste tokens in chat,
83
- commit them, or provide either token to the trusted-publishing workflow. No cloud secret is needed
84
- when publication happens from the maintainer's authenticated WSL session.
85
-
86
- ## GitHub trusted publication
87
-
88
- The workflow `.github/workflows/publish.yml` is manually dispatched, main-branch only, and serialized.
89
- It does not run on pushes or pull requests. From GitHub Actions → **Weftlet release** → **Run workflow**:
90
-
91
- 1. Select `main`. Leave **publish** unchecked for preparation only. Review the uploaded
92
- `weftlet-release` artifact and manifest in the run summary.
93
- 2. For an intentional release, select **publish**. The preparation job runs again on that exact
94
- commit, without publishing credentials. Inspect that run's artifact before approving its
95
- `npm-release` deployment; a different run's archive is not the approval target.
96
- 3. After configured environment approval, the publish job checks out the same source, downloads
97
- those artifacts and runs `node scripts/release.mjs --publish --auth=oidc`. It does not install
98
- project dependencies or rebuild the packages. Only this job has `id-token: write`.
99
-
100
- Actions are pinned to commits. Neither job restores a dependency cache. OIDC mode requires a
101
- GitHub-hosted runner, the expected repository/ref/manual trigger and OIDC request variables;
102
- it rejects ambient npm token variables and isolates user/global npm configuration. npm performs
103
- actual identity validation against each package's trust settings. `npm whoami` is deliberately
104
- skipped in OIDC mode because it is not a trusted-publisher authorization check. Unsupported npm,
105
- missing trust or rejected identity must fail; there is no token fallback configured by this workflow.
106
-
107
- npm creates provenance for public packages published from this public repository through OIDC.
108
- Local publication explicitly disables CI provenance. Prepared artifacts and synthetic OIDC tests
109
- do not prove that a live trusted publish or provenance verification has succeeded.
110
-
111
- ## Ordering, delayed visibility and recovery
112
-
113
- Before any upload, the publisher validates every archive hash and its source commit. It publishes
114
- core first, waits for registry visibility and verifies integrity, then publishes the toolkit. An
115
- existing identical release is skipped; different bytes at the same version stop publication.
116
- Publication across packages is not atomic.
117
-
118
- After npm accepts an upload it may remain invisible while processing. The publisher saves a
119
- package/integrity-specific `.accepted.json` receipt under `.release/` and retries only public
120
- metadata reads, up to 21 checks, 15 seconds apart. Only 404 is treated as pending. Never repeatedly
121
- upload an accepted version. Keep `.release/` and retry `release:publish` later to resume verification.
122
- A receipt cannot cover a process interruption before it is written; inspect registry state before
123
- recovery. Authentication, network and integrity errors are not treated as missing packages.
124
-
125
- The workflow uploads `weftlet-publication-state`, including receipts, even when publication fails.
126
- For a processing timeout, recover those exact archives and receipts into `.release/` at the
127
- manifest's source commit before an authorized local retry. Do not blindly rerun the whole workflow
128
- while an accepted upload is still processing: a new run starts without the old receipt. Once a
129
- release is visible, the normal integrity check safely skips its already published packages.
130
-
131
- ## Verify public installation before retiring old names
132
-
133
- After successful publication, use a fresh disposable project:
144
+ Tags support inspection and reproduction, not mutation of npm history. To roll a consumer back,
145
+ install an earlier published version; fixes to a release need a new changeset/version.
146
+
147
+ Verify a new public release in a fresh disposable project, substituting its version:
134
148
 
135
149
  ```sh
136
150
  npm init -y
137
- npx --yes @weftlet/toolkit@0.1.0 init --yes
138
- npx --yes @weftlet/toolkit@0.1.0 config validate
151
+ npx --yes @weftlet/toolkit@0.1.1 init --yes
152
+ npx --yes @weftlet/toolkit@0.1.1 config validate
139
153
  ```
140
154
 
141
- Use the actual release version for later releases. Verify registry versions and hashes, core's
142
- transitive resolution, CLI/MCP operation and provenance when applicable. Update release status
143
- only after those public checks pass. Deprecating the old `@launch-echo` names is a separate registry
144
- action after replacement verification; never unpublish the old releases.
155
+ Check registry hashes, transitive core resolution and provenance. Deprecating the previous
156
+ `@launch-echo` names is a separate action after replacement verification; never unpublish them.
package/docs/ROADMAP.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # Delivery roadmap
2
2
 
3
- Destination: `jchewitt/weftlet`. Read-only source:
4
- `launchecho/tradepilot@fda97e0146099543aeaa6b338ef2b0e9fab0d1d6`.
3
+ Project: `jchewitt/weftlet`. Extraction provenance is recorded in the
4
+ [source inventory](SOURCE-INVENTORY.md).
5
5
 
6
6
  | Milestone | Delivered and checked | Remaining limits |
7
7
  | --- | --- | --- |
8
8
  | 1. Standalone | Explicit committed inventory, core/toolkit boundary, public examples, build/tests, packed independent consumer and real TypeScript indexing | GitHub exported; both @launch-echo packages published at 0.1.0 and public installation verified |
9
- | 2a. Saved evidence | Read/refresh separation, commit/config/scope metadata, dirty querying, isolated archives, atomic snapshots validated on Linux/WSL, failed-refresh preservation | Archive LF conversion and bounded atomic head-replacement fixes pass Linux regressions; native Windows confirmation pending; archives reject symlinks/submodules and sizes above 128 MiB |
9
+ | 2a. Saved evidence | Read/refresh separation, commit/config/scope metadata, dirty querying, isolated archives, atomic snapshots validated on Linux/WSL, failed-refresh preservation | Archive LF conversion and atomic head-replacement regressions pass Linux and hosted Windows CI; archives reject symlinks/submodules and sizes above 128 MiB |
10
10
  | 2b. Draft overlays | Base/content identity, reindexed replacement, delete/rename handling, separate checkout/agent heads | Full implementation reindex; changed prose invalidated pending re-extraction |
11
11
  | 3. Unified graph | RDF/SPARQL, SHACL, lossless projection, bounded continuation, six-stage async cross-source fixture, negative extraction/linkage cases | Local SELECT only; 100,000-fact projection bound; no universal language support |
12
12
  | 4. Governance | Canonical approved rules, dependency-cruiser/ESLint/jscpd, scoped debt/expiry, transitive inference, optional OML ADR/parity | No active OWL reasoner; live formal compilation unverified; heuristics remain advisory |
@@ -23,14 +23,15 @@ The post-release module-organization increment is described in
23
23
  public entry points remain stable, and proposed internal dependency restrictions are advisory
24
24
  pending explicit owner approval. It does not publish a replacement for npm 0.1.0.
25
25
 
26
- The following unreleased increment adds explicit Codex authentication configuration: ChatGPT
26
+ Weftlet 0.1.0 includes explicit Codex authentication configuration: ChatGPT
27
27
  login by default, API-key mode by opt-in, and presence-only API diagnostics. Validation is
28
28
  tentative and explicitly non-blocking for release. The maintainer plans follow-up after publication
29
- and adoption into Banditrade; API-key testing remains optional. No new live model results are claimed.
29
+ and adoption into a consumer project; API-key testing remains optional. No new live model results are claimed.
30
30
  See [provider configuration](PROVIDERS.md#codex-authentication) and the validation record.
31
31
 
32
32
  Native Windows archive conversion, concurrent head-replacement and MCP file-symlink fixes are
33
- implemented with regression tests; a focused Windows CI job and HDesk rerun must confirm them.
33
+ implemented with regression tests and pass focused hosted Windows CI. HDesk confirmation and
34
+ full native Windows release preparation remain separate checks.
34
35
  Next work should be separate, reviewed increments: improve CRLF checkout integrity checks;
35
36
  run bounded semantic-quality evaluations; retain the passing hosted Ubuntu CI gate; validate fresh-cloud
36
37
  restoration; resolve the cloud-specific live provider block; add browser
@@ -45,9 +46,11 @@ Validation evidence and decisions are in `VALIDATION.md` and the ADR files. Sour
45
46
  model assertion review are distinct. On 2026-10-20 the user authorized pushing the reviewed
46
47
  destination to `jchewitt/tently` for local testing. The subsequent npm request authorizes release
47
48
  preparation/publication under `@launch-echo`; the maintainer completed the 0.1.0 release from WSL. Visibility changes and
48
- TradePilot reintegration remain outside the authorized scope. See [release instructions](RELEASING.md).
49
-
50
- The maintainer authorized the Weftlet migration on 2026-10-21. Current source targets
51
- `@weftlet/core` and `@weftlet/toolkit`, with a `weftlet` CLI and a manually dispatched trusted
52
- publishing workflow. First publication, npm trust configuration and a live OIDC publish remain
53
- separate external steps; the earlier Tently packages remain available and undeprecated.
49
+ source-application reintegration remain outside the authorized scope. See [release instructions](RELEASING.md).
50
+
51
+ The maintainer authorized the Weftlet migration on 2026-10-21. Both `@weftlet/core` and
52
+ `@weftlet/toolkit` are published at 0.1.1 through GitHub OIDC, with provenance and a fresh public
53
+ installation verified. Changesets now prepares reviewed version PRs for the fixed package group;
54
+ merging a release plan triggers publication and package-specific tags/GitHub Releases.
55
+ See [ADR 009](ADR-009-release-automation.md) and [release instructions](RELEASING.md).
56
+ Earlier Tently packages remain available and undeprecated.
@@ -488,3 +488,71 @@ The Windows job does not replace the full Linux release gate. Native Windows exe
488
488
  fixes remains pending; simulated Windows errors on Linux are not a native pass. CRLF checkout
489
489
  inventory checking and npm Codex executable discovery remain separate follow-ups. No live model
490
490
  call or npm publication was performed. Use WSL for the validated full release-preparation route.
491
+
492
+
493
+ ## Weftlet publication and native Windows CI — 2026-10-21
494
+
495
+ The maintainer reported successful publication. Public npm metadata independently confirms
496
+ `@weftlet/core@0.1.0` and `@weftlet/toolkit@0.1.0`, both with `latest` pointing to 0.1.0 and
497
+ repository metadata pointing to `jchewitt/weftlet`. Downloaded archives match their registry
498
+ SHA-512 integrity values. The toolkit archive contains the Windows atomic-rename helper.
499
+ This check verifies registry availability and archive integrity, not a fresh public consumer install.
500
+
501
+ [Hosted run 39656137105](https://github.com/jchewitt/weftlet/actions/runs/39656137105) succeeded
502
+ at `4cdc4e5bc8b53bde3b23ce0be550146ac6ae817c`. Both the full Ubuntu deterministic job and the
503
+ focused `windows-storage-and-startup` job passed. The Windows job completed frozen installation,
504
+ build, Git archive-byte checks, snapshot contention/failure checks and all three original MCP
505
+ startup cases. This establishes a native hosted-Windows regression pass; full Windows release
506
+ preparation, HDesk reruns, CRLF inventory checking and npm Codex discovery remain separate.
507
+
508
+ Current source prepares 0.1.1 for both packages to update public descriptions and documentation.
509
+ The project overview and core README describe Weftlet independently; original attribution,
510
+ licenses and extraction provenance remain intact. npm trusted publishing still needs package-level
511
+ configuration and a successful OIDC release. A manual publication does not validate OIDC.
512
+
513
+
514
+ For the 0.1.1 documentation/metadata patch, frozen install and the full Linux publication gate
515
+ passed again: 155 deterministic tests (one optional Docker/OML test skipped), build, architecture
516
+ with 12 advisory findings, inventory, licenses and fresh packed-consumer smoke. No runtime code
517
+ changed from 4cdc4e5. GitHub's About description was blank; an attempted metadata update returned
518
+ HTTP 403, so no GitHub description change is claimed. No npm upload was made by the agent.
519
+
520
+
521
+ ## First trusted-release preparation attempt — 2026-10-21
522
+
523
+ [Run 39660995763](https://github.com/jchewitt/weftlet/actions/runs/39660995763) on d82ebee
524
+ passed the full release gate but stopped before uploading any package. npm 11.21.1 returns
525
+ `publish --dry-run --json` results keyed by package name; the release script expected the
526
+ flat record returned by npm 11.9.0. The preparation check now supports both observed formats
527
+ and verifies name, version and archive integrity. Ambiguous/multiple records and mismatches
528
+ remain errors. Two npm-command tests pass, including negative response-shape/identity/integrity
529
+ cases, and both package archives pass real dry runs with npm 11.9.0 and 11.21.1. No live npm
530
+ publication was attempted by this failed run.
531
+
532
+ ## Trusted 0.1.1 publication and release automation — 2026-10-21
533
+
534
+ [Release run 39661957651](https://github.com/jchewitt/weftlet/actions/runs/39661957651) succeeded
535
+ at `720a5f964fe3cb6c438be6d22b4aa8b4ad44de17`: credential-free preparation, both npm OIDC
536
+ uploads, registry visibility and archive integrity checks. Public metadata confirms both packages
537
+ at 0.1.1 with provenance. A fresh public installation passed CLI init and config validation.
538
+ No npm token was supplied. The `npm-release` GitHub environment exists without reviewer/branch
539
+ rules; the workflow main-branch guard remains active. Saving trust alone was not counted as a pass.
540
+
541
+ Package-specific 0.1.1 Git tags and GitHub Releases were subsequently added at that exact commit,
542
+ after rechecking both registry hashes against the original run's archive manifest. No 0.1.0 tag
543
+ was guessed. npm versions or artifacts were not changed by this record backfill.
544
+
545
+ For the Changesets automation increment, Linux Node 24.19.0 / pnpm 10.18.2 frozen install and the
546
+ full publication gate passed: **165 deterministic tests** (1 core + 164 toolkit/example/script),
547
+ with one optional Docker/OML test skipped. Build, architecture (12 advisory findings), extraction
548
+ inventory, licenses and fresh packed-consumer smoke passed. The smoke covered setup/config,
549
+ transitive core installation, runtime assets, real TypeScript SCIP, RDF/SPARQL/SHACL, HTML/DOT/SVG
550
+ and MCP. Actionlint 1.7.7 passed all three workflows with shellcheck integration disabled.
551
+
552
+ New deterministic tests run the actual Changesets CLI in disposable root/core workspaces, verify
553
+ patch/minor fixed-group bumps, changelogs, plan/lockfile/inventory updates and consumed changesets,
554
+ and reject stale or non-advancing plans. Release-record tests reject missing/mismatched registry
555
+ archives and conflicting tags, and resume interrupted creation without duplicates. Recovery-state
556
+ tests select earlier attempts and reject expired or ambiguous artifacts. No paid model call or
557
+ new npm version was published by these tests. Hosted version-PR operation is checked separately;
558
+ a future merged release remains the integration test of automatic publish and record creation.
@@ -108,7 +108,7 @@
108
108
  "destinationPath": "package.json",
109
109
  "sourceSha256": "a575dbb2fed8c554b95e8e9b3e03a0c21cab1be7249860bbebc18e046b2ff78d",
110
110
  "modified": true,
111
- "destinationSha256": "96a6cf7ae18dd4c976c6ec3cfca31ce37f44229dc6c9df46f58d6eae5de0e36d"
111
+ "destinationSha256": "017fe298662e434efa27d4f21a0adb0d857fa373a6199ed2d623a6c630c5b451"
112
112
  },
113
113
  {
114
114
  "sourcePath": "tools/context-graph/packages/core/LICENSE",
@@ -129,7 +129,7 @@
129
129
  "destinationPath": "packages/core/README.md",
130
130
  "sourceSha256": "6044bf7b9a3dc793f41e2ff048546ed11938957d10a5b143eb1739ac4cd7477c",
131
131
  "modified": true,
132
- "destinationSha256": "8f2d73048bcf7e1d411e0942505af58700ef6f4715b40de5efcd73afbb062be7"
132
+ "destinationSha256": "1cb03b2eb415ac35ef7a4405d3cbb415c59717fe6d088968533e3ac51658f7fb"
133
133
  },
134
134
  {
135
135
  "sourcePath": "tools/context-graph/packages/core/THIRD_PARTY_NOTICES.md",
@@ -143,7 +143,7 @@
143
143
  "destinationPath": "packages/core/package.json",
144
144
  "sourceSha256": "2a29066eb8452f22fafcb06bb035a84dda93c5705dba32aba600a1b7e5aaf19c",
145
145
  "modified": true,
146
- "destinationSha256": "ac71f77c54b9fa92c0304705154b1a24a2b4d69da410b34d04854215c7d1ca91"
146
+ "destinationSha256": "9dbd393a312bb6a992b53d2624279b62991e64609beb506744186614f9b194cf"
147
147
  },
148
148
  {
149
149
  "sourcePath": "tools/context-graph/packages/core/src/core.ts",
@@ -577,11 +577,16 @@
577
577
  ".github/workflows/context-graph.yml"
578
578
  ],
579
579
  "authoredPaths": [
580
+ ".changeset/README.md",
581
+ ".changeset/config.json",
582
+ ".changeset/release-plan.json",
580
583
  ".github/workflows/check.yml",
581
584
  ".github/workflows/publish.yml",
585
+ ".github/workflows/version.yml",
582
586
  ".gitignore",
583
587
  ".npmrc",
584
588
  ".nvmrc",
589
+ "CHANGELOG.md",
585
590
  "CONTRIBUTING.md",
586
591
  "README.md",
587
592
  "SECURITY.md",
@@ -596,6 +601,7 @@
596
601
  "docs/ADR-006-provider-boundaries.md",
597
602
  "docs/ADR-007-toolkit-modules.md",
598
603
  "docs/ADR-008-weftlet-packages.md",
604
+ "docs/ADR-009-release-automation.md",
599
605
  "docs/CLOUD-ENVIRONMENT.md",
600
606
  "docs/ENVIRONMENT-VALIDATION.md",
601
607
  "docs/MIGRATING-TO-WEFTLET.md",
@@ -637,11 +643,13 @@
637
643
  "examples/pipeline/test/pipeline.test.ts",
638
644
  "examples/pipeline/tsconfig.json",
639
645
  "mcp-launcher.mjs",
646
+ "packages/core/CHANGELOG.md",
640
647
  "pnpm-lock.yaml",
641
648
  "pnpm-workspace.yaml",
642
649
  "reviewed-licenses.json",
643
650
  "runtime-check.d.mts",
644
651
  "runtime-check.mjs",
652
+ "scripts/check-release-plan.mjs",
645
653
  "scripts/check-restoration.mjs",
646
654
  "scripts/clean-build.mjs",
647
655
  "scripts/cloud-install.sh",
@@ -651,10 +659,19 @@
651
659
  "scripts/npm-command.test.ts",
652
660
  "scripts/package-manager.mjs",
653
661
  "scripts/package-manager.test.ts",
662
+ "scripts/publication-state.mjs",
663
+ "scripts/publication-state.test.ts",
664
+ "scripts/record-release.mjs",
654
665
  "scripts/registry-publication.mjs",
655
666
  "scripts/registry-publication.test.ts",
667
+ "scripts/release-plan.mjs",
668
+ "scripts/release-records.mjs",
669
+ "scripts/release-records.test.ts",
656
670
  "scripts/release.mjs",
671
+ "scripts/restore-publication-state.mjs",
657
672
  "scripts/update-inventory.mjs",
673
+ "scripts/version-packages.mjs",
674
+ "scripts/version-packages.test.ts",
658
675
  "src/application/overlay.test.ts",
659
676
  "src/application/overlay.ts",
660
677
  "src/application/saved-evidence.ts",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@weftlet/toolkit",
3
- "version": "0.1.0",
4
- "description": "Reusable commit-keyed semantic, implementation, runtime, and evidence graph toolkit",
3
+ "version": "0.1.2",
4
+ "description": "Evidence-backed context graphs for AI development agents: product intent, contracts, code, tests and runtime behavior",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "files": [
@@ -62,9 +62,10 @@
62
62
  "n3": "2.7.2",
63
63
  "rdf-validate-shacl": "0.6.5",
64
64
  "sparqljs": "3.7.4",
65
- "@weftlet/core": "^0.1.0"
65
+ "@weftlet/core": "^0.1.2"
66
66
  },
67
67
  "devDependencies": {
68
+ "@changesets/cli": "3.0.3",
68
69
  "@types/n3": "1.26.1",
69
70
  "@types/node": "20.19.11",
70
71
  "@typescript-eslint/parser": "8.72.0",
@@ -114,6 +115,8 @@
114
115
  "release:prepare": "pnpm context-graph:publication-check && node scripts/release.mjs --prepare",
115
116
  "release:publish": "node scripts/release.mjs --publish",
116
117
  "govern": "tsx src/cli.ts govern --policy architecture.policy.json --output .context-graph/architecture-report.json",
117
- "weftlet": "tsx src/cli.ts"
118
+ "weftlet": "tsx src/cli.ts",
119
+ "changeset": "changeset",
120
+ "release:version": "node scripts/version-packages.mjs"
118
121
  }
119
122
  }