Skill Sync — sync-agent-skills.py
ทำไมต้อง Sync
Skills ถูก author ครั้งเดียว ใน vertical-plugins source:
plugins/vertical-plugins/financial-analysis/skills/comps-analysis/
↑ SINGLE SOURCE OF TRUTH
But bundled ใน agent plugins:
plugins/agent-plugins/pitch-agent/skills/comps-analysis/ (copy)
plugins/agent-plugins/gl-reconciler/skills/comps-analysis/ (copy)
plugins/agent-plugins/model-builder/skills/comps-analysis/ (copy)
ถ้า edit skill ใน vertical → ต้อง propagate ไปยัง agents ทั้งหมด
ไม่งั้น agent A มี skill v1, agent B มี skill v2 — inconsistent behavior
sync-agent-skills.py Algorithm
Script ทำ:
- Index ทุก skill ใน
plugins/vertical-plugins/*/skills/<name>/ - หา bundled copies ใน
plugins/agent-plugins/*/skills/<name>/ shutil.rmtree()old copyshutil.copytree()new copy จาก source
src_by_name: dict[str, Path] = {}
for sk in VERTICALS.glob("*/skills/*"):
if sk.is_dir():
src_by_name[sk.name] = sk
for bundled in sorted(AGENTS.glob("*/skills/*")):
if not bundled.is_dir():
continue
src = src_by_name.get(bundled.name)
if not src:
error(f"no vertical source for {bundled.name}")
continue
shutil.rmtree(bundled)
shutil.copytree(src, bundled)
synced += 1
ใช้งาน
เมื่อคุณ edit skill ใน vertical:
# 1. Edit source
vim plugins/vertical-plugins/financial-analysis/skills/dcf-model/SKILL.md
# 2. Run sync
python3 scripts/sync-agent-skills.py
Output:
synced 8 bundled skill dir(s) from vertical-plugins/
Command นี้:
plugins/vertical-plugins/financial-analysis/skills/dcf-model/
→ plugins/agent-plugins/pitch-agent/skills/dcf-model/
→ plugins/agent-plugins/model-builder/skills/dcf-model/
→ plugins/agent-plugins/earnings-reviewer/skills/dcf-model/
... (any agent that bundles dcf-model)
Git Workflow
# Edit skill ใน vertical
vim plugins/vertical-plugins/financial-analysis/skills/dcf-model/SKILL.md
vim plugins/vertical-plugins/financial-analysis/skills/dcf-model/examples.yaml
# Run sync
python3 scripts/sync-agent-skills.py
# Stage + commit
git add plugins/
git commit -m "feat(dcf-model): add IRR sensitivity analysis
- Add sensitivity table for discount rate ±1%
- Show Monte Carlo simulation option
- Updated in 8 agent bundles via sync script"
Missing Vertical Source
ถ้า bundled skill ไม่มี vertical source — error + exit 1:
python3 scripts/sync-agent-skills.py
Output:
synced 8 bundled skill dir(s) from vertical-plugins/
WARN: no vertical source found for:
- plugins/agent-plugins/pitch-agent/skills/custom-deck-formatter
Fix: แม่า skill ไป vertical แล้ว sync อีกที:
# Copy bundled to vertical (reverse operation)
cp -r plugins/agent-plugins/pitch-agent/skills/custom-deck-formatter \
plugins/vertical-plugins/investment-banking/skills/
# Or delete if it's only in agent-plugins by mistake
rm -r plugins/agent-plugins/pitch-agent/skills/custom-deck-formatter
# Sync again
python3 scripts/sync-agent-skills.py
Before Merging PR
ตามขั้นตอน:
- Edit skill ใน vertical
- Run sync
- Run check
- Commit
# 1. Edit
vim plugins/vertical-plugins/private-equity/skills/ic-memo/SKILL.md
# 2. Sync
python3 scripts/sync-agent-skills.py
# 3. Check
python3 scripts/check.py
# 4. Commit
git add plugins/
git commit -m "update ic-memo skill: add ESG assessment"
# 5. Push
git push origin feature-branch
ถ้า check fail → fix ก่อน push
Danger: Manual Edits ❌
ไม่ให้ edit bundled skill directly:
# ❌ DON'T
vim plugins/agent-plugins/pitch-agent/skills/comps-analysis/SKILL.md
Why: next sync จะ overwrite
ทำให้ edit source ใน vertical:
# ✅ DO
vim plugins/vertical-plugins/financial-analysis/skills/comps-analysis/SKILL.md
python3 scripts/sync-agent-skills.py
Skill Lifecycle
1. Create skill ใน vertical
└─ plugins/vertical-plugins/<vert>/skills/<name>/
2. Bundle in agents ต่อรู้ใจ
└─ sync-agent-skills.py copy ไปยัง
plugins/agent-plugins/<agent>/skills/<name>/
3. Edit? Edit ใน vertical เท่านั้น
└─ re-run sync
4. Delete? Remove จาก vertical
└─ sync จะ delete bundled copies
└─ agents ที่ใช้มันต้อง remove reference จาก agent.yaml