症状
存在しないパスを指定して起動すると、編集画面が出ず No editor open. になる。
./dist/tecode-darwin-arm64 README2.md
期待する挙動は、メモリ上の空バッファとして開いて編集でき、保存した時点でファイルが作成されること。
原因
保存側は既に対応済みで、欠けているのは開く側だけ。
buffer/documentManager.ts の saveNow は、書き込み先の stat が ENOENT を返す場合を「新規ファイルの初回保存」として明示的に許容している(それ以外の stat 失敗のみ中断する)。つまり save() はファイルを作成できる。
不足しているのは次の 2 点。
1. cli/argv.ts の resolveStartupTarget — 存在しないパスを警告して捨て、initialFilePath を付けずに { workspaceRoot: cwd } を返す。
}catch(cause){log.append("warning",{message: `Startup path "${resolved}" does not exist or could not be read (...); starting with no workspace.`,path: resolved,});return{workspaceRoot: cwd};}2. buffer/documentManager.ts の openDocument — readFile の失敗を一律にエラー報告して throw する。ENOENT も他の失敗と区別していない。
try{conststat=awaitfs.stat(path);readonly=stat.size>=LARGE_FILE_THRESHOLD_BYTES;text=awaitfs.readFile(path,"utf8");}catch(cause){// ENOENT も EACCES/EIO と同じ扱いになっているthrowcause;}対応方針
ENOENT だけを「まだ存在しない新規ファイル」として分岐させ、空テキストの文書を作る。EACCES / EIO など他の失敗は現状どおりエラーとして報告し throw する — 権限エラーを空バッファとして黙って開くと、保存時に上書き扱いで混乱を招く。
argv.ts 側も同様に、ENOENT のときだけ新規ファイルとして扱う。
設計上の判断が要る点
- 親ディレクトリが存在しない場合(
a/b/c.txt で a/b がない)。安全側に倒すなら、親が存在するときのみ新規ファイルとして開き、そうでなければ現状どおり警告する。深いパスのタイプミスで黙ってエディタが開く方が分かりにくい。 - 新規バッファを dirty にするか。しない方が良い。未編集の新規バッファで終了時に保存確認が出るのは不自然。結果として、一度も編集せずに保存してもファイルは作られないが、それは妥当な挙動。
- ディレクトリとして解釈すべきパスとの区別。現状
stat の isDirectory() で分岐しているが、存在しないパスではその情報がない。末尾スラッシュの扱いを決める必要がある。
回帰防止
存在しないファイルを指定して起動 → 編集 → 保存 → 実ファイルがディスク上に作成され、内容が一致することを、実 fs を通して検証するテストが必要。documentManager 単体だけでなく、argv の解決を含めた経路で確認したい。
EACCES が空バッファとして開かれてしまわないことも、併せて固定しておきたい。
症状
存在しないパスを指定して起動すると、編集画面が出ず
No editor open.になる。期待する挙動は、メモリ上の空バッファとして開いて編集でき、保存した時点でファイルが作成されること。
原因
保存側は既に対応済みで、欠けているのは開く側だけ。
buffer/documentManager.tsのsaveNowは、書き込み先のstatがENOENTを返す場合を「新規ファイルの初回保存」として明示的に許容している(それ以外の stat 失敗のみ中断する)。つまりsave()はファイルを作成できる。不足しているのは次の 2 点。
1.
cli/argv.tsのresolveStartupTarget— 存在しないパスを警告して捨て、initialFilePathを付けずに{ workspaceRoot: cwd }を返す。2.
buffer/documentManager.tsのopenDocument—readFileの失敗を一律にエラー報告してthrowする。ENOENTも他の失敗と区別していない。対応方針
ENOENTだけを「まだ存在しない新規ファイル」として分岐させ、空テキストの文書を作る。EACCES/EIOなど他の失敗は現状どおりエラーとして報告し throw する — 権限エラーを空バッファとして黙って開くと、保存時に上書き扱いで混乱を招く。argv.ts側も同様に、ENOENTのときだけ新規ファイルとして扱う。設計上の判断が要る点
a/b/c.txtでa/bがない)。安全側に倒すなら、親が存在するときのみ新規ファイルとして開き、そうでなければ現状どおり警告する。深いパスのタイプミスで黙ってエディタが開く方が分かりにくい。statのisDirectory()で分岐しているが、存在しないパスではその情報がない。末尾スラッシュの扱いを決める必要がある。回帰防止
存在しないファイルを指定して起動 → 編集 → 保存 → 実ファイルがディスク上に作成され、内容が一致することを、実 fs を通して検証するテストが必要。
documentManager単体だけでなく、argvの解決を含めた経路で確認したい。EACCESが空バッファとして開かれてしまわないことも、併せて固定しておきたい。