790 lines
21 KiB
Markdown
790 lines
21 KiB
Markdown
|
|
# Installation Architecture: Targets with Configs & Wrappers
|
||
|
|
|
||
|
|
**Status:** Analysis & Design Document
|
||
|
|
**Created:** November 15, 2025
|
||
|
|
**Purpose:** Document installation strategy for syntaxis binaries with configuration management
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Current Installation System
|
||
|
|
|
||
|
|
### 1.1 Installation Scripts Infrastructure
|
||
|
|
|
||
|
|
**File:** `scripts/install-cli.nu` (NuShell)
|
||
|
|
|
||
|
|
**Current Capabilities:**
|
||
|
|
- Discovers binary crates in syntaxis (cli, api, tui, dashboard)
|
||
|
|
- Installs binaries to system PATH via `cargo install`
|
||
|
|
- Cleans up target/ directories (optional)
|
||
|
|
- Shows installation status
|
||
|
|
- Manages individual binary installation
|
||
|
|
|
||
|
|
**Current Limitations:**
|
||
|
|
```
|
||
|
|
✅ Installs binaries to ~/.cargo/bin/ (system PATH)
|
||
|
|
❌ Does NOT deploy configuration files
|
||
|
|
❌ Does NOT create wrapper scripts
|
||
|
|
❌ Does NOT manage config discovery at runtime
|
||
|
|
❌ No post-install configuration step
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1.2 Manifest Management Infrastructure
|
||
|
|
|
||
|
|
**File:** `scripts/manifest.nu` (NuShell)
|
||
|
|
|
||
|
|
**Tracks:**
|
||
|
|
- Installed binaries (name, version, path, enabled/disabled status)
|
||
|
|
- Configurations (name, type, path, enabled/disabled)
|
||
|
|
- Installation metadata (creation date, root directory)
|
||
|
|
|
||
|
|
**Example Structure:**
|
||
|
|
```toml
|
||
|
|
# .syntaxis/manifest.toml (generated structure)
|
||
|
|
[syntaxis]
|
||
|
|
version = "0.1.0"
|
||
|
|
created_at = "2025-11-15"
|
||
|
|
installation_root = "/path/to/installation"
|
||
|
|
|
||
|
|
[binaries]
|
||
|
|
workspace = { enabled = true, installed_at = "2025-11-15", version = "0.1.0", path = "..." }
|
||
|
|
syntaxis-tui = { enabled = true, installed_at = "2025-11-15", version = "0.1.0", path = "..." }
|
||
|
|
|
||
|
|
[configurations]
|
||
|
|
# Currently empty - needs enhancement
|
||
|
|
```
|
||
|
|
|
||
|
|
### 1.3 Configuration Discovery System
|
||
|
|
|
||
|
|
**File:** `scripts/common/find-config.nu`
|
||
|
|
|
||
|
|
**Search Order:**
|
||
|
|
1. `.syntaxis/{filename}` - syntaxis specific
|
||
|
|
2. `.project/{filename}` - Generic project
|
||
|
|
3. `.coder/{filename}` - Documentation tracking
|
||
|
|
4. `{filename}` - Current directory fallback
|
||
|
|
|
||
|
|
**Current Usage:**
|
||
|
|
- Scripts use this to find config files at build/runtime
|
||
|
|
- Database discovery (find-db-path)
|
||
|
|
- TOML file discovery
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Configuration System Analysis
|
||
|
|
|
||
|
|
### 2.1 Configuration File Locations
|
||
|
|
|
||
|
|
**Current Structure:**
|
||
|
|
```
|
||
|
|
syntaxis/
|
||
|
|
├── syntaxis/
|
||
|
|
│ ├── syntaxis-api-config.template.toml ⚠️ NEEDS RENAME
|
||
|
|
│ └── configs/features/
|
||
|
|
│ ├── auth.toml.template
|
||
|
|
│ ├── cache.toml.template
|
||
|
|
│ ├── database.toml.template
|
||
|
|
│ ├── health.toml.template
|
||
|
|
│ ├── metrics.toml.template
|
||
|
|
│ ├── multi_tenant.toml.template
|
||
|
|
│ └── rate_limit.toml.template
|
||
|
|
│
|
||
|
|
├── shared/rust-api/shared-api-lib/
|
||
|
|
│ └── src/config/mod.rs (Config definitions)
|
||
|
|
│
|
||
|
|
└── .syntaxis/ (Runtime configs after installation)
|
||
|
|
├── manifest.toml (Installation tracking)
|
||
|
|
└── [configs deployed here at runtime]
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2.2 Configuration Loading Flow
|
||
|
|
|
||
|
|
**Current (Hardcoded):**
|
||
|
|
```rust
|
||
|
|
// shared-api-lib/src/config/mod.rs
|
||
|
|
impl Config {
|
||
|
|
pub fn load() -> Result<Self> {
|
||
|
|
// 1. Try reading from env var
|
||
|
|
let config_path = std::env::var("CONFIG_PATH")
|
||
|
|
.unwrap_or_else(|_| "configs/default.toml".to_string());
|
||
|
|
|
||
|
|
// 2. Load from file
|
||
|
|
let content = std::fs::read_to_string(&config_path)?;
|
||
|
|
|
||
|
|
// 3. Deserialize
|
||
|
|
let config: Config = toml::from_str(&content)?;
|
||
|
|
Ok(config)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
**Needs Enhancement:**
|
||
|
|
- Use find-config logic for standardized discovery
|
||
|
|
- Support multiple config locations
|
||
|
|
- Environment variable overrides
|
||
|
|
- Config validation and merging
|
||
|
|
|
||
|
|
### 2.3 Configuration Types
|
||
|
|
|
||
|
|
**Main Configuration:** `syntaxis-api-config.toml`
|
||
|
|
- Server settings (host, port)
|
||
|
|
- Database connection
|
||
|
|
- Logging level
|
||
|
|
- Feature flags
|
||
|
|
|
||
|
|
**Feature Configurations:** `configs/features/*.toml`
|
||
|
|
- auth.toml - Authentication settings
|
||
|
|
- database.toml - Database pooling
|
||
|
|
- metrics.toml - Prometheus settings
|
||
|
|
- rate_limit.toml - Rate limiting rules
|
||
|
|
- cache.toml - Caching configuration
|
||
|
|
- health.toml - Health check settings
|
||
|
|
- multi_tenant.toml - Multi-tenancy settings
|
||
|
|
|
||
|
|
**Missing Workspace-Specific Configs:**
|
||
|
|
- projects.toml - Project management settings
|
||
|
|
- tasks.toml - Task tracking configuration
|
||
|
|
- phases.toml - Phase lifecycle configuration
|
||
|
|
- audit.toml - Audit trail settings
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Installation Targets Architecture
|
||
|
|
|
||
|
|
### 3.1 What is a "Target"?
|
||
|
|
|
||
|
|
In syntaxis context, a **target** is:
|
||
|
|
|
||
|
|
```
|
||
|
|
A compiled binary + its associated configs + runtime metadata
|
||
|
|
|
||
|
|
workspace (target)
|
||
|
|
├── Binary
|
||
|
|
│ └── ~/.cargo/bin/workspace (executable)
|
||
|
|
├── Configuration
|
||
|
|
│ ├── ~/.config/core/workspace.toml (main config)
|
||
|
|
│ └── ~/.config/core/features/*.toml (feature configs)
|
||
|
|
├── Data
|
||
|
|
│ └── ~/.local/share/core/ (runtime data)
|
||
|
|
├── Wrapper
|
||
|
|
│ └── /usr/local/bin/workspace (wrapper script)
|
||
|
|
└── Metadata
|
||
|
|
└── .syntaxis/manifest.toml (installed version/path)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 3.2 Target Types
|
||
|
|
|
||
|
|
**1. CLI Binary (syntaxis-cli)**
|
||
|
|
```
|
||
|
|
Purpose: Command-line interface
|
||
|
|
Executable: ~/.cargo/bin/workspace
|
||
|
|
Config: ~/.config/core/cli.toml
|
||
|
|
Data: ~/.local/share/core/cli/
|
||
|
|
Wrapper: Yes (setup env, find config, pass args)
|
||
|
|
```
|
||
|
|
|
||
|
|
**2. TUI Binary (syntaxis-tui)**
|
||
|
|
```
|
||
|
|
Purpose: Terminal UI interface
|
||
|
|
Executable: ~/.cargo/bin/syntaxis-tui
|
||
|
|
Config: ~/.config/core/tui.toml
|
||
|
|
Data: ~/.local/share/core/tui/
|
||
|
|
Wrapper: Yes (setup terminal, handle signals)
|
||
|
|
```
|
||
|
|
|
||
|
|
**3. API Server (syntaxis-api)**
|
||
|
|
```
|
||
|
|
Purpose: REST API server
|
||
|
|
Executable: ~/.cargo/bin/syntaxis-api
|
||
|
|
Config: ~/.config/core/api.toml
|
||
|
|
Data: ~/.local/share/core/api/
|
||
|
|
Wrapper: Yes (setup environment, manage process)
|
||
|
|
```
|
||
|
|
|
||
|
|
**4. Dashboard (syntaxis-dashboard)**
|
||
|
|
```
|
||
|
|
Purpose: Web UI
|
||
|
|
Type: Library + WASM frontend
|
||
|
|
Config: ~/.config/core/dashboard.toml
|
||
|
|
Data: ~/.local/share/core/dashboard/
|
||
|
|
Wrapper: Yes (manage server lifecycle)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Configuration Deployment Strategy
|
||
|
|
|
||
|
|
### 4.1 Configuration File Organization
|
||
|
|
|
||
|
|
**On Host System (After Installation):**
|
||
|
|
```
|
||
|
|
~/.config/core/
|
||
|
|
├── manifest.toml # Installation tracking
|
||
|
|
├── defaults.toml # Global defaults
|
||
|
|
├── workspace.toml # CLI config
|
||
|
|
├── syntaxis-tui.toml # TUI config
|
||
|
|
├── syntaxis-api.toml # API config
|
||
|
|
├── syntaxis-dashboard.toml # Dashboard config
|
||
|
|
└── features/ # Feature configs
|
||
|
|
├── auth.toml
|
||
|
|
├── cache.toml
|
||
|
|
├── database.toml
|
||
|
|
├── health.toml
|
||
|
|
├── metrics.toml
|
||
|
|
├── multi_tenant.toml
|
||
|
|
└── rate_limit.toml
|
||
|
|
|
||
|
|
~/.local/share/core/
|
||
|
|
├── cli/ # CLI runtime data
|
||
|
|
│ └── history.json
|
||
|
|
├── tui/ # TUI runtime data
|
||
|
|
│ └── state.json
|
||
|
|
├── api/ # API runtime data
|
||
|
|
│ ├── workspace.db
|
||
|
|
│ └── logs/
|
||
|
|
└── dashboard/ # Dashboard runtime data
|
||
|
|
└── cache/
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4.2 Configuration Template Deployment
|
||
|
|
|
||
|
|
**During Installation:**
|
||
|
|
1. Copy `syntaxis-api-config.template.toml` → `~/.config/core/syntaxis-api.toml`
|
||
|
|
2. Copy `configs/features/*.toml.template` → `~/.config/core/features/*.toml`
|
||
|
|
3. Create `.syntaxis/manifest.toml` with installation metadata
|
||
|
|
4. Register installed configurations in manifest
|
||
|
|
|
||
|
|
**Version Management:**
|
||
|
|
```toml
|
||
|
|
# manifest.toml entry
|
||
|
|
[configurations.syntaxis-api]
|
||
|
|
enabled = true
|
||
|
|
type = "main"
|
||
|
|
path = "~/.config/core/syntaxis-api.toml"
|
||
|
|
version = "0.1.0"
|
||
|
|
deployed_from = "syntaxis/syntaxis-api-config.template.toml"
|
||
|
|
deployed_at = "2025-11-15T10:30:00Z"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. Wrapper Scripts Architecture
|
||
|
|
|
||
|
|
### 5.1 Purpose of Wrappers
|
||
|
|
|
||
|
|
Wrapper scripts sit between the user/system and the binary, providing:
|
||
|
|
|
||
|
|
```
|
||
|
|
User Command: workspace --version
|
||
|
|
↓
|
||
|
|
Wrapper Script: workspace (wrapper)
|
||
|
|
↓ (setup environment)
|
||
|
|
├─ Find config file
|
||
|
|
├─ Set environment variables
|
||
|
|
├─ Validate config
|
||
|
|
├─ Setup logging
|
||
|
|
└─ Call actual binary
|
||
|
|
↓
|
||
|
|
Actual Binary: ~/.cargo/bin/workspace.real
|
||
|
|
↓
|
||
|
|
Output to User
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5.2 Wrapper Implementation Strategy
|
||
|
|
|
||
|
|
**Type 1: Shell-based Wrappers** (NuShell or Bash)
|
||
|
|
|
||
|
|
```nu
|
||
|
|
#!/usr/bin/env nu
|
||
|
|
|
||
|
|
# workspace wrapper - Setup environment and call actual binary
|
||
|
|
|
||
|
|
# 1. Find configuration
|
||
|
|
use scripts/common/find-config.nu [find-config]
|
||
|
|
let config_file = (find-config "workspace.toml")
|
||
|
|
|
||
|
|
# 2. Setup environment
|
||
|
|
let config_dir = (
|
||
|
|
if ($config_file | is-empty) {
|
||
|
|
"~/.config/syntaxis"
|
||
|
|
} else {
|
||
|
|
($config_file | path dirname)
|
||
|
|
}
|
||
|
|
)
|
||
|
|
|
||
|
|
# 3. Set environment variables
|
||
|
|
$env.WORKSPACE_CONFIG_DIR = ($config_dir | path expand)
|
||
|
|
$env.WORKSPACE_DATA_DIR = ("~/.local/share/syntaxis" | path expand)
|
||
|
|
$env.WORKSPACE_HOME = (pwd)
|
||
|
|
|
||
|
|
# 4. Call actual binary with arguments
|
||
|
|
~/.cargo/bin/workspace.real ...$args
|
||
|
|
```
|
||
|
|
|
||
|
|
**Type 2: Rust-based Wrappers**
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// workspace-wrapper/main.rs
|
||
|
|
use std::env;
|
||
|
|
use std::process::Command;
|
||
|
|
|
||
|
|
fn main() {
|
||
|
|
// 1. Find and load config
|
||
|
|
let config_dir = find_config_dir()
|
||
|
|
.unwrap_or_else(|| get_default_config_dir());
|
||
|
|
|
||
|
|
// 2. Setup environment
|
||
|
|
env::set_var("WORKSPACE_CONFIG_DIR", &config_dir);
|
||
|
|
env::set_var("WORKSPACE_DATA_DIR", get_data_dir());
|
||
|
|
|
||
|
|
// 3. Validate config
|
||
|
|
validate_config(&config_dir)
|
||
|
|
.expect("Configuration validation failed");
|
||
|
|
|
||
|
|
// 4. Call actual binary
|
||
|
|
let mut cmd = Command::new(
|
||
|
|
get_actual_binary_path()
|
||
|
|
);
|
||
|
|
|
||
|
|
cmd.args(env::args().skip(1));
|
||
|
|
|
||
|
|
let status = cmd.status()
|
||
|
|
.expect("Failed to execute binary");
|
||
|
|
|
||
|
|
std::process::exit(status.code().unwrap_or(1));
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5.3 Wrapper Functions
|
||
|
|
|
||
|
|
**1. Configuration Discovery & Validation**
|
||
|
|
```
|
||
|
|
Find config file
|
||
|
|
↓
|
||
|
|
Validate TOML syntax
|
||
|
|
↓
|
||
|
|
Check required fields
|
||
|
|
↓
|
||
|
|
Merge with feature configs
|
||
|
|
↓
|
||
|
|
Set CONFIG_PATH env var
|
||
|
|
```
|
||
|
|
|
||
|
|
**2. Environment Setup**
|
||
|
|
```
|
||
|
|
Set WORKSPACE_HOME
|
||
|
|
Set WORKSPACE_CONFIG_DIR
|
||
|
|
Set WORKSPACE_DATA_DIR
|
||
|
|
Set WORKSPACE_LOG_LEVEL (from config)
|
||
|
|
Set RUST_LOG (from log_level config)
|
||
|
|
```
|
||
|
|
|
||
|
|
**3. Pre-execution Hooks**
|
||
|
|
```
|
||
|
|
Check database connectivity (for API)
|
||
|
|
Create data directories if missing
|
||
|
|
Setup logging appenders
|
||
|
|
Validate feature configurations
|
||
|
|
```
|
||
|
|
|
||
|
|
**4. Post-execution Cleanup**
|
||
|
|
```
|
||
|
|
Flush logs
|
||
|
|
Close database connections
|
||
|
|
Cleanup temp files
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. Installation Flow
|
||
|
|
|
||
|
|
### 6.1 Complete Installation Process
|
||
|
|
|
||
|
|
```
|
||
|
|
┌─────────────────────────────────────────────────────────┐
|
||
|
|
│ User: just scripts-install or install-cli.nu all │
|
||
|
|
└─────────────┬───────────────────────────────────────────┘
|
||
|
|
│
|
||
|
|
├─ 1. DISCOVERY
|
||
|
|
│ └─ Find all binary crates in workspace
|
||
|
|
│
|
||
|
|
├─ 2. COMPILATION
|
||
|
|
│ └─ cargo build --release
|
||
|
|
│
|
||
|
|
├─ 3. BINARY INSTALLATION
|
||
|
|
│ └─ cargo install --path {crate}
|
||
|
|
│ └─ Binary placed in ~/.cargo/bin/
|
||
|
|
│
|
||
|
|
├─ 4. CONFIGURATION DEPLOYMENT
|
||
|
|
│ ├─ Create ~/.config/core/
|
||
|
|
│ ├─ Copy syntaxis-api-config.template.toml
|
||
|
|
│ ├─ Copy features/*.toml.template
|
||
|
|
│ └─ Parse and validate all configs
|
||
|
|
│
|
||
|
|
├─ 5. WRAPPER INSTALLATION
|
||
|
|
│ ├─ Rename ~/.cargo/bin/workspace → ~/.cargo/bin/workspace.real
|
||
|
|
│ ├─ Create wrapper script at ~/.cargo/bin/workspace
|
||
|
|
│ └─ Make wrapper executable
|
||
|
|
│
|
||
|
|
├─ 6. MANIFEST REGISTRATION
|
||
|
|
│ ├─ Load or create .syntaxis/manifest.toml
|
||
|
|
│ ├─ Register binary (name, version, path)
|
||
|
|
│ ├─ Register configurations
|
||
|
|
│ └─ Save manifest
|
||
|
|
│
|
||
|
|
└─ 7. VERIFICATION
|
||
|
|
├─ workspace --version (test wrapper)
|
||
|
|
├─ Test config discovery
|
||
|
|
├─ Validate environment setup
|
||
|
|
└─ Print installation summary
|
||
|
|
```
|
||
|
|
|
||
|
|
### 6.2 Installation Script Pseudocode
|
||
|
|
|
||
|
|
```nu
|
||
|
|
#!/usr/bin/env nu
|
||
|
|
|
||
|
|
# Phase 1: Compile binaries
|
||
|
|
cargo build --release
|
||
|
|
|
||
|
|
# Phase 2: Install binaries to ~/.cargo/bin/
|
||
|
|
for binary in [workspace syntaxis-tui syntaxis-api] {
|
||
|
|
cargo install --path core/crates/{binary}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Phase 3: Deploy configurations
|
||
|
|
let config_dir = "~/.config/syntaxis"
|
||
|
|
mkdir -p $config_dir
|
||
|
|
mkdir -p $"($config_dir)/features"
|
||
|
|
|
||
|
|
# Copy main configs
|
||
|
|
cp syntaxis/syntaxis-api-config.template.toml \
|
||
|
|
"$config_dir/syntaxis-api.toml"
|
||
|
|
|
||
|
|
# Copy feature configs
|
||
|
|
cp syntaxis/configs/features/*.toml.template \
|
||
|
|
"$config_dir/features/"
|
||
|
|
|
||
|
|
# Phase 4: Install wrappers
|
||
|
|
for binary in [workspace syntaxis-tui syntaxis-api] {
|
||
|
|
let binary_path = $"~/.cargo/bin/($binary)"
|
||
|
|
|
||
|
|
# Rename actual binary
|
||
|
|
mv $binary_path $"$binary_path.real"
|
||
|
|
|
||
|
|
# Create wrapper script
|
||
|
|
create-wrapper-script $binary $binary_path
|
||
|
|
|
||
|
|
# Make executable
|
||
|
|
chmod +x $binary_path
|
||
|
|
}
|
||
|
|
|
||
|
|
# Phase 5: Register in manifest
|
||
|
|
register-binary "workspace" "0.1.0" "~/.cargo/bin/workspace"
|
||
|
|
register-config "syntaxis-api" "main" "~/.config/core/syntaxis-api.toml"
|
||
|
|
|
||
|
|
# Phase 6: Verify installation
|
||
|
|
print "✅ Installation complete"
|
||
|
|
print ""
|
||
|
|
print "Test with:"
|
||
|
|
print " workspace --version"
|
||
|
|
print " syntaxis-tui"
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. Proposed Implementation Roadmap
|
||
|
|
|
||
|
|
### Phase 1: Configuration Deployment (Weeks 1-2)
|
||
|
|
|
||
|
|
**Tasks:**
|
||
|
|
1. Rename `syntaxis-api-config.template.toml` → `syntaxis-api-config.template.toml`
|
||
|
|
2. Create workspace-specific feature templates:
|
||
|
|
- `configs/features/projects.toml.template`
|
||
|
|
- `configs/features/tasks.toml.template`
|
||
|
|
- `configs/features/phases.toml.template`
|
||
|
|
- `configs/features/audit.toml.template`
|
||
|
|
3. Update `install-cli.nu` to copy config templates
|
||
|
|
4. Create `~/.config/core/` during installation
|
||
|
|
|
||
|
|
**Deliverables:**
|
||
|
|
- ✅ Config templates renamed and created
|
||
|
|
- ✅ Installation script copies configs
|
||
|
|
- ✅ Configuration files deployed to standard location
|
||
|
|
|
||
|
|
### Phase 2: Wrapper Script Implementation (Weeks 3-4)
|
||
|
|
|
||
|
|
**Tasks:**
|
||
|
|
1. Create wrapper script generator
|
||
|
|
2. Implement configuration discovery in wrappers
|
||
|
|
3. Setup environment variables
|
||
|
|
4. Integrate manifest management
|
||
|
|
5. Test wrapper functionality
|
||
|
|
|
||
|
|
**Deliverables:**
|
||
|
|
- ✅ Wrapper scripts for workspace, syntaxis-tui, syntaxis-api
|
||
|
|
- ✅ Config discovery working
|
||
|
|
- ✅ Environment properly setup
|
||
|
|
|
||
|
|
### Phase 3: Manifest Enhancement (Weeks 4-5)
|
||
|
|
|
||
|
|
**Tasks:**
|
||
|
|
1. Extend manifest.toml schema to track configs
|
||
|
|
2. Update manifest.nu to register configurations
|
||
|
|
3. Add config validation to manifest
|
||
|
|
4. Create config version tracking
|
||
|
|
|
||
|
|
**Deliverables:**
|
||
|
|
- ✅ Manifest tracks installed configs
|
||
|
|
- ✅ Config versions tracked
|
||
|
|
- ✅ Easy rollback capability
|
||
|
|
|
||
|
|
### Phase 4: Documentation & Testing (Weeks 5-6)
|
||
|
|
|
||
|
|
**Tasks:**
|
||
|
|
1. Create installation guide
|
||
|
|
2. Create configuration guide
|
||
|
|
3. Write wrapper script documentation
|
||
|
|
4. Create troubleshooting guide
|
||
|
|
5. Add integration tests
|
||
|
|
|
||
|
|
**Deliverables:**
|
||
|
|
- ✅ docs/installation-guide.md
|
||
|
|
- ✅ docs/configuration.md
|
||
|
|
- ✅ WRAPPER_GUIDE.md
|
||
|
|
- ✅ Integration tests passing
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 8. Key Design Decisions
|
||
|
|
|
||
|
|
### 8.1 Configuration Location
|
||
|
|
|
||
|
|
**Decision:** `~/.config/core/`
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Follows XDG Base Directory Specification
|
||
|
|
- Separates configs from binaries
|
||
|
|
- Easy to backup/restore
|
||
|
|
- Works on macOS, Linux, Windows (with WSL)
|
||
|
|
- Per-user isolation
|
||
|
|
|
||
|
|
**Alternative:** `/etc/core/` (would require sudo)
|
||
|
|
|
||
|
|
### 8.2 Wrapper Language
|
||
|
|
|
||
|
|
**Decision:** NuShell for maximum compatibility
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Consistent with existing workspace scripts
|
||
|
|
- Cross-platform (Windows, macOS, Linux)
|
||
|
|
- Rich scripting capabilities
|
||
|
|
- Same repo standard tool
|
||
|
|
|
||
|
|
**Alternative:** Rust (compile-time, higher performance)
|
||
|
|
|
||
|
|
### 8.3 Configuration Format
|
||
|
|
|
||
|
|
**Decision:** TOML (continue existing approach)
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Already in use throughout workspace
|
||
|
|
- Human-readable
|
||
|
|
- Serde support for validation
|
||
|
|
- Feature-specific configs easy to compose
|
||
|
|
|
||
|
|
### 8.4 Manifest Location
|
||
|
|
|
||
|
|
**Decision:** `.syntaxis/manifest.toml`
|
||
|
|
|
||
|
|
**Rationale:**
|
||
|
|
- Version-controlled for tracking
|
||
|
|
- Centralized installation metadata
|
||
|
|
- Easy to query installation state
|
||
|
|
- Clear audit trail
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 9. Security Considerations
|
||
|
|
|
||
|
|
### 9.1 Configuration File Permissions
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Config files should be readable by user only
|
||
|
|
chmod 600 ~/.config/core/*.toml
|
||
|
|
|
||
|
|
# Data directories should be user-writable
|
||
|
|
chmod 700 ~/.local/share/core/
|
||
|
|
```
|
||
|
|
|
||
|
|
### 9.2 Wrapper Script Security
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Wrapper scripts should not be world-writable
|
||
|
|
chmod 755 ~/.cargo/bin/workspace
|
||
|
|
|
||
|
|
# Binaries should not be world-writable
|
||
|
|
chmod 755 ~/.cargo/bin/workspace.real
|
||
|
|
```
|
||
|
|
|
||
|
|
### 9.3 Environment Variable Injection
|
||
|
|
|
||
|
|
**Risk:** Wrapper script loads untrusted configs
|
||
|
|
|
||
|
|
**Mitigation:**
|
||
|
|
1. Validate TOML syntax before loading
|
||
|
|
2. Check file ownership (must be current user)
|
||
|
|
3. Validate required fields before use
|
||
|
|
4. Reject unknown configuration keys (strict mode)
|
||
|
|
|
||
|
|
### 9.4 Database Access
|
||
|
|
|
||
|
|
**Risk:** Database path from config could point to sensitive files
|
||
|
|
|
||
|
|
**Mitigation:**
|
||
|
|
1. Validate database path is within `~/.local/share/core/`
|
||
|
|
2. Check database file permissions
|
||
|
|
3. Require explicit user approval for non-standard paths
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 10. Examples
|
||
|
|
|
||
|
|
### 10.1 User Installation Workflow
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# 1. Install all targets
|
||
|
|
$ just scripts-install
|
||
|
|
🔨 Installing syntaxis binaries...
|
||
|
|
✅ workspace: Installed successfully
|
||
|
|
✅ syntaxis-tui: Installed successfully
|
||
|
|
✅ syntaxis-api: Installed successfully
|
||
|
|
|
||
|
|
📋 Configurations deployed to:
|
||
|
|
~/.config/core/
|
||
|
|
└── syntaxis-api.toml
|
||
|
|
└── features/
|
||
|
|
├── auth.toml
|
||
|
|
├── database.toml
|
||
|
|
├── ...
|
||
|
|
|
||
|
|
# 2. Check installation
|
||
|
|
$ just scripts-status
|
||
|
|
📊 Installation Status
|
||
|
|
✅ workspace (CLI) - Installed
|
||
|
|
✅ syntaxis-tui (TUI) - Installed
|
||
|
|
✅ syntaxis-api (API) - Installed (WIP)
|
||
|
|
|
||
|
|
# 3. Verify wrapper works
|
||
|
|
$ workspace --version
|
||
|
|
syntaxis v0.1.0
|
||
|
|
|
||
|
|
Config loaded from: ~/.config/core/syntaxis-api.toml
|
||
|
|
Data directory: ~/.local/share/core/
|
||
|
|
|
||
|
|
# 4. Edit configuration
|
||
|
|
$ nano ~/.config/core/syntaxis-api.toml
|
||
|
|
|
||
|
|
# 5. Restart to apply changes
|
||
|
|
$ syntaxis-api
|
||
|
|
✅ Config validated
|
||
|
|
✅ Features loaded: auth, database, metrics
|
||
|
|
✅ Server listening on 0.0.0.0:8080
|
||
|
|
```
|
||
|
|
|
||
|
|
### 10.2 Configuration Discovery at Runtime
|
||
|
|
|
||
|
|
```rust
|
||
|
|
// Inside binary (syntaxis-api or similar)
|
||
|
|
|
||
|
|
use std::env;
|
||
|
|
use std::path::PathBuf;
|
||
|
|
|
||
|
|
fn load_config() -> Result<Config> {
|
||
|
|
// 1. Check explicit environment variable
|
||
|
|
if let Ok(path) = env::var("WORKSPACE_CONFIG_PATH") {
|
||
|
|
return load_from_path(&path);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 2. Use WORKSPACE_CONFIG_DIR (set by wrapper)
|
||
|
|
let config_dir = env::var("WORKSPACE_CONFIG_DIR")
|
||
|
|
.unwrap_or_else(|_| get_default_config_dir());
|
||
|
|
|
||
|
|
// 3. Try standard locations
|
||
|
|
let candidates = vec![
|
||
|
|
PathBuf::from(&config_dir).join("syntaxis-api.toml"),
|
||
|
|
PathBuf::from(&config_dir).join("default.toml"),
|
||
|
|
PathBuf::from(env::current_dir()?).join("syntaxis-api.toml"),
|
||
|
|
];
|
||
|
|
|
||
|
|
for path in candidates {
|
||
|
|
if path.exists() {
|
||
|
|
return load_from_path(&path);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
Err("No configuration found".into())
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 11. Files to Create/Modify
|
||
|
|
|
||
|
|
### Create New Files
|
||
|
|
- [ ] `scripts/install-targets.nu` - Enhanced installation with configs & wrappers
|
||
|
|
- [ ] `scripts/deploy-configs.nu` - Configuration deployment script
|
||
|
|
- [ ] `scripts/create-wrappers.nu` - Wrapper script generator
|
||
|
|
- [ ] `syntaxis/configs/features/projects.toml.template`
|
||
|
|
- [ ] `syntaxis/configs/features/tasks.toml.template`
|
||
|
|
- [ ] `syntaxis/configs/features/phases.toml.template`
|
||
|
|
- [ ] `syntaxis/configs/features/audit.toml.template`
|
||
|
|
- [ ] `docs/installation-guide.md` - User-facing installation documentation
|
||
|
|
- [ ] `docs/configuration.md` - Configuration management guide
|
||
|
|
- [ ] `WRAPPER_DESIGN.md` - Technical wrapper documentation
|
||
|
|
|
||
|
|
### Modify Existing Files
|
||
|
|
- [ ] `scripts/install-cli.nu` - Add config deployment
|
||
|
|
- [ ] `scripts/manifest.nu` - Add config registration
|
||
|
|
- [ ] `syntaxis/syntaxis-api-config.template.toml` → `syntaxis-api-config.template.toml`
|
||
|
|
- [ ] `Justfile` - Add installation targets recipe
|
||
|
|
- [ ] `shared/rust-api/shared-api-lib/src/config/mod.rs` - Integrate find-config
|
||
|
|
|
||
|
|
### Update Documentation
|
||
|
|
- [ ] README.md - Add installation instructions
|
||
|
|
- [ ] syntaxis/README.md - Add wrapper documentation
|
||
|
|
- [ ] .claude/ guidelines - Add installation best practices
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 12. Summary
|
||
|
|
|
||
|
|
### Current State
|
||
|
|
- ✅ Basic binary installation working
|
||
|
|
- ✅ Manifest tracking available
|
||
|
|
- ✅ Config discovery system exists
|
||
|
|
- ❌ Configs not deployed with binaries
|
||
|
|
- ❌ No wrapper scripts
|
||
|
|
- ❌ No environment setup at runtime
|
||
|
|
|
||
|
|
### Target State (After Implementation)
|
||
|
|
- ✅ Complete binary installation with configs
|
||
|
|
- ✅ Wrapper scripts setup environment
|
||
|
|
- ✅ Configuration validation
|
||
|
|
- ✅ Environment variable management
|
||
|
|
- ✅ Standardized installation locations
|
||
|
|
- ✅ Easy configuration management
|
||
|
|
- ✅ Installation verification
|
||
|
|
|
||
|
|
### Next Steps
|
||
|
|
1. Review this document with team
|
||
|
|
2. Confirm design decisions
|
||
|
|
3. Begin Phase 1 (configuration deployment)
|
||
|
|
4. Follow phased roadmap
|
||
|
|
5. Write integration tests as work progresses
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Document Version:** 1.0
|
||
|
|
**Status:** Design Review Ready
|
||
|
|
**Last Updated:** November 15, 2025
|