メインコンテンツへスキップ

arc service

arc service は、名前付きの AFS バックグラウンドインスタンスを管理します:list、start、stop、restart、status、delete、gc、url、logs です。

arc service は、名前付きの AFS バックグラウンドインスタンスを管理します。arc afs、MCP のブリッジ、blocklet の提供は、いずれも稼働中のインスタンスに依存します。

arc 2.0.0-beta.48、commit 5a5316bde(main、2026-09-10)に対して取得したものです —— 同じバージョン文字列の公開済みバイナリではありません;2 つの異なるビルドが同時に 2.0.0-beta.48 を名乗っていたことがあるため、本ページは semver ではなく commit に pin しています。arc service9 個の本物のサブコマンドarc service <verb> [options])であり、それぞれが独自の --helpExamples: ブロックを持ちます —— 位置引数の action 選択リストを持つ 1 個のコマンドではありません。--json の reject path は ArcBlock/arc#5205 の後に再計測されました(error オブジェクトが stdout に出ていた点 —— 下の --json 契約 で改めて訂正します);delete は ArcBlock/arc#5279 の後、主動詞名になりました(rm/remove は今ではエイリアスです);サブコマンド化と、すべての失敗行にある ERROR: プレフィックスは、どちらも ArcBlock/arc#6301 によるものです。位置引数のインスタンス名は ArcBlock/arc#5713 で削除されました:インスタンスを選ぶ唯一の方法は --instance / -i です。dump をコピーする前に arc --version を実行してください;動詞やフラグはまだ変わる可能性があります。以下の --help のテキストは英語(LC_ALL=C)です —— ArcBlock/arc#5244 以降、ヘルプ/エラーのテキストはシステムのロケールに関わらず常に英語です。

以下のインスタンス名、home パス、ポート番号は、読みやすい docs514a / /tmp/arc-svc-docs-514/... の形に短縮されています。メッセージテキスト、フィールド名、終了コード、JSON の形状は、実際の実行結果からそのままコピーされたものです。

bash
arc service <verb> [options]

verb は次のいずれかです:listlsps)、startstoprestartstatusdeletermremove)、gcprune)、urllogslog)。インスタンスは --instance <name> / -i で選びます。--instance を省略すると、シードインスタンスの default(home ~、port 4900)に対して操作します。他の名前は、--port を渡さない限りカーネルが割り当てたポートを使います。

自分が起動していないシードインスタンスを stop または delete しないでください。本ページの dump は使い捨てのレジストリを使っており、マシンの :4900 上の default には一切触れていません。

分離

分離の仕組みは、名前付きインスタンスに --home を組み合わせたものです。ARC_HOME退役しました:CLI は警告を出し、その値を無視します。

bash
export ARC_INSTANCES_DIR=/tmp/arc-svc-docs-514/instances
arc service start --instance docs514b --home /tmp/arc-svc-docs-514/home-b

ARC_SERVICE_PORT はまだ存在しますが、名前のないシードインスタンスにのみ影響します。名前を使うか、--port を渡すことを推奨します。

以下の dump では、stderr 上の splash banner の行は省略されています。

サブコマンド

各サブコマンドは、それぞれ独自の --helpExamples: を持ちます(本ページ末尾の --help の節を参照)。arc service <不正な verb> と、verb なしの arc service は、どちらも動詞ごとの一覧ではなく、以下のグループレベルの一覧を表示します。

サブコマンドエイリアス内容
listlspsすべてのローカルインスタンスを、その状態・ポート・home と一緒に一覧表示する
startインスタンスを起動する。初回利用時に作成される
stop稼働中のインスタンスを停止する。記録とデータは残す
restart記録された設定からインスタンスを再起動する —— 再設定は行わない;再設定するには stop の後に start する
statusインスタンスが稼働しているか、どのポートでかを報告する
deletermremoveインスタンスを削除する:その記録とデータ
gcpruneプロセスが既に存在しないレジストリの記録を削除する
urlインスタンスのベース URL(およびその blocklet の URL)を表示する
logslogインスタンスのデーモンログを表示する

フラグ

すべてのサブコマンドは、共有のグローバルフラグ —— --json--view--home--instance / -i--print —— に加えて、それぞれ独自の追加フラグを受け付けます:

フラグ対象サブコマンド意味
-i, --instanceすべてこのコマンドがどの名前付きローカル ARC インスタンスに対して動作するか。省略すると default。インスタンスを選ぶ唯一の方法
--homeすべてインスタンスのルート。start(作成)と arc did init で使われる。restart では、新しい設定として受け付けられるのではなく、記録された home と照合される —— 一致すれば no-op、異なるパスを指定すると拒否される(失敗を参照)
--printすべて結果の 1 つのフィールド(例:urlport)をプレーンテキストとして表示する —— view ではなく、--json/--view を上書きする。下の --print を参照
--portstartlisten するポート(0–65535)。0 = 自動割り当て。省略:default4900 を使い、名前付きインスタンスは記録されたポートまたは自動割り当てを使う
--hoststartバインドするアドレス(localhost0.0.0.0::、またはユニキャスト IP)。デフォルト localhost
--advertisestartバインドが非 loopback のとき mDNS で広告する(デフォルト true--no-advertise で無効化)
--blockletstart提供する blocklet の親ディレクトリまたは単一の blocklet ディレクトリ(繰り返し可能)。インスタンスに記録される
--space-rootstartarc space init による Folder-as-DID-Space。省略すると --home から導出する
--forcedelete削除する前に、稼働中のインスタンスを停止する。デフォルト false
--dry-rundelete実際には削除せず、削除されるはずのものを表示する。デフォルト false
--yesdeleteTTY の確認プロンプトをスキップする。デフォルト false
--followlogs書き込まれる新しい行をストリーム表示する。デフォルト false

