{"id":51339722,"url":"https://github.com/semcod/env2llm","last_synced_at":"2026-07-02T06:04:58.040Z","repository":{"id":362941587,"uuid":"1261363198","full_name":"semcod/env2llm","owner":"semcod","description":"Generate environment maps (services, artifacts, env vars) for LLM decision-making","archived":false,"fork":false,"pushed_at":"2026-06-18T11:24:05.000Z","size":1202,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-18T12:28:24.381Z","etag":null,"topics":["environment","llm","mcp","python","semcod"],"latest_commit_sha":null,"homepage":"https://semcod.github.io/env2llm/","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/semcod.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-06T15:31:23.000Z","updated_at":"2026-06-18T12:01:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/semcod/env2llm","commit_stats":null,"previous_names":["semcod/env2llm"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/semcod/env2llm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fenv2llm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fenv2llm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fenv2llm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fenv2llm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/semcod","download_url":"https://codeload.github.com/semcod/env2llm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/semcod%2Fenv2llm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35035011,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-02T02:00:06.368Z","response_time":173,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["environment","llm","mcp","python","semcod"],"created_at":"2026-07-02T06:04:57.237Z","updated_at":"2026-07-02T06:04:58.032Z","avatar_url":"https://github.com/semcod.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# env2llm\n\n\n## AI Cost Tracking\n\n![AI Cost](https://img.shields.io/badge/AI%20Cost-$5.82-yellow) ![AI Model](https://img.shields.io/badge/AI%20Model-openrouter%2Fqwen%2Fqwen3-coder-next-lightgrey)\n\nThis project uses AI-generated code. Total cost: **$5.8167** with **10** AI commits.\n\nGenerated on 2026-06-29 using [openrouter/qwen/qwen3-coder-next](https://openrouter.ai/models/openrouter/qwen/qwen3-coder-next)\n\n---\n\nGenerate **environment maps** for LLM agents: available services, commands, artifacts,\nmasked environment variables, and runtime policies.\n\nDefault output is DOQL-flavored LESS (`environment.doql.less`), compatible with\n[nlp2dsl](https://github.com/wronai/nlp2dsl) examples:\n\n```less\nenvironment[name=\"03-report-and-notify\"] {\n  NLP2DSL_BACKEND_URL: \"http://localhost:8010\";\n  LLM_MODEL: \"openrouter/...\";\n}\n\nruntimes[0] { id: \"orchestrator:nlp-service\"; kind: \"orchestrator\"; ... }\ncommands[3] { name: \"generate_report\"; required: \"report_type\"; ... }\n```\n\n## Install\n\n```bash\ncd env2llm\npip install -e \".[dev]\"\n```\n\n## CLI\n\n```bash\n# From an nlp2dsl example directory\nenv2llm /path/to/nlp2dsl/examples/03-report-and-notify\n\n# Other formats\nenv2llm . --format yaml\nenv2llm . --format json\nenv2llm . --format markdown\n\n# Optional: attach live Linux desktop snapshot (GNOME/X11 via wmctrl/xdotool)\nenv2llm . --probe-desktop\n# or: ENV2LLM_DESKTOP_PROBE=1 env2llm .\n\n# Koru projects: auto-attach MCP tool catalog (koru_list_tickets, …) when koruapi installed\nenv2llm . --probe-mcp\n# or auto when cwd is a Koru repo with koruapi on PYTHONPATH\n```\n\nWrites to `.nlp2dsl/registry/environment.\u003cext\u003e` (and mirrors legacy paths for DOQL).\n\n### Desktop / GUI probe (optional)\n\nWhen `--probe-desktop` or `ENV2LLM_DESKTOP_PROBE=1` is set, env2llm adds:\n\n- `desktop { canvas_width, canvas_height, compositor, display_server, ... }`\n- `desktop_displays[N] { id, output, left, top, width, height, is_primary, index }` — full multi-monitor layout (`xrandr` or `mss`)\n- `desktop_pointer { x, y, display_id, display_x, display_y, ... }` — mouse position in global and display-local coords (`xdotool`)\n- `desktop_ide_calibrations[N] { ide, chat_x, chat_y, config_path, display_id, ... }` — Koru OS-injector chat anchors from `~/.koru/ide-os-injector.json` and `\u003cproject\u003e/.koru/ide-os-injector.json`\n- `desktop_windows[N] { title, x, y, width, height, ... }` — top-level windows (`wmctrl`)\n- runtime `probe:desktop` (`desktop://session`) for GUI automation via nlp2uri\n- commands `desktop_focus_window`, `desktop_move_window`, `desktop_screenshot_*`, `desktop_open_app`\n- summary keys in `data` (`desktop.displays`, `desktop.pointer`, `desktop.pointer_display`, `desktop.window_titles`, …)\n\n**Requires** (Linux): `xrandr` (preferred) or Python `mss` for monitor layout; `xdotool` for pointer;\n`wmctrl` for window titles/geometry. Headless hosts get `status: unknown` without failing workflow maps.\n\n### Host probe (cron, ports, processes, containers, agents)\n\nWhen `--probe-host` or `ENV2LLM_HOST_PROBE=1` (default **on** for project dirs), env2llm adds:\n\n- `host { hostname, cron_taskinity_installed, capabilities_available, … }`\n- `host_cron[N] { schedule, command, marker }` — parsed from `crontab -l`\n- `host_endpoint[N] { id, url, ok }` — agents `:8101–8130`, WWW `:8788`\n- `host_port[N] { port, address, pid, process }` — selected listening ports from `ss -ltnp`\n- `host_process[N] { pid, command, args }` — relevant runtime processes (`uvicorn`, `docker`, `hypervisor`, monitors)\n- `host_container[N] { name, image, state, project, service }` — current `docker ps` snapshot\n- `host_agent[N] { id, ok, runtime_status, effective_health_uri, recommended_action }` — `hypervisor inspect-agent`\n- `host_examples_test { pass, fail, skip, … }` — from `output/examples/comprehensive_report.json` when present\n- `host_monitor_log_tail { line_N }` — tail of `/tmp/taskinity-monitor.log`\n- `schedules[N]` — cron lines mirrored for workflow planners\n\n```bash\nenv2llm /path/to/hypervisor --probe-host\nENV2LLM_HOST_PROBE=1 env2llm . -f json\n```\n\n**Browser window titles** are detected heuristically (Firefox, Chrome, Edge, …). Page DOM/content\nis not scraped — use **testql** / Playwright for that layer.\n\n## Python API\n\n```python\nfrom env2llm import RegistryService, ensure_environment_map, render_format, generate_system_map\n\npath = ensure_environment_map(\"examples/03-report-and-notify\")\nir = generate_system_map(\"examples/03-report-and-notify\", example_id=\"03-report-and-notify\")\nyaml_text = render_format(ir, \"yaml\")\n\n# Live registry service (load / refresh / render / MQTT)\nservice = RegistryService(\".\", project_id=\"my-app\")\nregistry_json = service.render(\"json\")\n```\n\n## REST API (`env2llm-serve`)\n\n```bash\nenv2llm-serve --project . --port 8770\n# optional MQTT fan-out:\nENV2LLM_MQTT_ENABLED=1 env2llm-serve --project . --mqtt\n```\n\n| Method | Path | Opis |\n|--------|------|------|\n| `GET` | `/health` | status |\n| `GET` | `/v1/registry?format=json\\|yaml\\|doql\\|md\u0026refresh=1` | registry |\n| `POST` | `/v1/registry/refresh` | regenerate + persist (+ MQTT) |\n| `GET` | `/v1/registry/desktop` | desktop probe slice |\n| `GET` | `/v1/registry/commands` | command schemas |\n| `GET` | `/v1/registry/uris` | nlp2uri URI index (needs `nlp2uri[envmap]`) |\n| `GET` | `/v1/registry/mqtt` | MQTT bridge status |\n\n## MCP (`env2llm-mcp`)\n\n```json\n{\n  \"mcpServers\": {\n    \"env2llm\": {\n      \"command\": \"env2llm-mcp\",\n      \"args\": [\"--project\", \"/path/to/project\"],\n      \"env\": { \"ENV2LLM_MQTT_ENABLED\": \"1\" }\n    }\n  }\n}\n```\n\nTools: `env2llm_get_registry`, `env2llm_render_registry`, `env2llm_refresh_registry`,\n`env2llm_get_desktop`, `env2llm_list_commands`, `env2llm_list_uris`, `env2llm_mqtt_status`.\n\n## MQTT (`env2llm-mqtt`)\n\nRequires `pip install 'env2llm[mqtt]'` (paho-mqtt).\n\n```bash\n# Standalone bridge: listen for refresh, publish retained snapshots\nENV2LLM_MQTT_ENABLED=1 env2llm-mqtt bridge --project .\n\n# One-shot publish\nenv2llm-mqtt publish --project . --probe-desktop\n```\n\nTopics (prefix `env2llm`):\n\n| Topic | Retain | Zawartość |\n|-------|--------|-----------|\n| `{prefix}/{project}/registry` | yes | full `SystemMapIR` JSON |\n| `{prefix}/{project}/registry/desktop` | yes | desktop probe slice |\n| `{prefix}/{project}/events` | no | refresh/metadata events |\n| `{prefix}/{project}/registry/refresh` | — | subscribe: trigger refresh |\n\n| Variable | Default |\n|----------|---------|\n| `ENV2LLM_MQTT_ENABLED` | off |\n| `ENV2LLM_MQTT_HOST` | `127.0.0.1` |\n| `ENV2LLM_MQTT_PORT` | `1883` |\n| `ENV2LLM_MQTT_TOPIC_PREFIX` | `env2llm` |\n| `ENV2LLM_MQTT_USERNAME` / `PASSWORD` | optional |\n\n## Output formats\n\n| Format | File | Use case |\n|--------|------|----------|\n| `doql.less` | `environment.doql.less` | LLM + nlp2dsl orchestrator (default) |\n| `yaml` | `environment.yaml` | Tooling, human edit |\n| `json` | `environment.json` | APIs, CI |\n| `markdown` | `environment.md` | Prompt injection summary |\n\n## Environment variables\n\n| Variable | Purpose |\n|----------|---------|\n| `NLP2DSL_BACKEND_URL` | Gateway service URL |\n| `NLP2DSL_NLP_SERVICE_URL` | NLP orchestrator URL |\n| `NLP2DSL_WORKER_URL` | Worker executor URL |\n| `LLM_MODEL` | LLM provider/model id |\n| `ENV2LLM_CONTEXT` | Path to generated map (set after bootstrap) |\n| `ENV2LLM_DESKTOP_PROBE` | `1` to attach live desktop snapshot (same as `--probe-desktop`) |\n| `NLP2DSL_DOQL_CONTEXT` | Alias for nlp2dsl compatibility |\n\nSecrets (`*_KEY`, `*_TOKEN`) are masked in output.\n\n## Extraction from nlp2dsl\n\nThis package contains the former `nlp2dsl_sdk` modules:\n\n- `doql/` — parse/render runtime context\n- `ir.py` — `SystemMapIR` schema (`env2llm.system_map.v1`)\n- `generate.py`, `bridge.py`, `runtimes.py` — introspection pipeline\n- `registry.py` — live registry refresh after workflow steps\n- `policy/` — process and invoice policies from `example-profiles.yaml`\n\nnlp2dsl can depend on `env2llm` and replace direct imports over time.\n\n\n## License\n\nLicensed under Apache-2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fenv2llm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsemcod%2Fenv2llm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsemcod%2Fenv2llm/lists"}