readProjectFile('tools/codex-skills/core-guardrails/SKILL.md'); $this->assertStringContainsString('name: core-guardrails', $skill); $this->readProjectFile('tools/codex-skills/core-guardrails/references/boundaries-core.md'); $this->readProjectFile('tools/codex-skills/core-guardrails/references/boundaries-ui.md'); $this->readProjectFile('tools/codex-skills/core-guardrails/references/quality-gates.md'); $this->readProjectFile('tools/codex-skills/core-guardrails/references/source-map.md'); } public function testStarterkitPlannerSkillAndReferencesExist(): void { $skill = $this->readProjectFile('tools/codex-skills/starterkit-planner/SKILL.md'); $this->assertStringContainsString('name: starterkit-planner', $skill); $this->readProjectFile('tools/codex-skills/starterkit-planner/references/plan-template.md'); $this->readProjectFile('tools/codex-skills/starterkit-planner/references/tradeoff-matrix.md'); } public function testStarterkitGridStandardsSkillAndReferencesExist(): void { $skill = $this->readProjectFile('tools/codex-skills/starterkit-grid-standards/SKILL.md'); $this->assertStringContainsString('name: starterkit-grid-standards', $skill); $this->readProjectFile('tools/codex-skills/starterkit-grid-standards/references/list-checklist.md'); $this->readProjectFile('tools/codex-skills/starterkit-grid-standards/references/row-interaction-standard.md'); $this->readProjectFile('tools/codex-skills/starterkit-grid-standards/references/page-size-standard.md'); } public function testStarterkitPhpStyleCiSkillExists(): void { $skill = $this->readProjectFile('tools/codex-skills/starterkit-php-style-ci/SKILL.md'); $this->assertStringContainsString('name: starterkit-php-style-ci', $skill); } public function testCodexPromptsDocumentationReferencesBothSkills(): void { $prompts = $this->readProjectFile('docs/reference-codex-prompts.md'); $this->assertStringContainsString('core-guardrails', $prompts); $this->assertStringContainsString('starterkit-planner', $prompts); } public function testDocsIndexReferencesCodexPrompts(): void { $index = $this->readProjectFile('docs/index.md'); $this->assertStringContainsString('/docs/reference-codex-prompts.md', $index); } public function testCodexSkillsSyncScriptSupportsCheckAndApply(): void { $script = $this->readProjectFile('bin/codex-skills-sync.sh'); $this->assertStringContainsString('--check', $script); $this->assertStringContainsString('--apply', $script); $this->assertStringContainsString('mode="check"', $script); $this->assertStringContainsString('"core-guardrails"', $script); $this->assertStringContainsString('"starterkit-planner"', $script); $this->assertStringContainsString('"starterkit-grid-standards"', $script); $this->assertStringContainsString('"starterkit-php-style-ci"', $script); } public function testDocumentationLinksResolveInReadmeDocsAndSourceMap(): void { $files = [ 'README.md', 'tools/codex-skills/core-guardrails/references/source-map.md', ]; $docFiles = glob($this->projectRootPath() . '/docs/*.md'); $this->assertNotFalse($docFiles, 'Failed to enumerate docs/*.md files.'); foreach ($docFiles as $fullPath) { $files[] = 'docs/' . basename($fullPath); } foreach ($files as $file) { $content = $this->readProjectFile($file); preg_match_all('/(?projectRootPath() . '/' . $normalized; $this->assertFileExists($absolute, sprintf('Broken docs link "%s" in %s', $link, $file)); } } } public function testDocsSkillsAuditPolicyExists(): void { $policy = $this->readProjectFile('agent-system/checks/docs-skills-audit-policy.md'); $this->assertStringContainsString('P0', $policy); $this->assertStringContainsString('P1', $policy); $this->assertStringContainsString('DOCS-SKILLS-AUDIT-00x', $policy); } }