一键导入
langwatch-kanban
// Manage the LangWatch Kanban GitHub project board — sync statuses, view your board, find stale items, move issues, assign work.
// Manage the LangWatch Kanban GitHub project board — sync statuses, view your board, find stale items, move issues, assign work.
Maintain the canonical LangWatch feature map (/feature-map.json). Use when adding features, APIs, MCP tools, CLI commands, or skills — to update the central registry and keep surfaces in sync.
Project-level code review: check changed files against LangWatch codebase rules (IDs, multitenancy, layering, naming, SRP).
Collaborative headed browser session for UI work. Launch Playwright Chromium visible to the user, handle auth, then interactively drive the browser while the user watches and gives real-time visual feedback. Edit code and refresh to verify fixes live. Use when the user says 'browser pair', 'paired browser', 'let's look at this together', 'open chromium', or wants to iterate on UI with live visual feedback.
Validate a feature works by driving a real browser with Playwright MCP. No test files — just interactive verification.
| name | langwatch-kanban |
| description | Manage the LangWatch Kanban GitHub project board — sync statuses, view your board, find stale items, move issues, assign work. |
| user-invocable | true |
| allowed-tools | Bash(gh:*), Bash(python3:*) |
| argument-hint | <sync|my-board|stale|move|assign> [args] |
Manage the LangWatch Kanban GitHub project board (project #5, org: langwatch).
Read the project board reference from memory before doing anything:
/Users/USER/.claude/projects/-Users-hope-workspace-langwatch-workspace-langwatch-saas-langwatch/memory/reference_gh-project.mdThis contains all project IDs, field IDs, status option IDs, and GraphQL patterns. Use python3 for all JSON parsing — issue titles with special characters break jq.
Parse $ARGUMENTS to determine which subcommand to run:
syncSync the project board so statuses match reality.
projectV2.items queryCLOSED or MERGED but project status is NOT Done or ReleasedDone using the updateProjectV2ItemFieldValue mutationSynced N items to Done:
#123 — Title here (was: In progress)
#456 — Title here (was: Ready)
my-boardShow the current user's assigned items grouped by status.
gh api user --jq .login## In progress (3)
- #123 — Title here [bug]
- #456 — Title here [feature, scenarios]
## Ready (2)
- #789 — Title here [chore]
## Backlog (5)
- #101 — Title here
...
Done and Released itemsstaleFind items that may be stuck or forgotten.
#123 — Title [In progress, last updated 21 days ago]
#456 — Title [Blocked, no comments since 2026-03-01]
move <issue-number> <status>Move an issue to a new status on the board.
backlog → 14fed42eblocked → 131e7d86ready → 12261fbfin-progress / progress → 3264b20ein-review / review → 90b57b27done → 2b388473released → 7717b7edstale → 9fefdc9dMoved #123 to In progressassign <issue-number>Assign an issue to the current user and ensure it's on the board.
gh api user --jq .logingh issue edit <number> --repo langwatch/langwatch --add-assignee <login>gh project item-add 5 --owner langwatch --url <issue-url>Assigned #123 to <login> and added to LangWatch KanbanUse this python3 pattern for all paginated queries:
import subprocess, json
cursor = None
results = []
for page in range(1, 9):
after = f', after: "{cursor}"' if cursor else ''
query = '''{
organization(login: "langwatch") {
projectV2(number: 5) {
items(first: 100''' + after + ''') {
nodes {
id
content {
... on Issue { number title state }
... on PullRequest { number title state merged }
}
fieldValueByName(name: "Status") {
... on ProjectV2ItemFieldSingleSelectValue { name }
}
}
pageInfo { hasNextPage endCursor }
}
}
}
}'''
result = subprocess.run(
['gh', 'api', 'graphql', '-f', f'query={query}'],
capture_output=True, text=True
)
data = json.loads(result.stdout)
items = data['data']['organization']['projectV2']['items']
for n in items['nodes']:
content = n.get('content') or {}
status = (n.get('fieldValueByName') or {}).get('name', '')
# ... process each item ...
results.append({...})
if not items['pageInfo']['hasNextPage']:
break
cursor = items['pageInfo']['endCursor']
$ARGUMENTS is empty or unrecognized, show usage:
Usage: /langwatch-kanban <command> [args]
Commands:
sync Sync closed issues/PRs to Done status
my-board Show your assigned items by status
stale Find stuck or forgotten items
move <#number> <status> Move an issue to a new status
assign <#number> Assign issue to you and add to board
Statuses: backlog, blocked, ready, in-progress, in-review, done, released, stale
gh auth status fails, tell the user to run gh auth logingh auth refresh -s projectThese are hardcoded from the LangWatch Kanban project:
PROJECT_NUMBER = 5
ORG = "langwatch"
REPO = "langwatch/langwatch"
PROJECT_ID = "PVT_kwDOCL9uOs4BH69J"
STATUS_FIELD_ID = "PVTSSF_lADOCL9uOs4BH69Jzg4iLlU"
STATUS_OPTIONS = {
"Backlog": "14fed42e",
"Blocked": "131e7d86",
"Ready": "12261fbf",
"In progress": "3264b20e",
"In review": "90b57b27",
"Done": "2b388473",
"Released": "7717b7ed",
"Stale": "9fefdc9d",
}