      ## 背景 Issue #329 で「config ファイルが未作成でも親ディレクトリを<img src="https://mojiemoji.jozo.beer/emoji/%E7%9B%A3%E8%A6%96?font=gothic&color=60a5fa&animation=nami&background=transparent&outline=fa60a5&outline_width=2" alt="監視" height="24" align="absmiddle">して、<img src="https://mojiemoji.jozo.beer/emoji/%E5%BE%8C?font=chikara&color=10b981&animation=mozaiku&background=transparent&outline=8110b9&outline_width=2" alt="後" height="20" align="absmiddle">からの作成を初期ロードとして拾う」<img src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E5%BF%9C?font=pixel&color=fbbf24&animation=tatemoya&background=transparent&outline=06d977&outline_width=2" alt="対応" height="20" align="absmiddle">を入れた。ただし config ディレクトリ自体(`$XDG_CONFIG_HOME/lyra` など)が daemon 起動時に<img src="https://mojiemoji.jozo.beer/emoji/%E4%B8%8D%E5%9C%A8?font=kurobara&color=f87171&animation=bure&background=transparent&outline=71f871&outline_width=2" alt="不在" height="24" align="absmiddle">の場合は watch を張る fd が無く、`watchChanges` は nil を返す。この場合、ディレクトリを作って config を置いても daemon の再起動が<img src="https://mojiemoji.jozo.beer/emoji/%E5%BF%85%E8%A6%81?font=tamanegi&color=10b981&animation=kage_kaiten&speed=slow&background=transparent&outline=8110b9&outline_width=2" alt="必要" height="20" align="absmiddle">になる。 この<img src="https://mojiemoji.jozo.beer/emoji/%E5%88%B6%E9%99%90?font=hachimaru&color=4ade80&animation=yatta&background=transparent&outline=4a16a3&outline_width=2" alt="制限" height="20" align="absmiddle">は #329 時点で明示的にスコープ外として文書化済み(docs/ARCHITECTURE.md「provided the config directory itself exists at start」、および `ConfigWatchSession.armed()` の doc コメント)。<img src="https://mojiemoji.jozo.beer/emoji/PR?font=hachimaru&color=ef4444&animation=bure&background=transparent&outline=44ef44&outline_width=2" alt="PR" height="20" align="absmiddle"> #337 の Round 4 レビュー(CodeRabbit)で改めて指摘があり、follow-up の<img src="https://mojiemoji.jozo.beer/emoji/%E8%AA%B2%E9%A1%8C?font=zero&color=f472b6&animation=zanzo&background=transparent&outline=b6f472&outline_width=2" alt="課題" height="24" align="absmiddle">として切り出す。 ## 提案 <img src="https://mojiemoji.jozo.beer/emoji/%E5%AD%98%E5%9C%A8?font=dela&color=f472b6&animation=neruneru&background=transparent&outline=77db27&outline_width=2" alt="存在" height="20" align="absmiddle">する最も近い<img src="https://mojiemoji.jozo.beer/emoji/%E7%A5%96%E5%85%88?font=maru-bold&color=4ade80&animation=kaiten&speed=slow&background=transparent&outline=804ade&outline_width=2" alt="祖先" height="24" align="absmiddle">ディレクトリ(`$XDG_CONFIG_HOME` → `$HOME` の順にフォールバック)を watch し、<img src="https://mojiemoji.jozo.beer/emoji/%E7%9B%AE%E7%9A%84?font=chikara&color=f59e0b&animation=kira&background=transparent&outline_width=0" alt="目的" height="20" align="absmiddle">の config ディレクトリが作成されたら watch を<img src="https://mojiemoji.jozo.beer/emoji/%E4%B8%8B%E4%BD%8D?font=kurobara&color=3b82f6&animation=patapata&background=transparent&outline=f63b82&outline_width=2" alt="下位" height="20" align="absmiddle">に張り替えて initial load を<img src="https://mojiemoji.jozo.beer/emoji/%E7%99%BA%E7%81%AB?font=toge&color=fb923c&animation=kira&background=transparent" alt="発火" height="24" align="absmiddle">する「祖先 watch + 段階的 re-arm」を<img src="https://mojiemoji.jozo.beer/emoji/%E8%BF%BD%E5%8A%A0?font=gothic&color=ec4899&animation=zanzo&background=transparent&outline=99ec48&outline_width=2" alt="追加" height="20" align="absmiddle">する。 ## <img src="https://mojiemoji.jozo.beer/emoji/%E6%A4%9C%E8%A8%8E?font=dela&color=f59e0b&animation=poyoon&background=transparent&outline=0bf59e&outline_width=2" alt="検討" height="20" align="absmiddle">事項 - 祖先 watch はイベントの<img src="https://mojiemoji.jozo.beer/emoji/%E9%A0%BB%E5%BA%A6?font=mincho&color=c084fc&animation=gatagata&background=transparent&outline=fcc084&outline_width=2" alt="頻度" height="24" align="absmiddle">が高い(`$HOME` 直下の変化を全部拾う)ため、debounce と「<img src="https://mojiemoji.jozo.beer/emoji/%E7%9B%AE%E7%9A%84?font=rampart&color=a855f7&animation=patapata&background=transparent&outline=f7a855&outline_width=2" alt="目的" height="20" align="absmiddle"><img src="https://mojiemoji.jozo.beer/emoji/%E3%83%91%E3%82%B9?font=gothic&color=a855f7&animation=kirari&background=transparent&outline=f7a855&outline_width=2" alt="パス" height="20" align="absmiddle">が出現したときだけ<img src="https://mojiemoji.jozo.beer/emoji/%E5%8F%8D%E5%BF%9C?font=gothic&color=a78bfa&animation=bure&background=transparent&outline=ed7c3a&outline_width=2" alt="反応" height="20" align="absmiddle">する」フィルタが<img src="https://mojiemoji.jozo.beer/emoji/%E5%BF%85%E9%A0%88?font=gothic&color=ec4899&animation=zanzo&background=transparent&outline=99ec48&outline_width=2" alt="必須" height="20" align="absmiddle"> - `ConfigWatchSession` の re-arm 機構(イベント毎にディスクから<img src="https://mojiemoji.jozo.beer/emoji/%E5%AF%BE%E8%B1%A1?font=akzk&color=facc15&animation=disco&background=transparent&outline_width=0" alt="対象" height="20" align="absmiddle">を再解決)に乗せられるか、別 tier が要るか - 需要の希少性(初回セットアップ時のみ)と<img src="https://mojiemoji.jozo.beer/emoji/%E5%AE%9F%E8%A3%85?font=gothic-bold&color=f472b6&animation=kira&background=transparent&outline_width=0" alt="実装" height="20" align="absmiddle">の重さのバランス — `lyra config init` が案内を出す<img src="https://mojiemoji.jozo.beer/emoji/%E8%BB%BD%E9%87%8F?font=hachimaru&color=34d399&animation=mochimochi&background=transparent&outline=9934d3&outline_width=2" alt="軽量" height="24" align="absmiddle">な<img src="https://mojiemoji.jozo.beer/emoji/%E4%BB%A3%E6%9B%BF?font=tamanegi&color=eab308&animation=chirichiri&background=transparent&outline=08eab3&outline_width=2" alt="代替" height="20" align="absmiddle">で足りる<img src="https://mojiemoji.jozo.beer/emoji/%E5%8F%AF%E8%83%BD?font=chikara&color=fb7185&animation=psycho&background=transparent&outline_width=0" alt="可能" height="20" align="absmiddle">性もある ## <img src="https://mojiemoji.jozo.beer/emoji/%E9%96%A2%E9%80%A3?font=kurobara&color=c084fc&animation=patapata&background=transparent&outline=fcc084&outline_width=2" alt="関連" height="20" align="absmiddle"> 以下の issue / <img src="https://mojiemoji.jozo.beer/emoji/PR?font=maru&color=34d399&animation=gatagata&background=transparent&outline=9934d3&outline_width=2" alt="PR" height="20" align="absmiddle"> と<img src="https://mojiemoji.jozo.beer/emoji/%E9%96%A2%E9%80%A3?font=noto&color=facc15&animation=yoko_scroll&background=transparent&outline=15facc&outline_width=2" alt="関連" height="24" align="absmiddle">する: - #41(config ホットリロード本体) - #329(ファイル未<img src="https://mojiemoji.jozo.beer/emoji/%E5%AD%98%E5%9C%A8?font=hachimaru&color=f59e0b&animation=kage_kaiten&speed=slow&background=transparent&outline=0bf59e&outline_width=2" alt="存在" height="20" align="absmiddle">でもディレクトリ<img src="https://mojiemoji.jozo.beer/emoji/%E7%9B%A3%E8%A6%96?font=mincho&color=f472b6&animation=shuchusen&background=transparent&outline=b6f472&outline_width=2" alt="監視" height="20" align="absmiddle">を arm) - #337(集大成 <img src="https://mojiemoji.jozo.beer/emoji/PR?font=maru&color=34d399&animation=gatagata&background=transparent&outline=9934d3&outline_width=2" alt="PR" height="20" align="absmiddle"> — Round 4 レビューで再指摘)
背景
Issue #329 で「config ファイルが未作成でも親ディレクトリを
して、
からの作成を初期ロードとして拾う」
を入れた。ただし config ディレクトリ自体(
の場合は watch を張る fd が無く、
になる。
$XDG_CONFIG_HOME/lyraなど)が daemon 起動時にwatchChangesは nil を返す。この場合、ディレクトリを作って config を置いても daemon の再起動がこの
は #329 時点で明示的にスコープ外として文書化済み(docs/ARCHITECTURE.md「provided the config directory itself exists at start」、および
#337 の Round 4 レビュー(CodeRabbit)で改めて指摘があり、follow-up の
として切り出す。
ConfigWatchSession.armed()の doc コメント)。提案
$XDG_CONFIG_HOME→$HOMEの順にフォールバック)を watch し、$HOME直下の変化を全部拾う)ため、debounce と「ConfigWatchSessionの re-arm 機構(イベント毎にディスクからlyra config initが案内を出す以下の issue /
と
する: