chore: update docs

This commit is contained in:
Jesús Pérez 2026-01-12 05:00:00 +00:00
parent 623fef40a4
commit 3c88c8ddd4
Signed by: jesus
GPG Key ID: 9F243E355E0BC939
11 changed files with 136 additions and 602 deletions

View File

@ -46,7 +46,7 @@ export LLM_API_KEY="your-generic-api-key"
export PROVISIONING_AI_MODEL="gpt-4" export PROVISIONING_AI_MODEL="gpt-4"
export PROVISIONING_AI_TEMPERATURE="0.3" export PROVISIONING_AI_TEMPERATURE="0.3"
export PROVISIONING_AI_MAX_TOKENS="2048" export PROVISIONING_AI_MAX_TOKENS="2048"
```plaintext ```
### Nickel Configuration ### Nickel Configuration
@ -65,7 +65,7 @@ settings.Settings {
enable_webhook_ai = False enable_webhook_ai = False
} }
} }
```plaintext ```
### YAML Configuration (`ai.yaml`) ### YAML Configuration (`ai.yaml`)
@ -79,7 +79,7 @@ timeout: 30
enable_template_ai: true enable_template_ai: true
enable_query_ai: true enable_query_ai: true
enable_webhook_ai: false enable_webhook_ai: false
```plaintext ```
## Usage ## Usage
@ -104,7 +104,7 @@ enable_webhook_ai: false
# Validate and fix Nickel files # Validate and fix Nickel files
./provisioning ai validate -i servers.ncl ./provisioning ai validate -i servers.ncl
```plaintext ```
#### Interactive AI Chat #### Interactive AI Chat
@ -120,7 +120,7 @@ enable_webhook_ai: false
# Show configuration # Show configuration
./provisioning ai config ./provisioning ai config
```plaintext ```
### 🧠 **Programmatic API** ### 🧠 **Programmatic API**
@ -137,7 +137,7 @@ let defaults = (generate_defaults_nickel "High-availability setup in EU region"
# Generate complete infrastructure # Generate complete infrastructure
let result = (generate_full_infra_ai "E-commerce platform with database and caching" "upcloud" "" false) let result = (generate_full_infra_ai "E-commerce platform with database and caching" "upcloud" "" false)
```plaintext ```
#### Process Natural Language Queries #### Process Natural Language Queries
@ -152,7 +152,7 @@ let template = (ai_generate_template "Docker Swarm cluster with monitoring" "clu
# Validate configurations # Validate configurations
let validation = (validate_and_fix_nickel "servers.ncl") let validation = (validate_and_fix_nickel "servers.ncl")
```plaintext ```
### 🌐 **Webhook Integration** ### 🌐 **Webhook Integration**
@ -166,7 +166,7 @@ curl -X POST http://your-server/webhook \
"user_id": "user123", "user_id": "user123",
"channel": "infrastructure" "channel": "infrastructure"
}' }'
```plaintext ```
#### Slack Integration #### Slack Integration
@ -179,7 +179,7 @@ let slack_payload = {
} }
let response = (process_slack_webhook $slack_payload) let response = (process_slack_webhook $slack_payload)
```plaintext ```
#### Discord Integration #### Discord Integration
@ -192,7 +192,7 @@ let discord_payload = {
} }
let response = (process_discord_webhook $discord_payload) let response = (process_discord_webhook $discord_payload)
```plaintext ```
## Examples ## Examples
@ -209,7 +209,7 @@ High-availability Kubernetes cluster with:
- Private networking with load balancer - Private networking with load balancer
- Monitoring and logging stack - Monitoring and logging stack
" --provider upcloud --output k8s_cluster_servers.ncl --validate " --provider upcloud --output k8s_cluster_servers.ncl --validate
```plaintext ```
#### 2. AWS Production Environment #### 2. AWS Production Environment
@ -225,7 +225,7 @@ AWS production environment configuration:
- CloudFront CDN - CloudFront CDN
- Route53 DNS management - Route53 DNS management
" --provider aws --output aws_prod_defaults.ncl " --provider aws --output aws_prod_defaults.ncl
```plaintext ```
#### 3. Development Environment #### 3. Development Environment
@ -240,7 +240,7 @@ Development environment for a microservices application:
- Development tools (Git, CI/CD agents) - Development tools (Git, CI/CD agents)
- Monitoring (Prometheus, Grafana) - Monitoring (Prometheus, Grafana)
" --provider local --interactive " --provider local --interactive
```plaintext ```
### 💬 **Chat Examples** ### 💬 **Chat Examples**
@ -273,7 +273,7 @@ servers = [
// Database servers with replication // Database servers with replication
// Monitoring stack with Prometheus/Grafana // Monitoring stack with Prometheus/Grafana
] ]
```plaintext ```
*This configuration includes 7 servers optimized for high availability and performance. *This configuration includes 7 servers optimized for high availability and performance.
Would you like me to explain any specific part or generate additional configurations?"* Would you like me to explain any specific part or generate additional configurations?"*
@ -284,7 +284,7 @@ Would you like me to explain any specific part or generate additional configurat
```bash ```bash
./provisioning ai generate --interactive ./provisioning ai generate --interactive
```plaintext ```
This launches an interactive session that asks specific questions to build optimal configurations: This launches an interactive session that asks specific questions to build optimal configurations:
@ -303,7 +303,7 @@ This launches an interactive session that asks specific questions to build optim
# Get AI suggestions for performance improvements # Get AI suggestions for performance improvements
./provisioning ai query --prompt "How can I optimize this configuration for better performance?" --context file:servers.ncl ./provisioning ai query --prompt "How can I optimize this configuration for better performance?" --context file:servers.ncl
```plaintext ```
## Integration with Existing Workflows ## Integration with Existing Workflows
@ -320,7 +320,7 @@ This launches an interactive session that asks specific questions to build optim
./provisioning generate-ai servers "Production Kubernetes cluster" --validate --output servers.ncl ./provisioning generate-ai servers "Production Kubernetes cluster" --validate --output servers.ncl
./provisioning server create --check # Review before creation ./provisioning server create --check # Review before creation
./provisioning server create # Actually create infrastructure ./provisioning server create # Actually create infrastructure
```plaintext ```
### 🛡️ **Security & Best Practices** ### 🛡️ **Security & Best Practices**
@ -341,7 +341,7 @@ This launches an interactive session that asks specific questions to build optim
# Debug mode for troubleshooting # Debug mode for troubleshooting
./provisioning generate-ai servers "test setup" --debug ./provisioning generate-ai servers "test setup" --debug
```plaintext ```
## Architecture ## Architecture
@ -354,7 +354,7 @@ ai/
├── webhook.nu # Chat/webhook processing ├── webhook.nu # Chat/webhook processing
├── mod.nu # Module exports ├── mod.nu # Module exports
└── README.md # This documentation └── README.md # This documentation
```plaintext ```
### 🔌 **Integration Points** ### 🔌 **Integration Points**

View File

@ -1,54 +0,0 @@
AI capabilities have been successfully implemented as an optional running mode with support for OpenAI, Claude, and generic LLM
providers! Here's what's been added:
✅ Configuration (Nickel Schema)
- AIProvider schema in nickel/settings.ncl:54-79 with configurable provider selection
- Optional mode with feature flags for template, query, and webhook AI
✅ Core AI Library
- core/nulib/lib_provisioning/ai/lib.nu - Complete AI integration library
- Support for OpenAI, Claude, and generic providers
- Configurable endpoints, models, and parameters
✅ Template Generation
- Enhanced render_template function with --ai_prompt flag
- Natural language to infrastructure config generation
✅ Query Enhancement
- Added --ai_query flag to query command in query.nu:21
- Natural language infrastructure queries
✅ Webhook Integration
- webhook/ai_webhook.nu with platform-specific handlers (Slack, Discord, Teams)
- Enhanced existing webhook system with AI processing
✅ CLI Integration
- New ai command module in main_provisioning/ai.nu
- Integrated into main provisioning CLI
Usage Examples:
# Generate infrastructure templates
./core/nulib/provisioning ai template --prompt "3-node Kubernetes cluster with Ceph storage"
# Natural language queries
./core/nulib/provisioning query --ai_query "show all AWS servers with high CPU usage"
# Test AI configuration
./core/nulib/provisioning ai test
# Webhook processing
./core/nulib/provisioning ai webhook --prompt "deploy redis cluster"
All AI capabilities are optional and configurable through the Nickel settings with provider choice between OpenAI, Claude, and
generic LLM endpoints.

View File

@ -1,44 +0,0 @@
✅ AI Integration Complete
All 4 requested features implemented as optional running mode:
1. Template System Enhancement ✅
- Enhanced render_template function with AI capabilities
- New render_template_ai function for direct AI template generation
- Natural language to infrastructure config generation
1. Natural Language Query System ✅
- Added --ai_query flag to the query command
- AI processes natural language queries about infrastructure
- Context-aware responses based on infrastructure state
1. Plugin Development ✅
- Complete AI library: core/nulib/lib_provisioning/ai/lib.nu
- Support for OpenAI, Claude, and generic LLM providers
- Configurable endpoints, models, and parameters
1. Webhook Integration ✅
- Chat platform support: Slack, Discord, Teams, generic
- Enhanced existing webhook system with AI processing
- Platform-specific response formatting
Configuration
- Nickel Schema: nickel/settings.ncl:54-79 - AIProvider configuration
- Optional Mode: Enable/disable via ai.enabled = true
- Provider Choice: "openai" | "claude" | "generic"
- Feature Flags: Individual toggles for template, query, webhook AI
Usage Ready
Set API key environment variable and enable in Nickel settings:
export OPENAI_API_KEY="your-key" # for OpenAI
export ANTHROPIC_API_KEY="your-key" # for Claude
export LLM_API_KEY="your-key" # for generic
All AI functionality is now available as an optional running mode with full provider choice support!

View File

@ -1,139 +0,0 @@
Perfect! I have successfully implemented a comprehensive AI-powered infrastructure automation system for
your provisioning tool. Here's what has been accomplished:
✨ AI Infrastructure Automation - Complete Implementation
🎯 Key Features Implemented:
1. 🤖 AI-Powered Nickel Generation
- Natural language to Nickel configuration conversion
- Support for servers, defaults, settings, clusters, and task services
- Provider-specific optimizations (UpCloud, AWS, Local)
2. 🧠 Multiple AI Provider Support
- OpenAI (GPT-4, GPT-3.5)
- Anthropic Claude (Claude-3.5 Sonnet)
- Generic/Local LLM APIs (Ollama, etc.)
3. 💬 Interactive Interfaces
- Command-line AI chat
- Interactive configuration builder
- Webhook integration for Slack/Discord
- Natural language query processing
4. 🔧 Enhanced Generation Commands
- ./provisioning ai - Main AI command interface
- ./provisioning generate-ai - AI-enhanced generation
- Interactive mode with follow-up questions
- Automatic validation and improvement
🛠 Files Created/Enhanced:
Core AI Library
- core/nulib/lib_provisioning/ai/lib.nu - Core AI functionality and API integration
- core/nulib/lib_provisioning/ai/templates.nu - Nickel template generation
- core/nulib/lib_provisioning/ai/webhook.nu - Chat/webhook processing
- core/nulib/lib_provisioning/ai/mod.nu - Module exports
Command Interface
- core/nulib/main_provisioning/ai.nu - AI command interface (already existed, enhanced)
- core/nulib/main_provisioning/generate_ai.nu - Enhanced generation commands
Configuration Files
- nickel/settings.ncl - Added AIProvider schema (already existed)
- templates/ai.yaml - AI configuration template
- templates/default_context.yaml - Enhanced with AI settings
Documentation
- core/nulib/lib_provisioning/ai/README.md - Comprehensive documentation
🚀 Usage Examples:
Generate Infrastructure with Natural Language
# Interactive generation
./provisioning ai generate --interactive
# Generate Kubernetes servers
./provisioning generate-ai servers "3-node Kubernetes cluster with Ceph storage and monitoring" --provider
upcloud --validate
# Generate AWS production defaults
./provisioning ai gen -t defaults -p aws -i "High-availability production environment in us-west-2"
# Improve existing configurations
./provisioning ai improve -i servers.ncl -o optimized_servers.ncl
AI Chat Interface
# Start interactive chat
./provisioning ai chat
# Single query
./provisioning ai chat -i "How do I set up persistent storage for Kubernetes?"
# Test AI functionality
./provisioning ai test
Webhook Integration
# Process webhook messages
curl -X POST <http://your-server/webhook> \
-H "Content-Type: application/json" \
-d '{"message": "generate 3 kubernetes servers", "user_id": "user123"}'
⚙️ Configuration:
Environment Variables
export PROVISIONING_AI_ENABLED=true
export PROVISIONING_AI_PROVIDER="openai"
export OPENAI_API_KEY="your-api-key"
Nickel Configuration
ai = AIProvider {
enabled = True
provider = "openai"
model = "gpt-4"
max_tokens = 2048
temperature = 0.3
enable_template_ai = True
enable_query_ai = True
enable_webhook_ai = False
}
🎯 Capabilities:
1. Smart Nickel Generation - Understands infrastructure requirements and generates proper Nickel configurations
2. Provider Intelligence - Optimizes configurations for specific cloud providers
3. Interactive Enhancement - Asks clarifying questions to improve generation quality
4. Validation & Fixing - Automatically validates and fixes Nickel syntax issues
5. Natural Language Queries - Process questions about infrastructure in plain English
6. Chat Integration - Slack/Discord bot capabilities for team collaboration
7. Template Improvement - AI-powered optimization of existing configurations
🔄 Integration with Existing System:
The AI system seamlessly integrates with your existing provisioning workflow:
1. Generate configurations with AI
2. Validate using existing Nickel tools
3. Apply using standard provisioning commands
4. Monitor and iterate with AI assistance
This creates a powerful natural language interface for your infrastructure automation system, making it
accessible to team members who may not be familiar with Nickel syntax while maintaining all the precision and
power of your existing tooling.
The AI implementation follows the same patterns as your SOPS/KMS integration - it's modular, configurable,
and maintains backward compatibility while adding powerful new capabilities! 🚀