--yaml は削除されました。実装されたことは一度もありません —— 概要 を参照してください。

restart は自身の --helpstart の設定用フラグを 1 つも持ちません —— そのいずれかを渡すと、yargs の汎用的な「unknown argument」ではなく専用のメッセージで拒否されます(その汎用パスは、--blocklet-dir のように本当に削除されたフラグが当たるものです;削除・退役したもの を参照):

bash
$ arc service restart --instance docs514a --port 4910
ERROR: restart does not reconfigure. use `stop` then `start` to change --port

--home は唯一の例外です:これはグローバルフラグなので、restart --home <記録済みと同じパス> は黙って成功します(no-op)。異なるパスの場合のみ拒否されます —— 上記の設定用フラグのガードとは異なるメッセージと終了コードで:

bash
$ arc service restart --instance docs514a --home /tmp/somewhere-else
ERROR: --instance "docs514a" and --home "/tmp/somewhere-else" name different instances (instance "docs514a" is registered at "/tmp/arc-svc-docs-514/home-a")

(exit 5。一方 --port/--host/--advertise/--space-root/--blocklet は exit 1。)

状態

状態意味
starting記録は確保済み、プロセスはまだ up になっていない
upプロセスが listen している
stoppedプロセスが stop を経由して終了した。start / restart はその記録を再利用する
deadクリーンな stop を経ずにプロセスが失われた。gc が削除するのはこの状態だけ

list は、up ではないすべての行について記録されたポートを表示し、それがライブではなく最後に判明した値であることを示す * を付けます(stopped/dead はいずれもこの接尾辞が付く);- が表示されるのは、記録されたポートがまったくない場合(一度も up に到達しなかったインスタンス)だけです:

NAME          ID                PORT    STATUS   HOME                          SOURCES
docs514a      b719db414c5cc62  61497*  stopped  /tmp/arc-svc-docs-514/home-a  1

statusup で exit 0starting / stopped3dead4 になります。up 以外の場合でも、前回の実行時の pid / port / URL を報告し、そのようにマークします(--json では lastKnown、human view では Note: の行)。

Start、list、status、url

空のレジストリ:

bash
$ export ARC_INSTANCES_DIR=/tmp/arc-svc-docs-514/instances
$ arc service list
NAME          ID                PORT   STATUS   HOME                          SOURCES
(no instances)

名前付きインスタンスを起動します。ポート 61497 はカーネルが割り当てたもので、4900 ではありません:

bash
$ arc service start --instance docs514a --home /tmp/arc-svc-docs-514/home-a
  Instance: docs514a
  ID:       b719db414c5cc624
  Status:   up
  PID:      95665
  Port:     61497
  URL:      http://127.0.0.1:61497
  Home:     /tmp/arc-svc-docs-514/home-a
  Space:    /tmp/arc-svc-docs-514/home-a/.afs/spaces
  Sources:  -
  Version:  2.0.0-beta.48
  Commit:   5a5316bde
  Checkout: /tmp/arc-svc-docs-514/project
  Host:     localhost
  Started:  2026-09-10T01:52:25.130Z (up 2s)

進行状況、ログのパス、build id、エンドポイントは stderr に出力されました。インスタンスの記録は stdout に出力されました —— この取得での stderr(banner は省略):

Starting AFS service...
AFS Service started
  Log:  /tmp/arc-svc-docs-514/home-a/.afs/daemon.log
  Build: 2.0.0-beta.48+5a5316bde (debug)
  Exec:  /path/to/arc/runtimes/node/dist/cli.mjs

  Endpoints:
    http://127.0.0.1:61497/            AUP Web Client
    http://127.0.0.1:61497/explorer    Explorer UI
    http://127.0.0.1:61497/ws          WebSocket (Explorer)
    http://127.0.0.1:61497/afs/*       REST API
    http://127.0.0.1:61497/mcp         MCP Streamable HTTP

Build / Exec は、デーモンが起動時に書き込む <home>/.afs/daemon.build.json から得られます。このサイドカーがない古いデーモンでは、この 2 行は推測されるのではなく省略されます。Version / Commit / Checkout は、実際にそのインスタンスを提供しているバイナリを表します —— 下の 身元フィールド を参照してください。

--blocklet(繰り返し可能)で blocklet のソースを記録します。同じフラグが、親ディレクトリまたは単一の blocklet ディレクトリのいずれも受け付けます:

