{"slug":"at-daily-log","title":"at-daily-log","summary":"Summarize each day's Git activity into a concise daily work log, for a single date or a range. Uses the current repository, optional configured work projects, or paths named in conversation; configuration is never required.","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-08-30T09:57:05.189071Z","repo":{"url":"https://github.com/kairyou/agent-tools","stars":179,"forks":0,"license":"MIT","updatedAt":"2026-09-18T02:20:27Z"},"bodyHtml":"<hr>\n<h2>name: at-daily-log\ndescription: \"Summarize each day's Git activity into a concise daily work log, for a single date or a range. Uses the current repository, optional configured work projects, or paths named in conversation; configuration is never required.\"\nargument-hint: \"[</h2>\n<h1>Daily Work Log</h1>\n<p><code>resolve evidence -&gt; group related commits -&gt; draft or record</code></p>\n<h2>Date and evidence scope</h2>\n<p>Default to today. Accept plain-language dates or ranges (<code>2026-07-31</code>, yesterday, last\nweek, this month) and normalize to <code>[from, to]</code>; query through <code>&lt;to + 1 day&gt;</code> because\nGit's <code>--until</code> boundary is exclusive. State the resolved date or range.</p>\n<p>Read optional <code>workProjects</code> from <code>~/.agent-tools/config.jsonc</code>. An entry is a path\nor <code>{ \"path\", \"prompt\" }</code>, where the prompt is free text this skill follows for that\nproject, such as how to label items or which commits to skip.</p>\n<ul>\n<li>No project named: current Git repository plus configured projects.</li>\n<li>Projects named directly: only those projects.</li>\n<li>\"Also include\" / <code>另外包含</code>: add them to the default scope.</li>\n</ul>\n<p>Resolve paths to Git roots and deduplicate them. Report invalid paths; a non-Git current\ndirectory does not block other valid projects. Do not clone remote URLs without consent.</p>\n<p>For each repository, resolve the author with <code>git -C &lt;root&gt; config user.name</code>; never\ninfer aliases or use the remote login as the author.</p>\n<p>Inspect all local branches, current HEAD, user-named branches, and configured\nupstreams. Unless the user requests local-only data, refresh only the configured\nupstream branches, grouped into one best-effort <code>git fetch --no-tags &lt;remote&gt; &lt;branch...&gt;</code> per involved remote. Fetch failure is non-fatal. Do not change the\nworking tree or local branch history.</p>\n<p>Then list candidates with <code>git -C &lt;root&gt; log --no-merges --since=&lt;from&gt; --until=&lt;to+1day&gt; --format=%H%x09%an --branches HEAD &lt;upstream refs&gt;</code>, taking the\nupstream refs from <code>git -C &lt;root&gt; for-each-ref --format=%(upstream) refs/heads/</code>.\nPassing no ref walks only the current branch, so work on an unmerged branch reads as\nno activity; <code>--all</code> reaches past the scope above into remote branches nobody tracks.\nKeep the rows whose <code>%an</code> equals the resolved name exactly. Never pass <code>--author</code>: it\nmatches the whole <code>Name &lt;email&gt;</code> header, so anchored patterns silently match nothing.\nWhen the window holds commits but none carry that name, report the names actually\nfound instead. Deduplicate commits by hash.</p>\n<h2>Build work items</h2>\n<p>Collect non-merge commits for the resolved author and day. Use subjects and changed\npaths to turn related commits into concrete completed work items. Fold formatting,\nversion bumps, and follow-up fixes into the outcome they supported; do not inflate one\nchange into several deliverables. Never restate a\ncommit subject as the work item; describe the outcome it produced. A day left with\nnothing has no reportable activity.</p>\n<p>Use file counts and added/deleted lines only when they meaningfully support the work\nitem. Generated files, lockfile churn, renames, and bulk formatting often make those\nnumbers misleading. Metrics are evidence, never hours, difficulty, impact, or a\nproductivity score.</p>\n<p>Uncommitted changes are not work items. At most, note them factually in a chat draft\nfor today (project and files, no invented progress); never write them to the file:\ntheir dates are unverifiable, and a project left dirty for weeks would reappear as in\nprogress every day. User-provided non-code work must remain clearly identified as user\ncontext.</p>\n<p><code>~/.agent-tools/config.jsonc</code> may also carry <code>log.output</code>, an automatically recorded\nAI session log, separate from <code>dailyLog.output</code>. It is a markdown file with dated\nentries, or a directory holding one <code>&lt;date&gt;.md</code> report per day; entries under\n<code>log.projects</code> may route their sessions to their own <code>output</code>, so check those paths\ntoo. When <code>log.format</code> is <code>daily</code>, read its single-line results only as activity\nleads: they may be truncated and omit important context. Do not state a log-only\nitem as a confirmed outcome from a daily entry alone. When <code>log.format</code> is <code>detailed</code>, its\nper-day reports are stronger supplementary evidence, but still do not replace Git\nor user confirmation. If the <code>log</code> block or its output is absent, skip this entirely.\nMerge, do not duplicate, work already backed by commits.</p>\n<h2>Output</h2>\n<p>Match the user's language:</p>\n<pre><code>+ 2026-07-31\n  1. agent-tools: 完成多项目日报规则和 skill 落地.\n  2. vscode-plugin: 修复 Webview 刷新后状态丢失问题, 补充回归验证.\n</code></pre>\n<p>Start each item with the label that best locates the work for a reader: the project\nname when the day spans projects, a module or feature within a single one.</p>\n<p>Keep entries compact: the file accumulates for months, so every recurring line must\nearn its place. Do not add per-day summary, total, or section-header lines; the\nnumbered items already show project and count.</p>\n<p>Prefer outcomes over raw Git metrics. If no verified activity exists, say so rather\nthan fabricate an entry. For a range, output one entry per day with activity, oldest\nfirst, and skip empty days.</p>\n<h2>Draft or record</h2>\n<p>\"Generate\" / <code>生成日报</code> returns a draft. \"Record\" / <code>记录日报</code>, or an explicit\nwrite request, writes after previewing the entry. A draft may close with one short\nline offering to record it; treat any affirmative reply to that offer as the go-ahead,\nand keep the suggested word short (<code>记录</code> / <code>record</code>). Resolve the destination in order:</p>\n<ol>\n<li>a path supplied in conversation;</li>\n<li>optional <code>dailyLog.output</code> in <code>~/.agent-tools/config.jsonc</code>;</li>\n<li>no destination: return the draft without writing.</li>\n</ol>\n<p>Read the destination before editing. Wrap each date's generated content in that date's\nown markers, <code>&lt;!-- daily-log:2026-07-31:start 5,a1b2c3d --&gt;</code> / <code>&lt;!-- daily-log:2026-07-31:end --&gt;</code>,\nwhere the start marker stores the day's commit count and newest commit hash across the\nscanned projects; the date line and every line outside the markers belong to the user.\nRefresh an existing block when either value changed or the user explicitly asks;\notherwise leave it alone, because regenerated wording varies between runs. For an existing date, show\nthe current block and the regenerated one before writing, then replace only that\ndate's block. If the date exists without markers, append a marked block below the\nuser's lines instead of editing them. Do not duplicate the date. Insert a new date\namong the existing dated entries at its date-order position, inferring ascending or\ndescending from the dates already present (ascending when that is ambiguous). A date\nthat sorts last goes right after the final dated entry, not at the end of the file:\nnotes, comment blocks and todo lists kept below the log stay below it. On duplicate or\nunpaired markers, stop and propose the edit instead of writing. When neither Git nor\nthe session log shows activity for the day, leave the file unchanged and say so; the\nuser can add a manual entry themselves. Recording a range applies these rules to each day's block independently.</p>\n<p>Scheduling is separate; set it up only when the user asks. Prefer the OS scheduler\n(Task Scheduler, cron, launchd) over agent-internal timers, which stop with the agent:\nschedule a headless run of the CLI this skill is executing in — <code>claude -p &lt;prompt&gt;</code>,\n<code>codex exec &lt;prompt&gt;</code>, <code>opencode run &lt;prompt&gt;</code> — invoking the skill with the recording\nrequest the user asked for, as in <code>claude -p \"/at-daily-log record the log\"</code>. How a\nskill is addressed varies per CLI, so the test run below is what confirms it.\nKeep projects and output in config so the command stays stable. Before registering,\nconfirm the schedule, make sure the output file is resolvable, and run the exact\ncommand once; register only after that test run records correctly, and show how to\nremove the task. Headless auth\ndiffers from the interactive session, so a failed test run means stop instead of\nregistering, and show the exact command, its error output, and the likely fix (log in\nfor headless use, adjust the output path). An unattended run has nobody to confirm\nwith, so it must follow the marker rules exactly and skip any file it cannot edit that\nway: it fills missing days and refreshes days whose stored count or hash moved,\nnothing else.</p>\n","files":[{"path":"SKILL.md","sizeBytes":8271,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-08-30T09:57:49.771023Z","sha256":"AAB5370AA4C6763DE2FA8B61618CC706C1FFBF131BFB97A756F30415C2A504D5","sizeBytes":4040},"review":null,"source":{"repositoryUrl":"https://github.com/kairyou/agent-tools","path":"skills/workflow/at-daily-log","license":"MIT","commit":"f74f6479a6c5706fafa2a468406a03a1e137f884","subtreeSha":"B78BB5CA12E7C7C6BC77F1B38E6DA79ED09A63B23E8C3A6B27ADF98E0E67A6BC","lastSyncedAt":"2026-09-22T13:50:24.675611Z"},"reviewedAt":"2026-08-30T10:12:43.390735Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/kairyou/agent-tools/tree/main/skills/workflow/at-daily-log"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install kairyou-agent-tools@llmmart"},{"target":"git","command":"git clone https://github.com/kairyou/agent-tools.git"}]}