View File

@ -1,239 +0,0 @@
# Extension System Quick Start Guide
Get started with the Extension Loading System in 5 minutes.
## Prerequisites
1. **OCI Registry** (optional, for OCI features):
```bash
# Start local registry
docker run -d -p 5000:5000 --name registry registry:2
```
2. **Nushell 0.107+**:
```bash
nu --version
```
## Quick Start
### 1. Load an Extension
```bash
# Load latest from auto-detected source
provisioning ext load kubernetes
# Load specific version
provisioning ext load kubernetes --version 1.28.0
# Load from specific source
provisioning ext load redis --source oci
```plaintext
### 2. Search for Extensions
```bash
# Search all sources
provisioning ext search kube
# Search OCI registry
provisioning ext search postgres --source oci
```plaintext
### 3. List Available Extensions
```bash
# List all
provisioning ext list
# Filter by type
provisioning ext list --type taskserv
# JSON format
provisioning ext list --format json
```plaintext
### 4. Manage Cache
```bash
# Show cache stats
provisioning ext cache stats
# List cached
provisioning ext cache list
# Clear cache
provisioning ext cache clear --all
```plaintext
### 5. Publish an Extension
```bash
# Create extension
mkdir -p my-extension/{nickel,scripts}
# Create manifest
cat > my-extension/extension.yaml <<EOF
extension:
name: my-extension
version: 1.0.0
type: taskserv
description: My awesome extension
EOF
# Publish to OCI
provisioning ext publish ./my-extension --version 1.0.0
```plaintext
## Configuration
### Enable OCI Registry
Edit `workspace/config/local-overrides.toml`:
```toml
[oci]
registry = "localhost:5000"
namespace = "provisioning-extensions"
auth_token_path = "~/.provisioning/oci-token"
[extensions]
source_type = "auto" # auto, oci, gitea, local
```plaintext
### Test OCI Connection
```bash
provisioning ext test-oci
```plaintext
## Common Workflows
### Workflow 1: Install Taskserv from OCI
```bash
# Search for taskserv
provisioning ext search kubernetes --source oci
# Load it
provisioning ext load kubernetes --version ^1.28.0
# Use in provisioning
provisioning taskserv create kubernetes
```plaintext
### Workflow 2: Develop and Test Locally
```bash
# Copy to local path
cp -r my-extension ~/.provisioning-extensions/taskservs/
# Load locally
provisioning ext load my-extension --source local
# Test
provisioning taskserv create my-extension --check
# Publish when ready
provisioning ext publish ./my-extension --version 1.0.0
```plaintext
### Workflow 3: Offline Usage
```bash
# Pull extensions to cache while online
provisioning ext pull kubernetes --version 1.28.0
provisioning ext pull redis --version 7.0.0
provisioning ext pull postgres --version 15.0.0
# Work offline - uses cache
provisioning ext load kubernetes
provisioning ext load redis
```plaintext
## Extension Structure
Minimal extension:
```plaintext
my-extension/
├── extension.yaml # Required manifest
└── nickel/ # At least one content dir
└── my-extension.ncl
```plaintext
Complete extension:
```plaintext
my-extension/
├── extension.yaml # Manifest
├── nickel/ # Nickel schemas
│ ├── my-extension.ncl
│ └── nickel.mod
├── scripts/ # Installation scripts
│ ├── install.nu
│ └── uninstall.nu
├── templates/ # Config templates
│ └── config.yaml.j2
└── docs/ # Documentation
└── README.md
```plaintext
## Troubleshooting
### Extension Not Found
```bash
# Discover available extensions
provisioning ext discover
# Search by name
provisioning ext search <name>
# Check specific source
provisioning ext list --source oci
```plaintext
### OCI Registry Issues
```bash
# Test connection
provisioning ext test-oci
# Check registry is running
curl http://localhost:5000/v2/
# View OCI config
provisioning env | grep OCI
```plaintext
### Cache Problems
```bash
# Clear and rebuild
provisioning ext cache clear --all
# Pull fresh copy
provisioning ext pull <name> --force
```plaintext
## Next Steps
- Read full documentation: `README.md`
- Explore test suite: `tests/run_all_tests.nu`
- Check implementation summary: `EXTENSION_LOADER_IMPLEMENTATION_SUMMARY.md`
## Help
```bash
# Extension commands help
provisioning ext --help
# Cache commands help
provisioning ext cache --help
# Publish help
nu provisioning/tools/publish_extension.nu --help
```plaintext

View File

