The hex-color check in scripts/validate.js is silently a no-op. The guard
reads node.name.name === 'className', but SWC's AST exposes the
JSXAttribute identifier on .name.value. The condition is always false,
so the inner regex test never runs and tailwindIssues stays empty
regardless of input.
Effect today: validate.js correctly enforces the Props-interface rule
but does not enforce the no-hardcoded-hex rule. Components like
<div className="bg-[#ff0000]">...</div>
pass validation. The CI smoke test happens to be green because
gold-standard-card.tsx has no hex codes.
Fix: accept both AST shapes (.name?.value and .name?.name) so the guard
stays correct against the current SWC release and against any future
revision that flips the field back. Optional chaining added so a
malformed node can't NPE the walker.
Reproducer (before patch, prints '0 hex codes'):
echo 'export function X(){return <div className="bg-[#ff0000]">x</div>;}' > /tmp/bad.tsx
node scripts/validate.js /tmp/bad.tsx
After patch, the same input prints '1 hardcoded hex codes' and exits 1.
The existing examples/gold-standard-card.tsx continues to validate clean.
Reorganize flat skills/ directory into three plugins under plugins/:
- stitch-design: 6 core design workflow skills
- stitch-build: 3 code generation and build skills
- stitch-utilities: 4 design utility and assistant skills
Each plugin has a plugin.json manifest following the Agent Skills
plugin standard (matching himself65/finance-skills pattern).
Installation: npx plugins add google-labs-code/stitch-skills