fix: install.sh 合并 skill.json(不覆盖内置 skills)

- skill.json 不再直接 cp 覆盖(会丢失 CoPaw 内置 skills)
- 改用 Python 合并注入:保留内置 + 追加自定义
- 补全 6 个自定义 skills 注册(5 TOC + voc_research)
This commit is contained in:
lidf 2026-04-07 01:36:24 +08:00
parent 52d1ae6900
commit da6a360cfe
2 changed files with 132 additions and 17 deletions

View File

@ -48,8 +48,8 @@ mkdir -p "$WORKSPACE_DIR/cases"
mkdir -p "$WORKSPACE_DIR/iteration_reports"
mkdir -p "$WORKSPACE_DIR/memory"
# 核心配置
for f in AGENTS.md SOUL.md PROFILE.md HEARTBEAT.md agent.json skill.json; do
# 核心配置skill.json 单独合并,不覆盖)
for f in AGENTS.md SOUL.md PROFILE.md HEARTBEAT.md agent.json; do
if [ -f "$SCRIPT_DIR/$f" ]; then
cp "$SCRIPT_DIR/$f" "$WORKSPACE_DIR/$f"
fi
@ -75,6 +75,59 @@ fi
info "文件复制完成"
# ── 合并 skill.json注入自定义 skills保留内置 skills──────────────
info "注册自定义 Skills..."
python3 -c "
import json, os, time
ws_skill = os.path.expanduser('$WORKSPACE_DIR/skill.json')
repo_skill = '$SCRIPT_DIR/skill.json'
# 读取工作区已有的 manifest含内置 skills
if os.path.exists(ws_skill):
with open(ws_skill) as f:
manifest = json.load(f)
else:
manifest = {'schema_version': 'workspace-skill-manifest.v1', 'version': 0, 'skills': {}}
# 读取仓库的自定义 skills 定义
if os.path.exists(repo_skill):
with open(repo_skill) as f:
repo = json.load(f)
for name, skill_cfg in repo.get('skills', {}).items():
manifest['skills'][name] = skill_cfg
print(f' + {name}')
# 同时扫描 active_skills 目录,确保所有 SKILL.md 都被注册
skills_dir = os.path.expanduser('$WORKSPACE_DIR/active_skills')
if os.path.isdir(skills_dir):
for d in os.listdir(skills_dir):
if d.startswith('.'):
continue
skill_md = os.path.join(skills_dir, d, 'SKILL.md')
if os.path.exists(skill_md) and d not in manifest['skills']:
manifest['skills'][d] = {
'enabled': True,
'channels': ['all'],
'source': 'customized',
'metadata': {
'name': d,
'description': '',
'version_text': '1.0.0',
'source': 'customized',
'protected': False,
'requirements': {'require_bins': [], 'require_envs': []},
},
'requirements': {'require_bins': [], 'require_envs': []},
}
print(f' + {d} (from dir)')
manifest['version'] = int(time.time() * 1000)
with open(ws_skill, 'w') as f:
json.dump(manifest, f, indent=2, ensure_ascii=False)
print(' skills 注册完成')
"
# ── 注册到 config.json ─────────────────────────────────────────────────
info "注册 Agent..."
python3 -c "

View File

@ -1,28 +1,90 @@
{
"schema_version": "workspace-skill-manifest.v1",
"version": 1775495795224,
"version": 1775500000000,
"skills": {
"voc_research": {
"ude_diagnosis": {
"enabled": true,
"channels": [
"all"
],
"channels": ["all"],
"source": "customized",
"metadata": {
"name": "voc_research",
"description": "VOC 研究采集与分析",
"name": "ude_diagnosis",
"description": "UDE 诊断 — TOC 不满意效果分析",
"version_text": "1.0.0",
"source": "customized",
"protected": false,
"requirements": {
"require_bins": [],
"require_envs": []
}
"requirements": {"require_bins": [], "require_envs": []}
},
"requirements": {
"require_bins": [],
"require_envs": []
}
"requirements": {"require_bins": [], "require_envs": []}
},
"conflict_cloud": {
"enabled": true,
"channels": ["all"],
"source": "customized",
"metadata": {
"name": "conflict_cloud",
"description": "冲突图构建 — TOC 对立假设分析",
"version_text": "1.0.0",
"source": "customized",
"protected": false,
"requirements": {"require_bins": [], "require_envs": []}
},
"requirements": {"require_bins": [], "require_envs": []}
},
"convention_breaker": {
"enabled": true,
"channels": ["all"],
"source": "customized",
"metadata": {
"name": "convention_breaker",
"description": "惯例揭示与打破 — TOC 核心突破",
"version_text": "1.0.0",
"source": "customized",
"protected": false,
"requirements": {"require_bins": [], "require_envs": []}
},
"requirements": {"require_bins": [], "require_envs": []}
},
"negative_branch": {
"enabled": true,
"channels": ["all"],
"source": "customized",
"metadata": {
"name": "negative_branch",
"description": "负面分支预测 — TOC 风险分析",
"version_text": "1.0.0",
"source": "customized",
"protected": false,
"requirements": {"require_bins": [], "require_envs": []}
},
"requirements": {"require_bins": [], "require_envs": []}
},
"proposal_assembler": {
"enabled": true,
"channels": ["all"],
"source": "customized",
"metadata": {
"name": "proposal_assembler",
"description": "提案组装 — 黑手党提案最终交付",
"version_text": "1.0.0",
"source": "customized",
"protected": false,
"requirements": {"require_bins": [], "require_envs": []}
},
"requirements": {"require_bins": [], "require_envs": []}
},
"voc_research": {
"enabled": true,
"channels": ["all"],
"source": "customized",
"metadata": {
"name": "voc_research",
"description": "VOC 研究采集与分析(需要用户自带 TikHub Key",
"version_text": "1.0.0",
"source": "customized",
"protected": false,
"requirements": {"require_bins": [], "require_envs": []}
},
"requirements": {"require_bins": [], "require_envs": []}
}
}
}