agentleFS
willfanguywillfanguy/work-summary-kit/skills/daily-summary/SKILL.md

daily-summary

Skill0 starsChanged 7 months agoMITView on GitHub

Generate a comprehensive daily work summary from your configured data sources. Supports: Git commits, JIRA tickets, Google Calendar, Slack messages, Google Drive, and multiple task management systems (Obsidian, JIRA, Google Tasks, Linear). Adapts output to whatever sources you have enabled. Run /daily-summary to generate. First-time users: run /summary-init to create your config.

8 other projects use a version of this.

Adopted by

Most recently taken up by

The file

Show its rules and text

We split this skill into the rules it gives an agent

27 rules. 0 are common, 15 are distinctive, and 12 are very specific to this project.

  • 0

    Common

    Most of the 7 edited versions we read keep these.

  • 15

    Distinctive

    This author's own choices. Worth a look.

  • 12

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Read the user's config file:

    line 30
  2. Distinctive:

    Create output directories: if they don't exist:

    line 52
  3. Very specific:

    Read the state file at {resolved state_file path}.

    line 60
  4. Very specific:

    If lastProcessedDate matches today, increment runCountToday.

    line 71
  5. Very specific:

    If config.name_mappings exists and has entries, use it for name resolution throughout:

    line 75
  6. Very specific:

    Check confirmed first -- these override any other source

    line 77
  7. Very specific:

    Check unverified -- use email prefix only

    line 78
  8. Very specific:

    Read config.data_sources and build a list of enabled sources:

    line 83
  9. Distinctive:

    Important: Read adapter files using the Read tool.

    line 98
  10. Very specific:

    Read {kit_path}/adapters/git.md and follow its collection instructions.

    line 102
  11. Very specific:

    Follow the adapter's collection instructions.

    line 161
  12. Distinctive:

    Read the template file:

    line 167
  13. Very specific:

    If the template name contains a / or ., treat it as a file path instead.

    line 172
  14. Very specific:

    If the template file doesn't exist, fall back to daily-default.md.

    line 174
  15. Very specific:

    Use config.output.sections_order to determine which sections to include and in what order.

    line 178
  16. Distinctive:

    Check if the section's data source is enabled (see mapping below)

    line 181
  17. Distinctive:

    If the source is enabled, include the section using the template's format

    line 182
  18. Distinctive:

    If the source is disabled, skip the section entirely (no heading, no content)

    line 183
  19. Distinctive:

    Follow the template format specification.

    line 203
  20. Very specific:

    Project mapping: When displaying project names, check config.project_mappings to convert folder/path names to friendly display names.

    line 205
  21. Distinctive:

    Keep the summary scannable -- use bullet points, short paragraphs

    line 208
  22. Distinctive:

    Update the state file:

    line 239
  23. Distinctive:

    Only update state after the file is successfully written: If the write fails, leave state unchanged so the next run reprocesses.

    line 250
  24. Distinctive:

    No hallucination: Only report data that was actually collected from APIs/files.

    line 264
  25. Distinctive:

    Slack users: Only report users who appear in API responses.

    line 266
  26. Distinctive:

    JIRA status: Always use the API response, never derive status from other sources.

    line 267
  27. Distinctive:

    Name resolution: Follow the confirmed -> unverified -> source default precedence.

    line 268

“Common” is measured: kept by at least 6 in 10 of the 7 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Daily Summary Generator

Step 0: Initialize

Get current date/time in user's timezone:

TZ={timezone from config} date "+%Y-%m-%d %H:%M:%S %Z (%A)"

Store the date -- use it for all file naming and "today" references throughout.

Step 1: Load Configuration

Read the user's config file:

~/.config/work-summary/config.json

If the file doesn't exist, tell the user:

Your work summary config hasn't been created yet. Run /summary-init to set it up.

Then stop.

Validate required fields:

  • user.name, user.email, user.timezone must be present
  • paths.output_dir must be present
  • At least one data source must have enabled: true

Resolve paths:

  • Expand ~ to the user's home directory in all path fields
  • daily_output_dir: if relative, resolve against output_dir
  • state_file: if relative, resolve against output_dir
  • kit_path: if not set, try ~/.claude/skills/work-summary-kit

Create output directories if they don't exist:

mkdir -p {resolved daily_output_dir}
mkdir -p {resolved weekly_output_dir}

Step 2: Load State

Read the state file at {resolved state_file path}. If it doesn't exist, create it with defaults:

{
  "lastProcessedCommit": {},
  "lastProcessedDate": "",
  "lastRunTime": "",
  "runCountToday": 0
}

If lastProcessedDate matches today, increment runCountToday. Otherwise reset to 1.

Step 3: Load Name Mappings

If config.name_mappings exists and has entries, use it for name resolution throughout:

  1. Check confirmed first -- these override any other source
  2. Check unverified -- use email prefix only
  3. Fall back to the name from the data source (Slack profile, calendar attendee, etc.)

Step 4: Identify Enabled Data Sources

Read config.data_sources and build a list of enabled sources:

