@tyhld/conductor 0.12.19 → 0.12.21

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyhld/conductor",
3
- "version": "0.12.19",
3
+ "version": "0.12.21",
4
4
  "description": "采配くん管制の見守りアプリ(conductor-agent)。各PCで常駐し、中央(devlog-tracker)へ定期的に生存報告(heartbeat)を送る常駐CLI。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -106,6 +106,46 @@ branch protection は「CI が通っていない物を main に入れない」
106
106
  ★差し替えるときは、ホームと各現場の設定の deny(`Bash(psql:*)` など)も人の手番で外してください。
107
107
  外さないと、番人が「はい」を受けても設定の deny で止まります(便 df4accf8 の重大発見2)。
108
108
 
109
+ ## 1-3. ★関門は「実際に動く道具」で決める(便 ad6b5db9・えふさん確定 2026-09-18)
110
+
111
+ 以前は、コマンドを改行・`|`・`;`・`&` で機械的に区切り(引用符やヒアドキュメントの中でも区切り)、
112
+ 区切った切れ端の文字で関門を決めていました。そのため当てどころがずれていました。
113
+
114
+ - コミットの説明・PR の本文・検索の文字・手順書の中の「create table」「GRANT」が、関門 db に当たる(7日で80件)。
115
+ - 報告をヒアドキュメントで書くだけの Bash が、本文の反映の文字で関門 release に当たって8分止まる(便 30879701)。
116
+ - 逆に、本物の本番反映 `pnpm --filter <部品> exec wrangler deploy --env production` が素通りする(同上)。
117
+
118
+ 今はこう決めます(`policy.py` の `split_commands` / `_gate_command` / `_gate_one`)。
119
+
120
+ 1. **本物の区切りだけで割る**。引用符(`'` `"` `` ` ``)の中と、ヒアドキュメントの本文は割りません。
121
+ 本文は、行の終わりの時点の最後のコマンドに付けます(`cat <<EOF > f` なら cat、`cat <<EOF | mysql` なら mysql)。
122
+ 2. **頭の前置きを剥がす**(`pnpm --filter … exec`・`pnpm exec`・`npm exec --`・`npx`・`yarn`・`yarn workspace <名前>`・
123
+ `bunx`・`env 変数=…`・`time`・`nohup`・`xargs`・`wrangler@3` の版の指定)。そのうえで、実際に動く道具を見ます。
124
+ 3. **文字を扱うだけの道具**(echo・cat・tee・grep・rg・git・gh …)は、引数や本文に何が書かれていても関門にしません。
125
+ 4. **シェル**(`bash -c "…"`・`bash <<EOF`)は、中身を同じ物差しで測り直します。
126
+ 5. **SQL の字面**は、実行しうる入口のときだけ見ます。入口とは、DB の道具・移行の道具・その場で走らせる形
127
+ (`python3 -c`・`node -e`・`python3 - <<EOF`・DB の道具へ流す形)・知らない実行ファイルです。
128
+ 6. 本番反映は、`wrangler deploy`(`--dry-run` を除く)・`wrangler versions/pages deploy`・`vercel --prod`・
129
+ `vercel promote/alias/rollback`・`npm/pnpm/yarn publish`・`supabase functions deploy`・「deploy の語+`--prod`」です。
130
+
131
+ ★**止める側(deny)は変えていません**。危険と抜け道の判定は、今までどおり機械的な区切り(`split_segments`)で見ます
132
+ (引用符の中まで見る方が、止める側としては広いため)。7日分の記録では、DENY の件数は前後で同じ(1,559件)でした。
133
+
134
+ ## 1-4. ★残る抜け道を塞ぐ(便 c05796ec=便2.5・DENY を強める)
135
+
136
+ | 抜け道 | 止める形(`policy.py`) |
137
+ | --- | --- |
138
+ | 番人の設定への書き込み | `~/.claude/settings.json`・`settings.local.json`(と各現場の `.claude/settings*.json`)・`~/.tyhld/hooks` 配下・`~/.codex/hooks.json`・`~/.codex/config.toml`・`~/.config/systemd` 配下へ、**手段を問わず**書く形。リダイレクト(`>` `>>` `>\|` `&>`)・`tee`・`cp`・`install`・`ln`・`rsync`・`mv`(動かす元も先も)・`dd of=`・`sed -i`・`perl -pi`・`touch`・`rm`・`chmod` ほか・`systemctl --user enable/edit …`・置き場ごとの `rm -rf ~/.claude`・`mv ~/.tyhld/hooks …`・`python3 -c` / `node -e` / `python3 - <<EOF` で開いて書く形(`_guard_write_scan`・`guard_config_reason`)。書き込みの道具(Write)も同じ一覧で守る |
139
+ | 秘密のファイルの読み取り(動詞が千切れる形) | `grep -n "x\|y" .env`・`rg "a;b" .env.local` など、引用符の中の `\|` `;` `&` で機械的な区切りが動詞を千切る形。★機械的な区切りに**本物の区切りを足して**測り直す(`_real_segments`)。探す道具(`rg`・`ag`・`ack`・`ugrep` …)も読む道具に数える |
140
+ | API で main の先端を書き換える | `git/refs/heads/<保護>` の PATCH・POST・PUT・DELETE、`git/refs` の POST(`ref` が保護・確かめられない)、`contents` の PUT・DELETE(`branch` が保護・**書いていない=既定のブランチ**・確かめられない)、GraphQL の `createCommitOnBranch`・`updateRefs`(保護・確かめられない)・`updateRef`(先が確かめられない)。`gh api`・`curl` の両方(`_main_tip_write`) |
141
+
142
+ ★**読むだけは止めません**(`cat`・`grep`・`diff`・`jq`・外へ写す `cp ~/.claude/settings.json /tmp/…`)。
143
+ ★**書き込む先だけを見ます**。報告・コミットの説明・PR の本文に同じ場所の名前が書いてあるだけ、引用符の中の `>` は止めません。
144
+ ★使い捨ての作業場(`/tmp` の下)に作った同じ名前は、Write と同じく通します。同じコマンドの中で決めた変数(`P=/tmp/x; … > $P/.claude/settings.json`)は解いてから測り、解けない変数は守る側で測ります。
145
+ ★`git/commits`・`git/trees` を作るだけでは main は変わりません。「作って先端を差し替える一連の形」は、先端を差し替える一手で止まります。
146
+ ★作業ブランチへの書き込み(`contents` の `branch=feat/…`・`git/refs/heads/feat/…`)は通します。
147
+ ★止める側を減らす変更はしていません。7日分の記録では、ALLOW から DENY へ7件移り、DENY から他へ移ったもの・関門の数の変化は0件でした。
148
+
109
149
  ## 2. ファイルの役割
110
150
 
111
151
  | ファイル | 役割 |
@@ -118,6 +158,8 @@ branch protection は「CI が通っていない物を main に入れない」
118
158
  | `summary_ja.py` | 確認カードに出す**日本語1行**の組み立て |
119
159
  | `test_policy.py` | 単体テスト(297件)。`python3 scripts/hooks/test_policy.py` |
120
160
  | `test_bypass_deny.py` | 抜け道の `deny` と、止めてはいけない操作の試験(便 fc22bc34)。`python3 scripts/hooks/test_bypass_deny.py` |
161
+ | `test_gate_real_commands.py` | 関門の当てどころの回帰試験(誤読の実例81件の形・本物の反映・止めてはいけない関門・便 ad6b5db9) |
162
+ | `test_deny_remaining_routes.py` | 残る抜け道(番人の設定への書き込み・千切れた動詞での秘密の読み取り・API での main の書き換え)の `deny` と、止めてはいけない操作の試験(便 c05796ec) |
121
163
  | (`../check_permission_rules.py`) | 現場の許可設定に残った「番人と食い違う行」を洗い出す検査(読むだけ・ADR-009) |
122
164
  | `test_hook_datalink.py` | 連絡線の単体テスト。`python3 scripts/hooks/test_hook_datalink.py` |
123
165
  | `settings.sample.json` | フック登録の見本(★人間が `~/.claude/settings.json` へ反映する) |
@@ -397,6 +439,11 @@ Claude Code 側のフック打ち切り(`timeout: 600`)と同時に終わる
397
439
  未知の道具に秘密を渡す形(`mytool .env`)は素通りします。
398
440
  ここを「引数に字面があれば止める」まで広げると、コミットメッセージや説明文に `.env` と
399
441
  書いただけで止まってしまい(実際に止まりました)、日常の作業が回らなくなるためです。
442
+ - 番人の設定への書き込み(便 c05796ec)は、コマンドの字面で見える書き込みだけを止めます。
443
+ 台本の**ファイル**(`bash scripts/x.sh`・`node x.mjs`)の中の書き込みは見ません。
444
+ プログラムの中は「場所が書く呼び出しと同じ文に在る」か「場所を入れた変数を書く文で使う」形だけを拾います。
445
+ - API での main の書き換えは、`--input <ファイル>` や GraphQL の `-F query=@<ファイル>` の中身を見ません。
446
+ `contents`・`git/refs` の POST は、本文が見えないときは止めます(確かめられない側)。GraphQL は見えないと通ります。
400
447
  - Stop フックは**問いかけの形(`〜ですか` / `?`)で書かれた発言だけ**を取り次ぎます(ADR-008)。
401
448
  「許可が下りず進めません。」のような平叙文の相談は**取り次ぎません**。誤発火で全現場が止まる方が
402
449
  重いので、意図してこちらへ倒しています。職人が「〜してよいですか」と書き直せば出ます。