fix: install.sh 合并 skill.json(不覆盖内置 skills)
- skill.json 不再直接 cp 覆盖(会丢失 CoPaw 内置 skills) - 改用 Python 合并注入:保留内置 + 追加自定义 - 补全 6 个自定义 skills 注册(5 TOC + voc_research)
This commit is contained in:
parent
52d1ae6900
commit
da6a360cfe
@ -48,8 +48,8 @@ mkdir -p "$WORKSPACE_DIR/cases"
|
|||||||
mkdir -p "$WORKSPACE_DIR/iteration_reports"
|
mkdir -p "$WORKSPACE_DIR/iteration_reports"
|
||||||
mkdir -p "$WORKSPACE_DIR/memory"
|
mkdir -p "$WORKSPACE_DIR/memory"
|
||||||
|
|
||||||
# 核心配置
|
# 核心配置(skill.json 单独合并,不覆盖)
|
||||||
for f in AGENTS.md SOUL.md PROFILE.md HEARTBEAT.md agent.json skill.json; do
|
for f in AGENTS.md SOUL.md PROFILE.md HEARTBEAT.md agent.json; do
|
||||||
if [ -f "$SCRIPT_DIR/$f" ]; then
|
if [ -f "$SCRIPT_DIR/$f" ]; then
|
||||||
cp "$SCRIPT_DIR/$f" "$WORKSPACE_DIR/$f"
|
cp "$SCRIPT_DIR/$f" "$WORKSPACE_DIR/$f"
|
||||||
fi
|
fi
|
||||||
@ -75,6 +75,59 @@ fi
|
|||||||
|
|
||||||
info "文件复制完成"
|
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 ─────────────────────────────────────────────────
|
# ── 注册到 config.json ─────────────────────────────────────────────────
|
||||||
info "注册 Agent..."
|
info "注册 Agent..."
|
||||||
python3 -c "
|
python3 -c "
|
||||||
|
|||||||
@ -1,28 +1,90 @@
|
|||||||
{
|
{
|
||||||
"schema_version": "workspace-skill-manifest.v1",
|
"schema_version": "workspace-skill-manifest.v1",
|
||||||
"version": 1775495795224,
|
"version": 1775500000000,
|
||||||
"skills": {
|
"skills": {
|
||||||
"voc_research": {
|
"ude_diagnosis": {
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"channels": [
|
"channels": ["all"],
|
||||||
"all"
|
|
||||||
],
|
|
||||||
"source": "customized",
|
"source": "customized",
|
||||||
"metadata": {
|
"metadata": {
|
||||||
"name": "voc_research",
|
"name": "ude_diagnosis",
|
||||||
"description": "VOC 研究采集与分析",
|
"description": "UDE 诊断 — TOC 不满意效果分析",
|
||||||
"version_text": "1.0.0",
|
"version_text": "1.0.0",
|
||||||
"source": "customized",
|
"source": "customized",
|
||||||
"protected": false,
|
"protected": false,
|
||||||
"requirements": {
|
"requirements": {"require_bins": [], "require_envs": []}
|
||||||
"require_bins": [],
|
|
||||||
"require_envs": []
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"requirements": {
|
"requirements": {"require_bins": [], "require_envs": []}
|
||||||
"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": []}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Reference in New Issue
Block a user