ENABLED_SOURCES = []
for each source in [git, jira, calendar, slack, drive, tasks]:
    if config.data_sources.{source}.enabled == true:
        add to ENABLED_SOURCES

Log which sources are enabled. This determines which adapters to load and which output sections to generate.

Step 5: Collect Data

For each enabled data source, read the corresponding adapter file from {kit_path}/adapters/ and follow its Collection Steps.

Important: Read adapter files using the Read tool. Each adapter is a self-contained instruction set.

Git (if enabled)

Read {kit_path}/adapters/git.md and follow its collection instructions.

Use:

  • config.data_sources.git.repos for repo paths
  • config.data_sources.git.author_email (or config.user.email) for commit filtering

Store results as GIT_DATA.

JIRA (if enabled)

Read {kit_path}/adapters/jira.md and follow its collection instructions.

Use:

  • config.data_sources.jira.* for API URL, project keys, auth env vars
  • Ticket IDs detected by the git adapter (if git is also enabled)

Store results as JIRA_DATA.

Calendar (if enabled)

Read {kit_path}/adapters/calendar.md and follow its collection instructions.

Use:

  • config.data_sources.calendar.* for provider, calendar ID, working hours, categories
  • config.user.email for the calendar query
  • config.user.timezone for time conversion

Store results as CALENDAR_DATA.

Slack (if enabled)

Read {kit_path}/adapters/slack.md and follow its collection instructions.

Use:

  • config.data_sources.slack.* for auth, username, channel categories
  • config.name_mappings for resolving user names

Store results as SLACK_DATA.

Google Drive (if enabled)

Read {kit_path}/adapters/drive.md and follow its collection instructions.

Use:

  • config.data_sources.drive.* for provider settings

Store results as DRIVE_DATA.

Tasks (if enabled and provider != "none")

Based on config.data_sources.tasks.provider, read the corresponding adapter:

ProviderAdapter File
obsidian{kit_path}/adapters/tasks-obsidian.md
jira{kit_path}/adapters/tasks-jira.md
google-tasks{kit_path}/adapters/tasks-google.md
linear{kit_path}/adapters/tasks-linear.md

Follow the adapter's collection instructions. Store results as TASKS_DATA.

Step 6: Generate Output

Load the template

Read the template file:

{kit_path}/templates/{config.output.template}.md

If the template name contains a / or ., treat it as a file path instead.

If the template file doesn't exist, fall back to daily-default.md.

Determine active sections

Use config.output.sections_order to determine which sections to include and in what order.

For each section in the order list:

  1. Check if the section's data source is enabled (see mapping below)
  2. If the source is enabled, include the section using the template's format
  3. If the source is disabled, skip the section entirely (no heading, no content)

Section-to-source mapping:

SectionRequired Source(s)Notes
executive_summaryAny enabled sourceAlways include if at least one source has data
metricsAny enabled sourceOnly show metrics for enabled sources
plan_vs_actualTasksOnly if a plan file exists for today
code_activityGit
jira_updatesJIRA
meetingsCalendar
slack_activitySlack
drive_activityDrive
completed_tasksTasks
tomorrow_focusAny enabled sourceSynthesize from available data
blockersAny enabled sourceOnly if blockers detected

Write the output

Follow the template format specification. Use the collected data to populate each section.

Project mapping: When displaying project names, check config.project_mappings to convert folder/path names to friendly display names.

Quality rules:

  • Keep the summary scannable -- use bullet points, short paragraphs
  • Lead with outcomes and impact, not process
  • Omit sections entirely when there's no data (don't show empty sections)
  • Blockers section: only include if actual blockers exist

Step 7: Write File

Determine file name

Translate config.output.file_naming pattern to an actual filename:

PatternReplacement
YYYY4-digit year
MM2-digit month
DD2-digit day
ddd3-letter weekday (Mon, Tue, etc.)
[text]Literal text (e.g., [ - Work] becomes - Work)

Default: YYYY-MM-DD.md -> 2026-03-04.md

Write the file

{resolved daily_output_dir}/{filename}

Each run REPLACES the file -- the summary always reflects the full day, not incremental updates.

Step 8: Update State

Update the state file:

{
  "lastProcessedCommit": { "repo-name": "latest-hash", ... },
  "lastProcessedDate": "{today}",
  "lastRunTime": "{ISO timestamp}",
  "runCountToday": {incremented count}
}

Only update state after the file is successfully written. If the write fails, leave state unchanged so the next run reprocesses.

Step 9: Report

Tell the user:

  • Where the file was written
  • Which data sources were collected
  • Any warnings or errors encountered
  • Key highlights from the summary (2-3 top items)

Quality Validation Rules

These rules apply regardless of which data sources are enabled:

  1. No hallucination: Only report data that was actually collected from APIs/files. Never infer, guess, or fabricate.
  2. Google Drive: Report only file metadata (name, type, timestamp, link). Never describe what was changed or why.
  3. Slack users: Only report users who appear in API responses. Never guess conversation participants.
  4. JIRA status: Always use the API response, never derive status from other sources.
  5. Name resolution: Follow the confirmed -> unverified -> source default precedence.
  6. Timezone: Convert all timestamps to the user's configured timezone before display.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.