Skip to content

Commit ea293d9

Browse files
authored
Merge pull request #62 from lorem-dev/release/0.7.1
release: 0.7.1
2 parents 876a070 + bb36052 commit ea293d9

84 files changed

Lines changed: 3615 additions & 311 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.agents/skills/check-changes/SKILL.md‎

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,21 @@ release.
3232
Open `CHANGES.md` and extract every bullet under `## Development`.
3333

3434
4. **Cross-reference.**
35-
For each commit that represents a user-visible change (type `feat`, `fix`,
36-
`refactor`, or `perf`), check whether a corresponding bullet exists in the
37-
Development section. A bullet does not need to quote the commit message
38-
verbatim -- it only needs to describe the same change at a short summary
39-
level.
35+
`CHANGES.md` opens with a comment block stating what qualifies for an entry.
36+
Read it first; it is authoritative and the rules below restate only what
37+
this check needs.
38+
39+
A commit needs a bullet when it adds something a user can use, changes
40+
behaviour they would be surprised by, removes something, or fixes a bug
41+
that was BROKEN IN A RELEASED VERSION. A bullet does not need to quote the
42+
commit message -- it only needs to describe the same change.
43+
44+
A commit does NOT need one when it is refactoring, a test, CI, an internal
45+
rename, or a dependency bump with no user-visible effect. Nor when it fixes
46+
a bug that never shipped: if the last released version did not have the
47+
defect, the changelog has nothing to say about it. That case is common on a
48+
long branch and is the one most often reported as a false gap -- check the
49+
bug's origin before flagging a missing entry, not just the commit's type.
4050

4151
5. **Check each bullet against the length rule.**
4252
Per the "Changelog Entries" section of CONTRIBUTING.md, a bullet is at most
@@ -45,15 +55,23 @@ release.
4555
ones that exceed it, with their count. Do not measure released `## Version`
4656
sections -- a section is frozen once cut and is never rewritten.
4757

48-
6. **Report findings.**
58+
6. **Check the section against the entry-count limits.**
59+
`CHANGES.md`'s comment block sets a soft limit of **10** bullets per version
60+
section and a hard limit of **50**, counting every bullet across its
61+
subsections. Report the count. Over the soft limit, name the entries that
62+
look mergeable or cuttable. Over the hard limit, say plainly that the
63+
release must not ship until they are merged or cut.
64+
65+
7. **Report findings.**
4966
- List commits with NO changelog entry (missing entries -- these must be
5067
added).
5168
- List changelog bullets that appear to describe nothing in the commit
5269
history (stale or speculative entries -- flag for author review).
5370
- List bullets over the 25-word limit, each with its count, and propose a
5471
shorter wording.
72+
- Report the section's bullet count against the soft and hard limits.
5573
- If everything matches, report "CHANGES.md is current."
5674

57-
7. **Do not edit CHANGES.md automatically.**
75+
8. **Do not edit CHANGES.md automatically.**
5876
Propose the missing bullets in your report and let the developer apply them.
5977
The developer owns the changelog wording.

‎.agents/skills/check-docs/SKILL.md‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,12 @@ Verify that all project documentation is accurate and up to date.
4545
(e.g., `1.0.0`) must match the version in root `package.json`.
4646

4747
6. **Check CHANGES.md structure.**
48-
Confirm the file starts with a `## Development` section and that previous
49-
release sections follow the `## Version X.Y.Z` heading format (no date).
48+
Confirm the file carries its rules comment block, that `## Development` is
49+
the first heading after it, and that previous release sections follow the
50+
`## Version X.Y.Z` heading format (no date). The block sits above
51+
`## Development` on purpose: `release-notes.mjs` extracts only from a
52+
`## Version` heading to the next `## `, so anything above the first one
53+
never reaches a GitHub release.
5054

