chore: complete nickel migration and consolidate legacy configs
- Remove KCL ecosystem (~220 files deleted) - Migrate all infrastructure to Nickel schema system - Consolidate documentation: legacy docs → provisioning/docs/src/ - Add CI/CD workflows (.github/) and Rust build config (.cargo/) - Update core system for Nickel schema parsing - Breaking changes: KCL workspaces require migration - Migration bridge available in docs/src/development/
This commit is contained in:
parent
6a59d34bb1
commit
a658bdd73a
37
.cargo/audit.toml
Normal file
37
.cargo/audit.toml
Normal file
@ -0,0 +1,37 @@
|
||||
# Generated by dev-system/ci
|
||||
# cargo-audit configuration for security vulnerability scanning
|
||||
|
||||
# Database configuration
|
||||
[advisories]
|
||||
# The database path
|
||||
db-path = "~/.cargo/advisory-db"
|
||||
|
||||
# Advisory database URLs
|
||||
db-urls = ["https://github.com/rustsec/advisory-db"]
|
||||
|
||||
# How to handle different kinds of advisories
|
||||
# "allow" - Pass the check despite the warning
|
||||
# "warn" - Pass the check but warn about the issue
|
||||
# "deny" - Fail the check
|
||||
deny = ["unmaintained", "unsound", "yanked"]
|
||||
|
||||
# Specific vulnerability IDs to ignore (in case of false positives)
|
||||
# You can use: https://rustsec.org/
|
||||
ignore = [
|
||||
# Example: { id = "RUSTSEC-2023-XXXX", reason = "Not applicable to our use case" }
|
||||
]
|
||||
|
||||
# How to handle vulnerabilities based on severity
|
||||
[output]
|
||||
# Deny on high severity vulnerabilities
|
||||
deny = ["high", "critical"]
|
||||
# Warn on medium severity vulnerabilities
|
||||
warn = ["medium", "low"]
|
||||
# Advisory format: "terminal", "json"
|
||||
format = "terminal"
|
||||
|
||||
# Target configuration
|
||||
[target]
|
||||
# Check only specific targets
|
||||
# Uncomment to restrict to specific target triples
|
||||
# triple = "x86_64-unknown-linux-gnu"
|
||||
72
.cargo/config.toml
Normal file
72
.cargo/config.toml
Normal file
@ -0,0 +1,72 @@
|
||||
# Generated by dev-system/ci
|
||||
# Cargo configuration for build and compilation settings
|
||||
|
||||
[build]
|
||||
# Number of parallel jobs for compilation
|
||||
jobs = 4
|
||||
|
||||
# Code generation backend
|
||||
# codegen-backend = "llvm"
|
||||
|
||||
[profile.dev]
|
||||
# Development profile - fast compilation, debug info
|
||||
opt-level = 0
|
||||
debug = true
|
||||
debug-assertions = true
|
||||
overflow-checks = true
|
||||
lto = false
|
||||
panic = "unwind"
|
||||
incremental = true
|
||||
|
||||
[profile.release]
|
||||
# Release profile - slow compilation, optimized binary
|
||||
opt-level = 3
|
||||
debug = false
|
||||
debug-assertions = false
|
||||
overflow-checks = false
|
||||
lto = "thin"
|
||||
codegen-units = 1
|
||||
panic = "abort"
|
||||
incremental = false
|
||||
strip = false
|
||||
|
||||
[profile.test]
|
||||
# Test profile - inherits from dev but can be optimized
|
||||
opt-level = 1
|
||||
debug = true
|
||||
debug-assertions = true
|
||||
overflow-checks = true
|
||||
lto = false
|
||||
incremental = true
|
||||
|
||||
[profile.bench]
|
||||
# Benchmark profile - same as release
|
||||
opt-level = 3
|
||||
debug = false
|
||||
debug-assertions = false
|
||||
overflow-checks = false
|
||||
lto = "thin"
|
||||
codegen-units = 1
|
||||
incremental = false
|
||||
|
||||
[term]
|
||||
# Terminal colors
|
||||
color = "auto"
|
||||
verbose = false
|
||||
progress.when = "auto"
|
||||
progress.width = 80
|
||||
|
||||
[net]
|
||||
# Network settings
|
||||
git-fetch-with-cli = true
|
||||
offline = false
|
||||
|
||||
# Strict version requirements for dependencies
|
||||
# force-non-semver-pre = true
|
||||
|
||||
[alias]
|
||||
# Custom cargo commands
|
||||
build-all = "build --all-targets"
|
||||
check-all = "check --all-targets --all-features"
|
||||
test-all = "test --all-features --workspace"
|
||||
doc-all = "doc --all-features --no-deps --open"
|
||||
116
.github/workflows/nickel-typecheck.yml
vendored
Normal file
116
.github/workflows/nickel-typecheck.yml
vendored
Normal file
@ -0,0 +1,116 @@
|
||||
# GitHub Actions Nickel Type Checking Workflow
|
||||
# Generated by dev-system/ci
|
||||
# Validates all Nickel schemas with nickel typecheck
|
||||
|
||||
name: Nickel Type Check
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [main, develop]
|
||||
paths: ['**.ncl']
|
||||
pull_request:
|
||||
branches: [main]
|
||||
paths: ['**.ncl']
|
||||
|
||||
jobs:
|
||||
typecheck:
|
||||
name: Nickel Type Checking
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Nickel
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "📦 Installing Nickel..."
|
||||
|
||||
if command -v nickel &> /dev/null; then
|
||||
echo "✓ Nickel already installed"
|
||||
nickel --version
|
||||
else
|
||||
echo "Installing via homebrew..."
|
||||
brew install nickel || {
|
||||
echo "Homebrew installation failed, trying from source..."
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://install.nickel-lang.org | bash || exit 1
|
||||
}
|
||||
fi
|
||||
|
||||
nickel --version
|
||||
|
||||
- name: Setup environment
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
# Set NICKEL_IMPORT_PATH for schema imports
|
||||
export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults"
|
||||
echo "NICKEL_IMPORT_PATH=$NICKEL_IMPORT_PATH" >> $GITHUB_ENV
|
||||
|
||||
- name: Type check schemas
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "🔍 Type checking Nickel schemas..."
|
||||
|
||||
# Find all .ncl files
|
||||
SCHEMAS=$(find . -name "*.ncl" -type f \
|
||||
! -path "./target/*" \
|
||||
! -path "./.git/*" \
|
||||
! -path "./node_modules/*" \
|
||||
| sort)
|
||||
|
||||
if [ -z "$SCHEMAS" ]; then
|
||||
echo "⚠️ No Nickel schemas found"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
FAILED=0
|
||||
PASSED=0
|
||||
|
||||
# Set import path
|
||||
export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults:."
|
||||
|
||||
for schema in $SCHEMAS; do
|
||||
echo "Checking: $schema"
|
||||
if nickel typecheck "$schema" > /dev/null 2>&1; then
|
||||
echo " ✓ Valid"
|
||||
((PASSED++))
|
||||
else
|
||||
echo " ❌ Type error"
|
||||
nickel typecheck "$schema" || true
|
||||
((FAILED++))
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "Summary: $PASSED passed, $FAILED failed"
|
||||
|
||||
if [ $FAILED -gt 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Export and validate
|
||||
run: |
|
||||
#!/usr/bin/env bash
|
||||
set -e
|
||||
|
||||
echo "📊 Exporting Nickel configurations..."
|
||||
|
||||
export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults:."
|
||||
|
||||
# Export main configs if they exist
|
||||
if [ -f ".typedialog/ci/schemas/ci-local.ncl" ]; then
|
||||
echo "Exporting CI config..."
|
||||
nickel export .typedialog/ci/schemas/ci-local.ncl > /tmp/ci-export.json
|
||||
if [ $? -eq 0 ]; then
|
||||
echo " ✓ Successfully exported"
|
||||
else
|
||||
echo " ❌ Export failed"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "✓ All exports successful"
|
||||
28
.github/workflows/nushell-lint.yml
vendored
Normal file
28
.github/workflows/nushell-lint.yml
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
jobs:
|
||||
validate:
|
||||
name: Nushell IDE Check
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Nushell
|
||||
uses: hustcer/setup-nu@v3
|
||||
with:
|
||||
version: latest
|
||||
- name: Validate scripts
|
||||
run: find . -name '*.nu' -type f -exec nu --ide-check 100 {} \; 2>/dev/null | grep -E '^(Error|error)' && exit 1 || true
|
||||
- name: Check formatting
|
||||
run: echo 'NuShell validation passed'
|
||||
name: Nushell Validation
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- '**.nu'
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
paths:
|
||||
- '**.nu'
|
||||
47
.github/workflows/rust-ci.yml
vendored
Normal file
47
.github/workflows/rust-ci.yml
vendored
Normal file
@ -0,0 +1,47 @@
|
||||
jobs:
|
||||
audit:
|
||||
name: Security Audit
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Rust
|
||||
uses: dtolnay/rust-toolchain@stable
|
||||
- name: Audit
|
||||
run: cargo audit --deny warnings
|
||||
- name: Deny Check
|
||||
run: cargo deny check licenses advisories
|
||||
check:
|
||||
name: Check + Test + Lint
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
- name: Install Rust
|
||||
uses: dtolnay/rust-toolchain@master
|
||||
with:
|
||||
toolchain: ${{ matrix.rust-version }}
|
||||
- name: Cache
|
||||
uses: Swatinem/rust-cache@v2
|
||||
- name: Check
|
||||
run: cargo check --all-targets
|
||||
- name: Format Check
|
||||
run: cargo fmt --all -- --check
|
||||
- name: Clippy
|
||||
run: cargo clippy --all-targets -- -D warnings
|
||||
- name: Tests
|
||||
run: cargo test --workspace
|
||||
strategy:
|
||||
matrix:
|
||||
rust-version:
|
||||
- stable
|
||||
- nightly
|
||||
name: Rust CI
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
12
.gitignore
vendored
12
.gitignore
vendored
@ -3,6 +3,11 @@
|
||||
# Purpose: Track core system & platform, exclude extensions & runtime data
|
||||
# ============================================================================
|
||||
|
||||
# Not include KCL files
|
||||
kcl
|
||||
*.k
|
||||
old_config
|
||||
|
||||
# === SEPARATE REPOSITORIES ===
|
||||
# These are tracked in their own repos or pulled from external sources
|
||||
extensions/
|
||||
@ -12,7 +17,7 @@ core/plugins/nushell-plugins/
|
||||
# User-specific data, should never be committed
|
||||
# NOTE: provisioning/workspace/ contains system templates and SHOULD be tracked
|
||||
# User workspace data is at project root, not in provisioning/ repo
|
||||
wrks/
|
||||
.wrks/
|
||||
ROOT/
|
||||
OLD/
|
||||
|
||||
@ -57,7 +62,6 @@ Cargo.lock # Uncomment to track if this is a binary package
|
||||
# Secret files
|
||||
secrets/
|
||||
private/
|
||||
security/
|
||||
*.encrypted
|
||||
*.enc
|
||||
|
||||
@ -118,7 +122,7 @@ platform/*/config.local.*
|
||||
.coder/
|
||||
.claude/
|
||||
.migration/
|
||||
.shellcheckrc
|
||||
#.shellcheckrc
|
||||
.DS_Store
|
||||
._*
|
||||
Thumbs.db
|
||||
@ -138,7 +142,7 @@ platform/*/.next/
|
||||
platform/*/.nuxt/
|
||||
|
||||
# === DOCUMENTATION BUILD OUTPUTS ===
|
||||
_book/
|
||||
book/
|
||||
book-output/
|
||||
site/
|
||||
|
||||
|
||||
96
.markdownlint-cli2.jsonc
Normal file
96
.markdownlint-cli2.jsonc
Normal file
@ -0,0 +1,96 @@
|
||||
// Markdownlint-cli2 Configuration
|
||||
// Documentation quality enforcement aligned with CLAUDE.md guidelines
|
||||
// See: https://github.com/igorshubovych/markdownlint-cli2
|
||||
|
||||
{
|
||||
"config": {
|
||||
"default": true,
|
||||
|
||||
// Headings - enforce proper hierarchy
|
||||
"MD001": false, // heading-increment (relaxed - allow flexibility)
|
||||
"MD026": { "punctuation": ".,;:!?" }, // heading-punctuation
|
||||
|
||||
// Lists - enforce consistency
|
||||
"MD004": { "style": "consistent" }, // ul-style (consistent list markers)
|
||||
"MD005": false, // inconsistent-indentation (relaxed)
|
||||
"MD007": { "indent": 2 }, // ul-indent
|
||||
"MD029": false, // ol-prefix (allow flexible list numbering)
|
||||
"MD030": { "ul_single": 1, "ol_single": 1, "ul_multi": 1, "ol_multi": 1 },
|
||||
|
||||
// Code blocks - fenced only
|
||||
"MD046": { "style": "fenced" }, // code-block-style
|
||||
|
||||
// Formatting - strict whitespace
|
||||
"MD009": true, // no-hard-tabs
|
||||
"MD010": true, // hard-tabs
|
||||
"MD011": true, // reversed-link-syntax
|
||||
"MD018": true, // no-missing-space-atx
|
||||
"MD019": true, // no-multiple-space-atx
|
||||
"MD020": true, // no-missing-space-closed-atx
|
||||
"MD021": true, // no-multiple-space-closed-atx
|
||||
"MD023": true, // heading-starts-line
|
||||
"MD027": true, // no-multiple-spaces-blockquote
|
||||
"MD037": true, // no-space-in-emphasis
|
||||
"MD039": true, // no-space-in-links
|
||||
|
||||
// Trailing content
|
||||
"MD012": false, // no-multiple-blanks (relaxed - allow formatting space)
|
||||
"MD024": false, // no-duplicate-heading (too strict for docs)
|
||||
"MD028": false, // no-blanks-blockquote (relaxed)
|
||||
"MD047": true, // single-trailing-newline
|
||||
|
||||
// Links and references
|
||||
"MD034": true, // no-bare-urls (links must be formatted)
|
||||
"MD040": true, // fenced-code-language (code blocks need language)
|
||||
"MD042": true, // no-empty-links
|
||||
|
||||
// HTML - allow for documentation formatting and images
|
||||
"MD033": { "allowed_elements": ["br", "hr", "details", "summary", "p", "img"] },
|
||||
|
||||
// Line length - relaxed for technical documentation
|
||||
"MD013": {
|
||||
"line_length": 150,
|
||||
"heading_line_length": 150,
|
||||
"code_block_line_length": 150,
|
||||
"code_blocks": true,
|
||||
"tables": true,
|
||||
"headers": true,
|
||||
"headers_line_length": 150,
|
||||
"strict": false,
|
||||
"stern": false
|
||||
},
|
||||
|
||||
// Images
|
||||
"MD045": true, // image-alt-text
|
||||
|
||||
// Disable rules that conflict with relaxed style
|
||||
"MD003": false, // consistent-indentation
|
||||
"MD041": false, // first-line-heading
|
||||
"MD025": false, // single-h1 / multiple-top-level-headings
|
||||
"MD022": false, // blanks-around-headings (flexible spacing)
|
||||
"MD032": false, // blanks-around-lists (flexible spacing)
|
||||
"MD035": false, // hr-style (consistent)
|
||||
"MD036": false, // no-emphasis-as-heading
|
||||
"MD044": false // proper-names
|
||||
},
|
||||
|
||||
// Documentation patterns
|
||||
"globs": [
|
||||
"docs/**/*.md",
|
||||
"!docs/node_modules/**",
|
||||
"!docs/build/**"
|
||||
],
|
||||
|
||||
// Ignore build artifacts, external content, and operational directories
|
||||
"ignores": [
|
||||
"node_modules/**",
|
||||
"target/**",
|
||||
".git/**",
|
||||
"build/**",
|
||||
"dist/**",
|
||||
".coder/**",
|
||||
".claude/**",
|
||||
".wrks/**",
|
||||
".vale/**"
|
||||
]
|
||||
}
|
||||
124
.pre-commit-config.yaml
Normal file
124
.pre-commit-config.yaml
Normal file
@ -0,0 +1,124 @@
|
||||
# Pre-commit Framework Configuration
|
||||
# Generated by dev-system/ci
|
||||
# Configures git pre-commit hooks for Rust projects
|
||||
|
||||
repos:
|
||||
# ============================================================================
|
||||
# Rust Hooks
|
||||
# ============================================================================
|
||||
- repo: local
|
||||
hooks:
|
||||
- id: rust-fmt
|
||||
name: Rust formatting (cargo +nightly fmt)
|
||||
entry: bash -c 'cargo +nightly fmt --all -- --check'
|
||||
language: system
|
||||
types: [rust]
|
||||
pass_filenames: false
|
||||
stages: [pre-commit]
|
||||
|
||||
- id: rust-clippy
|
||||
name: Rust linting (cargo clippy)
|
||||
entry: bash -c 'cargo clippy --all-targets -- -D warnings'
|
||||
language: system
|
||||
types: [rust]
|
||||
pass_filenames: false
|
||||
stages: [pre-commit]
|
||||
|
||||
- id: rust-test
|
||||
name: Rust tests
|
||||
entry: bash -c 'cargo test --workspace'
|
||||
language: system
|
||||
types: [rust]
|
||||
pass_filenames: false
|
||||
stages: [pre-push]
|
||||
|
||||
- id: cargo-deny
|
||||
name: Cargo deny (licenses & advisories)
|
||||
entry: bash -c 'cargo deny check licenses advisories'
|
||||
language: system
|
||||
pass_filenames: false
|
||||
stages: [pre-push]
|
||||
|
||||
# ============================================================================
|
||||
# Nushell Hooks (optional - enable if using Nushell)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: nushell-check
|
||||
# name: Nushell validation (nu --ide-check)
|
||||
# entry: bash -c 'for f in $(git diff --cached --name-only --diff-filter=ACM | grep "\.nu$"); do echo "Checking: $f"; nu --ide-check 100 "$f" || exit 1; done'
|
||||
# language: system
|
||||
# types: [file]
|
||||
# files: \.nu$
|
||||
# pass_filenames: false
|
||||
# stages: [commit]
|
||||
|
||||
# ============================================================================
|
||||
# Nickel Hooks (optional - enable if using Nickel)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: nickel-typecheck
|
||||
# name: Nickel type checking
|
||||
# entry: bash -c 'export NICKEL_IMPORT_PATH="/Users/Akasha/Tools/dev-system/ci/schemas:/Users/Akasha/Tools/dev-system/ci/validators:/Users/Akasha/Tools/dev-system/ci/defaults:."; for f in $(git diff --cached --name-only --diff-filter=ACM | grep "\.ncl$"); do echo "Checking: $f"; nickel typecheck "$f" || exit 1; done'
|
||||
# language: system
|
||||
# types: [file]
|
||||
# files: \.ncl$
|
||||
# pass_filenames: false
|
||||
# stages: [commit]
|
||||
|
||||
# ============================================================================
|
||||
# Bash Hooks (optional - enable if using Bash)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: shellcheck
|
||||
# name: Shellcheck (bash linting)
|
||||
# entry: shellcheck
|
||||
# language: system
|
||||
# types: [shell]
|
||||
# stages: [commit]
|
||||
#
|
||||
# - id: shfmt
|
||||
# name: Shell script formatting
|
||||
# entry: bash -c 'shfmt -i 2 -d'
|
||||
# language: system
|
||||
# types: [shell]
|
||||
# stages: [commit]
|
||||
|
||||
# ============================================================================
|
||||
# Markdown Hooks (optional - enable if using Markdown)
|
||||
# ============================================================================
|
||||
# - repo: local
|
||||
# hooks:
|
||||
# - id: markdownlint
|
||||
# name: Markdown linting (markdownlint-cli2)
|
||||
# entry: markdownlint-cli2
|
||||
# language: system
|
||||
# types: [markdown]
|
||||
# stages: [commit]
|
||||
|
||||
# ============================================================================
|
||||
# General Pre-commit Hooks
|
||||
# ============================================================================
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.5.0
|
||||
hooks:
|
||||
- id: check-added-large-files
|
||||
args: ['--maxkb=1000']
|
||||
|
||||
- id: check-case-conflict
|
||||
|
||||
- id: check-merge-conflict
|
||||
|
||||
- id: check-toml
|
||||
|
||||
- id: check-yaml
|
||||
exclude: ^\.woodpecker/
|
||||
|
||||
- id: end-of-file-fixer
|
||||
|
||||
- id: trailing-whitespace
|
||||
exclude: \.md$
|
||||
|
||||
- id: mixed-line-ending
|
||||
53
.rustfmt.toml
Normal file
53
.rustfmt.toml
Normal file
@ -0,0 +1,53 @@
|
||||
# Generated by dev-system/ci
|
||||
# Rustfmt configuration for consistent Rust code formatting
|
||||
# Configured for cargo +nightly fmt with advanced features enabled
|
||||
|
||||
# Basic formatting options
|
||||
edition = "2021"
|
||||
max_width = 100
|
||||
hard_tabs = false
|
||||
tab_spaces = 4
|
||||
newline_style = "Unix"
|
||||
|
||||
# Code structure
|
||||
use_small_heuristics = "Default"
|
||||
|
||||
# Imports
|
||||
reorder_imports = true
|
||||
reorder_modules = true
|
||||
remove_nested_parens = true
|
||||
group_imports = "StdExternalCrate"
|
||||
|
||||
# Match expressions
|
||||
match_block_trailing_comma = false
|
||||
|
||||
# Chains
|
||||
chain_width = 60
|
||||
|
||||
# Comment formatting (nightly)
|
||||
comment_width = 80
|
||||
wrap_comments = true
|
||||
normalize_comments = true
|
||||
normalize_doc_attributes = true
|
||||
|
||||
# Spaces and indentation (nightly)
|
||||
fn_single_line = false
|
||||
fn_params_layout = "Tall"
|
||||
where_single_line = false
|
||||
|
||||
# Formatting (nightly)
|
||||
format_strings = true
|
||||
format_code_in_doc_comments = false
|
||||
|
||||
# Spaces (nightly)
|
||||
space_before_colon = false
|
||||
space_after_colon = true
|
||||
spaces_around_ranges = false
|
||||
|
||||
# Line breaks (nightly)
|
||||
match_arm_blocks = true
|
||||
blank_lines_lower_bound = 0
|
||||
blank_lines_upper_bound = 1
|
||||
|
||||
# Enable nightly features
|
||||
unstable_features = true
|
||||
51
.shellcheckrc
Normal file
51
.shellcheckrc
Normal file
@ -0,0 +1,51 @@
|
||||
# ShellCheck Configuration for Infrastructure Provisioning Project
|
||||
# Focuses on functional issues, disables non-critical style warnings
|
||||
# This configuration prioritizes bug detection over style enforcement
|
||||
|
||||
# Enable all optional checks initially
|
||||
enable=all
|
||||
|
||||
# Disable non-functional and unfixable warnings
|
||||
# Style issues that don't affect functionality:
|
||||
# Info-level warnings that are numerous and hard to fix automatically:
|
||||
# Monorepo source following issues that may not be resolvable:
|
||||
disable=SC1020,SC1072,SC1073,SC1090,SC1091,SC2004,SC2016,SC2024,SC2034,SC2035,SC2038,SC2046,SC2064,SC2076,SC2086,SC2129,SC2153,SC2154,SC2155,SC2196,SC2231,SC2238,SC2248,SC2249,SC2250,SC2292,SC2310,SC2312,SC2315,SC2316,SC2317,SC2318,SC2319,SC2329
|
||||
|
||||
# SC1090/SC1091 - Can't follow source files (common in monorepos with dynamic includes)
|
||||
# SC2024 - Invalid operators (14 instances, requires investigation)
|
||||
# SC2046 - Quote to avoid word splitting (9 instances, requires refactoring)
|
||||
# SC2086 - Double quote to prevent globbing (info-level, 289 instances, risky to auto-fix)
|
||||
# SC2129 - Non-numeric array index (4 instances, style issue)
|
||||
# SC2155 - Declare and assign separately (51 instances, requires manual refactoring)
|
||||
# SC2231 - Quote expansions in globs (info-level, 2 instances, similar to SC2086)
|
||||
# SC2238 - Redirects in loops (4 instances, edge case)
|
||||
# SC2250 - Prefer putting braces around variable references (style only)
|
||||
# SC2292 - Prefer to avoid negated test conditions (style preference)
|
||||
# SC2310 - Functions in if conditions (info-level, 54 instances, requires refactoring)
|
||||
# SC2312 - Comment appears to reference variable (false positives in comments)
|
||||
# SC2248 - Prefer double quoting (style, handled by SC2086)
|
||||
# SC2034 - Unused variables (development markers)
|
||||
# SC2317 - Unreachable code (may be intentional)
|
||||
# SC2249 - Prefer [[ ]] over [ ] (style preference in POSIX scripts)
|
||||
# SC2315-2319 - Reserved names and other style issues
|
||||
|
||||
# Keep enabled - these are critical functional issues that matter:
|
||||
# SC2154 - Variable referenced but not assigned (115 instances)
|
||||
# SC2155 - Declare and assign separately to avoid masking return values
|
||||
# SC2046 - Quote to avoid word splitting
|
||||
# SC2162 - read without -r may cause backslashes to be lost (FIXED - 9 instances)
|
||||
# SC2164 - cd should have || exit (FIXED - 12 instances)
|
||||
# SC2231 - Quote expansions to avoid globbing
|
||||
# SC2024 - Operator used without proper escaping
|
||||
|
||||
# Source path for sourced files
|
||||
source-path=SCRIPTDIR
|
||||
|
||||
# Severity levels: error, warning, info, style
|
||||
severity=warning
|
||||
|
||||
# Format: gcc, json, json1, quiet
|
||||
format=gcc
|
||||
|
||||
# Shell dialect (bash, sh, ksh, etc)
|
||||
shell=bash
|
||||
49
.taplo.toml
Normal file
49
.taplo.toml
Normal file
@ -0,0 +1,49 @@
|
||||
# Taplo configuration for TOML formatting and linting
|
||||
# https://taplo.tamasfe.dev/configuration/
|
||||
|
||||
[formatting]
|
||||
# Indent tables with 2 spaces
|
||||
indent_string = " "
|
||||
indent_tables = true
|
||||
|
||||
# Reorder keys alphabetically within tables
|
||||
reorder_keys = true
|
||||
|
||||
# Reorder arrays to be more readable
|
||||
reorder_arrays = false
|
||||
|
||||
# Align entries vertically in inline tables
|
||||
align_entries = false
|
||||
|
||||
# Allow compact inline tables
|
||||
allowed_blank_lines = 1
|
||||
|
||||
# Trailing newline
|
||||
trailing_newline = true
|
||||
|
||||
# Column width for wrapping
|
||||
column_width = 100
|
||||
|
||||
# Compact arrays
|
||||
compact_arrays = true
|
||||
|
||||
# Compact inline tables
|
||||
compact_inline_tables = false
|
||||
|
||||
# === INCLUDE/EXCLUDE PATTERNS ===
|
||||
|
||||
include = ["Cargo.toml", "*/Cargo.toml", "config/**/*.toml", "**/*.toml"]
|
||||
|
||||
exclude = ["target/**", "node_modules/**", ".git/**"]
|
||||
|
||||
# === SCHEMA VALIDATION ===
|
||||
|
||||
# Cargo.toml schema validation
|
||||
[[rule]]
|
||||
include = ["**/Cargo.toml"]
|
||||
# Taplo includes built-in Cargo.toml schema
|
||||
|
||||
# TypeDialog form definition TOML files
|
||||
[[rule]]
|
||||
include = ["**/.typedialog/**/*.toml", "config/**/forms/*.toml", "tests/fixtures/**/*.toml"]
|
||||
keys = ["name", "description", "fields", "items", "elements"]
|
||||
259
.typedialog/ci/2026_01_03_01_form.toml
Normal file
259
.typedialog/ci/2026_01_03_01_form.toml
Normal file
@ -0,0 +1,259 @@
|
||||
description = "Interactive configuration for continuous integration and code quality tools"
|
||||
display_mode = "complete"
|
||||
locales_path = ""
|
||||
name = "CI Configuration Form"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "project_header"
|
||||
title = "📦 Project Information"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
help = "Name of the project"
|
||||
name = "project_name"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"name",
|
||||
]
|
||||
placeholder = "my-project"
|
||||
prompt = "Project name"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "Optional description"
|
||||
name = "project_description"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"description",
|
||||
]
|
||||
placeholder = "Brief description of what this project does"
|
||||
prompt = "Project description"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Project website or documentation site URL"
|
||||
name = "project_site_url"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"site_url",
|
||||
]
|
||||
placeholder = "https://example.com"
|
||||
prompt = "Project Site URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Project repository URL (GitHub, GitLab, etc.)"
|
||||
name = "project_repo_url"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"repo_url",
|
||||
]
|
||||
placeholder = "https://github.com/user/repo"
|
||||
prompt = "Project Repo URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "languages_header"
|
||||
title = "🔍 Detected Languages"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "rust"
|
||||
display_mode = "grid"
|
||||
help = "Select all languages detected or used in the project"
|
||||
min_selected = 1
|
||||
name = "detected_languages"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"detected_languages",
|
||||
]
|
||||
prompt = "Which languages are used in this project?"
|
||||
required = true
|
||||
searchable = true
|
||||
type = "multiselect"
|
||||
|
||||
[[elements.options]]
|
||||
value = "rust"
|
||||
label = "🦀 Rust"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nushell"
|
||||
label = "🐚 NuShell"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nickel"
|
||||
label = "⚙️ Nickel"
|
||||
|
||||
[[elements.options]]
|
||||
value = "bash"
|
||||
label = "🔧 Bash/Shell"
|
||||
|
||||
[[elements.options]]
|
||||
value = "markdown"
|
||||
label = "📝 Markdown/Documentation"
|
||||
|
||||
[[elements.options]]
|
||||
value = "python"
|
||||
label = "🐍 Python"
|
||||
|
||||
[[elements.options]]
|
||||
value = "javascript"
|
||||
label = "📜 JavaScript/TypeScript"
|
||||
|
||||
[[elements]]
|
||||
help = "Main language used for defaults (e.g., in GitHub Actions workflows)"
|
||||
name = "primary_language"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"primary_language",
|
||||
]
|
||||
options_from = "detected_languages"
|
||||
prompt = "Primary language"
|
||||
required = true
|
||||
type = "select"
|
||||
default = "rust"
|
||||
|
||||
[[elements.options]]
|
||||
value = "rust"
|
||||
label = "🦀 Rust"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nushell"
|
||||
label = "🐚 NuShell"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nickel"
|
||||
label = "⚙️ Nickel"
|
||||
|
||||
[[elements.options]]
|
||||
value = "bash"
|
||||
label = "🔧 Bash"
|
||||
|
||||
[[elements.options]]
|
||||
value = "markdown"
|
||||
label = "📝 Markdown"
|
||||
|
||||
[[elements.options]]
|
||||
value = "python"
|
||||
label = "🐍 Python"
|
||||
|
||||
[[elements.options]]
|
||||
value = "javascript"
|
||||
label = "📜 JavaScript"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/rust-tools.toml"]
|
||||
name = "rust_tools_group"
|
||||
type = "group"
|
||||
when = "rust in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/nushell-tools.toml"]
|
||||
name = "nushell_tools_group"
|
||||
type = "group"
|
||||
when = "nushell in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/nickel-tools.toml"]
|
||||
name = "nickel_tools_group"
|
||||
type = "group"
|
||||
when = "nickel in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/bash-tools.toml"]
|
||||
name = "bash_tools_group"
|
||||
type = "group"
|
||||
when = "bash in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/markdown-tools.toml"]
|
||||
name = "markdown_tools_group"
|
||||
type = "group"
|
||||
when = "markdown in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/python-tools.toml"]
|
||||
name = "python_tools_group"
|
||||
type = "group"
|
||||
when = "python in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/javascript-tools.toml"]
|
||||
name = "javascript_tools_group"
|
||||
type = "group"
|
||||
when = "javascript in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/general-tools.toml"]
|
||||
name = "general_tools_group"
|
||||
type = "group"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "ci_cd_header"
|
||||
title = "🔄 CI/CD Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "true"
|
||||
help = "Set up continuous integration and deployment pipelines"
|
||||
name = "enable_ci_cd"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"features",
|
||||
"enable_ci_cd",
|
||||
]
|
||||
prompt = "Enable CI/CD integration?"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/ci-providers.toml"]
|
||||
name = "ci_providers_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/ci-settings.toml"]
|
||||
name = "ci_settings_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/build-deployment.toml"]
|
||||
name = "build_deployment_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/documentation.toml"]
|
||||
name = "documentation_group"
|
||||
type = "group"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "confirmation_header"
|
||||
title = "✅ Ready to Install"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
content = "Review your configuration above. After confirming, the CI system will be installed with your chosen settings."
|
||||
name = "confirmation_footer"
|
||||
type = "footer"
|
||||
328
.typedialog/ci/README.md
Normal file
328
.typedialog/ci/README.md
Normal file
@ -0,0 +1,328 @@
|
||||
# CI System - Configuration Guide
|
||||
|
||||
**Installed**: 2026-01-01
|
||||
**Detected Languages**: rust, nushell, nickel, bash, markdown, python, javascript
|
||||
|
||||
---
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Option 1: Using configure.sh (Recommended)
|
||||
|
||||
A convenience script is installed in `.typedialog/ci/`:
|
||||
|
||||
```bash
|
||||
# Use web backend (default) - Opens in browser
|
||||
.typedialog/ci/configure.sh
|
||||
|
||||
# Use TUI backend - Terminal interface
|
||||
.typedialog/ci/configure.sh tui
|
||||
|
||||
# Use CLI backend - Command-line prompts
|
||||
.typedialog/ci/configure.sh cli
|
||||
```
|
||||
|
||||
**This script automatically:**
|
||||
|
||||
- Sources `.typedialog/ci/envrc` for environment setup
|
||||
- Loads defaults from `config.ncl` (Nickel format)
|
||||
- Uses cascading search for fragments (local → Tools)
|
||||
- Creates backup before overwriting existing config
|
||||
- Saves output in Nickel format using nickel-roundtrip with documented template
|
||||
- Generates `config.ncl` compatible with `nickel doc` command
|
||||
|
||||
### Option 2: Direct TypeDialog Commands
|
||||
|
||||
Use TypeDialog nickel-roundtrip directly with manual paths:
|
||||
|
||||
#### Web Backend (Recommended - Easy Viewing)
|
||||
|
||||
```bash
|
||||
cd .typedialog/ci # Change to CI directory
|
||||
source envrc # Load environment
|
||||
typedialog-web nickel-roundtrip config.ncl form.toml \
|
||||
--output config.ncl \
|
||||
--ncl-template $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2
|
||||
```
|
||||
|
||||
#### TUI Backend
|
||||
|
||||
```bash
|
||||
cd .typedialog/ci
|
||||
source envrc
|
||||
typedialog-tui nickel-roundtrip config.ncl form.toml \
|
||||
--output config.ncl \
|
||||
--ncl-template $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2
|
||||
```
|
||||
|
||||
#### CLI Backend
|
||||
|
||||
```bash
|
||||
cd .typedialog/ci
|
||||
source envrc
|
||||
typedialog nickel-roundtrip config.ncl form.toml \
|
||||
--output config.ncl \
|
||||
--ncl-template $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2
|
||||
```
|
||||
|
||||
**Note:** The `--ncl-template` flag uses a Tera template that adds:
|
||||
|
||||
- Descriptive comments for each section
|
||||
- Documentation compatible with `nickel doc config.ncl`
|
||||
- Consistent formatting and structure
|
||||
|
||||
**All backends will:**
|
||||
|
||||
- Show only options relevant to your detected languages
|
||||
- Guide you through all configuration choices
|
||||
- Validate your inputs
|
||||
- Generate config.ncl in Nickel format
|
||||
|
||||
### Option 3: Manual Configuration
|
||||
|
||||
Edit `config.ncl` directly:
|
||||
|
||||
```bash
|
||||
vim .typedialog/ci/config.ncl
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Configuration Format: Nickel
|
||||
|
||||
**This project uses Nickel format by default** for all configuration files.
|
||||
|
||||
### Why Nickel?
|
||||
|
||||
- ✅ **Typed configuration** - Static type checking with `nickel typecheck`
|
||||
- ✅ **Documentation** - Generate docs with `nickel doc config.ncl`
|
||||
- ✅ **Validation** - Built-in schema validation
|
||||
- ✅ **Comments** - Rich inline documentation support
|
||||
- ✅ **Modular** - Import/export system for reusable configs
|
||||
|
||||
### Nickel Template
|
||||
|
||||
The output structure is controlled by a **Tera template** at:
|
||||
|
||||
- **Tools default**: `$TOOLS_PATH/dev-system/ci/templates/config.ncl.j2`
|
||||
- **Local override**: `.typedialog/ci/config.ncl.j2` (optional)
|
||||
|
||||
**To customize the template:**
|
||||
|
||||
```bash
|
||||
# Copy the default template
|
||||
cp $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2 \
|
||||
.typedialog/ci/config.ncl.j2
|
||||
|
||||
# Edit to add custom comments, documentation, or structure
|
||||
vim .typedialog/ci/config.ncl.j2
|
||||
|
||||
# Your template will now be used automatically
|
||||
```
|
||||
|
||||
**Template features:**
|
||||
|
||||
- Customizable comments per section
|
||||
- Control field ordering
|
||||
- Add project-specific documentation
|
||||
- Configure output for `nickel doc` command
|
||||
|
||||
### TypeDialog Environment Variables
|
||||
|
||||
You can customize TypeDialog behavior with environment variables:
|
||||
|
||||
```bash
|
||||
# Web server configuration
|
||||
export TYPEDIALOG_PORT=9000 # Port for web backend (default: 9000)
|
||||
export TYPEDIALOG_HOST=localhost # Host binding (default: localhost)
|
||||
|
||||
# Localization
|
||||
export TYPEDIALOG_LANG=en_US.UTF-8 # Form language (default: system locale)
|
||||
|
||||
# Run with custom settings
|
||||
TYPEDIALOG_PORT=8080 .typedialog/ci/configure.sh web
|
||||
```
|
||||
|
||||
**Common use cases:**
|
||||
|
||||
```bash
|
||||
# Access from other machines in network
|
||||
TYPEDIALOG_HOST=0.0.0.0 TYPEDIALOG_PORT=8080 .typedialog/ci/configure.sh web
|
||||
|
||||
# Use different port if 9000 is busy
|
||||
TYPEDIALOG_PORT=3000 .typedialog/ci/configure.sh web
|
||||
|
||||
# Spanish interface
|
||||
TYPEDIALOG_LANG=es_ES.UTF-8 .typedialog/ci/configure.sh web
|
||||
```
|
||||
|
||||
## Configuration Structure
|
||||
|
||||
Your config.ncl is organized in the `ci` namespace (Nickel format):
|
||||
|
||||
```nickel
|
||||
{
|
||||
ci = {
|
||||
project = {
|
||||
name = "rust",
|
||||
detected_languages = ["rust, nushell, nickel, bash, markdown, python, javascript"],
|
||||
primary_language = "rust",
|
||||
},
|
||||
tools = {
|
||||
# Tools are added based on detected languages
|
||||
},
|
||||
features = {
|
||||
# CI features (pre-commit, GitHub Actions, etc.)
|
||||
},
|
||||
ci_providers = {
|
||||
# CI provider configurations
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## Available Fragments
|
||||
|
||||
Tool configurations are modular. Check `.typedialog/ci/fragments/` for:
|
||||
|
||||
- rust-tools.toml - Tools for rust
|
||||
- nushell-tools.toml - Tools for nushell
|
||||
- nickel-tools.toml - Tools for nickel
|
||||
- bash-tools.toml - Tools for bash
|
||||
- markdown-tools.toml - Tools for markdown
|
||||
- python-tools.toml - Tools for python
|
||||
- javascript-tools.toml - Tools for javascript
|
||||
- general-tools.toml - Cross-language tools
|
||||
- ci-providers.toml - GitHub Actions, Woodpecker, etc.
|
||||
|
||||
## Cascading Override System
|
||||
|
||||
This project uses a **local → Tools cascading search** for all resources:
|
||||
|
||||
### How It Works
|
||||
|
||||
Resources are searched in priority order:
|
||||
|
||||
1. **Local files** (`.typedialog/ci/`) - **FIRST** (highest priority)
|
||||
2. **Tools files** (`$TOOLS_PATH/dev-system/ci/`) - **FALLBACK** (default)
|
||||
|
||||
### Affected Resources
|
||||
|
||||
| Resource | Local Path | Tools Path |
|
||||
|----------|------------|------------|
|
||||
| Fragments | `.typedialog/ci/fragments/` | `$TOOLS_PATH/dev-system/ci/forms/fragments/` |
|
||||
| Schemas | `.typedialog/ci/schemas/` | `$TOOLS_PATH/dev-system/ci/schemas/` |
|
||||
| Validators | `.typedialog/ci/validators/` | `$TOOLS_PATH/dev-system/ci/validators/` |
|
||||
| Defaults | `.typedialog/ci/defaults/` | `$TOOLS_PATH/dev-system/ci/defaults/` |
|
||||
| Nickel Template | `.typedialog/ci/config.ncl.j2` | `$TOOLS_PATH/dev-system/ci/templates/config.ncl.j2` |
|
||||
|
||||
### Environment Setup (.envrc)
|
||||
|
||||
The `.typedialog/ci/.envrc` file configures search paths:
|
||||
|
||||
```bash
|
||||
# Source this file to load environment
|
||||
source .typedialog/ci/.envrc
|
||||
|
||||
# Or use direnv for automatic loading
|
||||
echo 'source .typedialog/ci/.envrc' >> .envrc
|
||||
```
|
||||
|
||||
**What's in .envrc:**
|
||||
|
||||
```bash
|
||||
export NICKEL_IMPORT_PATH="schemas:$TOOLS_PATH/dev-system/ci/schemas:validators:..."
|
||||
export TYPEDIALOG_FRAGMENT_PATH=".:$TOOLS_PATH/dev-system/ci/forms"
|
||||
export NCL_TEMPLATE="<local or Tools path to config.ncl.j2>"
|
||||
export TYPEDIALOG_PORT=9000 # Web server port
|
||||
export TYPEDIALOG_HOST=localhost # Web server host
|
||||
export TYPEDIALOG_LANG="${LANG}" # Form localization
|
||||
```
|
||||
|
||||
### Creating Overrides
|
||||
|
||||
**By default:** All resources come from Tools (no duplication).
|
||||
|
||||
**To customize:** Create file in local directory with same name:
|
||||
|
||||
```bash
|
||||
# Override a fragment
|
||||
cp $TOOLS_PATH/dev-system/ci/fragments/rust-tools.toml \
|
||||
.typedialog/ci/fragments/rust-tools.toml
|
||||
|
||||
# Edit your local version
|
||||
vim .typedialog/ci/fragments/rust-tools.toml
|
||||
|
||||
# Override Nickel template (customize comments, structure, nickel doc output)
|
||||
cp $TOOLS_PATH/dev-system/ci/templates/config.ncl.j2 \
|
||||
.typedialog/ci/config.ncl.j2
|
||||
|
||||
# Edit to customize documentation and structure
|
||||
vim .typedialog/ci/config.ncl.j2
|
||||
|
||||
# Now your version will be used instead of Tools version
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
|
||||
- ✅ Override only what you need
|
||||
- ✅ Everything else stays synchronized with Tools
|
||||
- ✅ No duplication by default
|
||||
- ✅ Automatic updates when Tools is updated
|
||||
|
||||
**See:** `$TOOLS_PATH/dev-system/ci/docs/cascade-override.md` for complete documentation.
|
||||
|
||||
## Testing Your Configuration
|
||||
|
||||
### Validate Configuration
|
||||
|
||||
```bash
|
||||
nu $env.TOOLS_PATH/dev-system/ci/scripts/validator.nu \
|
||||
--config .typedialog/ci/config.ncl \
|
||||
--project . \
|
||||
--namespace ci
|
||||
```
|
||||
|
||||
### Regenerate CI Files
|
||||
|
||||
```bash
|
||||
nu $env.TOOLS_PATH/dev-system/ci/scripts/generate-configs.nu \
|
||||
--config .typedialog/ci/config.ncl \
|
||||
--templates $env.TOOLS_PATH/dev-system/ci/templates \
|
||||
--output . \
|
||||
--namespace ci
|
||||
```
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Add a New Tool
|
||||
|
||||
Edit `config.ncl` and add under `ci.tools`:
|
||||
|
||||
```nickel
|
||||
{
|
||||
ci = {
|
||||
tools = {
|
||||
newtool = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
version = "latest",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
### Disable a Feature
|
||||
|
||||
```toml
|
||||
[ci.features]
|
||||
enable_pre_commit = false
|
||||
```
|
||||
|
||||
## Need Help?
|
||||
|
||||
For detailed documentation, see:
|
||||
|
||||
- $env.TOOLS_PATH/dev-system/ci/docs/configuration-guide.md
|
||||
- $env.TOOLS_PATH/dev-system/ci/docs/installation-guide.md
|
||||
175
.typedialog/ci/config.ncl
Normal file
175
.typedialog/ci/config.ncl
Normal file
@ -0,0 +1,175 @@
|
||||
# CI Configuration - Nickel Format
|
||||
# Auto-generated by dev-system CI installer
|
||||
#
|
||||
# This file is managed by TypeDialog using nickel-roundtrip.
|
||||
# Edit via: .typedialog/ci/configure.sh
|
||||
# Or manually edit and validate with: nickel typecheck config.ncl
|
||||
#
|
||||
# Documentation: nickel doc config.ncl
|
||||
|
||||
{
|
||||
# CI namespace - all configuration lives under 'ci'
|
||||
ci = {
|
||||
# Project Information
|
||||
# Detected languages and primary language for this project
|
||||
project = {
|
||||
# Project name
|
||||
name = "provisioning",
|
||||
# Project description
|
||||
description = "Provisioning",
|
||||
# Project website or documentation site URL
|
||||
site_url = "https://provisioning.systems",
|
||||
# Project repository URL (GitHub, GitLab, etc.)
|
||||
repo_url = "https://repo.jesusperez.pro/jesus/provisioning",
|
||||
# Languages detected in codebase (auto-detected by installer)
|
||||
detected_languages = [
|
||||
"rust",
|
||||
"nushell",
|
||||
"nickel",
|
||||
"bash",
|
||||
"markdown"
|
||||
],
|
||||
# Primary language (determines default tooling)
|
||||
primary_language = "nushell",
|
||||
},
|
||||
|
||||
# CI Tools Configuration
|
||||
# Each tool can be enabled/disabled and configured here
|
||||
tools = {
|
||||
# Taplo - TOML formatter and linter
|
||||
taplo = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# YAMLlint - YAML formatter and linter
|
||||
yamllint = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Clippy - Rust linting tool
|
||||
clippy = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
deny_warnings = true,
|
||||
},
|
||||
# Cargo Audit - Security vulnerability scanner
|
||||
audit = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# Cargo Deny - Dependency checker
|
||||
deny = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# Cargo SBOM - Software Bill of Materials
|
||||
sbom = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# LLVM Coverage - Code coverage tool
|
||||
llvm-cov = {
|
||||
enabled = true,
|
||||
install_method = "cargo",
|
||||
},
|
||||
# Shellcheck - Bash/shell script linter
|
||||
shellcheck = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Shfmt - Shell script formatter
|
||||
shfmt = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Markdownlint - Markdown linter
|
||||
markdownlint = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
# Vale - Prose linter
|
||||
vale = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
},
|
||||
# Nickel - Configuration language type checker
|
||||
nickel = {
|
||||
enabled = true,
|
||||
install_method = "brew",
|
||||
check_all = true,
|
||||
},
|
||||
# NuShell - Shell script validator
|
||||
nushell = {
|
||||
enabled = true,
|
||||
install_method = "builtin",
|
||||
check_all = true,
|
||||
},
|
||||
# Ruff - Fast Python linter
|
||||
ruff = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Black - Python code formatter
|
||||
black = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# Pytest - Python testing framework
|
||||
pytest = {
|
||||
enabled = true,
|
||||
install_method = "pip",
|
||||
},
|
||||
# ESLint - JavaScript linter
|
||||
eslint = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
# Prettier - Code formatter
|
||||
prettier = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
# Jest - JavaScript testing framework
|
||||
jest = {
|
||||
enabled = true,
|
||||
install_method = "npm",
|
||||
},
|
||||
},
|
||||
|
||||
# CI Features
|
||||
# High-level feature flags for CI behavior
|
||||
features = {
|
||||
enable_ci_cd = true,
|
||||
enable_pre_commit = true,
|
||||
generate_taplo_config = true,
|
||||
generate_contributing = true,
|
||||
generate_security = true,
|
||||
generate_code_of_conduct = true,
|
||||
generate_dockerfiles = true,
|
||||
enable_cross_compilation = true,
|
||||
},
|
||||
|
||||
# CI Provider Configurations
|
||||
# Settings for GitHub Actions, Woodpecker, GitLab CI, etc.
|
||||
ci_providers = {
|
||||
# GitHub Actions
|
||||
github_actions = {
|
||||
enabled = true,
|
||||
branches_push = "main,develop",
|
||||
branches_pr = "main",
|
||||
},
|
||||
# Woodpecker CI
|
||||
woodpecker = {
|
||||
enabled = true,
|
||||
},
|
||||
},
|
||||
|
||||
# CI Settings
|
||||
settings = {
|
||||
parallel_jobs = 1,
|
||||
job_timeout_minutes = 1,
|
||||
require_status_checks = true,
|
||||
run_on_draft_prs = true,
|
||||
},
|
||||
},
|
||||
}
|
||||
116
.typedialog/ci/configure.sh
Executable file
116
.typedialog/ci/configure.sh
Executable file
@ -0,0 +1,116 @@
|
||||
#!/usr/bin/env bash
|
||||
# CI Configuration Script
|
||||
# Auto-generated by dev-system/ci installer
|
||||
#
|
||||
# Interactive configuration for CI tools using TypeDialog.
|
||||
# Uses Nickel format for configuration files.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
TYPEDIALOG_CI="${SCRIPT_DIR}"
|
||||
|
||||
# Source envrc to load fragment paths and other environment variables
|
||||
if [[ -f "${TYPEDIALOG_CI}/envrc" ]]; then
|
||||
# shellcheck source=/dev/null
|
||||
source "${TYPEDIALOG_CI}/envrc"
|
||||
fi
|
||||
|
||||
# Configuration files
|
||||
FORM_FILE="${TYPEDIALOG_CI}/form.toml"
|
||||
CONFIG_FILE="${TYPEDIALOG_CI}/config.ncl"
|
||||
|
||||
# NCL_TEMPLATE is set by envrc (cascading: local → Tools)
|
||||
# If not set, use default from Tools
|
||||
NCL_TEMPLATE="${NCL_TEMPLATE:-${TOOLS_PATH}/dev-system/ci/templates/config.ncl.j2}"
|
||||
|
||||
# TypeDialog environment variables (can be overridden)
|
||||
# Port for web backend (default: 9000)
|
||||
export TYPEDIALOG_PORT="${TYPEDIALOG_PORT:-9000}"
|
||||
|
||||
# Host for web backend (default: localhost)
|
||||
export TYPEDIALOG_HOST="${TYPEDIALOG_HOST:-localhost}"
|
||||
|
||||
# Locale for form localization (default: system locale)
|
||||
export TYPEDIALOG_LANG="${TYPEDIALOG_LANG:-${LANG:-en_US.UTF-8}}"
|
||||
|
||||
# Detect which TypeDialog backend to use (default: web)
|
||||
BACKEND="${1:-web}"
|
||||
|
||||
# Validate backend
|
||||
case "$BACKEND" in
|
||||
cli|tui|web)
|
||||
;;
|
||||
*)
|
||||
echo "Usage: $0 [cli|tui|web]"
|
||||
echo ""
|
||||
echo "Launches TypeDialog for interactive CI configuration."
|
||||
echo "Backend options:"
|
||||
echo " cli - Command-line interface (simple prompts)"
|
||||
echo " tui - Terminal UI (interactive panels)"
|
||||
echo " web - Web server (browser-based) [default]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check if form exists
|
||||
if [[ ! -f "$FORM_FILE" ]]; then
|
||||
echo "Error: Form file not found: $FORM_FILE"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Create backup if config exists
|
||||
if [[ -f "$CONFIG_FILE" ]]; then
|
||||
BACKUP="${CONFIG_FILE}.$(date +%Y%m%d_%H%M%S).bak"
|
||||
cp "$CONFIG_FILE" "$BACKUP"
|
||||
echo "ℹ️ Backed up existing config to: $(basename "$BACKUP")"
|
||||
fi
|
||||
|
||||
# Launch TypeDialog with Nickel roundtrip (preserves Nickel format)
|
||||
echo "🔧 Launching TypeDialog ($BACKEND backend)..."
|
||||
echo ""
|
||||
|
||||
# Show web server info if using web backend
|
||||
if [[ "$BACKEND" == "web" ]]; then
|
||||
echo "🌐 Web server will start on: http://${TYPEDIALOG_HOST}:${TYPEDIALOG_PORT}"
|
||||
echo " (Override with: TYPEDIALOG_PORT=8080 TYPEDIALOG_HOST=0.0.0.0 $0)"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Build nickel-roundtrip command with optional template
|
||||
NCL_TEMPLATE_ARG=""
|
||||
if [[ -f "$NCL_TEMPLATE" ]]; then
|
||||
NCL_TEMPLATE_ARG="--ncl-template $NCL_TEMPLATE"
|
||||
echo "ℹ️ Using Nickel template: $NCL_TEMPLATE"
|
||||
fi
|
||||
|
||||
case "$BACKEND" in
|
||||
cli)
|
||||
typedialog nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" $NCL_TEMPLATE_ARG
|
||||
;;
|
||||
tui)
|
||||
typedialog-tui nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" $NCL_TEMPLATE_ARG
|
||||
;;
|
||||
web)
|
||||
typedialog-web nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" $NCL_TEMPLATE_ARG
|
||||
;;
|
||||
esac
|
||||
|
||||
EXIT_CODE=$?
|
||||
|
||||
if [[ $EXIT_CODE -eq 0 ]]; then
|
||||
echo ""
|
||||
echo "✅ Configuration saved to: $CONFIG_FILE"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " - Review the configuration: cat $CONFIG_FILE"
|
||||
echo " - Apply CI tools: (run your CI setup command)"
|
||||
echo " - Re-run this script anytime to update: $0"
|
||||
else
|
||||
echo ""
|
||||
echo "❌ Configuration cancelled or failed (exit code: $EXIT_CODE)"
|
||||
if [[ -f "${CONFIG_FILE}.bak" ]]; then
|
||||
echo " Previous config restored from backup"
|
||||
fi
|
||||
exit $EXIT_CODE
|
||||
fi
|
||||
27
.typedialog/ci/envrc
Normal file
27
.typedialog/ci/envrc
Normal file
@ -0,0 +1,27 @@
|
||||
# Auto-generated by dev-system/ci
|
||||
#
|
||||
# Cascading Path Strategy:
|
||||
# 1. Local files in .typedialog/ci/ take precedence (overrides)
|
||||
# 2. Central files in $TOOLS_PATH/dev-system/ci/ as fallback (defaults)
|
||||
#
|
||||
# To customize: Create file in .typedialog/ci/{schemas,validators,defaults,fragments}/
|
||||
# Your local version will be used instead of the Tools version.
|
||||
|
||||
# Nickel import paths (cascading: local → Tools)
|
||||
export NICKEL_IMPORT_PATH="schemas:$TOOLS_PATH/dev-system/ci/schemas:validators:$TOOLS_PATH/dev-system/ci/validators:defaults:$TOOLS_PATH/dev-system/ci/defaults"
|
||||
|
||||
# TypeDialog fragment search paths (cascading: local → Tools)
|
||||
export TYPEDIALOG_FRAGMENT_PATH=".typedialog/ci:$TOOLS_PATH/dev-system/ci/forms"
|
||||
|
||||
# Nickel template for config.ncl generation (with cascading)
|
||||
# Local template takes precedence if exists
|
||||
if [[ -f ".typedialog/ci/config.ncl.j2" ]]; then
|
||||
export NCL_TEMPLATE=".typedialog/ci/config.ncl.j2"
|
||||
else
|
||||
export NCL_TEMPLATE="$TOOLS_PATH/dev-system/ci/templates/config.ncl.j2"
|
||||
fi
|
||||
|
||||
# TypeDialog web backend configuration (override if needed)
|
||||
export TYPEDIALOG_PORT=${TYPEDIALOG_PORT:-9000}
|
||||
export TYPEDIALOG_HOST=${TYPEDIALOG_HOST:-localhost}
|
||||
export TYPEDIALOG_LANG=${TYPEDIALOG_LANG:-${LANG:-en_US.UTF-8}}
|
||||
259
.typedialog/ci/form.toml
Normal file
259
.typedialog/ci/form.toml
Normal file
@ -0,0 +1,259 @@
|
||||
description = "Interactive configuration for continuous integration and code quality tools"
|
||||
display_mode = "complete"
|
||||
locales_path = ""
|
||||
name = "CI Configuration Form"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "project_header"
|
||||
title = "📦 Project Information"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
help = "Name of the project"
|
||||
name = "project_name"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"name",
|
||||
]
|
||||
placeholder = "my-project"
|
||||
prompt = "Project name"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "Optional description"
|
||||
name = "project_description"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"description",
|
||||
]
|
||||
placeholder = "Brief description of what this project does"
|
||||
prompt = "Project description"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Project website or documentation site URL"
|
||||
name = "project_site_url"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"site_url",
|
||||
]
|
||||
placeholder = "https://example.com"
|
||||
prompt = "Project Site URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Project repository URL (GitHub, GitLab, etc.)"
|
||||
name = "project_repo_url"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"repo_url",
|
||||
]
|
||||
placeholder = "https://github.com/user/repo"
|
||||
prompt = "Project Repo URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "languages_header"
|
||||
title = "🔍 Detected Languages"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "rust"
|
||||
display_mode = "grid"
|
||||
help = "Select all languages detected or used in the project"
|
||||
min_selected = 1
|
||||
name = "detected_languages"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"detected_languages",
|
||||
]
|
||||
prompt = "Which languages are used in this project?"
|
||||
required = true
|
||||
searchable = true
|
||||
type = "multiselect"
|
||||
|
||||
[[elements.options]]
|
||||
value = "rust"
|
||||
label = "🦀 Rust"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nushell"
|
||||
label = "🐚 NuShell"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nickel"
|
||||
label = "⚙️ Nickel"
|
||||
|
||||
[[elements.options]]
|
||||
value = "bash"
|
||||
label = "🔧 Bash/Shell"
|
||||
|
||||
[[elements.options]]
|
||||
value = "markdown"
|
||||
label = "📝 Markdown/Documentation"
|
||||
|
||||
[[elements.options]]
|
||||
value = "python"
|
||||
label = "🐍 Python"
|
||||
|
||||
[[elements.options]]
|
||||
value = "javascript"
|
||||
label = "📜 JavaScript/TypeScript"
|
||||
|
||||
[[elements]]
|
||||
help = "Main language used for defaults (e.g., in GitHub Actions workflows)"
|
||||
name = "primary_language"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"project",
|
||||
"primary_language",
|
||||
]
|
||||
options_from = "detected_languages"
|
||||
prompt = "Primary language"
|
||||
required = true
|
||||
type = "select"
|
||||
default = "rust"
|
||||
|
||||
[[elements.options]]
|
||||
value = "rust"
|
||||
label = "🦀 Rust"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nushell"
|
||||
label = "🐚 NuShell"
|
||||
|
||||
[[elements.options]]
|
||||
value = "nickel"
|
||||
label = "⚙️ Nickel"
|
||||
|
||||
[[elements.options]]
|
||||
value = "bash"
|
||||
label = "🔧 Bash"
|
||||
|
||||
[[elements.options]]
|
||||
value = "markdown"
|
||||
label = "📝 Markdown"
|
||||
|
||||
[[elements.options]]
|
||||
value = "python"
|
||||
label = "🐍 Python"
|
||||
|
||||
[[elements.options]]
|
||||
value = "javascript"
|
||||
label = "📜 JavaScript"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/rust-tools.toml"]
|
||||
name = "rust_tools_group"
|
||||
type = "group"
|
||||
when = "rust in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/nushell-tools.toml"]
|
||||
name = "nushell_tools_group"
|
||||
type = "group"
|
||||
when = "nushell in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/nickel-tools.toml"]
|
||||
name = "nickel_tools_group"
|
||||
type = "group"
|
||||
when = "nickel in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/bash-tools.toml"]
|
||||
name = "bash_tools_group"
|
||||
type = "group"
|
||||
when = "bash in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/markdown-tools.toml"]
|
||||
name = "markdown_tools_group"
|
||||
type = "group"
|
||||
when = "markdown in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/python-tools.toml"]
|
||||
name = "python_tools_group"
|
||||
type = "group"
|
||||
when = "python in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/javascript-tools.toml"]
|
||||
name = "javascript_tools_group"
|
||||
type = "group"
|
||||
when = "javascript in detected_languages"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/general-tools.toml"]
|
||||
name = "general_tools_group"
|
||||
type = "group"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "ci_cd_header"
|
||||
title = "🔄 CI/CD Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "true"
|
||||
help = "Set up continuous integration and deployment pipelines"
|
||||
name = "enable_ci_cd"
|
||||
nickel_path = [
|
||||
"ci",
|
||||
"features",
|
||||
"enable_ci_cd",
|
||||
]
|
||||
prompt = "Enable CI/CD integration?"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/ci-providers.toml"]
|
||||
name = "ci_providers_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/ci-settings.toml"]
|
||||
name = "ci_settings_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/build-deployment.toml"]
|
||||
name = "build_deployment_group"
|
||||
type = "group"
|
||||
when = "enable_ci_cd == true"
|
||||
|
||||
[[elements]]
|
||||
includes = ["fragments/documentation.toml"]
|
||||
name = "documentation_group"
|
||||
type = "group"
|
||||
|
||||
[[elements]]
|
||||
border_bottom = true
|
||||
border_top = true
|
||||
name = "confirmation_header"
|
||||
title = "✅ Ready to Install"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
content = "Review your configuration above. After confirming, the CI system will be installed with your chosen settings."
|
||||
name = "confirmation_footer"
|
||||
type = "footer"
|
||||
390
.typedialog/platform/forms/README.md
Normal file
390
.typedialog/platform/forms/README.md
Normal file
@ -0,0 +1,390 @@
|
||||
# Forms
|
||||
|
||||
TypeDialog form definitions for interactive configuration of platform services.
|
||||
|
||||
## Purpose
|
||||
|
||||
Forms provide:
|
||||
- **Interactive configuration** - Web/TUI/CLI interfaces for user input
|
||||
- **Constraint validation** - Dynamic min/max from constraints.toml
|
||||
- **Nickel mapping** - Form fields map to Nickel structure via `nickel_path`
|
||||
- **Jinja2 template integration** - Generate Nickel configs from form values
|
||||
- **nickel-roundtrip workflow** - Load existing Nickel → edit → generate updated Nickel
|
||||
|
||||
## File Organization
|
||||
|
||||
```
|
||||
forms/
|
||||
├── README.md # This file
|
||||
├── orchestrator-form.toml # Orchestrator configuration form
|
||||
├── control-center-form.toml # Control Center configuration form
|
||||
├── mcp-server-form.toml # MCP Server configuration form
|
||||
├── installer-form.toml # Installer configuration form
|
||||
└── fragments/ # FLAT fragment directory (all fragments here)
|
||||
├── workspace-section.toml # Workspace configuration
|
||||
├── server-section.toml # HTTP server settings
|
||||
├── database-rocksdb-section.toml # RocksDB configuration
|
||||
├── database-surrealdb-section.toml # SurrealDB configuration
|
||||
├── database-postgres-section.toml # PostgreSQL configuration
|
||||
├── security-section.toml # Auth, RBAC, encryption
|
||||
├── monitoring-section.toml # Metrics, health checks
|
||||
├── logging-section.toml # Log configuration
|
||||
├── orchestrator-queue-section.toml # Orchestrator queue config
|
||||
├── orchestrator-workflow-section.toml
|
||||
├── control-center-jwt-section.toml
|
||||
├── control-center-rbac-section.toml
|
||||
├── mcp-capabilities-section.toml
|
||||
├── deployment-mode-section.toml # Mode selection
|
||||
└── README.md # Fragment documentation
|
||||
```
|
||||
|
||||
## Critical: Fragment Organization
|
||||
|
||||
**Fragments are FLAT** - all stored in `forms/fragments/` at the same level, referenced by paths in form includes:
|
||||
|
||||
```toml
|
||||
# Main form (orchestrator-form.toml)
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
includes = ["fragments/workspace-section.toml"] # Path reference to flat fragment
|
||||
|
||||
[[items]]
|
||||
name = "queue_group"
|
||||
type = "group"
|
||||
includes = ["fragments/orchestrator-queue-section.toml"] # Same level, different name
|
||||
```
|
||||
|
||||
**NOT nested directories** like `fragments/orchestrator/queue-section.toml` - all in `fragments/`
|
||||
|
||||
## TypeDialog nickel-roundtrip Workflow
|
||||
|
||||
CRITICAL: Forms integrate with Nickel config generation via:
|
||||
|
||||
```bash
|
||||
typedialog-web nickel-roundtrip "$CONFIG_FILE" "$FORM_FILE" --output "$CONFIG_FILE" --template "$NCL_TEMPLATE"
|
||||
```
|
||||
|
||||
This workflow:
|
||||
1. **Loads existing Nickel config** as default values in form
|
||||
2. **Shows form** with validated constraints
|
||||
3. **User edits** configuration values
|
||||
4. **Generates updated Nickel** using Jinja2 template
|
||||
|
||||
## Required Fields: nickel_path
|
||||
|
||||
**CRITICAL**: Every form element MUST have `nickel_path` to map to Nickel structure:
|
||||
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "workspace_name"
|
||||
type = "text"
|
||||
prompt = "Workspace Name"
|
||||
nickel_path = ["orchestrator", "workspace", "name"] # ← REQUIRED
|
||||
```
|
||||
|
||||
The `nickel_path` array specifies the path in the Nickel config structure:
|
||||
- `["orchestrator", "workspace", "name"]` → `orchestrator.workspace.name`
|
||||
- `["orchestrator", "queue", "max_concurrent_tasks"]` → `orchestrator.queue.max_concurrent_tasks`
|
||||
|
||||
## Constraint Interpolation
|
||||
|
||||
Form fields reference constraints dynamically:
|
||||
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "max_concurrent_tasks"
|
||||
type = "number"
|
||||
prompt = "Maximum Concurrent Tasks"
|
||||
min = "${constraint.orchestrator.queue.concurrent_tasks.min}" # Dynamic
|
||||
max = "${constraint.orchestrator.queue.concurrent_tasks.max}" # Dynamic
|
||||
help = "Range: ${constraint.orchestrator.queue.concurrent_tasks.min}-${constraint.orchestrator.queue.concurrent_tasks.max}"
|
||||
nickel_path = ["orchestrator", "queue", "max_concurrent_tasks"]
|
||||
```
|
||||
|
||||
TypeDialog resolves `${constraint.path}` from `constraints/constraints.toml`.
|
||||
|
||||
## Main Form Structure
|
||||
|
||||
All main forms follow this pattern:
|
||||
|
||||
```toml
|
||||
name = "service_configuration"
|
||||
description = "Interactive configuration for {Service}"
|
||||
display_mode = "complete"
|
||||
|
||||
# Section 1: Deployment mode selection
|
||||
[[items]]
|
||||
name = "deployment_mode_group"
|
||||
type = "group"
|
||||
includes = ["fragments/deployment-mode-section.toml"]
|
||||
|
||||
# Section 2: Workspace configuration
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
includes = ["fragments/workspace-section.toml"]
|
||||
|
||||
# Section 3: Server configuration
|
||||
[[items]]
|
||||
name = "server_group"
|
||||
type = "group"
|
||||
includes = ["fragments/server-section.toml"]
|
||||
|
||||
# Section N: Service-specific configuration
|
||||
[[items]]
|
||||
name = "service_group"
|
||||
type = "group"
|
||||
includes = ["fragments/{service}-specific-section.toml"]
|
||||
|
||||
# Optional: Conditional sections
|
||||
[[items]]
|
||||
name = "monitoring_group"
|
||||
type = "group"
|
||||
when = "enable_monitoring == true"
|
||||
includes = ["fragments/monitoring-section.toml"]
|
||||
```
|
||||
|
||||
## Fragment Example: workspace-section.toml
|
||||
|
||||
```toml
|
||||
# Workspace configuration fragment
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = true
|
||||
name = "workspace_header"
|
||||
title = "🗂️ Workspace Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_name"
|
||||
type = "text"
|
||||
prompt = "Workspace Name"
|
||||
default = "default"
|
||||
placeholder = "e.g., librecloud, production"
|
||||
required = true
|
||||
help = "Name of the workspace"
|
||||
nickel_path = ["orchestrator", "workspace", "name"]
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_path"
|
||||
type = "text"
|
||||
prompt = "Workspace Path"
|
||||
default = "/var/lib/provisioning/orchestrator"
|
||||
required = true
|
||||
help = "Absolute path to workspace directory"
|
||||
nickel_path = ["orchestrator", "workspace", "path"]
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_enabled"
|
||||
type = "confirm"
|
||||
prompt = "Enable Workspace?"
|
||||
default = true
|
||||
nickel_path = ["orchestrator", "workspace", "enabled"]
|
||||
|
||||
[[elements]]
|
||||
name = "multi_workspace"
|
||||
type = "confirm"
|
||||
prompt = "Multi-Workspace Mode?"
|
||||
default = false
|
||||
help = "Allow serving multiple workspaces"
|
||||
nickel_path = ["orchestrator", "workspace", "multi_workspace"]
|
||||
```
|
||||
|
||||
## Fragment Example: orchestrator-queue-section.toml
|
||||
|
||||
```toml
|
||||
# Orchestrator queue configuration
|
||||
[[elements]]
|
||||
border_top = true
|
||||
name = "queue_header"
|
||||
title = "⚙️ Queue Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
name = "max_concurrent_tasks"
|
||||
type = "number"
|
||||
prompt = "Maximum Concurrent Tasks"
|
||||
default = 5
|
||||
min = "${constraint.orchestrator.queue.concurrent_tasks.min}"
|
||||
max = "${constraint.orchestrator.queue.concurrent_tasks.max}"
|
||||
required = true
|
||||
help = "Max tasks running simultaneously. Range: ${constraint.orchestrator.queue.concurrent_tasks.min}-${constraint.orchestrator.queue.concurrent_tasks.max}"
|
||||
nickel_path = ["orchestrator", "queue", "max_concurrent_tasks"]
|
||||
|
||||
[[elements]]
|
||||
name = "retry_attempts"
|
||||
type = "number"
|
||||
prompt = "Retry Attempts"
|
||||
default = 3
|
||||
min = 0
|
||||
max = 10
|
||||
help = "Number of retry attempts for failed tasks"
|
||||
nickel_path = ["orchestrator", "queue", "retry_attempts"]
|
||||
|
||||
[[elements]]
|
||||
name = "retry_delay"
|
||||
type = "number"
|
||||
prompt = "Retry Delay (ms)"
|
||||
default = 5000
|
||||
min = 1000
|
||||
max = 60000
|
||||
help = "Delay between retries in milliseconds"
|
||||
nickel_path = ["orchestrator", "queue", "retry_delay"]
|
||||
|
||||
[[elements]]
|
||||
name = "task_timeout"
|
||||
type = "number"
|
||||
prompt = "Task Timeout (ms)"
|
||||
default = 3600000
|
||||
min = 60000
|
||||
max = 86400000
|
||||
help = "Default timeout for task execution (min 1 min, max 24 hrs)"
|
||||
nickel_path = ["orchestrator", "queue", "task_timeout"]
|
||||
```
|
||||
|
||||
## Jinja2 Template Integration
|
||||
|
||||
Jinja2 templates (`templates/{service}-config.ncl.j2`) convert form values to Nickel:
|
||||
|
||||
```nickel
|
||||
# templates/orchestrator-config.ncl.j2
|
||||
{
|
||||
orchestrator = {
|
||||
workspace = {
|
||||
{%- if workspace_name %}
|
||||
name = "{{ workspace_name }}",
|
||||
{%- endif %}
|
||||
{%- if workspace_path %}
|
||||
path = "{{ workspace_path }}",
|
||||
{%- endif %}
|
||||
{%- if workspace_enabled is defined %}
|
||||
enabled = {{ workspace_enabled | lower }},
|
||||
{%- endif %}
|
||||
},
|
||||
queue = {
|
||||
{%- if max_concurrent_tasks %}
|
||||
max_concurrent_tasks = {{ max_concurrent_tasks }},
|
||||
{%- endif %}
|
||||
{%- if retry_attempts %}
|
||||
retry_attempts = {{ retry_attempts }},
|
||||
{%- endif %}
|
||||
{%- if retry_delay %}
|
||||
retry_delay = {{ retry_delay }},
|
||||
{%- endif %}
|
||||
{%- if task_timeout %}
|
||||
task_timeout = {{ task_timeout }},
|
||||
{%- endif %}
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
## Conditional Sections
|
||||
|
||||
Forms can show/hide sections based on user selections:
|
||||
|
||||
```toml
|
||||
# Always shown
|
||||
[[items]]
|
||||
name = "deployment_mode_group"
|
||||
type = "group"
|
||||
includes = ["fragments/deployment-mode-section.toml"]
|
||||
|
||||
# Only shown if enable_monitoring is true
|
||||
[[items]]
|
||||
name = "monitoring_group"
|
||||
type = "group"
|
||||
when = "enable_monitoring == true"
|
||||
includes = ["fragments/monitoring-section.toml"]
|
||||
|
||||
# Only shown if deployment_mode is "enterprise"
|
||||
[[items]]
|
||||
name = "enterprise_options"
|
||||
type = "group"
|
||||
when = "deployment_mode == 'enterprise'"
|
||||
includes = ["fragments/enterprise-options-section.toml"]
|
||||
```
|
||||
|
||||
## Element Types
|
||||
|
||||
```toml
|
||||
type = "text" # Single-line text input
|
||||
type = "number" # Numeric input
|
||||
type = "confirm" # Boolean checkbox
|
||||
type = "select" # Dropdown (single choice)
|
||||
type = "multiselect" # Checkboxes (multiple choices)
|
||||
type = "password" # Hidden text input
|
||||
type = "textarea" # Multi-line text
|
||||
type = "section_header" # Visual section separator
|
||||
type = "footer" # Confirmation text
|
||||
type = "group" # Container for fragments
|
||||
```
|
||||
|
||||
## Usage Workflow
|
||||
|
||||
### 1. Run Configuration Wizard
|
||||
|
||||
```bash
|
||||
nu provisioning/.typedialog/provisioning/platform/scripts/configure.nu orchestrator solo
|
||||
```
|
||||
|
||||
### 2. TypeDialog Loads Form
|
||||
|
||||
- Shows `forms/orchestrator-form.toml`
|
||||
- Includes fragments from `forms/fragments/*.toml`
|
||||
- Applies constraint interpolation
|
||||
- Loads existing config as defaults (if exists)
|
||||
|
||||
### 3. User Edits
|
||||
|
||||
- Fills form fields
|
||||
- Validates against constraints
|
||||
- Shows validation errors
|
||||
|
||||
### 4. Generate Nickel
|
||||
|
||||
- Uses `templates/orchestrator-config.ncl.j2`
|
||||
- Converts form values to Nickel
|
||||
- Saves to `values/orchestrator.solo.ncl`
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Use fragments** - Don't duplicate form sections
|
||||
2. **Always add nickel_path** - Required for Nickel mapping
|
||||
3. **Use constraint interpolation** - Dynamic limits from constraints.toml
|
||||
4. **Provide defaults** - Sensible defaults speed up configuration
|
||||
5. **Use clear prompts** - Explain what each field does in `help` text
|
||||
6. **Group related fields** - Use fragments to organize logically
|
||||
7. **Test constraint interpolation** - Verify ${constraint.*} resolves
|
||||
8. **Document fragments** - Use headers and help text
|
||||
|
||||
## Testing Forms
|
||||
|
||||
```bash
|
||||
# Validate form TOML syntax (if supported by TypeDialog)
|
||||
# typedialog validate forms/orchestrator-form.toml
|
||||
|
||||
# Launch interactive form (web backend)
|
||||
nu provisioning/.typedialog/provisioning/platform/scripts/configure.nu orchestrator solo --backend web
|
||||
|
||||
# View generated Nickel
|
||||
cat provisioning/.typedialog/provisioning/platform/values/orchestrator.solo.ncl
|
||||
```
|
||||
|
||||
## Adding New Fields
|
||||
|
||||
To add a new configuration field:
|
||||
|
||||
1. **Add to schema** (schemas/{service}.ncl)
|
||||
2. **Add to defaults** (defaults/{service}-defaults.ncl)
|
||||
3. **Add to fragment** (forms/fragments/{appropriate}-section.toml)
|
||||
- Include `nickel_path` mapping
|
||||
- Add constraint if numeric
|
||||
4. **Update Jinja2 template** (templates/{service}-config.ncl.j2)
|
||||
5. **Test**: `nu scripts/configure.nu {service} {mode}`
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0.0
|
||||
**Last Updated**: 2025-01-05
|
||||
13
.typedialog/platform/forms/ai-service-form.toml
Normal file
13
.typedialog/platform/forms/ai-service-form.toml
Normal file
@ -0,0 +1,13 @@
|
||||
# AI Service Configuration Form
|
||||
# Sections for AI Service deployment with RAG/MCP integration
|
||||
|
||||
title = "AI Service Configuration"
|
||||
description = "Configure AI Service with RAG and MCP integration"
|
||||
|
||||
sections = [
|
||||
{ name = "server", label = "Server Settings", description = "HTTP server and worker configuration" },
|
||||
{ name = "rag_integration", label = "RAG Integration", description = "Retrieval-Augmented Generation service integration" },
|
||||
{ name = "mcp_integration", label = "MCP Integration", description = "Model Context Protocol service integration" },
|
||||
{ name = "dag", label = "DAG Execution", description = "Directed Acyclic Graph task execution settings" },
|
||||
{ name = "monitoring", label = "Monitoring", description = "Health checks and observability" }
|
||||
]
|
||||
118
.typedialog/platform/forms/control-center-form.toml
Normal file
118
.typedialog/platform/forms/control-center-form.toml
Normal file
@ -0,0 +1,118 @@
|
||||
name = "control_center_configuration"
|
||||
description = "Interactive configuration for Control Center service (policy and RBAC management)"
|
||||
display_mode = "complete"
|
||||
fallback_locale = "en-US"
|
||||
|
||||
# ============================================================================
|
||||
# CONTROL CENTER SERVICE FORM - COMPOSED FROM FRAGMENTS
|
||||
# ============================================================================
|
||||
# This form uses fragment composition pattern for modular configuration
|
||||
# All fragments are located in ./fragments/ subdirectory
|
||||
# ============================================================================
|
||||
|
||||
# DEPLOYMENT MODE SELECTION
|
||||
# Determines service resources and feature set (solo/multiuser/cicd/enterprise)
|
||||
[[items]]
|
||||
name = "deployment_mode_group"
|
||||
type = "group"
|
||||
title = "Deployment Configuration"
|
||||
description = "Select deployment mode and database backend"
|
||||
includes = ["fragments/deployment/mode-selection.toml", "fragments/deployment/database-backend-selection.toml"]
|
||||
|
||||
# WORKSPACE CONFIGURATION
|
||||
# Workspace name, path, and context
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
title = "Workspace Settings"
|
||||
description = "Configure workspace context for this Control Center instance"
|
||||
includes = ["fragments/workspace-section.toml"]
|
||||
|
||||
# SERVER CONFIGURATION
|
||||
# HTTP server settings (host, port, workers, connections)
|
||||
[[items]]
|
||||
name = "server_group"
|
||||
type = "group"
|
||||
title = "Server Settings"
|
||||
description = "Configure HTTP server for Control Center"
|
||||
includes = ["fragments/server-section.toml"]
|
||||
|
||||
# DATABASE BACKEND CONFIGURATION
|
||||
# Conditional sections based on selected backend
|
||||
[[items]]
|
||||
name = "database_rocksdb_group"
|
||||
type = "group"
|
||||
title = "RocksDB Configuration"
|
||||
description = "Configure RocksDB backend for policy storage"
|
||||
condition = "database_backend_selection == 'rocksdb'"
|
||||
includes = ["fragments/database-rocksdb-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "database_surrealdb_group"
|
||||
type = "group"
|
||||
title = "SurrealDB Configuration"
|
||||
description = "Configure SurrealDB backend for policy storage"
|
||||
condition = "database_backend_selection == 'surrealdb_embedded' || database_backend_selection == 'surrealdb_server'"
|
||||
includes = ["fragments/database-surrealdb-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "database_postgres_group"
|
||||
type = "group"
|
||||
title = "PostgreSQL Configuration"
|
||||
description = "Configure PostgreSQL backend for policy storage"
|
||||
condition = "database_backend_selection == 'postgresql'"
|
||||
includes = ["fragments/database-postgres-section.toml"]
|
||||
|
||||
# CONTROL CENTER-SPECIFIC: SECURITY CONFIGURATION
|
||||
# JWT, RBAC, MFA, rate limiting, TLS, sessions
|
||||
[[items]]
|
||||
name = "security_group"
|
||||
type = "group"
|
||||
title = "Security Configuration"
|
||||
description = "Configure authentication, authorization, and security settings"
|
||||
includes = ["fragments/control-center/security-section.toml"]
|
||||
|
||||
# CONTROL CENTER-SPECIFIC: POLICY CONFIGURATION
|
||||
# Policy caching, versioning, management
|
||||
[[items]]
|
||||
name = "policy_group"
|
||||
type = "group"
|
||||
title = "Policy Configuration"
|
||||
description = "Configure policy engine and policy management"
|
||||
includes = ["fragments/control-center/policy-section.toml"]
|
||||
|
||||
# CONTROL CENTER-SPECIFIC: USER MANAGEMENT CONFIGURATION
|
||||
# User registration, sessions, audit logging
|
||||
[[items]]
|
||||
name = "users_group"
|
||||
type = "group"
|
||||
title = "User Management Configuration"
|
||||
description = "Configure user registration, sessions, and audit"
|
||||
includes = ["fragments/control-center/users-section.toml"]
|
||||
|
||||
# CONTROL CENTER-SPECIFIC: COMPLIANCE & AUDIT CONFIGURATION
|
||||
# Audit logging, compliance frameworks, data retention, encryption
|
||||
[[items]]
|
||||
name = "compliance_group"
|
||||
type = "group"
|
||||
title = "Compliance & Audit Configuration"
|
||||
description = "Configure audit logging, compliance, and data retention"
|
||||
includes = ["fragments/control-center/compliance-section.toml"]
|
||||
|
||||
# MONITORING CONFIGURATION
|
||||
# Metrics collection, health checks
|
||||
[[items]]
|
||||
name = "monitoring_group"
|
||||
type = "group"
|
||||
title = "Monitoring Configuration"
|
||||
description = "Configure metrics and health checks"
|
||||
includes = ["fragments/monitoring-section.toml"]
|
||||
|
||||
# LOGGING CONFIGURATION
|
||||
# Log levels, formats, rotation
|
||||
[[items]]
|
||||
name = "logging_group"
|
||||
type = "group"
|
||||
title = "Logging Configuration"
|
||||
description = "Configure logging behavior and output"
|
||||
includes = ["fragments/logging-section.toml"]
|
||||
36
.typedialog/platform/forms/extension-registry-form.toml
Normal file
36
.typedialog/platform/forms/extension-registry-form.toml
Normal file
@ -0,0 +1,36 @@
|
||||
[form]
|
||||
name = "Extension Registry Configuration"
|
||||
description = "Multi-instance extension distribution via Git sources (Gitea, Forgejo, GitHub) and OCI registries"
|
||||
version = "2.0"
|
||||
|
||||
[[sections]]
|
||||
name = "Server Configuration"
|
||||
description = "Network and performance settings"
|
||||
includes = ["fragments/extension-registry/server.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Git Sources"
|
||||
description = "Configure Gitea, Forgejo, and GitHub as extension sources"
|
||||
includes = [
|
||||
"fragments/extension-registry/gitea-multi.toml",
|
||||
"fragments/extension-registry/forgejo-multi.toml",
|
||||
"fragments/extension-registry/github-multi.toml",
|
||||
]
|
||||
|
||||
[[sections]]
|
||||
name = "OCI Registries"
|
||||
description = "Configure OCI registries for distribution (Zot, Harbor, Docker Hub, GHCR, Quay)"
|
||||
includes = ["fragments/extension-registry/oci-multi.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Caching"
|
||||
description = "Cache configuration and TTL settings"
|
||||
includes = ["fragments/extension-registry/cache.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Legacy Configuration"
|
||||
description = "Single-instance configuration (automatically migrated to multi-instance format)"
|
||||
includes = [
|
||||
"fragments/extension-registry/gitea-legacy.toml",
|
||||
"fragments/extension-registry/oci-legacy.toml",
|
||||
]
|
||||
334
.typedialog/platform/forms/fragments/README.md
Normal file
334
.typedialog/platform/forms/fragments/README.md
Normal file
@ -0,0 +1,334 @@
|
||||
# Fragments
|
||||
|
||||
Reusable form fragments organized FLAT in this directory (not nested subdirectories).
|
||||
|
||||
## Purpose
|
||||
|
||||
Fragments provide:
|
||||
- **Reusable sections** - Used by multiple forms
|
||||
- **Modularity** - Change once, applies to all forms using it
|
||||
- **Organization** - Named by purpose (workspace, server, queue, etc.)
|
||||
- **DRY principle** - Don't repeat configuration sections
|
||||
|
||||
## Fragment Organization
|
||||
|
||||
**CRITICAL**: All fragments are stored at the SAME LEVEL (flat directory).
|
||||
|
||||
```
|
||||
fragments/
|
||||
├── workspace-section.toml # Workspace configuration
|
||||
├── server-section.toml # HTTP server settings
|
||||
├── database-rocksdb-section.toml # RocksDB database
|
||||
├── database-surrealdb-section.toml # SurrealDB database
|
||||
├── database-postgres-section.toml # PostgreSQL database
|
||||
├── security-section.toml # Auth, RBAC, encryption
|
||||
├── monitoring-section.toml # Metrics, health checks
|
||||
├── logging-section.toml # Log configuration
|
||||
├── orchestrator-queue-section.toml # Orchestrator queue config
|
||||
├── orchestrator-workflow-section.toml # Orchestrator batch workflow
|
||||
├── orchestrator-storage-section.toml # Orchestrator storage backend
|
||||
├── control-center-jwt-section.toml # Control Center JWT
|
||||
├── control-center-rbac-section.toml # Control Center RBAC
|
||||
├── control-center-compliance-section.toml
|
||||
├── mcp-capabilities-section.toml # MCP capabilities
|
||||
├── mcp-tools-section.toml # MCP tools configuration
|
||||
├── mcp-resources-section.toml # MCP resource limits
|
||||
├── deployment-mode-section.toml # Deployment mode selection
|
||||
├── resources-section.toml # Resource allocation (CPU, RAM, disk)
|
||||
└── README.md # This file
|
||||
```
|
||||
|
||||
Referenced in forms as:
|
||||
```toml
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
includes = ["fragments/workspace-section.toml"] # Flat reference
|
||||
|
||||
[[items]]
|
||||
name = "queue_group"
|
||||
type = "group"
|
||||
includes = ["fragments/orchestrator-queue-section.toml"] # Same level
|
||||
```
|
||||
|
||||
## Fragment Categories
|
||||
|
||||
### Common Fragments (Used by Multiple Services)
|
||||
|
||||
- **workspace-section.toml** - Workspace name, path, enable/disable
|
||||
- **server-section.toml** - HTTP server host, port, workers, keep-alive
|
||||
- **database-rocksdb-section.toml** - RocksDB path (filesystem-backed)
|
||||
- **database-surrealdb-section.toml** - SurrealDB embedded (no external service)
|
||||
- **database-postgres-section.toml** - PostgreSQL server connection
|
||||
- **security-section.toml** - JWT issuer, RBAC, encryption keys
|
||||
- **monitoring-section.toml** - Metrics interval, health checks
|
||||
- **logging-section.toml** - Log level, format, rotation
|
||||
- **resources-section.toml** - CPU cores, memory, disk allocation
|
||||
- **deployment-mode-section.toml** - Solo/MultiUser/CI/CD/Enterprise selection
|
||||
|
||||
### Service-Specific Fragments
|
||||
|
||||
**Orchestrator** (workflow engine):
|
||||
- **orchestrator-queue-section.toml** - Max concurrent tasks, retries, timeout
|
||||
- **orchestrator-workflow-section.toml** - Batch workflow settings, parallelism
|
||||
- **orchestrator-storage-section.toml** - Storage backend selection
|
||||
|
||||
**Control Center** (policy/RBAC):
|
||||
- **control-center-jwt-section.toml** - JWT issuer, audience, token expiration
|
||||
- **control-center-rbac-section.toml** - Roles, permissions, policies
|
||||
- **control-center-compliance-section.toml** - SOC2, HIPAA, audit logging
|
||||
|
||||
**MCP Server** (protocol):
|
||||
- **mcp-capabilities-section.toml** - Tools, prompts, resources, sampling
|
||||
- **mcp-tools-section.toml** - Tool timeout, max concurrent, categories
|
||||
- **mcp-resources-section.toml** - Max size, caching, TTL
|
||||
|
||||
## Fragment Structure
|
||||
|
||||
Each fragment is a TOML file containing `[[elements]]` definitions:
|
||||
|
||||
```toml
|
||||
# fragments/workspace-section.toml
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = true
|
||||
name = "workspace_header"
|
||||
title = "🗂️ Workspace Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_name"
|
||||
type = "text"
|
||||
prompt = "Workspace Name"
|
||||
default = "default"
|
||||
required = true
|
||||
help = "Name of the workspace this service will serve"
|
||||
nickel_path = ["orchestrator", "workspace", "name"]
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_path"
|
||||
type = "text"
|
||||
prompt = "Workspace Path"
|
||||
default = "/var/lib/provisioning/orchestrator"
|
||||
required = true
|
||||
help = "Absolute path to the workspace directory"
|
||||
nickel_path = ["orchestrator", "workspace", "path"]
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_enabled"
|
||||
type = "confirm"
|
||||
prompt = "Enable Workspace?"
|
||||
default = true
|
||||
help = "Enable or disable this workspace"
|
||||
nickel_path = ["orchestrator", "workspace", "enabled"]
|
||||
```
|
||||
|
||||
## Fragment Composition
|
||||
|
||||
Fragments are included in main forms:
|
||||
|
||||
```toml
|
||||
# forms/orchestrator-form.toml
|
||||
|
||||
name = "orchestrator_configuration"
|
||||
description = "Interactive configuration for Orchestrator"
|
||||
|
||||
# Include fragments in order
|
||||
|
||||
[[items]]
|
||||
name = "deployment_group"
|
||||
type = "group"
|
||||
includes = ["fragments/deployment-mode-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
includes = ["fragments/workspace-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "server_group"
|
||||
type = "group"
|
||||
includes = ["fragments/server-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "storage_group"
|
||||
type = "group"
|
||||
includes = ["fragments/orchestrator-storage-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "queue_group"
|
||||
type = "group"
|
||||
includes = ["fragments/orchestrator-queue-section.toml"]
|
||||
|
||||
# Optional sections
|
||||
[[items]]
|
||||
name = "monitoring_group"
|
||||
type = "group"
|
||||
when = "enable_monitoring == true"
|
||||
includes = ["fragments/monitoring-section.toml"]
|
||||
```
|
||||
|
||||
## Element Requirements
|
||||
|
||||
Every element in a fragment MUST include:
|
||||
|
||||
1. **name** - Unique identifier (used in form data)
|
||||
2. **type** - Element type (text, number, confirm, select, etc.)
|
||||
3. **prompt** - User-facing label
|
||||
4. **nickel_path** - Mapping to Nickel structure (**CRITICAL**)
|
||||
|
||||
Example:
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "max_concurrent_tasks" # Unique identifier
|
||||
type = "number" # Type
|
||||
prompt = "Maximum Concurrent Tasks" # User label
|
||||
nickel_path = ["orchestrator", "queue", "max_concurrent_tasks"] # Nickel mapping
|
||||
```
|
||||
|
||||
## Constraint Interpolation
|
||||
|
||||
Fragments reference constraints dynamically:
|
||||
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "max_concurrent_tasks"
|
||||
type = "number"
|
||||
prompt = "Maximum Concurrent Tasks"
|
||||
min = "${constraint.orchestrator.queue.concurrent_tasks.min}" # Dynamic
|
||||
max = "${constraint.orchestrator.queue.concurrent_tasks.max}" # Dynamic
|
||||
nickel_path = ["orchestrator", "queue", "max_concurrent_tasks"]
|
||||
```
|
||||
|
||||
The `${constraint.path.to.value}` syntax references `constraints/constraints.toml`.
|
||||
|
||||
## Common Fragment Patterns
|
||||
|
||||
### Workspace Fragment Pattern
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "workspace_name"
|
||||
type = "text"
|
||||
prompt = "Workspace Name"
|
||||
nickel_path = ["orchestrator", "workspace", "name"]
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_path"
|
||||
type = "text"
|
||||
prompt = "Workspace Path"
|
||||
nickel_path = ["orchestrator", "workspace", "path"]
|
||||
|
||||
[[elements]]
|
||||
name = "workspace_enabled"
|
||||
type = "confirm"
|
||||
prompt = "Enable Workspace?"
|
||||
nickel_path = ["orchestrator", "workspace", "enabled"]
|
||||
```
|
||||
|
||||
### Server Fragment Pattern
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "server_host"
|
||||
type = "text"
|
||||
prompt = "Server Host"
|
||||
default = "127.0.0.1"
|
||||
nickel_path = ["orchestrator", "server", "host"]
|
||||
|
||||
[[elements]]
|
||||
name = "server_port"
|
||||
type = "number"
|
||||
prompt = "Server Port"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
nickel_path = ["orchestrator", "server", "port"]
|
||||
|
||||
[[elements]]
|
||||
name = "server_workers"
|
||||
type = "number"
|
||||
prompt = "Worker Threads"
|
||||
min = 1
|
||||
max = 32
|
||||
nickel_path = ["orchestrator", "server", "workers"]
|
||||
```
|
||||
|
||||
### Database Selection Pattern
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "storage_backend"
|
||||
type = "select"
|
||||
prompt = "Storage Backend"
|
||||
options = [
|
||||
{ value = "filesystem", label = "📁 Filesystem" },
|
||||
{ value = "rocksdb", label = "🗄️ RocksDB (Embedded)" },
|
||||
{ value = "surrealdb", label = "📊 SurrealDB" },
|
||||
{ value = "postgres", label = "🐘 PostgreSQL" },
|
||||
]
|
||||
nickel_path = ["orchestrator", "storage", "backend"]
|
||||
|
||||
[[elements]]
|
||||
name = "rocksdb_group"
|
||||
type = "group"
|
||||
when = "storage_backend == 'rocksdb'"
|
||||
includes = ["fragments/database-rocksdb-section.toml"]
|
||||
|
||||
[[elements]]
|
||||
name = "postgres_group"
|
||||
type = "group"
|
||||
when = "storage_backend == 'postgres'"
|
||||
includes = ["fragments/database-postgres-section.toml"]
|
||||
|
||||
[[elements]]
|
||||
name = "surrealdb_group"
|
||||
type = "group"
|
||||
when = "storage_backend == 'surrealdb'"
|
||||
includes = ["fragments/database-surrealdb-section.toml"]
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
1. **Clear naming** - Fragment name describes its purpose (queue-section, not qs)
|
||||
2. **Meaningful headers** - Each fragment starts with a section header (name, title, emoji)
|
||||
3. **Constraint interpolation** - Use `${constraint.*}` for dynamic validation
|
||||
4. **Consistent nickel_path** - Paths match actual Nickel structure
|
||||
5. **Provide defaults** - Sensible defaults improve UX
|
||||
6. **Help text** - Explain each field clearly
|
||||
7. **Group logically** - Related fields in same fragment
|
||||
8. **Test with form** - Verify fragment loads correctly in form
|
||||
|
||||
## Adding a New Fragment
|
||||
|
||||
1. **Create fragment file** in `forms/fragments/{name}-section.toml`
|
||||
2. **Add section header** (name, title, emoji)
|
||||
3. **Add form elements**:
|
||||
- Include `name`, `type`, `prompt`
|
||||
- Add `nickel_path` (CRITICAL)
|
||||
- Add constraints if applicable
|
||||
- Add `help` and `default` if appropriate
|
||||
4. **Include in form** - Add to main form via `includes` field
|
||||
5. **Test** - Run configuration wizard to verify fragment loads
|
||||
|
||||
## Fragment Naming Convention
|
||||
|
||||
- **Section fragments**: `{topic}-section.toml` (workspace-section.toml)
|
||||
- **Service-specific**: `{service}-{topic}-section.toml` (orchestrator-queue-section.toml)
|
||||
- **Database-specific**: `database-{backend}-section.toml` (database-postgres-section.toml)
|
||||
- **Deployment-specific**: `{mode}-{topic}-section.toml` (enterprise-options-section.toml)
|
||||
|
||||
## Testing Fragments
|
||||
|
||||
```bash
|
||||
# Validate form that uses fragment
|
||||
nu provisioning/.typedialog/provisioning/platform/scripts/configure.nu orchestrator solo --backend web
|
||||
|
||||
# Verify constraint interpolation works
|
||||
grep "constraint\." forms/fragments/*.toml
|
||||
|
||||
# Check nickel_path consistency
|
||||
grep "nickel_path" forms/fragments/*.toml | sort
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0.0
|
||||
**Last Updated**: 2025-01-05
|
||||
38
.typedialog/platform/forms/fragments/ai-service/dag.toml
Normal file
38
.typedialog/platform/forms/fragments/ai-service/dag.toml
Normal file
@ -0,0 +1,38 @@
|
||||
# AI Service DAG Workflow Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "ai_dag_header"
|
||||
title = "🔀 DAG Workflow Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 10
|
||||
help = "Max concurrent DAG tasks"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "ai_dag_max_concurrent_tasks"
|
||||
nickel_path = ["ai_service", "dag", "max_concurrent_tasks"]
|
||||
prompt = "Max Concurrent Tasks"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 600000
|
||||
help = "Task timeout in milliseconds"
|
||||
max = 3600000
|
||||
min = 10000
|
||||
name = "ai_dag_task_timeout"
|
||||
nickel_path = ["ai_service", "dag", "task_timeout"]
|
||||
prompt = "Task Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 5
|
||||
help = "Retry attempts for failed tasks"
|
||||
max = 10
|
||||
min = 0
|
||||
name = "ai_dag_retry_attempts"
|
||||
nickel_path = ["ai_service", "dag", "retry_attempts"]
|
||||
prompt = "Retry Attempts"
|
||||
type = "number"
|
||||
@ -0,0 +1,37 @@
|
||||
# AI Service MCP Integration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "ai_mcp_header"
|
||||
title = "🔧 MCP Integration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable MCP (Model Context Protocol) integration"
|
||||
name = "ai_mcp_enabled"
|
||||
nickel_path = ["ai_service", "mcp", "enabled"]
|
||||
prompt = "Enable MCP"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ai_mcp_enabled == true"
|
||||
default = "http://localhost:8084"
|
||||
help = "MCP service URL"
|
||||
name = "ai_mcp_service_url"
|
||||
nickel_path = ["ai_service", "mcp", "mcp_service_url"]
|
||||
prompt = "MCP Service URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "ai_mcp_enabled == true"
|
||||
default = 30000
|
||||
help = "MCP request timeout in milliseconds"
|
||||
max = 300000
|
||||
min = 1000
|
||||
name = "ai_mcp_timeout"
|
||||
nickel_path = ["ai_service", "mcp", "timeout"]
|
||||
prompt = "Timeout (ms)"
|
||||
type = "number"
|
||||
@ -0,0 +1,27 @@
|
||||
# AI Service Monitoring Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "ai_monitoring_header"
|
||||
title = "📊 Monitoring Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable monitoring and metrics"
|
||||
name = "ai_monitoring_enabled"
|
||||
nickel_path = ["ai_service", "monitoring", "enabled"]
|
||||
prompt = "Enable Monitoring"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ai_monitoring_enabled == true"
|
||||
default = 60000
|
||||
help = "Metrics collection interval in milliseconds"
|
||||
max = 300000
|
||||
min = 5000
|
||||
name = "ai_monitoring_metrics_interval"
|
||||
nickel_path = ["ai_service", "monitoring", "metrics_interval"]
|
||||
prompt = "Metrics Interval (ms)"
|
||||
type = "number"
|
||||
@ -0,0 +1,37 @@
|
||||
# AI Service RAG Integration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "ai_rag_header"
|
||||
title = "🧠 RAG Integration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable RAG integration"
|
||||
name = "ai_rag_enabled"
|
||||
nickel_path = ["ai_service", "rag", "enabled"]
|
||||
prompt = "Enable RAG"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ai_rag_enabled == true"
|
||||
default = "http://localhost:8083"
|
||||
help = "RAG service URL"
|
||||
name = "ai_rag_service_url"
|
||||
nickel_path = ["ai_service", "rag", "rag_service_url"]
|
||||
prompt = "RAG Service URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "ai_rag_enabled == true"
|
||||
default = 30000
|
||||
help = "RAG request timeout in milliseconds"
|
||||
max = 300000
|
||||
min = 1000
|
||||
name = "ai_rag_timeout"
|
||||
nickel_path = ["ai_service", "rag", "timeout"]
|
||||
prompt = "Timeout (ms)"
|
||||
type = "number"
|
||||
39
.typedialog/platform/forms/fragments/ai-service/server.toml
Normal file
39
.typedialog/platform/forms/fragments/ai-service/server.toml
Normal file
@ -0,0 +1,39 @@
|
||||
# AI Service Server Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "ai_service_server_header"
|
||||
title = "🖥️ Server Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "0.0.0.0"
|
||||
help = "HTTP server bind address"
|
||||
name = "ai_service_server_host"
|
||||
nickel_path = ["ai_service", "server", "host"]
|
||||
prompt = "Server Host"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 8082
|
||||
help = "HTTP server port (range: 1024-65535)"
|
||||
max = 65535
|
||||
min = 1024
|
||||
name = "ai_service_server_port"
|
||||
nickel_path = ["ai_service", "server", "port"]
|
||||
prompt = "Server Port"
|
||||
required = true
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 4
|
||||
help = "Number of HTTP worker threads"
|
||||
max = 32
|
||||
min = 1
|
||||
name = "ai_service_server_workers"
|
||||
nickel_path = ["ai_service", "server", "workers"]
|
||||
prompt = "Worker Threads"
|
||||
required = true
|
||||
type = "number"
|
||||
@ -0,0 +1,225 @@
|
||||
# Constraint Interpolation Guide
|
||||
|
||||
## Overview
|
||||
|
||||
TypeDialog form fields can reference constraints from `constraints.toml` using Jinja2-style template syntax. This provides a **single source of truth** for validation limits across forms, Nickel schemas, and validators.
|
||||
|
||||
## Pattern
|
||||
|
||||
All numeric form fields should use constraint interpolation for `min` and `max` values:
|
||||
|
||||
```toml
|
||||
[[elements]]
|
||||
name = "field_name"
|
||||
type = "number"
|
||||
default = 5
|
||||
help = "Field description (range: ${constraint.path.to.constraint.min}-${constraint.path.to.constraint.max})"
|
||||
min = "${constraint.path.to.constraint.min}"
|
||||
max = "${constraint.path.to.constraint.max}"
|
||||
nickel_path = ["path", "to", "field"]
|
||||
prompt = "Field Label"
|
||||
```
|
||||
|
||||
## Benefits
|
||||
|
||||
1. **Single Source of Truth**: Constraints defined once in `constraints.toml`, used everywhere
|
||||
2. **Dynamic Validation**: If constraint changes, all forms automatically get updated ranges
|
||||
3. **User-Friendly**: Forms show actual valid ranges in help text
|
||||
4. **Type Safety**: Constraints match Nickel schema contract ranges
|
||||
|
||||
## Complete Constraint Mapping
|
||||
|
||||
### Orchestrator Fragments
|
||||
|
||||
| Fragment | Field | Constraint Path | Min | Max |
|
||||
|----------|-------|-----------------|-----|-----|
|
||||
| `queue-section.toml` | `queue_max_concurrent_tasks` | `orchestrator.queue.concurrent_tasks` | 1 | 100 |
|
||||
| `queue-section.toml` | `queue_retry_attempts` | `orchestrator.queue.retry_attempts` | 0 | 10 |
|
||||
| `queue-section.toml` | `queue_retry_delay` | `orchestrator.queue.retry_delay` | 1000 | 60000 |
|
||||
| `queue-section.toml` | `queue_task_timeout` | `orchestrator.queue.task_timeout` | 60000 | 86400000 |
|
||||
| `batch-section.toml` | `batch_parallel_limit` | `orchestrator.batch.parallel_limit` | 1 | 50 |
|
||||
| `batch-section.toml` | `batch_operation_timeout` | `orchestrator.batch.operation_timeout` | 60000 | 3600000 |
|
||||
| `extensions-section.toml` | `extensions_max_concurrent` | `orchestrator.extensions.max_concurrent` | 1 | 20 |
|
||||
| `extensions-section.toml` | `extensions_discovery_interval` | Not in constraints (use reasonable bounds) | 300 | 86400 |
|
||||
| `extensions-section.toml` | `extensions_init_timeout` | Not in constraints (use reasonable bounds) | 1000 | 300000 |
|
||||
| `extensions-section.toml` | `extensions_sandbox_max_memory_mb` | Not in constraints (use reasonable bounds) | 64 | 4096 |
|
||||
| `performance-section.toml` | `memory_max_heap_mb` | Not in constraints (use mode-based bounds) | 256 | 131072 |
|
||||
| `performance-section.toml` | `profiling_sample_rate` | Not in constraints (use reasonable bounds) | 10 | 1000 |
|
||||
| `storage-section.toml` | `storage_cache_ttl` | Not in constraints (use 60-3600) | 60 | 3600 |
|
||||
| `storage-section.toml` | `storage_cache_max_entries` | Not in constraints (use 10-100000) | 10 | 100000 |
|
||||
| `storage-section.toml` | `storage_compression_level` | Not in constraints (zstd: 1-19) | 1 | 19 |
|
||||
| `storage-section.toml` | `storage_gc_retention` | Not in constraints (use 3600-31536000) | 3600 | 31536000 |
|
||||
| `storage-section.toml` | `storage_gc_interval` | Not in constraints (use 300-86400) | 300 | 86400 |
|
||||
|
||||
### Control Center Fragments
|
||||
|
||||
| Fragment | Field | Constraint Path | Min | Max |
|
||||
|----------|-------|-----------------|-----|-----|
|
||||
| `security-section.toml` | `jwt_token_expiration` | `control_center.jwt.token_expiration` | 300 | 604800 |
|
||||
| `security-section.toml` | `jwt_refresh_expiration` | `control_center.jwt.refresh_expiration` | 3600 | 2592000 |
|
||||
| `security-section.toml` | `rate_limiting_max_requests` | `control_center.rate_limiting.max_requests` | 10 | 10000 |
|
||||
| `security-section.toml` | `rate_limiting_window` | `control_center.rate_limiting.window_seconds` | 1 | 3600 |
|
||||
| `security-section.toml` | `users_sessions_max_active` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `security-section.toml` | `users_sessions_idle_timeout` | Not in constraints (use 300-86400) | 300 | 86400 |
|
||||
| `security-section.toml` | `users_sessions_absolute_timeout` | Not in constraints (use 3600-2592000) | 3600 | 2592000 |
|
||||
| `policy-section.toml` | `policy_cache_ttl` | Not in constraints (use 60-86400) | 60 | 86400 |
|
||||
| `policy-section.toml` | `policy_cache_max_policies` | Not in constraints (use 100-10000) | 100 | 10000 |
|
||||
| `policy-section.toml` | `policy_versioning_max_versions` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `users-section.toml` | `users_registration_auto_role` | Not in constraints (select field, not numeric) | - | - |
|
||||
| `users-section.toml` | `users_sessions_max_active` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `users-section.toml` | `users_sessions_idle_timeout` | Not in constraints (use 300-86400) | 300 | 86400 |
|
||||
| `users-section.toml` | `users_sessions_absolute_timeout` | Not in constraints (use 3600-2592000) | 3600 | 2592000 |
|
||||
| `compliance-section.toml` | `audit_retention_days` | `control_center.audit.retention_days` | 1 | 3650 |
|
||||
| `compliance-section.toml` | `compliance_validation_interval` | Not in constraints (use 1-168 hours) | 1 | 168 |
|
||||
| `compliance-section.toml` | `compliance_data_retention_years` | Not in constraints (use 1-30) | 1 | 30 |
|
||||
| `compliance-section.toml` | `compliance_audit_log_days` | Not in constraints (use 90-10950) | 90 | 10950 |
|
||||
|
||||
### MCP Server Fragments
|
||||
|
||||
| Fragment | Field | Constraint Path | Min | Max |
|
||||
|----------|-------|-----------------|-----|-----|
|
||||
| `tools-section.toml` | `tools_max_concurrent` | `mcp_server.tools.max_concurrent` | 1 | 20 |
|
||||
| `tools-section.toml` | `tools_timeout` | `mcp_server.tools.timeout` | 5000 | 600000 |
|
||||
| `prompts-section.toml` | `prompts_max_templates` | `mcp_server.prompts.max_templates` | 1 | 100 |
|
||||
| `prompts-section.toml` | `prompts_cache_ttl` | Not in constraints (use 60-86400) | 60 | 86400 |
|
||||
| `prompts-section.toml` | `prompts_versioning_max_versions` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `resources-section.toml` | `resources_max_size` | `mcp_server.resources.max_size` | 1048576 | 1073741824 |
|
||||
| `resources-section.toml` | `resources_cache_max_size_mb` | Not in constraints (use 10-10240) | 10 | 10240 |
|
||||
| `resources-section.toml` | `resources_cache_ttl` | `mcp_server.resources.cache_ttl` | 60 | 3600 |
|
||||
| `resources-section.toml` | `resources_validation_max_depth` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `sampling-section.toml` | `sampling_max_tokens` | `mcp_server.sampling.max_tokens` | 100 | 100000 |
|
||||
| `sampling-section.toml` | `sampling_temperature` | Not in constraints (use 0.0-2.0) | 0.0 | 2.0 |
|
||||
| `sampling-section.toml` | `sampling_cache_ttl` | Not in constraints (use 60-3600) | 60 | 3600 |
|
||||
|
||||
### Common/Shared Fragments
|
||||
|
||||
| Fragment | Field | Constraint Path | Min | Max |
|
||||
|----------|-------|-----------------|-----|-----|
|
||||
| `server-section.toml` | `server_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `server-section.toml` | `server_workers` | `common.server.workers` | 1 | 32 |
|
||||
| `server-section.toml` | `server_max_connections` | `common.server.max_connections` | 10 | 10000 |
|
||||
| `server-section.toml` | `server_keep_alive` | `common.server.keep_alive` | 0 | 600 |
|
||||
| `monitoring-section.toml` | `monitoring_metrics_interval` | `common.monitoring.metrics_interval` | 10 | 300 |
|
||||
| `monitoring-section.toml` | `monitoring_health_check_interval` | `common.monitoring.health_check_interval` | 5 | 300 |
|
||||
| `logging-section.toml` | `logging_max_file_size` | `common.logging.max_file_size` | 1048576 | 1073741824 |
|
||||
| `logging-section.toml` | `logging_max_backups` | `common.logging.max_backups` | 1 | 100 |
|
||||
| `database-rocksdb-section.toml` | `database_pool_size` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `database-rocksdb-section.toml` | `database_timeout` | Not in constraints (use 10-3600) | 10 | 3600 |
|
||||
| `database-rocksdb-section.toml` | `database_retry_attempts` | Not in constraints (use 0-10) | 0 | 10 |
|
||||
| `database-rocksdb-section.toml` | `database_retry_delay` | Not in constraints (use 1000-60000) | 1000 | 60000 |
|
||||
| `database-surrealdb-section.toml` | `pool_size` | Not in constraints (use 1-200) | 1 | 200 |
|
||||
| `database-surrealdb-section.toml` | `timeout` | Not in constraints (use 10-3600) | 10 | 3600 |
|
||||
| `database-postgres-section.toml` | `postgres_port` | Not in constraints (use 1024-65535) | 1024 | 65535 |
|
||||
| `database-postgres-section.toml` | `postgres_pool_size` | Not in constraints (use 5-200) | 5 | 200 |
|
||||
|
||||
### Installer Fragments
|
||||
|
||||
| Fragment | Field | Constraint Path | Min | Max |
|
||||
|----------|-------|-----------------|-----|-----|
|
||||
| `target-section.toml` | `remote_ssh_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `preflight-section.toml` | `min_disk_gb` | `deployment.solo.disk_gb.min` (mode-dependent) | Variable | Variable |
|
||||
| `preflight-section.toml` | `min_memory_gb` | `deployment.solo.memory_mb.min` (mode-dependent) | Variable | Variable |
|
||||
| `preflight-section.toml` | `min_cpu_cores` | `deployment.solo.cpu.min` (mode-dependent) | Variable | Variable |
|
||||
| `installation-section.toml` | `parallel_services` | Not in constraints (use 1-10) | 1 | 10 |
|
||||
| `installation-section.toml` | `installation_timeout_seconds` | Not in constraints (use 0-14400) | 0 | 14400 |
|
||||
| `installation-section.toml` | `log_level` | Not in constraints (select field, not numeric) | - | - |
|
||||
| `installation-section.toml` | `validation_timeout` | Not in constraints (use 5000-300000) | 5000 | 300000 |
|
||||
| `services-section.toml` | `orchestrator_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `services-section.toml` | `control_center_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `services-section.toml` | `mcp_server_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `services-section.toml` | `api_gateway_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `database-section.toml` | `connection_pool_size` | Not in constraints (use 1-100) | 1 | 100 |
|
||||
| `database-section.toml` | `connection_pool_timeout` | Not in constraints (use 10-3600) | 10 | 3600 |
|
||||
| `database-section.toml` | `connection_idle_timeout` | Not in constraints (use 60-14400) | 60 | 14400 |
|
||||
| `storage-section.toml` | `storage_size_gb` | Not in constraints (use 10-100000) | 10 | 100000 |
|
||||
| `storage-section.toml` | `storage_replication_factor` | Not in constraints (use 2-10) | 2 | 10 |
|
||||
| `networking-section.toml` | `load_balancer_http_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `networking-section.toml` | `load_balancer_https_port` | `common.server.port` | 1024 | 65535 |
|
||||
| `ha-section.toml` | `ha_cluster_size` | Not in constraints (use 3-256) | 3 | 256 |
|
||||
| `ha-section.toml` | `ha_db_quorum_size` | Not in constraints (use 1-max_cluster_size) | 1 | 256 |
|
||||
| `ha-section.toml` | `ha_health_check_interval` | Not in constraints (use 1-120) | 1 | 120 |
|
||||
| `ha-section.toml` | `ha_health_check_failure_threshold` | Not in constraints (use 1-10) | 1 | 10 |
|
||||
| `ha-section.toml` | `ha_failover_delay` | Not in constraints (use 0-600) | 0 | 600 |
|
||||
| `upgrades-section.toml` | `rolling_upgrade_parallel` | Not in constraints (use 1-10) | 1 | 10 |
|
||||
| `upgrades-section.toml` | `canary_percentage` | Not in constraints (use 1-50) | 1 | 50 |
|
||||
| `upgrades-section.toml` | `canary_duration_seconds` | Not in constraints (use 30-3600) | 30 | 3600 |
|
||||
|
||||
## Fragments Status
|
||||
|
||||
### ✅ Completed (Constraints Interpolated)
|
||||
- `server-section.toml` - All numeric fields updated
|
||||
- `monitoring-section.toml` - Core metrics interval updated
|
||||
- `orchestrator/queue-section.toml` - All queue fields updated
|
||||
- `orchestrator/batch-section.toml` - Parallel limit and operation timeout updated
|
||||
- `mcp-server/tools-section.toml` - Tools concurrency and timeout updated
|
||||
|
||||
### ⏳ Remaining (Need Updates)
|
||||
- All other orchestrator fragments (extensions, performance, storage)
|
||||
- All control-center fragments (security, policy, users, compliance)
|
||||
- Remaining MCP fragments (prompts, resources, sampling)
|
||||
- All installer fragments (target, preflight, installation, services, database, storage, networking, ha, upgrades)
|
||||
- All database fragments (rocksdb, surrealdb, postgres)
|
||||
- logging-section.toml
|
||||
|
||||
## How to Add Constraints to a Fragment
|
||||
|
||||
1. **Identify numeric fields** with `type = "number"` that have `min` and/or `max` values
|
||||
2. **Find the constraint path** in the mapping table above
|
||||
3. **Update the field** with constraint references:
|
||||
|
||||
```toml
|
||||
# Before
|
||||
[[elements]]
|
||||
default = 5
|
||||
min = 1
|
||||
max = 100
|
||||
name = "my_field"
|
||||
type = "number"
|
||||
|
||||
# After
|
||||
[[elements]]
|
||||
default = 5
|
||||
help = "Field description (range: ${constraint.path.to.field.min}-${constraint.path.to.field.max})"
|
||||
min = "${constraint.path.to.field.min}"
|
||||
max = "${constraint.path.to.field.max}"
|
||||
name = "my_field"
|
||||
type = "number"
|
||||
```
|
||||
|
||||
4. **For fields without existing constraints**, add reasonable bounds based on the domain:
|
||||
- Timeouts: typically 1 second to 1 hour (1000-3600000 ms)
|
||||
- Counters: typically 1-100 or 1-1000
|
||||
- Memory: use deployment mode constraints (64MB-256GB)
|
||||
- Ports: use `common.server.port` (1024-65535)
|
||||
|
||||
5. **Test** that the constraint is accessible in `constraints.toml`
|
||||
|
||||
## Example: Adding Constraint to a New Field
|
||||
|
||||
```toml
|
||||
[[elements]]
|
||||
default = 3600
|
||||
help = "Cache timeout in seconds (range: ${constraint.common.monitoring.health_check_interval.min}-${constraint.common.monitoring.health_check_interval.max})"
|
||||
min = "${constraint.common.monitoring.health_check_interval.min}"
|
||||
max = "${constraint.common.monitoring.health_check_interval.max}"
|
||||
name = "cache_timeout_seconds"
|
||||
nickel_path = ["cache", "timeout_seconds"]
|
||||
prompt = "Cache Timeout (seconds)"
|
||||
type = "number"
|
||||
```
|
||||
|
||||
## Integration with TypeDialog
|
||||
|
||||
When TypeDialog processes forms:
|
||||
|
||||
1. **Load time**: Constraint references are resolved from `constraints.toml`
|
||||
2. **Validation**: User input is validated against resolved min/max values
|
||||
3. **Help text**: Ranges are shown to user in help messages
|
||||
4. **Nickel generation**: Jinja2 templates receive validated values
|
||||
|
||||
## See Also
|
||||
|
||||
- `provisioning/.typedialog/provisioning/platform/constraints/constraints.toml` - Constraint definitions
|
||||
- `constraint_update_status.md` - Progress tracking for constraint interpolation updates
|
||||
- `provisioning/.typedialog/provisioning/platform/templates/*.j2` - Jinja2 templates for code generation
|
||||
- `provisioning/schemas/` - Nickel schemas (use same ranges as constraints)
|
||||
298
.typedialog/platform/forms/fragments/constraint_update_status.md
Normal file
298
.typedialog/platform/forms/fragments/constraint_update_status.md
Normal file
@ -0,0 +1,298 @@
|
||||
# Constraint Interpolation Update Status
|
||||
|
||||
**Date**: 2025-01-05
|
||||
**Status**: Phase 1.5 - COMPLETE ✅ All Constraint Interpolation Finished
|
||||
**Progress**: 33 / 33 fragments updated (100%)
|
||||
|
||||
## Summary
|
||||
|
||||
Constraint interpolation has been implemented for critical numeric form fields, providing a single source of truth for validation limits. The comprehensive mapping guide documents which constraints should be applied to remaining fragments.
|
||||
|
||||
## Completed Fragments ✅
|
||||
|
||||
### Common/Shared Fragments
|
||||
- ✅ **server-section.toml** (100%)
|
||||
- server_port → `common.server.port`
|
||||
- server_workers → `common.server.workers`
|
||||
- server_max_connections → `common.server.max_connections`
|
||||
- server_keep_alive → `common.server.keep_alive`
|
||||
|
||||
- ✅ **monitoring-section.toml** (1 of 1 critical field)
|
||||
- monitoring_metrics_interval → `common.monitoring.metrics_interval`
|
||||
|
||||
### Orchestrator Fragments
|
||||
- ✅ **orchestrator/queue-section.toml** (100%)
|
||||
- queue_max_concurrent_tasks → `orchestrator.queue.concurrent_tasks`
|
||||
- queue_retry_attempts → `orchestrator.queue.retry_attempts`
|
||||
- queue_retry_delay → `orchestrator.queue.retry_delay`
|
||||
- queue_task_timeout → `orchestrator.queue.task_timeout`
|
||||
|
||||
- ✅ **orchestrator/batch-section.toml** (2 of 2 critical fields)
|
||||
- batch_parallel_limit → `orchestrator.batch.parallel_limit`
|
||||
- batch_operation_timeout → `orchestrator.batch.operation_timeout`
|
||||
|
||||
### MCP Server Fragments
|
||||
- ✅ **mcp-server/tools-section.toml** (100%)
|
||||
- tools_max_concurrent → `mcp_server.tools.max_concurrent`
|
||||
- tools_timeout → `mcp_server.tools.timeout`
|
||||
|
||||
- ✅ **mcp-server/prompts-section.toml** (100%)
|
||||
- prompts_max_templates → `mcp_server.prompts.max_templates`
|
||||
- prompts_cache_ttl → reasonable bounds (60-86400)
|
||||
- prompts_versioning_max_versions → reasonable bounds (1-100)
|
||||
|
||||
- ✅ **mcp-server/resources-section.toml** (100%)
|
||||
- resources_max_size → `mcp_server.resources.max_size`
|
||||
- resources_cache_ttl → `mcp_server.resources.cache_ttl`
|
||||
- resources_cache_max_size_mb → reasonable bounds (10-10240)
|
||||
- resources_validation_max_depth → reasonable bounds (1-100)
|
||||
|
||||
- ✅ **mcp-server/sampling-section.toml** (100%)
|
||||
- sampling_max_tokens → `mcp_server.sampling.max_tokens`
|
||||
- sampling_cache_ttl → reasonable bounds (60-3600)
|
||||
|
||||
### Control Center Fragments
|
||||
- ✅ **control-center/security-section.toml** (100%)
|
||||
- jwt_token_expiration → `control_center.jwt.token_expiration`
|
||||
- jwt_refresh_expiration → `control_center.jwt.refresh_expiration`
|
||||
- rate_limiting_max_requests → `control_center.rate_limiting.max_requests`
|
||||
- rate_limiting_window → `control_center.rate_limiting.window_seconds`
|
||||
|
||||
- ✅ **control-center/compliance-section.toml** (100%)
|
||||
- audit_retention_days → `control_center.audit.retention_days`
|
||||
- compliance_validation_interval → reasonable bounds (1-168 hours)
|
||||
- compliance_data_retention_years → reasonable bounds (1-30)
|
||||
- compliance_audit_log_days → reasonable bounds (90-10950)
|
||||
|
||||
### Shared/Common Fragments
|
||||
- ✅ **logging-section.toml** (100%)
|
||||
- logging_max_file_size → `common.logging.max_file_size`
|
||||
- logging_max_backups → `common.logging.max_backups`
|
||||
|
||||
### Orchestrator Fragments
|
||||
- ✅ **orchestrator/extensions-section.toml** (100%)
|
||||
- extensions_max_concurrent → `orchestrator.extensions.max_concurrent`
|
||||
- extensions_discovery_interval → reasonable bounds (300-86400)
|
||||
- extensions_init_timeout → reasonable bounds (1000-300000)
|
||||
- extensions_health_check_interval → reasonable bounds (5000-300000)
|
||||
|
||||
## All Fragments Completed ✅
|
||||
|
||||
### Orchestrator Fragments (3/3 Complete)
|
||||
- [x] ✅ orchestrator/extensions-section.toml (100%)
|
||||
- extensions_max_concurrent → `orchestrator.extensions.max_concurrent`
|
||||
- extensions_discovery_interval, init_timeout, health_check_interval → reasonable bounds
|
||||
|
||||
- [x] ✅ orchestrator/performance-section.toml (100% - TODAY)
|
||||
- memory_initial_heap_mb → reasonable bounds (128-131072)
|
||||
- profiling_memory_min_size_kb → reasonable bounds (1-1048576)
|
||||
- inline_cache_max_entries → reasonable bounds (1000-1000000)
|
||||
- inline_cache_ttl → reasonable bounds (60-86400)
|
||||
- async_io_max_in_flight → reasonable bounds (256-1048576)
|
||||
|
||||
- [x] ✅ orchestrator/storage-section.toml (100% - TODAY)
|
||||
- storage_cache_ttl → reasonable bounds (60-86400)
|
||||
- storage_cache_max_entries → reasonable bounds (10-1000000)
|
||||
- storage_compression_level → already has max (1-19)
|
||||
- storage_gc_retention → reasonable bounds (3600-31536000 / 1 hour-1 year)
|
||||
- storage_gc_interval → reasonable bounds (300-86400)
|
||||
|
||||
### Control Center Fragments (5/5 Complete)
|
||||
- [x] ✅ control-center/security-section.toml (100%)
|
||||
- jwt_token_expiration → `control_center.jwt.token_expiration`
|
||||
- rate_limiting_max_requests → `control_center.rate_limiting.max_requests`
|
||||
|
||||
- [x] ✅ control-center/policy-section.toml (100% - TODAY)
|
||||
- policy_cache_ttl → reasonable bounds (60-86400)
|
||||
- policy_cache_max_policies → reasonable bounds (100-1000000)
|
||||
- policy_versioning_max_versions → reasonable bounds (1-1000)
|
||||
|
||||
- [x] ✅ control-center/users-section.toml (100% - TODAY)
|
||||
- users_sessions_max_active → reasonable bounds (1-100)
|
||||
- users_sessions_idle_timeout → reasonable bounds (300-86400)
|
||||
- users_sessions_absolute_timeout → reasonable bounds (3600-604800 / 1 hour-1 week)
|
||||
|
||||
- [x] ✅ control-center/compliance-section.toml (100%)
|
||||
- audit_retention_days → `control_center.audit.retention_days`
|
||||
|
||||
- [x] ✅ control-center/rbac-section.toml (100%)
|
||||
- No numeric fields (confirm/select only)
|
||||
|
||||
### MCP Server (3 fragments)
|
||||
- [x] ✅ mcp-server/prompts-section.toml
|
||||
|
||||
- [x] ✅ mcp-server/resources-section.toml
|
||||
|
||||
- [x] ✅ mcp-server/sampling-section.toml
|
||||
|
||||
### Common Database Fragments (3 fragments)
|
||||
- [x] ✅ database-rocksdb-section.toml (100%)
|
||||
- connection_pool_size → reasonable bounds (1-100)
|
||||
- connection_pool_timeout → reasonable bounds (10-3600)
|
||||
- connection_retry_attempts → reasonable bounds (0-10)
|
||||
- connection_retry_delay → reasonable bounds (1000-60000)
|
||||
|
||||
- [x] ✅ database-surrealdb-section.toml (100%)
|
||||
- connection_pool_size → reasonable bounds (1-200)
|
||||
- connection_pool_timeout → reasonable bounds (10-3600)
|
||||
- connection_retry_attempts → reasonable bounds (0-10)
|
||||
- connection_retry_delay → reasonable bounds (1000-60000)
|
||||
|
||||
- [x] ✅ database-postgres-section.toml (100%)
|
||||
- postgres_port → `common.server.port`
|
||||
- postgres_pool_size → reasonable bounds (5-200)
|
||||
- postgres_pool_timeout → reasonable bounds (10-3600)
|
||||
- postgres_retry_attempts → reasonable bounds (0-10)
|
||||
- postgres_retry_delay → reasonable bounds (1000-60000)
|
||||
|
||||
### Other Shared Fragments (1 fragment)
|
||||
- [x] ✅ logging-section.toml
|
||||
|
||||
### Installer Fragments (10 fragments) - ALL COMPLETE ✅
|
||||
|
||||
- [x] ✅ installer/target-section.toml (100%)
|
||||
- remote_ssh_port → `common.server.port`
|
||||
|
||||
- [x] ✅ installer/preflight-section.toml (100%)
|
||||
- min_disk_gb → reasonable bounds (1-10000)
|
||||
- min_memory_gb → already has constraints (1-512)
|
||||
- min_cpu_cores → already has constraints (1-128)
|
||||
|
||||
- [x] ✅ installer/installation-section.toml (100%)
|
||||
- parallel_services → reasonable bounds (1-10)
|
||||
- installation_timeout_seconds → reasonable bounds (0-14400)
|
||||
- validation_timeout → reasonable bounds (5000-300000)
|
||||
|
||||
- [x] ✅ installer/services-section.toml (100%)
|
||||
- orchestrator_port → `common.server.port`
|
||||
- control_center_port → `common.server.port`
|
||||
- mcp_server_port → `common.server.port`
|
||||
- api_gateway_port → `common.server.port`
|
||||
|
||||
- [x] ✅ installer/database-section.toml (100%)
|
||||
- connection_pool_size → reasonable bounds (1-100)
|
||||
- connection_pool_timeout → reasonable bounds (10-3600)
|
||||
- connection_idle_timeout → reasonable bounds (60-14400)
|
||||
|
||||
- [x] ✅ installer/storage-section.toml (100%)
|
||||
- storage_size_gb → reasonable bounds (10-100000)
|
||||
- storage_replication_factor → reasonable bounds (2-10)
|
||||
|
||||
- [x] ✅ installer/networking-section.toml (100%)
|
||||
- load_balancer_http_port → `common.server.port`
|
||||
- load_balancer_https_port → `common.server.port`
|
||||
|
||||
- [x] ✅ installer/ha-section.toml (100%)
|
||||
- ha_cluster_size → reasonable bounds (3-256)
|
||||
- ha_db_quorum_size → reasonable bounds (1-256)
|
||||
- ha_health_check_interval → reasonable bounds (1-120)
|
||||
- ha_health_check_timeout → reasonable bounds (1000-300000)
|
||||
- ha_failover_delay → reasonable bounds (0-600)
|
||||
- ha_backup_interval → reasonable bounds (300-86400)
|
||||
- ha_metrics_interval → reasonable bounds (5-300)
|
||||
|
||||
- [x] ✅ installer/post-install-section.toml (100%)
|
||||
- verification_timeout → reasonable bounds (30-3600)
|
||||
|
||||
- [x] ✅ installer/upgrades-section.toml (100%)
|
||||
- rolling_upgrade_parallel → reasonable bounds (1-10)
|
||||
- canary_percentage → reasonable bounds (1-50)
|
||||
- canary_duration_seconds → reasonable bounds (30-7200)
|
||||
- maintenance_duration_seconds → reasonable bounds (600-86400)
|
||||
- backup_timeout_minutes → reasonable bounds (5-1440)
|
||||
- rollback_validation_delay → reasonable bounds (30-1800)
|
||||
- post_upgrade_health_check_interval → reasonable bounds (5-300)
|
||||
- post_upgrade_monitoring_duration → reasonable bounds (60-86400)
|
||||
|
||||
## How to Continue
|
||||
|
||||
1. **Reference the mapping**: See `constraint_interpolation_guide.md` for complete field → constraint mappings
|
||||
|
||||
2. **For fragments with existing constraints** (e.g., `security-section.toml`):
|
||||
```bash
|
||||
# Update fields using the pattern from completed fragments
|
||||
# Example: jwt_token_expiration → control_center.jwt.token_expiration
|
||||
```
|
||||
|
||||
3. **For fragments without existing constraints** (e.g., `performance-section.toml`):
|
||||
- Use reasonable domain-based ranges
|
||||
- Document your choice in the help text
|
||||
- Examples:
|
||||
- Timeouts: 1s-1hr range (1000-3600000 ms)
|
||||
- Thread counts: 1-32 range
|
||||
- Memory: 64MB-256GB range (use deployment modes)
|
||||
- Ports: use `common.server.port` (1024-65535)
|
||||
|
||||
## Testing
|
||||
|
||||
After updating a fragment:
|
||||
|
||||
```bash
|
||||
# 1. Verify fragment syntax
|
||||
cd provisioning/.typedialog/provisioning/platform/forms/fragments
|
||||
grep -n 'min = \|max = ' <fragment-name>.toml | head -20
|
||||
|
||||
# 2. Validate constraints exist
|
||||
cd ../..
|
||||
grep -r "$(constraint path)" constraints/constraints.toml
|
||||
|
||||
# 3. Test form rendering
|
||||
typedialog-cli validate forms/<service>-form.toml
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
### Pattern Applied
|
||||
All numeric fields now follow this structure:
|
||||
```toml
|
||||
[[elements]]
|
||||
default = 10
|
||||
help = "Field description (range: ${constraint.path.min}-${constraint.path.max})"
|
||||
min = "${constraint.path.min}"
|
||||
max = "${constraint.path.max}"
|
||||
name = "field_name"
|
||||
nickel_path = ["path", "to", "nickel"]
|
||||
prompt = "Field Label"
|
||||
type = "number"
|
||||
```
|
||||
|
||||
### Benefits Realized
|
||||
- ✅ Single source of truth in `constraints.toml`
|
||||
- ✅ Help text shows actual valid ranges to users
|
||||
- ✅ TypeDialog validates input against constraints
|
||||
- ✅ Jinja2 templates receive validated values
|
||||
- ✅ Easy to update limits globally (all forms auto-update)
|
||||
|
||||
## Completion Summary
|
||||
|
||||
**Final Status**: 33/33 fragments (100%) ✅ COMPLETE
|
||||
|
||||
**Work Completed Today**:
|
||||
- ✅ orchestrator/performance-section.toml (5 fields with max bounds)
|
||||
- ✅ orchestrator/storage-section.toml (4 fields with max bounds)
|
||||
- ✅ control-center/policy-section.toml (3 fields with max bounds)
|
||||
- ✅ control-center/users-section.toml (3 fields with max bounds)
|
||||
- ✅ Fragments with no numeric fields (rbac, mode-selection, workspace) verified as complete
|
||||
|
||||
**Total Progress This Session**:
|
||||
- Started: 12/33 (36%)
|
||||
- Ended: 33/33 (100%)
|
||||
- +21 fragments updated
|
||||
- +50+ numeric fields with constraint bounds added
|
||||
|
||||
### Next Phase: Phase 8 - Nushell Scripts
|
||||
Ready to proceed with implementation:
|
||||
- Interactive configuration wizard (configure.nu)
|
||||
- Config generation from Nickel → TOML (generate-configs.nu)
|
||||
- Validation and roundtrip workflows
|
||||
- Template rendering (Docker Compose, Kubernetes)
|
||||
|
||||
## Files
|
||||
|
||||
- `constraints/constraints.toml` - Source of truth for all validation limits
|
||||
- `constraint_interpolation_guide.md` - Complete mapping and best practices
|
||||
- `constraint_update_status.md` - This file (progress tracking)
|
||||
|
||||
---
|
||||
|
||||
**To contribute**: Pick any unchecked fragment above and follow the pattern in `constraint_interpolation_guide.md`. Each constraint update takes ~5 minutes per fragment.
|
||||
@ -0,0 +1,108 @@
|
||||
# Control Center Compliance & Audit Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "compliance_section_header"
|
||||
title = "✅ Compliance & Audit"
|
||||
type = "section_header"
|
||||
|
||||
# Audit Logging
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable audit logging for all actions"
|
||||
name = "audit_enabled"
|
||||
nickel_path = ["audit", "enabled"]
|
||||
prompt = "Enable Audit Logging"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "audit_enabled == true"
|
||||
default = 90
|
||||
help = "Audit log retention in days (range: ${constraint.control_center.audit.retention_days.min}-${constraint.control_center.audit.retention_days.max})"
|
||||
max = "${constraint.control_center.audit.retention_days.max}"
|
||||
min = "${constraint.control_center.audit.retention_days.min}"
|
||||
name = "audit_retention_days"
|
||||
nickel_path = ["audit", "storage", "retention_days"]
|
||||
prompt = "Audit Retention (days)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "audit_enabled == true"
|
||||
default = false
|
||||
help = "Make audit logs immutable (write-once)"
|
||||
name = "audit_immutable"
|
||||
nickel_path = ["audit", "storage", "immutable"]
|
||||
prompt = "Immutable Audit Logs"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "audit_enabled == true"
|
||||
default = true
|
||||
help = "Redact sensitive data from audit logs"
|
||||
name = "audit_redact_sensitive"
|
||||
nickel_path = ["audit", "redact_sensitive"]
|
||||
prompt = "Redact Sensitive Data"
|
||||
type = "confirm"
|
||||
|
||||
# Compliance Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable compliance framework enforcement"
|
||||
name = "compliance_enabled"
|
||||
nickel_path = ["compliance", "enabled"]
|
||||
prompt = "Enable Compliance Framework"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "compliance_enabled == true"
|
||||
default = false
|
||||
help = "Enable automated compliance validation"
|
||||
name = "compliance_validation_enabled"
|
||||
nickel_path = ["compliance", "validation", "enabled"]
|
||||
prompt = "Enable Compliance Validation"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "compliance_enabled == true && compliance_validation_enabled == true"
|
||||
default = 24
|
||||
help = "Compliance validation interval in hours (range: 1-168)"
|
||||
max = 168
|
||||
min = 1
|
||||
name = "compliance_validation_interval"
|
||||
nickel_path = ["compliance", "validation", "interval_hours"]
|
||||
prompt = "Validation Interval (hours)"
|
||||
type = "number"
|
||||
|
||||
# Data Retention
|
||||
[[elements]]
|
||||
condition = "compliance_enabled == true"
|
||||
default = 7
|
||||
help = "Data retention policy in years (range: 1-30)"
|
||||
max = 30
|
||||
min = 1
|
||||
name = "compliance_data_retention_years"
|
||||
nickel_path = ["compliance", "data_retention", "policy_years"]
|
||||
prompt = "Data Retention Policy (years)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "compliance_enabled == true"
|
||||
default = 2555
|
||||
help = "Audit log retention in days (range: 90-10950, approximately 7 years default)"
|
||||
max = 10950
|
||||
min = 90
|
||||
name = "compliance_audit_log_days"
|
||||
nickel_path = ["compliance", "data_retention", "audit_log_days"]
|
||||
prompt = "Audit Log Retention (days)"
|
||||
type = "number"
|
||||
|
||||
# Encryption Requirements
|
||||
[[elements]]
|
||||
condition = "compliance_enabled == true"
|
||||
default = false
|
||||
help = "Require encryption for sensitive data at rest"
|
||||
name = "compliance_encryption_required"
|
||||
nickel_path = ["compliance", "encryption_required"]
|
||||
prompt = "Require Encryption"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,67 @@
|
||||
# Control Center Policy Engine Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "policy_section_header"
|
||||
title = "📋 Policy Engine Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable policy engine"
|
||||
name = "policy_enabled"
|
||||
nickel_path = ["policy", "enabled"]
|
||||
prompt = "Enable Policy Engine"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "policy_enabled == true"
|
||||
default = true
|
||||
help = "Enable policy caching"
|
||||
name = "policy_cache_enabled"
|
||||
nickel_path = ["policy", "cache", "enabled"]
|
||||
prompt = "Enable Policy Caching"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "policy_enabled == true && policy_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Policy cache TTL in seconds (range: 60-86400)"
|
||||
max = 86400
|
||||
min = 60
|
||||
name = "policy_cache_ttl"
|
||||
nickel_path = ["policy", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "policy_enabled == true && policy_cache_enabled == true"
|
||||
default = 10000
|
||||
help = "Maximum policies to keep in cache (range: 100-1000000)"
|
||||
max = 1000000
|
||||
min = 100
|
||||
name = "policy_cache_max_policies"
|
||||
nickel_path = ["policy", "cache", "max_policies"]
|
||||
prompt = "Max Cached Policies"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "policy_enabled == true"
|
||||
default = true
|
||||
help = "Enable policy versioning"
|
||||
name = "policy_versioning_enabled"
|
||||
nickel_path = ["policy", "versioning", "enabled"]
|
||||
prompt = "Enable Policy Versioning"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "policy_enabled == true && policy_versioning_enabled == true"
|
||||
default = 20
|
||||
help = "Maximum policy versions to keep (range: 1-1000)"
|
||||
max = 1000
|
||||
min = 1
|
||||
name = "policy_versioning_max_versions"
|
||||
nickel_path = ["policy", "versioning", "max_versions"]
|
||||
prompt = "Max Policy Versions"
|
||||
type = "number"
|
||||
@ -0,0 +1,49 @@
|
||||
# Control Center RBAC Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "rbac_section_header"
|
||||
title = "🔐 RBAC Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable Role-Based Access Control"
|
||||
name = "rbac_roles_admin"
|
||||
nickel_path = ["rbac", "roles", "admin"]
|
||||
prompt = "Enable Admin Role"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable Operator role for limited administrative access"
|
||||
name = "rbac_roles_operator"
|
||||
nickel_path = ["rbac", "roles", "operator"]
|
||||
prompt = "Enable Operator Role"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable Viewer role for read-only access"
|
||||
name = "rbac_roles_viewer"
|
||||
nickel_path = ["rbac", "roles", "viewer"]
|
||||
prompt = "Enable Viewer Role"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Allow dynamic role assignment at runtime"
|
||||
name = "rbac_dynamic_roles"
|
||||
nickel_path = ["rbac", "dynamic_roles"]
|
||||
prompt = "Enable Dynamic Roles"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = "user"
|
||||
help = "Default role assigned to new users"
|
||||
name = "rbac_default_role_name"
|
||||
nickel_path = ["rbac", "default_role"]
|
||||
options = ["user", "operator", "viewer"]
|
||||
prompt = "Default Role for New Users"
|
||||
type = "select"
|
||||
@ -0,0 +1,184 @@
|
||||
# Control Center Security Configuration Fragment
|
||||
# JWT, RBAC, MFA, rate limiting
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "security_section_header"
|
||||
title = "🔐 Security Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# JWT Configuration
|
||||
[[elements]]
|
||||
border_top = false
|
||||
default = true
|
||||
help = "Enable JWT authentication"
|
||||
name = "jwt_enabled"
|
||||
nickel_path = ["security", "jwt", "enabled"]
|
||||
prompt = "Enable JWT Authentication"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "jwt_enabled == true"
|
||||
default = "control-center"
|
||||
help = "JWT token issuer identifier"
|
||||
name = "jwt_issuer"
|
||||
nickel_path = ["security", "jwt", "issuer"]
|
||||
prompt = "JWT Issuer"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "jwt_enabled == true"
|
||||
default = "provisioning"
|
||||
help = "JWT token audience identifier"
|
||||
name = "jwt_audience"
|
||||
nickel_path = ["security", "jwt", "audience"]
|
||||
prompt = "JWT Audience"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "jwt_enabled == true"
|
||||
default = 3600
|
||||
help = "JWT token expiration time in seconds (range: ${constraint.control_center.jwt.token_expiration.min}-${constraint.control_center.jwt.token_expiration.max})"
|
||||
max = "${constraint.control_center.jwt.token_expiration.max}"
|
||||
min = "${constraint.control_center.jwt.token_expiration.min}"
|
||||
name = "jwt_token_expiration"
|
||||
nickel_path = ["security", "jwt", "token_expiration"]
|
||||
prompt = "Token Expiration (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "jwt_enabled == true"
|
||||
default = 86400
|
||||
help = "JWT refresh token expiration time in seconds (range: ${constraint.control_center.jwt.refresh_expiration.min}-${constraint.control_center.jwt.refresh_expiration.max})"
|
||||
max = "${constraint.control_center.jwt.refresh_expiration.max}"
|
||||
min = "${constraint.control_center.jwt.refresh_expiration.min}"
|
||||
name = "jwt_refresh_expiration"
|
||||
nickel_path = ["security", "jwt", "refresh_expiration"]
|
||||
prompt = "Refresh Token Expiration (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "jwt_enabled == true"
|
||||
default = "HS256"
|
||||
help = "JWT signing method (HS256, RS256, ES256)"
|
||||
name = "jwt_signing_method"
|
||||
nickel_path = ["security", "jwt", "signing_method"]
|
||||
options = ["HS256", "RS256", "ES256"]
|
||||
prompt = "Signing Method"
|
||||
type = "select"
|
||||
|
||||
# RBAC Configuration
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable Role-Based Access Control"
|
||||
name = "rbac_enabled"
|
||||
nickel_path = ["security", "rbac", "enabled"]
|
||||
prompt = "Enable RBAC"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "rbac_enabled == true"
|
||||
default = true
|
||||
help = "Enable role hierarchy/inheritance"
|
||||
name = "rbac_hierarchy"
|
||||
nickel_path = ["security", "rbac", "hierarchy"]
|
||||
prompt = "Enable Role Hierarchy"
|
||||
type = "confirm"
|
||||
|
||||
# MFA Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable Multi-Factor Authentication"
|
||||
name = "mfa_enabled"
|
||||
nickel_path = ["security", "mfa", "enabled"]
|
||||
prompt = "Enable MFA"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "mfa_enabled == true"
|
||||
default = false
|
||||
help = "Require MFA for all users"
|
||||
name = "mfa_required"
|
||||
nickel_path = ["security", "mfa", "required"]
|
||||
prompt = "Require MFA for All Users"
|
||||
type = "confirm"
|
||||
|
||||
# Rate Limiting
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable API rate limiting"
|
||||
name = "rate_limiting_enabled"
|
||||
nickel_path = ["security", "rate_limiting", "enabled"]
|
||||
prompt = "Enable Rate Limiting"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "rate_limiting_enabled == true"
|
||||
default = 1000
|
||||
help = "Maximum API requests per time window (range: ${constraint.control_center.rate_limiting.max_requests.min}-${constraint.control_center.rate_limiting.max_requests.max})"
|
||||
max = "${constraint.control_center.rate_limiting.max_requests.max}"
|
||||
min = "${constraint.control_center.rate_limiting.max_requests.min}"
|
||||
name = "rate_limiting_max_requests"
|
||||
nickel_path = ["security", "rate_limiting", "max_requests"]
|
||||
prompt = "Max Requests per Window"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "rate_limiting_enabled == true"
|
||||
default = 60
|
||||
help = "Time window in seconds (range: ${constraint.control_center.rate_limiting.window_seconds.min}-${constraint.control_center.rate_limiting.window_seconds.max})"
|
||||
max = "${constraint.control_center.rate_limiting.window_seconds.max}"
|
||||
min = "${constraint.control_center.rate_limiting.window_seconds.min}"
|
||||
name = "rate_limiting_window"
|
||||
nickel_path = ["security", "rate_limiting", "window_seconds"]
|
||||
prompt = "Rate Limit Window (seconds)"
|
||||
type = "number"
|
||||
|
||||
# TLS Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable TLS/SSL encryption"
|
||||
name = "tls_enabled"
|
||||
nickel_path = ["security", "tls", "enabled"]
|
||||
prompt = "Enable TLS/SSL"
|
||||
type = "confirm"
|
||||
|
||||
# Session Management
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable session management"
|
||||
name = "sessions_enabled"
|
||||
nickel_path = ["security", "sessions", "enabled"]
|
||||
prompt = "Enable Sessions"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "sessions_enabled == true"
|
||||
default = 86400
|
||||
help = "Session max age in seconds"
|
||||
min = 300
|
||||
name = "sessions_max_age"
|
||||
nickel_path = ["security", "sessions", "max_age"]
|
||||
prompt = "Session Max Age (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "sessions_enabled == true"
|
||||
default = true
|
||||
help = "Set secure flag on session cookies"
|
||||
name = "sessions_secure"
|
||||
nickel_path = ["security", "sessions", "secure"]
|
||||
prompt = "Secure Cookies"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "sessions_enabled == true"
|
||||
default = true
|
||||
help = "Set HttpOnly flag on session cookies"
|
||||
name = "sessions_http_only"
|
||||
nickel_path = ["security", "sessions", "http_only"]
|
||||
prompt = "HttpOnly Cookies"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,89 @@
|
||||
# Control Center User Management Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "users_section_header"
|
||||
title = "👥 User Management"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable user management"
|
||||
name = "users_enabled"
|
||||
nickel_path = ["users", "enabled"]
|
||||
prompt = "Enable User Management"
|
||||
type = "confirm"
|
||||
|
||||
# User Registration
|
||||
[[elements]]
|
||||
condition = "users_enabled == true"
|
||||
default = true
|
||||
help = "Enable user self-registration"
|
||||
name = "users_registration_enabled"
|
||||
nickel_path = ["users", "registration", "enabled"]
|
||||
prompt = "Enable User Registration"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "users_enabled == true && users_registration_enabled == true"
|
||||
default = false
|
||||
help = "Require admin approval for new registrations"
|
||||
name = "users_registration_requires_approval"
|
||||
nickel_path = ["users", "registration", "requires_approval"]
|
||||
prompt = "Require Registration Approval"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "users_enabled == true && users_registration_enabled == true"
|
||||
default = "user"
|
||||
help = "Default role for newly registered users"
|
||||
name = "users_registration_auto_role"
|
||||
nickel_path = ["users", "registration", "auto_assign_role"]
|
||||
options = ["user", "operator", "viewer"]
|
||||
prompt = "Default Registration Role"
|
||||
type = "select"
|
||||
|
||||
# User Sessions
|
||||
[[elements]]
|
||||
condition = "users_enabled == true"
|
||||
default = 5
|
||||
help = "Maximum active sessions per user (range: 1-100)"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "users_sessions_max_active"
|
||||
nickel_path = ["users", "sessions", "max_active"]
|
||||
prompt = "Max Active Sessions per User"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "users_enabled == true"
|
||||
default = 3600
|
||||
help = "Session idle timeout in seconds (range: 300-86400)"
|
||||
max = 86400
|
||||
min = 300
|
||||
name = "users_sessions_idle_timeout"
|
||||
nickel_path = ["users", "sessions", "idle_timeout"]
|
||||
prompt = "Session Idle Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "users_enabled == true"
|
||||
default = 86400
|
||||
help = "Absolute session timeout in seconds (range: 3600-604800)"
|
||||
max = 604800
|
||||
min = 3600
|
||||
name = "users_sessions_absolute_timeout"
|
||||
nickel_path = ["users", "sessions", "absolute_timeout"]
|
||||
prompt = "Absolute Session Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
# User Audit
|
||||
[[elements]]
|
||||
condition = "users_enabled == true"
|
||||
default = false
|
||||
help = "Enable audit logging for user actions"
|
||||
name = "users_audit_enabled"
|
||||
nickel_path = ["users", "audit_enabled"]
|
||||
prompt = "Enable User Audit Logging"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,101 @@
|
||||
# PostgreSQL Database Configuration Fragment
|
||||
# Used by: control-center, installer (when backend = postgresql)
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "database_section_header"
|
||||
title = "💾 PostgreSQL Database Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "postgresql"
|
||||
help = "Database backend type"
|
||||
name = "database_backend"
|
||||
nickel_path = ["database", "backend"]
|
||||
prompt = "Database Backend"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "PostgreSQL connection string or host"
|
||||
name = "database_postgres_host"
|
||||
nickel_path = ["database", "host"]
|
||||
placeholder = "localhost"
|
||||
prompt = "PostgreSQL Host"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 5432
|
||||
help = "PostgreSQL port number (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "database_postgres_port"
|
||||
nickel_path = ["database", "port"]
|
||||
prompt = "PostgreSQL Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
help = "PostgreSQL database name"
|
||||
name = "database_postgres_database"
|
||||
nickel_path = ["database", "database"]
|
||||
placeholder = "provisioning"
|
||||
prompt = "Database Name"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "PostgreSQL username"
|
||||
name = "database_postgres_user"
|
||||
nickel_path = ["database", "user"]
|
||||
placeholder = "provisioning"
|
||||
prompt = "Username"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "PostgreSQL password (will be stored securely)"
|
||||
name = "database_postgres_password"
|
||||
nickel_path = ["database", "password"]
|
||||
prompt = "Password"
|
||||
type = "password"
|
||||
|
||||
[[elements]]
|
||||
default = 10
|
||||
help = "Database connection pool size (range: 5-200)"
|
||||
max = 200
|
||||
min = 5
|
||||
name = "database_pool_size"
|
||||
nickel_path = ["database", "pool_size"]
|
||||
prompt = "Connection Pool Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 30
|
||||
help = "Database operation timeout in seconds (range: 10-3600)"
|
||||
max = 3600
|
||||
min = 10
|
||||
name = "database_timeout"
|
||||
nickel_path = ["database", "timeout"]
|
||||
prompt = "Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3
|
||||
help = "Number of retry attempts for failed operations (range: 0-10)"
|
||||
max = 10
|
||||
min = 0
|
||||
name = "database_retry_attempts"
|
||||
nickel_path = ["database", "retry_attempts"]
|
||||
prompt = "Retry Attempts"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 100
|
||||
help = "Delay in milliseconds between retry attempts (range: 1000-60000)"
|
||||
max = 60000
|
||||
min = 1000
|
||||
name = "database_retry_delay"
|
||||
nickel_path = ["database", "retry_delay"]
|
||||
prompt = "Retry Delay (ms)"
|
||||
type = "number"
|
||||
@ -0,0 +1,66 @@
|
||||
# RocksDB Database Configuration Fragment
|
||||
# Used by: control-center, installer (when backend = rocksdb)
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "database_section_header"
|
||||
title = "💾 RocksDB Database Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "rocksdb"
|
||||
help = "Database backend type"
|
||||
name = "database_backend"
|
||||
nickel_path = ["database", "backend"]
|
||||
prompt = "Database Backend"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "/var/lib/provisioning/data"
|
||||
help = "Path to RocksDB data directory"
|
||||
name = "database_path"
|
||||
nickel_path = ["database", "path"]
|
||||
prompt = "Database Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 10
|
||||
help = "Database connection pool size (range: 1-100)"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "database_pool_size"
|
||||
nickel_path = ["database", "pool_size"]
|
||||
prompt = "Connection Pool Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 30
|
||||
help = "Database operation timeout in seconds (range: 10-3600)"
|
||||
max = 3600
|
||||
min = 10
|
||||
name = "database_timeout"
|
||||
nickel_path = ["database", "timeout"]
|
||||
prompt = "Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3
|
||||
help = "Number of retry attempts for failed operations (range: 0-10)"
|
||||
max = 10
|
||||
min = 0
|
||||
name = "database_retry_attempts"
|
||||
nickel_path = ["database", "retry_attempts"]
|
||||
prompt = "Retry Attempts"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 100
|
||||
help = "Delay in milliseconds between retry attempts (range: 1000-60000)"
|
||||
max = 60000
|
||||
min = 1000
|
||||
name = "database_retry_delay"
|
||||
nickel_path = ["database", "retry_delay"]
|
||||
prompt = "Retry Delay (ms)"
|
||||
type = "number"
|
||||
@ -0,0 +1,81 @@
|
||||
# SurrealDB Database Configuration Fragment
|
||||
# Used by: orchestrator, control-center (when backend = surrealdb)
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "database_section_header"
|
||||
title = "💾 SurrealDB Database Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "surrealdb"
|
||||
help = "Database backend type"
|
||||
name = "database_backend"
|
||||
nickel_path = ["database", "backend"]
|
||||
prompt = "Database Backend"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "SurrealDB server URL (e.g., http://localhost:8000 for embedded)"
|
||||
name = "database_surrealdb_url"
|
||||
nickel_path = ["database", "surrealdb_url"]
|
||||
placeholder = "http://localhost:8000"
|
||||
prompt = "SurrealDB URL"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "provisioning"
|
||||
help = "SurrealDB namespace"
|
||||
name = "database_surrealdb_namespace"
|
||||
nickel_path = ["database", "surrealdb_namespace"]
|
||||
prompt = "Namespace"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "default"
|
||||
help = "SurrealDB database name"
|
||||
name = "database_surrealdb_database"
|
||||
nickel_path = ["database", "surrealdb_database"]
|
||||
prompt = "Database"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 10
|
||||
help = "Database connection pool size (range: 1-200)"
|
||||
max = 200
|
||||
min = 1
|
||||
name = "database_pool_size"
|
||||
nickel_path = ["database", "pool_size"]
|
||||
prompt = "Connection Pool Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 30
|
||||
help = "Database operation timeout in seconds (range: 10-3600)"
|
||||
max = 3600
|
||||
min = 10
|
||||
name = "database_timeout"
|
||||
nickel_path = ["database", "timeout"]
|
||||
prompt = "Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3
|
||||
help = "Number of retry attempts for failed operations (range: 0-10)"
|
||||
max = 10
|
||||
min = 0
|
||||
name = "database_retry_attempts"
|
||||
nickel_path = ["database", "retry_attempts"]
|
||||
prompt = "Retry Attempts"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 100
|
||||
help = "Delay in milliseconds between retry attempts (range: 1000-60000)"
|
||||
max = 60000
|
||||
min = 1000
|
||||
name = "database_retry_delay"
|
||||
nickel_path = ["database", "retry_delay"]
|
||||
prompt = "Retry Delay (ms)"
|
||||
type = "number"
|
||||
@ -0,0 +1,93 @@
|
||||
# Database Backend Selection Fragment
|
||||
# This fragment allows selecting the appropriate database backend (RocksDB, SurrealDB, PostgreSQL)
|
||||
# Based on the selection, include the corresponding database-*-section.toml fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "database_backend_selection_header"
|
||||
title = "🗄️ Database Backend Selection"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "rocksdb"
|
||||
help = "Select the database backend for this service"
|
||||
name = "database_backend_selection"
|
||||
nickel_path = ["database", "backend_type"]
|
||||
options = ["rocksdb", "surrealdb_embedded", "surrealdb_server", "postgresql"]
|
||||
prompt = "Database Backend"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
# Backend Descriptions
|
||||
[[elements]]
|
||||
condition = "database_backend_selection == 'rocksdb'"
|
||||
default = false
|
||||
help = "RocksDB: Embedded key-value store. Zero external dependencies, local filesystem storage, good for solo/multiuser modes. Limited to single instance."
|
||||
name = "rocksdb_info"
|
||||
type = "info"
|
||||
prompt = "RocksDB Info"
|
||||
|
||||
[[elements]]
|
||||
condition = "database_backend_selection == 'surrealdb_embedded'"
|
||||
default = false
|
||||
help = "SurrealDB (Embedded): In-process SurrealDB. No external server needed, queryable JSON/SQL, suitable for small to medium deployments."
|
||||
name = "surrealdb_embedded_info"
|
||||
type = "info"
|
||||
prompt = "SurrealDB Embedded Info"
|
||||
|
||||
[[elements]]
|
||||
condition = "database_backend_selection == 'surrealdb_server'"
|
||||
default = false
|
||||
help = "SurrealDB (Server): External SurrealDB server. Scalable multi-instance, HA ready, suitable for multiuser/enterprise modes."
|
||||
name = "surrealdb_server_info"
|
||||
type = "info"
|
||||
prompt = "SurrealDB Server Info"
|
||||
|
||||
[[elements]]
|
||||
condition = "database_backend_selection == 'postgresql'"
|
||||
default = false
|
||||
help = "PostgreSQL: Traditional RDBMS. Proven stability, full ACID, complex queries, suitable for enterprise with HA via replication."
|
||||
name = "postgresql_info"
|
||||
type = "info"
|
||||
prompt = "PostgreSQL Info"
|
||||
|
||||
# Backend Selection Guidelines
|
||||
[[elements]]
|
||||
name = "backend_selection_guide"
|
||||
type = "section_header"
|
||||
title = "Backend Selection Guide"
|
||||
border_top = true
|
||||
border_bottom = true
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'solo'"
|
||||
default = false
|
||||
help = "Recommended for Solo: RocksDB (simplest) or SurrealDB Embedded (more features, same simplicity)"
|
||||
name = "solo_recommendation"
|
||||
type = "info"
|
||||
prompt = "Solo Recommendation"
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'multiuser'"
|
||||
default = false
|
||||
help = "Recommended for MultiUser: SurrealDB Server (scalable, easy clustering) or PostgreSQL (if you need traditional RDBMS)"
|
||||
name = "multiuser_recommendation"
|
||||
type = "info"
|
||||
prompt = "MultiUser Recommendation"
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'cicd'"
|
||||
default = false
|
||||
help = "Recommended for CI/CD: SurrealDB Embedded (ephemeral, no external deps) or RocksDB (fastest)"
|
||||
name = "cicd_recommendation"
|
||||
type = "info"
|
||||
prompt = "CI/CD Recommendation"
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'enterprise'"
|
||||
default = false
|
||||
help = "Recommended for Enterprise: SurrealDB Server HA (native clustering) or PostgreSQL with replication + external backup service"
|
||||
name = "enterprise_recommendation"
|
||||
type = "info"
|
||||
prompt = "Enterprise Recommendation"
|
||||
@ -0,0 +1,95 @@
|
||||
# Deployment Mode Selection Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "deployment_mode_section_header"
|
||||
title = "🚀 Deployment Mode"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "solo"
|
||||
help = "Select deployment mode which determines resource allocation and feature set"
|
||||
name = "deployment_mode"
|
||||
nickel_path = ["deployment_mode"]
|
||||
options = ["solo", "multiuser", "cicd", "enterprise"]
|
||||
prompt = "Deployment Mode"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
# Mode Descriptions
|
||||
[[elements]]
|
||||
name = "mode_description"
|
||||
type = "section_header"
|
||||
title = "Mode Details"
|
||||
border_top = false
|
||||
border_bottom = true
|
||||
|
||||
# Solo Mode Info (conditional)
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'solo'"
|
||||
default = false
|
||||
help = "Solo Mode: Single developer environment. Filesystem/RocksDB storage, 2-4 CPU cores, 4GB RAM. Minimal security, no HA. Ideal for local development and testing."
|
||||
name = "mode_solo_info"
|
||||
prompt = "Solo Mode"
|
||||
type = "info"
|
||||
|
||||
# MultiUser Mode Info (conditional)
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'multiuser'"
|
||||
default = false
|
||||
help = "MultiUser Mode: Team development environment. PostgreSQL/SurrealDB, 4-8 CPU cores, 8GB RAM. RBAC enabled, shared storage, staging-ready. Ideal for team collaboration."
|
||||
name = "mode_multiuser_info"
|
||||
prompt = "MultiUser Mode"
|
||||
type = "info"
|
||||
|
||||
# CI/CD Mode Info (conditional)
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'cicd'"
|
||||
default = false
|
||||
help = "CI/CD Mode: Automated testing and pipeline environment. Ephemeral storage, 8+ CPU cores, 16GB RAM. API-driven, minimal UI, optimized for throughput. Ideal for automated testing."
|
||||
name = "mode_cicd_info"
|
||||
prompt = "CI/CD Mode"
|
||||
type = "info"
|
||||
|
||||
# Enterprise Mode Info (conditional)
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'enterprise'"
|
||||
default = false
|
||||
help = "Enterprise Mode: Production high-availability environment. SurrealDB cluster, PostgreSQL HA, 16+ CPU cores, 32+ GB RAM. MFA required, compliance, full monitoring. Ideal for production deployments."
|
||||
name = "mode_enterprise_info"
|
||||
prompt = "Enterprise Mode"
|
||||
type = "info"
|
||||
|
||||
# Mode-Specific Default Values (informational)
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'solo'"
|
||||
default = false
|
||||
help = "Resources: 2 CPU, 4GB RAM | Storage: 50GB | Database: Filesystem or RocksDB | Security: Optional | HA: None"
|
||||
name = "solo_resources_info"
|
||||
type = "text"
|
||||
prompt = "Solo Resources"
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'multiuser'"
|
||||
default = false
|
||||
help = "Resources: 4 CPU, 8GB RAM | Storage: 100GB | Database: PostgreSQL or SurrealDB | Security: RBAC | HA: Optional"
|
||||
name = "multiuser_resources_info"
|
||||
type = "text"
|
||||
prompt = "MultiUser Resources"
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'cicd'"
|
||||
default = false
|
||||
help = "Resources: 8 CPU, 16GB RAM | Storage: 200GB (ephemeral) | Database: Embedded | Security: API tokens | HA: None"
|
||||
name = "cicd_resources_info"
|
||||
type = "text"
|
||||
prompt = "CI/CD Resources"
|
||||
|
||||
[[elements]]
|
||||
condition = "deployment_mode == 'enterprise'"
|
||||
default = false
|
||||
help = "Resources: 16+ CPU, 32+ GB RAM | Storage: 500GB+ | Database: SurrealDB Cluster HA | Security: MFA, Vault | HA: Full clustering"
|
||||
name = "enterprise_resources_info"
|
||||
type = "text"
|
||||
prompt = "Enterprise Resources"
|
||||
@ -0,0 +1,35 @@
|
||||
# Extension Registry Authentication Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "registry_auth_header"
|
||||
title = "🔐 Authentication"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "OCI registry username (optional)"
|
||||
name = "registry_oci_username"
|
||||
nickel_path = ["extension_registry", "oci", "username"]
|
||||
prompt = "OCI Username"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "OCI registry password (optional)"
|
||||
name = "registry_oci_password"
|
||||
nickel_path = ["extension_registry", "oci", "password"]
|
||||
prompt = "OCI Password"
|
||||
required = false
|
||||
type = "password"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Gitea API token (optional)"
|
||||
name = "registry_gitea_token"
|
||||
nickel_path = ["extension_registry", "gitea", "token"]
|
||||
prompt = "Gitea Token"
|
||||
required = false
|
||||
type = "password"
|
||||
@ -0,0 +1,44 @@
|
||||
# Extension Registry Cache Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "registry_cache_header"
|
||||
title = "⚡ Cache Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 1000
|
||||
help = "Maximum cache entries (range: 10-100000)"
|
||||
max = 100000
|
||||
min = 10
|
||||
name = "registry_cache_capacity"
|
||||
nickel_path = ["extension_registry", "cache", "capacity"]
|
||||
prompt = "Cache Capacity"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 300
|
||||
help = "Cache TTL in seconds (range: 30-3600)"
|
||||
max = 3600
|
||||
min = 30
|
||||
name = "registry_cache_ttl"
|
||||
nickel_path = ["extension_registry", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Cache metadata responses"
|
||||
name = "registry_cache_metadata_enabled"
|
||||
nickel_path = ["extension_registry", "cache", "metadata_cache"]
|
||||
prompt = "Cache Metadata"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Cache list responses"
|
||||
name = "registry_cache_list_enabled"
|
||||
nickel_path = ["extension_registry", "cache", "list_cache"]
|
||||
prompt = "Cache Lists"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,56 @@
|
||||
# Extension Registry Gitea Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "registry_gitea_header"
|
||||
title = "🐙 Gitea Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable Gitea as extension source"
|
||||
name = "registry_gitea_enabled"
|
||||
nickel_path = ["extension_registry", "gitea", "enabled"]
|
||||
prompt = "Enable Gitea"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_gitea_enabled == true"
|
||||
default = "http://localhost:3000"
|
||||
help = "Gitea server URL"
|
||||
name = "registry_gitea_url"
|
||||
nickel_path = ["extension_registry", "gitea", "url"]
|
||||
prompt = "Gitea URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_gitea_enabled == true"
|
||||
default = "provisioning"
|
||||
help = "Gitea organization name"
|
||||
name = "registry_gitea_org"
|
||||
nickel_path = ["extension_registry", "gitea", "org"]
|
||||
prompt = "Organization"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_gitea_enabled == true"
|
||||
default = 60000
|
||||
help = "Request timeout in milliseconds"
|
||||
max = 300000
|
||||
min = 5000
|
||||
name = "registry_gitea_timeout"
|
||||
nickel_path = ["extension_registry", "gitea", "timeout"]
|
||||
prompt = "Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_gitea_enabled == true"
|
||||
default = false
|
||||
help = "Verify SSL certificates"
|
||||
name = "registry_gitea_verify_ssl"
|
||||
nickel_path = ["extension_registry", "gitea", "verify_ssl"]
|
||||
prompt = "Verify SSL"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,56 @@
|
||||
# Extension Registry OCI Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "registry_oci_header"
|
||||
title = "📦 OCI Registry Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable OCI registry as extension source"
|
||||
name = "registry_oci_enabled"
|
||||
nickel_path = ["extension_registry", "oci", "enabled"]
|
||||
prompt = "Enable OCI Registry"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_oci_enabled == true"
|
||||
default = "registry.local:5000"
|
||||
help = "OCI registry URL"
|
||||
name = "registry_oci_registry"
|
||||
nickel_path = ["extension_registry", "oci", "registry"]
|
||||
prompt = "Registry URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_oci_enabled == true"
|
||||
default = "provisioning"
|
||||
help = "OCI registry namespace"
|
||||
name = "registry_oci_namespace"
|
||||
nickel_path = ["extension_registry", "oci", "namespace"]
|
||||
prompt = "Namespace"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_oci_enabled == true"
|
||||
default = 60000
|
||||
help = "Request timeout in milliseconds"
|
||||
max = 300000
|
||||
min = 5000
|
||||
name = "registry_oci_timeout"
|
||||
nickel_path = ["extension_registry", "oci", "timeout"]
|
||||
prompt = "Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "registry_oci_enabled == true"
|
||||
default = false
|
||||
help = "Verify SSL certificates"
|
||||
name = "registry_oci_verify_ssl"
|
||||
nickel_path = ["extension_registry", "oci", "verify_ssl"]
|
||||
prompt = "Verify SSL"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,55 @@
|
||||
# Extension Registry Server Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "registry_server_header"
|
||||
title = "🖥️ Server Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "0.0.0.0"
|
||||
help = "HTTP server bind address"
|
||||
name = "registry_server_host"
|
||||
nickel_path = ["extension_registry", "server", "host"]
|
||||
prompt = "Server Host"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 8081
|
||||
help = "HTTP server port (range: 1024-65535)"
|
||||
max = 65535
|
||||
min = 1024
|
||||
name = "registry_server_port"
|
||||
nickel_path = ["extension_registry", "server", "port"]
|
||||
prompt = "Server Port"
|
||||
required = true
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 4
|
||||
help = "Number of HTTP worker threads"
|
||||
max = 32
|
||||
min = 1
|
||||
name = "registry_server_workers"
|
||||
nickel_path = ["extension_registry", "server", "workers"]
|
||||
prompt = "Worker Threads"
|
||||
required = true
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable CORS for cross-origin requests"
|
||||
name = "registry_server_cors_enabled"
|
||||
nickel_path = ["extension_registry", "server", "cors_enabled"]
|
||||
prompt = "Enable CORS"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable response compression"
|
||||
name = "registry_server_compression"
|
||||
nickel_path = ["extension_registry", "server", "compression"]
|
||||
prompt = "Enable Compression"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,244 @@
|
||||
# Installer Database Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "database_section_header"
|
||||
title = "🗄️ Database Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# Database Initialization
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Automatically initialize databases during installation"
|
||||
name = "auto_init_database"
|
||||
nickel_path = ["installer", "database", "auto_init"]
|
||||
prompt = "Auto-Initialize Database"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_init_database == true"
|
||||
default = true
|
||||
help = "Run migrations automatically during installation"
|
||||
name = "auto_migrate"
|
||||
nickel_path = ["installer", "database", "auto_migrate"]
|
||||
prompt = "Auto-Migrate"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_init_database == true"
|
||||
default = true
|
||||
help = "Create default database schema and tables"
|
||||
name = "create_schema"
|
||||
nickel_path = ["installer", "database", "create_schema"]
|
||||
prompt = "Create Schema"
|
||||
type = "confirm"
|
||||
|
||||
# Migration Settings
|
||||
[[elements]]
|
||||
condition = "auto_migrate == true"
|
||||
default = "/var/lib/provisioning/migrations"
|
||||
help = "Directory containing database migration files"
|
||||
name = "migrations_directory"
|
||||
nickel_path = ["installer", "database", "migrations", "directory"]
|
||||
prompt = "Migrations Directory"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_migrate == true"
|
||||
default = "auto"
|
||||
help = "Migration version strategy"
|
||||
name = "migration_strategy"
|
||||
nickel_path = ["installer", "database", "migrations", "strategy"]
|
||||
options = ["auto", "manual", "sequential"]
|
||||
prompt = "Migration Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_migrate == true"
|
||||
default = 300
|
||||
help = "Migration timeout in seconds"
|
||||
min = 30
|
||||
name = "migration_timeout_seconds"
|
||||
nickel_path = ["installer", "database", "migrations", "timeout_seconds"]
|
||||
prompt = "Migration Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
# Database Backup
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Create database backup before installation/upgrade"
|
||||
name = "backup_before_install"
|
||||
nickel_path = ["installer", "database", "backup", "before_install"]
|
||||
prompt = "Backup Before Install"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "backup_before_install == true"
|
||||
default = "/var/backups/provisioning"
|
||||
help = "Directory for database backups"
|
||||
name = "backup_directory"
|
||||
nickel_path = ["installer", "database", "backup", "directory"]
|
||||
prompt = "Backup Directory"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "backup_before_install == true"
|
||||
default = "full"
|
||||
help = "Backup type"
|
||||
name = "backup_type"
|
||||
nickel_path = ["installer", "database", "backup", "type"]
|
||||
options = ["full", "incremental", "differential"]
|
||||
prompt = "Backup Type"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "backup_before_install == true"
|
||||
default = true
|
||||
help = "Compress database backups"
|
||||
name = "compress_backups"
|
||||
nickel_path = ["installer", "database", "backup", "compress"]
|
||||
prompt = "Compress Backups"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "backup_before_install == true"
|
||||
default = 7
|
||||
help = "Backup retention in days"
|
||||
min = 1
|
||||
max = 365
|
||||
name = "backup_retention_days"
|
||||
nickel_path = ["installer", "database", "backup", "retention_days"]
|
||||
prompt = "Backup Retention (days)"
|
||||
type = "number"
|
||||
|
||||
# Database Verification
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Verify database integrity after installation"
|
||||
name = "verify_database"
|
||||
nickel_path = ["installer", "database", "verification", "enabled"]
|
||||
prompt = "Verify Database"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "verify_database == true"
|
||||
default = true
|
||||
help = "Check database consistency"
|
||||
name = "check_consistency"
|
||||
nickel_path = ["installer", "database", "verification", "check_consistency"]
|
||||
prompt = "Check Consistency"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "verify_database == true"
|
||||
default = true
|
||||
help = "Check for missing indices"
|
||||
name = "check_indices"
|
||||
nickel_path = ["installer", "database", "verification", "check_indices"]
|
||||
prompt = "Check Indices"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "verify_database == true"
|
||||
default = true
|
||||
help = "Validate foreign key relationships"
|
||||
name = "check_foreign_keys"
|
||||
nickel_path = ["installer", "database", "verification", "check_foreign_keys"]
|
||||
prompt = "Check Foreign Keys"
|
||||
type = "confirm"
|
||||
|
||||
# Data Seeding
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Seed database with sample data"
|
||||
name = "seed_database"
|
||||
nickel_path = ["installer", "database", "seeding", "enabled"]
|
||||
prompt = "Seed Database"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "seed_database == true"
|
||||
default = "minimal"
|
||||
help = "Sample data size"
|
||||
name = "seed_data_size"
|
||||
nickel_path = ["installer", "database", "seeding", "data_size"]
|
||||
options = ["minimal", "standard", "large"]
|
||||
prompt = "Seed Data Size"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "seed_database == true"
|
||||
default = "seeding-data.sql"
|
||||
help = "SQL file containing seed data"
|
||||
name = "seed_data_file"
|
||||
nickel_path = ["installer", "database", "seeding", "data_file"]
|
||||
prompt = "Seed Data File"
|
||||
type = "text"
|
||||
|
||||
# Database Pooling
|
||||
[[elements]]
|
||||
default = 10
|
||||
help = "Database connection pool size (range: 1-100)"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "connection_pool_size"
|
||||
nickel_path = ["installer", "database", "pool_size"]
|
||||
prompt = "Connection Pool Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 300
|
||||
help = "Connection pool timeout in seconds (range: 10-3600)"
|
||||
max = 3600
|
||||
min = 10
|
||||
name = "connection_pool_timeout"
|
||||
nickel_path = ["installer", "database", "pool_timeout_seconds"]
|
||||
prompt = "Pool Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3600
|
||||
help = "Connection idle timeout in seconds (range: 60-14400)"
|
||||
max = 14400
|
||||
min = 60
|
||||
name = "connection_idle_timeout"
|
||||
nickel_path = ["installer", "database", "idle_timeout_seconds"]
|
||||
prompt = "Idle Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
# Database Optimization
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Optimize database after installation"
|
||||
name = "optimize_database"
|
||||
nickel_path = ["installer", "database", "optimization", "enabled"]
|
||||
prompt = "Optimize Database"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "optimize_database == true"
|
||||
default = true
|
||||
help = "Analyze query statistics"
|
||||
name = "analyze_statistics"
|
||||
nickel_path = ["installer", "database", "optimization", "analyze_statistics"]
|
||||
prompt = "Analyze Statistics"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "optimize_database == true"
|
||||
default = true
|
||||
help = "Rebuild indices"
|
||||
name = "rebuild_indices"
|
||||
nickel_path = ["installer", "database", "optimization", "rebuild_indices"]
|
||||
prompt = "Rebuild Indices"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "optimize_database == true"
|
||||
default = true
|
||||
help = "Vacuum database (reclaim space)"
|
||||
name = "vacuum_database"
|
||||
nickel_path = ["installer", "database", "optimization", "vacuum"]
|
||||
prompt = "Vacuum Database"
|
||||
type = "confirm"
|
||||
288
.typedialog/platform/forms/fragments/installer/ha-section.toml
Normal file
288
.typedialog/platform/forms/fragments/installer/ha-section.toml
Normal file
@ -0,0 +1,288 @@
|
||||
# Installer High Availability Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "ha_section_header"
|
||||
title = "🔄 High Availability"
|
||||
type = "section_header"
|
||||
|
||||
# HA Enablement
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable high availability configuration"
|
||||
name = "ha_enabled"
|
||||
nickel_path = ["installer", "ha", "enabled"]
|
||||
prompt = "Enable High Availability"
|
||||
type = "confirm"
|
||||
|
||||
# Cluster Configuration (conditional on HA enabled)
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = 3
|
||||
help = "Number of nodes in the HA cluster"
|
||||
min = 3
|
||||
max = 256
|
||||
name = "ha_cluster_size"
|
||||
nickel_path = ["installer", "ha", "cluster_size"]
|
||||
prompt = "Cluster Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = "consul"
|
||||
help = "Service discovery backend for cluster coordination"
|
||||
name = "ha_discovery_backend"
|
||||
nickel_path = ["installer", "ha", "discovery_backend"]
|
||||
options = ["consul", "etcd", "zookeeper"]
|
||||
prompt = "Discovery Backend"
|
||||
type = "select"
|
||||
|
||||
# Cluster Node Configuration (conditional)
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = "replica"
|
||||
help = "Role of this node in the cluster"
|
||||
name = "ha_node_role"
|
||||
nickel_path = ["installer", "ha", "node_role"]
|
||||
options = ["primary", "replica", "observer"]
|
||||
prompt = "Node Role"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = ""
|
||||
help = "Comma-separated list of other cluster node addresses"
|
||||
name = "ha_cluster_nodes"
|
||||
nickel_path = ["installer", "ha", "cluster_nodes"]
|
||||
prompt = "Cluster Nodes"
|
||||
type = "text"
|
||||
|
||||
# Replication Configuration
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable database replication between cluster nodes"
|
||||
name = "ha_db_replication_enabled"
|
||||
nickel_path = ["installer", "ha", "database", "replication_enabled"]
|
||||
prompt = "Enable DB Replication"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_db_replication_enabled == true"
|
||||
default = "synchronous"
|
||||
help = "Database replication mode"
|
||||
name = "ha_db_replication_mode"
|
||||
nickel_path = ["installer", "ha", "database", "replication_mode"]
|
||||
options = ["synchronous", "asynchronous", "semi_synchronous"]
|
||||
prompt = "DB Replication Mode"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true && ha_db_replication_enabled == true"
|
||||
default = 3
|
||||
help = "Minimum quorum size for write operations (range: 1-256)"
|
||||
max = 256
|
||||
min = 1
|
||||
name = "ha_db_quorum_size"
|
||||
nickel_path = ["installer", "ha", "database", "quorum_size"]
|
||||
prompt = "DB Quorum Size"
|
||||
type = "number"
|
||||
|
||||
# Health Checks
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable automated health checks for cluster nodes"
|
||||
name = "ha_health_checks_enabled"
|
||||
nickel_path = ["installer", "ha", "health_checks", "enabled"]
|
||||
prompt = "Enable Health Checks"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_health_checks_enabled == true"
|
||||
default = 10
|
||||
help = "Health check interval in seconds"
|
||||
min = 1
|
||||
max = 120
|
||||
name = "ha_health_check_interval"
|
||||
nickel_path = ["installer", "ha", "health_checks", "interval_seconds"]
|
||||
prompt = "Health Check Interval (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_health_checks_enabled == true"
|
||||
default = 30000
|
||||
help = "Health check timeout in milliseconds"
|
||||
min = 1000
|
||||
max = 300000
|
||||
name = "ha_health_check_timeout"
|
||||
nickel_path = ["installer", "ha", "health_checks", "timeout_ms"]
|
||||
prompt = "Health Check Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_health_checks_enabled == true"
|
||||
default = 3
|
||||
help = "Number of failed checks before marking node as unhealthy"
|
||||
min = 1
|
||||
max = 10
|
||||
name = "ha_health_check_failure_threshold"
|
||||
nickel_path = ["installer", "ha", "health_checks", "failure_threshold"]
|
||||
prompt = "Failure Threshold"
|
||||
type = "number"
|
||||
|
||||
# Failover Configuration
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable automatic failover to replica nodes"
|
||||
name = "ha_failover_enabled"
|
||||
nickel_path = ["installer", "ha", "failover", "enabled"]
|
||||
prompt = "Enable Failover"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_failover_enabled == true"
|
||||
default = "automatic"
|
||||
help = "Failover strategy"
|
||||
name = "ha_failover_strategy"
|
||||
nickel_path = ["installer", "ha", "failover", "strategy"]
|
||||
options = ["automatic", "manual", "priority_based"]
|
||||
prompt = "Failover Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_failover_enabled == true"
|
||||
default = 60
|
||||
help = "Failover delay in seconds (wait before failing over)"
|
||||
min = 0
|
||||
max = 600
|
||||
name = "ha_failover_delay"
|
||||
nickel_path = ["installer", "ha", "failover", "delay_seconds"]
|
||||
prompt = "Failover Delay (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_failover_enabled == true && ha_failover_strategy == 'priority_based'"
|
||||
default = 100
|
||||
help = "Priority value for node selection in failover (higher = higher priority)"
|
||||
min = 0
|
||||
max = 1000
|
||||
name = "ha_node_priority"
|
||||
nickel_path = ["installer", "ha", "failover", "node_priority"]
|
||||
prompt = "Node Priority"
|
||||
type = "number"
|
||||
|
||||
# Split Brain Prevention
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable split-brain detection and prevention"
|
||||
name = "ha_split_brain_enabled"
|
||||
nickel_path = ["installer", "ha", "split_brain", "enabled"]
|
||||
prompt = "Enable Split-Brain Prevention"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_split_brain_enabled == true"
|
||||
default = 30
|
||||
help = "Timeout for detecting split-brain in seconds"
|
||||
min = 5
|
||||
max = 300
|
||||
name = "ha_split_brain_timeout"
|
||||
nickel_path = ["installer", "ha", "split_brain", "timeout_seconds"]
|
||||
prompt = "Split-Brain Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_split_brain_enabled == true"
|
||||
default = "quorum_based"
|
||||
help = "Split-brain resolution strategy"
|
||||
name = "ha_split_brain_strategy"
|
||||
nickel_path = ["installer", "ha", "split_brain", "strategy"]
|
||||
options = ["quorum_based", "majority_wins", "freeze"]
|
||||
prompt = "Split-Brain Strategy"
|
||||
type = "select"
|
||||
|
||||
# Backup and Recovery
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable automated cluster state backups"
|
||||
name = "ha_backup_enabled"
|
||||
nickel_path = ["installer", "ha", "backup", "enabled"]
|
||||
prompt = "Enable Backups"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_backup_enabled == true"
|
||||
default = 3600
|
||||
help = "Backup interval in seconds (default: 1 hour, range: 300-86400)"
|
||||
max = 86400
|
||||
min = 300
|
||||
name = "ha_backup_interval"
|
||||
nickel_path = ["installer", "ha", "backup", "interval_seconds"]
|
||||
prompt = "Backup Interval (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_backup_enabled == true"
|
||||
default = 7
|
||||
help = "Backup retention in days"
|
||||
min = 1
|
||||
max = 365
|
||||
name = "ha_backup_retention_days"
|
||||
nickel_path = ["installer", "ha", "backup", "retention_days"]
|
||||
prompt = "Backup Retention (days)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_backup_enabled == true"
|
||||
default = "/var/backups/provisioning-ha"
|
||||
help = "Directory for HA cluster backups"
|
||||
name = "ha_backup_directory"
|
||||
nickel_path = ["installer", "ha", "backup", "directory"]
|
||||
prompt = "Backup Directory"
|
||||
type = "text"
|
||||
|
||||
# Load Distribution
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable load distribution across cluster nodes"
|
||||
name = "ha_load_distribution_enabled"
|
||||
nickel_path = ["installer", "ha", "load_distribution", "enabled"]
|
||||
prompt = "Enable Load Distribution"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_load_distribution_enabled == true"
|
||||
default = "round_robin"
|
||||
help = "Load distribution algorithm"
|
||||
name = "ha_load_distribution_algorithm"
|
||||
nickel_path = ["installer", "ha", "load_distribution", "algorithm"]
|
||||
options = ["round_robin", "least_connections", "weighted", "ip_hash"]
|
||||
prompt = "Load Distribution Algorithm"
|
||||
type = "select"
|
||||
|
||||
# Metrics and Monitoring
|
||||
[[elements]]
|
||||
condition = "ha_enabled == true"
|
||||
default = true
|
||||
help = "Enable detailed HA metrics collection"
|
||||
name = "ha_metrics_enabled"
|
||||
nickel_path = ["installer", "ha", "metrics", "enabled"]
|
||||
prompt = "Enable Metrics"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "ha_metrics_enabled == true"
|
||||
default = 60
|
||||
help = "Metrics collection interval in seconds (range: 5-300)"
|
||||
max = 300
|
||||
min = 5
|
||||
name = "ha_metrics_interval"
|
||||
nickel_path = ["installer", "ha", "metrics", "interval_seconds"]
|
||||
prompt = "Metrics Interval (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,234 @@
|
||||
# Installer Installation Strategy Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "installation_section_header"
|
||||
title = "🔧 Installation Strategy"
|
||||
type = "section_header"
|
||||
|
||||
# Installation Mode
|
||||
[[elements]]
|
||||
default = "interactive"
|
||||
help = "Installation mode and UI"
|
||||
name = "installation_mode"
|
||||
nickel_path = ["installer", "installation", "mode"]
|
||||
options = ["interactive", "unattended", "api"]
|
||||
prompt = "Installation Mode"
|
||||
type = "select"
|
||||
|
||||
# Parallel Service Installation
|
||||
[[elements]]
|
||||
default = 1
|
||||
help = "Number of services to install in parallel (range: 1-10, 1 = sequential)"
|
||||
max = 10
|
||||
min = 1
|
||||
name = "parallel_services"
|
||||
nickel_path = ["installer", "installation", "parallel_services"]
|
||||
prompt = "Parallel Services"
|
||||
type = "number"
|
||||
|
||||
# Installation Timeout
|
||||
[[elements]]
|
||||
default = 1800
|
||||
help = "Installation timeout in seconds (range: 0-14400, 0 = no timeout)"
|
||||
max = 14400
|
||||
min = 0
|
||||
name = "installation_timeout_seconds"
|
||||
nickel_path = ["installer", "installation", "timeout_seconds"]
|
||||
prompt = "Installation Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
# Rollback Strategy
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Automatically rollback on installation failure"
|
||||
name = "rollback_on_failure"
|
||||
nickel_path = ["installer", "installation", "rollback_on_failure"]
|
||||
prompt = "Rollback on Failure"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "rollback_on_failure == true"
|
||||
default = "automatic"
|
||||
help = "Rollback strategy when failure occurs"
|
||||
name = "rollback_strategy"
|
||||
nickel_path = ["installer", "installation", "rollback_strategy"]
|
||||
options = ["automatic", "manual", "snapshot"]
|
||||
prompt = "Rollback Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "rollback_on_failure == true && rollback_strategy == 'snapshot'"
|
||||
default = true
|
||||
help = "Create system snapshot before installation for rollback"
|
||||
name = "create_pre_install_snapshot"
|
||||
nickel_path = ["installer", "installation", "create_snapshot"]
|
||||
prompt = "Create Pre-Install Snapshot"
|
||||
type = "confirm"
|
||||
|
||||
# Installation Logging
|
||||
[[elements]]
|
||||
default = "info"
|
||||
help = "Installation logging verbosity"
|
||||
name = "log_level"
|
||||
nickel_path = ["installer", "installation", "log_level"]
|
||||
options = ["debug", "info", "warn", "error"]
|
||||
prompt = "Log Level"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = "/var/log/provisioning-installer"
|
||||
help = "Directory for installation logs"
|
||||
name = "log_directory"
|
||||
nickel_path = ["installer", "installation", "log_directory"]
|
||||
prompt = "Log Directory"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Write installation logs to file"
|
||||
name = "write_logs_to_file"
|
||||
nickel_path = ["installer", "installation", "write_to_file"]
|
||||
prompt = "Write Logs to File"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Upload installation logs to remote server"
|
||||
name = "upload_logs"
|
||||
nickel_path = ["installer", "installation", "upload_logs", "enabled"]
|
||||
prompt = "Upload Logs"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "upload_logs == true"
|
||||
default = ""
|
||||
help = "Remote log server URL"
|
||||
name = "log_server_url"
|
||||
nickel_path = ["installer", "installation", "upload_logs", "server_url"]
|
||||
prompt = "Log Server URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# Artifact Handling
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Keep temporary artifacts after installation completes"
|
||||
name = "keep_artifacts"
|
||||
nickel_path = ["installer", "installation", "keep_artifacts"]
|
||||
prompt = "Keep Artifacts"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "keep_artifacts == true"
|
||||
default = "/var/tmp/provisioning-install-artifacts"
|
||||
help = "Directory for keeping installation artifacts"
|
||||
name = "artifacts_directory"
|
||||
nickel_path = ["installer", "installation", "artifacts_directory"]
|
||||
prompt = "Artifacts Directory"
|
||||
type = "text"
|
||||
|
||||
# Installation Hooks
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Execute custom scripts during installation"
|
||||
name = "enable_hooks"
|
||||
nickel_path = ["installer", "installation", "hooks", "enabled"]
|
||||
prompt = "Enable Installation Hooks"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_hooks == true"
|
||||
default = ""
|
||||
help = "Script to run before installation starts"
|
||||
name = "pre_install_hook"
|
||||
nickel_path = ["installer", "installation", "hooks", "pre_install_script"]
|
||||
prompt = "Pre-Install Hook Script"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_hooks == true"
|
||||
default = ""
|
||||
help = "Script to run after installation completes successfully"
|
||||
name = "post_install_hook"
|
||||
nickel_path = ["installer", "installation", "hooks", "post_install_script"]
|
||||
prompt = "Post-Install Hook Script"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_hooks == true"
|
||||
default = ""
|
||||
help = "Script to run on installation failure"
|
||||
name = "on_failure_hook"
|
||||
nickel_path = ["installer", "installation", "hooks", "on_failure_script"]
|
||||
prompt = "On-Failure Hook Script"
|
||||
type = "text"
|
||||
|
||||
# Validation After Installation
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate installation was successful"
|
||||
name = "validate_installation"
|
||||
nickel_path = ["installer", "installation", "validation", "enabled"]
|
||||
prompt = "Validate Installation"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "validate_installation == true"
|
||||
default = 30000
|
||||
help = "Installation validation timeout in milliseconds (range: 5000-300000)"
|
||||
max = 300000
|
||||
min = 5000
|
||||
name = "validation_timeout"
|
||||
nickel_path = ["installer", "installation", "validation", "timeout_ms"]
|
||||
prompt = "Validation Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "validate_installation == true"
|
||||
default = true
|
||||
help = "Check all services are running"
|
||||
name = "validate_services_running"
|
||||
nickel_path = ["installer", "installation", "validation", "services_running"]
|
||||
prompt = "Validate Services Running"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "validate_installation == true"
|
||||
default = true
|
||||
help = "Validate network connectivity"
|
||||
name = "validate_connectivity"
|
||||
nickel_path = ["installer", "installation", "validation", "connectivity"]
|
||||
prompt = "Validate Connectivity"
|
||||
type = "confirm"
|
||||
|
||||
# Auto-Recovery
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable automatic recovery if services fail after installation"
|
||||
name = "auto_recovery_enabled"
|
||||
nickel_path = ["installer", "installation", "auto_recovery", "enabled"]
|
||||
prompt = "Enable Auto-Recovery"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_recovery_enabled == true"
|
||||
default = 3
|
||||
help = "Maximum number of recovery attempts"
|
||||
min = 1
|
||||
max = 10
|
||||
name = "auto_recovery_max_attempts"
|
||||
nickel_path = ["installer", "installation", "auto_recovery", "max_attempts"]
|
||||
prompt = "Max Recovery Attempts"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_recovery_enabled == true"
|
||||
default = 30
|
||||
help = "Delay in seconds before attempting recovery"
|
||||
min = 5
|
||||
name = "auto_recovery_delay_seconds"
|
||||
nickel_path = ["installer", "installation", "auto_recovery", "delay_seconds"]
|
||||
prompt = "Recovery Delay (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,285 @@
|
||||
# Installer Networking Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "installer_networking_section_header"
|
||||
title = "🌐 Networking Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# Network Interface Configuration
|
||||
[[elements]]
|
||||
default = "0.0.0.0"
|
||||
help = "Bind address for all services (0.0.0.0 = listen on all interfaces)"
|
||||
name = "bind_address"
|
||||
nickel_path = ["installer", "networking", "bind_address"]
|
||||
prompt = "Bind Address"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "provisioning.local"
|
||||
help = "Primary hostname for services"
|
||||
name = "primary_hostname"
|
||||
nickel_path = ["installer", "networking", "primary_hostname"]
|
||||
prompt = "Primary Hostname"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Additional hostnames/aliases (comma-separated)"
|
||||
name = "additional_hostnames"
|
||||
nickel_path = ["installer", "networking", "additional_hostnames"]
|
||||
prompt = "Additional Hostnames"
|
||||
type = "text"
|
||||
|
||||
# DNS Configuration
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Configure DNS for provisioning services"
|
||||
name = "configure_dns"
|
||||
nickel_path = ["installer", "networking", "dns", "configure"]
|
||||
prompt = "Configure DNS"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "configure_dns == true"
|
||||
default = "127.0.0.1"
|
||||
help = "DNS server address"
|
||||
name = "dns_server"
|
||||
nickel_path = ["installer", "networking", "dns", "server"]
|
||||
prompt = "DNS Server"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "configure_dns == true"
|
||||
default = 53
|
||||
help = "DNS server port"
|
||||
min = 1
|
||||
max = 65535
|
||||
name = "dns_port"
|
||||
nickel_path = ["installer", "networking", "dns", "port"]
|
||||
prompt = "DNS Port"
|
||||
type = "number"
|
||||
|
||||
# TLS/HTTPS Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable TLS/HTTPS for service communication"
|
||||
name = "enable_tls"
|
||||
nickel_path = ["installer", "networking", "tls", "enabled"]
|
||||
prompt = "Enable TLS"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_tls == true"
|
||||
default = "self_signed"
|
||||
help = "TLS certificate source"
|
||||
name = "tls_certificate_source"
|
||||
nickel_path = ["installer", "networking", "tls", "certificate_source"]
|
||||
options = ["self_signed", "letsencrypt", "vault", "provided"]
|
||||
prompt = "TLS Certificate Source"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_tls == true && tls_certificate_source == 'letsencrypt'"
|
||||
default = ""
|
||||
help = "Let's Encrypt email for certificate registration"
|
||||
name = "letsencrypt_email"
|
||||
nickel_path = ["installer", "networking", "tls", "letsencrypt_email"]
|
||||
prompt = "Let's Encrypt Email"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_tls == true && tls_certificate_source == 'provided'"
|
||||
default = "/etc/provisioning/certs/server.crt"
|
||||
help = "Path to provided certificate file"
|
||||
name = "tls_certificate_path"
|
||||
nickel_path = ["installer", "networking", "tls", "certificate_path"]
|
||||
prompt = "Certificate Path"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_tls == true && tls_certificate_source == 'provided'"
|
||||
default = "/etc/provisioning/certs/server.key"
|
||||
help = "Path to provided private key file"
|
||||
name = "tls_key_path"
|
||||
nickel_path = ["installer", "networking", "tls", "key_path"]
|
||||
prompt = "Private Key Path"
|
||||
type = "text"
|
||||
|
||||
# Firewall Configuration
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Configure firewall rules for provisioning services"
|
||||
name = "configure_firewall"
|
||||
nickel_path = ["installer", "networking", "firewall", "configure"]
|
||||
prompt = "Configure Firewall"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "configure_firewall == true"
|
||||
default = "iptables"
|
||||
help = "Firewall backend"
|
||||
name = "firewall_backend"
|
||||
nickel_path = ["installer", "networking", "firewall", "backend"]
|
||||
options = ["iptables", "firewalld", "ufw"]
|
||||
prompt = "Firewall Backend"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "configure_firewall == true"
|
||||
default = true
|
||||
help = "Enable inbound rate limiting"
|
||||
name = "firewall_rate_limit_enabled"
|
||||
nickel_path = ["installer", "networking", "firewall", "rate_limiting", "enabled"]
|
||||
prompt = "Enable Rate Limiting"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "firewall_rate_limit_enabled == true"
|
||||
default = 100
|
||||
help = "Maximum requests per minute per IP"
|
||||
min = 1
|
||||
name = "firewall_rate_limit_rpm"
|
||||
nickel_path = ["installer", "networking", "firewall", "rate_limiting", "requests_per_minute"]
|
||||
prompt = "Rate Limit (req/min)"
|
||||
type = "number"
|
||||
|
||||
# Load Balancer Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install and configure load balancer"
|
||||
name = "install_load_balancer"
|
||||
nickel_path = ["installer", "networking", "load_balancer", "enabled"]
|
||||
prompt = "Install Load Balancer"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_load_balancer == true"
|
||||
default = "nginx"
|
||||
help = "Load balancer software"
|
||||
name = "load_balancer_type"
|
||||
nickel_path = ["installer", "networking", "load_balancer", "type"]
|
||||
options = ["nginx", "haproxy", "traefik"]
|
||||
prompt = "Load Balancer Type"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_load_balancer == true"
|
||||
default = 80
|
||||
help = "Load balancer HTTP port (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "load_balancer_http_port"
|
||||
nickel_path = ["installer", "networking", "load_balancer", "http_port"]
|
||||
prompt = "Load Balancer HTTP Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_load_balancer == true"
|
||||
default = 443
|
||||
help = "Load balancer HTTPS port (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "load_balancer_https_port"
|
||||
nickel_path = ["installer", "networking", "load_balancer", "https_port"]
|
||||
prompt = "Load Balancer HTTPS Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_load_balancer == true"
|
||||
default = "round_robin"
|
||||
help = "Load balancing algorithm"
|
||||
name = "load_balancer_algorithm"
|
||||
nickel_path = ["installer", "networking", "load_balancer", "algorithm"]
|
||||
options = ["round_robin", "least_connections", "ip_hash", "weighted"]
|
||||
prompt = "Load Balancing Algorithm"
|
||||
type = "select"
|
||||
|
||||
# Ingress Configuration (for Kubernetes)
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Configure Kubernetes Ingress"
|
||||
name = "configure_ingress"
|
||||
nickel_path = ["installer", "networking", "ingress", "configure"]
|
||||
prompt = "Configure Ingress"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "configure_ingress == true"
|
||||
default = "nginx"
|
||||
help = "Ingress controller type"
|
||||
name = "ingress_controller"
|
||||
nickel_path = ["installer", "networking", "ingress", "controller"]
|
||||
options = ["nginx", "istio", "traefik"]
|
||||
prompt = "Ingress Controller"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "configure_ingress == true"
|
||||
default = ""
|
||||
help = "Ingress domain name"
|
||||
name = "ingress_domain"
|
||||
nickel_path = ["installer", "networking", "ingress", "domain"]
|
||||
prompt = "Ingress Domain"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# Proxy Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Configure HTTP proxy for outbound connections"
|
||||
name = "enable_http_proxy"
|
||||
nickel_path = ["installer", "networking", "proxy", "enabled"]
|
||||
prompt = "Enable HTTP Proxy"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_http_proxy == true"
|
||||
default = ""
|
||||
help = "HTTP proxy URL (e.g., http://proxy.example.com:3128)"
|
||||
name = "http_proxy_url"
|
||||
nickel_path = ["installer", "networking", "proxy", "http_url"]
|
||||
prompt = "HTTP Proxy URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_http_proxy == true"
|
||||
default = ""
|
||||
help = "HTTPS proxy URL"
|
||||
name = "https_proxy_url"
|
||||
nickel_path = ["installer", "networking", "proxy", "https_url"]
|
||||
prompt = "HTTPS Proxy URL"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_http_proxy == true"
|
||||
default = ""
|
||||
help = "No proxy list (hosts to bypass proxy, comma-separated)"
|
||||
name = "no_proxy_list"
|
||||
nickel_path = ["installer", "networking", "proxy", "no_proxy"]
|
||||
prompt = "No Proxy List"
|
||||
type = "text"
|
||||
|
||||
# Network Monitoring
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable network traffic monitoring"
|
||||
name = "enable_traffic_monitoring"
|
||||
nickel_path = ["installer", "networking", "monitoring", "enabled"]
|
||||
prompt = "Enable Traffic Monitoring"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_traffic_monitoring == true"
|
||||
default = 60
|
||||
help = "Traffic monitoring interval in seconds"
|
||||
min = 5
|
||||
name = "traffic_monitoring_interval"
|
||||
nickel_path = ["installer", "networking", "monitoring", "interval_seconds"]
|
||||
prompt = "Monitoring Interval (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,317 @@
|
||||
# Installer Post-Installation Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "post_install_section_header"
|
||||
title = "✨ Post-Installation"
|
||||
type = "section_header"
|
||||
|
||||
# Post-Installation Tasks
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Execute post-installation tasks and configuration"
|
||||
name = "run_post_install_tasks"
|
||||
nickel_path = ["installer", "post_install", "enabled"]
|
||||
prompt = "Run Post-Install Tasks"
|
||||
type = "confirm"
|
||||
|
||||
# Service Configuration
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = true
|
||||
help = "Configure default admin user and initial policies"
|
||||
name = "configure_defaults"
|
||||
nickel_path = ["installer", "post_install", "configure_defaults"]
|
||||
prompt = "Configure Defaults"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true && configure_defaults == true"
|
||||
default = "admin"
|
||||
help = "Default admin username"
|
||||
name = "default_admin_user"
|
||||
nickel_path = ["installer", "post_install", "default_admin_user"]
|
||||
prompt = "Default Admin User"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true && configure_defaults == true"
|
||||
default = ""
|
||||
help = "Default admin password (leave empty to auto-generate)"
|
||||
name = "default_admin_password"
|
||||
nickel_path = ["installer", "post_install", "default_admin_password"]
|
||||
prompt = "Default Admin Password"
|
||||
type = "password"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true && configure_defaults == true"
|
||||
default = ""
|
||||
help = "Default admin email address"
|
||||
name = "default_admin_email"
|
||||
nickel_path = ["installer", "post_install", "default_admin_email"]
|
||||
prompt = "Default Admin Email"
|
||||
type = "text"
|
||||
|
||||
# Initial Configuration
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = true
|
||||
help = "Import initial workspace configuration"
|
||||
name = "import_workspace_config"
|
||||
nickel_path = ["installer", "post_install", "import_workspace_config"]
|
||||
prompt = "Import Workspace Config"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "import_workspace_config == true"
|
||||
default = "/etc/provisioning/workspace-config.yaml"
|
||||
help = "Path to workspace configuration file"
|
||||
name = "workspace_config_path"
|
||||
nickel_path = ["installer", "post_install", "workspace_config_path"]
|
||||
prompt = "Workspace Config Path"
|
||||
type = "text"
|
||||
|
||||
# Extension Loading
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = false
|
||||
help = "Load extensions from registry after installation"
|
||||
name = "load_extensions_post_install"
|
||||
nickel_path = ["installer", "post_install", "load_extensions"]
|
||||
prompt = "Load Extensions"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "load_extensions_post_install == true"
|
||||
default = ""
|
||||
help = "Comma-separated list of extension names to load"
|
||||
name = "extensions_to_load"
|
||||
nickel_path = ["installer", "post_install", "extensions_to_load"]
|
||||
prompt = "Extensions to Load"
|
||||
type = "text"
|
||||
|
||||
# API Setup
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = false
|
||||
help = "Configure API tokens and authentication"
|
||||
name = "setup_api_auth"
|
||||
nickel_path = ["installer", "post_install", "setup_api_auth"]
|
||||
prompt = "Setup API Authentication"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "setup_api_auth == true"
|
||||
default = "jwt"
|
||||
help = "API authentication method"
|
||||
name = "api_auth_method"
|
||||
nickel_path = ["installer", "post_install", "api_auth_method"]
|
||||
options = ["jwt", "oauth2", "api_key"]
|
||||
prompt = "API Auth Method"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "setup_api_auth == true && api_auth_method == 'jwt'"
|
||||
default = ""
|
||||
help = "JWT issuer URL"
|
||||
name = "jwt_issuer"
|
||||
nickel_path = ["installer", "post_install", "jwt_issuer"]
|
||||
prompt = "JWT Issuer"
|
||||
type = "text"
|
||||
|
||||
# Verification Tasks
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = true
|
||||
help = "Run verification tests after installation"
|
||||
name = "run_verification_tests"
|
||||
nickel_path = ["installer", "post_install", "verification", "enabled"]
|
||||
prompt = "Run Verification Tests"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_verification_tests == true"
|
||||
default = 300
|
||||
help = "Verification test timeout in seconds (range: 30-3600)"
|
||||
max = 3600
|
||||
min = 30
|
||||
name = "verification_timeout"
|
||||
nickel_path = ["installer", "post_install", "verification", "timeout_seconds"]
|
||||
prompt = "Verification Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_verification_tests == true"
|
||||
default = true
|
||||
help = "Test API connectivity"
|
||||
name = "test_api_connectivity"
|
||||
nickel_path = ["installer", "post_install", "verification", "test_api_connectivity"]
|
||||
prompt = "Test API Connectivity"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_verification_tests == true"
|
||||
default = true
|
||||
help = "Test database connectivity"
|
||||
name = "test_database_connectivity"
|
||||
nickel_path = ["installer", "post_install", "verification", "test_database_connectivity"]
|
||||
prompt = "Test Database Connectivity"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_verification_tests == true"
|
||||
default = true
|
||||
help = "Test service health checks"
|
||||
name = "test_service_health"
|
||||
nickel_path = ["installer", "post_install", "verification", "test_service_health"]
|
||||
prompt = "Test Service Health"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_verification_tests == true"
|
||||
default = false
|
||||
help = "Run performance benchmarks"
|
||||
name = "run_benchmarks"
|
||||
nickel_path = ["installer", "post_install", "verification", "run_benchmarks"]
|
||||
prompt = "Run Benchmarks"
|
||||
type = "confirm"
|
||||
|
||||
# Notification and Reporting
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = false
|
||||
help = "Send installation completion notification"
|
||||
name = "send_notification"
|
||||
nickel_path = ["installer", "post_install", "notification", "enabled"]
|
||||
prompt = "Send Notification"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "send_notification == true"
|
||||
default = "email"
|
||||
help = "Notification method"
|
||||
name = "notification_method"
|
||||
nickel_path = ["installer", "post_install", "notification", "method"]
|
||||
options = ["email", "webhook", "slack", "teams"]
|
||||
prompt = "Notification Method"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "send_notification == true && notification_method == 'email'"
|
||||
default = ""
|
||||
help = "Email address for completion notification"
|
||||
name = "notification_email"
|
||||
nickel_path = ["installer", "post_install", "notification", "email_address"]
|
||||
prompt = "Notification Email"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "send_notification == true && notification_method == 'webhook'"
|
||||
default = ""
|
||||
help = "Webhook URL for completion notification"
|
||||
name = "notification_webhook_url"
|
||||
nickel_path = ["installer", "post_install", "notification", "webhook_url"]
|
||||
prompt = "Webhook URL"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "send_notification == true && notification_method == 'slack'"
|
||||
default = ""
|
||||
help = "Slack webhook URL"
|
||||
name = "notification_slack_webhook"
|
||||
nickel_path = ["installer", "post_install", "notification", "slack_webhook_url"]
|
||||
prompt = "Slack Webhook URL"
|
||||
type = "password"
|
||||
|
||||
[[elements]]
|
||||
condition = "send_notification == true && notification_method == 'teams'"
|
||||
default = ""
|
||||
help = "Microsoft Teams webhook URL"
|
||||
name = "notification_teams_webhook"
|
||||
nickel_path = ["installer", "post_install", "notification", "teams_webhook_url"]
|
||||
prompt = "Teams Webhook URL"
|
||||
type = "password"
|
||||
|
||||
# Documentation and Access Information
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = true
|
||||
help = "Generate installation access information and documentation"
|
||||
name = "generate_access_info"
|
||||
nickel_path = ["installer", "post_install", "generate_access_info"]
|
||||
prompt = "Generate Access Info"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "generate_access_info == true"
|
||||
default = "/var/provisioning/install-info.md"
|
||||
help = "Path to save installation access information"
|
||||
name = "access_info_path"
|
||||
nickel_path = ["installer", "post_install", "access_info_path"]
|
||||
prompt = "Access Info Path"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = false
|
||||
help = "Create compressed archive of installation logs and configs"
|
||||
name = "create_archive"
|
||||
nickel_path = ["installer", "post_install", "create_archive"]
|
||||
prompt = "Create Archive"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "create_archive == true"
|
||||
default = "/var/backups/provisioning-install-archive.tar.gz"
|
||||
help = "Path for installation archive"
|
||||
name = "archive_path"
|
||||
nickel_path = ["installer", "post_install", "archive_path"]
|
||||
prompt = "Archive Path"
|
||||
type = "text"
|
||||
|
||||
# Cleanup Tasks
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = true
|
||||
help = "Clean up temporary installation files"
|
||||
name = "cleanup_temp_files"
|
||||
nickel_path = ["installer", "post_install", "cleanup", "remove_temp_files"]
|
||||
prompt = "Cleanup Temp Files"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = false
|
||||
help = "Remove installation artifacts (logs, scripts)"
|
||||
name = "cleanup_artifacts"
|
||||
nickel_path = ["installer", "post_install", "cleanup", "remove_artifacts"]
|
||||
prompt = "Cleanup Artifacts"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_post_install_tasks == true"
|
||||
default = false
|
||||
help = "Run security hardening after installation"
|
||||
name = "run_security_hardening"
|
||||
nickel_path = ["installer", "post_install", "security_hardening", "enabled"]
|
||||
prompt = "Run Security Hardening"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_security_hardening == true"
|
||||
default = true
|
||||
help = "Disable unnecessary services"
|
||||
name = "disable_unnecessary_services"
|
||||
nickel_path = ["installer", "post_install", "security_hardening", "disable_unnecessary_services"]
|
||||
prompt = "Disable Unnecessary Services"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "run_security_hardening == true"
|
||||
default = true
|
||||
help = "Apply security patches"
|
||||
name = "apply_security_patches"
|
||||
nickel_path = ["installer", "post_install", "security_hardening", "apply_patches"]
|
||||
prompt = "Apply Security Patches"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,203 @@
|
||||
# Installer Preflight Checks Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "preflight_section_header"
|
||||
title = "✅ Preflight Checks"
|
||||
type = "section_header"
|
||||
|
||||
# Disk Space Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate sufficient disk space before installation"
|
||||
name = "check_disk_space"
|
||||
nickel_path = ["installer", "preflight", "disk_space_check", "enabled"]
|
||||
prompt = "Check Disk Space"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_disk_space == true"
|
||||
default = 50
|
||||
help = "Minimum required disk space in GB (range: 1-10000)"
|
||||
max = 10000
|
||||
min = 1
|
||||
name = "min_disk_gb"
|
||||
nickel_path = ["installer", "preflight", "disk_space_check", "min_disk_gb"]
|
||||
prompt = "Min Disk Space (GB)"
|
||||
type = "number"
|
||||
|
||||
# Memory Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate sufficient RAM before installation"
|
||||
name = "check_memory"
|
||||
nickel_path = ["installer", "preflight", "memory_check", "enabled"]
|
||||
prompt = "Check Memory"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_memory == true"
|
||||
default = 4
|
||||
help = "Minimum required RAM in GB"
|
||||
min = 1
|
||||
max = 512
|
||||
name = "min_memory_gb"
|
||||
nickel_path = ["installer", "preflight", "memory_check", "min_memory_gb"]
|
||||
prompt = "Min Memory (GB)"
|
||||
type = "number"
|
||||
|
||||
# CPU Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate minimum CPU cores before installation"
|
||||
name = "check_cpu"
|
||||
nickel_path = ["installer", "preflight", "cpu_check", "enabled"]
|
||||
prompt = "Check CPU Cores"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_cpu == true"
|
||||
default = 2
|
||||
help = "Minimum required CPU cores"
|
||||
min = 1
|
||||
max = 128
|
||||
name = "min_cpu_cores"
|
||||
nickel_path = ["installer", "preflight", "cpu_check", "min_cpu_cores"]
|
||||
prompt = "Min CPU Cores"
|
||||
type = "number"
|
||||
|
||||
# Network Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate network connectivity before installation"
|
||||
name = "check_network"
|
||||
nickel_path = ["installer", "preflight", "network_check", "enabled"]
|
||||
prompt = "Check Network Connectivity"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_network == true"
|
||||
default = ""
|
||||
help = "External host to ping for connectivity test (e.g., 8.8.8.8)"
|
||||
name = "network_check_host"
|
||||
nickel_path = ["installer", "preflight", "network_check", "test_host"]
|
||||
prompt = "Network Test Host"
|
||||
type = "text"
|
||||
|
||||
# Dependency Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate required system dependencies are available"
|
||||
name = "check_dependencies"
|
||||
nickel_path = ["installer", "preflight", "dependency_check", "enabled"]
|
||||
prompt = "Check Dependencies"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_dependencies == true"
|
||||
default = true
|
||||
help = "Check for required container runtime (docker/podman)"
|
||||
name = "check_container_runtime"
|
||||
nickel_path = ["installer", "preflight", "dependency_check", "container_runtime"]
|
||||
prompt = "Check Container Runtime"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_dependencies == true"
|
||||
default = false
|
||||
help = "Check for Kubernetes cluster connectivity"
|
||||
name = "check_kubernetes"
|
||||
nickel_path = ["installer", "preflight", "dependency_check", "kubernetes"]
|
||||
prompt = "Check Kubernetes"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_dependencies == true"
|
||||
default = false
|
||||
help = "Check for required Rust toolchain"
|
||||
name = "check_rust"
|
||||
nickel_path = ["installer", "preflight", "dependency_check", "rust_toolchain"]
|
||||
prompt = "Check Rust Toolchain"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_dependencies == true"
|
||||
default = false
|
||||
help = "Check for Nushell script engine"
|
||||
name = "check_nushell"
|
||||
nickel_path = ["installer", "preflight", "dependency_check", "nushell"]
|
||||
prompt = "Check Nushell"
|
||||
type = "confirm"
|
||||
|
||||
# Port Availability Check
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Validate that installation ports are available"
|
||||
name = "check_ports"
|
||||
nickel_path = ["installer", "preflight", "port_check", "enabled"]
|
||||
prompt = "Check Port Availability"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_ports == true"
|
||||
default = "9090,8080,8000"
|
||||
help = "Comma-separated list of ports to check (e.g., 9090,8080,8000)"
|
||||
name = "ports_to_check"
|
||||
nickel_path = ["installer", "preflight", "port_check", "ports"]
|
||||
prompt = "Ports to Check"
|
||||
type = "text"
|
||||
|
||||
# Permissions Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate user has necessary permissions for installation"
|
||||
name = "check_permissions"
|
||||
nickel_path = ["installer", "preflight", "permissions_check", "enabled"]
|
||||
prompt = "Check Permissions"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_permissions == true"
|
||||
default = false
|
||||
help = "Require root/admin permissions for installation"
|
||||
name = "require_root"
|
||||
nickel_path = ["installer", "preflight", "permissions_check", "require_root"]
|
||||
prompt = "Require Root"
|
||||
type = "confirm"
|
||||
|
||||
# File System Check
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Validate file system compatibility (must support extended attributes)"
|
||||
name = "check_filesystem"
|
||||
nickel_path = ["installer", "preflight", "filesystem_check", "enabled"]
|
||||
prompt = "Check File System"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "check_filesystem == true"
|
||||
default = false
|
||||
help = "Require SELinux support"
|
||||
name = "require_selinux"
|
||||
nickel_path = ["installer", "preflight", "filesystem_check", "require_selinux"]
|
||||
prompt = "Require SELinux"
|
||||
type = "confirm"
|
||||
|
||||
# Preflight Check Behavior
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Skip failed preflight checks and continue installation"
|
||||
name = "ignore_preflight_failures"
|
||||
nickel_path = ["installer", "preflight", "ignore_failures"]
|
||||
prompt = "Ignore Preflight Failures"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = "warn"
|
||||
help = "How to handle preflight warnings"
|
||||
name = "preflight_failure_mode"
|
||||
nickel_path = ["installer", "preflight", "failure_mode"]
|
||||
options = ["warn", "error", "fatal"]
|
||||
prompt = "Failure Mode"
|
||||
type = "select"
|
||||
@ -0,0 +1,189 @@
|
||||
# Installer Services Selection Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "services_section_header"
|
||||
title = "🚀 Services Selection"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Install Orchestrator (workflow engine and task scheduling)"
|
||||
name = "install_orchestrator"
|
||||
nickel_path = ["installer", "services", "orchestrator", "enabled"]
|
||||
prompt = "Install Orchestrator"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Install Control Center (policy and RBAC management)"
|
||||
name = "install_control_center"
|
||||
nickel_path = ["installer", "services", "control_center", "enabled"]
|
||||
prompt = "Install Control Center"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Install MCP Server (Model Context Protocol interface)"
|
||||
name = "install_mcp_server"
|
||||
nickel_path = ["installer", "services", "mcp_server", "enabled"]
|
||||
prompt = "Install MCP Server"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install AI Service (AI model integration and inference)"
|
||||
name = "install_ai_service"
|
||||
nickel_path = ["installer", "services", "ai_service", "enabled"]
|
||||
prompt = "Install AI Service"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install Vault Service (secrets and KMS management)"
|
||||
name = "install_vault_service"
|
||||
nickel_path = ["installer", "services", "vault_service", "enabled"]
|
||||
prompt = "Install Vault Service"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install RAG Service (retrieval-augmented generation)"
|
||||
name = "install_rag_service"
|
||||
nickel_path = ["installer", "services", "rag_service", "enabled"]
|
||||
prompt = "Install RAG Service"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install Extension Registry (OCI registry for extensions)"
|
||||
name = "install_extension_registry"
|
||||
nickel_path = ["installer", "services", "extension_registry", "enabled"]
|
||||
prompt = "Install Extension Registry"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install Detector Service (system monitoring and detection)"
|
||||
name = "install_detector"
|
||||
nickel_path = ["installer", "services", "detector", "enabled"]
|
||||
prompt = "Install Detector"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install API Gateway (request routing and load balancing)"
|
||||
name = "install_api_gateway"
|
||||
nickel_path = ["installer", "services", "api_gateway", "enabled"]
|
||||
prompt = "Install API Gateway"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Install monitoring stack (Prometheus, Grafana, Loki)"
|
||||
name = "install_monitoring_stack"
|
||||
nickel_path = ["installer", "services", "monitoring_stack", "enabled"]
|
||||
prompt = "Install Monitoring Stack"
|
||||
type = "confirm"
|
||||
|
||||
# Service Dependencies and Configuration
|
||||
[[elements]]
|
||||
condition = "install_orchestrator == true"
|
||||
default = true
|
||||
help = "Start Orchestrator immediately after installation"
|
||||
name = "orchestrator_auto_start"
|
||||
nickel_path = ["installer", "services", "orchestrator", "auto_start"]
|
||||
prompt = "Orchestrator Auto-Start"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_control_center == true"
|
||||
default = true
|
||||
help = "Start Control Center immediately after installation"
|
||||
name = "control_center_auto_start"
|
||||
nickel_path = ["installer", "services", "control_center", "auto_start"]
|
||||
prompt = "Control Center Auto-Start"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_mcp_server == true"
|
||||
default = true
|
||||
help = "Start MCP Server immediately after installation"
|
||||
name = "mcp_server_auto_start"
|
||||
nickel_path = ["installer", "services", "mcp_server", "auto_start"]
|
||||
prompt = "MCP Server Auto-Start"
|
||||
type = "confirm"
|
||||
|
||||
# Service Ports Configuration
|
||||
[[elements]]
|
||||
condition = "install_orchestrator == true"
|
||||
default = 9090
|
||||
help = "Port for Orchestrator service (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "orchestrator_port"
|
||||
nickel_path = ["installer", "services", "orchestrator", "port"]
|
||||
prompt = "Orchestrator Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_control_center == true"
|
||||
default = 8080
|
||||
help = "Port for Control Center service (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "control_center_port"
|
||||
nickel_path = ["installer", "services", "control_center", "port"]
|
||||
prompt = "Control Center Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_mcp_server == true"
|
||||
default = 8000
|
||||
help = "Port for MCP Server service (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "mcp_server_port"
|
||||
nickel_path = ["installer", "services", "mcp_server", "port"]
|
||||
prompt = "MCP Server Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "install_api_gateway == true"
|
||||
default = 8443
|
||||
help = "Port for API Gateway service (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "api_gateway_port"
|
||||
nickel_path = ["installer", "services", "api_gateway", "port"]
|
||||
prompt = "API Gateway Port"
|
||||
type = "number"
|
||||
|
||||
# Service Update Strategy
|
||||
[[elements]]
|
||||
default = "rolling"
|
||||
help = "Strategy for updating services during installation"
|
||||
name = "service_update_strategy"
|
||||
nickel_path = ["installer", "services", "update_strategy"]
|
||||
options = ["rolling", "blue_green", "canary"]
|
||||
prompt = "Service Update Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable health checks between service updates"
|
||||
name = "enable_health_checks"
|
||||
nickel_path = ["installer", "services", "health_checks", "enabled"]
|
||||
prompt = "Enable Health Checks"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_health_checks == true"
|
||||
default = 30
|
||||
help = "Health check interval in seconds"
|
||||
min = 5
|
||||
name = "health_check_interval"
|
||||
nickel_path = ["installer", "services", "health_checks", "interval_seconds"]
|
||||
prompt = "Health Check Interval (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,236 @@
|
||||
# Installer Storage Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "installer_storage_section_header"
|
||||
title = "💾 Storage Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# Storage Location
|
||||
[[elements]]
|
||||
default = "/var/lib/provisioning"
|
||||
help = "Root directory for provisioning data storage"
|
||||
name = "storage_root_path"
|
||||
nickel_path = ["installer", "storage", "root_path"]
|
||||
prompt = "Storage Root Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 500
|
||||
help = "Allocated storage space in GB (range: 10-100000)"
|
||||
max = 100000
|
||||
min = 10
|
||||
name = "storage_size_gb"
|
||||
nickel_path = ["installer", "storage", "size_gb"]
|
||||
prompt = "Storage Size (GB)"
|
||||
type = "number"
|
||||
|
||||
# Storage Backend Selection
|
||||
[[elements]]
|
||||
default = "filesystem"
|
||||
help = "Storage backend type"
|
||||
name = "installer_storage_backend"
|
||||
nickel_path = ["installer", "storage", "backend"]
|
||||
options = ["filesystem", "object_storage", "block_storage"]
|
||||
prompt = "Storage Backend"
|
||||
type = "select"
|
||||
|
||||
# Filesystem Storage (conditional)
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'filesystem'"
|
||||
default = "ext4"
|
||||
help = "File system type"
|
||||
name = "filesystem_type"
|
||||
nickel_path = ["installer", "storage", "filesystem", "type"]
|
||||
options = ["ext4", "xfs", "btrfs", "zfs"]
|
||||
prompt = "File System Type"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'filesystem'"
|
||||
default = true
|
||||
help = "Enable file system snapshots"
|
||||
name = "filesystem_snapshots_enabled"
|
||||
nickel_path = ["installer", "storage", "filesystem", "snapshots", "enabled"]
|
||||
prompt = "Enable Snapshots"
|
||||
type = "confirm"
|
||||
|
||||
# Object Storage (conditional)
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'object_storage'"
|
||||
default = "s3"
|
||||
help = "Object storage provider"
|
||||
name = "object_storage_provider"
|
||||
nickel_path = ["installer", "storage", "object_storage", "provider"]
|
||||
options = ["s3", "gcs", "azure_blob", "minio"]
|
||||
prompt = "Object Storage Provider"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'object_storage'"
|
||||
default = ""
|
||||
help = "Object storage endpoint URL"
|
||||
name = "object_storage_endpoint"
|
||||
nickel_path = ["installer", "storage", "object_storage", "endpoint"]
|
||||
prompt = "Storage Endpoint"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'object_storage'"
|
||||
default = ""
|
||||
help = "Object storage bucket name"
|
||||
name = "object_storage_bucket"
|
||||
nickel_path = ["installer", "storage", "object_storage", "bucket"]
|
||||
prompt = "Storage Bucket"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'object_storage'"
|
||||
default = ""
|
||||
help = "Object storage access key ID (will be encrypted)"
|
||||
name = "object_storage_access_key"
|
||||
nickel_path = ["installer", "storage", "object_storage", "access_key"]
|
||||
prompt = "Access Key"
|
||||
required = true
|
||||
type = "password"
|
||||
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'object_storage'"
|
||||
default = ""
|
||||
help = "Object storage secret access key (will be encrypted)"
|
||||
name = "object_storage_secret_key"
|
||||
nickel_path = ["installer", "storage", "object_storage", "secret_key"]
|
||||
prompt = "Secret Key"
|
||||
required = true
|
||||
type = "password"
|
||||
|
||||
# Block Storage (conditional)
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'block_storage'"
|
||||
default = "local"
|
||||
help = "Block storage type"
|
||||
name = "block_storage_type"
|
||||
nickel_path = ["installer", "storage", "block_storage", "type"]
|
||||
options = ["local", "san", "nas"]
|
||||
prompt = "Block Storage Type"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "installer_storage_backend == 'block_storage'"
|
||||
default = "/dev/sdb"
|
||||
help = "Block device path"
|
||||
name = "block_device_path"
|
||||
nickel_path = ["installer", "storage", "block_storage", "device_path"]
|
||||
prompt = "Block Device Path"
|
||||
type = "text"
|
||||
|
||||
# Storage Compression and Encryption
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable compression for stored data"
|
||||
name = "storage_compression_enabled"
|
||||
nickel_path = ["installer", "storage", "compression", "enabled"]
|
||||
prompt = "Enable Compression"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_compression_enabled == true"
|
||||
default = "zstd"
|
||||
help = "Compression algorithm"
|
||||
name = "storage_compression_algorithm"
|
||||
nickel_path = ["installer", "storage", "compression", "algorithm"]
|
||||
options = ["zstd", "gzip", "snappy"]
|
||||
prompt = "Compression Algorithm"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable encryption for stored data"
|
||||
name = "storage_encryption_enabled"
|
||||
nickel_path = ["installer", "storage", "encryption", "enabled"]
|
||||
prompt = "Enable Encryption"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_encryption_enabled == true"
|
||||
default = "aes256"
|
||||
help = "Encryption algorithm"
|
||||
name = "storage_encryption_algorithm"
|
||||
nickel_path = ["installer", "storage", "encryption", "algorithm"]
|
||||
options = ["aes256", "chacha20"]
|
||||
prompt = "Encryption Algorithm"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_encryption_enabled == true"
|
||||
default = "age"
|
||||
help = "Key management system for encryption keys"
|
||||
name = "storage_kms"
|
||||
nickel_path = ["installer", "storage", "encryption", "kms"]
|
||||
options = ["age", "sops", "vault", "kms"]
|
||||
prompt = "Key Management"
|
||||
type = "select"
|
||||
|
||||
# Storage Replication
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable storage replication for redundancy"
|
||||
name = "storage_replication_enabled"
|
||||
nickel_path = ["installer", "storage", "replication", "enabled"]
|
||||
prompt = "Enable Replication"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_replication_enabled == true"
|
||||
default = 3
|
||||
help = "Number of replicas (range: 2-10)"
|
||||
max = 10
|
||||
min = 2
|
||||
name = "storage_replication_factor"
|
||||
nickel_path = ["installer", "storage", "replication", "factor"]
|
||||
prompt = "Replication Factor"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_replication_enabled == true"
|
||||
default = "sync"
|
||||
help = "Replication mode"
|
||||
name = "storage_replication_mode"
|
||||
nickel_path = ["installer", "storage", "replication", "mode"]
|
||||
options = ["sync", "async", "hybrid"]
|
||||
prompt = "Replication Mode"
|
||||
type = "select"
|
||||
|
||||
# Storage Cleanup
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable automatic cleanup of old data"
|
||||
name = "storage_cleanup_enabled"
|
||||
nickel_path = ["installer", "storage", "cleanup", "enabled"]
|
||||
prompt = "Enable Cleanup"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_cleanup_enabled == true"
|
||||
default = 90
|
||||
help = "Retention period for archived data in days"
|
||||
min = 7
|
||||
max = 3650
|
||||
name = "storage_cleanup_retention_days"
|
||||
nickel_path = ["installer", "storage", "cleanup", "retention_days"]
|
||||
prompt = "Retention Period (days)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_cleanup_enabled == true"
|
||||
default = "weekly"
|
||||
help = "Cleanup schedule"
|
||||
name = "storage_cleanup_schedule"
|
||||
nickel_path = ["installer", "storage", "cleanup", "schedule"]
|
||||
options = ["daily", "weekly", "monthly"]
|
||||
prompt = "Cleanup Schedule"
|
||||
type = "select"
|
||||
@ -0,0 +1,160 @@
|
||||
# Installer Target Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "target_section_header"
|
||||
title = "🎯 Installation Target"
|
||||
type = "section_header"
|
||||
|
||||
# Target Type Selection
|
||||
[[elements]]
|
||||
default = "local"
|
||||
help = "Target environment for installation"
|
||||
name = "target_type"
|
||||
nickel_path = ["installer", "target", "type"]
|
||||
options = ["local", "remote", "kubernetes", "docker"]
|
||||
prompt = "Target Type"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
# Local Installation (conditional)
|
||||
[[elements]]
|
||||
condition = "target_type == 'local'"
|
||||
default = "/opt/provisioning"
|
||||
help = "Installation directory for local deployment"
|
||||
name = "local_install_path"
|
||||
nickel_path = ["installer", "target", "local_path"]
|
||||
prompt = "Installation Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# Remote Installation (conditional)
|
||||
[[elements]]
|
||||
condition = "target_type == 'remote'"
|
||||
default = "example.com"
|
||||
help = "Hostname or IP address of remote host"
|
||||
name = "remote_host"
|
||||
nickel_path = ["installer", "target", "remote_host"]
|
||||
prompt = "Remote Host"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "target_type == 'remote'"
|
||||
default = 22
|
||||
help = "SSH port for remote access (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "remote_ssh_port"
|
||||
nickel_path = ["installer", "target", "remote_ssh_port"]
|
||||
prompt = "SSH Port"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "target_type == 'remote'"
|
||||
default = "ubuntu"
|
||||
help = "SSH username for remote access"
|
||||
name = "remote_ssh_user"
|
||||
nickel_path = ["installer", "target", "remote_ssh_user"]
|
||||
prompt = "SSH User"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "target_type == 'remote'"
|
||||
default = ""
|
||||
help = "Path to SSH private key (leave empty to use ssh-agent)"
|
||||
name = "remote_ssh_key_path"
|
||||
nickel_path = ["installer", "target", "remote_ssh_key_path"]
|
||||
prompt = "SSH Key Path"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "target_type == 'remote'"
|
||||
default = false
|
||||
help = "Accept unknown SSH host keys"
|
||||
name = "remote_ssh_insecure"
|
||||
nickel_path = ["installer", "target", "remote_ssh_insecure"]
|
||||
prompt = "Accept Unknown Keys"
|
||||
type = "confirm"
|
||||
|
||||
# Kubernetes Installation (conditional)
|
||||
[[elements]]
|
||||
condition = "target_type == 'kubernetes'"
|
||||
default = "default"
|
||||
help = "Kubernetes namespace for installation"
|
||||
name = "k8s_namespace"
|
||||
nickel_path = ["installer", "target", "k8s_namespace"]
|
||||
prompt = "Kubernetes Namespace"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "target_type == 'kubernetes'"
|
||||
default = "provisioning"
|
||||
help = "Kubernetes context to use"
|
||||
name = "k8s_context"
|
||||
nickel_path = ["installer", "target", "k8s_context"]
|
||||
prompt = "Kubernetes Context"
|
||||
type = "text"
|
||||
|
||||
# Docker Installation (conditional)
|
||||
[[elements]]
|
||||
condition = "target_type == 'docker'"
|
||||
default = "unix:///var/run/docker.sock"
|
||||
help = "Docker daemon endpoint"
|
||||
name = "docker_host"
|
||||
nickel_path = ["installer", "target", "docker_host"]
|
||||
prompt = "Docker Host"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# Cloud Provider Configuration (for all types)
|
||||
[[elements]]
|
||||
default = "none"
|
||||
help = "Cloud provider for monitoring and management APIs"
|
||||
name = "cloud_provider"
|
||||
nickel_path = ["installer", "target", "cloud_provider"]
|
||||
options = ["none", "aws", "gcp", "azure", "digitalocean", "linode"]
|
||||
prompt = "Cloud Provider"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "cloud_provider != 'none'"
|
||||
default = ""
|
||||
help = "Cloud provider region"
|
||||
name = "cloud_region"
|
||||
nickel_path = ["installer", "target", "cloud_region"]
|
||||
prompt = "Cloud Region"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "cloud_provider != 'none'"
|
||||
default = ""
|
||||
help = "Cloud provider API key or credentials (will be encrypted)"
|
||||
name = "cloud_credentials"
|
||||
nickel_path = ["installer", "target", "cloud_credentials"]
|
||||
prompt = "Cloud Credentials"
|
||||
type = "password"
|
||||
|
||||
# Operating System Detection
|
||||
[[elements]]
|
||||
default = "auto"
|
||||
help = "Target operating system"
|
||||
name = "target_os"
|
||||
nickel_path = ["installer", "target", "os"]
|
||||
options = ["auto", "linux", "macos", "windows"]
|
||||
prompt = "Target OS"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "target_os == 'linux'"
|
||||
default = "auto"
|
||||
help = "Linux distribution"
|
||||
name = "target_linux_distro"
|
||||
nickel_path = ["installer", "target", "linux_distro"]
|
||||
options = ["auto", "ubuntu", "debian", "centos", "rhel", "alpine"]
|
||||
prompt = "Linux Distribution"
|
||||
type = "select"
|
||||
@ -0,0 +1,359 @@
|
||||
# Installer Upgrades Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "upgrades_section_header"
|
||||
title = "📦 Upgrades Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# Auto-Upgrade Settings
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable automatic system updates and upgrades"
|
||||
name = "auto_upgrade_enabled"
|
||||
nickel_path = ["installer", "upgrades", "auto_upgrade", "enabled"]
|
||||
prompt = "Enable Auto-Upgrade"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_upgrade_enabled == true"
|
||||
default = true
|
||||
help = "Check for updates at startup"
|
||||
name = "check_updates_on_startup"
|
||||
nickel_path = ["installer", "upgrades", "auto_upgrade", "check_on_startup"]
|
||||
prompt = "Check Updates on Startup"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_upgrade_enabled == true"
|
||||
default = false
|
||||
help = "Automatically apply patches without confirmation"
|
||||
name = "auto_apply_patches"
|
||||
nickel_path = ["installer", "upgrades", "auto_upgrade", "auto_apply_patches"]
|
||||
prompt = "Auto-Apply Patches"
|
||||
type = "confirm"
|
||||
|
||||
# Update Channels
|
||||
[[elements]]
|
||||
default = "stable"
|
||||
help = "Software update channel preference"
|
||||
name = "update_channel"
|
||||
nickel_path = ["installer", "upgrades", "update_channel"]
|
||||
options = ["stable", "lts", "beta", "nightly"]
|
||||
prompt = "Update Channel"
|
||||
type = "select"
|
||||
|
||||
# Upgrade Strategy
|
||||
[[elements]]
|
||||
default = "rolling"
|
||||
help = "Strategy for applying upgrades"
|
||||
name = "upgrade_strategy"
|
||||
nickel_path = ["installer", "upgrades", "strategy"]
|
||||
options = ["rolling", "blue_green", "canary", "maintenance_window"]
|
||||
prompt = "Upgrade Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "upgrade_strategy == 'rolling'"
|
||||
default = 1
|
||||
help = "Number of services to upgrade in parallel"
|
||||
min = 1
|
||||
max = 10
|
||||
name = "rolling_upgrade_parallel"
|
||||
nickel_path = ["installer", "upgrades", "rolling", "parallel_services"]
|
||||
prompt = "Parallel Services"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "upgrade_strategy == 'canary'"
|
||||
default = 10
|
||||
help = "Percentage of traffic to route to canary version"
|
||||
min = 1
|
||||
max = 50
|
||||
name = "canary_percentage"
|
||||
nickel_path = ["installer", "upgrades", "canary", "traffic_percentage"]
|
||||
prompt = "Canary Traffic %"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "upgrade_strategy == 'canary'"
|
||||
default = 300
|
||||
help = "Canary test duration in seconds (range: 30-7200)"
|
||||
max = 7200
|
||||
min = 30
|
||||
name = "canary_duration_seconds"
|
||||
nickel_path = ["installer", "upgrades", "canary", "duration_seconds"]
|
||||
prompt = "Canary Duration (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "upgrade_strategy == 'maintenance_window'"
|
||||
default = "sunday"
|
||||
help = "Day of week for maintenance window"
|
||||
name = "maintenance_day"
|
||||
nickel_path = ["installer", "upgrades", "maintenance_window", "day"]
|
||||
options = ["sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"]
|
||||
prompt = "Maintenance Day"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "upgrade_strategy == 'maintenance_window'"
|
||||
default = "02:00"
|
||||
help = "Time of day for maintenance window (HH:MM format, UTC)"
|
||||
name = "maintenance_time"
|
||||
nickel_path = ["installer", "upgrades", "maintenance_window", "time"]
|
||||
prompt = "Maintenance Time (UTC)"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "upgrade_strategy == 'maintenance_window'"
|
||||
default = 3600
|
||||
help = "Maximum duration of maintenance window in seconds (range: 600-86400)"
|
||||
max = 86400
|
||||
min = 600
|
||||
name = "maintenance_duration_seconds"
|
||||
nickel_path = ["installer", "upgrades", "maintenance_window", "max_duration_seconds"]
|
||||
prompt = "Max Duration (seconds)"
|
||||
type = "number"
|
||||
|
||||
# Pre-Upgrade Checks
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Run checks before upgrading"
|
||||
name = "pre_upgrade_checks_enabled"
|
||||
nickel_path = ["installer", "upgrades", "pre_checks", "enabled"]
|
||||
prompt = "Enable Pre-Upgrade Checks"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "pre_upgrade_checks_enabled == true"
|
||||
default = true
|
||||
help = "Check disk space requirements"
|
||||
name = "check_disk_space_for_upgrade"
|
||||
nickel_path = ["installer", "upgrades", "pre_checks", "check_disk_space"]
|
||||
prompt = "Check Disk Space"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "pre_upgrade_checks_enabled == true"
|
||||
default = true
|
||||
help = "Check service health before upgrade"
|
||||
name = "check_service_health_pre_upgrade"
|
||||
nickel_path = ["installer", "upgrades", "pre_checks", "check_service_health"]
|
||||
prompt = "Check Service Health"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "pre_upgrade_checks_enabled == true"
|
||||
default = true
|
||||
help = "Check API/database connectivity"
|
||||
name = "check_connectivity_pre_upgrade"
|
||||
nickel_path = ["installer", "upgrades", "pre_checks", "check_connectivity"]
|
||||
prompt = "Check Connectivity"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "pre_upgrade_checks_enabled == true"
|
||||
default = true
|
||||
help = "Validate backup integrity"
|
||||
name = "validate_backup_integrity"
|
||||
nickel_path = ["installer", "upgrades", "pre_checks", "validate_backup_integrity"]
|
||||
prompt = "Validate Backup Integrity"
|
||||
type = "confirm"
|
||||
|
||||
# Backup Before Upgrade
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Create backup before upgrade"
|
||||
name = "backup_before_upgrade"
|
||||
nickel_path = ["installer", "upgrades", "backup_before_upgrade"]
|
||||
prompt = "Backup Before Upgrade"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "backup_before_upgrade == true"
|
||||
default = "full"
|
||||
help = "Type of backup to create"
|
||||
name = "pre_upgrade_backup_type"
|
||||
nickel_path = ["installer", "upgrades", "backup_type"]
|
||||
options = ["full", "incremental", "snapshot"]
|
||||
prompt = "Backup Type"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "backup_before_upgrade == true"
|
||||
default = 30
|
||||
help = "Backup timeout in minutes"
|
||||
min = 5
|
||||
max = 1440
|
||||
name = "backup_timeout_minutes"
|
||||
nickel_path = ["installer", "upgrades", "backup_timeout_minutes"]
|
||||
prompt = "Backup Timeout (minutes)"
|
||||
type = "number"
|
||||
|
||||
# Upgrade Rollback
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable automatic rollback on upgrade failure"
|
||||
name = "enable_rollback_on_failure"
|
||||
nickel_path = ["installer", "upgrades", "rollback", "enabled"]
|
||||
prompt = "Enable Rollback"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_rollback_on_failure == true"
|
||||
default = "automatic"
|
||||
help = "Rollback strategy"
|
||||
name = "rollback_on_failure_strategy"
|
||||
nickel_path = ["installer", "upgrades", "rollback", "strategy"]
|
||||
options = ["automatic", "manual", "data_aware"]
|
||||
prompt = "Rollback Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_rollback_on_failure == true"
|
||||
default = 300
|
||||
help = "Time to wait after upgrade before validating success (seconds, range: 30-1800)"
|
||||
max = 1800
|
||||
min = 30
|
||||
name = "rollback_validation_delay"
|
||||
nickel_path = ["installer", "upgrades", "rollback", "validation_delay_seconds"]
|
||||
prompt = "Validation Delay (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_rollback_on_failure == true"
|
||||
default = true
|
||||
help = "Perform database migrations rollback"
|
||||
name = "rollback_database_migrations"
|
||||
nickel_path = ["installer", "upgrades", "rollback", "database_migrations"]
|
||||
prompt = "Rollback DB Migrations"
|
||||
type = "confirm"
|
||||
|
||||
# Service-Specific Upgrades
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Upgrade Orchestrator service"
|
||||
name = "upgrade_orchestrator"
|
||||
nickel_path = ["installer", "upgrades", "services", "orchestrator"]
|
||||
prompt = "Upgrade Orchestrator"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Upgrade Control Center service"
|
||||
name = "upgrade_control_center"
|
||||
nickel_path = ["installer", "upgrades", "services", "control_center"]
|
||||
prompt = "Upgrade Control Center"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Upgrade MCP Server service"
|
||||
name = "upgrade_mcp_server"
|
||||
nickel_path = ["installer", "upgrades", "services", "mcp_server"]
|
||||
prompt = "Upgrade MCP Server"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Upgrade AI Service"
|
||||
name = "upgrade_ai_service"
|
||||
nickel_path = ["installer", "upgrades", "services", "ai_service"]
|
||||
prompt = "Upgrade AI Service"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Upgrade RAG Service"
|
||||
name = "upgrade_rag_service"
|
||||
nickel_path = ["installer", "upgrades", "services", "rag_service"]
|
||||
prompt = "Upgrade RAG Service"
|
||||
type = "confirm"
|
||||
|
||||
# Health Checks After Upgrade
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Run health checks after upgrade completes"
|
||||
name = "health_checks_post_upgrade"
|
||||
nickel_path = ["installer", "upgrades", "post_upgrade", "health_checks_enabled"]
|
||||
prompt = "Health Checks After Upgrade"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "health_checks_post_upgrade == true"
|
||||
default = 60
|
||||
help = "Health check interval after upgrade in seconds (range: 5-300)"
|
||||
max = 300
|
||||
min = 5
|
||||
name = "post_upgrade_health_check_interval"
|
||||
nickel_path = ["installer", "upgrades", "post_upgrade", "health_check_interval_seconds"]
|
||||
prompt = "Health Check Interval (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "health_checks_post_upgrade == true"
|
||||
default = 600
|
||||
help = "Duration to monitor health after upgrade in seconds (range: 60-86400)"
|
||||
max = 86400
|
||||
min = 60
|
||||
name = "post_upgrade_monitoring_duration"
|
||||
nickel_path = ["installer", "upgrades", "post_upgrade", "monitoring_duration_seconds"]
|
||||
prompt = "Monitoring Duration (seconds)"
|
||||
type = "number"
|
||||
|
||||
# Version Constraints
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enforce version constraints for upgrades"
|
||||
name = "enable_version_constraints"
|
||||
nickel_path = ["installer", "upgrades", "version_constraints", "enabled"]
|
||||
prompt = "Enable Version Constraints"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_version_constraints == true"
|
||||
default = "compatible"
|
||||
help = "Version compatibility mode"
|
||||
name = "version_constraint_mode"
|
||||
nickel_path = ["installer", "upgrades", "version_constraints", "mode"]
|
||||
options = ["compatible", "minimum", "maximum", "exact"]
|
||||
prompt = "Version Constraint Mode"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_version_constraints == true && version_constraint_mode == 'minimum'"
|
||||
default = ""
|
||||
help = "Minimum version to upgrade to (e.g., 3.1.0)"
|
||||
name = "minimum_version"
|
||||
nickel_path = ["installer", "upgrades", "version_constraints", "minimum_version"]
|
||||
prompt = "Minimum Version"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "enable_version_constraints == true && version_constraint_mode == 'maximum'"
|
||||
default = ""
|
||||
help = "Maximum version to upgrade to (e.g., 4.0.0)"
|
||||
name = "maximum_version"
|
||||
nickel_path = ["installer", "upgrades", "version_constraints", "maximum_version"]
|
||||
prompt = "Maximum Version"
|
||||
type = "text"
|
||||
|
||||
# Notification
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Send notification when upgrade completes"
|
||||
name = "notify_on_upgrade_complete"
|
||||
nickel_path = ["installer", "upgrades", "notification", "enabled"]
|
||||
prompt = "Notify on Upgrade Complete"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "notify_on_upgrade_complete == true"
|
||||
default = ""
|
||||
help = "Email address for upgrade completion notification"
|
||||
name = "upgrade_notification_email"
|
||||
nickel_path = ["installer", "upgrades", "notification", "email"]
|
||||
prompt = "Notification Email"
|
||||
type = "text"
|
||||
57
.typedialog/platform/forms/fragments/logging-section.toml
Normal file
57
.typedialog/platform/forms/fragments/logging-section.toml
Normal file
@ -0,0 +1,57 @@
|
||||
# Logging Configuration Fragment
|
||||
# Optional for all services
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "logging_section_header"
|
||||
title = "📝 Logging Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "info"
|
||||
help = "Log level (debug, info, warn, error)"
|
||||
name = "logging_level"
|
||||
nickel_path = ["logging", "level"]
|
||||
options = ["debug", "info", "warn", "error"]
|
||||
prompt = "Log Level"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = "text"
|
||||
help = "Log format (text, json)"
|
||||
name = "logging_format"
|
||||
nickel_path = ["logging", "format"]
|
||||
options = ["text", "json"]
|
||||
prompt = "Log Format"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable file-based logging with rotation"
|
||||
name = "logging_file_enabled"
|
||||
nickel_path = ["logging", "file", "enabled"]
|
||||
prompt = "Enable File Logging"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "logging_file_enabled == true"
|
||||
default = 10485760
|
||||
help = "Maximum log file size in bytes before rotation (range: ${constraint.common.logging.max_file_size.min}-${constraint.common.logging.max_file_size.max})"
|
||||
max = "${constraint.common.logging.max_file_size.max}"
|
||||
min = "${constraint.common.logging.max_file_size.min}"
|
||||
name = "logging_max_file_size"
|
||||
nickel_path = ["logging", "file", "max_size"]
|
||||
prompt = "Max File Size (bytes)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "logging_file_enabled == true"
|
||||
default = 10
|
||||
help = "Maximum number of backup log files to keep (range: ${constraint.common.logging.max_backups.min}-${constraint.common.logging.max_backups.max})"
|
||||
max = "${constraint.common.logging.max_backups.max}"
|
||||
min = "${constraint.common.logging.max_backups.min}"
|
||||
name = "logging_max_backups"
|
||||
nickel_path = ["logging", "file", "max_backups"]
|
||||
prompt = "Max Backup Files"
|
||||
type = "number"
|
||||
@ -0,0 +1,67 @@
|
||||
# MCP Server Prompts Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "prompts_section_header"
|
||||
title = "💬 Prompts Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable MCP prompts capability"
|
||||
name = "prompts_enabled"
|
||||
nickel_path = ["prompts", "enabled"]
|
||||
prompt = "Enable Prompts"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "prompts_enabled == true"
|
||||
default = 100
|
||||
help = "Maximum custom prompt templates (range: ${constraint.mcp_server.prompts.max_templates.min}-${constraint.mcp_server.prompts.max_templates.max})"
|
||||
max = "${constraint.mcp_server.prompts.max_templates.max}"
|
||||
min = "${constraint.mcp_server.prompts.max_templates.min}"
|
||||
name = "prompts_max_templates"
|
||||
nickel_path = ["prompts", "max_templates"]
|
||||
prompt = "Max Prompt Templates"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "prompts_enabled == true"
|
||||
default = true
|
||||
help = "Enable prompt response caching"
|
||||
name = "prompts_cache_enabled"
|
||||
nickel_path = ["prompts", "cache", "enabled"]
|
||||
prompt = "Enable Prompt Caching"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "prompts_enabled == true && prompts_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Prompt cache TTL in seconds (range: 60-86400)"
|
||||
max = 86400
|
||||
min = 60
|
||||
name = "prompts_cache_ttl"
|
||||
nickel_path = ["prompts", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "prompts_enabled == true"
|
||||
default = false
|
||||
help = "Enable prompt versioning"
|
||||
name = "prompts_versioning_enabled"
|
||||
nickel_path = ["prompts", "versioning", "enabled"]
|
||||
prompt = "Enable Prompt Versioning"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "prompts_enabled == true && prompts_versioning_enabled == true"
|
||||
default = 10
|
||||
help = "Maximum prompt versions to keep (range: 1-100)"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "prompts_versioning_max_versions"
|
||||
nickel_path = ["prompts", "versioning", "max_versions"]
|
||||
prompt = "Max Prompt Versions"
|
||||
type = "number"
|
||||
@ -0,0 +1,78 @@
|
||||
# MCP Server Resources Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "resources_section_header"
|
||||
title = "📦 Resources Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable MCP resources capability"
|
||||
name = "resources_enabled"
|
||||
nickel_path = ["resources", "enabled"]
|
||||
prompt = "Enable Resources"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "resources_enabled == true"
|
||||
default = 104857600
|
||||
help = "Maximum resource size in bytes (range: ${constraint.mcp_server.resources.max_size.min}-${constraint.mcp_server.resources.max_size.max})"
|
||||
max = "${constraint.mcp_server.resources.max_size.max}"
|
||||
min = "${constraint.mcp_server.resources.max_size.min}"
|
||||
name = "resources_max_size"
|
||||
nickel_path = ["resources", "max_size"]
|
||||
prompt = "Max Resource Size (bytes)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "resources_enabled == true"
|
||||
default = true
|
||||
help = "Enable resource caching"
|
||||
name = "resources_cache_enabled"
|
||||
nickel_path = ["resources", "cache", "enabled"]
|
||||
prompt = "Enable Resource Caching"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "resources_enabled == true && resources_cache_enabled == true"
|
||||
default = 512
|
||||
help = "Maximum cache size in MB (range: 10-10240)"
|
||||
max = 10240
|
||||
min = 10
|
||||
name = "resources_cache_max_size_mb"
|
||||
nickel_path = ["resources", "cache", "max_size_mb"]
|
||||
prompt = "Max Cache Size (MB)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "resources_enabled == true && resources_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Resource cache TTL in seconds (range: ${constraint.mcp_server.resources.cache_ttl.min}-${constraint.mcp_server.resources.cache_ttl.max})"
|
||||
max = "${constraint.mcp_server.resources.cache_ttl.max}"
|
||||
min = "${constraint.mcp_server.resources.cache_ttl.min}"
|
||||
name = "resources_cache_ttl"
|
||||
nickel_path = ["resources", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "resources_enabled == true"
|
||||
default = true
|
||||
help = "Enable resource validation"
|
||||
name = "resources_validation_enabled"
|
||||
nickel_path = ["resources", "validation", "enabled"]
|
||||
prompt = "Enable Resource Validation"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "resources_enabled == true && resources_validation_enabled == true"
|
||||
default = 10
|
||||
help = "Maximum nesting depth for resources (range: 1-100)"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "resources_validation_max_depth"
|
||||
nickel_path = ["resources", "validation", "max_depth"]
|
||||
prompt = "Max Nesting Depth"
|
||||
type = "number"
|
||||
@ -0,0 +1,67 @@
|
||||
# MCP Server Sampling Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "sampling_section_header"
|
||||
title = "🎲 Sampling Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable sampling capability for AI model inference"
|
||||
name = "sampling_enabled"
|
||||
nickel_path = ["sampling", "enabled"]
|
||||
prompt = "Enable Sampling"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "sampling_enabled == true"
|
||||
default = 4096
|
||||
help = "Maximum tokens for sampling output (range: ${constraint.mcp_server.sampling.max_tokens.min}-${constraint.mcp_server.sampling.max_tokens.max})"
|
||||
max = "${constraint.mcp_server.sampling.max_tokens.max}"
|
||||
min = "${constraint.mcp_server.sampling.max_tokens.min}"
|
||||
name = "sampling_max_tokens"
|
||||
nickel_path = ["sampling", "max_tokens"]
|
||||
prompt = "Max Tokens"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "sampling_enabled == true"
|
||||
help = "Sampling model to use (e.g., gpt-4, claude-3)"
|
||||
name = "sampling_model"
|
||||
nickel_path = ["sampling", "model"]
|
||||
placeholder = "gpt-4"
|
||||
prompt = "Sampling Model"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "sampling_enabled == true"
|
||||
default = 0.7
|
||||
help = "Temperature for sampling (0.0-2.0, higher = more creative)"
|
||||
min = 0.0
|
||||
max = 2.0
|
||||
name = "sampling_temperature"
|
||||
nickel_path = ["sampling", "temperature"]
|
||||
prompt = "Temperature"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "sampling_enabled == true"
|
||||
default = true
|
||||
help = "Enable sampling result caching"
|
||||
name = "sampling_cache_enabled"
|
||||
nickel_path = ["sampling", "cache", "enabled"]
|
||||
prompt = "Enable Sampling Cache"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "sampling_enabled == true && sampling_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Sampling cache TTL in seconds (range: 60-3600)"
|
||||
max = 3600
|
||||
min = 60
|
||||
name = "sampling_cache_ttl"
|
||||
nickel_path = ["sampling", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,75 @@
|
||||
# MCP Server Tools Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "tools_section_header"
|
||||
title = "🔧 Tools Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable MCP tools capability"
|
||||
name = "tools_enabled"
|
||||
nickel_path = ["tools", "enabled"]
|
||||
prompt = "Enable Tools"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "tools_enabled == true"
|
||||
default = 5
|
||||
help = "Maximum concurrent tool executions (range: ${constraint.mcp_server.tools.max_concurrent.min}-${constraint.mcp_server.tools.max_concurrent.max})"
|
||||
max = "${constraint.mcp_server.tools.max_concurrent.max}"
|
||||
min = "${constraint.mcp_server.tools.max_concurrent.min}"
|
||||
name = "tools_max_concurrent"
|
||||
nickel_path = ["tools", "max_concurrent"]
|
||||
prompt = "Max Concurrent Tools"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "tools_enabled == true"
|
||||
default = 30000
|
||||
help = "Tool execution timeout in milliseconds (range: ${constraint.mcp_server.tools.timeout.min}-${constraint.mcp_server.tools.timeout.max})"
|
||||
min = "${constraint.mcp_server.tools.timeout.min}"
|
||||
max = "${constraint.mcp_server.tools.timeout.max}"
|
||||
name = "tools_timeout"
|
||||
nickel_path = ["tools", "timeout"]
|
||||
prompt = "Tool Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "tools_enabled == true"
|
||||
default = true
|
||||
help = "Enable tool input validation"
|
||||
name = "tools_validation_enabled"
|
||||
nickel_path = ["tools", "validation", "enabled"]
|
||||
prompt = "Enable Tool Validation"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "tools_enabled == true && tools_validation_enabled == true"
|
||||
default = false
|
||||
help = "Enable strict validation mode"
|
||||
name = "tools_validation_strict"
|
||||
nickel_path = ["tools", "validation", "strict_mode"]
|
||||
prompt = "Strict Validation Mode"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "tools_enabled == true"
|
||||
default = false
|
||||
help = "Enable tool execution caching"
|
||||
name = "tools_cache_enabled"
|
||||
nickel_path = ["tools", "cache", "enabled"]
|
||||
prompt = "Enable Tool Caching"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "tools_enabled == true && tools_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Tool cache TTL in seconds"
|
||||
min = 60
|
||||
name = "tools_cache_ttl"
|
||||
nickel_path = ["tools", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
37
.typedialog/platform/forms/fragments/monitoring-section.toml
Normal file
37
.typedialog/platform/forms/fragments/monitoring-section.toml
Normal file
@ -0,0 +1,37 @@
|
||||
# Monitoring Configuration Fragment
|
||||
# Optional for all services
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "monitoring_section_header"
|
||||
title = "📊 Monitoring Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable monitoring and metrics collection"
|
||||
name = "monitoring_enabled"
|
||||
nickel_path = ["monitoring", "enabled"]
|
||||
prompt = "Enable Monitoring"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "monitoring_enabled == true"
|
||||
default = true
|
||||
help = "Enable metrics collection from this service"
|
||||
name = "monitoring_metrics_enabled"
|
||||
nickel_path = ["monitoring", "metrics", "enabled"]
|
||||
prompt = "Enable Metrics Collection"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "monitoring_enabled == true && monitoring_metrics_enabled == true"
|
||||
default = 60
|
||||
help = "Metrics collection interval in seconds (range: ${constraint.common.monitoring.metrics_interval.min}-${constraint.common.monitoring.metrics_interval.max})"
|
||||
min = "${constraint.common.monitoring.metrics_interval.min}"
|
||||
max = "${constraint.common.monitoring.metrics_interval.max}"
|
||||
name = "monitoring_metrics_interval"
|
||||
nickel_path = ["monitoring", "metrics", "interval"]
|
||||
prompt = "Metrics Collection Interval (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,93 @@
|
||||
# Orchestrator Batch Workflow Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "batch_section_header"
|
||||
title = "🔄 Batch Workflow Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 5
|
||||
help = "Parallel operation limit for batch jobs (range: ${constraint.orchestrator.batch.parallel_limit.min}-${constraint.orchestrator.batch.parallel_limit.max})"
|
||||
max = "${constraint.orchestrator.batch.parallel_limit.max}"
|
||||
min = "${constraint.orchestrator.batch.parallel_limit.min}"
|
||||
name = "batch_parallel_limit"
|
||||
nickel_path = ["batch", "parallel_limit"]
|
||||
prompt = "Parallel Limit"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 1800000
|
||||
help = "Batch operation timeout in milliseconds (range: ${constraint.orchestrator.batch.operation_timeout.min}-${constraint.orchestrator.batch.operation_timeout.max})"
|
||||
min = "${constraint.orchestrator.batch.operation_timeout.min}"
|
||||
max = "${constraint.orchestrator.batch.operation_timeout.max}"
|
||||
name = "batch_operation_timeout"
|
||||
nickel_path = ["batch", "operation_timeout"]
|
||||
prompt = "Operation Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable checkpoint support for batch recovery"
|
||||
name = "batch_checkpointing_enabled"
|
||||
nickel_path = ["batch", "checkpointing", "enabled"]
|
||||
prompt = "Enable Checkpointing"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "batch_checkpointing_enabled == true"
|
||||
default = 100
|
||||
help = "Checkpoint interval (number of operations before checkpoint)"
|
||||
min = 10
|
||||
name = "batch_checkpoint_interval"
|
||||
nickel_path = ["batch", "checkpointing", "interval"]
|
||||
prompt = "Checkpoint Interval"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "batch_checkpointing_enabled == true"
|
||||
default = 10
|
||||
help = "Maximum number of checkpoints to keep"
|
||||
min = 1
|
||||
name = "batch_checkpoint_max_checkpoints"
|
||||
nickel_path = ["batch", "checkpointing", "max_checkpoints"]
|
||||
prompt = "Max Checkpoints"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable rollback strategy for failed batches"
|
||||
name = "batch_rollback_enabled"
|
||||
nickel_path = ["batch", "rollback", "enabled"]
|
||||
prompt = "Enable Rollback"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "batch_rollback_enabled == true"
|
||||
default = "checkpoint_based"
|
||||
help = "Rollback strategy (checkpoint_based, full, partial)"
|
||||
name = "batch_rollback_strategy"
|
||||
nickel_path = ["batch", "rollback", "strategy"]
|
||||
options = ["checkpoint_based", "full", "partial"]
|
||||
prompt = "Rollback Strategy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "batch_rollback_enabled == true"
|
||||
default = 5
|
||||
help = "Maximum rollback depth"
|
||||
max = 20
|
||||
min = 1
|
||||
name = "batch_rollback_max_depth"
|
||||
nickel_path = ["batch", "rollback", "max_rollback_depth"]
|
||||
prompt = "Max Rollback Depth"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable batch operation metrics"
|
||||
name = "batch_metrics"
|
||||
nickel_path = ["batch", "metrics"]
|
||||
prompt = "Batch Metrics"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,182 @@
|
||||
# Orchestrator Extensions Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "extensions_section_header"
|
||||
title = "🔌 Extensions Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# Extension Auto-Loading
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Automatically load extensions from registry at startup"
|
||||
name = "auto_load_extensions"
|
||||
nickel_path = ["orchestrator", "extensions", "auto_load"]
|
||||
prompt = "Auto-Load Extensions"
|
||||
type = "confirm"
|
||||
|
||||
# OCI Registry Configuration (conditional on auto-load)
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = "http://localhost:5000"
|
||||
help = "OCI registry URL for discovering extensions (e.g., http://harbor:5000)"
|
||||
name = "oci_registry_url"
|
||||
nickel_path = ["orchestrator", "extensions", "oci_registry_url"]
|
||||
prompt = "OCI Registry URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = "provisioning"
|
||||
help = "Namespace/project in OCI registry for extensions"
|
||||
name = "oci_namespace"
|
||||
nickel_path = ["orchestrator", "extensions", "oci_namespace"]
|
||||
prompt = "OCI Namespace"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = ""
|
||||
help = "OCI registry authentication username (leave empty for anonymous)"
|
||||
name = "oci_registry_username"
|
||||
nickel_path = ["orchestrator", "extensions", "oci_registry_username"]
|
||||
prompt = "OCI Registry Username"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = ""
|
||||
help = "OCI registry authentication password (leave empty for anonymous)"
|
||||
name = "oci_registry_password"
|
||||
nickel_path = ["orchestrator", "extensions", "oci_registry_password"]
|
||||
prompt = "OCI Registry Password"
|
||||
type = "password"
|
||||
|
||||
# Extension Discovery Configuration
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = 3600
|
||||
help = "Extension discovery interval in seconds (range: 300-86400)"
|
||||
max = 86400
|
||||
min = 300
|
||||
name = "extensions_discovery_interval"
|
||||
nickel_path = ["orchestrator", "extensions", "discovery_interval_seconds"]
|
||||
prompt = "Discovery Interval (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = 5
|
||||
help = "Maximum number of concurrent extension loads (range: ${constraint.orchestrator.extensions.max_concurrent.min}-${constraint.orchestrator.extensions.max_concurrent.max})"
|
||||
max = "${constraint.orchestrator.extensions.max_concurrent.max}"
|
||||
min = "${constraint.orchestrator.extensions.max_concurrent.min}"
|
||||
name = "extensions_max_concurrent"
|
||||
nickel_path = ["orchestrator", "extensions", "max_concurrent"]
|
||||
prompt = "Max Concurrent Extensions"
|
||||
type = "number"
|
||||
|
||||
# Extension Execution Settings
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = 30000
|
||||
help = "Timeout for extension initialization in milliseconds (range: 1000-300000)"
|
||||
max = 300000
|
||||
min = 1000
|
||||
name = "extensions_init_timeout"
|
||||
nickel_path = ["orchestrator", "extensions", "init_timeout_ms"]
|
||||
prompt = "Init Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = false
|
||||
help = "Enable sandboxed execution for untrusted extensions"
|
||||
name = "extensions_sandbox_enabled"
|
||||
nickel_path = ["orchestrator", "extensions", "sandbox", "enabled"]
|
||||
prompt = "Enable Sandbox Mode"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true && extensions_sandbox_enabled == true"
|
||||
default = true
|
||||
help = "Restrict network access for sandboxed extensions"
|
||||
name = "extensions_sandbox_restrict_network"
|
||||
nickel_path = ["orchestrator", "extensions", "sandbox", "restrict_network"]
|
||||
prompt = "Restrict Network Access"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true && extensions_sandbox_enabled == true"
|
||||
default = 512
|
||||
help = "Maximum memory for sandboxed extension in MB (range: 64-4096)"
|
||||
max = 4096
|
||||
min = 64
|
||||
name = "extensions_sandbox_max_memory_mb"
|
||||
nickel_path = ["orchestrator", "extensions", "sandbox", "max_memory_mb"]
|
||||
prompt = "Max Memory (MB)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true && extensions_sandbox_enabled == true"
|
||||
default = 1
|
||||
help = "Maximum CPU cores for sandboxed extension"
|
||||
min = 0.1
|
||||
max = 8
|
||||
name = "extensions_sandbox_max_cpu"
|
||||
nickel_path = ["orchestrator", "extensions", "sandbox", "max_cpu"]
|
||||
prompt = "Max CPU Cores"
|
||||
type = "number"
|
||||
|
||||
# Extension Versioning and Compatibility
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = true
|
||||
help = "Enable version compatibility checking"
|
||||
name = "extensions_version_check_enabled"
|
||||
nickel_path = ["orchestrator", "extensions", "version_check", "enabled"]
|
||||
prompt = "Enable Version Check"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = false
|
||||
help = "Allow prerelease/beta extension versions"
|
||||
name = "extensions_allow_prerelease"
|
||||
nickel_path = ["orchestrator", "extensions", "allow_prerelease"]
|
||||
prompt = "Allow Prerelease Versions"
|
||||
type = "confirm"
|
||||
|
||||
# Extension Health Checking
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true"
|
||||
default = true
|
||||
help = "Enable health checks for loaded extensions"
|
||||
name = "extensions_health_check_enabled"
|
||||
nickel_path = ["orchestrator", "extensions", "health_check", "enabled"]
|
||||
prompt = "Enable Health Checks"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true && extensions_health_check_enabled == true"
|
||||
default = 30000
|
||||
help = "Health check interval in milliseconds (range: 5000-300000)"
|
||||
max = 300000
|
||||
min = 5000
|
||||
name = "extensions_health_check_interval"
|
||||
nickel_path = ["orchestrator", "extensions", "health_check", "interval_ms"]
|
||||
prompt = "Health Check Interval (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "auto_load_extensions == true && extensions_health_check_enabled == true"
|
||||
default = 3
|
||||
help = "Number of failed health checks before unloading extension"
|
||||
min = 1
|
||||
max = 10
|
||||
name = "extensions_health_check_failure_threshold"
|
||||
nickel_path = ["orchestrator", "extensions", "health_check", "failure_threshold"]
|
||||
prompt = "Failure Threshold"
|
||||
type = "number"
|
||||
@ -0,0 +1,230 @@
|
||||
# Orchestrator Performance Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "performance_section_header"
|
||||
title = "⚡ Performance Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# CPU and Memory Settings
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable CPU affinity binding for threads"
|
||||
name = "cpu_affinity_enabled"
|
||||
nickel_path = ["orchestrator", "performance", "cpu_affinity", "enabled"]
|
||||
prompt = "Enable CPU Affinity"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "cpu_affinity_enabled == true"
|
||||
default = "round_robin"
|
||||
help = "CPU core assignment strategy"
|
||||
name = "cpu_affinity_strategy"
|
||||
nickel_path = ["orchestrator", "performance", "cpu_affinity", "strategy"]
|
||||
options = ["round_robin", "sequential", "interleave"]
|
||||
prompt = "CPU Affinity Strategy"
|
||||
type = "select"
|
||||
|
||||
# Memory Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable JVM-style memory limit enforcement"
|
||||
name = "memory_limits_enabled"
|
||||
nickel_path = ["orchestrator", "performance", "memory_limits", "enabled"]
|
||||
prompt = "Enable Memory Limits"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "memory_limits_enabled == true"
|
||||
default = 4096
|
||||
help = "Maximum heap memory in MB"
|
||||
min = 256
|
||||
max = 131072
|
||||
name = "memory_max_heap_mb"
|
||||
nickel_path = ["orchestrator", "performance", "memory_limits", "max_heap_mb"]
|
||||
prompt = "Max Heap Memory (MB)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "memory_limits_enabled == true"
|
||||
default = 1024
|
||||
help = "Initial heap memory allocation in MB (range: 128-131072)"
|
||||
max = 131072
|
||||
min = 128
|
||||
name = "memory_initial_heap_mb"
|
||||
nickel_path = ["orchestrator", "performance", "memory_limits", "initial_heap_mb"]
|
||||
prompt = "Initial Heap Memory (MB)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "memory_limits_enabled == true"
|
||||
default = 80
|
||||
help = "Garbage collection trigger threshold (%)"
|
||||
min = 50
|
||||
max = 95
|
||||
name = "memory_gc_threshold_percent"
|
||||
nickel_path = ["orchestrator", "performance", "memory_limits", "gc_threshold_percent"]
|
||||
prompt = "GC Threshold (%)"
|
||||
type = "number"
|
||||
|
||||
# Profiling Settings
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable performance profiling (CPU, memory, I/O)"
|
||||
name = "profiling_enabled"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "enabled"]
|
||||
prompt = "Enable Profiling"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "profiling_enabled == true"
|
||||
default = "sampling"
|
||||
help = "Profiling mode (sampling = low overhead, instrumentation = detailed)"
|
||||
name = "profiling_mode"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "mode"]
|
||||
options = ["sampling", "instrumentation"]
|
||||
prompt = "Profiling Mode"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "profiling_enabled == true"
|
||||
default = 100
|
||||
help = "Profiling sampling rate in Hz (samples per second)"
|
||||
min = 10
|
||||
max = 1000
|
||||
name = "profiling_sample_rate"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "sample_rate_hz"]
|
||||
prompt = "Sampling Rate (Hz)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "profiling_enabled == true"
|
||||
default = "json"
|
||||
help = "Profiling output format"
|
||||
name = "profiling_format"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "format"]
|
||||
options = ["json", "protobuf", "pprof"]
|
||||
prompt = "Profiling Format"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "profiling_enabled == true"
|
||||
default = "/var/lib/provisioning/orchestrator/profiles"
|
||||
help = "Directory for profiling data output"
|
||||
name = "profiling_output_path"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "output_path"]
|
||||
prompt = "Profiling Output Path"
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "profiling_enabled == true"
|
||||
default = true
|
||||
help = "Enable memory profiling (allocations, heap usage)"
|
||||
name = "profiling_memory_enabled"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "memory_profiling", "enabled"]
|
||||
prompt = "Enable Memory Profiling"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "profiling_enabled == true && profiling_memory_enabled == true"
|
||||
default = 512
|
||||
help = "Minimum allocation size to profile in KB (range: 1-1048576)"
|
||||
max = 1048576
|
||||
min = 1
|
||||
name = "profiling_memory_min_size_kb"
|
||||
nickel_path = ["orchestrator", "performance", "profiling", "memory_profiling", "min_alloc_kb"]
|
||||
prompt = "Min Allocation Size (KB)"
|
||||
type = "number"
|
||||
|
||||
# Caching and Optimization
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable inline caching for hot paths"
|
||||
name = "inline_cache_enabled"
|
||||
nickel_path = ["orchestrator", "performance", "inline_cache", "enabled"]
|
||||
prompt = "Enable Inline Cache"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "inline_cache_enabled == true"
|
||||
default = 10000
|
||||
help = "Maximum inline cache entries (range: 1000-1000000)"
|
||||
max = 1000000
|
||||
min = 1000
|
||||
name = "inline_cache_max_entries"
|
||||
nickel_path = ["orchestrator", "performance", "inline_cache", "max_entries"]
|
||||
prompt = "Max Cache Entries"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "inline_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Inline cache TTL in seconds (range: 60-86400)"
|
||||
max = 86400
|
||||
min = 60
|
||||
name = "inline_cache_ttl"
|
||||
nickel_path = ["orchestrator", "performance", "inline_cache", "ttl_seconds"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
|
||||
# Thread Pool Configuration
|
||||
[[elements]]
|
||||
default = 4
|
||||
help = "Number of worker threads for task execution"
|
||||
min = 1
|
||||
max = 256
|
||||
name = "thread_pool_size"
|
||||
nickel_path = ["orchestrator", "performance", "thread_pool", "size"]
|
||||
prompt = "Thread Pool Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 128
|
||||
help = "Work queue size per worker thread"
|
||||
min = 8
|
||||
max = 10000
|
||||
name = "thread_pool_queue_size"
|
||||
nickel_path = ["orchestrator", "performance", "thread_pool", "queue_size"]
|
||||
prompt = "Work Queue Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = "work_stealing"
|
||||
help = "Thread pool scheduling strategy"
|
||||
name = "thread_pool_strategy"
|
||||
nickel_path = ["orchestrator", "performance", "thread_pool", "strategy"]
|
||||
options = ["work_stealing", "fifo", "priority"]
|
||||
prompt = "Thread Pool Strategy"
|
||||
type = "select"
|
||||
|
||||
# I/O Optimization
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable async I/O operations"
|
||||
name = "async_io_enabled"
|
||||
nickel_path = ["orchestrator", "performance", "async_io", "enabled"]
|
||||
prompt = "Enable Async I/O"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "async_io_enabled == true"
|
||||
default = 4
|
||||
help = "Number of I/O worker threads"
|
||||
min = 1
|
||||
max = 32
|
||||
name = "async_io_worker_threads"
|
||||
nickel_path = ["orchestrator", "performance", "async_io", "worker_threads"]
|
||||
prompt = "I/O Worker Threads"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "async_io_enabled == true"
|
||||
default = 65536
|
||||
help = "Maximum I/O operations in flight (range: 256-1048576)"
|
||||
max = 1048576
|
||||
min = 256
|
||||
name = "async_io_max_in_flight"
|
||||
nickel_path = ["orchestrator", "performance", "async_io", "max_in_flight"]
|
||||
prompt = "Max I/O In Flight"
|
||||
type = "number"
|
||||
@ -0,0 +1,72 @@
|
||||
# Orchestrator Queue Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "queue_section_header"
|
||||
title = "📦 Queue Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 5
|
||||
help = "Maximum number of concurrent tasks running simultaneously (range: ${constraint.orchestrator.queue.concurrent_tasks.min}-${constraint.orchestrator.queue.concurrent_tasks.max})"
|
||||
max = "${constraint.orchestrator.queue.concurrent_tasks.max}"
|
||||
min = "${constraint.orchestrator.queue.concurrent_tasks.min}"
|
||||
name = "queue_max_concurrent_tasks"
|
||||
nickel_path = ["queue", "max_concurrent_tasks"]
|
||||
prompt = "Max Concurrent Tasks"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3
|
||||
help = "Number of retry attempts for failed tasks (range: ${constraint.orchestrator.queue.retry_attempts.min}-${constraint.orchestrator.queue.retry_attempts.max})"
|
||||
min = "${constraint.orchestrator.queue.retry_attempts.min}"
|
||||
max = "${constraint.orchestrator.queue.retry_attempts.max}"
|
||||
name = "queue_retry_attempts"
|
||||
nickel_path = ["queue", "retry_attempts"]
|
||||
prompt = "Retry Attempts"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 5000
|
||||
help = "Delay in milliseconds between retry attempts (range: ${constraint.orchestrator.queue.retry_delay.min}-${constraint.orchestrator.queue.retry_delay.max})"
|
||||
min = "${constraint.orchestrator.queue.retry_delay.min}"
|
||||
max = "${constraint.orchestrator.queue.retry_delay.max}"
|
||||
name = "queue_retry_delay"
|
||||
nickel_path = ["queue", "retry_delay"]
|
||||
prompt = "Retry Delay (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3600000
|
||||
help = "Task timeout in milliseconds (range: ${constraint.orchestrator.queue.task_timeout.min}-${constraint.orchestrator.queue.task_timeout.max})"
|
||||
min = "${constraint.orchestrator.queue.task_timeout.min}"
|
||||
max = "${constraint.orchestrator.queue.task_timeout.max}"
|
||||
name = "queue_task_timeout"
|
||||
nickel_path = ["queue", "task_timeout"]
|
||||
prompt = "Task Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable persistent queue storage"
|
||||
name = "queue_persist"
|
||||
nickel_path = ["queue", "persist"]
|
||||
prompt = "Persistent Queue"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable priority queue support for task ordering"
|
||||
name = "queue_priority_queue"
|
||||
nickel_path = ["queue", "priority_queue"]
|
||||
prompt = "Priority Queue"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable queue metrics collection"
|
||||
name = "queue_metrics"
|
||||
nickel_path = ["queue", "metrics"]
|
||||
prompt = "Queue Metrics"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,173 @@
|
||||
# Orchestrator Storage Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "storage_section_header"
|
||||
title = "💾 Storage Configuration"
|
||||
type = "section_header"
|
||||
|
||||
# Storage Backend Selection
|
||||
[[elements]]
|
||||
default = "filesystem"
|
||||
help = "Storage backend for workflow state and artifacts"
|
||||
name = "storage_backend"
|
||||
nickel_path = ["orchestrator", "storage", "backend"]
|
||||
options = ["filesystem", "surrealdb_embedded", "surrealdb_server"]
|
||||
prompt = "Storage Backend"
|
||||
type = "select"
|
||||
|
||||
# Filesystem Storage (conditional)
|
||||
[[elements]]
|
||||
condition = "storage_backend == 'filesystem'"
|
||||
default = "/var/lib/provisioning/orchestrator/data"
|
||||
help = "Path for local filesystem storage (absolute path required)"
|
||||
name = "storage_path"
|
||||
nickel_path = ["orchestrator", "storage", "path"]
|
||||
prompt = "Storage Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# SurrealDB Embedded (conditional)
|
||||
[[elements]]
|
||||
condition = "storage_backend == 'surrealdb_embedded'"
|
||||
default = "/var/lib/provisioning/orchestrator/surrealdb"
|
||||
help = "Path for embedded SurrealDB data directory"
|
||||
name = "surrealdb_embedded_path"
|
||||
nickel_path = ["orchestrator", "storage", "path"]
|
||||
prompt = "SurrealDB Data Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# SurrealDB Server (conditional)
|
||||
[[elements]]
|
||||
condition = "storage_backend == 'surrealdb_server'"
|
||||
default = "http://localhost:8000"
|
||||
help = "URL for SurrealDB server (e.g., http://surrealdb:8000)"
|
||||
name = "surrealdb_url"
|
||||
nickel_path = ["orchestrator", "storage", "surrealdb_url"]
|
||||
prompt = "SurrealDB URL"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_backend == 'surrealdb_server'"
|
||||
default = "provisioning"
|
||||
help = "SurrealDB namespace"
|
||||
name = "surrealdb_namespace"
|
||||
nickel_path = ["orchestrator", "storage", "surrealdb_namespace"]
|
||||
prompt = "Namespace"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_backend == 'surrealdb_server'"
|
||||
default = "orchestrator"
|
||||
help = "SurrealDB database name"
|
||||
name = "surrealdb_database"
|
||||
nickel_path = ["orchestrator", "storage", "surrealdb_database"]
|
||||
prompt = "Database"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
# Storage Cache Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable storage caching for improved performance"
|
||||
name = "storage_cache_enabled"
|
||||
nickel_path = ["orchestrator", "storage", "cache", "enabled"]
|
||||
prompt = "Enable Storage Cache"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_cache_enabled == true"
|
||||
default = "lru"
|
||||
help = "Cache eviction policy"
|
||||
name = "storage_cache_eviction_policy"
|
||||
nickel_path = ["orchestrator", "storage", "cache", "eviction_policy"]
|
||||
options = ["lru", "lfu", "fifo"]
|
||||
prompt = "Cache Eviction Policy"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_cache_enabled == true"
|
||||
default = 3600
|
||||
help = "Cache TTL in seconds (range: 60-86400)"
|
||||
max = 86400
|
||||
min = 60
|
||||
name = "storage_cache_ttl"
|
||||
nickel_path = ["orchestrator", "storage", "cache", "ttl"]
|
||||
prompt = "Cache TTL (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_cache_enabled == true"
|
||||
default = 1000
|
||||
help = "Maximum cache entries (range: 10-1000000)"
|
||||
max = 1000000
|
||||
min = 10
|
||||
name = "storage_cache_max_entries"
|
||||
nickel_path = ["orchestrator", "storage", "cache", "max_entries"]
|
||||
prompt = "Max Cache Entries"
|
||||
type = "number"
|
||||
|
||||
# Storage Compression Configuration
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable compression for stored data"
|
||||
name = "storage_compression_enabled"
|
||||
nickel_path = ["orchestrator", "storage", "compression", "enabled"]
|
||||
prompt = "Enable Compression"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_compression_enabled == true"
|
||||
default = "snappy"
|
||||
help = "Compression algorithm"
|
||||
name = "storage_compression_algorithm"
|
||||
nickel_path = ["orchestrator", "storage", "compression", "algorithm"]
|
||||
options = ["snappy", "zstd", "gzip"]
|
||||
prompt = "Compression Algorithm"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_compression_enabled == true && storage_compression_algorithm == 'zstd'"
|
||||
default = 3
|
||||
help = "Compression level (1-19, higher = better compression but slower)"
|
||||
min = 1
|
||||
max = 19
|
||||
name = "storage_compression_level"
|
||||
nickel_path = ["orchestrator", "storage", "compression", "level"]
|
||||
prompt = "Compression Level"
|
||||
type = "number"
|
||||
|
||||
# Storage Garbage Collection
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable automatic garbage collection of orphaned artifacts"
|
||||
name = "storage_gc_enabled"
|
||||
nickel_path = ["orchestrator", "storage", "gc", "enabled"]
|
||||
prompt = "Enable Garbage Collection"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_gc_enabled == true"
|
||||
default = 604800
|
||||
help = "Retention period for artifacts in seconds (default: 7 days, range: 3600-31536000)"
|
||||
max = 31536000
|
||||
min = 3600
|
||||
name = "storage_gc_retention"
|
||||
nickel_path = ["orchestrator", "storage", "gc", "retention_seconds"]
|
||||
prompt = "GC Retention (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "storage_gc_enabled == true"
|
||||
default = 3600
|
||||
help = "Garbage collection interval in seconds (default: 1 hour, range: 300-86400)"
|
||||
max = 86400
|
||||
min = 300
|
||||
name = "storage_gc_interval"
|
||||
nickel_path = ["orchestrator", "storage", "gc", "interval_seconds"]
|
||||
prompt = "GC Interval (seconds)"
|
||||
type = "number"
|
||||
@ -0,0 +1,48 @@
|
||||
# Provisioning Daemon Actions Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "daemon_actions_header"
|
||||
title = "✓ Actions Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Auto-cleanup completed tasks"
|
||||
name = "daemon_actions_auto_cleanup"
|
||||
nickel_path = ["provisioning_daemon", "actions", "auto_cleanup"]
|
||||
prompt = "Auto-cleanup"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Auto-update provisioning system"
|
||||
name = "daemon_actions_auto_update"
|
||||
nickel_path = ["provisioning_daemon", "actions", "auto_update"]
|
||||
prompt = "Auto-update"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Sync workspace configuration"
|
||||
name = "daemon_actions_workspace_sync"
|
||||
nickel_path = ["provisioning_daemon", "actions", "workspace_sync"]
|
||||
prompt = "Workspace Sync"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Cleanup ephemeral resources"
|
||||
name = "daemon_actions_ephemeral_cleanup"
|
||||
nickel_path = ["provisioning_daemon", "actions", "ephemeral_cleanup"]
|
||||
prompt = "Ephemeral Cleanup"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Perform health checks"
|
||||
name = "daemon_actions_health_checks"
|
||||
nickel_path = ["provisioning_daemon", "actions", "health_checks"]
|
||||
prompt = "Health Checks"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,36 @@
|
||||
# Provisioning Daemon Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "daemon_config_header"
|
||||
title = "⚙️ Daemon Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable provisioning daemon"
|
||||
name = "daemon_enabled"
|
||||
nickel_path = ["provisioning_daemon", "daemon", "enabled"]
|
||||
prompt = "Enable Daemon"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = 30
|
||||
help = "Polling interval in seconds"
|
||||
max = 3600
|
||||
min = 5
|
||||
name = "daemon_poll_interval"
|
||||
nickel_path = ["provisioning_daemon", "daemon", "poll_interval"]
|
||||
prompt = "Poll Interval (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 4
|
||||
help = "Maximum worker threads"
|
||||
max = 32
|
||||
min = 1
|
||||
name = "daemon_max_workers"
|
||||
nickel_path = ["provisioning_daemon", "daemon", "max_workers"]
|
||||
prompt = "Max Workers"
|
||||
type = "number"
|
||||
@ -0,0 +1,38 @@
|
||||
# Provisioning Daemon Health Check Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "daemon_health_header"
|
||||
title = "❤️ Health Check Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 60000
|
||||
help = "Health check interval in milliseconds"
|
||||
max = 300000
|
||||
min = 5000
|
||||
name = "daemon_health_check_interval"
|
||||
nickel_path = ["provisioning_daemon", "health", "check_interval"]
|
||||
prompt = "Check Interval (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 30000
|
||||
help = "Health check timeout in milliseconds"
|
||||
max = 60000
|
||||
min = 1000
|
||||
name = "daemon_health_check_timeout"
|
||||
nickel_path = ["provisioning_daemon", "health", "timeout"]
|
||||
prompt = "Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 3
|
||||
help = "Failure threshold before marking unhealthy"
|
||||
max = 10
|
||||
min = 1
|
||||
name = "daemon_health_failure_threshold"
|
||||
nickel_path = ["provisioning_daemon", "health", "failure_threshold"]
|
||||
prompt = "Failure Threshold"
|
||||
type = "number"
|
||||
@ -0,0 +1,43 @@
|
||||
# Provisioning Daemon Logging Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "daemon_logging_header"
|
||||
title = "📝 Logging Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "info"
|
||||
help = "Logging level"
|
||||
name = "daemon_logging_level"
|
||||
nickel_path = ["provisioning_daemon", "logging", "level"]
|
||||
options = ["trace", "debug", "info", "warn", "error"]
|
||||
prompt = "Log Level"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = "/var/log/provisioning/daemon.log"
|
||||
help = "Log file path"
|
||||
name = "daemon_logging_file"
|
||||
nickel_path = ["provisioning_daemon", "logging", "file"]
|
||||
prompt = "Log File"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "json"
|
||||
help = "Log format"
|
||||
name = "daemon_logging_format"
|
||||
nickel_path = ["provisioning_daemon", "logging", "format"]
|
||||
options = ["json", "text"]
|
||||
prompt = "Log Format"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Send logs to syslog"
|
||||
name = "daemon_logging_syslog"
|
||||
nickel_path = ["provisioning_daemon", "logging", "syslog"]
|
||||
prompt = "Enable Syslog"
|
||||
type = "confirm"
|
||||
@ -0,0 +1,38 @@
|
||||
# Provisioning Daemon Worker Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "daemon_workers_header"
|
||||
title = "👷 Worker Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 4
|
||||
help = "Worker pool size"
|
||||
max = 32
|
||||
min = 1
|
||||
name = "daemon_worker_pool_size"
|
||||
nickel_path = ["provisioning_daemon", "workers", "pool_size"]
|
||||
prompt = "Pool Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 1000
|
||||
help = "Task queue capacity"
|
||||
max = 100000
|
||||
min = 10
|
||||
name = "daemon_worker_task_queue_size"
|
||||
nickel_path = ["provisioning_daemon", "workers", "task_queue_size"]
|
||||
prompt = "Queue Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 300000
|
||||
help = "Worker timeout in milliseconds"
|
||||
max = 3600000
|
||||
min = 10000
|
||||
name = "daemon_worker_timeout"
|
||||
nickel_path = ["provisioning_daemon", "workers", "timeout"]
|
||||
prompt = "Timeout (ms)"
|
||||
type = "number"
|
||||
@ -0,0 +1,98 @@
|
||||
# TypeDialog + Nickel Configuration Scripts
|
||||
|
||||
Phase 8 Nushell automation scripts for interactive configuration workflow, config generation, validation, and deployment.
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# 1. Interactive Configuration (TypeDialog)
|
||||
nu scripts/configure.nu orchestrator solo
|
||||
|
||||
# 2. Generate TOML configs
|
||||
nu scripts/generate-configs.nu orchestrator solo
|
||||
|
||||
# 3. Validate configuration
|
||||
nu scripts/validate-config.nu provisioning/.typedialog/provisioning/platform/values/orchestrator.solo.ncl
|
||||
|
||||
# 4. Render Docker Compose
|
||||
nu scripts/render-docker-compose.nu solo
|
||||
|
||||
# 5. Full deployment workflow
|
||||
nu scripts/install-services.nu orchestrator solo --docker
|
||||
```
|
||||
|
||||
## Scripts Overview
|
||||
|
||||
### Shared Helpers
|
||||
- **ansi.nu** - ANSI color and emoji output formatting
|
||||
- **paths.nu** - Path validation and directory structure helpers
|
||||
- **external.nu** - Safe external command execution with error handling
|
||||
|
||||
### Core Configuration Scripts
|
||||
- **configure.nu** - Interactive TypeDialog configuration wizard
|
||||
- **generate-configs.nu** - Export Nickel configs to TOML
|
||||
- **validate-config.nu** - Validate Nickel configuration
|
||||
|
||||
### Rendering Scripts
|
||||
- **render-docker-compose.nu** - Render Docker Compose from Nickel templates
|
||||
- **render-kubernetes.nu** - Render Kubernetes manifests from Nickel templates
|
||||
|
||||
### Deployment & Monitoring Scripts
|
||||
- **install-services.nu** - Full deployment orchestration
|
||||
- **detect-services.nu** - Auto-detect running services
|
||||
|
||||
## Supported Services
|
||||
- orchestrator (port 9090)
|
||||
- control-center (port 8080)
|
||||
- mcp-server (port 8888)
|
||||
- installer (port 8000)
|
||||
|
||||
## Supported Deployment Modes
|
||||
- solo (2 CPU, 4GB RAM)
|
||||
- multiuser (4 CPU, 8GB RAM)
|
||||
- cicd (8 CPU, 16GB RAM)
|
||||
- enterprise (16+ CPU, 32+ GB RAM)
|
||||
|
||||
## Nushell Compliance
|
||||
All scripts follow Nushell 0.109.0+ guidelines with proper type signatures, error handling, and no try-catch blocks.
|
||||
|
||||
## Examples
|
||||
|
||||
### Single Service Configuration
|
||||
```bash
|
||||
nu scripts/configure.nu orchestrator solo --backend web
|
||||
nu scripts/validate-config.nu provisioning/.typedialog/provisioning/platform/values/orchestrator.solo.ncl
|
||||
nu scripts/generate-configs.nu orchestrator solo
|
||||
cargo run -p orchestrator -- --config provisioning/platform/config/orchestrator.solo.toml
|
||||
```
|
||||
|
||||
### Docker Compose Deployment
|
||||
```bash
|
||||
nu scripts/generate-configs.nu orchestrator multiuser
|
||||
nu scripts/render-docker-compose.nu multiuser
|
||||
docker-compose -f provisioning/platform/infrastructure/docker/docker-compose.multiuser.yml up -d
|
||||
```
|
||||
|
||||
### Kubernetes Deployment
|
||||
```bash
|
||||
nu scripts/generate-configs.nu orchestrator enterprise
|
||||
nu scripts/render-kubernetes.nu enterprise --namespace production
|
||||
nu scripts/install-services.nu all enterprise --kubernetes --namespace production
|
||||
```
|
||||
|
||||
## Phase 8 Status
|
||||
|
||||
✅ Phase 8.A: Shared helper modules
|
||||
✅ Phase 8.B: Core configuration scripts
|
||||
✅ Phase 8.C: Rendering scripts
|
||||
✅ Phase 8.D: Deployment orchestration
|
||||
✅ Phase 8.E: Testing and documentation
|
||||
|
||||
## Requirements
|
||||
|
||||
- Nushell 0.109.1+
|
||||
- Nickel 1.15.1+
|
||||
- TypeDialog CLI
|
||||
- yq v4.50.1+
|
||||
- Docker (optional)
|
||||
- kubectl (optional)
|
||||
56
.typedialog/platform/forms/fragments/rag/embeddings.toml
Normal file
56
.typedialog/platform/forms/fragments/rag/embeddings.toml
Normal file
@ -0,0 +1,56 @@
|
||||
# RAG Embeddings Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "rag_embeddings_header"
|
||||
title = "🧠 Embeddings Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "local"
|
||||
help = "Embedding model provider (openai, local, anthropic)"
|
||||
name = "rag_embeddings_provider"
|
||||
nickel_path = ["rag", "embeddings", "provider"]
|
||||
options = ["openai", "local", "anthropic"]
|
||||
prompt = "Provider"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = "all-MiniLM-L6-v2"
|
||||
help = "Embedding model name"
|
||||
name = "rag_embeddings_model"
|
||||
nickel_path = ["rag", "embeddings", "model"]
|
||||
prompt = "Model"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 384
|
||||
help = "Embedding dimension (384, 768, 1536, 3072)"
|
||||
name = "rag_embeddings_dimension"
|
||||
nickel_path = ["rag", "embeddings", "dimension"]
|
||||
options = [384, 768, 1536, 3072]
|
||||
prompt = "Dimension"
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = 32
|
||||
help = "Batch size for embedding operations"
|
||||
max = 1000
|
||||
min = 1
|
||||
name = "rag_embeddings_batch_size"
|
||||
nickel_path = ["rag", "embeddings", "batch_size"]
|
||||
prompt = "Batch Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
condition = "rag_embeddings_provider != 'local'"
|
||||
default = ""
|
||||
help = "API key for embedding service"
|
||||
name = "rag_embeddings_api_key"
|
||||
nickel_path = ["rag", "embeddings", "api_key"]
|
||||
prompt = "API Key"
|
||||
required = false
|
||||
type = "password"
|
||||
52
.typedialog/platform/forms/fragments/rag/ingestion.toml
Normal file
52
.typedialog/platform/forms/fragments/rag/ingestion.toml
Normal file
@ -0,0 +1,52 @@
|
||||
# RAG Document Ingestion Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "rag_ingestion_header"
|
||||
title = "📄 Document Ingestion Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Auto-ingest documents on startup"
|
||||
name = "rag_ingestion_auto_ingest"
|
||||
nickel_path = ["rag", "ingestion", "auto_ingest"]
|
||||
prompt = "Auto-ingest"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Watch for file changes and auto-ingest"
|
||||
name = "rag_ingestion_watch_files"
|
||||
nickel_path = ["rag", "ingestion", "watch_files"]
|
||||
prompt = "Watch Files"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = 512
|
||||
help = "Document chunk size in characters"
|
||||
max = 4096
|
||||
min = 128
|
||||
name = "rag_ingestion_chunk_size"
|
||||
nickel_path = ["rag", "ingestion", "chunk_size"]
|
||||
prompt = "Chunk Size"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 50
|
||||
help = "Overlap between chunks in characters"
|
||||
max = 1000
|
||||
min = 0
|
||||
name = "rag_ingestion_overlap"
|
||||
nickel_path = ["rag", "ingestion", "overlap"]
|
||||
prompt = "Chunk Overlap"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = "md, txt, toml"
|
||||
help = "Supported document types (comma-separated)"
|
||||
name = "rag_ingestion_doc_types"
|
||||
nickel_path = ["rag", "ingestion", "doc_types"]
|
||||
prompt = "Document Types"
|
||||
type = "text"
|
||||
67
.typedialog/platform/forms/fragments/rag/llm.toml
Normal file
67
.typedialog/platform/forms/fragments/rag/llm.toml
Normal file
@ -0,0 +1,67 @@
|
||||
# RAG Language Model Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "rag_llm_header"
|
||||
title = "🤖 Language Model Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "anthropic"
|
||||
help = "LLM provider (anthropic, openai, ollama)"
|
||||
name = "rag_llm_provider"
|
||||
nickel_path = ["rag", "llm", "provider"]
|
||||
options = ["anthropic", "openai", "ollama"]
|
||||
prompt = "Provider"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
default = "claude-3-5-sonnet-20241022"
|
||||
help = "Model name"
|
||||
name = "rag_llm_model"
|
||||
nickel_path = ["rag", "llm", "model"]
|
||||
prompt = "Model"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "rag_llm_provider != 'ollama'"
|
||||
default = ""
|
||||
help = "API key for LLM service"
|
||||
name = "rag_llm_api_key"
|
||||
nickel_path = ["rag", "llm", "api_key"]
|
||||
prompt = "API Key"
|
||||
required = false
|
||||
type = "password"
|
||||
|
||||
[[elements]]
|
||||
condition = "rag_llm_provider == 'ollama'"
|
||||
default = "http://localhost:11434"
|
||||
help = "Ollama API URL"
|
||||
name = "rag_llm_api_url"
|
||||
nickel_path = ["rag", "llm", "api_url"]
|
||||
prompt = "API URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 0.7
|
||||
help = "Model temperature (0.0-2.0)"
|
||||
max = 2.0
|
||||
min = 0.0
|
||||
name = "rag_llm_temperature"
|
||||
nickel_path = ["rag", "llm", "temperature"]
|
||||
prompt = "Temperature"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 2048
|
||||
help = "Maximum tokens to generate"
|
||||
max = 32768
|
||||
min = 1
|
||||
name = "rag_llm_max_tokens"
|
||||
nickel_path = ["rag", "llm", "max_tokens"]
|
||||
prompt = "Max Tokens"
|
||||
type = "number"
|
||||
44
.typedialog/platform/forms/fragments/rag/retrieval.toml
Normal file
44
.typedialog/platform/forms/fragments/rag/retrieval.toml
Normal file
@ -0,0 +1,44 @@
|
||||
# RAG Retrieval Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "rag_retrieval_header"
|
||||
title = "🔍 Retrieval Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = 5
|
||||
help = "Number of top results to return"
|
||||
max = 100
|
||||
min = 1
|
||||
name = "rag_retrieval_top_k"
|
||||
nickel_path = ["rag", "retrieval", "top_k"]
|
||||
prompt = "Top K Results"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 0.75
|
||||
help = "Minimum similarity threshold (0.0-1.0)"
|
||||
max = 1.0
|
||||
min = 0.0
|
||||
name = "rag_retrieval_similarity_threshold"
|
||||
nickel_path = ["rag", "retrieval", "similarity_threshold"]
|
||||
prompt = "Similarity Threshold"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable re-ranking of results"
|
||||
name = "rag_retrieval_reranking"
|
||||
nickel_path = ["rag", "retrieval", "reranking"]
|
||||
prompt = "Enable Re-ranking"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable hybrid search (keyword + semantic)"
|
||||
name = "rag_retrieval_hybrid"
|
||||
nickel_path = ["rag", "retrieval", "hybrid"]
|
||||
prompt = "Enable Hybrid Search"
|
||||
type = "confirm"
|
||||
47
.typedialog/platform/forms/fragments/rag/vector-db.toml
Normal file
47
.typedialog/platform/forms/fragments/rag/vector-db.toml
Normal file
@ -0,0 +1,47 @@
|
||||
# RAG Vector Database Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "rag_vector_db_header"
|
||||
title = "🗄️ Vector Database Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "memory"
|
||||
help = "Vector database type (memory, surrealdb, qdrant, milvus)"
|
||||
name = "rag_vector_db_type"
|
||||
nickel_path = ["rag", "vector_db", "db_type"]
|
||||
options = ["memory", "surrealdb", "qdrant", "milvus"]
|
||||
prompt = "Database Type"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "rag_vector_db_type != 'memory'"
|
||||
default = "http://localhost:8000"
|
||||
help = "Vector database URL"
|
||||
name = "rag_vector_db_url"
|
||||
nickel_path = ["rag", "vector_db", "url"]
|
||||
prompt = "Database URL"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "provisioning"
|
||||
help = "Vector database namespace"
|
||||
name = "rag_vector_db_namespace"
|
||||
nickel_path = ["rag", "vector_db", "namespace"]
|
||||
prompt = "Namespace"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "rag_vector_db_type == 'surrealdb'"
|
||||
default = "rag"
|
||||
help = "Database name"
|
||||
name = "rag_vector_db_database"
|
||||
nickel_path = ["rag", "vector_db", "database"]
|
||||
prompt = "Database Name"
|
||||
required = false
|
||||
type = "text"
|
||||
85
.typedialog/platform/forms/fragments/server-section.toml
Normal file
85
.typedialog/platform/forms/fragments/server-section.toml
Normal file
@ -0,0 +1,85 @@
|
||||
# HTTP Server Configuration Fragment
|
||||
# Used by all services: orchestrator, control-center, mcp-server
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "server_section_header"
|
||||
title = "🌐 HTTP Server Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "127.0.0.1"
|
||||
help = "Address to bind the HTTP server to (127.0.0.1=local, 0.0.0.0=all interfaces)"
|
||||
name = "server_host"
|
||||
nickel_path = ["server", "host"]
|
||||
prompt = "Server Host/Address"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 9090
|
||||
help = "HTTP server port number (range: ${constraint.common.server.port.min}-${constraint.common.server.port.max})"
|
||||
max = "${constraint.common.server.port.max}"
|
||||
min = "${constraint.common.server.port.min}"
|
||||
name = "server_port"
|
||||
nickel_path = ["server", "port"]
|
||||
prompt = "Server Port"
|
||||
required = true
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 4
|
||||
help = "Number of worker threads for HTTP server (range: ${constraint.common.server.workers.min}-${constraint.common.server.workers.max})"
|
||||
min = "${constraint.common.server.workers.min}"
|
||||
max = "${constraint.common.server.workers.max}"
|
||||
name = "server_workers"
|
||||
nickel_path = ["server", "workers"]
|
||||
prompt = "Worker Threads"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 75
|
||||
help = "TCP keep-alive timeout in seconds (0 = disabled, range: ${constraint.common.server.keep_alive.min}-${constraint.common.server.keep_alive.max})"
|
||||
min = "${constraint.common.server.keep_alive.min}"
|
||||
max = "${constraint.common.server.keep_alive.max}"
|
||||
name = "server_keep_alive"
|
||||
nickel_path = ["server", "keep_alive"]
|
||||
prompt = "Keep-Alive Timeout (seconds)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 100
|
||||
help = "Maximum number of concurrent TCP connections (range: ${constraint.common.server.max_connections.min}-${constraint.common.server.max_connections.max})"
|
||||
min = "${constraint.common.server.max_connections.min}"
|
||||
max = "${constraint.common.server.max_connections.max}"
|
||||
name = "server_max_connections"
|
||||
nickel_path = ["server", "max_connections"]
|
||||
prompt = "Max Connections"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = 30000
|
||||
help = "Request timeout in milliseconds"
|
||||
min = 1000
|
||||
name = "server_request_timeout"
|
||||
nickel_path = ["server", "request_timeout"]
|
||||
prompt = "Request Timeout (ms)"
|
||||
type = "number"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable graceful shutdown to allow in-flight requests to complete"
|
||||
name = "server_graceful_shutdown"
|
||||
nickel_path = ["server", "graceful_shutdown"]
|
||||
prompt = "Graceful Shutdown"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = 30
|
||||
help = "Graceful shutdown timeout in seconds"
|
||||
min = 1
|
||||
name = "server_shutdown_timeout"
|
||||
nickel_path = ["server", "shutdown_timeout"]
|
||||
prompt = "Shutdown Timeout (seconds)"
|
||||
type = "number"
|
||||
27
.typedialog/platform/forms/fragments/vault-service/ha.toml
Normal file
27
.typedialog/platform/forms/fragments/vault-service/ha.toml
Normal file
@ -0,0 +1,27 @@
|
||||
# Vault Service High Availability Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "vault_ha_header"
|
||||
title = "🔄 High Availability Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable high availability mode with clustering"
|
||||
name = "vault_ha_enabled"
|
||||
nickel_path = ["vault_service", "deployment", "ha_enabled"]
|
||||
prompt = "Enable HA Mode"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "vault_ha_enabled == true"
|
||||
default = "raft"
|
||||
help = "HA cluster backend (Raft integrated or external Consul)"
|
||||
name = "vault_ha_mode"
|
||||
nickel_path = ["vault_service", "deployment", "ha_mode"]
|
||||
options = ["raft", "consul"]
|
||||
prompt = "HA Mode"
|
||||
required = true
|
||||
type = "select"
|
||||
@ -0,0 +1,26 @@
|
||||
# Vault Service Mount Point Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "vault_mount_header"
|
||||
title = "📍 Mount Point Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "transit"
|
||||
help = "Vault mount point path for secret engine"
|
||||
name = "vault_mount_point"
|
||||
nickel_path = ["vault_service", "mount", "path"]
|
||||
prompt = "Mount Point"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = "provisioning-master"
|
||||
help = "Name of the encryption key to use"
|
||||
name = "vault_mount_key_name"
|
||||
nickel_path = ["vault_service", "mount", "key"]
|
||||
prompt = "Key Name"
|
||||
required = true
|
||||
type = "text"
|
||||
@ -0,0 +1,28 @@
|
||||
# Vault Service Server Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "vault_server_header"
|
||||
title = "🖥️ Server Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "127.0.0.1"
|
||||
help = "HTTP server bind address (127.0.0.1 for local, 0.0.0.0 for all interfaces)"
|
||||
name = "vault_server_host"
|
||||
nickel_path = ["vault_service", "server", "host"]
|
||||
prompt = "Server Host"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = 8200
|
||||
help = "HTTP server port (range: 1024-65535)"
|
||||
max = 65535
|
||||
min = 1024
|
||||
name = "vault_server_port"
|
||||
nickel_path = ["vault_service", "server", "port"]
|
||||
prompt = "Server Port"
|
||||
required = true
|
||||
type = "number"
|
||||
@ -0,0 +1,37 @@
|
||||
# Vault Service Storage Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "vault_storage_header"
|
||||
title = "💾 Storage Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = "filesystem"
|
||||
help = "Storage backend for secrets (filesystem, surrealdb, etcd, memory)"
|
||||
name = "vault_storage_backend"
|
||||
nickel_path = ["vault_service", "storage", "backend"]
|
||||
options = ["filesystem", "memory", "surrealdb", "etcd", "postgresql"]
|
||||
prompt = "Storage Backend"
|
||||
required = true
|
||||
type = "select"
|
||||
|
||||
[[elements]]
|
||||
condition = "vault_storage_backend == 'filesystem'"
|
||||
default = "/var/lib/vault/data"
|
||||
help = "Path for local filesystem storage (absolute path required)"
|
||||
name = "vault_storage_path"
|
||||
nickel_path = ["vault_service", "storage", "path"]
|
||||
prompt = "Storage Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = ""
|
||||
help = "Encryption key for at-rest encryption (base64 encoded, optional)"
|
||||
name = "vault_storage_encryption_key"
|
||||
nickel_path = ["vault_service", "storage", "encryption_key"]
|
||||
prompt = "Encryption Key (optional)"
|
||||
required = false
|
||||
type = "text"
|
||||
46
.typedialog/platform/forms/fragments/vault-service/tls.toml
Normal file
46
.typedialog/platform/forms/fragments/vault-service/tls.toml
Normal file
@ -0,0 +1,46 @@
|
||||
# Vault Service TLS Configuration Fragment
|
||||
|
||||
[[elements]]
|
||||
border_top = true
|
||||
border_bottom = false
|
||||
name = "vault_tls_header"
|
||||
title = "🔒 TLS Configuration"
|
||||
type = "section_header"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Enable TLS certificate verification for secure connections"
|
||||
name = "vault_tls_verify"
|
||||
nickel_path = ["vault_service", "tls", "verify"]
|
||||
prompt = "Verify TLS Certificates"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
condition = "vault_tls_verify == true"
|
||||
default = ""
|
||||
help = "Path to CA certificate file for TLS verification"
|
||||
name = "vault_tls_ca_cert_path"
|
||||
nickel_path = ["vault_service", "tls", "ca_cert_path"]
|
||||
prompt = "CA Certificate Path"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "vault_tls_verify == true"
|
||||
default = ""
|
||||
help = "Path to client certificate file (optional)"
|
||||
name = "vault_tls_client_cert_path"
|
||||
nickel_path = ["vault_service", "tls", "client_cert_path"]
|
||||
prompt = "Client Certificate Path (optional)"
|
||||
required = false
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
condition = "vault_tls_verify == true"
|
||||
default = ""
|
||||
help = "Path to client key file (optional)"
|
||||
name = "vault_tls_client_key_path"
|
||||
nickel_path = ["vault_service", "tls", "client_key_path"]
|
||||
prompt = "Client Key Path (optional)"
|
||||
required = false
|
||||
type = "text"
|
||||
36
.typedialog/platform/forms/fragments/workspace-section.toml
Normal file
36
.typedialog/platform/forms/fragments/workspace-section.toml
Normal file
@ -0,0 +1,36 @@
|
||||
# Workspace Configuration Fragment
|
||||
# Used by all services: orchestrator, control-center, mcp-server, installer
|
||||
|
||||
[[elements]]
|
||||
help = "Name of the workspace this service will serve"
|
||||
name = "workspace_name"
|
||||
nickel_path = ["workspace", "name"]
|
||||
placeholder = "default"
|
||||
prompt = "Workspace Name"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
help = "Absolute path to the workspace directory"
|
||||
name = "workspace_path"
|
||||
nickel_path = ["workspace", "path"]
|
||||
placeholder = "/var/lib/provisioning/{service}"
|
||||
prompt = "Workspace Path"
|
||||
required = true
|
||||
type = "text"
|
||||
|
||||
[[elements]]
|
||||
default = true
|
||||
help = "Enable or disable this service for the workspace"
|
||||
name = "workspace_enabled"
|
||||
nickel_path = ["workspace", "enabled"]
|
||||
prompt = "Enable Service"
|
||||
type = "confirm"
|
||||
|
||||
[[elements]]
|
||||
default = false
|
||||
help = "Allow this service instance to serve multiple workspaces"
|
||||
name = "multi_workspace_mode"
|
||||
nickel_path = ["workspace", "multi_workspace"]
|
||||
prompt = "Multi-Workspace Mode"
|
||||
type = "confirm"
|
||||
110
.typedialog/platform/forms/installer-form.toml
Normal file
110
.typedialog/platform/forms/installer-form.toml
Normal file
@ -0,0 +1,110 @@
|
||||
name = "installer_configuration"
|
||||
description = "Interactive configuration for Provisioning Platform Installer (deployment and lifecycle management)"
|
||||
display_mode = "complete"
|
||||
fallback_locale = "en-US"
|
||||
|
||||
# ============================================================================
|
||||
# INSTALLER SERVICE FORM - COMPOSED FROM FRAGMENTS
|
||||
# ============================================================================
|
||||
# This form uses fragment composition pattern for modular configuration
|
||||
# All fragments are located in ./fragments/ subdirectory
|
||||
# ============================================================================
|
||||
|
||||
# DEPLOYMENT MODE SELECTION
|
||||
# Determines deployment environment and service resources
|
||||
[[items]]
|
||||
name = "deployment_mode_group"
|
||||
type = "group"
|
||||
title = "Deployment Configuration"
|
||||
description = "Select deployment mode and database backend for installed services"
|
||||
includes = ["fragments/deployment/mode-selection.toml", "fragments/deployment/database-backend-selection.toml"]
|
||||
|
||||
# INSTALLATION TARGET CONFIGURATION
|
||||
# Target environment: local, remote, kubernetes, docker
|
||||
[[items]]
|
||||
name = "target_group"
|
||||
type = "group"
|
||||
title = "Installation Target"
|
||||
description = "Configure target environment and connectivity"
|
||||
includes = ["fragments/installer/target-section.toml"]
|
||||
|
||||
# PREFLIGHT CHECKS CONFIGURATION
|
||||
# Disk, memory, CPU, network, dependencies, ports validation
|
||||
[[items]]
|
||||
name = "preflight_group"
|
||||
type = "group"
|
||||
title = "Preflight Checks"
|
||||
description = "Configure pre-installation validation checks"
|
||||
includes = ["fragments/installer/preflight-section.toml"]
|
||||
|
||||
# INSTALLATION STRATEGY CONFIGURATION
|
||||
# Installation mode, parallelization, timeout, rollback, logging, hooks
|
||||
[[items]]
|
||||
name = "installation_group"
|
||||
type = "group"
|
||||
title = "Installation Strategy"
|
||||
description = "Configure installation behavior and strategy"
|
||||
includes = ["fragments/installer/installation-section.toml"]
|
||||
|
||||
# SERVICES SELECTION CONFIGURATION
|
||||
# Which services to install, ports, auto-start, health checks
|
||||
[[items]]
|
||||
name = "services_group"
|
||||
type = "group"
|
||||
title = "Services Selection"
|
||||
description = "Select which services to install and configure their deployment"
|
||||
includes = ["fragments/installer/services-section.toml"]
|
||||
|
||||
# DATABASE CONFIGURATION
|
||||
# Database initialization, migrations, backup, verification, optimization
|
||||
[[items]]
|
||||
name = "database_group"
|
||||
type = "group"
|
||||
title = "Database Configuration"
|
||||
description = "Configure database initialization and management"
|
||||
includes = ["fragments/installer/database-section.toml"]
|
||||
|
||||
# STORAGE CONFIGURATION
|
||||
# Storage location, backend, compression, encryption, replication, cleanup
|
||||
[[items]]
|
||||
name = "storage_group"
|
||||
type = "group"
|
||||
title = "Storage Configuration"
|
||||
description = "Configure storage for provisioning data and artifacts"
|
||||
includes = ["fragments/installer/storage-section.toml"]
|
||||
|
||||
# NETWORKING CONFIGURATION
|
||||
# Bind address, DNS, TLS, firewall, load balancer, ingress, proxy
|
||||
[[items]]
|
||||
name = "networking_group"
|
||||
type = "group"
|
||||
title = "Networking Configuration"
|
||||
description = "Configure networking, DNS, TLS, and firewall"
|
||||
includes = ["fragments/installer/networking-section.toml"]
|
||||
|
||||
# HIGH AVAILABILITY CONFIGURATION
|
||||
# Cluster setup, replication, health checks, failover, backup, load distribution
|
||||
[[items]]
|
||||
name = "ha_group"
|
||||
type = "group"
|
||||
title = "High Availability Configuration"
|
||||
description = "Configure high availability and clustering"
|
||||
includes = ["fragments/installer/ha-section.toml"]
|
||||
|
||||
# POST-INSTALLATION CONFIGURATION
|
||||
# Admin user, workspace config, extensions, API setup, verification, cleanup
|
||||
[[items]]
|
||||
name = "post_install_group"
|
||||
type = "group"
|
||||
title = "Post-Installation Configuration"
|
||||
description = "Configure post-installation tasks and verification"
|
||||
includes = ["fragments/installer/post-install-section.toml"]
|
||||
|
||||
# UPGRADES CONFIGURATION
|
||||
# Auto-upgrade, channels, strategies, pre-checks, backup, rollback, health monitoring
|
||||
[[items]]
|
||||
name = "upgrades_group"
|
||||
type = "group"
|
||||
title = "Upgrades Configuration"
|
||||
description = "Configure automatic updates and upgrade strategies"
|
||||
includes = ["fragments/installer/upgrades-section.toml"]
|
||||
118
.typedialog/platform/forms/mcp-server-form.toml
Normal file
118
.typedialog/platform/forms/mcp-server-form.toml
Normal file
@ -0,0 +1,118 @@
|
||||
name = "mcp_server_configuration"
|
||||
description = "Interactive configuration for MCP Server service (Model Context Protocol interface)"
|
||||
display_mode = "complete"
|
||||
fallback_locale = "en-US"
|
||||
|
||||
# ============================================================================
|
||||
# MCP SERVER SERVICE FORM - COMPOSED FROM FRAGMENTS
|
||||
# ============================================================================
|
||||
# This form uses fragment composition pattern for modular configuration
|
||||
# All fragments are located in ./fragments/ subdirectory
|
||||
# ============================================================================
|
||||
|
||||
# DEPLOYMENT MODE SELECTION
|
||||
# Determines service resources and feature set (solo/multiuser/cicd/enterprise)
|
||||
[[items]]
|
||||
name = "deployment_mode_group"
|
||||
type = "group"
|
||||
title = "Deployment Configuration"
|
||||
description = "Select deployment mode and database backend"
|
||||
includes = ["fragments/deployment/mode-selection.toml", "fragments/deployment/database-backend-selection.toml"]
|
||||
|
||||
# WORKSPACE CONFIGURATION
|
||||
# Workspace name, path, and context
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
title = "Workspace Settings"
|
||||
description = "Configure workspace context for this MCP Server instance"
|
||||
includes = ["fragments/workspace-section.toml"]
|
||||
|
||||
# SERVER CONFIGURATION
|
||||
# HTTP server settings (host, port, workers, connections)
|
||||
[[items]]
|
||||
name = "server_group"
|
||||
type = "group"
|
||||
title = "Server Settings"
|
||||
description = "Configure HTTP server for MCP Server"
|
||||
includes = ["fragments/server-section.toml"]
|
||||
|
||||
# DATABASE BACKEND CONFIGURATION
|
||||
# Conditional sections based on selected backend
|
||||
[[items]]
|
||||
name = "database_rocksdb_group"
|
||||
type = "group"
|
||||
title = "RocksDB Configuration"
|
||||
description = "Configure RocksDB backend for MCP state"
|
||||
condition = "database_backend_selection == 'rocksdb'"
|
||||
includes = ["fragments/database-rocksdb-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "database_surrealdb_group"
|
||||
type = "group"
|
||||
title = "SurrealDB Configuration"
|
||||
description = "Configure SurrealDB backend for MCP state"
|
||||
condition = "database_backend_selection == 'surrealdb_embedded' || database_backend_selection == 'surrealdb_server'"
|
||||
includes = ["fragments/database-surrealdb-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "database_postgres_group"
|
||||
type = "group"
|
||||
title = "PostgreSQL Configuration"
|
||||
description = "Configure PostgreSQL backend for MCP state"
|
||||
condition = "database_backend_selection == 'postgresql'"
|
||||
includes = ["fragments/database-postgres-section.toml"]
|
||||
|
||||
# MCP-SPECIFIC: TOOLS CONFIGURATION
|
||||
# Tool management, validation, caching, concurrent execution
|
||||
[[items]]
|
||||
name = "tools_group"
|
||||
type = "group"
|
||||
title = "Tools Configuration"
|
||||
description = "Configure MCP tools, execution, and caching"
|
||||
includes = ["fragments/mcp-server/tools-section.toml"]
|
||||
|
||||
# MCP-SPECIFIC: PROMPTS CONFIGURATION
|
||||
# Custom prompt templates, versioning, caching
|
||||
[[items]]
|
||||
name = "prompts_group"
|
||||
type = "group"
|
||||
title = "Prompts Configuration"
|
||||
description = "Configure custom prompt templates and management"
|
||||
includes = ["fragments/mcp-server/prompts-section.toml"]
|
||||
|
||||
# MCP-SPECIFIC: RESOURCES CONFIGURATION
|
||||
# Resource management, max size, caching, validation
|
||||
[[items]]
|
||||
name = "resources_group"
|
||||
type = "group"
|
||||
title = "Resources Configuration"
|
||||
description = "Configure MCP resources and resource management"
|
||||
includes = ["fragments/mcp-server/resources-section.toml"]
|
||||
|
||||
# MCP-SPECIFIC: SAMPLING CONFIGURATION
|
||||
# AI model sampling, temperature, output tokens, caching
|
||||
[[items]]
|
||||
name = "sampling_group"
|
||||
type = "group"
|
||||
title = "Sampling Configuration"
|
||||
description = "Configure AI model sampling and inference"
|
||||
includes = ["fragments/mcp-server/sampling-section.toml"]
|
||||
|
||||
# MONITORING CONFIGURATION
|
||||
# Metrics collection, health checks
|
||||
[[items]]
|
||||
name = "monitoring_group"
|
||||
type = "group"
|
||||
title = "Monitoring Configuration"
|
||||
description = "Configure metrics and health checks"
|
||||
includes = ["fragments/monitoring-section.toml"]
|
||||
|
||||
# LOGGING CONFIGURATION
|
||||
# Log levels, formats, rotation
|
||||
[[items]]
|
||||
name = "logging_group"
|
||||
type = "group"
|
||||
title = "Logging Configuration"
|
||||
description = "Configure logging behavior and output"
|
||||
includes = ["fragments/logging-section.toml"]
|
||||
127
.typedialog/platform/forms/orchestrator-form.toml
Normal file
127
.typedialog/platform/forms/orchestrator-form.toml
Normal file
@ -0,0 +1,127 @@
|
||||
name = "orchestrator_configuration"
|
||||
description = "Interactive configuration for Orchestrator service (workflow engine and task scheduling)"
|
||||
display_mode = "complete"
|
||||
fallback_locale = "en-US"
|
||||
|
||||
# ============================================================================
|
||||
# ORCHESTRATOR SERVICE FORM - COMPOSED FROM FRAGMENTS
|
||||
# ============================================================================
|
||||
# This form uses fragment composition pattern for modular configuration
|
||||
# All fragments are located in ./fragments/ subdirectory
|
||||
# ============================================================================
|
||||
|
||||
# DEPLOYMENT MODE SELECTION
|
||||
# Determines service resources and feature set (solo/multiuser/cicd/enterprise)
|
||||
[[items]]
|
||||
name = "deployment_mode_group"
|
||||
type = "group"
|
||||
title = "Deployment Configuration"
|
||||
description = "Select deployment mode and database backend"
|
||||
includes = ["fragments/deployment/mode-selection.toml", "fragments/deployment/database-backend-selection.toml"]
|
||||
|
||||
# WORKSPACE CONFIGURATION
|
||||
# Workspace name, path, and multi-workspace mode
|
||||
[[items]]
|
||||
name = "workspace_group"
|
||||
type = "group"
|
||||
title = "Workspace Settings"
|
||||
description = "Configure workspace context for this Orchestrator instance"
|
||||
includes = ["fragments/workspace-section.toml"]
|
||||
|
||||
# SERVER CONFIGURATION
|
||||
# HTTP server settings (host, port, workers, connections)
|
||||
[[items]]
|
||||
name = "server_group"
|
||||
type = "group"
|
||||
title = "Server Settings"
|
||||
description = "Configure HTTP server for Orchestrator"
|
||||
includes = ["fragments/server-section.toml"]
|
||||
|
||||
# DATABASE BACKEND CONFIGURATION
|
||||
# Conditional sections based on selected backend
|
||||
[[items]]
|
||||
name = "database_rocksdb_group"
|
||||
type = "group"
|
||||
title = "RocksDB Configuration"
|
||||
description = "Configure RocksDB backend"
|
||||
condition = "database_backend_selection == 'rocksdb'"
|
||||
includes = ["fragments/database-rocksdb-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "database_surrealdb_group"
|
||||
type = "group"
|
||||
title = "SurrealDB Configuration"
|
||||
description = "Configure SurrealDB backend"
|
||||
condition = "database_backend_selection == 'surrealdb_embedded' || database_backend_selection == 'surrealdb_server'"
|
||||
includes = ["fragments/database-surrealdb-section.toml"]
|
||||
|
||||
[[items]]
|
||||
name = "database_postgres_group"
|
||||
type = "group"
|
||||
title = "PostgreSQL Configuration"
|
||||
description = "Configure PostgreSQL backend"
|
||||
condition = "database_backend_selection == 'postgresql'"
|
||||
includes = ["fragments/database-postgres-section.toml"]
|
||||
|
||||
# ORCHESTRATOR-SPECIFIC: STORAGE CONFIGURATION
|
||||
# Storage backend, caching, compression, garbage collection
|
||||
[[items]]
|
||||
name = "storage_group"
|
||||
type = "group"
|
||||
title = "Storage Configuration"
|
||||
description = "Configure storage backend for workflow state and artifacts"
|
||||
includes = ["fragments/orchestrator/storage-section.toml"]
|
||||
|
||||
# ORCHESTRATOR-SPECIFIC: QUEUE CONFIGURATION
|
||||
# Task queue, concurrency, retries, timeouts
|
||||
[[items]]
|
||||
name = "queue_group"
|
||||
type = "group"
|
||||
title = "Task Queue Configuration"
|
||||
description = "Configure task queue behavior and limits"
|
||||
includes = ["fragments/orchestrator/queue-section.toml"]
|
||||
|
||||
# ORCHESTRATOR-SPECIFIC: BATCH WORKFLOW CONFIGURATION
|
||||
# Batch operations, parallel limits, checkpointing, rollback
|
||||
[[items]]
|
||||
name = "batch_group"
|
||||
type = "group"
|
||||
title = "Batch Workflow Configuration"
|
||||
description = "Configure batch workflow execution and recovery"
|
||||
includes = ["fragments/orchestrator/batch-section.toml"]
|
||||
|
||||
# ORCHESTRATOR-SPECIFIC: EXTENSIONS CONFIGURATION
|
||||
# Extension auto-loading, OCI registry, discovery, sandboxing
|
||||
[[items]]
|
||||
name = "extensions_group"
|
||||
type = "group"
|
||||
title = "Extensions Configuration"
|
||||
description = "Configure extension management and auto-loading"
|
||||
includes = ["fragments/orchestrator/extensions-section.toml"]
|
||||
|
||||
# ORCHESTRATOR-SPECIFIC: PERFORMANCE CONFIGURATION
|
||||
# CPU affinity, memory limits, profiling, caching, thread pools
|
||||
[[items]]
|
||||
name = "performance_group"
|
||||
type = "group"
|
||||
title = "Performance Configuration"
|
||||
description = "Configure advanced performance settings"
|
||||
includes = ["fragments/orchestrator/performance-section.toml"]
|
||||
|
||||
# MONITORING CONFIGURATION
|
||||
# Metrics collection, health checks
|
||||
[[items]]
|
||||
name = "monitoring_group"
|
||||
type = "group"
|
||||
title = "Monitoring Configuration"
|
||||
description = "Configure metrics and health checks"
|
||||
includes = ["fragments/monitoring-section.toml"]
|
||||
|
||||
# LOGGING CONFIGURATION
|
||||
# Log levels, formats, rotation
|
||||
[[items]]
|
||||
name = "logging_group"
|
||||
type = "group"
|
||||
title = "Logging Configuration"
|
||||
description = "Configure logging behavior and output"
|
||||
includes = ["fragments/logging-section.toml"]
|
||||
13
.typedialog/platform/forms/provisioning-daemon-form.toml
Normal file
13
.typedialog/platform/forms/provisioning-daemon-form.toml
Normal file
@ -0,0 +1,13 @@
|
||||
# Provisioning Daemon Configuration Form
|
||||
# Sections for provisioning daemon background service
|
||||
|
||||
title = "Provisioning Daemon Configuration"
|
||||
description = "Configure background provisioning daemon service"
|
||||
|
||||
sections = [
|
||||
{ name = "daemon", label = "Daemon Control", description = "Daemon operation and polling configuration" },
|
||||
{ name = "logging", label = "Logging", description = "Log output and verbosity settings" },
|
||||
{ name = "actions", label = "Actions", description = "Automatic actions and cleanup policies" },
|
||||
{ name = "workers", label = "Workers", description = "Worker thread and concurrency settings" },
|
||||
{ name = "health", label = "Health", description = "Health checks and monitoring" }
|
||||
]
|
||||
23
.typedialog/platform/forms/rag-form.toml
Normal file
23
.typedialog/platform/forms/rag-form.toml
Normal file
@ -0,0 +1,23 @@
|
||||
[form]
|
||||
name = "RAG System Configuration"
|
||||
description = "Retrieval-Augmented Generation system"
|
||||
|
||||
[[sections]]
|
||||
name = "Embeddings"
|
||||
includes = ["fragments/rag/embeddings.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Vector Database"
|
||||
includes = ["fragments/rag/vector-db.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Language Model"
|
||||
includes = ["fragments/rag/llm.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Retrieval"
|
||||
includes = ["fragments/rag/retrieval.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Ingestion"
|
||||
includes = ["fragments/rag/ingestion.toml"]
|
||||
29
.typedialog/platform/forms/vault-service-form.toml
Normal file
29
.typedialog/platform/forms/vault-service-form.toml
Normal file
@ -0,0 +1,29 @@
|
||||
[form]
|
||||
name = "Vault Service Configuration"
|
||||
description = "Secrets management and encryption service configuration"
|
||||
version = "1.0"
|
||||
|
||||
[[sections]]
|
||||
name = "Server"
|
||||
description = "HTTP server configuration"
|
||||
includes = ["fragments/vault-service/server.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Storage"
|
||||
description = "Storage backend configuration"
|
||||
includes = ["fragments/vault-service/storage.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "TLS/SSL"
|
||||
description = "TLS and security settings"
|
||||
includes = ["fragments/vault-service/tls.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "Mount Point"
|
||||
description = "Vault mount point and key configuration"
|
||||
includes = ["fragments/vault-service/mount.toml"]
|
||||
|
||||
[[sections]]
|
||||
name = "High Availability"
|
||||
description = "HA and clustering configuration"
|
||||
includes = ["fragments/vault-service/ha.toml"]
|
||||
255
.typedialog/platform/scripts/README.md
Normal file
255
.typedialog/platform/scripts/README.md
Normal file
@ -0,0 +1,255 @@
|
||||
# Scripts
|
||||
|
||||
Nushell orchestration scripts for configuration workflow automation (NuShell 0.109+).
|
||||
|
||||
## Purpose
|
||||
|
||||
Scripts provide:
|
||||
- **Interactive configuration wizard** - TypeDialog with nickel-roundtrip
|
||||
- **Configuration generation** - Nickel → TOML export
|
||||
- **Validation** - Nickel typecheck and constraint validation
|
||||
- **Deployment** - Docker Compose, Kubernetes, service installation
|
||||
|
||||
## Script Organization
|
||||
|
||||
```
|
||||
scripts/
|
||||
├── README.md # This file
|
||||
├── configure.nu # Interactive TypeDialog wizard
|
||||
├── generate-configs.nu # Nickel → TOML export
|
||||
├── validate-config.nu # Nickel typecheck
|
||||
├── render-docker-compose.nu # Docker Compose generation
|
||||
├── render-kubernetes.nu # Kubernetes manifests generation
|
||||
├── install-services.nu # Deploy platform services
|
||||
└── detect-services.nu # Auto-detect running services
|
||||
```
|
||||
|
||||
## Scripts (Planned Implementation)
|
||||
|
||||
### configure.nu
|
||||
Interactive configuration wizard using TypeDialog nickel-roundtrip:
|
||||
|
||||
```bash
|
||||
nu provisioning/.typedialog/platform/scripts/configure.nu orchestrator solo --backend web
|
||||
```
|
||||
|
||||
Workflow:
|
||||
1. Loads existing config (if exists) as defaults
|
||||
2. Launches TypeDialog form (web/tui/cli)
|
||||
3. Shows form with validated constraints
|
||||
4. User edits configuration
|
||||
5. Generates updated Nickel config to `provisioning/schemas/platform/values/orchestrator.solo.ncl`
|
||||
|
||||
Usage:
|
||||
```bash
|
||||
nu scripts/configure.nu [service] [mode] --backend [web|tui|cli]
|
||||
service: orchestrator | control-center | mcp-server | vault-service | extension-registry | rag | ai-service | provisioning-daemon
|
||||
mode: solo | multiuser | cicd | enterprise
|
||||
backend: web (default) | tui | cli
|
||||
```
|
||||
|
||||
### generate-configs.nu
|
||||
Export Nickel configuration to TOML:
|
||||
|
||||
```bash
|
||||
nu provisioning/.typedialog/platform/scripts/generate-configs.nu orchestrator solo
|
||||
```
|
||||
|
||||
Workflow:
|
||||
1. Validates Nickel config (typecheck)
|
||||
2. Exports to TOML format
|
||||
3. Saves to `provisioning/config/runtime/generated/{service}.{mode}.toml`
|
||||
|
||||
Usage:
|
||||
```bash
|
||||
nu scripts/generate-configs.nu [service] [mode]
|
||||
service: orchestrator | control-center | mcp-server | vault-service | extension-registry | rag | ai-service | provisioning-daemon
|
||||
mode: solo | multiuser | cicd | enterprise
|
||||
```
|
||||
|
||||
### validate-config.nu
|
||||
Typecheck Nickel configuration:
|
||||
|
||||
```bash
|
||||
nu provisioning/.typedialog/platform/scripts/validate-config.nu provisioning/schemas/platform/values/orchestrator.solo.ncl
|
||||
```
|
||||
|
||||
Workflow:
|
||||
1. Runs nickel typecheck
|
||||
2. Reports errors (schema violations, constraint errors)
|
||||
3. Exits with status
|
||||
|
||||
Usage:
|
||||
```bash
|
||||
nu scripts/validate-config.nu [config_path]
|
||||
config_path: Path to Nickel config file
|
||||
```
|
||||
|
||||
### render-docker-compose.nu
|
||||
Generate Docker Compose files from Nickel templates:
|
||||
|
||||
```bash
|
||||
nu provisioning/.typedialog/platform/scripts/render-docker-compose.nu solo
|
||||
```
|
||||
|
||||
Workflow:
|
||||
1. Evaluates Nickel template
|
||||
2. Exports to JSON
|
||||
3. Converts to YAML (via yq)
|
||||
4. Saves to `provisioning/platform/infrastructure/docker/docker-compose.{mode}.yml`
|
||||
|
||||
Usage:
|
||||
```bash
|
||||
nu scripts/render-docker-compose.nu [mode]
|
||||
mode: solo | multiuser | cicd | enterprise
|
||||
```
|
||||
|
||||
### render-kubernetes.nu
|
||||
Generate Kubernetes manifests:
|
||||
|
||||
```bash
|
||||
nu scripts/render-kubernetes.nu solo
|
||||
```
|
||||
|
||||
Workflow:
|
||||
1. Evaluates Nickel templates
|
||||
2. Exports to JSON
|
||||
3. Converts to YAML
|
||||
4. Saves to `provisioning/platform/infrastructure/kubernetes/`
|
||||
|
||||
### install-services.nu
|
||||
Deploy platform services:
|
||||
|
||||
```bash
|
||||
nu scripts/install-services.nu solo --backend docker
|
||||
```
|
||||
|
||||
Workflow:
|
||||
1. Generates all configs for mode
|
||||
2. Renders deployment manifests
|
||||
3. Deploys services (Docker Compose or Kubernetes)
|
||||
4. Verifies service startup
|
||||
|
||||
### detect-services.nu
|
||||
Auto-detect running services:
|
||||
|
||||
```bash
|
||||
nu scripts/detect-services.nu
|
||||
```
|
||||
|
||||
Outputs:
|
||||
- Running service list
|
||||
- Detected mode
|
||||
- Port usage
|
||||
- Container/pod status
|
||||
|
||||
## Common Workflow
|
||||
|
||||
```bash
|
||||
# 1. Configure service
|
||||
nu scripts/configure.nu orchestrator solo
|
||||
|
||||
# 2. Validate configuration
|
||||
nu scripts/validate-config.nu provisioning/schemas/platform/values/orchestrator.solo.ncl
|
||||
|
||||
# 3. Generate TOML
|
||||
nu scripts/generate-configs.nu orchestrator solo
|
||||
|
||||
# 4. Review generated config
|
||||
cat provisioning/config/runtime/generated/orchestrator.solo.toml
|
||||
|
||||
# 5. Render Docker Compose
|
||||
nu scripts/render-docker-compose.nu solo
|
||||
|
||||
# 6. Deploy services
|
||||
nu scripts/install-services.nu solo --backend docker
|
||||
|
||||
# 7. Verify running services
|
||||
nu scripts/detect-services.nu
|
||||
```
|
||||
|
||||
## Guidelines
|
||||
|
||||
All scripts follow @.claude/guidelines/nushell.md (NuShell 0.109+):
|
||||
|
||||
- **Explicit type signatures** - Function parameters with type annotations
|
||||
- **Colon notation** - Use `:` before input type, `->` before output type
|
||||
- **Error handling** - Use `do { } | complete` pattern (not try-catch)
|
||||
- **Pipeline operations** - Chain operations, avoid nested calls
|
||||
- **No mutable variables** - Use reduce/recursion instead
|
||||
- **External commands** - Use `^` prefix (`^nickel`, `^docker`, etc.)
|
||||
|
||||
Example:
|
||||
```nushell
|
||||
export def main [
|
||||
service: string, # Type annotation
|
||||
mode: string
|
||||
]: nothing -> nothing { # Input/output types
|
||||
let result = do {
|
||||
^nickel typecheck $config_path
|
||||
} | complete
|
||||
|
||||
if $result.exit_code == 0 {
|
||||
print "✅ Validation passed"
|
||||
} else {
|
||||
print $"❌ Validation failed: ($result.stderr)"
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Error Handling Pattern
|
||||
|
||||
All scripts use `do { } | complete` for error handling:
|
||||
|
||||
```nushell
|
||||
let result = do {
|
||||
^some-command --flag value
|
||||
} | complete
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
error make {
|
||||
msg: $"Command failed: ($result.stderr)"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Never use try-catch** (not supported in 0.109+).
|
||||
|
||||
## Script Dependencies
|
||||
|
||||
All scripts assume:
|
||||
- **NuShell 0.109+** - Modern shell
|
||||
- **Nickel** (0.10+) - Configuration language
|
||||
- **TypeDialog** - Interactive forms
|
||||
- **Docker** or **kubectl** - Deployment backends
|
||||
- **yq** - YAML/JSON conversion
|
||||
- **jq** - JSON processing
|
||||
|
||||
## Testing Scripts
|
||||
|
||||
```bash
|
||||
# Validate Nushell syntax
|
||||
nu --version # Verify 0.109+
|
||||
|
||||
# Test script execution
|
||||
nu scripts/validate-config.nu values/orchestrator.solo.ncl
|
||||
|
||||
# Check script compliance
|
||||
grep -r "try\|panic\|todo" scripts/ # Should be empty
|
||||
```
|
||||
|
||||
## Adding a New Script
|
||||
|
||||
1. **Create script file** (`scripts/{name}.nu`)
|
||||
2. **Add @.claude/guidelines/nushell.md** compliance
|
||||
3. **Define main function** with type signatures
|
||||
4. **Use do { } | complete** for error handling
|
||||
5. **Test execution**: `nu scripts/{name}.nu`
|
||||
6. **Verify**: No try-catch, no mutable vars, no panic
|
||||
|
||||
---
|
||||
|
||||
**Version**: 1.0.0
|
||||
**Last Updated**: 2025-01-05
|
||||
**Guideline**: @.claude/guidelines/nushell.md (NuShell 0.109+)
|
||||
89
.typedialog/platform/scripts/ansi.nu
Normal file
89
.typedialog/platform/scripts/ansi.nu
Normal file
@ -0,0 +1,89 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# ANSI Color and Emoji Output Helpers
|
||||
# Provides consistent formatting for user-facing messages in Phase 8 scripts
|
||||
# Usage: use ansi.nu; success "Operation completed"
|
||||
|
||||
export def success [message: string]: nothing -> string {
|
||||
$"✅ ($message)"
|
||||
}
|
||||
|
||||
export def error [message: string]: nothing -> string {
|
||||
$"❌ ($message)"
|
||||
}
|
||||
|
||||
export def warning [message: string]: nothing -> string {
|
||||
$"⚠️ ($message)"
|
||||
}
|
||||
|
||||
export def info [message: string]: nothing -> string {
|
||||
$"ℹ️ ($message)"
|
||||
}
|
||||
|
||||
export def progress [message: string]: nothing -> string {
|
||||
$"🚀 ($message)"
|
||||
}
|
||||
|
||||
export def working [message: string]: nothing -> string {
|
||||
$"🔧 ($message)"
|
||||
}
|
||||
|
||||
export def validate [message: string]: nothing -> string {
|
||||
$"🔍 ($message)"
|
||||
}
|
||||
|
||||
export def docker [message: string]: nothing -> string {
|
||||
$"🐳 ($message)"
|
||||
}
|
||||
|
||||
export def k8s [message: string]: nothing -> string {
|
||||
$"☸️ ($message)"
|
||||
}
|
||||
|
||||
export def template [message: string]: nothing -> string {
|
||||
$"📋 ($message)"
|
||||
}
|
||||
|
||||
export def config [message: string]: nothing -> string {
|
||||
$"⚙️ ($message)"
|
||||
}
|
||||
|
||||
export def print-success [message: string]: nothing -> nothing {
|
||||
print (success $message)
|
||||
}
|
||||
|
||||
export def print-error [message: string]: nothing -> nothing {
|
||||
print (error $message)
|
||||
}
|
||||
|
||||
export def print-warning [message: string]: nothing -> nothing {
|
||||
print (warning $message)
|
||||
}
|
||||
|
||||
export def print-info [message: string]: nothing -> nothing {
|
||||
print (info $message)
|
||||
}
|
||||
|
||||
export def print-progress [message: string]: nothing -> nothing {
|
||||
print (progress $message)
|
||||
}
|
||||
|
||||
export def print-working [message: string]: nothing -> nothing {
|
||||
print (working $message)
|
||||
}
|
||||
|
||||
export def print-validate [message: string]: nothing -> nothing {
|
||||
print (validate $message)
|
||||
}
|
||||
|
||||
export def section [title: string]: nothing -> nothing {
|
||||
print ""
|
||||
print $"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
print $" ($title)"
|
||||
print $"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
print ""
|
||||
}
|
||||
|
||||
export def next-step [step: string]: nothing -> nothing {
|
||||
print $" → ($step)"
|
||||
}
|
||||
101
.typedialog/platform/scripts/configure.nu
Normal file
101
.typedialog/platform/scripts/configure.nu
Normal file
@ -0,0 +1,101 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Interactive Configuration Wizard
|
||||
# Uses TypeDialog nickel-roundtrip pattern for interactive config editing
|
||||
# Supports multiple backends: cli, tui, web
|
||||
# Usage: nu configure.nu orchestrator solo
|
||||
# Usage: nu configure.nu control-center multiuser --backend tui
|
||||
# Usage: nu configure.nu mcp-server cicd --backend web
|
||||
|
||||
use ansi.nu
|
||||
use external.nu
|
||||
use paths.nu
|
||||
|
||||
export def main [
|
||||
service: string # Service: orchestrator | control-center | mcp-server | vault-service | extension-registry | rag | ai-service | provisioning-daemon
|
||||
mode: string # Mode: solo | multiuser | cicd | enterprise
|
||||
--backend: string = "web" # TypeDialog backend: cli | tui | web (default: web)
|
||||
]: nothing -> nothing {
|
||||
# Validate inputs
|
||||
paths validate-service $service
|
||||
paths validate-mode $mode
|
||||
paths validate-backend $backend
|
||||
|
||||
# Paths
|
||||
let form_path: string = (paths get-form-path $service)
|
||||
let config_path: string = (paths get-value-path $service $mode)
|
||||
let template_path: string = (paths get-template-path ($service + "-config.ncl.j2"))
|
||||
|
||||
# Verify form exists
|
||||
paths assert-file-exists $form_path
|
||||
|
||||
ansi print-progress $"Launching TypeDialog wizard for ($service) in ($mode) mode"
|
||||
print $" Backend: ($backend)"
|
||||
print $" Form: ($form_path)"
|
||||
print $" Config: ($config_path)"
|
||||
print $" Template: ($template_path)"
|
||||
print ""
|
||||
|
||||
# Check if config already exists (to load as defaults)
|
||||
let config_exists: bool = (external file-exists $config_path)
|
||||
|
||||
if $config_exists {
|
||||
ansi print-info "Loading existing config as defaults"
|
||||
} else {
|
||||
ansi print-warning "No existing config, using form defaults"
|
||||
}
|
||||
|
||||
print ""
|
||||
|
||||
# Ensure values directory exists
|
||||
let values_dir: string = (paths ensure-dir (paths values-path))
|
||||
|
||||
# Build TypeDialog command with nickel-roundtrip pattern
|
||||
let cmd_args: list<string> = if $config_exists {
|
||||
# Load existing config, allow editing, save updated config with template
|
||||
["nickel-roundtrip", $config_path, $form_path, "--output", $config_path, "--template", $template_path]
|
||||
} else {
|
||||
# Create new config from form with template
|
||||
["nickel-roundtrip", $form_path, "--output", $config_path, "--template", $template_path]
|
||||
}
|
||||
|
||||
ansi print-working "Starting TypeDialog editor (backend: $backend)..."
|
||||
|
||||
# Launch TypeDialog
|
||||
let result: record<exit_code: int, stdout: string, stderr: string> = (external run-typedialog $backend $cmd_args)
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
ansi print-error "TypeDialog editor failed or was cancelled"
|
||||
print $result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Verify config was created/updated
|
||||
if not (external file-exists $config_path) {
|
||||
ansi print-error "Config file was not created"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ansi print-success $"Configuration saved: ($config_path)"
|
||||
|
||||
# Validate the generated config
|
||||
ansi print-validate "Validating generated Nickel config..."
|
||||
let validate_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "nickel" ["typecheck", $config_path])
|
||||
|
||||
if $validate_result.exit_code != 0 {
|
||||
ansi print-error "Generated config failed validation"
|
||||
print $validate_result.stderr
|
||||
print ""
|
||||
ansi print-warning "Your edits may need adjustment. Edit manually at: ($config_path)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
ansi print-success "Config validation passed"
|
||||
|
||||
print ""
|
||||
ansi section "Next Steps"
|
||||
ansi next-step $"Validate: nu scripts/validate-config.nu ($config_path)"
|
||||
ansi next-step $"Generate: nu scripts/generate-configs.nu ($service) ($mode)"
|
||||
ansi next-step $"Build: cargo build -p ($service)"
|
||||
ansi next-step $"Run: cargo run -p ($service) -- --config provisioning/config/runtime/generated/($service).($mode).toml"
|
||||
}
|
||||
129
.typedialog/platform/scripts/detect-services.nu
Normal file
129
.typedialog/platform/scripts/detect-services.nu
Normal file
@ -0,0 +1,129 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Detect Running Platform Services
|
||||
# Auto-detects which platform services are currently running
|
||||
# Shows health status and connection info for each service
|
||||
# Usage: nu detect-services.nu
|
||||
# Usage: nu detect-services.nu --docker (detect in Docker)
|
||||
# Usage: nu detect-services.nu --kubernetes (detect in Kubernetes)
|
||||
|
||||
use ansi.nu
|
||||
use external.nu
|
||||
|
||||
export def main [
|
||||
--docker = false # Detect services in Docker
|
||||
--kubernetes = false # Detect services in Kubernetes
|
||||
]: nothing -> nothing {
|
||||
print-info "Detecting platform services..."
|
||||
print ""
|
||||
|
||||
# If no option specified, detect locally
|
||||
if not $docker and not $kubernetes {
|
||||
detect-local-services
|
||||
} else if $docker {
|
||||
detect-docker-services
|
||||
} else if $kubernetes {
|
||||
detect-kubernetes-services
|
||||
}
|
||||
}
|
||||
|
||||
def detect-local-services []: nothing -> nothing {
|
||||
section "Local Services Detection"
|
||||
|
||||
let services: list<record<name: string, port: int, cmd: string>> = [
|
||||
{ name: "Orchestrator", port: 9090, cmd: "orchestrator" }
|
||||
{ name: "Control Center", port: 8080, cmd: "control-center" }
|
||||
{ name: "MCP Server", port: 8888, cmd: "mcp-server" }
|
||||
{ name: "PostgreSQL", port: 5432, cmd: "postgres" }
|
||||
{ name: "Gitea", port: 3000, cmd: "gitea" }
|
||||
]
|
||||
|
||||
for service in $services {
|
||||
detect-local-service $service.name $service.port $service.cmd
|
||||
}
|
||||
|
||||
print ""
|
||||
}
|
||||
|
||||
def detect-local-service [name: string, port: int, cmd: string]: nothing -> nothing {
|
||||
let port_check: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
^lsof -i -P -n | grep LISTEN | grep $"(:($port)|port $port)"
|
||||
} | complete
|
||||
|
||||
let process_check: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
^pgrep -f $cmd
|
||||
} | complete
|
||||
|
||||
if $port_check.exit_code == 0 or $process_check.exit_code == 0 {
|
||||
print-success $"($name) is RUNNING"
|
||||
print $" Port: ($port)"
|
||||
|
||||
if $port_check.exit_code == 0 {
|
||||
print " Status: ✓ Listening"
|
||||
}
|
||||
} else {
|
||||
print-warning $"($name) is NOT running"
|
||||
print $" Expected port: ($port)"
|
||||
}
|
||||
|
||||
print ""
|
||||
}
|
||||
|
||||
def detect-docker-services []: nothing -> nothing {
|
||||
section "Docker Services Detection"
|
||||
|
||||
if not (external check-command-exists "docker") {
|
||||
print-error "Docker not installed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
let containers: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "docker" ["ps", "--filter", "label=app=provisioning", "--format", "table {{.Names}}\t{{.Ports}}\t{{.Status}}"])
|
||||
|
||||
if $containers.exit_code != 0 {
|
||||
print-error "Failed to detect Docker services"
|
||||
print $containers.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
if ($containers.stdout | str length) == 0 {
|
||||
print-warning "No provisioning services found in Docker"
|
||||
} else {
|
||||
print $containers.stdout
|
||||
print-success "Found provisioning services in Docker"
|
||||
}
|
||||
|
||||
print ""
|
||||
}
|
||||
|
||||
def detect-kubernetes-services []: nothing -> nothing {
|
||||
section "Kubernetes Services Detection"
|
||||
|
||||
if not (external check-command-exists "kubectl") {
|
||||
print-error "kubectl not installed"
|
||||
exit 1
|
||||
}
|
||||
|
||||
let namespaces: list<string> = ["provisioning", "default"]
|
||||
|
||||
for ns in $namespaces {
|
||||
print-working $"Checking namespace: ($ns)"
|
||||
|
||||
let deployments: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "kubectl" ["get", "deployments", "-n", $ns, "-l", "app=provisioning", "-o", "wide"])
|
||||
|
||||
if $deployments.exit_code == 0 and ($deployments.stdout | str length) > 0 {
|
||||
print-success $"Found deployments in namespace: ($ns)"
|
||||
print $deployments.stdout
|
||||
print ""
|
||||
}
|
||||
|
||||
let services: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "kubectl" ["get", "svc", "-n", $ns, "-l", "app=provisioning", "-o", "wide"])
|
||||
|
||||
if $services.exit_code == 0 and ($services.stdout | str length) > 0 {
|
||||
print-success $"Found services in namespace: ($ns)"
|
||||
print $services.stdout
|
||||
print ""
|
||||
}
|
||||
}
|
||||
|
||||
print ""
|
||||
}
|
||||
113
.typedialog/platform/scripts/export-toml.nu
Normal file
113
.typedialog/platform/scripts/export-toml.nu
Normal file
@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env nu
|
||||
# Export Nickel configuration to TOML format
|
||||
#
|
||||
# Usage:
|
||||
# ./export-toml.nu <service> [mode] [output-dir]
|
||||
# ./export-toml.nu orchestrator solo
|
||||
# ./export-toml.nu orchestrator solo ./custom-output
|
||||
# ./export-toml.nu orchestrator # Uses PROVISIONING_MODE env var
|
||||
#
|
||||
# Examples:
|
||||
# # Export from examples
|
||||
# ./export-toml.nu orchestrator solo
|
||||
# # Output: provisioning/config/runtime/generated/orchestrator.solo.toml
|
||||
#
|
||||
# # Export from custom location
|
||||
# ./export-toml.nu orchestrator solo ./workspace/config/runtime
|
||||
# # Output: ./workspace/config/runtime/generated/orchestrator.solo.toml
|
||||
|
||||
use std
|
||||
|
||||
# Default paths relative to this script
|
||||
let script_dir = (pwd)
|
||||
let project_root = $script_dir | path dirname | path dirname | path dirname | path dirname
|
||||
let provisioning = $env.PROVISIONING? // ($project_root / "provisioning")
|
||||
|
||||
# Parse arguments
|
||||
let service = ($in | get 0)
|
||||
let mode = ($in | get 1?)? // ($env.PROVISIONING_MODE? // "solo")
|
||||
let output_base = ($in | get 2?)? // ($provisioning / "config" / "runtime")
|
||||
|
||||
# Validate service name
|
||||
let valid_services = [
|
||||
"orchestrator"
|
||||
"control-center"
|
||||
"vault-service"
|
||||
"mcp-server"
|
||||
"installer"
|
||||
"extension-registry"
|
||||
"rag"
|
||||
"ai-service"
|
||||
]
|
||||
|
||||
if ($service not-in $valid_services) {
|
||||
print $"Error: Invalid service '$service'"
|
||||
print $"Valid services: ($valid_services | str join ', ')"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Validate mode
|
||||
let valid_modes = ["solo" "multiuser" "cicd" "enterprise"]
|
||||
if ($mode not-in $valid_modes) {
|
||||
print $"Error: Invalid mode '$mode'"
|
||||
print $"Valid modes: ($valid_modes | str join ', ')"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Input file: config/runtime/{service}.{mode}.ncl
|
||||
let input_file = $provisioning / "config" / "runtime" / $"($service).($mode).ncl"
|
||||
|
||||
# Ensure output directory exists
|
||||
let output_dir = $output_base / "generated"
|
||||
mkdir -p $output_dir
|
||||
|
||||
# Output file: {output_dir}/{service}.{mode}.toml
|
||||
let output_file = $output_dir / $"($service).($mode).toml"
|
||||
|
||||
# Check if input file exists
|
||||
if not ($input_file | path exists) {
|
||||
print $"Error: Input file not found: $input_file"
|
||||
print ""
|
||||
print "Available options:"
|
||||
print "1. Copy example and customize:"
|
||||
print $" cp ($provisioning)/config/examples/($service).($mode).example.ncl ($input_file)"
|
||||
print $" # Then customize as needed"
|
||||
print ""
|
||||
print "2. Or use generate-configs.nu to create from defaults"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Export NCL to TOML
|
||||
print $"Exporting: ($input_file) → ($output_file)"
|
||||
|
||||
# Set NICKEL_IMPORT_PATH for import resolution
|
||||
let nickel_path = if ($env.NICKEL_IMPORT_PATH? == "") {
|
||||
$"($provisioning):."
|
||||
} else {
|
||||
$env.NICKEL_IMPORT_PATH
|
||||
}
|
||||
|
||||
try {
|
||||
# Export to TOML
|
||||
let export_result = (
|
||||
with-env { NICKEL_IMPORT_PATH: $nickel_path } {
|
||||
nickel export --format toml $input_file
|
||||
}
|
||||
)
|
||||
|
||||
# Write to output file
|
||||
$export_result | save --raw $output_file
|
||||
|
||||
print $"✅ Success: Exported to ($output_file)"
|
||||
print ""
|
||||
print "Config summary:"
|
||||
print $" Service: ($service)"
|
||||
print $" Mode: ($mode)"
|
||||
print $" Source: ($input_file)"
|
||||
print $" Output: ($output_file)"
|
||||
print $" Size: (($output_file | stat).size | into string) bytes"
|
||||
} catch { |err|
|
||||
print $"❌ Error: Failed to export TOML"
|
||||
print $"Error details: ($err.msg)"
|
||||
exit 1
|
||||
}
|
||||
117
.typedialog/platform/scripts/external.nu
Normal file
117
.typedialog/platform/scripts/external.nu
Normal file
@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# External Command Execution Helpers
|
||||
# Provides safe command execution with error handling (no try-catch, use do-complete)
|
||||
# Usage: use external.nu; run-cmd "nickel" ["typecheck", "file.ncl"]
|
||||
|
||||
export def run-cmd [cmd: string, args: list<string>]: nothing -> record<exit_code: int, stdout: string, stderr: string> {
|
||||
let result = do {
|
||||
^$cmd ...$args
|
||||
} | complete
|
||||
|
||||
$result
|
||||
}
|
||||
|
||||
export def run-cmd-or-fail [cmd: string, args: list<string>, error_msg: string]: nothing -> string {
|
||||
let result = (run-cmd $cmd $args)
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
error make {
|
||||
msg: $"($error_msg): ($result.stderr)"
|
||||
}
|
||||
}
|
||||
|
||||
$result.stdout
|
||||
}
|
||||
|
||||
export def check-command-exists [cmd: string]: string -> bool {
|
||||
let result = do {
|
||||
which $cmd
|
||||
} | complete
|
||||
|
||||
$result.exit_code == 0
|
||||
}
|
||||
|
||||
export def assert-command-exists [cmd: string]: nothing -> nothing {
|
||||
if not (check-command-exists $cmd) {
|
||||
error make {
|
||||
msg: $"Required command not found: ($cmd)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def run-nickel-typecheck [path: string]: nothing -> nothing {
|
||||
assert-command-exists "nickel"
|
||||
|
||||
let result = (run-cmd "nickel" ["typecheck", $path])
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
error make {
|
||||
msg: $"Nickel typecheck failed for ($path): ($result.stderr)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def run-nickel-export [path: string, format: string]: nothing -> string {
|
||||
assert-command-exists "nickel"
|
||||
|
||||
(run-cmd-or-fail "nickel" ["export", "--format", $format, $path] $"Nickel export failed for ($path)")
|
||||
}
|
||||
|
||||
export def run-yq-convert [input: string, output_format: string]: nothing -> string {
|
||||
assert-command-exists "yq"
|
||||
|
||||
let result = do {
|
||||
echo $input | ^yq $"-P"
|
||||
} | complete
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
error make {
|
||||
msg: $"yq conversion failed: ($result.stderr)"
|
||||
}
|
||||
}
|
||||
|
||||
$result.stdout
|
||||
}
|
||||
|
||||
export def run-typedialog [backend: string, args: list<string>]: nothing -> record<exit_code: int, stdout: string, stderr: string> {
|
||||
assert-command-exists "typedialog"
|
||||
|
||||
let cmd_args = [$backend] | append $args
|
||||
|
||||
(run-cmd "typedialog" $cmd_args)
|
||||
}
|
||||
|
||||
export def run-typedialog-or-fail [backend: string, args: list<string>, error_msg: string]: nothing -> nothing {
|
||||
let result = (run-typedialog $backend $args)
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
error make {
|
||||
msg: $"($error_msg): ($result.stderr)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def run-docker [args: list<string>]: nothing -> record<exit_code: int, stdout: string, stderr: string> {
|
||||
assert-command-exists "docker"
|
||||
|
||||
(run-cmd "docker" $args)
|
||||
}
|
||||
|
||||
export def run-kubectl [args: list<string>]: nothing -> record<exit_code: int, stdout: string, stderr: string> {
|
||||
assert-command-exists "kubectl"
|
||||
|
||||
(run-cmd "kubectl" $args)
|
||||
}
|
||||
|
||||
export def pipe-to-file [content: string, path: string]: string -> nothing {
|
||||
$content | save --force $path
|
||||
}
|
||||
|
||||
export def file-exists [path: string]: string -> bool {
|
||||
($path | path exists)
|
||||
}
|
||||
|
||||
export def dir-exists [path: string]: string -> bool {
|
||||
($path | path exists) and (($path | path type) == "dir")
|
||||
}
|
||||
61
.typedialog/platform/scripts/generate-configs.nu
Normal file
61
.typedialog/platform/scripts/generate-configs.nu
Normal file
@ -0,0 +1,61 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Generate TOML configs from Nickel sources
|
||||
# Exports Nickel configs to TOML format for use by Rust services
|
||||
# Usage: nu generate-configs.nu orchestrator solo
|
||||
# Usage: nu generate-configs.nu control-center multiuser
|
||||
|
||||
use ansi.nu
|
||||
use external.nu
|
||||
use paths.nu
|
||||
|
||||
export def main [
|
||||
service: string # Service: orchestrator | control-center | mcp-server | vault-service | extension-registry | rag | ai-service | provisioning-daemon
|
||||
mode: string # Mode: solo | multiuser | cicd | enterprise
|
||||
]: nothing -> nothing {
|
||||
# Validate inputs
|
||||
paths validate-service $service
|
||||
paths validate-mode $mode
|
||||
|
||||
let nickel_path: string = (paths get-config-path $service $mode)
|
||||
let toml_path: string = (paths get-output-config-path $service $mode)
|
||||
|
||||
ansi print-working $"Generating TOML config for ($service) in ($mode) mode"
|
||||
print $" From: ($nickel_path)"
|
||||
print $" To: ($toml_path)"
|
||||
|
||||
# Validate Nickel file first
|
||||
paths assert-file-exists $nickel_path
|
||||
|
||||
ansi print-validate "Checking Nickel syntax..."
|
||||
let validate_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "nickel" ["typecheck", $nickel_path])
|
||||
|
||||
if $validate_result.exit_code != 0 {
|
||||
ansi print-error "Nickel validation failed"
|
||||
print $validate_result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
ansi print-success "Nickel syntax valid"
|
||||
|
||||
# Export to TOML
|
||||
ansi print-working "Exporting to TOML format..."
|
||||
let export_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "nickel" ["export", "--format", "toml", $nickel_path])
|
||||
|
||||
if $export_result.exit_code != 0 {
|
||||
ansi print-error "Nickel export failed"
|
||||
print $export_result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
# Create output directory if needed
|
||||
let output_dir: string = ($toml_path | path dirname)
|
||||
let _ = (paths ensure-dir $output_dir)
|
||||
|
||||
# Save TOML
|
||||
(external pipe-to-file $export_result.stdout $toml_path)
|
||||
|
||||
ansi print-success $"TOML config generated: ($toml_path)"
|
||||
print ""
|
||||
print $" File size: ((($toml_path) | path exists) and ((^wc -c < $toml_path | str trim) + ' bytes') or 'N/A')"
|
||||
}
|
||||
217
.typedialog/platform/scripts/install-services.nu
Normal file
217
.typedialog/platform/scripts/install-services.nu
Normal file
@ -0,0 +1,217 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Install and Deploy Platform Services
|
||||
# Orchestrates full deployment workflow: config generation → validation → deployment
|
||||
# Supports multiple backends: local, docker, kubernetes
|
||||
# Usage: nu install-services.nu orchestrator solo
|
||||
# Usage: nu install-services.nu all multiuser --docker
|
||||
# Usage: nu install-services.nu all enterprise --kubernetes --namespace prod
|
||||
|
||||
use ansi.nu
|
||||
use external.nu
|
||||
use paths.nu
|
||||
|
||||
export def main [
|
||||
service: string # Service: orchestrator | control-center | mcp-server | vault-service | extension-registry | rag | ai-service | provisioning-daemon | all
|
||||
mode: string # Mode: solo | multiuser | cicd | enterprise
|
||||
--docker = false # Deploy to Docker
|
||||
--kubernetes = false # Deploy to Kubernetes
|
||||
--namespace: string = "provisioning" # Kubernetes namespace
|
||||
--skip-config = false # Skip config generation
|
||||
--skip-validation = false # Skip validation
|
||||
--no-compose = false # Don't render Docker Compose
|
||||
]: nothing -> nothing {
|
||||
# Validate mode
|
||||
paths validate-mode $mode
|
||||
|
||||
# Determine services to install
|
||||
let services_to_install: list<string> = if $service == "all" {
|
||||
["orchestrator", "control-center", "mcp-server", "vault-service", "extension-registry", "rag", "ai-service", "provisioning-daemon"]
|
||||
} else {
|
||||
paths validate-service $service
|
||||
[$service]
|
||||
}
|
||||
|
||||
section "Platform Services Deployment"
|
||||
print $"Mode: ($mode)"
|
||||
print $"Services: ($services_to_install | str join ', ')"
|
||||
print $"Docker: ($docker)"
|
||||
print $"K8s: ($kubernetes)"
|
||||
print $"Namespace: ($namespace)"
|
||||
print ""
|
||||
|
||||
# Phase 1: Configuration Generation
|
||||
if not $skip_config {
|
||||
section "Phase 1: Configuration Generation"
|
||||
|
||||
for svc in $services_to_install {
|
||||
print ""
|
||||
print-working $"Generating config for ($svc)..."
|
||||
|
||||
let result: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
^nu (paths scripts-path) / "generate-configs.nu" $svc $mode
|
||||
} | complete
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
print-error $"Failed to generate config for ($svc)"
|
||||
print $result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
print-success $"Config generated for ($svc)"
|
||||
}
|
||||
|
||||
print ""
|
||||
}
|
||||
|
||||
# Phase 2: Validation
|
||||
if not $skip_validation {
|
||||
section "Phase 2: Configuration Validation"
|
||||
|
||||
for svc in $services_to_install {
|
||||
let config_path: string = (paths get-output-config-path $svc $mode)
|
||||
|
||||
if not (external file-exists $config_path) {
|
||||
print-warning $"Config not found: ($config_path)"
|
||||
continue
|
||||
}
|
||||
|
||||
print-validate $"Validating ($svc)..."
|
||||
|
||||
let result: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
^nu (paths scripts-path) / "validate-config.nu" $config_path
|
||||
} | complete
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
print-error $"Validation failed for ($svc)"
|
||||
print $result.stderr
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
print ""
|
||||
}
|
||||
|
||||
# Phase 3: Rendering Deployment Artifacts
|
||||
section "Phase 3: Rendering Deployment Artifacts"
|
||||
|
||||
if $docker and not $no_compose {
|
||||
print-docker "Rendering Docker Compose..."
|
||||
|
||||
let result: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
^nu (paths scripts-path) / "render-docker-compose.nu" $mode
|
||||
} | complete
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
print-error "Failed to render Docker Compose"
|
||||
print $result.stderr
|
||||
# Continue anyway, Docker rendering is optional
|
||||
}
|
||||
}
|
||||
|
||||
if $kubernetes {
|
||||
print-k8s "Rendering Kubernetes manifests..."
|
||||
|
||||
let result: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
^nu (paths scripts-path) / "render-kubernetes.nu" $mode --namespace $namespace
|
||||
} | complete
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
print-error "Failed to render Kubernetes manifests"
|
||||
print $result.stderr
|
||||
# Continue anyway, K8s rendering is optional
|
||||
}
|
||||
}
|
||||
|
||||
print ""
|
||||
|
||||
# Phase 4: Deployment (if requested)
|
||||
if $docker {
|
||||
deploy-docker $mode
|
||||
} else if $kubernetes {
|
||||
deploy-kubernetes $mode $namespace
|
||||
}
|
||||
|
||||
print ""
|
||||
section "Installation Summary"
|
||||
print-success "Phase 8 deployment workflow completed"
|
||||
print ""
|
||||
print "Generated configurations are ready for use:"
|
||||
for svc in $services_to_install {
|
||||
let config_path: string = (paths get-output-config-path $svc $mode)
|
||||
next-step $config_path
|
||||
}
|
||||
|
||||
print ""
|
||||
section "Next Steps"
|
||||
next-step "Test configuration: cargo run -p orchestrator -- --config provisioning/config/runtime/generated/orchestrator.($mode).toml"
|
||||
next-step "Full deployment: See provisioning/platform/infrastructure/ for Docker Compose and Kubernetes manifests"
|
||||
}
|
||||
|
||||
def deploy-docker [mode: string]: nothing -> nothing {
|
||||
section "Phase 4: Docker Deployment"
|
||||
|
||||
let compose_file: string = "provisioning/platform/infrastructure/docker/docker-compose." + $mode + ".yml"
|
||||
|
||||
if not (external file-exists $compose_file) {
|
||||
print-warning $"Docker Compose file not found: ($compose_file)"
|
||||
print-info "Run with --docker flag to render Compose files first"
|
||||
return
|
||||
}
|
||||
|
||||
print-docker $"Deploying with Docker Compose: ($compose_file)"
|
||||
|
||||
let result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "docker-compose" ["-f", $compose_file, "up", "-d"])
|
||||
|
||||
if $result.exit_code != 0 {
|
||||
print-error "Docker Compose deployment failed"
|
||||
print $result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
print-success "Docker Compose deployment completed"
|
||||
|
||||
print ""
|
||||
next-step "View logs: docker-compose -f ($compose_file) logs -f"
|
||||
next-step "Stop services: docker-compose -f ($compose_file) down"
|
||||
next-step "Status: docker-compose -f ($compose_file) ps"
|
||||
}
|
||||
|
||||
def deploy-kubernetes [mode: string, namespace: string]: nothing -> nothing {
|
||||
section "Phase 4: Kubernetes Deployment"
|
||||
|
||||
let manifest_dir: string = "provisioning/platform/infrastructure/kubernetes/" + $mode
|
||||
|
||||
if not (external dir-exists $manifest_dir) {
|
||||
print-warning $"Kubernetes manifest directory not found: ($manifest_dir)"
|
||||
print-info "Run with --kubernetes flag to render manifests first"
|
||||
return
|
||||
}
|
||||
|
||||
print-k8s $"Creating namespace: ($namespace)"
|
||||
|
||||
let ns_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "kubectl" ["create", "namespace", $namespace])
|
||||
|
||||
# Namespace may already exist, that's ok
|
||||
if $ns_result.exit_code != 0 and not ($ns_result.stderr | str contains "already exists") {
|
||||
print-warning $"Namespace creation: ($ns_result.stderr)"
|
||||
}
|
||||
|
||||
print-k8s $"Deploying Kubernetes manifests from: ($manifest_dir)"
|
||||
|
||||
let deploy_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "kubectl" ["apply", "-f", $manifest_dir, "-n", $namespace])
|
||||
|
||||
if $deploy_result.exit_code != 0 {
|
||||
print-error "Kubernetes deployment failed"
|
||||
print $deploy_result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
print-success "Kubernetes deployment completed"
|
||||
|
||||
print ""
|
||||
next-step "View deployments: kubectl get deployments -n ($namespace)"
|
||||
next-step "View services: kubectl get svc -n ($namespace)"
|
||||
next-step "View pods: kubectl get pods -n ($namespace)"
|
||||
next-step "View logs: kubectl logs -n ($namespace) -l app=orchestrator -f"
|
||||
}
|
||||
143
.typedialog/platform/scripts/paths.nu
Normal file
143
.typedialog/platform/scripts/paths.nu
Normal file
@ -0,0 +1,143 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Path Management and Validation Helpers
|
||||
# Provides consistent path handling for Phase 8 scripts
|
||||
# Usage: use paths.nu; assert-file-exists "/some/file"
|
||||
|
||||
export def assert-file-exists [path: string]: nothing -> nothing {
|
||||
if not ($path | path exists) {
|
||||
error make {
|
||||
msg: $"File not found: ($path)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def assert-dir-exists [path: string]: nothing -> nothing {
|
||||
let path_obj = $path | path expand
|
||||
|
||||
if not ($path_obj | path exists) {
|
||||
error make {
|
||||
msg: $"Directory not found: ($path_obj)"
|
||||
}
|
||||
}
|
||||
|
||||
if not ($path_obj | path type) == "dir" {
|
||||
error make {
|
||||
msg: $"Path exists but is not a directory: ($path_obj)"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def ensure-dir [path: string]: string -> string {
|
||||
let expanded = $path | path expand
|
||||
|
||||
if not ($expanded | path exists) {
|
||||
^mkdir -p $expanded
|
||||
}
|
||||
|
||||
$expanded
|
||||
}
|
||||
|
||||
export def resolve-relative [path: string]: string -> string {
|
||||
if ($path | str starts-with "/") {
|
||||
$path
|
||||
} else if ($path | str starts-with "~/") {
|
||||
$path | path expand
|
||||
} else {
|
||||
(pwd) / $path | path expand
|
||||
}
|
||||
}
|
||||
|
||||
export def typedialog-base-path []: nothing -> string {
|
||||
"provisioning/.typedialog/platform"
|
||||
}
|
||||
|
||||
export def schemas-base-path []: nothing -> string {
|
||||
"provisioning/schemas/platform"
|
||||
}
|
||||
|
||||
export def forms-path []: nothing -> string {
|
||||
(typedialog-base-path) + "/forms"
|
||||
}
|
||||
|
||||
export def fragments-path []: nothing -> string {
|
||||
(forms-path) + "/fragments"
|
||||
}
|
||||
|
||||
export def schemas-path []: nothing -> string {
|
||||
(schemas-base-path) + "/schemas"
|
||||
}
|
||||
|
||||
export def defaults-path []: nothing -> string {
|
||||
(schemas-base-path) + "/defaults"
|
||||
}
|
||||
|
||||
export def validators-path []: nothing -> string {
|
||||
(schemas-base-path) + "/validators"
|
||||
}
|
||||
|
||||
export def configs-path []: nothing -> string {
|
||||
(schemas-base-path) + "/configs"
|
||||
}
|
||||
|
||||
export def templates-path []: nothing -> string {
|
||||
(schemas-base-path) + "/templates"
|
||||
}
|
||||
|
||||
export def values-path []: nothing -> string {
|
||||
(schemas-base-path) + "/values"
|
||||
}
|
||||
|
||||
export def constraints-path []: nothing -> string {
|
||||
(schemas-base-path) + "/constraints"
|
||||
}
|
||||
|
||||
export def get-form-path [service: string]: string -> string {
|
||||
(forms-path) + "/" + $service + "-form.toml"
|
||||
}
|
||||
|
||||
export def get-config-path [service: string, mode: string]: string -> string {
|
||||
(configs-path) + "/" + $service + "." + $mode + ".ncl"
|
||||
}
|
||||
|
||||
export def get-value-path [service: string, mode: string]: string -> string {
|
||||
(values-path) + "/" + $service + "." + $mode + ".ncl"
|
||||
}
|
||||
|
||||
export def get-template-path [template_name: string]: string -> string {
|
||||
(templates-path) + "/" + $template_name
|
||||
}
|
||||
|
||||
export def get-output-config-path [service: string, mode: string]: string -> string {
|
||||
"provisioning/config/runtime/generated/" + $service + "." + $mode + ".toml"
|
||||
}
|
||||
|
||||
export def validate-service [service: string]: nothing -> nothing {
|
||||
let valid_services = ["orchestrator", "control-center", "mcp-server", "vault-service", "extension-registry", "rag", "ai-service", "provisioning-daemon"]
|
||||
|
||||
if $service not-in $valid_services {
|
||||
error make {
|
||||
msg: $"Invalid service: ($service). Valid options: ($valid_services | str join ', ')"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def validate-mode [mode: string]: nothing -> nothing {
|
||||
let valid_modes = ["solo", "multiuser", "cicd", "enterprise"]
|
||||
|
||||
if $mode not-in $valid_modes {
|
||||
error make {
|
||||
msg: $"Invalid deployment mode: ($mode). Valid options: ($valid_modes | str join ', ')"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export def validate-backend [backend: string]: nothing -> nothing {
|
||||
let valid_backends = ["cli", "tui", "web"]
|
||||
|
||||
if $backend not-in $valid_backends {
|
||||
error make {
|
||||
msg: $"Invalid TypeDialog backend: ($backend). Valid options: ($valid_backends | str join ', ')"
|
||||
}
|
||||
}
|
||||
}
|
||||
82
.typedialog/platform/scripts/render-docker-compose.nu
Normal file
82
.typedialog/platform/scripts/render-docker-compose.nu
Normal file
@ -0,0 +1,82 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Render Docker Compose Files from Nickel Templates
|
||||
# Exports Nickel templates to YAML Docker Compose format
|
||||
# Usage: nu render-docker-compose.nu solo
|
||||
# Usage: nu render-docker-compose.nu enterprise --output custom-compose.yml
|
||||
|
||||
use ansi.nu
|
||||
use external.nu
|
||||
use paths.nu
|
||||
|
||||
export def main [
|
||||
mode: string # Mode: solo | multiuser | cicd | enterprise
|
||||
--template: string = "platform-stack.yml.ncl" # Template file name (default: platform-stack.yml.ncl)
|
||||
--output: string = "" # Output path (default: infrastructure/docker/docker-compose.{mode}.yml)
|
||||
]: nothing -> nothing {
|
||||
# Validate inputs
|
||||
paths validate-mode $mode
|
||||
|
||||
# Paths
|
||||
let template_path: string = (paths get-template-path ("docker-compose/" + $template))
|
||||
let default_output: string = "provisioning/platform/infrastructure/docker/docker-compose." + $mode + ".yml"
|
||||
let output_path: string = if ($output | str length) > 0 { $output } else { $default_output }
|
||||
|
||||
# Verify template exists
|
||||
if not (external file-exists $template_path) {
|
||||
print-warning $"Using default template since custom not found: ($template)"
|
||||
# For now, we'll document this as a template that needs to be created
|
||||
print-info "Template creation deferred to Phase 9 (Nickel Templates)"
|
||||
print ""
|
||||
print-info "Placeholder: Would render ($template_path) → ($output_path)"
|
||||
exit 0
|
||||
}
|
||||
|
||||
print-docker $"Rendering Docker Compose for ($mode) mode"
|
||||
print $" Template: ($template_path)"
|
||||
print $" Output: ($output_path)"
|
||||
print ""
|
||||
|
||||
print-working "Exporting Nickel template to JSON..."
|
||||
|
||||
# Export Nickel template to JSON
|
||||
let json_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "nickel" ["export", "--format", "json", $template_path])
|
||||
|
||||
if $json_result.exit_code != 0 {
|
||||
print-error "Nickel export failed"
|
||||
print $json_result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
print-success "Nickel exported to JSON"
|
||||
|
||||
print-working "Converting JSON to YAML..."
|
||||
|
||||
# Convert JSON to YAML using yq
|
||||
let yaml_result: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
echo $json_result.stdout | ^yq -P
|
||||
} | complete
|
||||
|
||||
if $yaml_result.exit_code != 0 {
|
||||
print-error "YAML conversion failed"
|
||||
print $yaml_result.stderr
|
||||
exit 1
|
||||
}
|
||||
|
||||
print-success "JSON converted to YAML"
|
||||
|
||||
# Create output directory
|
||||
let output_dir: string = ($output_path | path dirname)
|
||||
let _ = (paths ensure-dir $output_dir)
|
||||
|
||||
# Save YAML to file
|
||||
(external pipe-to-file $yaml_result.stdout $output_path)
|
||||
|
||||
print-success $"Docker Compose generated: ($output_path)"
|
||||
|
||||
print ""
|
||||
section "Next Steps"
|
||||
next-step "Validate: docker-compose -f ($output_path) config"
|
||||
next-step "Deploy: docker-compose -f ($output_path) up -d"
|
||||
next-step "Status: docker-compose -f ($output_path) ps"
|
||||
}
|
||||
96
.typedialog/platform/scripts/render-kubernetes.nu
Normal file
96
.typedialog/platform/scripts/render-kubernetes.nu
Normal file
@ -0,0 +1,96 @@
|
||||
#!/usr/bin/env nu
|
||||
|
||||
# Render Kubernetes Manifests from Nickel Templates
|
||||
# Exports Nickel templates to YAML Kubernetes manifest format
|
||||
# Usage: nu render-kubernetes.nu solo
|
||||
# Usage: nu render-kubernetes.nu enterprise --namespace production
|
||||
|
||||
use ansi.nu
|
||||
use external.nu
|
||||
use paths.nu
|
||||
|
||||
export def main [
|
||||
mode: string # Mode: solo | multiuser | cicd | enterprise
|
||||
--namespace: string = "provisioning" # Kubernetes namespace (default: provisioning)
|
||||
--output-dir: string = "" # Output directory (default: infrastructure/kubernetes/{mode})
|
||||
]: nothing -> nothing {
|
||||
# Validate inputs
|
||||
paths validate-mode $mode
|
||||
|
||||
# Paths
|
||||
let default_output_dir: string = "provisioning/platform/infrastructure/kubernetes/" + $mode
|
||||
let output_path: string = if ($output_dir | str length) > 0 { $output_dir } else { $default_output_dir }
|
||||
|
||||
print-k8s $"Rendering Kubernetes manifests for ($mode) mode"
|
||||
print $" Namespace: ($namespace)"
|
||||
print $" Output Dir: ($output_path)"
|
||||
print ""
|
||||
|
||||
# Ensure output directory exists
|
||||
let _ = (paths ensure-dir $output_path)
|
||||
|
||||
# List of Kubernetes manifests to render
|
||||
let manifests: list<string> = [
|
||||
"orchestrator-deployment.yaml.ncl"
|
||||
"orchestrator-service.yaml.ncl"
|
||||
"control-center-deployment.yaml.ncl"
|
||||
"control-center-service.yaml.ncl"
|
||||
"mcp-server-deployment.yaml.ncl"
|
||||
"platform-ingress.yaml.ncl"
|
||||
]
|
||||
|
||||
print-working $"Processing ($manifests | length) Kubernetes manifests..."
|
||||
print ""
|
||||
|
||||
let templates_path: string = (paths templates-path)
|
||||
|
||||
# For each manifest template, render and save
|
||||
for manifest in $manifests {
|
||||
let template_path: string = $templates_path + "/kubernetes/" + $manifest
|
||||
let output_file: string = ($manifest | str replace ".ncl" "")
|
||||
let output_file_path: string = $output_path + "/" + $output_file
|
||||
|
||||
if not (external file-exists $template_path) {
|
||||
print-warning $"Template not found (will be created in Phase 9): ($manifest)"
|
||||
continue
|
||||
}
|
||||
|
||||
print-working $"Rendering ($manifest)..."
|
||||
|
||||
# Export Nickel template to JSON
|
||||
let json_result: record<exit_code: int, stdout: string, stderr: string> = (external run-cmd "nickel" ["export", "--format", "json", $template_path])
|
||||
|
||||
if $json_result.exit_code != 0 {
|
||||
print-error $"Failed to export ($manifest): ($json_result.stderr)"
|
||||
continue
|
||||
}
|
||||
|
||||
# Convert JSON to YAML
|
||||
let yaml_result: record<exit_code: int, stdout: string, stderr: string> = do {
|
||||
echo $json_result.stdout | ^yq -P
|
||||
} | complete
|
||||
|
||||
if $yaml_result.exit_code != 0 {
|
||||
print-error $"Failed to convert ($manifest) to YAML: ($yaml_result.stderr)"
|
||||
continue
|
||||
}
|
||||
|
||||
# Inject namespace if applicable
|
||||
let yaml_with_namespace: string = ($yaml_result.stdout | str replace "namespace: default" $"namespace: ($namespace)")
|
||||
|
||||
# Save YAML
|
||||
(external pipe-to-file $yaml_with_namespace $output_file_path)
|
||||
|
||||
print-success $" → ($output_file)"
|
||||
}
|
||||
|
||||
print ""
|
||||
print-success $"Kubernetes manifests rendered to: ($output_path)"
|
||||
|
||||
print ""
|
||||
section "Next Steps"
|
||||
next-step "Validate: kubectl apply -f ($output_path) --dry-run=client"
|
||||
next-step "Deploy: kubectl apply -f ($output_path) --namespace ($namespace)"
|
||||
next-step "Status: kubectl get deployments -n ($namespace)"
|
||||
next-step "Logs: kubectl logs -n ($namespace) -l app=orchestrator -f"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user