ソース情報
- リポジトリ
- 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コマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
SKILL.md を表示中
Implementation pattern for Wabi channel categories: adding ChannelKind::Category, position/parentId support, and type updates.
Wabi production deployment and runtime debugging. Covers the Rust wabi-server binary (rust_embed static frontend), the SvelteKit build-mode mismatch (adapter-static SPA vs adapter-node SSR and why the Rust server needs index.html), Cloudflare/caddy/cloudflared tunnel WebSockets, WabiDB data-dir locks, and the selfhostability check. Use when a Wabi deploy will not boot, the login page is blank or stuck on "Starting Wabi"/"Work Offline", socket.io WS fails through Cloudflare, wabi-server restart-loops with "engine already running", or the user asks whether Wabi is still selfhostable or hardwired to wabi.chat.
Verify a Wabi binary before swap: addons, probes, locks.
| 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.