Files
stack/packages/mosaic/framework/tools/quality
Hermes Agent 8bee1b65ea
Some checks failed
ci/woodpecker/pr/ci Pipeline failed
feat(mosaic): durable pre-update snapshot + verify net + restore CLI (#791 PR2)
Third, independent recovery layer for keep-mode upgrades (Part of #791). PR1's
manifest keeps the sync out of operator paths and the ephemeral /tmp snapshot
rolls back a mid-write crash; this adds the case neither covers — a "successful"
upgrade that a manifest/logic bug silently let touch an operator file.

- install.sh make_durable_snapshot(): before any mutation, copy the operator-owned
  surface that exists to $XDG_STATE_HOME/mosaic/backups/pre-update-<UTC-ts>/
  (0700 dirs / 0600 files, umask 077 scoped + restored). Fail-open; retention
  MOSAIC_BACKUP_RETENTION (default 5).
- install.sh verify_operator_surface(): post-sync, restore any operator file the
  upgrade diverged/removed and warn loudly (a divergence = manifest bug). Honors
  intentional migration removals; refuses to restore through a symlink (CWE-59);
  guards mkdir under set -e.
- mosaic restore (TS): --list (default dry-run), --from <ts> confirmation-gated
  restore. Strict timestamp selector (CWE-22), O_NOFOLLOW 0600 writes (CWE-59),
  containment + managed-dir checks via secure-file.ts. Counts/paths only — never
  emits file contents (secrev).
- Gates: typecheck/lint/format ✓; mosaic vitest 1252; restore.spec 30;
  bash gates durable-snapshot 41 / manifest-guard 193 / rollback 28 / migration 21.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-16 19:04:14 -05:00
..

Quality Rails

Portable quality enforcement for TypeScript, Python, and Node.js projects.

🎯 What This Prevents

Based on real-world validation of 50 issues in a production codebase:

  • Hardcoded passwords
  • SQL injection vulnerabilities
  • Type safety violations (any types)
  • Missing test coverage
  • Build failures
  • Dependency vulnerabilities

70% of these issues are prevented mechanically with quality-rails.

Quick Start (Mosaic)

New Project

# Apply template from Mosaic
~/.config/mosaic/bin/mosaic-quality-apply --template typescript-node --target /path/to/project

# Install dependencies
cd /path/to/project
npm install

# Initialize git hooks
npx husky install

# Verify enforcement is working
~/.config/mosaic/bin/mosaic-quality-verify --target /path/to/project

Existing Project

# Same as above - works for new or existing projects
~/.config/mosaic/bin/mosaic-quality-apply --template typescript-node --target /path/to/existing-project

🛡️ What You Get

TypeScript strict mode - All type checks enabled ESLint blocking any types - no-explicit-any: error Pre-commit hooks - Type check + lint + format before commit Secret scanning (gitleaks) - Block hardcoded passwords/API keys (pre-commit + CI) CI/CD templates - Woodpecker, GitHub Actions, GitLab Test coverage enforcement - 80% threshold Security scanning - npm audit, OWASP checks

📦 Available Templates

Template Language Framework Status
typescript-node TypeScript Node.js Ready
typescript-nextjs TypeScript Next.js Ready
monorepo TypeScript TurboRepo + pnpm Ready
python Python - 🚧 Coming Soon

Monorepo Template

Perfect for projects combining Next.js frontend + NestJS backend in one repository.

Features:

  • 🎯 Multi-package aware - lint-staged only checks changed packages
  • TurboRepo caching - Faster builds and tests
  • 🔀 Parallel dev servers - Run web + API simultaneously
  • 📦 pnpm workspaces - Efficient dependency management
  • 🛡️ Package-specific rules - Next.js and NestJS get appropriate ESLint configs

Example structure:

monorepo/
├── apps/
│   ├── web/    # Next.js frontend
│   └── api/    # NestJS backend
└── packages/
    ├── shared-types/
    ├── ui/
    └── config/

🧪 How It Works

Pre-Commit (Local Enforcement)

# You try to commit code with a type error
git commit -m "Add feature"

# Quality rails blocks it:
❌ Type error: Type 'number' is not assignable to type 'string'
❌ ESLint: Unexpected any. Specify a different type.
✋ Commit blocked - fix errors and try again

CI/CD (Remote Enforcement)

# Woodpecker pipeline runs:
✓ gitleaks (secret scanning — parallel, no deps)
✓ npm audit (dependency security)
✓ eslint (code quality)
✓ tsc --noEmit (type checking)
✓ jest --coverage (tests + coverage)
✓ npm run build (compilation — gates on all above)
# If any step fails, merge is blocked

🎓 Philosophy

Process compliance doesn't work.

Instructing AI agents to "do code review" or "run tests" fails. They claim to follow processes but output quality doesn't match claims.

Mechanical enforcement works.

Quality rails don't ask agents to follow processes. They block commits that don't pass automated checks.

  • Type errors? → Commit blocked
  • Hardcoded secrets? → Commit blocked
  • Test failures? → Commit blocked
  • Missing coverage? → Commit blocked

This works for any agent runtime (Codex, Claude, OpenCode, Gemini, etc.) because enforcement is mechanical, not instructional.

Read more: PHILOSOPHY.md

📖 Documentation

🔧 Scripts

Script Purpose
scripts/install.sh Install template to project (Linux/Mac)
scripts/install.ps1 Install template to project (Windows)
scripts/verify.sh Verify enforcement is working (Linux/Mac)
scripts/verify.ps1 Verify enforcement is working (Windows)

🚀 Roadmap

  • TypeScript/Node template
  • Pre-commit enforcement (husky + lint-staged)
  • CI/CD templates (Woodpecker, GitHub Actions)
  • Installation scripts
  • Verification testing
  • Next.js template
  • Monorepo template
  • Python template
  • Coverage visualization
  • IDE integration (VSCode extension)

🤝 Contributing

Quality Rails is based on lessons learned from real production codebases. Contributions welcome!

📝 License

MIT License - See LICENSE file for details

🙏 Credits

Built to solve real problems discovered in AI-assisted development workflows.

Based on validation findings from a production patch milestone.