pipa-time-tracking について
pipa-time-tracking は、Pipa の agent utility records で時間記録を管理するスキルです。タイマー操作や過去の時間の記録、集計に対応し、給与処理や受動的な活動追跡は扱いません。
主な機能
- 01タイマーの開始・切替・停止
- 02過去の時間記録の追加
- 03記録の確認と集計
- 04記録の更新またはアーカイブ
- 05クレジット購入用チェックアウトの作成
活用シーン
- 01プロジェクト作業の時間を記録
- 02当日以前の作業時間を後から登録
- 03指定期間の記録を確認
- 04誤った時間記録をアーカイブ
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lunchpaillola/ pipa-skills --skill pipa-time-trackingインストール後、Claude Code で/pipa-time-trackingを入力して読み込まれたか確認します。
詳細
Pipa の時間追跡
ユーザーの時間追跡リクエスト -> Pipa の認証情報 -> 汎用 time_tracking/time_entry ユーティリティレコード。
重要:汎用 Pipa エージェントユーティリティレコード API 経由で、Toggl 形式の時間エントリーのみを使用してください。Clockify、Toggl、スクリーンショット、給与計算、請求書発行、生産性スコアリング、受動的なアクティビティの再構成、/v1/time-tracking/* ラッパーエンドポイントは使用しないでください。
簡潔な ToDo リストを維持してください:モード、認証情報、不足している質問、ペイロードの検証、API 呼び出し、最終回答。
ワークフロー
-
モードを選択します。 次のいずれか 1 つだけを選んでください。
- タイマーを開始:「これの追跡を開始」「Acme のタイマーを開始」「フロントエンドの修正に時間を記録」 -> start。
- 作業を切り替え:「Acme QA に切り替え」 -> switch。
- 現在のタイマーを停止 -> stop。
- 実行中のものを確認 -> current。
- 過去の時間を記録:「9 時から 9 時 45 分までの 45 分を記録」 -> backfill。
- エントリーを表示/時間を要約 -> review。
- エントリーを更新/削除/キャンセル/アーカイブ -> update/archive。
- クレジットを購入/チャージ、クレジット残高を確認、または変更を伴うリクエストが
insufficient_creditsで失敗 -> top-up。 - 給与計算、請求書発行、スクリーンショット、受動的な再構成、外部トラッカーとの同期、繰り返しタイマー、自動アイドル検出 -> V1 では未対応であることを説明し、停止します。
会話内に成功した API レスポンスがすでにあり、ユーザーがその結果について尋ねている場合は、把握しているレスポンスに基づいて回答してください。未対応のレポートエンドポイントを呼び出さないでください。
-
認証情報を読み込みます。 API を呼び出す前に、次の情報が必要です。
PIPA_API_BASE_URLPIPA_API_KEYPIPA_EMAILPIPA_USER_TIMEZONE
別名:
PIPA_FOLLOW_UP_API_KEY->PIPA_API_KEYPIPA_FOLLOW_UP_EMAIL->PIPA_EMAIL- 同じソース内に正規名と別名の両方の値がある場合は、正規名を優先します。
検索順:
- ゲートウェイから注入された値。
- 環境変数。
- リポジトリローカルの
.pipa/credentials。 - ユーザーグローバルの
~/.pipa/credentials。
隠しパスに関するルール:
.pipa/credentialsの検索に glob/ファイル検索を当てにしないでください。隠しディレクトリはスキップされたり、誤って処理されたりすることがあります。- 明示的なパスを直接確認してください:
<workspace-root>/.pipa/credentials、次に~/.pipa/credentials。 - シェルヘルパー:cwd または
git rev-parse --show-toplevelからルートを特定し、Path(root) / ".pipa" / "credentials"を読み込みます。 - glob で
.pipa/credentialsがNo files foundとなっても、結論にはなりません。ユーザーに認証情報を尋ねる前に、直接読み込んでください。
認証情報ファイルは JSON ではなく dotenv 形式です:
PIPA_API_BASE_URL=https://pailflow-chat-gateway.fly.dev PIPA_API_KEY=<API_KEY> PIPA_EMAIL=<EMAIL> PIPA_USER_TIMEZONE=<IANA_TIMEZONE>旧形式:
PIPA_API_BASE_URL=https://pailflow-chat-gateway.fly.dev PIPA_FOLLOW_UP_API_KEY=<API_KEY> PIPA_FOLLOW_UP_EMAIL=<EMAIL> PIPA_USER_TIMEZONE=<IANA_TIMEZONE>可能な限り、API キーをチャット/ログ/Markdown/シェル履歴/プロセス引数に含めないでください。シェルヘルパーはスクリプト内で認証情報を読み込み、秘密情報ではない結果のみを出力します。
PIPA_API_BASE_URLと API キーがある場合は、選択したモードに進んでください。モードで現地日の解釈が必要なのにタイムゾーンがない場合は、手順 3 に進みます。 -
必要な場合に限り、不足している認証情報を設定します。 不足している項目のうち、最小限のものを補ってください。
PIPA_USER_TIMEZONEがなく、現地の日付/曖昧な時刻の指定がある -> 次の文をそのまま尋ねてください:What timezone should I use?停止します。PIPA_API_BASE_URLがない -> ユーザーが別のゲートウェイを指定していない限り、https://pailflow-chat-gateway.fly.devをデフォルトにします。PIPA_API_KEYとPIPA_FOLLOW_UP_API_KEYがない -> ユーザーのメールアドレスを尋ねます。
メールコードの設定:
- メールコード認証によって Pipa エージェントユーティリティキーが作成/置換されることを説明します。ユーザーがすでにキーを持っている可能性がある場合に限り、キーの置換によって以前のキーが無効になることも伝えます。
- product に
agent-utilitiesを指定してPOST /v1/key/email-code/startを実行します。 - 1 回限りのメールコードを尋ねます。
- challenge id、code、product
agent-utilitiesを指定してPOST /v1/key/email-code/verifyを実行します。 - 環境変数が一時的な場合、ユーザーが保存を希望しない場合、または書き込みに失敗した場合を除き、返されたキーを保存します。
- リポジトリローカルのスキルにはリポジトリローカルの
.pipa/credentials、グローバルなスキルには~/.pipa/credentialsを優先します。 - リポジトリローカルに書き込む前に、
.pipa/が gitignore 対象であることを確認します。ファイルモードは600を使用します。 - 保存先のパスをユーザーに伝えます。明示的に求められない限り、キーを表示しないでください。
- 認証情報を再読み込みし、選択したモードに進みます。
-
API コントラクト。 次のみを使用してください:
GET /v1/agent-utility-recordsPOST /v1/agent-utility-recordsGET /v1/agent-utility-records/:idPATCH /v1/agent-utility-records/:idDELETE /v1/agent-utility-records/:idPOST /v1/key/email-code/startPOST /v1/key/email-code/verifyPOST /v1/topups/checkout-sessions
クレジット残高:
- 残高取得用のエンドポイントを捏造しないでください。現在のクレジット残高は、許可された API レスポンスに
credits_remainingが含まれている場合にのみ確認できます。 - ユーザーが残高を尋ねたとき、最新の許可されたレスポンスに
credits_remainingがない場合は、このスキルでは現在の残高を直接照会できないと伝えてください。 insufficient_creditsにtopup_limitsが含まれている場合は、次の操作でその上限を使用してください。- チェックアウト URL はユーザーが操作するための支払いリンクとして扱ってください。明示的に求められない限り、保存したり、長いチェックアウト URL をそのまま出力したりしないでください。
このスキルで使用する一覧クエリパラメーター:
utility_typerecord_typestatusstarted_at_gtestarted_at_lt
API レスポンスまたはドキュメントに記載がない限り、他の一覧フィルターは使用しないでください。アーカイブ済みの絞り込みができない場合は、取得後にアーカイブ済みのレコードを除外してください。
認証ヘッダー:
Authorization: Bearer ${PIPA_API_KEY}時間記録レコード:
{ "utility_type": "time_tracking", "record_type": "time_entry", "status": "running", "title": "Work description", "started_at": "2026-06-30T13:00:00.000Z", "project_label": "optional project", "client_label": "optional client", "flex_label": "optional tag/task/phase", "rate_amount": 150, "rate_currency": "USD", "metadata": { "notes": "optional extras" } }ルール:
runningにはstarted_atが必要で、ended_atは省略します。completedにはstarted_atとended_atが必要です。ended_atはstarted_at以降でなければなりません。- ユーザーごとに、アーカイブされていない実行中の
time_tracking/time_entryは 1 件のみです。 - 削除するとアーカイブされます。完全削除とは説明しないでください。
- 正確なタイムスタンプを保存してください。所要時間の丸めはユーザー向けの応答でのみ行ってください。
-
開始モード。
- タイトルはリクエストから取得します。「start timer」のみの場合は
Untitled workを使用します。 - 明らかなラベルのみを解析します:プロジェクト、クライアント、タスク/タグ/フェーズ。ラベルを捏造しないでください。
GET /v1/agent-utility-records?utility_type=time_tracking&record_type=time_entry&status=running。- 実行中のタイマーがある場合は、ID/タイトル/開始時刻を報告します。次の文をそのまま尋ねて、停止します:
Do you want me to switch from that timer to [new title]? - 実行中のタイマーがない場合は、現在の UTC ISO
started_atを指定してrunningレコードを作成します。 - 作成には新しい
Idempotency-Keyを使用します。 - 成功したら、開始テンプレートのステップ 14 に進みます。
作成ペイロード:
{ "utility_type": "time_tracking", "record_type": "time_entry", "status": "running", "title": "Acme frontend fixes", "started_at": "2026-06-30T13:00:00.000Z", "project_label": "Acme", "client_label": "Acme Co", "flex_label": "frontend" } - タイトルはリクエストから取得します。「start timer」のみの場合は
-
切り替えモード。
- ステップ 5 に従って実行中のタイマーを取得します。
- 実行中のタイマーがない場合は、開始モードで新しい実行中タイマーを作成します。以前のタイマーは停止していないと伝えてください。
- 実行中のタイマーがある場合は、
status=completed、ended_at=nowに更新します。 - 停止に成功した後、新しい
Idempotency-Keyを使用して新しい実行中タイマーを作成します。 - 停止には成功したものの作成に失敗した場合は、その旨を正確に伝え、新しいタイマーは実行中でないと報告します。
- 停止したタイマーの所要時間と、新しい実行中レコードの ID を返します。
-
停止モード。
- ステップ 5 に従って実行中のタイマーを取得します。
- 実行中のタイマーがない場合は、現在実行中のタイマーはないと伝えて停止します。
- 実行中のレコードを
status=completed、ended_at=nowに更新します。 - ID、タイトル、開始時刻、終了時刻、所要時間、ラベルを確認します。
更新ペイロード:
{ "status": "completed", "ended_at": "2026-06-30T14:15:00.000Z" } -
現在の状態モード。
- ステップ 5 に従って実行中のタイマーを取得します。
- 実行中のタイマーがない場合は、現在実行中のタイマーはないと伝えます。
- 実行中のタイマーがある場合は、ID、タイトル、開始時刻、経過時間、ラベルを報告します。
- 作成、停止、変更は行わないでください。
-
遡及入力モード。
PIPA_USER_TIMEZONEを使用して日付/時刻の範囲を確定します。- 日付/時刻/所要時間/タイムゾーンが曖昧な場合は、直接的な確認を 1 つだけ尋ねて停止します。
started_at/ended_atを UTC ISO に変換します。completedレコードを作成します。- 作成したエントリーを確認して返します。
ユーザーが「9:00から45分記録して」と言い、タイムゾーンと日付が分かっている場合は、終了時刻をすぐに計算します。追加の確認は不要です。
-
レビュー・モード。
- 範囲を具体的な
started_at_gteとstarted_at_ltの UTC ISO に確定します。「今日」の場合はPIPA_USER_TIMEZONEを使用します。 utility_type=time_tracking、record_type=time_entry、範囲フィルターを指定してGET /v1/agent-utility-recordsを実行します。- ユーザーがアーカイブ済み/キャンセル済みを求めない限り、アーカイブ済みのレコードを除外します。
- レスポンス内のレコードをグループ化/合計します。レポート用エンドポイントを呼び出したり、捏造したりしないでください。
- 実行中のエントリーは別に含めてください。所要時間は変化します。
- 範囲を具体的な
-
更新/アーカイブ・モード。
- req、context、または短い候補リストからレコード ID を特定します。
- 参照先が曖昧な場合は、直接的な質問を 1 つだけして終了します。
- タイトル、タイムスタンプ、ラベル、レート、メタデータには
PATCH /v1/agent-utility-records/:idを使用します。 - 明示的な削除/キャンセル/除去/アーカイブの指示がある場合に限り、
DELETE /v1/agent-utility-records/:idを使用します。 - 実行中のタイマーをアーカイブした場合は、完了ではなく、キャンセル/アーカイブしたと伝えます。
-
トップアップモード。
Time Tracking の利用料金は、30 日間で Pipa クレジット 10 枚です。自動更新はありません。有効期限が切れた後に次の変更操作を行うと、アクセスパスが再度課金されます。
残高の確認:
- 許可されたレスポンスに
credits_remainingが含まれていない限り、このスキルでは現在のクレジット残高を照会できません。 - ユーザーからクレジット残高を尋ねられ、現在のレスポンスに
credits_remainingが含まれていない場合は、その旨を伝え、使用中のゲートウェイ URL を記載します。
insufficient_creditsが発生した場合、または購入/トップアップを求められた場合に使用します。- リクエストされた整数のクレジット数を選びます。
- 数量が指定されていない場合は、次のとおり正確に尋ねて終了します。
How many Pipa credits do you want to buy? { "credits": amount }を指定してPOST /v1/topups/checkout-sessionsを呼び出します。- 金額とともに、
checkout_urlを Markdown リンク(例:[Open checkout](...))で共有します。 - チェックアウトを利用できず、API に
billing_urlのみが含まれている場合は、請求ページへのリンクを共有します。 - 支払い確認後、最初の変更リクエストを再試行します。
insufficient_creditsまたはinvalid_topup_creditsで上限・下限が返された場合は、その値を使用します。例:10 credits is below the minimum. Smallest top-up is 100 credits for $10. Want me to create that checkout session? - 許可されたレスポンスに
-
API の失敗。 次に行う最小限の操作を実行します。
running_timer_exists:実行中のタイマーを取得して状況を説明し、切り替えるかどうかを尋ねます。insufficient_credits:手順 12 に従います。invalid_api_key:キーの再発行によりアカウントキーがローテーションされることを説明し、手順 3 に従います。started_at_required、completed_entry_requires_ended_at、running_entry_cannot_have_ended_at、ended_at_before_started_at:ペイロードを修正します。指定時刻が曖昧な場合に限り、確認します。agent_utility_record_not_found:レコード ID を尋ねます。または、ユーザーが「あのエントリ」について尋ねている場合は、最近の候補を一覧表示します。invalid_topup_credits:API レスポンスに基づき、有効な次の操作として最小限のものを提示します。例:10 credits is below the minimum. Smallest top-up is 100 credits for $10. Want me to create that checkout session?チェックアウトを利用できない場合を除き、billing_urlは共有しません。failed_to_create_agent_utility_record、failed_to_patch_agent_utility_record、failed_to_archive_agent_utility_record:失敗前に変更があったかどうかを明示します。タイマーが変更されたかのように伝えてはいけません。- API キーがない場合:手順 3 に従います。
エラーで必要とされない限り、ワークフロー全体を最初からやり直してはいけません。
-
報告。 簡潔で、実務的かつ監査可能な内容にします。
開始時のテンプレート:
タイマーを開始しました。 - レコード ID:`[id]` - タイトル:`[title]` - 開始時刻:`[started_at]` - ラベル:`[project/client/flex or none]`停止時のテンプレート:
タイマーを停止しました。 - レコード ID:`[id]` - タイトル:`[title]` - 時間:`[started_at]` から `[ended_at]` - 所要時間:`[rounded duration]` - ラベル:`[project/client/flex or none]`ルール:
- 必須情報に不足がある場合、または曖昧な場合に限り確認します。
- 1 回につき、直接的な追加質問を 1 つだけします。
- API メタデータをそのまま大量に出力してはいけません。
- スキルファイルにシークレットを保存してはいけません。
- API が残りクレジットを返した場合は、その数を伝えます。
- 失敗時は、失敗前にレコードが変更されたかどうかを伝えます。