Skip to content

Commit 750f049

Browse files
takemi-ohamaclaude
andcommitted
feat(up): DEVBASE_WORKSPACE で VS Code ワークスペースを開く + 共有ディレクトリ追加
devbase up のエディタ自動オープンと AI 設定 symlink に 2 機能を追加。 1. DEVBASE_WORKSPACE 対応 (opener) - コンテナ内の *.code-workspace 絶対パスを env で指定すると、フォルダ (--folder-uri) ではなくワークスペースファイル (--file-uri) を開く。 - 未指定時は従来どおり /work/$GIT_REPO フォルダを開く。 - env 名は汎用 WORKSPACE (CI が設定し得る) との衝突回避と DEVBASE_EDITOR* 系との命名統一のため DEVBASE_WORKSPACE とする。 2. AI 設定 symlink に share / .kiro を追加 (entrypoint.sh) - /home/ubuntu/share -> /persistent/ai/share (全コンテナ共有の置き場)。 /persistent/ai は全インスタンス共通 volume (devbase_home_ubuntu) のため どのコンテナからも同一実体を参照する。 - /home/ubuntu/.kiro -> /persistent/ai/.kiro。 テスト: resolve_workspace と open_editor の file-uri 経路を追加 (139 passed)。 ドキュメント: docs/user/environment-variables.md に DEVBASE_WORKSPACE を追記。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 212a2c3 commit 750f049

4 files changed

Lines changed: 84 additions & 4 deletions

File tree

containers/base/entrypoint.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,8 @@ AI_SETTINGS=(
211211
".gemini"
212212
".serena"
213213
".ssh"
214+
".kiro"
215+
"share"
214216
)
215217

216218
# Ensure /persistent/ai directory exists

docs/user/environment-variables.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,14 +140,15 @@ devbase はホストマシンの認証情報を自動収集し、コンテナ内
140140

141141
## `devbase up` 後のエディタ自動オープン
142142