@ -37,7 +37,7 @@ Extension Loading System
├── Load, search, list ├── Load, search, list
├── Cache management ├── Cache management
└── Publishing └── Publishing
```plaintext ```
## Features ## Features
@ -115,7 +115,7 @@ retry_count = 3
[extensions] [extensions]
source_type = "auto" # auto, oci, gitea, local source_type = "auto" # auto, oci, gitea, local
```plaintext ```
### Environment Variables ### Environment Variables
@ -139,7 +139,7 @@ provisioning ext load kubernetes --force
# Load provider # Load provider
provisioning ext load aws --type provider provisioning ext load aws --type provider
```plaintext ```
### Search Extensions ### Search Extensions
@ -152,7 +152,7 @@ provisioning ext search kubernetes --source oci
# Search local only # Search local only
provisioning ext search kube --source local provisioning ext search kube --source local
```plaintext ```
### List Extensions ### List Extensions
@ -168,7 +168,7 @@ provisioning ext list --format json
# List from specific source # List from specific source
provisioning ext list --source oci provisioning ext list --source oci
```plaintext ```
### Extension Information ### Extension Information
@ -181,7 +181,7 @@ provisioning ext info kubernetes --version 1.28.0
# Show versions # Show versions
provisioning ext versions kubernetes provisioning ext versions kubernetes
```plaintext ```
### Cache Management ### Cache Management
@ -200,7 +200,7 @@ provisioning ext cache clear --all
# Prune old entries (older than 30 days) # Prune old entries (older than 30 days)
provisioning ext cache prune --days 30 provisioning ext cache prune --days 30
```plaintext ```
### Pull to Cache ### Pull to Cache
@ -210,7 +210,7 @@ provisioning ext pull kubernetes --version 1.28.0
# Pull from specific source # Pull from specific source
provisioning ext pull redis --source oci provisioning ext pull redis --source oci
```plaintext ```
### Publishing ### Publishing
@ -226,7 +226,7 @@ provisioning ext publish ./my-extension \
# Force overwrite existing # Force overwrite existing
provisioning ext publish ./my-extension --version 1.0.0 --force provisioning ext publish ./my-extension --version 1.0.0 --force
```plaintext ```
### Discovery ### Discovery
@ -239,14 +239,14 @@ provisioning ext discover --type taskserv
# Force refresh # Force refresh
provisioning ext discover --refresh provisioning ext discover --refresh
```plaintext ```
### Test OCI Connection ### Test OCI Connection
```bash ```bash
# Test OCI registry connectivity # Test OCI registry connectivity
provisioning ext test-oci provisioning ext test-oci
```plaintext ```
## Publishing Tool Usage ## Publishing Tool Usage
@ -267,7 +267,7 @@ nu provisioning/tools/publish_extension.nu info kubernetes 1.28.0
# Delete extension # Delete extension
nu provisioning/tools/publish_extension.nu delete kubernetes 1.28.0 --force nu provisioning/tools/publish_extension.nu delete kubernetes 1.28.0 --force
```plaintext ```
## Extension Structure ## Extension Structure
@ -285,7 +285,7 @@ my-extension/
│ └── config.yaml.j2 │ └── config.yaml.j2
└── docs/ # Documentation (optional) └── docs/ # Documentation (optional)
└── README.md └── README.md
```plaintext ```
### Extension Manifest (extension.yaml) ### Extension Manifest (extension.yaml)
@ -309,14 +309,14 @@ extension:
homepage: https://example.com homepage: https://example.com
repository: https://github.com/user/extension repository: https://github.com/user/extension
license: MIT license: MIT
```plaintext ```
## API Reference ## API Reference
### OCI Client (oci/client.nu) ### OCI Client (oci/client.nu)
| Function | Description | | Function | Description |
|----------|-------------| | -------- | ----------- |
| `oci-pull-artifact` | Pull artifact from OCI registry | | `oci-pull-artifact` | Pull artifact from OCI registry |
| `oci-push-artifact` | Push artifact to OCI registry | | `oci-push-artifact` | Push artifact to OCI registry |
| `oci-list-artifacts` | List all artifacts in registry | | `oci-list-artifacts` | List all artifacts in registry |
@ -330,7 +330,7 @@ extension:
### Cache System (cache.nu) ### Cache System (cache.nu)
| Function | Description | | Function | Description |
|----------|-------------| | -------- | ----------- |
| `get-from-cache` | Get extension from cache | | `get-from-cache` | Get extension from cache |
| `save-oci-to-cache` | Save OCI artifact to cache | | `save-oci-to-cache` | Save OCI artifact to cache |
| `save-gitea-to-cache` | Save Gitea artifact to cache | | `save-gitea-to-cache` | Save Gitea artifact to cache |
@ -343,13 +343,13 @@ extension:
### Loader (loader_oci.nu) ### Loader (loader_oci.nu)
| Function | Description | | Function | Description |
|----------|-------------| | -------- | ----------- |
| `load-extension` | Load extension from any source | | `load-extension` | Load extension from any source |
### Version Resolution (versions.nu) ### Version Resolution (versions.nu)
| Function | Description | | Function | Description |
|----------|-------------| | -------- | ----------- |
| `resolve-version` | Resolve version from spec | | `resolve-version` | Resolve version from spec |
| `resolve-oci-version` | Resolve from OCI tags | | `resolve-oci-version` | Resolve from OCI tags |
| `is-semver` | Check if valid semver | | `is-semver` | Check if valid semver |
@ -361,7 +361,7 @@ extension:
### Discovery (discovery.nu) ### Discovery (discovery.nu)
| Function | Description | | Function | Description |
|----------|-------------| | -------- | ----------- |
| `discover-oci-extensions` | Discover OCI extensions | | `discover-oci-extensions` | Discover OCI extensions |
| `discover-local-extensions` | Discover local extensions | | `discover-local-extensions` | Discover local extensions |
| `discover-all-extensions` | Discover from all sources | | `discover-all-extensions` | Discover from all sources |
@ -389,7 +389,7 @@ nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_oci_client.nu
nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_cache.nu nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_cache.nu
nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_versions.nu nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_versions.nu
nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_discovery.nu nu provisioning/core/nulib/lib_provisioning/extensions/tests/test_discovery.nu
```plaintext ```
## Integration Examples ## Integration Examples
@ -405,7 +405,7 @@ if $result.success {
} else { } else {
print $"Failed: ($result.error)" print $"Failed: ($result.error)"
} }
```plaintext ```
### Example 2: Discover and Cache All Extensions ### Example 2: Discover and Cache All Extensions
@ -419,7 +419,7 @@ for ext in $extensions {
print $"Caching ($ext.name):($ext.latest)..." print $"Caching ($ext.name):($ext.latest)..."
load-extension $ext.type $ext.name $ext.latest load-extension $ext.type $ext.name $ext.latest
} }
```plaintext ```
### Example 3: Version Resolution ### Example 3: Version Resolution
@ -428,7 +428,7 @@ use lib_provisioning/extensions/versions.nu resolve-oci-version
let version = (resolve-oci-version "taskserv" "kubernetes" "^1.28.0") let version = (resolve-oci-version "taskserv" "kubernetes" "^1.28.0")
print $"Resolved to: ($version)" print $"Resolved to: ($version)"
```plaintext ```
## Troubleshooting ## Troubleshooting
@ -443,7 +443,7 @@ provisioning env | grep OCI
# Verify registry is running # Verify registry is running
curl http://localhost:5000/v2/ curl http://localhost:5000/v2/
```plaintext ```
### Extension Not Found ### Extension Not Found
@ -457,7 +457,7 @@ provisioning ext list --source local
# Discover with refresh # Discover with refresh
provisioning ext discover --refresh provisioning ext discover --refresh
```plaintext ```
### Cache Issues ### Cache Issues
@ -470,7 +470,7 @@ provisioning ext cache clear --all
# Prune old entries # Prune old entries
provisioning ext cache prune --days 7 provisioning ext cache prune --days 7
```plaintext ```
### Version Resolution Issues ### Version Resolution Issues
@ -483,7 +483,7 @@ provisioning ext load <name> --version 1.2.3
# Force reload # Force reload
provisioning ext load <name> --force provisioning ext load <name> --force
```plaintext ```
## Performance Considerations ## Performance Considerations