bash
$ arc service start --instance docs514b --home /tmp/arc-svc-docs-514/home-b \
    --blocklet /path/to/arc/blocklets/afs-preview-fixture --host 127.0.0.1 --no-advertise
  Instance: docs514b
  ID:       b719db414c5cc625
  Status:   up
  PID:      95666
  Port:     61498
  URL:      http://127.0.0.1:61498
  Home:     /tmp/arc-svc-docs-514/home-b
  Space:    /tmp/arc-svc-docs-514/home-b/.afs/spaces
  Sources:  /path/to/arc/blocklets/afs-preview-fixture
  Version:  2.0.0-beta.48
  Commit:   5a5316bde
  Checkout: /tmp/arc-svc-docs-514/project
  Host:     127.0.0.1
  Started:  2026-09-10T01:49:56.435Z (up 7s)

この実行の stderr では、省略された banner と AFS Service started の間に Extra blocklet dirs: の行が追加され、Endpoints: の後に Blocklet: ブロックが追加されています:

Starting AFS service...
  Extra blocklet dirs: /path/to/arc/blocklets/afs-preview-fixture
AFS Service started
  Log:  /tmp/arc-svc-docs-514/home-b/.afs/daemon.log
  Build: 2.0.0-beta.48+5a5316bde (debug)
  Exec:  /path/to/arc/runtimes/node/dist/cli.mjs

  Endpoints:
    http://127.0.0.1:61498/            AUP Web Client
    http://127.0.0.1:61498/explorer    Explorer UI
    http://127.0.0.1:61498/ws          WebSocket (Explorer)
    http://127.0.0.1:61498/afs/*       REST API
    http://127.0.0.1:61498/mcp         MCP Streamable HTTP

  Blocklet: afs-preview-fixture
    http://afs-preview-fixture.localhost:61498/
    http://localhost:61498/?blocklet=afs-preview-fixture    (Safari / universal)
bash
$ arc service list
NAME          ID                PORT   STATUS   HOME                          SOURCES
docs514a      b719db414c5cc624  61497  up       /tmp/arc-svc-docs-514/home-a  0
docs514b      b719db414c5cc625  61498  up       /tmp/arc-svc-docs-514/home-b  1

自分がたった今起動したわけではないインスタンスに対しても、statusstart が報告したすべてを報告します —— stdout/stderr の分け方も同じです:

bash
$ arc service status --instance docs514b
  Instance: docs514b
  ID:       b719db414c5cc625
  Status:   up
  PID:      95666
  Port:     61498
  URL:      http://127.0.0.1:61498
  Home:     /tmp/arc-svc-docs-514/home-b
  Space:    /tmp/arc-svc-docs-514/home-b/.afs/spaces
  Sources:  /path/to/arc/blocklets/afs-preview-fixture
  Version:  2.0.0-beta.48
  Commit:   5a5316bde
  Checkout: /tmp/arc-svc-docs-514/project
  Host:     127.0.0.1
  Started:  2026-09-10T01:49:56.435Z (up 3m)

ログのパス、build id、エンドポイント、blocklet の URL、そして(非 loopback バインドの場合の)LAN 診断は stderr に出力されます;記録は stdout に出力されます。startstatus は、同じインスタンスに対して同じ URL を表示します —— どちらもレジストリの http://127.0.0.1:<port> の形式を使います。--json は stderr のブロックを抑制し、代わりにすべてをデータとして持ちます。

プロジェクトのルートが多数の blocklet を公開しているマシンでは、status--blocklet で指名したルートだけを展開し、残りは数だけ報告します —— これは完全な dev checkout に対する実際の取得結果であり、作られた数字ではありません:

  Blocklets: 51 route(s) served — 50 not expanded; `arc service url` or --json lists them all

--json は常に urls.blocklets にすべてのルートを含みます。

bash
$ arc service url --instance docs514b
http://127.0.0.1:61498/

stderr(banner は省略)、start と同じプリンター:

  Blocklet: afs-preview-fixture
    http://afs-preview-fixture.localhost:61498/
    http://localhost:61498/?blocklet=afs-preview-fixture    (Safari / universal)
bash
$ arc service url --instance docs514b --print url
http://127.0.0.1:61498

