Skip to content

ynishi/orcs-cli

Repository files navigation

ORCS CLI

CI crates.io docs.rs License: MIT OR Apache-2.0 MSRV: 1.80.0 Rust

Lua-extensible Agentic Shell for building AI-powered development tools.

ORCS (Orchestrated Runtime Component System) provides a component-based architecture where every behavior is implemented as a Lua script, capability-gated, and sandboxed.

Part of the ORCS family — a suite of multi-agent AI tools built around orchestrated reasoning and collaboration. See also ORCS Desktop for the GUI workspace application.

Prerequisites

  • Rust 1.80.0 or later

Features

  • Lua-first extensibility -- All components (agents, skills, tools) are Lua scripts
  • Capability-gated APIs -- LLM, HTTP, exec, file I/O each require explicit capability grants
  • Sandbox isolation -- Path traversal prevention, Lua stdlib restrictions, input sanitization
  • Multi-provider LLM -- Ollama, OpenAI, Anthropic via config.toml
  • ActionIntent system -- Unified tool dispatch with IntentRegistry, LLM tool_use auto-resolution, and dynamic intent registration
  • Skill recommendation -- LLM-based or keyword-based skill matching with automatic tool registration
  • Session persistence -- Pause/resume with component state snapshot
  • Hook system -- FQL-based lifecycle hooks for pre/post processing
  • Human-in-the-loop -- Approval workflows for destructive operations

Install

cargo install orcs-cli

Or from source:

cargo build --release
# Binary at target/release/orcs

Quick Start

Run with default builtins

orcs

Run with verbose output

orcs --verbose

Run in sandbox mode (isolated environment)

orcs --sandbox

Resume a previous session

orcs --resume <SESSION_ID>

Create a Lua component

-- ~/.orcs/components/hello.lua
return {
    id = "hello",
    namespace = "custom",
    subscriptions = {"Hello"},

    init = function(cfg)
        orcs.log("info", "Hello component initialized")
    end,

    on_request = function(request)
        if request.operation == "greet" then
            local name = request.payload or "world"
            return { success = true, data = "Hello, " .. name .. "!" }
        end
        return { success = false, error = "unknown operation" }
    end,

    on_signal = function(sig)
        return "Handled"
    end,

    shutdown = function()
        orcs.log("info", "Goodbye")
    end,
}

Add it to config.toml:

[components]
load = ["agent_mgr", "skill_manager", "hello"]

CLI

orcs [OPTIONS] [COMMAND]...
Flag Description
-d, --debug Enable debug logging
-v, --verbose Verbose output
-C, --project <PATH> Project root directory
--resume <ID> Resume an existing session
--profile <NAME> Profile name (ORCS_PROFILE)
--experimental Enable experimental components (ORCS_EXPERIMENTAL)
--sandbox [DIR] Sandbox mode (optional dir, defaults to tempdir)
--builtins-dir <PATH> Override builtins directory (ORCS_BUILTINS_DIR)
--install-builtins Install/update builtin components and exit

Lua API

File I/O (Sandbox-gated)

Function Returns Description
orcs.read(path) {ok, content, size} Read file contents
orcs.write(path, content) {ok, bytes_written} Write file (atomic)
orcs.grep(pattern, path) {ok, matches[], count} Regex search
orcs.glob(pattern, dir?) {ok, files[], count} Glob pattern search
orcs.mkdir(path) {ok} Create directory with parents
orcs.remove(path) {ok} Remove file or directory
orcs.mv(src, dst) {ok} Move / rename
orcs.scan_dir(config) table[] Directory scan with include/exclude
orcs.parse_frontmatter(path) {frontmatter, body, format} Parse file frontmatter

Execution (Capability::EXECUTE)

Function Returns Description
orcs.exec(cmd) {ok, stdout, stderr, code} Shell command execution
orcs.exec_argv(program, args, opts?) {ok, stdout, stderr, code} Direct execution (no shell)

LLM (Capability::LLM)

Function Returns Description
orcs.llm(prompt, opts?) {ok, content, model, session_id, stop_reason, intents} LLM chat completion
orcs.llm_ping(opts?) {ok, provider, base_url, latency_ms} Provider health check
orcs.llm_dump_sessions() string Export session history as JSON
orcs.llm_load_sessions(json) {ok, count} Restore session history from JSON

LLM opts support tools (default true), resolve (default false), and max_tool_turns (default 10) for automatic tool_use dispatch.

Intent Dispatch

Function Returns Description
orcs.dispatch(name, args) table Unified intent dispatcher (8 builtins + dynamic)
orcs.intent_defs() table[] Intent definitions in JSON Schema format
orcs.register_intent(def) {ok, error} Register a Component-backed intent at runtime
orcs.tool_schemas() table[] Legacy tool schema format (backward compat)
orcs.tool_descriptions() string Formatted tool descriptions for prompts

