From 62b8b1c14b42a455b161dd0eff496ff08ecbd753 Mon Sep 17 00:00:00 2001 From: h Date: Fri, 28 Aug 2026 02:10:17 +0200 Subject: [PATCH] feat(config,compose): prompt tags in config, voice granule folder, runner config dir and .claude.json in entrypoint --- README.md | 7 ++++--- config.py | 39 ++++++++++++++++++++++++++++++--------- docker-compose.yml | 1 + 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index e510140..346f637 100644 --- a/README.md +++ b/README.md @@ -59,9 +59,10 @@ container, no dialogs. The token draws from your subscription limits like regular Claude Code; rotate it by running `claude setup-token` again. Claude agents run on the Claude Agent SDK. Prompts are granules under -`мета/бобер/промпты/` in the vault, skills are the folders under -`мета/бобер/скиллы/` (each becomes a plugin), so the vault must be synced -before the gateway can start. The model process runs as `beaver-runner` +`мета/бобер/промпты/` in the vault - plain markdown, the `` wrappers +and the order live in `config.py`; skills are the folders under +`мета/бобер/скиллы/` (each becomes a plugin, keep `name:` in SKILL.md +latin). The vault must be synced before the gateway can start. The model process runs as `beaver-runner` with a whitelisted environment; the vault is read-only for it except `мета/бобер` and `💬 чаты`. diff --git a/config.py b/config.py index 86826ac..9000cd8 100644 --- a/config.py +++ b/config.py @@ -22,22 +22,43 @@ PROMPTS = BEAVER / "промпты" GRANULES = PROMPTS / "гранулы" SKILLS = BEAVER / "скиллы" -VOICE = GRANULES / "голос.md" -PROFILE = PROMPTS / "профиль.md" -CORRECTIONS = PROMPTS / "поправки.md" -VAULT_MAP = GRANULES / "карта-vault.md" +# Гранулы - чистый markdown; xml-теги, в которые они заворачиваются, +# живут здесь. Голос - папка, файл на тег, в этом порядке. +VOICE = tuple( + (tag, GRANULES / "голос" / f"{tag}.md") + for tag in ( + "role", + "philosophy", + "user_profile", + "operating_modes", + "how_you_operate", + "interaction_guidelines", + ) +) +PROFILE = ("profile", PROMPTS / "профиль.md") +CORRECTIONS = ("corrections", PROMPTS / "поправки.md") +VAULT_MAP = ("vault_map", GRANULES / "карта-vault.md") + + +def environment(kind: str) -> tuple[str, Path]: + return ("environment", GRANULES / "окружения" / f"{kind}.md") + + +def overlay(tag: str, name: str) -> tuple[str, Path]: + return (tag, GRANULES / f"{name}.md") + # §4.2: сборки промптов. Окружение kind'а - константная гранула, экземплярное # (файл, топик) едет первым сообщением. Диспетчер/дистиллятор/триаж - M1b+. DEEP_PROMPT = ( - VOICE, + *VOICE, PROFILE, CORRECTIONS, VAULT_MAP, - GRANULES / "окружения" / "глубокий.md", - GRANULES / "глубокий.md", + environment("глубокий"), + overlay("deep", "глубокий"), ) -QUICK_PROMPT = (VOICE, PROFILE, GRANULES / "быстрый.md") +QUICK_PROMPT = assemble((*VOICE, PROFILE, overlay("quick", "быстрый"))) # §4.3: наборы скиллов = папки = плагины. Глубокие грузят общие + vault. DEEP_SKILLS = (SKILLS / "общие", SKILLS / "vault") @@ -139,7 +160,7 @@ def raycast(name: str, model: str, reasoning_effort: str | None = None) -> Rayca return RaycastAgent( name=name, model=model, - system_prompt=assemble(QUICK_PROMPT), + system_prompt=QUICK_PROMPT, reasoning_effort=reasoning_effort, available_native_tools=(RemoteTool.WEB_SEARCH, RemoteTool.READ_PAGE), user_preferences=UserPrefsRu, diff --git a/docker-compose.yml b/docker-compose.yml index c30afbd..be46b51 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -81,6 +81,7 @@ services: set -e runner=beaver-runner mkdir -p /home/$$runner/.claude + [ -e /home/$$runner/.claude/.claude.json ] || echo '{}' > /home/$$runner/.claude/.claude.json chown -R $$runner /home/$$runner for d in "/vault/мета/бобер" "/vault/💬 чаты"; do setfacl -R -m "u:$$runner:rwX" -m "d:u:$$runner:rwX" "$$d" \