--print url は、インスタンスの URL だけを stdout に書き込み(この取得では末尾のスラッシュはなし)、exit 0 です。$(arc service url --instance NAME) は、その 1 行のままです。blocklet のアドレスが必要なエージェントは、--jsonHost URL(http://afs-preview-fixture.localhost:…)を使います。?blocklet= は Safari のフォールバックであり、RPC のために /blocklets/<name> をマウントするものではありません。

身元フィールド

Version / Commit / Branch / Sha / Checkout は、あなたが入力した arc ではなく、このインスタンスを提供しているバイナリを表します。デーモンはこれらを起動時に計算し、自身のレジストリ行に書き込みます。そのため、どのシェルから実行した status も、curl http://127.0.0.1:<port>/.well-known/arc/instance と同じ値を報告します。

up のインスタンスに対しては、status はデーモンに直接問い合わせ、その答えを live の下に報告します:

json
"live": {
  "ok": true,
  "url": "http://127.0.0.1:61498/.well-known/arc/instance",
  "record": { "version": "2.0.0-beta.48", "commit": "5a5316bde", "pid": 95666, "port": 61498, "blocklets": 1 }
}

レジストリの行とデーモンが一致しない場合 —— これは arc upgrade が行うこと、つまり稼働中のプロセスの下でバイナリを入れ替えることによって起こります —— 両方の値が報告され、異なるフィールドが drift の下に列挙されます:

json
"drift": [{ "field": "version", "registry": "2.0.0-beta.48", "live": "2.0.0-beta.49" }]

この探査はベストエフォートです。プロセスは生きているものの、時間内に loopback から何も応答しない場合 —— ここでは SIGSTOP で一時停止させたデーモンから取得したもので、それゆえ厳密な文言は接続拒否ではなくタイムアウトになります —— status はレジストリのビューにフォールバックし、その旨を報告します;終了コードは変わりません:

  Live:     unreachable (The operation was aborted due to timeout) — registry values only

(単に無応答なだけでなく完全に失われたデーモンは、代わりに dead を報告します —— 状態 を参照 —— そしてまったく探査されません。)

Restart、logs、stop、delete、gc

restart は記録を再利用します。新しい --port は受け付けません:

bash
$ arc service restart --instance docs514b
  Instance: docs514b
  ID:       b719db414c5cc625
  Status:   up
  PID:      95700
  Port:     61498
  URL:      http://127.0.0.1:61498
  Home:     /tmp/arc-svc-docs-514/home-b
  Space:    /tmp/arc-svc-docs-514/home-b/.afs/spaces
  Sources:  /path/to/arc/blocklets/afs-preview-fixture
  Version:  2.0.0-beta.48
  Commit:   5a5316bde
  Checkout: /tmp/arc-svc-docs-514/project
  Host:     127.0.0.1
  Started:  2026-09-10T01:58:00.472Z (up 3s)

stderr は AFS Service restartedstarted ではなく)と表示します。それ以外は、上の start の stderr と同じ形です。

bash
$ arc service logs --instance docs514b
{"ts":"2026-09-10T01:58:01.683Z","level":"info","service":"arc-node","ns":"node:boot","message":"boot vault-ready +652ms"}
{"ts":"2026-09-10T01:58:01.686Z","level":"info","service":"arc-node","ns":"node:boot","message":"boot did-space-ready +656ms"}
{"ts":"2026-09-10T01:58:02.235Z","level":"info","service":"arc-node","ns":"node:boot","message":"[code-agents] recover ok: claimed=0 marked=0 orphaned=0 deferred=0 locksScanned=0 locksReclaimed=0"}

その後の boot の行は省略されています。--follow は既存の行を再表示してからストリームします。

bash
$ arc service stop --instance docs514b
Service stopped: docs514b

stopped のインスタンスも、最後の pid / port / URL を報告し続け、それらが過去の値であることを言葉で示します(exit 3):

bash
$ arc service status --instance docs514b
  Instance: docs514b
  ID:       b719db414c5cc625
  Status:   stopped
  PID:      95700
  Port:     61498
  URL:      http://127.0.0.1:61498
  Home:     /tmp/arc-svc-docs-514/home-b
  Space:    /tmp/arc-svc-docs-514/home-b/.afs/spaces
  Sources:  /path/to/arc/blocklets/afs-preview-fixture
  Version:  2.0.0-beta.48
  Commit:   5a5316bde
  Checkout: /tmp/arc-svc-docs-514/project
  Host:     127.0.0.1
  Started:  2026-09-10T01:58:00.472Z
  Note:     PID / Port / URL above are the LAST KNOWN values from this instance's previous run, not a live process.

--json では同じ事実が "lastKnown": true として表れ、live キーはありません —— stopped のインスタンスは探査されません。list は PORT に <port>* を表示します(状態 を参照)。同じ名前で start すると記録が再利用されます。

本ページの各コードブロックは、それぞれ独立した取得結果です。インスタンス名は各節をまたいで繰り返し使われています(docs514adocs514b)が、これは 1 つの連続したセッションであることを意味しません —— まさにそれが理由で、以下の 4 つの delete の例では、いずれも新しい使い捨ての名前を使っており、前の例が既に削除した名前を再度削除しているわけではありません。

delete は、成功時の出力形式を 2 つ持つようになりました。arc afs delete と同じ方法で view によって分かれています(ArcBlock/arc#6055):デフォルト(machine、非 TTY)のビューは、素の OK <name> —— write の形式 —— で、--view human は何が削除されたかを名指しする文章です。以下の両インスタンスは、削除前はいずれも stopped でした:

bash
$ arc service delete --instance docs514x
OK docs514x

$ arc service delete --instance docs514y --view human
Removed instance "docs514y"

稼働中のインスタンスの delete は、--force なしでは失敗します —— これは、ArcBlock/arc#6301 のプレフィックス修正が実際に現れる場所でもあります:本ページのすべての失敗行は、以前の取得ではプレフィックスがまったくなかったのに対し、今では ERROR: で始まります:

bash
$ arc service delete --instance docs514z
ERROR: instance "docs514z" is running. stop it first, or use --force

--force は先に停止し、その後削除します —— 上記の拒否の accept-path 側の対応であり、同じインスタンス、同じ verb です:

bash
$ arc service delete --instance docs514z --force --yes
OK docs514z

--dry-run は何にも触れずにプレビューし、stopped でも running でもどちらのインスタンスでも動作します:

bash
$ arc service delete --instance docs514w --dry-run
Would delete instance docs514w at /tmp/arc-svc-docs-514/home-w (dry-run)

$ arc service delete --instance docs514w --dry-run --json
{
  "name": "docs514w",
  "removed": false,
  "home": "/tmp/arc-svc-docs-514/home-w",
  "dryRun": true,
  "homeRemoved": true
}

ここでの homeRemoved は「実際に実行すれば home ディレクトリが削除されるはずである」ことを意味し、何かが実際に削除されたことを意味するものではありません —— 同じオブジェクト上の removed: false / dryRun: true が既にそのことを示しています;homeRemoved だけでなく、この 3 つのフィールドを合わせて読んでください。

--yes は対話的な TTY の確認プロンプトをスキップします。実際には、これは本物の端末の外ではほとんど問題になりません:確認は設計上 TTY 限定です(interactive は stdin と stdout の両方が本物の TTY であることを要求します)。そのため、エージェント、パイプ、テスト —— 本ページの dump を作るために使われたものすべて —— は、--yes があってもなくても、プロンプトを一度も見ることなく進みます。それでも、いつか端末から実行されるかもしれないスクリプトのためには渡しておいてください。

gcdeadstop を経ずにプロセスが失われたもの)だけを収集します。stopped は残されます:

