validate-config | env + config.json の検証(session_duration_sec の範囲含む) | 0=OK, 2=設定欠損 |
show-config | 現設定を read-only 表示(秘匿はマスク) | 0(未設定でも 0) |
init-config [--session-duration-sec] [--agent-name] [--private-dir] [--force] | config.json を生成(範囲検証、既存は --force で上書き)。対話的収集は /telegram-secretary 経由 | 0, 2=範囲外/既存 |
lease acquire|renew|release [--owner] [--ttl SEC] | リースロック操作(--ttl 既定 300) | 0=成功, 4=conflict, 2=設定欠損 |
poll [--timeout SEC] | getUpdates 1サイクル(--timeout long-poll 秒、既定 30)、認可・正規化済み update を JSON Lines で stdout に emit | 0=OK, 1=fetch失敗, 3=auth失敗 |
watch [--owner] [--timeout SEC] [--max-iterations N] [--max-duration SEC] [--exit-on-message] [--cleanup-interval N] | 長期 long-poll ループ。実 message 1件=1行 emit。サイクル毎に lease 自動 renew。--timeout=getUpdates long-poll 秒(既定 30)、--max-duration SEC=窓満了で exit 0(0=無限)、--exit-on-message=メッセージ emit したサイクルで exit 0(即応再起動) | 長時間常駐 / 窓畳み |
send-reply --chat-id --update-id --text-file [--owner] [--file ...] [--reply-to] | エージェント起草の返信送信 → offset advance + lease renew。CLI 層 + UseCase 層の二重 owner 検証。--file(複数可)で画像→sendPhoto・他→sendDocument 添付、--reply-to で threading | 0=OK, 1=送信失敗, 2=添付不正, 3=auth, 4=lease |
proactive-send --chat-id --text-file [--owner] [--file ...] [--reply-to] | 秘書による能動送信(inbound 非依存の outbound push)→ 送信 + lease renew(offset 非干渉=inbound 専用の既読台帳に触れない)。registry_sync 有効時は outbound WAL ライフサイクル(append→push→送信→settle→push)を内包し、送信成功分を done 化(happy-path settle=次回再送しない・別途 wal-append/push 不要)。--update-id 無しが send-reply との差分。二重 owner 検証・--file・--reply-to は共通。能力境界は SecretaryRole、再送方針は DESIGN §3.9 | 0=OK, 1=送信失敗, 2=添付不正, 3=auth, 4=lease |
test --chat-id | owner chat に ping 1通 | 0=OK, 1=送信失敗, 3=auth |
cleanup-media | state_dir/media/ 配下で media_retention_hours 超過の保存 media を削除(手動 / cron)。watch は --cleanup-interval で自動発火(既定 120 サイクル≒1h) | 0=OK, 2=設定欠損 |
render-pdf --path <pdf> (--text | --pages N-M) | 受信済み PDF のオンデマンド抽出。--text=全ページのテキスト層(pdfplumber、--- page N --- マーカー)、--pages N-M=指定ページ画像化(1-indexed inclusive、cap 超 21 枚目以降用)。結果は JSON 1 行で stdout。--text/--pages は排他必須 | 0=OK, 2=ファイル不在/引数不正 |
lint-numbers <path> | 納品物・handoff(原稿 md)の裸数値スキャン。数字(半角/全角)を含む各行について、同一行に計器トークン(実測 / 見込み / 出典 / 継承 等、出所を名指す語形)があるかを二値判定し、JSON 1 行で stdout(keys: path / number_lines / covered / bare / bare_lines。bare_lines は [[行番号, 行], ...] で行番号は 1-indexed)。presence の検査であって正しさの検査ではない(計器あり ≠ その数が正しい)——読んで分類するのはエージェント側。read-only(config / lease / レジストリに触れない)。裸 0 件でも JSON 1 行を出す(黙る計器は掛け忘れと全緑を区別させない)。生 HTML に掛けると属性値・px・hex 色でほぼ全行が候補化する=仕様なので、対で作る納品物は原稿 md に掛ける(DESIGN §3.13) | 0=OK(裸の有無に依らず), 2=パス不在/不可読 |
individuals|tasks|knowledge|subjects|abilities|profile|goals|steps {list|get|add|remove|import} | 管理表(8表: INDIVIDUALS/TASKS/KNOWLEDGE/SUBJECTS/ABILITIES/PROFILE/GOALS/STEPS)の CRUD。get/remove は --key(uuid/id)、add は --json/--json-file、import --json-file は全件置換(配列を丸ごと差し替え、stderr に imported <表>: N -> M records の差分。全件検証→置換ゆえ 1 件でも不正なら exit 2・無置換)。値オブジェクトで検証。書き込み口(add / import)はトップレベル未知キーを exit 2 で弾く(v1.9.0 の fail-closed。typo キーが沈黙で消えるのを止める=後方非互換。read 経路〔list/get/orientation〕は前方互換のため警告どまりで読める)。knowledge の category は許可集合 10 種のみ(observation / research / harness / domain-insight / analysis / design / method / philosophy / business / decision)——範囲外も欠落も、許可集合を列挙した stderr メッセージ付きで exit 2(v1.8.0。暗黙の "general" 補完は廃止=弾かれるだけで、綴りを選び直せる情報はエラー文に載る)。category は認識の型の軸専用で、主題(馬・建設 等)の軸は knowledge の subjects[](v1.9.0)が持つ——値は SUBJECTS 表の active な id と照合し、語彙外・deprecated は候補列挙付き exit 2(空配列・省略は可)。語彙そのものは SUBJECTS 表=データなので、主題を増やすのは subjects add(コード変更・deploy 不要。使わなくなった語は remove せず status=deprecated=過去レコードの読み出しを壊さない)。SSoT は Private JSON、操作主体は SecretaryRole、入口は /telegram-secretary。registry_sync 有効時は add/remove/import 後に commit&push(イベント駆動) | 0=OK, 2=不正入力 |
orientation [--notes-tail N] [--topic-width N] [--handoff-latest N] [--handoff-cap N] [--knowledge-category CAT] [--knowledge-latest N] [--knowledge-subject ID] [--profile-cap N] [--individuals-cap N] [--abilities-cap N] [--goals-cap N] [--tasks-latest N] [--steps-latest N] [--artifacts-latest N] | 起動時オリエンテーションのダイジェスト(8表を並べた list を置き換える read-only 射影)。role 判定 + 8表の件数/バイト数 + 小表全文(goals)+ abilities / profile の一行索引(v1.19.0。abilities は id|name|trigger|skill_path|guidance、profile は id|subject|method|traits|content。件数絞りは無く全件。trigger と traits は全量、guidance / content だけ頭を丸め、全文〔profile の sources を含む〕は abilities get --key / profile get --key)+ individuals の一人一行索引(v1.18.0。uuid|display_name|role|status|chat|honorific|tone|category|priority_bias|taboo_topics|shared_with|relationship_label|context_notes。件数絞りは無く全件——「誰と」の一覧ゆえ母数は減らさない。chat は tg:<id>/line:<id>、空は -。context_notes だけ頭を丸め、全文は individuals get --key <uuid>)+ tasks 一行要約と active の notes 末尾(既定 4000 バイト)+ tasks.notes 直後の ## artifacts(v1.17.0。artifacts/ 配下〔handoff/ を除く〕のファイル名をパス中のタスク id トークン〔t0007/・_t0013_〕で束ね、active タスクの群だけ名前を並べる〔各群 basename 降順=名前の日付が新しい順、--artifacts-latest N で群ごとに頭打ち・見出し latest N of M files〕、active 以外の群と untagged は other: T0013 30, untagged 217 の一行。active で成果物が無い群も 0 files で載る。中身は開かない=索引はファイル名だけ。notes〔追記のみ・撤回を書かない監査証跡〕から引いた値を外へ出す前に、ここに挙がった採択済み成果物を見るための節)+ knowledge の id|subjects|topic 索引(既定幅 120 バイト、主題は / 連結・未設定は -)+ subjects の id|label|aliases|status|note 索引(v1.10.0。件数絞りは無く全件——主題を選ぶ一覧ゆえ母数は減らさない)+ steps の id|goal_id|seq|status|title 索引(v1.10.0)+ handoff 最新ブロック(既定 3 件・各 8000 バイト)を stdout に出す。counts の直後に ## outbound(v1.16.0)——WAL から `last_sent: <created_at> (created_at, UTC) | <本文先頭 topic_width バイト>(status **done**=happy-path settle 済み=送信成功の記録、無ければ none)と pending: N(intent を書いただけで送信未確定=**送信済と読まない**)の 2 行。「今日の日報は出したか」の判定材料であり判定そのものではない(時刻は UTC の送信予定時刻=created_atで、送信完了時刻ではない)。**done はwal-redoの checkpoint が retention で掃除する**のでnoneは「retention 内に送信確定なし」であって「一度も送っていない」ではない。WAL が読めない枠はnoneで続行し stderr にoutbound wal unreadable を出す(fail-open)。**幅の単位は UTF-8 バイト**で丸めは文字境界(退避の閾値と同じ単位で数える、DESIGN §3.12)。出力サイズは notes 長に依存せず有界。--knowledge-categoryは索引を category 完全一致で絞る(見出しにN of M が載り、絞って落ちた分も可視。該当 0 件でも exit 0=絞りは観測であって検証ではない)。--knowledge-subject は同じ規約で subjects の要素一致に絞る(category と併用可)。--knowledge-latestは索引を新しい順 N 件に絞る(既定は未指定=全件、見出しはlatest N of M, newest last。選ぶのは新しい順だが並びは id 昇順のまま=**末尾が最新**、その読み方を見出しの newest last が開示する。絞りの順は category → subject → latest)。--individuals-cap/--profile-cap/--abilities-capは索引行のcontext_notes/content/guidance 頭の幅(individuals は v1.18.0、profile / abilities は v1.19.0 で意味を移した。引数名は v1.9.0 から不変、未指定なら 120)。--goals-capは**小表の支配的長文フィールド**notesをバイト上限で丸める(v1.10.0=**未指定なら全文**。丸めても個票はget --keyで全文が引ける。見出しにfull, notes cap N bytes として開示)、--tasks-latestは tasks 一行要約の**終端(done / cancelled 等)だけ**を新しい順 N 件に絞る——**active(open / in_progress / blocked)は件数絞りの対象外で常に全件載る**(v1.15.2。依頼そのものが起動時に見えなくなる形をコードで塞ぐ、DESIGN §3.12)。見出しは## tasks (A active + latest N of T terminal records, newest last, summary: id | status | priority | due_date | title)で active 数 A・終端の母数 T・実際に載った N を開示する(未指定なら従来どおり全件・見出しはN records)。notes は載った集合の active に連動=**active 全件の notes 末尾が載る**。--steps-latest は **steps 索引を新しい順 N 件に絞る(未指定なら全件、v1.10.0)**。件数絞り系はいずれも **0 が「全捨て」で未指定へ逆転しない**(--tasks-latest 0は「終端を全捨て」=active だけ載る)。**digest の総バイトは実行のたび stderr にorientation digest: N bytesとして出る**(v1.8.0。25,600 バイト超では退避の可能性と絞りオプションを添えた警告が付く。stdout・exit code は不変)。深掘りは個別get --key` |
knowledge search --query Q [--query Q2] [--any] [--category C] [--subject S] [--limit N] [--topic-width N] | knowledge の read-only 検索(v1.17.0。git にも sync にも触れない)。id / subjects / topic / content に対する部分文字列一致で、両側を NFKC → casefold に正規化してから照合(「LLM」と「llm」を別語にしない)。複数 --query は既定 AND(精査)、--any で OR(同義語を並べた既出照合)。絞りの順は category → subject → query → limit(orientation の索引と同じ合成順、母数 M は category / subject を掛けた後)。出力は索引行 id | subjects | topic(content は載せない=本文は get --key)、見出し ## knowledge search (N matches of M records[, latest K …, newest last][, category=…][, subject=…], query: a AND b, index: …) で一致数・母数・合成則を開示。0 件でも exit 0(検索は観測であって検証ではない)。総バイトを stderr に knowledge search: N bytes として申告し、25,600 超は退避の可能性と絞り方(--limit / 語を足す / --category / --subject)を警告。新しい知見を焼く前の既出照合の口(自前の全件走査を書かない、ROUTINE_PROMPT Step 11) | 0=OK(0 件でも), 2=--query 無し/knowledge 以外の表 |
artifacts-sync | 成果物層 registry_dir/artifacts/(申し送りの handoff/ ブロックを含む)を固定ブランチへ commit & push。書き込み CLI は持たない——秘書が Write して、この一手で送る(スキーマレス、DESIGN §3.10/§3.12)。registry_sync 無効・artifacts/ 未作成は no-op | 0=OK(push 失敗は stdout の pushed=False、commit はローカルに残り次回再送), 1=同期処理の例外 |
handoff-archive <name>... | 消化(knowledge への結晶化)を終えた handoff ブロックを handoff/archive/ へ移し、artifacts-sync 経路で送る(卒業)。orientation は handoff/ 直下の *.md しか読まない契約ゆえ、archive/ へ移したブロックは以後載らない(消えるのではなく読み筋から外れる)。名前は handoff/ 直下のファイル名そのもの(複数可)。パス成分を含む名前・不在・archive/ に同名既存は何も移動せず exit 2(部分成功を作らない)。どれを卒業させるかは持たない=消化判断の出力を受ける指名制(DESIGN §3.12)。卒業後、そのブロックへの参照(notes / knowledge に書いたファイル名)の解決先は「直下 → archive/」の二箇所になる——名前は不変で場所だけが動くため。直下に無い=失われた、ではないので、archive/ を見てから判定する | 0=OK(push 失敗は stdout の pushed=False、commit はローカルに残り次回再送), 1=同期処理の例外, 2=不正/不在 |
role-status | PROFILE/GOALS から現在の役割(secretary/butler/coach/anego=守護霊)を決定論導出し JSON 1行で emit(P=principal の PROFILE≥1、A=active な GOALS≥1。役割の自称をしない=判定はコード、演技は SecretaryRole。DESIGN §3.11)。起動時は orientation の ## role に同一判定が載るため、単独で叩くのは役割だけ確かめたい時 | 0=OK |
registry-sync | 起動時に固定ブランチから管理表を fetch(registry_sync 有効時のみ、無効は no-op)。最新の管理表で起動するため ROUTINE_PROMPT が起動時に1回呼ぶ | 0=OK, 1=fetch失敗 |
wal-append --kind <individuals|tasks|knowledge|subjects|abilities|profile|goals|steps|outbound> (--json | --json-file) | WAL に intent を pending 追記(登録系の返信の前、言行一致保証の先行書込)。kind は registry 全8表+outbound(choices は REGISTRY_SPEC 導出=表追加に自動追従)。registry kind は add と同一の検証を通り、正準化した payload を書く——未知トップレベルキー・語彙外 subject・許可集合外 category は exit 2(stderr invalid <kind> wal payload: <理由>)で、ログを書く前に止まる。ゆえに add へ渡すのと同一のレコード(created_at / updated_at を含む)が要る(後方非互換、v1.11.0)。outbound は値オブジェクトを持たないため従来どおり素通し(通常 proactive-send が内包するため手動使用は非推奨)。registry_sync 有効時のみ・無効は no-op | 0=OK, 2=不正 |
wal-push [--message] | WAL ログを commit & push(must-succeed=失敗は exit 1=送信前ゲートで send-reply を中止)。registry_sync 無効は no-op | 0=OK, 1=push失敗 |
wal-redo | 起動時に WAL の pending を redo(registry_sync 有効時)。registry kind は upsert(key 冪等・inbound 返信は再送しない)、outbound kind は happy-path settle 後に残った中断分のみ1回再送→即 done。各 intent は add と同一の検証を通り、落ちたものは registry へ書かず dead(理由付き)へ隔離する(v1.11.0)。stdout は wal redo: redone=N resent=N kept=N dead=N——dead はログに残る dead の総数であって今回隔離した分ではない。残存する dead は毎起動 stderr へ wal redo: dead <kind> key=<key>: <理由> を 1 行ずつ出す。exit は 0 のまま(起動経路を止めない)。ROUTINE_PROMPT が registry-sync 直後に1回呼ぶ | 0=OK |
wal-drop --kind <individuals|tasks|knowledge|subjects|abilities|profile|goals|steps> --key <key> | dead の intent を WAL から落とし、固定ブランチへ must-succeed push する(履行しないと決めた約束を明示的に畳む、v1.11.0)。--kind / --key はどちらも必須で、kind は registry 全8表のみ(outbound は検証対象外=dead にならないため choices に無い)。pending / done は落とせない(不在も同じく exit 2)——果たしていない約束を黙って捨てる口は開けない。dead のもう一つの出口は同 key の正しい add で、次回 redo の settle が done 化する(自己治癒)。stdout wal dropped <kind> key=<key>。registry_sync 無効は no-op | 0=OK, 1=push失敗, 2=dead でない/不在 |