@tocca-systems/twp-cli 0.10.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.
Files changed (47) hide show
  1. package/CHANGELOG.public.md +80 -0
  2. package/LICENSE +47 -0
  3. package/README.md +279 -0
  4. package/dist/THIRD-PARTY-NOTICES.md +1239 -0
  5. package/dist/ai-dispatch-T6PJ4DUG.js +82 -0
  6. package/dist/app-S33SNSH5.js +1370 -0
  7. package/dist/chunk-3WJHTPOZ.js +48 -0
  8. package/dist/chunk-4QI5NX4C.js +6 -0
  9. package/dist/chunk-5QCAIKFE.js +9 -0
  10. package/dist/chunk-63LDNYGW.js +23 -0
  11. package/dist/chunk-7ZVTACQS.js +8 -0
  12. package/dist/chunk-DIMZRTLE.js +37 -0
  13. package/dist/chunk-DXXFUNYN.js +7 -0
  14. package/dist/chunk-FQDYLZV3.js +6 -0
  15. package/dist/chunk-GY7KI5E5.js +4 -0
  16. package/dist/chunk-II5RVJQN.js +3 -0
  17. package/dist/chunk-IM4H52FC.js +109 -0
  18. package/dist/chunk-J7QYPKVK.js +18 -0
  19. package/dist/chunk-KCXVV45F.js +16 -0
  20. package/dist/chunk-L37NS5L2.js +8 -0
  21. package/dist/chunk-N2UVRM3Z.js +5 -0
  22. package/dist/chunk-N3B737KO.js +57 -0
  23. package/dist/chunk-NERYSBA4.js +9 -0
  24. package/dist/chunk-NHYMHCAT.js +4 -0
  25. package/dist/chunk-NNOYO67O.js +7 -0
  26. package/dist/chunk-PMOUHEJQ.js +5 -0
  27. package/dist/chunk-Q7YSSWTR.js +33 -0
  28. package/dist/chunk-RQFG3OUL.js +41 -0
  29. package/dist/chunk-RZVI6PMW.js +5 -0
  30. package/dist/chunk-VSJBJXZO.js +3 -0
  31. package/dist/chunk-VSQXY2VX.js +42 -0
  32. package/dist/chunk-WVS4W5FY.js +16 -0
  33. package/dist/chunk-ZZ5EYKCK.js +58 -0
  34. package/dist/cli.js +132 -0
  35. package/dist/commands-QKNOQRWT.js +60 -0
  36. package/dist/commands-T47RY6EH.js +365 -0
  37. package/dist/devtools-VZW7JDIG.js +131 -0
  38. package/dist/dist-HZIZTJ4O.js +93 -0
  39. package/dist/fuzzysort-DFVKV4B4.js +3 -0
  40. package/dist/oneshot-JD5LINMX.js +18 -0
  41. package/dist/project-BEY4CNSF.js +13 -0
  42. package/dist/run-EDV5273K.js +58 -0
  43. package/dist/schedule-command-LWUBXHBQ.js +13 -0
  44. package/dist/setup-GY674TII.js +74 -0
  45. package/dist/task-MQYRE4QC.js +135 -0
  46. package/dist/update-WDWUECN7.js +21 -0
  47. package/package.json +73 -0