bash
$ arc service gc
Collected 1 dead instance
  docs514dead
kept 1

$ arc service gc
No dead instances to collect

その後も liststoppedup の行を表示し続けました;docs514dead はなくなっていました。dead が何も残っていない場合、gc は 1 行でそう告げ、それでも exit 0 します。(上記とは別の)新しく空になったレジストリ(そもそも 0 個のインスタンスしか登録されていない)は、kept が空の答えではなく 0 まで下がる本物のカウントであることを示します —— これは、次の --print の節が扱う「零個の文字を出力する、falsy ではない」という同じルールです:

bash
$ arc service gc --json
{
  "removed": [],
  "kept": 0
}

--print

--print <field> は、コマンドの通常の結果から 1 つのフィールドを読み取り、--json/--view を完全に迂回して、プレーンテキストとして stdout に書き込みます。ArcBlock/arc#6301 は、フィールドがいつ「値なし」とみなされるかの判定を変更しました:以前はfalsy でした(false0"" はすべて「存在しない」として扱われ、何も出力せずに exit 0 していました —— これは本物の空の答えと区別できません);今は零個の文字を出力するかどうかです。false0 はそれぞれ 5 文字と 1 文字なので、本物の答えであり、exit 0 のままです。フィールドを見つけるのに使われるのは Object.hasOwn であり、in(これはプロトタイプチェーンをたどり、--print __proto__{} を答えてしまう)ではありません。

Accept path —— 実際の値がブーリアンの false であるフィールドも、それでも出力され exit 0 します(このインスタンスは --no-advertise で起動されています):

bash
$ arc service status --instance docs514b --print advertise
false

Accept path —— 実際の値が数値の 0 であるフィールドも、それでも出力され exit 0 します(空のレジストリなので、gckept カウントは正真正銘のゼロです):

bash
$ arc service gc --print kept
0

(同じルールが 0 のポートにも適用されます;この特定のケースは実際のバインドからは発生しません —— OS が実際にポート 0 を返すことは決してないため —— そのため CLI 自身の正控(positive-control)単体テストは、合成した { port: 0 } オブジェクトに対して直接それを実行します:runtimes/node/test/daemon/service-print-contract.test.ts:135。)

Reject path —— 存在するが値を持たないフィールド(.git のない checkout 上の branch / sha / commit)は、黙って空を出力するのではなく拒否されます:

bash
$ arc service status --instance docs514b --print branch
$ echo $?
1

stderr(banner は省略):ERROR: field "branch" in result has no value

Reject path —— 結果にまったく存在しないフィールドは、異なるメッセージになりますが、終了コードは同じです:

bash
$ arc service status --instance docs514b --print nosuchfield
$ echo $?
1

stderr:ERROR: no field "nosuchfield" in result

--print "" は以前は「--print が渡されなかった」ものとして扱われ、完全なデフォルトのビューにフォールスルーしていました —— そのため、$FIELD が未設定の状態で arc service status --print "$FIELD" を実行すると、失敗するのではなく human view 全体が表示されていました。今はそうなりません:空のフィールド名も他のフィールド名と同様に検索され、存在せず、上の nosuchfield と同じ方法で拒否されます:

bash
$ arc service status --instance docs514b --print ""
$ echo $?
1

stderr:ERROR: no field "" in result

--json の契約

JSON は成功時にのみ stdout に出力されます。拒否された場合、stdout は常に空です(0 バイト)—— 一部だけでなく、すべての失敗がそうです。これは、拒否パスが { "error": "…" } を stdout に置くと主張していた本ページの以前のバージョンを訂正するものです;それは arc service にとって一度も真ではなく、ArcBlock/arc#6301 の修正メモも、修正後の契約が 9 個の拒否シーンすべてで明確に「stdout 0 バイト」であることを確認しています。エラーメッセージは stderr に出力され、ERROR: のプレフィックスが付き、プロセスは非ゼロで終了します。

異なる 2 種類の拒否は、どちらもこの同じ「stdout 0 バイト」という形に落ち着きます —— これらは異なるコードパスから来ているため、並べて確認する価値があります:

bash
$ arc service status --instance no-such-xyz --json
$ echo $?
1

stderr:ERROR: no instance named "no-such-xyz". `arc service list` shows 2—— これは action 自身の executor にはまったく到達しません;先にインスタンスの解決が失敗します。

bash
$ arc service delete --instance docs514b --json
$ echo $?
1

stderr:ERROR: instance "docs514b" is running. stop it first, or use --force—— これは delete 自身の executor の中で動作し、この executor はインスタンスの解決に成功した後で失敗を決定します。

どちらの場合も同じ形です:空の stdout、ERROR: プレフィックス付きの stderr、非ゼロの終了コード。--json はこれらのいずれも変えません —— それが変えるのは、成功した実行が表示していたはずのものだけです。

成功時、JSON は human view の上位集合です。端末が表示するすべての URL、ホスト名、パスは、ペイロードのどこかにあります —— logFileendpointsblockletUrlslanbuild —— そのため、エージェントは stderr をスクレイプする必要が一切ありません。

bash
$ arc service status --instance docs514b --json
{
  "name": "docs514b",
  "id": "b719db414c5cc625",
  "status": "up",
  "port": 61498,
  "url": "http://127.0.0.1:61498",
  "home": "/tmp/arc-svc-docs-514/home-b",
  "spaceRoot": "/tmp/arc-svc-docs-514/home-b/.afs/spaces",
  "blocklets": [
    "/path/to/arc/blocklets/afs-preview-fixture"
  ],
  "pid": 95666,
  "version": "2.0.0-beta.48",
  "commit": "5a5316bde",
  "branch": null,
  "sha": null,
  "checkout": "/tmp/arc-svc-docs-514/project",
  "startedAt": "2026-09-10T01:49:56.435Z",
  "urls": {
    "ui": "http://127.0.0.1:61498/",
    "blocklets": {
      "afs-preview-fixture": "http://127.0.0.1:61498/?blocklet=afs-preview-fixture"
    }
  },
  "host": "127.0.0.1",
  "advertise": false,
  "uptime": "3s",
  "logFile": "/tmp/arc-svc-docs-514/home-b/.afs/daemon.log",
  "endpoints": [
    { "url": "http://127.0.0.1:61498/", "label": "AUP Web Client" },
    { "url": "http://127.0.0.1:61498/explorer", "label": "Explorer UI" },
    { "url": "http://127.0.0.1:61498/ws", "label": "WebSocket (Explorer)" },
    { "url": "http://127.0.0.1:61498/afs/*", "label": "REST API" },
    { "url": "http://127.0.0.1:61498/mcp", "label": "MCP Streamable HTTP" }
  ],
  "blockletUrls": {
    "afs-preview-fixture": [
      { "url": "http://afs-preview-fixture.localhost:61498/", "label": "" },
      { "url": "http://localhost:61498/?blocklet=afs-preview-fixture", "label": "(Safari / universal)" }
    ]
  },
  "build": {
    "id": "2.0.0-beta.48+5a5316bde (debug)",
    "exec": "/path/to/arc/runtimes/node/dist/cli.mjs"
  },
  "live": {
    "ok": true,
    "url": "http://127.0.0.1:61498/.well-known/arc/instance",
    "record": {
      "version": "2.0.0-beta.48",
      "commit": "5a5316bde",
      "branch": null,
      "sha": null,
      "checkout": "/tmp/arc-svc-docs-514/project",
      "pid": 95666,
      "port": 61498,
      "blocklets": 1
    }
  }
}

フィールドのグループ:最初の 10 個のキーがインスタンスの記録です;versionurls はレジストリの行から来ます;logFilebuild は human view が表示していたものです;live / drift は稼働中のデーモンとの照合結果です。インスタンスが非 loopback アドレスにバインドされている場合、何もない代わりに lan が現れ、LAN 診断全体を lines として持ちます。

list は各インスタンスについて記録用のキーを報告し、表示用の事実のキーは省きます —— 行ごとに banner は表示せず、探査も行いません。ここでは sha に値が入っている(本物の git checkout)のに対し、上の単一インスタンスの例では null.git のない checkout)だったことに注意してください —— どちらも本物で、2 回の異なる実行によるものです:

bash
$ arc service list --json
{
  "instances": [
    {
      "name": "docs514a",
      "id": "b719db414c5cc624",
      "status": "up",
      "port": 61497,
      "url": "http://127.0.0.1:61497",
      "home": "/tmp/arc-svc-docs-514/home-a",
      "spaceRoot": "/tmp/arc-svc-docs-514/home-a/.afs/spaces",
      "blocklets": [],
      "pid": 95665,
      "version": "2.0.0-beta.48",
      "commit": "5a5316bde",
      "branch": null,
      "sha": "5a5316bdece751ee90416382b3ad851e565afa22",
      "checkout": "/tmp/arc-svc-docs-514/project",
      "startedAt": "2026-09-10T01:49:44.207Z",
      "urls": { "ui": "http://127.0.0.1:61497/", "blocklets": {} },
      "host": "localhost",
      "advertise": true,
      "uptime": "5s"
    }
  ]
}