5155
7. **Report.**
5256
List every issue found (missing files, broken nav links, stale commands,

‎.agents/skills/check-fixture-repo/SKILL.md‎

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ its own README explains what each fixture drives.
2424

2525
## Isolation
2626

27-
The suite never touches the developer's machine state. `e2e/src/cli.ts` is the
27+
The suite never touches the developer's machine state. `e2e/cli/src/cli.ts` is the
2828
only way a spec can invoke the CLI, and it always sets **both**:
2929

3030
- `XDG_CONFIG_HOME`, which relocates `state.json` and `config.yaml`
@@ -42,13 +42,13 @@ the machine -- which is why the harness owns them rather than each spec.
4242
### 1. Run the suite
4343

4444
```bash
45-
pnpm test:e2e
45+
pnpm test:e2e:cli
4646
```
4747

4848
That is the whole check. The script behind it
4949
(`scripts/e2e-prepare.mjs`) initializes the fixture submodule, force-pulls it to
5050
the tip of its branch, and builds `target/debug/skillkeeper`; Jest then runs the
51-
specs in `e2e/tests/`.
51+
specs in `e2e/cli/tests/`.
5252

5353
Set `SKILLKEEPER_E2E_PIN_FIXTURE=1` to run against the fixture commit this
5454
repository pins instead of pulling. CI does that for reproducibility; locally
@@ -61,11 +61,13 @@ to look:
6161

6262
| spec | covers | a failure means |
6363
|---|---|---|
64-
| `e2e/tests/fixture.spec.ts` | the submodule is checked out, ASCII-only, and still has the manifests and file modes the rest of the suite assumes | the **fixture** drifted |
65-
| `e2e/tests/skills.spec.ts` | resolution schemes, `.skid.yml` identity, nested body paths, selective `+x`, guidance precedence, hook merge and consent, the delimited-text region, and both silent-failure modes of the resolver | the **product** changed |
66-
| `e2e/tests/mcp.spec.ts` | preset discovery including the group-scoped file, parameter substitution, both ledger files, the `.gitignore` guard for the secrets file, rules rendering, instance-name allocation, the Codex stdio-only skip, and removal | the **product** changed |
67-
| `e2e/tests/repair.spec.ts` | `verify` -> `repair` -> `verify`, directory pruning, the bounds that keep repair inside the repaired skill, and uninstall reversing hooks and guidance | the **product** changed |
68-
| `e2e/tests/requires.spec.ts` | skill dependencies: every `repo lint` code the `requires` group triggers, the single-document `--json` form, both target-misuse exits, the transitive install closure, and the uninstall breakage report | the **product** changed |
64+
| `e2e/cli/tests/fixture.spec.ts` | the submodule is checked out, ASCII-only, and still has the manifests and file modes the rest of the suite assumes | the **fixture** drifted |
65+
| `e2e/cli/tests/skills.spec.ts` | resolution schemes, `.skid.yml` identity, nested body paths, selective `+x`, guidance precedence, hook merge and consent, the delimited-text region, and both silent-failure modes of the resolver | the **product** changed |
66+
| `e2e/cli/tests/mcp.spec.ts` | preset discovery including the group-scoped file, parameter substitution, both ledger files, the `.gitignore` guard for the secrets file, rules rendering, instance-name allocation, the Codex stdio-only skip, and removal | the **product** changed |
67+
| `e2e/cli/tests/mcp-oauth.spec.ts` | the oauth preset's exact per-agent native shape, the copilot skip, that no agent's config ever carries a client secret, and `repo lint` on the deliberately invalid oauth preset | the **product** changed |
68+
| `e2e/cli/tests/mcp-parameters.spec.ts` | link rendering, description truncation, option-value validation on install, and every mcp lint warning a description or parameter can trigger | the **product** changed |
69+
| `e2e/cli/tests/repair.spec.ts` | `verify` -> `repair` -> `verify`, directory pruning, the bounds that keep repair inside the repaired skill, and uninstall reversing hooks and guidance | the **product** changed |
70+
| `e2e/cli/tests/requires.spec.ts` | skill dependencies: every `repo lint` code the `requires` group triggers, the single-document `--json` form, both target-misuse exits, the transitive install closure, and the uninstall breakage report | the **product** changed |
6971

7072
If `fixture.spec.ts` fails, fix or re-pin the fixture. If it passes and another
7173
spec fails, the CLI's behaviour moved and the fixture is telling you so.
@@ -90,7 +92,7 @@ git -C examples/test-repo status --porcelain # expect clean
9092
```
9193

9294
Every spec runs the CLI with throwaway `HOME` and `XDG_CONFIG_HOME`
93-
(`e2e/src/cli.ts`), so a dirty tree here means a test wrote somewhere it should
95+
(`e2e/cli/src/cli.ts`), so a dirty tree here means a test wrote somewhere it should
9496
not have -- a blocker, and a harness defect rather than a product one.
9597

9698
Note that a force-pull may legitimately leave the submodule pointer moved; that
@@ -103,7 +105,7 @@ commit the bump on its own.
103105
Jest already reports per-test results, so summarize rather than restate:
104106

105107
```
106-
pnpm test:e2e: PASS / FAIL (N passed, N failed of 51)
108+
pnpm test:e2e:cli: PASS / FAIL (N passed, N failed of 67)
107109
failing spec(s): <file> -> <test name>
108110
attributed to: fixture drift / product change / harness defect
109111
working tree clean after: yes / no

‎.github/workflows/backmerge.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
open-backmerge-pr:
2222
runs-on: ubuntu-latest
2323
steps:
24-
- uses: actions/checkout@v5
24+
- uses: actions/checkout@v7
2525
with:
2626
fetch-depth: 0
2727

‎.github/workflows/ci.yml‎

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444

4545
steps:
4646
- name: Checkout repository
47-
uses: actions/checkout@v5
47+
uses: actions/checkout@v7
4848
with:
4949
# Fetch LFS blobs (png/ttf/woff2): the icon generator and the font
5050
# assets read real bytes, not the LFS pointer text.
@@ -82,6 +82,9 @@ jobs:
8282
- name: Type-check
8383
run: pnpm typecheck
8484

85+
- name: Check formatting
86+
run: pnpm format:check
87+
8588
- name: Test with coverage (90% gate)
8689
# vitest run --coverage enforces the thresholds defined in vitest.config.ts.
8790
# The build fails if lines or branches fall below 90%.
@@ -97,7 +100,7 @@ jobs:
97100

98101
steps:
99102
- name: Checkout repository
100-
uses: actions/checkout@v5
103+
uses: actions/checkout@v7
101104
with:
102105
# Fetch LFS blobs (png/ttf/woff2): the icon generator and the font
103106
# assets read real bytes, not the LFS pointer text.
@@ -228,7 +231,7 @@ jobs:
228231

229232
steps:
230233
- name: Checkout repository
231-
uses: actions/checkout@v5
234+
uses: actions/checkout@v7
232235
with:
233236
# Nothing this job reads is LFS-tracked today, but fetch the blobs
234237
# anyway: if a fixture or an asset the CLI touches ever becomes
@@ -262,10 +265,74 @@ jobs:
262265

263266
# The suite drives only the CLI crate, which does not link the webview, so
264267
# the Tauri system libraries the `rust` job installs are not needed here.
268+
# Explicitly the CLI half, not `pnpm test:e2e`: this job has no
269+
# Playwright browser install, so the desktop half would fail with
270+
# "browserType.launch: Executable doesn't exist" here. The desktop half
271+
# runs in its own `desktop-e2e` job below, which does install Chromium.
265272
- name: Run the end-to-end suite
266273
# Pin the fixture to the commit this repository records: a CI run must be
267274
# reproducible and fail for reasons in the diff, not because the fixture
268275
# moved. Locally the same script force-pulls instead.
269276
env:
270277
SKILLKEEPER_E2E_PIN_FIXTURE: '1'
271-
run: pnpm test:e2e
278+
run: pnpm test:e2e:cli
279+
280+
desktop-e2e:
281+
name: Desktop UI (Playwright)
282+
runs-on: ubuntu-latest
283+
timeout-minutes: 20
284+
285+
steps:
286+
- name: Checkout repository
287+
uses: actions/checkout@v7
288+
with:
289+
lfs: false
290+
submodules: false
291+
292+
- name: Enable pnpm via corepack
293+
run: corepack enable
294+
295+
- name: Set up Node.js with pnpm cache
296+
uses: actions/setup-node@v5
297+
with:
298+
node-version: '24'
299+
cache: pnpm
300+
301+
- name: Install dependencies (frozen lockfile)
302+
run: pnpm install --frozen-lockfile
303+
304+
- name: Generate localization catalogs
305+
run: pnpm run i18n
306+
307+
# Keyed on the whole lockfile, not just the Playwright package version:
308+
# a browser build is ~150MB, so caching it is worth doing, but the key
309+
# deliberately errs coarse. Keying on a parsed-out Playwright version
310+
# instead would risk a bump the parsing misses reusing a stale,
311+
# mismatched browser binary; hashing the full lockfile instead means an
312+
# occasional needless re-download on an unrelated dependency bump,
313+
# which is the safe direction to be wrong in.
314+
- name: Cache the Playwright browser
315+
id: playwright-cache
316+
uses: actions/cache@v6
317+
with:
318+
path: ~/.cache/ms-playwright
319+
key: playwright-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }}
320+
321+
- name: Install Chromium
322+
run: pnpm exec playwright install --with-deps chromium
323+
324+
# No separate "build the renderer" step here: playwright.config.ts
325+
# chains `frontend:build` into the webServer command so every run
326+
# boots a fresh bundle, and a build failure surfaces as the webServer
327+
# failing to come up. A second, earlier build step would only repeat
328+
# that work.
329+
- name: Run the desktop UI suite
330+
run: pnpm test:e2e:desktop
331+
332+
- name: Upload the report on failure
333+
if: failure()
334+
uses: actions/upload-artifact@v7
335+
with:
336+
name: playwright-report
337+
path: playwright-report/
338+
retention-days: 7

