home/dot_agents/skills/daily-planning/SKILL.md
GitHub DiscussionにDaily Planningを投稿する。「daily planning」「日報」「デイリー」などと言及された際に使用。
npx skillsauth add kryota-dev/dotfiles daily-planningInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
GitHub Discussionの「Daily planning」カテゴリにある、今月分のdiscussionを特定し、今日の行動履歴をもとにDaily Planningエントリを作成・投稿する。
GitHubユーザー名・リポジトリ情報に加えて、JST「今日」の範囲を UTC で算出して以降のフィルタに使う。
GitHub API の created_at / submitted_at は UTC のため、startswith("YYYY-MM-DD") で比較すると JST の早朝アクション(UTC では前日扱い)を取りこぼす。
GH_USER=$(gh api user --jq '.login')
REPO_FULLNAME=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
REPO_OWNER=$(echo "${REPO_FULLNAME}" | cut -d'/' -f1)
REPO_NAME=$(echo "${REPO_FULLNAME}" | cut -d'/' -f2)
# JST 基準の日付
TODAY_JST=$(TZ=Asia/Tokyo date +%Y-%m-%d)
YESTERDAY_JST=$(TZ=Asia/Tokyo date -v-1d +%Y-%m-%d)
# JST 今日の範囲を UTC で表現
# JST 今日 00:00 = UTC 前日 15:00
# JST 今日 24:00 = UTC 当日 15:00
START_UTC="${YESTERDAY_JST}T15:00:00Z"
END_UTC="${TODAY_JST}T15:00:00Z"
# `gh search` 系は UTC 基準で日付フィルタを行うため、JST 今日に対応する UTC 期間(昨日〜今日の2日間)で検索する
SEARCH_START="${YESTERDAY_JST}"
SEARCH_END="${TODAY_JST}"
# GH_USER — GitHubユーザー名
# REPO_FULLNAME — "owner/repo" 形式(カレントディレクトリのリポジトリから自動取得)
# REPO_OWNER / REPO_NAME — GraphQL クエリの repository(owner:, name:) で使用
# START_UTC / END_UTC — `/repos/.../{commits,reviews,comments,events}` の created_at/submitted_at フィルタに使う
# SEARCH_START / SEARCH_END — `gh search prs/issues --updated/--created` のレンジに使う
現在の年月を使って、GitHub Search APIで該当ユーザーの今月分のDiscussionを直接検索する。
重要:
gh api graphql では -f query= がGraphQLクエリ本体に予約されているため、GraphQL変数には別名を使い、クエリ文字列内に直接埋め込むこと。category:Daily planning はスペースを含むためGraphQL検索クエリのパースエラーになる。検索クエリからは除外し、jqでカテゴリをフィルタすること。注意: macOS では USERNAME がシステム環境変数として予約されているため、変数名は GH_USER を使うこと。
YEAR_MONTH=$(date +%Y-%m)
gh api graphql -f query="
{
search(query: \"repo:${REPO_FULLNAME} ${GH_USER} ${YEAR_MONTH} in:title\", type: DISCUSSION, first: 5) {
nodes {
... on Discussion {
number
title
category { name }
}
}
}
}" --jq '.data.search.nodes[] | select(.category.name == "Daily planning")'
JST 今日の範囲(START_UTC 〜 END_UTC)を使って、以下の情報を並列で収集する。
重要: updated ではなく、実際にユーザーがアクションを起こしたものだけを抽出すること。
「やったこと」に含めるアクション:
「レビュー」に含めるアクション:
含めない:
自分が author または assignee の PR のうち、JST 今日に何らかの自分のアクション(コミット push / マージ / クローズ / レビュー submit / レビューコメント / PR コメント)が1件以上あるものを特定する。
重要:
merged と closed の両方が発生するため、closed のみで両方を捕捉できる(merge を別判定にしたい場合は別途 merged を確認)。# まず候補となるPRを取得(author + assignee、JST 今日に対応する2日間レンジで更新されたもの)
gh search prs --repo "${REPO_FULLNAME}" --author "${GH_USER}" --updated "${SEARCH_START}..${SEARCH_END}" --limit 100 --json number,title,url
gh search prs --repo "${REPO_FULLNAME}" --assignee "${GH_USER}" --updated "${SEARCH_START}..${SEARCH_END}" --limit 100 --json number,title,url
# 各PRについて、以下6つの指標を確認し、いずれか1以上なら「やったこと」に含める。
# 1. JST 今日の自分のコミット数
gh api "/repos/${REPO_FULLNAME}/pulls/${PR_NUM}/commits" --paginate \
--jq ".[] | select(.author.login == \"${GH_USER}\") | select(.commit.author.date >= \"${START_UTC}\" and .commit.author.date < \"${END_UTC}\") | .sha" | wc -l | tr -d ' '
# 2. JST 今日に自分がマージしたか
gh api "/repos/${REPO_FULLNAME}/issues/${PR_NUM}/events" --paginate \
--jq ".[] | select(.actor.login == \"${GH_USER}\") | select(.event == \"merged\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
# 3. JST 今日に自分がクローズしたか(merge を伴う close もここでカウントされる)
gh api "/repos/${REPO_FULLNAME}/issues/${PR_NUM}/events" --paginate \
--jq ".[] | select(.actor.login == \"${GH_USER}\") | select(.event == \"closed\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
# 4. JST 今日の自分のレビュー submit 数(self-review も含む)
gh api "/repos/${REPO_FULLNAME}/pulls/${PR_NUM}/reviews" \
--jq "[.[] | select(.user.login == \"${GH_USER}\") | select(.submitted_at >= \"${START_UTC}\" and .submitted_at < \"${END_UTC}\")] | length"
# 5. JST 今日の自分のレビューコメント(インライン)数
gh api "/repos/${REPO_FULLNAME}/pulls/${PR_NUM}/comments" --paginate \
--jq ".[] | select(.user.login == \"${GH_USER}\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
# 6. JST 今日の自分の PR コメント(issue comment 形式)数
gh api "/repos/${REPO_FULLNAME}/issues/${PR_NUM}/comments" --paginate \
--jq ".[] | select(.user.login == \"${GH_USER}\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
1〜6 のいずれかが1以上なら「やったこと」に含める。
注意: 旧版(〜2026-05-08)では 1 と 2(コミット / マージ)のみで判定していたため、レビュー・コメント返信のみで進めた自分のPRや、merge を伴わない close(採用方針変更等で閉じたPR)が漏れていた。今は上記6指標で漏らさず捕捉する。
レビュー submit せずに review comment(インラインコメント)だけを残すケースもあるため、/reviews と /comments の両方を確認する。
# 候補PR(reviewed-by、JST 今日に対応する2日間レンジ)
gh search prs --repo "${REPO_FULLNAME}" --reviewed-by "${GH_USER}" --updated "${SEARCH_START}..${SEARCH_END}" --limit 100 --json number,title,url
# 各PRについて、以下の3点を確認:
# 1. JST 今日の自分のレビュー submit 数
gh api "/repos/${REPO_FULLNAME}/pulls/${PR_NUM}/reviews" \
--jq "[.[] | select(.user.login == \"${GH_USER}\") | select(.submitted_at >= \"${START_UTC}\" and .submitted_at < \"${END_UTC}\")] | length"
# 2. JST 今日の自分のレビューコメント(インライン)数
gh api "/repos/${REPO_FULLNAME}/pulls/${PR_NUM}/comments" --paginate \
--jq ".[] | select(.user.login == \"${GH_USER}\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
# 3. 自分がレビュワーとしてrequestされたか(コメントしただけのPRは除外)
gh api "/repos/${REPO_FULLNAME}/issues/${PR_NUM}/events" --paginate \
--jq ".[] | select(.event == \"review_requested\") | select(.requested_reviewer.login == \"${GH_USER}\") | .id" | wc -l | tr -d ' '
「1または2が1以上」かつ「3が1以上」のPRを「レビュー」に含める。
以下のPRは「レビュー」セクションから除外する:
自分がassigneeのIssueのみを対象とする。
# 自分がassigneeのIssue(JST 今日に対応する2日間レンジで更新分)
gh search issues --repo "${REPO_FULLNAME}" --assignee "${GH_USER}" --updated "${SEARCH_START}..${SEARCH_END}" --limit 100 --json number,title,url
# 各Issueについて、JST 今日の自分のコメント数を確認
gh api "/repos/${REPO_FULLNAME}/issues/${NUM}/comments" --paginate \
--jq ".[] | select(.user.login == \"${GH_USER}\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
# 各Issueについて、JST 今日に自分が close したかを確認
gh api "/repos/${REPO_FULLNAME}/issues/${NUM}/events" --paginate \
--jq ".[] | select(.actor.login == \"${GH_USER}\") | select(.event == \"closed\") | select(.created_at >= \"${START_UTC}\" and .created_at < \"${END_UTC}\") | .id" | wc -l | tr -d ' '
コメントまたは close のいずれかが1以上なら「やったこと」に含める。
以下を他の収集ステップ(3a〜3c)と並列で実行する。
gh search issues --repo "${REPO_FULLNAME}" --author "${GH_USER}" --created "${SEARCH_START}..${SEARCH_END}" --limit 100 --json number,title,url
検出された Issue のうち、created_at が JST 今日範囲(START_UTC 以上 END_UTC 未満)に入るもののみを採用する。
--commenter のみだったため、新規作成 Issue が漏れたのを --author --created の併用で解消(2025年下半期)startswith("${TODAY}") から JST 範囲(START_UTC..END_UTC)に変更(タイムゾーン取りこぼし解消)/reviews だけでなく /pulls/{num}/comments(インラインコメント)まで対象化Discussionの既存コメントから直前の投稿を取得し、「やったこと」と「レビュー」を「前日の振り返り」に使用する。
gh api graphql -f query='
{
repository(owner: "${REPO_OWNER}", name: "${REPO_NAME}") {
discussion(number: DISCUSSION_NUMBER) {
comments(last: 1) {
nodes {
body
createdAt
}
}
}
}
}' --jq '.data.repository.discussion.comments.nodes[0].body'
前日の投稿から以下を抽出する:
AskUserQuestionを使って以下を質問する。
重要: AskUserQuestionの選択肢設計ルール
Other を選択する。options に Other を明示書きしないこと(公式仕様で Other は自動付与)。質問文に「(自由入力は『Other』を選択)」と明記する。options は minItems: 2。選択肢が実質1つしかない質問は、ダミー選択肢(例: 「同上(ダミー、選ばない)」)を加えてバリデーションを満たす。1回のAskUserQuestionで以下3問をまとめて質問する:
以下のテンプレートで下書きを作成し、マークダウンコードブロックで表示する。
## {YYYY/MM/DD}
✅ やったこと
- {PR/IssueのURL一覧}
作成したIssue:
- {今日作成したIssueのURL一覧}
レビュー:
- {レビューしたPRのURL一覧}
📝 前日の振り返り
- {前日のやったこと・レビューのURL一覧}
🤿 困っていること
{ユーザーの回答、空欄なら空行}
📣 共有事項
{ユーザーの回答、空欄なら空行}
⏰ 勤務時間
- 開始: {時刻}
- 終了: {時刻 or 空欄}
- 離席:
- {時間帯}(複数ある場合は複数行)
テンプレートのルール:
# Discussion Node IDを取得
DISCUSSION_ID=$(gh api graphql -f query='
{
repository(owner: "${REPO_OWNER}", name: "${REPO_NAME}") {
discussion(number: DISCUSSION_NUMBER) {
id
}
}
}' --jq '.data.repository.discussion.id')
# コメントを投稿
gh api graphql -f query='
mutation {
addDiscussionComment(input: {
discussionId: "'"${DISCUSSION_ID}"'",
body: "投稿内容"
}) {
comment {
url
}
}
}'
投稿後、コメントのURLをユーザーに表示する。
GitHub API の created_at / submitted_at / commit.author.date は UTC で記録される。
gh search の --updated / --created レンジも UTC 基準で日付判定される。
そのため、JST の今日と一致させたい場合は startswith("YYYY-MM-DD") のような UTC 日付文字列比較を使ってはいけない(JST 早朝のアクションは UTC では前日になり、取りこぼす)。
代わりに、JST 今日に対応する UTC 期間(前日 15:00Z 〜 当日 15:00Z)を START_UTC / END_UTC として算出し、>= / < で範囲比較する。
gh search 系も UTC 基準のため、JST 今日に対応する2日間(昨日と今日)を --updated / --created レンジに指定して候補を広めに取得し、その後 API レスポンスを START_UTC/END_UTC で再フィルタする。
updated フィールドだけで検索すると、他人のアクション(ラベル変更、botの更新など)で更新されたものも含まれてしまう。
必ず以下のAPIで自分が実際にアクションを起こしたかを確認すること:
/pulls/{num}/commits で author.login と commit.author.date を確認/issues/{num}/events で event == "merged" と actor.login を確認/pulls/{num}/reviews で user.login と submitted_at を確認/pulls/{num}/comments で user.login と created_at を確認/issues/{num}/comments で user.login と created_at を確認/issues/{num}/events で actor.login と created_at を確認コメントしただけでは「自分のタスク」に含めない。 必ず以下のロール確認を行うこと:
--assignee で検索したIssueのみ対象。--commenter のみのIssueは除外する。--reviewed-by で検索した後、/issues/{num}/events で review_requested イベントを確認し、自分がレビュワーとしてrequestされたPRのみ対象。requestされていないPRは除外する。/reviews だけでなく /pulls/{num}/comments(インライン)も確認し、いずれか1以上なら採用。gh api --paginate --jq length の落とし穴--paginate は内部で複数回 API 呼び出しを行い、ページ毎に --jq が適用される。そのため length を取るとページ毎に出力されてしまい、合計値にならない。
# NG: ページごとに length が別々の行で出力される
gh api "/path" --paginate --jq "[.[] | select(...)] | length"
# 出力例:
# 0
# 1
# OK: 要素 ID 等を出力して wc -l で合算
gh api "/path" --paginate --jq ".[] | select(...) | .id" | wc -l | tr -d ' '
このスキルは zsh で実行される前提(macOS デフォルトシェル)。bash 風の for X in $LIST は zsh では空白で分割されず、リスト全体が1要素として扱われる。
# NG (zsh): 1要素として扱われ、ループが1回しか回らない
PRS="12389 11911"
for PR in $PRS; do ...; done
# OK: 配列を使う
PRS=(12389 11911)
for PR in "${PRS[@]}"; do ...; done
Claude Code の Bash ツールでは != がエスケープされてエラーになる。代わりに以下を使用:
# NG: jq 'select(.user.login != "bot")'
# OK: jq 'select(.user.login == "target_user")'
development
`cc-code-review` エージェントを起動して独立したコンテキストでコードレビューを実行する。 現在のセッションのバイアスのないフレッシュな視点で、プロジェクトの CLAUDE.md を踏まえたレビューを行う。 トリガー: "cc-code-review", "ccでレビュー", "別の視点でレビュー", "セカンドオピニオン" 使用場面: (1) PRのコードレビュー (2) ブランチ差分のレビュー (3) 特定ファイルのレビュー (4) 現在の変更のレビュー
tools
Comprehensive guide for the `wtp` (Worktree Plus) CLI by satococoa — an enhanced Git worktree manager. Use this whenever the user wants to create, list, remove, or navigate Git worktrees with wtp, mentions `wtp add`/`wtp cd`/`wtp list`/`wtp remove`/`wtp exec`, asks about automatic worktree paths from branch names, post-create hooks (copy/symlink/command) in `.wtp.yml`, branch tracking for worktrees, or shell integration (`wtp shell-init`, `wtp hook`, tab completion, auto-cd). Trigger this even when the user just describes the workflow — e.g. 'spin up a worktree for this feature branch', 'jump to my auth worktree', 'clean up the worktree and its branch' — without naming wtp explicitly, as long as wtp is the available tool.
tools
Use when doing ANY task involving Supabase. Triggers: Supabase products (Database, Auth, Edge Functions, Realtime, Storage, Vectors, Cron, Queues); client libraries and SSR integrations (supabase-js, @supabase/ssr) in Next.js, React, SvelteKit, Astro, Remix; auth issues (login, logout, sessions, JWT, cookies, getSession, getUser, getClaims, RLS); Supabase CLI or MCP server; schema changes, migrations, security audits, Postgres extensions (pg_graphql, pg_cron, pg_vector).
data-ai
Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations.