refactor: consolidate configuration directories

Merge _configs/ into config/ for single configuration directory.
Update all path references.

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

Impact: -1 root directory (layout_conventions.md compliance)
This commit is contained in:
Jesús Pérez 2025-12-26 18:36:23 +00:00
parent c2be11f2ab
commit 9cef9b8d57
765 changed files with 152839 additions and 3 deletions

145
.claude/CODE_STANDARDS.md Normal file
View File

@ -0,0 +1,145 @@
# Code Standards & Verification - syntaxis
## Essential Commands
```bash
# Single command for all checks
just check-all # fmt + lint + check + test
# Individual checks
cargo check --workspace # Verify compilation
cargo test --workspace # Run all tests (632+ tests)
cargo clippy --all-targets # Linting (no warnings)
cargo fmt --all # Format code
cargo audit # Security audit
```
## Pre-Commit Checklist
- [ ] `cargo fmt --all` (formatted)
- [ ] `cargo clippy --all-targets` (no warnings)
- [ ] `cargo test --workspace` (all passing - 632+ tests)
- [ ] `cargo audit` (no vulnerabilities)
- [ ] Rustdoc for all public items
- [ ] No `unsafe` code
- [ ] No `unwrap()` in production
- [ ] 15+ tests per module minimum
## syntaxis Build
```bash
# Development build
cargo build --workspace
# Release build
cargo build --release
# Full test suite (632 tests across 8 crates)
cargo test --workspace --lib
# Specific crate testing
cargo test -p syntaxis-core
cargo test -p syntaxis-dashboard
cargo test -p syntaxis-cli
cargo test -p syntaxis-tui
```
## Project Structure
| Component | Path | Tests | Status |
|-----------|------|-------|--------|
| **syntaxis-core** | `core/crates/syntaxis-core/` | 173 | ✅ |
| **syntaxis-tui** | `core/crates/syntaxis-tui/` | 10 | ✅ |
| **syntaxis-dashboard** | `core/crates/syntaxis-dashboard/` | 52 | ✅ |
| **syntaxis-cli** | `core/crates/syntaxis-cli/` | 4 | ✅ |
| **syntaxis-api** | `core/crates/syntaxis-api/` | - | 🟡 Excluded* |
| **syntaxis-vapora** | `core/crates/syntaxis-vapora/` | - | 🟡 Excluded* |
| **shared-api-lib** | `shared/rust-api/shared-api-lib/` | 93 | ✅ |
| **shared/rust** | `shared/rust/` | 33 | ✅ |
| **shared/rust-tui** | `shared/rust-tui/` | 262 | ✅ |
*Excluded from workspace members due to ongoing handler/adapter development
## Testing Standards
### Unit Tests
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_behavior() {
assert_eq!(function(), expected);
}
}
```
### Integration Tests
Place in `tests/` directory - test complete workflows with public APIs.
### Running Tests
```bash
cargo test --workspace --lib # All library tests
cargo test --workspace # All tests including integration
RUST_LOG=debug cargo test -- --nocapture
cargo test -- --test-threads=1 # Serial execution
```
## Code Quality Metrics
| Metric | Standard | syntaxis |
|--------|----------|---------------------|
| **Tests passing** | 100% | ✅ 632/632 |
| **Code coverage** | 80% minimum | ✅ High |
| **Documentation** | 100% public items | ✅ Complete |
| **Unsafe code** | Zero | ✅ None |
| **Compilation** | No errors | ✅ 6/8 crates* |
## Rust Guidelines
**No unsafe code** - `#![forbid(unsafe_code)]`
**No unwrap()** - Use `Result<T>` with `?`
**Type safety** - Leverage type system, avoid `as` casts
**Error handling** - `thiserror` for all error types
**Documentation** - Rustdoc + examples + doc tests
**Performance** - Benchmarks for critical paths
**Security** - No hardcoded secrets, validate input
## Justfile Recipes
```bash
just fmt # cargo fmt
just lint # cargo clippy
just check # cargo check
just test # cargo test
just build # cargo build
just build-release # cargo build --release
just test-all # Full suite
just check-all # fmt + lint + check + test
just doc # Generate docs
just clean # Clean artifacts
```
## Troubleshooting
```bash
# Compilation errors
cargo clean && cargo check --workspace
# Test failures
RUST_LOG=debug cargo test -- --nocapture
cargo test -- --test-threads=1 # Serial
# Database issues
rm -f data/*.db # Reset SQLite
cargo test --workspace # Recreates
# Performance
cargo flamegraph # Profile
cargo bench # Benchmarks
```
## For Details
- [PROJECT_RULES.md](./.claude/PROJECT_RULES.md) - Code standards explained
- [DEVELOPMENT.md](./.claude/DEVELOPMENT.md) - Workflow & patterns

1
.claude/DEPENDENCIES.md Symbolic link
View File

@ -0,0 +1 @@
../DEPENDENCIES.md

256
.claude/DEVELOPMENT.md Normal file
View File

@ -0,0 +1,256 @@
# Development Workflow - syntaxis
## Feature Implementation Checklist
1. Update todo: `/add-todo "Feature: description"`
2. Write failing test first (TDD)
3. Implement feature (idiomatic Rust)
4. Run: `cargo test --workspace`
5. Run: `cargo clippy --all-targets`
6. Run: `cargo fmt --all`
7. Update docs & rustdoc
8. All tests passing (632+ tests)
## Common Patterns
### Error Handling
```rust
use thiserror::Error;
#[derive(Error, Debug)]
pub enum WorkspaceError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Database error: {0}")]
Database(String),
}
pub fn operation() -> Result<String> {
let data = std::fs::read_to_string("file.txt")?;
Ok(data)
}
```
### Unit Tests
```rust
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_behavior() {
assert_eq!(function(), expected);
}
}
```
### Integration Tests
Place in `tests/` directory - test complete workflows with public APIs.
## Logging
```bash
RUST_LOG=debug cargo run # Debug mode
RUST_LOG=syntaxis-core=trace cargo test # Specific module
RUST_LOG=info,syntaxis-cli=debug cargo run
```
```rust
use tracing::{debug, info, warn, error};
info!("Operation started: {}", name);
debug!("Processing: {:?}", item);
warn!("Unexpected state: {}", reason);
error!("Operation failed: {}", error);
```
## Benchmarking
```bash
cargo bench # All benchmarks
cargo bench -p syntaxis-core # Specific crate
cargo bench -- --verbose # Detailed output
```
## Documentation
### Public API
```rust
/// Computes the factorial of a number
///
/// # Arguments
/// * `n` - A non-negative integer
///
/// # Returns
/// The factorial of n
///
/// # Examples
/// ```
/// assert_eq!(factorial(5), 120);
/// ```
pub fn factorial(n: u32) -> u32 {
match n {
0 | 1 => 1,
_ => n * factorial(n - 1),
}
}
```
### Generate Docs
```bash
cargo doc --no-deps --open
```
### Module Documentation
```rust
//! # syntaxis-core
//!
//! Core library for syntaxis project management.
//!
//! ## Features
//!
//! - Syntaxis management
//! - Task definition and tracking
//! - Phase-based orchestration
```
## Version Control
### Branch Naming
- `feature/name` - New features
- `fix/issue` - Bug fixes
- `refactor/scope` - Refactoring
- `docs/description` - Documentation
- `test/description` - Tests
### Commit Format
```
feat: Add authentication system
fix: Resolve memory leak
refactor: Simplify error handling
docs: Update API docs
test: Add edge case tests
```
### Important
- NO force push to main/master
- NO skip hooks (--no-verify)
- NO git commands unless requested
- Don't ask "ready to commit?" - proceed when guidelines met
## TDD: Red-Green-Refactor
1. **Red**: Write failing test
2. **Green**: Minimal implementation
3. **Refactor**: Improve implementation
## Deployment
### Local Development
```bash
cd /Users/Akasha/Development/syntaxis
cargo check --workspace
cargo test --workspace
just fmt && just lint
```
### Building Binaries
```bash
# Development
cargo build
# Production
cargo build --release
# Specific binaries
cargo build --release -p syntaxis-cli
cargo build --release -p syntaxis-tui
cargo build --release -p syntaxis-dashboard
```
### Docker
```bash
docker-compose up -d
docker-compose logs -f
docker-compose down
```
### VAPORA Integration
syntaxis is designed to integrate with VAPORA:
```bash
# Once VAPORA integration is complete
syntaxis-vapora run --config vapora.toml
```
## Quick Commands
| Command | Purpose |
|---------|---------|
| `cargo check --workspace` | Verify compilation |
| `cargo test --workspace` | Run all tests (632+) |
| `cargo clippy --all-targets` | Linting |
| `cargo fmt --all` | Format code |
| `cargo build --release` | Production build |
| `cargo doc --no-deps --open` | Generate docs |
| `RUST_LOG=debug cargo run` | Debug logging |
| `cargo bench` | Benchmarks |
| `just check-all` | fmt + lint + check + test |
## Multi-Interface Development
### CLI Development (`workspace`)
```bash
cargo build -p syntaxis-cli
./target/debug/workspace --help
./target/debug/workspace project list
```
### TUI Development (`syntaxis-tui`)
```bash
cargo build -p syntaxis-tui
./target/debug/syntaxis-tui
```
### Dashboard Development (`syntaxis-dashboard`)
```bash
cargo build -p syntaxis-dashboard
# Web interface runs on http://localhost:3000
```
### REST API Development (`syntaxis-api`)
```bash
# Currently excluded - under development
cargo build -p syntaxis-api
# Server runs on http://localhost:8080
```
## Critical Rules
**ALWAYS**:
- Write tests first (TDD)
- Format & lint before commit
- Document public APIs
- **Fix bugs completely** - don't simplify code when issues are found
- Run full test suite before pushing
**NEVER**:
- Use `unsafe` code
- Use `unwrap()` in production
- Skip formatting & linting
- Simplify instead of fixing
- Remove `.coder` directory
## Testing in syntaxis
Current test coverage:
- syntaxis-core: 173 tests ✅
- syntaxis-tui: 10 tests ✅
- syntaxis-dashboard: 52 tests ✅
- dashboard-shared: 5 tests ✅
- dashboard-client: 4 tests ✅
- shared-api-lib: 93 tests ✅
- shared/rust: 33 tests ✅
- shared/rust-tui: 262 tests ✅
**Total: 632/632 tests passing** ✅
## For Details
- [CODE_STANDARDS.md](./.claude/CODE_STANDARDS.md) - Build & test commands
- [PROJECT_RULES.md](./.claude/PROJECT_RULES.md) - Architecture & patterns

326
.claude/DOC_REVIEW_RULES.md Normal file
View File

@ -0,0 +1,326 @@
# Documentation Review Rules
Standards for cleaning and maintaining documentation across all projects.
---
## 🎯 Core Rules
### 1. ❌ Remove Absolute User Paths
**Rule**: No hardcoded user home or development paths in documentation.
**Pattern to Remove**:
- `/Users/Akasha/Development/<project>`
- `/Users/Akasha/Tools/...`
- `/Users/Akasha/.coder/...`
- Any machine-specific absolute paths
**Replacement**:
- Use relative paths: `cd vapora`, `./scripts/`, `crates/`
- Use home directory notation: `~/.config/`, `~/projects/`
- Use placeholders: `<your-dev-directory>`, `<project-root>`
**Example**:
```bash
# ❌ BAD
cd /Users/Akasha/Development/syntaxis
cargo build
# ✅ GOOD
# Navigate to project root
cargo build
```
---
### 2. ❌ No References to .claude or claude Directories
**Rule**: Do NOT mention `.claude/`, `.claude/info/`, or related directories in user-facing documentation.
**Pattern to Remove**:
- `.claude/CLAUDE.md` or `CLAUDE.md` references in README
- `.claude/info/PHASE_X_COMPLETION.md` links
- `.claude/summaries/fase-X.md` references
- `.coder/` directory mentions (internal project tracking)
- "See CLAUDE.md for..." instructions
- References to internal Claude Code configuration
**Replacement**:
- Remove entirely from user-facing docs
- Keep only in internal/development documentation
- Link to public-facing docs: README.md, docs/ARCHITECTURE.md, etc.
**Example**:
```markdown
# ❌ BAD
See `CLAUDE.md` for complete project overview
See `.claude/info/PHASE_9_COMPLETION.md` for details
See `.coder/summaries/fase-1-backend.md` for implementation
# ✅ GOOD
See `README.md` for project overview
See `docs/ARCHITECTURE.md` for system design
See `docs/QUICKSTART.md` for getting started
```
---
### 3. ❌ Remove Phase/Release References
**Rule**: No references to development phases, completion status, or internal timelines.
**Pattern to Remove**:
- "Phase 1-12", "Phase 8-9", "Phases 1-7"
- "Week 1-4", "Week 5-8", etc.
- Phase completion badges
- Phase-specific documentation links
**Replacement**:
- Describe functionality directly: "Advanced Features", "Core Capabilities"
- Remove phase-specific docs from user-facing tables
- Use feature-based organization
**Example**:
```markdown
# ❌ BAD
## Phase 9: Advanced Resilience & Observability ✅
- Phase 9a: Real async SSH integration (8 tests)
- Phase 9b: Connection pooling (10 tests)
# ✅ GOOD
## Advanced Features
- Real async SSH integration
- Automatic connection pooling
```
---
### 4. ❌ Remove Test Coverage Metrics
**Rule**: Don't advertise specific test counts or coverage percentages in user-facing docs.
**Pattern to Remove**:
- "691+ tests passing"
- "332+ tests (100% pass rate)"
- "64 tests", "155/155 passing"
- Coverage percentages in badges
- Test count tables
**Replacement**:
- Use generic language: "Comprehensive tests", "Fully tested", "Complete test coverage"
- Keep detailed test info only in internal documentation
**Example**:
```markdown
# ❌ BAD
[![Tests](https://img.shields.io/badge/tests-332%2B%20passing-brightgreen.svg)]
**Test Coverage**:
- TUI Tests: 52 passing ✅
- Dashboard Tests: 12 passing ✅
- Total: 64 tests
# ✅ GOOD
**Comprehensive tests** — All critical paths tested
**100% documented** — All public APIs documented with rustdoc
```
---
### 5. ❌ Remove Phase-Specific Documentation Links
**Rule**: Don't link to phase completion documents or internal tracking in README/docs.
**Pattern to Remove**:
- `.coder/info/PHASE_9_COMPLETION.md`
- `.coder/info/README_PHASE_8.md`
- `.coder/summaries/fase-1-backend.md`
- `.coder/init/PHASE_1_COMPLETE.md`
**Keep**:
- Main documentation: README.md, docs/ARCHITECTURE.md, docs/QUICKSTART.md
- User-facing guides only
**Example**:
```markdown
# ❌ BAD
| Phase 8 Features | [.coder/info/README_PHASE_8.md](.coder/info/README_PHASE_8.md) |
| Phase 9 Details | [.coder/info/PHASE_9_COMPLETION.md](.coder/info/PHASE_9_COMPLETION.md) |
# ✅ GOOD
| Project Overview | [README.md](README.md) |
| System Architecture | [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) |
| Installation Guide | [docs/docs/installation-guide.md](docs/docs/installation-guide.md) |
```
---
### 6. ❌ Remove Internal Tool Paths
**Rule**: Don't reference external tool paths in documentation.
**Pattern to Remove**:
- `/Users/Akasha/Tools/doc-lifecycle-manager`
- `/Users/Akasha/Tools/tracking-manager`
- `/Users/Akasha/Tools/dev-system`
**Replacement**:
- Generic reference: "External project", "Related project"
- Link to public repo if available
**Example**:
```toml
# ❌ BAD
**Project Location**: `/Users/Akasha/Tools/doc-lifecycle-manager`
# ✅ GOOD
**Project Location**: External project (doc-lifecycle-manager)
```
---
## 📋 Files to Review
### Always Check These:
- ✅ `README.md` (root)
- ✅ `QUICKSTART.md`
- ✅ `docs/*.md`
- ✅ Root-level guide files (SETUP.md, DEPLOYMENT.md, etc.)
### Exclude From Review:
- ❌ `.claude/` directory (internal Claude Code instructions)
- ❌ `.coder/` directory (internal project tracking)
- ❌ `CLAUDE.md` (internal instructions for Claude Code)
- ❌ `DEPENDENCIES.md` (dependency listing)
- ❌ `guides/archive/` (historical reference)
---
## 🔍 Review Checklist
When reviewing documentation, check for:
### Path Check
- [ ] No `/Users/Akasha/Development/...` paths
- [ ] No `/Users/Akasha/Tools/...` paths
- [ ] Uses relative paths: `cd vapora`, `./scripts/`
- [ ] Uses home notation: `~/.config/`, `~/projects/`
### Claude/Internal Check
- [ ] No `.claude/` directory references
- [ ] No `CLAUDE.md` references
- [ ] No `.coder/` directory references
- [ ] No "See CLAUDE.md" or similar instructions
- [ ] No Claude Code internal configuration mentioned
### Phase Check
- [ ] No "Phase X" references in user-facing docs
- [ ] No "Week X-Y" timelines
- [ ] No phase completion badges
- [ ] No phase-specific documentation tables
### Test Coverage Check
- [ ] No specific test count numbers ("332+ tests")
- [ ] No test pass rate percentages ("100% passing")
- [ ] Uses generic: "Comprehensive tests", "Fully tested"
- [ ] Test metrics only in internal documentation
### Documentation Link Check
- [ ] No `.coder/` links in README/docs
- [ ] No `.claude/` links anywhere in user docs
- [ ] No internal phase completion files linked
- [ ] Only user-facing documentation listed
- [ ] Links are to main docs: README, QUICKSTART, ARCHITECTURE
### Internal Tool Check
- [ ] No specific tool paths referenced
- [ ] External dependencies referenced generically
- [ ] Public repo links where available
---
## 📝 Examples by Project
### ✅ Correct Pattern - README.md
```markdown
# Project Name
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
[![Rust](https://img.shields.io/badge/rust-1.75%2B-orange.svg)]
[![Status](https://img.shields.io/badge/status-production%20ready-brightgreen.svg)]
**Description** of what the project does without mentioning phases or test counts.
## Features
✅ **Feature Group 1**
- Feature detail
- Feature detail
✅ **Feature Group 2**
- Feature detail
## Quick Start
```bash
# Build the project
cargo build --release
```
## Documentation
- [Quick Start](QUICKSTART.md)
- [Architecture](docs/ARCHITECTURE.md)
- [CLI Guide](docs/CLI_GUIDE.md)
```
### ✅ Correct Pattern - Code Blocks in Docs
```bash
# ✅ GOOD - Relative paths
cd project-name
cargo build --release
# ✅ GOOD - Home directory
cp configs/database-default.toml ~/.config/project/database.toml
# ✅ GOOD - Relative from root
cd crates/subproject
cargo test
```
---
## 🚀 How to Use These Rules
### For Interactive Review:
```bash
# Check a markdown file against these rules
claude-code review-docs <file.md> --rules DOC_REVIEW_RULES.md
```
### For Batch Review:
```bash
# Review all markdown in a directory
claude-code review-docs docs/ --rules DOC_REVIEW_RULES.md --recursive
```
### In CI/CD:
```yaml
# Example: pre-commit hook
- name: Review Documentation
run: |
claude-code review-docs README.md docs/ \
--rules .claude/DOC_REVIEW_RULES.md \
--fail-on-violations
```
---
## 📚 Related Documentation
- See individual project README for specific conventions
- See `docs/ARCHITECTURE.md` for technical details
- See `docs/QUICKSTART.md` for getting started
---
**Version**: 1.0
**Last Updated**: 2025-11-19
**Status**: Active - Use for all documentation reviews

250
.claude/PROJECTS.md Normal file
View File

@ -0,0 +1,250 @@
# Projects - syntaxis
## Single Project: syntaxis
**syntaxis** is the standalone successor to `syntaxis` in the Tools ecosystem.
### Project Information
| Property | Value |
|----------|-------|
| **Location** | `/Users/Akasha/Development/syntaxis/` |
| **Type** | Rust monorepo |
| **Status** | ✅ Production-ready |
| **Tests** | 632/632 passing |
| **Crates** | 8 (6 active, 2 WIP) |
| **Origin** | Extracted from Tools/syntaxis |
| **Purpose** | Foundation SST (Software Specification & Tasks) for VAPORA |
### Crates Overview
#### Active Crates (6)
| Crate | Path | Type | Tests | Purpose |
|-------|------|------|-------|---------|
| **syntaxis-core** | `core/crates/syntaxis-core/` | lib | 173 | Core project/task/phase management |
| **syntaxis-cli** | `core/crates/syntaxis-cli/` | bin | - | Command-line interface |
| **syntaxis-tui** | `core/crates/syntaxis-tui/` | bin | 10 | Terminal user interface |
| **syntaxis-dashboard** | `core/crates/syntaxis-dashboard/` | lib | 52 | Web dashboard (Leptos) |
| **dashboard-client** | `core/crates/dashboard-client/` | lib | 4 | Dashboard client library |
| **dashboard-shared** | `core/crates/dashboard-shared/` | lib | 5 | Shared dashboard types |
#### Work-in-Progress Crates (2)
| Crate | Path | Type | Status | Purpose |
|-------|------|------|--------|---------|
| **syntaxis-api** | `core/crates/syntaxis-api/` | bin | 🟡 37 errors | REST API server |
| **syntaxis-vapora** | `core/crates/syntaxis-vapora/` | lib | 🟡 Planned | VAPORA orchestration adapter |
#### Shared Libraries (3)
| Library | Path | Tests | Purpose |
|---------|------|-------|---------|
| **shared-api-lib** | `shared/rust-api/shared-api-lib/` | 93 | Unified REST API patterns |
| **shared/rust** | `shared/rust/` | 33 | General utilities (config discovery, etc) |
| **shared/rust-tui** | `shared/rust-tui/` | 262 | TUI widgets and utilities |
### Architecture
```
syntaxis (monorepo root)
├── .coder/ # Project tracking (NEVER REMOVE)
├── .claude/ # Development guidelines (local)
├── .project/ # dev-system installation
├── shared/ # Shared libraries (3)
│ ├── rust-api/shared-api-lib/ # REST API library (93 tests)
│ ├── rust-tui/ # TUI utilities (262 tests)
│ └── rust/ # General utilities (33 tests)
├── syntaxis/ # Main workspace
│ ├── crates/ # 8 Rust crates
│ │ ├── syntaxis-core/ # Core library (173 tests)
│ │ ├── syntaxis-cli/ # CLI binary
│ │ ├── syntaxis-tui/ # TUI binary (10 tests)
│ │ ├── syntaxis-dashboard/ # Web UI lib (52 tests)
│ │ ├── dashboard-client/ # Dashboard client (4 tests)
│ │ ├── dashboard-shared/ # Shared types (5 tests)
│ │ ├── syntaxis-api/ # API binary (WIP)
│ │ └── syntaxis-vapora/ # VAPORA adapter (WIP)
│ ├── docs/ # Architecture & guides
│ ├── scripts/ # Build & deployment scripts
│ └── Cargo.toml # Workspace manifest
├── Cargo.toml # Root workspace manifest
├── Cargo.lock # Dependency lock
├── Justfile # Build recipes
├── README.md # Project overview
└── MIGRATION_STATUS.md # Migration tracking
```
### Interfaces
#### 1. Command Line Interface (CLI)
```bash
./target/debug/workspace
./target/debug/workspace project list
./target/debug/workspace task create --name "feature" --project "my-project"
```
- Built with `clap` for argument parsing
- Supports batch operations
- JSON output option for scripting
#### 2. Terminal User Interface (TUI)
```bash
./target/debug/syntaxis-tui
```
- Built with `ratatui` for rich terminal UIs
- Interactive project/task browsing
- Real-time updates via websockets (planned)
- Keyboard-driven navigation
#### 3. Web Dashboard
```bash
# Dashboard hosted by syntaxis-dashboard library
# Accessible at http://localhost:3000
```
- Built with `Leptos` (full-stack Rust/WASM)
- Real-time updates
- Responsive design
- Status: HTML rendering complete
#### 4. REST API (Work-in-Progress)
```bash
# Will run on http://localhost:8080
# JSON-based REST endpoints
# JWT authentication support
```
- Built with `axum` web framework
- Status: 37 type errors in handlers (needs fixing)
### Key Features
✅ **Implemented**
- Project definition and management
- Task creation, assignment, tracking
- Phase-based project orchestration
- Task state transitions with audit trail
- Multiple interface support (CLI, TUI, Dashboard)
- SQLite persistence with async support
- Configuration-driven design
🟡 **In Progress**
- REST API (syntaxis-api)
- VAPORA orchestration adapter (syntaxis-vapora)
- WebSocket real-time updates
- Advanced analytics and reporting
🔮 **Planned**
- PostgreSQL support
- Docker containerization
- Kubernetes deployment
- VAPORA integration complete
- Advanced role-based access control
- Audit trail export
### Database
**Default**: SQLite
- Location: `workspace.db`
- Connection pooling for performance
- Async queries with sqlx
- Compile-time query verification
**Configuration**:
```toml
database_url = "sqlite:workspace.db"
# or environment variable
export DATABASE_URL="sqlite:workspace.db"
```
### Development Status
#### Compilation
- ✅ 6 of 8 crates compile successfully
- 🟡 syntaxis-api: 37 type errors (handler cleanup needed)
- 🟡 syntaxis-vapora: Planning stage
#### Testing
- ✅ 632 tests passing across all crates
- ✅ Code formatting verified
- ✅ Linting passed
- ✅ Security audits clean
#### Build
- ✅ CLI binary: `workspace` (32MB debug, ~10MB release)
- ✅ TUI binary: `syntaxis-tui` (20MB debug, ~6MB release)
- ✅ Dashboard library: Ready for integration
- 🟡 API binary: Not yet built (handler errors)
### Dependencies
**Core Dependencies**:
- `tokio` (1.x) - Async runtime
- `axum` (0.8) - Web framework
- `sqlx` (0.8) - Database client
- `serde` (1.0) - Serialization
- `thiserror` (2.0) - Error handling
- `leptos` (0.8.12) - Web framework
**See [DEPENDENCIES.md](./.claude/DEPENDENCIES.md) for complete list**
### Configuration
Configuration is TOML-based, never hardcoded:
```toml
# syntaxis.toml
[workspace]
project_root = "."
database_url = "sqlite:workspace.db"
[ui]
theme = "dark"
log_level = "info"
```
### Integration with VAPORA
syntaxis is designed as the foundation SST for VAPORA:
- **Task State Tracking**: Provides TaskStatus and TaskStateChange tracking
- **Phase Orchestration**: Phase-based project management with validation
- **Event System**: Ready for VAPORA event hooks
- **Metadata Support**: Flexible metadata for VAPORA extensions
### Migration Notes
syntaxis was extracted from syntaxis to:
1. Decouple project management from Tools ecosystem
2. Create standalone VAPORA integration point
3. Enable independent development and versioning
4. Maintain shared libraries through path dependencies
Original syntaxis remains in Tools for reference but syntaxis is the active implementation.
### Quick Start
```bash
cd /Users/Akasha/Development/syntaxis
# Build all
cargo build --release
# Run tests
cargo test --workspace
# Run CLI
./target/debug/workspace --help
# Run TUI
./target/debug/syntaxis-tui
# Code quality checks
just check-all
```
### For Details
See:
- [README.md](../../README.md) - Project overview
- [MIGRATION_STATUS.md](../../MIGRATION_STATUS.md) - Migration tracking
- [PROJECT_RULES.md](./.claude/PROJECT_RULES.md) - Architecture & patterns
- [CODE_STANDARDS.md](./.claude/CODE_STANDARDS.md) - Quality standards

190
.claude/PROJECT_RULES.md Normal file
View File

@ -0,0 +1,190 @@
# Project Rules & Principles - syntaxis
## Core Rules
- Follow Rust guidelines from `dev-system/languages/rust/guidelines/`
- PAP = **Project's Architecture Principles** (configuration-driven, zero unsafe, 100% tests)
- **Configuration-driven**, never hardcoded (use TOML + Serde)
- Never patch with hardcoded fallbacks - fix the parsing instead
- Only essential error messages, suppress stack traces except DEBUG
## Project Overview
**syntaxis** is a standalone, production-grade project management platform extracted from the Tools ecosystem:
- **Purpose**: Orchestrate project lifecycle, task definitions, and status tracking
- **Foundation**: VAPORA SST (Software Specification & Tasks) integration
- **Architecture**: Modular monorepo with 6+ operational crates
- **Status**: ✅ Production-ready with 632+ tests passing
## Mandatory Standards
### Code Quality
| Rule | Standard | Status |
|------|----------|--------|
| **Safety** | `#![forbid(unsafe_code)]` - Zero unsafe | ✅ Pass |
| **Errors** | `Result<T>` with `?` operator, no `unwrap()` | ✅ Pass |
| **Documentation** | 100% public API documented (rustdoc) | ✅ Pass |
| **Tests** | 632+ tests, 15+ per module | ✅ Pass |
| **Format** | `cargo fmt --all` required | ✅ Pass |
| **Linting** | `cargo clippy --all-targets` must pass | ✅ Pass |
| **Audit** | `cargo audit` - no vulnerabilities | ✅ Pass |
### Error Handling
Use `thiserror` pattern:
```rust
use thiserror::Error;
#[derive(Error, Debug)]
pub enum WorkspaceError {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Database error: {0}")]
Database(String),
}
// Always: fn operation() -> Result<T> { ... }
```
### Module Structure
```rust
mod error; // Error types (thiserror)
mod types; // Domain types (Project, Task, Phase)
mod config; // Configuration (TOML + Serde)
mod managers; // Business logic (ProjectManager, PhaseManager)
mod persistence;// Database layer (SQLite)
mod tracking; // Task state tracking (for VAPORA)
#[cfg(test)] mod tests { ... }
```
## Professional Standards
- **Role**: Rust Senior Developer - idiomatic, production-grade code
- **Language**: English only (docs, strings, code)
- **Approach**: TDD (test-driven development)
- **Stack**: NuShell for scripts, Rust for executables
- **Tools**: Justfile for automation, cargo for builds
## Infrastructure
- Use `scripts/` directory for infrastructure
- Declarative & modular via configuration (TOML)
- NuShell for bash-type commands (not Python)
- Rust for executables (not Python)
## Project Tracking
- **NEVER remove `.coder` directory** - contains project lifecycle tracking
- `.coder/` structure: `PHASE_*.md`, `STATUS.md`, `SUMMARY.md`, `COMPLETION.md`
- Tracks migration from syntaxis → syntaxis
## Git & Development
- **NO git commands** unless explicitly requested
- No "ready to commit?" questions - proceed when guidelines met
- Fix bugs completely, don't simplify
- Auto-fix based on guidelines when appropriate
## Architecture Patterns
### Workspace Structure
```
syntaxis/
├── shared/ # Shared libraries
│ ├── rust-api/ # Shared REST API library (93 tests)
│ ├── rust-tui/ # Shared TUI utilities
│ └── rust/ # Shared utilities
├── syntaxis/ # Main project
│ ├── crates/ # 6-8 crates
│ │ ├── syntaxis-core/ # Core library (173 tests)
│ │ ├── syntaxis-cli/ # CLI tool
│ │ ├── syntaxis-tui/ # Terminal UI (10 tests)
│ │ ├── syntaxis-dashboard/# Web Dashboard (52 tests)
│ │ ├── dashboard-client/ # Dashboard client (4 tests)
│ │ ├── dashboard-shared/ # Shared dashboard types (5 tests)
│ │ ├── syntaxis-api/ # REST API (excluded - in progress)
│ │ └── syntaxis-vapora/ # VAPORA adapter (excluded - planned)
│ ├── docs/ # Documentation
│ ├── scripts/ # Build scripts (NuShell)
│ └── Cargo.toml # Workspace manifest
├── .coder/ # Project tracking (NEVER REMOVE)
├── .claude/ # Claude Code guidelines (local)
├── .project/ # dev-system installation
├── Cargo.toml # Root workspace
├── Cargo.lock # Dependency lock
├── Justfile # Build recipes
└── README.md # Project overview
```
### Configuration-Driven Design
- All settings via TOML + Serde
- Zero hardcoded values
- Environment variables for secrets (API keys, DB URLs)
- Feature flags for optional functionality
### Database Layer
```rust
// SQLite with async runtime (tokio)
use sqlx::{sqlite::SqlitePool, Row};
// Connection pooling for performance
let pool = SqlitePool::connect("sqlite:workspace.db").await?;
```
### REST API (axum)
```rust
// Tower middleware stack
use axum::{extract, middleware};
use tower::ServiceBuilder;
let app = ServiceBuilder::new()
.layer(middleware::TraceLayer::new_for_http())
.service(routes);
```
### Multi-Interface Architecture
- **CLI** (`workspace`): Command-line tool via clap
- **TUI** (`syntaxis-tui`): Terminal UI via ratatui
- **Dashboard** (`syntaxis-dashboard`): Web UI via Leptos
- **REST API** (`syntaxis-api`): Backend via axum (in progress)
## Important Notes
⚠️ **NEVER**:
- Remove `.coder` directory
- Use `unsafe` code
- Use `unwrap()` in production code
- Hardcode configuration values
- Simplify code when bugs are found
**ALWAYS**:
- Format, lint, test, document
- **Fix bugs completely** - don't simplify code when issues are found
- Use proper error handling with Result<T>
- Document public APIs with rustdoc
- Write tests first (TDD)
## Crate Status
| Crate | Type | Tests | Binaries | Status |
|-------|------|-------|----------|--------|
| syntaxis-core | lib | 173 | - | ✅ Active |
| syntaxis-cli | bin | - | `workspace` | ✅ Active |
| syntaxis-tui | bin | 10 | `syntaxis-tui` | ✅ Active |
| syntaxis-dashboard | lib | 52 | - | ✅ Active |
| syntaxis-api | bin | - | `syntaxis-api` | 🟡 WIP* |
| syntaxis-vapora | lib | - | - | 🟡 Planned* |
| shared-api-lib | lib | 93 | - | ✅ Shared |
*Excluded from workspace members - being developed separately
## VAPORA Integration
syntaxis is designed as the foundation SST (Software Specification & Tasks) for VAPORA:
- Task state tracking with audit trail
- Phase-based project orchestration
- Enterprise-grade change tracking
- Integration hooks for VAPORA orchestration engine
## For Details
- [CODE_STANDARDS.md](./.claude/CODE_STANDARDS.md) - Build, test, verification
- [DEVELOPMENT.md](./.claude/DEVELOPMENT.md) - Workflow, patterns, documentation

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-cr.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-da.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-dg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-ex.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-pa.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-qg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-sa.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-ta.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-tg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-cr.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-da.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-dg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-pa.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-qg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-sa.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-ta.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-tg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/NUSHELL_0108_ERRORS.md

1
.claude/commands/bash-cr.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-cr.md

1
.claude/commands/bash-da.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-da.md

1
.claude/commands/bash-dg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-dg.md

1
.claude/commands/bash-ex.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-ex.md

1
.claude/commands/bash-pa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-pa.md

1
.claude/commands/bash-qg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-qg.md

1
.claude/commands/bash-sa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-sa.md

1
.claude/commands/bash-ta.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-ta.md

1
.claude/commands/bash-tg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/commands/bash-tg.md

1
.claude/commands/kcl-cr.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-cr.md

1
.claude/commands/kcl-da.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-da.md

1
.claude/commands/kcl-dg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-dg.md

1
.claude/commands/kcl-ex.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-ex.md

1
.claude/commands/kcl-pa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-pa.md

1
.claude/commands/kcl-qg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-qg.md

1
.claude/commands/kcl-sa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-sa.md

1
.claude/commands/kcl-ta.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-ta.md

1
.claude/commands/kcl-tg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/commands/kcl-tg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-cr.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-da.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-dg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-ex.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/typedialog/commands/nickel-gen.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-pa.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-qg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-sa.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-ta.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/commands/nickel-tg.md

1
.claude/commands/nu-cr.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-cr.md

1
.claude/commands/nu-da.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-da.md

1
.claude/commands/nu-dg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-dg.md

1
.claude/commands/nu-ex.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-ex.md

1
.claude/commands/nu-pa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-pa.md

1
.claude/commands/nu-qg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-qg.md

1
.claude/commands/nu-sa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-sa.md

1
.claude/commands/nu-ta.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-ta.md

1
.claude/commands/nu-tg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/nu-tg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/commands/NUSHELL_0108_ERRORS.md

1
.claude/commands/rust-cr.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-cr.md

1
.claude/commands/rust-da.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-da.md

1
.claude/commands/rust-dg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-dg.md

1
.claude/commands/rust-pa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-pa.md

1
.claude/commands/rust-qg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-qg.md

1
.claude/commands/rust-re.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-re.md

1
.claude/commands/rust-sa.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-sa.md

1
.claude/commands/rust-ta.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-ta.md

1
.claude/commands/rust-tg.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-tg.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/agents.txt

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/commands/rust-re.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/dependencies/nickel-stdlib-core.toml

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/dependencies/dev-dependencies.toml

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/dependencies/overrides.toml

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/dependencies/registry.toml

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/dependencies/rules.toml

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/rust/dependencies/versions.toml

View File

@ -0,0 +1,27 @@
# Guideline Updates Tracking
This directory tracks custom guideline modifications and updates for your project.
## Structure
- **TRACKING.md** - Log of all guideline changes
- **custom/** - Your project-specific guideline extensions
- **updates/** - Pending or completed guideline updates
## Workflow
1. Review guidelines in `.claude/guidelines/<language>/`
2. Make local copies or extensions in `custom/`
3. Document changes in `TRACKING.md`
4. Use `/update-guidelines` command to manage versions
## Languages Installed
$langs_list
## Quick Links
- Guidelines: `.claude/guidelines/`
- Skills: `.claude/skills/`
- Commands: `.claude/commands/`
- Hooks: `.claude/hooks/`

View File

@ -0,0 +1,20 @@
# Guideline Updates Log
## Project Information
- Created: $today
- Languages: $langs_str
## Update History
### Template Entry
```
## YYYY-MM-DD - Update Name
**File**: guidelines/language/filename.md
**Change Type**: addition/modification/removal
**Summary**: Brief description
**Reason**: Why this change was made
```
---
## Updates

1
.claude/guidelines/bash.md Symbolic link
View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/bash.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/bash/guidelines/BASH_GUIDELINES.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/guidelines/KCL_GUIDELINES.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/guidelines/KCL_RULES_SUMMARY.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/kcl/guidelines/kcl_idiomatic_patterns.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/nickel.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nickel/guidelines/NICKEL_GUIDELINES.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/nushell.md

View File

@ -0,0 +1,246 @@
# Nushell 0.109 Compatibility Audit Report
**Generated**: 2025-12-01
**Nushell Version**: 0.109.0
**Project**: syntaxis
**Status**: ⚠️ CRITICAL ISSUES FOUND
---
## Executive Summary
A comprehensive audit of all Nushell scripts in the syntaxis project has revealed **critical compatibility issues** with Nushell 0.109. The primary issue is the use of deprecated return type annotation syntax that prevents all affected scripts from running.
### Key Findings
| Category | Count | Severity |
|----------|-------|----------|
| Scripts Audited | 32 | - |
| Scripts with Issues | 5 | - |
| Total Issues | 15 | - |
| Critical Issues | 15 | 🔴 CRITICAL |
| Warnings | 0 | - |
| Info | 0 | - |
---
## Critical Issues
### Issue #1: Deprecated Return Type Annotation Syntax
**Severity**: 🔴 CRITICAL
**Impact**: Scripts fail to parse and cannot execute
**Affected Scripts**: 5 files, 15 functions
#### Problem Description
Nushell 0.109 introduced a breaking change to the return type annotation syntax. The old syntax using `] -> type {` is no longer valid and has been replaced with `]: input_type -> output_type {`.
**Old Syntax (broken):**
```nushell
export def find-config [filename: string] -> string {
# ...
}
```
**New Syntax (required):**
```nushell
export def find-config [filename: string]: nothing -> string {
# ...
}
```
#### Affected Files and Functions
1. **scripts/common/find-config.nu** (3 functions)
- Line 25: `export def find-config [filename: string] -> string`
- Line 44: `export def find-config-or [filename: string, default: string] -> string`
- Line 56: `export def find-db-path [filename: string] -> string`
2. **scripts/manifest.nu** (2 functions)
- Line 11: `export def load-manifest [] -> record`
- Line 49: `def manifest_to_toml [manifest: record] -> string`
3. **scripts/provisioning/detect-provctl.nu** (3 functions)
- Line 34: `def detect_provctl [] -> record`
- Line 133: `def detect_available_backends [] -> list`
- Line 163: `def command_exists [cmd: string] -> bool`
4. **scripts/provisioning/install-with-presets.nu** (5 functions)
- Line 183: `def generate_installation_config [preset: string, config: record] -> string`
- Line 208: `def detect_provctl_availability [] -> record`
- Line 223: `def select_preset_interactive [config: record] -> string`
- Line 258: `def get_binaries_for_preset [preset: string, config: record] -> list`
- Line 481: `def run_preflight_checks [preset: string] -> bool`
5. **scripts/provisioning/provctl-services.nu** (2 functions)
- Line 250: `def get_services_for_preset [preset: string = "local"] -> string`
- Line 285: `def check_provctl_available [] -> bool`
#### Migration Guide
For each function, update the syntax as follows:
```nushell
# BEFORE
def function_name [param: type] -> return_type {
# body
}
# AFTER
def function_name [param: type]: nothing -> return_type {
# body
}
```
**Note**: Use `nothing` as the input type for functions that don't accept pipeline input. Use `any`, `string`, `list`, etc. for functions that process pipeline input.
---
## Additional Findings
### Best Practice Recommendations
While auditing the scripts, the following non-critical observations were made:
1. **Type Annotations**: Most scripts have good type annotations on function parameters
2. **Error Handling**: Good use of try-catch blocks throughout
3. **Documentation**: Most public functions have helpful comments
4. **Module Structure**: Proper use of `export def` for public APIs
### Scripts Without Issues
The following scripts are compatible with Nushell 0.109 (no return type annotations used):
- scripts/core/install-syntaxis-api.nu
- scripts/core/install-all-targets.nu
- scripts/core/install.nu
- scripts/core/build-dashboard.nu
- scripts/syntaxis-cli.nu
- scripts/syntaxis-tui.nu
- scripts/syntaxis-api.nu
- scripts/syntaxis-lib.nu
- scripts/install-syntaxis.nu
- scripts/fix_clippy_warnings.nu
- scripts/provisioning/common/validate.nu
- scripts/provisioning/common/platform.nu
- scripts/provisioning/common/manifest.nu
- scripts/provisioning/pack.nu
- scripts/provisioning/deploy.nu
- scripts/provisioning/install.nu
- scripts/provisioning/provctl.nu
- scripts/provisioning/unpack.nu
- scripts/provisioning/service-catalog.nu
- scripts/provisioning/test-catalog.nu
- scripts/test-installation.nu
- tests/provisioning/test-detect-provctl.nu
- tests/provisioning/test-presets.nu
- tests/provisioning/test-all.nu
- provctl/scripts/export-config.nu
---
## Recommendations
### Immediate Actions (CRITICAL)
1. ✅ **Update Guidelines**: Create comprehensive Nushell 0.109 guidelines
- Status: COMPLETED
- Location: `.claude/guidelines/nushell/NUSHELL_0.109_GUIDELINES.md`
2. ⏭️ **Fix All Scripts**: Update return type annotations in 5 affected scripts
- Priority: HIGH
- Estimated effort: 30 minutes
- Risk: LOW (simple syntax change)
3. ⏭️ **Test All Scripts**: Run all updated scripts to verify functionality
- Priority: HIGH
- Required after fixes
### Future Improvements
1. **Automated Linting**: Consider adding a pre-commit hook to check Nushell syntax
2. **Type Annotations**: Add return type annotations to remaining scripts (23 scripts without them)
3. **Testing**: Add more #[test] functions to critical utility scripts
4. **Documentation**: Add usage examples to all public functions
---
## Migration Priority
### Phase 1: Critical Infrastructure (IMMEDIATE)
- `scripts/common/find-config.nu` - Used by many other scripts
- `scripts/manifest.nu` - Used by installation scripts
### Phase 2: Provisioning Scripts (HIGH)
- `scripts/provisioning/detect-provctl.nu`
- `scripts/provisioning/install-with-presets.nu`
- `scripts/provisioning/provctl-services.nu`
### Phase 3: Verification (HIGH)
- Run all installation and provisioning workflows
- Test TUI, CLI, and API scripts
- Verify documentation examples
---
## Automated Fix Script
A script can be created to automatically fix the syntax:
```nushell
# Example automated fix
def fix_return_types [file: string] {
let content = open --raw $file
let fixed = $content | str replace --all --regex '(\] )-> (\w+) \{' '$1: nothing -> $2 {'
$fixed | save --force $file
}
```
**Note**: Manual review is recommended after automated fixes to ensure correct input types.
---
## Testing Plan
After applying fixes:
1. **Unit Tests**:
```bash
nu scripts/common/find-config.nu
nu scripts/manifest.nu
```
2. **Integration Tests**:
```bash
nu scripts/provisioning/install-with-presets.nu --list-presets
nu scripts/provisioning/detect-provctl.nu --verbose
```
3. **Full Workflow**:
```bash
nu scripts/provisioning/install-with-presets.nu --preset local
```
---
## Conclusion
The syntaxis project requires immediate updates to be compatible with Nushell 0.109. The changes are straightforward but critical - all 15 affected function definitions must be updated to use the new return type annotation syntax.
**Estimated Total Effort**: 30-45 minutes
**Risk Level**: LOW (mechanical syntax change)
**Business Impact**: HIGH (scripts currently non-functional)
---
## References
- [Nushell 0.109 Guidelines](./.claude/guidelines/nushell/NUSHELL_0.109_GUIDELINES.md)
- [Nushell Type Signatures Documentation](https://www.nushell.sh/lang-guide/chapters/types/type_signatures.html)
- [Nushell 0.109.0 Release Notes](https://www.nushell.sh/blog/2025-11-29-nushell_v0_109_0.html)
---
*Generated by syntaxis Nushell Audit Tool*
*For questions or assistance, see `.claude/guidelines/nushell/`*

View File

@ -0,0 +1,231 @@
# Nushell 0.109 Migration Status
**Date**: 2025-12-01
**Status**: ✅ Core Syntax Fixed | ⚠️ Additional Issues Remain
---
## Completed Work
### 1. ✅ Guidelines Created
- **File**: `.claude/guidelines/nushell/NUSHELL_0.109_GUIDELINES.md`
- Comprehensive 950+ line guidelines document
- Covers all major Nushell 0.109 syntax changes
- Includes migration checklist and best practices
### 2. ✅ Audit Report Generated
- **File**: `.claude/guidelines/nushell/AUDIT_REPORT.md`
- Identified 15 functions across 5 files needing updates
- Documented all breaking changes
- Provided migration guidance
### 3. ✅ Critical Syntax Fixes Applied
#### Return Type Annotations (15 functions fixed)
All functions using old `] -> type {` syntax updated to `]: nothing -> type {`:
**scripts/common/find-config.nu** (3 functions)
- ✅ `find-config`
- ✅ `find-config-or`
- ✅ `find-db-path`
**scripts/manifest.nu** (2 functions)
- ✅ `load-manifest`
- ✅ `manifest_to_toml`
**scripts/provisioning/detect-provctl.nu** (3 functions)
- ✅ `detect_provctl`
- ✅ `detect_available_backends`
- ✅ `command_exists`
**scripts/provisioning/install-with-presets.nu** (5 functions)
- ✅ `generate_installation_config`
- ✅ `detect_provctl_availability`
- ✅ `select_preset_interactive`
- ✅ `get_binaries_for_preset`
- ✅ `run_preflight_checks`
**scripts/provisioning/provctl-services.nu** (2 functions)
- ✅ `get_services_for_preset`
- ✅ `check_provctl_available`
#### Mutable Variable Syntax (15+ instances fixed)
Changed `let mut` to `mut` throughout:
**scripts/manifest.nu**
- ✅ 7 instances fixed
**scripts/provisioning/detect-provctl.nu**
- ✅ 1 instance fixed
**scripts/provisioning/install-with-presets.nu**
- ✅ 1 instance fixed
**scripts/provisioning/provctl-services.nu**
- ✅ 4 instances fixed
**scripts/core/build-dashboard.nu**
- ✅ 2 instances fixed
#### Boolean Flag Syntax (1 instance fixed)
- ✅ Removed `: bool` type annotation from `--verbose` flag in `detect-provctl.nu`
---
## Remaining Issues
### Additional Compatibility Issues Found
During testing, additional Nushell 0.109 compatibility issues were discovered in `scripts/provisioning/detect-provctl.nu`:
#### 1. ⚠️ Operator Precedence in Try-Catch
**Location**: `detect-provctl.nu:137-153`
**Issue**: Complex boolean expressions in try-catch blocks need parentheses
**Status**: Partially fixed (parentheses added, but complex logic still fails)
**Error**: `The 'or' operator does not work on values of type 'list<bool>'`
#### 2. ⚠️ Removed $nu.invocation-dir
**Location**: `detect-provctl.nu:168`
**Issue**: `$nu.invocation-dir` field removed in Nushell 0.109
**Status**: Fixed (removed check, always calls main)
**Impact**: Minor - script execution behavior unchanged
### Scripts Requiring Further Review
The following scripts may have additional compatibility issues:
1. **scripts/provisioning/detect-provctl.nu**
- Complex try-catch expressions need simplification
- Consider refactoring backend detection logic
2. **All scripts using complex closures**
- Review closure syntax for pipeline processing
- Ensure correct use of `$in` vs explicit parameters
---
## Recommendations
### Immediate Next Steps
1. **Test All Fixed Scripts**
```bash
# Test basic syntax parsing
nu scripts/common/find-config.nu
nu scripts/manifest.nu
# Test with arguments
nu scripts/provisioning/install-with-presets.nu --list-presets
```
2. **Fix Remaining Issues in detect-provctl.nu**
- Simplify boolean expressions in backend detection
- Consider using helper functions instead of complex inline logic
- Example refactoring:
```nushell
# BEFORE (complex, fails)
if (($loc | path exists) or (try { which $loc } catch { null }) != null) {
# AFTER (simplified)
def path_or_command_exists [loc: string]: nothing -> bool {
($loc | path exists) or (which $loc | length > 0)
}
if (path_or_command_exists $loc) {
```
3. **Run Integration Tests**
- Test provisioning workflows end-to-end
- Verify installation scripts work correctly
- Test service management with provctl
### Long-term Improvements
1. **Automated Linting**
- Add pre-commit hook to check Nushell syntax
- Use `nu --check` for syntax validation
2. **Continuous Testing**
- Add Nushell version check to CI/CD
- Run all scripts as part of test suite
3. **Documentation Updates**
- Update CLAUDE.md with Nushell 0.109 notes
- Add version requirements to README
4. **Standardization**
- Create script templates following guidelines
- Refactor similar patterns across scripts
---
## Files Modified
### Created
- `.claude/guidelines/nushell/NUSHELL_0.109_GUIDELINES.md`
- `.claude/guidelines/nushell/AUDIT_REPORT.md`
- `.claude/guidelines/nushell/audit-nu-scripts.nu` (audit tool)
- `.claude/guidelines/nushell/MIGRATION_STATUS.md` (this file)
### Modified
- `scripts/common/find-config.nu` (3 functions updated)
- `scripts/manifest.nu` (9 changes total)
- `scripts/provisioning/detect-provctl.nu` (9 changes total)
- `scripts/provisioning/install-with-presets.nu` (6 changes total)
- `scripts/provisioning/provctl-services.nu` (6 changes total)
- `scripts/core/build-dashboard.nu` (2 changes)
**Total Changes**: 35+ modifications across 6 files
---
## Testing Checklist
- [x] Guidelines document created
- [x] Audit report generated
- [x] Return type syntax fixed (15 functions)
- [x] Mutable variable syntax fixed (15+ instances)
- [x] Boolean flag syntax fixed (1 instance)
- [ ] All scripts parse without errors
- [ ] Integration tests pass
- [ ] Provisioning workflows validated
- [ ] Documentation updated
---
## Known Working Scripts
These scripts parse correctly and are Nushell 0.109 compatible:
✅ **Core Infrastructure**
- `scripts/common/find-config.nu`
- `scripts/manifest.nu` (after fixes)
✅ **Installation**
- `scripts/install-syntaxis.nu`
- `scripts/test-installation.nu`
✅ **Build Scripts**
- `scripts/core/build-dashboard.nu`
- `scripts/core/install.nu`
---
## Summary
**Migration Progress**: ~85% Complete
The critical breaking changes (return type syntax and mutable variable syntax) have been addressed across all affected files. The scripts now use Nushell 0.109 compatible syntax for:
1. ✅ Function return types (`: nothing -> type`)
2. ✅ Mutable variables (`mut` instead of `let mut`)
3. ✅ Boolean flags (no type annotations)
However, some scripts still have runtime issues with complex expressions that need further refactoring. These are edge cases in advanced scripts and don't affect the core functionality.
**Recommendation**: The basic scripts and infrastructure are now 0.109 compatible. The remaining issues should be addressed on a case-by-case basis as those scripts are used in production workflows.
---
*For detailed migration guidance, see `.claude/guidelines/nushell/NUSHELL_0.109_GUIDELINES.md`*
*For complete audit findings, see `.claude/guidelines/nushell/AUDIT_REPORT.md`*

View File

@ -0,0 +1,961 @@
# Nushell 0.109+ Guidelines for Syntaxis Project
## Overview
This document provides comprehensive guidelines for writing and maintaining Nushell scripts compatible with Nushell 0.109 and later versions. All scripts in the syntaxis project must follow these standards.
## ⚠️ BREAKING CHANGES in Nushell 0.109+
### Critical: Return Type Annotation Syntax Changed
**OLD SYNTAX (No longer works):**
```nushell
def function_name [param: string] -> string {
$param
}
```
**NEW SYNTAX (Required in 0.109+):**
```nushell
def function_name [param: string]: nothing -> string {
$param
}
```
**Key Changes:**
- Return type annotations now require BOTH input type and output type
- Format: `]: input_type -> output_type`
- Input type specifies what the function accepts from pipeline:
- `nothing` - No pipeline input accepted
- `any` - Accepts any pipeline input (stored in `$in`)
- `string`, `list`, etc. - Specific type required from pipeline
**Migration Required:**
All existing scripts using `-> type` syntax MUST be updated to `]: nothing -> type` or the appropriate input type.
---
## Table of Contents
1. [General Principles](#general-principles)
2. [Script Header & Shebang](#script-header--shebang)
3. [Function Definitions](#function-definitions)
4. [Type Annotations](#type-annotations)
5. [Error Handling](#error-handling)
6. [Closures and Blocks](#closures-and-blocks)
7. [Pipeline and Data Flow](#pipeline-and-data-flow)
8. [String Interpolation](#string-interpolation)
9. [Conditionals](#conditionals)
10. [Loops and Iteration](#loops-and-iteration)
11. [Record and List Operations](#record-and-list-operations)
12. [File System Operations](#file-system-operations)
13. [External Commands](#external-commands)
14. [Module System](#module-system)
15. [Testing](#testing)
16. [Performance Considerations](#performance-considerations)
17. [Common Pitfalls](#common-pitfalls)
---
## General Principles
### ✅ Do's
- **Use type annotations** for function parameters and return types
- **Export public functions** explicitly with `export def`
- **Use descriptive variable names** (snake_case)
- **Leverage the pipeline** for data transformations
- **Handle errors gracefully** with `try-catch`
- **Document complex logic** with comments
- **Use immutable variables** by default; only use `mut` when necessary
### ❌ Don'ts
- **Avoid global mutable state**
- **Don't use deprecated commands** (check Nushell changelog)
- **Don't mix shell commands with Nushell builtins** unnecessarily
- **Avoid deeply nested closures** (prefer helper functions)
- **Don't ignore error cases** in production scripts
---
## Script Header & Shebang
### Standard Header
```nushell
#!/usr/bin/env nu
# script-name.nu - Brief description of script purpose
# Usage: nu script-name.nu [OPTIONS]
#
# Detailed description if needed
```
### With Version Requirement
```nushell
#!/usr/bin/env nu
# Requires Nushell 0.109+
def main [] {
# Verify version
let version = ($nu.version | get major)
if $version < 109 {
error make { msg: "Requires Nushell 0.109+" }
}
}
```
---
## Function Definitions
### Basic Function Syntax
```nushell
# Private function (module scope)
def helper_function [arg: string] -> string {
$arg | str upcase
}
# Public exported function
export def main_function [
arg1: string # Required argument
arg2?: int # Optional argument (note the ?)
--flag: bool = false # Flag with default
--value: string # Named parameter
] -> list<string> {
# Function body
[$arg1, $arg2]
}
```
### Main Entry Point
```nushell
def main [
--verbose: bool = false
...args: string # Rest parameters
] {
if $verbose {
print "Verbose mode enabled"
}
for arg in $args {
print $arg
}
}
```
---
## Type Annotations
### Supported Types
```nushell
# Scalar types
def example [
text: string
number: int
decimal: float
flag: bool
date: datetime
duration: duration
filesize: filesize
] {}
# Collection types
def collections [
items: list<string> # Homogeneous list
config: record # Record (struct)
table: table # Table type
any_list: list # List of any type
] {}
# Optional and nullable
def optional [
maybe_text?: string # Optional parameter
] {}
# Return type annotations (NEW SYNTAX in 0.109+)
# Format: def name [params]: input_type -> output_type { body }
def get_items []: nothing -> list<string> {
["item1", "item2"]
}
def get_config []: nothing -> record {
{name: "test", version: "1.0"}
}
# Function that accepts pipeline input
def process_items []: list<string> -> list<string> {
$in | each {|item| $item | str upcase}
}
```
---
## Error Handling
### Try-Catch Pattern
```nushell
# Basic try-catch
def safe_operation [] {
try {
# Risky operation
open file.txt
} catch { |err|
# Handle error
print $"Error: ($err.msg)"
return null
}
}
# Try with default value
def get_value_or_default [] -> string {
try {
open config.toml | get key
} catch {
"default_value"
}
}
```
### Error Creation
```nushell
def validate_input [value: int] {
if $value < 0 {
error make {
msg: "Value must be non-negative"
label: {
text: "invalid value"
span: (metadata $value).span
}
}
}
}
```
### Null Handling
```nushell
# Use null-coalescing with default operator
def get_env_or_default [key: string, default: string] -> string {
$env | get -i $key | default $default
}
# Safe navigation with optional chaining
def get_nested_value [data: record] -> any {
$data | get -i outer.inner.value | default null
}
```
---
## Closures and Blocks
### Closure Syntax (Nushell 0.109+)
```nushell
# Simple closure
let double = {|x| $x * 2}
[1, 2, 3] | each $double
# Multi-line closure
let process = {|item|
let result = $item | str upcase
$result + "!"
}
# Closure with pipeline input ($in)
let items = [1, 2, 3] | where {|it| $it > 1}
# IMPORTANT: Use {|it| ...} not { $in | ... } for newer versions
```
### Block vs Closure
```nushell
# Block (no parameters, uses $in)
def process_with_block [] {
[1, 2, 3] | each { $in * 2 } # Uses $in implicitly
}
# Closure (explicit parameters preferred)
def process_with_closure [] {
[1, 2, 3] | each {|x| $x * 2} # Explicit parameter
}
```
### Common Patterns
```nushell
# Filter with closure
let adults = $people | where {|person| $person.age >= 18}
# Map transformation
let names = $users | each {|user| $user.name}
# Reduce/fold
let sum = [1, 2, 3, 4] | reduce {|acc, val| $acc + $val}
# Any/all predicates
let has_errors = $items | any {|item| $item.status == "error"}
let all_valid = $items | all {|item| $item.valid}
```
---
## Pipeline and Data Flow
### Pipeline Best Practices
```nushell
# ✅ Good: Clear pipeline flow
def process_data [] {
open data.json
| get items
| where {|item| $item.active}
| each {|item| {name: $item.name, count: $item.count}}
| sort-by count
}
# ❌ Avoid: Unnecessary intermediate variables
def process_data_bad [] {
let data = open data.json
let items = $data | get items
let filtered = $items | where {|item| $item.active}
# ... prefer pipeline instead
}
```
### Pipeline Input Variable
```nushell
# $in represents pipeline input
def uppercase_all [] {
["hello", "world"] | each { $in | str upcase }
}
# Prefer explicit parameters for clarity
def uppercase_all_better [] {
["hello", "world"] | each {|text| $text | str upcase}
}
```
---
## String Interpolation
### String Formatting
```nushell
# Basic interpolation
let name = "World"
print $"Hello, ($name)!"
# Expression interpolation
let count = 5
print $"You have ($count * 2) items"
# Nested interpolation
let user = {name: "Alice", age: 30}
print $"User: ($user.name), Age: ($user.age)"
# Multi-line strings
let message = $"
Welcome to syntaxis
Version: (open Cargo.toml | get package.version)
Date: (date now | format date "%Y-%m-%d")
"
```
### ANSI Colors
```nushell
# Using ansi command
print $"(ansi cyan)INFO:(ansi reset) Processing..."
print $"(ansi red)ERROR:(ansi reset) Failed"
print $"(ansi green)✓(ansi reset) Success"
# Common patterns
def print_success [msg: string] {
print $"(ansi green)✓(ansi reset) ($msg)"
}
def print_error [msg: string] {
print $"(ansi red)✗(ansi reset) ($msg)"
}
def print_info [msg: string] {
print $"(ansi cyan)(ansi reset) ($msg)"
}
```
---
## Conditionals
### If-Else Statements
```nushell
# Basic if-else
def check_value [x: int] -> string {
if $x > 0 {
"positive"
} else if $x < 0 {
"negative"
} else {
"zero"
}
}
# Inline if (expression form)
def abs [x: int] -> int {
if $x >= 0 { $x } else { -$x }
}
```
### Match Expressions
```nushell
# Pattern matching
def process_status [status: string] -> string {
match $status {
"pending" => "⏳ Waiting"
"running" => "▶️ In Progress"
"completed" => "✅ Done"
"failed" => "❌ Error"
_ => "❓ Unknown"
}
}
# Match with guards
def categorize [num: int] -> string {
match $num {
$x if $x < 0 => "negative"
0 => "zero"
$x if $x < 10 => "small"
$x if $x < 100 => "medium"
_ => "large"
}
}
```
---
## Loops and Iteration
### For Loops
```nushell
# Basic for loop
def process_items [] {
for item in [1, 2, 3] {
print $"Processing: ($item)"
}
}
# With index using enumerate
def indexed_loop [] {
for (idx, val) in ([1, 2, 3] | enumerate) {
print $"Index ($idx): ($val)"
}
}
```
### While Loops
```nushell
# While loop
def countdown [mut n: int] {
while $n > 0 {
print $n
$n = $n - 1
}
print "Done!"
}
```
### Preferred: Functional Iteration
```nushell
# Use each instead of for when transforming
def double_all [items: list<int>] -> list<int> {
$items | each {|x| $x * 2}
}
# Use where for filtering
def get_active [items: list] -> list {
$items | where {|item| $item.active}
}
# Use reduce for aggregation
def sum [numbers: list<int>] -> int {
$numbers | reduce {|acc, val| $acc + $val}
}
```
---
## Record and List Operations
### Record Operations
```nushell
# Create record
let config = {
name: "syntaxis"
version: "0.1.0"
features: ["cli", "tui", "api"]
}
# Access fields
let name = $config.name
let version = $config | get version
# Safe access (returns null if missing)
let missing = $config | get -i missing_key
# Update record
let updated = $config | insert new_field "value"
let modified = $config | update version "0.2.0"
# Remove field
let smaller = $config | reject features
# Merge records
let merged = $config | merge {author: "Akasha"}
# Check if key exists
if "name" in $config {
print "Has name field"
}
```
### List Operations
```nushell
# Create list
let items = [1, 2, 3, 4, 5]
# Access elements
let first = $items | first
let last = $items | last
let at_index = $items | get 2
# Add elements
let appended = $items | append 6
let prepended = $items | prepend 0
# Filter
let evens = $items | where {|x| $x mod 2 == 0}
# Map
let doubled = $items | each {|x| $x * 2}
# Reduce
let sum = $items | reduce {|acc, val| $acc + $val}
# Sort
let sorted = $items | sort
let sorted_desc = $items | sort --reverse
# Unique
let unique = [1, 2, 2, 3] | uniq
# Flatten
let flat = [[1, 2], [3, 4]] | flatten
# Zip
let pairs = [$items, $doubled] | zip
# Take/skip
let first_three = $items | take 3
let skip_two = $items | skip 2
# Check membership
if 3 in $items {
print "Found"
}
# Length
let count = $items | length
```
---
## File System Operations
### Path Operations
```nushell
# Check if path exists
def file_exists [path: string] -> bool {
$path | path exists
}
# Path manipulation
let expanded = "~/config" | path expand
let joined = ["configs", "database.toml"] | path join
let dirname = "/path/to/file.txt" | path dirname
let basename = "/path/to/file.txt" | path basename
let extension = "file.txt" | path extension
# Path type checking
if ($path | path exists) and ($path | path type) == "dir" {
print "Is a directory"
}
```
### File Operations
```nushell
# Read file
def read_config [path: string] -> record {
if not ($path | path exists) {
return {}
}
try {
open $path
} catch {
print $"Warning: Could not read ($path)"
{}
}
}
# Write file
def save_config [config: record, path: string] {
try {
$config | to toml | save --force $path
print $"✓ Saved to ($path)"
} catch { |err|
print $"✗ Failed to save: ($err.msg)"
}
}
# Directory operations
def ensure_dir [path: string] {
if not ($path | path exists) {
mkdir $path
}
}
# List files with glob
def find_nu_scripts [] -> list<string> {
glob **/*.nu
}
```
---
## External Commands
### Running External Commands
```nushell
# Use ^ prefix for external commands
def run_cargo_check [] {
^cargo check --workspace
}
# Capture output
def get_git_branch [] -> string {
^git branch --show-current | str trim
}
# Check command existence
def has_command [cmd: string] -> bool {
which $cmd | length > 0
}
# Conditional command execution
def maybe_run [cmd: string] {
if (has_command $cmd) {
^$cmd --version
} else {
print $"Command not found: ($cmd)"
}
}
# Suppress errors with try
def silent_command [] {
try {
^some-command 2>/dev/null
} catch {
null
}
}
```
### Shell Redirection
```nushell
# Redirect stderr
^command 2>/dev/null
# Redirect both stdout and stderr
^command 2>&1
# Pipe to file
^command | save output.txt
# Append to file
^command | save --append output.txt
```
---
## Module System
### Module Structure
```nushell
# my-module.nu
export def public_function [] {
print "Public"
}
def private_function [] {
print "Private"
}
export def another_public [] {
private_function # Can call private functions
}
```
### Importing Modules
```nushell
# Import all exports
use my-module.nu
# Import specific functions
use my-module.nu [public_function, another_public]
# Import with alias
use my-module.nu [public_function as pub_fn]
# Relative imports
use ../common/utils.nu [helper]
use ./local-module.nu *
```
### Standard Library
```nushell
# Use standard library modules
use std log
use std assert
def example [] {
log info "Starting process"
log debug "Debug information"
assert equal 1 1 # Unit test assertion
}
```
---
## Testing
### Test Functions
```nushell
# Test annotation
#[test]
def test_addition [] {
assert equal (1 + 1) 2
}
#[test]
def test_string_operations [] {
let result = "hello" | str upcase
assert equal $result "HELLO"
}
# Test with error handling
#[test]
def test_error_case [] {
assert error { error make { msg: "test error" } }
}
```
### Integration Tests
```nushell
# test-integration.nu
use std assert
def main [] {
print "Running integration tests..."
test_config_loading
test_file_operations
print "All tests passed!"
}
def test_config_loading [] {
let config = load_config "test-config.toml"
assert ($config.name == "test")
}
def test_file_operations [] {
let temp_file = "temp-test.txt"
"test content" | save $temp_file
assert ($temp_file | path exists)
rm $temp_file
}
```
---
## Performance Considerations
### Efficient Data Processing
```nushell
# ✅ Good: Use pipeline for streaming
def process_large_file [] {
open --raw large.txt
| lines
| where {|line| $line | str contains "ERROR"}
| each {|line| parse_error_line $line}
}
# ❌ Avoid: Loading everything into memory
def process_large_file_bad [] {
let all_lines = open large.txt | lines
let errors = $all_lines | where {|line| $line | str contains "ERROR"}
# Processes entire file at once
}
```
### Lazy Evaluation
```nushell
# Take advantage of lazy evaluation
def find_first_match [pattern: string] {
glob **/*.txt
| each { open }
| where {|content| $content | str contains $pattern}
| first # Stops after first match
}
```
### Avoid Unnecessary Conversions
```nushell
# ✅ Good: Work with structured data
def get_names [] {
open users.json
| get users
| each {|user| $user.name}
}
# ❌ Avoid: Converting to strings unnecessarily
def get_names_bad [] {
open users.json
| to text # Unnecessary conversion
| from json
| get users
}
```
---
## Common Pitfalls
### Pitfall 1: Closure vs Block Confusion
```nushell
# ❌ Wrong: Using $in in closure parameter context
let bad = [1, 2, 3] | where { $in > 1 } # May not work in newer versions
# ✅ Correct: Use explicit parameter
let good = [1, 2, 3] | where {|x| $x > 1}
```
### Pitfall 2: Mutable Variable Scope
```nushell
# ❌ Wrong: Trying to mutate outer scope
def increment_bad [] {
let mut counter = 0
[1, 2, 3] | each {|x|
$counter = $counter + 1 # Error: can't mutate outer scope
}
}
# ✅ Correct: Use reduce or return values
def increment_good [] -> int {
[1, 2, 3] | reduce {|acc, val| $acc + 1} --fold 0
}
```
### Pitfall 3: Missing Error Handling
```nushell
# ❌ Risky: No error handling
def load_config [] {
open config.toml | get database.url # Crashes if missing
}
# ✅ Safe: Handle errors gracefully
def load_config_safe [] -> string {
try {
open config.toml | get database.url
} catch {
print "Warning: Using default database URL"
"sqlite::memory:"
}
}
```
### Pitfall 4: Type Mismatches
```nushell
# ❌ Wrong: Implicit type assumption
def add [a, b] { # No type annotations
$a + $b # May fail if wrong types
}
# ✅ Correct: Explicit types
def add [a: int, b: int] -> int {
$a + $b
}
```
### Pitfall 5: Path Handling
```nushell
# ❌ Wrong: Hardcoded paths
def get_config [] {
open /Users/username/config.toml # Not portable
}
# ✅ Correct: Use environment variables and path expansion
def get_config [] -> record {
let config_path = $"($env.HOME)/.config/syntaxis/config.toml"
if ($config_path | path exists) {
open $config_path
} else {
{}
}
}
```
### Pitfall 6: Ignoring Null Values
```nushell
# ❌ Wrong: Assumes value exists
def get_value [data: record] {
$data.key.nested.value # Crashes if any key missing
}
# ✅ Correct: Safe navigation
def get_value_safe [data: record] -> any {
$data | get -i key.nested.value | default null
}
```
---
## Migration Checklist for Existing Scripts
When updating scripts to Nushell 0.109+:
- [ ] **CRITICAL:** Update return type syntax from `] -> type {` to `]: nothing -> type {`
- [ ] Update closures to use explicit parameters `{|x| ...}` instead of `{ $in ... }`
- [ ] Add type annotations to function parameters and return types
- [ ] Replace deprecated commands (check Nushell changelog)
- [ ] Add proper error handling with try-catch
- [ ] Use `export def` for public functions
- [ ] Add documentation comments
- [ ] Update file operations to use proper path checking
- [ ] Replace string-based path handling with path commands
- [ ] Add tests for critical functions
- [ ] Verify null handling with `-i` flag and `default`
- [ ] Check external command calls use `^` prefix
- [ ] Ensure ANSI color usage is consistent
- [ ] Change `let mut` to `mut` for mutable variables
---
## References
- [Nushell Official Documentation](https://www.nushell.sh/book/)
- [Nushell Language Guide](https://www.nushell.sh/lang-guide/)
- [Nushell Cookbook](https://www.nushell.sh/cookbook/)
- [Nushell Release Notes](https://github.com/nushell/nushell/releases)
---
**Last Updated**: 2025-12-01
**Minimum Version**: Nushell 0.109+
**Maintained by**: syntaxis Development Team

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/guidelines/NUSHELL_COMPLIANCE_CHECKLIST.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/guidelines/NUSHELL_GUIDELINES.md

View File

@ -0,0 +1 @@
/Users/Akasha/Tools/dev-system/languages/nushell/guidelines/README.md

View File

@ -0,0 +1,321 @@
#!/usr/bin/env nu
# audit-nu-scripts.nu - Automated Nushell script auditor for 0.109+ compatibility
# Usage: nu .claude/guidelines/nushell/audit-nu-scripts.nu [--fix] [--verbose]
def main [
--fix # Automatically fix simple issues
--verbose # Show detailed output
--output: string = "" # Output report to file
] {
print_header
# Find all Nushell scripts
let scripts = glob **/*.nu | where {|path| not ($path | str starts-with "target/")}
print $"Found ($scripts | length) Nushell script(s) to audit\n"
mut issues = []
mut summary = {
total_scripts: ($scripts | length)
scripts_with_issues: 0
total_issues: 0
critical: 0
warning: 0
info: 0
}
# Audit each script
for script_path in $scripts {
let script_issues = audit_script $script_path $verbose
if ($script_issues | length) > 0 {
$summary.scripts_with_issues = $summary.scripts_with_issues + 1
$summary.total_issues = $summary.total_issues + ($script_issues | length)
# Count by severity
for issue in $script_issues {
match $issue.severity {
"critical" => { $summary.critical = $summary.critical + 1 }
"warning" => { $summary.warning = $summary.warning + 1 }
"info" => { $summary.info = $summary.info + 1 }
_ => {}
}
}
# Add to issues list
$issues = ($issues | append {
script: $script_path
issues: $script_issues
})
}
}
# Print results
print_divider
print_summary $summary
print_divider
if ($issues | length) > 0 {
print "\n📋 DETAILED FINDINGS:\n"
for script_result in $issues {
print_script_issues $script_result.script $script_result.issues
}
}
# Generate report if requested
if $output != "" {
generate_report $issues $summary $output
print $"\n✓ Report saved to: ($output)"
}
# Exit code based on critical issues
if $summary.critical > 0 {
exit 1
}
}
# Audit a single script
def audit_script [path: string, verbose: bool] -> list {
if $verbose {
print $"Auditing: ($path)"
}
mut issues = []
# Read script content
let content = try {
open --raw $path
} catch {
return [{
line: 0
severity: "critical"
category: "file_access"
message: $"Cannot read file: ($path)"
suggestion: "Check file permissions"
}]
}
let lines = $content | lines
# Check 1: Missing shebang
if (($lines | first) !~ "#!/usr/bin/env nu") {
$issues = ($issues | append {
line: 1
severity: "warning"
category: "shebang"
message: "Missing or incorrect shebang"
suggestion: "Add: #!/usr/bin/env nu"
})
}
# Check 2: Old closure syntax (using $in in where/each)
for (idx, line) in ($lines | enumerate) {
let line_num = $idx + 1
# Check for old-style closures
if ($line =~ '\| where \{ \$in') or ($line =~ '\| each \{ \$in') {
$issues = ($issues | append {
line: $line_num
severity: "warning"
category: "closure_syntax"
message: "Old-style closure using $in"
suggestion: "Use explicit parameter: {|x| $x ...} instead of { $in ... }"
})
}
# Check for missing type annotations on exported functions
if ($line =~ 'export def .+\[') and not ($line =~ ': \w+') {
$issues = ($issues | append {
line: $line_num
severity: "info"
category: "type_annotations"
message: "Function parameters missing type annotations"
suggestion: "Add type annotations: [param: type]"
})
}
# Check for unwrap-like patterns (get without -i)
if ($line =~ '\| get [a-zA-Z_]') and not ($line =~ 'get -i') {
if not ($line =~ '\| get \w+ \|') {
# Potentially unsafe get (not in pipeline continuation)
$issues = ($issues | append {
line: $line_num
severity: "info"
category: "null_safety"
message: "Potentially unsafe 'get' without -i flag"
suggestion: "Use 'get -i' for safe access or add error handling"
})
}
}
# Check for hardcoded paths (common anti-pattern)
if ($line =~ '/Users/[^/]+/') or ($line =~ 'C:\\\\') {
$issues = ($issues | append {
line: $line_num
severity: "warning"
category: "hardcoded_paths"
message: "Hardcoded absolute path detected"
suggestion: "Use $env.HOME or relative paths"
})
}
# Check for missing error handling in external commands
if ($line =~ '\^[a-zA-Z_-]+') and not ($line =~ 'try \{') {
# External command not wrapped in try-catch
# Check if previous or next line has try
let has_try = if $idx > 0 {
($lines | get ($idx - 1) | str contains "try")
} else {
false
}
if not $has_try {
$issues = ($issues | append {
line: $line_num
severity: "info"
category: "error_handling"
message: "External command without error handling"
suggestion: "Wrap in try-catch block"
})
}
}
# Check for deprecated mut syntax
if ($line =~ 'let mut ') {
# This is actually fine in 0.109, just noting it
# $issues = append with info if we want to track mutable usage
}
# Check for missing return type annotations
if ($line =~ 'export def .+\]') and not ($line =~ '-> \w+') and not ($line =~ '\{$') {
$issues = ($issues | append {
line: $line_num
severity: "info"
category: "type_annotations"
message: "Function missing return type annotation"
suggestion: "Add return type: ] -> type {"
})
}
}
# Check 3: No error handling in main functions
let has_try = $content | str contains "try"
let has_catch = $content | str contains "catch"
if not ($has_try and $has_catch) {
$issues = ($issues | append {
line: 0
severity: "info"
category: "error_handling"
message: "Script may lack error handling (no try-catch found)"
suggestion: "Add try-catch blocks for robust error handling"
})
}
$issues
}
# Print header
def print_header [] {
print ""
print "╔════════════════════════════════════════════════════════╗"
print "║ Nushell 0.109+ Compatibility Audit Tool ║"
print "║ syntaxis Project - Script Quality Checker ║"
print "╚════════════════════════════════════════════════════════╝"
print ""
}
# Print divider
def print_divider [] {
print "─────────────────────────────────────────────────────────"
}
# Print summary
def print_summary [summary: record] {
print "\n📊 AUDIT SUMMARY:\n"
print $" Total scripts: ($summary.total_scripts)"
print $" Scripts with issues: ($summary.scripts_with_issues)"
print $" Total issues: ($summary.total_issues)"
print ""
print " By Severity:"
print $" (ansi red)● Critical: ($summary.critical)(ansi reset)"
print $" (ansi yellow)● Warnings: ($summary.warning)(ansi reset)"
print $" (ansi cyan)● Info: ($summary.info)(ansi reset)"
}
# Print issues for a script
def print_script_issues [script: string, issues: list] {
print $"\n(ansi cyan)📄 ($script)(ansi reset)"
for issue in $issues {
let severity_icon = match $issue.severity {
"critical" => $"(ansi red)✗(ansi reset)"
"warning" => $"(ansi yellow)⚠(ansi reset)"
"info" => $"(ansi cyan)(ansi reset)"
_ => "•"
}
let line_info = if $issue.line > 0 {
$" (Line ($issue.line))"
} else {
""
}
print $" ($severity_icon) [($issue.category)]($line_info): ($issue.message)"
print $" → ($issue.suggestion)"
}
}
# Generate markdown report
def generate_report [issues: list, summary: record, output_path: string] {
let timestamp = date now | format date "%Y-%m-%d %H:%M:%S"
mut report = $"# Nushell Script Audit Report
Generated: ($timestamp)
## Summary
- **Total Scripts**: ($summary.total_scripts)
- **Scripts with Issues**: ($summary.scripts_with_issues)
- **Total Issues**: ($summary.total_issues)
- Critical: ($summary.critical)
- Warnings: ($summary.warning)
- Info: ($summary.info)
## Detailed Findings
"
for script_result in $issues {
$report = $report + $"\n### ($script_result.script)\n\n"
for issue in $script_result.issues {
let line_ref = if $issue.line > 0 {
$" (Line ($issue.line))"
} else {
""
}
$report = $report + $"- **[($issue.severity | str upcase)] ($issue.category)**($line_ref)
- Issue: ($issue.message)
- Suggestion: ($issue.suggestion)
"
}
}
$report = $report + $"\n## Recommendations
1. Review all **critical** issues immediately
2. Address **warnings** before next release
3. Consider **info** items for code quality improvements
4. Follow guidelines in `.claude/guidelines/nushell/NUSHELL_0.109_GUIDELINES.md`
---
*Generated by syntaxis Nushell Audit Tool*
"
$report | save --force $output_path
}
# Run main if executed directly
main

View File

@ -0,0 +1,9 @@
#!/usr/bin/env nu
def test_func [path: string, --verbose] {
print $"Path: ($path)"
print $"Verbose: ($verbose)"
[]
}
test_func "test"

View File

@ -0,0 +1,7 @@
#!/usr/bin/env nu
def simple [] -> string {
"hello"
}
simple

View File

@ -0,0 +1,8 @@
#!/usr/bin/env nu
# Try colon syntax
def simple []: string {
"hello"
}
simple

View File

@ -0,0 +1,8 @@
#!/usr/bin/env nu
# Try input/output types
def simple []: string -> string {
"hello"
}
simple

Some files were not shown because too many files have changed in this diff Show More