‎.github/workflows/codeql.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ jobs:
6666

6767
steps:
6868
- name: Checkout repository
69-
uses: actions/checkout@v5
69+
uses: actions/checkout@v7
7070
with:
7171
# No LFS and no submodules on purpose. CodeQL reads source, not
7272
# binary assets, and examples/test-repo is a fixture whose contents
@@ -106,7 +106,7 @@ jobs:
106106

107107
steps:
108108
- name: Checkout repository
109-
uses: actions/checkout@v5
109+
uses: actions/checkout@v7
110110
with:
111111
lfs: false
112112
submodules: false

‎.github/workflows/docs.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444

4545
steps:
4646
- name: Checkout repository
47-
uses: actions/checkout@v5
47+
uses: actions/checkout@v7
4848
with:
4949
# mike needs full history plus the gh-pages branch it maintains.
5050
fetch-depth: 0
@@ -54,7 +54,7 @@ jobs:
5454
lfs: true
5555

5656
- name: Install uv
57-
uses: astral-sh/setup-uv@37802adc94f370d6bfd71619e3f0bf239e1f3b78 # v7.6.0
57+
uses: astral-sh/setup-uv@20cfd1bf945f4377ade1205e4dbc17946fc9a30d # v10.0.1
5858

5959
- name: Configure git identity for mike
6060
run: |