143-
`devbase up` 完了後、dev コンテナへ接続した VS Code を自動で開けます(VS Code の「Attach to Running Container」を CLI から起動)。`/work/$GIT_REPO` をワークスペースとして開きます
143+
`devbase up` 完了後、dev コンテナへ接続した VS Code を自動で開けます(VS Code の「Attach to Running Container」を CLI から起動)。既定では `/work/$GIT_REPO` フォルダを開きます(`--folder-uri`)。`DEVBASE_WORKSPACE` を指定するとフォルダの代わりに `*.code-workspace` ワークスペースファイルを開きます(`--file-uri`
144144

145145
これらは `devbase env init` の収集対象外で、プロジェクトの `env``$DEVBASE_ROOT/.env` に手書きする devbase 動作設定です。
146146

147147
| キー | 説明 |
148148
|------|------|
149149
| `DEVBASE_OPEN_EDITOR` | 真(`1`/`true`/`yes`/`on`)で `up` 後にエディタを開く(既定: OFF) |
150150
| `DEVBASE_EDITOR` | 起動コマンド(既定: `code`)。`cursor` / `code-insiders` 等も可 |
151+
| `DEVBASE_WORKSPACE` | 開く `*.code-workspace` ファイルの**コンテナ内絶対パス**(例 `/home/ubuntu/share/work/uttarov2-doc.workspace`)。指定時はフォルダではなくワークスペースを開く。未設定なら従来どおり `/work/$GIT_REPO` フォルダ。共有マウント `/home/ubuntu/share` 配下に置けば全コンテナで共用可 |
151152
| `DEVBASE_OPEN_INDEX` | scale 時に開く dev インスタンス番号(既定: `1`|
152153
| `DEVBASE_EDITOR_SSH_HOST` | Remote-SSH 跨ホスト構成での ssh-remote ホスト名(例 `mac2`)。**通常は `~/.vscode-server` から自動検出**され不要。検出が外れる場合のみ明示。下記「跨ホスト」参照 |
153154
| `DEVBASE_EDITOR_DOCKER_CONTEXT` | 跨ホスト時に ssh 先で使う docker context(既定: ホストの `docker context show`|

lib/devbase/editor/opener.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,26 @@ def resolve_workdir(environ=None, project_name: Optional[str] = None) -> str:
301301
return f"/work/{repo}" if repo else "/work"
302302

303303

304+
def resolve_workspace(environ=None) -> Optional[str]:
305+
"""開く VS Code ワークスペースファイル (``*.code-workspace``) のコンテナ内パス。
306+
307+
``DEVBASE_WORKSPACE`` env にコンテナ内の絶対パス (例
308+
``/home/ubuntu/share/work/uttarov2-doc.workspace``) が指定されていればそれを返す。
309+
未設定・空文字なら None を返し、呼び出し側 (:func:`open_editor`) は従来どおり
310+
:func:`resolve_workdir` のフォルダを ``--folder-uri`` で開く。
311+
312+
ワークスペースファイルはコンテナ内に実在するパスを指す前提 (attach 先は
313+
コンテナ authority のため)。``/home/ubuntu/share`` 等の共有マウント配下に置けば
314+
全コンテナで共用できる。env 名はホスト CI が設定し得る汎用 ``WORKSPACE`` との
315+
衝突を避けるため ``DEVBASE_*`` 接頭辞付きにしている。
316+
"""
317+
env = os.environ if environ is None else environ
318+
value = env.get("DEVBASE_WORKSPACE")
319+
if value is None:
320+
return None
321+
return value.strip() or None
322+
323+
304324
def _detect_ssh_host_from_dirs(server_dirs) -> Optional[str]:
305325
"""複数の VS Code 系サーバーディレクトリの File History を横断して ssh-remote
306326
authority ラベルを推測する。
@@ -493,7 +513,13 @@ def open_editor(*, project_name: str, dev_service_name: str, workdir: str,
493513
ssh_host = (resolve_editor_ssh_host(env, auto_detect=ctx.in_vscode)
494514
if ctx.is_ssh else None)
495515
docker_context = resolve_docker_context(env) if ssh_host else None
496-
uri = build_attach_uri(container, workdir,
516+
# DEVBASE_WORKSPACE があれば *.code-workspace をワークスペースとして開く。VS Code は
517+
# `--file-uri` に渡したパスが .code-workspace 拡張子なら multi-root ワークスペースとして
518+
# 開くため、フォルダを開く `--folder-uri` と URI ターゲット・フラグの両方を切り替える。
519+
workspace = resolve_workspace(env)
520+
open_target = workspace or workdir
521+
uri_flag = "--file-uri" if workspace else "--folder-uri"
522+
uri = build_attach_uri(container, open_target,
497523
ssh_host=ssh_host, docker_context=docker_context)
498524

499525
if plan.action == "print_command":
@@ -505,12 +531,12 @@ def open_editor(*, project_name: str, dev_service_name: str, workdir: str,
505531
"手元の VS Code で次を実行するか、VS Code の Remote-SSH 統合ターミナルから "
506532
"`devbase up` を実行すると自動で開きます:"
507533
)
508-
logger.info(" %s --folder-uri '%s'", quoted, uri)
534+
logger.info(" %s %s '%s'", quoted, uri_flag, uri)
509535
return "print_command"
510536

511537
quoted = " ".join(shlex.quote(c) for c in editor)
512538
logger.info("[editor] %s を起動します (%s)", quoted, plan.reason)
513-
cmd = [*editor, "--folder-uri", uri]
539+
cmd = [*editor, uri_flag, uri]
514540
try:
515541
(launcher or _launch)(cmd, dict(env))
516542
except Exception as e: # noqa: BLE001 - 起動失敗で up を倒さない

tests/editor/test_opener.py

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,20 @@ def test_resolve_workdir_fallback_project_name():
402402
assert opener.resolve_workdir({}, "proj") == "/work/proj"
403403

404404

405+
def test_resolve_workspace_none_when_unset():
406+
assert opener.resolve_workspace({}) is None
407+
408+
409+
def test_resolve_workspace_blank_is_none():
410+
assert opener.resolve_workspace({"DEVBASE_WORKSPACE": " "}) is None
411+
412+
413+
def test_resolve_workspace_returns_path():
414+
env = {"DEVBASE_WORKSPACE": "/home/ubuntu/share/work/uttarov2-doc.workspace"}
415+
assert opener.resolve_workspace(env) == \
416+
"/home/ubuntu/share/work/uttarov2-doc.workspace"
417+
418+
405419
# ---------------------------------------------------------------------------
406420
# decide_action (§2.4 マトリクス全分岐)
407421
# ---------------------------------------------------------------------------
@@ -472,6 +486,43 @@ def test_open_editor_launch_invokes_launcher(monkeypatch):
472486
assert cmd[2].endswith("/work/carmo")
473487

474488

489+
def test_open_editor_launch_uses_file_uri_for_workspace(monkeypatch):
490+
"""DEVBASE_WORKSPACE 指定時は --file-uri でワークスペースファイルを開く。"""
491+
monkeypatch.setattr(opener.shutil, "which", lambda c: "/usr/bin/code")
492+
calls = []
493+
result = opener.open_editor(
494+
project_name="uttarov2-doc", dev_service_name="dev",
495+
workdir="/work/uttarov2-doc",
496+
environ={"DEVBASE_WORKSPACE":
497+
"/home/ubuntu/share/work/uttarov2-doc.workspace"},
498+
isatty=True, launcher=lambda cmd, env: calls.append(cmd),
499+
)
500+
assert result == "launch"
501+
cmd = calls[0]
502+
assert cmd[1] == "--file-uri"
503+
assert cmd[2].startswith("vscode-remote://attached-container+")
504+
assert cmd[2].endswith("/home/ubuntu/share/work/uttarov2-doc.workspace")
505+
506+
507+
def test_open_editor_print_command_file_uri_for_workspace(monkeypatch, caplog):
508+
"""plain SSH の提示コマンドも DEVBASE_WORKSPACE 指定時は --file-uri になる。"""
509+
import logging
510+
monkeypatch.setattr(opener.shutil, "which", lambda c: "/usr/bin/code")
511+
with caplog.at_level(logging.INFO):
512+
result = opener.open_editor(
513+
project_name="uttarov2-doc", dev_service_name="dev",
514+
workdir="/work/uttarov2-doc",
515+
environ={"SSH_CONNECTION": "1.2.3.4 5 6.7.8.9 22",
516+
"DEVBASE_WORKSPACE":
517+
"/home/ubuntu/share/work/uttarov2-doc.workspace"},
518+
isatty=True, launcher=lambda cmd, env: None,
519+
)
520+
assert result == "print_command"
521+
text = "\n".join(r.getMessage() for r in caplog.records)
522+
assert "code --file-uri" in text
523+
assert "uttarov2-doc.workspace" in text
524+
525+
475526
def test_open_editor_launch_nested_uri_under_remote_ssh(monkeypatch):
476527
"""Remote-SSH (in_vscode + ssh) かつ DEVBASE_EDITOR_SSH_HOST 設定時はネスト URI で launch。"""
477528
monkeypatch.setattr(opener.shutil, "which", lambda c: "/usr/bin/code")

0 commit comments

Comments
 (0)