📦 deps(thirdparty): update snapshots

This commit is contained in:
ci[bot]
2026-06-02 16:01:55 +00:00
parent 8696cd9e52
commit ac7fffe532
834 changed files with 153251 additions and 1426 deletions
@@ -0,0 +1,88 @@
#!/usr/bin/env node
const https = require('node:https');
const DEFAULT_BASE_URL = 'https://sickn33.github.io/antigravity-awesome-skills';
const baseUrl = (process.env.SEO_LIVE_BASE_URL || DEFAULT_BASE_URL).replace(/\/+$/, '');
function fetchText(url, redirectsRemaining = 5) {
return new Promise((resolve, reject) => {
https
.get(url, (response) => {
const status = response.statusCode || 0;
const location = response.headers.location;
if (status >= 300 && status < 400 && location) {
if (redirectsRemaining <= 0) {
reject(new Error(`GET ${url} exceeded redirect limit`));
response.resume();
return;
}
const redirectedUrl = new URL(location, url).toString();
response.resume();
fetchText(redirectedUrl, redirectsRemaining - 1).then(resolve, reject);
return;
}
if (status < 200 || status >= 300) {
reject(new Error(`GET ${url} returned HTTP ${status}`));
response.resume();
return;
}
let body = '';
response.setEncoding('utf8');
response.on('data', (chunk) => {
body += chunk;
});
response.on('end', () => resolve(body));
})
.on('error', reject);
});
}
function assertIncludes(text, snippet, label) {
if (!text.includes(snippet)) {
throw new Error(`${label} missing expected snippet: ${snippet}`);
}
}
function assertNotIncludes(text, snippet, label) {
if (text.includes(snippet)) {
throw new Error(`${label} contains stale snippet: ${snippet}`);
}
}
async function main() {
const [home, plugins, sitemap, llms, robots] = await Promise.all([
fetchText(`${baseUrl}/`),
fetchText(`${baseUrl}/plugins`),
fetchText(`${baseUrl}/sitemap.xml`),
fetchText(`${baseUrl}/llms.txt`),
fetchText(`${baseUrl}/robots.txt`),
]);
assertIncludes(home, 'Antigravity Awesome Skills | 1,494+ AI coding skills and plugins', 'home');
assertIncludes(home, 'SoftwareSourceCode', 'home JSON-LD');
assertIncludes(home, 'FAQPage', 'home JSON-LD');
assertIncludes(home, 'specialized plugins', 'home');
assertNotIncludes(home, 'prompt templates', 'home');
assertIncludes(plugins, 'AAS Specialized Plugins | 15 AI coding workflow packs', 'plugins');
assertIncludes(plugins, 'specialized plugin packs', 'plugins');
assertIncludes(plugins, 'numberOfItems', 'plugins JSON-LD');
assertIncludes(sitemap, `${baseUrl}/plugins`, 'sitemap');
assertIncludes(llms, `${baseUrl}/plugins`, 'llms.txt');
assertIncludes(robots, 'User-agent: GPTBot', 'robots.txt');
assertIncludes(robots, 'User-agent: OAI-SearchBot', 'robots.txt');
assertIncludes(robots, 'User-agent: ClaudeBot', 'robots.txt');
assertIncludes(robots, 'User-agent: PerplexityBot', 'robots.txt');
console.log(`Live SEO/GEO check passed for ${baseUrl}`);
}
main().catch((error) => {
console.error(error.message);
process.exit(1);
});
@@ -12,7 +12,9 @@ from _project_paths import find_repo_root
from update_readme import configure_utf8_output, load_metadata
CONTRIBUTOR_SECTION_HEADING = "## Repo Contributors"
CONTRIBUTOR_SECTION_START = "We officially thank the following contributors for their help in making this repository awesome!\n\n"
CONTRIB_ROCKS_MAX = 500
SPECIAL_LINK_OVERRIDES = {
"Copilot": "https://github.com/apps/copilot-swe-agent",
"github-actions[bot]": "https://github.com/apps/github-actions",
@@ -88,20 +90,26 @@ def render_contributor_lines(contributors: list[str], existing_links: dict[str,
return "\n".join(lines)
def update_repo_contributors_section(content: str, contributors: list[str]) -> str:
existing_links = parse_existing_contributor_links(content)
ordered_contributors = order_contributors_for_render(
contributors,
parse_existing_contributor_order(content),
)
rendered_list = render_contributor_lines(ordered_contributors, existing_links)
def render_repo_contributors_section(repo: str) -> str:
return f"""{CONTRIBUTOR_SECTION_HEADING}
if CONTRIBUTOR_SECTION_START not in content or "\n## " not in content:
<a href="https://github.com/{repo}/graphs/contributors">
<img src="https://contrib.rocks/image?repo={repo}&max={CONTRIB_ROCKS_MAX}" alt="Repository contributors" />
</a>
Made with [contrib.rocks](https://contrib.rocks). *(Image may be cached; [view live contributors](https://github.com/{repo}/graphs/contributors) on GitHub.)*
{CONTRIBUTOR_SECTION_START}
"""
def update_repo_contributors_section(content: str, contributors: list[str], repo: str = "sickn33/antigravity-awesome-skills") -> str:
if CONTRIBUTOR_SECTION_HEADING not in content or "\n## " not in content:
raise ValueError("README.md does not contain the expected Repo Contributors section structure.")
start_index = content.index(CONTRIBUTOR_SECTION_START) + len(CONTRIBUTOR_SECTION_START)
end_index = content.index("\n## ", start_index)
return f"{content[:start_index]}{rendered_list}\n{content[end_index:]}"
start_index = content.index(CONTRIBUTOR_SECTION_HEADING)
end_index = content.index("\n## ", start_index + len(CONTRIBUTOR_SECTION_HEADING))
return f"{content[:start_index]}{render_repo_contributors_section(repo).rstrip()}\n{content[end_index:]}"
def fetch_contributors(repo: str) -> list[str]:
@@ -131,7 +139,7 @@ def sync_contributors(base_dir: str | Path, dry_run: bool = False) -> bool:
contributors = fetch_contributors(metadata["repo"])
readme_path = root / "README.md"
original = readme_path.read_text(encoding="utf-8")
updated = update_repo_contributors_section(original, contributors)
updated = update_repo_contributors_section(original, contributors, metadata["repo"])
if updated == original:
return False
@@ -49,9 +49,8 @@ README_NEW_HERE_RE = re.compile(
r"^\*\*Antigravity Awesome Skills\*\* \(Release [\d.]+\) is a large, installable skill library.*$",
re.MULTILINE,
)
README_BROWSE_RE = re.compile(
r'^If you want a faster answer than "browse all \d[\d,]*\+ skills", start with a tool-specific guide:$',
re.MULTILINE,
README_INLINE_BROWSE_RE = re.compile(
r"\[📚 Browse \d[\d,]*\+ Skills\]\(#browse-\d+-skills\)"
)
README_TOC_BROWSE_RE = re.compile(
r"^- \[Browse \d[\d,]*\+ Skills\]\(#browse-\d+-skills\)$",
@@ -70,7 +69,7 @@ def build_about_description(metadata: dict) -> str:
return (
f"Installable GitHub library of {metadata['total_skills_label']} agentic skills for "
"Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. "
"Includes installer CLI, bundles, workflows, and official/community skill collections."
"Includes specialized plugins, installer CLI, bundles, workflows, and official/community skill collections."
)
@@ -161,14 +160,15 @@ def sync_readme_copy(content: str, metadata: dict) -> str:
README_NEW_HERE_RE,
(
f"**Antigravity Awesome Skills** (Release {metadata['version']}) is a large, installable "
"skill library for AI coding assistants. It includes onboarding docs, bundles, workflows, "
"generated catalogs, and a CLI installer so you can move from discovery to actual usage "
"without manually stitching together dozens of repos."
f"skill library for AI coding assistants. It packages {metadata['total_skills_label']} reusable "
"`SKILL.md` playbooks, specialized plugins, bundles, workflows, generated catalogs, and a CLI "
"installer so Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, and similar tools can "
"reuse proven operating instructions instead of one-off prompts."
),
),
(
README_BROWSE_RE,
f'If you want a faster answer than "browse all {metadata["total_skills_label"]} skills", start with a tool-specific guide:',
README_INLINE_BROWSE_RE,
f"[📚 Browse {metadata['total_skills_label']} Skills](#browse-{metadata['total_skills']}-skills)",
),
(
README_TOC_BROWSE_RE,
@@ -65,11 +65,11 @@ assert.ok(
);
assert.ok(
antigravityMessages.some((message) => message.includes("--agy")),
"Antigravity installs should point agy CLI users to the flat CLI layout",
"Antigravity installs should point agy CLI users to the dedicated CLI layout",
);
const agyMessages = installer.getPostInstallMessages([
{ name: "Antigravity CLI", path: "/tmp/.gemini/antigravity-cli/skills", layout: "flat-markdown" },
{ name: "Antigravity CLI", path: "/tmp/.gemini/antigravity-cli/skills" },
]);
assert.ok(
@@ -95,34 +95,36 @@ try {
const nestedDir = path.join(tempDir, "skills", "security", "audit");
fs.mkdirSync(alphaDir, { recursive: true });
fs.mkdirSync(nestedDir, { recursive: true });
fs.mkdirSync(path.join(tempDir, "docs"), { recursive: true });
fs.mkdirSync(targetDir, { recursive: true });
fs.writeFileSync(path.join(alphaDir, "SKILL.md"), "---\nname: alpha\n---\n\n# Alpha\n", "utf8");
fs.writeFileSync(path.join(nestedDir, "SKILL.md"), "---\nname: audit\n---\n\n# Audit\n", "utf8");
fs.writeFileSync(path.join(tempDir, "docs", "README.md"), "# Docs\n", "utf8");
assert.deepStrictEqual(
installer.getManagedEntries(["alpha", "security/audit", "docs"], { layout: "flat-markdown" }),
["alpha.md", "audit.md"],
"agy CLI flat installs should track markdown skill files instead of skill directories",
installer.getManagedEntries(["alpha", "security/audit", "docs"], {}),
["alpha", "security/audit", "docs"],
"agy CLI installs should track skill directories with nested SKILL.md files",
);
installer.installSkillsIntoFlatMarkdownTarget(tempDir, targetDir, [
installer.installSkillsIntoTarget(tempDir, targetDir, [
"alpha",
"security/audit",
"docs",
]);
assert.strictEqual(
fs.readFileSync(path.join(targetDir, "alpha.md"), "utf8"),
fs.readFileSync(path.join(targetDir, "alpha", "SKILL.md"), "utf8"),
"---\nname: alpha\n---\n\n# Alpha\n",
);
assert.strictEqual(
fs.readFileSync(path.join(targetDir, "audit.md"), "utf8"),
fs.readFileSync(path.join(targetDir, "security", "audit", "SKILL.md"), "utf8"),
"---\nname: audit\n---\n\n# Audit\n",
);
assert.strictEqual(
fs.existsSync(path.join(targetDir, "docs")),
false,
"agy CLI flat installs should not copy docs as a slash-command entry",
true,
"agy CLI installs should preserve the standard skills-only layout, including docs",
);
} finally {
fs.rmSync(fixtureRoot, { recursive: true, force: true });
@@ -16,6 +16,7 @@ const LOCAL_TEST_COMMANDS = [
[path.join(TOOL_TESTS, "build_catalog_bundles.test.js")],
[path.join(TOOL_TESTS, "claude_plugin_marketplace.test.js")],
[path.join(TOOL_TESTS, "codex_plugin_marketplace.test.js")],
[path.join(TOOL_TESTS, "specialized_plugin_candidates.test.js")],
[path.join(TOOL_TESTS, "plugin_directories.test.js")],
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_editorial_bundles.py")],
[path.join(TOOL_SCRIPTS, "run-python.js"), path.join(TOOL_TESTS, "test_plugin_compatibility.py")],
@@ -0,0 +1,75 @@
const assert = require("assert");
const fs = require("fs");
const path = require("path");
const { findProjectRoot } = require("../../lib/project-root");
const projectRoot = findProjectRoot(__dirname);
const candidatesPath = path.join(projectRoot, "data", "specialized-plugin-candidates.json");
const bundlesPath = path.join(projectRoot, "data", "editorial-bundles.json");
const skillsIndexPath = path.join(projectRoot, "data", "skills_index.json");
const codexMarketplacePath = path.join(projectRoot, ".agents", "plugins", "marketplace.json");
const claudeMarketplacePath = path.join(projectRoot, ".claude-plugin", "marketplace.json");
const candidates = JSON.parse(fs.readFileSync(candidatesPath, "utf8")).candidates || [];
const bundles = JSON.parse(fs.readFileSync(bundlesPath, "utf8")).bundles || [];
const skills = JSON.parse(fs.readFileSync(skillsIndexPath, "utf8"));
const codexMarketplace = JSON.parse(fs.readFileSync(codexMarketplacePath, "utf8"));
const claudeMarketplace = JSON.parse(fs.readFileSync(claudeMarketplacePath, "utf8"));
const bundlesById = new Map(bundles.map((bundle) => [bundle.id, bundle]));
const skillsById = new Map(skills.map((skill) => [skill.id, skill]));
const codexPluginNames = new Set(codexMarketplace.plugins.map((plugin) => plugin.name));
const claudePluginNames = new Set(claudeMarketplace.plugins.map((plugin) => plugin.name));
assert.ok(candidates.length >= 10, "specialized plugin candidates should include a meaningful shortlist");
for (const candidate of candidates) {
assert.match(candidate.id, /^[a-z0-9]+(?:-[a-z0-9]+)*$/, `candidate ${candidate.id} should use a host-neutral id convention`);
assert.ok(!candidate.id.startsWith("codex-"), `candidate ${candidate.id} should not brand the plugin name around Codex`);
assert.ok(!/^Codex\b/.test(candidate.name), `candidate ${candidate.id} display name should not start with Codex`);
assert.ok(
candidate.skills.length >= 5 && candidate.skills.length <= 10,
`candidate ${candidate.id} should stay within the focused 5-10 skill range`,
);
const bundle = bundlesById.get(candidate.id);
assert.ok(bundle, `candidate ${candidate.id} must be enabled in data/editorial-bundles.json`);
assert.strictEqual(bundle.name, candidate.name, `candidate ${candidate.id} bundle name should match`);
assert.deepStrictEqual(
bundle.skills.map((skill) => skill.id),
candidate.skills,
`candidate ${candidate.id} bundle skills should match the candidate manifest`,
);
const pluginRoot = path.join(projectRoot, "plugins", `antigravity-bundle-${candidate.id}`);
assert.ok(fs.existsSync(pluginRoot), `candidate ${candidate.id} plugin directory should exist`);
assert.ok(
fs.existsSync(path.join(pluginRoot, ".codex-plugin", "plugin.json")),
`candidate ${candidate.id} should have a Codex plugin manifest`,
);
assert.ok(
fs.existsSync(path.join(pluginRoot, ".claude-plugin", "plugin.json")),
`candidate ${candidate.id} should have a Claude plugin manifest`,
);
assert.ok(
codexPluginNames.has(`agyb-${candidate.id}`),
`candidate ${candidate.id} should be listed in the Codex marketplace`,
);
assert.ok(
claudePluginNames.has(`antigravity-bundle-${candidate.id}`),
`candidate ${candidate.id} should be listed in the Claude marketplace`,
);
for (const skillId of candidate.skills) {
const skill = skillsById.get(skillId);
assert.ok(skill, `candidate ${candidate.id} references missing skill ${skillId}`);
assert.strictEqual(skill.plugin?.targets?.codex, "supported", `${skillId} should be Codex plugin-safe`);
assert.strictEqual(skill.plugin?.targets?.claude, "supported", `${skillId} should be Claude plugin-safe`);
assert.ok(
fs.existsSync(path.join(pluginRoot, "skills", ...skillId.split("/"), "SKILL.md")),
`candidate ${candidate.id} should materialize skill ${skillId}`,
);
}
}
console.log("ok");
@@ -78,7 +78,7 @@ class AuditConsistencyTests(unittest.TestCase):
- **Broad coverage with real utility**: {count_label} skills across development, testing, security, infrastructure, product, and marketing.
If you want a faster answer than "browse all {count_label} skills", start with a tool-specific guide:
**Start here:** [Install in 1 minute](#installation) · [Recommended plugins](#recommended-specialized-plugins) · [Choose your tool](#choose-your-tool) · [📚 Browse {count_label} Skills](#browse-{total_skills}-skills) · [Bundles & workflows](#bundles--workflows) · [Support the project](#support-the-project)
""",
encoding="utf-8",
)
@@ -62,10 +62,10 @@ We officially thank the following contributors for their help in making this rep
["alice", "github-actions[bot]", "Copilot", "new-user"],
)
self.assertIn("- [@alice](https://github.com/alice)", updated)
self.assertIn("- [@github-actions[bot]](https://github.com/apps/github-actions)", updated)
self.assertIn("- [@Copilot](https://github.com/apps/copilot-swe-agent)", updated)
self.assertIn("- [@new-user](https://github.com/new-user)", updated)
self.assertIn("https://contrib.rocks/image?repo=sickn33/antigravity-awesome-skills&max=500", updated)
self.assertIn("https://github.com/sickn33/antigravity-awesome-skills/graphs/contributors", updated)
self.assertNotIn("- [@alice]", updated)
self.assertNotIn("- [@new-user]", updated)
self.assertEqual(updated.count("## Repo Contributors"), 1)
self.assertEqual(updated.count("## License"), 1)
@@ -80,7 +80,7 @@ We officially thank the following contributors for their help in making this rep
["alice", "github-actions[bot]", "bob", "new-a", "new-z"],
)
def test_update_repo_contributors_section_avoids_reordering_existing_entries(self):
def test_update_repo_contributors_section_removes_manual_list(self):
content = """## Repo Contributors
<a href="https://github.com/sickn33/antigravity-awesome-skills/graphs/contributors">
@@ -108,15 +108,7 @@ We officially thank the following contributors for their help in making this rep
1,
)[1].split("\n## License", 1)[0]
self.assertEqual(
contributor_block.strip().splitlines(),
[
"- [@alice](https://github.com/alice)",
"- [@github-actions[bot]](https://github.com/apps/github-actions)",
"- [@bob](https://github.com/bob)",
"- [@new-user](https://github.com/new-user)",
],
)
self.assertNotIn("- [@", contributor_block)
def test_parse_contributors_response_dedupes_and_sorts_order(self):
payload = [
@@ -48,11 +48,11 @@ class SyncRepoMetadataTests(unittest.TestCase):
- **Broad coverage with real utility**: 1,273+ skills across development, testing, security, infrastructure, product, and marketing.
**Start here:** [Install in 1 minute](#installation) · [Recommended plugins](#recommended-specialized-plugins) · [Choose your tool](#choose-your-tool) · [📚 Browse 1,273+ Skills](#browse-1273-skills) · [Bundles & workflows](#bundles--workflows) · [Support the project](#support-the-project)
- [Browse 1,273+ Skills](#browse-1273-skills)
**Antigravity Awesome Skills** (Release 8.3.0) is a large, installable skill library for AI coding assistants. It includes onboarding docs, bundles, workflows, generated catalogs, and a CLI installer so you can move from discovery to actual usage without manually stitching together dozens of repos.
If you want a faster answer than "browse all 1,273+ skills", start with a tool-specific guide:
**Antigravity Awesome Skills** (Release 8.3.0) is a large, installable skill library for AI coding assistants. It packages 1,273+ reusable `SKILL.md` playbooks, specialized plugins, bundles, workflows, generated catalogs, and a CLI installer so Claude Code, Codex CLI, Cursor, Gemini CLI, Antigravity, and similar tools can reuse proven operating instructions instead of one-off prompts.
""",
encoding="utf-8",
)
@@ -110,7 +110,9 @@ If you want a faster answer than "browse all 1,273+ skills", start with a tool-s
self.assertGreaterEqual(updated_files, 10)
readme = (root / "README.md").read_text(encoding="utf-8")
self.assertIn("1,304+ agentic skills", readme)
self.assertIn("[📚 Browse 1,304+ Skills](#browse-1304-skills)", readme)
self.assertIn("[Browse 1,304+ Skills](#browse-1304-skills)", readme)
self.assertIn("1,304+ reusable `SKILL.md` playbooks", readme)
self.assertIn("V8.4.0", (root / "docs" / "users" / "getting-started.md").read_text(encoding="utf-8"))
self.assertIn("1,304+ files", (root / "docs" / "users" / "gemini-cli-skills.md").read_text(encoding="utf-8"))
self.assertIn("1,304+ specialized areas", (root / "docs" / "users" / "kiro-integration.md").read_text(encoding="utf-8"))