Dependency Manager logo

Dependency Manager

Community
jpicklyk
dependency-manager

Visualizes, creates, and diagnoses dependencies between MCP work items. Use when a user says: what blocks this, add a dependency, show dependency graph, why can't this start, link these items, unblock this, remove dependency, or show blockers.

Overview

Publisherjpicklyk
Repositorytask-orchestrator
Skill namedependency-manager
Stars
204
Forks
22
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by jpicklyk on GitHub. Read the source before you install it.

Installation

Install the Dependency Manager AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/jpicklyk/task-orchestrator.git /tmp/task-orchestrator
mkdir -p .claude/skills
cp -r /tmp/task-orchestrator/claude-plugins/task-orchestrator/skills/dependency-manager .claude/skills/dependency-manager
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Dependency Manager in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Dependency Manager on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Dependency Manager is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

dependency-manager — Dependency Visualization, Creation, and Diagnosis

Manage BLOCKS, IS_BLOCKED_BY, and RELATES_TO edges between work items. Handles all four paths: view existing dependencies, create new edges, delete edges, and diagnose why items cannot start.


Step 1: Determine Intent

Classify the user request before making any tool calls.

Resolve $ARGUMENTS to a UUID via query_items search (operation="search", query=$ARGUMENTS, limit=5); if ambiguous, present matches via AskUserQuestion. If $ARGUMENTS is already a UUID, default intent to VIEW for that item.

If $ARGUMENTS is empty, infer intent from the surrounding conversation. If intent is still unclear, ask via AskUserQuestion: "What would you like to do with dependencies? Options: view, create, delete, diagnose."

Compound requests (e.g., "show what blocks this and remove the dependency"): handle the VIEW path first, then proceed to the second action using the results.

Intent signal words:

Signal wordsPath
"show", "view", "graph", "what blocks", "what depends on", "visualize"VIEW (Step 2)
"add", "create", "link", "connect", "chain", "depend on"CREATE (Step 3)
"remove", "delete", "unlink", "disconnect"DELETE (Step 4)
"why can't this start", "why is this blocked", "diagnose", "show blockers", "unblock"DIAGNOSE (Step 5)

Step 2: View Dependencies

Once you have an item ID and intent is VIEW, query its dependency edges:

query_dependencies(operation="get", itemId="<uuid>", direction="all", includeItemInfo=true)

Format the result as an ASCII tree:

◉ Design API schema (work)
  ↳ BLOCKS → ○ Implement data models (queue)
  ↳ BLOCKS → ○ Build REST endpoints (queue)
  ← BLOCKED BY → ◉ Finalize data contract (work)

Use the visual symbols to indicate role at a glance:

SymbolRole
terminal
work or review
queue
blocked

Direction parameter meanings:

ValueReturns
outgoingEdges where this item is the source (things this item blocks)
incomingEdges where this item is the target (things that block this item)
allBoth directions combined

For a full chain view (ancestors and descendants beyond immediate neighbors), add neighborsOnly=false:

query_dependencies(operation="get", itemId="<uuid>", direction="all", includeItemInfo=true, neighborsOnly=false)

This performs BFS traversal and returns the full dependency graph. Use it when the user asks to "show the full chain" or "trace all blockers."

After displaying the tree, note any items in ⊘ blocked state and offer to run DIAGNOSE (Step 5) on them.


Step 3: Create Dependencies

Identify the structure from what the user described, then select the right creation pattern.

Decision tree:

Two specific items to link → single edge (dependencies array)
Three or more items in a sequence (A then B then C) → linear pattern
One item that blocks many others → fan-out pattern
Many items that all block one item → fan-in pattern

Pattern reference:

PatternKey parameterWhen to use
Single edgedependencies=[{fromItemId, toItemId}]Link exactly two items
linearitemIds=[A, B, C, D]Sequential chain: A→B→C→D
fan-outfromItemId=A, toItemIds=[B, C, D]One item blocks many
fan-infromItemIds=[A, B, C], toItemId=DMany items block one

Confirm the derived edges with the user before creating. Show them what you're about to create in a readable way, for example:

About to create: A → B → C → D as a linear chain. Proceed?

Adjust the format to fit the actual pattern (single edge, fan-out, fan-in, etc.).

Then call manage_dependencies(operation="create") with the selected pattern:

manage_dependencies(
  operation="create",
  pattern="linear",
  itemIds=["<uuid-a>", "<uuid-b>", "<uuid-c>", "<uuid-d>"]
)

For a single edge or custom edges, use the dependencies array directly:

