Skip to main content

gillm

GUI Control Plugin with NLP & Intent Contracts

Sterowanie GUI przez DSL, NLP i wiele adapterów wejścia (CLI, REST, MCP, URI). Domena (focus, inject, capture, orchestrator) żyje w src/gillm/; warstwa kontroli w packages/*2gillm.

PyPI Version Python License

AI Cost Tracking

PyPI Version Python License AI Cost Human Time Model

  • 🤖 LLM usage: $2.6608 (19 commits)
  • 👤 Human dev: ~$1494 (14.9h @ $100/h, 30min dedup)

Generated on 2026-07-03 using openrouter/qwen/qwen3-coder-next


Graphical interface for LLM automation in the semcod/coru ecosystem. Pair with tillm for text / shell control (aider, claude, codex, …).

Package Interface Role
gillm graphical GUI domain + *2gillm adapters (REST, MCP, URI, NLP)
tillm text / shell vendor CLI drive, NLP → shell DSL

Contents

Architecture

SUMD (description) → DOQL/source (code) → taskfile (automation) → testql (verification)

Sources: SUMD.md · app.doql.less · Makefile

flowchart TB
  subgraph adapters [Input adapters — packages]
    NL[nlp2gillm]
    URI[uri2gillm]
    CLI[cli2gillm]
    MCP[mcp2gillm]
    REST[rest2gillm]
  end

  subgraph control [Control layer]
    TXT[DSL text line]
    DICT[JSON dict]
    PBIN[protobuf bytes]
    SCH[JSON Schema validate]
    DSL[dsl2gillm.dispatch]
    Q[QueryHandler]
    C[CommandHandler]
    ES[(EventStore)]
  end

  subgraph domain [Domain — src/gillm]
    ORCH[orchestrator.drive]
    FOCUS[focus / injection]
    CAPTURE[capture]
    NLP[nlp_bridge]
  end

  NL --> TXT
  URI --> TXT
  CLI --> TXT
  MCP --> TXT
  MCP --> DICT
  MCP --> PBIN
  REST --> TXT
  REST --> DICT
  REST --> PBIN

  TXT --> SCH
  DICT --> SCH
  PBIN --> SCH
  SCH --> DSL
  DSL --> Q
  DSL --> C
  C --> ORCH
  C --> ES
  Q --> ORCH
  Q --> FOCUS
  Q --> CAPTURE
  Q --> NLP

Jedyny punkt mutacji w warstwie kontroli: dsl2gillm.dispatch().

Control layer packages

Package Role Docs
dsl2gillm DSL grammar, JSON Schema, Protobuf, CQRS bus, EventStore README
uri2gillm gillm:// URI → DSL line → dispatch() README
nlp2gillm Natural language → DSL (to-dsl); apply = dispatch README
cli2gillm Shell REPL / exec / run README
mcp2gillm MCP stdio (gillm_run_command, gillm_run_command_pb, …) README
rest2gillm FastAPI /v1/dsl, default port 8220 README

Overview: packages/README.md.

Installation

Runtime (core GUI domain only):

pip install -e .
# or: make install

Development (control layer + test tooling):

bash packages/install-dev.sh
# or: pip install -e ".[dev]"
# or: make dev-install

Optional control extras without full dev stack:

pip install -e ".[control]"

Requires Python ≥ 3.10.

Quick start

# Schema + dry-run workflow (no real GUI)
dsl2gillm validate-schema
gillm run fixtures/workflow.json --dry-run
gillm run fixtures/workflow-dry.json --dry-run

# NLP → DSL
nlp2gillm to-dsl "check health"

# REST smoke test (separate terminal)
rest2gillm serve --port 8220
curl http://127.0.0.1:8220/health
curl -X POST http://127.0.0.1:8220/v1/dsl -d 'HEALTH'

DSL verbs

Type Verbs
Query HEALTH, ORIENT, PARSE, ACTIONS, VALIDATE, RESOLVE, CAPTURE
Command EXECUTE, SIMULATE, FOCUS, INJECT

Example lines:

HEALTH
ORIENT
ACTIONS
PARSE "focus vscode and type hello"
VALIDATE STEPS [{"action":"wait","config":{"seconds":0.01}}]
RESOLVE "capture screen"
CAPTURE SCALE 0.2
EXECUTE FILE workflow.json
SIMULATE FILE workflow.json
FOCUS HINTS vscode,cursor
INJECT "hello" IDE default

Generate Pydantic models from JSON schemas:

python -m dsl2gillm.codegen
# or: dsl2gillm codegen

CLI

Entry point Purpose Docs
gillm Legacy CLI: run, nlp, capture (delegates to dsl2gillm.dispatch) README
dsl2gillm DSL bus: -c 'HEALTH', validate-schema, codegen, protobuf codecs README
nlp2gillm NL → DSL translation README
uri2gillm gillm:// URI resolution README
cli2gillm Interactive shell README
mcp2gillm MCP server README
rest2gillm FastAPI server (serve --port 8220) README
gillm run fixtures/workflow-dry.json --dry-run
gillm nlp "focus vscode and type hello" --dry-run
gillm capture --scale 0.2
dsl2gillm -c 'HEALTH'

REST API

GET / returns an endpoint map. Default base URL: http://127.0.0.1:8220/.

rest2gillm serve --port 8220
curl http://127.0.0.1:8220/
curl http://127.0.0.1:8220/health
curl -X POST http://127.0.0.1:8220/v1/dsl -d 'HEALTH'

Environment variables

Copy .env.example to .env for local development.

Variable Default Description
OPENROUTER_API_KEY (not set) OpenRouter API key (keys)
LLM_MODEL openrouter/qwen/qwen3-coder-next LLM model for NLP / pfix
PFIX_AUTO_APPLY true Apply fixes without asking
PFIX_AUTO_INSTALL_DEPS true Auto pip/uv install
PFIX_AUTO_RESTART false Restart process after fix
PFIX_MAX_RETRIES 3 Max self-heal retries
PFIX_DRY_RUN false Dry-run mode
PFIX_ENABLED true Enable pfix
PFIX_GIT_COMMIT false Auto-commit fixes
PFIX_GIT_PREFIX pfix: Commit message prefix
PFIX_CREATE_BACKUPS false Disable .pfix_backups/

GUI injection (Wayland/X11) also reads KORU_* variables — see SUMD.md for the full list (KORU_OS_INJECTOR, KORU_INJECTOR_BACKEND, WAYLAND_DISPLAY, DISPLAY, …).

Testing

Core domain (src/gillm):

python -m pytest tests/ -q
# or: make test

Main modules:

  • tests/test_injector.pygillm.injection.injector.Injector (keyboard backends: xdotool/ydotool/wtype)
  • tests/test_os_injector.py — calibrated profiles under ~/.koru/ide-os-injector.json
  • tests/test_gui_driver.py, tests/test_drive_backend.py, tests/test_recovery.py

Control layer (packages/*2gillm):

python -m pytest packages/dsl2gillm/tests packages/uri2gillm/tests packages/nlp2gillm/tests \
       packages/cli2gillm/tests packages/mcp2gillm/tests packages/rest2gillm/tests -q

Makefile shortcuts: make test-fast, make test-unit, make test-integration, make test-slow.

Koru keeps integration tests only (daemon wire protocol, IDE shims, CLI). Do not re-add duplicate injector unit tests under koru/tests/.

Project layout

gillm/
├── src/gillm/          # GUI domain: focus, injection, capture, orchestrator, recovery
├── packages/           # Control adapters: dsl2gillm, uri2gillm, nlp2gillm, cli2gillm, mcp2gillm, rest2gillm
├── tests/              # Domain unit tests
├── fixtures/           # Workflow JSON for dry-run smoke tests
├── app.doql.less       # DOQL application declaration
├── SUMD.md             # Structured Unified Markdown Descriptor (full project spec)
└── pyproject.toml

Documentation

Document Purpose
README.md User guide (this file)
SUMD.md Full Structured Unified Markdown Descriptor — DOQL, interfaces, env vars, call graph, test contracts
SUMR.md Compact SUMD for refactoring (call graph, duplication, evolution)
packages/README.md Control layer architecture, smoke tests, DSL verbs
app.doql.less DOQL application declaration (source of truth for entities/workflows)
CHANGELOG.md Release history
project/README.md Generated code analysis artifacts (*.toon.yaml, Mermaid)
project/context.md LLM-ready architecture narrative
packages/CONTROL_LAYER_PROMPT.template.md Template for extending *2gillm adapters

Per-package docs: dsl2gillm · uri2gillm · nlp2gillm · cli2gillm · mcp2gillm · rest2gillm

License

Licensed under Apache-2.0.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gillm-0.1.16.tar.gz (59.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gillm-0.1.16-py3-none-any.whl (59.1 kB view details)

Uploaded Python 3

File details

Details for the file gillm-0.1.16.tar.gz.

File metadata

  • Download URL: gillm-0.1.16.tar.gz
  • Upload date:
  • Size: 59.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for gillm-0.1.16.tar.gz
Algorithm Hash digest
SHA256 8095b9502f88c3a08a8ddf9f7bb20d3b7f6e4dac579fcc9903f78109de77a170
MD5 9f6dcefd9e7fefa19ad3310f6e3d2772
BLAKE2b-256 c0a8db9363dfe9232d4e36061151f6ebdcfe92b7b5ed7a39cfb08cc6a6002aa1

See more details on using hashes here.

File details

Details for the file gillm-0.1.16-py3-none-any.whl.

File metadata

  • Download URL: gillm-0.1.16-py3-none-any.whl
  • Upload date:
  • Size: 59.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for gillm-0.1.16-py3-none-any.whl
Algorithm Hash digest
SHA256 b6717ef33509c3ea08e4a10441654f4c4c6e2efa7d73f3fb97dc46f2c2ce7bec
MD5 9590ffc07d991d1d2c2e2a7c670c5b54
BLAKE2b-256 ba367ddb9f46f8e2eed077ddcde2bfa87e6c1f2524947205e55421a9621e7ead

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page