View File

@ -18,14 +18,14 @@ provisioning taskserv create kubernetes --check
# Sandbox testing # Sandbox testing
provisioning taskserv test kubernetes --runtime docker provisioning taskserv test kubernetes --runtime docker
```plaintext ```
--- ---
## Available Commands ## Available Commands
| Command | Description | | Command | Description |
|---------|-------------| | ------- | ----------- |
| `taskserv validate <name>` | Multi-level validation (Nickel, templates, scripts, dependencies) | | `taskserv validate <name>` | Multi-level validation (Nickel, templates, scripts, dependencies) |
| `taskserv check-deps <name>` | Check dependencies against infrastructure | | `taskserv check-deps <name>` | Check dependencies against infrastructure |
| `taskserv create <name> --check` | Dry-run with preview (no actual deployment) | | `taskserv create <name> --check` | Dry-run with preview (no actual deployment) |
@ -86,14 +86,14 @@ provisioning taskserv test kubernetes --runtime docker
# 5. Deploy (after all checks pass) # 5. Deploy (after all checks pass)
provisioning taskserv create kubernetes provisioning taskserv create kubernetes
```plaintext ```
### Quick Validation ### Quick Validation
```bash ```bash
# All validations in one command # All validations in one command
provisioning taskserv validate kubernetes --level all -v provisioning taskserv validate kubernetes --level all -v
```plaintext ```
### CI/CD Integration ### CI/CD Integration
@ -113,7 +113,7 @@ deploy:
- provisioning taskserv create kubernetes - provisioning taskserv create kubernetes
only: only:
- main - main
```plaintext ```
--- ---
@ -134,7 +134,7 @@ taskservs/
├── utils.nu # Utilities ├── utils.nu # Utilities
├── ops.nu # Operations ├── ops.nu # Operations
└── mod.nu # Module exports └── mod.nu # Module exports
```plaintext ```
--- ---
@ -211,7 +211,7 @@ nickel run extensions/taskservs/<name>/nickel/dependencies.ncl
# Run with verbose output # Run with verbose output
provisioning taskserv validate <name> -v provisioning taskserv validate <name> -v
```plaintext ```
### Sandbox Testing Issues ### Sandbox Testing Issues
@ -224,7 +224,7 @@ provisioning taskserv test <name> --keep
# Connect to container # Connect to container
docker exec -it taskserv-test-<name> bash docker exec -it taskserv-test-<name> bash
```plaintext ```
### shellcheck not found ### shellcheck not found
@ -234,7 +234,7 @@ brew install shellcheck
# Ubuntu/Debian # Ubuntu/Debian
apt install shellcheck apt install shellcheck
```plaintext ```
--- ---
@ -253,7 +253,7 @@ When adding new validation checks:
## Version History ## Version History
| Version | Date | Changes | | Version | Date | Changes |
|---------|------|---------| | ------- | ---- | ------- |
| 1.0.0 | 2025-10-06 | Initial validation and testing system | | 1.0.0 | 2025-10-06 | Initial validation and testing system |
--- ---

View File

@ -65,7 +65,7 @@ GET /test/environments/{id}
POST /test/environments/{id}/run POST /test/environments/{id}/run
DELETE /test/environments/{id} DELETE /test/environments/{id}
GET /test/environments/{id}/logs GET /test/environments/{id}/logs
```plaintext ```
### Nushell Integration ### Nushell Integration
@ -117,31 +117,31 @@ Templates included:
```bash ```bash
provisioning test quick kubernetes provisioning test quick kubernetes
```plaintext ```
### 2. Single Taskserv ### 2. Single Taskserv
```bash ```bash
provisioning test env single postgres --auto-start --auto-cleanup provisioning test env single postgres --auto-start --auto-cleanup
```plaintext ```
### 3. Server Simulation ### 3. Server Simulation
```bash ```bash
provisioning test env server web-01 [containerd kubernetes cilium] --auto-start provisioning test env server web-01 [containerd kubernetes cilium] --auto-start
```plaintext ```
### 4. Cluster from Template ### 4. Cluster from Template
```bash ```bash
provisioning test topology load kubernetes_3node | test env cluster kubernetes --auto-start provisioning test topology load kubernetes_3node | test env cluster kubernetes --auto-start
```plaintext ```
### 5. Custom Resources ### 5. Custom Resources
```bash ```bash
provisioning test env single redis --cpu 4000 --memory 8192 provisioning test env single redis --cpu 4000 --memory 8192
```plaintext ```
### 6. List & Manage ### 6. List & Manage
@ -157,7 +157,7 @@ provisioning test env logs <env-id>
# Cleanup # Cleanup
provisioning test env cleanup <env-id> provisioning test env cleanup <env-id>
```plaintext ```
--- ---
@ -181,7 +181,7 @@ Isolated Containers with:
• Resource limits • Resource limits
• Volume mounts • Volume mounts
• Multi-node support • Multi-node support
```plaintext ```
--- ---
@ -251,7 +251,7 @@ provisioning/platform/orchestrator/src/
├── test_environment.rs (280 lines) ├── test_environment.rs (280 lines)
├── container_manager.rs (350 lines) ├── container_manager.rs (350 lines)
└── test_orchestrator.rs (320 lines) └── test_orchestrator.rs (320 lines)
```plaintext ```
### New Files (Nushell) ### New Files (Nushell)
@ -259,14 +259,14 @@ provisioning/platform/orchestrator/src/
provisioning/core/nulib/ provisioning/core/nulib/
├── test_environments.nu (250 lines) ├── test_environments.nu (250 lines)
└── test/mod.nu (80 lines) └── test/mod.nu (80 lines)
```plaintext ```
### New Files (Config) ### New Files (Config)
```plaintext ```plaintext
provisioning/config/ provisioning/config/
└── test-topologies.toml (150 lines) └── test-topologies.toml (150 lines)
```plaintext ```
### New Files (Docs) ### New Files (Docs)
@ -274,7 +274,7 @@ provisioning/config/
docs/user/ docs/user/
├── test-environment-guide.md (500 lines) ├── test-environment-guide.md (500 lines)
└── test_environments_summary.md (this file) └── test_environments_summary.md (this file)
```plaintext ```
### Modified Files ### Modified Files
@ -286,7 +286,7 @@ provisioning/platform/orchestrator/
provisioning/core/nulib/main_provisioning/ provisioning/core/nulib/main_provisioning/
└── dispatcher.nu (added test handler) └── dispatcher.nu (added test handler)
```plaintext ```
--- ---
@ -319,7 +319,7 @@ test-infrastructure:
- provisioning test quick kubernetes - provisioning test quick kubernetes
- provisioning test quick postgres - provisioning test quick postgres
- provisioning test quick redis - provisioning test quick redis
```plaintext ```
--- ---

