diff --git a/CHANGELOG.md b/CHANGELOG.md index c19e5245..3cffa914 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,29 @@ All notable changes to the SIN-Code unified binary will be documented in this fi ## [Unreleased] - 2026-06-16 +### Added — Shop-Center skill integration (issue #142 fusion) +- **`KnownSkills()` registry extended** with the three shop skills + (issue #142 acceptance criterion #2 — installable via + `sin-code skill install `): + - `shop-cj-dropshipping` → `cj-dropshipping-skill` + - `shop-stripe` → `SIN-Stripe-Bundle` + - `shop-tiktok` → `SIN-eCommerce-Scraper-Bundle` +- **Bundled `SKILL.md` files** (cj-dropshipping, stripe, tiktok) + already carry `lifecycle: external` + `sources:` frontmatter + (added by PR #218 / issue #139). The `sources:` field points + to the canonical external repos so the operator can discover + the upstream implementation directly from the bundled skill. +- **New test** `TestKnownSkillsHasShopEntries` in + `cmd/sin-code/internal/skillmgr/manager_test.go` asserts the + three entries are present with the correct repo mapping. +- **Validation passes** — `validate_skill.py --all-bundled + --strict` reports `0 failed` for the 34 skills (the 3 shop + skills were migrated by PR #218). +- **Long-term fusion strategy** documented in the issue body: + phase 1 (external canonical) → phase 2 (bundled doc, done) → + phase 3 (native subcommand) → phase 4 (deprecate upstream). + Phase 3 is deferred until the shop domain matures. + ### Added — `sin-code grill` (issue #141 fusion, native implementation) - **New package** `cmd/sin-code/internal/grill/` with 4 source files (`types.go`, `catalog.go`, `manager.go`, `grill_test.go`) diff --git a/cmd/sin-code/internal/skillmgr/manager.go b/cmd/sin-code/internal/skillmgr/manager.go index 74f83432..ac7bca71 100644 --- a/cmd/sin-code/internal/skillmgr/manager.go +++ b/cmd/sin-code/internal/skillmgr/manager.go @@ -51,6 +51,15 @@ func KnownSkills() map[string]string { "browser": "SIN-Browser-Tools", "simone": "Simone-MCP", "symfonylens": "SIN-Code-Symfony-Lens", + // Shop / commerce (issue #142 fusion). The bundled skills + // document the canonical implementation; the source repos + // listed below are the install targets for + // `sin-code skill install `. The skill name and + // repo are 1:1 unless a single repo covers multiple + // bundled skills (see skillmgr.InstallBatch). + "shop-cj-dropshipping": "cj-dropshipping-skill", + "shop-stripe": "SIN-Stripe-Bundle", + "shop-tiktok": "SIN-eCommerce-Scraper-Bundle", } } diff --git a/cmd/sin-code/internal/skillmgr/manager_test.go b/cmd/sin-code/internal/skillmgr/manager_test.go index 6ba931e8..892eedb5 100644 --- a/cmd/sin-code/internal/skillmgr/manager_test.go +++ b/cmd/sin-code/internal/skillmgr/manager_test.go @@ -21,6 +21,27 @@ func TestKnownSkillsCoversRegistry(t *testing.T) { } } +func TestKnownSkillsHasShopEntries(t *testing.T) { + // Issue #142 fusion: the three shop skills (CJ Dropshipping, + // Stripe, TikTok Shop) are in KnownSkills so `sin-code skill + // install ` works. The mapping is shortname -> repo. + ks := KnownSkills() + for name, want := range map[string]string{ + "shop-cj-dropshipping": "cj-dropshipping-skill", + "shop-stripe": "SIN-Stripe-Bundle", + "shop-tiktok": "SIN-eCommerce-Scraper-Bundle", + } { + got, ok := ks[name] + if !ok { + t.Errorf("expected %q in KnownSkills (issue #142)", name) + continue + } + if got != want { + t.Errorf("KnownSkills[%q] = %q, want %q", name, got, want) + } + } +} + func TestInstallUnknownSkillFails(t *testing.T) { _, err := Install(context.Background(), "no-such-skill-xyz") if err == nil {