diff --git a/CLAUDE.md b/CLAUDE.md index f93ab23..d7d809e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -119,6 +119,26 @@ - If biome check fails, fix the issues before proceeding with commit/push - This prevents breaking production with syntax errors like missing parentheses +## Writing Standards +**CRITICAL: NEVER use em dashes, en dashes, or double hyphens in prose** + +- ❌ **NEVER** use `—` (em dash) in writing +- ❌ **NEVER** use `–` (en dash) in writing +- ❌ **NEVER** use ` -- ` (double hyphen) as a dash substitute +- ✅ **USE** colons, commas, periods, or restructure the sentence instead + +**Examples:** +``` +❌ uncloseai-cli — Local LLM Agent +✅ uncloseai-cli: Local LLM Agent + +❌ Zero dependencies — only os, math, random +✅ Zero dependencies: only os, math, random + +❌ Point it at any endpoint — vLLM, Ollama, or uncloseai +✅ Point it at any endpoint: vLLM, Ollama, or uncloseai +``` + ## CSS and Styling Standards **CRITICAL: NEVER use !important in CSS** diff --git a/public/c-examples.html b/public/c-examples.html index 80e1fd0..e019437 100644 --- a/public/c-examples.html +++ b/public/c-examples.html @@ -62,6 +62,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/cli.html b/public/cli.html new file mode 100644 index 0000000..5bc0eca --- /dev/null +++ b/public/cli.html @@ -0,0 +1,405 @@ + + + + + + + + + uncloseai-cli: Local LLM Agent | uncloseai.com + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +

    uncloseai.

    +

    uncloseai-cli: Local LLM Agent

    +
    + +
    + +

    Three Tools for Growing Machine Learning from Seed

    + +

    The uncloseai-cli repository contains three tools that form a complete local ML pipeline: agent harness, model training, and dataset curation. Zero external dependencies. Pure Python. Public domain.

    + + + +

    Install

    +
    git clone https://git.unturf.com/engineering/unturf/uncloseai-cli.git
    +cd uncloseai-cli
    +make install
    +

    Creates uncloseai-cli, unclose, u, microgpt-cli, microgpt in /usr/local/bin.

    + +

    Source: git.unturf.com/engineering/unturf/uncloseai-cli

    + +
    + +

    uncloseai-cli: Local LLM Agent

    + +

    A minimal "Claude Code" style tool-calling agent powered by a local 8B parameter LLM. Every request flows through a todo system:

    + +
      +
    1. Plan: LLM breaks request into numbered tasks
    2. +
    3. Trim: Python removes fluff (open/read, report/inform), caps at 5
    4. +
    5. Execute: each task runs through a ReAct loop with tool access
    6. +
    7. Forward: prior task results flow to later tasks as context
    8. +
    + +

    Usage

    +
    # Run a task
    +unclose "pull and sync"
    +
    +# Multi-step: agent plans and executes each step
    +unclose "what time is it in EST? also run ddate"
    +
    +# Print-only mode (minimal output, just final answer)
    +unclose -p "summarize SYSTEM-PROMPT.md"
    +
    +# Verbose mode (show turn numbers)
    +unclose -v "deploy"
    +
    +# Interactive REPL
    +unclose -i
    + +

    Configuration

    +

    All configuration via environment variables. No config files needed:

    + + + + + + + + + + + + +
    VariableDefaultDescription
    UNCLOSE_BASEhttps://hermes.ai.unturf.com/v1OpenAI-compatible API base URL
    UNCLOSE_MODEL(auto-detected)Model name from /v1/models
    UNCLOSE_KEYpermacomputerAPI key
    UNCLOSE_MAX_TURNS15Max ReAct turns per task
    UNCLOSE_MAX_RESULT12000Max chars per tool result
    + +

    Point it at any OpenAI-compatible endpoint: vLLM, Ollama, or the free uncloseai inference endpoints. By default it connects to hermes.ai.unturf.com. See Model Discovery for all available endpoints and how to query current model IDs.

    + +

    Tools

    +

    The agent has access to 8 built-in tools:

    + + + + + + + + + + + + + + + +
    ToolArgsDescription
    bashcommandRun a shell command (60s timeout, dangerous commands blocked)
    readpathRead a file (truncated at 12K chars)
    writepath, contentCreate or overwrite a file
    editpath, old, newReplace exact string in file
    globpattern, pathFind files by glob pattern
    greppattern, pathSearch file contents with regex
    fetchurl, depth, keywordsFetch web page, extract text (async crawler)
    todo_addcontent, activeFormAdd task to live todo list during execution
    + +

    Web Fetching

    +

    The fetch tool wraps a production-grade async web crawler:

    + + +

    Session Logging

    +

    Every session is logged as JSONL to ~/.uncloseai/sessions/. Use unclose-snoop to parse session logs into a readable feed:

    +
    cat ~/.uncloseai/sessions/*.jsonl | unclose-snoop
    + +
    + +

    microgpt: Pure-Python GPT

    + +

    Minimal GPT training & inference with zero external dependencies: only os, math, random, json, argparse. Based on Karpathy's microgpt.

    + +

    Implements: scalar autograd (Value class), multi-head attention, RMSNorm, MLP, Adam optimizer with linear LR decay, temperature-controlled sampling. JSON model persistence with full metadata.

    + +

    Usage

    +
    # Train on a text dataset (one document per line)
    +microgpt train --dataset names.txt --steps 1024 --save model.json
    +
    +# Generate samples from a trained model
    +microgpt generate --load model.json --samples 10 --temperature 0.5
    +
    +# Train & generate in one shot
    +microgpt run --dataset names.txt --steps 1024 --samples 10
    +
    +# Inspect a saved model
    +microgpt info model.json
    + +

    Flags

    + + + + + + + + + + + + + + + + + + + +
    FlagDefaultSubcommands
    --dataset PATHauto-download names.txttrain, run
    --save PATHmicrogpt-model.jsontrain, run
    --load PATH(required)generate
    --steps N1000train, run
    --lr FLOAT0.01train, run
    --n-embd N16train, run
    --n-head N4train, run
    --n-layer N1train, run
    --block-size N16train, run
    --samples N20generate, run
    --temperature FLOAT0.5generate, run
    --seed N42all
    --quietfalsetrain, run
    + +

    Also ships as microgpt.h, a single-header C library for model inference.

    + +
    + +

    garden.mk: Smol Model Garden

    + +

    Pull 15 curated character-level datasets, grow GPT models at 3 sizes. Every dataset tracks its upstream origin. Mirrored to HuggingFace: russellbal/smol-seeds.

    + +

    Datasets

    + + + + + + + + + + + + + + + + + + + + + +
    SeedLinesOriginFreshness
    names32Kkarpathy/makemoreDormant (2022)
    words97Kdwyl/english-wordsStable (2025)
    pokemon1Ksindresorhus/pokemonStable (2024)
    dinosaurs1.5Kbrunoklein99/deep-learning-notesFossil (2018)
    hex-colors32Kxkcd + meodai/color-namesActive
    color-names31Kmeodai/color-namesActive
    chords1Ktombatossals/chords-dbQuarterly
    json-keys4KGitHub OpenAPI specActive
    css-classes2Ktwbs/bootstrapQuarterly
    make-targets291scraped from major reposActive
    commit-msgs20Kangular/angularActive
    haiku143Kdocmarionum1/haikurnnFossil (2018)
    variable-names3.8KGitHub repo treesActive
    last-names225Ksacrificialpancakes/synthetic_demographics_seedStable
    occupations831sacrificialpancakes/synthetic_demographics_seedStable
    + +

    Usage

    +
    # Download all datasets
    +make -f garden.mk pull
    +
    +# Train all models at embedding size 64
    +make -f garden.mk grow-64
    +
    +# Train all at all sizes (64, 128, 512)
    +make -f garden.mk grow
    +
    +# Pull + grow one model family
    +make -f garden.mk names
    +
    +# List upstream sources
    +make -f garden.mk origins
    +
    +# Check upstream freshness
    +make -f garden.mk freshness
    +
    +# Sample from a trained model
    +make -f garden.mk sample MODEL=pokemon-64 N=10
    +
    +# Show trained model inventory
    +make -f garden.mk inventory
    +
    +# Push datasets to HuggingFace mirror
    +make -f garden.mk mirror
    + +

    Model Sizes

    + + + + + + + + + +
    Sizen_embdn_headn_layerUse
    646441Fast, good for testing
    12812882Balanced
    51251284Slow in pure Python, best quality
    + +
    + +

    Architecture

    + +

    The agent orchestration follows a plan-execute-forward pattern:

    + +
    User Message
    +    ↓
    +Plan Phase (LLM call with planning-only prompt)
    +    ↓
    +JSON task array
    +    ↓
    +Trim Phase (Python, no LLM)
    +  • drop fluff (report/inform)
    +  • drop prep (open/read)
    +    ↓
    +Save to ~/.uncloseai/todos/{session}.json
    +    ↓
    +┌─→ Any pending tasks? ─── no → Display final todo list ✓
    +│       ↓ yes
    +│   Mark in_progress
    +│       ↓
    +│   ReAct Loop (tool calls until done or stuck)
    +│       ↓
    +│   Mark completed → Save → Append result (≤500 chars)
    +└───────┘
    + +

    Each task in the ReAct loop can call tools, receive results, and iterate up to UNCLOSE_MAX_TURNS times. Stuck-loop detection bails out after 2 identical consecutive tool calls.

    + +

    Prior task results are forwarded as context to later tasks, so multi-step requests build on earlier work without re-executing commands.

    + +

    Read-Only Mode

    +

    When the agent detects a read-only intent (questions, searches, inspections), it automatically disables write and edit tools. This prevents accidental file modifications on information-gathering requests.

    + +
    + +

    License

    +

    Public domain. Knowledge unbound by gatekeepers.

    + + + + + + +
    + + + + + + diff --git a/public/crawler.html b/public/crawler.html index ab48e67..b710953 100644 --- a/public/crawler.html +++ b/public/crawler.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Our Crawler
  • 🔗 All Languages
  • @@ -166,7 +167,7 @@ Disallow: /

    If you have questions about our crawler or want to discuss our access to your site, please reach out:

    diff --git a/public/csharp-examples.html b/public/csharp-examples.html index 9022b5c..803ca85 100644 --- a/public/csharp-examples.html +++ b/public/csharp-examples.html @@ -62,6 +62,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/dart-examples.html b/public/dart-examples.html index 7d59fd4..2b63f8a 100644 --- a/public/dart-examples.html +++ b/public/dart-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/elixir-examples.html b/public/elixir-examples.html index e427049..95eaff1 100644 --- a/public/elixir-examples.html +++ b/public/elixir-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/go-examples.html b/public/go-examples.html index f969419..37867fc 100644 --- a/public/go-examples.html +++ b/public/go-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/index.html b/public/index.html index 96c0afd..5ea5e98 100644 --- a/public/index.html +++ b/public/index.html @@ -71,6 +71,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/inference.html b/public/inference.html index d785698..1cfe03e 100644 --- a/public/inference.html +++ b/public/inference.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/java-examples.html b/public/java-examples.html index 6daf9f3..1fc1840 100644 --- a/public/java-examples.html +++ b/public/java-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/kotlin-examples.html b/public/kotlin-examples.html index 29d8db6..99ed60e 100644 --- a/public/kotlin-examples.html +++ b/public/kotlin-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/nodejs-examples.html b/public/nodejs-examples.html index 011e96d..198a0e0 100644 --- a/public/nodejs-examples.html +++ b/public/nodejs-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/php-examples.html b/public/php-examples.html index 69d20a3..782886c 100644 --- a/public/php-examples.html +++ b/public/php-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/privacy-policy.html b/public/privacy-policy.html index cd74005..769a343 100644 --- a/public/privacy-policy.html +++ b/public/privacy-policy.html @@ -58,6 +58,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/python-examples.html b/public/python-examples.html index efbde5e..6f431b9 100644 --- a/public/python-examples.html +++ b/public/python-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/ruby-examples.html b/public/ruby-examples.html index 580f5a3..03f602d 100644 --- a/public/ruby-examples.html +++ b/public/ruby-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/rust-examples.html b/public/rust-examples.html index 926ad1e..8304686 100644 --- a/public/rust-examples.html +++ b/public/rust-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/swift-examples.html b/public/swift-examples.html index 7bfde03..21dae7c 100644 --- a/public/swift-examples.html +++ b/public/swift-examples.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/terms-of-use.html b/public/terms-of-use.html index d8a2b10..5e3a290 100644 --- a/public/terms-of-use.html +++ b/public/terms-of-use.html @@ -58,6 +58,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler
  • diff --git a/public/text-to-speech.html b/public/text-to-speech.html index 7ae2de0..90396b5 100644 --- a/public/text-to-speech.html +++ b/public/text-to-speech.html @@ -153,6 +153,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Qwen3-TTS
  • diff --git a/public/tts/fast-synthesis.html b/public/tts/fast-synthesis.html index 6a437d2..d9e6166 100644 --- a/public/tts/fast-synthesis.html +++ b/public/tts/fast-synthesis.html @@ -52,6 +52,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Qwen3-TTS
  • diff --git a/public/tts/hd-cloning.html b/public/tts/hd-cloning.html index 624aca4..1ebe4d6 100644 --- a/public/tts/hd-cloning.html +++ b/public/tts/hd-cloning.html @@ -52,6 +52,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Qwen3-TTS
  • diff --git a/public/tts/lightweight.html b/public/tts/lightweight.html index 43f4822..fafb5ba 100644 --- a/public/tts/lightweight.html +++ b/public/tts/lightweight.html @@ -52,6 +52,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Qwen3-TTS
  • diff --git a/public/tts/multilingual-cpu.html b/public/tts/multilingual-cpu.html index bbe5782..a5abd61 100644 --- a/public/tts/multilingual-cpu.html +++ b/public/tts/multilingual-cpu.html @@ -52,6 +52,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Qwen3-TTS
  • diff --git a/public/tts/voice-cloning.html b/public/tts/voice-cloning.html index 2aa6939..b43bc28 100644 --- a/public/tts/voice-cloning.html +++ b/public/tts/voice-cloning.html @@ -52,6 +52,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Qwen3-TTS
  • diff --git a/public/uncloseai-js.html b/public/uncloseai-js.html index 27b470a..9b399ca 100644 --- a/public/uncloseai-js.html +++ b/public/uncloseai-js.html @@ -63,6 +63,7 @@
  • Rust Examples
  • Swift Examples
  • uncloseai.js Docs
  • +
  • uncloseai-cli
  • Inference Setup
  • Text-to-Speech
  • Our Crawler