--dir省略時のプロジェクトルート自動検出Accepted
markharnessコマンドを--dirを指定せずに実行すると、markharness initしたプロジェクトルートではなく、コマンドを打ったカレントディレクトリがそのまま対象になっていた(Issue #9)。milestone等の自動生成コマンドをプロジェクトのサブディレクトリ(例: knowledge/配下)から実行すると、意図しない場所にファイルが生成されてしまう。
0006で「--dirを一切指定せずカレントディレクトリから自動的にリポジトリルートを検出する機能の追加は、本決定を運用面で完成させる自然な次の課題」として対象外に残されていた課題でもある。ただし0006はgitリポジトリルートの検出(git rev-parse --show-toplevel相当)を想定していたのに対し、0006自体が「markharnessプロジェクトルート ≠ gitリポジトリルート」というネスト配置を正式サポートしているため、gitルート検出だけでは不十分であることが分かった。
ルート検出の仕組み:
git rev-parse --show-toplevel)を使う。knowledge/+axes/+generated/等)が揃っている場所を規約ベースで推測する。init時に専用のマーカーファイルを作成し、以後のコマンドはgit同様に上位ディレクトリへ遡ってこのマーカーを探す。選択肢3を採用する。
markharness initは、プロジェクトルートに.markharness.toml(schema_version = 1のみを含む最小構成)を作成する。既に存在する場合は上書きしない(再init時の冪等性、カスタム内容の保持のため)。既存の(マーカーを持たない)プロジェクトも、markharness initを再実行すればマーカーだけが追加される。.markharness.tomlはリポジトリにコミットする(.gitignore対象にしない)。プロジェクトルートの所在はチームで共有すべき構造的事実であるため。init以外の全サブコマンドは、--dir省略時にカレントディレクトリから上位へ.markharness.tomlを探索し、見つかった最も近い祖先(ネストしたプロジェクトでは最も内側のもの)をルートとして採用する。見つからない場合はmarkharness initの実行を促すエラーで終了する。--dirを明示指定した場合は探索を一切行わず、指定パスをそのままリテラルにルートとして使う(スクリプト実行時やinit自身のためのエスケープハッチとして維持)。initコマンド自体はこの自動検出の対象外とし、常にcwd(または--dir)に対して直接動作する。0006のネストプロジェクトサポートと矛盾しないようにするため。理由:
git/npm/cargo等の慣習と同じ発見的仕組みであり、曖昧さがなく、schema_versionという形で将来のレイアウト互換性チェックの受け皿にもなる。schema_versionフィールドは現時点では書き込むのみで、読み取り側の互換性チェックは実装しない(将来必要になった時点で追加する、YAGNI)。
src/project_root.rs: find_root(上位探索の純粋関数)、resolve(--dir優先+探索+エラーメッセージを束ねるCLI向け関数)を追加。src/init.rs: ensure_project_root_markerで.markharness.tomlを作成(既存なら上書きしない)。src/cli.rs: initを除く全サブコマンドのNone => env::current_dir()?をproject_root::resolve(dir, &env::current_dir()?)?に置き換え。tests/import_cli.rs、tests/plan_cli.rs)のうち、--dirを指定せずcwdへの暗黙依存に頼っていたケースへ明示的に--dirを追加し、新しい探索ロジックの影響を受けないようにした。tests/project_root_cli.rsで、ネストしたサブディレクトリからの自動解決と、プロジェクトが見つからない場合のエラーメッセージを検証した。