[moz] impl(§21): toolchain-templates.yaml + Issue 模板补全 + G1 修复 + §20 superseded
- config/toolchain-templates.yaml: §4 steps 模板化(7 种 business_type + ci_failure + review_result) - src/daemon/toolchain_templates.py: 加 get_steps()/get_output_template() YAML 加载 - .gitea/ISSUE_TEMPLATE/: 补 impl.yml + docs.yml + refactor.yml - src/daemon/toolchain_handler.py: G1 弯引号修复 - docs/design/20-issue-centric-orchestration.md: status 改为 superseded by §21 Closes #106
This commit is contained in:
@@ -264,7 +264,7 @@ class ToolchainConstraintsSection:
|
||||
'| “步骤太多了,选几个做就行” | ❌ 错!必须逐条执行,不可跳过 |',
|
||||
'| “这个步骤不适用于当前情况” | ❌ 如果确实不适用,在 action report 中说明原因,但其他步骤必须执行 |',
|
||||
'| “CI/部署失败不是我代码的问题,我什么也不用做” | ❌ 错!即使是基础设施问题,你也必须创建 Issue 指派 jiangwei-infra(body 含错误来源链接 + 日志 + 判断依据),并在 action report 中说明。不能只报告“不是我的问题”就完事 |',
|
||||
'| "文档以后再说" | ❌ 错!文档同步和代码改动在同一 PR 中完成,action report 中必须说明文档处理情况 |',
|
||||
'| “文档以后再说” | ❌ 错!文档同步和代码改动在同一 PR 中完成,action report 中必须说明文档处理情况 |',
|
||||
"",
|
||||
]
|
||||
return "\n".join(lines)
|
||||
|
||||
@@ -5,10 +5,11 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import logging
|
||||
from collections import defaultdict
|
||||
from pathlib import Path
|
||||
from typing import Dict
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -87,3 +88,64 @@ def render_template(name: str, variables: Dict[str, str]) -> str:
|
||||
def clear_cache() -> None:
|
||||
"""清空模板缓存(用于测试或热更新)"""
|
||||
_template_cache.clear()
|
||||
_steps_cache.clear()
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# §21 §4.2 YAML steps 模板加载
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
STEPS_YAML_PATH = Path(__file__).parent.parent.parent / "config" / "toolchain-templates.yaml"
|
||||
|
||||
_steps_cache: Optional[dict] = None
|
||||
|
||||
|
||||
def _load_steps_yaml() -> dict:
|
||||
"""加载并缓存 toolchain-templates.yaml。"""
|
||||
global _steps_cache
|
||||
if _steps_cache is not None:
|
||||
return _steps_cache
|
||||
try:
|
||||
import yaml
|
||||
with open(STEPS_YAML_PATH, encoding="utf-8") as f:
|
||||
_steps_cache = yaml.safe_load(f) or {}
|
||||
logger.debug("Loaded steps YAML: %d action_types", len(_steps_cache))
|
||||
except FileNotFoundError:
|
||||
logger.warning("Steps YAML not found: %s", STEPS_YAML_PATH)
|
||||
_steps_cache = {}
|
||||
except Exception as e:
|
||||
logger.error("Failed to load steps YAML: %s", e)
|
||||
_steps_cache = {}
|
||||
return _steps_cache
|
||||
|
||||
|
||||
def get_steps(action_type: str, business_type: str = "") -> List[str]:
|
||||
"""从 YAML 模板配置获取 steps。
|
||||
|
||||
Args:
|
||||
action_type: 动作类型(issue_assigned / ci_failure / ...)
|
||||
business_type: 业务子类型(feature/impl/bug/docs/refactor/test/infrastructure)
|
||||
|
||||
Returns:
|
||||
steps 列表,找不到返回空列表
|
||||
"""
|
||||
templates = _load_steps_yaml()
|
||||
section = templates.get(action_type, {})
|
||||
if isinstance(section, dict) and business_type:
|
||||
subsection = section.get(business_type, {})
|
||||
return subsection.get("steps", [])
|
||||
if isinstance(section, dict):
|
||||
return section.get("steps", [])
|
||||
return []
|
||||
|
||||
|
||||
def get_output_template(action_type: str, business_type: str = "") -> str:
|
||||
"""从 YAML 模板配置获取 output_template。"""
|
||||
templates = _load_steps_yaml()
|
||||
section = templates.get(action_type, {})
|
||||
if isinstance(section, dict) and business_type:
|
||||
subsection = section.get(business_type, {})
|
||||
return subsection.get("output_template", "")
|
||||
if isinstance(section, dict):
|
||||
return section.get("output_template", "")
|
||||
return ""
|
||||
|
||||
Reference in New Issue
Block a user