working-summary
Generates period work summaries based on GitHub activity and Linear tasks.
Install
mkdir -p .claude/skills/working-summary && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/16248" && unzip -o skill.zip -d .claude/skills/working-summary && rm skill.zipInstalls to .claude/skills/working-summary
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Use when the user asks for a work summary, weekly report, 工作总结,周报,working summary, or sprint/period recap. Aggregates GitHub PR/commit/issue activity from configured repos, optionally reads Linear cycle issues via MCP, honors Chinese public holidays, and produces a markdown report. Default range is the previous Mon-Sun week.Key capabilities
- →Aggregate GitHub PR/commit activity
- →Integrate Linear cycle issues into reports
- →Generate markdown work summaries
- →Support Chinese public holidays in date calculations
- →Offer options for persisting reports (md, html, linear, publish)
How it works
The skill aggregates GitHub PR/commit activity and Linear cycle issues within a specified time range, considering Chinese public holidays. It then synthesizes this data into a structured markdown report and offers various persistence options.
Inputs & outputs
When to use working-summary
- →Generating weekly reports
- →Creating sprint summaries
- →Tracking progress for review
About this skill
Working Summary
Generate a period work summary by aggregating GitHub PR/commit activity across configured repositories and — optionally — Linear cycle issues. The default time range is the previous Mon–Sun week, computed with awareness of Chinese public holidays. Output is markdown, suitable for Obsidian or any note system.
Config
Config path (default): ~/.config/working-summary/config.yaml
Override via --config <path>.
If the file is missing, tell the user to copy config.example.yaml (next to this skill) into the expected path and edit. Do not fabricate defaults.
github:
user: innei # optional; falls back to `gh api user -q .login`
orgs: # org-scope query — ONE gh search call per org
- lobehub
- lobehub-biz
repos: # optional explicit repos (in addition to orgs)
- innei/next-real-comment
- mx-space/core
include_commits: true # pull per-repo commits for active repos
linear: # optional, needs `linear` CLI authed
workspace: lobehub # informational
team: LOBE # team key (issue prefix)
cycle: auto # previous | current | auto
include_states: [In Progress, Done]
output:
# Language for synthesized prose. Section headers and raw PR/issue/commit
# titles are kept verbatim regardless; only descriptions and framing prose
# follow this setting. Examples: zh-CN, en, ja
language: zh-CN
# Optional persistence target. When set, the user may choose to save the
# report to `dir` at the end of a run. Leave unset to operate ephemerally.
dir: ~/Documents/Obsidian/Reports
# Placeholders: {year} {month} {week} {start} {end} {ext}
filename: '{year}-{month}-w{week}.{ext}'
Output Flow
The skill never writes a file by default. It synthesizes markdown in the conversation (which serves as the terminal display) and then asks the user whether to persist the result.
At the end of synthesis, prompt the user with these options:
| Choice | Behavior |
|---|---|
no / nothing | Done. Report lives only in the conversation. |
md | Write markdown to output.dir/{filename} (ext=md). |
html | Render themed HTML to $TMPDIR/working-summary-<stamp>.html via scripts/render_html.py, run open on it, then ask whether to also move a copy to output.dir/{filename} (ext=html). |
both | Do md and html in that order. |
linear | Create a Linear issue in the report cycle, assigned to the viewer, state set to the team's completed state (typically "Done"), with the report markdown as the description. Requires Linear to be configured AND connected. See Linear archive below. |
publish | Upload the HTML report to the configured R2 bucket (served at the configured public base URL via a Cloudflare Worker behind Access). Requires output.publish to be set. Renders HTML to a tempfile if no html was produced yet. See R2 publish below. |
Choices compose with +: e.g. linear+html, html+publish, linear+html+publish.
Order of operations within a composite:
- linear archive (if requested) — so the issue exists before any file write.
- publish to R2 (if requested) — so the public URL exists before the local file is touched.
- html / md local persistence (if requested).
Bare linear / publish is fine when no local file is wanted.
Default choice from config: when output.format is set in the config
file, use it as the highlighted default in the prompt (e.g.
format: html → "落盘否?[html / md / both / linear / publish / no]").
The user can still override by typing another choice. When output.format
is unset or is markdown, highlight md as default. When output.format
is both, highlight both. output.format may also be set to any of the
composite values (linear, linear+md, linear+html, linear+both,
publish, html+publish, linear+publish, linear+html+publish).
The HTML renderer is a deterministic post-processor — the LLM only ever produces markdown. See HTML Rendering below.
Never overwrite an existing file silently. If the target exists, ask the user (append, overwrite, or new suffix).
Default Time Range
The skill uses a previous Mon–Sun week as the default:
| Today is | Range |
|---|---|
| Mon | [last Mon, yesterday Sun] |
| Tue..Sat | [prev Mon, prev Sun] |
| Sun | [prev Mon, prev Sun] (not this Sun) |
Explicit overrides:
--from YYYY-MM-DD --to YYYY-MM-DD— hard range--from YYYY-MM-DD— start from date, end at today--date YYYY-MM-DD— pretend today is this date, then apply default rule
Chinese public holidays
scripts/compute_range.py uses the chinesecalendar Python library (loaded via uv --with chinesecalendar) to classify each day as workday / holiday. The orchestrator always emits a range.breakdown containing {date, weekday, workday, holiday} for every day, plus aggregated workdays / holidays counts. Use this data to:
- Annotate the report header (e.g. "本周 3 工作日、2 节假日")
- Decide whether the range is meaningful at all (if
workdays == 0, ask the user whether they want the previous working week instead)
Data Collection
Step 1 — run the orchestrator
python skills/automation/working-summary/scripts/collect.py \
[--config PATH] \
[--from YYYY-MM-DD --to YYYY-MM-DD | --date YYYY-MM-DD]
Returns JSON to stdout:
{
"range": { "start": "...", "end": "...", "workdays": N, "holidays": N, "breakdown": [...] },
"config": { "author": "...", "orgs": [...], "repos": [...], "include_commits": true, "linear": {...}, "output": {...} },
"github": {
"owner/repo": {
"prs_merged": [...], // reconstructed from commit (#NNN) refs → /repos/{r}/pulls/{n}
"prs_open": [...], // /repos/{r}/pulls?state=open, filtered by author + updated window
"commits": [...], // /repos/{r}/commits?author=&since=&until=
"issues": [...] // /repos/{r}/issues?assignee=&since=, PRs filtered out
}
}
}
Why REST instead of gh search — the previous version used gh search prs/issues for org-wide queries. That index is unreliable: private orgs are unindexed entirely, and even public mono-repos return partial results (one test run showed 1/27 merged PRs hit). The current flow:
GET /orgs/{org}/repos— page through every repo (incl. private), then merge with explicitrepos.- Per-repo
GET /repos/{r}/commits?author=...&since/until— concurrent (16 workers). Commits filtered by GIT author + merge date window. Empty repos (HTTP 409) and archived repos (404) are silently skipped. - Merged PRs are reconstructed from commit message refs: every
(#NNN)in a commit message becomes aGET /repos/{r}/pulls/{n}call. Because commit dates are merge dates, these PRs are guaranteed merged in window. - For "active" repos (had commits) plus explicit repos, fetch open PRs (
/pulls?state=open) and assigned issues (/issues), filter by author + updatedAt client-side.
Set github.include_commits: false to skip steps 2-3 entirely (only open PRs / issues on the explicit repo list).
Step 2 — Linear (optional, via linear CLI)
When config.linear.team is set, collect.py invokes scripts/fetch_linear.py which shells out to linear api (the GraphQL endpoint of @schpet/linear-cli). Requires linear auth login once.
- Resolve
viewer.idvia{ viewer { id } }. - Resolve the target cycle for
linear.teamperlinear.cycle:previous— most recently completed cycle (endsAt <= today, maxendsAt)current— cycle whose[startsAt, endsAt)contains todayauto— cycle whose[startsAt, endsAt]overlaps the computedrange(max overlap wins)
- Query
issues(filter: { team, cycle, assignee = viewer })with optional state filter fromlinear.include_states. - Each issue carries
attachments— GitHub PR/commit URLs are exposed there, enabling PR ↔ issue linking without text matching.
The script returns null (silent) when:
- the
linearbinary is missing, - the user is not authenticated,
- the cycle cannot be resolved.
In any of those cases, the report continues with GitHub-only output and must note that Linear was skipped.
In addition to the report cycle (resolved against the date range), the script also fetches the active cycle (the one containing today) and pulls only its started issues. For the typical "previous Mon-Sun" weekly report these are different cycles — the report cycle is the cycle that just ended, the active cycle is
Content truncated.
When not to use it
- →When the user needs a real-time activity feed
- →When the user needs to generate reports for platforms other than GitHub or Linear
- →When the user needs to generate reports for non-technical work
Prerequisites
Limitations
- →The skill aggregates GitHub PR/commit activity.
- →The skill optionally reads Linear cycle issues.
- →The skill computes date ranges with awareness of Chinese public holidays.
How it compares
This skill automates the generation of structured work summaries from multiple development platforms, including specific holiday considerations, and offers diverse output formats, unlike manual report compilation.
Compared to similar skills
working-summary side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| working-summary (this skill) | 0 | 4mo | Review | Intermediate |
| self-host-development-light | 0 | 2mo | No flags | Beginner |
| meeting-minutes | 41 | 6mo | No flags | Beginner |
| spec-kit-workflow | 11 | 8mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by Innei
View all by Innei →You might also like
self-host-development-light
doolin
Lightweight self-hosted project management using markdown files in a .development directory. Covers backlog, planning, todo, roadmap, and saved plans — everything an agent needs to orient and start working.
meeting-minutes
github
Generate concise, actionable meeting minutes for internal meetings. Includes metadata, attendees, agenda, decisions, action items (owner + due date), and follow-up steps.
spec-kit-workflow
jmanhype
Guides specification-driven development workflow. Automatically invoked when discussing new features, specifications, technical planning, or implementation tasks. Ensures proper workflow phases (specify → clarify → plan → checklist → tasks → analyze → implement).
product-manager-toolkit
davila7
Comprehensive toolkit for product managers including RICE prioritization, customer interview analysis, PRD templates, discovery frameworks, and go-to-market strategies. Use for feature prioritization, user research synthesis, requirement documentation, and product strategy development.
task-management
rjchien728
管理 ~/tasks/(或使用者指定路徑)下的進行中工作項目資料夾。每個 task 是一個資料夾,README.md 是純狀態 dashboard(status frontmatter + 一句 headline + 一行狀態 + 檔案清單 + 下一步),實際的設計 / 規劃 / 調查文件用獨立 .md 檔,腳本與 reproduce 也存獨立檔。負責命名(YYMMDD-<slug>)、建資料夾、寫 README dashboard、更新狀態、總覽掃描。當使用者說「開新 task」「開個 task」「新增 task」「new task」「記錄到 tasks 下」「把目前設計記下來開個 task
pi-tasks
Micka33
>-