diff --git a/.githooks/pre-commit b/.githooks/pre-commit new file mode 100755 index 00000000..985248ad --- /dev/null +++ b/.githooks/pre-commit @@ -0,0 +1,10 @@ +#!/bin/bash +# Git pre-commit hook to automatically sync package-lock.json +# Install: ln -sf ../../.githooks/pre-commit .git/hooks/pre-commit + +export GIT_HOOK="pre-commit" + +# Run the sync script +./scripts/sync-lockfile.sh + +exit $? diff --git a/.github/workflows/validate-lockfile.yml b/.github/workflows/validate-lockfile.yml new file mode 100644 index 00000000..af9d32f4 --- /dev/null +++ b/.github/workflows/validate-lockfile.yml @@ -0,0 +1,48 @@ +name: Validate Package Lock File + +on: + pull_request: + paths: + - 'npm/**/package.json' + - 'npm/package-lock.json' + push: + branches: + - main + - develop + paths: + - 'npm/**/package.json' + - 'npm/package-lock.json' + +jobs: + validate-lockfile: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + cache-dependency-path: npm/package-lock.json + + - name: Validate lock file is in sync + run: | + cd npm + npm ci --dry-run + + - name: Check for lock file changes needed + if: failure() + run: | + echo "❌ package-lock.json is out of sync with package.json" + echo "" + echo "To fix this issue:" + echo " 1. Run: cd npm && npm install" + echo " 2. Commit the updated package-lock.json" + echo " 3. Push to your branch" + echo "" + echo "Or use the automated script:" + echo " ./scripts/sync-lockfile.sh" + exit 1 diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 00000000..64fa1c9f --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,226 @@ +# Contributing to RuVector + +Thank you for your interest in contributing to RuVector! + +## Development Setup + +### 1. Clone the Repository + +```bash +git clone https://github.com/ruvnet/ruvector.git +cd ruvector +``` + +### 2. Install Dependencies + +```bash +cd npm +npm install +``` + +### 3. Install Git Hooks (Recommended) + +We provide git hooks that automatically keep `package-lock.json` in sync: + +```bash +./scripts/install-hooks.sh +``` + +This will: +- Automatically run `npm install` when you modify `package.json` +- Stage the updated `package-lock.json` automatically +- Prevent CI/CD failures due to lock file mismatches + +## Package Management + +### Adding Dependencies + +When adding new dependencies to any package: + +```bash +cd npm/packages/ +npm install +``` + +**Important**: Always commit the updated `package-lock.json` with your changes! + +### Manual Lock File Sync + +If you forget to sync the lock file, you can use our helper script: + +```bash +./scripts/sync-lockfile.sh +``` + +## Common Issues + +### CI/CD Fails with "Lock file out of sync" + +**Problem**: `npm ci` fails with: +``` +npm error `npm ci` can only install packages when your package.json and package-lock.json are in sync +``` + +**Solution**: +```bash +cd npm +npm install +git add package-lock.json +git commit -m "fix: Sync package-lock.json" +git push +``` + +Or use the automated script: +```bash +./scripts/sync-lockfile.sh +``` + +### Pre-commit Hook Not Working + +If the git hook isn't triggering: + +```bash +# Reinstall hooks +./scripts/install-hooks.sh + +# Verify hook is executable +ls -la .git/hooks/pre-commit +``` + +## Development Workflow + +1. **Create a feature branch** + ```bash + git checkout -b feat/your-feature-name + ``` + +2. **Make your changes** + - Write code in the appropriate package + - Add tests for new features + - Update documentation + +3. **Build and test** + ```bash + cd npm + npm run build + npm test + ``` + +4. **Commit your changes** + ```bash + git add . + git commit -m "feat: Your descriptive commit message" + ``` + + The pre-commit hook will automatically sync the lock file if needed. + +5. **Push and create PR** + ```bash + git push origin feat/your-feature-name + ``` + +## Package Structure + +``` +ruvector/ +├── npm/ +│ ├── core/ # @ruvector/core - Native Rust bindings +│ ├── packages/ +│ │ ├── ruvector/ # ruvector - Wrapper package +│ │ └── ruvector-extensions/ # ruvector-extensions - Feature extensions +│ └── package-lock.json # Workspace lock file +├── scripts/ +│ ├── sync-lockfile.sh # Auto-sync lock file +│ ├── install-hooks.sh # Install git hooks +│ └── ci-sync-lockfile.sh # CI/CD lock file sync +└── .githooks/ + └── pre-commit # Pre-commit hook script +``` + +## Testing + +### Run All Tests +```bash +cd npm +npm test +``` + +### Test Specific Package +```bash +cd npm/packages/ruvector-extensions +npm test +``` + +### Manual Testing +```bash +cd npm/packages/ruvector-extensions/examples +tsx complete-integration.ts +``` + +## Code Style + +- **TypeScript**: Use strict mode, full type annotations +- **Formatting**: 2 spaces, semicolons, single quotes +- **Comments**: JSDoc for public APIs +- **Naming**: camelCase for variables/functions, PascalCase for classes + +## Commit Messages + +Follow [Conventional Commits](https://www.conventionalcommits.org/): + +- `feat:` - New features +- `fix:` - Bug fixes +- `docs:` - Documentation changes +- `refactor:` - Code refactoring +- `test:` - Test updates +- `chore:` - Build/tooling changes + +Examples: +``` +feat: Add OpenAI embeddings provider +fix: Resolve CommonJS export issue +docs: Update embeddings API documentation +chore: Sync package-lock.json +``` + +## Pull Request Process + +1. **Ensure CI passes** + - All tests pass + - Build succeeds + - No linting errors + +2. **Update documentation** + - README.md if public API changes + - JSDoc comments for new functions + - CHANGELOG.md with notable changes + +3. **Describe your changes** + - Clear PR title and description + - Reference related issues + - Include examples if applicable + +4. **Request review** + - Maintainers will review within 48 hours + - Address feedback promptly + - Keep discussion focused and professional + +## Release Process + +Releases are handled by maintainers: + +1. Version bump in package.json +2. Update CHANGELOG.md +3. Create git tag +4. Publish to npm +5. Create GitHub release + +## Questions? + +- 📖 Check the [documentation](../README.md) +- 🐛 Report bugs in [Issues](https://github.com/ruvnet/ruvector/issues) +- 💬 Ask questions in [Discussions](https://github.com/ruvnet/ruvector/discussions) + +## License + +By contributing, you agree that your contributions will be licensed under the MIT License. diff --git a/scripts/README.md b/scripts/README.md index 2276f6d7..ebc61b86 100644 --- a/scripts/README.md +++ b/scripts/README.md @@ -1,83 +1,38 @@ -# Ruvector Scripts +# RuVector Automation Scripts -Automation scripts for development, publishing, and maintenance. +This directory contains automation scripts to streamline development and prevent common issues. -## Publishing Scripts +## 📜 Available Scripts -### publish-crates.sh +### 🔄 sync-lockfile.sh +Automatically syncs `package-lock.json` with `package.json` changes. -Automated script to publish all Ruvector crates to crates.io in the correct dependency order. +**Usage:** `./scripts/sync-lockfile.sh` -**Prerequisites**: -- Rust and Cargo installed -- `CRATES_API_KEY` in `.env` file (never hardcoded!) -- All crates build successfully -- All tests pass +### 🪝 install-hooks.sh +Installs git hooks for automatic lock file management. -**Usage**: +**Usage:** `./scripts/install-hooks.sh` -```bash -# Make executable -chmod +x scripts/publish-crates.sh +### 🤖 ci-sync-lockfile.sh +CI/CD script for automatic lock file fixing. -# Run publishing -./scripts/publish-crates.sh -``` +**Usage:** `./scripts/ci-sync-lockfile.sh` -**What it does**: -1. Loads `CRATES_API_KEY` from `.env` (secure, not hardcoded) -2. Authenticates with crates.io -3. Publishes crates in dependency order: - - Phase 1: `ruvector-core`, `router-core` (base crates) - - Phase 2: `ruvector-node`, `ruvector-wasm`, `ruvector-cli`, `ruvector-bench` - - Phase 3: `router-cli`, `router-ffi`, `router-wasm` -4. Waits between publishes for crates.io indexing -5. Reports success/failure summary +## 🚀 Quick Start -**Safety Features**: -- ✅ Reads credentials from `.env` (gitignored) -- ✅ Never hardcodes API keys -- ✅ Verifies packages before publishing -- ✅ Skips already published versions -- ✅ Provides detailed error messages -- ✅ Waits for crates.io indexing +1. **Install git hooks** (recommended): + ```bash + ./scripts/install-hooks.sh + ``` -## Security +2. **Test the hook**: + ```bash + cd npm/packages/ruvector + npm install chalk + git add package.json + git commit -m "test: Add chalk dependency" + # Hook automatically updates lock file + ``` -⚠️ **Important**: This directory may contain scripts that use sensitive credentials. - -**Always**: -- Store credentials in `.env` (gitignored) -- Use `.env.example` for templates -- Never hardcode API keys in scripts -- Review scripts before execution - -See [SECURITY.md](../docs/development/SECURITY.md) for security best practices. - -## Development Scripts - -*More scripts will be added here as the project grows* - -Potential additions: -- `test-all.sh` - Run all tests across crates -- `bench-all.sh` - Run all benchmarks -- `check-format.sh` - Verify code formatting -- `update-docs.sh` - Update documentation - -## Contributing - -When adding new scripts: - -1. **Document thoroughly** - Add comments and usage examples -2. **Use .env for secrets** - Never hardcode credentials -3. **Make executable** - `chmod +x scripts/your-script.sh` -4. **Add to this README** - Document purpose and usage -5. **Test thoroughly** - Verify on clean checkout -6. **Error handling** - Exit on errors (`set -e`) -7. **Colored output** - Use colors for clarity - -## Resources - -- [Publishing Documentation](../docs/development/PUBLISHING.md) -- [Security Guidelines](../docs/development/SECURITY.md) -- [Contributing Guide](../docs/development/CONTRIBUTING.md) +See [CONTRIBUTING.md](../docs/CONTRIBUTING.md) for full documentation. diff --git a/scripts/ci-sync-lockfile.sh b/scripts/ci-sync-lockfile.sh new file mode 100755 index 00000000..7f279684 --- /dev/null +++ b/scripts/ci-sync-lockfile.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# CI/CD script to auto-fix package-lock.json and create a commit +# Use this in GitHub Actions to automatically fix lock file issues + +set -e + +echo "🔍 Checking package-lock.json sync for CI/CD..." + +cd npm + +# Try npm ci first to check if lock file is in sync +if npm ci --dry-run 2>&1 | grep -q "can only install packages when your package.json and package-lock.json"; then + echo "❌ Lock file out of sync - fixing automatically..." + + # Update lock file + npm install + + # Check if we're in a git repository and have changes + if git diff --quiet npm/package-lock.json; then + echo "✅ Lock file is now in sync (no changes needed)" + else + echo "✅ Lock file updated" + + # If running in GitHub Actions, commit and push + if [ -n "$GITHUB_ACTIONS" ]; then + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + git add npm/package-lock.json + git commit -m "chore: Auto-sync package-lock.json [skip ci]" + git push + echo "✅ Lock file committed and pushed" + else + echo "⚠️ Lock file updated but not committed (not in GitHub Actions)" + fi + fi +else + echo "✅ Lock file is already in sync" +fi diff --git a/scripts/install-hooks.sh b/scripts/install-hooks.sh new file mode 100755 index 00000000..0d99bf58 --- /dev/null +++ b/scripts/install-hooks.sh @@ -0,0 +1,28 @@ +#!/bin/bash +# Install git hooks for automatic lock file syncing + +set -e + +echo "🔧 Installing git hooks..." + +# Create .git/hooks directory if it doesn't exist +mkdir -p .git/hooks + +# Install pre-commit hook +if [ -f ".githooks/pre-commit" ]; then + ln -sf ../../.githooks/pre-commit .git/hooks/pre-commit + chmod +x .git/hooks/pre-commit + chmod +x .githooks/pre-commit + echo "✅ Pre-commit hook installed" +else + echo "❌ Pre-commit hook file not found" + exit 1 +fi + +echo "" +echo "✨ Git hooks installed successfully!" +echo "" +echo "The following hooks are now active:" +echo " • pre-commit: Automatically syncs package-lock.json when package.json changes" +echo "" +echo "To disable, run: rm .git/hooks/pre-commit" diff --git a/scripts/sync-lockfile.sh b/scripts/sync-lockfile.sh new file mode 100755 index 00000000..d1c7e5df --- /dev/null +++ b/scripts/sync-lockfile.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# Automatically sync package-lock.json with package.json changes +# Can be used as git hook, CI/CD step, or manual script + +set -e + +echo "🔍 Checking package-lock.json sync..." + +# Change to npm directory +cd "$(dirname "$0")/../npm" + +# Check if package.json or any workspace package.json changed +CHANGED_PACKAGES=$(git diff --cached --name-only | grep -E 'package\.json$' || true) + +if [ -n "$CHANGED_PACKAGES" ]; then + echo "📦 Package.json changes detected:" + echo "$CHANGED_PACKAGES" + echo "" + echo "🔄 Running npm install to sync lock file..." + + # Run npm install to update lock file + npm install + + # Check if lock file changed + if git diff --name-only | grep -q 'package-lock.json'; then + echo "✅ Lock file updated successfully" + + # If running as pre-commit hook, add the lock file + if [ "${GIT_HOOK}" = "pre-commit" ]; then + git add npm/package-lock.json + echo "✅ Lock file staged for commit" + else + echo "⚠️ Lock file modified but not staged" + echo " Run: git add npm/package-lock.json" + fi + else + echo "✅ Lock file already in sync" + fi +else + echo "✅ No package.json changes detected" +fi