jayantdevkar/claude-code-karma/link-ticket-to-session
Claude Code and agent skill by jayantdevkar/claude-code-karma
- community
Checking that the SKILL.md file is still in the repository.
Link the current Claude Code session to a ticket (Linear, Jira, GitHub Issues, or GitHub Pull Requests) and cache its title/status in karma. Use when the user explicitly asks to link, attach, associate, or connect this session to a ticket, issue, or PR — e.g. "/link-ticket-to-session ABC-123", "link this session to LINEAR-42", "associate this work with issue #15", "attach session to PR octocat/repo#7". Do NOT auto-invoke from passing ticket-key mentions in normal conversation.
Install
npx vskill@latest install jayantdevkar/claude-code-karma/link-ticket-to-sessionSKILL.md
You are linking the current Claude Code session (${CLAUDE_SESSION_ID}) to: $ARGUMENTS
Karma is a read-only observer on the user's machine. It stores the link and caches title/status for display, but never writes back to the ticket provider. You fetch metadata via the user's already-configured MCP server.
Karma's API URL comes from KARMA_API_URL (set by users on non-default ports/hosts) with http://localhost:8020 as fallback. Inline ${KARMA_API_URL:-http://localhost:8020} in every curl below — bash variables don't persist across separate Bash tool calls, so a top-of-script assignment would be empty by the time the next curl runs.
Step 1 — Parse $ARGUMENTS
Recognized forms:
| Provider | Short ref | URL forms | |
|---|---|---|---|
| Linear | LINEAR-123 | https://linear.app/.../issue/ABC-123 | |
| Jira | PROJ-45 | https://*.atlassian.net/browse/PROJ-45 | |
| GitHub Issue | owner/repo#42 | https://github.com/owner/repo/issues/42 | |
| GitHub PR | owner/repo#42 | https://github.com/owner/repo/pull/42 |
GitHub issues and pull requests share a single numbering namespace — owner/repo#42 could be either. The URL kind (`/issues/` vs `/pull/`) is the only signal, and karma's backend preserves it, so when you have a URL keep it intact when POSTing (Step 4). For a bare owner/repo#N with no URL, default to /issues/N — GitHub auto-redirects to /pull/N when N is actually a PR, so the link still resolves.
A bare #N (no owner/repo) is not accepted — always qualify with owner/repo#N.
Step 2 — Identify provider and (for GitHub) kind
Set two variables you'll use below:
<provider>∈linear|jira|github- For GitHub:
<kind>∈issue|pull_request(derived from URL path)
For Linear and Jira this collapses to just <provider>.
Step 3 — Fetch metadata via MCP (when available)
Pick the right MCP tool for the provider and kind:
| Provider · Kind | MCP tool | |
|---|---|---|
linear | Linear MCP — search/fetch issue by key | |
jira | Atlassian MCP — fetch by key | |
github · issue | mcp__plugin_github_github__issue_read, method get | |
github · pull_request | mcp__plugin_github_github__pull_request_read, method get |
Calling the wrong GitHub method silently returns the wrong thing because both shapes look superficially similar — so derive the kind first.
If the relevant MCP isn't installed, skip this step and proceed to Step 4 without title/status. Karma will create the link; the title/status fields stay NULL and can be refreshed later via Step 5.
Pull at minimum: title, status (or state), url. Strip large fields — karma caps metadata_json at 64 KB and a full PR payload easily exceeds that. Specifically drop:
- GitHub PR:
body,commits,files,reviewers,comments,labels,
requested_reviewers, head / base blobs beyond ref
- GitHub issue:
body,comments,reactions,labels - Linear / Jira:
description,comments,subscribers,attachments
Status semantics by kind
The status you cache should reflect what the provider says now, not a generic "open/closed". Karma's UI normalizes these to canonical buckets at render time, so faithful provider language is the right input:
- Linear: workflow state name verbatim — e.g.
Backlog,In Progress,
In Review, Done, Cancelled (workspace-defined; don't normalize).
- Jira: workflow state name — e.g.
To Do,In Progress,In Review,
Done.
- GitHub issue:
openorclosed. - GitHub PR: derive from the flags the PR API returns:
state | draft | merged | Cache as | |
|---|---|---|---|---|
open | true | — | draft | |
open | false | — | open | |
closed | — | true | MERGED | |
closed | — | false | closed |
Step 4 — POST the link
The url field should be the URL you actually have — /pull/N for PRs, /issues/N for issues. Don't rewrite it. Karma's parser preserves the path segment; the UI uses it to distinguish PRs from issues.
For GitHub, <key> is always owner/repo#N regardless of kind — the URL field carries the issue/PR distinction.
Step 5 — PUT the metadata (only if Step 3 succeeded)
For GitHub keys with / and #, URL-encode the key in the path: octocat/repo#42 → octocat%2Frepo%2342.
Step 6 — Confirm to the user
One line. For GitHub, distinguish the kind so the user knows what they just attached:
Linked session to LINEAR-123 (Fix login bug, In Progress) — open at https://linear.app/...Linked session to PROJ-45 (Migrate auth, Done) — open at https://acme.atlassian.net/browse/PROJ-45Linked session to octocat/repo#42 [issue] (Empty state lies, open) — open at .../issues/42Linked session to octocat/repo#42 [PR] (Fix linting, MERGED) — open at .../pull/42
Notes
- Karma is loopback-only by default.
KARMA_API_URLoverrides for custom
port or remote host.
- POST is idempotent on
(session, ticket); re-running upgrades the
link_source if previously set by branch-detect or dashboard. Order: slash_command > dashboard > branch.
- If the API is unreachable, tell the user
karma not running at ${KARMA_API_URL:-http://localhost:8020} so they see what was tried. Don't silently succeed.
- GitHub issues and PRs sharing
#Nmeans a single karma row (one
(provider, external_key) pair) covers both views of that number. The URL field is what tells karma's UI which one to render. Send the URL you actually have.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/link-ticket-to-session/SKILL.md
Popularity
- Repository stars
- 233
- Repository forks
- 27
- 7-day trend score
- 27
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/jayantdevkar/claude-code-karma/link-ticket-to-session)