chore: release v0.20.42

This commit is contained in:
Ulas Kalayci
2026-04-21 10:38:45 +02:00
parent d1ec7367a0
commit 8f55855364
16 changed files with 375 additions and 5 deletions
+36
View File
@@ -0,0 +1,36 @@
---
name: fix-issue
description: Take a GitHub issue from triage through a PR on a fix/<id> branch
disable-model-invocation: true
user-invocable: true
argument-hint: "<issue-number>"
allowed-tools:
- Bash(gh issue *)
- Bash(gh pr *)
- Bash(git checkout *)
- Bash(git add *)
- Bash(git commit *)
- Bash(git push *)
- Bash(npm test *)
- Bash(npm run test:*)
- Read
- Edit
- Write
- Grep
- Glob
---
Run from inside `oikos/`. `$1` is the issue number.
1. **Load context**`gh issue view $1 --repo ulsklyc/oikos --comments`. Read linked PRs, commits, related issues. Stop and report if the issue is already closed or duplicated.
2. **Triage before coding** — classify: bug, enhancement, question, invalid. If reproduction steps are missing or scope is unclear, post a question via `gh issue comment $1 --body "..."` and stop. Do not guess intent.
3. **Branch + implement**`git checkout -b fix/$1`. Make the minimal change that solves the reported problem. Respect the Hard Constraints from CLAUDE.md. Add or extend a `test-<module>.js` suite that would have caught the bug. Run `npm test` — all suites must pass before moving on.
4. **Ship**`git add` only the files actually changed by this fix, commit with a Conventional Commit subject (`fix: <short summary> (#$1)`), push `git push -u origin fix/$1`, then `gh pr create --fill --base main` with a body that closes the issue (`Closes #$1`) and summarises root cause + fix.
## Guardrails
- Never work on `main` directly. If you're accidentally on `main`, stop and switch.
- Never bypass the PostToolUse innerHTML hook. If it fires, fix the DOM code — don't disable the hook.
- Never `git add -A` or `git add .`. Stage files by name.
- If the fix needs a DB change, it goes into a NEW entry at the end of the `migrations` array in `server/db.js`. Never edit existing entries.
- Do not run the `release-prep` skill here — releases happen after the PR is merged, on `main`.
+31
View File
@@ -0,0 +1,31 @@
---
name: issue-triage
description: Classify one or all open issues, apply labels, request missing info
disable-model-invocation: true
user-invocable: true
argument-hint: "[<issue-number> | all]"
allowed-tools:
- Bash(gh issue *)
- Bash(gh label *)
- Read
- Grep
---
Run from inside `oikos/`. `$1` is a specific issue number or the literal `all` (default: `all` → every open issue without labels).
1. **Load** — for a single issue: `gh issue view $1 --repo ulsklyc/oikos --comments`. For `all`: `gh issue list --repo ulsklyc/oikos --state open --label '' --json number,title,body,author,createdAt`.
2. **Classify** — for each issue, pick ONE primary class and apply labels via `gh issue edit <n> --repo ulsklyc/oikos --add-label "<labels>"`:
- `bug` — reproduction + expected vs. actual behaviour present and plausible against current code
- `enhancement` — new feature or UX improvement, no existing regression
- `question` — user needs help using Oikos, not a code change
- `invalid` — spam, duplicate, or out of scope (self-hosted family planner)
Add area labels where obvious: `calendar`, `tasks`, `shopping`, `meals`, `budget`, `notes`, `contacts`, `reminders`, `i18n`, `pwa`, `security`, `docs`.
3. **Request missing info** — if reproduction steps, expected behaviour, Oikos version, or browser are missing on a `bug`, post a single comment asking for exactly what's missing. Apply label `needs-info`.
4. **Close spam/duplicates**`gh issue close <n> --repo ulsklyc/oikos --reason "not planned" --comment "<english explanation>"`. Always leave a reason.
## Guardrails
- Never assign issues to other humans.
- Never post more than one triage comment per issue per run.
- All comments in English.
- If unsure between two classes, default to `question` and ask for clarification — don't guess.
+41
View File
@@ -0,0 +1,41 @@
---
name: pr-review
description: Review a PR against the Oikos Hard Constraints and decide close/request-changes/merge
disable-model-invocation: true
user-invocable: true
argument-hint: "<pr-number>"
allowed-tools:
- Bash(gh pr *)
- Bash(gh api *)
- Bash(git *)
- Bash(npm test *)
- Bash(npm run test:*)
- Read
- Grep
- Glob
---
Run from inside `oikos/`. `$1` is the PR number.
1. **Fetch**`gh pr view $1 --repo ulsklyc/oikos`, `gh pr diff $1 --repo ulsklyc/oikos`, `gh pr checks $1 --repo ulsklyc/oikos`. Note failing checks. Delegate the deep read to the `pr-reviewer` subagent (`Agent({ subagent_type: "pr-reviewer", ... })`) so main-thread context stays free.
2. **Constraint check** — walk the diff against CLAUDE.md Hard Constraints:
- No frontend frameworks / bundlers / CSS libraries added
- No `require`, only `import`/`export`
- No `eval`, no `innerHTML`
- All UI text via `t('key')`; `de` locale updated
- Migrations append-only (`server/db.js`)
- Design values from `public/styles/tokens.css`
- Route handlers wrapped in try/catch
- API shape `{ data }` / `{ error, code }`
Also check: PR has tests touching the relevant `test-<module>.js`, CHANGELOG entry under `## [Unreleased]`, commit subjects are Conventional Commits.
3. **Decide**
- **Blocking issue found** → `gh pr review $1 --request-changes --body "<english, grouped by file:line>"` and stop.
- **Not a fit** → explain politely and `gh pr close $1 --comment "..."`.
- **Clean** → `gh pr review $1 --approve --body "LGTM"` then `gh pr merge $1 --squash --delete-branch`. After merge, fetch `main` locally and consider running `/release-prep`.
## Guardrails
- Comments and review bodies: always English.
- Never merge with failing required checks. Never force-merge.
- Never close a PR without a reason comment — silent closes burn contributor trust.
- Never push directly to the PR branch. If a small fix is warranted, ask the contributor.
+37
View File
@@ -0,0 +1,37 @@
---
name: release-prep
description: Bump patch version, update CHANGELOG, commit, tag, push and create GitHub release
disable-model-invocation: true
user-invocable: true
argument-hint: "[patch|minor|major]"
allowed-tools:
- Read
- Edit
- Bash(npm version *)
- Bash(git add *)
- Bash(git commit *)
- Bash(git tag *)
- Bash(git push *)
- Bash(gh release create *)
- Bash(git status *)
- Bash(git log *)
- Bash(git diff *)
---
Run from inside `oikos/`. Argument selects the semver bump (default: patch).
1. **Pre-flight** — run `git status` and `git diff --staged`. Abort if the tree is dirty with unrelated files. Summarise the pending changes.
2. **CHANGELOG** — open `oikos/CHANGELOG.md`. Insert a new `## [X.Y.Z] - YYYY-MM-DD` block immediately below `## [Unreleased]`. Use today's date from the `currentDate` context. Only use Keep-a-Changelog sections: `### Added`, `### Changed`, `### Fixed`, `### Removed`, `### Security`. One bullet per user-facing change in English. Never invent entries that aren't in the diff.
3. **Version bump** — run `npm version ${1:-patch} --no-git-tag-version`. Read the new version from `oikos/package.json`.
4. **Stage**`git add oikos/CHANGELOG.md oikos/package.json oikos/package-lock.json` plus any other files from the task. Never use `git add -A` or `git add .`.
5. **Commit**`git commit -m "chore: release vX.Y.Z"`. Do not pass `--no-verify`. If a hook fails, fix the cause and create a new commit.
6. **Tag**`git tag vX.Y.Z`.
7. **Push**`git push && git push --tags`.
8. **GitHub Release**`gh release create vX.Y.Z --repo ulsklyc/oikos --title "vX.Y.Z" --notes "<CHANGELOG block body>"`. Paste the new CHANGELOG section verbatim as notes.
## Guardrails
- Never `--force`, never `--no-verify`, never `--no-gpg-sign`.
- The `GH_TOKEN` must come from the shell environment, never from a hard-coded literal in this file or in commit messages.
- If `gh release create` fails with a 401/403, stop and report — do not paste a token inline.
- If `git status` shows uncommitted work unrelated to the release, stop and ask the user.