| 202 | |
| 203 | |
| 204 | def build_paths(repo_root: str | Path | None = None, state_dir: str | Path | None = None) -> Paths: |
| 205 | resolved_repo = resolve_repo_root(repo_root) |
| 206 | plugin_root = resolved_repo / ".codex-plugin" |
| 207 | if state_dir: |
| 208 | resolved_state = Path(state_dir).resolve() |
| 209 | else: |
| 210 | bucket_key = resolve_bucket_key(resolved_repo) |
| 211 | resolved_state = get_home_dir() / PROJECTS_SUBDIR / mangle_project_path(bucket_key) |
| 212 | _maybe_write_canonical_cwd(resolved_state, bucket_key) |
| 213 | suggestions_dir = resolved_state / "suggestions" |
| 214 | skills_dir = resolved_state / "skills" |
| 215 | review_dir = resolved_state / "review" |
| 216 | return Paths( |
| 217 | repo_root=resolved_repo, |
| 218 | plugin_root=plugin_root, |
| 219 | state_dir=resolved_state, |
| 220 | suggestions_dir=suggestions_dir, |
| 221 | suggestions_pending_dir=suggestions_dir / "pending", |
| 222 | suggestions_processing_dir=suggestions_dir / "processing", |
| 223 | suggestions_done_dir=suggestions_dir / "done", |
| 224 | suggestions_failed_dir=suggestions_dir / "failed", |
| 225 | suggestions_discarded_dir=suggestions_dir / "discarded", |
| 226 | memory_dir=resolved_state / "memory", |
| 227 | recall_dir=resolved_state / "recall", |
| 228 | skills_dir=skills_dir, |
| 229 | managed_skills_dir=skills_dir / MANAGED_SKILLS_DIRNAME, |
| 230 | compiler_dir=resolved_state / "compiler", |
| 231 | review_dir=review_dir, |
| 232 | review_snapshots_dir=review_dir / "snapshots", |
| 233 | review_failed_dir=review_dir / "failed", |
| 234 | scheduler_dir=resolved_state / "scheduler", |
| 235 | ) |