throughline 0.13.0 → 0.14.0
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.
- package/CHANGELOG.md +25 -1
- package/README.ja.md +14 -7
- package/README.md +14 -7
- package/bin/throughline.mjs +10 -4
- package/docs/02_clear_auto_handoff_plan.md +2 -2
- package/docs/05_codex_first_roadmap.md +3 -2
- package/docs/adr/0032-claude-compact-continuation.md +2 -0
- package/docs/adr/0033-claude-auto-handoff-new-session.md +86 -0
- package/package.json +2 -2
- package/rag/01-hooks/raw/claude-compact-hooks-extract.md +28 -3
- package/rag/INDEX.md +1 -1
- package/src/claude-auto-handoff.mjs +419 -137
- package/src/claude-auto-handoff.test.mjs +489 -193
- package/src/claude-pre-compact.mjs +21 -7
- package/src/claude-pre-tool-use.mjs +67 -0
- package/src/cli/auto-handoff.mjs +24 -18
- package/src/cli/install.mjs +67 -18
- package/src/cli/install.test.mjs +22 -4
- package/src/handoff-executor.mjs +24 -12
- package/src/hosts/claude.mjs +10 -0
- package/src/prompt-submit.mjs +1 -0
- package/src/resume-context.mjs +26 -34
- package/src/resume-context.test.mjs +26 -37
- package/src/runtime-error-store.mjs +6 -1
- package/src/session-start.mjs +8 -28
- package/src/transcript-reader.mjs +4 -4
- package/src/transcript-reader.test.mjs +19 -0
- package/src/turn-backfill.mjs +2 -7
- package/src/turn-backfill.test.mjs +0 -22
- package/src/turn-processor.mjs +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -10,6 +10,29 @@ shipped to npm but were not individually tagged on GitHub.
|
|
|
10
10
|
|
|
11
11
|
## [Unreleased]
|
|
12
12
|
|
|
13
|
+
## [0.14.0] — 2026-10-05
|
|
14
|
+
|
|
15
|
+
### 変更
|
|
16
|
+
|
|
17
|
+
- Claude Codeの自動継続を作り直す([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。0.13.0の方式(自動圧縮を通し、圧縮の直後に同じ会話へ記憶を注入する)は取り下げた。Throughlineは自動圧縮を置き換えるもので、圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続ける。Codexの自動継続と同じ並びにした。
|
|
18
|
+
1. 自動圧縮の直前に、`PreCompact`フックが圧縮を止め、`/tl`と同じ印を残す。
|
|
19
|
+
2. `PreToolUse`フックが、旧い会話の次の道具を実行させずに止める。旧い会話は空にしない。
|
|
20
|
+
3. 同じprojectに、`claude --bg`で指示を待つ新しい会話を立てる。モデル・推論強度・権限は旧い会話から引き継ぐ。
|
|
21
|
+
4. 新しい会話の受け口へ、配送ライブラリ(`aiterm-steer-delivery` 0.1.13の`sendClaudeInbox`)で継続の指示を1通送る。届いた時に、止めた時点の依頼と直近の会話の原文を注入する。
|
|
22
|
+
- `throughline auto-handoff enable --host claude`が`PreCompact`と`PreToolUse`のフックを登録し、`disable`が外す。`throughline install`は登録しない。0.13.0の`install`が置いた`PreCompact`フックは、自動継続が無効な端末の`install`で外す。
|
|
23
|
+
- 続きは裏の会話で動く。`claude agents`の一覧と`claude attach <id>`で見られる。Claude Desktopの画面には出ず、後継のターンが終わって入力待ちになった後に開ける。
|
|
24
|
+
- 別の会話から届いた発言(`Another Claude session sent a message:`)は、Claude Codeが後ろに付ける定型の注意書きを落として保存する。
|
|
25
|
+
- 依存の`aiterm-steer-delivery`を0.1.9から0.1.13に上げる。
|
|
26
|
+
|
|
27
|
+
### 0.13.0から変わらないもの
|
|
28
|
+
|
|
29
|
+
- 圧縮の要約行(`isCompactSummary`)をユーザー発言として保存しない修理は、そのまま有効。
|
|
30
|
+
|
|
31
|
+
### 確認した範囲
|
|
32
|
+
|
|
33
|
+
- LinuxのClaude Code 2.1.289。対話画面の会話から始めて後継へ3回連続で引き継ぎ、最後の後継が作業を完了した。4つの会話のどれにも圧縮の記録は無く、止めた道具は実行されていなかった。
|
|
34
|
+
- macOS・Windows、Claude Desktopから始まる会話、subagentが動いている最中の引き継ぎは確かめていない。
|
|
35
|
+
|
|
13
36
|
## [0.13.0] — 2026-10-04
|
|
14
37
|
|
|
15
38
|
### 追加
|
|
@@ -1653,7 +1676,8 @@ two attempts, instrument first instead of patching again.
|
|
|
1653
1676
|
|
|
1654
1677
|
---
|
|
1655
1678
|
|
|
1656
|
-
[Unreleased]: https://github.com/kitepon/Throughline/compare/v0.
|
|
1679
|
+
[Unreleased]: https://github.com/kitepon/Throughline/compare/v0.14.0...HEAD
|
|
1680
|
+
[0.14.0]: https://github.com/kitepon/Throughline/compare/v0.13.0...v0.14.0
|
|
1657
1681
|
[0.13.0]: https://github.com/kitepon/Throughline/compare/v0.12.9...v0.13.0
|
|
1658
1682
|
[0.12.9]: https://github.com/kitepon/Throughline/compare/v0.12.8...v0.12.9
|
|
1659
1683
|
[0.12.8]: https://github.com/kitepon/Throughline/compare/v0.12.7...v0.12.8
|
package/README.ja.md
CHANGED
|
@@ -52,17 +52,24 @@ throughline auto-handoff status --host claude --json
|
|
|
52
52
|
throughline auto-handoff disable --host claude
|
|
53
53
|
```
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
既定では無効です。`enable`は必要な`PreCompact`と`PreToolUse`のフックを登録し、`disable`が外します。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
自動圧縮を置き換えます。圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続けます([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
59
|
+
1. 自動圧縮の直前に、圧縮を止めます。`/tl`と同じ印を残します。
|
|
60
|
+
2. 旧い会話の次の道具を、実行させずに止めます。旧い会話は止めるだけで、空にしません。
|
|
61
|
+
3. 同じprojectに、新しいClaudeの会話を裏で立てます(`claude --bg`)。モデル・推論強度・権限は旧い会話から引き継ぎます。
|
|
62
|
+
4. 新しい会話へ継続の指示を1通送ります。届いた時に、止めた時点の依頼と直近の会話の原文を注入します(上限9,500字)。
|
|
62
63
|
|
|
63
|
-
|
|
64
|
+
続きは裏の会話で動きます。`claude agents`の一覧と`claude attach <id>`で見られます。Claude Desktopの画面には出ず、後継のターンが終わって入力待ちになった後にDesktopで開けます。手動`/compact`、subagentの中の圧縮、`claude -p`などscriptから起動した会話は対象に含めません。
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
```bash
|
|
67
|
+
throughline auto-handoff status --host claude --operation <handoff-id> --json
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
後継の立ち上げや配送に失敗した時は、固定の理由を記録して止まります。結果が不明な指示は再送しません。圧縮を止めた後にモデルが道具を呼ばずにターンを終えた時は、後継を立てません。印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぎます。
|
|
71
|
+
|
|
72
|
+
有効にした端末では、Claudeの道具の呼び出しのたびに`PreToolUse`フックが1回走ります。LinuxのClaude Code 2.1.289で実機確認済みです。macOS・Windows、Claude Desktopから始まる会話は未検証です。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)を参照してください。
|
|
66
73
|
|
|
67
74
|
## 所有境界
|
|
68
75
|
|
package/README.md
CHANGED
|
@@ -51,17 +51,24 @@ throughline auto-handoff status --host claude --json
|
|
|
51
51
|
throughline auto-handoff disable --host claude
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
既定では無効です。`enable`は必要な`PreCompact`と`PreToolUse`のフックを登録し、`disable`が外します。`--project`を省略すると全projectを対象にします。Codexの設定とは別で、互いに影響しません。
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
自動圧縮を置き換えます。圧縮が走る前に旧い会話を止め、記憶を持った新しい会話で作業を続けます([ADR 0033](docs/adr/0033-claude-auto-handoff-new-session.md))。
|
|
57
57
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
1. 自動圧縮の直前に、圧縮を止めます。`/tl`と同じ印を残します。
|
|
59
|
+
2. 旧い会話の次の道具を、実行させずに止めます。旧い会話は止めるだけで、空にしません。
|
|
60
|
+
3. 同じprojectに、新しいClaudeの会話を裏で立てます(`claude --bg`)。モデル・推論強度・権限は旧い会話から引き継ぎます。
|
|
61
|
+
4. 新しい会話へ継続の指示を1通送ります。届いた時に、止めた時点の依頼と直近の会話の原文を注入します(上限9,500字)。
|
|
61
62
|
|
|
62
|
-
|
|
63
|
+
続きは裏の会話で動きます。`claude agents`の一覧と`claude attach <id>`で見られます。Claude Desktopの画面には出ず、後継のターンが終わって入力待ちになった後にDesktopで開けます。手動`/compact`、subagentの中の圧縮、`claude -p`などscriptから起動した会話は対象に含めません。
|
|
63
64
|
|
|
64
|
-
|
|
65
|
+
```bash
|
|
66
|
+
throughline auto-handoff status --host claude --operation <handoff-id> --json
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
後継の立ち上げや配送に失敗した時は、固定の理由を記録して止まります。結果が不明な指示は再送しません。圧縮を止めた後にモデルが道具を呼ばずにターンを終えた時は、後継を立てません。印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぎます。
|
|
70
|
+
|
|
71
|
+
有効にした端末では、Claudeの道具の呼び出しのたびに`PreToolUse`フックが1回走ります。LinuxのClaude Code 2.1.289で実機確認済みです。macOS・Windows、Claude Desktopから始まる会話は未検証です。[実測と検証範囲](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)を参照してください。
|
|
65
72
|
|
|
66
73
|
## Ownership boundary
|
|
67
74
|
|
package/bin/throughline.mjs
CHANGED
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* throughline uninstall # hook を削除
|
|
9
9
|
* throughline process-turn # Stop hook (Claude Code から呼ばれる)
|
|
10
10
|
* throughline session-start # SessionStart hook (Claude Code から呼ばれる)
|
|
11
|
-
* throughline pre-compact # PreCompact hook (Claude Code
|
|
11
|
+
* throughline pre-compact # PreCompact hook (Claude Code から呼ばれる。自動継続: 自動圧縮を止める)
|
|
12
|
+
* throughline pre-tool-use # PreToolUse hook (Claude Code から呼ばれる。自動継続: 旧い会話を止める)
|
|
12
13
|
* throughline detail <時刻> # L2+L3 詳細取得 (Claude が Bash 経由で呼ぶ想定)
|
|
13
14
|
* throughline recall --l2|--l1 # 注入案内から辿る pull 用 read-only 記憶取得
|
|
14
15
|
* throughline handoff-preview # Codex-facing throughline_handoff JSON preview
|
|
@@ -84,6 +85,9 @@ switch (cmd) {
|
|
|
84
85
|
case 'pre-compact':
|
|
85
86
|
await (await import('../src/claude-pre-compact.mjs')).run();
|
|
86
87
|
break;
|
|
88
|
+
case 'pre-tool-use':
|
|
89
|
+
await (await import('../src/claude-pre-tool-use.mjs')).run();
|
|
90
|
+
break;
|
|
87
91
|
case 'monitor':
|
|
88
92
|
(await import('../src/token-monitor.mjs')).main();
|
|
89
93
|
break;
|
|
@@ -238,6 +242,7 @@ switch (cmd) {
|
|
|
238
242
|
'prompt-submit': 'HOOK_PROMPT_SUBMIT_FAILED',
|
|
239
243
|
'process-turn': 'HOOK_PROCESS_TURN_FAILED',
|
|
240
244
|
'pre-compact': 'HOOK_PRE_COMPACT_FAILED',
|
|
245
|
+
'pre-tool-use': 'HOOK_PRE_TOOL_USE_FAILED',
|
|
241
246
|
}[cmd];
|
|
242
247
|
if (code) {
|
|
243
248
|
const { recordRuntimeErrorBestEffort } = await import('../src/runtime-error-store.mjs');
|
|
@@ -407,8 +412,8 @@ Usage:
|
|
|
407
412
|
throughline auto-handoff detail --operation <id> --origin <session> --turn <n>
|
|
408
413
|
凍結したL2/L3を取得
|
|
409
414
|
throughline auto-handoff enable|disable|status --host claude [--project <path>] [--json]
|
|
410
|
-
Claude Code
|
|
411
|
-
|
|
415
|
+
Claude Codeの自動継続(自動圧縮を止め、記憶を持った
|
|
416
|
+
新しい会話で続ける)を有効化・無効化・確認
|
|
412
417
|
throughline doctor Check environment
|
|
413
418
|
throughline doctor --trim Show trim host boundary diagnostics
|
|
414
419
|
throughline doctor --codex Show Codex primary diagnostics
|
|
@@ -419,7 +424,8 @@ Hook subcommands (called by Claude Code / Codex):
|
|
|
419
424
|
throughline session-start SessionStart hook
|
|
420
425
|
throughline process-turn Stop hook
|
|
421
426
|
throughline prompt-submit UserPromptSubmit hook (/tl & /clear baton writer)
|
|
422
|
-
throughline pre-compact PreCompact hook (Claude
|
|
427
|
+
throughline pre-compact PreCompact hook (Claude自動継続: 自動圧縮を止めて印を残す)
|
|
428
|
+
throughline pre-tool-use PreToolUse hook (Claude自動継続: 旧い会話を止めて後継を立てる)
|
|
423
429
|
throughline codex-hook user-prompt-submit Codex current-session refresh prompt hook
|
|
424
430
|
throughline codex-hook post-tool-use Codex current-session refresh tool-loop hook
|
|
425
431
|
throughline codex-hook stop Codex Stop hook
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
| `/tl` | `UserPromptSubmit` が現在の session id を baton として保存する。次の実セッションがその前任を確定的に引き継ぐ |
|
|
12
12
|
| VS Code の `/clear` | 組み込みコマンドは `UserPromptSubmit` に届かない。`SessionStart source='clear'` を使う auto path が、同じ project の直近前任を凍結して引き継ぐ |
|
|
13
13
|
| Claude Desktop の `/clear` | `UserPromptSubmit` に届かず、`SessionStart source='clear'` も来ないため自動継承しない。続ける場合は `/clear` の前に `/tl` を実行する |
|
|
14
|
-
| Claude Code の自動圧縮 |
|
|
14
|
+
| Claude Code の自動圧縮 | `auto-handoff enable --host claude` で有効にした時だけ、`PreCompact`(`trigger: auto`)が圧縮を止めて `/tl` と同じ印を残し、`PreToolUse` が旧い会話を止める。Throughline が `claude --bg` で新しい会話を立て、継続の指示を1通送る。その指示の `UserPromptSubmit` が印を消費して記憶を注入する。既定は無効。手動 `/compact` は対象外。正本は [ADR 0033](adr/0033-claude-auto-handoff-new-session.md) |
|
|
15
15
|
|
|
16
16
|
`/clear` が `UserPromptSubmit` に届かないことは、VS Code と Desktop の対照実測で
|
|
17
17
|
確定している。`prompt-submit` に残る `/clear` 分岐は host が将来その文字列を渡した場合の
|
|
@@ -44,7 +44,7 @@ baton path と auto path は同じ `buildBudgetedResumeContext` を使う。注
|
|
|
44
44
|
|
|
45
45
|
## host 別境界
|
|
46
46
|
|
|
47
|
-
- Claude Code: VS Code `/clear` は auto path、Desktop `/clear` は `/tl`
|
|
47
|
+
- Claude Code: VS Code `/clear` は auto path、Desktop `/clear` は `/tl` 併用。自動圧縮は、有効にした時だけ、圧縮を止めて新しい会話へ引き継ぐ(ADR 0033)。
|
|
48
48
|
- Grok: `/tl` の baton 成功後に `throughline grok-continue --session <id>` で後継席を
|
|
49
49
|
起動する。`/clear` では起動しない。正本は [ADR 0021](adr/0021-grok-host-capture.md)。
|
|
50
50
|
- Cursor: `/tl` は baton を残すが後継会話を自動起動しない。次の会話が baton を消費する。
|
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
最初の成立検証はCodex Desktopで行う。OSごとの仕組みと受入条件は共通にし、
|
|
29
29
|
差分は既存の `src/os/` と配送ライブラリの環境適合へ閉じ込める。
|
|
30
30
|
VS Code・CLIとClaude/Grok/Cursorの対応はhostごとに同じ条件で検証する。
|
|
31
|
-
Claude Code
|
|
32
|
-
|
|
31
|
+
Claude Codeは同じ並び(圧縮を止める、旧い会話を止める、新しい会話を立てる、継続の指示を1通送る)を、
|
|
32
|
+
Claude Codeの入口(hook、`claude --bg`、会話ごとの受け口)で行う([ADR 0033](adr/0033-claude-auto-handoff-new-session.md))。
|
|
33
|
+
この節の処理順と進行状態の細目はCodexだけに適用する。
|
|
33
34
|
一つのhostの成功で他のhostも対応済みとはしない。
|
|
34
35
|
|
|
35
36
|
### 根拠と検証範囲
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# ADR 0033: Claude Code の自動継続は、自動圧縮を止めて新しい会話へ引き継ぐ
|
|
2
|
+
|
|
3
|
+
日付: 2026-10-05
|
|
4
|
+
|
|
5
|
+
## Context
|
|
6
|
+
|
|
7
|
+
ADR 0032(0.13.0)は、Claude Code の自動圧縮を通し、圧縮の直後に同じ会話へ記憶を注入した。
|
|
8
|
+
オーナーはこの方式を却下した(2026-10-04)。Throughline は自動圧縮を置き換えるもので、
|
|
9
|
+
自動圧縮が走った時点で負けである。Codex の自動継続(圧縮の前に止めて、新しいタスクへ引き継ぐ)と
|
|
10
|
+
同じ並びを、Claude Code でも実現する。
|
|
11
|
+
|
|
12
|
+
Codex 版の各段に当たるものを、Claude Code 2.1.289 の公式文書と実機で1段ずつ確かめた。
|
|
13
|
+
|
|
14
|
+
| Codex 版の段 | Claude Code で当たるもの | 確認 |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| 圧縮の前に旧タスクを止める | `PreCompact` の exit code 2 で圧縮を止める。`PreToolUse` が `permissionDecision: "deny"` と `continue: false` を返すと、その道具は実行されずにターンが止まる | 実機 |
|
|
17
|
+
| 新しいタスクを作る | `claude --bg`。指示を付けずに起動すると、指示を待つ会話が立つ(`idle — send a prompt to start`) | 実機 |
|
|
18
|
+
| 記憶を入れる | 最初の指示の `UserPromptSubmit` hook の出力。`/tl` の印(baton)の引き継ぎと同じ | 実機 |
|
|
19
|
+
| 「続けて」を送る | 会話ごとの受け口(inbox socket)。配送ライブラリ `aiterm-steer-delivery` 0.1.13 の `sendClaudeInbox` | 実機 |
|
|
20
|
+
|
|
21
|
+
`PreCompact` の `continue` は捨てられるので、圧縮を止める hook と作業を止める hook は別になる。
|
|
22
|
+
`PreToolUse` が `continue: false` だけを返すと、その道具は実行されてから止まる。`deny` を一緒に返すと実行されない。
|
|
23
|
+
|
|
24
|
+
Claude Desktop の新しい会話は、画面を開いただけでは process が起動しない(最初の指示が送られた時に起動する)。
|
|
25
|
+
`claude://code/new` の `q` は入力欄への事前入力で、送信しない。受け口が無いので、Desktop の下書きへは配送できない
|
|
26
|
+
(配送ライブラリの持ち主も確認)。後継は Throughline が起動する会話にする(オーナーの判断、2026-10-04)。
|
|
27
|
+
|
|
28
|
+
## Decision
|
|
29
|
+
|
|
30
|
+
1. **圧縮を止める**: `PreCompact` hook(`throughline pre-compact`、matcher 無し)が、`trigger: "auto"` で自動継続が
|
|
31
|
+
有効な project の時だけ、`/tl` と同じ印(baton)と引き継ぎの記録を残し、exit code 2 で圧縮を止める。
|
|
32
|
+
手動の `/compact`、無効な project、subagent の中の圧縮(payload に `agent_id`)、script から起動した会話
|
|
33
|
+
(`CLAUDE_CODE_ENTRYPOINT` が `sdk-` で始まる)では止めない。
|
|
34
|
+
2. **旧い会話を止める**: `PreToolUse` hook(`throughline pre-tool-use`、全ての道具)が、記録のある会話の次の道具を、
|
|
35
|
+
実行させずに止める。旧い会話は止めるだけで、空にしない。同じ応答に並んだ道具も全て止め、後継の立ち上げは1回だけ行う。
|
|
36
|
+
記録が無い会話では、記録のファイルの有無だけを見て終わる。subagent の中の道具は止めない。
|
|
37
|
+
3. **新しい会話を立てる**: 切り離した worker が、止めた時点の依頼・モデル・推論強度・権限を記録へ写し、
|
|
38
|
+
同じ project で `claude --bg` を指示なしで起動する。起動時に `--model`・`--effort`・`--permission-mode` を渡し、
|
|
39
|
+
`--settings '{"worktree":{"bgIsolation":"none"}}'` で同じ作業ツリーを編集させる。
|
|
40
|
+
依頼と直前の発言は、止めた道具の呼び出しが transcript に書かれるのを待ってから読む(hook の時点では直前の発言が
|
|
41
|
+
まだ書かれていないことがある)。
|
|
42
|
+
4. **継続の指示を1通送る**: 後継の `SessionStart` hook が、同じ project に立ち上げ中の引き継ぎがある時だけ、
|
|
43
|
+
自分の受け口(`CLAUDE_CODE_MESSAGING_SOCKET` と token)を控える。worker はそれを読んで消し、
|
|
44
|
+
`sendClaudeInbox` で継続の指示を1通送る。配送は公開 API だけを使い、Throughline の中に送信の実装を持たない。
|
|
45
|
+
届いた時の `UserPromptSubmit` が baton を消費して前任を合流させ、記憶を注入する。
|
|
46
|
+
注入は ADR 0016 と同じ予算(9,500 字)で、ヘッダに作業ディレクトリ、現在地に止めた時点の依頼(4,000 字まで)と
|
|
47
|
+
直前の発言(1,500 字まで)、続けて案内と直近の L2 を載せる。宣言文は求めない。
|
|
48
|
+
5. **受領**: 継続の指示は引き継ぎ ID を含む。後継の最初の指示がその ID を含む時だけ、受領を記録する。
|
|
49
|
+
`sendClaudeInbox` の結果が `accepted` なら `sent`、`not_sent` なら `failed`、`unknown` なら `unknown` にする。
|
|
50
|
+
結果が不明な時は再送しない。後継が作業を進めたことまでは確かめない(オーナーの判断: 不要)。
|
|
51
|
+
6. **連続の引き継ぎ**: 後継も同じ hook で止まり、次の後継へ引き継ぐ。後継の最後の user 発言は前の引き継ぎの
|
|
52
|
+
継続の指示なので、現在地には前の引き継ぎが運んだ元の依頼を引き続き載せる。
|
|
53
|
+
7. **道具を呼ばずに終わったターン**: 圧縮を止めた後、モデルが道具を呼ばずにターンを終えたら、Stop hook が記録を取り下げる。
|
|
54
|
+
印は残るので、1時間以内に開いた新しい会話が記憶を引き継ぐ。
|
|
55
|
+
8. **引き継ぎ済みの会話**: 後継を立てた会話は、その後も圧縮と道具を止め、後継を案内する。同じ会話から2つ目の後継は立てない。
|
|
56
|
+
立ち上げに失敗した記録(`failed`)は、次の道具でもう一度立ち上げる。
|
|
57
|
+
9. **有効化**: 既定は無効。`throughline auto-handoff enable --host claude [--project <path>]` が設定を書き、
|
|
58
|
+
`PreCompact` と `PreToolUse` の hook を登録する。`disable` が2つの hook を外す。`install` は登録しない
|
|
59
|
+
(`PreToolUse` は道具の呼び出しのたびに走るので、使わない端末に置かない)。有効な端末の `install` は2つの hook を保ち、
|
|
60
|
+
無効な端末の `install` は 0.13.0 が置いた `PreCompact` を外す。
|
|
61
|
+
10. **状態**: `~/.throughline/claude-auto-handoff/` のファイルに持つ。schema は変えない(v12)。記録は旧い会話の
|
|
62
|
+
session id を鍵にし、24時間を過ぎたものは次の引き継ぎの時に掃除する。token は記録に残さない。
|
|
63
|
+
11. **失敗**: hook 自身の失敗では圧縮も道具も止めない(exit code 1)。`HOOK_PRE_COMPACT_FAILED`・`HOOK_PRE_TOOL_USE_FAILED`
|
|
64
|
+
(どちらも `warn`)を記録する。worker の失敗は記録の `error_code` に固定の理由で残す。
|
|
65
|
+
12. ADR 0032 の決定のうち、圧縮の要約行(`isCompactSummary`)の扱い(決定5)は有効。同じ会話への注入(決定1〜4、6〜8)は
|
|
66
|
+
この ADR で置き換える。
|
|
67
|
+
|
|
68
|
+
## Consequences
|
|
69
|
+
|
|
70
|
+
- 有効な project では、Claude Code の自動圧縮は走らない。旧い会話は、止めた道具の hook の文を出して止まる。
|
|
71
|
+
- 続きは裏の会話(agent view)で動く。`claude agents` の一覧と `claude attach <id>` で見られる。Claude Desktop の画面には
|
|
72
|
+
出ず、後継のターンが終わって入力待ちになった後に Desktop で開ける。
|
|
73
|
+
- `PreToolUse` hook は、有効な端末の全ての Claude の会話で、道具の呼び出しのたびに1回走る。
|
|
74
|
+
- 止めたターンは Stop hook を通らない。本文は後継の最初の指示の時に回収するが、返事の本文が1つも無いまま止めた
|
|
75
|
+
ターンは bodies に入らず、依頼は現在地だけに載る。止めたターンの tool 入出力は L3 に入らない。
|
|
76
|
+
- 圧縮が「文脈上限の error から回復するため」に起きた時は、止めると元の error でその要求が失敗する(公式文書)。
|
|
77
|
+
この場合の後継の立ち上げは、次の道具の呼び出しまで起きない。
|
|
78
|
+
- 別の会話から届いた発言(`Another Claude session sent a message:`)は、Claude Code が後ろに付ける定型の注意書きを
|
|
79
|
+
落として保存する。
|
|
80
|
+
- 依存の `aiterm-steer-delivery` を 0.1.9 から 0.1.13 に上げる。Codex の配送の入口は変わらない。
|
|
81
|
+
|
|
82
|
+
## 確認した範囲
|
|
83
|
+
|
|
84
|
+
- Linux の Claude Code 2.1.289。対話画面の会話から始めて、後継へ3回連続で引き継ぎ、最後の後継が作業を完了した。
|
|
85
|
+
4つの会話のどれにも圧縮の記録は無く、止めた道具は実行されていなかった。
|
|
86
|
+
- macOS・Windows、Claude Desktop から始まる会話、subagent が動いている最中の引き継ぎは確かめていない。
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "throughline",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Persistent memory hooks for Claude Code, Codex, Grok, and Cursor (/clear-safe context compression)",
|
|
6
6
|
"keywords": [
|
|
@@ -55,6 +55,6 @@
|
|
|
55
55
|
"unified": "^11.0.5"
|
|
56
56
|
},
|
|
57
57
|
"dependencies": {
|
|
58
|
-
"aiterm-steer-delivery": "0.1.
|
|
58
|
+
"aiterm-steer-delivery": "0.1.13"
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Claude Code: 圧縮まわりの hook(一次ソース抜粋)
|
|
2
2
|
|
|
3
3
|
取得: 2026-10-04、`https://code.claude.com/docs/en/hooks.md`・`context-window.md`・`deep-links.md`・`agent-view.md`・`env-vars.md`。
|
|
4
|
-
実機は Claude Code 2.1.289。設計は [ADR
|
|
4
|
+
実機は Claude Code 2.1.289。設計は [ADR 0033](../../../docs/adr/0033-claude-auto-handoff-new-session.md)(0.13.0 の時点は ADR 0032)。
|
|
5
5
|
|
|
6
6
|
## PreCompact
|
|
7
7
|
|
|
@@ -33,14 +33,39 @@
|
|
|
33
33
|
|
|
34
34
|
> | `agent_id` | Unique identifier for the subagent. Present only when the hook fires inside a subagent call. Use this to distinguish subagent hook calls from main-thread calls. |
|
|
35
35
|
|
|
36
|
+
## 作業を止める(PreToolUse)
|
|
37
|
+
|
|
38
|
+
- `PreCompact` の `continue` は捨てられるので、圧縮を止めた後の作業は別の hook で止める。
|
|
39
|
+
- 実機: `PreToolUse` が `{"continue": false, "stopReason": "…"}` だけを返すと、その道具は実行されてからターンが止まる
|
|
40
|
+
(transcript に `hook_stopped_continuation`)。`hookSpecificOutput.permissionDecision: "deny"` を一緒に返すと、
|
|
41
|
+
道具は実行されずに止まる。同じ応答に並んだ道具には、それぞれ hook が走る。
|
|
42
|
+
- hook で止めたターンでは `Stop` hook は走らない。
|
|
43
|
+
|
|
36
44
|
## 新しい会話を始める口
|
|
37
45
|
|
|
38
46
|
> A deep link never executes anything on its own. The link only chooses a directory and fills the prompt box.
|
|
39
47
|
|
|
40
48
|
> When you dispatch a background session from agent view or start one with `claude --bg`, the session starts in your working directory. Before editing files, Claude moves the session into an isolated git worktree under `.claude/worktrees/`
|
|
41
49
|
|
|
42
|
-
- `claude-cli://open?q=…`
|
|
43
|
-
|
|
50
|
+
- `claude-cli://open?q=…` と Claude Desktop の `claude://code/new?q=…&folder=…` は、入力欄へ下書きを入れるだけ。
|
|
51
|
+
Desktop の新しい会話は、最初の指示が送られるまで process が起動しない(実機: hook も受け口も現れない)。
|
|
52
|
+
- `claude --bg "<prompt>"` は別の background session を立てて、すぐ戻る。指示を付けずに起動すると
|
|
53
|
+
`backgrounded · <id> · <name> (idle — send a prompt to start)` と出て、指示を待つ会話が立つ(実機。SessionStart は走る)。
|
|
54
|
+
`--model`・`--effort`・`--permission-mode`・`--name`・`--settings` を受ける。`--session-id` は無視される
|
|
55
|
+
(短い ID は session id の先頭8桁)。別の background session の中から起動すると、出力の ID に色の制御文字が付く。
|
|
56
|
+
- 動いている background session は Desktop へ移せない(`claude --desktop --resume`)。ターンが終わった後は開ける。
|
|
57
|
+
|
|
58
|
+
## 既存の会話へ外から送る口(inbox socket)
|
|
59
|
+
|
|
60
|
+
> Read this section when a session you expect isn't in the agent list, when you want a script or hook to post into a session, or when a sandboxed command can't reach the socket.
|
|
61
|
+
|
|
62
|
+
- 会話ごとに Unix domain socket(Windows は named pipe)。path は hook と Bash へ `CLAUDE_CODE_MESSAGING_SOCKET`、
|
|
63
|
+
会話ごとの token は `CLAUDE_CODE_MESSAGING_TOKEN`。起動時に `--messaging-socket-path` でも指定できる。
|
|
64
|
+
- 送る形は Claude Code 本体の中の例: 1行の JSON `{"type":"user","message":{"role":"user","content":"…"}}`。
|
|
65
|
+
先頭に `{"type":"auth","token":"…"}`(macOS・Linux は任意、Windows は必須)。
|
|
66
|
+
- 実機: 入力待ちの会話へ送るとターンが始まり、`UserPromptSubmit` hook が `prompt` にその文を持って走る。
|
|
67
|
+
transcript では `origin: {kind: "peer"}`、本文の前後に Claude Code が送り主の行と定型の注意書きを付ける。
|
|
68
|
+
- 製品の配送は `aiterm-steer-delivery` 0.1.13 の `sendClaudeInbox` を使う(受領の確認は呼び出し側の観測)。
|
|
44
69
|
|
|
45
70
|
## 自動圧縮の窓
|
|
46
71
|
|
package/rag/INDEX.md
CHANGED
|
@@ -29,7 +29,7 @@ rag/
|
|
|
29
29
|
|
|
30
30
|
## Claude自動継続の根拠
|
|
31
31
|
|
|
32
|
-
- [
|
|
32
|
+
- [圧縮・会話の起動・受け口の一次ソース抜粋](01-hooks/raw/claude-compact-hooks-extract.md) — `PreCompact`は圧縮を止められる(exit code 2)が`continue`は捨てられる。`PreToolUse`の`deny`+`continue:false`で道具を実行させずにターンを止められる。`claude --bg`は指示なしで起動すると指示待ちの会話が立つ。会話ごとの受け口(inbox socket)へ外から1通送ると、入力待ちの会話でターンが始まる。[実測](https://github.com/kitepon/Throughline/blob/main/evidence/2026-10-05-claude-auto-handoff.md)で、対話の会話から後継へ3回連続で引き継ぎ、圧縮は1回も走らなかった。Finding 6・第三仮説(PreCompactでの再投影)に対する現行の答えは[ADR 0033](../docs/adr/0033-claude-auto-handoff-new-session.md)。
|
|
33
33
|
|
|
34
34
|
## Question this RAG was built to answer
|
|
35
35
|
|