re-uploading work

This commit is contained in:
2026-02-04 17:46:30 -06:00
commit 3b14c65998
1388 changed files with 381262 additions and 0 deletions

View File

@@ -0,0 +1,238 @@
# Quick Start: Vite Dev Server for Local Development
**Fast iteration on the Attune Web UI with hot-module reloading!**
## TL;DR
```bash
# Terminal 1: Start backend services (once)
docker compose up -d postgres rabbitmq redis api executor worker-shell sensor
# Terminal 2: Start Vite dev server (restart as needed)
cd web
npm install # First time only
npm run dev
# Browser: Open http://localhost:3001
```
## Common Commands
### Start Development Environment
```bash
# Start all required backend services
docker compose up -d postgres rabbitmq redis api executor worker-shell sensor
# Start Vite dev server
cd web && npm run dev
```
### Stop Development Environment
```bash
# Stop Vite (in terminal running npm run dev)
Ctrl+C
# Stop backend services
docker compose stop
# Or completely remove containers
docker compose down
```
### Restart API After Code Changes
```bash
# Rebuild and restart API service
docker compose up -d --build api
# Vite dev server keeps running - no restart needed!
```
### View Logs
```bash
# View API logs
docker compose logs -f api
# View all services
docker compose logs -f
# View specific service
docker compose logs -f executor
```
### Troubleshooting
```bash
# Health check API
curl http://localhost:8080/health
# Check CORS configuration
docker compose logs api | grep -i cors
# List running containers
docker compose ps
# Restart a service
docker compose restart api
# Clear Vite cache
rm -rf web/node_modules/.vite
```
## Default Ports
| Service | Port | URL |
|---------|------|-----|
| **Vite Dev Server** | 3001 | http://localhost:3001 |
| API Service | 8080 | http://localhost:8080 |
| PostgreSQL | 5432 | postgresql://localhost:5432 |
| RabbitMQ | 5672 | amqp://localhost:5672 |
| RabbitMQ Management | 15672 | http://localhost:15672 |
| Redis | 6379 | redis://localhost:6379 |
| Notifier WebSocket | 8081 | ws://localhost:8081 |
| Docker Web (NGINX) | 3000 | http://localhost:3000 |
## Why Port 3001?
The Docker web container (NGINX) uses port 3000. Vite dev server is configured to use 3001 to avoid conflicts. This gives you:
- ✅ Hot-module reloading (HMR) for fast development
- ✅ Instant feedback on code changes
- ✅ Full access to Docker backend services
- ✅ No CORS issues
## Testing Login
Default test user (created by Docker init):
- **Email**: `test@attune.local`
- **Password**: `TestPass123!`
## Common Issues
### CORS Errors
**Fix:** Restart the API service after any config changes:
```bash
docker compose restart api
```
### Port 3001 Already in Use
**Fix:** Vite will automatically try 3002, 3003, etc. Or manually specify:
```bash
npm run dev -- --port 3005
```
### API Not Responding
**Fix:** Check if API is running:
```bash
docker compose ps api
curl http://localhost:8080/health
```
If not running:
```bash
docker compose up -d api
```
### Database Connection Failed
**Fix:** Make sure PostgreSQL is running and initialized:
```bash
docker compose up -d postgres
docker compose logs postgres
# Wait for migrations to complete
docker compose logs migrations
```
## Development Workflow
### Morning Routine
```bash
# Start all backend services
docker compose up -d postgres rabbitmq redis api executor worker-shell sensor
# Start frontend dev server
cd web && npm run dev
```
### During Development
- Edit React/TypeScript files in `web/src/`
- Changes appear instantly in browser (no reload!)
- API changes require rebuilding the API container
### End of Day
```bash
# Stop Vite dev server
Ctrl+C (in terminal running npm run dev)
# Optional: Stop backend services to free resources
docker compose stop
# Or keep them running for faster start tomorrow!
```
## What's Running Where?
```
┌─────────────────────────────────────────────┐
│ Your Local Machine │
│ │
│ Browser ←→ Vite Dev (3001) │
│ ↓ │
│ Proxy │
│ ↓ │
│ ┌──────────────────────────────────────┐ │
│ │ Docker Containers │ │
│ │ - API (8080) │ │
│ │ - PostgreSQL (5432) │ │
│ │ - RabbitMQ (5672) │ │
│ │ - Redis (6379) │ │
│ │ - Workers, Executor, Sensor │ │
│ └──────────────────────────────────────┘ │
└─────────────────────────────────────────────┘
```
## Next Steps
- **Full documentation**: See [vite-dev-setup.md](./vite-dev-setup.md)
- **API endpoints**: http://localhost:8080/docs (Swagger UI)
- **Architecture docs**: See `docs/architecture/`
## Pro Tips
1. **Keep backend running** between sessions - saves startup time
2. **Use HMR effectively** - most changes don't need page reload
3. **Test production build** before committing:
```bash
cd web && npm run build && npm run preview
```
4. **Monitor API logs** while developing to catch backend errors:
```bash
docker compose logs -f api
```
## Help!
If something isn't working:
1. Check service health: `docker compose ps`
2. View logs: `docker compose logs -f`
3. Restart everything:
```bash
docker compose down
docker compose up -d postgres rabbitmq redis api executor worker-shell sensor
cd web && npm run dev
```
4. Check the [full documentation](./vite-dev-setup.md)
Happy coding! 🚀

View File

