SYMBOL INDEX (92 symbols across 15 files) FILE: .codebuddy/skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: .codex/skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: .continue/skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: .factory/skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: .gemini/skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: .mastracode/skills/planning-with-files/scripts/session-catchup.py function get_project_dir (line 20) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 43) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 50) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 64) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 93) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 154) | def main(): FILE: .opencode/skills/planning-with-files/scripts/session-catchup.py function get_project_dir (line 21) | def get_project_dir(project_path: str) -> Path: function get_sessions_sorted (line 55) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 65) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 111) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 140) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 201) | def main(): FILE: .pi/skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: examples/boxlite/quickstart.py function load_skill (line 21) | def load_skill() -> Skill: function main (line 60) | async def main(): function persistent_session_example (line 94) | async def persistent_session_example(): FILE: scripts/session-catchup.py function detect_ide (line 25) | def detect_ide() -> str: function get_project_dir_claude (line 47) | def get_project_dir_claude(project_path: str) -> Path: function get_project_dir_opencode (line 56) | def get_project_dir_opencode(project_path: str) -> Optional[Path]: function get_sessions_sorted (line 74) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function get_sessions_sorted_opencode (line 81) | def get_sessions_sorted_opencode(storage_dir: Path) -> List[Path]: function get_session_first_timestamp (line 99) | def get_session_first_timestamp(session_file: Path) -> Optional[str]: function scan_for_planning_update (line 116) | def scan_for_planning_update(session_file: Path) -> Tuple[int, Optional[... function extract_messages_from_session (line 160) | def extract_messages_from_session(session_file: Path, after_line: int = ... function main (line 244) | def main(): FILE: scripts/sync-ide-folders.py function _build_manifest (line 55) | def _build_manifest(base, *, ref_style="flat", template_dirs=None, function file_hash (line 171) | def file_hash(path): function sync_file (line 179) | def sync_file(src, dst, *, dry_run=False): function parse_args (line 204) | def parse_args(argv=None): function main (line 225) | def main(argv=None): FILE: skills/planning-with-files-zh/scripts/session-catchup.py function get_project_dir (line 20) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 43) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 50) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 64) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 93) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 154) | def main(): FILE: skills/planning-with-files/scripts/session-catchup.py function normalize_path (line 20) | def normalize_path(project_path: str) -> str: function get_project_dir (line 46) | def get_project_dir(project_path: str) -> Tuple[Optional[Path], Optional... function get_sessions_sorted (line 73) | def get_sessions_sorted(project_dir: Path) -> List[Path]: function parse_session_messages (line 80) | def parse_session_messages(session_file: Path) -> List[Dict]: function find_last_planning_update (line 94) | def find_last_planning_update(messages: List[Dict]) -> Tuple[int, Option... function extract_messages_after (line 123) | def extract_messages_after(messages: List[Dict], after_line: int) -> Lis... function main (line 184) | def main(): FILE: tests/test_path_fix.py function normalize_path (line 9) | def normalize_path(project_path): function sanitize (line 23) | def sanitize(project_path): FILE: tests/test_session_catchup.py function load_module (line 15) | def load_module(script_path: Path): class SessionCatchupCodexTests (line 26) | class SessionCatchupCodexTests(unittest.TestCase): method setUp (line 27) | def setUp(self): method tearDown (line 38) | def tearDown(self): method test_codex_variant_skips_when_only_codex_sessions_exist (line 41) | def test_codex_variant_skips_when_only_codex_sessions_exist(self): method test_codex_variant_uses_claude_path_when_project_exists (line 51) | def test_codex_variant_uses_claude_path_when_project_exists(self):