This commit is contained in:
172
docs/CONTRIBUTING.md
Normal file
172
docs/CONTRIBUTING.md
Normal file
@@ -0,0 +1,172 @@
|
||||
# Contributing to Waggle
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- **Node.js 20+** (required)
|
||||
- **Rust toolchain** (only for the desktop app -- `app/` package)
|
||||
- **Docker** (only for team mode tests -- PostgreSQL and Redis)
|
||||
|
||||
## Setup
|
||||
|
||||
```bash
|
||||
git clone https://github.com/marolinik/waggle-os.git
|
||||
cd waggle-os
|
||||
npm install
|
||||
```
|
||||
|
||||
## Running the App
|
||||
|
||||
```bash
|
||||
# Local server / sidecar (http://localhost:3333)
|
||||
cd packages/server && npx tsx src/local/start.ts
|
||||
# — or, from the repo root: npm run dev:server
|
||||
|
||||
# Web app (http://localhost:8080)
|
||||
npm run dev # — or: npm run dev:web
|
||||
|
||||
# Desktop app (requires Rust)
|
||||
cd app && npm run tauri dev
|
||||
|
||||
# CLI REPL
|
||||
cd packages/cli && npx tsx src/index.ts
|
||||
```
|
||||
|
||||
## Running Tests
|
||||
|
||||
Tests are the product's safety net. All PRs must pass the full test suite.
|
||||
|
||||
```bash
|
||||
# Run all tests (3000+ across 190+ files)
|
||||
npx vitest run
|
||||
|
||||
# Watch mode during development
|
||||
npx vitest
|
||||
|
||||
# Run tests for a specific package
|
||||
npx vitest run packages/core
|
||||
|
||||
# Run a specific test file
|
||||
npx vitest run packages/agent/src/__tests__/tools.test.ts
|
||||
|
||||
# Coverage report
|
||||
npx vitest run --coverage
|
||||
```
|
||||
|
||||
### Test Requirements
|
||||
|
||||
- All existing tests must pass before submitting a PR
|
||||
- New features require accompanying tests
|
||||
- Bug fixes require a regression test
|
||||
- Team mode tests require Docker services running (`docker compose up -d`)
|
||||
|
||||
### Test Organization
|
||||
|
||||
Tests live alongside source files in `__tests__/` directories or as `.test.ts` siblings. The monorepo uses a single Vitest config at the root.
|
||||
|
||||
## Pull Request Process
|
||||
|
||||
1. **Fork** the repository and create a feature branch from `main`
|
||||
2. **Read the CLAUDE.md** for execution rules and product truths
|
||||
3. **Make your changes** following the slice-based approach (one focused change per PR)
|
||||
4. **Write tests** for new functionality
|
||||
5. **Run the full test suite**: `npx vitest run`
|
||||
6. **Verify the build**: `npx tsc --noEmit`
|
||||
7. **Submit a pull request** against `main`
|
||||
8. **Describe your changes**: what was added, what was preserved, what was tested
|
||||
|
||||
### PR Title Format
|
||||
|
||||
Use descriptive titles that indicate the type of change:
|
||||
|
||||
- `feat: add Notion connector` -- new feature
|
||||
- `fix: memory search scope filtering` -- bug fix
|
||||
- `refactor: extract FrameStore from MindDB` -- code restructuring
|
||||
- `test: add coverage for approval gates` -- test additions
|
||||
- `docs: update API reference` -- documentation
|
||||
|
||||
## Code Style
|
||||
|
||||
### TypeScript
|
||||
|
||||
- ESM modules (`"type": "module"` in package.json)
|
||||
- Explicit imports (no barrel re-exports)
|
||||
- Strict TypeScript (`strict: true`)
|
||||
- Use `type` imports where possible: `import type { Foo } from './foo.js'`
|
||||
- Include `.js` extensions in imports (ESM requirement)
|
||||
|
||||
### File Organization
|
||||
|
||||
- One concept per file where practical
|
||||
- Co-locate tests: `foo.ts` and `__tests__/foo.test.ts`
|
||||
- Route files export a Fastify plugin async function
|
||||
- Types go in the `@waggle/shared` package if used across packages
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
- Files: `kebab-case.ts`
|
||||
- Types/Interfaces: `PascalCase`
|
||||
- Functions/variables: `camelCase`
|
||||
- Constants: `UPPER_SNAKE_CASE`
|
||||
- Route handlers: descriptive comments with HTTP method and path
|
||||
|
||||
### Error Handling
|
||||
|
||||
- Route handlers catch errors and return appropriate HTTP status codes
|
||||
- Non-critical operations use try/catch with empty catch (logging is acceptable)
|
||||
- Critical operations throw with descriptive error messages
|
||||
- Avoid swallowing errors silently in core logic
|
||||
|
||||
## Package Structure
|
||||
|
||||
### Adding to an Existing Package
|
||||
|
||||
1. Add your source file in the appropriate directory
|
||||
2. Export from the package's `index.ts` if it's a public API
|
||||
3. Add tests in the `__tests__/` directory
|
||||
4. Run `npx vitest run packages/<name>` to verify
|
||||
|
||||
### Key Directories
|
||||
|
||||
```
|
||||
packages/<name>/
|
||||
src/
|
||||
index.ts # Public exports
|
||||
__tests__/ # Test files
|
||||
package.json # Package metadata
|
||||
tsconfig.json # TypeScript config
|
||||
```
|
||||
|
||||
## Product Rules
|
||||
|
||||
Read `CLAUDE.md` in the repo root for the full execution protocol. Key rules:
|
||||
|
||||
- **Waggle is workspace-native** -- do not collapse into a global chat
|
||||
- **Memory is a product primitive** -- do not treat it as decorative
|
||||
- **Tool transparency matters** -- users see what the agent does
|
||||
- **Approval gates are required** for sensitive operations
|
||||
- **No scope reduction without approval** -- do not simplify features "for now"
|
||||
- **Tests are part of the product** -- not an afterthought
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Windows: sidecar fails to start with an esbuild platform error
|
||||
|
||||
The Fastify sidecar runs through `tsx`, which uses esbuild. On a clean Windows
|
||||
machine the platform-specific esbuild binary is sometimes not resolved, and
|
||||
`npm run dev:server` (or `npx tsx src/local/start.ts`) fails with an error like
|
||||
`Cannot find module @esbuild/win32-x64` or an esbuild version/host mismatch.
|
||||
|
||||
Fix it by installing the matching Windows esbuild binary without adding it to
|
||||
`package.json`:
|
||||
|
||||
```bash
|
||||
npm i @esbuild/win32-x64@0.28.0 --no-save
|
||||
```
|
||||
|
||||
This affects **Windows only** — macOS and Linux resolve their esbuild binaries
|
||||
normally. The version should match the esbuild your install resolved; `0.28.0`
|
||||
is the known-good pin for the sidecar.
|
||||
|
||||
## Questions?
|
||||
|
||||
Open an issue for architecture questions, feature proposals, or bug reports.
|
||||
Reference in New Issue
Block a user