From conport
Use when superpowers brainstorming/writing-plans produced a design.md + plan.md and the work needs to land in ConPort as a spec doc + epic + tasks. Idempotent via inline HTML-comment anchors written back into the source files.
How this skill is triggered — by the user, by Claude, or both
Slash command
/conport:superpowers-conportThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Imports superpowers brainstorming + writing-plans output into ConPort. Manual trigger; idempotent via inline HTML-comment anchors.
Imports superpowers brainstorming + writing-plans output into ConPort. Manual trigger; idempotent via inline HTML-comment anchors.
User finished superpowers:brainstorming and superpowers:writing-plans, has docs/superpowers/specs/<date>-<topic>-design.md and (usually) docs/superpowers/plans/<date>-<topic>.md, and wants the work to live in ConPort as a spec doc + epic + tasks.
Also: the user re-ran the bridge after editing the source files and expects the corresponding ConPort entities to be updated, not duplicated.
<spec_path> (optional) — path to a *-design.md. If omitted, pick the newest file in docs/superpowers/specs/ by mtime.<plan_path> (optional) — path to the matching *.md plan. Derive from spec by replacing /specs/ with /plans/ and dropping the -design suffix. Skip the plan stage silently if the derived file does not exist.Call mcp__conport__init({name: <auto>}) where <auto> is:
git config --get remote.origin.url (strip .git), orpwd if step 1 fails.If init reports the project does not exist, ask the user via AskUserQuestion whether to create it under that name or pick from list_projects. Do not auto-create silently.
Record project_id for all subsequent calls.
Read <spec_path> (Read tool).
Search the body for <!--\s*conport-spec:\s*doc-(\d+)\s*-->.
Anchor found (captures <doc_id>):
<!--\s*conport-(spec|epic|task):\s*[a-z-]*\d+\s*-->\s*\n?mcp__conport__update_document({
project_id, document_id: <doc_id>,
content: <stripped body>,
change_kind: 'amend',
reason: 're-import from superpowers spec'
})
Anchor not found:
^# (.+)$) → use as title.mcp__conport__add_document({
project_id,
title: <H1>,
content: <stripped body>,
doc_type: 'spec'
})
id → write <!-- conport-spec: doc-<id> --> into the file on its own line immediately after the H1 (Edit tool, append a newline after the title line and then the anchor line).Verify the response echo: returned id is a positive integer, summary is present. On mismatch, retry once.
If <plan_path> does not exist on disk: skip to step 5 with no question.
Otherwise: AskUserQuestion: "Import epic + tasks from <plan_path>?" (yes / no). On no, skip to step 5.
Read <plan_path>.
description length constraint. add_task.description is capped at 2000 chars by the MCP schema. Plan task blocks routinely exceed this. The skill does NOT shove the whole block into the description. Instead:
See spec: doc-<doc_id>. Full plan: <plan_path>.**Files:** block), plus optionally See plan §Task N.The full plan body lives in the spec doc (add_document.content cap is 50 000 chars — comfortable for typical plans). ConPort tasks intentionally carry only short metadata; the source of truth is the markdown file.
Epic:
Search for <!--\s*conport-epic:\s*(\d+)\s*--> outside fenced code blocks (see anchor cheat sheet).
Anchor found (captures <epic_id>):
mcp__conport__update_task({
project_id, task_id: <epic_id>,
title: <H1>,
description: <short summary, ≤ 2000 chars>
})
Do not change kind or status on re-import.
Anchor not found:
mcp__conport__add_task({
project_id,
title: <H1>,
description: <short summary referencing doc-<doc_id> and the plan path>,
kind: 'epic',
priority: 3
})
<!-- conport-epic: <id> --> on a new line immediately after the H1.Capture epic_id.
Tasks:
Split the plan body into blocks at every ^### Task \d+: heading. For each block:
<title> from the heading line. Strip leading Task N: so the ConPort task title is just the human name (e.g. Parser from ### Task 1: Parser).**Files:** block, or from the first non-empty line after the heading. Trim to ≤ 2000 chars.Within the block, search for <!--\s*conport-task:\s*(\d+)\s*--> (outside fenced code blocks).
Anchor found (captures <task_id>):
mcp__conport__update_task({
project_id, task_id: <task_id>,
title: <title>,
description: <short summary>
})
Anchor not found:
mcp__conport__add_task({
project_id,
title: <title>,
description: <short summary>,
parent_task_id: <epic_id>,
kind: 'task',
priority: 3
})
Then write <!-- conport-task: <id> --> on a new line immediately after the ### Task N: <title> heading in the file.
Verify each response echo (id positive, kind matches).
If both doc_id and epic_id exist (whether created or updated this run):
mcp__conport__link_items({
project_id,
source_type: 'doc', source_id: <doc_id>,
target_type: 'task', target_id: <epic_id>,
relationship: 'clarifies'
})
Note: source_type is 'doc', not 'document' — the link_items enum uses the short form.
Backend dedups, so re-runs are no-ops.
Print one line per outcome:
[superpowers-conport]
spec: doc-<N> (created|updated)
epic: task-<M> (created|updated)
tasks: <X> created, <Y> updated
link: doc-<N> --clarifies--> task-<M>
references/anchor-format.md.old_string and <heading>\n<anchor> as new_string. Heading-anchored Edit is safe even if other text in the file shifts.``` fences (e.g. the anchor-format reference itself, or a plan section that documents the bridge). Those must not be treated as real anchors — otherwise on re-import the skill would try to update unrelated ConPort ids. Before applying detection regexes, mask or skip lines that fall between paired fence markers (``` or ~~~).[x] checkbox state from plan.md back into status=DONE on ConPort tasks. That's a separate sync direction.plan.md. Tasks orphaned in the file remain in ConPort; the user closes them manually if needed.After every add_document / update_document / add_task / update_task call, confirm:
id is a positive integer.kind echo on tasks matches what was requested ('epic' or 'task').summary is present.On mismatch, re-issue the single call with field re-stated. If second attempt also drifts, abort and surface the discrepancy to the user verbatim (see post-write verification rules in the parent conport skill).
npx claudepluginhub shaurgon/conport-plugin --plugin conportCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.