link-issues
Connect two issues with a typed relationship — blocks, blocked-by, related, duplicates, or parent/subtask.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Connect two issues with a typed relationship — blocks, blocked-by, related, duplicates, or parent/subtask.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
Walk a project from "no values provisioned" to "doctor --secrets is green" — eight idempotent steps with resume support via setup-state.toml. Wraps the secret framework (ADR-023 §3.8) for AI agents and headless onboarding.
Bootstrap devboy from scratch — install the CLI if missing, register the MCP server, run `devboy onboard` for the active agent, optionally bootstrap the secret framework, verify with `doctor`. First-run skill for both manual installs and the Claude Code / Codex plugin.
First-run wizard for the devboy secret framework — walk a fresh project from "no secret manifest, no router, no daemon" to "every required secret provisioned and verified". Idempotent eight-step flow per ADR-023 §3.8 with state at ~/.devboy/secrets/setup-state.toml so the user can resume or skip.
Analyse the user's Claude Code (or other agent) logs and auto-configure the layered-pipeline compression profiles for their tools, models, and workflow.
Diagnose and fix a broken devboy-tools setup — corrupt config, missing tokens, keychain trouble, wrong paths, plugin install failures.
Enumerate and introspect the active tool bundle — names, categories, schemas, how to invoke each tool from the CLI.
| name | link-issues |
| description | Connect two issues with a typed relationship — blocks, blocked-by, related, duplicates, or parent/subtask. |
| category | issue-tracking |
| version | 1 |
| compatibility | devboy-tools >= 0.18 |
| activation | ["link issues","mark as blocked by","set parent","relate to","mark as duplicate"] |
| tools | ["get_issue","get_issue_relations","link_issues","unlink_issues","update_issue"] |
Create a typed relationship between two issues so the tracker's dependency graph reflects the real one. The skill covers the four canonical link types plus the special case of parent/subtask, and it inspects existing links first to avoid duplicates.
IssueRelations (the shape returned by get_issue_relations) groups links into five buckets:
| Bucket | linkType to pass | Meaning |
|---|---|---|
blocked_by | blocked_by | The source cannot progress until the target is done |
blocks | blocks | The source must be done before the target can progress |
related_to | relates_to | Soft relationship — "see also" |
duplicates | duplicates | The source is a duplicate of the target |
parent / subtasks | subtask | Source is a subtask of target (ClickUp / Jira) |
Provider support varies:
relates_to, blocks, blocked_by.relates_to (dependency-free by default; Projects v2 adds more).update_issue parentId in addition to link_issues.If a given relationship is not supported by the active provider, link_issues returns ProviderUnsupported — fall back to an explanatory comment instead.
Before adding a link, list the existing ones so you do not create a duplicate edge:
devboy tools call get_issue_relations '{"key": "DEV-200"}'
# or in aggregate via get_issue
devboy tools call get_issue '{"key": "DEV-200", "includeRelations": true}'
Look at blocked_by, blocks, related_to, duplicates, parent, subtasks. If the edge you are about to add already exists, stop — the tracker is already correct.
One link_issues call per edge. All three fields are required:
# "DEV-200 is blocked by DEV-100"
devboy tools call link_issues '{
"sourceIssueKey": "DEV-200",
"targetIssueKey": "DEV-100",
"linkType": "blocked_by"
}'
# "DEV-55 duplicates DEV-40"
devboy tools call link_issues '{
"sourceIssueKey": "DEV-55",
"targetIssueKey": "DEV-40",
"linkType": "duplicates"
}'
# "DEV-42 is related to DEV-17"
devboy tools call link_issues '{
"sourceIssueKey": "DEV-42",
"targetIssueKey": "DEV-17",
"linkType": "relates_to"
}'
Where the provider supports it, prefer update_issue with parentId — it moves the issue under the parent in one call and most trackers render the hierarchy natively:
devboy tools call update_issue '{"key": "CU-child", "parentId": "CU-epic"}'
Fall back to link_issues with "linkType": "subtask" if the provider expects that shape.
A real request usually needs more than one edge. Walk them one at a time — the tool is not batched:
"This MR fixes DEV-123 and is blocked by DEV-100."
# DEV-<current> blocks? no — DEV-<current> is blocked by DEV-100
devboy tools call link_issues '{
"sourceIssueKey": "DEV-<current>",
"targetIssueKey": "DEV-100",
"linkType": "blocked_by"
}'
# "fixes" on most trackers is just a related link + automation on merge
devboy tools call link_issues '{
"sourceIssueKey": "DEV-<current>",
"targetIssueKey": "DEV-123",
"linkType": "relates_to"
}'
unlink_issues takes the same three fields:
devboy tools call unlink_issues '{
"sourceIssueKey": "DEV-55",
"targetIssueKey": "DEV-40",
"linkType": "duplicates"
}'
get_issue_relations after the operation shows the new edge in the correct bucket.create-issue and then link.