원클릭으로
switchboard-kanban
Move kanban cards and query kanban state via direct database access.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Move kanban cards and query kanban state via direct database access.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
When planning, flag uncertain assumptions and supply a ready-to-run web-research prompt to confirm them.
Local Switchboard management console — drive the board when the VS Code extension is running
Implement with high accuracy and self-review (invest effort up front to minimize rework)
Reconcile and restructure a feature's subtasks — improve each, then merge/delete/rewrite/split to make the set coherent
Deep planning, dependency checks, and adversarial review
Cloud-VM planning mode — plan first, do not auto-code in a remote VM
| name | switchboard-kanban |
| description | Move kanban cards and query kanban state via direct database access. |
| allowed-tools | Bash |
| user-invokable | false |
⚠️ MANUAL FALLBACK ONLY — The
move-card.jsscript is an override/recovery mechanism. Do NOT run it automatically during standard workflow routing. Use it ONLY when the user has explicitly requested a card move. Theget-state.jsscript is read-only and may be used freely.
Move cards and query kanban state by running the provided scripts.
Every op below is keyed on a planId (a UUID), but you should not need UUIDs for most ops. Resolve a plan the cheap way when needed, or use the path/slug-addressed APIs below so the server resolves it:
.switchboard/kanban-state-<column>.md. Every plan line ends with <!-- planId:<uuid> … -->; subtasks also carry subtask-of:"<feature>" and feature cards carry feature. One grep gives you the ID and its feature membership:
grep -i "my-plan-slug-or-title" .switchboard/kanban-state-*.md
# → …plans/my-plan.md](…) — My Plan Title <!-- planId:eb75281d-… subtask-of:"Some Feature" -->
Columns: created, backlog, plan-reviewed, lead-coded, coder-coded, intern-coded, code-reviewed, acceptance-tested, coded, completed, plus custom columns.GET http://127.0.0.1:$(cat .switchboard/api-server-port.txt)/kanban/board → { success, data: [{ planId, planFile, kanbanColumn, isFeature, featureId, … }] }.The real fix is to not need IDs at all: the path/slug-addressed feature API (
POST /kanban/features/reconcile, Feature A · A3 — landed) lets you reference plans by file path or slug and reconcile the whole feature structure in one idempotent call. Use it (see "Reorganize Features" below) instead of the per-verb UUID choreography. The two lookups above remain useful for one-off card moves.
node .agents/skills/kanban_operations/move-card.js <session_or_plan_file> <target_column>
Examples:
node .agents/skills/kanban_operations/move-card.js sess_1777206335666 CODER_CODED
node .agents/skills/kanban_operations/move-card.js .switchboard/plans/my-plan.md CODER_CODED
node .agents/skills/kanban_operations/move-card.js my-plan.md CODER_CODED
<session_or_plan_file> can be a legacy session_id, or a plan file path (relative or absolute), or a plan basename. The script resolves it to the DB planId.Valid columns: Sourced from VALID_KANBAN_COLUMNS export in KanbanDatabase.ts. Includes all built-in columns (CREATED, BACKLOG, PLAN REVIEWED, CONTEXT GATHERER, INTERN CODED, LEAD CODED, CODER CODED, CODE REVIEWED, ACCEPTANCE TESTED, CODED, COMPLETED) plus any custom agent columns matching the safe-name regex.
Features: When the card is a feature, all of its subtasks cascade to the same column automatically.
How it routes (and why it matters for Linear/ClickUp sync):
POST /kanban/move). The extension performs the move, so it cascades subtasks and pushes the feature + every subtask status to Linear/ClickUp — keeping external trackers in exact sync. When the extension is reachable it is authoritative: a refused move (e.g. an invalid transition) fails rather than silently falling back.node .agents/skills/kanban_operations/create-feature.js <feature_name> <plan_ids_json> [workspace_root] [description]
Example:
node .agents/skills/kanban_operations/create-feature.js "Onboarding revamp" '["a1b2-...","c3d4-..."]' /Users/me/repo
plan_ids_json is a JSON array of planId values (the planId field from get-state.js output) — NOT sessionId. File-watcher-imported plans have an empty session_id, so planId is the only reliable key.{"ok":true,"featurePlanId":"...","featureSessionId":"..."} on success, or {"ok":false,"error":"..."} on failure. Exit code 0/1 matches.move-card.js). Feature creation spans project inheritance, column resolution, a file write, and subtask linking; replicating that in raw DB calls would risk an orphaned feature. If the extension isn't reachable the script fails with a clear message.node .agents/skills/kanban_operations/assign-to-feature.js <feature> <plan_or_plan_ids_json> [workspace_root]
Examples:
# Add a single plan by path (no UUID)
node .agents/skills/kanban_operations/assign-to-feature.js "Agent skills improvements" .switchboard/plans/my-plan.md /Users/me/repo
# Add a single plan by slug
node .agents/skills/kanban_operations/assign-to-feature.js "Agent skills improvements" my-plan-slug
# Add a batch by UUIDs (legacy shape still works)
node .agents/skills/kanban_operations/assign-to-feature.js <featurePlanId-from-create> '["e5f6-..."]' /Users/me/repo
<feature> can be a feature planId, a feature file path, or a feature name/slug.<plan_or_plan_ids_json> is either a single plan ref (file path, slug, or planId) or a JSON array of plan refs.{"ok":true,"assigned":["..."],"skipped":["..."]}. A plan already on another feature (or that is itself a feature / missing) is reported in skipped and left untouched — it does not abort the batch.create-feature.js: requires the running extension (no direct-DB fallback). Feature assignment syncs the newly assigned subtasks as children of the feature's external issue/task IF real-time sync is enabled.improve-plan refinement.group-into-features/SKILL.md for the template).node .agents/skills/kanban_operations/remove-from-feature.js <subtask_plan_id> [workspace_root]
Example:
node .agents/skills/kanban_operations/remove-from-feature.js "e5f6-..." /Users/me/repo
subtask_plan_id is the planId of the subtask to detach from its parent feature.{"ok":true} on success, or {"ok":false,"error":"..."} on failure.node .agents/skills/kanban_operations/delete-feature.js <feature_plan_id> [delete_subtasks] [workspace_root]
Example:
node .agents/skills/kanban_operations/delete-feature.js "a1b2-..." true /Users/me/repo
feature_plan_id is the featurePlanId of the feature to delete.delete_subtasks: true to tombstone all subtasks, false (default) to detach them and leave them on the board.{"ok":true} on success, or {"ok":false,"error":"..."} on failure.node .agents/skills/kanban_operations/split-feature.js <feature_plan_id> <kept_plan_ids_json> <first_feature_name> <second_feature_name> [workspace_root]
Example:
node .agents/skills/kanban_operations/split-feature.js "a1b2-..." '["c3d4-...","e5f6-..."]' "Backend refactor" "Frontend polish" /Users/me/repo
feature_plan_id is the featurePlanId of the feature to split.kept_plan_ids_json is a JSON array of planId values that go to the first new feature. All other subtasks go to the second new feature.first_feature_name and second_feature_name are the names for the two new features.{"ok":true,"firstFeaturePlanId":"...","secondFeaturePlanId":"..."} on success, or {"ok":false,"error":"..."} on failure.Triggered by the SUGGEST FEATURES board button, which copies a prompt to the clipboard. The agent must follow this flow:
get-state.js and look only at pre-coding columns: CREATED, BACKLOG, CONTEXT GATHERER, PLAN REVIEWED. Ignore cards that are already features or already assigned (they carry an featureId).planId and current kanban column. Leave standalone plans ungrouped. Flag any cross-column groupings (plans from different columns in the same feature) with a ⚠ CROSS-COLUMN warning — see group-into-features/SKILL.md for the warning text and replan-button guidance. Then stop.create-feature.js once per approved group, no further confirmation. Use assign-to-feature.js to add more plans later. For any cross-column feature, write the ⚠ Cross-Column Review Note into the feature file (see group-into-features/SKILL.md for the template).node .agents/skills/kanban_operations/get-state.js <workspace_root>
Example:
node .agents/skills/kanban_operations/get-state.js /Users/me/repo
node .agents/skills/kanban_operations/get-state.js /Users/me/repo | jq '.columns["CREATED"] | length'
Outputs parseable JSON on stdout with columns as keys and arrays of plans as values. Diagnostic logs are routed to stderr, so piping to jq works.
When running from a different directory than the target workspace:
# Get state from specific workspace
node .agents/skills/kanban_operations/get-state.js /Users/patrickvuleta/Documents/Gitlab
# Move card in specific workspace
node .agents/skills/kanban_operations/move-card.js <session_id> <column> "" /Users/patrickvuleta/Documents/Gitlab
reconcile-features.js converges the whole feature structure to a desired end state in one idempotent call. Plans are addressed by file path / slug / topic / planId — never a raw UUID the agent must discover. New plans can be defined inline ({slug,title,body}) and reconcile writes + imports + links them. Re-running the same input is a no-op, so retry is safe.
node .agents/skills/kanban_operations/reconcile-features.js <workspace_root> '<reconcile_json>'
reconcile_json:
{
"removeUnmentionedFeatures": false,
"features": [
{
"name": "My Feature",
"description": "optional feature description",
"subtasks": [
".switchboard/plans/my-plan.md",
"my-plan-slug",
"eb75281d-...",
{ "slug": "new-plan", "title": "New Plan", "body": "## Goal\n..." }
]
}
]
}
**Feature:** <feature-plan-id> or **Feature:** <feature-name>. The watcher links it to the feature on import (apply-if-empty — it never overwrites an existing link)."removeUnmentionedFeatures": true — every active feature NOT named in the input is deleted (subtasks detached, not tombstoned). Default false (safe — never deletes by accident).{slug,title,body} writes a new plan file, imports it, and links it in one step.CREATED plan to a feature in a later column produces a warnings[] entry (not a failure).Output: { ok, features: [{name, featurePlanId, subtasks:[{planId,planFile,topic}]}], mutations: [{action,detail}], warnings: [] }.
The equivalent HTTP endpoint (for non-shell hosts) is POST /kanban/features/reconcile on the local API server (port in .switchboard/api-server-port.txt).
Single-add endpoint:
POST /kanban/features/assignwith{ feature, plan }(or{ feature, plans }for a batch) is the additive, path/slug-addressed primitive. It resolves both operands server-side and never detaches existing subtasks — use it for "add one plan" instead of the converge-to-setreconcileor UUID-onlyassignToFeature.
get-state.js | jqnow works: all diagnostic logging is routed to stderr, sonode get-state.js <root> | jq .emits parseable JSON on stdout.