بنقرة واحدة
kanban-dashboard
{{AGENT_NAME}} kanban board UI — Flask dashboard server for visual task management
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
{{AGENT_NAME}} kanban board UI — Flask dashboard server for visual task management
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
| name | kanban-dashboard |
| description | {{AGENT_NAME}} kanban board UI — Flask dashboard server for visual task management |
Flask server가 kanban board를 렌더링. SSE 실시간 업데이트 + 드래그드롭 + 모바일 대응.
URL: http://macmini:8765/kanban
## Topic 첫 문단 추출한 1줄 요약 (.card-summary, 2줄 clamp)obsidian://open 링크) — _extract_draft_path()로 body ## Draft 파일 위치 파싱, _obsidian_url()로 URL 변환## Draft 파일 위치 경로가 있으면 렌더링) + ✏️ Edit 버튼GET /kanban/api/task/<id>POST /kanban/api/edit 호출. 저장 후 SSE 브로드캐스트로 보드 새로고침.~/Library/LaunchAgents/ai.{{AGENT_NAME_LOWER}}.kanban-dashboard.plist
KeepAlive: SuccessfulExit=false → 프로세스 죽으면 자동 재시작~/.{{AGENT_NAME_LOWER}}/P6-prefrontal/logs/kanban-server.log# 상태 확인
launchctl list | grep kanban
# 수동 시작/정지
launchctl start ai.{{AGENT_NAME_LOWER}}.kanban-dashboard
launchctl stop ai.{{AGENT_NAME_LOWER}}.kanban-dashboard
# 로그 확인
tail -f ~/.{{AGENT_NAME_LOWER}}/P6-prefrontal/logs/kanban-server.log
| Method | Path | Description |
|---|---|---|
| GET | /kanban | Kanban board HTML (SSE 실시간 업데이트) |
| GET | /kanban/api/board | JSON board state (tasks grouped by status) |
| GET | /kanban/api/task/<task_id> | Full task detail (body + events) — 모달 데이터 소스 |
| GET | /kanban/api/events | Recent events (minutes query param) |
| GET | /kanban/api/stream | SSE 실시간 스트림 |
| POST | /kanban/api/complete | task complete |
| POST | /kanban/api/claim | task claim |
| POST | /kanban/api/block | task block |
| POST | /kanban/api/unblock | task unblock |
| POST | /kanban/api/create | task create |
| POST | /kanban/api/delete | task delete |
| POST | /kanban/api/dispatch | task dispatch (spawn worker) |
| POST | /kanban/api/update_status | task status 변경 (드래그드롭) |
| POST | /kanban/api/edit | task title/body 수정 (form: task_id, title, body) |
kanban_dashboard_server.py에 내장된 body 파싱 함수들:
| 함수 | 용도 |
|---|---|
_extract_summary(body) | ## Topic 첫 문단 추출, bold/newline 제거, 180자 truncation |
_extract_source(body) | ## Content Source 섹션에서 source + score 파싱 |
_categorize(title) | 제목 [tag] prefix 추출 (예: draft-trend, draft-conversation) |
_cat_color(cat) | 카테고리 → 컬러 매핑 (trend=#5bc0eb, conversation=#aa66ff, seo=#00c853) |
_cat_emoji(cat) | 카테고리 → 이모지 매핑 (trend=📈, conversation=💬, seo=🔍) |
_extract_draft_path(body) | ## Draft 파일 위치 섹션에서 vault draft 절대경로 추출 |
_obsidian_url(vault_path) | 절대경로 → obsidian://open?vault={{AGENT_NAME}}&file=... URL 변환 (urllib.parse.quote로 인코딩) |
칸반 task body에 ## Draft 파일 위치 섹션으로 vault 경로가 기록된 경우, 대시보드에서 직접 Obsidian으로 이동 가능:
.card-draft-link: <a> 태그로 vault 파일명 표시, 클릭 시 obsidian://open URL 실행.card-draft: 경로는 있으나 URL 변환 실패 시 텍스트로만 표시event.stopPropagation()으로 카드 클릭 이벤트 충돌 방지## Draft 파일 위치 regex 매칭 후 동적 생성)background:#8b5cf6, 흰색 텍스트, 6px radiusobsidian://open?vault={{AGENT_NAME}}&file={encodeURIComponent(relative_path)}~/.{{AGENT_NAME_LOWER}}/P2-hippocampus/memories/insights/YYYY-MM-slug.mdP2-hippocampus/memories/insights/YYYY-MM-slug.md{{AGENT_NAME}} (고정 — ~/.{{AGENT_NAME_LOWER}} 디렉토리명)obsidian:// scheme 핸들러 등록 필요.Kanban 보드 정리 프로토콜 — content pipeline에서 생성된 draft-trend task가 쌓이면:
POST /kanban/api/delete로 제거 (board clutter 방지)GET /kanban/api/board로 최종 상태 확인정리 기준: [draft-trend] task는 같은 GitHub repo/주제명이면 중복으로 간주. assignee=None + created_at 14일 이상이면 stale.
~/.{{AGENT_NAME_LOWER}}/P4-cortex/scripts/kanban_dashboard_server.py~/Library/LaunchAgents/ai.{{AGENT_NAME_LOWER}}.kanban-dashboard.plistget_tasks() in server uses its own init_db() — task table schema must match {{AGENT_NAME_LOWER}}_tasks.db (both use same board column). If schema mismatches, board returns empty.http://macmini:8765/kanban (same network). MacMini hostname or IP 사용.{{var}} → literal {var} 출력. Python 변수 사용은 {var} (single brace).kanban_dashboard_server.py doesn't auto-reload. Must run launchctl stop ai.{{AGENT_NAME_LOWER}}.kanban-dashboard && launchctl start ai.{{AGENT_NAME_LOWER}}.kanban-dashboard to apply changes..venv). Syntax is OK but test in the actual venv, not system python3.onclick="openModal('tid')" on each card, but openModal(taskId), switchTab(tab), and closeModal() must be defined in the inline <script> block. If these JS functions are missing (e.g. after editing the template f-strings), clicking cards silently does nothing. Verify their presence after any edit to the HTML template section. The modal also needs escapeHtml() for safe body rendering and event listeners for Escape/overlay-close.title attribute (hover)._extract_summary() uses regex ## Topic\s*\n+(.*?)(?:\n\n|\n##) which assumes the body has a ## Topic heading followed by the summary paragraph. If the body format changes (e.g. no ## Topic), falls back to first non-empty non-heading line.POST /kanban/api/edit always updates body (even empty string) but only updates title if non-empty. To clear body, send body= (empty). The edit event is logged in task_events with kind='edited'.openModal(), switchTab(), editBody(), saveBody(), cancelEdit(), escapeHtml() are all embedded in the Python f-string HTML template. Any syntax error in these JS functions breaks the entire modal. After editing, verify with curl -s http://macmini:8765/kanban | grep -c 'function openModal' (>0 means present)._extract_summary() and _extract_source() run at page render time — they add server-side compute per card. For boards with 50+ cards, consider caching or moving extraction to JS. Currently fine for <30 cards.obsidian://open requires (1) Obsidian.app installed on macOS, (2) browser-registered URL scheme handler. Links silently fail on non-macOS or without Obsidian. The _obsidian_url() function only generates URLs for paths under ~/.{{AGENT_NAME_LOWER}}/ — other paths render as plain text._extract_draft_path() relies on the exact section header ## Draft 파일 위치 in the body. If the content-pipeline changes this header (e.g. to ## Draft Location), draft links stop rendering silently. The regex also expects the path on the immediately following line.task.body. This means if the body is edited via the dashboard (Edit button), the Obsidian link updates automatically on next modal open — no page reload needed. But if the body is edited externally (DB direct, API), the modal shows stale links until reload.*/5 * * * *)1. Cron Trigger (every 5min)
↓
2. SQLite Node — Query {{AGENT_NAME_LOWER}}_tasks.db
SQL: |
SELECT id, title, status, assignee, created_at,
last_heartbeat_at, consecutive_failures
FROM tasks
WHERE board = 'default'
ORDER BY priority ASC NULLS LAST, created_at DESC
LIMIT 50
↓
3. Discord Bot Token (from .env: DISCORD_BOT_TOKEN)
↓
4. Discord Embed Builder (per status group)
↓
5. Edit Message — post board to designated Discord channel
=== {{AGENT_NAME}} Kanban Board ===
Board: default | Updated: 2026-05-19 10:30 KST
[todo] 3 tasks
🟡 t_abc123 — Implement kanban-dashboard skill
🟡 t_def456 — Fix cycle detection bug
[ready] 2 tasks
⚪ t_ghi789 — Deploy n8n workflow
[in_progress] 1 task
🔵 t_jkl012 — kanban-orchestrator skill (worker: pid 12345)
[blocked] 1 task
🔴 t_mno345 — gateway notifier (failures: 3)
[completed] 7 tasks (today: 2)
✅ t_pqr678 — multi-board support
✅ t_stu901 — activity logger integration
React to manage:
✅ = complete | 🔄 = unblock | ❌ = block
| Status | Color | Emoji | Meaning |
|---|---|---|---|
| todo | 🟡 | YELLOW | Not yet ready |
| ready | ⚪ | WHITE | Claimable |
| in_progress | 🔵 | BLUE | Worker active |
| blocked | 🔴 | RED | Waiting / failed |
| completed | ✅ | GREEN | Done |
When user reacts to the board message, n8n captures the reaction event:
1. Discord Reaction Event (add)
↓
2. Extract: message_id, emoji, user_id
↓
3. SQLite — find task by id (from message content parsing)
↓
4. Switch on emoji:
- ✅ → kanban_complete(task_id, result="manual")
- 🔄 → kanban_unblock(task_id)
- ❌ → kanban_block(task_id, reason="manual")
- 🔁 → kanban_claim(task_id, ttl_seconds=3600)
↓
5. Edit board message (refresh status)
| Emoji | Action | Tool |
|---|---|---|
| ✅ | Complete task | kanban_complete |
| 🔄 | Unblock task | kanban_unblock |
| ❌ | Block task | kanban_block |
| 🔁 | Claim task | kanban_claim |
Push task events to Discord subscribers.
CREATE TABLE IF NOT EXISTS kanban_notify_subs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
task_id TEXT NOT NULL,
platform TEXT NOT NULL, -- 'discord', 'telegram', etc.
chat_id TEXT NOT NULL,
thread_id TEXT,
subscriber TEXT NOT NULL, -- user_id or channel_id
created_at TEXT NOT NULL,
UNIQUE(task_id, platform, chat_id, subscriber)
);
CREATE INDEX IF NOT EXISTS idx_notify_task ON kanban_notify_subs(task_id);
Task event fires (completed/blocked/crashed)
↓
1. Event Listener (from {{AGENT_NAME}}TaskStore.task_events table)
↓
2. Lookup subscribers for this task_id
↓
3. Per subscriber:
- Build Discord embed with event details
- Send via Discord webhook / bot
- Include: task title, status change, result summary
↓
4. Log notification in task_events
🎉 Task Completed
[content] multi-board support
Result: boards table + board-aware dispatch_once
Time: 2026-05-19 10:35 KST
Trigger: integration_workflow
{
"name": "{{AGENT_NAME}} Kanban Board",
"nodes": [
{
"name": "Cron Trigger",
"type": "n8n-nodes-base.cron",
"parameters": {
"rule": {"interval": [{"field": "minutes", "minutes": 5}]}
}
},
{
"name": "Query Tasks",
"type": "n8n-nodes-base.sql",
"parameters": {
"operation": "executeQuery",
"dataMode": "resolve",
"query": "SELECT id, title, status, assignee, created_at FROM tasks WHERE board = 'default' ORDER BY created_at DESC LIMIT 50"
}
},
{
"name": "Build Embed",
"type": "n8n-nodes-base.code",
"parameters": {
"jsCode": "// Group by status, build Discord embed JSON"
}
},
{
"name": "Post to Discord",
"type": "n8n-nodes-discord.api",
"parameters": {
"webhook": "{{$env.DISCORD_WEBHOOK_KANBAN}}"
}
}
]
}
Board message posted to: 1492883985473208522 (content-notify-channel)
Reaction events captured via Discord bot intents: GUILD_MESSAGES, MESSAGE_REACTION_ADD
references/n8n-protocol.md — n8n webhook protocolreferences/kanban-modal-fix-20260615.md — Modal openModal/switchTab implementation detailsreferences/kanban-card-enrichment-20260615.md — Card enrichment (body summary, category badge, source) + edit API + board cleanup protocol{{AGENT_NAME}} brain signal architecture — event bus, signal processor, awareness reporter, brain monitor
TDD-PDCA plan for building a self-replicating branching agent in {{AGENT_NAME}}. 단일 에이전트가 스스로 서브에이전트를 분기하고, 결과를 수렴시키는 구조.
Integrate {{AGENT_NAME}} with ACP (Agent Client Protocol) agents. Reverse-engineered from goose's Rust ACP provider implementation.
Maintain .{{AGENT_NAME_LOWER}} as an Obsidian vault — graph connectivity overhaul (P-layer mesh, skill clusters, SEO article web), broken link detection, backlink density verification via Obsidian CLI, filename deduplication, bidirectional linking, auto-generated orphan management, cron output graph bloat prevention, and Obsidian compatibility.
AI Trend Collection & Filtering — collect GitHub trending repos, score via 5-axis philosophy filter, evaluate, apply, and retire.
RSS 피드 모니터링 → SEO 기사 수집·분석·트렌드 리포트