View File

@ -24,7 +24,7 @@ This test suite validates:
| `../lib_provisioning/plugins/kms_test.nu` | KMS plugin | 250 | 11 | | `../lib_provisioning/plugins/kms_test.nu` | KMS plugin | 250 | 11 |
| `../lib_provisioning/plugins/orchestrator_test.nu` | Orchestrator plugin | 200 | 12 | | `../lib_provisioning/plugins/orchestrator_test.nu` | Orchestrator plugin | 200 | 12 |
| `test_plugin_integration.nu` | Complete integration tests | 400 | 7 workflows | | `test_plugin_integration.nu` | Complete integration tests | 400 | 7 workflows |
| `run_plugin_tests.nu` | Test runner and reporter | 300 | - | | `run_plugin_tests.nu` | Test runner and reporter | 300 | ---- |
**Total**: 1,350 lines, 39+ individual tests **Total**: 1,350 lines, 39+ individual tests
@ -48,7 +48,7 @@ nu ../lib_provisioning/plugins/auth_test.nu
nu ../lib_provisioning/plugins/kms_test.nu nu ../lib_provisioning/plugins/kms_test.nu
nu ../lib_provisioning/plugins/orchestrator_test.nu nu ../lib_provisioning/plugins/orchestrator_test.nu
nu test_plugin_integration.nu nu test_plugin_integration.nu
```plaintext ```
### Test Options ### Test Options
@ -61,7 +61,7 @@ nu run_plugin_tests.nu --verbose
# Skip integration tests (faster) # Skip integration tests (faster)
nu run_plugin_tests.nu --skip-integration nu run_plugin_tests.nu --skip-integration
```plaintext ```
### CI/CD Integration ### CI/CD Integration
@ -79,7 +79,7 @@ test:plugins:
when: always when: always
paths: paths:
- plugin-test-report.json - plugin-test-report.json
```plaintext ```
## Test Coverage ## Test Coverage
@ -263,7 +263,7 @@ Expected Performance:
================================================================== ==================================================================
✅ All plugin integration tests completed successfully! ✅ All plugin integration tests completed successfully!
================================================================== ==================================================================
```plaintext ```
### Fallback Mode (No Plugins) ### Fallback Mode (No Plugins)
@ -330,7 +330,7 @@ Expected Performance:
================================================================== ==================================================================
✅ All plugin integration tests completed successfully! ✅ All plugin integration tests completed successfully!
================================================================== ==================================================================
```plaintext ```
## Test Report Format ## Test Report Format
@ -368,7 +368,7 @@ Expected Performance:
"arch": "aarch64" "arch": "aarch64"
} }
} }
```plaintext ```
## Troubleshooting ## Troubleshooting
@ -380,7 +380,7 @@ Expected Performance:
```bash ```bash
brew install nushell # macOS brew install nushell # macOS
cargo install nu # Any platform cargo install nu # Any platform
```plaintext ```
### Plugin Tests Show Warnings ### Plugin Tests Show Warnings
@ -395,7 +395,7 @@ cargo install nu # Any platform
```bash ```bash
cd provisioning/platform/orchestrator cd provisioning/platform/orchestrator
cargo run --release cargo run --release
```plaintext ```
### KMS Backend Errors ### KMS Backend Errors
@ -432,14 +432,14 @@ export def test_new_feature [] {
print " ⚠️ Feature not available" print " ⚠️ Feature not available"
} }
} }
```plaintext ```
## Performance Baselines ## Performance Baselines
### Plugin Mode ### Plugin Mode
| Operation | Target | Excellent | Good | Acceptable | | Operation | Target | Excellent | Good | Acceptable |
|-----------|--------|-----------|------|------------| | --------- | ------ | --------- | ---- | ---------- |
| Auth verify | <10ms | <20ms | <50ms | <100ms | | Auth verify | <10ms | <20ms | <50ms | <100ms |
| KMS encrypt | <20ms | <40ms | <80ms | <150ms | | KMS encrypt | <20ms | <40ms | <80ms | <150ms |
| Orch status | <5ms | <10ms | <30ms | <80ms | | Orch status | <5ms | <10ms | <30ms | <80ms |
@ -447,7 +447,7 @@ export def test_new_feature [] {
### HTTP Fallback Mode ### HTTP Fallback Mode
| Operation | Target | Excellent | Good | Acceptable | | Operation | Target | Excellent | Good | Acceptable |
|-----------|--------|-----------|------|------------| | --------- | ------ | --------- | ---- | ---------- |
| Auth verify | <50ms | <100ms | <200ms | <500ms | | Auth verify | <50ms | <100ms | <200ms | <500ms |
| KMS encrypt | <80ms | <150ms | <300ms | <800ms | | KMS encrypt | <80ms | <150ms | <300ms | <800ms |
| Orch status | <30ms | <80ms | <150ms | <400ms | | Orch status | <30ms | <80ms | <150ms | <400ms |
@ -481,7 +481,7 @@ Add to README:
```markdown ```markdown
[![Plugin Tests](https://github.com/org/repo/workflows/Plugin%20Integration%20Tests/badge.svg)](https://github.com/org/repo/actions) [![Plugin Tests](https://github.com/org/repo/workflows/Plugin%20Integration%20Tests/badge.svg)](https://github.com/org/repo/actions)
```plaintext ```
## Maintenance ## Maintenance

View File

@ -23,7 +23,7 @@ provisioning/core/services/kms/
├── config.local.example.toml # Local encryption examples ├── config.local.example.toml # Local encryption examples
├── lib.nu # KMS library functions (existing) ├── lib.nu # KMS library functions (existing)
└── README.md # This file └── README.md # This file
```plaintext ```
## Configuration Files ## Configuration Files
@ -63,7 +63,7 @@ All paths support interpolation variables for flexibility and portability:
### Available Interpolation Variables ### Available Interpolation Variables
| Variable | Description | Example | | Variable | Description | Example |
|----------|-------------|---------| | -------- | ----------- | ------- |
| `{{workspace.path}}` | Current workspace root | `/workspace/my-project` | | `{{workspace.path}}` | Current workspace root | `/workspace/my-project` |
| `{{kms.paths.base}}` | KMS base directory | `{{workspace.path}}/.kms` | | `{{kms.paths.base}}` | KMS base directory | `{{workspace.path}}/.kms` |
| `{{env.HOME}}` | User home directory | `/home/user` | | `{{env.HOME}}` | User home directory | `/home/user` |
@ -90,7 +90,7 @@ token_path = "{{env.HOME}}/.config/provisioning/kms-token"
# Environment variable paths # Environment variable paths
[kms.local.vault] [kms.local.vault]
token_path = "{{env.VAULT_TOKEN_PATH}}" token_path = "{{env.VAULT_TOKEN_PATH}}"
```plaintext ```
## Security Considerations ## Security Considerations
@ -104,7 +104,7 @@ key_permissions = "0600" # Read/write for owner only
[kms.security] [kms.security]
enforce_key_permissions = true # Enforces permission checks enforce_key_permissions = true # Enforces permission checks
```plaintext ```
**Best Practice:** **Best Practice:**
@ -127,7 +127,7 @@ api_key = "vault://kms/api/key"
# ❌ WRONG - Plaintext secret # ❌ WRONG - Plaintext secret
[kms.remote.auth] [kms.remote.auth]
password = "my-secret-password" # NEVER DO THIS! password = "my-secret-password" # NEVER DO THIS!
```plaintext ```
**Supported Secret References:** **Supported Secret References:**
@ -152,7 +152,7 @@ ca_cert_path = "/etc/kms/ca.crt"
method = "mtls" method = "mtls"
client_cert_path = "/etc/kms/client.crt" client_cert_path = "/etc/kms/client.crt"
client_key_path = "/etc/kms/client.key" client_key_path = "/etc/kms/client.key"
```plaintext ```
**Security Rules:** **Security Rules:**
@ -170,7 +170,7 @@ Enable audit logging for production environments:
audit_log_enabled = true audit_log_enabled = true
audit_log_path = "{{kms.paths.base}}/audit.log" audit_log_path = "{{kms.paths.base}}/audit.log"
audit_log_format = "json" audit_log_format = "json"
```plaintext ```
**Logged Operations:** **Logged Operations:**
@ -187,7 +187,7 @@ audit_log_format = "json"
[kms.operations] [kms.operations]
debug = false # Debug exposes sensitive data in logs! debug = false # Debug exposes sensitive data in logs!
verbose = false verbose = false
```plaintext ```
Debug mode includes: Debug mode includes:
@ -210,7 +210,7 @@ secret_patterns = [
"(?i)api[_-]?key\\s*=\\s*['\"]?[^'\"\\s]+", "(?i)api[_-]?key\\s*=\\s*['\"]?[^'\"\\s]+",
"(?i)token\\s*=\\s*['\"]?[^'\"\\s]+", "(?i)token\\s*=\\s*['\"]?[^'\"\\s]+",
] ]
```plaintext ```
### 7. Key Backup and Rotation ### 7. Key Backup and Rotation
@ -223,7 +223,7 @@ rotation_days = 90 # Rotate every 90 days
backup_enabled = true backup_enabled = true
backup_path = "{{kms.paths.base}}/backups" backup_path = "{{kms.paths.base}}/backups"
backup_retention_count = 5 # Keep last 5 backups backup_retention_count = 5 # Keep last 5 backups
```plaintext ```
**Backup Best Practices:** **Backup Best Practices:**
@ -283,7 +283,7 @@ let kms_config = (get-kms-config-full)
# Get local key path with interpolation resolved # Get local key path with interpolation resolved
let key_path = (get-kms-local-key-path) let key_path = (get-kms-local-key-path)
```plaintext ```
## Operational Modes ## Operational Modes
@ -315,7 +315,7 @@ mode = "local"
enabled = true enabled = true
provider = "age" provider = "age"
key_path = "{{kms.paths.keys_dir}}/age.txt" key_path = "{{kms.paths.keys_dir}}/age.txt"
```plaintext ```
### 2. Remote Mode ### 2. Remote Mode
@ -350,7 +350,7 @@ endpoint = "https://kms.production.example.com"
method = "mtls" method = "mtls"
client_cert_path = "/etc/kms/client.crt" client_cert_path = "/etc/kms/client.crt"
client_key_path = "/etc/kms/client.key" client_key_path = "/etc/kms/client.key"
```plaintext ```
### 3. Hybrid Mode ### 3. Hybrid Mode
@ -382,7 +382,7 @@ endpoint = "https://kms.example.com"
enabled = true enabled = true
fallback_to_local = true fallback_to_local = true
sync_keys = false sync_keys = false
```plaintext ```
## Authentication Methods ## Authentication Methods
@ -394,7 +394,7 @@ method = "token"
token_path = "{{kms.paths.config_dir}}/token" token_path = "{{kms.paths.config_dir}}/token"
refresh_token = true refresh_token = true
token_expiry_seconds = 3600 token_expiry_seconds = 3600
```plaintext ```
### mTLS (Mutual TLS) ### mTLS (Mutual TLS)
@ -406,7 +406,7 @@ client_key_path = "/etc/kms/client.key"
[kms.remote.tls] [kms.remote.tls]
ca_cert_path = "/etc/kms/ca.crt" ca_cert_path = "/etc/kms/ca.crt"
```plaintext ```
### API Key ### API Key
@ -414,7 +414,7 @@ ca_cert_path = "/etc/kms/ca.crt"
[kms.remote.auth] [kms.remote.auth]
method = "api_key" method = "api_key"
api_key = "sops://kms/api_key" # Secret reference! api_key = "sops://kms/api_key" # Secret reference!
```plaintext ```
### Basic Authentication ### Basic Authentication
@ -423,7 +423,7 @@ api_key = "sops://kms/api_key" # Secret reference!
method = "basic" method = "basic"
username = "provisioning" username = "provisioning"
password_secret = "vault://kms/password" # Secret reference! password_secret = "vault://kms/password" # Secret reference!
```plaintext ```
### IAM (AWS) ### IAM (AWS)
@ -431,7 +431,7 @@ password_secret = "vault://kms/password" # Secret reference!
[kms.remote.auth] [kms.remote.auth]
method = "iam" method = "iam"
iam_role_arn = "arn:aws:iam::123456789012:role/kms-role" iam_role_arn = "arn:aws:iam::123456789012:role/kms-role"
```plaintext ```
## Integration with Existing KMS Library ## Integration with Existing KMS Library
@ -445,7 +445,7 @@ def get_kms_config [] {
let server_url = (get-kms-server) let server_url = (get-kms-server)
# ... # ...
} }
```plaintext ```
### Updated Implementation ### Updated Implementation
@ -474,7 +474,7 @@ def get_kms_config [] {
} }
} }
} }
```plaintext ```
## Validation ## Validation
@ -513,7 +513,7 @@ Configuration is validated against the schema:
```bash ```bash
export PROVISIONING_KMS_SERVER="https://kms.example.com" export PROVISIONING_KMS_SERVER="https://kms.example.com"
export PROVISIONING_KMS_AUTH="certificate" export PROVISIONING_KMS_AUTH="certificate"
```plaintext ```
**After (Config-based):** **After (Config-based):**
@ -523,7 +523,7 @@ endpoint = "https://kms.example.com"
[kms.remote.auth] [kms.remote.auth]
method = "mtls" method = "mtls"
```plaintext ```
### From SOPS to KMS Config ### From SOPS to KMS Config
@ -536,7 +536,7 @@ sops_config = "{{workspace.path}}/.sops.yaml"
[kms.local.sops] [kms.local.sops]
age_recipients = ["age1xxx...", "age1yyy..."] age_recipients = ["age1xxx...", "age1yyy..."]
```plaintext ```
## Best Practices ## Best Practices
@ -557,7 +557,7 @@ debug = false # Never true, even in dev!
[kms.policies] [kms.policies]
backup_enabled = false backup_enabled = false
audit_log_enabled = false audit_log_enabled = false
```plaintext ```
### 2. Production Environment ### 2. Production Environment
@ -592,7 +592,7 @@ disallow_plaintext_secrets = true
[kms.operations] [kms.operations]
verbose = false verbose = false
debug = false debug = false
```plaintext ```
### 3. Hybrid/HA Environment ### 3. Hybrid/HA Environment
@ -612,7 +612,7 @@ endpoint = "https://kms.example.com"
enabled = true enabled = true
fallback_to_local = true fallback_to_local = true
sync_keys = false sync_keys = false
```plaintext ```
## Troubleshooting ## Troubleshooting
@ -622,13 +622,13 @@ sync_keys = false
```plaintext ```plaintext
Permission denied: /path/to/age.txt Permission denied: /path/to/age.txt
```plaintext ```
**Solution:** **Solution:**
```bash ```bash
chmod 0600 /path/to/age.txt chmod 0600 /path/to/age.txt
```plaintext ```
Or update config: Or update config:
@ -638,7 +638,7 @@ key_permissions = "0600"
[kms.security] [kms.security]
enforce_key_permissions = true enforce_key_permissions = true
```plaintext ```
### Issue: Remote KMS Connection Failed ### Issue: Remote KMS Connection Failed
@ -646,7 +646,7 @@ enforce_key_permissions = true
```plaintext ```plaintext
Connection timeout: https://kms.example.com Connection timeout: https://kms.example.com
```plaintext ```
**Solutions:** **Solutions:**
@ -666,7 +666,7 @@ Connection timeout: https://kms.example.com
```plaintext ```plaintext
Secret not found: sops://kms/password Secret not found: sops://kms/password
```plaintext ```
**Solution:** **Solution:**
@ -677,7 +677,7 @@ Secret not found: sops://kms/password
## Version Compatibility ## Version Compatibility
| KMS Config Version | Nushell Version | Nickel Version | Notes | | KMS Config Version | Nushell Version | Nickel Version | Notes |
|-------------------|-----------------|-------------|-------| | ------------------ | --------------- | -------------- | ----- |
| 1.0.0 | 0.107.1+ | 0.11.3+ | Initial release | | 1.0.0 | 0.107.1+ | 0.11.3+ | Initial release |
## Related Documentation ## Related Documentation

