convert-spec
Convert an existing design/spec file into a SpecForge spec in the store.
Skill by NitinJ
Chalk Labs
Need help deploying convert-spec?
Chalk Labs sets up agents like this inside real teams: connected to your tools, tested on your data, with a human in the loop where it matters.
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/nitinj-convert-spec
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: documents, design, frontend
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md and code. Checked Nov 1, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/convert-spec
Tools it pre-approves 6
From allowed-tools in SKILL.md: the agent may use these without asking you each time.
Read,Write,Edit,Bash,Glob,Grep
What's inside
- Skill name
convert-spec- Description
- Convert an existing design/spec file into a SpecForge spec in the store. Use when the user asks to "convert <file> to a spec", "import this design doc", or "turn this markdown/HTML into a SpecForge spec". Handles two cases: an existing SpecForge-style .html is ingested as-is; a .md or freeform design doc is re-authored into a full house-style HTML spec. Attaches the result to this session and lints before finishing.
- License
- MIT
- Allowed tools
- Read,, Write,, Edit,, Bash,, Glob,, Grep
- Instructions
- 140 lines in SKILL.md · view on GitHub
Before installing
- Pre-approves some shell commands
Agent Skills spec issues
- files: referenced but missing: references/spec-language.md
Files (1)
- SKILL.md
SKILL.md (first lines)
# convert-spec
Bring an existing file into the SpecForge store. `${CLAUDE_PLUGIN_ROOT}` below
denotes the installed plugin directory. Claude and Pi export it; Codex provides
the exact value in SpecForge SessionStart context. Substitute it in every path
and shell command.
## 1. Inspect the source
- The user names a file (`$ARGUMENTS`). Read it and decide:
- **Already a SpecForge-style HTML spec** (has the section ids / theme contract /
structured plan) → ingest as-is (step 2A).
- **A `.md`** → convert with `import-md`, then edit the result (step 2B). Do not
hand-author a markdown source: the CLI does the mechanical part faithfully and
reports what it could not read, which is a better starting point than a blank
scaffold and your reading of the file.
- **A freeform `.html` design doc** → author it into a scaffolded spec by hand
(step 2C). There is no deterministic path for arbitrary HTML.
- **Infer the spec type** from the source — `research` (a findings report),
`design` (a design doc, no plan), `design-impl` (design + a plan), or `impl` (a
build plan). When the source is none of those, use `general`: the scaffold plus
a TL;DR, sections taken from the source's own headings. Pass it as `--type`
below. A converted document keeps its own shape, so `general` is the right
answer more often here than when authoring from scratch.
## 2A. Ingest an existing HTML spec
```
node "${CLAUDE_PLUGIN_ROOT}/lib/specforge-cli.mjs" import "<file>" --title "<title>" --type <type> --model <your model id>
```
Prints `{ id, htmlPath, url, status, type, language }` — the file is copied into
the store, attached to this session, daemon ensured. **Apply `language` to
anything you write into this spec**, on the terms in 2B. Lint `htmlPath`
(step 3). If lint fails
because it isn't house-style, fall back to **2C** and author into the `htmlPath`
you already have; 2C says so too, and running `create` there would leave this
spec behind and attach a second one. Not 2B: that path runs a markdown parser,
and handing it HTML would mechanically reconvert the document instead of shaping
it.
## 2B. Convert a `.md` — deterministic pass first, then edit
**A markdown source is converted by the CLI, not by hand.** It reads the file,
maps its headings onto sections, rebuilds any plan into the `data-sf-*` markup,
inlines the images that sit beside it, and produces a lint-passing spec:
```
node "${CLAUDE_PLUGIN_ROOT}/lib/specforge-cli.mjs" import-md "<file>" --model <your model id> [--title "<title>"] [--type <type>]
```
`--model` is your own model id; the harness is detected. It credits you as the
converted spec's author, the same way `create` does.
It prints `{ id, htmlPath, url, type, status, language, report }`. **Then edit
`htmlPath`** — the deterministic pass gives you a valid document to improve,
never a blank scaffold to fill.
**`language` is the writing contract in force, and it is the whole of it.** Not a
note added to a contract you read somewhere else: it already contains SpecForge's
own rules, unless this store's owner edited or removed them. Follow what it says and nothing it does not,
and apply it to everything you write while improving the converted document.
Do not go looking for `references/spec-language.md` to supplement it: a rule the owner deleted is deleted.
They edit this in the Configuration pane, under Language.
Read the `report` before you touch anything; it is the list of what needs you:
- **`unsupported`** — constructs the parser could not read (setext headings,
footnotes, reference links), each with its line number. The content is in the
spec as plain text; convert it to house markup by hand.
- **`assetsDropped`** — images that were not inlined, with the reason (missing,
too large, outside the source directory). Say so when you hand off.
- **`lint`** — `PASS` normally. If it is `FAIL`, `lintFailures` names the checks.
- **`sections`** — how many the source produced.
Type: omit `--type` and the import is a **`general`** spec, which imposes no
section set — usually right, because a converted document keeps its own shape.
Pass `--type` only when the source really is a design / research / impl doc.
Then improve the result:
- Read the house rules: `${CLAUDE_PLUGIN_ROOT}/templates/house-rules.md`, and the
language contract, which is the `language` field above rather than a file.
This is where an original's essay voice leaks through: convert the content, not
the register.
- Map the source onto the type's sections exactly as the `create-spec` skill
describes (design / research / design-impl / impl) — adapt sections to the
content; keep stable unique ids, the theme, and the floating TOC in sync. For
impl types build `impl-plan` as Stages → Tasks (`data-sf-stage`/`data-sf-task`/
`data-sf-status`, one stage = one PR, each task a `verify:` note) mirrored into
`task-tracker`, and leave the Runtime stubs. Preserve the author's intent; don't
invent scope.
- Keep every `<section id="…">`, the theme CSS, and the floating `<nav class="toc">`
(update TOC links to match the sections you keep).
For a spec `general` no longer fits (the source turned out to be a design with a
build plan), rescaffold with `create --type <type>` and move the content across;
do not grow a plan inside a general spec and call it typed.
## 2C. Author a freeform HTML doc into a spec
Arbitrary HTML has no deterministic path: it carries someone else's structure and
styling, and there is nothing to map it onto mechanically. It gets authored.
**Arriving from 2A** (an HTML spec that turned out not to be house-style): you
already have an `htmlPath` in the store, attached to this session. **Author into
that file.** Do not run `create` — it would make a second spec and leave the
malformed one attached, so a later edit or handoff could pick up either. The
`language` 2A printed still applies: this is the authoring pass it was for.
**Arriving from step 1** with a freeform HTML doc and no spec yet, scaffold one:
```
node "${CLAUDE_PLUGIN_ROOT}/lib/specforge-cli.mjs" create --title "<title>" --type "<type>" --model <your model id>
```
It prints `{ id, htmlPath, url, type, language }`. **Author into `htmlPath`**,
following the same house rules, section mapping and language contract as 2B
above, and applying `language` on the same terms.From NitinJ/specforge, MIT.
More from NitinJ/specforge
- 0.579score
generate-template
NitinJ
Write a spec template from a prompt.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
export
NitinJ
Export a spec from the store to Google Docs.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
list-specs
NitinJ
List SpecForge specs — either every spec in the store (mode "all") or just the specs attached to this session (mode "mine").
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
migrate-spec
NitinJ
Move one existing spec onto the SpecForge component library.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
tune-templates
NitinJ
Optimize the SpecForge spec templates from the review-comment history.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
write-review
NitinJ
Review a SpecForge spec as a reviewer agent, and file the review as a child spec of the spec being reviewed.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
export-md
NitinJ
Export a spec from the store as a GitHub-flavoured markdown file, plus a sidecar directory holding its diagrams.
SkillBFreshness: B★ 5Claude Code +9 - 0.575score
create-spec
NitinJ
Author a new house-style spec into the SpecForge store.
SkillBFreshness: B★ 5Claude Code +9 - 0.575score
review-spec
NitinJ
Process a submitted batch of human comments on a spec in the store: reply to each thread inline and amend the spec accordingly.
SkillBFreshness: B★ 5Claude Code +9 - 0.574score
start-specforge
NitinJ
Start or reuse the local SpecForge daemon and return its browser index URL.
SkillBFreshness: B★ 5Claude Code +9
Signals
- Stars
- 5
- Forks
- 0
- Open issues
- 1
- Last commit (this folder)
- Sep 18, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- Repository
- github.com/NitinJ/specforge
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from NitinJ
- 0.579score
generate-template
NitinJ
Write a spec template from a prompt.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
export
NitinJ
Export a spec from the store to Google Docs.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
list-specs
NitinJ
List SpecForge specs — either every spec in the store (mode "all") or just the specs attached to this session (mode "mine").
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
migrate-spec
NitinJ
Move one existing spec onto the SpecForge component library.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
tune-templates
NitinJ
Optimize the SpecForge spec templates from the review-comment history.
SkillBFreshness: B★ 5Claude Code +9 - 0.579score
write-review
NitinJ
Review a SpecForge spec as a reviewer agent, and file the review as a child spec of the spec being reviewed.
SkillBFreshness: B★ 5Claude Code +9
Done for you
Rather not set it up yourself?
Chalk Labs scopes, builds and runs agents for your team: the task audit, the eval harness, the integrations and the weekly ops report. Fixed scope, priced before we start.
See how we build AI agents →Read the case studies
Chalk Labs is a two-founder AI and growth studio. We build AI agents, CRMs and MVPs for Web3 and AI companies, and have shipped 50+ product and token launches.
- launches shipped
- 50+
- launches shipped
- media placements
- 500+
- media placements
- founders on every account
- 2
- founders on every account
Press we've placed: Forbes · CoinDesk · Decrypt · Cointelegraph · The Block
Rahil Jain, Co-founder, Chalk Labs. Ex-Goldman Sachs engineer. You talk to the person who builds it.
Get convert-spec running in your business
Tell us what you want to automate. A founder replies within one working day with a plan, not a pitch deck.
Cite this page
convert-spec skill. Agent Mart. https://agentmart.dev/skills/nitinj-convert-spec (last updated 2026-10-24)