From f4d6b4228b6f1262244e0f78b5ab0a7590e7d223 Mon Sep 17 00:00:00 2001 From: KeyInfo Bot Date: Tue, 27 Oct 2026 00:03:14 +0800 Subject: [PATCH] Sync third-party and MCP marketplace plugins Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed. --- config/external-sources.lock.json | 12 ++++++------ .../codex/plugins/mcp-playwright/MCP_SOURCE.json | 2 +- .../plugins/next-skills/THIRD_PARTY_SOURCE.json | 4 ++-- .../codex/plugins/shadcn/THIRD_PARTY_SOURCE.json | 4 ++-- .../plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json | 4 ++-- .../skills/ui-ux-pro-max/scripts/core.py | 2 +- .../scripts/tests/test_web_stack_freshness.py | 14 ++++++++++++++ 7 files changed, 28 insertions(+), 14 deletions(-) diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 3b7ef055..28bcacb8 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -105,8 +105,8 @@ "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", "adapter": "claude-skill", - "commit": "d14efff8ed1faa4187f004f79926f428c8074ec7", - "syncedAt": "2026-10-23T16:00:00Z" + "commit": "28b3b8dee8c976df4fa3e94aed4e092ad43fcb03", + "syncedAt": "2026-10-26T16:00:00Z" }, { "id": "caveman", @@ -132,8 +132,8 @@ "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", "adapter": "claude-skill", - "commit": "481d523374745e77d0cf9c53a4115ab5dd7c8481", - "syncedAt": "2026-10-25T16:00:00Z" + "commit": "8f04138777c1b6996e709993362a7b0a12888ecf", + "syncedAt": "2026-10-26T16:00:00Z" }, { "id": "frontend-slides", @@ -258,8 +258,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "cbf49db30a655ac17c92c2951885c4256db14b9e", - "syncedAt": "2026-10-25T16:00:00Z" + "commit": "b0e1bf792f18c039933d8a9ce9d50d35f930f1be", + "syncedAt": "2026-10-26T16:00:00Z" }, { "id": "shuorenhua", diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index 4dc054d6..2a5c22b5 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-10-25T16:03:14Z" + "syncedAt": "2026-10-26T16:03:14Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index 8c8e3c76..d322a086 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "cbf49db30a655ac17c92c2951885c4256db14b9e", + "commit": "b0e1bf792f18c039933d8a9ce9d50d35f930f1be", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-10-25T16:00:00Z" + "syncedAt": "2026-10-26T16:00:00Z" } diff --git a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json index 01dc3b9f..4469d1d4 100644 --- a/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/shadcn/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "shadcn", "repo": "https://github.com/shadcn-ui/ui.git", "ref": "main", - "commit": "481d523374745e77d0cf9c53a4115ab5dd7c8481", + "commit": "8f04138777c1b6996e709993362a7b0a12888ecf", "adapter": "claude-skill", "sourcePath": "skills/shadcn", - "syncedAt": "2026-10-25T16:00:00Z" + "syncedAt": "2026-10-26T16:00:00Z" } diff --git a/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json index b503502c..6f5a36e6 100644 --- a/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/ui-ux-pro-max/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "ui-ux-pro-max", "repo": "https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git", "ref": "main", - "commit": "d14efff8ed1faa4187f004f79926f428c8074ec7", + "commit": "28b3b8dee8c976df4fa3e94aed4e092ad43fcb03", "adapter": "claude-skill", "sourcePath": ".claude/skills/ui-ux-pro-max", - "syncedAt": "2026-10-23T16:00:00Z" + "syncedAt": "2026-10-26T16:00:00Z" } diff --git a/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/core.py b/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/core.py index 670fe330..80319d68 100755 --- a/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/core.py +++ b/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/core.py @@ -856,7 +856,7 @@ def _stack_query_requests_legacy(query, stack): if current_version is not None and stack_name is not None: matches = re.finditer( rf"\b(?:{stack_name})\s*(?:sdk|ui)?\s*(?:[@(]\s*)?(?:v(?:ersion)?\s*)?" - rf"(\d+)(?:\.(\d+))?\s*\)?", + rf"(\d+)(?:\.(\d+))?(?!\w)\s*\)?", normalized, ) requested_versions = [ diff --git a/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py b/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py index a54b0eaa..2d4dc307 100644 --- a/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py +++ b/plugins/codex/plugins/ui-ux-pro-max/skills/ui-ux-pro-max/scripts/tests/test_web_stack_freshness.py @@ -116,6 +116,20 @@ class TestWebStackFreshness(unittest.TestCase): {row["Status"] for row in result["results"]}, {"deprecated"} ) + def test_number_starting_a_word_is_not_a_version(self): + cases = { + "react": "react 3d canvas effect cleanup", + "html-tailwind": "tailwind 2xl breakpoint", + "angular": "angular 2fa login form", + } + for stack, query in cases.items(): + with self.subTest(stack=stack, query=query): + result = search_stack(query, stack) + self.assertGreater(result["count"], 0) + self.assertNotIn( + "deprecated", {row["Status"] for row in result["results"]} + ) + def test_old_major_without_curated_legacy_guidance_abstains(self): result = search_stack("Astro 5 content collections", "astro") self.assertEqual(result["count"], 0)