Projex is in active development. We welcome contributions from experienced developers who understand the shadcn philosophy: own your code, use good defaults, avoid opinions.
# Clone the repository
git clone https://github.com/ManningWorks/Projex.git
cd Projexprojex/
├── packages/
│ ├── core/ # Main component library (includes CLI)
│ └── docs/ # VitePress documentation
├── project_docs/ # Internal documentation (PRDs, briefings)
└── scripts/ # Utility scripts
Projex follows strict code style conventions to maintain consistency and quality. Please review AGENTS.md for detailed guidelines.
- Strict mode - always enabled
- No comments - code should be self-documenting
- Explicit return types on exported functions
- Prefer interfaces over types for object shapes
- Use discriminated unions for variants
- Compound components for flexibility
- Render nothing for empty data - return null
- Data attributes on every element for styling hooks
- No inline styles in library code
- Build-time only - use Next.js
fetchwith{ cache: 'force-cache' } - Never fetch client-side
- Return null on fetch failures - never throw
- Never throw from component code
- Return null on failures
- Log warnings for recoverable issues
We maintain high test coverage (>97% lines). All contributions must include tests.
# Run all tests
pnpm test
# Run tests with coverage
pnpm --filter @manningworks/projex test:coverage
# Run tests in watch mode
pnpm --filter @manningworks/projex test:watch
# Run benchmarks
pnpm benchmark- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests and ensure they pass (
pnpm test && pnpm typecheck && pnpm lint) - Commit your changes with clear messages
- Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- All tests must pass
- Type checking must succeed
- No linting warnings
- New features must include tests
- Documentation updates if needed
- Follow semantic versioning for breaking changes
The public API is documented in CHANGELOG.md. Breaking changes to public exports require a major version bump.
- Components:
ProjectCard,ProjectView,ProjectList,FeaturedProject - Utilities:
defineProjects,normalise, all filter/sort functions, API fetchers - Types:
ProjexProject,ProjexProjectInput, all discriminated union types - Data attributes: All
data-projex-*attributes for CSS targeting
- File structure and organization
- Internal helper functions not exported from
index.ts - Test utilities and fixtures
- Build configuration
Releases are automated via GitHub Actions on version tags.
# Bump version in package.json files
# Commit changes with "Release v1.x.x"
git tag v1.x.x
git push origin v1.x.xThe CI pipeline will:
- Run all tests and checks
- Build all packages
- Publish to npm
Documentation lives in packages/docs/ using VitePress.
# Run docs locally
pnpm --filter @manningworks/docs devWhen contributing new features:
- Update TypeScript types and interfaces
- Add/update tests
- Update the main README if the API changes
- Update VitePress docs for public APIs
- Update
CHANGELOG.mdwith the changes
Feel free to open an issue for questions or discussion about potential contributions.