Release v5.2.8 (#3375)

Upgrades to Better Auth 1.7, expands Custom Styles coverage of item headers, and adds a human-approval step to the AI agent's resume edits.

Breaking for self-hosters using a custom OAuth provider: the callback path changes from /api/auth/oauth2/callback/custom to /api/auth/callback/custom, and installs using OAUTH_DISCOVERY_URL need one additional UPDATE after upgrading. Both are documented in docs/self-hosting/sso.mdx.

- Better Auth 1.7, with the account issuer migration and the jwks alg/crv columns the 1.7 jwt plugin requires
- Agent edits gated behind an approval step, with crash-safe runs and context pruning
- item-header now covers every section header row on every template; adds the item-header-row part
- Fixes provider unlinking, auth error messages, and version conflicts on freshly created resumes
- New /auth/error page, translated across all 53 target locales
- DeepSeek Harness plugin moved into packages/dsh-plugin
- Dependency bumps across the workspace
This commit is contained in:
Amruth Pillai
2026-08-24 21:44:16 +02:00
committed by GitHub
parent 3221afda9d
commit 3c195dc3f8
160 changed files with 17743 additions and 3892 deletions
+42
View File
@@ -0,0 +1,42 @@
# Domain Docs
How engineering skills consume this repositorys domain documentation.
## Before exploring, read these
- **`CONTEXT-MAP.md`** at repository root. It points to context-specific `CONTEXT.md` files. Read each context relevant to current work.
- **`docs/adr/`** for system-wide decisions touching current area.
- Context-scoped ADR directories referenced by `CONTEXT-MAP.md`.
If any file does not exist, proceed silently. Do not flag absence or suggest creating it upfront. `/domain-modeling` creates domain documents lazily when terminology or decisions become settled.
## File structure
This repository uses a multi-context layout:
```text
/
├── CONTEXT-MAP.md
├── docs/adr/ ← system-wide decisions
├── apps/
│ └── <context>/
│ └── CONTEXT.md
└── packages/
└── <context>/
├── CONTEXT.md
└── docs/adr/ ← context-specific decisions
```
`CONTEXT-MAP.md` is authoritative for context boundaries. Not every app or package needs a `CONTEXT.md`; create one only when it represents a meaningful domain context.
## Use glossary vocabulary
When output names a domain concept—in issue titles, refactor proposals, hypotheses, or test names—use terms defined in relevant `CONTEXT.md`. Do not drift to explicitly avoided synonyms.
Missing terminology signals either language foreign to project or genuine domain-model gap. Reconsider first; otherwise note gap for `/domain-modeling`.
## Flag ADR conflicts
If output contradicts existing ADR, surface conflict explicitly instead of silently overriding:
> _Contradicts ADR-0007 (event-sourced orders), but worth reopening because…_
+45
View File
@@ -0,0 +1,45 @@
# Issue tracker: GitHub
Issues and specs for this repo live as GitHub issues. Use the `gh` CLI for all operations.
## Conventions
- **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies.
- **Read an issue**: `gh issue view <number> --comments`, filtering comments by `jq` and also fetching labels.
- **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters.
- **Comment on an issue**: `gh issue comment <number> --body "..."`
- **Apply / remove labels**: `gh issue edit <number> --add-label "..."` / `--remove-label "..."`
- **Close**: `gh issue close <number> --comment "..."`
Infer the repo from `git remote -v`; `gh` does this automatically when run inside a clone.
## Pull requests as a triage surface
**PRs as a request surface: no.** _(Set to `yes` if this repo treats external PRs as feature requests; `/triage` reads this flag.)_
When set to `yes`, PRs run through the same labels and states as issues, using the `gh pr` equivalents:
- **Read a PR**: `gh pr view <number> --comments` and `gh pr diff <number>` for the diff.
- **List external PRs for triage**: `gh pr list --state open --json number,title,body,labels,author,authorAssociation,comments` then keep only `authorAssociation` of `CONTRIBUTOR`, `FIRST_TIME_CONTRIBUTOR`, or `NONE`.
- **Comment / label / close**: `gh pr comment`, `gh pr edit --add-label`/`--remove-label`, `gh pr close`.
GitHub shares one number space across issues and PRs. Resolve bare `#42` with `gh pr view 42`, then fall back to `gh issue view 42`.
## When a skill says "publish to the issue tracker"
Create a GitHub issue.
## When a skill says "fetch the relevant ticket"
Run `gh issue view <number> --comments`.
## Wayfinding operations
Used by `/wayfinder`. Map is one issue with child issues as tickets.
- **Map**: issue labelled `wayfinder:map`, holding Notes / Decisions-so-far / Fog. Create with `gh issue create --label wayfinder:map`.
- **Child ticket**: issue linked as a GitHub sub-issue. Where sub-issues are unavailable, add it to a task list in map body and put `Part of #<map>` atop child body. Labels: `wayfinder:<type>` (`research`, `prototype`, `grilling`, or `task`). Assign ticket to driving developer once claimed.
- **Blocking**: use GitHub native issue dependencies. Add with `gh api --method POST repos/<owner>/<repo>/issues/<child>/dependencies/blocked_by -F issue_id=<blocker-db-id>`, where database ID comes from `gh api repos/<owner>/<repo>/issues/<n> --jq .id`. Where unavailable, use `Blocked by: #<n>, #<n>` atop child body.
- **Frontier query**: list maps open children, drop assigned tickets and tickets with open blockers, then select first in map order.
- **Claim**: `gh issue edit <n> --add-assignee @me`.
- **Resolve**: comment with answer, close child, then append context pointer to maps Decisions-so-far.
+35
View File
@@ -4,6 +4,41 @@ description: "Release notes for Reactive Resume covering new features, resume bu
rss: true
---
<Update label="v5.2.8" description="24th August 2026">
## Highlights
- **The AI agent now asks before it edits your resume.** Changes arrive as a proposal you approve or reject, so you see what the assistant wants to touch before anything is written. Once you trust a conversation, you can turn the review step off for that thread alone. The agent also survives a server restart mid-reply instead of leaving the thread stuck, and long conversations are trimmed as they grow so they keep working past the point they used to stall. [c8081ac2f](https://github.com/amruthpillai/reactive-resume/commit/c8081ac2f)
- **Custom Styles can finally reach every item header.** `item-header` used to match only some sections, and on stacked headers only the first row — certifications, awards, projects, publications and references quietly ignored it. It now covers the full header row of every section on every template, and a new `item-header-row` part lets you stop a long title from pushing its trailing date onto a line of its own. [4d53a6d1d](https://github.com/amruthpillai/reactive-resume/commit/4d53a6d1d), [00be67f70](https://github.com/amruthpillai/reactive-resume/commit/00be67f70)
- **Self-hosters using a custom OAuth provider must update one URL.** The callback path changed from `/api/auth/oauth2/callback/custom` to `/api/auth/callback/custom`. Update the redirect URI registered with your identity provider before upgrading, or custom sign-in will fail. Installs that use `OAUTH_DISCOVERY_URL` need one additional SQL statement — both steps are written up in the [SSO documentation](https://docs.rxresu.me/self-hosting/sso). [bdac806c7](https://github.com/amruthpillai/reactive-resume/commit/bdac806c7)
## AI Agent
- Resume edits are gated behind an approval step, with a per-conversation setting to skip it once you are comfortable. Tool activity, token usage, and each step the assistant takes are now visible in the thread. [c8081ac2f](https://github.com/amruthpillai/reactive-resume/commit/c8081ac2f)
- Copying a conversation as JSON no longer embeds full resume documents, so the file stays small and your resume content does not travel with a transcript you might paste elsewhere. [8ce899a04](https://github.com/amruthpillai/reactive-resume/commit/8ce899a04)
- Resume analysis is told today's date, so it no longer misjudges how recent your most recent role is. Thanks to [@emanuelet](https://github.com/emanuelet). [#3353](https://github.com/amruthpillai/reactive-resume/pull/3353)
- Agent edits to a newly created resume no longer fail permanently with a version conflict. [39f36b4ac](https://github.com/amruthpillai/reactive-resume/commit/39f36b4ac)
## Custom Styles
- `item-header` now applies to the whole header row of every section on every template, instead of being silently dropped on sections whose header did not start with the one element it looked for. Rendered output is unchanged apart from the rows that should have been styled all along. [4d53a6d1d](https://github.com/amruthpillai/reactive-resume/commit/4d53a6d1d)
- Added `template-part[name="item-header-row"]`, the split row holding a title and its trailing date. Set `flex-wrap: nowrap` on it to keep the date pinned right down a long list of certifications. [00be67f70](https://github.com/amruthpillai/reactive-resume/commit/00be67f70)
- Under `nowrap`, long item titles no longer overlap the date beside them. [ebcaa4729](https://github.com/amruthpillai/reactive-resume/commit/ebcaa4729)
## Accounts & Sign-in
- Disconnecting a linked provider works again. Sessions last a week, but the unlink endpoint rejected any session older than a day, so the button failed for nearly everyone. [39590eaff](https://github.com/amruthpillai/reactive-resume/commit/39590eaff)
- Sign-in and account errors now show the actual reason instead of collapsing to a generic message. [39590eaff](https://github.com/amruthpillai/reactive-resume/commit/39590eaff)
- Sign-in failures that happen before your provider can redirect you now land on a proper page explaining what went wrong, translated into every supported language, rather than a wall of JSON. [bdac806c7](https://github.com/amruthpillai/reactive-resume/commit/bdac806c7), [b960e3273](https://github.com/amruthpillai/reactive-resume/commit/b960e3273)
## Self-Hosting & Maintenance
- Upgraded to Better Auth 1.7. Beyond the callback URL change above, accounts are now identified by the issuer your provider advertises; the startup migration backfills existing accounts and refuses to proceed if the backfill would merge two accounts together. [bdac806c7](https://github.com/amruthpillai/reactive-resume/commit/bdac806c7)
- The DeepSeek Harness plugin now lives in this repository and is published from it. It reads MCP tool names directly from the server, so a renamed tool breaks its prompt guide in the same pull request rather than days later through a scheduled job. [65618a82a](https://github.com/amruthpillai/reactive-resume/commit/65618a82a)
- Routine dependency updates across the workspace, including the AI SDK providers, the PDF renderer, and the build toolchain. [8ffe50a58](https://github.com/amruthpillai/reactive-resume/commit/8ffe50a58)
**Full Changelog**: [v5.2.7...v5.2.8](https://github.com/amruthpillai/reactive-resume/compare/v5.2.7...v5.2.8)
</Update>
<Update label="v5.2.7" description="17th August 2026">
## Highlights
+27 -6
View File
@@ -72,13 +72,13 @@ You must configure endpoints using **one** of these two methods:
When configuring your OAuth provider, you'll need to set the **callback URL** (also called redirect URI). Use the following format:
```
{APP_URL}/api/auth/oauth2/callback/custom
{APP_URL}/api/auth/callback/custom
```
For example, if your `APP_URL` is `https://resume.example.com`, the callback URL would be:
```
https://resume.example.com/api/auth/oauth2/callback/custom
https://resume.example.com/api/auth/callback/custom
```
<Warning>
@@ -86,6 +86,27 @@ https://resume.example.com/api/auth/oauth2/callback/custom
authentication to fail.
</Warning>
<Warning>
**Upgrading an existing install:** the callback path changed from `/api/auth/oauth2/callback/custom` to
`/api/auth/callback/custom`. Update the redirect URI registered with your identity provider, or custom OAuth
sign-in will fail after the upgrade.
</Warning>
<Warning>
**Upgrading an existing install with `OAUTH_DISCOVERY_URL`:** accounts are now identified by the issuer your
provider advertises, and the automatic migration cannot know that value ahead of time. It backfills existing
rows with the placeholder `local:oauth:custom`. After upgrading, run the following once, replacing the value
with the `issuer` field from your discovery document (`{OAUTH_DISCOVERY_URL}` returns it as JSON):
```sql
UPDATE account SET issuer = 'https://auth.example.com/realms/main' WHERE provider_id = 'custom';
```
Skipping this does not lose data, but existing users signing in through your provider will no longer match
their account. If you configure the provider with explicit `OAUTH_AUTHORIZATION_URL` / `OAUTH_TOKEN_URL`
endpoints instead of discovery, the placeholder is already correct and no action is needed.
</Warning>
<Info>
Built-in providers (Google, GitHub, LinkedIn) use callback URLs in this format: `{APP_URL}/api/auth/callback/
{provider}` (for example `.../google`, `.../github`, `.../linkedin`).
@@ -124,7 +145,7 @@ Reactive Resume automatically maps user profile data from the OAuth provider. Th
- **Name**: Reactive Resume
- **Authorization flow**: Use your preferred authorization flow
- **Client type**: Confidential
- **Redirect URIs**: `https://resume.example.com/api/auth/oauth2/callback/custom`
- **Redirect URIs**: `https://resume.example.com/api/auth/callback/custom`
</Step>
@@ -165,7 +186,7 @@ identity_providers:
public: false
authorization_policy: two_factor # or one_factor
redirect_uris:
- https://resume.example.com/api/auth/oauth2/callback/custom
- https://resume.example.com/api/auth/callback/custom
scopes:
- openid
- profile
@@ -211,7 +232,7 @@ OAUTH_DISCOVERY_URL="https://auth.example.com/.well-known/openid-configuration"
<Step title="Configure redirect URI">
In the client settings, add the redirect URI:
- **Valid redirect URIs**: `https://resume.example.com/api/auth/oauth2/callback/custom`
- **Valid redirect URIs**: `https://resume.example.com/api/auth/callback/custom`
</Step>
@@ -288,7 +309,7 @@ OAUTH_DISCOVERY_URL="https://auth.company.com/application/o/reactive-resume/.wel
<Accordion title="Redirect URI mismatch error">
The callback URL configured in your OAuth provider must exactly match: ```
{APP_URL}/api/auth/oauth2/callback/custom ``` Common issues: - Trailing slash mismatch - HTTP vs HTTPS mismatch - Port
{APP_URL}/api/auth/callback/custom ``` Common issues: - Trailing slash mismatch - HTTP vs HTTPS mismatch - Port
number differences - Path case sensitivity
</Accordion>