syntaxis/shared/templates/documentation/configuration.md.template
Jesús Pérez 9cef9b8d57 refactor: consolidate configuration directories
Merge _configs/ into config/ for single configuration directory.
Update all path references.

Changes:
- Move _configs/* to config/
- Update .gitignore for new patterns
- No code references to _configs/ found

Impact: -1 root directory (layout_conventions.md compliance)
2025-12-26 18:36:23 +00:00

471 lines
9.9 KiB
Plaintext

# {{TOOL_NAME}} Configuration Guide
Complete documentation for {{TOOL_NAME}} configuration system.
## Quick Start
1. **Create config file**:
```bash
mkdir -p .project
cp examples/config.toml .project/{{tool_name_kebab}}.toml
```
2. **Edit configuration**:
```bash
vi .project/{{tool_name_kebab}}.toml
```
3. **Tool auto-discovers config**:
```bash
{{tool_name_kebab}} list # Automatically uses configuration
```
## Configuration File Location
{{TOOL_NAME}} searches for configuration in this order (uses first found):
### 1. `.project/{{tool_name_kebab}}.toml` (Priority)
For projects using the Tools ecosystem.
```bash
mkdir -p .project
cp examples/config.toml .project/{{tool_name_kebab}}.toml
```
### 2. `.vapora/{{tool_name_kebab}}.toml`
For VAPORA platform projects.
```bash
mkdir -p .vapora
cp examples/config.toml .vapora/{{tool_name_kebab}}.toml
```
### 3. `.coder/{{tool_name_kebab}}.toml`
For doc tracking projects.
```bash
mkdir -p .coder
cp examples/config.toml .coder/{{tool_name_kebab}}.toml
```
### 4. `./{{tool_name_kebab}}.toml` (Current Directory)
For simple projects or testing.
```bash
cp examples/config.toml ./{{tool_name_kebab}}.toml
```
## Configuration Format
### TOML Structure
Configuration uses TOML format (Tom's Obvious, Minimal Language):
```toml
[{{tool_name_kebab}}]
# Main section - all settings go here
setting1 = "string value"
setting2 = 42
setting3 = true
[{{tool_name_kebab}}.subsection]
# Subsections for related settings
nested_setting = "value"
```
### Data Types
- **String**: `"text"` - Double quotes required
- **Integer**: `42` - Numbers without quotes
- **Boolean**: `true` or `false` - No quotes
- **Array**: `["a", "b", "c"]` - Comma-separated values
- **Table**: `[section]` - Grouped settings
## Configuration Options
### Main Section: `[{{tool_name_kebab}}]`
#### Basic Settings
**`setting1`** (string, required)
- Description: What this setting does
- Default: `"value1"`
- Example: `setting1 = "my-value"`
**`setting2`** (integer, optional)
- Description: What this setting does
- Default: `42`
- Valid Range: 1-1000
- Example: `setting2 = 100`
**`enable_feature`** (boolean, optional)
- Description: Enable or disable feature
- Default: `true`
- Example: `enable_feature = false`
### Advanced Section: `[{{tool_name_kebab}}.advanced]`
**`max_items`** (integer, optional)
- Description: Maximum number of items to process
- Default: `1000`
- Valid Range: 1-10000
- Example: `max_items = 5000`
**`timeout_seconds`** (integer, optional)
- Description: Operation timeout in seconds
- Default: `30`
- Valid Range: 1-300
- Example: `timeout_seconds = 60`
### Database Section: `[database]`
**`type`** (string, required)
- Description: Database type to use
- Valid Values: `"sqlite"`, `"postgres"`
- Default: `"sqlite"`
- Example: `type = "sqlite"`
**`path`** (string, for sqlite)
- Description: Path to SQLite database file
- Default: `".project/{{tool_name_kebab}}.db"`
- Example: `path = ".project/tool.db"`
**`url`** (string, for postgres)
- Description: PostgreSQL connection string
- Format: `postgresql://user:password@host:port/database`
- Example: `url = "postgresql://user:pass@localhost:5432/mydb"`
## Environment Variable Overrides
You can override configuration settings using environment variables:
### Format
```bash
export {{TOOL_NAME}}_SETTING_NAME=value
{{tool_name_kebab}} list
```
### Examples
```bash
# Override setting1
export {{TOOL_NAME}}_SETTING1="override-value"
# Override nested setting
export {{TOOL_NAME}}_ADVANCED_MAX_ITEMS=10000
# Override database
export {{TOOL_NAME}}_DATABASE_URL="postgresql://localhost/mydb"
# Run command (uses ENV values if set)
{{tool_name_kebab}} list
```
### Precedence Order
1. **Environment Variables** (highest priority)
2. **Command-line Arguments**
3. **Configuration File**
4. **Default Values** (lowest priority)
## Complete Configuration Examples
### Minimal Configuration (Development)
```toml
# Minimum required settings
[{{tool_name_kebab}}]
setting1 = "default"
[database]
type = "sqlite"
```
### Standard Configuration (Single User)
```toml
[{{tool_name_kebab}}]
setting1 = "my-value"
setting2 = 100
enable_feature = true
[database]
type = "sqlite"
path = ".project/{{tool_name_kebab}}.db"
```
### Production Configuration (Multi-User)
```toml
[{{tool_name_kebab}}]
setting1 = "production-value"
setting2 = 500
enable_feature = true
[{{tool_name_kebab}}.advanced]
max_items = 10000
timeout_seconds = 60
[database]
type = "postgres"
url = "postgresql://user:password@prod-db:5432/{{tool_name_kebab}}"
```
## Configuration Validation
### Validation Rules
Configuration is automatically validated on startup:
- ✅ Required fields must be present
- ✅ Values must be correct type
- ✅ Numbers must be in valid range
- ✅ Paths must exist (if required)
- ✅ URLs must be valid format
### Validation Errors
If configuration is invalid, you'll see errors like:
```
Error: Configuration validation failed
- setting1: Cannot be empty
- setting2: Must be between 1 and 1000
- database.url: Invalid PostgreSQL URL format
```
### Check Configuration
You can validate without running:
```bash
{{tool_name_kebab}} validate-config
# Output: Configuration is valid ✅
```
## Configuration Search Debugging
To see which configuration file is being used:
```bash
# Enable verbose logging
{{tool_name_kebab}} -v list
# Output includes:
# DEBUG: Searching for configuration...
# DEBUG: Checking .project/{{tool_name_kebab}}.toml... found!
# INFO: Using config: .project/{{tool_name_kebab}}.toml
```
## Customizing Configuration
### Add Custom Settings
In your {{MainType}}Service:
```rust
#[derive(Debug, Deserialize)]
pub struct Config {
pub setting1: String,
pub setting2: u32,
pub custom_setting: String, // Add this
}
```
Update the TOML:
```toml
[{{tool_name_kebab}}]
setting1 = "value"
setting2 = 42
custom_setting = "custom-value"
```
### Add Validation
```rust
impl Config {
pub fn validate(&self) -> Result<()> {
if self.custom_setting.is_empty() {
return Err(ConfigError::EmptyCustomSetting);
}
Ok(())
}
}
```
## Database Configuration
### SQLite (Default)
Best for single-user applications.
```toml
[database]
type = "sqlite"
path = ".project/{{tool_name_kebab}}.db"
```
**Advantages**:
- No server needed
- Zero configuration
- Good for testing
- File-based
**Disadvantages**:
- Single writer at a time
- Not suitable for high concurrency
### PostgreSQL (Production)
Best for multi-user production deployments.
```toml
[database]
type = "postgres"
url = "postgresql://user:password@hostname:5432/database"
```
**Connection URL Format**:
```
postgresql://[user[:password]@][host][:port][/database]
```
**Examples**:
```
postgresql://localhost/{{tool_name_kebab}}
postgresql://user:pass@localhost:5432/{{tool_name_kebab}}
postgresql://user:pass@prod.example.com:5432/{{tool_name_kebab}}
```
**Advantages**:
- Multiple concurrent connections
- Full ACID compliance
- Advanced features
- Production-ready
**Disadvantages**:
- Requires server
- Setup complexity
- Network latency
## Configuration with Docker
### Environment-Based Configuration
```dockerfile
FROM rust:latest as builder
WORKDIR /app
COPY . .
RUN cargo build --release
FROM debian:bookworm-slim
ENV {{TOOL_NAME}}_DATABASE_URL=postgresql://db:5432/mydb
ENV {{TOOL_NAME}}_TIMEOUT_SECONDS=60
COPY --from=builder /app/target/release/{{tool_name_kebab}} /usr/bin/
ENTRYPOINT ["{{tool_name_kebab}}", "list"]
```
### Docker Compose
```yaml
version: '3.8'
services:
{{tool_name_kebab}}:
image: {{tool_name_kebab}}:latest
environment:
{{TOOL_NAME}}_DATABASE_URL: postgresql://db:5432/{{tool_name_kebab}}
{{TOOL_NAME}}_TIMEOUT_SECONDS: 60
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_DB: {{tool_name_kebab}}
```
## Troubleshooting Configuration
### Configuration Not Found
**Problem**: "No config found in standard locations"
**Solution**: Create config in one of the search locations:
```bash
mkdir -p .project
cp examples/config.toml .project/{{tool_name_kebab}}.toml
```
### Invalid TOML Syntax
**Problem**: "Failed to parse configuration: TOML parse error"
**Solution**: Check TOML syntax:
```toml
# ❌ Wrong
setting = value # Missing quotes
# ✅ Correct
setting = "value" # Strings need quotes
number = 42 # Numbers don't need quotes
```
### Configuration Not Applied
**Problem**: Changes to config aren't taking effect
**Solution**:
1. Verify you're editing the right file
2. Check file path with verbose logging: `{{tool_name_kebab}} -v list`
3. Ensure environment variables aren't overriding: `env | grep {{TOOL_NAME}}`
### Database Connection Error
**Problem**: "Failed to connect to database"
**Solution**:
- SQLite: Ensure path is writable: `chmod 755 .project/`
- PostgreSQL: Check connection string and server: `psql -c "select 1"`
### Invalid Configuration Values
**Problem**: "Configuration validation failed: setting2 must be between 1 and 1000"
**Solution**: Check valid ranges in this document and adjust values.
## Configuration Best Practices
1. **Start with example**: Copy `examples/config.toml` and customize
2. **Use .project/**: Use consistent location across Tools
3. **Don't commit sensitive data**: Use environment variables for secrets
4. **Version your config**: Track in git (without secrets)
5. **Document changes**: Add comments to custom settings
6. **Test configuration**: Use `validate-config` command
7. **Use environment variables**: For deployment-specific values
## Advanced: Configuration as Code
You can generate configuration programmatically:
```bash
# Create config from template
cat > .project/{{tool_name_kebab}}.toml << EOF
[{{tool_name_kebab}}]
setting1 = "$(hostname)"
setting2 = $(nproc)
EOF
{{tool_name_kebab}} list
```
## References
- **Example Configuration**: [examples/config.toml](../examples/config.toml)
- **README**: [README.md](README.md)
- **Quick Start**: [QUICKSTART.md](QUICKSTART.md)
- **Architecture**: [architecture.md](architecture.md)