@@ -290,7 +290,8 @@ def _dispatch_lifecycle(args) -> int:
290290 'up' : lambda : cmd_up (project_name = project_name ,
291291 scale = getattr (args , 'scale' , None ),
292292 open_editor = getattr (args , 'open_editor' , None ),
293- open_index = getattr (args , 'open_index' , None )),
293+ open_index = getattr (args , 'open_index' , None ),
294+ open_terminal = getattr (args , 'open_terminal' , None )),
294295 'down' : lambda : cmd_down (),
295296 'login' : lambda : cmd_login (index = getattr (args , 'index' , '1' )),
296297 'ps' : lambda : cmd_ps (all_containers = getattr (args , 'all' , False )),
@@ -412,9 +413,72 @@ def _maybe_open_editor(project_name: str, open_flag: Optional[bool],
412413 logger .warning ("エディタの自動オープンに失敗しましたがデプロイは成功しています: %s" , e )
413414
414415
416+ def _maybe_place_terminal_task (project_name : str , open_flag : Optional [bool ],
417+ open_index : Optional [int ], scale : int ,
418+ compose_file = None ) -> None :
419+ """`up` 後、開く dev コンテナの作業ディレクトリへ folderOpen ターミナル tasks.json を配置。
420+
421+ フォルダを開いた時に統合ターミナルを自動表示するための ``.vscode/tasks.json`` を、
422+ 対象 dev インスタンスのワークスペース (``/work/$GIT_REPO``) に置く。作業ディレクトリは
423+ コンテナ内 (named volume) のためホストから直接書けず、起動済みコンテナへ ``docker exec``
424+ で書き込む。**既存の ``.vscode/tasks.json`` があれば一切触らない**。
425+
426+ 有効判定は ``open_flag`` (CLI ``--open-terminal``/``--no-open-terminal``) が優先、None なら
427+ env ``DEVBASE_OPEN_TERMINAL`` (既定 ON)。配置失敗は warning に握り潰し ``up`` を倒さない。
428+ ``open_index`` は開くインスタンスに合わせる (範囲外は 1 へフォールバック)。
429+ """
430+ from devbase .editor import opener
431+
432+ enabled = open_flag if open_flag is not None else opener .is_open_terminal_enabled ()
433+ if not enabled :
434+ return
435+
436+ if open_index is None :
437+ raw = os .environ .get ('DEVBASE_OPEN_INDEX' )
438+ try :
439+ open_index = int (raw ) if raw else 1
440+ except ValueError :
441+ open_index = 1
442+ if not (1 <= open_index <= scale ):
443+ open_index = 1
444+
445+ if compose_file is None and _SCALE_COMPOSE_FILE .exists ():
446+ compose_file = _SCALE_COMPOSE_FILE
447+
448+ dev_service_name = get_dev_service_name ()
449+ container = opener .resolve_container_name (dev_service_name , project_name ,
450+ open_index , compose_file = compose_file )
451+ workdir = opener .resolve_workdir (os .environ , project_name )
452+ content = opener .build_folder_open_tasks_json ()
453+
454+ # 既存があれば書かず、無ければ stdin から書き込む (冪等)。workdir は引数で渡し
455+ # シェル内クォートを避ける ($1)。
456+ script = (
457+ 'set -e; d="$1/.vscode"; mkdir -p "$d"; '
458+ 'if [ -e "$d/tasks.json" ]; then echo keep; '
459+ 'else cat > "$d/tasks.json"; echo placed; fi'
460+ )
461+ try :
462+ proc = subprocess .run (
463+ ["docker" , "exec" , "-i" , container , "sh" , "-c" , script , "_" , workdir ],
464+ input = content , text = True , capture_output = True , timeout = 15 ,
465+ )
466+ except Exception as e : # noqa: BLE001 - 配置失敗で up を倒さない
467+ logger .warning ("ターミナル用 tasks.json の配置に失敗しましたが続行します: %s" , e )
468+ return
469+ if proc .returncode != 0 :
470+ logger .warning ("ターミナル用 tasks.json の配置に失敗しましたが続行します: %s" ,
471+ (proc .stderr or "" ).strip ())
472+ return
473+ if (proc .stdout or "" ).strip () == "placed" :
474+ logger .info ("[6/6] 統合ターミナル自動表示用 tasks.json を配置: %s/.vscode/tasks.json" ,
475+ workdir )
476+
477+
415478def cmd_up (project_name : str = None , scale : int = None ,
416479 open_editor : Optional [bool ] = None ,
417- open_index : Optional [int ] = None ) -> int :
480+ open_index : Optional [int ] = None ,
481+ open_terminal : Optional [bool ] = None ) -> int :
418482 """Deploy containers with specified scale"""
419483 if project_name is None :
420484 project_name = get_project_name ()
@@ -481,6 +545,9 @@ def cmd_up(project_name: str = None, scale: int = None,
481545 if deploy_script .exists () and deploy_script .is_file ():
482546 _run_deploy_script_for_instances (deploy_script , range (1 , scale + 1 ))
483547
548+ # エディタを開く前に tasks.json を置く (開いた瞬間に folderOpen が効くように)。
549+ _maybe_place_terminal_task (project_name , open_terminal , open_index , scale ,
550+ compose_file = override_file )
484551 _maybe_open_editor (project_name , open_editor , open_index , scale ,
485552 compose_file = override_file )
486553
0 commit comments