@@ -0,0 +1,392 @@
# Attune Rust Workspace Setup Summary
This document summarizes the Cargo workspace setup for the Attune automation platform.
## ✅ What Has Been Created
### 1. Workspace Structure
A complete Cargo workspace with the following structure:
```
attune/
├── Cargo.toml # Workspace root configuration
├── README.md # Project documentation
├── .gitignore # Git ignore rules
├── .env.example # Environment configuration template
├── WORKSPACE_SETUP.md # This file
├── reference/
│ ├── models.py # Python SQLAlchemy models (reference)
│ └── models.md # Comprehensive model documentation
└── crates/
├── common/ # Shared library
│ ├── Cargo.toml
│ └── src/
│ ├── lib.rs # Library entry point
│ ├── config.rs # Configuration management
│ ├── db.rs # Database connection pooling
│ ├── error.rs # Unified error types
│ ├── models.rs # Data models (SQLx)
│ ├── schema.rs # Schema utilities and validation
│ └── utils.rs # Common utilities
├── api/ # REST API Service
│ ├── Cargo.toml
│ └── src/main.rs
├── executor/ # Execution Management Service
│ ├── Cargo.toml
│ └── src/main.rs
├── worker/ # Action Execution Service
│ ├── Cargo.toml
│ └── src/main.rs
├── sensor/ # Event Monitoring Service
│ ├── Cargo.toml
│ └── src/main.rs
└── notifier/ # Notification Service
├── Cargo.toml
└── src/main.rs
```
### 2. Common Library (`attune-common`)
The shared library provides:
- **Configuration Management**: Full-featured config system supporting env vars and config files
- **Database Layer**: SQLx-based connection pooling with health checks and migrations support
- **Error Handling**: Comprehensive error types with helper methods
- **Data Models**: Complete SQLx models matching the Python reference models
- **Schema Utilities**: Validation for refs, JSON schemas, and database operations
- **Common Utilities**: Pagination, time formatting, string sanitization, etc.
### 3. Service Crates
Five specialized services, each with:
- Individual `Cargo.toml` with appropriate dependencies
- Stub `main.rs` with CLI argument parsing and configuration loading
- Ready for implementation of service-specific logic
#### Services Overview:
1. **attune-api**: REST API gateway for all client interactions
2. **attune-executor**: Manages action execution lifecycle and scheduling
3. **attune-worker**: Executes actions in various runtime environments
4. **attune-sensor**: Monitors for trigger conditions and generates events
5. **attune-notifier**: Handles real-time notifications and pub/sub
### 4. Dependencies
All services share a common set of workspace dependencies:
- **Async Runtime**: tokio (full-featured async runtime)
- **Web Framework**: axum + tower (for API service)
- **Database**: sqlx (async PostgreSQL with compile-time checked queries)
- **Serialization**: serde + serde_json
- **Logging**: tracing + tracing-subscriber
- **Message Queue**: lapin (RabbitMQ client)
- **Cache**: redis (optional, for caching)
- **Error Handling**: anyhow + thiserror
- **Configuration**: config crate with environment variable support
- **Validation**: validator + jsonschema
- **Encryption**: argon2 + ring
- **CLI**: clap (command-line argument parsing)
## 🚀 Quick Start
### Prerequisites
Install the required services:
```bash
# PostgreSQL
brew install postgresql@14 # macOS
# or
sudo apt install postgresql-14 # Ubuntu
# RabbitMQ
brew install rabbitmq # macOS
# or
sudo apt install rabbitmq-server # Ubuntu
# Redis (optional)
brew install redis # macOS
# or
sudo apt install redis-server # Ubuntu
```
### Setup Steps
1. **Copy environment configuration:**
```bash
cp .env.example .env
```
2. **Edit `.env` and update:**
- Database connection URL
- JWT secret (generate a secure random string)
- Encryption key (at least 32 characters)
3. **Create database:**
```bash
createdb attune
```
4. **Build the workspace:**
```bash
cargo build
```
5. **Run tests:**
```bash
cargo test
```
6. **Start a service:**
```bash
cargo run --bin attune-api
```
## 📝 Configuration
Configuration uses a hierarchical approach:
1. **Default values** (defined in `config.rs`)
2. **Configuration file** (if `ATTUNE_CONFIG` env var is set)
3. **Environment variables** (prefix: `ATTUNE__`, separator: `__`)
Example environment variable:
```bash
ATTUNE__DATABASE__URL=postgresql://localhost/attune
```
Maps to:
```rust
config.database.url
```
## 🏗️ Development Workflow
### Building
```bash
# Build all services
cargo build
# Build in release mode
cargo build --release
# Build specific service
cargo build -p attune-api
# Check without building
cargo check
```
### Testing
```bash
# Run all tests
cargo test
# Run tests for specific crate
cargo test -p attune-common
# Run with output
cargo test -- --nocapture
# Run specific test
cargo test test_name
```
### Code Quality
```bash
# Format code
cargo fmt
# Run linter
cargo clippy
# Run clippy with all features
cargo clippy --all-features -- -D warnings
```
## 📚 Key Files to Implement Next
### 1. Database Migrations
Create `migrations/` directory with SQLx migrations:
```bash
# Create migration
sqlx migrate add initial_schema
# Run migrations
sqlx migrate run
```
### 2. API Routes
In `crates/api/src/`:
- `routes/mod.rs` - Route definitions
- `handlers/mod.rs` - Request handlers
- `middleware/` - Authentication, logging, etc.
### 3. Service Logic
Each service needs:
- Message queue consumers/producers
- Business logic implementation
- Integration with database
- Error handling
### 4. Tests
Each crate should have:
- Unit tests in `tests/` directory
- Integration tests
- Mock implementations for testing
## 🔧 Common Tasks
### Adding a New Dependency
1. Add to workspace dependencies in root `Cargo.toml`:
```toml
[workspace.dependencies]
new-crate = "1.0"
```
2. Use in service `Cargo.toml`:
```toml
[dependencies]
new-crate = { workspace = true }
```
### Creating a New Service
1. Create directory: `crates/new-service/`
2. Add to workspace members in root `Cargo.toml`
3. Create `Cargo.toml` and `src/main.rs`
4. Add dependencies from workspace
### Database Queries
Using SQLx with compile-time checking:
```rust
// Query single row
let pack = sqlx::query_as!(
Pack,
r#"SELECT * FROM attune.pack WHERE ref = $1"#,
pack_ref
)
.fetch_one(&pool)
.await?;
// Query multiple rows
let packs = sqlx::query_as!(
Pack,
r#"SELECT * FROM attune.pack ORDER BY created DESC"#
)
.fetch_all(&pool)
.await?;
```
## 🎯 Next Steps
1. **Implement Database Migrations**
- Create migration files for all tables
- Add indexes and constraints
- Set up database triggers and functions
2. **Implement API Service**
- CRUD endpoints for all models
- Authentication middleware
- OpenAPI/Swagger documentation
- WebSocket support for notifications
3. **Implement Executor Service**
- Execution queue management
- Status tracking
- Policy enforcement
- Workflow orchestration
4. **Implement Worker Service**
- Runtime environment setup
- Action execution
- Result reporting
- Heartbeat mechanism
5. **Implement Sensor Service**
- Trigger monitoring
- Event generation
- Sensor lifecycle management
6. **Implement Notifier Service**
- PostgreSQL LISTEN/NOTIFY integration
- WebSocket server
- Notification routing
7. **Add Tests**
- Unit tests for all modules
- Integration tests for services
- End-to-end workflow tests
8. **Documentation**
- API documentation
- Service architecture docs
- Deployment guides
- Example packs
## 📖 References
- **Models Documentation**: `reference/models.md` - Comprehensive documentation of all data models
- **Python Models**: `reference/models.py` - Reference SQLAlchemy implementation
- **README**: `README.md` - Full project documentation
- **Config Example**: `.env.example` - Configuration template with all options
## 🐛 Troubleshooting
### Compilation Errors
```bash
# Clean and rebuild
cargo clean
cargo build
# Update dependencies
cargo update
```
### Database Connection Issues
1. Check PostgreSQL is running
2. Verify connection URL in `.env`
3. Ensure database exists
4. Check firewall/network settings
### Missing Dependencies
```bash
# Install system dependencies (Ubuntu)
sudo apt install pkg-config libssl-dev
# Install system dependencies (macOS)
brew install openssl pkg-config
```
## 💡 Tips
- Use `cargo watch` for automatic rebuilds during development
- Run `cargo clippy` before committing to catch common issues
- Use `RUST_LOG=debug` for detailed logging
- Set `RUST_BACKTRACE=1` for better error messages
- Use `cargo-expand` to see macro expansions
- Use `cargo-tree` to view dependency tree
## ✨ Status
**Current Status**: ✅ Workspace Setup Complete
All foundational code is in place. The workspace compiles successfully and is ready for service implementation.
**Next Milestone**: Implement database migrations and basic API endpoints.

