# Tailor

> Tailor the resume to one job posting. Give it a URL, paste the posting (or refer to one pasted earlier in this chat), or point at a saved application folder; it resolves the JD and runs the tailor-pipeline workflow end to end.

- **Type:** Skill
- **Install:** `agentstack add skill-ledq-resumery-tailor`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [ledq](https://agentstack.voostack.com/s/ledq)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [ledq](https://github.com/ledq)
- **Source:** https://github.com/ledq/resumery/tree/main/.claude/skills/tailor

## Install

```sh
agentstack add skill-ledq-resumery-tailor
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# /tailor: front door for the tailoring pipeline

Resolve WHICH JD the user means, confirm it really is a job posting, mint the
application workspace, hand the engine the workspace, and relay the result. The file on
disk is always the canonical text: you read the JD to judge it, but the copy the
pipeline receives is the file's.

## 1. Mint the staging namespace: FIRST, once

```
mktemp -d /tmp/jd_stage.XXXXXX
```

It prints the run's namespace directory (call it ``). This is the ONLY randomness
in staging, minted once; every step below uses fixed names inside it (`/jd.txt`,
`/url`). Always a fresh `mktemp -d`: a fixed path is shared mutable state, and a
leftover from an earlier run would silently tailor the resume to a stale JD.

## 2. Fill it: every source becomes `/jd.txt`

From `$ARGUMENTS` (and, if it is empty, the conversation):

- **A URL** → fetch into the namespace deterministically:
  ```
  python3 ops/jd_fetch.py '' 
  ```
  Exit 0 → the posting is at `/jd.txt` (the URL lands at `/url`, where
  step 4's script reads it for identity; not your concern after this command). Exit 4 → the page is JS-rendered or
  blocked the fetch: tell the user and ask them to paste the posting text instead.
- **A saved application** (an `applications/` path or id) → no staging; the folder
  already holds the posting. Use `applications//jd.txt` as the JD path in the steps
  below. (Step 4's identity check will match and reuse the folder; this is how a saved
  or previously tailored posting is re-tailored.)
- **A path to a JD file the user already has** → copy it in:
  `cp '' /jd.txt`.
- **Raw posting text** (in the argument, or pasted earlier in this conversation) →
  use the Write tool to put the posting at `/jd.txt`, VERBATIM: one copy,
  change nothing, drop nothing.
- **Ambiguous** (several JDs in this chat, or none anywhere) → ask the user which
  posting they mean, or for the posting itself. Do not guess.

## 3. Confirm it is a posting; extract company and role

Read the staged `jd.txt` (whichever source filled it). If it is plainly not a job
posting (a login or block page, a cookie-consent wall, a search-results index, an
"expired posting" notice), STOP before any workspace exists: tell the user what came
back and ask for the posting text. A garbage jd.txt does not fail the pipeline; it
produces a confidently tailored resume against nonsense, caught only by the human.

From the same read, note the `company` and `role_title` the posting states, for step 4.
Honest absence: when the posting does not state one, you have nothing to pass on.

## 4. Mint the workspace (code owns this)

Run `ops/new_workspace.py`, pointing it at the staged JD:

```
python3 ops/new_workspace.py --jd-file '' --company "" --role ""
```

Omit `--company`/`--role` when the JD does not state them. Double-quote the values
(names like O'Reilly carry apostrophes). The script decides create vs. reuse and names
the folder; its **last stdout line is the workspace path**. Use that path exactly as
printed; never retype it or construct one yourself. Exit 2 means the JD file was
unreadable or empty: tell the user and stop; no workspace exists.

The JD path always comes from THIS turn (the namespace minted in step 1, or the saved
application's `jd.txt`), never from an earlier turn's namespace (an earlier run's
namespace holds an earlier run's posting).

## 5. Invoke the engine

Call the Workflow tool with `name: "tailor-pipeline"` and:

```
args: { "workspace": "applications/" }
```

using the path step 4 printed. `args` must be an actual JSON OBJECT in the tool call,
not a JSON-encoded string (a stringified object reaches the script as one string).
Never modify the workspace's files yourself; the engine owns them from here.

## 6. Relay the result

Report the workflow's closing message to the user with the exact workspace folder and
the `Resume_*.pdf` path. Phrase the flagged gaps as advice for the human (what to be ready to
speak to), not as pipeline telemetry. If the run stopped early, relay the reason and the
suggested retry (re-running with the same JD reuses the workspace cleanly).

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [ledq](https://github.com/ledq)
- **Source:** [ledq/resumery](https://github.com/ledq/resumery)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-ledq-resumery-tailor
- Seller: https://agentstack.voostack.com/s/ledq
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
