From e1529ff0e111ad5c2ef3fbfc78b88c444dcef67b Mon Sep 17 00:00:00 2001 From: Sejun Park Date: Thu, 10 Sep 2026 21:32:37 +0900 Subject: [PATCH] wip(registry): recover private KICPA additions onto current main Preserve seven unpublished private skill registrations while retaining upstream Darty, development profiles, and v1.2 reconciliation behavior. Align canonical and embedded registries and update contract expectations to 50 entries. Keep this as an unmerged recovery branch: private entries currently extend kicpa, which conflicts with the selected kicpa-private authentication design. Record that boundary and the full recovery stash before further integration. Targeted Go contracts and all 12 Node registry/wrapper tests pass; private materialization is not validated. --- PROGRESS.md | 12 ++++++ docs/skill-registry.md | 13 +++++- internal/sjskills/contracts_test.go | 13 ++++-- internal/sjskills/data/registry-v4.json | 53 ++++++++++++++++++++++++ plans/sjskills-private-github-sources.md | 8 ++-- skill-registry.json | 53 ++++++++++++++++++++++++ 6 files changed, 144 insertions(+), 8 deletions(-) diff --git a/PROGRESS.md b/PROGRESS.md index 804944a..ffa2235 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -1,3 +1,15 @@ +# Recovered private KICPA registry draft + +- Preserved seven unpublished registrations on `codex/integrate-private-kicpa-skills` + and combined them with current main (50 registry entries, including Darty). +- Not ready to merge or publish: the draft adds private access requirements to + `kicpa`, contrary to the selected separate private-profile design. Follow the + [private-source plan](plans/sjskills-private-github-sources.md) before rollout. +- Targeted Go contract tests and 12 Node registry/wrapper tests pass. Bounded + review and documentation alignment completed; private fetching remains unverified. +- Full original checkout recovery remains in Git stash commit + `038118178cce4759e3acebf854f19b36723488fc`, including superseded hook drafts. + # sjskills maintenance plugin delivery - User authorized automatic CLI updates and configured skill sync on every diff --git a/docs/skill-registry.md b/docs/skill-registry.md index 8d2b6bf..086238a 100644 --- a/docs/skill-registry.md +++ b/docs/skill-registry.md @@ -40,11 +40,22 @@ Each `skills` entry records: A `repository` source names the published GitHub `skills/` catalog. An `external` source names a deliberately tracked upstream or a manual -boundary. Skills CLI-managed sources must be public Git shorthand +boundary. Skills CLI-managed sources must be Git shorthand (`owner/repo[/path]`) or credential-free HTTPS. Local paths, embedded credentials, URL query strings, npm specifiers, and other schemes are rejected for that manager. +Private repositories use the same source records; URL validation does not check +repository visibility. The `kicpa` profile includes skills from the private +`sjunepark/kicpa` catalog, so materializing that profile requires repository +access. Authentication must work non-interactively in the isolated staging +environment. Ordinary inherited environment variables, including Git +credential-helper configuration, are preserved, but home and XDG configuration +paths are replaced. Login or helper configuration stored only under the original +home is therefore not automatically available. `sjskills` does not provision +credentials; keep secrets out of registry URLs and verify access with a plan +before applying. + `manual` entries remain externally owned. `workflow` entries are provisioned by the named project workflow. `none` entries are catalog-only: they are classified for discovery but never selected by a desired set. diff --git a/internal/sjskills/contracts_test.go b/internal/sjskills/contracts_test.go index a0f4886..da97600 100644 --- a/internal/sjskills/contracts_test.go +++ b/internal/sjskills/contracts_test.go @@ -49,8 +49,8 @@ func TestCanonicalRegistryAndProfiles(t *testing.T) { if registry.Version != RegistryVersion { t.Fatalf("version = %d", registry.Version) } - if len(registry.Skills) != 43 { - t.Fatalf("skills = %d, want 43", len(registry.Skills)) + if len(registry.Skills) != 50 { + t.Fatalf("skills = %d, want 50", len(registry.Skills)) } global, err := ResolveGlobal(registry) if err != nil { @@ -155,10 +155,15 @@ func TestKicpaAndManagerBoundaries(t *testing.T) { if err != nil { t.Fatal(err) } - if len(state.Skills) != 5 || state.Skills[0].Name != "darty" || state.Skills[1].Name != "kasb" || state.Skills[2].Name != "kisnet-ytm" || state.Skills[3].Name != "krx-cli" || state.Skills[4].Name != "windows-cleanup" { + wantNames := []string{"cagr-research", "crowe-design", "darty", "kasb", "kisnet-ytm", "krx-cli", "organize-engagement-files", "render-markdown-pdf", "sync-rfi", "tf-basic-data-prep", "wacc-peer-screening", "windows-cleanup"} + var gotNames []string + for _, skill := range state.Skills { + gotNames = append(gotNames, skill.Name) + } + if !slices.Equal(gotNames, wantNames) { t.Fatalf("kicpa = %#v", state.Skills) } - if darty := state.Skills[0]; darty.Source != "https://github.com/cpaikr/darty/tree/main/skill/darty" || darty.Manager != ManagerSkillsCLI || darty.Mode != ModeCopy { + if darty := state.Skills[2]; darty.Source != "https://github.com/cpaikr/darty/tree/main/skill/darty" || darty.Manager != ManagerSkillsCLI || darty.Mode != ModeCopy { t.Fatalf("darty source and installation policy = %#v", darty) } for _, skill := range state.Skills { diff --git a/internal/sjskills/data/registry-v4.json b/internal/sjskills/data/registry-v4.json index b6aed0a..445af6c 100644 --- a/internal/sjskills/data/registry-v4.json +++ b/internal/sjskills/data/registry-v4.json @@ -49,10 +49,17 @@ }, "kicpa": { "skills": [ + "cagr-research", + "crowe-design", "darty", "kasb", "kisnet-ytm", "krx-cli", + "organize-engagement-files", + "render-markdown-pdf", + "sync-rfi", + "tf-basic-data-prep", + "wacc-peer-screening", "windows-cleanup" ] }, @@ -88,6 +95,10 @@ "kind": "external", "location": "https://github.com/cpaikr/kasb/tree/main/skills/kasb" }, + "kicpa": { + "kind": "external", + "location": "https://github.com/sjunepark/kicpa/tree/main/skills" + }, "kisnet-ytm": { "kind": "external", "location": "https://github.com/cpaikr/ytm/tree/main/skills/kisnet-ytm" @@ -153,6 +164,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "cagr-research", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "clarify", "source": "agent-scripts", @@ -207,6 +224,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "crowe-design", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "darty", "source": "darty", @@ -316,6 +339,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "organize-engagement-files", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "pdf-to-markdown", "source": "agent-scripts", @@ -334,6 +363,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "render-markdown-pdf", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "review-campaign", "source": "agent-scripts", @@ -357,12 +392,24 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "sync-rfi", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "teach", "source": "agent-scripts", "manager": "skills-cli", "mode": "copy" }, + { + "name": "tf-basic-data-prep", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "ui-lab", "source": "agent-scripts", @@ -375,6 +422,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "wacc-peer-screening", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "windows-cleanup", "source": "agent-scripts", diff --git a/plans/sjskills-private-github-sources.md b/plans/sjskills-private-github-sources.md index 6bb2766..187c0aa 100644 --- a/plans/sjskills-private-github-sources.md +++ b/plans/sjskills-private-github-sources.md @@ -32,9 +32,11 @@ Repository evidence was inspected at `076a487`: - [Status](../internal/sjskills/status.go) shares upstream evidence by fetch inputs. [Provenance](../internal/sjskills/provenance.go) records source and content ownership; temporary staging paths must never become source identity. -- No actual private repository URL or skill list has been supplied. A real - `kicpa-private` catalog entry cannot yet be populated. This is an enrollment - prerequisite, not a blocker to implementing and testing the capability. +- Cleanup on 2026-09-10 recovered seven registrations from the private + `sjunepark/kicpa` catalog on `codex/integrate-private-kicpa-skills`. That draft + currently extends `kicpa` and is not ready to merge: move the registrations + into the selected `kicpa-private` design after authenticated fetching is + implemented and verified. Recovery did not validate private materialization. ## Next action diff --git a/skill-registry.json b/skill-registry.json index b6aed0a..445af6c 100644 --- a/skill-registry.json +++ b/skill-registry.json @@ -49,10 +49,17 @@ }, "kicpa": { "skills": [ + "cagr-research", + "crowe-design", "darty", "kasb", "kisnet-ytm", "krx-cli", + "organize-engagement-files", + "render-markdown-pdf", + "sync-rfi", + "tf-basic-data-prep", + "wacc-peer-screening", "windows-cleanup" ] }, @@ -88,6 +95,10 @@ "kind": "external", "location": "https://github.com/cpaikr/kasb/tree/main/skills/kasb" }, + "kicpa": { + "kind": "external", + "location": "https://github.com/sjunepark/kicpa/tree/main/skills" + }, "kisnet-ytm": { "kind": "external", "location": "https://github.com/cpaikr/ytm/tree/main/skills/kisnet-ytm" @@ -153,6 +164,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "cagr-research", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "clarify", "source": "agent-scripts", @@ -207,6 +224,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "crowe-design", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "darty", "source": "darty", @@ -316,6 +339,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "organize-engagement-files", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "pdf-to-markdown", "source": "agent-scripts", @@ -334,6 +363,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "render-markdown-pdf", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "review-campaign", "source": "agent-scripts", @@ -357,12 +392,24 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "sync-rfi", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "teach", "source": "agent-scripts", "manager": "skills-cli", "mode": "copy" }, + { + "name": "tf-basic-data-prep", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "ui-lab", "source": "agent-scripts", @@ -375,6 +422,12 @@ "manager": "skills-cli", "mode": "copy" }, + { + "name": "wacc-peer-screening", + "source": "kicpa", + "manager": "skills-cli", + "mode": "copy" + }, { "name": "windows-cleanup", "source": "agent-scripts",