manage_dependencies(
  operation="create",
  dependencies=[
    { fromItemId: "<uuid-a>", toItemId: "<uuid-b>", type: "BLOCKS" }
  ]
)

After creation, show the edges created:

✓ Created 3 dependency edges:
  A → BLOCKS → B
  B → BLOCKS → C
  C → BLOCKS → D

To set a partial unblock threshold (so the blocked item unblocks before the blocker is terminal), include unblockAt in the dependency spec. See the unblockAt reference table below.


Step 4: Delete Dependencies

Query existing edges first so the user knows what can be deleted:

query_dependencies(operation="get", itemId="<uuid>", direction="all", includeItemInfo=true)

Present the edges to the user:

Existing edges for "Implement data models":
  [1] ◉ Design API schema → BLOCKS → this item  (dep-uuid-1)
  [2] this item → BLOCKS → ○ Build REST endpoints  (dep-uuid-2)

Which edge(s) would you like to remove?

Confirm before deleting. Then call manage_dependencies(operation="delete") using the appropriate mode:

manage_dependencies(operation="delete", dependencyId="<dep-uuid>")

Delete parameter modes:

ModeParametersWhen to use
By dependency IDid="<dep-uuid>"Delete one specific edge (most precise)
By relationshipfromItemId="<uuid>", toItemId="<uuid>"Delete the edge between two known items
By relationship + typefromItemId, toItemId, type="BLOCKS"When multiple edge types exist between same pair
All edges for itemfromItemId="<uuid>", deleteAll=trueRemove all outgoing edges from an item
All edges for itemtoItemId="<uuid>", deleteAll=trueRemove all incoming edges to an item

After deletion, confirm:

✓ Removed: Design API schema → BLOCKS → Implement data models

Step 5: Diagnose Blocked Items

For DIAGNOSE intent, identify why a specific item cannot start or is stuck in blocked state.

Path A — User provided an item ID:

query_dependencies(operation="get", itemId="<uuid>", direction="incoming", includeItemInfo=true)

Path B — User wants a broad view of all blocked work:

get_blocked_items(includeDetails=true)

For each blocker returned, show:

⊘ "Build REST endpoints" cannot start because:

  Blocker 1: ◉ Design API schema (work)
    Must reach: terminal (unblockAt: terminal)
    Action: advance Design API schema to terminal first

  Blocker 2: ○ Write OpenAPI spec (queue)
    Must reach: terminal (unblockAt: terminal)
    Action: start and complete Write OpenAPI spec first

For each blocker, determine what must happen:

Blocker's current roleunblockAt thresholdWhat needs to happen
queueterminalStart and complete the blocker
workterminalComplete the blocker (already started)
workreviewAdvance the blocker to review
reviewterminalAdvance the blocker to terminal
blockedanyThe blocker itself is stuck — recurse diagnosis

If any blocker is itself blocked, offer to recurse: "The blocker is also blocked. Would you like to diagnose that item too?"

Not every "why can't this start" is a dependency. This skill diagnoses BLOCKED-role items and unsatisfied BLOCKS edges only. A separate, unrelated cause can produce a similar symptom: advance_item rejecting a start/resume transition with errorCode: "resource_unavailable" (errorKind: "transient") — a shared resource the item declares via a resources: trait is currently held by another item. That item's role does not change to blocked; it stays in its current role (typically queue) and the transition simply fails transiently. If query_dependencies shows no incoming edges yet the item still won't advance, suspect resource contention instead — check the advance_item error for errorCode/contendedResources, or inspect get_context(itemId=...)resourceLeases for the item's declared/held keys. Do not treat this as a dependency problem; retrying the dependency diagnosis will not help.

After the diagnosis, link to the resolution path:

  • To advance the blocking item: use /status-progression with its UUID
  • To fill missing notes on the blocker first: use manage_notes(operation="upsert") to fill required notes

Dependency Type Reference

TypeMeaningEffect
BLOCKSA must complete before B can proceedB appears as blocked until A reaches its unblockAt threshold
IS_BLOCKED_BYReverse of BLOCKS — same edge, opposite directionEquivalent to creating BLOCKS from B to A
RELATES_TOInformational link only — no blocking behaviorItem appears in dependency queries but does not affect role transitions

unblockAt Threshold Reference

ValueWhen the dependent item unblocksUse case
terminal (default)Blocker must finish entirelyStandard sequential dependency
reviewUnblocks when blocker enters review phaseStart next step while review is in progress
workUnblocks when blocker starts workParallel work that just needs the prior item started
queueUnblocks immediately (tracks ordering only)Soft ordering constraint with no actual blocking

Troubleshooting

