Help us improve
Share bugs, ideas, or general feedback.
From full-process
Guides users through task manager setup: pick manager (Linear/Jira/GitHub Issues/Notion), integration method (MCP/CLI/plugin/API), verify, and write helper skill. Part of /process-setup.
npx claudepluginhub tomeraitz/claude-slack-bridge --plugin full-processHow this skill is triggered — by the user, by Claude, or both
Slash command
/full-process:build-task-managerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You run **locally inside Claude Code** (not via the Slack daemon). All clarifications go through `AskUserQuestion`. Do not call `mcp__claude-slack-bridge__ask_on_slack` from this skill.
Manages tasks using native Claude Code subagent tools (TaskCreate, TaskUpdate, TaskList, TaskGet). Tracks TODOs, checkpoints progress, and resumes work across sessions.
Share bugs, ideas, or general feedback.
You run locally inside Claude Code (not via the Slack daemon). All clarifications go through AskUserQuestion. Do not call mcp__claude-slack-bridge__ask_on_slack from this skill.
This skill is the entire task-manager phase of /process-setup. By the time it returns, either:
.claude/skills/claude-slack-bridge_list-tasks/SKILL.md has been generated (status: configured); orskipped).Return values the caller needs (printed as a fenced JSON block at the end of the final reply):
status — configured or skipped.task_manager_label, task_manager_slug, integration_method — populated when status == "configured"; omitted otherwise.Do not skip ahead to writing the helper skill until Step 3 has actually fetched tasks successfully.
Ask via AskUserQuestion:
Which task manager do you use for this repo?
Options: Linear, Jira, GitHub Issues, Notion, None / skip.
If the answer is None / skip, return immediately with status: "skipped".
Record:
task_manager_label — the human label (e.g. Linear, GitHub Issues).task_manager_slug — lowercase slug (linear, jira, github, notion).Ask via AskUserQuestion:
How is
{task_manager_label}integrated in this environment?
All four integration methods are valid for every manager — including GitHub. Do not assume gh for github; the user may prefer the GitHub MCP server, a custom plugin, or direct REST.
Options (single-select, in this order):
mcp__linear__list_issues, mcp__github__list_issues).gh, linear-cli, jira-cli).Record the choice as integration_method ∈ {mcp, cli, plugin, api}.
Run the matching availability check based on integration_method. The point is to catch the "user picked Linear MCP but never installed the Linear MCP server" case early, so we can offer to help.
cwd/.mcp.json and look for a server entry whose key plausibly matches {task_manager_slug} (e.g. linear, jira, github, notion). If none match, treat as not installed.AskUserQuestion, free-text — e.g. gh, linear, jira). Then run command -v <cli> via Bash (or where <cli> on Windows). Non-zero exit ⇒ not installed.If the check says installed (or integration_method is api), continue to Step 3.
If the check says not installed, ask via AskUserQuestion:
{task_manager_label}({integration_method}) doesn't appear to be installed in this repo. Want me to help you set it up?
Options:
status: "skipped".If the user picks Yes, help me install it, run the flow that matches integration_method:
{task_manager_slug} (Linear → @modelcontextprotocol/linear style entry, GitHub → @modelcontextprotocol/github, etc.; if you're not certain of the exact package, ask the user to confirm the package name rather than guessing). Show the user the proposed .mcp.json server entry, ask which env vars they need (API key, workspace id), and only after they confirm append the entry to .mcp.json (preserving existing servers — never rewrite the whole file). Do not write secrets into .mcp.json; reference them via env vars and tell the user where to set them. After writing, ask the user to reload the MCP server (usually by restarting Claude Code) and confirm before continuing.win32 on this user's machine, but check anyway). Propose the install command (winget install …, scoop install …, brew install …, npm i -g …, etc.) and ask the user to confirm before running. Run via Bash. After install, re-run command -v <cli> / where <cli> to verify./plugin to install it; do not try to install plugins from inside this skill. Wait for the user to confirm the plugin is loaded, then re-check availability.After install (or after the user says they've installed it themselves), re-run the availability check from the top of 2b. If it still fails, ask the user whether to retry, switch integration method (jump back to 2a), or skip (return with status: "skipped"). Do not loop more than 3 retries without offering to skip.
Ask the user via AskUserQuestion (free-text "Other" channel) one open-ended question:
How do I fetch the open tasks for this repo from
{task_manager_label}via{integration_method}? Tell me everything I need: the tool/command/endpoint, the project/team/workspace, and any filters. Examples:
- mcp: "call
mcp__linear__list_my_issueswith team=ENG"- cli: "run
gh issue list --repo acme/web --assignee @me --state open --json number,title,body"- plugin: "run
/my-tasksfor thewebworkspace"- api: "POST
https://api.linear.app/graphqlwithLINEAR_API_KEY, query my open issues in team ENG"
Prefer search / name-based filters over internal ids. When the user offers a filter, push for the human-readable form (project name, team key, status name, assignee email/handle, repo owner/name) rather than an opaque uuid or numeric id. Ids drift, get re-issued, and are unreadable in the baked-in skill; names survive. Only fall back to an id if the manager genuinely doesn't expose a stable name-based filter for that field. If the user's first reply uses ids, ask once whether an equivalent name/key filter exists before recording.
Record the full reply as task_fetch_instructions (free-text). Then try it based on integration_method:
curl (or Python) using the env vars the user named.Show a short preview (first 3 task titles or trimmed response). Ask via AskUserQuestion:
I fetched
{N}task(s) from{task_manager_label}. Look right?
Options:
task_fetch_instructions, re-try.Show the user the error and suggest the most likely cause — usually configuration. Map the failure shape to a hypothesis:
LINEAR_API_KEY, GITHUB_TOKEN, JIRA_API_TOKEN). Ask the user to set it, then retry.After the user adjusts, re-run the call. Cap the loop at ~5 retries; if it still doesn't work, offer status: "skipped".
Whatever instructions actually produced a successful fetch are what get baked into the helper skill in Step 4 — so do not move on until the call works (or the user accepts an empty-but-successful response).
Now that the fetch works, generate .claude/skills/claude-slack-bridge_list-tasks/SKILL.md directly (no external template — write the file from scratch using the values you collected).
Create .claude/skills/claude-slack-bridge_list-tasks/ if missing, then write SKILL.md with this exact shape (atomic write: .SKILL.md.tmp → os.replace):
---
name: claude-slack-bridge_list-tasks
description: "List the open tasks assigned to the current user from {task_manager_label} via {integration_method}. Returns a list of task names only (no ids, URLs, or descriptions) for the /process clarification skill."
---
# claude-slack-bridge_list-tasks — fetch open tasks from {task_manager_label}
This skill is invoked by the `/process` clarification skill via the Skill tool. Its only job is to fetch the current user's open tasks from {task_manager_label} and return their names.
## How to fetch
Task manager: **{task_manager_label}** (`{task_manager_slug}`)
Integration method: **{integration_method}**
Run the following exactly as recorded during `/process-setup`:
{task_fetch_instructions}
## Output
Return **only the task names / titles**, one per line. Do not include ids, keys, numbers, URLs, descriptions, status, assignees, or any other metadata — just the names.
If the fetch returns zero tasks, say so explicitly rather than returning an empty response. If the fetch fails, surface the error verbatim — do not silently swallow it; the caller needs to know the integration broke.
Substitute the values inline as you write the file (do not leave {task_manager_label} etc. literally in the output):
{task_manager_label} → the label from Step 1 (e.g. Linear){task_manager_slug} → the slug from Step 1 (e.g. linear){integration_method} → from Step 2a (mcp / cli / plugin / api){task_fetch_instructions} → the exact instructions from Step 3 that produced a successful fetch (preserve formatting — code fences, command lines, tool names)The frontmatter name must be exactly claude-slack-bridge_list-tasks so the /process skill can invoke it via the Skill tool.
After writing the file, invoke the freshly written claude-slack-bridge_list-tasks skill via the Skill tool to confirm it actually works as a skill (not just as the loose calls from Step 3). This catches issues like wrong frontmatter name, the skill not being picked up, or broken template substitution.
Show the user a short preview of the result and ask via AskUserQuestion:
The generated
claude-slack-bridge_list-tasksskill returned{N}task(s). Look right?
Options:
status: "configured"..claude/skills/claude-slack-bridge_list-tasks/SKILL.md directly or loop back to Step 3, then re-run Step 5.status: "skipped" (and consider removing the half-broken helper skill file).Cap retries at ~3. Only return status: "configured" after the user confirms the generated skill works.
End your final reply with a single fenced JSON block so the caller can parse the result.
For the configured case:
{
"status": "configured",
"task_manager_label": "Linear",
"task_manager_slug": "linear",
"integration_method": "mcp"
}
For the skipped case:
{
"status": "skipped"
}