TypeDialog/docs/project-definition.md

513 lines
17 KiB
Markdown
Raw Normal View History

2025-12-18 01:10:29 +00:00
# Project Definition - typedialog
**Version**: 0.1.0
**Date**: 2025-12-17
**Status**: Production-ready, pre-publicación
---
## Resumen Ejecutivo
**Nombre Actual**: typedialog v0.1.0
**Categoría**: Interactive Configuration Management System
**Estado**: Production-ready, pre-publicación
**Arquitectura**: Multi-backend Rust workspace (4 crates)
**Propósito Central**: Facilitar la gestión de configuración para aplicaciones, proyectos y scripts mediante inputs interactivos (prompts individuales o forms completos), con integración bidireccional a Nickel para settings tipados y validados.
**Diferenciador Único**: Único sistema en el mercado que integra Nickel schemas → Interactive collection → Multi-format output (YAML/JSON/TOML) con preservación de type contracts.
---
## 1. Identidad del Proyecto
### 1.1 Estado Actual
- **Nombre**: typedialog
- **Origen**: Extraído de `nu_plugin_inquire` (plugin de Nushell)
- **Etimología**: "form" + "inquire" (referencia al crate `inquire`)
- **Versión**: 0.1.0
- **Madurez**: Production-ready, 80+ tests passing, documentación completa
- **Publicación**: No publicado en crates.io aún
### 1.2 Evolución Histórica
```
nu_plugin_inquire (Nushell plugin)
typedialog (standalone library extraction)
+ CLI backend (inquire-based)
+ Nickel integration (bidirectional)
+ TUI backend (ratatui)
+ Web backend (axum + HTMX)
Current: Multi-backend configuration management system
```
**Puntos de Inflexión**:
1. Separación de Nushell → biblioteca standalone
2. Adición Nickel integration → type-safe configuration focus
3. Múltiples backends → multi-context positioning
### 1.3 Descripción Técnica Precisa
**Definición Formal**: Sistema de gestión de configuración interactiva que facilita la recolección, validación y transformación de settings mediante diálogo con el usuario, actuando como puente entre Nickel schemas tipados y formatos de configuración estándar (YAML/JSON/TOML), soportando múltiples interfaces (CLI/TUI/Web) para adaptarse a diferentes contextos de uso.
**Componentes Core**:
- Form/Prompt engine con 8 tipos de inputs
- Nickel parser y code generator (bidirectional)
- Backend abstraction layer (trait-based)
- Template engine (Tera para metaprogramming)
- i18n system (Fluent con en-US, es-ES)
- Multi-format serialization (JSON/YAML/TOML/Nickel)
---
## 2. Propósito y Problema que Resuelve
### 2.1 Problema Space Completo
**Problema Principal**: La configuración de aplicaciones, proyectos y scripts requiere:
1. Recolección interactiva de datos del usuario
2. Validación tipada de inputs
3. Transformación entre formatos (schemas → forms → configs)
4. Adaptación a diferentes contextos (CLI scripts, TUI setup, Web interfaces)
5. Organización con componentes, templates, documentación
**Problemas Secundarios**:
- Herramientas existentes limitadas a un solo backend (CLI-only o Web-only)
- No hay integración con lenguajes de configuración tipados (Nickel, KCL)
- Forms completos ineficientes para capturar un solo valor
- Prompts individuales no escalables para setup complejos
- Falta de preservación de type contracts entre transformaciones
- Configuración manual propensa a errores de tipo
### 2.2 Solución Propuesta
**Enfoque Único**:
```
Nickel Schema (typed, validated, documented)
↓ [nickel-to-form]
TOML Form Definition (declarative, reusable)
↓ [interactive collection]
User Dialog (CLI/TUI/Web según contexto)
↓ [validation + transformation]
Validated Output (JSON/YAML/TOML/Nickel)
↓ [consumption]
Application/Script/System
```
**Flexibilidad Clave**:
- **Single Prompt**: `nickelconf prompt --type password "API Key"` → captura un valor
- **Complete Form**: `nickelconf form setup.toml --backend tui` → multi-field wizard
- **Nickel Workflow**: Schema → Form → Config con type preservation
### 2.3 Casos de Uso Concretos
#### 1. Application Settings
- **User**: Developer configurando nueva app
- **Escenario**: Primera instalación de app Rust, necesita DB credentials, API keys, feature flags
- **Solución**: Nickel schema define settings → TUI form para setup inicial → config.yaml generado
- **Valor**: Type-safety, validación, documentación incluida en schema
#### 2. Script Inputs
- **User**: DevOps engineer escribiendo Nushell script de deploy
- **Escenario**: Script necesita environment, region, instance type
- **Solución**: CLI prompts individuales integrados en script → validated JSON output
- **Valor**: Inputs validados on-the-fly, integración natural con script flow
#### 3. Project Configuration
- **User**: Tech lead inicializando nuevo proyecto
- **Escenario**: Proyecto necesita 20+ settings (CI/CD, testing, deployment, monitoring)
- **Solución**: Nickel schema organizado con components → TUI complete form → project.toml
- **Valor**: Configuración completa guiada, validación, defaults inteligentes
#### 4. Web-Based Setup
- **User**: SaaS admin configurando tenant
- **Escenario**: Configuración de tenant via web interface
- **Solución**: Same TOML form → Web backend → Settings guardados en DB
- **Valor**: Mismo form definition, diferente contexto de uso
#### 5. Infrastructure as Code
- **User**: SRE provisionando recursos cloud
- **Escenario**: Crear configuración Terraform/Nickel para nueva infra
- **Solución**: Interactive prompts → Nickel output con contracts → Terraform consumption
- **Valor**: Type-safe IaC generation, validation antes de apply
---
## 3. Arquitectura y Tecnología
### 3.1 Tech Stack Completo
**Core Language**: Rust 2021, MSRV 1.70+
**Crate Structure** (Workspace):
```
typedialog/
├── crates/
│ ├── typedialog-core/ # Core library + backend trait
│ │ ├── form engine (8 input types)
│ │ ├── FormBackend trait
│ │ ├── Nickel integration modules
│ │ ├── Template engine (Tera)
│ │ ├── i18n system (Fluent)
│ │ └── Serialization (serde ecosystem)
│ ├── typedialog/ # CLI binary
│ │ └── InquireBackend impl
│ ├── typedialog-tui/ # TUI binary
│ │ └── RatatuiBackend impl
│ └── typedialog-web/ # Web server binary
│ └── AxumBackend impl
```
**Dependencies Clave**:
- `inquire` - Terminal prompts (CLI backend)
- `ratatui` + `crossterm` - Terminal UI (TUI backend)
- `axum` + `tower` - Web server (Web backend)
- `serde` ecosystem - Serialization (JSON/YAML/TOML)
- `tera` - Template engine (Jinja2-like)
- `fluent` + `fluent-bundle` - i18n/localization
- `clap` - CLI argument parsing
- `chrono` - Date/time handling
**Backend Pattern** (Trait-based abstraction):
```rust
pub trait FormBackend {
fn execute_field(&mut self, field: &FormField) -> Result<Value>;
fn execute_form_complete(&mut self, form: &Form) -> Result<HashMap<String, Value>>;
}
// Implementations:
impl FormBackend for InquireBackend { ... } // CLI
impl FormBackend for RatatuiBackend { ... } // TUI
impl FormBackend for AxumBackend { ... } // Web
```
### 3.2 Características Técnicas Distintivas
#### 1. Nickel Integration (Bidirectional)
- **nickel-to-form**: Parse Nickel schemas → Extract metadata → Generate TOML forms
- **form-to-nickel**: Convert form results → Generate Nickel code with contracts
- **Contract Preservation**: `std.string.NonEmpty`, `std.number.between` mantenidos
- **Component Support**: Nickel imports, merging, templates soportados
#### 2. Multi-Backend Architecture
- **Same Form Definition**: Un TOML form funciona en CLI, TUI, Web
- **Identical Output**: Todos los backends producen mismo JSON/YAML/TOML
- **Display Modes**: FieldByField (step-by-step) o Complete (all at once)
- **Backend Selection**: `--backend cli|tui|web` en runtime
#### 3. Form Engine Features
- **8 Input Types**: text, confirm, select, multiselect, password, custom, editor, date
- **Conditional Logic**: Fields con `depends_on` para flujo dinámico
- **Validation**: Regex, length, range, custom validators
- **Defaults**: Static, dynamic (desde otras respuestas), computed
- **Grouping**: Semantic grouping para mejor UX
#### 4. i18n System
- **Fluent-based**: `.ftl` files para traducciones
- **Languages**: en-US (default), es-ES
- **Scopes**: Form UI, field labels, validation messages, help text
- **Fallback**: Graceful degradation a inglés
#### 5. Template System
- **Tera Engine**: Jinja2-like syntax para metaprogramming
- **Nickel Templates**: `.ncl.j2` files para código generation
- **Variable Substitution**: Form results inyectados en templates
- **Conditionals/Loops**: Lógica de template para código complejo
### 3.3 Formatos Soportados
**Input Formats**:
- TOML (form definitions)
- Nickel (schemas para form generation)
**Output Formats**:
- JSON (app configs, API consumption)
- YAML (configs, Kubernetes, Ansible)
- TOML (Rust configs, general settings)
- Nickel (type-safe configs con contracts)
- Plain text (simple key=value)
---
## 4. Análisis de Mercado y Posicionamiento
### 4.1 Target Audience Detallado
**Audiencia Primaria**:
1. **Application Developers** (40%)
- Stack: Rust, Go, Python apps
- Need: Settings management con type-safety
- Pain: Manual config files propensa a errores
- Value: Nickel schemas + interactive collection + validated output
2. **Script Creators** (30%)
- Stack: Nushell, Bash, Python scripts
- Need: Interactive inputs para scripts
- Pain: Validación manual, error handling repetitivo
- Value: Validated prompts con minimal code
3. **DevOps/SRE Engineers** (20%)
- Stack: Terraform, Kubernetes, Ansible
- Need: Interactive IaC generation
- Pain: Complex configs, no validation hasta runtime
- Value: Type-safe config generation, Nickel contracts
4. **Project/Team Leads** (10%)
- Stack: Project setup, team onboarding
- Need: Consistent project configuration
- Pain: Manual setup guides, config drift
- Value: Reproducible project setup con forms
**Audiencia Secundaria**:
- CLI tool developers agregando interactive features
- SaaS developers para user onboarding/config
- System administrators para server setup wizards
### 4.2 Competitive Landscape
**Categorías de Competidores**:
1. **Terminal Prompt Libraries**: `inquire`, `dialoguer`, `questionary`
- Gap: Solo prompts, no forms. No type-safety. No multi-backend.
2. **Form Libraries**: HTML forms, `react-hook-form`
- Gap: Web-only. No CLI/TUI. No Nickel integration.
3. **Configuration Management**: Ansible, Terraform
- Gap: IaC-specific. No general-purpose forms. No type preservation.
4. **Schema Languages**: JSON Schema, Nickel, KCL
- Gap: Schema definition only, no interactive collection.
**Competitive Matrix**:
| Feature | typedialog | inquire | HTML forms | Ansible | Nickel |
|---------|-------------|---------|------------|---------|--------|
| Interactive prompts | ✅ | ✅ | ❌ | ⚠️ | ❌ |
| Complete forms | ✅ | ❌ | ✅ | ⚠️ | ❌ |
| Multi-backend | ✅ (3) | ❌ | ❌ | ❌ | ❌ |
| Type-safe schemas | ✅ | ❌ | ❌ | ⚠️ | ✅ |
| Bidirectional schema | ✅ | ❌ | ❌ | ❌ | ❌ |
| Multi-format output | ✅ (4) | ❌ | ⚠️ | ⚠️ | ✅ (1) |
| i18n support | ✅ | ❌ | ⚠️ | ✅ | ❌ |
| Template system | ✅ | ❌ | ❌ | ✅ | ✅ |
| Declarative forms | ✅ | ❌ | ✅ | ⚠️ | N/A |
### 4.3 Value Propositions Completo
**Para Developers**:
- ✅ Type-safe configuration desde día 1 (Nickel schemas)
- ✅ Menos código de validación manual (schemas auto-validan)
- ✅ Documentación incluida en schemas (contratos son docs)
- ✅ Multi-format output (una fuente, múltiples consumidores)
**Para DevOps/SRE**:
- ✅ Interactive IaC generation (menos errores de config)
- ✅ Validación antes de apply (Nickel contracts)
- ✅ Reproducible setup (TOML forms versionables)
- ✅ Script integration (CLI prompts en pipelines)
**Para Organizations**:
- ✅ Consistent configuration (same forms across projects)
- ✅ Reduced onboarding time (guided setup wizards)
- ✅ Auditability (form definitions + results traceable)
- ✅ i18n support (international teams)
**Unique Selling Points**:
1. **Nickel Integration** - Único en mercado
2. **Multi-Backend Flexibility** - Mismo form, diferentes contextos
3. **Forms + Prompts** - No forzado a elegir uno u otro
4. **Type-Safe Pipeline** - Contracts preserved end-to-end
5. **Production-Ready** - i18n, templates, validación, docs
---
## 5. Capacidades y Características
### 5.1 Functional Capabilities
**Input Collection**:
- ✅ 8 tipos de prompts (text, password, select, multiselect, confirm, custom, editor, date)
- ✅ Forms declarativos en TOML
- ✅ Conditional logic (depends_on)
- ✅ Dynamic defaults (computed fields)
- ✅ Validation (regex, range, length, custom)
- ✅ Help text y documentación inline
**Backend Support**:
- ✅ CLI - inquire-based terminal prompts (stdin fallback)
- ✅ TUI - ratatui full-screen interface (3-panel layout, Tab navigation)
- ✅ Web - axum + HTMX browser forms (RESTful API)
- ✅ Display modes: FieldByField, Complete
**Nickel Workflow**:
- ✅ nickel-to-form: Schema → TOML form generation
- ✅ form execution: Interactive collection
- ✅ form-to-nickel: Results → Nickel code generation
- ✅ Contract preservation: Type constraints maintained
- ✅ Component support: Imports, merging, templates
**Output Formats**:
- ✅ JSON (structured data, API consumption)
- ✅ YAML (configs, k8s, ansible)
- ✅ TOML (rust configs, settings)
- ✅ Nickel (type-safe configs)
- ✅ Text (simple key=value)
**i18n & Templates**:
- ✅ Fluent-based localization (en-US, es-ES)
- ✅ Tera template engine
- ✅ Nickel template metaprogramming (.ncl.j2)
- ✅ Variable substitution
- ✅ Conditional rendering
### 5.2 Non-Functional Capabilities
**Performance**:
- Fast compilation (Rust, release build <30s)
- Low memory footprint (CLI <5MB, TUI <10MB)
- Minimal startup time (<100ms)
**Reliability**:
- 80+ passing tests (unit + integration)
- Type-safe Rust (no runtime crashes)
- Graceful error handling
- Fallback behaviors (stdin, default values)
**Usability**:
- Intuitive TOML form syntax
- Clear error messages
- Help text contextual
- i18n for international users
**Maintainability**:
- Modular workspace structure
- Clean trait-based architecture
- Comprehensive documentation
- Example forms included
**Portability**:
- Cross-platform (Linux, macOS, Windows)
- Single binary distribution
- No runtime dependencies
- Docker support
---
## 7. Métricas y Success Criteria
### 7.1 Technical Metrics
**Code Quality**:
- Test coverage > 80%
- Zero clippy warnings (enforce)
- Clean compilation all features
- Documentation coverage > 90%
**Performance**:
- Binary size < 15MB (release)
- Startup time < 100ms
- Memory usage < 20MB (TUI)
- Form rendering < 50ms
### 7.2 Adoption Metrics
**Community**:
- GitHub stars > 100 (first 6 months post-publish)
- crates.io downloads > 1000/month
- Active issues/PRs
- Contributor growth
**Usage**:
- Example forms created by users
- Integration stories shared
- Blog posts/tutorials written
- Conference talks
### 7.3 Quality Metrics
**Reliability**:
- Bug reports < 5/month
- Critical bugs = 0
- Response time < 48h
- Fix time < 7 days (non-critical)
**User Satisfaction**:
- Positive feedback ratio > 80%
- Feature request alignment
- Documentation clarity
- Ease of use reports
---
## 8. Roadmap y Future Considerations
### 8.1 Immediate Focus (v0.1.x)
**Naming Decision**:
- Decide: nickelconf vs nickeltalk vs keep typedialog
- Execute: Rename if chosen
- Update: All documentation and messaging
**Stabilization**:
- Bug fixes from early users
- Documentation improvements
- Example forms expansion
- Performance optimizations
### 8.2 Near-term Enhancements (v0.2.x)
**Nickel Enhancements**:
- Deeper schema introspection
- More contract types supported
- Component template library
- Schema validation improvements
**Backend Improvements**:
- TUI navigation enhancements
- Web backend styling/theming
- CLI colored output options
- Performance optimizations
**New Features**:
- Form composition (reusable sections)
- Field dependencies (advanced logic)
- Custom validators library
- Plugin system for custom fields
### 8.3 Long-term Vision
**Ecosystem**:
- Form marketplace (shared forms)
- IDE integrations (VSCode extension)
- CI/CD integrations
- Cloud service (hosted forms)
**Technology**:
- KCL integration (like Nickel)
- CUE language support
- GraphQL schema support
- Database schema integration
**Beyond Configuration**:
- Survey/questionnaire system
- User onboarding workflows
- Admin panel generation
- API client generation
---
## Conclusión
typedialog es un proyecto maduro y bien posicionado que resuelve un problema real en la gestión de configuración. Su diferenciador único - la integración bidireccional con Nickel combinada con múltiples backends - lo posiciona de manera única en el mercado.
El próximo paso crítico es una decisión de naming estratégica que refuerce esta posición única y comunique claramente el valor propuesto al mercado target.