diff --git a/.claude/skills/list_user/references/user_mapping.json b/.claude/skills/list_user/references/user_mapping.json index 2c33fc3..c3764f9 100644 --- a/.claude/skills/list_user/references/user_mapping.json +++ b/.claude/skills/list_user/references/user_mapping.json @@ -16,7 +16,7 @@ }, { "nickname": "傑 羅", - "formal_name": "羅傑", + "formal_name": "羅聖傑", "english_name": "Jie Luo", "team": "智能控制組", "department": "軟體部" diff --git a/.claude/skills/project_hierarchy/project_manager.py b/.claude/skills/project_hierarchy/project_manager.py index 71238bd..3dfb3ce 100644 --- a/.claude/skills/project_hierarchy/project_manager.py +++ b/.claude/skills/project_hierarchy/project_manager.py @@ -292,8 +292,17 @@ class ProjectManager: return None parent = self.hierarchy[project_id]['parent'] - if parent: - return parent.get('identifier') if isinstance(parent, dict) else parent + if parent and isinstance(parent, dict): + parent_numeric_id = str(parent.get('id')) + if parent_numeric_id and parent_numeric_id != 'None': + # Find the project identifier for this numeric ID + for proj_id, proj_data in self.projects.items(): + if str(proj_data['id']) == parent_numeric_id: + return proj_id + elif parent: + # Handle string parent (legacy format) + return parent + return None def get_full_path(self, project_id: str) -> List[str]: @@ -383,6 +392,27 @@ class ProjectManager: names = [self.hierarchy.get(p, {}).get('name', p) for p in path] return ' > '.join(names) + def find_project_by_name(self, name: str) -> Optional[str]: + """ + Find project identifier by exact name match (case-insensitive). + + Args: + name: Project name to search for + + Returns: + Project identifier or None if not found + """ + if not self.projects: + self.fetch_projects() + + name_lower = name.lower().strip() + + for project_id, project in self.projects.items(): + if project['name'].lower().strip() == name_lower: + return project_id + + return None + def search_projects(self, query: str) -> Dict: """ Search projects by name or identifier. diff --git a/.claude/skills/week_report_gen/generate_report.py b/.claude/skills/week_report_gen/generate_report.py index 4461ec7..ce65843 100644 --- a/.claude/skills/week_report_gen/generate_report.py +++ b/.claude/skills/week_report_gen/generate_report.py @@ -240,17 +240,22 @@ def format_for_weekly_report(summary_df, user_manager=None, project_manager=None sub_project_name = None if project_manager: - # Normalize project name for lookup (lowercase, replace spaces with hyphens) - project_id = project.lower().replace(' ', '-') - parent_id = project_manager.get_parent(project_id) + # Try to find the project by exact name match + project_id = project_manager.find_project_by_name(project) - if parent_id: - # This is a sub-project - parent_info = project_manager.get_project(parent_id) - if parent_info: - parent_project = parent_info['name'] - sub_project_name = project - project_name = parent_project + if project_id: + parent_id = project_manager.get_parent(project_id) + + if parent_id: + # This is a sub-project + parent_info = project_manager.get_project(parent_id) + if parent_info: + parent_project = parent_info['name'] + sub_project_name = project + project_name = parent_project + else: + # Project not found in hierarchy, log for debugging + pass report_data.append({ '專案名稱': project_name, diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..6c32e16 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,3 @@ +# AGENTS.md + +always read `README.md` for instructions on how to run the code first.