From 929f702cc68198238e71cecb4854a4045627979b Mon Sep 17 00:00:00 2001 From: yoshikazu Date: Tue, 13 Oct 2026 06:24:08 +0900 Subject: [PATCH] =?UTF-8?q?n8n=20=E3=81=B8=E9=80=81=E3=82=8B=E6=A9=9F?= =?UTF-8?q?=E8=83=BD=E3=81=AE=E4=BD=BF=E3=81=84=E6=96=B9=E3=81=A8=E9=80=9A?= =?UTF-8?q?=E4=BF=A1=E3=81=AE=E6=B1=BA=E3=81=BE=E3=82=8A=E3=82=92=E6=96=87?= =?UTF-8?q?=E6=9B=B8=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- CLAUDE.md | 18 +++++++++++++++--- README.md | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e51da96..2a1812d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,13 +6,16 @@ Claude Code の会話ログ(`~/.claude/projects/<プロジェクト>/<セッ ## 構成 ``` -chktime.py サーバ + jsonl 解析 + Redmine 連携(これ1本で完結) +chktime.py サーバ + jsonl 解析 + Redmine 連携 + n8n 連携(これ1本で完結) web/index.html 画面の骨組み web/app.js 表示ロジック(フレームワークなし・素の DOM 操作) web/style.css スタイル(ダークテーマ固定) +web/n8n.js 「n8n へ送る」タブ(app.js の後に読む) run.bat コンソール表示で起動 stop.cmd 起動中の chktime を終了 redmine.json Redmine 連携の設定(自動生成・git 管理外) +n8n.json n8n 連携の設定(合言葉を含む・git 管理外) +tests/ unittest(python -m unittest discover -s tests -v) ``` `chktime.py` の中身は上から @@ -21,7 +24,7 @@ redmine.json Redmine 連携の設定(自動生成・git 管理外) ## 守ること - **標準ライブラリのみ**。外部パッケージも CDN も使わない。ブラウザ側もフレームワークなし。 -- **外部通信は Redmine 連携だけ**。それ以外はローカルの jsonl を読むだけで、どこにも接続しない。 +- **外部通信は Redmine 連携と n8n への送信だけ**。それ以外はローカルの jsonl を読むだけで、どこにも接続しない。 新しい通信先を増やすときは、この行を書き換えるところから始める。 - **API キーをリポジトリに入れない**。`redmine.json` は `.gitignore` 済み。ログにも出さない (`/api/redmine/config` はキーの有無だけ返す)。 @@ -55,7 +58,7 @@ python chktime.py --port 8799 --no-browser いずれも `&format=csv` を付けると CSV を返す(Excel 用に BOM 付き)。 -Redmine 連携(POST を使う唯一の系統): +Redmine 連携: | ルート | 内容 | | --- | --- | @@ -64,6 +67,15 @@ Redmine 連携(POST を使う唯一の系統): | `POST /api/redmine/draft` | 下書きを作る(`source=tasks` / `source=git`) | | `POST /api/redmine/issues` | 起票をジョブとして開始。返り値の `id` で進捗を見る | | `GET /api/redmine/job?id=` | 起票ジョブの進捗と結果 | +| `GET /api/redmine/search?q=` | チケット選択用の検索(未完了のみ。数字だけなら番号で引く) | + +n8n 連携(work_log への取り込み。送り先は n8n の `work-tracker--import`): + +| ルート | 内容 | +| --- | --- | +| `GET/POST /api/n8n/config` | 接続設定の取得(合言葉は返さない)/ 保存 | +| `GET /api/n8n/blocks?from=&to=&project=` | 作業区間の一覧。n8n の送信済み・削除済み・重なりを付ける | +| `POST /api/n8n/send` | 選んだ区間を送る。時刻はサーバーがログから計算し直す | ## 解析の前提 diff --git a/README.md b/README.md index 69d6fa6..974567f 100644 --- a/README.md +++ b/README.md @@ -6,8 +6,8 @@ Claude Code の **タスク(セッション)ごとのチャットのやり 「いつ何を頼んで、返事が来るまで何秒かかって、その作業が何分続いたか」を表にします。 追加ライブラリなし(Python 3.9+ の標準ライブラリのみ)。 -外部への通信は **[Redmine へ起票](#redmine-へ起票)** を使ったときだけです。それ以外は -ローカルの jsonl を読むだけで、どこにも接続しません。 +外部への通信は **[Redmine へ起票](#redmine-へ起票)** と **[n8n へ送る](#n8n-へ送る)** を使ったときだけです。 +それ以外はローカルの jsonl を読むだけで、どこにも接続しません。 ## 起動 @@ -34,6 +34,7 @@ python chktime.py | `--dir` | `~/.claude/projects` | ログの置き場所 | | `--interval` | 2.0 | ログ更新を見に行く間隔(秒)。自動追従の反応速度 | | `--redmine-config` | `redmine.json` | Redmine 連携の設定ファイル | +| `--n8n-config` | `n8n.json` | n8n 連携の設定ファイル | | `--no-browser` | – | ブラウザを自動で開かない | ## 画面 @@ -112,7 +113,7 @@ python chktime.py ## Redmine へ起票 ヘッダの **Redmine へ起票** で、作業の記録を Redmine のチケットにまとめて登録できます。 -**このアプリで唯一、外部へ通信する機能**です。使わなければ一切接続しません。 +外部へ通信する機能です(ほかに [n8n へ送る](#n8n-へ送る) があります)。使わなければ一切接続しません。 ### 準備 @@ -141,6 +142,30 @@ git 履歴のまとめ方は **日ごと / 日 × 種別(`feat:` `fix:` `docs: - 起票は 1 件ずつ間隔を空けて流すので、**数十件だと数分かかります**。進捗と結果(チケット番号/失敗理由)はダイアログに出ます。実行中もダイアログは閉じられます。 - Redmine は**作成時の状態指定を無視する**ため、状態を指定した場合は作成直後に更新をもう 1 回投げて付け直します(1 件あたり 2 回アクセスします)。 +## n8n へ送る + +右ペインの **n8n へ送る** タブで、Claude のセッションから作った「作業区間」を +n8n の work-tracker(`work_log`)に送れます。手で作業開始・終了を記録しなくても済むようにするための機能です。 + +- **作業区間**: 同じセッションの中で、応答が終わってから次の発言までの空きが 30 分未満ならつなぎ、 + 30 分以上で区切ります。5 分未満の区間は出しません(どちらも接続設定で変更可)。 + まだ応答中・ログ更新から 30 分以内の最後の区間は「進行中」で、送れません。 + 一晩中動かし続けたセッションは 1 つの長い区間になるので、送る前に時間を確かめてください。 +- **続きのセッション**: 会話を続けると前の履歴が新しいセッションのファイルに同じ時刻のまま写されます。 + 開始時刻が同じ区間は写しとみなし、いちばん後まで続いているものだけを出します。 +- **タスク名**: 初期値は `[作業フォルダ名] セッションのタイトル`。「選ぶ」で Redmine のチケットを検索して選ぶと + `[Redmine のプロジェクト名] #番号 題名` になり、work-tracker の Redmine 工数同期とガントの実績に載ります。 + 決めた名前はセッションごとにブラウザが覚え、同じセッションの他の区間にも入ります(切り替え可)。 +- **重なり**: すでに work_log にある記録や、一覧の他の区間と時間が重なる区間には印が付き、最初は送らない状態です。 +- **二重登録の防止**: 区間ごとの `source`(`chktime:<セッションID>:<開始時刻>`)を work_log に保存し、 + n8n 側で同じ `source` は追加しません。送信済みの区間は選べません。 + ただし 2 つの画面から同時に送ると二重に入ることがあります(確認と追加が一度の処理ではないため)。 +- **時刻**: 送るときはブラウザの値を使わず、サーバーがログから区間を計算し直します。 +- **設定**: `n8n.json`(git 管理外。`--n8n-config` で場所を変更可)。タブの「接続設定」からも変えられます。 + `{"url": "https://n8n.yfox.jp", "token": "<合言葉>", "verifySsl": false, "gapMinutes": 30, "minMinutes": 5}` + 合言葉は n8n の Header Auth 認証情報(ヘッダー `X-WT-Token`)と同じ値。画面とログには出しません。 +- 送り先は n8n のワークフロー `work-tracker--import`(`/webhook/wt-import-rows` と `/webhook/wt-import`)。 + ## 解析の仕様(ざっくり) - ターンの起点は「人間の発言」。ツール実行結果・システム挿入・サブエージェントの発言は起点にしません。 @@ -153,9 +178,12 @@ git 履歴のまとめ方は **日ごと / 日 × 種別(`feat:` `fix:` `docs: ## ファイル ``` -chktime.py サーバ + jsonl 解析 + Redmine 連携 +chktime.py サーバ + jsonl 解析 + Redmine 連携 + n8n 連携 web/index.html 画面 web/app.js 表示ロジック +web/n8n.js 「n8n へ送る」タブ web/style.css スタイル redmine.json Redmine 連携の設定(APIキーを含む。git 管理外・自動生成) +n8n.json n8n 連携の設定(合言葉を含む。git 管理外) +tests/ unittest(python -m unittest discover -s tests -v) ```