Skip to content
dsh.fish
Bundle

dsh-rxresume

DSH plugin that talks to the Reactive Resume REST API directly: create, read, patch, and manage resumes over /api/openapi with an API key.

Source
Triple3h
License
MIT
Updated
Updated 6 days ago

Readme

# dsh-rxresume

[English](README.md) | [中文](README.zh-CN.md)

[![GitHub stars](https://img.shields.io/github/stars/Triple3h/dsh-rxresume?style=flat)](https://github.com/Triple3h/dsh-rxresume)
[![GitHub license](https://img.shields.io/github/license/Triple3h/dsh-rxresume?style=flat)](https://github.com/Triple3h/dsh-rxresume/blob/master/LICENSE)

> A [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (`dsh`) plugin that manages your resumes on [Reactive Resume](https://rxresu.me) — by talking to its REST API directly (`/api/openapi`, `x-api-key` auth), with **no MCP hop**.

Create and edit resumes right from a harness session. Every operation is a native, schema-validated tool the model can call — read before patching, edit content with JSON Patch, roll back to any version.

## Install

```sh
# from the parent directory of this package:
dsh plugin --profile <name> add ./dsh-rxresume
```

Or straight from the repo:

```sh
dsh plugin --profile <name> add github:Triple3h/dsh-rxresume
```

The bundle patch reads `RXRESUME_API_KEY` from the environment. Without a key the plugin installs inert (a warning, no tools), so adding it before configuring never leaves a profile unbootable.

## What you get

The plugin registers a set of first-party tools (native tool cards, schema-validated args) that mirror the Reactive Resume REST surface:

| Tool | What it does |
|---|---|
| `resume_list` | List resumes (metadata, tag filter, sort) — the way to discover IDs |
| `resume_get` | Read one resume's full data document |
| `resume_create` | Create a resume (optionally pre-filled with sample data) |
| `resume_import` | Create a resume from a complete ResumeData document |
| `resume_patch` | **Edit content** via RFC 6902 JSON Patch operations |
| `resume_update` | Change metadata: name, slug, tags, public visibility |
| `resume_duplicate` | Copy a resume (e.g. job-specific variants) |
| `resume_delete` | Permanently delete a resume |
| `resume_lock` / `resume_unlock` | Protect / unprotect a resume against edits |
| `resume_versions` / `resume_restore_version` | Version history and non-destructive rollback |

The plugin also contributes a system-prompt section teaching the model the workflow that matters for resume editing: read before patching, UUID-keyed section items, valid-HTML rich text, atomic multi-op patches, and unlock → edit → re-lock for locked resumes.

## Configure

Mint an API key in the web app at **`<url>/dashboard/settings/api-keys`**, then:

```sh
export RXRESUME_API_KEY=rrk_...
dsh --profile <name>
```

To override any option, patch the row by id in your profile's `cordis.patch.yml`:

```yaml
- id: rxresume
  config:
    apiKey: !!js process.env.RXRESUME_API_KEY
    url: http://localhost:3000   # self-hosted origin (Docker 3000; pnpm dev 3001; no trailing slash)
    timeoutMs: 30000
```

| Key | Default | Description |
|---|---|---|
| `apiKey` | `''` | API key from `<url>/dashboard/settings/api-keys`. Empty mounts nothing. |
| `url` | `http://localhost:3000` | Server origin. Docker/compose self-hosting listens on 3000; the pnpm dev server on 3001; hosted service `https://rxresu.me`. |
| `timeoutMs` | `30000` | Per-request timeout. |

For a local instance of [reactive-resume](https://github.com/amruthpillai/reactive-resume): Docker/compose serves the whole app on port **3000** (`docker compose up`), the dev server (`pnpm --filter @reactive-resume/server dev`) on **3001**. Sign in through the web app and mint a key in settings.

## How it works

- Each tool wraps one REST endpoint of the server's OpenAPI surface (`packages/api` in the reactive-resume monorepo defines them): `GET/POST /api/openapi/resumes`, `PATCH /api/openapi/resumes/{id}` (JSON Patch), `PUT` (metadata), `/duplicate`, `/lock`, `/versions/...`.
- Tool parameters are validated by the dsh-tools schema DSL before execution; outputs are narrow, plugin-constructed envelopes validated against a declared schema — a server response can never silently break the tool contract.
- API failures are converted to actionable errors (`locked → resume_unlock first`, `404 → resume_list`, slug conflicts, version conflicts).
- Every request carries `x-api-key`, a per-request timeout, and honors the harness's cancellation signal.

Compared to the official `dsh-plugin-reactive-resume` (which bridges the server's MCP endpoint): this plugin needs no MCP client runtime, registers plain first-party tools (native tool cards, schema-validated args), and adds lock/version workflows in the prompt guide.

## Requirements

- Node `^22.19.0 || >=24.0.0`
- A Reactive Resume instance (hosted `https://rxresu.me` or self-hosted) reachable from the harness host

## Development

```sh
pnpm install
pnpm test         # vitest (fetch stubbed; also locked against the live error shape)
pnpm run typecheck
pnpm run build    # tsdown -> dist/
```

Version notes: `@deepseek-ai/*` packages must come from the `next` dist-tag line (`^0.1.1-rc.2`); the `latest` tag is stale. Cordis is a peer dependency — the host provides it.

## License

MIT

Install

dsh plugin --profile web add github:Triple3h/dsh-rxresume

Profile: web

  • This package builds from source on install. pnpm will ask you to allow its build script — that is permission to run the package’s code on your machine, outside the agent sandbox. Only allow sources you trust.
  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source