Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 <name>`):
- `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`)
Expand Down
9 changes: 9 additions & 0 deletions cmd/sin-code/internal/skillmgr/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 <name>`. 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",
}
}

Expand Down
21 changes: 21 additions & 0 deletions cmd/sin-code/internal/skillmgr/manager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 <name>` 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 {
Expand Down
Loading