Redmine へチケットを起票するボタンを追加

chktime のタスクと git 履歴から下書きを作り、まとめて Redmine へ登録できる
ようにした。外部通信はこの機能を使ったときだけで、使わなければ従来どおり
ローカルの jsonl を読むだけ。

- Redmine の REST API を叩く最小クライアント (標準ライブラリのみ)
- 下書きは「タスクから」(1タスク=1チケット) と「git 履歴から」
  (日ごと / 日 x 種別 / 期間一括) の 2 系統
- 起票は件数 x 間隔ぶん時間がかかるのでジョブにし、進捗だけ見に行く
- 作成時の status_id は Redmine 側で無視されるため、作成後に付け直す
- 連続アクセスに 403 を返すサーバがあるので 1 件ごとに間隔をあける (既定 7 秒)
- 自己署名証明書が普通なので、既定は証明書の検証なし
- API キーは redmine.json に置き、git 管理外にする

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-02 13:55:46 +09:00
co-authored by Claude Opus 5
parent d23bcabd76
commit a458509014
7 changed files with 1021 additions and 5 deletions
+39 -2
View File
@@ -4,7 +4,10 @@ Claude Code の **タスク(セッション)ごとのチャットのやり
`~/.claude/projects/<プロジェクト>/<セッションID>.jsonl`(Claude Code の会話ログ)を解析して、
「いつ何を頼んで、返事が来るまで何秒かかって、その作業が何分続いたか」を表にします。
外部通信なし・追加ライブラリなし(Python 3.9+ の標準ライブラリのみ)。
追加ライブラリなし(Python 3.9+ の標準ライブラリのみ)。
外部への通信は **[Redmine へ起票](#redmine-へ起票)** を使ったときだけです。それ以外は
ローカルの jsonl を読むだけで、どこにも接続しません。
## 起動
@@ -30,6 +33,7 @@ python chktime.py
| `--host` | 127.0.0.1 | 待ち受けアドレス |
| `--dir` | `~/.claude/projects` | ログの置き場所 |
| `--interval` | 2.0 | ログ更新を見に行く間隔(秒)。自動追従の反応速度 |
| `--redmine-config` | `redmine.json` | Redmine 連携の設定ファイル |
| `--no-browser` | – | ブラウザを自動で開かない |
## 画面
@@ -105,6 +109,38 @@ python chktime.py
- オフの間に増えたぶんは、次にオンにした時点でまとめて取り込みます。
- オフのときは従来どおり **再読込** ボタンで更新します(解析キャッシュも捨てる強制再読込)。
## Redmine へ起票
ヘッダの **Redmine へ起票** で、作業の記録を Redmine のチケットにまとめて登録できます。
**このアプリで唯一、外部へ通信する機能**です。使わなければ一切接続しません。
### 準備
ダイアログ右上の **設定** で、Redmine の URL と API アクセスキーを入れて保存します。
キーは Redmine の「個人設定 → API アクセスキー」で表示できます。
- 設定は `redmine.json`(`--redmine-config` で変更可)に保存されます。**キーが平文で入るので git 管理外**です。
- 社内 Redmine のような自己署名証明書のサーバでは「証明書を検証する」を**外して**ください。
- **間隔(秒)** は 1 件ごとに空ける待ち時間です。連続アクセスに 403 を返すサーバがあるため既定 7 秒。速いサーバなら短くできます。
### 起票する
**下書きを作る → 中身を確かめる → 起票する** の 3 段です。取得元は 2 つあります。
| 取得元 | 内容 |
| --- | --- |
| **タスクから** | 中央の一覧に出ているタスクから選び、1 タスク = 1 チケットにします。本文は期間・全体/作業時間・往復数・ツール呼び出し数と、やりとりの一覧(発言時刻・要約・応答時間、最大 60 件)。開始日/期日はタスクの開始・終了日 |
| **git 履歴から** | 指定したリポジトリのコミットをまとめてチケットにします。本文はコミットの一覧(日付・短縮ハッシュ・件名、最大 80 件) |
git 履歴のまとめ方は **日ごと / 日 × 種別(`feat:` `fix:` `docs:` …)/ 期間まとめて 1 件** から選びます。
分類は**件名の prefix と日付だけを見た機械的なもの**で、中身の判断はしません。期間は空にすると全履歴です。
下書きは件名をクリックすると本文を確認でき、チェックを外せば除外できます。
起票先のプロジェクト・トラッカー・ステータス・担当・進捗 100% はダイアログ上部で指定します(次回も同じ値で開きます)。
- 起票は 1 件ずつ間隔を空けて流すので、**数十件だと数分かかります**。進捗と結果(チケット番号/失敗理由)はダイアログに出ます。実行中もダイアログは閉じられます。
- Redmine は**作成時の状態指定を無視する**ため、状態を指定した場合は作成直後に更新をもう 1 回投げて付け直します(1 件あたり 2 回アクセスします)。
## 解析の仕様(ざっくり)
- ターンの起点は「人間の発言」。ツール実行結果・システム挿入・サブエージェントの発言は起点にしません。
@@ -117,8 +153,9 @@ python chktime.py
## ファイル
```
chktime.py サーバ + jsonl 解析
chktime.py サーバ + jsonl 解析 + Redmine 連携
web/index.html 画面
web/app.js 表示ロジック
web/style.css スタイル
redmine.json Redmine 連携の設定(APIキーを含む。git 管理外・自動生成)
```