diff --git a/.yoi/tickets/00001KXT5ZDRE/artifacts/.gitkeep b/.yoi/tickets/00001KXT5ZDRE/artifacts/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/.yoi/tickets/00001KXT5ZDRE/item.md b/.yoi/tickets/00001KXT5ZDRE/item.md new file mode 100644 index 00000000..06bb473f --- /dev/null +++ b/.yoi/tickets/00001KXT5ZDRE/item.md @@ -0,0 +1,31 @@ +--- +title: 'Run dev workspace process actions detached by default' +state: 'closed' +created_at: '2026-07-18T08:37:37Z' +updated_at: '2026-07-18T08:40:59Z' +assignee: null +queued_by: 'yoi ticket' +queued_at: '2026-07-18T08:38:38Z' +--- + +## 背景 + +`scripts/dev-workspace.sh` は backend/runtime/frontend の stop/start を扱うため、API worker が依存している process を foreground tool call 中に停止すると tool result 永続化前にセッションを壊す可能性がある。 + +呼び出し元が `start` / `stop` / `restart` を実行した時点では即座に戻り、実際の mutating action は detached scheduled job として後で走るようにする。 + +## 要件 + +- `start` / `stop` / `restart` は既定で detached background job として schedule する。 +- 既定 delay は 60 秒とし、呼び出し元が tool result を返す時間を確保する。 +- scheduled job の pid と log path を呼び出し元に表示する。 +- `status` / `help` は同期実行のままにする。 +- デバッグ用に foreground 実行へ戻せる環境変数を用意する。 +- 実装中に mutating action は実行しない。 + +## 受け入れ条件 + +- `bash -n scripts/dev-workspace.sh` が通る。 +- `scripts/dev-workspace.sh --help` に detached 既定挙動と override が表示される。 +- `scripts/dev-workspace.sh status` は引き続き mutation なしで動く。 +- `start` / `stop` / `restart` の実処理分岐は内部 foreground mode 経由に限定され、通常呼び出しでは detached schedule だけを行う。 diff --git a/.yoi/tickets/00001KXT5ZDRE/resolution.md b/.yoi/tickets/00001KXT5ZDRE/resolution.md new file mode 100644 index 00000000..773a033b --- /dev/null +++ b/.yoi/tickets/00001KXT5ZDRE/resolution.md @@ -0,0 +1 @@ +`scripts/dev-workspace.sh` now schedules `start`, `stop`, and `restart` as detached background jobs by default, returning schedule/log details immediately. `status` and `help` remain synchronous, and `YOI_DEV_WORKSPACE_FOREGROUND=1` preserves an explicit foreground/debug path. diff --git a/.yoi/tickets/00001KXT5ZDRE/thread.md b/.yoi/tickets/00001KXT5ZDRE/thread.md new file mode 100644 index 00000000..c261b547 --- /dev/null +++ b/.yoi/tickets/00001KXT5ZDRE/thread.md @@ -0,0 +1,92 @@ + + +## 作成 + +LocalTicketBackend によって作成されました。 + +--- + + + +## Intake summary + +Marked ready by `yoi ticket state`. + +--- + + + +## State changed + +Marked ready by `yoi ticket state`. + + +--- + + + +## State changed + +Ticket を `yoi ticket` が queued にしました。 + + +--- + + + +## State changed + +State changed to `inprogress`. + + +--- + + + +## Implementation report + +`scripts/dev-workspace.sh` の mutating actions を既定で detached scheduled job として実行するように変更した。 + +変更点: +- `start` / `stop` / `restart` は通常呼び出しでは実処理をせず、detached job を schedule して即時 return する。 +- 既定 delay は `YOI_DEV_ACTION_DELAY_SECONDS=60`。 +- 呼び出し元には `scheduled_action` / `scheduled_pid` / `scheduled_after_seconds` / `scheduled_log` を表示する。 +- scheduled job は `YOI_DEV_WORKSPACE_FOREGROUND=1` を付けて同じ script を再入実行し、そこで実際の start/stop/restart を行う。 +- `status` / `help` は同期実行のまま。 +- デバッグ用に `YOI_DEV_WORKSPACE_FOREGROUND=1` で foreground 実行できるようにした。 +- help に detached 既定挙動と環境変数 override を追記した。 + +検証: +- `bash -n scripts/dev-workspace.sh` +- `scripts/dev-workspace.sh --help >/dev/null` +- `scripts/dev-workspace.sh status >/dev/null` +- `git diff --check` + +実行しなかったこと: +- `scripts/dev-workspace.sh start` +- `scripts/dev-workspace.sh stop` +- `scripts/dev-workspace.sh restart` + +理由: +- mutating action は schedule 後に backend/runtime/frontend を止めるため、この作業中には実行しない。 + + +--- + + + +## State changed + +Ticket を closed にしました。 + + +--- + + + +## 完了 + +`scripts/dev-workspace.sh` now schedules `start`, `stop`, and `restart` as detached background jobs by default, returning schedule/log details immediately. `status` and `help` remain synchronous, and `YOI_DEV_WORKSPACE_FOREGROUND=1` preserves an explicit foreground/debug path. + + +--- diff --git a/scripts/dev-workspace.sh b/scripts/dev-workspace.sh index 29a9e654..1660b0bc 100755 --- a/scripts/dev-workspace.sh +++ b/scripts/dev-workspace.sh @@ -12,6 +12,8 @@ FRONTEND_HOST="${YOI_DEV_FRONTEND_HOST:-0.0.0.0}" FRONTEND_PORT="${YOI_DEV_FRONTEND_PORT:-5173}" RUNTIME_ENABLED="${YOI_DEV_RUNTIME_ENABLED:-1}" +ACTION_DELAY_SECONDS="${YOI_DEV_ACTION_DELAY_SECONDS:-60}" +FOREGROUND_MODE="${YOI_DEV_WORKSPACE_FOREGROUND:-0}" usage() { cat <>"$job_log" 2>&1 < /dev/null & + + printf 'scheduled_action=%s\n' "$action" + printf 'scheduled_pid=%s\n' "$!" + printf 'scheduled_after_seconds=%s\n' "$ACTION_DELAY_SECONDS" + printf 'scheduled_log=%s\n' "$job_log" +} + +run_mutating_action() { + local action="$1" + if [[ "$FOREGROUND_MODE" != "1" ]]; then + schedule_detached_action "$action" + return 0 + fi + case "$action" in start) start_all @@ -287,6 +329,25 @@ main() { restart) restart_runtime_backend ;; + *) + printf 'unknown mutating action: %s\n' "$action" >&2 + return 2 + ;; + esac +} + +main() { + local action="${1:-}" + case "$action" in + start) + run_mutating_action start + ;; + stop) + run_mutating_action stop + ;; + restart) + run_mutating_action restart + ;; status) status_all ;;