Claude の作業区間を n8n の work_log へ送る「n8n へ送る」タブを追加 #2

Merged
yoshikazu merged 11 commits from n8n-worklog-import into main 2026-10-12 22:14:41 +00:00
Owner

概要

Claude Code のセッションから作った「作業区間」を、n8n の work-tracker(work_log)へ送れるようにした。手で作業開始・終了を記録する手間を減らすため。

  • 設計書: docs/superpowers/specs/2026-10-12-n8n-worklog-import-design.md
  • 実装計画: docs/superpowers/plans/2026-10-12-n8n-worklog-import.md

変更内容

  • 作業区間: 同じセッションの中で、空きが 30 分未満ならつなぎ、5 分未満は出さない(設定で変更可)。続きのセッションに写された区間は開始時刻で 1 件にまとめる。
  • 進行中: ログ更新から 30 分以内、または返事やツールの結果を待っている最後の区間は送れない(/exit などのローカルのコマンドは待ちに数えない。24 時間更新の無いログは進行中にしない)。
  • 画面: 右ペインのタブ「n8n へ送る」(web/n8n.js)。期間の指定、タスク名・メモの編集(同じセッションの区間にも入れる。ブラウザが覚える)、Redmine のチケット選択、送信済み・削除済み・重なり・進行中・送信後に変化の印。
  • API: GET/POST /api/n8n/config、GET /api/n8n/blocks、POST /api/n8n/send、GET /api/redmine/search。送るときの時刻はブラウザの値を使わず、サーバーがログから計算し直す。
  • 二重登録の防止: source(chktime:<セッションID>:<開始ミリ秒>)を work_log に保存し、n8n 側で同じ source は追加しない。
  • 安全: 合言葉は git 管理外の n8n.json に置き、画面・ログには出さない。API は 127.0.0.1 / localhost の同じ画面からの要求だけ受け付ける(POST は application/json 必須)。URL のホストを変えると合言葉を消す。
  • 文書: README に「n8n へ送る」、CLAUDE.md の通信の決まりと API 表。

n8n 側(このリポジトリの外。設定済み)

  • データテーブル work_log / work_log_deleted に source(String)列を追加。
  • ワークフロー work-tracker--import(/webhook/wt-import-rows、/webhook/wt-import。Header Auth X-WT-Token)を新規作成。
  • work-tracker--delete の Backup Row が source もコピーするように変更。

テスト

  • python -W error::ResourceWarning -m unittest discover -s tests -v → 42 件すべて PASS(偽の n8n・偽の Redmine を立てて確かめる)。
  • 検証用ポート 8799 で画面を確認(偽の n8n と本物の n8n の両方)。
  • n8n の受け口は 2000-01-01 付けのダミーで、追加・再送のスキップ・合言葉違いの 403・不正値のエラーを確認し、ダミーは削除済み。
  • 実際の区間を 1 件送り、ダッシュボードと日報に出ることを確認。
  • ブランチ全体を独立したレビューにかけ、重要な指摘 5 件をすべて修正(各修正は失敗するテストを先に書いて確認)。

残っている小さな問題

  • タスク名を入力した直後に「送る」を押すと、1 回目のクリックが効かない
  • チケット選択でチケット番号をエスケープせずに埋め込んでいる(現状は数値のみ)
  • 0 分の区間と 24 時間を超える区間が一覧に出るが、n8n が受け付けない
  • 送信の要求に dict でない項目があると HTTP 500 になる

🤖 Generated with Claude Code

## 概要 Claude Code のセッションから作った「作業区間」を、n8n の work-tracker(`work_log`)へ送れるようにした。手で作業開始・終了を記録する手間を減らすため。 - 設計書: `docs/superpowers/specs/2026-10-12-n8n-worklog-import-design.md` - 実装計画: `docs/superpowers/plans/2026-10-12-n8n-worklog-import.md` ## 変更内容 - **作業区間**: 同じセッションの中で、空きが 30 分未満ならつなぎ、5 分未満は出さない(設定で変更可)。続きのセッションに写された区間は開始時刻で 1 件にまとめる。 - **進行中**: ログ更新から 30 分以内、または返事やツールの結果を待っている最後の区間は送れない(`/exit` などのローカルのコマンドは待ちに数えない。24 時間更新の無いログは進行中にしない)。 - **画面**: 右ペインのタブ「n8n へ送る」(`web/n8n.js`)。期間の指定、タスク名・メモの編集(同じセッションの区間にも入れる。ブラウザが覚える)、Redmine のチケット選択、送信済み・削除済み・重なり・進行中・送信後に変化の印。 - **API**: `GET/POST /api/n8n/config`、`GET /api/n8n/blocks`、`POST /api/n8n/send`、`GET /api/redmine/search`。送るときの時刻はブラウザの値を使わず、サーバーがログから計算し直す。 - **二重登録の防止**: `source`(`chktime:<セッションID>:<開始ミリ秒>`)を work_log に保存し、n8n 側で同じ `source` は追加しない。 - **安全**: 合言葉は git 管理外の `n8n.json` に置き、画面・ログには出さない。API は 127.0.0.1 / localhost の同じ画面からの要求だけ受け付ける(POST は `application/json` 必須)。URL のホストを変えると合言葉を消す。 - **文書**: README に「n8n へ送る」、CLAUDE.md の通信の決まりと API 表。 ## n8n 側(このリポジトリの外。設定済み) - データテーブル `work_log` / `work_log_deleted` に `source`(String)列を追加。 - ワークフロー `work-tracker--import`(`/webhook/wt-import-rows`、`/webhook/wt-import`。Header Auth `X-WT-Token`)を新規作成。 - `work-tracker--delete` の `Backup Row` が `source` もコピーするように変更。 ## テスト - `python -W error::ResourceWarning -m unittest discover -s tests -v` → 42 件すべて PASS(偽の n8n・偽の Redmine を立てて確かめる)。 - 検証用ポート 8799 で画面を確認(偽の n8n と本物の n8n の両方)。 - n8n の受け口は 2000-01-01 付けのダミーで、追加・再送のスキップ・合言葉違いの 403・不正値のエラーを確認し、ダミーは削除済み。 - 実際の区間を 1 件送り、ダッシュボードと日報に出ることを確認。 - ブランチ全体を独立したレビューにかけ、重要な指摘 5 件をすべて修正(各修正は失敗するテストを先に書いて確認)。 ## 残っている小さな問題 - タスク名を入力した直後に「送る」を押すと、1 回目のクリックが効かない - チケット選択でチケット番号をエスケープせずに埋め込んでいる(現状は数値のみ) - 0 分の区間と 24 時間を超える区間が一覧に出るが、n8n が受け付けない - 送信の要求に dict でない項目があると HTTP 500 になる 🤖 Generated with [Claude Code](https://claude.com/claude-code)
yoshikazu added 11 commits 2026-10-12 22:14:17 +00:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
設計書のチケット検索 API を /api/redmine/search に改名
(/api/redmine/issues は起票の POST が使っているため)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 進行中の判定: ローカルのコマンドを待ちにしない、ツールの結果待ちを進行中にする、
  24 時間更新の無いログは進行中にしない
- 写しの区間: 同着は古いファイルを残し、写し元の source でも送信済みにする。
  送信後に区間が変わったら知らせる
- 他のサイトからの API 要求を断る (Host / Origin / Content-Type)。
  URL のホストを変えたら合言葉を消す。合言葉は半角の表示文字に限る
- n8n との通信の想定外の例外 (送れない文字など) を N8nError にする

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
yoshikazu merged commit 9a50480491 into main 2026-10-12 22:14:41 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: yoshikazu/chktime#2