📦 deps(thirdparty): update snapshots

This commit is contained in:
ci[bot]
2026-07-21 00:03:13 +00:00
parent 2c00adccd5
commit 316c012df0
40 changed files with 614 additions and 280 deletions
@@ -3,6 +3,7 @@ from __future__ import annotations
import argparse
import json
import re
import subprocess
import sys
from pathlib import Path
@@ -12,6 +13,30 @@ import sync_repo_metadata
from update_readme import configure_utf8_output, load_metadata, apply_metadata
CURRENT_CORE_PUBLIC_COPY_FILES = [
"README.md",
"docs/users/aas-core.md",
"docs/users/usage.md",
"apps/web-app/index.html",
"apps/web-app/public/llms.txt",
"apps/web-app/public/manifest.webmanifest",
"apps/web-app/public/site.webmanifest",
"apps/web-app/scripts/prerender-routes.js",
"apps/web-app/src/pages/Home.tsx",
"apps/web-app/src/utils/seo.ts",
]
STALE_CORE_COPY_PATTERNS = [
("Core recommender copy", r"\bDiscover\. Recommend\. Validate\. Preview\."),
("Core recommender copy", r"\bdiscover,\s*recommend,\s*validat"),
("Core recommender copy", r"\brecommending,\s*validating,\s*and\s*planning"),
("Core recommender copy", r"\brecommend\s+and\s+plan\s+exact\s+stacks"),
("Core recommender copy", r"\bskill recommendation and stack review\b"),
("Core recommender copy", r"\bReview what AAS Core recommended\b"),
("obsolete catalog count fallback", r"\bHOME_CATALOG_COUNT_FALLBACK\s*=\s*1935\b"),
]
def _read_text(path: Path) -> str:
return path.read_text(encoding="utf-8")
@@ -101,11 +126,26 @@ def _find_manifest_issues(root: Path) -> list[str]:
return issues
def _find_current_core_public_copy_issues(root: Path) -> list[str]:
issues: list[str] = []
for relative_path in CURRENT_CORE_PUBLIC_COPY_FILES:
path = root / relative_path
if not path.is_file():
continue
content = _read_text(path)
for label, pattern in STALE_CORE_COPY_PATTERNS:
if re.search(pattern, content, flags=re.IGNORECASE):
issues.append(f"{relative_path} contains stale {label}")
break
return issues
def find_local_consistency_issues(base_dir: str | Path) -> list[str]:
root = Path(base_dir)
metadata = load_metadata(str(root))
issues: list[str] = []
issues.extend(_find_manifest_issues(root))
issues.extend(_find_current_core_public_copy_issues(root))
package_json = json.loads(_read_text(root / "package.json"))
if package_json.get("description") != _package_expected_description(metadata):
@@ -196,6 +196,8 @@ function writeReleaseNotes(projectRoot, version, sectionContent) {
function runReleaseSuite(projectRoot) {
runCommand("npm", ["run", "validate:references"], projectRoot);
runCommand("npm", ["run", "sync:release-state"], projectRoot);
runCommand("npm", ["run", "plugin-compat:check"], projectRoot);
runCommand("npm", ["run", "bundles:check"], projectRoot);
runCommand("npm", ["run", "test"], projectRoot);
runCommand("npm", ["run", "app:install"], projectRoot);
runCommand("npm", ["run", "app:build"], projectRoot);
@@ -45,7 +45,7 @@ RECOMMENDED_TOPICS = [
"mcp",
]
README_TAGLINE_RE = re.compile(
r"^> \*\*(?:A complete local skill catalog for coding agents—from project inspection and agent-owned selection to a reproducible, reviewable plan\.|Local, deterministic skill-stack composition for coding agents—from an explicit project profile to a reviewable plan before any target change\.|AAS Core is the local, agent-first control plane for composing explainable, reproducible skill stacks from a catalog of \d[\d,]*\+ agentic skills\.|Installable GitHub library of \d[\d,]*\+ agentic skills for Claude Code, Cursor, Codex CLI, (?:Autohand Code, )?Gemini CLI, Antigravity, and other AI coding assistants\.)\*\*$",
r"^> \*\*(?:Local, agent-owned skill stacks for coding agents—from complete catalog access to a reproducible, reviewable plan\.|A complete local skill catalog for coding agents—from project inspection and agent-owned selection to a reproducible, reviewable plan\.|Local, deterministic skill-stack composition for coding agents—from an explicit project profile to a reviewable plan before any target change\.|AAS Core is the local, agent-first control plane for composing explainable, reproducible skill stacks from a catalog of \d[\d,]*\+ agentic skills\.|Installable GitHub library of \d[\d,]*\+ agentic skills for Claude Code, Cursor, Codex CLI, (?:Autohand Code, )?Gemini CLI, Antigravity, and other AI coding assistants\.)\*\*$",
re.MULTILINE,
)
README_TITLE_RE = re.compile(
@@ -71,6 +71,18 @@ README_TOC_BROWSE_RE = re.compile(
r"^- \[Browse \d[\d,]*\+ Skills\]\(#browse-\d+-skills\)$",
re.MULTILINE,
)
README_AGENT_SELECTION_PARAGRAPH_RE = re.compile(
r"^Codex or Claude inspects your project(?:, enumerates its primary capabilities, searches and compares candidates across| and chooses exact skills from) the complete local AAS catalog.*$",
re.MULTILINE,
)
README_SUPPORTING_PLAYBOOKS_RE = re.compile(
r"^The (?:\d[\d,]*\+ )?reusable `SKILL\.md` playbooks, specialized plugins, bundles, workflows, and direct installers remain important\..*$",
re.MULTILINE,
)
README_CAPABILITY_COVERAGE_RE = re.compile(
r"^- \*\*(?:Require|Guide) capability coverage\.\*\* MCP session instructions require the agent to evaluate the full project surface.*$",
re.MULTILINE,
)
GETTING_STARTED_TITLE_RE = re.compile(
r"^# Getting Started with (?:Agentic Awesome Skills \(V[\d.]+\)|AAS Core)$", re.MULTILINE
)
@@ -157,8 +169,8 @@ def sync_readme_copy(content: str, metadata: dict) -> str:
(
README_TAGLINE_RE,
(
"> **A complete local skill catalog for coding agents—from project inspection and agent-owned "
"selection to a reproducible, reviewable plan.**"
"> **Local, agent-owned skill stacks for coding agents—from complete catalog access to a "
"reproducible, reviewable plan.**"
),
),
(
@@ -168,6 +180,34 @@ def sync_readme_copy(content: str, metadata: dict) -> str:
"and outside the supported preview path."
),
),
(
README_AGENT_SELECTION_PARAGRAPH_RE,
(
"Codex or Claude inspects your project and chooses exact skills from the complete local AAS catalog. "
"AAS Core does not rank or recommend them: its read-only `compose_stack` tool validates the "
"agent-owned selection in memory, and a client or the `aas` CLI can persist it as `aas-stack.json` "
"and produce an immutable plan before any target change."
),
),
(
README_SUPPORTING_PLAYBOOKS_RE,
(
"The reusable `SKILL.md` playbooks, specialized plugins, bundles, workflows, and direct installers "
"remain important. They are the content, curation, distribution, and compatibility layers around "
"AAS Core—not competing primary products."
),
),
(
README_CAPABILITY_COVERAGE_RE,
(
"- **Guide capability coverage.** MCP session instructions require the agent to evaluate the full "
"project surface—from architecture, domain behavior, data and integrations through testing, "
"security, UX, deployment, and maintenance—then search each applicable capability, compare "
"multiple candidates, cover it with a non-redundant skill or report a catalog gap, and avoid "
"stopping at a minimal shortlist. Core records and validates the resulting selection, but it "
"does not certify semantic completeness."
),
),
(
README_BROAD_COVERAGE_RE,
(
@@ -210,6 +250,20 @@ def sync_getting_started(content: str, metadata: dict) -> str:
return content
def sync_aas_core_guide(content: str, metadata: dict) -> str:
if metadata["core_included"]:
content = re.sub(
r"--package=agentic-awesome-skills@(?:X\.Y\.Z|[^\s\\]+)",
f"--package=agentic-awesome-skills@{metadata['version']}",
content,
count=1,
)
return content.replace(
"searchable, readable, selectable, and usable",
"searchable, readable, and available for agent selection",
)
def sync_web_index_shell(content: str, metadata: dict) -> str:
skill_label = metadata["total_skills_label"]
return sync_regex_text(
@@ -234,6 +288,10 @@ def sync_llms_text(content: str, metadata: dict) -> str:
(r"Skill count: \d[\d,]*\+\.", f"Skill count: {skill_label}."),
(r"\d[\d,]*\+ reusable SKILL\.md playbooks", f"{skill_label} reusable SKILL.md playbooks"),
(r"\d[\d,]*\+ skill catalog", f"{skill_label} skill catalog"),
(
r"Catalog access: (?:all \d[\d,]* current skills|every current catalog skill) remain individually searchable, readable, and selectable\.",
"Catalog access: every current catalog skill remains individually searchable, readable, and selectable.",
),
],
)
@@ -363,6 +421,7 @@ def sync_curated_docs(base_dir: str, metadata: dict, dry_run: bool) -> int:
updated_files = 0
updated_files += int(update_text_file(root / "README.md", sync_readme_copy, metadata, dry_run))
updated_files += int(update_text_file(root / "docs" / "users" / "getting-started.md", sync_getting_started, metadata, dry_run))
updated_files += int(update_text_file(root / "docs" / "users" / "aas-core.md", sync_aas_core_guide, metadata, dry_run))
updated_files += int(update_text_file(root / "apps" / "web-app" / "index.html", sync_web_index_shell, metadata, dry_run))
updated_files += int(update_text_file(root / "apps" / "web-app" / "public" / "llms.txt", sync_llms_text, metadata, dry_run))
updated_files += int(
@@ -6,6 +6,7 @@ const fs = require("node:fs");
const path = require("node:path");
const repoRoot = path.resolve(__dirname, "../../..");
const packageJson = JSON.parse(fs.readFileSync(path.join(repoRoot, "package.json"), "utf8"));
const publicRoots = [
"README.md",
@@ -79,6 +80,14 @@ for (const relativePath of publicFiles) {
const coreGuide = fs.readFileSync(path.join(repoRoot, "docs/users/aas-core.md"), "utf8");
const usageGuide = fs.readFileSync(path.join(repoRoot, "docs/users/usage.md"), "utf8");
const readme = fs.readFileSync(path.join(repoRoot, "README.md"), "utf8");
const validityBoundary = /Structural and identity validity does not certify semantic fit, compatibility, setup correctness, operational safety, or safety to apply\./;
assert.match(coreGuide, new RegExp(`--package=agentic-awesome-skills@${packageJson.version.replaceAll(".", "\\.")}`));
assert.doesNotMatch(coreGuide, /--package=agentic-awesome-skills@(?:X\.Y\.Z|latest)\b/);
assert.match(coreGuide, validityBoundary);
assert.match(readme, validityBoundary);
assert.doesNotMatch(coreGuide, /selectable, and usable/i);
assert.doesNotMatch(readme, /selectable, and usable/i);
assert.match(coreGuide, /"schemaVersion"\s*:\s*2/);
assert.match(coreGuide, /"profile"\s*:\s*\{/);
assert.match(coreGuide, /"skills"\s*:\s*\[\s*\{\s*"id"\s*:/);
@@ -94,7 +103,7 @@ for (const guide of [coreGuide, usageGuide]) {
assert.match(guide, /smallest\s+stack/i);
assert.match(guide, /no semantic policy|no semantic small-stack policy/i);
assert.match(guide, /technical maximum of 128/i);
assert.match(guide, /1,968[^.\n]{0,180}individually searchable, readable, (?:and )?selectable/i);
assert.match(guide, /every current catalog skill[^.\n]{0,180}individually searchable, readable, (?:and )?(?:selectable|available for agent selection)/i);
assert.match(guide, /compose_stack[\s\S]{0,200}in memory/i);
assert.match(guide, /client or (?:the )?CLI[\s\S]{0,200}persist/i);
assert.match(guide, /export_selection_evidence/);
@@ -112,11 +121,25 @@ for (const guide of [coreGuide, usageGuide]) {
for (const relativePath of ["README.md", "apps/web-app/public/llms.txt"]) {
const content = fs.readFileSync(path.join(repoRoot, relativePath), "utf8");
assert.doesNotMatch(content, /(?:no |without an? )?arbitrary (?:skill-)?count cap/i);
assert.match(content, /no semantic policy/i);
assert.match(content, /no semantic policy|does not rank or recommend/i);
assert.match(content, /technical maximum of 128/i);
assert.match(content, /1,968[^.\n]{0,180}individually searchable, readable, (?:and )?selectable/i);
assert.match(content, /every (?:current )?catalog skill[^.\n]{0,180}(?:individually )?searchable, readable, (?:and )?(?:selectable|available for agent selection)/i);
assert.match(content, /compose_stack[^.\n]{0,160}in memory/i);
assert.match(content, /client or (?:the )?(?:`?aas`? )?CLI[^.\n]{0,160}persist/i);
}
for (const relativePath of [
"apps/web-app/scripts/prerender-routes.js",
"apps/web-app/src/utils/seo.ts",
"apps/web-app/public/manifest.webmanifest",
"apps/web-app/public/site.webmanifest",
]) {
const content = fs.readFileSync(path.join(repoRoot, relativePath), "utf8");
assert.doesNotMatch(
content,
/\b(?:discover(?:y|ing)?,\s*)?recommend(?:ing|ation)?(?:,\s*validat|\s+and\s+stack review)/i,
`${relativePath} must not describe current AAS Core as a recommender`,
);
}
console.log(`AAS Core public documentation contract passed (${publicFiles.length} files scanned).`);
@@ -56,6 +56,22 @@ assert.match(
/check:warning-budget/,
"sync:release-state should enforce the frozen validation warning budget",
);
assert.match(
packageJson.scripts["sync:release-state"],
/chain/,
"sync:release-state should rebuild canonical release and plugin state",
);
assert.match(packageJson.scripts.chain, /plugin-compat:sync/);
assert.match(packageJson.scripts.chain, /bundles:sync/);
const releaseSuiteBlock = releaseWorkflowScript.slice(
releaseWorkflowScript.indexOf("function runReleaseSuite"),
releaseWorkflowScript.indexOf("function runReleasePreflight"),
);
assert.match(
releaseSuiteBlock,
/sync:release-state[\s\S]*plugin-compat:check[\s\S]*bundles:check/,
"every release suite should explicitly prove plugin compatibility and bundle alignment after regeneration",
);
assert.match(
packageJson.scripts["sync:repo-state"],
/sync:web-assets/,
@@ -86,12 +86,12 @@ assert.ok(
"published README must not link to an AAS Core guide path excluded from the npm package",
);
assert.ok(
coreGuide.includes("--package=agentic-awesome-skills@X.Y.Z"),
"AAS Core onboarding must require an explicitly Core-capable release",
coreGuide.includes(`--package=agentic-awesome-skills@${packageJson.version}`),
"AAS Core onboarding must pin the exact published package version",
);
assert.ok(
!coreGuide.includes("--package=agentic-awesome-skills@latest"),
"AAS Core onboarding must not resolve latest while the current dist-tag predates Core",
"AAS Core onboarding must not resolve a moving npm dist-tag",
);
assert.ok(
!/^\s*--runtime-version\b/m.test(coreGuide),
@@ -9,6 +9,9 @@ function normalizeRelativePath(value) {
const projectRoot = findProjectRoot(__dirname);
const pluginsRoot = path.join(projectRoot, "plugins");
const releaseVersion = JSON.parse(
fs.readFileSync(path.join(projectRoot, "package.json"), "utf8"),
).version;
const claudeMarketplace = JSON.parse(
fs.readFileSync(path.join(projectRoot, ".claude-plugin", "marketplace.json"), "utf8"),
);
@@ -24,6 +27,19 @@ const codexPluginPaths = new Set(
);
const knownPluginPaths = new Set([...claudePluginPaths, ...codexPluginPaths]);
const rootClaudeManifest = JSON.parse(
fs.readFileSync(path.join(projectRoot, ".claude-plugin", "plugin.json"), "utf8"),
);
assert.strictEqual(rootClaudeManifest.version, releaseVersion);
assert.strictEqual(claudeMarketplace.metadata.version, releaseVersion);
for (const plugin of claudeMarketplace.plugins) {
assert.strictEqual(
plugin.version,
releaseVersion,
`Claude marketplace version must match the release: ${plugin.name}`,
);
}
for (const relativePluginPath of knownPluginPaths) {
const pluginDir = path.join(projectRoot, relativePluginPath);
assert.ok(fs.existsSync(pluginDir), `plugin directory must exist: ${relativePluginPath}`);
@@ -51,6 +67,11 @@ for (const relativePluginPath of knownPluginPaths) {
const codexManifestPath = path.join(pluginDir, ".codex-plugin", "plugin.json");
if (fs.existsSync(codexManifestPath)) {
const codexManifest = JSON.parse(fs.readFileSync(codexManifestPath, "utf8"));
assert.strictEqual(
codexManifest.version,
releaseVersion,
`Codex plugin version must match the release: ${relativePluginPath}`,
);
assert.strictEqual(codexManifest.skills, "./skills/");
assert.ok(
codexMarketplace.plugins.some((plugin) => plugin.name === codexManifest.name),
@@ -61,6 +82,11 @@ for (const relativePluginPath of knownPluginPaths) {
const claudeManifestPath = path.join(pluginDir, ".claude-plugin", "plugin.json");
if (fs.existsSync(claudeManifestPath)) {
const claudeManifest = JSON.parse(fs.readFileSync(claudeManifestPath, "utf8"));
assert.strictEqual(
claudeManifest.version,
releaseVersion,
`Claude plugin version must match the release: ${relativePluginPath}`,
);
assert.ok(
claudeMarketplace.plugins.some((plugin) => plugin.name === claudeManifest.name),
`Claude marketplace should expose ${claudeManifest.name}`,
@@ -71,7 +71,7 @@ class AuditConsistencyTests(unittest.TestCase):
f"""<!-- registry-sync: version=8.4.0; skills={total_skills}; stars=26132; updated_at=2026-03-21T00:00:00+00:00 -->
# AAS Core — Agentic Awesome Skills
> **A complete local skill catalog for coding agents—from project inspection and agent-owned selection to a reproducible, reviewable plan.**
> **Local, agent-owned skill stacks for coding agents—from complete catalog access to a reproducible, reviewable plan.**
[![GitHub stars](https://img.shields.io/badge/⭐%2026%2C000%2B%20Stars-gold?style=for-the-badge)](https://github.com/sickn33/agentic-awesome-skills/stargazers)
@@ -163,6 +163,20 @@ class AuditConsistencyTests(unittest.TestCase):
self.assertTrue(any("data/skills_index.json" in issue for issue in issues))
def test_local_consistency_flags_current_core_recommender_copy(self):
with tempfile.TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
self.write_repo_state(root)
(root / "apps" / "web-app" / "scripts").mkdir(parents=True)
(root / "apps" / "web-app" / "scripts" / "prerender-routes.js").write_text(
"const copy = 'Discover. Recommend. Validate. Preview.';\n",
encoding="utf-8",
)
issues = audit_consistency.find_local_consistency_issues(root)
self.assertTrue(any("apps/web-app/scripts/prerender-routes.js" in issue for issue in issues))
def test_local_consistency_flags_missing_manifest_fields(self):
with tempfile.TemporaryDirectory() as temp_dir:
root = Path(temp_dir)
@@ -49,8 +49,14 @@ class SyncRepoMetadataTests(unittest.TestCase):
**Current release: V8.3.0.** Trusted by 25k+ GitHub stargazers, this repository combines official and community skill collections with bundles, workflows, installation paths, and docs that help you go from first install to daily use quickly.
Codex or Claude inspects your project, enumerates its primary capabilities, searches and compares candidates across the complete local AAS catalog, and chooses the exact skills. Core imposes no semantic policy that favors a small stack; the manifest format has an explicit technical maximum of 128 skills. All 1,273 skills in the current catalog remain individually searchable, readable, and selectable. AAS Core does not rank or recommend skills. Its read-only `compose_stack` tool validates and returns the agent-owned manifest in memory; a client or the `aas` CLI persists the reviewed stack and its optional selection-evidence sidecar.
The 1,273+ reusable `SKILL.md` playbooks, specialized plugins, bundles, workflows, and direct installers remain important. They are the content, curation, distribution, and compatibility layers around AAS Core—not competing primary products.
- **Broad coverage with real utility**: 1,273+ skills across development, testing, security, infrastructure, product, and marketing.
- **Require capability coverage.** MCP session instructions require the agent to evaluate the full project surface—from architecture, domain behavior, data and integrations through testing, security, UX, deployment, and maintenance—then search each applicable capability, compare multiple candidates, cover it with a non-redundant skill or report a catalog gap, and avoid stopping at a minimal shortlist.
**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)
@@ -82,6 +88,11 @@ class SyncRepoMetadataTests(unittest.TestCase):
"# Getting Started with Agentic Awesome Skills (V8.3.0)\n",
encoding="utf-8",
)
(root / "docs" / "users" / "aas-core.md").write_text(
"npm exec --yes --ignore-scripts --package=agentic-awesome-skills@X.Y.Z -- aas mcp configure\\\n\n"
"Every current catalog skill is searchable, readable, selectable, and usable.\n",
encoding="utf-8",
)
(root / "docs" / "users" / "claude-code-skills.md").write_text(
"- It includes 1,273+ skills instead of a narrow single-domain starter pack.\n",
encoding="utf-8",
@@ -131,11 +142,21 @@ class SyncRepoMetadataTests(unittest.TestCase):
self.assertIn("1,304+ skills across development", 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("Local, agent-owned skill stacks for coding agents", readme)
self.assertIn("AAS Core does not rank or recommend them", readme)
self.assertIn("can persist it as `aas-stack.json`", readme)
self.assertIn("The reusable `SKILL.md` playbooks", readme)
self.assertIn("Guide capability coverage", readme)
self.assertIn("does not certify semantic completeness", readme)
self.assertEqual(
"# Getting Started with AAS Core\n",
(root / "docs" / "users" / "getting-started.md").read_text(encoding="utf-8"),
)
aas_core = (root / "docs" / "users" / "aas-core.md").read_text(encoding="utf-8")
self.assertIn("--package=agentic-awesome-skills@8.4.0", aas_core)
self.assertIn("searchable, readable, and available for agent selection", aas_core)
self.assertNotIn("X.Y.Z", aas_core)
self.assertNotIn("selectable, and usable", aas_core)
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"))
self.assertIn("Total Bundles: 2", (root / "docs" / "users" / "bundles.md").read_text(encoding="utf-8"))
@@ -184,8 +205,8 @@ class SyncRepoMetadataTests(unittest.TestCase):
"version": "15.0.0-rc.1",
"core_included": True,
"core_included_from_major": 15,
"total_skills": 1968,
"total_skills_label": "1,968+",
"total_skills": 1969,
"total_skills_label": "1,969+",
"star_badge_count": "44%2C000%2B",
"star_milestone": "44,000+",
"star_celebration": "44k",
@@ -76,6 +76,27 @@ for (const instructions of [agentInstructions, maintenanceGuide]) {
assert.doesNotMatch(agentInstructions, /review:skills:local|local-skill-reviewer-policy/);
assert.doesNotMatch(maintenanceGuide, /review:skills:local|local-skill-reviewer-policy/);
const maintainerSkill = fs.readFileSync(
path.join(repositoryRoot, "skills", "antigravity-maintainer-batch-release", "SKILL.md"),
"utf8",
);
assert.match(maintainerSkill, /discover every already-configured local AAS MCP host from its real configuration and update each one to the exact same package version/);
assert.match(maintainerSkill, /Pin `agentic-awesome-skills@X\.Y\.Z` and `--version X\.Y\.Z`; never use `latest`/);
assert.match(maintainerSkill, /real MCP `initialize` plus `tools\/list` handshake reports catalog package version `X\.Y\.Z`/);
assert.match(maintainerSkill, /Every stable or prerelease version requires full release alignment/);
assert.match(maintainerSkill, /npm run sync:release-state`, `npm run plugin-compat:check`, and `npm run bundles:check`/);
assert.match(maintainerSkill, /every published Codex\/Claude plugin mirror and editorial-bundle manifest/);
assert.match(maintainerSkill, /explicitly dispatched release-only Pages build/);
assert.match(maintainerSkill, /final generator pass must be idempotent/);
assert.match(agentInstructions, /Every stable or prerelease version must finish with the full-release-alignment gate/);
assert.match(maintenanceGuide, /Run the mandatory full-release-alignment gate/);
const releaseProcess = fs.readFileSync(
path.join(repositoryRoot, "docs", "maintainers", "release-process.md"),
"utf8",
);
assert.match(releaseProcess, /Complete the mandatory full-release-alignment gate/);
assert.match(releaseProcess, /Any mismatch, inaccessible configured host, or stale public surface keeps the release incomplete/);
const publishWorkflow = fs.readFileSync(
path.resolve(__dirname, "..", "..", "..", ".github", "workflows", "publish-npm.yml"),
"utf8",