View File

@@ -0,0 +1,211 @@
# AGENTS.md Index Generation
## Overview
The `AGENTS.md` file provides a minified index of the project's documentation, scripts, and work summaries in a format optimized for AI agents. This index helps agents quickly understand the project structure and locate relevant documentation without scanning the entire filesystem.
The file is generated from `AGENTS.md.template`, which contains the project rules and guidelines, with the documentation index automatically injected at the `{{DOCUMENTATION_INDEX}}` placeholder.
## Format
The AGENTS.md file uses a pipe-delimited minified format inspired by Vercel's agent evaluation research:
```
[Project Name]|root: ./
|IMPORTANT: Prefer retrieval-led reasoning over pre-training-led reasoning
|
|directory/path:{file1.md,file2.py,file3.yaml,...}
|subdirectory/nested:{fileA.md,fileB.sh}
```
### Format Rules
- Each line starts with `|` for visual parsing
- Directory entries use format: `path:{file1,file2,...}`
- Files are comma-separated within curly braces
- Long file lists are truncated with `...` (configurable limit)
- Files are sorted alphabetically for consistency
- Subdirectories are shown with their full relative path
## Generating the Index
### Command Line
```bash
# Using Make (recommended)
make generate-agents-index
# Direct Python invocation
python3 scripts/generate_agents_md_index.py
```
The script reads `AGENTS.md.template`, generates the documentation index, and injects it at the `{{DOCUMENTATION_INDEX}}` placeholder, creating the final `AGENTS.md` file.
### When to Regenerate
Regenerate the index whenever:
- New documentation files are added
- Directory structure changes
- Script files are added or renamed
- Work summaries are created
**Best Practice**: Regenerate before committing significant documentation changes.
## Template System
### AGENTS.md.template
The template file (`AGENTS.md.template`) contains:
- Project rules and conventions
- Development guidelines
- Code quality standards
- Testing protocols
- All static content that applies to AI agents
At the end of the template, the `{{DOCUMENTATION_INDEX}}` placeholder marks where the generated index will be injected.
**Editing the template**:
1. Modify `AGENTS.md.template` to update project rules
2. Keep the `{{DOCUMENTATION_INDEX}}` placeholder at the desired location
3. Run `make generate-agents-index` to regenerate `AGENTS.md`
**Note**: Never edit `AGENTS.md` directly - it will be overwritten. Always edit `AGENTS.md.template` instead.
## Configuration
The generator script (`scripts/generate_agents_md_index.py`) scans these directories:
### `docs/`
- **Extensions**: `.md`, `.txt`, `.yaml`, `.yml`, `.json`, `.sh`
- **Max files per directory**: 15
- **Purpose**: Technical documentation, API guides, architecture docs
### `scripts/`
- **Extensions**: `.sh`, `.py`, `.sql`, `.js`, `.html`
- **Max files per directory**: 20
- **Purpose**: Helper scripts, database setup, testing utilities
### `work-summary/`
- **Extensions**: `.md`, `.txt`
- **Max files per directory**: 20
- **Purpose**: Development session summaries, changelog entries
## Customization
To modify the scanned directories or file types, edit `scripts/generate_agents_md_index.py`:
```python
root_dirs = {
"docs": {
"path": project_root / "docs",
"extensions": {".md", ".txt", ".yaml", ".yml", ".json", ".sh"},
"max_files": 15,
},
# Add more directories...
}
```
### Modifying the Template
To change the project rules or static content:
1. Edit `AGENTS.md.template`
2. Ensure `{{DOCUMENTATION_INDEX}}` placeholder remains
3. Regenerate: `make generate-agents-index`
### Adding New Directories
```python
"new_directory": {
"path": project_root / "new_directory",
"extensions": {".ext1", ".ext2"},
"max_files": 10,
}
```
### Changing File Limits
Adjust `max_files` to show more/fewer files before truncation:
- **Higher values**: More complete listing, longer index
- **Lower values**: More concise, better for quick scanning
- **`None`**: No truncation (shows all files)
## Benefits for AI Agents
1. **Quick Discovery**: Agents can scan the entire documentation structure in one read
2. **Retrieval-Led Reasoning**: Encourages agents to fetch specific files rather than relying on pre-training
3. **Reduced Token Usage**: Compact format minimizes tokens needed for project understanding
4. **Consistent Format**: Predictable structure simplifies parsing and navigation
## Example Output
```
[Attune Project Documentation Index]
|root: ./
|IMPORTANT: Prefer retrieval-led reasoning over pre-training-led reasoning
|
|docs:{api-actions.md,api-events.md,authentication.md,configuration.md,...}
|docs/examples:{complete-workflow.yaml,simple-workflow.yaml}
|scripts:{setup-db.sh,load-core-pack.sh,test-end-to-end-flow.sh,...}
|work-summary:{2026-01-27-api-completion.md,2026-01-27-executor-complete.md,...}
```
## Integration with Development Workflow
### Pre-commit Hook (Optional)
Add to `.git/hooks/pre-commit`:
```bash
#!/bin/bash
# Regenerate AGENTS.md if documentation changed
if git diff --cached --name-only | grep -qE '^(docs|scripts|work-summary)/'; then
echo "Regenerating AGENTS.md..."
make generate-agents-index
git add AGENTS.md
fi
```
### CI/CD Integration
Add to your CI pipeline to ensure the index stays current:
```yaml
- name: Verify AGENTS.md is up-to-date
run: |
make generate-agents-index
git diff --exit-code AGENTS.md || {
echo "AGENTS.md is out of date. Run 'make generate-agents-index'"
exit 1
}
```
## Troubleshooting
### Index Not Updated
**Problem**: New files don't appear in AGENTS.md
**Solution**: Ensure file extensions are included in the configuration
### Too Many Files Shown
**Problem**: Directory listings are too long
**Solution**: Reduce `max_files` value in configuration
### Wrong Directory Structure
**Problem**: Directories not organized as expected
**Solution**: Check that paths are relative to project root, verify directory exists
## File Structure
```
attune/
├── AGENTS.md.template # Template with project rules + {{DOCUMENTATION_INDEX}} placeholder
├── AGENTS.md # Generated file (DO NOT EDIT DIRECTLY)
└── scripts/
└── generate_agents_md_index.py # Generation script
```
## Related Resources
- [Vercel Blog: AGENTS.md outperforms .md skills](https://vercel.com/blog/agents-md-outperforms-skills-in-our-agent-evals)
- Template: `AGENTS.md.template` (edit this)
- Script: `scripts/generate_agents_md_index.py`
- Output: `AGENTS.md` (generated, do not edit)

View File

@@ -0,0 +1,217 @@
# Compilation Notes
## Build Cache Issues
If you see compilation errors that appear to be already fixed in the source code, the build cache may be stale.
### Clear Build Cache
```bash
cargo clean -p <package-name>
# or clean everything
cargo clean
```
Then rebuild:
```bash
cargo build --package <package-name>
```
---
## SQLx Offline Compilation
SQLx macros (`query!`, `query_as!`, `query_scalar!`) perform compile-time verification of SQL queries against the database schema. This requires either:
1. **Online mode:** Database connection available at compile time
2. **Offline mode:** Pre-generated query metadata cache
### Error: Type Annotations Needed
If you see errors like:
```
error[E0282]: type annotations needed
--> crates/sensor/src/rule_matcher.rs:406:13
|
406 | let result = sqlx::query!(
| ^^^^^^
```
This means SQLx cannot infer types because:
- No `DATABASE_URL` is set
- Query metadata cache is missing or outdated
### Solution 1: Compile with Database (Recommended)
```bash
export DATABASE_URL="postgresql://user:pass@localhost:5432/attune"
cargo build
```
### Solution 2: Update Query Cache
Generate/update the query metadata cache:
```bash
export DATABASE_URL="postgresql://user:pass@localhost:5432/attune"
cargo sqlx prepare --workspace
```
This creates `.sqlx/` directory with query metadata that allows offline compilation.
Commit the `.sqlx/` directory to version control so others can compile without a database.
### Solution 3: Skip SQLx Checks (Not Recommended)
Disable compile-time verification (queries will only be checked at runtime):
```bash
cargo build --features sqlx/offline
```
---
## Common Compilation Errors
### 1. Mismatched Types in Option Handling
**Error:**
```
error[E0308]: mismatched types
--> src/file.rs:100:30
|
100 | let x = result.and_then(|row| row.field)
| ^^^^^^^^^^^^^^ expected `Option<_>`, found `Value`
```
**Cause:** `and_then` expects a function that returns `Option<T>`, but `row.field` is already `Option<T>`.
**Solution:** Use `map().flatten()` for nested Options:
```rust
// Wrong
let x = result.and_then(|row| row.field);
// Right
let x = result.map(|row| row.field).flatten();
```
### 2. SQLx Query Type Inference
**Error:**
```
error[E0282]: type annotations needed
--> src/file.rs:50:13
|
50 | let result = sqlx::query!(...);
| ^^^^^^ type must be known at this point
```
**Cause:** SQLx needs database connection to infer types.
**Solutions:**
- Set `DATABASE_URL` environment variable
- Run `cargo sqlx prepare` to generate cache
- See "SQLx Offline Compilation" section above
### 3. Missing Traits
**Error:**
```
error[E0599]: the method `from_row` exists for struct `X`, but its trait bounds were not satisfied
```
**Cause:** Missing `#[derive(FromRow)]` on model struct.
**Solution:** Add SQLx derive macro:
```rust
use sqlx::FromRow;
#[derive(FromRow)]
pub struct MyModel {
pub id: i64,
pub name: String,
}
```
---
## Development Workflow
### Recommended Setup
1. **Keep database running during development:**
```bash
docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres postgres:14
export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/attune"
```
2. **Apply migrations:**
```bash
sqlx database create
sqlx migrate run
```
3. **Generate query cache (for CI/CD):**
```bash
cargo sqlx prepare --workspace
git add .sqlx/
git commit -m "Update SQLx query cache"
```
4. **Build normally:**
```bash
cargo build
```
### CI/CD Pipeline
For continuous integration without database access:
1. **Commit `.sqlx/` directory** with prepared query metadata
2. **Enable offline mode** in CI:
```bash
SQLX_OFFLINE=true cargo build --release
```
---
## Troubleshooting
### Build succeeds but tests fail
```bash
# Ensure database is running and migrations are applied
export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/attune_test"
sqlx database create
sqlx migrate run
# Run tests
cargo test
```
### Query cache out of sync
```bash
# Delete old cache
rm -rf .sqlx/
# Regenerate
export DATABASE_URL="postgresql://postgres:postgres@localhost:5432/attune"
cargo sqlx prepare --workspace
```
### "prepared statement already exists"
This typically indicates multiple connections trying to prepare the same statement. Solutions:
- Use connection pooling (already implemented in `attune_common::db`)
- Ensure tests use separate database instances
- Clean up connections properly
---
## See Also
- [SQLx Documentation](https://github.com/launchbadge/sqlx)
- [SQLx Offline Mode](https://github.com/launchbadge/sqlx/blob/main/sqlx-cli/README.md#enable-building-in-offline-mode)
- [Cargo Build Cache](https://doc.rust-lang.org/cargo/guide/build-cache.html)

View File

@@ -0,0 +1,258 @@
# Dead Code Cleanup Report
**Date:** 2026-01-28
**Type:** Conservative Cleanup
**Status:** ✅ Complete
## Summary
Successfully completed a conservative cleanup of dead code across the Attune workspace, **including test code**:
- **Production Code:** Removed 10+ genuinely unused functions, methods, and helpers
- **Test Code:** Cleaned up 15+ unused imports, test helpers, and deprecation warnings
- **Preserved:** 10 API methods that are part of planned public APIs (documented with `#[allow(dead_code)]`)
- **Result:** Reduced from 20+ warnings (production) + 100+ warnings (tests) to **0 warnings**
- **Tests:** All 303 tests pass (57 API + 115 common + 58 executor + 27 sensor + 46 worker)
- **Impact:** No behavioral changes, cleaner codebase, better signal-to-noise ratio for future warnings
### Files Modified (25 total)
#### Production Code (13 files)
- `crates/executor/src/workflow/coordinator.rs` - Removed unused method, prefixed variable
- `crates/notifier/src/service.rs` - Removed unused stats functionality
- `crates/sensor/src/timer_manager.rs` - Removed unused method
- `crates/sensor/src/service.rs` - Prefixed unused field
- `crates/sensor/src/sensor_manager.rs` - Prefixed unused field, removed test helpers
- `crates/sensor/src/rule_matcher.rs` - Removed unused test helper
- `crates/cli/src/main.rs` - Removed unused function and import
- `crates/cli/src/client.rs` - Prefixed unused field, documented preserved API methods
- `crates/cli/src/config.rs` - Documented preserved API methods
- `crates/cli/src/commands/pack_index.rs` - Prefixed unused variable
- `crates/common/src/repositories/pack_test.rs` - Removed unused imports
- `crates/common/src/repositories/pack_installation.rs` - Removed unused imports
- `crates/common/src/config.rs` - Fixed unnecessary mut
#### Test Code (12 files)
- `crates/api/tests/helpers.rs` - Prefixed unused variables, added allow attributes
- `crates/api/tests/webhook_security_tests.rs` - Removed unused imports
- `crates/cli/tests/common/mod.rs` - Removed unused import, added allow attributes to mock helpers
- `crates/cli/tests/test_auth.rs` - Added module-level allow(deprecated), removed unused import
- `crates/cli/tests/test_packs.rs` - Added module-level allow(deprecated)
- `crates/cli/tests/test_config.rs` - Added module-level allow(deprecated)
- `crates/cli/tests/test_actions.rs` - Added module-level allow(deprecated)
- `crates/cli/tests/test_executions.rs` - Added module-level allow(deprecated)
- `crates/cli/tests/test_rules_triggers_sensors.rs` - Added module-level allow(deprecated)
- `crates/cli/tests/pack_registry_tests.rs` - Added module-level allow(deprecated), removed unused import
- `crates/common/tests/queue_stats_repository_tests.rs` - Removed unused imports
- `crates/executor/tests/*` - Added allow attributes to unused test helpers (2 files)
## Overview
This document records a conservative cleanup of dead code in the Attune project. The cleanup removed genuinely unused code while preserving methods that are part of planned public APIs or may be needed for future functionality.
## Cleanup Summary
### Code Removed
#### 1. **notifier/service.rs**
- **Removed:** `stats()` method and `ServiceStats` struct
- **Reason:** Never called anywhere in the codebase
- **Note:** If monitoring/metrics features are added in the future, consider re-implementing with a more comprehensive stats API
#### 2. **executor/workflow/coordinator.rs**
- **Removed:** `is_complete()` method from `WorkflowExecutionHandle`
- **Reason:** Never called; completion tracking is handled elsewhere in the workflow state machine
- **Prefixed:** `error_json` variable → `_error_json` (computed but not yet used, likely for future error handling)
#### 3. **sensor/timer_manager.rs**
- **Removed:** `fire_at()` method from `TimerConfig`
- **Reason:** Never called; timer firing logic uses other mechanisms
#### 4. **cli/main.rs**
- **Removed:** `load_effective_config()` function
- **Reason:** Never called; config loading is handled by `CliConfig::from_config()` pattern
#### 5. **cli/commands/pack_index.rs**
- **Prefixed:** `idx` variable → `_idx`
- **Reason:** Variable checked but value never used (intentional pattern match)
#### 6. **Test Cleanup**
- **Removed:** Unused test helper functions and imports in:
- `common/repositories/pack_test.rs`
- `common/repositories/pack_installation.rs`
- `sensor/sensor_manager.rs` (test_sensor, test_trigger helpers)
- `sensor/rule_matcher.rs` (test_event_with_payload helper)
- **Fixed:** Unnecessary `mut` keyword in `common/config.rs` test
#### 7. **Prefixed Unused Fields**
- `sensor/service.rs`: `config``_config` (stored for potential future use)
- `sensor/sensor_manager.rs`: `sensor_runtime``_sensor_runtime` (stored for potential future use)
- `cli/client.rs`: `ApiError.details``_details` (part of error response struct, may be used later)
### Code Preserved (API Methods for Future Use)
The following methods generate "unused" warnings but are **intentionally preserved** as they are part of planned public APIs:
#### CLI Client (`crates/cli/src/client.rs`)
```rust
// HTTP Methods - Part of complete REST client API
pub async fn put<T: DeserializeOwned, B: Serialize>(&self, path: &str, body: &B) -> Result<T>
pub async fn delete<T: DeserializeOwned>(&self, path: &str) -> Result<T>
pub async fn get_with_query<T: DeserializeOwned>(&self, path: &str) -> Result<T>
pub async fn post_no_response<B: Serialize>(&self, path: &str, body: &B) -> Result<()>
// Auth Management - Part of session management API
pub fn set_auth_token(&mut self, token: String)
pub fn clear_auth_token(&mut self)
```
**Rationale:** These methods complete the REST client API and will be needed when:
- PUT/DELETE operations are added for updating/deleting packs, rules, etc.
- Session management features are implemented
- Query parameter support is needed for complex filtering
**Status:** Used in unit tests, awaiting production use cases
#### CLI Config (`crates/cli/src/config.rs`)
```rust
// Profile Configuration Methods
pub fn set_api_url(&mut self, url: String) -> Result<()>
pub fn load_with_profile(profile_name: Option<&str>) -> Result<Self>
pub fn api_url(&self) -> Result<String>
pub fn refresh_token(&self) -> Result<Option<String>>
```
**Rationale:** These methods are part of the configuration management API and will be needed when:
- Users need to update API URLs dynamically
- Profile switching is implemented
- Token refresh flows are added
**Status:** `set_api_url()` is used in integration tests; others await CLI commands
## Impact Assessment
### Before Cleanup
- **Production Warnings:** ~20 dead code warnings across workspace
- **Test Warnings:** ~100+ warnings (deprecated APIs, unused imports, unused test helpers)
- **Total:** 120+ warnings
### After Cleanup
- **Production:** 0 warnings (with documented allow attributes where appropriate)
- **Tests:** 0 warnings (with module-level allow(deprecated) for assert_cmd compatibility)
- **Build:** ✅ Clean compilation (`cargo check --tests --workspace`)
- **Tests:** ✅ All 303 tests pass
- **Functionality:** ✅ No behavioral changes
## Future Work
### When to Re-implement Removed Code
1. **Notifier Statistics (`ServiceStats`)**
- Re-implement when: Building monitoring dashboard or health check endpoints
- Suggested approach: Comprehensive metrics API with Prometheus-compatible format
2. **Workflow Completion Check (`is_complete`)**
- Re-implement when: Need external completion validation
- Note: Current state machine handles completion internally
3. **Timer Fire Time (`fire_at`)**
- Re-implement when: Need to expose timer schedule information
- Note: Current implementation uses internal scheduling mechanisms
### When to Use Preserved API Methods
1. **CLI Client Methods**
- `put()`: Implement update commands (packs, rules, workflows, etc.)
- `delete()`: Implement delete commands
- `get_with_query()`: Implement advanced filtering/search commands
- `post_no_response()`: Implement fire-and-forget operations
2. **CLI Config Methods**
- `set_api_url()`: Implement `attune config set api-url <url>` command
- `load_with_profile()`: Implement `attune --profile <name>` flag
- `api_url()`: Use in commands that need to display current API URL
- `refresh_token()`: Implement token refresh workflow
## Recommendations
### Development Guidelines
1. **Don't Remove API Methods Prematurely**
- Methods that complete a logical API surface should be kept
- Mark with `#[allow(dead_code)]` if needed for clarity
- Document intended use cases
2. **Clean Up Tests Regularly**
- Remove unused test helpers when refactoring
- Keep test code as clean as production code
3. **Use Underscore Prefix Judiciously**
- For fields: Use when value is stored for future use or debugging
- For variables: Use when intentionally ignoring but want to document the check
4. **Quarterly Reviews**
- Review "unused" warnings every quarter
- Decide: Remove, implement, or document each case
- Update this document with decisions
### CI Integration
Consider adding a CI check that:
1. Fails on unexpected new warnings (not in allowlist)
2. Requires documentation update when preserving unused code
3. Tracks trends in dead code warnings over time
## Verification
All changes verified with:
```bash
# Build check
cargo check --workspace
# Result: 3 intentional warnings (preserved API methods)
# Test suite
cargo test --workspace --lib
# Result: 220 tests pass, 0 failures
# Integration tests
cargo test --workspace
# Result: All tests pass
```
## Related Documentation
- **API Design:** `docs/api-*.md` - Documents intended API surface
- **Testing:** `docs/testing-*.md` - Testing guidelines
- **Architecture:** `docs/*-service.md` - Service architecture documents
## Changelog
### 2026-01-28: Initial Conservative Cleanup
- **Production:** Removed 10+ unused functions/methods/fields
- **Tests:** Cleaned up 15+ unused imports and test helpers
- **Preserved:** 10 API methods for future use (with documentation)
- **Deprecation Warnings:** Suppressed 100+ `assert_cmd::cargo_bin` deprecation warnings with module-level `#[allow(deprecated)]`
- **Result:** Reduced from 120+ total warnings to **0 warnings**
### Test-Specific Cleanup Details
**Mock Helpers Preserved** (CLI tests):
- All mock functions in `crates/cli/tests/common/mod.rs` preserved with `#[allow(dead_code)]`
- These are shared test utilities used across multiple integration test files
- Currently unused but part of the test infrastructure for future test expansion
**Deprecation Handling**:
- Added `#![allow(deprecated)]` to all CLI test files to suppress `assert_cmd::Command::cargo_bin` warnings
- The deprecated API still works correctly; migration to `cargo_bin!` macro can be done later if needed
- This is a test-only concern and doesn't affect production code
**Test Helper Functions**:
- Added `#[allow(dead_code)]` to `create_test_runtime` functions in executor tests
- These helpers are part of test infrastructure and may be used in future test cases
---
**Note:** This is a living document. Update it whenever significant dead code cleanup occurs or when preserved API methods are finally implemented.

View File

@@ -0,0 +1,388 @@
# Documentation Organization
## Overview
The Attune project documentation has been reorganized into logical subdirectories to improve discoverability and maintainability. This document describes the new structure and rationale.
## Documentation Structure
### `docs/` Directory
#### `docs/api/`
**Purpose**: REST API endpoint documentation and OpenAPI specifications
**Contents**:
- API endpoint documentation (`api-*.md`)
- OpenAPI client generation guides
- API completion plans and specifications
**When to use**: Creating or documenting REST API endpoints, working with OpenAPI specs
#### `docs/architecture/`
**Purpose**: System architecture and service design documentation
**Contents**:
- Service architecture documents (`*-service.md`)
- System architecture overviews (`*-architecture.md`)
- Queue and message broker architecture
- Inter-service communication patterns
**When to use**: Understanding system design, planning new services, architectural decisions
#### `docs/authentication/`
**Purpose**: Authentication, authorization, and security documentation
**Contents**:
- Authentication mechanisms (JWT, tokens)
- Secrets management
- RBAC and permissions
- Service accounts
- Security reviews and guidelines
**When to use**: Implementing auth features, managing secrets, security audits
#### `docs/cli/`
**Purpose**: Command-line interface documentation
**Contents**:
- CLI command reference
- Profile management
- CLI usage examples
**When to use**: Using or extending the `attune` CLI tool
#### `docs/configuration/`
**Purpose**: Configuration system documentation
**Contents**:
- Configuration file formats (YAML)
- Environment variable overrides
- Configuration troubleshooting
- Migration guides (e.g., env to YAML)
**When to use**: Configuring services, troubleshooting config issues
#### `docs/dependencies/`
**Purpose**: Dependency management and refactoring documentation
**Contents**:
- Dependency upgrade guides
- Deduplication efforts
- HTTP client consolidation
- Crate migration documentation (e.g., sea-query removal, serde-yaml migration)
- Workspace dependency compliance
**When to use**: Managing Rust dependencies, understanding dependency decisions
#### `docs/deployment/`
**Purpose**: Production deployment and operations documentation
**Contents**:
- Production deployment guides
- Operations runbooks
- Infrastructure setup
**When to use**: Deploying to production, handling operational issues
#### `docs/development/`
**Purpose**: Developer workflow and tooling documentation
**Contents**:
- Workspace setup guides
- Compilation notes
- Code cleanup procedures
- Documentation organization (this file)
- AGENTS.md index generation
**When to use**: Setting up dev environment, understanding dev tooling
#### `docs/examples/`
**Purpose**: Example configurations and workflows
**Contents**:
- Workflow YAML examples
- Pack registry examples
- Rule parameter examples
- Demo scripts
**When to use**: Learning by example, testing features
#### `docs/guides/`
**Purpose**: Getting started guides and tutorials
**Contents**:
- Quick start guides
- Feature-specific quickstarts (timers, workflows, sensors)
- Step-by-step tutorials
**When to use**: First-time users, learning new features
#### `docs/migrations/`
**Purpose**: Database and schema migration documentation
**Contents**:
- Migration decision records
- Schema change documentation
- Data migration guides
**When to use**: Understanding database schema evolution
#### `docs/packs/`
**Purpose**: Pack system documentation
**Contents**:
- Pack structure and creation
- Pack testing framework
- Pack registry specification
- Core pack integration
**When to use**: Creating packs, understanding pack architecture
#### `docs/performance/`
**Purpose**: Performance optimization documentation
**Contents**:
- Performance analysis reports
- Optimization guides
- Benchmarking results
- Resource limits (e.g., log size limits)
**When to use**: Performance tuning, understanding bottlenecks
#### `docs/plans/`
**Purpose**: Future planning and design documents
**Contents**:
- Refactoring plans
- Feature proposals
- Technical debt tracking
**When to use**: Planning major changes, understanding project direction
#### `docs/sensors/`
**Purpose**: Sensor system documentation
**Contents**:
- Sensor interface and lifecycle
- Sensor authentication
- Runtime configuration
- Sensor service setup
**When to use**: Creating sensors, debugging sensor issues
#### `docs/testing/`
**Purpose**: Testing documentation and strategies
**Contents**:
- Test execution guides
- Testing strategies (e2e, integration, unit)
- Schema-per-test architecture
- Test troubleshooting
**When to use**: Writing tests, debugging test failures
#### `docs/web-ui/`
**Purpose**: Web UI documentation
**Contents**:
- Web UI architecture
- Component documentation
- Testing guides
**When to use**: Frontend development, UI feature work
#### `docs/webhooks/`
**Purpose**: Webhook system documentation
**Contents**:
- Webhook architecture
- Testing webhooks
- Manual testing procedures
**When to use**: Implementing webhook triggers, debugging webhook issues
#### `docs/workflows/`
**Purpose**: Workflow engine documentation
**Contents**:
- Workflow execution engine
- Orchestration patterns
- Workflow implementation plans
- Rule and trigger mapping
- Parameter handling
- Inquiry (human-in-the-loop) system
**When to use**: Building workflows, understanding execution flow
---
### `work-summary/` Directory
#### `work-summary/status/`
**Purpose**: Current project status and TODO tracking
**Contents**:
- Status documents (`*STATUS*.md`)
- TODO lists
- Progress tracking
- Accomplishments
**When to use**: Understanding current project state, tracking work items
#### `work-summary/phases/`
**Purpose**: Development phase completion summaries and planning
**Contents**:
- Phase completion documents (`phase-*.md`)
- Analysis documents
- Problem statements
- Planning documents
- StackStorm lessons learned
**When to use**: Understanding project history, learning from past phases
#### `work-summary/sessions/`
**Purpose**: Daily development session notes
**Contents**:
- Dated session summaries (`YYYY-MM-DD-*.md`)
- Session-specific work logs
- Daily progress notes
**When to use**: Reviewing recent work, understanding context of changes
**Note**: This is the largest directory (155+ files) - use grep or find to locate specific sessions
#### `work-summary/features/`
**Purpose**: Feature implementation summaries
**Contents**:
- Feature-specific implementation notes
- Testing documentation
- Feature completion reports
**When to use**: Understanding how features were implemented
#### `work-summary/migrations/`
**Purpose**: Migration and refactoring work summaries
**Contents**:
- Migration completion summaries
- Refactoring session notes
- Migration status and next steps
**When to use**: Understanding migration history, planning migrations
#### `work-summary/changelogs/`
**Purpose**: Changelogs and major completion summaries
**Contents**:
- CHANGELOG.md
- API completion summaries
- Feature completion reports
- Cleanup summaries
**When to use**: Understanding what changed and when
---
## Finding Documentation
### Quick Reference
| What you need | Where to look |
|---------------|---------------|
| API endpoint details | `docs/api/` |
| How to deploy | `docs/deployment/` |
| Getting started | `docs/guides/` |
| Service architecture | `docs/architecture/` |
| How to test | `docs/testing/` |
| Authentication/security | `docs/authentication/` |
| Configuration | `docs/configuration/` |
| Pack creation | `docs/packs/` |
| Workflow building | `docs/workflows/` |
| Recent work | `work-summary/sessions/` |
| Current status | `work-summary/status/` |
### Search Tips
**Use grep for content search**:
```bash
# Find all docs mentioning "sensor"
grep -r "sensor" docs/
# Find API docs about executions
grep -r "execution" docs/api/
# Find recent work on workflows
grep -r "workflow" work-summary/sessions/
```
**Use find for path-based search**:
```bash
# Find all testing documentation
find docs/testing/ -name "*.md"
# Find all phase summaries
find work-summary/phases/ -name "phase-*.md"
```
**Use the AGENTS.md index**:
```bash
# Regenerate the index after adding new docs
make generate-agents-index
# View the minified index
cat AGENTS.md
```
---
## Maintenance Guidelines
### Adding New Documentation
1. **Determine the category**: Match your doc to one of the existing categories above
2. **Use descriptive names**: `feature-name-guide.md` or `component-architecture.md`
3. **Update AGENTS.md**: Run `make generate-agents-index` after adding docs
4. **Cross-reference**: Link to related docs in other categories
### Moving Documentation
When reorganizing docs:
1. Use `git mv` to preserve history
2. Update any hardcoded paths in other docs
3. Check for broken links
4. Regenerate AGENTS.md
### Work Summary Guidelines
- **Daily work**: Save to `work-summary/sessions/` with date prefix `YYYY-MM-DD-description.md`
- **Phase completions**: Save to `work-summary/phases/`
- **Status updates**: Update files in `work-summary/status/`
- **Feature summaries**: Save to `work-summary/features/` (for thematic, non-dated summaries)
---
## Reorganization History
**Date**: 2026-01-30
**Changes**:
- Created 16 subdirectories in `docs/`
- Created 7 subdirectories in `work-summary/`
- Organized 102 documentation files
- Organized 213 work summary files
- Updated AGENTS.md to reflect new structure
**Rationale**:
- Improved discoverability: Easier to find related documentation
- Logical grouping: Similar topics grouped together
- Reduced clutter: Root directories now clean and organized
- Better navigation: AI agents and developers can quickly locate relevant docs
**Benefits**:
- Faster documentation lookup
- Clearer project organization
- Better AI agent performance with minified index
- Easier onboarding for new developers

View File

@@ -0,0 +1,359 @@
# Vite Dev Server Setup for Local Development
## Overview
This guide explains how to run the Vite development server locally while using the Docker containerized backend services (API, database, workers, etc.). This setup provides the best development experience with hot-module reloading and fast iteration on the frontend.
## Architecture
In this development setup:
- **Backend Services**: Run in Docker containers (API, database, RabbitMQ, workers, etc.)
- **Web UI**: Run locally with Vite dev server on port 3001
- **CORS**: Configured to allow cross-origin requests from local Vite dev server
```
┌─────────────────────────────────────────────────────────────┐
│ Local Machine │
│ │
│ ┌─────────────────┐ ┌──────────────────────────┐ │
│ │ Vite Dev Server│◄────────┤ Browser │ │
│ │ (Port 3001) │ HMR │ http://localhost:3001 │ │
│ │ Hot Reload ✨ │ └───────┬──────────────────┘ │
│ └────────┬────────┘ │ │
│ │ │ API Requests │
│ │ Proxy │ /api/* /auth/* │
│ │ /api → 8080 │ │
│ │ /auth → 8080 ▼ │
│ │ ┌─────────────────────────┐ │
│ └─────────────►│ Docker API Service │ │
│ │ (Port 8080) │ │
│ │ CORS enabled ✓ │ │
│ └───────┬─────────────────┘ │
│ │ │
│ ┌───────▼─────────────────┐ │
│ │ PostgreSQL │ │
│ │ RabbitMQ │ │
│ │ Workers │ │
│ │ Other services... │ │
│ └─────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
## Why Port 3001?
The Docker compose setup exposes the production web container (NGINX) on port 3000. When you run Vite dev server, it tries to bind to port 3000 first but will automatically fall back to 3001 if 3000 is taken. We've configured Vite to explicitly use 3001 to avoid conflicts.
## Setup Instructions
### 1. Start Backend Services with Docker
Start all backend services (excluding the web container):
```bash
# Start all backend services
docker compose up -d postgres rabbitmq redis api executor worker-shell worker-python sensor
# Or start everything and then stop the web container
docker compose up -d
docker compose stop web
```
### 2. Verify Backend Services
Check that the API is running:
```bash
# Health check
curl http://localhost:8080/health
# Should return: {"status":"ok"}
```
### 3. Start Vite Dev Server
In a separate terminal:
```bash
cd web
npm install # If first time or dependencies changed
npm run dev
```
The Vite dev server will start on `http://localhost:3001` (or the next available port).
### 4. Access the Application
Open your browser to:
```
http://localhost:3001
```
You should see the Attune web UI with:
- ✅ Fast hot-module reloading (HMR)
- ✅ API requests proxied to Docker backend
- ✅ No CORS errors
- ✅ Full authentication flow working
## Configuration Details
### Vite Configuration (`web/vite.config.ts`)
```typescript
export default defineConfig({
server: {
host: "127.0.0.1",
port: 3001,
strictPort: false, // Allow fallback to next port if 3001 is taken
proxy: {
"/api": {
target: "http://localhost:8080",
changeOrigin: true,
},
"/auth": {
target: "http://localhost:8080",
changeOrigin: true,
},
},
},
});
```
### CORS Configuration
The API service is configured to allow requests from Vite dev server ports:
**config.docker.yaml:**
```yaml
server:
cors_origins:
- http://localhost:3000
- http://localhost:3001
- http://localhost:3002
- http://localhost:5173
- http://127.0.0.1:3000
- http://127.0.0.1:3001
- http://127.0.0.1:3002
- http://127.0.0.1:5173
```
**config.development.yaml:**
```yaml
server:
cors_origins:
- http://localhost:3000
- http://localhost:3001
- http://localhost:3002
- http://localhost:5173
- http://127.0.0.1:3000
- http://127.0.0.1:3001
- http://127.0.0.1:3002
- http://127.0.0.1:5173
```
Multiple ports are included to support:
- Port 3001: Primary Vite dev server port
- Port 3002: Fallback if 3001 is taken
- Port 5173: Alternative Vite default port
- Port 3000: Docker web container (for comparison)
## Troubleshooting
### CORS Errors
**Symptom:**
```
Access to XMLHttpRequest at 'http://localhost:8080/api/...' from origin 'http://localhost:3001'
has been blocked by CORS policy
```
**Solutions:**
1. **Restart API service** after config changes:
```bash
docker compose restart api
```
2. **Verify CORS origins** in API logs:
```bash
docker compose logs api | grep -i cors
```
3. **Check your browser's dev tools** Network tab for the actual origin being sent
### Port Already in Use
**Symptom:**
```
Port 3001 is already in use
```
**Solutions:**
1. **Let Vite use next available port:**
Vite will automatically try 3002, 3003, etc.
2. **Kill process using the port:**
```bash
# Find process
lsof -i :3001
# Kill it
kill -9 <PID>
```
3. **Use a specific port:**
```bash
npm run dev -- --port 3005
```
Make sure this port is in the CORS allowed origins list!
### API Requests Failing
**Symptom:**
API requests return 404 or fail to reach the backend.
**Solutions:**
1. **Verify API is running:**
```bash
curl http://localhost:8080/health
```
2. **Check proxy configuration** in `vite.config.ts`
3. **Inspect browser Network tab** to see if requests are being proxied correctly
### Hot Module Reloading Not Working
**Symptom:**
Changes to React components don't auto-refresh.
**Solutions:**
1. **Check Vite dev server output** for errors
2. **Clear browser cache** and hard refresh (Ctrl+Shift+R / Cmd+Shift+R)
3. **Restart Vite dev server:**
```bash
# Stop with Ctrl+C, then restart
npm run dev
```
### WebSocket Connection Issues
**Symptom:**
Real-time updates (execution status, etc.) not working.
**Note:** The notifier service WebSocket endpoint is NOT proxied through Vite. If you need WebSocket functionality, you may need to:
1. Access notifier directly at `ws://localhost:8081`
2. Or add WebSocket proxy configuration to Vite config
## Development Workflow
### Typical Workflow
1. **Start backend once** (usually in the morning):
```bash
docker compose up -d postgres rabbitmq redis api executor worker-shell
```
2. **Start Vite dev server** when working on frontend:
```bash
cd web && npm run dev
```
3. **Make changes** to React components, TypeScript files, etc.
- Changes are instantly reflected (HMR)
- No page reload needed for most changes
4. **Stop Vite** when done (Ctrl+C)
- Backend services can keep running
5. **Stop backend** when completely done:
```bash
docker compose down
```
### Testing API Changes
If you're also developing backend features:
1. Make changes to Rust code
2. Rebuild and restart API:
```bash
docker compose up -d --build api
```
3. Vite dev server will continue running
4. Frontend will automatically use new API
### Switching Between Environments
**Use Vite dev server (development):**
- Fastest iteration
- Hot module reloading
- Source maps for debugging
- Best for UI development
**Use Docker web container (production-like):**
```bash
docker compose up -d web
# Access at http://localhost:3000
```
- Tests production build
- Tests NGINX configuration
- No HMR (full page reloads)
- Best for integration testing
## Performance Tips
1. **Keep backend services running** between sessions to avoid startup time
2. **Use `--build` flag selectively** when rebuilding:
```bash
# Only rebuild changed services
docker compose up -d --build api
```
3. **Clear Vite cache** if you encounter weird issues:
```bash
rm -rf web/node_modules/.vite
```
## Comparison: Dev Server vs Production Build
| Feature | Vite Dev Server | Docker Web Container |
|---------|----------------|----------------------|
| **Port** | 3001 (local) | 3000 (Docker) |
| **Hot Reload** | ✅ Yes | ❌ No |
| **Build Time** | ⚡ Instant | 🐢 ~30s |
| **Source Maps** | ✅ Yes | ⚠️ Optional |
| **NGINX** | ❌ No | ✅ Yes |
| **Production-like** | ❌ No | ✅ Yes |
| **Best For** | Active development | Testing deployment |
## Additional Resources
- [Vite Documentation](https://vitejs.dev/)
- [Vite Server Options](https://vitejs.dev/config/server-options.html)
- [Docker Compose Documentation](https://docs.docker.com/compose/)
- [Attune Architecture Docs](../architecture/)
## Summary
For rapid frontend development:
```bash
# Terminal 1: Start backend (once)
docker compose up -d postgres rabbitmq redis api executor worker-shell
# Terminal 2: Start Vite dev server (restart as needed)
cd web && npm run dev
# Browser: http://localhost:3001
# Enjoy fast hot-module reloading! ⚡
```