Problem: Cycle detection error when creating a dependency

Cause: The proposed edge would create a circular dependency chain (A blocks B, B blocks C, C blocks A). The server detects this and rejects the entire batch atomically.

Solution: Review the dependency direction. One of the edges is backwards. Identify which item actually depends on the other, flip the fromItemId and toItemId on that edge, and retry.


Problem: "dependency not found" error on delete

Cause: The dependency UUID or relationship does not exist. The edge may have already been deleted, or the IDs are from a different environment.

Solution: Re-query to confirm current state:

query_dependencies(operation="get", itemId="<uuid>", direction="all", includeItemInfo=true)

Use a dependency UUID from the fresh query result for the delete call. If the edge is not present, it was already removed.


Problem: Item is still blocked after the blocker reached terminal

Cause: Either the unblockAt threshold is set to a role the blocker has not yet reached (e.g., unblockAt: "review" but the blocker went straight to terminal via complete), or there are additional incoming edges from other items that are not yet satisfied.

Solution: Query incoming edges to check all blockers:

query_dependencies(operation="get", itemId="<uuid>", direction="incoming", includeItemInfo=true)

Check each blocker's role. If all blockers are terminal and the item is still in blocked role, use advance_item(transitions=[{itemId: "<uuid>", trigger: "resume"}]) to manually return it to its previous role via /status-progression.


Problem: Pattern shortcut creates wrong edges

Cause: The wrong parameter name was used for the pattern. linear uses itemIds (an ordered array). fan-out uses fromItemId (single UUID) and toItemIds (array). fan-in uses fromItemIds (array) and toItemId (single UUID). Mixing these up creates edges in the wrong direction or fails silently.

Solution: Double-check the parameter names against the pattern table in Step 3. Re-query the item after creation to verify edge direction, and delete any incorrect edges using Step 4.


Examples

Example 1: View dependencies for an item

User: "Show me what blocks the REST endpoints task."

Search → one match uuid-rest. Query incoming deps:

query_dependencies(operation="get", itemId="uuid-rest", direction="incoming", includeItemInfo=true)

Display:

○ Build REST endpoints (queue)
  ← BLOCKED BY ◉ Design API schema (work)
  ← BLOCKED BY ○ Write OpenAPI spec (queue)

Both blockers must reach terminal. Use /status-progression on each.

Example 2: Create a linear chain

User: "Set up A → B → C → D as a chain." Resolve UUIDs, confirm, then:

manage_dependencies(operation="create", pattern="linear",
  itemIds=["uuid-a", "uuid-b", "uuid-c", "uuid-d"])

Result:

✓ Created 3 edges: A → B → C → D

Example 3: Diagnose why an item cannot start

User: "Why can't 'Write integration tests' start?" Search → uuid-tests. Query incoming:

query_dependencies(operation="get", itemId="uuid-tests", direction="incoming", includeItemInfo=true)

Display:

⊘ "Write integration tests" cannot start:
  Blocker 1: ○ Build REST endpoints (queue) — must reach terminal
  Blocker 2: ◉ Implement data models (work) — must reach terminal

Recommended: complete both blockers via /status-progression

Quick Decision Guide

SituationAction
User asks what blocks an itemStep 2 — query incoming with includeItemInfo=true
User asks what an item blocksStep 2 — query outgoing with includeItemInfo=true
User wants full chain visualizationStep 2 — add neighborsOnly=false
User wants to link two itemsStep 3 — single edge via dependencies array
User has a sequential list of itemsStep 3 — pattern="linear" with itemIds
One item must precede manyStep 3 — pattern="fan-out"
Many items must precede oneStep 3 — pattern="fan-in"
User wants to remove a linkStep 4 — query first, confirm, delete by dep ID
Item is stuck and user does not know whyStep 5 — diagnose incoming edges
Blocker analysis complete, need to advanceUse /status-progression on the blocker

Frequently asked questions

What does the Dependency Manager AI skill do?

Visualizes, creates, and diagnoses dependencies between MCP work items. Use when a user says: what blocks this, add a dependency, show dependency graph, why can't this start, link these items, unblock this, remove dependency, or show blockers.

Why use Dependency Manager on TypingMind?

Because you install it once and use it with any model. Dependency Manager is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Dependency Manager in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/jpicklyk/task-orchestrator/tree/main/claude-plugins/task-orchestrator/skills/dependency-manager. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Dependency Manager?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Dependency Manager?

As many as you like. As long as a model supports skills, you can use Dependency Manager with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Dependency Manager AI skill free?

Yes. It is published on GitHub by jpicklyk under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