View File

@ -21,33 +21,43 @@ def run-interactive-form [] {
**Bash wrappers** handle TTY input, then pass results to Nushell via files: **Bash wrappers** handle TTY input, then pass results to Nushell via files:
```text ```text
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────
────────────┐
│ User runs Nushell script │ │ User runs Nushell script │
└─────────────────┬───────────────────────────────────────────┘ └─────────────────┬───────────────────────────────
────────────┘
v v
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────
────────────┐
│ Nushell calls bash wrapper (shlib/*-tty.sh) │ │ Nushell calls bash wrapper (shlib/*-tty.sh) │
└─────────────────┬───────────────────────────────────────────┘ └─────────────────┬───────────────────────────────
────────────┘
v v
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────
────────────┐
│ Bash wrapper handles TTY input (TypeDialog, prompts, etc) │ │ Bash wrapper handles TTY input (TypeDialog, prompts, etc) │
│ - Proper TTY file descriptor handling │ │ - Proper TTY file descriptor handling │
│ - Interactive input works correctly │ │ - Interactive input works correctly │
└─────────────────┬───────────────────────────────────────────┘ └─────────────────┬───────────────────────────────
────────────┘
v v
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────
────────────┐
│ Wrapper writes output to JSON file │ │ Wrapper writes output to JSON file │
└─────────────────┬───────────────────────────────────────────┘ └─────────────────┬───────────────────────────────
────────────┘
v v
┌─────────────────────────────────────────────────────────────┐ ┌─────────────────────────────────────────────────
────────────┐
│ Nushell reads JSON file (no TTY issues) │ │ Nushell reads JSON file (no TTY issues) │
│ - File-based IPC is reliable │ │ - File-based IPC is reliable │
│ - No input stack problems │ │ - No input stack problems │
└─────────────────────────────────────────────────────────────┘ └─────────────────────────────────────────────────
────────────┘
``` ```
## Naming Convention ## Naming Convention