list の各行の version は、各インスタンスが実際に実行しているバイナリです —— どのインスタンスに upgrade が届かなかったかを、すぐに確認する方法です。

bash
$ arc service stop --instance docs514b --json
{
  "name": "docs514b",
  "id": "b719db414c5cc625",
  "stopped": true,
  "pid": 95700
}

$ arc service delete --instance docs514b --json
{
  "name": "docs514b",
  "removed": true,
  "home": "/tmp/arc-svc-docs-514/home-b"
}

--view json--json と同じチャンネルです。

logs はストリームであり、--json を拒否します —— 他のすべての拒否と同じ「stdout 0 バイト / stderr」の形です:

bash
$ arc service logs --instance docs514a --json
$ echo $?
1

stderr:ERROR: logs is a stream and does not support --json

yargs レベルのエラー(未知の verb、必須引数の欠落)も、--json を付けても JSON を出力しません —— これらは --json が意味を持つ地点にまったく到達せず、代わりにサブコマンドのヘルプを stderr に表示します(失敗 を参照)。

失敗

既に up であるインスタンスを start しようとする(exit 1)。このヒントは、今では起動時に使った --home も名指しします。単なる verb だけではありません。なぜなら、start 時に --home が渡されていた場合、restart にもそれが必要だからです:

bash
$ arc service start --instance docs514b --home /tmp/arc-svc-docs-514/home-b
ERROR: instance "docs514b" is already running
       pid 95666, port 61498, started 39s ago
       use `arc service restart --instance docs514b --home /tmp/arc-svc-docs-514/home-b` or pick another name

restart --port(および他の設定専用のフラグ —— どれが該当し、なぜ --home が違うかは フラグ を参照)(exit 1):

bash
$ arc service restart --instance docs514b --port 4910
ERROR: restart does not reconfigure. use `stop` then `start` to change --port

--space-root は既に DID Space でなければなりません:

bash
$ arc service start --instance docs514c --home /tmp/arc-svc-docs-514/home-c \
    --space-root /tmp/arc-svc-docs-514/not-a-space
ERROR: /tmp/arc-svc-docs-514/not-a-space is not a DID Space. create it with `arc space init`

未知の verb(exit 5)。yargs はこれを「positional が足りない / 間違っている」として扱い、グループの --help--help の下に全文を掲載)を stderr に表示します。両者は合わせて 1 回だけプレフィックスが付きます:

bash
$ arc service foo
ERROR: Invalid values:
  Argument: action, Given: "foo", Choices: list, start, stop, restart, status, delete, gc, url, logs

arc service

Manage AFS background service

Commands:
  arc service list     List every local instance with its status, port and home
                       [aliases: ls, ps]
  ...

verb をまったく指定しない arc service は、同じ仕組みですが理由が異なります(exit 5):

bash
$ arc service
ERROR: Not enough non-option arguments: got 0, need at least 1

arc service
...

取り残された位置引数のインスタンス名(verb の後にそのまま名前が続き、--instance がない)は、list / gc を含むすべての verb で拒否されます —— 再び同じ仕組みですが、今回はサブコマンド自身--help を表示します(exit 5):

bash
$ arc service status somename
ERROR: positional instance name was removed; use `--instance <name>` / `-i`

arc service status

Report whether an instance is running, and on which port
...

削除・退役したもの

これらは以前は文書化されていましたが、なくなりました:

以前現在
arc service <action> [op] [dir] [options]arc service <verb> [options]
arc service <action> [name]arc service <verb> --instance <name> / -i
--blocklet-dir--blocklet(親または単一のディレクトリ)
--saveインスタンスに自動的に記録される
ARC_BLOCKLET_DIRなくなった。--blocklet を渡す
arc service blocklet-dir add/listなくなった
arc service restart --port 4900restart は設定用フラグを拒否する
ARC_HOME退役した。警告して無視する

本当に削除されたフラグは、もはや専用のエラーを受け取りません —— 今では yargs 自身の未知引数ハンドラに当たり、それが「Did you mean?」という提案を出し、サブコマンドの --help を出力します:

bash
$ arc service start --instance docs514a --home /tmp/arc-svc-docs-514/home-a --blocklet-dir /tmp/nope
ERROR: Unknown arguments: blocklet-dir, blockletDir

Did you mean?
  --blocklet

arc service start
...

$ arc service start --instance docs514a --home /tmp/arc-svc-docs-514/home-a --save
ERROR: Unknown argument: save

arc service start
...

ARC_HOME は、サブコマンド化の影響を受けません —— 警告は今も発生し、今も banner の前に自身の行として現れ、ERROR: のプレフィックスは付きません(これは warning であり fail() ではないため、ArcBlock/arc#6301 の統一の対象になりません):

bash
$ ARC_HOME=/tmp/retired-home arc service list
warning: ARC_HOME is ignored; instance root comes from the service name and --home, not env

--help

グループレベルの --help —— 未知の verb もこれを出力します(失敗 を参照):

text
arc service

Manage AFS background service

Commands:
  arc service list     List every local instance with its status, port and home
                       [aliases: ls, ps]
  arc service start    Start an instance, creating it on first use
  arc service stop     Stop a running instance, keeping its record and data
  arc service restart  Restart an instance from its recorded config (does not
                       reconfigure — stop then start for that)
  arc service status   Report whether an instance is running, and on which port
  arc service delete   Delete an instance: its record and its data [aliases: rm,
                       remove]
  arc service gc       Drop registry records whose process is gone [aliases:
                       prune]
  arc service url      Print an instance's base URL (and its blocklets')
  arc service logs     Print an instance's daemon log  [aliases: log]

