一键导入
daily-dashboard
Create daily dashboard with meeting agendas, tasks, and quick-access links. Creates both Obsidian-compatible dashboard file and desktop symlinks.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Create daily dashboard with meeting agendas, tasks, and quick-access links. Creates both Obsidian-compatible dashboard file and desktop symlinks.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Process meeting content into structured documentation -- summaries, decision tracking, action propagation, file updates. Config-driven for any organization. Replaces project-ops, bravo-ops, management-ops, marketing-ops.
Process and summarize transcriptions from calls, meetings, or voice recordings. Use when user provides a transcription, mentions processing a transcript, or wants to summarize a recorded conversation.
Knowledge extraction manager and skill evolution engine. Backfills _insights.yaml from historical corpus, compiles execution feedback into patterns, and proposes SKILL.md improvements.
Lifecycle management for outgoing material in `_outbox/`. List pending items, archive completed ones into the relevant contact/project folder, and keep manifest, CHANGELOG, and tasks in sync. Use when an outbox item has been sent, replied to, or otherwise resolved -- and the central `_outbox/` should be cleaned up.
Manage skill repo updates, symlink health, and installation. Fetches from multiple remotes with version safety, creates symlinks for new skills, audits symlink state.
Universal entry point for unstructured content. Classifies, stores in _inbox/, and hands off to the appropriate downstream skill.
| name | daily-dashboard |
| description | Create daily dashboard with meeting agendas, tasks, and quick-access links. Creates both Obsidian-compatible dashboard file and desktop symlinks. |
Generate a dashboard file and symlinks for quick access to today's (or specified date's) meetings, preparations, and project status.
Standalone skill -- no dependency on ops-base.
Two modes:
Template strings marked as {strings.section.key} are resolved at runtime.
Resolution order:
strings section (if loaded)base.yaml:
swedish -> strings_svenglish -> stringsinput -> match detected languageWhen scanning for files, always check both {strings.filename_keywords.*} and {strings_sv.filename_keywords.*} to handle files created in either language regardless of current config.
Parse arguments left to right:
~/.claude/skills/{arg}-ops-config/{arg}.yaml. If found, load that config and shift to the next argument.today (default), tomorrow, or YYMMDD format (e.g. 260219)./daily-dashboard -> Generic mode, today's date
/daily-dashboard today -> Generic mode, today's date
/daily-dashboard tomorrow -> Generic mode, tomorrow's date
/daily-dashboard 260219 -> Generic mode, specific date
/daily-dashboard acme -> Org mode (Acme config), today's date
/daily-dashboard acme 260219 -> Org mode (Acme config), specific date
| Mode | Filename |
|---|---|
| Generic | _Dashboard.md |
| Org | _Dashboard-{org}.md (e.g. _Dashboard-acme.md) |
This prevents collisions when running both generic and org dashboards. Both files coexist in the vault root directory.
Parse the date argument to determine target date:
today -> current datetomorrow -> next dayYYMMDD format -> specific date (e.g. 260219 = 2026-02-19)Compute both:
Use target date for:
YYMMDD-*.md)_TODAY-* always refers to target date)_Dashboard.mdScan all subdirectories of the vault root for files matching YYMMDD-*.md where YYMMDD = target date. Also scan for YYMMDD+1 (next date) to find upcoming preparations.
Scan locations:
_contacts/*/ contact folders (recursively)Categorize discovered files by keywords in the filename:
| Keyword in filename | Category | Produced by |
|---|---|---|
förberedelse or preparation | {strings.dashboard.preparations_today} | /preparation |
standup or daily-standup | {strings.dashboard.standup_section} | /ops |
Everything else (samtal, sammanfattning, etc.) | {strings.dashboard.meetings_today} | /transcript, /ops |
Always scan for both Swedish and English keywords to discover files regardless of which language was used when creating them.
Determine whether each meeting/standup has been completed or is still pending. Apply (Completed), (Pending), or no label to the ### heading.
Detection logic (in order):
förberedelse or preparation): Mark as (Pending) -- the meeting hasn't happened yet.## Nästa steg, ## Next Steps, ## Beslut, ## Decisions, ## Konklusion, ## Outcome, ## Diskussion, ## Discussion## Summary, ## Executive Summary, ## Sammanfattning, ## Action Items, ## Åtgärdspunkter, ## Huvudpunkter, ## Key Discussion Points, ## Decisions Made, #### Introduction with date/time/participants(Completed).(Pending).(Completed).Important: When running the dashboard later in the day (after meetings have occurred and been transcribed), most files will be summaries. The dashboard MUST reflect this by showing (Completed) status. A file that IS a meeting summary is by definition completed -- do not leave it without a status label.
Status labels use title case: (Completed), (Pending), (In Progress).
When both a preparation and a transcript exist for the same contact + same date:
/transcript Step 1.5)This prevents the same meeting from appearing twice in the dashboard.
Extract the contact name from the parent folder using the name resolution algorithm:
Check for _meta.yaml in the contact folder:
display_name, use it directlycompany field, use it for company contextFallback (no _meta.yaml):
david-ekberg)- with spaceDavid Ekbergerik-lindgren_techco), the part after _ is the company nameIf the file is not in a _contacts/*/ folder, use the filename to derive a display name.
See Contact Metadata Schema for _meta.yaml specification.
For each discovered file, extract:
# ...)## sections (first 3-5 items)# Dashboard - [YYYY-MM-DD] ([Weekday])
{strings.metadata.generated}: [timestamp]
---
## {strings.dashboard.preparations_today}
### [Contact Name]: [Title from H1]
**{strings.dashboard.file_label}:** [Filnamn](relative/path/to/file)
**{strings.dashboard.topics_label}:**
- [Key point 1 from ## sections]
- [Key point 2]
- [Key point 3]
---
### [Next Contact]: [Title]
...
---
## {strings.dashboard.meetings_today}
### [Contact Name]: [Title from H1]
**{strings.dashboard.file_label}:** [Filnamn](relative/path/to/file)
---
## {strings.dashboard.standup_section}
### [Project]: [Title from H1]
**{strings.dashboard.file_label}:** [Filnamn](relative/path/to/file)
---
## Uppgifter
[Generated from _tasks.yaml, all projects where private=false]
### Överförfallna
- [ ] #[id] [task] ([project]) -- [days] dagar
### P1 - Denna vecka
- [ ] #[id] [task] ([project], [due])
- [~] #[id] [task] ([project]) -- PÅGÅR
### P2 - Viktigt
- [ ] #[id] [task] ([project])
---
## Slutfört idag
[From _tasks-history.md for target date]
- [x] [task] ([project])
---
## {strings.dashboard.preparations_tomorrow}
### [Contact Name]: [Title from H1]
**{strings.dashboard.file_label}:** [Filnamn](relative/path/to/file)
**{strings.dashboard.topics_label}:**
- [Key point 1]
- [Key point 2]
---
## {strings.dashboard.no_meetings}
[Message if no files found for target date]
If a section has no files, omit the entire section (including the standup section -- only show it when standup files are found). If no files are found at all, state that clearly.
The "Uppgifter" section is always shown if _tasks.yaml exists and has active tasks. The "Slutfört idag" section is only shown if there are completions for the target date.
If the vault has a registered triage doc (an _inbox/ working document with type: working_doc + tag do-not-process -- see docs/schemas/inbox.md, CR-022 section), add a Triage section: link the doc, then inline its open PRIO items and the DENNA VECKA bucket headings with open-item counts. Optionally show the INKORG count as a nudge (INKORG: 6 osorterade).
## Triage
[daglig-triage.md](_inbox/daglig-triage.md) · Veckoankare: <line> · INKORG: <N> osorterade
### PRIO
- [ ] <open PRIO items verbatim>
### DENNA VECKA
- <bucket>: <N> öppna
This surface is read-only -- the dashboard never writes to, reorders, or checks off triage items (same principle as Rolling Plans). Upkeep is owned by the human plus /inbox triage refresh. No registered triage doc: omit the section entirely.
Applies to both generic and org mode (the triage doc is personal and vault-level, not org-scoped).
Created in the vault root directory (same directory as the dashboard file):
# Remove old dynamic symlinks
rm -f _TODAY-*.md _PREP-*.md
# Create preparation symlinks
ln -sf "_contacts/contact-folder/YYMMDD-förberedelse-file.md" "_PREP-ContactName.md"
# Create meeting/summary symlinks
ln -sf "_contacts/contact-folder/YYMMDD-samtal-file.md" "_TODAY-ContactName.md"
Important: In generic mode, do NOT create or touch persistent symlinks (_MGMT-*, _MKT-*, _MOBILE-*, etc.). Those are org mode only.
Symlink paths are relative to the vault root (e.g. _contacts/contact-folder/...).
When an org config is loaded (e.g. acme):
Load config from <vault>/<org>/_ops.yaml (CR-011). Falls back to ~/.claude/skills/{org}-ops-config/{org}.yaml with a deprecation warning until v1.17.0. This provides:
CLAUDE.md in current directory or parents~/Vault/{org}Dashboard goes in parent of vault for cross-project visibility.
Dashboard filename = _Dashboard-{org}.md (e.g. _Dashboard-acme.md). This avoids overwriting the generic _Dashboard.md.
Use CLAUDE.md MEETING ROUTING if available. Otherwise scan org-specific paths:
meetings/management/YYMMDD-*.md
meetings/management/Bob/YYMMDD-*.md
meetings/management/Carol/YYMMDD-*.md
meetings/marketing/ppc/YYMMDD-*.md
meetings/marketing/meta/YYMMDD-*.md
meetings/marketing/strategic/YYMMDD-*.md
meetings/YYMMDD-*.md # Project standup summaries
For each found meeting, extract:
Files containing standup or daily-standup in the filename are categorized under {strings.dashboard.standup_section} rather than general meetings.
If the loaded org config has workflows.rolling_plans (CR-014), add a Rolling plans section to the dashboard linking each configured plan (skip status: archived). For each plan, show its axis and a relative link to the doc; optionally pull the plan's NOW block (rows that have a status set) so the day's working items are visible at a glance.
This surface is read-only -- the dashboard never writes to or maintains rolling plans. Maintenance is owned by /ops (participant-triggered update after a 1-on-1). If a configured plan's file is missing, list it as (not yet scaffolded) rather than erroring.
Dashboard section template:
## Rolling plans
- **[<Partner>](<relative path>)** -- <axis>
- NOW: <first few open NOW rows, owner-tagged> # optional
Scan for _tasks.yaml files under the org's vault path:
Management:
ops/management/_tasks.yaml -- domain tasksops/management/CHANGELOG.md -- recent entriesMarketing:
ops/marketing/_tasks.yaml -- domain tasksops/marketing/tasks/YYMMDD-active-tasks.md or latest 260*-active-tasks.mdMobile/Projects:
projects/*/_tasks.yaml -- project tasksprojects/*/README.md -- current statusThe dashboard integrates with distributed _tasks.yaml files across the vault.
{vault_root}/_tasks.yaml # Root: projects registry + cross-project
{vault_root}/_projects/acme/_tasks.yaml # Org-level tasks
{vault_root}/_projects/acme/ops/management/_tasks.yaml # Domain tasks
{vault_root}/_projects/bravo/project-alpha/_tasks.yaml # Project tasks
{vault_root}/_private/_tasks.yaml # Personal tasks
{vault_root}/_contacts/*/_tasks.yaml # Contact tasks
{vault_root}/_tasks-history.md # Completed tasks log
Scan all _tasks.yaml files recursively in _projects/, _contacts/, and _private/ (skip . dirs). Each file has a context field identifying the source.
_tasks.yaml files in the vault (root + _projects/*/ + _contacts/*/ + _private/, recursively, skip . dirs)private: false, grouped by context_tasks.yaml files under the org's vault path (e.g., _projects/acme/**/_tasks.yaml)context field), then by prioritydue date has passeddue matches target datedue within 7 daysFor the "Teamfokus" section, generate task lists from _tasks.yaml:
## Teamfokus denna vecka
### Alex
[Generated from _tasks.yaml where project={org} or all projects in generic mode]
**Överförfallna:**
- [ ] #32 Offer Ivan 1-on-1 (due: 260215) -- 6 days overdue
**P0 - Kritiskt:**
- [ ] #8 Prata med Hank om teknisk scope (P0, due: idag)
**P1 - Denna vecka:**
- [ ] #1 Initiera brand/webb-möte (P1, innan styrelsemöte)
- [ ] #2 Planera Carols vecka (P1, due: 260305)
- [ ] #3 Boka styrelsemiddag (P1, due: 260310)
**P2 - Pågående:**
- [~] #5 Ha radarn på Indien-kostnader (P2, ongoing) -- IN PROGRESS
- [ ] #11 Offer Ivan 1-on-1 (P2)
private: true are only shown if running in a personal/private contextshared_view: true, only show tasks where private: falseWhen discovering files from _contacts/ folders, resolve the contact's classification (see Contact Metadata Schema):
| Classification | Generic mode | Org mode (shared) |
|---|---|---|
family | Show (personal view) | Exclude |
personal | Show (personal view) | Exclude |
professional | Show | Show |
confidential | Show (personal view) | Exclude (unless opted in) |
Classification is resolved from: _meta.yaml classification field > _meta.yaml private field > folder name pattern (a1-*/a2* = family) > default professional.
| YAML status | Display |
|---|---|
pending | [ ] |
in_progress | [~] with "IN PROGRESS" label |
blocked | [!] with blocked reason |
Pull from _tasks-history.md for tasks completed on target date:
## Slutfört idag
- [x] #47 War Room mobile app
- [x] #48 Daily standup
- [x] #49 Meet with Frank
Include source links for context:
- [ ] #1 Initiera brand/webb-möte (P1)
Source: [260220-samtal-Alex-Frank.md](path/to/260220-samtal-Alex-Frank.md)
Or in compact form:
- [ ] #1 Initiera brand/webb-möte (P1) -- [Frank](path/to/260220-samtal-Alex-Frank.md)
If _tasks.yaml does not exist:
ops/management/todo-Alex.md, etc.)/tasks migrate to upgradeInclude task metrics in the Quick Stats table:
## Quick Stats
| Område | Status | Nyckeltal |
|--------|--------|-----------|
| **Tasks** | 13 active | 3 P1, 2 overdue |
| **Mobile** | EXTERNAL RELEASE | v1.1.58 idag |
| **Website** | IN PROGRESS | Bob fredag |
# Dashboard - [Date: YYYY-MM-DD] ([Weekday])
Genererad: [timestamp]
---
## Standup/Projekt
[Standup summaries from today, if any]
### [Project]: [Title] - [STATUS]
**Documentation:**
- [Today's Standup Summary](path/to/standup.md)
- [Current Status (README)](path/to/README.md)
**Key Decisions:**
- Decision 1
- Decision 2
---
## Today's Meetings
### [Meeting 1 Title]
**File:** [meeting title](path/to/meeting)
**Time:** [if known]
#### Agenda
- Item 1
- Item 2
#### Decisions Needed
- Decision 1
---
### [Meeting 2 Title] (Completed)
**File:** [meeting title](path/to/meeting)
**Key Outcomes:**
- Outcome 1
---
## Priority Tracker Links
### Management
- [Tasks](path/to/ops/management/_tasks.yaml)
- [CHANGELOG](path/to/CHANGELOG.md)
### Mobile
- [Mobile Status](path/to/README.md)
- [Mobile Tasks](path/to/projects/acme-mobile-v3/_tasks.yaml)
### Marketing
- [Marketing Tasks](path/to/ops/marketing/_tasks.yaml)
---
## Critical Items (P0)
[Extract from _tasks.yaml where priority=P0 and project={org}]
| Issue | Ansvarig | Status |
|-------|----------|--------|
| **Task description** | Owner | STATUS |
---
## Quick Stats
| Område | Status | Nyckeltal |
|--------|--------|-----------|
| **Tasks** | [count] active | [P1 count] P1, [overdue count] overdue |
| **Mobile** | [status] | [key metric] |
| **Website** | [status] | [key metric] |
| **Marketing** | [status] | CPA: [value] SEK |
---
## Teamfokus denna vecka
### Alex
[Generated from _tasks.yaml where project={org}]
**Överförfallna:** (if any)
- [ ] #[id] [task] (due: [date]) -- [days] days overdue
**P0 - Kritiskt:** (if any)
- [ ] #[id] [task] (P0)
**P1 - Denna vecka:**
- [ ] #[id] [task] (P1, [due info])
- [~] #[id] [task] (P1) -- IN PROGRESS
**P2 - Pågående:**
- [ ] #[id] [task] (P2)
### [Other Team Member]
[From priority-matrix or other sources]
- [ ] Task 1
- [ ] Task 2
---
## Kommande
| Datum | Event | Ansvarig |
|-------|-------|----------|
| [date] | [event] | [owner] |
| [date] | [event] | [owner] |
---
## Senaste CHANGELOG-poster
### [YYYY-MM-DD] - [Title]
- Key point 1
- Key point 2
### [YYYY-MM-DD] - [Title]
- Key point 1
---
*Genererad: [timestamp]*
Create in vault root directory:
# 1. Remove broken symlinks (targets that no longer exist)
find . -maxdepth 1 -name "_*.md" -type l ! -exec test -e {} \; -delete
# 2. Remove old TODAY symlinks
rm -f _TODAY-*.md
# 3. Create new symlinks for found meetings
ln -sf "{org}/path/to/meeting.md" "_TODAY-MeetingName.md"
# 4. Create/update persistent symlinks (org-specific)
ln -sf "{org}/ops/management/_tasks.yaml" "_MGMT-Tasks.md"
ln -sf "{org}/ops/marketing/tasks/active-tasks.md" "_MKT-Active-Tasks.md"
# ... etc per org vault structure
Persistent symlinks (_MGMT-*, _MKT-*, _MOBILE-*, etc.) are only created/updated in org mode.
Use title case consistently for meeting status labels:
(Completed), (In Progress), (Pending)(COMPLETED), (IN PROGRESS), (PENDING)This applies to meeting headers: ### Meeting Name (Completed)
_tasks.yaml files in vault, filter by org/context/privacy_tasks-history.md_Dashboard.md (generic) or _Dashboard-{org}.md (org mode)After execution, report what was found and created:
Dashboard skapad: _Dashboard.md (generic)
Filer hittade för 2026-02-19:
Förberedelser:
- David Ekberg: 260219-förberedelse-samtal-Alex-David-Ekberg.md
Samtal:
- Erik Sandberg: 260219-samtal-Alex-Erik-Sandberg-lokal-LLM-infrastruktur-kunddata.md
Standup/Projekt:
- Project Alpha: 260219-project-alpha-daily-standup.md
Deduplicerade (förberedelse dold -- samtal finns):
- Erik Sandberg: 260219-förberedelse-möte-erik-sandberg (samtal hittad)
Morgondagens förberedelser (2026-02-20):
- Bob Lindgren: 260220-förberedelse-samtal-Alex-Bob-Lindgren.md
Symlinks skapade:
- _PREP-David-Ekberg.md
- _TODAY-Erik-Sandberg.md
- _TODAY-Project-Alpha-Standup.md
Dashboard created: _Dashboard-acme.md
Broken symlinks removed: [count, if any]
- _OLD-Deleted-File.md (target missing)
Meetings found for 2026-02-19:
- Management Weekly (260219-Acme-Weekly-Management-Meeting.md)
- Bob 1-on-1 (260219-Alex-Bob-lunch-briefing.md)
Symlinks created:
- _TODAY-Management.md
- _TODAY-Bob.md
- _MGMT-Priority-Matrix.md
- _MKT-Active-Tasks.md
Critical items: 2 (see dashboard)
strings_sv defaults){strings.dashboard.preparations_today}, {strings.dashboard.meetings_today}, {strings.dashboard.preparations_tomorrow}(Completed), (In Progress)language settingper_claude_md, follow the project CLAUDE.md LANGUAGE POLICYswedish_chars: strict, enforce correct characters_Dashboard.md. Org dashboard: _Dashboard-{org}.md. Both coexist -- no collision._TODAY-* and _PREP-* symlinks are cleaned up automatically each run_MGMT-*, _MKT-*, _MOBILE-*) are only created/updated in org mode_contacts/ folders[Display Name](relative/path/to/file) (NOT wikilinks -- wikilinks are not supported by Typora)The task integration uses distributed files:
| File | Purpose | Created by |
|---|---|---|
_tasks.yaml (root) | Projects registry + cross-project tasks | /tasks skill |
_tasks.yaml (per-folder) | Folder-specific tasks | /tasks, /ops, /transcript |
_tasks-history.md | Completed tasks log | /tasks done command |
Optionally create a persistent symlink for quick access:
# In vault root directory
ln -sf "_tasks.yaml" "_TASKS.yaml"
If _tasks.yaml doesn't exist but legacy files do (e.g., todo-Alex.md), the dashboard will:
/tasks migrate to upgrade from legacy task files"See ~/.claude/skills/tasks/skill.md for the complete _tasks.yaml schema.
In org mode (/daily-dashboard acme):
_tasks.yaml files under the org's vault pathprivate: true/false based on dashboard sharing settingsIn generic mode (/daily-dashboard):
_tasks.yaml files, grouped by contextprivate: true (hide from output)