agent-yadogae 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- agent_yadogae-0.1.0/LICENSE +21 -0
- agent_yadogae-0.1.0/PKG-INFO +192 -0
- agent_yadogae-0.1.0/README.md +169 -0
- agent_yadogae-0.1.0/SECURITY.md +12 -0
- agent_yadogae-0.1.0/agent_yadogae.py +1112 -0
- agent_yadogae-0.1.0/pyproject.toml +36 -0
- agent_yadogae-0.1.0/test/test_agent_yadogae.py +956 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 coz-a
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: agent-yadogae
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Move a project directory and take its Claude Code, Codex and Antigravity CLI history with it.
|
|
5
|
+
Keywords: claude-code,codex,antigravity,coding-agent,cli
|
|
6
|
+
Author: coz-a
|
|
7
|
+
Requires-Python: >=3.8
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Classifier: Development Status :: 3 - Alpha
|
|
11
|
+
Classifier: Environment :: Console
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
|
15
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
16
|
+
Classifier: Topic :: Software Development
|
|
17
|
+
Classifier: Topic :: Utilities
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Project-URL: Homepage, https://github.com/coz-a/agent-yadogae
|
|
20
|
+
Project-URL: Issues, https://github.com/coz-a/agent-yadogae/issues
|
|
21
|
+
Import-Name: agent_yadogae
|
|
22
|
+
|
|
23
|
+
# agent-yadogae
|
|
24
|
+
|
|
25
|
+
エージェントの宿替え — プロジェクトフォルダを移動し、**コーディングエージェントがそのプロジェクトについて溜めた記録を連れていく**。
|
|
26
|
+
|
|
27
|
+
> **非公式ツールです。** Anthropic・OpenAI・Google とは関係がありません。Claude Code・Codex・Antigravity
|
|
28
|
+
> がそれぞれ内部で使っている、公開も保証もされていない保存形式に依存しており、エージェントの更新で
|
|
29
|
+
> 動かなくなることがあります。MIT ライセンスのもと無保証で提供します。Claude Code・Codex・Antigravity
|
|
30
|
+
> は各社の商標です。
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
agent-yadogae ~/workspace/oldname ~/workspace/newname
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## インストール
|
|
37
|
+
|
|
38
|
+
依存なしの Python 3.8 以上、Linux のみです。
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
pipx install agent-yadogae # または: uv tool install agent-yadogae
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
単一ファイルなので、そのまま置いても動きます。
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
curl -fsSL https://raw.githubusercontent.com/coz-a/agent-yadogae/main/agent_yadogae.py \
|
|
48
|
+
-o ~/.local/bin/agent-yadogae && chmod +x ~/.local/bin/agent-yadogae
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 対応状況
|
|
52
|
+
|
|
53
|
+
| エージェント | 検証したバージョン | `mv` だけだと |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| Claude Code | 2.1.268〜2.1.270 | `claude --continue` と `/resume` の一覧に出ない |
|
|
56
|
+
| Codex CLI | 0.153.4 | `codex resume` の一覧と `--last` に出ない |
|
|
57
|
+
| Antigravity CLI (`agy`) | 1.2.2 | `agy -c` が前の会話を引けない |
|
|
58
|
+
|
|
59
|
+
Linux でのみ検証しています。macOS と Windows では何も変更せずに終了します。Gemini CLI は対象外です。
|
|
60
|
+
|
|
61
|
+
## なぜ要るのか
|
|
62
|
+
|
|
63
|
+
3つのエージェントはどれも、会話を**実行したディレクトリの絶対パス**で索引しています。たとえば
|
|
64
|
+
Claude Code はパスの英数字以外をすべて `-` に置換した名前のフォルダを `~/.claude/projects/` に作り、
|
|
65
|
+
transcript も自動メモリもそこに入れます(200文字を超える名前は切り詰めてハッシュを付けます)。
|
|
66
|
+
|
|
67
|
+
```
|
|
68
|
+
/home/you/workspace/oldname
|
|
69
|
+
→ ~/.claude/projects/-home-you-workspace-oldname/
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
フォルダ名を変えると索引キーが変わるので、どのエージェントも過去の会話を見つけられなくなります。
|
|
73
|
+
**データは消えません。古いキーの下に取り残される**だけです。`mv` は何も言わずにこれをやります。
|
|
74
|
+
|
|
75
|
+
## 何を運ぶか
|
|
76
|
+
|
|
77
|
+
各エージェントの resume が実際に読んでいる記録を書き換えます。
|
|
78
|
+
|
|
79
|
+
| | 中身 |
|
|
80
|
+
|---|---|
|
|
81
|
+
| `~/.claude/projects/<encoded>/` | transcript、サブエージェントのログ、tool-results、`memory/`(自動メモリ) |
|
|
82
|
+
| `~/.claude.json` の `projects[パス]` | 信頼ダイアログの承認、`allowedTools`、MCP 設定 |
|
|
83
|
+
| `~/.claude/history.jsonl` の `"project"` | プロンプト履歴 |
|
|
84
|
+
| `~/.codex/sessions/**/rollout-*.jsonl` の `cwd` | **`codex resume` の絞り込みが見ているのはここ** |
|
|
85
|
+
| `~/.codex/state_<n>.sqlite` の `threads.cwd`, `project_roots.path` | スレッド索引 |
|
|
86
|
+
| `~/.codex/config.toml` の `[projects."<パス>"]` | 信頼設定 |
|
|
87
|
+
| `~/.gemini/antigravity-cli/cache/last_conversations.json` | パス → 会話 ID。**`agy -c` が見ているのはここ** |
|
|
88
|
+
| `~/.gemini/antigravity-cli/settings.json` の `trustedWorkspaces` | 信頼済みワークスペース |
|
|
89
|
+
| `~/.gemini/antigravity-cli/history.jsonl` の `"workspace"` | プロンプト履歴 |
|
|
90
|
+
|
|
91
|
+
プロジェクトの**サブディレクトリで始めたセッションも一緒に移ります**。Claude Code の worktree
|
|
92
|
+
(`.claude/worktrees/…`)の履歴フォルダも含め、`SRC/sub` は `DST/sub` になります。
|
|
93
|
+
|
|
94
|
+
Codex は SQLite の `threads.cwd` を直すだけでは戻らず、rollout 側の `cwd` まで書き換えて初めて
|
|
95
|
+
移動先の `codex resume` がセッションを拾うことを確認しています。agy は `last_conversations.json`
|
|
96
|
+
のキーを付け替えれば `agy -c` が会話を復元します。
|
|
97
|
+
|
|
98
|
+
## 使い方
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
agent-yadogae SRC DST [-n] [-y] [--state-only] [--merge] [--ignore-running] [-q]
|
|
102
|
+
|
|
103
|
+
-n, --dry-run 計画だけ表示して何も変更しない
|
|
104
|
+
-y, --yes 確認せずに実行する(端末以外から使うときは必須)
|
|
105
|
+
--state-only フォルダは移動済み。エージェントの記録だけ運ぶ
|
|
106
|
+
--merge 既に存在する DST へプロジェクトを合流させる
|
|
107
|
+
--ignore-running エージェントが動いていても実行する
|
|
108
|
+
-q, --quiet 問題だけ報告する
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
終了コードは、成功が 0、拒否・中止・途中の失敗が 1、エージェントが稼働中で止まったときが 2 です。
|
|
112
|
+
|
|
113
|
+
端末から実行すると、まず計画を表示してから `[y/N]` で確認します。
|
|
114
|
+
|
|
115
|
+
## 安全のための振る舞い
|
|
116
|
+
|
|
117
|
+
**変更を始める前に全部検査し、ひとつでも引っかかれば何も変えずに終了します。**
|
|
118
|
+
|
|
119
|
+
- 運ぶ Claude Code 履歴フォルダの名前を、**移動に含まれない別のプロジェクト**も使っているとき(`/w/a_b` と `/w/a-b` は同じ名前になり、`memory/` も共有されます)。transcript が残っていない場合は、Claude Code 自身の記録(`~/.claude.json` とプロンプト履歴)で見分け、記録が読めなければ拒否します
|
|
120
|
+
- DST の Claude Code 履歴フォルダ名が別のプロジェクトのものと重なるとき
|
|
121
|
+
- 合流する両側に、内容の違う同名ファイルがあるとき(`memory/MEMORY.md` など)
|
|
122
|
+
- SRC がシンボリックリンク、DST が SRC の中、SRC がホームディレクトリやエージェントのデータを含むとき
|
|
123
|
+
- SRC と DST が**別のファイルシステム**にあるとき(移動がコピーと削除になり、途中で止まると戻せないため)
|
|
124
|
+
- DST が既にある(`--merge` なし)、DST の親ディレクトリが無い
|
|
125
|
+
- Linux 以外
|
|
126
|
+
|
|
127
|
+
**そのプロジェクトで Claude Code・Codex・agy を閉じてから実行してください。** 開いたまま動かすと、
|
|
128
|
+
セッションが古い索引に書き足し続けて、その分が失われます。Claude Code は `~/.claude/sessions/*.json`
|
|
129
|
+
の `cwd` と生存 PID を突き合わせ、Codex と agy は `/proc` から作業ディレクトリが SRC か DST の下にある
|
|
130
|
+
`codex` / `agy` プロセスを探し、見つかれば終了コード 2 で止まります。
|
|
131
|
+
|
|
132
|
+
設定・履歴ファイルと Codex の SQLite は、触る前に `*.agent-yadogae-<timestamp>` としてバックアップします。
|
|
133
|
+
バックアップは作成の瞬間から所有者だけが読める状態で作り、元のファイルより広い権限にはしません。
|
|
134
|
+
ファイルは一時ファイルに書いてから置き換えるので、途中の状態が読まれることはありません。
|
|
135
|
+
|
|
136
|
+
**途中で失敗したとき**は終了コード 1 で、何が失敗したかと次の手を表示します。プロジェクト本体の移動が
|
|
137
|
+
済んでいれば、原因を直して `agent-yadogae SRC DST --state-only` を再実行すると残りを運びます
|
|
138
|
+
(済んだ部分には何もしません)。
|
|
139
|
+
|
|
140
|
+
**元に戻すには逆向きに実行します。** `agent-yadogae DST SRC` で、運んだ記録はすべて移動前と同じ内容に
|
|
141
|
+
戻ります(テストで往復後のバイト一致を確認しています)。Codex の rollout は数百MBになり得るので
|
|
142
|
+
バックアップしませんが、この往復で戻せます。
|
|
143
|
+
|
|
144
|
+
## やらないこと
|
|
145
|
+
|
|
146
|
+
**Claude Code の transcript の各行に埋め込まれた `"cwd"` は書き換えません。** 古いパスのまま残しても
|
|
147
|
+
`--continue` も `--resume` も正しく動くことを確認した上での判断です。直そうとすると数十MBの JSONL を
|
|
148
|
+
全部書き換えることになり、得るものがありません。
|
|
149
|
+
|
|
150
|
+
その代わり、運んだ履歴フォルダには `.agent-yadogae.json` を置き、そのフォルダが今どのパスのものかを
|
|
151
|
+
記録します。これが無いと、次に実行したとき「transcript の `cwd` とフォルダ名が合わない」ことを
|
|
152
|
+
パス変換規則の変化と見分けられません。逆向きに戻したときなど、フォルダの transcript 自身がそのパスを
|
|
153
|
+
申告していれば、`agent-yadogae` はこのファイルを置かない(あれば消す)ようにしています。
|
|
154
|
+
|
|
155
|
+
なお `claude --resume <session-id>` はプロジェクトに関係なく使えるので、移行しなくてもセッション ID
|
|
156
|
+
さえ分かればどこからでも復元できます。壊れるのは一覧のほうだけです。
|
|
157
|
+
|
|
158
|
+
## パス変換をなぜ検証するのか
|
|
159
|
+
|
|
160
|
+
Claude Code のパス → フォルダ名の変換は Claude Code 本体から取り出した実装をそのまま移植しています
|
|
161
|
+
(UTF-16 単位で置換するので、絵文字は `-` 2つになります)。それでも移動先の名前は計算するしかないので、
|
|
162
|
+
実行前に**このマシン上の全プロジェクトで規則が再現するかを検算**し、合わなければ何もせず終了します。
|
|
163
|
+
Claude Code の更新で規則が変わった場合に、黙って間違ったフォルダを作らないためです。
|
|
164
|
+
|
|
165
|
+
検算は「そのフォルダが申告する `cwd`(と `.agent-yadogae.json`)のうち少なくとも1つが自分の名前に
|
|
166
|
+
符号化されるか」で判定します。1つ目だけを見てはいけません — プロジェクト直下で始まって git worktree に
|
|
167
|
+
入ったセッションは `cwd` を2つ記録し、索引は worktree 側に付くからです。
|
|
168
|
+
|
|
169
|
+
## 名前について
|
|
170
|
+
|
|
171
|
+
宿替え=住まいを替えること。替えるのは**エージェントの宿**で、そこに置いてある持ち物(会話の記録、
|
|
172
|
+
自動メモリ、そのプロジェクト用の設定)は当然ついてきます。`mv` との違いがそのまま名前になっています。
|
|
173
|
+
|
|
174
|
+
## テスト
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
python3 -m unittest discover -s test -v
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
使い捨ての `HOME`・`CLAUDE_CONFIG_DIR`・`CODEX_HOME` と偽の `/proc` だけを使い、実際のエージェントの
|
|
181
|
+
データには触れず、API も呼びません。`node` があれば、Claude Code から取り出したパス変換関数を node で
|
|
182
|
+
実行し、移植版と結果が一致することも確かめます。
|
|
183
|
+
|
|
184
|
+
実環境での end-to-end 確認は 2026-09-13 に実施しています。目印のトークンを含むセッションを作り、
|
|
185
|
+
移動後に移動先で本物の `claude --continue`・`codex exec resume --last`・`agy -c` がトークンを復元する
|
|
186
|
+
ことを確認しました。Codex は `mv` だけでも、SQLite の `threads.cwd` を直すだけでも復元できず、rollout の
|
|
187
|
+
`cwd` まで直すと復元しました。
|
|
188
|
+
|
|
189
|
+
## ライセンス
|
|
190
|
+
|
|
191
|
+
MIT。[LICENSE](LICENSE) を参照してください。
|
|
192
|
+
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
# agent-yadogae
|
|
2
|
+
|
|
3
|
+
エージェントの宿替え — プロジェクトフォルダを移動し、**コーディングエージェントがそのプロジェクトについて溜めた記録を連れていく**。
|
|
4
|
+
|
|
5
|
+
> **非公式ツールです。** Anthropic・OpenAI・Google とは関係がありません。Claude Code・Codex・Antigravity
|
|
6
|
+
> がそれぞれ内部で使っている、公開も保証もされていない保存形式に依存しており、エージェントの更新で
|
|
7
|
+
> 動かなくなることがあります。MIT ライセンスのもと無保証で提供します。Claude Code・Codex・Antigravity
|
|
8
|
+
> は各社の商標です。
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
agent-yadogae ~/workspace/oldname ~/workspace/newname
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## インストール
|
|
15
|
+
|
|
16
|
+
依存なしの Python 3.8 以上、Linux のみです。
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
pipx install agent-yadogae # または: uv tool install agent-yadogae
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
単一ファイルなので、そのまま置いても動きます。
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
curl -fsSL https://raw.githubusercontent.com/coz-a/agent-yadogae/main/agent_yadogae.py \
|
|
26
|
+
-o ~/.local/bin/agent-yadogae && chmod +x ~/.local/bin/agent-yadogae
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## 対応状況
|
|
30
|
+
|
|
31
|
+
| エージェント | 検証したバージョン | `mv` だけだと |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| Claude Code | 2.1.268〜2.1.270 | `claude --continue` と `/resume` の一覧に出ない |
|
|
34
|
+
| Codex CLI | 0.153.4 | `codex resume` の一覧と `--last` に出ない |
|
|
35
|
+
| Antigravity CLI (`agy`) | 1.2.2 | `agy -c` が前の会話を引けない |
|
|
36
|
+
|
|
37
|
+
Linux でのみ検証しています。macOS と Windows では何も変更せずに終了します。Gemini CLI は対象外です。
|
|
38
|
+
|
|
39
|
+
## なぜ要るのか
|
|
40
|
+
|
|
41
|
+
3つのエージェントはどれも、会話を**実行したディレクトリの絶対パス**で索引しています。たとえば
|
|
42
|
+
Claude Code はパスの英数字以外をすべて `-` に置換した名前のフォルダを `~/.claude/projects/` に作り、
|
|
43
|
+
transcript も自動メモリもそこに入れます(200文字を超える名前は切り詰めてハッシュを付けます)。
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
/home/you/workspace/oldname
|
|
47
|
+
→ ~/.claude/projects/-home-you-workspace-oldname/
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
フォルダ名を変えると索引キーが変わるので、どのエージェントも過去の会話を見つけられなくなります。
|
|
51
|
+
**データは消えません。古いキーの下に取り残される**だけです。`mv` は何も言わずにこれをやります。
|
|
52
|
+
|
|
53
|
+
## 何を運ぶか
|
|
54
|
+
|
|
55
|
+
各エージェントの resume が実際に読んでいる記録を書き換えます。
|
|
56
|
+
|
|
57
|
+
| | 中身 |
|
|
58
|
+
|---|---|
|
|
59
|
+
| `~/.claude/projects/<encoded>/` | transcript、サブエージェントのログ、tool-results、`memory/`(自動メモリ) |
|
|
60
|
+
| `~/.claude.json` の `projects[パス]` | 信頼ダイアログの承認、`allowedTools`、MCP 設定 |
|
|
61
|
+
| `~/.claude/history.jsonl` の `"project"` | プロンプト履歴 |
|
|
62
|
+
| `~/.codex/sessions/**/rollout-*.jsonl` の `cwd` | **`codex resume` の絞り込みが見ているのはここ** |
|
|
63
|
+
| `~/.codex/state_<n>.sqlite` の `threads.cwd`, `project_roots.path` | スレッド索引 |
|
|
64
|
+
| `~/.codex/config.toml` の `[projects."<パス>"]` | 信頼設定 |
|
|
65
|
+
| `~/.gemini/antigravity-cli/cache/last_conversations.json` | パス → 会話 ID。**`agy -c` が見ているのはここ** |
|
|
66
|
+
| `~/.gemini/antigravity-cli/settings.json` の `trustedWorkspaces` | 信頼済みワークスペース |
|
|
67
|
+
| `~/.gemini/antigravity-cli/history.jsonl` の `"workspace"` | プロンプト履歴 |
|
|
68
|
+
|
|
69
|
+
プロジェクトの**サブディレクトリで始めたセッションも一緒に移ります**。Claude Code の worktree
|
|
70
|
+
(`.claude/worktrees/…`)の履歴フォルダも含め、`SRC/sub` は `DST/sub` になります。
|
|
71
|
+
|
|
72
|
+
Codex は SQLite の `threads.cwd` を直すだけでは戻らず、rollout 側の `cwd` まで書き換えて初めて
|
|
73
|
+
移動先の `codex resume` がセッションを拾うことを確認しています。agy は `last_conversations.json`
|
|
74
|
+
のキーを付け替えれば `agy -c` が会話を復元します。
|
|
75
|
+
|
|
76
|
+
## 使い方
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
agent-yadogae SRC DST [-n] [-y] [--state-only] [--merge] [--ignore-running] [-q]
|
|
80
|
+
|
|
81
|
+
-n, --dry-run 計画だけ表示して何も変更しない
|
|
82
|
+
-y, --yes 確認せずに実行する(端末以外から使うときは必須)
|
|
83
|
+
--state-only フォルダは移動済み。エージェントの記録だけ運ぶ
|
|
84
|
+
--merge 既に存在する DST へプロジェクトを合流させる
|
|
85
|
+
--ignore-running エージェントが動いていても実行する
|
|
86
|
+
-q, --quiet 問題だけ報告する
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
終了コードは、成功が 0、拒否・中止・途中の失敗が 1、エージェントが稼働中で止まったときが 2 です。
|
|
90
|
+
|
|
91
|
+
端末から実行すると、まず計画を表示してから `[y/N]` で確認します。
|
|
92
|
+
|
|
93
|
+
## 安全のための振る舞い
|
|
94
|
+
|
|
95
|
+
**変更を始める前に全部検査し、ひとつでも引っかかれば何も変えずに終了します。**
|
|
96
|
+
|
|
97
|
+
- 運ぶ Claude Code 履歴フォルダの名前を、**移動に含まれない別のプロジェクト**も使っているとき(`/w/a_b` と `/w/a-b` は同じ名前になり、`memory/` も共有されます)。transcript が残っていない場合は、Claude Code 自身の記録(`~/.claude.json` とプロンプト履歴)で見分け、記録が読めなければ拒否します
|
|
98
|
+
- DST の Claude Code 履歴フォルダ名が別のプロジェクトのものと重なるとき
|
|
99
|
+
- 合流する両側に、内容の違う同名ファイルがあるとき(`memory/MEMORY.md` など)
|
|
100
|
+
- SRC がシンボリックリンク、DST が SRC の中、SRC がホームディレクトリやエージェントのデータを含むとき
|
|
101
|
+
- SRC と DST が**別のファイルシステム**にあるとき(移動がコピーと削除になり、途中で止まると戻せないため)
|
|
102
|
+
- DST が既にある(`--merge` なし)、DST の親ディレクトリが無い
|
|
103
|
+
- Linux 以外
|
|
104
|
+
|
|
105
|
+
**そのプロジェクトで Claude Code・Codex・agy を閉じてから実行してください。** 開いたまま動かすと、
|
|
106
|
+
セッションが古い索引に書き足し続けて、その分が失われます。Claude Code は `~/.claude/sessions/*.json`
|
|
107
|
+
の `cwd` と生存 PID を突き合わせ、Codex と agy は `/proc` から作業ディレクトリが SRC か DST の下にある
|
|
108
|
+
`codex` / `agy` プロセスを探し、見つかれば終了コード 2 で止まります。
|
|
109
|
+
|
|
110
|
+
設定・履歴ファイルと Codex の SQLite は、触る前に `*.agent-yadogae-<timestamp>` としてバックアップします。
|
|
111
|
+
バックアップは作成の瞬間から所有者だけが読める状態で作り、元のファイルより広い権限にはしません。
|
|
112
|
+
ファイルは一時ファイルに書いてから置き換えるので、途中の状態が読まれることはありません。
|
|
113
|
+
|
|
114
|
+
**途中で失敗したとき**は終了コード 1 で、何が失敗したかと次の手を表示します。プロジェクト本体の移動が
|
|
115
|
+
済んでいれば、原因を直して `agent-yadogae SRC DST --state-only` を再実行すると残りを運びます
|
|
116
|
+
(済んだ部分には何もしません)。
|
|
117
|
+
|
|
118
|
+
**元に戻すには逆向きに実行します。** `agent-yadogae DST SRC` で、運んだ記録はすべて移動前と同じ内容に
|
|
119
|
+
戻ります(テストで往復後のバイト一致を確認しています)。Codex の rollout は数百MBになり得るので
|
|
120
|
+
バックアップしませんが、この往復で戻せます。
|
|
121
|
+
|
|
122
|
+
## やらないこと
|
|
123
|
+
|
|
124
|
+
**Claude Code の transcript の各行に埋め込まれた `"cwd"` は書き換えません。** 古いパスのまま残しても
|
|
125
|
+
`--continue` も `--resume` も正しく動くことを確認した上での判断です。直そうとすると数十MBの JSONL を
|
|
126
|
+
全部書き換えることになり、得るものがありません。
|
|
127
|
+
|
|
128
|
+
その代わり、運んだ履歴フォルダには `.agent-yadogae.json` を置き、そのフォルダが今どのパスのものかを
|
|
129
|
+
記録します。これが無いと、次に実行したとき「transcript の `cwd` とフォルダ名が合わない」ことを
|
|
130
|
+
パス変換規則の変化と見分けられません。逆向きに戻したときなど、フォルダの transcript 自身がそのパスを
|
|
131
|
+
申告していれば、`agent-yadogae` はこのファイルを置かない(あれば消す)ようにしています。
|
|
132
|
+
|
|
133
|
+
なお `claude --resume <session-id>` はプロジェクトに関係なく使えるので、移行しなくてもセッション ID
|
|
134
|
+
さえ分かればどこからでも復元できます。壊れるのは一覧のほうだけです。
|
|
135
|
+
|
|
136
|
+
## パス変換をなぜ検証するのか
|
|
137
|
+
|
|
138
|
+
Claude Code のパス → フォルダ名の変換は Claude Code 本体から取り出した実装をそのまま移植しています
|
|
139
|
+
(UTF-16 単位で置換するので、絵文字は `-` 2つになります)。それでも移動先の名前は計算するしかないので、
|
|
140
|
+
実行前に**このマシン上の全プロジェクトで規則が再現するかを検算**し、合わなければ何もせず終了します。
|
|
141
|
+
Claude Code の更新で規則が変わった場合に、黙って間違ったフォルダを作らないためです。
|
|
142
|
+
|
|
143
|
+
検算は「そのフォルダが申告する `cwd`(と `.agent-yadogae.json`)のうち少なくとも1つが自分の名前に
|
|
144
|
+
符号化されるか」で判定します。1つ目だけを見てはいけません — プロジェクト直下で始まって git worktree に
|
|
145
|
+
入ったセッションは `cwd` を2つ記録し、索引は worktree 側に付くからです。
|
|
146
|
+
|
|
147
|
+
## 名前について
|
|
148
|
+
|
|
149
|
+
宿替え=住まいを替えること。替えるのは**エージェントの宿**で、そこに置いてある持ち物(会話の記録、
|
|
150
|
+
自動メモリ、そのプロジェクト用の設定)は当然ついてきます。`mv` との違いがそのまま名前になっています。
|
|
151
|
+
|
|
152
|
+
## テスト
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
python3 -m unittest discover -s test -v
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
使い捨ての `HOME`・`CLAUDE_CONFIG_DIR`・`CODEX_HOME` と偽の `/proc` だけを使い、実際のエージェントの
|
|
159
|
+
データには触れず、API も呼びません。`node` があれば、Claude Code から取り出したパス変換関数を node で
|
|
160
|
+
実行し、移植版と結果が一致することも確かめます。
|
|
161
|
+
|
|
162
|
+
実環境での end-to-end 確認は 2026-09-13 に実施しています。目印のトークンを含むセッションを作り、
|
|
163
|
+
移動後に移動先で本物の `claude --continue`・`codex exec resume --last`・`agy -c` がトークンを復元する
|
|
164
|
+
ことを確認しました。Codex は `mv` だけでも、SQLite の `threads.cwd` を直すだけでも復元できず、rollout の
|
|
165
|
+
`cwd` まで直すと復元しました。
|
|
166
|
+
|
|
167
|
+
## ライセンス
|
|
168
|
+
|
|
169
|
+
MIT。[LICENSE](LICENSE) を参照してください。
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Security policy
|
|
2
|
+
|
|
3
|
+
agent-yadogae rewrites files that belong to coding agents in your home
|
|
4
|
+
directory, so a flaw in it can damage or expose conversation history and
|
|
5
|
+
settings.
|
|
6
|
+
|
|
7
|
+
Please report a vulnerability privately through GitHub: open the repository's
|
|
8
|
+
**Security** tab and choose **Report a vulnerability**. Do not open a public
|
|
9
|
+
issue for it. Commits are made from a GitHub noreply address, so there is no
|
|
10
|
+
email address to write to.
|
|
11
|
+
|
|
12
|
+
Only the latest release receives fixes.
|