소스 정보
- 저장소
- AzureFoxStudios/wabi
- 최근 소스 활동
- 2026년 8월 28일 15:43
- 감지된 SKILL.md 언어
- 영어
- 스타
- 4
- 포크
- 2
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/AzureFoxStudios/wabi --skill wabi-planner-workspace명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
| name | wabi-planner-workspace |
| description | Use when reviving or extending Wabi Planner UX. |
| version | 1.0.0 |
| metadata | {"hermes":{"tags":["wabi","frontend","planner","kanban","ux"],"related_skills":["wabi-frontend-architecture","wabi-opencode-dispatch","wabi-frontend-polish"]}} |
/business--biz-* bleed, squished toolbar buttons| Path | Host | Role |
|---|---|---|
| Main app | PlannerWorkspace.svelte | Real host after 2026-08-06 A–F revival |
/business | redirect → openPlannerSurface() + optional ?view= | Alias only |
| Donor | BusinessSurface.svelte | Density reference; guest/export until confirmed unused |
Data: frontend/src/lib/business/* (localStorage). Children: Calendar, KanbanBoard, DiaryView, ProjectsView, TaskPanel.
embedded + addSignal.overdueTodos, todaysTodos, week, upcomingEvents).reloadFromStorage() on mount (exported, idempotent).TaskPanel — not bare rightPanelView: 'tasks'..planner-surface shims --biz-* → main indigo; accent = --accent-primary-color.Authorization: `Bearer ${token}`.ChatHeader / WorkspaceViewBar pills — not a duplicate ChannelSidebar button.Business tree is still largely Svelte 4 (export let / on:click / $:) — match the file. Do not force a full runes rewrite mid-task.
opencode/deepseek-v4-flash-free; Python subprocess prompt-as-arg; background + notifyfrontend/src/lib/components/business/**, lib/business/**, kanban/calendar/diary CSS, routes/business/*****, bun run check + STATIC_BUILDdocs/plans/, never /tmpdocs/plans/2026-08-06-planner-ux-critique-and-revival.mddocs/plans/2026-08-06-planner-ux-implementation-report.mdwabi-frontend-architecture (WorkspaceViewBar, softlock rules)OpenCode A–F is necessary but not sufficient. Hermes taste-pass verifies hierarchy, not re-token:
embedded — hide child Add Event/Task/New Entry; host owns New.New Event|Task|Entry|Project; caret = menu; Escape closes..view-board { padding: 0 }; columns ≥~280px.{users}; Map lookup not .find() per card.newPrimaryLabel/view-board/Escape; if wiped whole-file rewrite.Root cause: TWO stylesheets define .kanban-board with conflicting layout and the WRONG one wins every load:
frontend/src/styles/components/kanban-board-part1.css (~line 360): .kanban-board { display:flex; flex-direction:row; flex-wrap:nowrap; width:max-content; min-width:100%; height:100% } — the CORRECT horizontal spread.frontend/src/styles/components/todo-list.css (~line 160, legacy): .kanban-board { display:grid; gap:1rem; flex:1; overflow-x:auto; min-width:0 } — grid with NO grid-template-columns → every column stacks vertically (falls through the floor) — PLUS @media (max-width:1200px/900px/600px) { .kanban-board { grid-template-columns: repeat(3|2|1, 1fr) !important } } that stomp at every width.styles.css imports kanban-board.css at line ~60 and todo-list.css at line ~77. Same specificity → later import wins → the legacy grid rule stomps the modern flex rule deterministically. This is NOT a cache/regression ghost — verify by grepping for both definitions:
grep -rn "\.kanban-board {" frontend/src/styles/ # must be only kanban-board-part1.css
grep -rn "kanban-board" frontend/src/styles/components/todo-list.css # must be nothing
Fix (landed 2026-08-08): delete the legacy .kanban-board/.kanban-column/.column-header/.count/.column-content rules AND the three !important grid media queries from todo-list.css (keep rules genuinely used by the standalone todo list: .todo-card, .list-view, .todo-table, .filters for non-kanban). Also delete the .card-title legacy override risk (part1 defines its own). Rule of thumb: kanban/planner DOM must be styled ONLY by kanban-board-part1/2.css + PlannerWorkspace.css — never re-declared in todo-list.css or calendar-view*.css.
Planner used to show THREE add entry points when embedded; now exactly one:
PlannerWorkspace.svelte New split-button = the ONLY primary (its triggerNew() bumps addSignal for the active child).KanbanBoardImpl.svelte: removed the embedded-only kanban-add-btn ("Add Task" header button, was a duplicate). Per-column + buttons in KanbanBoardColumns.svelte are intentional — keep.M12 5v14M5 12h14) which read as another Add — swapped to a three-bars columns glyph (M4 5h4v14H4zM10 5h4v14h-4zM16 5h4v14h-4z). Gear stays for show/hide columns.CalendarImpl.svelte: + Add Event hidden when embedded (host New covers it); header alignment already fine (min-height:36px on .today-btn/.add-btn, align-items:center on .header-right).Verification: grep -n "kanban-add-btn" KanbanBoardImpl.svelte → nothing; planner shows exactly one primary New control per view.
See references/local-first-performance.md. Highlights: debounce localStorage 250ms + hide flush; persistGate batch apply; calendar day Maps; no fake kanban user dep; single-pass todosByStatus. Do not reintroduce sync save on every subscription.
lib/business/sync.ts targets GET /api/business/get + POST /api/business/sync + socket business-data-updated. The Rust backend never had these routes (verified across full git history incl. tags; api/routes.rs has no business nest). Default mode is 'manual' and no UI ever called pull/push/triggerSync, so every browser keeps a private localStorage["business_data"] copy. Cross-device "calendar not in sync with kanban" = this, not a view bug; within one browser calendar+board share $todos fine.
Shipped honesty layer: businessSyncAvailable store + probeBusinessSyncCapability() (one GET probe at sync-init; 404 → device-local forever, zero doomed traffic). Planner header badge shows "On this device" vs "Synced to server" from the store; ⋯ menu has Export/Import JSON as the real cross-device bridge. When backend routes land, everything flips automatically.
Backend design (deferred): channel-scoped snapshot routes mirroring wiki — GET/PUT /api/planner/{channel_id}/snapshot, blob per channel in WDB. Channels-as-roadmaps: a Planner channel owns roadmap content; views stay personal/local.
The old checkbox ("Sign this X with my username") is GONE from all 5 forms. It silently coupled signing to visibility public/private — that coupling is removed (behavior change, disclosed).
ItemSignature { by, name, at } in shared/businessContracts.ts; optional signatures?: ItemSignature[] on Todo/CalendarEvent/DiaryEntry/Project/Sprint. Legacy signedBy still written = first signer's name (older-client mirror); validation has sanitizeSignatures().SignatureRow.svelte — chips (name + rel time, own chip removable) or quiet "+ Sign off"; legacy-only items render one read-only chip. Wired into KanbanTaskModal, CalendarEventModal, ProjectModal, SprintModal, DiaryView editor.✍ N badge (.card-signed in kanban-board-part1.css), day-modal/diary show joined names.draftSignatures (+ legacySignedBy for read-only display), binds into modal, writes both fields on submit.planner.activeView persisted per device (views-local decision); deep-link still wins on mount.initialFilter prop + {#key taskPanelEpoch} remount); Week→upcoming filter; Events → Calendar tab.TodoTaskModal.svelte confirmed orphan (zero importers) but kept consistent with new signature props anyway.PlannerAvatar.svelte — pfp with colored-initial fallback (xs 16 / sm 20 / md 28). Wired into: kanban card assignee chips, calendar day-grid task pills, calendar sidebar rows, day-modal task rows, TaskPanel assignee tags, SignatureRow chips. Replaces the flat color-dot chips.lib/business/plannerUsers.ts — ONE /api/users fetch per session (ensurePlannerDirectory(), idempotent) + plannerUserById derived Map + helpers. KanbanBoardImpl and TaskPanel previously each fetched on mount; both now mirror the shared store into their legacy registeredUsers shape.'planner-tasks' manifest in workspacePanels.ts (+ 'tasks' icon union + KNOWN_COMPONENT_KEYS), tasks glyph in WorkspacePanelIcon.svelte, {:else if panel.component === 'planner-tasks'} branch in WorkspacePanelHost.svelte, and compact prop on TaskPanel (+ .task-panel-container.compact block at end of task-panel.css; that file is globally imported by styles.css so the dock gets it free).svelte-check may report a pre-existing error in the peer session's dirty callingWabidb.ts — scope-check before attributing; vite build does not typecheck.Project.channelId? (optional, additive): piped-to-channel vs personal. plannerScopes.ts: PERSONAL_SCOPE, pipableChannels (no DMs/threads), projectsForCurrentChannel, filterTodosByScope. ProjectModal has "Pipe to channel" select. No planner channel type ever — sharing rides membership.InsightsView.svelte): status chips, per-assignee workload bars w/ overdue marks, piped-plans list, all-projects Gantt (selectedProjectId={null} already worked). Read-only aggregation only.generateBurnChartData(id,start,end,{scopeIn}) — scope grows at createdAt (legacy flat = {scopeIn:false}); range picker Auto/30d/90d; labels now "Remaining/Completed (h)".LoreCitationRef contract; Todo.loreRefs; KanbanTaskModal parses ch_x ^c/path:line paste notation; LoreRefChips.svelte renders mono chips on cards, opens signed lore URL. Fully inert without addon.Gotchas hit: patch tool once corrupted businessContracts.ts via @@ inside old_string (matched literally) — re-read after any suspicious diff. currentChannel store is a plain string|null id, not an object. Stale LSP repeatedly reported missing exports that exist (verify with grep before "fixing").
Absorbed wabi-planner-workspace-ux. Shell/routing → wabi-frontend-architecture. This skill = host UX + business-store perf.