HTTP (Capability::HTTP)

Function Returns Description
orcs.http(method, url, opts?) {ok, status, headers, body} HTTP request

Component Communication

Function Returns Description
orcs.request(target, op, payload) table Component-to-component RPC
orcs.request_batch(requests) table[] Parallel RPC batch
orcs.output(msg) nil Emit output event
orcs.output_with_level(msg, level) nil Emit leveled output event
orcs.emit_event(category, op, payload) nil Broadcast extension event
orcs.board_recent(n) table[] Query shared board

Child Management

Function Returns Description
orcs.spawn_child(config) {ok, id} Spawn child entity
orcs.send_to_child(id, msg) {ok, result} Send message to child
orcs.send_to_children_batch(ids, inputs) table[] Parallel batch send
orcs.spawn_runner(config) {ok, fqn, channel_id} Spawn a ChannelRunner
orcs.child_count() number Current child count
orcs.max_children() number Max allowed children

Serialization & Utilities

Function Returns Description
orcs.json_parse(str) value Parse JSON string
orcs.json_encode(value) string Encode to JSON
orcs.toml_parse(str) value Parse TOML string
orcs.toml_encode(value) string Encode to TOML
orcs.sanitize_arg(s) {ok, value, violations} Command argument validation
orcs.sanitize_path(s) {ok, value, violations} Path validation
orcs.sanitize_strict(s) {ok, value, violations} Strict validation (all rules)
orcs.log(level, msg) nil Structured logging
orcs.pwd string Sandbox root path
orcs.git_info() {ok, branch, commit_short, dirty} Git repository info
orcs.load_lua(content, name?) value Evaluate Lua in sandbox
orcs.check_command(cmd) {status, reason?} Check command permission
orcs.grant_command(pattern) nil Grant command pattern
orcs.request_approval(op, desc) approval_id HIL approval request

Configuration

Create config.toml in your project root (or ~/.orcs/config.toml for global):

[components]
load = ["agent_mgr", "skill_manager", "profile_manager", "foundation_manager", "console_metrics", "shell", "tool"]

[components.settings.agent_mgr]
llm_provider = "ollama"
llm_model = "llama3.2:latest"
llm_base_url = "http://localhost:11434"
# llm_api_key = ""         # for openai/anthropic
prompt_placement = "both"   # "top" | "both" | "bottom"

[components.settings.skill_manager]
recommend_skill = true
# recommend_llm_provider = "ollama"
# recommend_llm_model = "llama3.2:latest"

[hil]
auto_approve = false
timeout_ms = 30000

[ui]
verbose = false
color = true

[[hooks.hooks]]
id = "audit"
fql = "builtin::*"
point = "request.pre_dispatch"
script = "hooks/audit.lua"

Builtin Components

Component Description
agent_mgr Agent manager with LLM worker spawning and skill intent registration
skill_manager Skill catalog, recommendation, and execution
profile_manager User profile and preferences
foundation_manager Foundation/system prompt management
console_metrics Console output metrics
shell Interactive shell commands
tool Tool execution bridge
life_game Conway's Game of Life (experimental, --experimental)

Architecture

Layer 4: Frontend
  orcs-cli --- main.rs, Args, CliConfigResolver, --sandbox

Layer 3: Application
  orcs-app --- OrcsApp, OrcsAppBuilder, builtins expansion

Layer 2: Runtime (Internal)
  orcs-runtime --- Engine, Channel, World, Config, Session, Sandbox, IO

Layer 1.5: Hooks
  orcs-hook --- HookDef, HooksConfig, FQL-based lifecycle hooks

Layer 1: Plugin SDK
  orcs-component --- Component, Child, Agent, Skill traits
  orcs-event --- Signal, Request, Response
  orcs-types --- ComponentId, ActionIntent, IntentDef, IntentRegistry
  orcs-auth --- Capability, Permission, SandboxPolicy

Plugin Implementation:
  orcs-lua --- LuaComponent, LuaChild, orcs.* API, IntentRegistry, ScriptLoader

Dev Tools:
  orcs-lint --- Architecture lint (OL002: no unwrap, layer dependency checks)

Documentation

API documentation is generated from source via rustdoc. Each crate has module-level documentation with architecture diagrams, usage examples, and security notes.

cargo doc --workspace --no-deps --open

Contributing

Bug reports, feature requests, and questions are welcome via GitHub Issues.

License

Licensed under either of

at your option.

About

No description, website, or topics provided.

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

 
 
 

Contributors