# Complete - 03+01_sftp_smb_runtime

## 완료 일시

2026-05-20

## 요약

SFTP/SMB 외부 실행 호출을 `CommandRuntime.runExecutable` 경계로 이전한 1회 리뷰 루프이며 최종 판정은 PASS.

## 루프 이력

| Plan | Review | Verdict | 메모 |
|------|--------|---------|------|
| `plan_cloud_G07_0.log` | `code_review_cloud_G07_0.log` | PASS | SFTP/SMB runtime 이전, fake runtime 회귀 테스트, 직접 `Process.run/start` 제거 확인 |

## 구현/정리 내용

- `FTP`/`SFTP` 생성자에 `CommandRuntime` 주입 경로를 추가하고 Upload/Download SFTP 생성 흐름에서 command runtime을 전달했다.
- SFTP `sshpass` 기반 upload/download/list/delete/createFolder 호출을 `runtime.runExecutable`으로 이전했다.
- SMBAuth `cmd /C net use` 호출을 `runtime.runExecutable`으로 이전하고 exit code 전달을 유지했다.
- `test/oto_command_runtime_test.dart`에 SFTP `list`, SFTP `delete`, SMBAuth fake runtime 검증을 추가했다.

## 최종 검증

- `test -f agent-task/01_command_runtime_api/complete.log` - FAIL; active dependency marker는 없었고 구현 기록에 계획 이탈로 명시됨.
- `test -f agent-task/archive/2026/05/01_command_runtime_api/complete.log` - PASS; archived dependency marker 존재 확인.
- `dart format --output=none --set-exit-if-changed lib/oto/commands/ftp/ftp.dart lib/oto/commands/ftp/upload.dart lib/oto/commands/ftp/download.dart lib/oto/commands/infra/smb_authorize.dart test/oto_command_runtime_test.dart` - PASS; `Formatted 5 files (0 changed)`.
- `dart analyze` - PASS; `avoid_function_literals_in_foreach_calls` info 1건만 보고됨.
- `dart test test/oto_command_runtime_test.dart` - PASS; `+16: All tests passed!`.
- `rg --sort path -n "Process\\.run|Process\\.start" lib/oto/commands -g '!command_runtime.dart' -g '!*.g.dart'` - PASS; 출력 없음.

## 잔여 Nit

- 없음

## 후속 작업

- 없음
