ワンクリックで
worklog
Use when generating worklog summaries, time reports, or Jira work log entries from git history and Claude Code session logs
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Use when generating worklog summaries, time reports, or Jira work log entries from git history and Claude Code session logs
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use before pushing a branch, opening a PR, updating an existing PR, or merging. Use when GitHub Codex review cycles feel unbounded, when AI-flagged findings include false positives, when the team is finding adjacent-file issues each push, or when a chunk of work feels finished and you're about to ask whether to push.
Use when fixing bugs, resolving issues, or addressing small improvements found in testing, user reports, or code audits
Use when any API project (Flask, FastAPI, Express, NestJS, Django, Go) needs YAML integration tests for go-runner, when test coverage is shallow or missing, or when generating CI/CD pipelines to deploy a temp instance and run those tests
Use when starting new work (feature or fix branch), or when commit message validation fails. Provides branch creation wizard and commit format reference.
Dispatch parallel reviewers to validate implementation against the plan. Use for post-implementation verification in a fresh session.
Internal skill — not invoked directly. Use /session-status, /session-persist, or /session-handoff instead.
| name | worklog |
| description | Use when generating worklog summaries, time reports, or Jira work log entries from git history and Claude Code session logs |
Generate concise, deliverable-oriented worklog bullets for Jira reporting, drawn from two sources for the chosen timespan: git history and Claude Code session logs. Work is grouped by task (Jira ticket) under each day. Session logs surface work that leaves little commit trace — planning, debugging, end-to-end validation, code review.
A "day" starts at 6AM, not midnight. All date ranges use 06:00:00 as the boundary:
Day grouping uses this boundary too: work (commit or session) timestamped before 6AM counts as the previous day.
Both are scanned by default for the timespan:
git log (see Process).~/.claude/projects/<sanitized-cwd>/*.jsonl, where <sanitized-cwd> is the repo's absolute path with every / replaced by - (e.g. -Users-willvargas-Development-Sheetgo-agent-skills). See Session Log Scanning.git config user.email.git log --all --author=<email> --since=<X>T06:00:00 --until=<Y>T06:00:00 --format="%ad %s" --date=short (--all required). <X> and <Y> are the 6AM range bounds from Day Boundary, with <Y> EXCLUSIVE — e.g. "yesterday" → <X>=yesterday, <Y>=today; "from A to B" → <X>=A, <Y>=B+1. Multi-repo: git -C <path> log ....Run this python3 digest (portable; no jq dependency). It filters to the timespan, drops injected/duplicate prompts, and emits one compact JSON line per human prompt with its branch — never read whole transcripts into context:
import json, sys, glob, os
from datetime import datetime
root, lo, hi = sys.argv[1], sys.argv[2], sys.argv[3] # <session-dir> <lo-iso-local> <hi-iso-local>
lo_epoch = datetime.fromisoformat(lo).timestamp()
hi_epoch = datetime.fromisoformat(hi).timestamp()
INJECTED = ("Review this change for security vulnerabilities",
"Base directory for this skill:", "Caveat:",
"This session is being continued")
def epoch(ts):
try: return datetime.fromisoformat(ts.replace('Z', '+00:00')).timestamp()
except Exception: return None
seen, rows = set(), []
if os.path.isdir(root):
for fp in sorted(glob.glob(os.path.join(root, '*.jsonl'))):
if os.path.getmtime(fp) < lo_epoch: continue # mtime prefilter (speed)
with open(fp, encoding='utf-8') as fh:
for line in fh:
try:
d = json.loads(line)
if not isinstance(d, dict) or d.get('type') != 'user': continue
except Exception: continue
e = epoch(d.get('timestamp', ''))
if e is None or not (lo_epoch <= e < hi_epoch): continue
c = d.get('message', {}).get('content')
txt = c if isinstance(c, str) else ' '.join(
b.get('text', '') for b in c
if isinstance(b, dict) and b.get('type') == 'text') if isinstance(c, list) else ''
txt = txt.strip()
if not txt or txt.startswith('<') or 'tool_result' in str(c)[:40]: continue
if any(txt.startswith(p) for p in INJECTED): continue # drop injected scaffolding
key = txt[:80].lower()
if key in seen: continue # collapse duplicates
seen.add(key)
day = datetime.fromtimestamp(e - 6*3600).strftime('%Y-%m-%d') # 6AM-boundary worklog day (pre-6AM counts as previous day)
rows.append((e, day, d.get('gitBranch', '') or '', txt.replace('\n', ' ')))
rows.sort()
for e, day, br, txt in rows:
print(json.dumps({"date": day, "branch": br, "prompt": txt[:200]}))
Invoke per session dir, e.g.:
python3 <recipe.py> ~/.claude/projects/-Users-willvargas-Development-Sheetgo-agent-skills 2026-06-08T06:00:00 2026-06-09T06:00:00
Each digest line gives the work intent (prompt), the day (date), and the branch (→ ticket). Infer non-commit deliverables (planning, debugging, e2e walks, review) from the prompts. Output only derived bullets — never quote transcript text.
Map every commit and session item to a ticket, in this order:
SG-\d+ from the branch — session entries use their per-line gitBranch; commits use their owning branch (commits in <base>..<branch>, base = master/main).release/* bundles many tickets), scan commit subjects and prompts for an SG-\d+.### <Topic>.mtime sweep of the other ~/.claude/projects/* dirs for any .jsonl modified within the window.git -C <repo-path> log ..., folding everything into the same ticket blocks (a card spanning repos = one block). Worktrees of one repo collapse automatically (work is keyed by ticket, not directory).Default — day primary, task nested:
## Jun 08
### SG-13200 — pricing & analytics
- Fixed /pricing so trialing PRO users convert via the billing portal, not a dead tile.
- Coerced empty plan fields to null in BigQuery logging, so analytics reads "unknown".
### Automations production setup
- Set up the production HubSpot and Okta apps for automations.
## MMM DD (3-letter month + day, e.g. Jun 08; no weekday names). Week mode: ## Week of MMM DD.### SG-XXXX — <short title> (title from the branch slug; bare ID if none). No-ticket clusters: ### <Topic>.Override — "by task" / "flat by task" (days collapsed, ticket primary):
## SG-13200 — pricing & analytics
- Fixed /pricing so trialing PRO users convert via the billing portal.
- Coerced empty plan fields to null in BigQuery logging.
Reporting altitude: the bullets above are summaries, not a fix-by-fix log — a few outcome bullets per ticket. Default to this rolled-up level. Only if the user explicitly asks for "detailed" / "by item" / "full" should you drop to finer, one-bullet-per-change granularity.
Register: plain, factual, past tense, no "I"/"we" — changelog/demo-caption voice. Lead with the deliverable/outcome, suppress the tool/file/command.
so/that <effect> tail only when the value isn't obvious; hard ceiling ~14 words. One idea per bullet — split rather than run long.smart-compose.py, || heredoc). Don't drift into value-speak.ran/used/edited/worked on): Added, Implemented, Enabled · Fixed, Resolved, Eliminated · Closed, Hardened, Enforced · Identified, Traced, Root-caused · Defined, Designed, Scoped · Validated, Verified, Confirmed · Documented, Reconciled, Aligned.SG- to extract → text fallback, then topic cluster.gitBranch: non-user/meta lines are already skipped; any remaining no-branch prompt clusters by topic.mtime prefilter skips untouched transcript files, so cost scales with active days, not full history.