Files
attune/packs/core/SETUP.md
2026-02-04 17:46:30 -06:00

305 lines
8.0 KiB
Markdown

# Core Pack Setup Guide
This guide explains how to set up and load the Attune core pack into your database.
## Overview
The **core pack** is Attune's built-in system pack that provides essential automation components including:
- **Timer Triggers**: Interval-based, cron-based, and datetime triggers
- **Basic Actions**: Echo, sleep, noop, and HTTP request actions
- **Built-in Sensors**: Interval timer sensor for time-based automation
The core pack must be loaded into the database before it can be used in rules and workflows.
## Prerequisites
Before loading the core pack, ensure:
1. **PostgreSQL is running** and accessible
2. **Database migrations are applied**: `sqlx migrate run`
3. **Python 3.8+** is installed (for the loader script)
4. **Required Python packages** are installed:
```bash
pip install psycopg2-binary pyyaml
```
## Loading Methods
### Method 1: Python Loader Script (Recommended)
The Python loader script reads the pack YAML files and creates database entries automatically.
**Usage:**
```bash
# From the project root
python3 scripts/load_core_pack.py
# With custom database URL
python3 scripts/load_core_pack.py --database-url "postgresql://user:pass@localhost:5432/attune"
# With custom pack directory
python3 scripts/load_core_pack.py --pack-dir ./packs
```
**What it does:**
- Reads `pack.yaml` for pack metadata
- Loads all trigger definitions from `triggers/*.yaml`
- Loads all action definitions from `actions/*.yaml`
- Loads all sensor definitions from `sensors/*.yaml`
- Creates or updates database entries (idempotent)
- Uses transactions (all-or-nothing)
**Output:**
```
============================================================
Core Pack Loader
============================================================
→ Loading pack metadata...
✓ Pack 'core' loaded (ID: 1)
→ Loading triggers...
✓ Trigger 'core.intervaltimer' (ID: 1)
✓ Trigger 'core.crontimer' (ID: 2)
✓ Trigger 'core.datetimetimer' (ID: 3)
→ Loading actions...
✓ Action 'core.echo' (ID: 1)
✓ Action 'core.sleep' (ID: 2)
✓ Action 'core.noop' (ID: 3)
✓ Action 'core.http_request' (ID: 4)
→ Loading sensors...
✓ Sensor 'core.interval_timer_sensor' (ID: 1)
============================================================
✓ Core pack loaded successfully!
============================================================
Pack ID: 1
Triggers: 3
Actions: 4
Sensors: 1
```
### Method 2: SQL Seed Script
For simpler setups or CI/CD, you can use the SQL seed script directly.
**Usage:**
```bash
psql $DATABASE_URL -f scripts/seed_core_pack.sql
```
**Note:** The SQL script may not include all pack metadata and is less flexible than the Python loader.
### Method 3: CLI (Future)
Once the CLI pack management commands are fully implemented:
```bash
attune pack register ./packs/core
```
## Verification
After loading, verify the core pack is available:
### Using CLI
```bash
# List all packs
attune pack list
# Show core pack details
attune pack show core
# List core pack actions
attune action list --pack core
# List core pack triggers
attune trigger list --pack core
```
### Using API
```bash
# Get pack info
curl http://localhost:8080/api/v1/packs/core | jq
# List actions
curl http://localhost:8080/api/v1/packs/core/actions | jq
# List triggers
curl http://localhost:8080/api/v1/packs/core/triggers | jq
```
### Using Database
```sql
-- Check pack exists
SELECT * FROM attune.pack WHERE ref = 'core';
-- Count components
SELECT
(SELECT COUNT(*) FROM attune.trigger WHERE pack_ref = 'core') as triggers,
(SELECT COUNT(*) FROM attune.action WHERE pack_ref = 'core') as actions,
(SELECT COUNT(*) FROM attune.sensor WHERE pack_ref = 'core') as sensors;
```
## Testing the Core Pack
### 1. Test Actions Directly
Test actions using environment variables:
```bash
# Test echo action
export ATTUNE_ACTION_MESSAGE="Hello, Attune!"
export ATTUNE_ACTION_UPPERCASE=false
./packs/core/actions/echo.sh
# Test sleep action
export ATTUNE_ACTION_SECONDS=2
export ATTUNE_ACTION_MESSAGE="Sleeping..."
./packs/core/actions/sleep.sh
# Test HTTP request action
export ATTUNE_ACTION_URL="https://httpbin.org/get"
export ATTUNE_ACTION_METHOD="GET"
python3 packs/core/actions/http_request.py
```
### 2. Run Pack Test Suite
```bash
# Run comprehensive test suite
./packs/core/test_core_pack.sh
```
### 3. Create a Test Rule
Create a simple rule to test the core pack integration:
```bash
# Create a rule that echoes every 10 seconds
attune rule create \
--name "test_timer_echo" \
--trigger "core.intervaltimer" \
--trigger-config '{"unit":"seconds","interval":10}' \
--action "core.echo" \
--action-params '{"message":"Timer triggered!"}' \
--enabled
```
## Updating the Core Pack
To update the core pack after making changes:
1. Edit the relevant YAML files in `packs/core/`
2. Re-run the loader script:
```bash
python3 scripts/load_core_pack.py
```
3. The loader will update existing entries (upsert)
## Troubleshooting
### "Failed to connect to database"
- Verify PostgreSQL is running: `pg_isready`
- Check `DATABASE_URL` environment variable
- Test connection: `psql $DATABASE_URL -c "SELECT 1"`
### "pack.yaml not found"
- Ensure you're running from the project root
- Check the `--pack-dir` argument points to the correct directory
- Verify `packs/core/pack.yaml` exists
### "ModuleNotFoundError: No module named 'psycopg2'"
```bash
pip install psycopg2-binary pyyaml
```
### "Pack loaded but not visible in API"
- Restart the API service to reload pack data
- Check pack is enabled: `SELECT enabled FROM attune.pack WHERE ref = 'core'`
### Actions not executing
- Verify action scripts are executable: `chmod +x packs/core/actions/*.sh`
- Check worker service is running and can access the packs directory
- Verify runtime configuration is correct
## Development Workflow
When developing new core pack components:
1. **Add new action:**
- Create `actions/new_action.yaml` with metadata
- Create `actions/new_action.sh` (or `.py`) with implementation
- Make script executable: `chmod +x actions/new_action.sh`
- Test locally: `export ATTUNE_ACTION_*=... && ./actions/new_action.sh`
- Load into database: `python3 scripts/load_core_pack.py`
2. **Add new trigger:**
- Create `triggers/new_trigger.yaml` with metadata
- Load into database: `python3 scripts/load_core_pack.py`
- Create sensor if needed
3. **Add new sensor:**
- Create `sensors/new_sensor.yaml` with metadata
- Create `sensors/new_sensor.py` with implementation
- Load into database: `python3 scripts/load_core_pack.py`
- Restart sensor service
## Environment Variables
The loader script supports the following environment variables:
- `DATABASE_URL` - PostgreSQL connection string
- Default: `postgresql://postgres:postgres@localhost:5432/attune`
- Example: `postgresql://user:pass@db.example.com:5432/attune`
- `ATTUNE_PACKS_DIR` - Base directory for packs
- Default: `./packs`
- Example: `/opt/attune/packs`
## CI/CD Integration
For automated deployments:
```yaml
# Example GitHub Actions workflow
- name: Load Core Pack
run: |
python3 scripts/load_core_pack.py \
--database-url "${{ secrets.DATABASE_URL }}"
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
```
## Next Steps
After loading the core pack:
1. **Create your first rule** using core triggers and actions
2. **Enable sensors** to start generating events
3. **Monitor executions** via the API or Web UI
4. **Explore pack documentation** in `README.md`
## Additional Resources
- **Pack README**: `packs/core/README.md` - Comprehensive component documentation
- **Testing Guide**: `packs/core/TESTING.md` - Testing procedures
- **API Documentation**: `docs/api-packs.md` - Pack management API
- **Action Development**: `docs/action-development.md` - Creating custom actions
## Support
If you encounter issues:
1. Check this troubleshooting section
2. Review logs from services (api, executor, worker, sensor)
3. Verify database state with SQL queries
4. File an issue with detailed error messages and logs
---
**Last Updated:** 2025-01-20
**Core Pack Version:** 1.0.0