‎.github/workflows/release.yml‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ jobs:
4949

5050
steps:
5151
- name: Checkout repository
52-
uses: actions/checkout@v5
52+
uses: actions/checkout@v7
5353
with:
5454
# check-tag-branch.mjs asks whether the tag is reachable from main or
5555
# develop, which needs the full history and those branch refs -- a
@@ -143,7 +143,7 @@ jobs:
143143

144144
steps:
145145
- name: Checkout repository
146-
uses: actions/checkout@v5
146+
uses: actions/checkout@v7
147147
with:
148148
# The desktop build needs real binary assets (LFS-tracked fonts and
149149
# icon source PNGs), not LFS pointer files.
@@ -266,7 +266,7 @@ jobs:
266266
} >> "$GITHUB_ENV"
267267
268268
- name: Build the app (Tauri)
269-
uses: tauri-apps/tauri-action@84b9d35b5fc46c1e45415bdb6144030364f7ebc5 # v0.6.2
269+
uses: tauri-apps/tauri-action@1deb371b0cd8bd54025b384f1cd735e725c4060f # v1.0.0
270270
env:
271271
# macOS signing is injected via $GITHUB_ENV by "Configure Apple code
272272
# signing" above, and only when a certificate secret is set. The
@@ -454,7 +454,7 @@ jobs:
454454
# dir (linux/windows) and the cross-target dir (macOS --target).
455455
# -----------------------------------------------------------------------
456456
- name: Upload artifacts
457-
uses: actions/upload-artifact@v6
457+
uses: actions/upload-artifact@v7
458458
with:
459459
name: skillkeeper-${{ github.ref_name }}-${{ matrix.target }}
460460
path: |
@@ -488,7 +488,7 @@ jobs:
488488

489489
steps:
490490
- name: Checkout repository
491-
uses: actions/checkout@v5
491+
uses: actions/checkout@v7
492492

493493
- name: Set up Node.js 22
494494
uses: actions/setup-node@v5
@@ -503,7 +503,7 @@ jobs:
503503
run: node scripts/release-notes.mjs
504504

505505
- name: Download all artifacts
506-
uses: actions/download-artifact@v7
506+
uses: actions/download-artifact@v8
507507
with:
508508
path: dist-all
509509

‎.gitignore‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,17 @@ Thumbs.db
3131
# Storybook
3232
apps/desktop/storybook-static/
3333

34+
# Playwright: `outputDir`'s default walks up from the config file's directory
35+
# (e2e/desktop/) to the nearest package.json and appends test-results/ to
36+
# THAT directory -- today that lands at the repository root (e2e/desktop/ has
37+
# no package.json of its own), but that is one `e2e/desktop/package.json` away
38+
# from moving to e2e/desktop/test-results/ (see e2e/cli/package.json for a
39+
# sibling suite that already has one). No leading slash, so these match
40+
# wherever it actually lands rather than assuming which.
41+
test-results/
42+
playwright-report/
43+
blob-report/
44+
3445
# Documentation site (mkdocs + uv): uv caches the tools globally, but keep any
3546
# local Python virtualenv and the rendered static site out of git.
3647
.venv/

0 commit comments

Comments
 (0)