@@ -0,0 +1,80 @@
1
+ # @tocca-systems/twp-cli
2
+
3
+ 利用者から見た変更点です。開発上の詳細はリポジトリ内の `CHANGELOG.md` にあります。
4
+
5
+ <!--
6
+ この先頭から下へ、`npm run version` のたびに新しいリリースが挿入されます。
7
+ 生成元は changeset 本文の `<!-- public ... -->` ブロックです
8
+ (`scripts/generate-public-changelog.mjs`)。
9
+
10
+ 0.7.0 までの履歴は社内配布(restricted)期間のもので、開発上の記録として
11
+ `CHANGELOG.md` に残してあります。顧客向けの履歴は public 公開以降を対象とします。
12
+ -->
13
+
14
+ ## 0.10.0
15
+
16
+ `twp task-loop` がプロンプト先頭へ前置する憲章について、囲み文(前文・後文)を
17
+ `charter_prefix` / `charter_suffix`(環境変数 `CHARTER_PREFIX` / `CHARTER_SUFFIX`)で
18
+ 差し替えられるようになりました。空文字を指定すると囲み文なしで本文だけを前置します。
19
+ 前置の有無は `charter_enabled`(環境変数 `CHARTER_ENABLED`)で明示的に切り替えられます。
20
+ いずれも未指定なら従来どおりの動作です。
21
+
22
+ `twp task-loop` が claude の枠切替に使うランチャを、ループ設定 `claude_launcher` で指定できる
23
+ ようになりました。現時点で有効なのは実行ファイル名(`claude_launcher.bin`)で、未設定なら
24
+ 従来どおり `claude-auto-switch` を使います。引数の指定(`probe` / `probe_match` / `exec_args` /
25
+ `active_args`)は受け付けますが、まだ動作には反映されません(既定と違う値を設定すると起動時に
26
+ その旨を警告します)。
27
+
28
+ `twp task-loop` で、リリースが出す `RECOVER:` の行からタスクキーを読み取れず、
29
+ ブロッカー修正の割り込み投入が黙って見送られることがある問題を直しました。
30
+ プロジェクトコードに小文字・日本語・複数のハイフンを使っている場合に起きていました。
31
+
32
+ `twp task get` / `task subtasks` / `task comment` などで、末尾が数字だけの UUID をタスク ID として指定できるようになりました。これまでは一部の UUID がタスクキーと誤判定され、`--project` の有無にかかわらず対象のタスクに到達できませんでした。あわせて、UUID / ULID の形をした値はキーの形にも読める場合でも ID として扱うことをヘルプに明記しました(この場合は `--project` か既定プロジェクトが要ります)。
33
+
34
+ 配布物が小さくなり(2.4MB → 1.9MB)、起動が少し速くなりました。
35
+ ヘルプやログのメッセージから、利用者には意味のない当社内部の識別子を取り除いています。
36
+ `/demo` の再生内容も一般的な例に差し替えました。
37
+
38
+ `twp project get` に、前後に空白や改行が付いたプロジェクト ID を渡しても正しく引けるようになりました。
39
+ `$(cat id.txt)` のように末尾に改行が付く形で渡すと、これまでは 404 になることがありました。
40
+
41
+ プロジェクトコードが小文字だったり空白を含んでいたりする場合に、`twp task-loop` が実行アイテムにタスクキーを記録できず、**同じタスクを複数のランナーが同時に取りうる**状態になっていたのを修正しました。タスクキーの受理範囲が、他のコマンド(`twp task get` など)とサーバのルート定義に揃います。あわせて、タスクキーとして記録できない値(長すぎる・制御文字を含む・実際にはコマンドのオプション)を取り違えて実行アイテムの作成そのものが失敗しないようにしました。
42
+
43
+ 一覧コマンドの「次のページ」案内が、プロジェクトや担当者などの絞り込み、利用プロファイル、件数上限を引き継ぐようになりました。表示されたコマンドをそのまま実行して、同じ条件の次ページを取得できます。
44
+
45
+ プロジェクトに属さない**個人タスク**を `twp task` から読み書きできるようになりました。`--project __private__` を付けると、一覧・取得・サブタスク・作成・更新・削除の 6 操作が個人タスクに対して動きます(`twp task-loop --project __private__` と同じ綴りです)。
46
+
47
+ ```
48
+ twp task list --project __private__
49
+ twp task get PRIVATE-22361 --project __private__
50
+ twp task create --project __private__ --subject "買い物リストを作る"
51
+ ```
52
+
53
+ - 個人タスクのキーは `PRIVATE-<番号>` です
54
+ - `--status` / `--type` は個人タスク側のマスタから名前で解決します。省略すると既定が使われ、**何を既定に使ったかは実行前に stderr へ出ます**
55
+ - 個人タスクには**担当者がありません**(`--assignee` はエラーになります)。**コメント(`twp task comment`)も使えません**。サーバ側に個人タスク用の API がないためで、黙って無視したり「見つかりません」で終わったりせず、理由を出して止まります
56
+ - `PRIVATE-<番号>` は「個人タスクのキー」とも「コード `PRIVATE` のプロジェクトのタスクキー」とも読めるため、**`--project` を付けずに打つと候補を示して止まります**(どちらかへ勝手に倒しません)
57
+
58
+ ## 0.9.0
59
+
60
+ `twp task-loop` が、特定のスキル名を特別扱いしなくなりました。
61
+
62
+ これまでは一部のスキル名(`develop-merge` などの一般的な名前)に対して、
63
+ 定期枠の抑止・AIモデルの固定・後続コマンドの自動投入といった挙動が組み込みで有効になっており、
64
+ 同じ名前を付けた場合に意図しない動作になることがありました。
65
+
66
+ 今後これらは `~/.twp/loops/<プロジェクト>.json` の `operations` で明示的に設定したときだけ有効になります。
67
+ **設定しない場合、スキル名による特別扱いは一切行いません。**
68
+ 起動時に、いまどの設定が有効かを1行で表示します。
69
+
70
+ ## 0.8.1
71
+
72
+ README を利用者向けに書き直しました。「いまできること・まだできないこと」を先頭に置き、
73
+ 設定例を本番の接続先に揃え、ライセンスとサポート窓口の案内を追加しています。
74
+ npm パッケージの情報に、ドキュメント(docs.tocca.systems)とお問い合わせ先を追加しました。
75
+
76
+ ## 0.8.0
77
+
78
+ `twp task-loop` が git の author 情報を揃える際、`twp task-loop setup` で設定した値
79
+ (または `TWP_GIT_IDENTITY_NAME` / `TWP_GIT_IDENTITY_EMAIL`)だけを使うようになりました。
80
+ 未設定の場合はリポジトリの設定を変更しません。
package/LICENSE ADDED
@@ -0,0 +1,47 @@
1
+ Copyright (c) 2026 Tocca Systems Inc. All rights reserved.
2
+
3
+ このソフトウェア(twp-cli / npm パッケージ `@tocca-systems/twp-cli`。以下「本ソフトウェア」)
4
+ は Tocca Systems Inc.(以下「当社」)の専有物である。本ソフトウェアは npm レジストリを通じて
5
+ 配布されるが、**取得できることは利用を許諾されたことを意味しない。**
6
+ `package.json` の `license` フィールドが `SEE LICENSE IN LICENSE` であることは、この文書が
7
+ 許諾の全部であることを指す。
8
+
9
+ 利用を許諾される者
10
+ 当社との間で有効な Tocca Working Platform(以下「TWP」)の利用契約があるテナント、
11
+ および当該テナントが本ソフトウェアの利用を認めたその役職員・委託先に限る。
12
+ 契約が終了した場合、本許諾も同時に終了する。
13
+
14
+ 許諾される範囲
15
+ 上記の者は、当該テナントの業務のために本ソフトウェアをインストールし、実行し、
16
+ 社内利用を目的として複製することができる。本ソフトウェアが TWP へ接続して行う処理は、
17
+ 当該テナントの TWP 利用契約および当社が別途定める利用条件に従う。
18
+
19
+ 料金
20
+ 本ソフトウェアを通じた AI 機能の利用は、当該テナントの TWP クレジットを消費する。
21
+ 消費量・上限・課金の条件は TWP 利用契約に従う。
22
+
23
+ 禁止される行為
24
+ 上記の範囲を超える、複製・改変・二次的著作物の作成・再配布・公開・販売・貸与・
25
+ サブライセンス、およびリバースエンジニアリング・逆コンパイル・逆アセンブルは、
26
+ 当社の事前の書面による許諾がない限り認められない。
27
+ 有効な TWP 利用契約を持たない者による本ソフトウェアの利用も認められない。
28
+
29
+ データの送信
30
+ 本ソフトウェアは、利用者の指示に応じて実行された処理の内容(読み取ったファイルの
31
+ 内容、コマンドの出力、利用者が入力した文言を含む)を、応答を生成する目的で当社の
32
+ サーバへ送信し、当社を経由して AI モデルの提供元へ送信する。送信の範囲・取扱いは
33
+ TWP 利用契約および当社が別途定める利用条件に従う。
34
+
35
+ 第三者コンポーネント
36
+ 本ソフトウェアの配布物には第三者のオープンソースソフトウェアが同梱されており、
37
+ それらは各々のライセンスに従う。該当する著作権表示とライセンス条文は配布物内の
38
+ `dist/THIRD-PARTY-NOTICES.md` に収録している。本ライセンスの定めは、これら第三者
39
+ コンポーネントに各ライセンスが付与する権利を制限するものではない。
40
+
41
+ 無保証・免責
42
+ 本ソフトウェアは現状有姿で提供され、明示黙示を問わずいかなる保証も伴わない。
43
+ 商品性・特定目的適合性・権利非侵害の保証を含むがこれに限られない。当社は、本
44
+ ソフトウェアの使用または使用不能から生じるいかなる損害についても責任を負わない。
45
+
46
+ お問い合わせ
47
+ 本ライセンスに関する照会・許諾の申請は当社まで。
package/README.md ADDED
@@ -0,0 +1,279 @@
1
+ # twp-cli
2
+
3
+ TWP(Tocca Working Platform)を、ターミナルから使うための CLI です。単なる API ラッパーではなく **AI エージェントハーネス**として作られています。
4
+
5
+ - AI と会話しながら、**手元のファイルを読ませ、コマンドを実行させて**作業を進められます
6
+ - **モデルの利用は TWP 経由**です。AI プロバイダの API キーを自分で用意する必要はなく、利用料はテナントのクレジットから引かれます
7
+ - **`twp project` / `twp task` で TWP のプロジェクトとタスクを直接読み書き**できます(AI を介さないので、スクリプトからも使えます)
8
+ - **Shift+Tab でモードを切り替え**、開発作業と業務作業を1つの端末で行き来できます
9
+ - Windows / macOS / Linux / WSL で動作します
10
+
11
+ ドキュメント: <https://docs.tocca.systems/>
12
+
13
+ ---
14
+
15
+ ## いまできること・まだできないこと
16
+
17
+ はじめに期待値を合わせておきます。
18
+
19
+ | | |
20
+ |---|---|
21
+ | **できる** | AI との会話(ストリーミング表示)。手元のファイルの読み書き・検索、コマンド実行、git の読み取り——いずれも**実行前に確認**します |
22
+ | **できる** | `twp project` / `twp task` によるプロジェクト・タスクの読み書き(一覧・取得・作成・更新・削除・コメント) |
23
+ | **できる** | `twp task-loop` による、TWP のタスクキューを手元の AI CLI に実行させる常駐ループ |
24
+ | **まだできない** | **会話中の AI から TWP のデータを直接参照・操作すること。** 「このタスクの内容を読んで」と会話で頼むことはまだできません。TWP のデータを扱うときは `twp task` などのコマンドをお使いください |
25
+ | **まだできない** | TWP の操作を行うスラッシュコマンド(`/task` など)。現在使えるスラッシュコマンドは `/help` `/mode` `/model` `/clear` `/context` `/doctor` `/exit` の7つと、動作デモの `/demo` です |
26
+
27
+ 登録されていないコマンドは補完にも `/help` にも出しません。**「あるのに動かない」ものは置かない**方針です。
28
+
29
+ ## 入れる
30
+
31
+ ```bash
32
+ npm i -g @tocca-systems/twp-cli
33
+ twp login # ブラウザでログイン
34
+ twp -p "こんにちは" # 疎通確認(非対話)
35
+ ```
36
+
37
+ Node 22 以上が必要です。postinstall もネイティブ依存もありません。インストールサイズは **3.9MB / 依存1パッケージ**です。
38
+
39
+ ## 使い方
40
+
41
+ ```
42
+ twp 対話 TUI を起動
43
+ twp -p "<プロンプト>" 非対話で 1 往復だけ実行(応答は stdout・`-p -` で標準入力)
44
+ twp login ログイン(ブラウザ委譲 / --password / --token)
45
+ twp login --tenant <code>
46
+ テナントコードを先に指定する(--password のプロンプトを 1 つ省ける)
47
+ twp logout / whoami
48
+ twp update npm の最新版と、サーバが要求する最小バージョンを確認
49
+ twp --mode biz 起動時のモードを指定(dev | biz | plan)
50
+ twp --permission-mode denyAll
51
+ ツール実行の既定を上書き(plan | acceptEdits | denyAll)
52
+ twp --model <id> 起動時のモデルを指定
53
+ twp --profile <name> 接続プロファイルを指定
54
+ twp --no-tui 非TTY 環境向け(TUI を起動せず入口を案内する)
55
+ twp --doctor 端末キー入力の実測画面
56
+ twp --version / --help
57
+ ```
58
+
59
+ ### TWP のプロジェクトとタスクを操作する
60
+
61
+ AI を介さずに TWP を直接読み書きします。スクリプトからも使えます。
62
+
63
+ ```
64
+ twp project list | get <コード|ID> | members <コード|ID>
65
+
66
+ twp task list [--project <コード|__private__>] [--status <名前>] [--type <名前>] [--assignee <me|名前>]
67
+ twp task get <キー|ID> # 例: twp task get ACME-123
68
+ twp task subtasks <キー|ID>
69
+ twp task create --project <コード> --subject "<件名>" [--type <名前>] [--assignee <名前>]
70
+ twp task update <キー|ID> [--status <名前>] [--subject "<件名>"] [--assignee <名前>]
71
+ twp task delete <キー|ID> --yes
72
+
73
+ twp task comment list <キー|ID>
74
+ twp task comment create <キー|ID> --body-file <パス>
75
+ twp task comment update <コメントID> --body-file <パス>
76
+ twp task comment delete <コメントID> --yes
77
+ ```
78
+
79
+ - **個人タスク(プロジェクトに属さない自分だけのタスク)は `--project __private__` で操作します**(`twp task list --project __private__`)。キーは `PRIVATE-<番号>` です。担当者(`--assignee`)とコメント(`twp task comment`)は個人タスクにはありません
80
+ - **`--status` / `--type` / `--assignee` は名前で指定できます**(`--assignee me` は自分)。候補が絞れないときは候補を出して止まります
81
+ - **`delete` には `--yes` が必要です。** 対話中でも確認プロンプトには落ちません(自動実行と手動実行で必要な引数を変えないため)
82
+ - **本文は `--body-file` / `--description-file` を主経路にしてください**(`-` で標準入力)。引数に直接書くと改行と Markdown が壊れます
83
+ - 一覧は `--limit <件数>` / `--all` / `--cursor` で辿れます(`task subtasks` と `project members` はページングがありません)
84
+ - **フラグの値は `--flag 値` でも `--flag=値` でも書けます。** 空白を含む値は `--keyword "山田 太郎"` のように引用し、`-` で始まる値は `--keyword=-foo` の形で渡します
85
+ - ヘルプは `twp task help` / `twp task comment help` / `twp task create help`
86
+
87
+ グローバルオプション: `--profile <名前>` / `--output <json|table|text|tsv>` / `--query <JMESPath>` / `--dry-run` / `--debug` / `--yes` / `--refresh`。**`--output json` は常に API の生のレスポンス**を返します(表示用に間引きません)。
88
+
89
+ ```bash
90
+ twp task list --project ACME --status 進行中 --output json --query '[].{key:key,subject:subject}'
91
+ ```
92
+
93
+ ### エージェントループを回す
94
+
95
+ ```
96
+ twp task-loop setup --project <コード|ID> # 作業ディレクトリと使う AI を決める
97
+ twp task-loop run --project <コード|ID>
98
+ twp task-loop status --project <コード|ID>
99
+ twp task-loop stop
100
+ ```
101
+
102
+ 実行前に「[⚠️ 実行する前に理解しておくこと(信頼境界)](#️-実行する前に理解しておくこと信頼境界)」を必ずお読みください。
103
+
104
+ **モデル取次には `cli` 権限付きトークンが必要。** `twp login`(ブラウザ委譲)と `twp login --password` が発行する。`twp login --token` で保存した通常トークンは TWP API には使えるが会話は 401 になる。
105
+
106
+ ### 更新(`twp update`)
107
+
108
+ `twp update` は **npm の最新版**と、**接続先のリレーが要求する最小サポートバージョン**の両方を報告する。**自分では更新しない**(インストール方法・権限が環境で違うため、実行すべきコマンドを表示する)。最小サポート未満なら終了コード 1。
109
+
110
+ リレーは古いクライアントを拒否しない(`/api/cli/v1` の後方互換は恒久的に保つ)。止めるのは CLI 側で、**下限が読めない・取れないときは素通りする**(回線断やサーバ未対応で全員が使えなくなるのを避ける)。下限は `~/.twp/models.json` にプロファイル単位でキャッシュする。
111
+
112
+ - **下限を満たしていれば1バイトも通信しない**(起動時に見るのはキャッシュだけ)
113
+ - **キャッシュが「止める」と言ったときだけ、止める前に1回サーバへ確認する**。サーバ側が下限を下げたら、その端末はこの確認で自動的に回復する
114
+ - 下限が上がった直後の初回起動: TUI は毎回 `/api/cli/v1/models` を引くのでその場で止まる。`twp -p` は**モデルが指定済みだと一覧を引かない**ため、キャッシュが6時間より古いときだけ引き直す(=最大6時間は古い下限で動く)
115
+ - **`0.0.0-dev`(`npm run dev` / `tsx` / 素の `node dist/cli.js`)は判定しない**(下限を上げて検証する作業そのものを塞がないため)
116
+
117
+ ```
118
+ $ twp update
119
+ twp 0.2.3
120
+
121
+ 最新版 0.3.0(npm registry)
122
+ 最小サポート 0.2.0(サーバ / https://ai-api.tocca.systems)
123
+ 判定 更新できます(必須ではありません)
124
+
125
+ npm i -g @tocca-systems/twp-cli@latest
126
+ ```
127
+
128
+ 対象は**リレーを使う経路(TUI と `-p`)だけ**。`twp task-loop`(`/api/cli/v1` を使わない)・`twp login` / `whoami`・`--no-tui` / `--doctor`(リレーを1往復も使わない診断経路)は対象外。
129
+
130
+ ### 企業プロキシ・TLS 傍受プロキシの下で使う
131
+
132
+ `HTTPS_PROXY` / `HTTP_PROXY` / `NO_PROXY`(小文字も可・**小文字が優先**)を読み、すべての外向き通信
133
+ (ログイン・TWP API・モデル取次と SSE・`twp update` の registry 参照)をプロキシ経由にする。
134
+
135
+ ```bash
136
+ export HTTPS_PROXY=http://proxy.example.com:8080
137
+ export NO_PROXY=localhost,127.0.0.1,.internal.example.com
138
+ # TLS 傍受プロキシなら、そのプロキシの CA を Node に信頼させる(**Node の機構**)
139
+ export NODE_EXTRA_CA_CERTS=/path/to/corp-proxy-ca.pem
140
+ twp login
141
+ ```
142
+
143
+ - **ループバック(`localhost` / `127.0.0.1` / `::1`)は既定でプロキシを経由しない。** ローカルの API(`TWP_API_URL=http://localhost:8086`)を使うときに `Authorization: Bearer …` が第三者のプロキシへ渡るのを防ぐため(`twp --doctor` の「NO_PROXY(実効)」に出る)
144
+ - **`NODE_EXTRA_CA_CERTS` は Node が起動時にしか読まない。** 設定したら `twp` を起動し直す
145
+ - 効いているか・何が足りないかは **`twp --doctor`** の「ネットワーク(プロキシ / CA)」で確認できる(プロキシ URL に資格情報が入っていても伏字で表示する)
146
+ - **Node 組込みの `--use-env-proxy` / `NODE_USE_ENV_PROXY` には依存していない**(Node 22 では効かないことを実測。24 でのみ有効)。この CLI はプロキシ変数があるときだけ undici の `EnvHttpProxyAgent` を読み込み、無ければ素の `fetch` のまま
147
+ - **プロキシが応答を溜め込む設定だと、ストリーミングが一括で届く**(内容は同じ)。mitmproxy の既定でこれを実測している。CLI 側では回避できないので、逐次表示が必要なら proxy 側でストリーミングを許可する
148
+ - 認証付きプロキシは **Basic まで**(`http://user:pass@proxy:8080`)。NTLM / Kerberos は未対応
149
+ - `socks5://` も通る(`socks` / `socks4` / `socks5h` も同様)
150
+ - **`HTTP_PROXY` だけを設定すると、https もそのプロキシを通る**(undici の既定。https だけ直結にしたいなら `NO_PROXY` で除外する)
151
+ - **プロキシ経由の通信は Node 22.19 以上が必要**(内部で使う undici の要件)。それより古い 22.x では、プロキシ変数を設定したときだけ失敗する(`twp --doctor` が指摘する)
152
+ - ⚠ **TLS 傍受プロキシは通信の中身を復号する。** アクセストークンとモデルへ送るプロンプト(タスク本文・コード断片)は、そのプロキシの運用者から見える状態になる
153
+
154
+ ### 接続先の設定
155
+
156
+ ```jsonc
157
+ // ~/.twp/config.json
158
+ //
159
+ // 既定の接続先は本番なので、通常この設定は要りません。
160
+ // 別の環境へ繋ぐときや、複数の接続先を切り替えたいときだけ書きます。
161
+ {
162
+ "default_profile": "production",
163
+ "profiles": {
164
+ "production": {
165
+ "api_url": "https://backend.tocca.systems",
166
+ "frontend_url": "https://app.tocca.systems",
167
+ "relay_url": "https://ai-api.tocca.systems",
168
+ "model": "claude-sonnet-5"
169
+ }
170
+ }
171
+ }
172
+ ```
173
+
174
+ `TWP_API_URL` / `TWP_FRONTEND_URL` / `TWP_RELAY_URL` で一時的に上書きできる。既定モデルの優先順は `--model` > プロジェクト `.twp/config.json` の `model` > ユーザー設定 > サーバ既定。
175
+
176
+ ### キー操作
177
+
178
+ | キー | 動作 |
179
+ |---|---|
180
+ | `Shift+Tab` / `Alt+M` | モード巡回(開発 → 業務 → プラン) |
181
+ | `/` | スラッシュコマンドパレット(ファジー絞り込み・`Tab` 補完・`↑↓` 選択) |
182
+ | `Shift+Enter` / `Ctrl+J` / `\` + `Enter` | 改行(複数行入力) |
183
+ | `Ctrl+R` | 直前のツール出力を全文展開 |
184
+ | `Ctrl+C` | 実行中なら中断 / 入力が空なら 2 回で終了 |
185
+ | `Ctrl+D` / `/exit`(`/quit` も可) | 終了 |
186
+
187
+ **Shift+Enter が効かない端末がある。** kitty keyboard protocol 非対応の端末(Windows Terminal / VS Code / tmux など大半)では Shift+Enter が素の Enter と区別できない。その場合は **`Ctrl+J`**(全端末で確実)か **`\` を打ってから Enter**(Claude Code と同じ)を使う。Ctrl+Enter を LF として送る端末では Ctrl+Enter も改行になる。
188
+
189
+ **Shift+Tab が効かない端末がある。** legacy conhost や一部の JetBrains 内蔵端末は Shift+Tab を素の `TAB` として送るため、Tab と区別できない。その場合は `Alt+M` か `/mode` を使う。自分の端末が何を送っているかは `/doctor` で実測できる。
190
+
191
+ ### モード
192
+
193
+ | モード | ツール | 権限 |
194
+ |---|---|---|
195
+ | 開発 `dev` | ローカルツール全部 + 開発系 TWP ドメイン | 書き込みは確認 / 読み取りは許可 |
196
+ | 業務 `biz` | TWP ドメイン中心 | `bash` と `write_file` は拒否 |
197
+ | プラン `plan` | 読み取りのみ | 全書き込み拒否 |
198
+
199
+ **モデルはモードと直交する。** 業務モードに切り替えてもモデルは変わらない(`/model` で別に切り替える)。
200
+
201
+ ### `--permission-mode`(実行1回ぶんの上書き)
202
+
203
+ モードの方針の上に、その実行ぶんの既定を重ねる。CI・SSH・パイプで「何が自動で通るか」を呼び出し側が明示するためのもの。
204
+
205
+ | 値 | 読み取り | 書き込み | コマンド実行 |
206
+ |---|---|---|---|
207
+ | 未指定 | モードのまま | モードのまま | モードのまま |
208
+ | `plan` | モードのまま | 拒否 | 拒否 |
209
+ | `acceptEdits` | モードのまま | 確認を省いて許可 | モードのまま |
210
+ | `denyAll` | 拒否 | 拒否 | 拒否 |
211
+
212
+ - **モードの拒否は覆らない。** `acceptEdits` を付けても業務モードの `write_file` は通らない
213
+ - **`rm -rf` と分岐したコマンドは `acceptEdits` でも必ず確認する**(自動許可しないものは権限モードより上位)
214
+ - **後で実行に化ける書き込み先は `acceptEdits` でも毎回確認する**(`.git/` `.github/` `.claude/` `.husky/` `.githooks/` と `package.json` / `Makefile` / `.envrc` / `.mcp.json`)。判定は**実体のパス**で行うので、`hooks -> .git/hooks` のような symlink や `.GIT/` のような大文字小文字違いでも迂回できない
215
+ - **ただし `acceptEdits` は「安全な書き込みだけを通す機構」ではない。** 後で実行に化わる書き込み先を網羅はできない(`CLAUDE.md` や任意のスクリプトも同じ性質を持つ)。信用できないリポジトリでは付けない
216
+ - **`plan` / `denyAll` は `git` も止める。** git は読み取りサブコマンドしか許していないが、**リポジトリ側の設定(`diff.external` 等)が任意のコマンドを起こせる**ため `exec` に分類している
217
+ - **非対話(`-p` / パイプ)では確認できないので、確認が必要なツールは拒否になる**(拒否は tool result としてモデルへ返り、会話は続く)。無言で許可することはない
218
+ - 拒否されたツールは**そもそもモデルに渡さない**(プロンプトに載せない)。`denyAll` ではツールが0本になる
219
+
220
+ ### 監査ログ
221
+
222
+ `~/.twp/logs/session-<id>.jsonl` に、1行1件で「いつ・どのツールを・どう判断したか(根拠つき)」を残す。
223
+
224
+ ```jsonc
225
+ {"ts":"…","v":1,"session":"01M1…","permission_mode":null,"event":"decision",
226
+ "tool":"bash","risk":"exec","decision":"deny","reason_code":"non_interactive",
227
+ "reason":"非対話セッションで承認が必要(deny-and-continue)","mode":"dev","input":{"command":"pwd"}}
228
+ ```
229
+
230
+ 集計・スクリプトは **`reason_code`(機械可読)** を読む。`reason` は人間向けの説明で文言が変わる。
231
+
232
+ - **本文は書かない。** `write_file` の `content` や差分はバイト数だけ(`"content":"<redacted 45 bytes>"`)。一度落とした値は、後のターンで別のフィールド(`bash` のコマンド行など)に現れても消す(値は保持せずハッシュで突き合わせる)
233
+ - **覚える対象には限界がある**: 12文字未満・`KEY=VALUE` 形以外の行にあるパス様の値・複数語のパスフレーズは覚えない(普通のログが読めなくなるため)。上限(トークン4096件)に達したら**それ以上覚えるのをやめ**、`{"event":"registry_saturated"}` を残す(黙って忘れない)
234
+ - **監査ログ自身はモデルから読めない**(`~/.twp/logs/*.jsonl` は `read_file` / `grep` の拒否対象)
235
+ - **残るフィールドもある。** `bash` の `command`、`grep` / `glob` の `pattern`、`read_file` / `write_file` の `path` は監査の目的そのものなので残す。したがって**そこへ直接書かれた秘密は残りうる**(`Bearer …` / `ghp_…` のような既知の形と、一度 redact した値は消す)。逆に **git の完全 SHA のような40桁以上の16進は秘密として潰れる**——秘密側に倒す判断
236
+ - ファイルは **0600**・ディレクトリは **0700**(`credentials.json` と同じ扱い)。**Windows では OS 既定の ACL に従う**(Node が mode を無視するため。共有端末では他ユーザーから読める)。ログディレクトリが symlink のときは書かない
237
+ - **ツールを1本も使わなかったセッションではファイルを作らない**(空のログが保持枠を食い潰さないようにするため)
238
+ - **14日・200本**で自動的に刈る。1ファイル 5MB・1行 4KB の上限もある
239
+ - `TWP_NO_AUDIT=1` で無効化できる
240
+
241
+ ## `twp task-loop`(エージェントループ実行)
242
+
243
+ TWP のタスクキューから項目を取り出し、**あなたの端末にインストールされた AI CLI**(`claude` / `codex` / `gemini` / `copilot`)にそれを実行させる常駐ループです。TUI や `twp -p` と違って**リレーを通らないので、TWP のクレジットを消費しません**——動かすのは利用者ご自身の AI サブスクリプションです。
244
+
245
+ ```bash
246
+ twp task-loop setup --project <キー|UUID> # 作業ディレクトリと使う AI を決める
247
+ twp task-loop run --project <キー|UUID>
248
+ twp task-loop status --project <キー|UUID>
249
+ twp task-loop stop # このマシンで動いているループを止める
250
+ ```
251
+
252
+ ### ⚠️ 実行する前に理解しておくこと(信頼境界)
253
+
254
+ **このループは、キューに入っている指示を、承認ゲートとサンドボックスを外した AI CLI として実行します。** つまりファイルの読み書きもコマンド実行も、都度の確認なしに走ります(`claude --dangerously-skip-permissions` / `codex -s danger-full-access` / `gemini --yolo` / `copilot --allow-all` 相当)。ループを無人で回すための設計であり、TUI の権限モデルはここには適用されません。
255
+
256
+ そして**キューに項目を入れられるのは、そのプロジェクトのメンバー全員**です。したがって:
257
+
258
+ > **`twp task-loop run` を実行するということは、そのプロジェクトのメンバーが、あなたの端末で任意のコードを実行できる状態にする、ということです。**
259
+
260
+ これは CI ランナーを自分の端末で動かすのと同じ信頼モデルです。次を満たす場合にだけ実行してください。
261
+
262
+ - **プロジェクトのメンバー全員を信頼している**(メンバーを絞ることが制御手段になります)
263
+ - **作業ディレクトリに、失われて困るもの・見られて困るものを置いていない**
264
+ - できれば**専用のマシンかコンテナ**で動かす(共用の開発端末では動かさない)
265
+
266
+ 止めるときは `twp task-loop stop` です。実行されたツールと権限判断は端末の監査ログ(`~/.twp/logs/`)に残ります。
267
+
268
+ ### 必要なもの
269
+
270
+ - 使う AI CLI が**インストール済みかつログイン済み**であること(`twp task-loop setup` が検出し、使えないものは理由を出して止まります)
271
+ - 作業ディレクトリに**スキル定義**(`.claude/commands/*.md`)があること。何を実行させるかはこの定義が決めます。twp-cli は定義を同梱しません
272
+
273
+ ## ライセンスとサポート
274
+
275
+ 本ソフトウェアは TWP の利用契約を結んでいるテナントの利用者に対してのみ利用を許諾しています。詳細はパッケージに同梱の `LICENSE` をご確認ください。
276
+
277
+ - ドキュメント: <https://docs.tocca.systems/>
278
+ - お問い合わせ・不具合のご報告: TWP の[サポート](https://app.tocca.systems/v1/support)からご連絡ください(ログインが必要です)
279
+ - 変更履歴: パッケージに同梱の `CHANGELOG.public.md`