@tyhld/conductor 0.12.84 → 0.12.86
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/README.md +11 -1
- package/dist/autoupdate-flags.js +62 -0
- package/dist/autoupdate.js +643 -0
- package/dist/cli.js +23 -1
- package/dist/headless.js +84 -1
- package/dist/relay.js +51 -0
- package/dist/selfcheck.js +827 -0
- package/package.json +4 -1
- package/scripts/autoupdate-install.sh +285 -0
- package/scripts/conductor-run.sh +3 -1
- package/scripts/dist-source.sh +219 -20
- package/scripts/hooks/skill_sync_notify.py +27 -2
- package/scripts/hooks/test_skill_sync_notify.py +34 -0
- package/scripts/tyhld-autoupdate.sh +61 -0
- package/scripts/tyhld-selfcheck.sh +58 -0
- package/scripts/update-guard.sh +15 -6
- package/systemd/build-runner-install.sh +1 -1
- package/systemd/ear-install.sh +1 -1
- package/systemd/guard-sync-install.sh +1 -1
- package/systemd/tyhld-autoupdate-boot.service +27 -0
- package/systemd/tyhld-autoupdate.service +24 -0
- package/systemd/tyhld-autoupdate.timer +20 -0
- package/systemd/tyhld-selfcheck.service +23 -0
- package/systemd/tyhld-selfcheck.timer +19 -0
|
@@ -110,6 +110,11 @@ REINSTALL = ('npm install -g @tyhld/conductor '
|
|
|
110
110
|
RESYNC = 'APPLY=1 bash "$(npm root -g)/@tyhld/conductor/scripts/update-guard.sh"'
|
|
111
111
|
|
|
112
112
|
|
|
113
|
+
def autoupdate_enabled():
|
|
114
|
+
"""自動更新が入っている PC か(自社PCの鍵 ~/.tyhld/bin/autoupdate/enabled・便 29babc5d)。"""
|
|
115
|
+
return os.path.isfile(os.path.join(os.path.expanduser('~'), '.tyhld', 'bin', 'autoupdate', 'enabled'))
|
|
116
|
+
|
|
117
|
+
|
|
113
118
|
def recovery_steps(reason):
|
|
114
119
|
"""うまくいかなかった理由に【合った】手順を返す(便 675e2d05)。
|
|
115
120
|
|
|
@@ -118,11 +123,31 @@ def recovery_steps(reason):
|
|
|
118
123
|
(入っている版と公開の版が違う)のときにこれを打っても、配り元の確認でまた弾かれる=
|
|
119
124
|
同じ失敗を繰り返すだけで直らない。先に入れ直しが要る。
|
|
120
125
|
"""
|
|
121
|
-
if reason in ('
|
|
126
|
+
if reason in ('flagged-bad', 'flagged-suspect'):
|
|
127
|
+
# ★管制で不具合・疑いの印が付いた版(便 29babc5d)。入れ直しても同じ版なら直らない。
|
|
128
|
+
if autoupdate_enabled():
|
|
129
|
+
return ['再開のしかた: この PC は自動更新が入っています。管制が直した版を決めれば、'
|
|
130
|
+
'次の自動更新で入れ替わります(人の操作は要りません)。']
|
|
131
|
+
return ['再開のしかた: この版には管制で不具合の印が付いています。CC1 に知らせてください'
|
|
132
|
+
f'(直した版が公開されたら {REINSTALL})。']
|
|
133
|
+
if reason in ('unpublished', 'deprecated', 'version-drift', 'not-installed', 'incomplete'):
|
|
134
|
+
# ★自動更新が入っている PC は、更新係が管制の決めた版へそろえる(便 29babc5d)。
|
|
135
|
+
# 人が npm で入れると段階配布の順番が崩れるので、入れ直しを促さない。
|
|
136
|
+
# ★not-installed・incomplete は配布物そのものが無い=更新係も動けないので、自動更新の有無によらず入れ直す。
|
|
137
|
+
if autoupdate_enabled() and reason in ('unpublished', 'deprecated', 'version-drift'):
|
|
138
|
+
return ['再開のしかた: この PC は自動更新が入っています。次の自動更新(管制が決めた版を、'
|
|
139
|
+
'作業中の便が終わってから入れます)でそろいます。管制の「PCの状態」で確かめてください。']
|
|
122
140
|
return [f'再開のしかた: この PC で次の順に打ってください。① {REINSTALL}',
|
|
123
141
|
f' ② {RESYNC}']
|
|
142
|
+
if reason == 'no-npm':
|
|
143
|
+
# ★回線のせいにしない(便 b7bd5e43)。常駐の中から npm が見つからなかっただけ。
|
|
144
|
+
# 人が打つと、常駐が使う置き場の控え(~/.tyhld/bin/runtime-root)が書き直され、
|
|
145
|
+
# 次からはその node の隣の npm で問い合わせられる。
|
|
146
|
+
return ['再開のしかた: 公開 npm に問い合わせる npm が、この PC の常駐からは見つかりませんでした'
|
|
147
|
+
'(回線の問題ではありません)。この PC で次の1行を打ってください。',
|
|
148
|
+
f' {RESYNC}']
|
|
124
149
|
if reason == 'unverifiable':
|
|
125
|
-
return ['再開のしかた: 公開 npm
|
|
150
|
+
return ['再開のしかた: 公開 npm への問い合わせに失敗しました(回線・取得先・npm の不調のどれか)。'
|
|
126
151
|
'この PC の通信(回線・取得先の設定)を確かめてから、次を打ってください。',
|
|
127
152
|
f' {RESYNC}']
|
|
128
153
|
return [f'再開のしかた: この PC で次の1行を打ってください。 {RESYNC}']
|
|
@@ -305,6 +305,14 @@ with tempfile.TemporaryDirectory() as tmp:
|
|
|
305
305
|
'npm install -g' in net, False)
|
|
306
306
|
check_true('公開npmに聞けない: 配り直しの1行は載る', 'APPLY=1 bash' in net)
|
|
307
307
|
|
|
308
|
+
# ★npm が見つからないだけのときに「回線」と言い切らない(便 b7bd5e43)。
|
|
309
|
+
nonpm = body_for('no-npm')
|
|
310
|
+
check_true('npmが無い: npm が見つからないと書く', 'npm が' in nonpm and '見つかりませんでした' in nonpm)
|
|
311
|
+
check_true('npmが無い: 回線の問題ではないと書く', '回線の問題ではありません' in nonpm)
|
|
312
|
+
check('npmが無い: 通信を確かめさせない', '通信(回線' in nonpm, False)
|
|
313
|
+
check('npmが無い: 入れ直しは案内しない', 'npm install -g' in nonpm, False)
|
|
314
|
+
check_true('npmが無い: 配り直しの1行は載る', 'APPLY=1 bash' in nonpm)
|
|
315
|
+
|
|
308
316
|
plain = body_for('write-failed', what='craftsman-skill')
|
|
309
317
|
check('書けなかった: 入れ直しは案内しない', 'npm install -g' in plain, False)
|
|
310
318
|
check_true('書けなかった: 配り直しの1行だけ', 'APPLY=1 bash' in plain)
|
|
@@ -314,6 +322,32 @@ with tempfile.TemporaryDirectory() as tmp:
|
|
|
314
322
|
check_true(f'{label}: 入っている配布物の台本を打たせる', 'npm root -g' in b)
|
|
315
323
|
check(f'{label}: 作業ツリーへ cd させない', 'cd ~/projects' in b, False)
|
|
316
324
|
|
|
325
|
+
# ★便 29babc5d: 番人を配る条件が「公開されている正規の版で、管制で不具合の印が無い版」になった。
|
|
326
|
+
unpub = body_for('unpublished')
|
|
327
|
+
check_true('公開npmに無い版: 入れ直しから案内する', '① npm install -g @tyhld/conductor' in unpub)
|
|
328
|
+
check_true('使わないでの印: 入れ直しから案内する', '① npm install -g' in body_for('deprecated'))
|
|
329
|
+
bad = body_for('flagged-bad')
|
|
330
|
+
check_true('管制で不具合の印: CC1 に知らせる', 'CC1 に知らせて' in bad)
|
|
331
|
+
check('管制で不具合の印: 配り直しだけを促さない(同じ版なら直らない)', '② APPLY=1 bash' in bad, False)
|
|
332
|
+
|
|
333
|
+
# ★自動更新が入っている PC(鍵 ~/.tyhld/bin/autoupdate/enabled)は、人に npm で入れさせない
|
|
334
|
+
# (更新係が管制の決めた版へそろえる。人が入れると段階配布の順番が崩れる)。
|
|
335
|
+
old_home = os.environ.get('HOME')
|
|
336
|
+
os.environ['HOME'] = tmp
|
|
337
|
+
try:
|
|
338
|
+
os.makedirs(os.path.join(tmp, '.tyhld', 'bin', 'autoupdate'), exist_ok=True)
|
|
339
|
+
write(os.path.join(tmp, '.tyhld', 'bin', 'autoupdate'), 'enabled', 'x\n')
|
|
340
|
+
auto = body_for('unpublished')
|
|
341
|
+
check_true('自動更新の PC: 次の自動更新でそろうと書く', '次の自動更新' in auto)
|
|
342
|
+
check('自動更新の PC: npm で入れさせない', 'npm install -g' in auto, False)
|
|
343
|
+
check_true('自動更新の PC・不具合の印: 人の操作は要らないと書く', '人の操作は要りません' in body_for('flagged-suspect'))
|
|
344
|
+
check_true('自動更新の PC でも、配布物が無いときは入れ直す', 'npm install -g' in body_for('not-installed'))
|
|
345
|
+
finally:
|
|
346
|
+
if old_home is None:
|
|
347
|
+
os.environ.pop('HOME', None)
|
|
348
|
+
else:
|
|
349
|
+
os.environ['HOME'] = old_home
|
|
350
|
+
|
|
317
351
|
# ── ★札の覚え書き(壊れていても・書けなくても止まらない)──────────────────
|
|
318
352
|
print('\n【★札の覚え書き】')
|
|
319
353
|
with tempfile.TemporaryDirectory() as tmp:
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tyhld-autoupdate — 自社PCの更新係を1回流す入口(便 29babc5d・設計 3ed9e2b2 の A3)。
|
|
3
|
+
#
|
|
4
|
+
# 【置き場】~/.tyhld/bin/tyhld-autoupdate(★職人は書けない場所)。隣に dist-source.sh が要る
|
|
5
|
+
# (常駐の入口 conductor-run と同じ置き場・同じ探し方)。置くのは自社PCの導入台本
|
|
6
|
+
# scripts/autoupdate-install.sh だけ。★お客さまの機の導入台本(sales-template/install.sh・setup.sh)は置かない。
|
|
7
|
+
#
|
|
8
|
+
# 【使い方】systemd から呼ぶ(人が打つ物ではない)。
|
|
9
|
+
# tyhld-autoupdate-boot.service … ~/.tyhld/bin/tyhld-autoupdate --boot(起動時に1回・常駐より先)
|
|
10
|
+
# tyhld-autoupdate.service … ~/.tyhld/bin/tyhld-autoupdate(タイマーから数分ごと。聞きに行くのは管制が返す間隔ごと)
|
|
11
|
+
# 終了コード: 0=いつも(更新しなかった・失敗した も 0。理由は journal と控えに残る)/2=使い方の誤り/
|
|
12
|
+
# 78=動かす采配くんが見つからない
|
|
13
|
+
#
|
|
14
|
+
# 【決め】
|
|
15
|
+
# ・鍵(~/.tyhld/bin/autoupdate/enabled)が無い機では、何も読まずに終わる(お客さまの機で動かない)。
|
|
16
|
+
# ・同時に2つ動かさない(起動時の1回とタイマーが重なっても、後の方は何もせず終わる)。
|
|
17
|
+
# ・動かすのは常駐と同じ「公開済みの配布物」(作業ツリーは動かさない=dist_runtime_resolve)。
|
|
18
|
+
# ・接続設定は systemd が EnvironmentFile で渡す。無いときだけ ~/.conductor.env から
|
|
19
|
+
# CONDUCTOR_URL・CONDUCTOR_TOKEN・CONDUCTOR_MACHINE の3つを読む(★値は画面に出さない)。
|
|
20
|
+
set -u
|
|
21
|
+
|
|
22
|
+
KEY="${HOME:-}/.tyhld/bin/autoupdate/enabled"
|
|
23
|
+
if [[ ! -f "$KEY" ]]; then
|
|
24
|
+
echo "[tyhld-autoupdate] 自動更新の鍵がありません($KEY)。この機では何もしません。"
|
|
25
|
+
exit 0
|
|
26
|
+
fi
|
|
27
|
+
|
|
28
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
29
|
+
. "$HERE/dist-source.sh"
|
|
30
|
+
|
|
31
|
+
if ! dist_runtime_resolve; then
|
|
32
|
+
echo "[tyhld-autoupdate] 流せません: 動かす采配くんを確かめられません(${DIST_REASON})。" >&2
|
|
33
|
+
echo "[tyhld-autoupdate] 人の手番: npm install -g @tyhld/conductor --@tyhld:registry=https://registry.npmjs.org" >&2
|
|
34
|
+
exit 78
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
ENV_FILE="${HOME:-}/.conductor.env"
|
|
38
|
+
if [[ ( -z "${CONDUCTOR_URL:-}" || -z "${CONDUCTOR_TOKEN:-}" ) && -r "$ENV_FILE" ]]; then
|
|
39
|
+
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
40
|
+
line="${line#export }"
|
|
41
|
+
case "$line" in
|
|
42
|
+
CONDUCTOR_URL=*|CONDUCTOR_TOKEN=*|CONDUCTOR_MACHINE=*)
|
|
43
|
+
key="${line%%=*}"; val="${line#*=}"
|
|
44
|
+
val="${val%\"}"; val="${val#\"}"; val="${val%\'}"; val="${val#\'}"
|
|
45
|
+
[[ -n "${!key:-}" ]] || export "$key=$val"
|
|
46
|
+
;;
|
|
47
|
+
esac
|
|
48
|
+
done < "$ENV_FILE"
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
# ★同時に2つ動かさない(flock が無い機では、そのまま1つとして動かす)。
|
|
52
|
+
LOCK="${HOME:-}/.tyhld/bin/autoupdate/lock"
|
|
53
|
+
if command -v flock >/dev/null 2>&1; then
|
|
54
|
+
exec 9>"$LOCK" || exit 0
|
|
55
|
+
if ! flock -n 9; then
|
|
56
|
+
echo "[tyhld-autoupdate] ほかの更新係が動いているので、今回は何もしません。"
|
|
57
|
+
exit 0
|
|
58
|
+
fi
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
"$DIST_NODE" "$DIST_ROOT/dist/cli.js" autoupdate "$@"
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# tyhld-selfcheck — この機の自己診断を1回流す入口(便 b7bd5e43・設計 3ed9e2b2 の A1)。
|
|
3
|
+
#
|
|
4
|
+
# 【置き場】~/.tyhld/bin/tyhld-selfcheck(★職人は書けない場所)。隣に dist-source.sh が要る
|
|
5
|
+
# (常駐の入口 conductor-run と同じ置き場・同じ探し方)。置くのは自社PCの導入台本(次の便 A3)か人。
|
|
6
|
+
# ★お客さまの機の導入台本(sales-template/install.sh・setup.sh)は置かない。
|
|
7
|
+
#
|
|
8
|
+
# 【使い方】
|
|
9
|
+
# ~/.tyhld/bin/tyhld-selfcheck --now … 人が1回だけ流す(きっかけ manual)
|
|
10
|
+
# ~/.tyhld/bin/tyhld-selfcheck --trigger daily … 毎日のタイマー(tyhld-selfcheck.timer)
|
|
11
|
+
# ~/.tyhld/bin/tyhld-selfcheck --trigger after-conductor … 更新係が conductor を上げた直後(次の便)
|
|
12
|
+
# ほかに after-claude / after-rollback。--json で機械が読む形、--no-send で管制へ送らない。
|
|
13
|
+
# 終了コード: 0=PASS / 1=FAIL / 2=使い方の誤り / 78=動かす采配くんが見つからない
|
|
14
|
+
#
|
|
15
|
+
# 【決め】
|
|
16
|
+
# ・動かすのは常駐と同じ「公開済みの配布物」(作業ツリーは動かさない=dist_runtime_resolve)。
|
|
17
|
+
# ・副作用なし(commit・push・PR・合流・配備・公開をしない)。中身は src/selfcheck.ts。
|
|
18
|
+
# ・接続設定は systemd が EnvironmentFile で渡す。人が打ったときは ~/.conductor.env から
|
|
19
|
+
# CONDUCTOR_URL と CONDUCTOR_TOKEN の2つだけを読む(★値は画面に出さない)。
|
|
20
|
+
set -u
|
|
21
|
+
|
|
22
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
23
|
+
. "$HERE/dist-source.sh"
|
|
24
|
+
|
|
25
|
+
ARGS=()
|
|
26
|
+
SAW_TRIGGER=0
|
|
27
|
+
while (( $# > 0 )); do
|
|
28
|
+
case "$1" in
|
|
29
|
+
--now) ;; # きっかけ manual(既定)。書かれていても同じ
|
|
30
|
+
--trigger) SAW_TRIGGER=1; ARGS+=("$1" "${2:-}"); shift ;;
|
|
31
|
+
*) ARGS+=("$1") ;;
|
|
32
|
+
esac
|
|
33
|
+
shift
|
|
34
|
+
done
|
|
35
|
+
(( SAW_TRIGGER == 1 )) || ARGS+=(--trigger manual)
|
|
36
|
+
|
|
37
|
+
if ! dist_runtime_resolve; then
|
|
38
|
+
echo "[tyhld-selfcheck] 流せません: 動かす采配くんを確かめられません(${DIST_REASON})。" >&2
|
|
39
|
+
echo "[tyhld-selfcheck] 人の手番: npm install -g @tyhld/conductor --@tyhld:registry=https://registry.npmjs.org" >&2
|
|
40
|
+
exit 78
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# 接続設定(2つだけ)。★systemd から呼ばれたときは既に入っているので読まない。
|
|
44
|
+
ENV_FILE="${HOME:-}/.conductor.env"
|
|
45
|
+
if [[ ( -z "${CONDUCTOR_URL:-}" || -z "${CONDUCTOR_TOKEN:-}" ) && -r "$ENV_FILE" ]]; then
|
|
46
|
+
while IFS= read -r line || [[ -n "$line" ]]; do
|
|
47
|
+
line="${line#export }"
|
|
48
|
+
case "$line" in
|
|
49
|
+
CONDUCTOR_URL=*|CONDUCTOR_TOKEN=*|CONDUCTOR_MACHINE=*)
|
|
50
|
+
key="${line%%=*}"; val="${line#*=}"
|
|
51
|
+
val="${val%\"}"; val="${val#\"}"; val="${val%\'}"; val="${val#\'}"
|
|
52
|
+
[[ -n "${!key:-}" ]] || export "$key=$val"
|
|
53
|
+
;;
|
|
54
|
+
esac
|
|
55
|
+
done < "$ENV_FILE"
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
exec "$DIST_NODE" "$DIST_ROOT/dist/cli.js" selfcheck "${ARGS[@]}"
|
package/scripts/update-guard.sh
CHANGED
|
@@ -308,8 +308,10 @@ fi
|
|
|
308
308
|
# 「止まる」を採ると、今までどおり打ったのに何も起きない形になり、手順を覚え直すことになる。
|
|
309
309
|
#
|
|
310
310
|
# 【正規版でないときは黙って進まない】
|
|
311
|
-
# 入っていない/版が読めない/公開 npm に聞けない/版が公開 npm
|
|
312
|
-
#
|
|
311
|
+
# 入っていない/版が読めない/公開 npm に聞けない/版が公開 npm に無い・使わないでの印がある/
|
|
312
|
+
# 管制で不具合(bad)・疑い(suspect)の印がある のどれでも、★1バイトも配らずに終わる。
|
|
313
|
+
# ★公開の最新より古くても、公開 npm に在る正規の版で印が無ければ配る(便 29babc5d・段階配布のため・
|
|
314
|
+
# えふさん確定 2026-10-02 夜)。管制に届かないときは「印が無い」として配る(配らないほうが危ない)。失敗は控えに残し、便 29612ff1 で作った知らせ方(確認カード)に載せる。
|
|
313
315
|
. "$SCRIPT_DIR/dist-source.sh"
|
|
314
316
|
|
|
315
317
|
DIST_STATE="$GUARD_HOME/dist-source.state" # 最後に【確かめられた】配り元
|
|
@@ -347,10 +349,12 @@ if ! dist_source_resolve; then
|
|
|
347
349
|
case "$DIST_REASON" in
|
|
348
350
|
not-installed) warn " この機に @tyhld/conductor が入っていません。" ;;
|
|
349
351
|
no-version) warn " 入っている配布物の版が読めません。" ;;
|
|
350
|
-
|
|
351
|
-
|
|
352
|
+
no-npm) warn " 公開 npm に問い合わせる npm が見つかりません(配布物を動かす node の隣にも、PATH にもありません)。" ;;
|
|
353
|
+
unverifiable) warn " 公開 npm への問い合わせに失敗しました(npm: ${DIST_NPM:-不明}。回線・取得先・npm の不調のどれか)。" ;;
|
|
354
|
+
unpublished) warn " 入っている版 ${DIST_VERSION} は公開 npm にありません(正規の版ではありません。公開の最新は ${DIST_PUBLISHED})。" ;;
|
|
355
|
+
deprecated) warn " 入っている版 ${DIST_VERSION} には、公開 npm で「使わないで」の印が付いています(${DIST_DEPRECATED})。" ;;
|
|
352
356
|
esac
|
|
353
|
-
warn "
|
|
357
|
+
while IFS= read -r l; do warn " $l"; done < <(dist_human_step "$DIST_REASON")
|
|
354
358
|
dist_record failed "$DIST_REASON"
|
|
355
359
|
dist_notify
|
|
356
360
|
exit 0
|
|
@@ -362,7 +366,12 @@ if ! dist_source_complete "$DIST_ROOT"; then
|
|
|
362
366
|
dist_notify
|
|
363
367
|
exit 0
|
|
364
368
|
fi
|
|
365
|
-
|
|
369
|
+
if [[ "$DIST_VERSION" == "$DIST_PUBLISHED" ]]; then
|
|
370
|
+
info " 配り元: $DIST_ROOT(版 $DIST_VERSION =公開 npm のいまの版・管制の印 ${DIST_CENTRAL_FLAG:-unknown})"
|
|
371
|
+
else
|
|
372
|
+
# ★段階配布のあいだ、後続の機は公開の最新より古い正規の版で動く(便 29babc5d・えふさん確定 2026-10-02 夜)。
|
|
373
|
+
info " 配り元: $DIST_ROOT(版 $DIST_VERSION =公開 npm に在る正規の版・公開の最新は $DIST_PUBLISHED・管制の印 ${DIST_CENTRAL_FLAG:-unknown})"
|
|
374
|
+
fi
|
|
366
375
|
if [[ "$DIST_ROOT" != "$REPO_ROOT" ]]; then
|
|
367
376
|
info " ★この台本の置き場($REPO_ROOT)からは配りません。"
|
|
368
377
|
fi
|
|
@@ -102,7 +102,7 @@ else
|
|
|
102
102
|
# 入口の一式を写す元=公開済みの正規版(作業ツリーからは写さない・便 4061dd71 と同じ判定)。
|
|
103
103
|
if ! dist_source_for_setup "$(cd "$SCRIPT_DIR/.." && pwd)"; then
|
|
104
104
|
die "司令塔を動かす采配くんを確かめられません(${DIST_REASON})。
|
|
105
|
-
|
|
105
|
+
$(dist_human_step "$DIST_REASON" | sed 's/^/ /')"
|
|
106
106
|
fi
|
|
107
107
|
if ! dist_runtime_bundle_install "$DIST_ROOT"; then
|
|
108
108
|
die "司令塔の入口を置けませんでした: $DIST_RUNTIME_BIN_DIR"
|
package/systemd/ear-install.sh
CHANGED
|
@@ -85,7 +85,7 @@ else
|
|
|
85
85
|
# 入口の一式を写す元=公開済みの正規版(作業ツリーからは写さない・便 4061dd71 と同じ判定)。
|
|
86
86
|
if ! dist_source_for_setup "$(cd "$SCRIPT_DIR/.." && pwd)"; then
|
|
87
87
|
skip "耳を動かす采配くんを確かめられません(${DIST_REASON})。
|
|
88
|
-
|
|
88
|
+
$(dist_human_step "$DIST_REASON" | sed 's/^/ /')"
|
|
89
89
|
fi
|
|
90
90
|
if ! dist_runtime_bundle_install "$DIST_ROOT"; then
|
|
91
91
|
skip "耳の入口を置けませんでした: $DIST_RUNTIME_BIN_DIR"
|
|
@@ -66,7 +66,7 @@ done
|
|
|
66
66
|
. "$SCRIPT_DIR/../scripts/dist-source.sh"
|
|
67
67
|
if ! dist_source_for_setup "$REPO_ROOT"; then
|
|
68
68
|
warn "配り元を確かめられません(${DIST_REASON})。自動同期タイマーは設置しません。"
|
|
69
|
-
warn "
|
|
69
|
+
while IFS= read -r l; do warn " $l"; done < <(dist_human_step "$DIST_REASON")
|
|
70
70
|
exit 0
|
|
71
71
|
fi
|
|
72
72
|
if [[ "$DIST_ROOT" != "$REPO_ROOT" ]]; then
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# tyhld-autoupdate-boot.service — 起動時に1回だけ、更新係を流す(便 29babc5d・設計 3ed9e2b2 の A3)。
|
|
2
|
+
#
|
|
3
|
+
# 【何をするか】~/.tyhld/bin/tyhld-autoupdate --boot を1回。管制に目標の版を聞き、違えば入れ替える。
|
|
4
|
+
# 起動直後は便が0なので、更新は「電源を入れた直後」にほぼ済む(設計 1/4)。
|
|
5
|
+
# 自己診断は、常駐が起きてからタイマーの回(tyhld-autoupdate.service)が行う。
|
|
6
|
+
#
|
|
7
|
+
# 【順番】常駐(conductor@*・耳・司令塔)は、この1回が終わってから起きる。
|
|
8
|
+
# ★順番は常駐の側の drop-in(conductor@.service.d/10-tyhld-autoupdate.conf の After=)で決める。
|
|
9
|
+
# 置くのは scripts/autoupdate-install.sh(自社PCだけ)。お客さまの機の常駐には何も足さない。
|
|
10
|
+
# ★この1回が失敗しても常駐は起きる(After= だけで Requires= は付けない)。
|
|
11
|
+
#
|
|
12
|
+
# 【★自社PCだけ】置いて有効にするのは scripts/autoupdate-install.sh(人の窓で1回)だけ。
|
|
13
|
+
|
|
14
|
+
[Unit]
|
|
15
|
+
Description=tyhld: auto-update check at boot (before the relays start)
|
|
16
|
+
After=network-online.target
|
|
17
|
+
Wants=network-online.target
|
|
18
|
+
|
|
19
|
+
[Service]
|
|
20
|
+
Type=oneshot
|
|
21
|
+
EnvironmentFile=-%h/.conductor.env
|
|
22
|
+
ExecStart=/bin/bash %h/.tyhld/bin/tyhld-autoupdate --boot
|
|
23
|
+
# 入れ替え(npm・公式の導入台本)の上限。常駐をいつまでも待たせない。
|
|
24
|
+
TimeoutStartSec=20min
|
|
25
|
+
|
|
26
|
+
[Install]
|
|
27
|
+
WantedBy=default.target
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# tyhld-autoupdate.service — 更新係を1回流す(便 29babc5d・設計 3ed9e2b2 の A3)。
|
|
2
|
+
#
|
|
3
|
+
# 【何をするか】~/.tyhld/bin/tyhld-autoupdate を1回(中身は src/autoupdate.ts)。
|
|
4
|
+
# ・管制が返す checkAgainMin の時刻が来た回だけ、管制に目標の版を聞く(それ以外の回はすぐ終わる)
|
|
5
|
+
# ・全現場が空きのときだけ入れ替える → 常駐を起こし直す → 自己診断 → 結果を管制へ
|
|
6
|
+
# ・自己診断が FAIL なら、この機だけ前の版へ戻す
|
|
7
|
+
# ★sudo を使わない。番人・禁止の一覧・囲い・通信の許可には触らない。
|
|
8
|
+
#
|
|
9
|
+
# 【★自社PCだけ】置いて有効にするのは scripts/autoupdate-install.sh(人の窓で1回)だけ。
|
|
10
|
+
# 鍵(~/.tyhld/bin/autoupdate/enabled)が無ければ、この係は何もしない。
|
|
11
|
+
# .timer から数分ごとに呼ばれる(tyhld-autoupdate.timer)。
|
|
12
|
+
|
|
13
|
+
[Unit]
|
|
14
|
+
Description=tyhld: auto-update (conductor / Claude Code, staged by the central)
|
|
15
|
+
After=network-online.target
|
|
16
|
+
Wants=network-online.target
|
|
17
|
+
|
|
18
|
+
[Service]
|
|
19
|
+
Type=oneshot
|
|
20
|
+
EnvironmentFile=-%h/.conductor.env
|
|
21
|
+
ExecStart=/bin/bash %h/.tyhld/bin/tyhld-autoupdate
|
|
22
|
+
# 入れ替え+自己診断(小さな試験の3分を含む)+戻すときの分。
|
|
23
|
+
TimeoutStartSec=60min
|
|
24
|
+
Nice=10
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# tyhld-autoupdate.timer — 更新係を数分ごとに起こす(便 29babc5d・設計 3ed9e2b2 の A3)。
|
|
2
|
+
#
|
|
3
|
+
# - OnBootSec=4min … 起動時の1回(tyhld-autoupdate-boot)と常駐が起きた後に、1回目
|
|
4
|
+
# (起動時に入れ替えた機は、ここで自己診断を行う)
|
|
5
|
+
# - OnUnitActiveSec=5min … 以後5分ごとに起きる。★管制へ聞きに行くのは、管制が返した
|
|
6
|
+
# checkAgainMin(いまは15分)が来た回だけ(間隔は更新係が決め打ちしない)
|
|
7
|
+
# - Persistent=false … 取りこぼしの追い実行はしない(起動時の1回が在る)
|
|
8
|
+
#
|
|
9
|
+
# ★自社PCだけ。有効にするのは scripts/autoupdate-install.sh(お客さまの機には入れない)。
|
|
10
|
+
|
|
11
|
+
[Unit]
|
|
12
|
+
Description=tyhld: auto-update check
|
|
13
|
+
|
|
14
|
+
[Timer]
|
|
15
|
+
OnBootSec=4min
|
|
16
|
+
OnUnitActiveSec=5min
|
|
17
|
+
AccuracySec=30s
|
|
18
|
+
|
|
19
|
+
[Install]
|
|
20
|
+
WantedBy=timers.target
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# tyhld-selfcheck.service — この機の自己診断を1回流す(便 b7bd5e43・設計 3ed9e2b2 の A1)。
|
|
2
|
+
#
|
|
3
|
+
# 【何をするか】~/.tyhld/bin/tyhld-selfcheck --trigger daily を1回流すだけ(中身は src/selfcheck.ts)。
|
|
4
|
+
# ・6項目(conductor 起動/Claude Code 起動/管制との通信/囲い/GitHub・npm/小さな headless 試験)+番人
|
|
5
|
+
# ・副作用なし(commit・push・PR・合流・配備・公開をしない)。結果は手元の控えと管制へ。
|
|
6
|
+
# ・正常時は何も知らせない(知らせるかどうかは管制が決める)。
|
|
7
|
+
#
|
|
8
|
+
# 【★自社PCだけ】置いて有効にするのは自社PCの導入台本 scripts/autoupdate-install.sh(人の窓で1回)。
|
|
9
|
+
# sales-template/install.sh・setup.sh はこのタイマーを置かない(お客さまの機には入れない)。
|
|
10
|
+
# .timer から毎日1回呼ばれる(tyhld-selfcheck.timer)。
|
|
11
|
+
|
|
12
|
+
[Unit]
|
|
13
|
+
Description=tyhld: daily self-check (conductor / Claude Code / central / sandbox / network / headless)
|
|
14
|
+
After=network-online.target
|
|
15
|
+
Wants=network-online.target
|
|
16
|
+
|
|
17
|
+
[Service]
|
|
18
|
+
Type=oneshot
|
|
19
|
+
EnvironmentFile=%h/.conductor.env
|
|
20
|
+
ExecStart=/bin/bash %h/.tyhld/bin/tyhld-selfcheck --trigger daily
|
|
21
|
+
# 小さな試験の上限(3分)+外への問い合わせの分。
|
|
22
|
+
TimeoutStartSec=15min
|
|
23
|
+
Nice=10
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# tyhld-selfcheck.timer — 上の自己診断を毎日1回起動する(ADR-026 の9・便 b7bd5e43)。
|
|
2
|
+
#
|
|
3
|
+
# - OnCalendar=daily 12:30 … 昼に1回(電源が入っている時間帯に寄せる)。
|
|
4
|
+
# - Persistent=true … PCが消えていて取りこぼした分は、次回起動後に1度だけ追い実行。
|
|
5
|
+
# - RandomizedDelaySec … 複数の機が同じ時刻に Claude を呼ばないよう30分ばらす。
|
|
6
|
+
# ★管制は「26時間来ない機」を🟡にする想定(設計 3ed9e2b2 の 2/4)。
|
|
7
|
+
#
|
|
8
|
+
# ★自社PCだけ。有効にするのは自社PCの導入台本 scripts/autoupdate-install.sh(お客さまの機には入れない)。
|
|
9
|
+
|
|
10
|
+
[Unit]
|
|
11
|
+
Description=tyhld: daily self-check
|
|
12
|
+
|
|
13
|
+
[Timer]
|
|
14
|
+
OnCalendar=*-*-* 12:30:00
|
|
15
|
+
Persistent=true
|
|
16
|
+
RandomizedDelaySec=30min
|
|
17
|
+
|
|
18
|
+
[Install]
|
|
19
|
+
WantedBy=timers.target
|