Prompt file imported from aktsmm/Agent-Customization (
.github/prompts/sync-public-skills.prompt.md). Copyright stays with the author.
sync public skills
private skill repo の確定済み skill を remote private / EMU private / GIM internal / public repo へ反映する。通常は broad sync script を使い、それが unsafe なときだけ primary-only で狭く同期する。SKILL 本文の authoring は行わない。
When to Use
- 使う: private skill repo にある確定済み skill を remote private / public repo へ反映したいとき
- 使う: private-only / MS 社内向け skill の更新差分を EMU private repo や GIM internal repo に反映したいとき
- 使う: 対象 skill は clean だが、別 skill の未コミット差分のせいで broad sync が止まりやすいとき
- 使わない: SKILL 本文の統合、置換、圧縮、学びの抽出。先に
retro-private-skillsを使う - 使わない: 新規 skill の設計や scaffold。別 workflow に分ける
Mode
- 既定は
safe-auto review-only/dry-run/プレビューが明示された場合は、候補、監査、予定差分、commit message を提示して停止する- 対象 skill 名が明示された場合は
primary-onlyとし、実行前にMode / Selected Skills / 選択外の public diffを表示する。対象が曖昧なら「指定skillのみ(primary-only)」「確定済み全体(broad)」「差分があるもの全部(diff-all)」「未コミットも含む全部(all)」を提示し、会話の流れだけで primary を推測しない diff-all/ 「差分があるもの全部」は、確定済み内容を同期先ごとに比較する範囲指定。allとは別で、dirtyのcommitや取り込みは行わずNot Doneへ残す。review-only/dry-runは引き続き実反映禁止。- 同期先はremote private / public / EMU / GIMの実宛先とvisibilityを提示して一度だけ確定する。
diff-allの「全部」だけで未承認の同期先を追加せず、承認済みの同一宛先・範囲は再確認しない。 allが指定された場合は、primaryだけでなく private repo 内の未コミット skill 差分も対象にする。未コミットのまま残さず、skill 単位でコミットしてから sync する(後述 All Mode)
All Mode(all 指定時の dirty 取り込み)
All Mode は先に private repo の scripts/Commit-DirtySkills.ps1 をdry-runし、対象とNot Doneを確認する。意味・scopeが明確なskillだけ -Applyで個別commitしてから、cleanな同期scriptへ渡す。
| 対象 | 動作 | 理由 / 注意 |
|---|---|---|
| skill content dirty | skill 単位で stage / 個別コミットする(`feat | fix |
.skill-meta.json untracked |
stage せず削除可 | local-only metadata |
.skill-meta.json tracked |
Gate 停止 | tracked file は自動削除しない |
| shared file(README / assets) | 従来どおり All Mode の dirty skill intake から除外 | skill content と混ぜない |
skill 以外の dirty(scripts、設定、無関係ファイル、/memories/**) |
stage せず Not Done に列挙 | mixed commit 防止 |
| public-safe skill | commit 後に public sync 候補 | skill ごとに sync 先を判定する |
| internal-only / private-only skill | commit 後に EMU/GIM 候補、public から除外 | public へ漏らさない |
| secret / 顧客名 / 個人メール / 具体 TPID / ローカル絶対パスを含む skill | commit は可、public sync から除外。一般化できないものは EMU/GIM も確認停止 | 漏えい防止 |
| 大規模削除 / 意味変更 / scope 不明な差分 | その skill だけ自動コミットせず確認停止 | 安全判断が必要 |
Gates
- public / internal / denied / copilot-public / copilot-deniedの分類SSOTはprivate repoの
scripts/skill-distribution.json。prompt本文やscriptへ現在の一覧を重複定義しない - source of truth は private skill repo の
.github/skills/<skill>/(native skill)とcopilot-skills/{skills,m-skills}/(.copilot由来ミラー) dirtyは sync 必要性ではなく、未確定 authoring の gate として扱う。通常 sync の要否は private source path と public / internal / EMU destination path の content diff で判定する- primary が明示されている場合、既定の確認範囲は primary とその同期経路に限定する。全 skill 棚卸し、全 duplicate、全 copilot-skills license audit は
all/broad/diff-all/audit/棚卸しが明示された場合だけ行う SYNC_PUBLIC_SKILLS_PRIVATE_REPO/SYNC_PUBLIC_SKILLS_PUBLIC_REPO/SYNC_PUBLIC_SKILLS_SCRIPTは Process scope 優先、無ければ User scope で解決する- EMU private sync 先は
SYNC_INTERNAL_SKILLS_EMU_REPOを Process scope 優先、無ければ User scope で解決する。未設定なら repo URL / owner/name を確認する - GIM internal 集約先は
SYNC_INTERNAL_SKILLS_GIM_REPO(既定gim-home/yamapan-skills、org-ownedinternal)を Process scope 優先、無ければ User scope で解決する .skill-meta.jsonは local-only metadata として、dirty 判定、stage、push、public diff から除外する- shared file として
.github/skills/README.md、.github/skills/assets/**、自動生成 index の.github/skills/LICENSEを別扱いする。broad sync 後にLICENSEだけが generated drift として残った場合は内容を確認し、意図どおりなら skill commit とは別に sync/index commit へ分ける - skill を追加・削除した直後の broad sync は README freshness gate で停止する。
Update-PublicSkillsReadme.ps1を実行し、生成差分を index commit として分けてから sync を再実行する ExcludeSkills/ private-only / internal-only / MS 社内向け skill は public sync から除外し、EMU private sync の候補として扱う- sync-only 実行中に README / assets / index / SKILL 本文の編集はしない
- branch / remote ambiguity、sourceのbehind/divergence、unexpected deletion、public safety audit failure、content authoring 必要時は同期を停止する。source更新の統合後は差分を再計算する
- 手動コピーで public repo を直接触らず、script か一時 script variant で完結させる
EMU Private Sync Gate
-
EMU private sync の既定セットは
skill-distribution.jsonのinternalSkillsを使い、GIMと共有する -
private-only / MS 社内向け skill に更新差分がある場合は、EMU同期が未承認ならpublicとは別に確認する。初回にEMU/GIMを含む宛先・範囲を承認済みなら再確認しない
-
ユーザーが
allを指定しても、public sync と EMU private sync を混同しない。public へ出してよい skill と EMU 限定 skill を分けて監査する -
EMU sync を実行する場合は、EMU repo の visibility が
PRIVATEまたはINTERNALであることを確認する。PUBLICなら停止する -
EMU repo が user-owned private の場合、EMU 全員に自動公開されない。全員利用を求める場合は organization-owned
internalrepo が必要で、作成可否を確認する -
EMU sync 先にも secret / 顧客情報 / 個人メール / 具体 TPID / ローカル絶対パスを入れない。例は placeholder にする
-
gh repo view/gh api repos/...で pull/push 権限が確認できるのにgit cloneがRepository not foundになる場合は、repo 不在ではなく Git credential transport の不一致として扱う。visibility / permissions を再確認し、clone に固執せず Contents / Git Data API で tarball 取得、blob/tree/commit/ref 更新してよい -
internal同期はconfigの全集合をfull mirrorする。subset指定は未選択Skillを削除し得るため停止する
GIM Internal Sync Gate
MS 社内向け skill を enterprise 全員に「緩く公開」するための org-owned internal repo(既定 gim-home/yamapan-skills)への集約ゲート。Sync-InternalSkills.ps1 が実装を担うが、「どれを internal へ出すか」の判断は毎回ここで行う。
- internal集約対象とaudience mapは
skill-distribution.jsonのinternalSkillsをSSOTとする。新規skillは下3観点で再判定してconfigへ追加する - 判定 3 観点: ①社内専用(public 不可だが社内なら有益) ②対象ロールまたは全社員に有益 ③匿名化済み(顧客実名 / TPID 実値 / 個人メール / ローカル絶対パスなし)
- internal 集約先の visibility が
INTERNALまたはPRIVATEであることを確認する。PUBLICなら停止する - internal skill は public sync の
ExcludeSkills/ExcludeCopilotSkillsに残し、public へ漏れないことを確認する(internal リストと public 除外リストは別管理) - README.md は
Sync-InternalSkills.ps1が毎回自動生成する。手書き編集しない(対象読者はスクリプト内の audience map、summary は各 SKILL.md の description がソース) - push 前に機密スキャン(grep)を必須とし、ヒットがあれば停止する(誤検知確認済みのみ
-AllowSensitive) - EMU アカウント切替は script が finally で
aktsmmへ復帰する。実行後に active アカウントを確認する
Copilot-Skills Private Inventory Gate
copilot-skills/(.copilot 由来ミラー)は private inventory とし、license に関係なく public へ同期しない。publicCopilotSkills は空を維持し、inventory 全件を deniedCopilotSkills に分類する。-IncludeCopilotSkills / -IncludeCopilotMSkills は使わない。
- 新しい inventory を検出したら
deniedCopilotSkillsへ保存するまで sync を停止する - 同名 native skill が必要なら
.github/skills/<skill>/へ別途 authoring し、native skill の public safety audit を通す。mirror の生コピーは公開しない - public repo に
copilot-skills/が存在したら broad sync で削除し、remote treeでも不在を確認する
Sync Strategy
diff-allの差分は、remote privateでは許可範囲の未送信commit、public/EMU/GIMでは確定済みsourceとのtracked path/blobで判定する。sourceはcleanに限定し、未追跡・生成物は除外する。差分ゼロの同期先では変更・commit・pushを行わない。dirtyが混入し得る経路は既存の隔離ルールに従う。diff-allでも分類・機密・削除ゲートは省略しない。publicは差分とshared fileの有無で既存のprimary-only/broadを選び、EMU/GIMは差分があればconfig全集合をfull mirrorする。diff-allはprompt上の選択肢であり、scriptへ同名の引数を渡さない。- 今回同期する明示 skill を
primaryとする - primary-only は
Sync-AndPush.ps1 -PrimarySkills <skill-name...>を使う。一時コピー script を作らない - 対象 skill が明示されている場合は、その skill の readiness、source/destination diff、漏れ込みだけを先に確認する。既定は
primary-onlyとする primaryが clean かつ commit 済みなら、unselected dirty があっても即停止しない。dirty が primary path にある場合は未確定 authoring とみなし、all指定がない限りretro-private-skillsへ戻す- private repo が clean で ahead の場合は、sync 前に remote private へ push してよい。private repo が clean かつ remote と同期済みでも、destination と content diff があれば sync 対象にする
all指定時は unselected dirty を放置せず、All Mode の手順で skill 単位にコミットしてから sync する- unselected dirty が public sync に漏れ得る場合は、main repo でそのまま実行せず isolated path を使う
- isolated path では確定済みHEADの一時clean worktree等を使い、
primary-onlyは<primary>/のみ、diff-allは監査した選択集合のみを既存scriptで同期する primary-onlyでは他 skill directory の削除、shared file 更新、broad script の一括削除ロジックを使わない。public / internal diff が selected primary destination path だけであることを検証するprimary-onlyで選択外がpublic diffに現れる場合、または必要な一時環境を安全に準備できない場合は停止する
New Skill Classification Gate (incident 2026-06-24 再発防止)
private repo に skill-distribution.json のpublic / internal / deniedのどこにもないskillがある状態でsyncを走らせない。Sync-AndPush.ps1は未分類skillを検出したら強制停止する。
Agent は script の exit 2 を待たず、sync 実行前に private repo の .github/skills/ を既知 3 集合と照合する。未分類 skill を見つけたら、内容から推測して分類せず、必ずユーザーに public-safe / internal-only / public-denied / 今回は同期しない を確認する。
ユーザーはその skill を以下のいずれかに分類してから再実行する:
- public-safe: configの
publicSkillsに追記する。追記前にlicense / DUP / secret auditを通す - internal-only: configの
internalSkillsにname / audience / internalOnlyを追記する。public denylistへ自動統合される - public-denied: configの
deniedSkillsに追記する。internalにも出さない
-AllowUnknownSkills は後方互換の引数名として残っていてもoverrideには使わない。分類をconfigへ保存するまで同期を停止する。
Workflow
- private repo、public repo、sync script、必要なら EMU repo を解決し、
primary、branch / remote、ahead/behind、dirty 状態を確認する primaryの readiness と source/destination content diff を確認し、未分類 skill があれば先にユーザーへ分類確認する。shared-dirty、private-only-dirty、unselected-dirtyが public / EMU sync に漏れるかを判定する。broad sync でcopilot-skills/を含む場合だけ Copilot-Skills Public Audit Gate の 3 観点でブラックリストを確定する 2.5.all指定時はCommit-DirtySkills.ps1のdry-run→-Applyでskill単位にcommitする。skill以外のdirtyはNot Doneに残し、同期scriptへ渡さない- safe path を選ぶ
- diff-all: 承認済みで差分がある同期先だけを実行する。public同期不要でEMU/GIMに差分がある場合は、
Sync-InternalSkills.ps1を対象repo・config全集合で直接実行し、public処理を経由しない - primary-only 実行:
Sync-AndPush.ps1 -PrimarySkills <skill-name...> -Message "sync: <skill summary>" -SkipDevPush。選択外 skill、README、LICENSE index、assets、copilot-skills を変更しない - broad 実行:
Sync-AndPush.ps1 -Message "sync: <summary>" -SkipDevPush。public-safe native 全体と shared files を mirror し、public のcopilot-skills/は削除する - EMU 実行: private-only skill を EMU private repo の該当 path へ mirror し、public repo に同 skill が出ていないことを確認する。
Sync-AndPush.ps1 -SyncEmu [-EmuDryRun]を使う。Git transport が使えない場合は GitHub API 経路で単一 commit にまとめる - GIM internal 実行: MS 社内向け skill を org-owned
internalrepo(gim-home/yamapan-skills)へ集約する場合はSync-AndPush.ps1 -SyncInternal [-InternalDryRun]を使う。README は自動再生成される
- diff-all: 承認済みで差分がある同期先だけを実行する。public同期不要でEMU/GIMに差分がある場合は、
- 承認済みのremote privateに未送信commitがあればscope確認後にpushする。publicはlocal mirror hashとremote到達、EMU/GIMはremote treeのpath集合とblob SHAを確認する。Missing / Mismatch / Extraが0になるまで完了扱いにしない
Report
- Summary
- Primary / Synced Set
- Path Chosen
- Audit
- Private Sync
- EMU Private Sync
- GIM Internal Sync
- Public Sync
- Verify
- Not Done