| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 |
- #!/usr/bin/env python3
- """
- Developer management utilities.
- Provides:
- init_developer - Initialize developer
- ensure_developer - Ensure developer is initialized (exit if not)
- show_developer_info - Show developer information
- """
- from __future__ import annotations
- import sys
- from datetime import datetime
- from pathlib import Path
- from .paths import (
- DIR_WORKFLOW,
- DIR_WORKSPACE,
- DIR_TASKS,
- FILE_DEVELOPER,
- FILE_JOURNAL_PREFIX,
- get_repo_root,
- get_developer,
- check_developer,
- )
- # =============================================================================
- # Developer Initialization
- # =============================================================================
- def init_developer(name: str, repo_root: Path | None = None) -> bool:
- """Initialize developer.
- Creates:
- - .trellis/.developer file with developer info
- - .trellis/workspace/<name>/ directory structure
- - Initial journal file and index.md
- Args:
- name: Developer name.
- repo_root: Repository root path. Defaults to auto-detected.
- Returns:
- True on success, False on error.
- """
- if not name:
- print("Error: developer name is required", file=sys.stderr)
- return False
- if repo_root is None:
- repo_root = get_repo_root()
- dev_file = repo_root / DIR_WORKFLOW / FILE_DEVELOPER
- workspace_dir = repo_root / DIR_WORKFLOW / DIR_WORKSPACE / name
- # Create .developer file
- initialized_at = datetime.now().isoformat()
- try:
- dev_file.write_text(
- f"name={name}\ninitialized_at={initialized_at}\n",
- encoding="utf-8"
- )
- except (OSError, IOError) as e:
- print(f"Error: Failed to create .developer file: {e}", file=sys.stderr)
- return False
- # Create workspace directory structure
- try:
- workspace_dir.mkdir(parents=True, exist_ok=True)
- except (OSError, IOError) as e:
- print(f"Error: Failed to create workspace directory: {e}", file=sys.stderr)
- return False
- # Create initial journal file
- journal_file = workspace_dir / f"{FILE_JOURNAL_PREFIX}1.md"
- if not journal_file.exists():
- today = datetime.now().strftime("%Y-%m-%d")
- journal_content = f"""# Journal - {name} (Part 1)
- > AI development session journal
- > Started: {today}
- ---
- """
- try:
- journal_file.write_text(journal_content, encoding="utf-8")
- except (OSError, IOError) as e:
- print(f"Error: Failed to create journal file: {e}", file=sys.stderr)
- return False
- # Create index.md with markers for auto-update
- index_file = workspace_dir / "index.md"
- if not index_file.exists():
- index_content = f"""# Workspace Index - {name}
- > Journal tracking for AI development sessions.
- ---
- ## Current Status
- <!-- @@@auto:current-status -->
- - **Active File**: `journal-1.md`
- - **Total Sessions**: 0
- - **Last Active**: -
- <!-- @@@/auto:current-status -->
- ---
- ## Active Documents
- <!-- @@@auto:active-documents -->
- | File | Lines | Status |
- |------|-------|--------|
- | `journal-1.md` | ~0 | Active |
- <!-- @@@/auto:active-documents -->
- ---
- ## Session History
- <!-- @@@auto:session-history -->
- | # | Date | Title | Commits | Branch |
- |---|------|-------|---------|--------|
- <!-- @@@/auto:session-history -->
- ---
- ## Notes
- - Sessions are appended to journal files
- - New journal file created when current exceeds 2000 lines
- - Use `add_session.py` to record sessions
- """
- try:
- index_file.write_text(index_content, encoding="utf-8")
- except (OSError, IOError) as e:
- print(f"Error: Failed to create index.md: {e}", file=sys.stderr)
- return False
- print(f"Developer initialized: {name}")
- print(f" .developer file: {dev_file}")
- print(f" Workspace dir: {workspace_dir}")
- return True
- def ensure_developer(repo_root: Path | None = None) -> None:
- """Ensure developer is initialized, exit if not.
- Args:
- repo_root: Repository root path. Defaults to auto-detected.
- """
- if repo_root is None:
- repo_root = get_repo_root()
- if not check_developer(repo_root):
- print("Error: Developer not initialized.", file=sys.stderr)
- print(f"Run: python3 ./{DIR_WORKFLOW}/scripts/init_developer.py <your-name>", file=sys.stderr)
- sys.exit(1)
- def show_developer_info(repo_root: Path | None = None) -> None:
- """Show developer information.
- Args:
- repo_root: Repository root path. Defaults to auto-detected.
- """
- if repo_root is None:
- repo_root = get_repo_root()
- developer = get_developer(repo_root)
- if not developer:
- print("Developer: (not initialized)")
- else:
- print(f"Developer: {developer}")
- print(f"Workspace: {DIR_WORKFLOW}/{DIR_WORKSPACE}/{developer}/")
- print(f"Tasks: {DIR_WORKFLOW}/{DIR_TASKS}/")
- # =============================================================================
- # Main Entry (for testing)
- # =============================================================================
- if __name__ == "__main__":
- show_developer_info()
|