vibetunnel/web/npm.md
Peter Steinberger 9dd282e8ce Release npm package v1.0.0-beta.12.2
- Updated npm.md with release history for beta.12.2
- Successfully published to npm with beta tag
- Verified authenticate-pam as optional dependency
- All installation tests passed
2025-07-18 00:03:50 +02:00

328 lines
No EOL
9.3 KiB
Markdown

# NPM Publishing Guide for VibeTunnel
## Installation Guide
### Installing VibeTunnel from NPM
VibeTunnel is published as an npm package that works on macOS and Linux. The package includes prebuilt binaries for common platforms to avoid compilation.
#### Basic Installation
```bash
# Install globally (recommended)
npm install -g vibetunnel
# Or install locally in a project
npm install vibetunnel
```
#### Platform-Specific Notes
**macOS**:
- Works out of the box
- PAM authentication supported natively
**Linux**:
- Works without additional dependencies
- PAM authentication is optional - installs only if PAM headers are available
- If you need PAM authentication, install development headers first:
```bash
# Ubuntu/Debian
sudo apt-get install libpam0g-dev
# RHEL/CentOS/Fedora
sudo yum install pam-devel
```
#### Verifying Installation
```bash
# Check version
vibetunnel --version
# Run the server
vibetunnel
# The server will start on http://localhost:4020
```
#### Docker Installation
For containerized environments:
```dockerfile
FROM node:20-slim
# Optional: Install PAM headers for authentication support
# RUN apt-get update && apt-get install -y libpam0g-dev
# Install VibeTunnel
RUN npm install -g vibetunnel
# Expose the default port
EXPOSE 4020
# Run VibeTunnel
CMD ["vibetunnel"]
```
#### Troubleshooting Installation
1. **"Cannot find module '../build/Release/pty.node'"**
- The package includes prebuilds, this shouldn't happen
- Try reinstalling: `npm uninstall -g vibetunnel && npm install -g vibetunnel`
2. **PAM authentication not working on Linux**
- Install PAM headers: `sudo apt-get install libpam0g-dev`
- Reinstall VibeTunnel to compile the PAM module
3. **Permission errors during installation**
- Use a Node.js version manager (nvm, fnm) instead of system Node.js
- Or fix npm permissions: https://docs.npmjs.com/resolving-eacces-permissions-errors
## Quick Release Checklist
1. **Update versions** in all 3 files:
- `package.json`
- `package.npm.json`
- `../mac/VibeTunnel/version.xcconfig`
2. **Build**: `pnpm run build:npm`
3. **Verify**:
```bash
tar -xf vibetunnel-*.tgz package/package.json
grep optionalDependencies package/package.json # Must show authenticate-pam
rm -rf package/
```
4. **Publish tarball**:
```bash
npm publish vibetunnel-*.tgz --tag beta
npm dist-tag add vibetunnel@VERSION latest
```
⚠️ **NEVER** use `npm publish` without the tarball filename!
## Critical Issue History: Wrong package.json Used in Releases
### The Problem
We've repeatedly published npm packages with the wrong configuration:
- **Version 11.2**: Used main `package.json` instead of `package.npm.json`
- **Version 11.3**: Also used main `package.json` despite having the correct `package.npm.json`
- **Both versions had to be unpublished** due to Linux installation failures
This causes installation failures on Linux systems because:
- Main `package.json` has `authenticate-pam` as a **regular dependency**
- `package.npm.json` has `authenticate-pam` as an **optional dependency**
When `authenticate-pam` is a regular dependency, npm fails the entire installation if PAM headers (libpam0g-dev) aren't available.
### Root Cause
The build script (`scripts/build-npm.js`) checks for `package.npm.json` and uses it if available, BUT:
- During `npm publish`, npm runs the `prepublishOnly` script which triggers `build:npm`
- This rebuilds the package, potentially overwriting the correct configuration
- The timing and execution context can cause the wrong package.json to be used
### The Solution
**NEVER use `npm publish` directly!** Instead:
1. Build the package explicitly:
```bash
pnpm run build:npm
```
2. Verify the package has the correct configuration:
```bash
# Extract and check package.json from the tarball
tar -xf vibetunnel-*.tgz package/package.json
cat package/package.json | grep -A5 -B5 authenticate-pam
```
3. Ensure `authenticate-pam` is under `optionalDependencies`:
```json
"optionalDependencies": {
"authenticate-pam": "^1.0.5"
}
```
4. Publish the pre-built tarball:
```bash
npm publish vibetunnel-*.tgz --tag beta
npm dist-tag add vibetunnel@VERSION latest # if needed
```
## Correct Release Process
### 1. Update Version Numbers
```bash
# Update all three version files - MUST keep in sync!
vim package.json # Update version
vim package.npm.json # Update version to match
vim ../mac/VibeTunnel/version.xcconfig # Update MARKETING_VERSION
```
### 2. Build the Package
```bash
pnpm run build:npm
```
### 3. Verify the Build
```bash
# Check the tarball exists (look in parent directory!)
ls -la *.tgz
# Extract and verify authenticate-pam is optional
tar -xf vibetunnel-*.tgz package/package.json
cat package/package.json | grep -A5 -B5 authenticate-pam
# Should show:
# "optionalDependencies": {
# "authenticate-pam": "^1.0.5"
# }
# Clean up
rm -rf package/
```
### 4. Test Installation Locally
```bash
# Test on a system without PAM headers
docker run --rm -it node:20 bash
npm install /path/to/vibetunnel-*.tgz
# Should succeed even without libpam0g-dev
```
### 5. Publish
```bash
# Publish the pre-built tarball with beta tag
npm publish vibetunnel-*.tgz --tag beta
# Also tag as latest if stable
npm dist-tag add vibetunnel@VERSION latest
```
## Package Configuration Files
### package.json (Main Development)
- Used for development environment
- Has ALL dependencies including devDependencies
- `authenticate-pam` is a regular dependency (for development)
- **DO NOT USE FOR NPM PUBLISHING**
### package.npm.json (NPM Distribution)
- Used for npm package distribution
- Has only runtime dependencies
- `authenticate-pam` is an **optional dependency**
- **ALWAYS USE THIS FOR NPM PUBLISHING**
## Common Mistakes
1. **Running `npm publish` without arguments**
- This triggers rebuild and may use wrong package.json
- Always publish pre-built tarball
2. **Not verifying the package before publishing**
- Always check that authenticate-pam is optional
- Test installation on Linux without PAM headers
3. **Version mismatch**
- Keep package.json, package.npm.json, and version.xcconfig in sync
## Testing npm Package
### Quick Docker Test
```bash
# Test on Ubuntu without PAM headers
docker run --rm -it ubuntu:22.04 bash
apt update && apt install -y nodejs npm
npm install vibetunnel@VERSION
# Should succeed without libpam0g-dev
# Test with PAM headers
apt install -y libpam0g-dev
npm install vibetunnel@VERSION
# Should also succeed and include authenticate-pam
```
### Verify Installation
```bash
# Check if vibetunnel works
npx vibetunnel --version
# On Linux, check if PAM module loaded (optional)
node -e "try { require('authenticate-pam'); console.log('PAM available'); } catch { console.log('PAM not available'); }"
```
## Emergency Fixes
If you accidentally published with wrong configuration:
1. **Unpublish if within 72 hours** (not recommended):
```bash
npm unpublish vibetunnel@VERSION
```
2. **Publish a fix version**:
- Increment version (e.g., 11.3 → 11.4)
- Follow correct process above
- Deprecate the broken version:
```bash
npm deprecate vibetunnel@BROKEN_VERSION "Has installation issues on Linux. Please use VERSION or later."
```
## Release History & Lessons Learned
### Version 11.1 (Good)
- Used `package.npm.json` correctly
- `authenticate-pam` was an optional dependency
- Linux installations worked without PAM headers
### Version 11.2 (Bad - Unpublished)
- Accidentally used main `package.json`
- `authenticate-pam` was a required dependency
- Failed on Linux without libpam0g-dev
- **Issue**: Wrong package.json configuration
### Version 11.3 (Bad - Unpublished)
- Also used main `package.json` despite fix attempts
- Same Linux installation failures
- **Issue**: npm publish process overwrote correct configuration
### Version 11.4 (Good)
- Built with explicit `pnpm run build:npm`
- Published pre-built tarball
- `authenticate-pam` correctly optional
- Linux installations work properly
### Version 11.5 (Good)
- Published December 2024
- Built with explicit `pnpm run build:npm`
- Published pre-built tarball: `vibetunnel-1.0.0-beta.11.5.tgz`
- Verified `authenticate-pam` as optional dependency before publishing
- Tagged as both `beta` and `latest`
- **Process followed correctly**: All three version files updated, tarball verified, published with explicit filename
### Version 12.1 (Good)
- Published July 2025
- Built with explicit `pnpm run build:npm`
- Published pre-built tarball
- `authenticate-pam` correctly optional
- Linux installations work properly
### Version 12.2 (Good - Latest)
- Published July 17, 2025
- Built with explicit `pnpm run build:npm`
- Published pre-built tarball: `vibetunnel-1.0.0-beta.12.2.tgz`
- Verified `authenticate-pam` as optional dependency before publishing
- Tagged with `beta` tag
- **Process followed correctly**: All three version files updated (from beta.13 to beta.12.2), tarball verified, published with explicit filename
## Summary
The critical lesson: **package.npm.json must be used for npm distribution**, not package.json. The build script supports this, but you must publish the pre-built tarball, not rely on npm's prepublish hooks.
**Golden Rule**: Always build first, verify the package configuration, then publish the tarball. Never use `npm publish` without arguments.