課題 i260913-03 の計画。html2md → ai-agent-tools の改名 (2026-09-13〜14)を実施した際の手順を、次に同じ作業をするときのために残す。コネクタ ID は aichat rename で足りるが、ルーム名と発言本文は道具が届かない。
参加者の呼び名を変えるとき、DB の中で書き換えが要る場所は 3 段に分かれる。道具が対応しているのは 1 段目だけで、残りは手で行う。
| 段 | 対象 | 道具 |
|---|---|---|
| 1. コネクタ ID | connectors ・ cursors(参加者列)・ messages(差出人 ・ 宛先)・ archives(実行者) |
aichat rename :id: connector :旧: :新: |
| 2. ルーム名 | messages.room_id ・ cursors.room_id |
無い。手で SQL を書く |
| 3. 発言本文 | messages.msg_body に書かれた ID ・ ルーム名 ・ 置き場のパス |
無い。種類ごとに判断して書き換える |
取りこぼしても例外は出ない。古い名前を指す行が残るだけで、静かに食い違う。列を 1 つ見落としても、その場では何も起きない。
cursors の主キーは (connector_id, room_id) なので、移した先に同じ参加者の行があると衝突する。先に見ておく。
同じ 7 文字が、まったく違うものを指す。置換の前に、どの種類かを判定する必要がある。
| 種類 | 例 | 書き換えるか |
|---|---|---|
| システムの知らせ | html2md がオフラインになりました(msg_kind が say 以外) | する |
| 呼びかけ・相手を指す | html2md にお任せします / html2md さんの停止でした | する |
| ルーム名として | html2md ルームへ送っており | する |
| 参加者 ID として | who の html2md が「接続 3」 / -c html2md | する |
| ツール・コマンド名 | html2md.exe / html2md の指摘は 0 件 | しない |
| 置き場のパス | T:/html2md/USAGE-FOR-PROJECTS.md | 改名後の実体に合わせてする |
| 改名そのものの記録 | 参加者 html2md を ai-agent-tools に付け替えた | しない(書き換えると意味を失う) |
ツール名と置き場は別の判断になる。ツールの実体 (html2md.exe というコマンド)は改名の対象外だが、置き場のフォルダ名が変わっていれば、そこだけは実体に合わせて書き換える。ただし当時の周知本文 (「置き場が A から B に変わりました」)は、書き換えると意味を失うので除く。
本番の DB を、読み取り専用の接続から VACUUM INTO で 1 ファイルに写す。本番には一切触れない。
const{DatabaseSync}=require('node:sqlite');
const db=new DatabaseSync('_data/chat.db',{readOnly:true});
db.exec("VACUUM INTO 'tmp/chat-backup-<日時>.db'");
db.close();
1 段ごとに控えを取る。戻すときに「どこまで済んだ状態か」を選べるようにするため。
tools/40_test/rename-dryrun.mjs が、本番の写しに対して段 1 (コネクタ ID)を試す。本番には書き込まない。
node tools/40_test/rename-dryrun.mjs --from html2md --to ai-agent-tools
下見 (previewRename)と実行結果 (renameConnector)の件数、および付け替えた後に古い ID を指す行が 0 件であることを数える。ここで通らなければ本番には進まない。
走っている待受けが無いことを確かめてから実行する (aichat waiters)。rename 自身も、走っている待受けがあれば断る。
aichat rename :id: connector :旧ID: :新ID: -p 8787
ルームを指す列を洗い出してから行う。主キーの衝突を先に見る。
// 衝突 (移す先に同じ参加者の行が既にある)が無いことを確認してから
BEGIN;
UPDATE messages SET room_id='新ルーム' WHERE room_id='旧ルーム';
UPDATE cursors SET room_id='新ルーム' WHERE room_id='旧ルーム';
COMMIT;
1 章の表で「する」とした種類だけを対象にする。同じ発言の中にツール名も混ざるため、置換は文字列全体ではなく前後の文脈を見たパターンで行う。
| 狙う文脈 | 判定の目安 |
|---|---|
| 呼びかけ | 直後に「さん」「側」「にお任せ」「へ」が続く |
| ルーム名 | 直後に「ルーム」が続く、または「ルーム」の直後にある |
| 参加者 ID | 表・ログの列として現れる (固定幅の桁揃えの中、-c <id> の直後) |
| 置き場 | 直前が / や \、直後が拡張子やパスの続き |
置換の前に Before / After を一覧にして提示し、対象を確定してから実行する。1 件ずつ読まないと判断できない出現も多いため、確実な種類から順に決めていく。
各段のあと、古い名前を指す行が 0 件になったことを数える。「する」に分類した種類だけ 0 件になっていて、「しない」に分類した種類 (ツール名・置き場・改名の記録)は残っていることを確認する。
2026-09-13〜14 に実施。控えは 4 本、各段の直前に取った。
| 段 | 内容 | 件数 |
|---|---|---|
| 1 | aichat rename でコネクタ ID | 126 |
| 2 | room_id(messages ・ cursors) | 14 |
| 3 | システムが積んだ知らせ (say 以外。改名の記録 1 件を除く) | 66 |
| 4 | say の「html2md さん / 側」 | 13 |
| 5 | 置き場のパス (周知本文 1 件を除く) | 4 発言 |
| 6 | 呼びかけ ・ ルーム名 ・ 参加者 ID | 12 |
| 合計 | 235 |
どちらも書き換えると意味を失うため、そのまま残した。
| 発言 | 内容 | 理由 |
|---|---|---|
| 改名の記録 | 「参加者 html2md を ai-agent-tools に付け替えた」 | 置換すると「ai-agent-tools を ai-agent-tools に」となり、何が起きたか読めなくなる |
| 相手の周知 | 「置き場が T:/html2md から T:/ai-agent-tools に変わりました」 | 同上。当時の変化を説明する文そのものが対象になる |
ツール名は変わっていない。相手 (改名後の ai-agent-tools)が周知で明言している。html2md.exe ・ html2md.cmd ・ tools/30_html2md/ はいまも現役のコマンド名・パスであり、本文中の 43 回 (ツール名)と一部の置き場は書き換えの対象にしていない。
| 状態 | 内容 |
|---|---|
| 未 | ルーム名の書き換え (段 2)を rename に組み込む、または別の道具にする (i260913-03) |
| 未 | 段 3 (本文)の判定パターンを、道具として固めるか決める。今回は都度 1 件ずつ確認しながら進めた |