Ivan Gudak's open-source Claude Code plugin marketplace, Shipwright: plugins that take work from an idea or a business requirements document to shipped, documented software. It is installed as the shipwright marketplace.
Moving from ihudak-plugins? This repository used to be ihudak/ihudak-claude-plugins, with the marketplace named ihudak-plugins. See Moving from the old marketplace name.
| Plugin | Description |
|---|---|
| dev-workflows | Five slash commands for design → implementation → readiness, upgrade, and vuln fixing, with Opus-backed planning and review gates. Needs workflows-core. Docs |
| product-workflows | Fourteen slash commands: idea → PRD → ARD → specification, a six-command BRD-to-PRD route, effort proposals. Needs workflows-core and prose-style. Docs |
| guideline-reviewers | Two standalone commands: /api-guideline-reviewer reviews OpenAPI specs against bundled REST/IAM guidance; /guideline-reviewer reviews code/UI against bundled design-system and a11y standards. |
| workflows-core | Shared foundation for the workflow plugin family — addressing, git handoff, model routing, emission — plus six utility commands. Docs |
| docs-workflows | Seven commands: scaffold, brand and serve a docs portal, audit its coverage, write pages, profile, release notes. Needs workflows-core, prose-style. Docs |
| prose-style | Pluggable prose style enforcement: /prose-review-pr, /prose-review-docs, /prose-style-refresh, plus sub-agents product-workflows and docs-workflows use. Vendor-neutral, overridable baseline. |
| obsidian-llm-wiki | Ten slash commands for compiling Obsidian vault knowledge into a persistent, cross-referenced wiki with task management; supports Claude Code and GitHub Copilot. |
| acli | Atlassian CLI (acli) skill for Jira and Confluence — search, work items, comments, attachments, boards, sprints, pages. From pi-skill-acli (MIT). |
product-workflows, dev-workflows and docs-workflows form one pipeline, from an idea or a customer's requirements document to shipped, documented code, and workflows-core is the foundation all three depend on. The family map draws every command of the four on one diagram: grouped by role, coloured by plugin, with the deliverable each command hands the next. Each plugin's own workflow page carries the detail.
- Claude Code — the plugins install into Claude Code (some
obsidian-llm-wikicommands also support GitHub Copilot). superpowers(recommended) — the Claude Code pluginworkflows-coreleans on for/prompt-brainstorm, and that the whole family uses for its brainstorm → plan → subagent-driven-development flow. No hard dependency; commands degrade gracefully without it.gh+gh auth login(recommended) — lets the family open the pull requests it drafts — a phase handoff's in the specs repo,/implement,/vulnand/upgrade's in the code repo, and thegh pr create/documentoffers you for the docs branch it wrote. It buys nothing for diff reading, which is pure localgiton any host.vale(optional for/document; required by/docs-init) — a prose linter for docs./documentfalls back to a repo lint script, then theprose-styleplugin, whenvaleis absent./docs-initcannot: the repository it scaffolds lints with Vale in its own verification phase and in CI, so its toolchain preflight requiresvale, together withmkdocs,python3andpip(oruv).curlandbash(required by/docs-serve) — it judges a dev server's port withcurl, and starts, tests and signals the process group it runs each server in withbash. Off Linux it also needslsofandps, which macOS ships; on Linux it reads the socket and process tables from/proc, so a slim container needs nothing beyond those two./document's opt-in render check uses both too, and without either falls back to a table of pages to check by hand.- Recommended environment:
ihudak/ai-containers— mounts every repository and your specs repo under one/workspaceumbrella (repos at/workspace/<repo>, the specs repo at/workspace/specs), so the default$REPOS_PATH(/workspace) and an exportedSPECS_PATHjust work; it also installsghand mounts the hostghauth. Outside a container the commands still work — set$REPOS_PATHyourself and manageghlogin.
claude plugin marketplace add ihudak/ai-workflowsclaude plugin install dev-workflows@shipwright
claude plugin install product-workflows@shipwright
claude plugin install prose-style@shipwright
claude plugin install obsidian-llm-wiki@shipwright
claude plugin install acli@shipwright
claude plugin install guideline-reviewers@shipwright
claude plugin install workflows-core@shipwright
claude plugin install docs-workflows@shipwrightThe workflow plugins resolve their inputs and outputs through three core environment variables — plus an optional DOCS_PATH, read-only as a documentation-grounding root and a write target for the docs commands that write a docs repository. Export them in your shell profile (or rely on the AI-Container defaults):
export SPECS_PATH="/workspace/specs" # shared store: specifications, designs, ARDs
export REPOS_PATH="/workspace" # where your code clones live (default: /workspace)
export DOCS_PATH="/workspace/docs" # optional: your product docs clone; read-only for grounding (default: /workspace/docs)
export GIT_USER_INITIALS="iv-gu" # optional: branch prefix for every command that creates a branch in a code or docs repoSPECS_PATH— the shared, team-visible store for a ticket'sspecification.md/design.md/ ARD underspecifications/<KIND>-<KEY>-<slug>/…(kindBRD/PRD/EPIC). Required by the commands that stop without it —grep -lE 'Set SPECS_PATH|Required path environment variable unset' plugins/*/commands/*.mdlists them./implement,/documentin keyed mode and/release-notesare among them on a<KEY>address; an@<path>address and the direct modes do not need it;/epicsand/docs-audit, among others, read the specs tree where it is set without carrying that stop.REPOS_PATH— where code clones live; a single directory or a colon-separated list. Defaults to/workspace. The match is bygit remote get-url originslug where a command was handed the slug; where a command lists candidates to offer you instead (/create-ard, bare/idea --ground-code,/docs-init,/docs-brandwhere neither its--fromnor the docs profile's recorded source repositories settle the repository, and/docs-auditwhere those recorded repositories do not settle the set), your answer is resolved against that listing, so a rename changes the name a clone is offered under, never whether it is offered.DOCS_PATH(optional) — your product documentation's clone (default/workspace/docs), in two roles. As a grounding root it is read-only: when it is an existing directory containing markdown, the commands that ground on shipped docs — among them/idea,/create-prd,/specify,/epicsand/release-notes— read it through the read-onlydocs-grounderagent, never write to it, and treat every miss as a silent, non-blocking skip. Disable grounding per run with--no-docs, or override the root with--docs <path>. As a write target it is a docs repository like any other:/docs-initscaffolds one there when nothing is there yet, and every otherdocs-workflowscommand that resolves a docs repository —/document,/docs-profile,/docs-brand,/docs-auditand/docs-serve— writes into the one it resolves there (/docs-auditits backlog,/docs-servethe record of the server it started). The two roles are different uses of one variable, not a contradiction;plugins/workflows-core/references/docs-grounding.mdowns the first andplugins/docs-workflows/references/docs-workflow/repo-resolution.mdthe second.GIT_USER_INITIALS(optional) — your branch identifier, used verbatim (no trailing/) by every command that creates a branch in a code or documentation repository;plugins/workflows-core/references/branch-naming.mdnames them. Branch naming is repo-rule-first: each command reads the target repo's ownCONTRIBUTING.md/README.md/DOCUMENTATION-GUIDELINES.md/CLAUDE.mdand follows the convention documented there. Where that convention has a name/initials segment — asexample-docsdoes (<your-name-or-initials>/<JIRA-ISSUE-KEY>-<short-branch-name>) — this variable fills it, givingiv-gu/PRODUCT-1234-add-oauth. Where it has none (say a plainfeat/<slug>repo), the convention is followed as written and no initials are injected. Only when a repo documents no convention at all does this variable become the whole prefix. When unset, the commands fall back togit config user.initials, then infer from existing branch names, then ask. Full algorithm:plugins/workflows-core/references/branch-naming.md.
After installing, run /workflows-core:statusline once. The command ships in workflows-core, so install that plugin too (step 2 above lists it). It installs the family's multi-line status line (session identity, git, context, cost, tokens, rate limits) into ~/.claude/settings.json and enables the Option-B snapshot used by session-cost reporting. It is idempotent and backs up anything it would overwrite, and it changes no workflow-command behavior.
/workflows-core:statusline
Claude Code ships its own built-in
/statuslinecommand (backed by thestatusline-setupagent) that configures a plain, single-line status line. Since the plugin's command shares that name, typing the bare/statuslineruns Claude Code's built-in flow instead — always use the fully-qualified/workflows-core:statuslineto install the family's status line.
Two steps, and the second is the one that actually changes what runs:
claude plugin marketplace update shipwright
claude plugin update dev-workflows@shipwright
claude plugin update product-workflows@shipwright
claude plugin update prose-style@shipwright
claude plugin update obsidian-llm-wiki@shipwright
claude plugin update acli@shipwright
claude plugin update guideline-reviewers@shipwright
claude plugin update workflows-core@shipwright
claude plugin update docs-workflows@shipwrightThe /plugins interface is the easiest route, and it does update installed plugins. Run /plugins inside Claude Code and update the marketplace from there: unlike the CLI's marketplace update, that path upgrades what you already have. You can also turn on AutoUpdate per plugin there, after which they keep themselves current and none of the above is needed.
If a plugin has been renamed, marketplace update will not update anything — not that plugin and not the others. The remedy is to remove the marketplace and its plugins and install from scratch:
claude plugin marketplace remove shipwright
claude plugin marketplace add ihudak/ai-workflowsthen reinstall the plugins you want, per step 2.
Until 2026-09-24 this marketplace was named ihudak-plugins and lived at ihudak/ihudak-claude-plugins. GitHub redirects the old repository URL. The marketplace name, though, is part of every install key (dev-workflows@ihudak-plugins), so moving to the new name means re-registering. Removing a marketplace uninstalls the plugins installed from it, so reinstall each one you had afterwards:
claude plugin marketplace remove ihudak-plugins
claude plugin marketplace add ihudak/ai-workflows
claude plugin install workflows-core@shipwrightThen run claude plugin install <plugin>@shipwright for each other plugin you use (the list is in step 2), and restart Claude Code. Your environment variables and your specs, docs and code repositories are not touched.
marketplace update from the CLI refreshes the catalogue, not your installed plugins. It updates what the marketplace advertises — which is what makes a newly added plugin installable — but an already-installed plugin stays at the version you installed. claude plugin update <plugin> is what upgrades one from the command line, and it requires restarting Claude Code to apply. Update only the plugins you actually have.
This page used to say marketplace update alone was enough. It is not, and the symptom is quiet: claude plugins list keeps reporting the old version while the catalogue advertises the new one, so the content looks current and is not.
The environment variables expect these layouts:
$SPECS_PATH/ # shared, team-visible store
specifications/PRD-<KEY>-<slug>/ # prd.md, ard.md (+ EPIC-<KEY>-NN-<slug>/ holding specification.md, design.md)
$REPOS_PATH/ # code clones (default /workspace)
<repo>/ # discovered by directory name; matched by origin slug where the command was handed one
$DOCS_PATH/ # optional: product docs clone (default /workspace/docs)
... # e.g. an example-docs checkout; read-only for grounding, written by the docs commands
- Create a subdirectory under
plugins/with the plugin name. - Add
.claude-plugin/plugin.json(name, description, author). - Add
commands/,agents/,hooks/, and/orskills/as needed. - For hooks, add a
hooks/hooks.jsondeclaring the registrations. - Register the plugin in
.claude-plugin/marketplace.json. - Commit and push to
main.
MIT — see LICENSE.