コネクタとルームの改名手順

DB に散った古い ID・ルーム名を、取りこぼしなく付け替える

📅 作成: 2026-09-14 / 更新: 2026-09-14

課題 i260913-03 の計画。html2md → ai-agent-tools の改名 (2026-09-13〜14)を実施した際の手順を、次に同じ作業をするときのために残す。コネクタ ID は aichat rename で足りるが、ルーム名と発言本文は道具が届かない。

目次

  1. 何を変える必要があるか
  2. 手順
  3. 実施した記録 (html2md → ai-agent-tools)

何を変える必要があるか

参加者の呼び名を変えるとき、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) なので、移した先に同じ参加者の行があると衝突する。先に見ておく。

段 3 (本文)は機械的に分けられない

同じ 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 に変わりました」)は、書き換えると意味を失うので除く。

手順

0. 控えを取る

本番の 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 段ごとに控えを取る。戻すときに「どこまで済んだ状態か」を選べるようにするため。

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 件であることを数える。ここで通らなければ本番には進まない。

2. 本番でコネクタ ID を付け替える

走っている待受けが無いことを確かめてから実行する (aichat waiters)。rename 自身も、走っている待受けがあれば断る。

aichat rename :id: connector :旧ID: :新ID: -p 8787

3. ルーム名を手で書き換える (段 2)

ルームを指す列を洗い出してから行う。主キーの衝突を先に見る。

// 衝突 (移す先に同じ参加者の行が既にある)が無いことを確認してから
BEGIN;
UPDATE messages SET room_id='新ルーム' WHERE room_id='旧ルーム';
UPDATE cursors  SET room_id='新ルーム' WHERE room_id='旧ルーム';
COMMIT;

4. 発言本文を種類ごとに書き換える (段 3)

1 章の表で「する」とした種類だけを対象にする。同じ発言の中にツール名も混ざるため、置換は文字列全体ではなく前後の文脈を見たパターンで行う。

狙う文脈判定の目安
呼びかけ直後に「さん」「側」「にお任せ」「へ」が続く
ルーム名直後に「ルーム」が続く、または「ルーム」の直後にある
参加者 ID表・ログの列として現れる (固定幅の桁揃えの中、-c <id> の直後)
置き場直前が / や \、直後が拡張子やパスの続き

置換の前に Before / After を一覧にして提示し、対象を確定してから実行する。1 件ずつ読まないと判断できない出現も多いため、確実な種類から順に決めていく。

5. 数え直す

各段のあと、古い名前を指す行が 0 件になったことを数える。「する」に分類した種類だけ 0 件になっていて、「しない」に分類した種類 (ツール名・置き場・改名の記録)は残っていることを確認する。

実施した記録 (html2md → ai-agent-tools)

2026-09-13〜14 に実施。控えは 4 本、各段の直前に取った。

段内容件数
1aichat rename でコネクタ ID126
2room_id(messages ・ cursors)14
3システムが積んだ知らせ (say 以外。改名の記録 1 件を除く)66
4say の「html2md さん / 側」13
5置き場のパス (周知本文 1 件を除く)4 発言
6呼びかけ ・ ルーム名 ・ 参加者 ID12
合計235

除外した 2 件

どちらも書き換えると意味を失うため、そのまま残した。

発言内容理由
改名の記録「参加者 html2md を ai-agent-tools に付け替えた」置換すると「ai-agent-tools を ai-agent-tools に」となり、何が起きたか読めなくなる
相手の周知「置き場が T:/html2md から T:/ai-agent-tools に変わりました」同上。当時の変化を説明する文そのものが対象になる

残した 114 回

ツール名は変わっていない。相手 (改名後の ai-agent-tools)が周知で明言している。html2md.exe ・ html2md.cmd ・ tools/30_html2md/ はいまも現役のコマンド名・パスであり、本文中の 43 回 (ツール名)と一部の置き場は書き換えの対象にしていない。

次にやること

状態内容
未ルーム名の書き換え (段 2)を rename に組み込む、または別の道具にする (i260913-03)
未段 3 (本文)の判定パターンを、道具として固めるか決める。今回は都度 1 件ずつ確認しながら進めた