Publish third-party presentation skills

Add frontend-slides, guizang-ppt-skill, html-ppt, and ppt-master as public third-party marketplace sources with localized Chinese metadata, provenance locks, and generated Codex plugin directories. The sync script now handles root-directory skills without VCS/cache artifacts and supports sparse checkout for large upstream repositories.

Constraint: Third-party plugin content is generated from config/external-sources.json and locked to the upstream commit recorded in external-sources.lock.json.
Rejected: Keeping administrator-added local copies | Stable third-party sources give clearer provenance and let KeyInfo replace duplicates consistently.
Confidence: high
Scope-risk: moderate
Directive: Re-run external source sync instead of manually editing generated plugin directories; keep ppt-master sparseCheckout scoped unless the upstream skill layout changes.
Tested: python scripts/validate_marketplace.py; python /Users/eapil/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py plugins/codex/plugins/frontend-slides; python /Users/eapil/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py plugins/codex/plugins/guizang-ppt-skill; python /Users/eapil/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py plugins/codex/plugins/html-ppt; python /Users/eapil/.codex/skills/.system/plugin-creator/scripts/validate_plugin.py plugins/codex/plugins/ppt-master; git diff --check.
Not-tested: Codex marketplace install/remove smoke test and PowerShell sync execution were not run; pwsh/powershell is unavailable on this machine.
This commit is contained in:
KeyInfo Bot
2026-06-11 12:02:26 +08:00
parent 48a320e955
commit 67a43b4eab
12471 changed files with 260970 additions and 2 deletions
+35 -2
View File
@@ -67,6 +67,28 @@ function Copy-PathIfExists {
}
}
function Copy-DirectoryFiltered {
param(
[string]$Source,
[string]$Destination,
[string]$Within
)
$ignoredNames = @(".git", "__pycache__", ".DS_Store")
Assert-ChildPath -Parent $Within -Child $Destination
New-Item -ItemType Directory -Force -Path $Destination | Out-Null
foreach ($item in Get-ChildItem -LiteralPath $Source -Force) {
if ($ignoredNames -contains $item.Name) {
continue
}
$target = Join-Path $Destination $item.Name
if ($item.PSIsContainer) {
Copy-DirectoryFiltered -Source $item.FullName -Destination $target -Within $Within
} else {
Copy-Item -LiteralPath $item.FullName -Destination $target -Force
}
}
}
function Read-JsonFile {
param([string]$Path)
$resolvedPath = (Resolve-Path -LiteralPath $Path).Path
@@ -244,11 +266,22 @@ function Get-Clone {
)
$clonePath = Join-Path $CloneRoot $Source.id
Remove-PathIfExists -Path $clonePath -Within $CloneRoot
Invoke-CheckedGit @("clone", "--depth", "1", $Source.repo, $clonePath)
$cloneArgs = @("clone", "--depth", "1")
$sparseCheckout = @()
if ($Source.PSObject.Properties.Name -contains "sparseCheckout" -and $Source.sparseCheckout) {
$cloneArgs += @("--filter=blob:none", "--sparse")
$sparseCheckout = @($Source.sparseCheckout)
}
$cloneArgs += @($Source.repo, $clonePath)
Invoke-CheckedGit $cloneArgs
if ($Source.ref) {
Invoke-CheckedGit @("-C", $clonePath, "fetch", "--depth", "1", "origin", $Source.ref)
Invoke-CheckedGit @("-C", $clonePath, "checkout", "FETCH_HEAD")
}
if ($sparseCheckout.Count -gt 0) {
$sparseArgs = @("-C", $clonePath, "sparse-checkout", "set", "--no-cone") + $sparseCheckout
Invoke-CheckedGit $sparseArgs
}
$commit = (git -C $clonePath rev-parse HEAD).Trim()
return [ordered]@{
path = $clonePath
@@ -351,7 +384,7 @@ function Sync-ClaudeSkill {
New-Item -ItemType Directory -Force -Path (Join-Path $pluginDir ".codex-plugin") | Out-Null
New-Item -ItemType Directory -Force -Path (Join-Path $pluginDir "skills") | Out-Null
$skillDest = Join-Path (Join-Path $pluginDir "skills") (Split-Path -Leaf $skillSource)
Copy-Item -LiteralPath $skillSource -Destination (Join-Path $pluginDir "skills") -Recurse -Force
Copy-DirectoryFiltered -Source $skillSource -Destination $skillDest -Within $RepoRoot
$materializePaths = @()
if ($Source.PSObject.Properties.Name -contains "materializePaths" -and $Source.materializePaths) {