Options:
      --json      Output in JSON format  [boolean]
      --view      Output view format (json is equivalent to --json). llm is
                  accepted globally; commands without an llm renderer fail
                  closed (declare ⇒ execute; arc#6037). [string] [choices:
                  "default", "llm", "human", "json"] [default: "default"]
      --home      Instance root — to pick which instance, use --instance. Used
                  by `arc service start` (create) and `arc did init` (identity).
                  In `--standalone`, sets DID Space and configDir; mounts come
                  from a cwd-walk of `.afs-config/config.toml`, not from --home.
                  [string]
  -i, --instance  Named local ARC instance this command operates against (see
                  `arc service list`). Omit for the default instance. [string]
      --print     Print one result field (e.g. url, port) as plain text — not a
                  view; overrides --json/--view [string]
  -h, --help      Show help  [boolean]
  -v, --version   Show version number  [boolean]

Examples:
  arc service list
      Show every local instance
  arc service start -i alice
      Start (or create) named instance alice
  arc service status -i alice
      Is alice running, and on which port?
  arc service logs -i alice
      Print alice's recent daemon logs
  arc service stop -i alice
      Stop alice without deleting it
  arc service delete -i alice --dry-run
      Preview deleting instance alice without removing it

9 個のサブコマンドのうち、自身の --help を 2 つだけ示します —— start(フラグ集合が最も広い)と delete(破壊的な verb 専用の 3 つのフラグを持つもの)です —— 残り 7 個が従う形を示すためです:

text
arc service start

Start an instance, creating it on first use

Options:
      --json        Output in JSON format  [boolean]
      --view        Output view format (json is equivalent to --json). llm is
                    accepted globally; commands without an llm renderer fail
                    closed (declare ⇒ execute; arc#6037). [string] [choices:
                    "default", "llm", "human", "json"] [default: "default"]
      --home        Instance root — to pick which instance, use --instance. Used
                    by `arc service start` (create) and `arc did init`
                    (identity). In `--standalone`, sets DID Space and configDir;
                    mounts come from a cwd-walk of `.afs-config/config.toml`,
                    not from --home. [string]
  -i, --instance    Named local ARC instance this command operates against (see
                    `arc service list`). Omit for the default instance. [string]
      --print       Print one result field (e.g. url, port) as plain text — not
                    a view; overrides --json/--view [string]
      --port        Port to listen on (0-65535). 0 = auto-assign. Omit: default
                    uses 4900; named instances use the recorded port or
                    auto-assign [number]
      --host        Bind address (localhost, 0.0.0.0, ::, or a unicast IP)
                    [string] [default: "localhost"]
      --advertise   Advertise this instance over mDNS when bind is non-loopback
                    (use --no-advertise to disable) [boolean] [default: true]
      --blocklet    Blocklet-parent or single-blocklet dir to serve
                    (repeatable). Recorded on the instance. [array]
      --space-root  Folder-as-DID-Space created with `arc space init` (omit to
                    derive from home) [string]
  -h, --help        Show help  [boolean]
  -v, --version     Show version number  [boolean]

Examples:
  arc service start -i alice
      Start (or create) named instance alice

arc service delete

Delete an instance: its record and its data

Options:
      --json      Output in JSON format  [boolean]
      --view      Output view format (json is equivalent to --json). llm is
                  accepted globally; commands without an llm renderer fail
                  closed (declare ⇒ execute; arc#6037). [string] [choices:
                  "default", "llm", "human", "json"] [default: "default"]
      --home      Instance root — to pick which instance, use --instance. Used
                  by `arc service start` (create) and `arc did init` (identity).
                  In `--standalone`, sets DID Space and configDir; mounts come
                  from a cwd-walk of `.afs-config/config.toml`, not from --home.
                  [string]
  -i, --instance  Named local ARC instance this command operates against (see
                  `arc service list`). Omit for the default instance. [string]
      --print     Print one result field (e.g. url, port) as plain text — not a
                  view; overrides --json/--view [string]
      --force     Stop a running instance before deleting it [boolean] [default:
                  false]
      --dry-run   Print what would be removed without deleting it [boolean]
                  [default: false]
      --yes       Skip the TTY confirmation prompt  [boolean] [default: false]
  -h, --help      Show help  [boolean]
  -v, --version   Show version number  [boolean]

Examples:
  arc service delete -i alice --dry-run
      Preview deleting instance alice without removing it

残りの 7 個(stoprestartstatusgcurllogs、およびグループ自身の list)は、上の start/delete と同じ形に従いますが、本ページの フラグ 表がすでに start/delete/logs に限定しているフラグを除きます —— logs が追加するのは --follow だけです。

--json--view--home--instance / -i はグローバルです(一度だけ宣言され、すべての arc コマンドに適用されます)。--home はインスタンスのルートです;どのインスタンスにするかを選ぶには --instance を使います。概要 を参照してください。