@tyhld/conductor 0.12.2 → 0.12.4

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.
@@ -129,7 +129,11 @@ export function buildCraftsmanPrompt(input) {
129
129
  '・秘密(.env の中身)を画面にも報告にも出さない。',
130
130
  '',
131
131
  '■ 締め方',
132
- '・テストが緑になってから push → プルリクエストを作成 → `gh pr merge <番号> --admin --merge --delete-branch`。',
132
+ // ★合流の作法は職人の鉄則7と同じ形にする(便 4a5bbb9f)。片方だけ古いと、
133
+ // 職人は毎便読む鉄則と、ここで渡される文の【両方】を受け取って食い違う。
134
+ '・テストが緑になってから push → プルリクエストを作成 → `gh pr merge <番号> --auto --merge --delete-branch`。',
135
+ ' (「auto-merge が使えない」と断られたリポだけ、CI が緑なのを確かめてから `gh pr merge <番号> --merge --delete-branch`)',
136
+ '・★`--admin` など保護を迂回する旗は使わない。保護が理由で合流できないときは、回避せず報告して止まる。',
133
137
  '・報告は簡潔に(変更したファイル・要点・確かめた結果)。専門用語はできるだけ避ける。',
134
138
  '・途中で人の判断が要るところに当たったら、無理に進めず outcome=blocked で終え、理由を1行で書く。',
135
139
  '',
package/dist/cli.js CHANGED
@@ -373,7 +373,7 @@ function runSetupCommand(argv) {
373
373
  if (!existsSync(setup)) {
374
374
  fail(`インストーラが見つかりません: ${setup}\n` +
375
375
  ' 配布物が壊れている可能性があります。次の1行で入れ直してください:\n' +
376
- ' npm i -g @tyhld/conductor');
376
+ ' npm i -g @tyhld/conductor --@tyhld:registry=https://registry.npmjs.org');
377
377
  }
378
378
  const r = spawnSync('bash', [setup, ...argv], { stdio: 'inherit' });
379
379
  process.exit(r.status ?? 1);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tyhld/conductor",
3
- "version": "0.12.2",
3
+ "version": "0.12.4",
4
4
  "description": "采配くん管制の見守りアプリ(conductor-agent)。各PCで常駐し、中央(devlog-tracker)へ定期的に生存報告(heartbeat)を送る常駐CLI。",
5
5
  "type": "module",
6
6
  "bin": {
@@ -236,7 +236,8 @@ APPLY=1 bash scripts/update-allowed-domains.sh # 内容に納得したら適用
236
236
  **設計思想: 「危険だけ確実に止める・それ以外は自動許可」**
237
237
 
238
238
  - 赤(deny): 取り返しのつかない操作(force push、本番DB破壊、rm -rf 等)を問答無用でブロック
239
- - 黄(ask): 本番デプロイや PR マージなど、実行自体は正当だが人間の確認が欲しい操作
239
+ - 黄(ask): 本番デプロイ・本番DB実行・main への直接 push など、実行自体は正当だが人間の確認が欲しい操作
240
+ (★PR のマージはここに入りません。職人が合流まで行います=ADR-007。ただし保護を迂回する旗(`--admin` 等)は使わず、CI が緑になってから合流します=職人の鉄則7)
240
241
  - 白(allow): ビルド・テスト・git 操作・ファイル閲覧など、日常開発で安全な操作を自動許可
241
242
 
242
243
  ## セットアップ手順
@@ -77,10 +77,17 @@ NODE_MAJOR_WANTED=24
77
77
  # (2026-09-16 11:01 に3現場で発生)、逆に本当に止まる2種(端末で Enter が要る/
78
78
  # 続きの指示が要る)も同じ文面で出るので、何をすればよいか分からなかった。
79
79
  # 0.12.1 で3種を分けた。下限を上げないと 0.12.0 の機に届かない。
80
+ # 【0.12.3 へ上げた理由(えふさん確定 2026-09-16・便 4a5bbb9f)】
81
+ # 0.12.2 までの職人の鉄則7は「その他のリポは gh pr merge --admin」と★指示していた。
82
+ # --admin は branch protection(CI が通っていない物を main に入れない仕組み)を迂回する旗で、
83
+ # 保護を足した日から「赤いまま本番の元が変わる」。実測 2026-09-16: 会話の記録で
84
+ # gh pr merge 1,225 回のうち 513 回が --admin(13 現場・11 日間)。
85
+ # 0.12.3 で鉄則7を「まず auto merge/使えないリポは通常の合流/--admin は使わない」に直した。
86
+ # ★鉄則は npm の配布物(skills/)に入っているので、下限を上げないと古い鉄則のまま回り続ける。
80
87
  # ★食い違うと「入口は通したのに設置係が止める」が起きる。テストで同一を固定してある。
81
88
  # ★公開 npm の latest より新しい値を書かないこと(書くと全員が設置できなくなる)。
82
89
  # package.json の版を超えていないことをテストで固定してある。
83
- MIN_CONDUCTOR_VERSION="0.12.1"
90
+ MIN_CONDUCTOR_VERSION="0.12.3"
84
91
 
85
92
  # nvm の版は固定する(毎回ちがう版が降ってくると再現しない)。
86
93
  NVM_VERSION='v0.40.1'
@@ -254,6 +261,57 @@ conductor_version() {
254
261
  fi
255
262
  }
256
263
 
264
+ # ═════════════════════════════════════════════════════════════════════════════
265
+ # ★采配くん本体の取得元(この4行と2つの関数が【正本】・えふさん確定 2026-09-16)
266
+ #
267
+ # 【なぜ要るか(実測 2026-09-16・便 9858450b)】
268
+ # 開発機は私設の部品(@tyhld/auth 等)を GitHub Packages から取るため、
269
+ # `@tyhld` の取得先そのものが GitHub Packages を向いている。
270
+ # npm config get @tyhld:registry -> https://npm.pkg.github.com
271
+ # npm view @tyhld/conductor version -> 0.5.0 (GitHub Packages の古い版)
272
+ # npm view @tyhld/conductor version --@tyhld:registry=https://registry.npmjs.org
273
+ # -> 0.12.3 (公開 npm の今の版)
274
+ # この状態で `npm update -g @tyhld/conductor` を打つと、GitHub Packages の 0.5.0 を
275
+ # 入れ直す。だから「更新しました」と出たあとに「版が古すぎます」で止まっていた。
276
+ #
277
+ # 【決めたこと】★`@tyhld` の設定そのものは変えない(他の社内部品は GitHub Packages のまま)。
278
+ # 本体を取る・更新する・版を問い合わせるときだけ、そのコマンド1回に限って公開 npm を
279
+ # 明示する。`--@tyhld:registry=…` はそのコマンドの中だけで効き、~/.npmrc も
280
+ # npm の全体設定も1文字も書き換えない。
281
+ # ★この指定は「そのコマンドで @tyhld のものを取るとき」に効くので、本体と他の社内部品を
282
+ # 【同じ1回のコマンドで】入れてはいけない。下の関数は本体だけを扱う。
283
+ #
284
+ # 【お客さま機では何も変わらない】`@tyhld` の設定を持たない機は、もともと公開 npm を見る。
285
+ # 明示しても指す先は同じなので、動きは1ミリも変わらない。
286
+ # ═════════════════════════════════════════════════════════════════════════════
287
+ # >>> registry-pin >>> ★この印の間が正本。2つの台本で1文字も違わないことをテストが固定する。
288
+ CONDUCTOR_PKG="@tyhld/conductor"
289
+ CONDUCTOR_REGISTRY="https://registry.npmjs.org"
290
+ # ★npm へ渡す1個の旗。これを付けた回だけ、本体の取得先が公開 npm になる。
291
+ CONDUCTOR_REGISTRY_ARG="--@tyhld:registry=${CONDUCTOR_REGISTRY}"
292
+
293
+ # 公開 npm が「いま配っている版」を問い合わせる(取れなければ空)。
294
+ # ★これが「今回入れるはずの版」の正本。固定の下限ではなく、取得元に聞いた値を使う。
295
+ conductor_published_version() {
296
+ local v
297
+ v="$(npm view "$CONDUCTOR_PKG" version "$CONDUCTOR_REGISTRY_ARG" 2>/dev/null | tr -d '[:space:]')"
298
+ if [[ "$v" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
299
+ printf '%s' "${BASH_REMATCH[0]}"
300
+ fi
301
+ }
302
+
303
+ # 本体を入れる/更新する。引数があればその版、無ければ公開 npm の今の版。
304
+ # ★版を決め打ちで渡すので「@latest と書いたのに別の版が入った」が起こせない。
305
+ conductor_npm_install() {
306
+ local want="${1:-}"
307
+ if [[ -z "$want" ]]; then
308
+ npm install -g "$CONDUCTOR_PKG" "$CONDUCTOR_REGISTRY_ARG"
309
+ else
310
+ npm install -g "${CONDUCTOR_PKG}@${want}" "$CONDUCTOR_REGISTRY_ARG"
311
+ fi
312
+ }
313
+ # <<< registry-pin <<<
314
+
257
315
  # apt の道具が「もう使える」か。
258
316
  #
259
317
  # ★名前が入っているかだけでは足りない。python3-venv は【まとめ役の名前】で、実体は
@@ -359,7 +417,7 @@ if [[ "${2:-}" == --profile* ]]; then
359
417
 
360
418
  試作の現場を作るときは、先に采配くんを入れてから次のように打ってください:
361
419
 
362
- npm i -g @tyhld/conductor
420
+ npm i -g @tyhld/conductor --@tyhld:registry=https://registry.npmjs.org
363
421
  conductor setup ${SITE} --profile proto
364
422
 
365
423
  USAGE
@@ -385,7 +443,7 @@ Mac をお使いのようです。この1行の入口は Windows(WSL2 + Ubuntu
385
443
 
386
444
  Mac では、次の2行で設置してください。
387
445
 
388
- npm i -g @tyhld/conductor
446
+ npm i -g @tyhld/conductor --@tyhld:registry=https://registry.npmjs.org
389
447
  conductor setup <お仕事の名前>
390
448
 
391
449
  (先に Homebrew で tmux を、npm で Claude Code を入れてログインしておいてください)
@@ -735,27 +793,56 @@ step '⑨ 采配くん本体を入れる'
735
793
  # 公開 npm には 0.3.0 しか出ておらず、お客さまはそれを掴んでいた。0.3.0 は古い鍵名
736
794
  # (CONDUCTOR_SHARED_SECRET)を読むので、いまの接続情報では「未設定です」で落ちる。
737
795
  # =ここで気づかないと「設置は成功したのに指示が1つも届かない」で終わる。
796
+ # ★入れる版は「公開 npm に聞いた版」(えふさん確定 2026-09-16)。取得元は上の正本に任せる。
797
+ CONDUCTOR_WANT="$(conductor_published_version)"
798
+
738
799
  if [[ "$DRY_RUN" == "1" ]]; then
739
800
  if have conductor; then
740
801
  CONDUCTOR_VER="$(conductor_version)"
741
- if [[ -n "$CONDUCTOR_VER" ]] && ! version_lt "$CONDUCTOR_VER" "$MIN_CONDUCTOR_VERSION"; then
742
- skip "采配くん本体は入っています(${CONDUCTOR_VER} ≧ ${MIN_CONDUCTOR_VERSION})"
802
+ if [[ -n "$CONDUCTOR_WANT" && "$CONDUCTOR_VER" == "$CONDUCTOR_WANT" ]]; then
803
+ skip "采配くん本体は入っています(${CONDUCTOR_VER} = 公開 npm の ${CONDUCTOR_WANT})"
743
804
  else
744
- plan "采配くん本体が古いので更新します(いま ${CONDUCTOR_VER:-不明} → ${MIN_CONDUCTOR_VERSION} 以上)"
805
+ plan "采配くん本体を ${CONDUCTOR_WANT:-最新版} へ揃えます(いま ${CONDUCTOR_VER:-不明})"
745
806
  fi
746
807
  else
747
- plan '采配くん本体を入れます(npm i -g @tyhld/conductor)'
808
+ plan "采配くん本体を入れます(${CONDUCTOR_PKG}@${CONDUCTOR_WANT:-最新版}・取得先 ${CONDUCTOR_REGISTRY})"
748
809
  fi
749
- elif have conductor && [[ -n "$(conductor_version)" ]] \
750
- && ! version_lt "$(conductor_version)" "$MIN_CONDUCTOR_VERSION"; then
751
- skip "采配くん本体は入っています($(conductor_version) ≧ ${MIN_CONDUCTOR_VERSION})"
810
+ elif have conductor && [[ -n "$CONDUCTOR_WANT" ]] && [[ "$(conductor_version)" == "$CONDUCTOR_WANT" ]]; then
811
+ # ★一致していれば何もしない。下限ではなく「公開 npm の今の版と同じか」で見る。
812
+ skip "采配くん本体は入っています($(conductor_version) = 公開 npm の ${CONDUCTOR_WANT})"
752
813
  record "采配くん本体: 済み($(conductor_version))"
753
- elif have conductor; then
754
- say " いま入っている版: $(conductor_version || echo '読み取れません')(${MIN_CONDUCTOR_VERSION} 以上が必要です)"
755
- run '采配くん本体を新しくします' npm install -g @tyhld/conductor@latest \
756
- || die '采配くん本体を新しくできませんでした(インターネット接続をご確認ください)'
814
+ else
815
+ if have conductor; then
816
+ say " いま入っている版: $(conductor_version || echo '読み取れません')(公開 npm は ${CONDUCTOR_WANT:-不明})"
817
+ doing '采配くん本体を新しくします'
818
+ else
819
+ doing '采配くん本体を入れます'
820
+ fi
821
+ conductor_npm_install "$CONDUCTOR_WANT" \
822
+ || die "采配くん本体を入れられませんでした(取得先 ${CONDUCTOR_REGISTRY}・インターネット接続をご確認ください)"
823
+ have conductor || die '采配くん本体を入れましたが呼び出せません(PATH の設定をご確認ください)'
757
824
  CONDUCTOR_VER="$(conductor_version)"
825
+ # ★入れた版と、実際に動く版が一致するか(★この便の要・便 9858450b)。
826
+ # 合否は固定の下限ではなく、取得元に聞いた版との一致で決める。
827
+ if [[ -n "$CONDUCTOR_WANT" && -n "$CONDUCTOR_VER" && "$CONDUCTOR_VER" != "$CONDUCTOR_WANT" ]]; then
828
+ halt "$(cat <<MSG
829
+ 入れた版と、実際に動く版が違います。
830
+
831
+ 期待した版(${CONDUCTOR_REGISTRY} が配っている版): ${CONDUCTOR_WANT}
832
+ 実際に動く版 : ${CONDUCTOR_VER}
833
+ 実行ファイルの場所:
834
+ $(command -v -a conductor 2>/dev/null | sed 's/^/ /' || echo ' (見つかりません)')
835
+
836
+ ★別の取得先から入った物が、PATH の先にいます。次の1行で入れ直してください。
837
+
838
+ npm install -g ${CONDUCTOR_PKG}@${CONDUCTOR_WANT} ${CONDUCTOR_REGISTRY_ARG}
839
+
840
+ それでも直らないときは、この画面をそのままサポートへお送りください。
841
+ MSG
842
+ )"
843
+ fi
758
844
  if [[ -n "$CONDUCTOR_VER" ]] && version_lt "$CONDUCTOR_VER" "$MIN_CONDUCTOR_VERSION"; then
845
+ # ★下限の確認は今までの役割のまま残す(配布そのものが止まっている場合の受け皿)。
759
846
  halt "$(cat <<MSG
760
847
  采配くん本体の版が古すぎます(いま ${CONDUCTOR_VER} / ${MIN_CONDUCTOR_VERSION} 以上が必要です)。
761
848
  新しくしようとしましたが、取ってこられませんでした。
@@ -764,18 +851,13 @@ elif have conductor; then
764
851
 
765
852
  次の1行をお試しください。
766
853
 
767
- npm install -g @tyhld/conductor@latest
854
+ npm install -g ${CONDUCTOR_PKG}@latest ${CONDUCTOR_REGISTRY_ARG}
768
855
 
769
856
  それでも直らないときは、この画面をそのままサポートへお送りください。
770
857
  MSG
771
858
  )"
772
859
  fi
773
- record "采配くん本体: 新しくした(${CONDUCTOR_VER:-不明})"
774
- else
775
- run '采配くん本体を入れます' npm install -g @tyhld/conductor \
776
- || die '采配くん本体を入れられませんでした(インターネット接続をご確認ください)'
777
- have conductor || die '采配くん本体を入れましたが呼び出せません(PATH の設定をご確認ください)'
778
- record "采配くん本体: 入れた($(conductor_version))"
860
+ record "采配くん本体: 用意した(${CONDUCTOR_VER:-不明})"
779
861
  fi
780
862
 
781
863
  # ═════════════════════════════════════════════════════════════════════════════
@@ -102,7 +102,7 @@ PROJECT_DIR="${2:-$HOME/projects/$SITE}"
102
102
  # 食い違うと「入口は通したのに設置係が止める」が起きる。テストで同一を固定してある。
103
103
  # ★公開 npm の latest より新しい値を書かないこと(書くと全員が設置できなくなる)。
104
104
  # package.json の版を超えていないことをテストで固定してある。
105
- MIN_CONDUCTOR_VERSION="0.12.1"
105
+ MIN_CONDUCTOR_VERSION="0.12.3"
106
106
 
107
107
  # ─── ヘルパ ───────────────────────────────────────────────────────────────────
108
108
  fail() { echo; echo "[setup] エラー: $1" >&2; exit 1; }
@@ -134,6 +134,57 @@ conductor_version() {
134
134
  printf '%s' "${BASH_REMATCH[0]}"
135
135
  fi
136
136
  }
137
+ # ═════════════════════════════════════════════════════════════════════════════
138
+ # ★采配くん本体の取得元(この4行と2つの関数が【正本】・えふさん確定 2026-09-16)
139
+ #
140
+ # 【なぜ要るか(実測 2026-09-16・便 9858450b)】
141
+ # 開発機は私設の部品(@tyhld/auth 等)を GitHub Packages から取るため、
142
+ # `@tyhld` の取得先そのものが GitHub Packages を向いている。
143
+ # npm config get @tyhld:registry -> https://npm.pkg.github.com
144
+ # npm view @tyhld/conductor version -> 0.5.0 (GitHub Packages の古い版)
145
+ # npm view @tyhld/conductor version --@tyhld:registry=https://registry.npmjs.org
146
+ # -> 0.12.3 (公開 npm の今の版)
147
+ # この状態で `npm update -g @tyhld/conductor` を打つと、GitHub Packages の 0.5.0 を
148
+ # 入れ直す。だから「更新しました」と出たあとに「版が古すぎます」で止まっていた。
149
+ #
150
+ # 【決めたこと】★`@tyhld` の設定そのものは変えない(他の社内部品は GitHub Packages のまま)。
151
+ # 本体を取る・更新する・版を問い合わせるときだけ、そのコマンド1回に限って公開 npm を
152
+ # 明示する。`--@tyhld:registry=…` はそのコマンドの中だけで効き、~/.npmrc も
153
+ # npm の全体設定も1文字も書き換えない。
154
+ # ★この指定は「そのコマンドで @tyhld のものを取るとき」に効くので、本体と他の社内部品を
155
+ # 【同じ1回のコマンドで】入れてはいけない。下の関数は本体だけを扱う。
156
+ #
157
+ # 【お客さま機では何も変わらない】`@tyhld` の設定を持たない機は、もともと公開 npm を見る。
158
+ # 明示しても指す先は同じなので、動きは1ミリも変わらない。
159
+ # ═════════════════════════════════════════════════════════════════════════════
160
+ # >>> registry-pin >>> ★この印の間が正本。2つの台本で1文字も違わないことをテストが固定する。
161
+ CONDUCTOR_PKG="@tyhld/conductor"
162
+ CONDUCTOR_REGISTRY="https://registry.npmjs.org"
163
+ # ★npm へ渡す1個の旗。これを付けた回だけ、本体の取得先が公開 npm になる。
164
+ CONDUCTOR_REGISTRY_ARG="--@tyhld:registry=${CONDUCTOR_REGISTRY}"
165
+
166
+ # 公開 npm が「いま配っている版」を問い合わせる(取れなければ空)。
167
+ # ★これが「今回入れるはずの版」の正本。固定の下限ではなく、取得元に聞いた値を使う。
168
+ conductor_published_version() {
169
+ local v
170
+ v="$(npm view "$CONDUCTOR_PKG" version "$CONDUCTOR_REGISTRY_ARG" 2>/dev/null | tr -d '[:space:]')"
171
+ if [[ "$v" =~ ^[0-9]+\.[0-9]+\.[0-9]+ ]]; then
172
+ printf '%s' "${BASH_REMATCH[0]}"
173
+ fi
174
+ }
175
+
176
+ # 本体を入れる/更新する。引数があればその版、無ければ公開 npm の今の版。
177
+ # ★版を決め打ちで渡すので「@latest と書いたのに別の版が入った」が起こせない。
178
+ conductor_npm_install() {
179
+ local want="${1:-}"
180
+ if [[ -z "$want" ]]; then
181
+ npm install -g "$CONDUCTOR_PKG" "$CONDUCTOR_REGISTRY_ARG"
182
+ else
183
+ npm install -g "${CONDUCTOR_PKG}@${want}" "$CONDUCTOR_REGISTRY_ARG"
184
+ fi
185
+ }
186
+ # <<< registry-pin <<<
187
+
137
188
  step() { echo; echo "══════════════════════════════════════════════════════════"; echo "[setup] $1"; echo "══════════════════════════════════════════════════════════"; }
138
189
 
139
190
  # ─── OS の見分けと、OS ごとに違う道具(★ADR-019・案C) ───────────────────────
@@ -312,15 +363,24 @@ fi
312
363
  # ─── ② conductor 本体インストール ────────────────────────────────────────────
313
364
  step "② conductor 本体インストール"
314
365
 
315
- # @tyhld/conductor は公開 npm (registry.npmjs.org) で配布されるため、
316
- # PAT や .npmrc の設定は不要。無認証で npm i -g できる。
366
+ # 取得元は上の正本(CONDUCTOR_REGISTRY_ARG)に任せる。★ここに取得先を書かない。
367
+ #
368
+ # ★入れる版を先に決める(えふさん確定 2026-09-16・「最新版という曖昧な指定だけにしない」)。
369
+ # 公開 npm に「いま配っている版」を聞き、その版を名指しで入れる。入れ終わったら、
370
+ # PATH 上で実際に動く conductor の版と【一致するか】を見る。一致しなければ失敗にする。
371
+ # ★合否を固定の下限で決めない。取得元に聞いた値と実際の値の一致が正本。
372
+ CONDUCTOR_WANT="$(conductor_published_version)"
373
+ if [[ -z "$CONDUCTOR_WANT" ]]; then
374
+ warn "公開 npm に版を問い合わせられませんでした(ネットワークの一時的な不調)。版の名指しはせずに進みます。"
375
+ fi
376
+
317
377
  if command -v conductor >/dev/null 2>&1; then
318
- echo "[setup] conductor は既にインストール済みです。更新します..."
319
- npm update -g @tyhld/conductor || warn "npm update に失敗しました。続行します。"
378
+ echo "[setup] conductor は既にインストール済みです。${CONDUCTOR_WANT:-最新版} へ揃えます..."
320
379
  else
321
- echo "[setup] @tyhld/conductor をグローバルインストールします..."
322
- npm install -g @tyhld/conductor || fail "npm install -g @tyhld/conductor に失敗しました。ネットワーク接続を確認してください。"
380
+ echo "[setup] ${CONDUCTOR_PKG} をグローバルインストールします(${CONDUCTOR_WANT:-最新版})..."
323
381
  fi
382
+ conductor_npm_install "$CONDUCTOR_WANT" \
383
+ || fail "采配くん本体を入れられませんでした(取得先: ${CONDUCTOR_REGISTRY})。ネットワーク接続をご確認ください。"
324
384
 
325
385
  # conductor コマンドの存在を再確認
326
386
  if ! command -v conductor >/dev/null 2>&1; then
@@ -328,23 +388,36 @@ if ! command -v conductor >/dev/null 2>&1; then
328
388
  fi
329
389
  echo "[setup] conductor: $(conductor --version 2>/dev/null || command -v conductor)"
330
390
 
331
- # --- ★版が古すぎないかを確かめる(古い版は動かない・実測 2026-09-04) --------
332
- # 上で `npm update -g` は済んでいる。それでもまだ古いなら、取りに行った先に新しい版が
333
- # 無い(=配布が止まっている)ということなので、ここで止めて人へ渡す。
334
- # ★このまま進めると「設置は成功したのに指示が1つも届かない」で終わる。
335
- # お客さまがいちばん困る形なので、必ずここで気づかせる(ADR-017 と同じ考え方)。
391
+ # --- ★入れた版と、実際に動く版が一致するかを確かめる(★この便の要) ----------
392
+ # 【なぜ要るか(実測 2026-09-16・便 9858450b)】開発機は @tyhld の取得先が GitHub Packages を
393
+ # 向いているため、`npm update -g @tyhld/conductor` が古い 0.5.0 を入れ直していた。
394
+ # 「更新しました」と出たあとに「版が古すぎます」で止まる、という分かりにくい形だった。
395
+ # ★取得先を明示しただけでは足りない。入れ終わったあとに【実際に動く版】を見て、
396
+ # 期待と違えば成功にしない。これが再発を構造的に止める。
397
+ # ★一致判定なので、期待より新しい版が動いていても失敗にする(別経路の取り違えが見える)。
398
+ # >>> version-match >>> ★この印の間はテストが切り出して単体で流す。動かすときは消さない。
336
399
  CONDUCTOR_VER="$(conductor_version)"
337
400
  if [[ -z "$CONDUCTOR_VER" ]]; then
338
401
  warn "conductor の版を読み取れませんでした(続行します)。"
402
+ elif [[ -n "$CONDUCTOR_WANT" && "$CONDUCTOR_VER" != "$CONDUCTOR_WANT" ]]; then
403
+ fail "入れた版と、実際に動く版が違います。
404
+ 期待した版(${CONDUCTOR_REGISTRY} が配っている版): ${CONDUCTOR_WANT}
405
+ 実際に動く版 : ${CONDUCTOR_VER}
406
+ 実行ファイルの場所 :
407
+ $(command -v -a conductor 2>/dev/null | sed 's/^/ /' || echo ' (見つかりません)')
408
+ ★別の取得先から入った物が PATH の先にいます。次の1行で入れ直してください:
409
+ npm install -g ${CONDUCTOR_PKG}@${CONDUCTOR_WANT} ${CONDUCTOR_REGISTRY_ARG}"
339
410
  elif version_lt "$CONDUCTOR_VER" "$MIN_CONDUCTOR_VERSION"; then
411
+ # ★下限の確認は今までの役割のまま残す(配布そのものが止まっている場合の受け皿)。
340
412
  fail "采配くん本体の版が古すぎます(いま ${CONDUCTOR_VER} / ${MIN_CONDUCTOR_VERSION} 以上が必要です)。
341
413
  更新を試しましたが、新しい版を取ってこられませんでした。
342
414
  ★古い版のままでは、設置できても指示が1つも届きません(鍵の名前が違うため)。
343
415
  次の1行をお試しのうえ、それでも直らないときはサポートへご連絡ください:
344
- npm install -g @tyhld/conductor@latest"
416
+ npm install -g ${CONDUCTOR_PKG}@latest ${CONDUCTOR_REGISTRY_ARG}"
345
417
  else
346
- echo "[setup] conductor の版: OK(${CONDUCTOR_VER} ≧ ${MIN_CONDUCTOR_VERSION})"
418
+ echo "[setup] conductor の版: OK(${CONDUCTOR_VER}${CONDUCTOR_WANT:+ = 公開 npm の ${CONDUCTOR_WANT}})"
347
419
  fi
420
+ # <<< version-match <<<
348
421
 
349
422
  # ─── ③ node symlink ──────────────────────────────────────────────────────────
350
423
  step "③ node の場所を常駐から見えるようにする"
@@ -710,7 +783,7 @@ PROTO_GEN="$SCRIPT_DIR/../dist/proto-profile.js"
710
783
  if [[ "$PROFILE" == "proto" ]]; then
711
784
  [[ -f "$PROTO_GEN" ]] || fail "試作の型の正本が見つかりません: $PROTO_GEN
712
785
  配布物が壊れている可能性があります。次の1行で入れ直してください:
713
- npm i -g @tyhld/conductor"
786
+ npm i -g @tyhld/conductor --@tyhld:registry=https://registry.npmjs.org"
714
787
  PROTO_SETTINGS="$CLAUDE_DIR/.settings.proto.$$"
715
788
  node "$PROTO_GEN" settings > "$PROTO_SETTINGS" \
716
789
  || fail "試作の型の設定を作れませんでした(node \"$PROTO_GEN\" settings)"
@@ -18,7 +18,13 @@ description: 采配くんの便(プロンプト末尾に CONDUCTOR_JOB:<id>
18
18
  4. **壁に当たったら止まる** — サンドボックス制約・保護されたパスに当たったら回避せず中断して報告する(★通信で塞がれたときの読み方は鉄則12)。
19
19
  5. **エージェント設定に書き込まない** — `.mcp.json`、`.claude/` 配下、hooks 等のエージェント設定パスには書き込まない。
20
20
  6. **本番に触らない** — 本番DB・deploy・secret に触らない。SQL/DDL は作って提示のみ(適用は人間)。
21
- 7. **便の終点はマージまで** — push → PR作成 → TYHLD-platform は `gh pr merge <番号> --auto --merge --delete-branch`(CI緑で自動合流・赤なら待機して状態を報告)/その他のリポは `gh pr merge <番号> --admin --merge --delete-branch`。
21
+ 7. **便の終点はマージまで(★保護を迂回しない)** — push → PR作成 → **CI が緑であることを確かめてから**合流する。手順は2段で、リポの名前は覚えなくてよい。
22
+ - ① まず `gh pr merge <番号> --auto --merge --delete-branch`。**CI が緑になった時点で自動的に合流する**(赤のままなら合流されない=待てばよい)。
23
+ - ② 「auto-merge が使えない」と断られたリポだけ、`gh pr checks <番号>` で**CI が緑なのを自分で確かめてから** `gh pr merge <番号> --merge --delete-branch`。
24
+ - ★**`--admin` など保護を迂回する旗は、通常運用では使わない。** branch protection は「CI が通っていない物を main に入れない」ための仕組みで、迂回すると**赤いまま本番の元が変わる**。旗を1つ付けるだけで、その現場の唯一の歯止めが外れる。
25
+ - ★**保護が理由で合流できないときは、回避せずそこで止めて報告する**(人の手番)。別の旗を探さない。
26
+ - ★CI が赤いときは、直してから合流する。直せない理由が分かったら、状態を報告して止まる。
27
+ - ★「この便のマージは人間が行う」と指示に書かれていれば、**その指示が優先**(ADR-007)。
22
28
  8. **ブラウザ検品(Playwright)の作法** — ★取りに行かない。PCに1回だけ入れた共有の道具を指すだけ(ADR-010)。
23
29
  - ① **起動は必ず `chromium_sandbox=False`**(`--no-sandbox`)。付けないと起動できない。
24
30
  - ② **道具は共有の場所を使う。自分でダウンロードしない。** python は `$HOME/.tyhld/pw-venv/bin/python`、`PLAYWRIGHT_BROWSERS_PATH` は `$HOME/.tyhld/pw-browsers`。**無ければそこで止めて「人の手番=`APPLY=1 bash scripts/pw-browser-install.sh`」と報告する。** `playwright install` も `pip install playwright` も職人は実行しない(毎便まるごとダウンロードが走り、便が遅くなる。通信自体は鉄則12のとおり許可済みだが、取りに行かないのが本筋=ADR-010)。