Port the sssf skill from ~/.agents/skills/sssf into this repo so it can be distributed and installed with the skills CLI (skills add INDigitalStudio/skills --skill sssf). - Copy the skill (SKILL.md, cookbooks, references, scripts, templates, and the visualizer app source) into sssf/. - Gitignore build/runtime artifacts: the visualizer's node_modules/ and dist/, Python bytecode, and the machine-specific repos.json. - Make the skill location-independent: install.py now stamps the skill's real path into the stamped justfile's skill_dir (replacing the hardcoded ~/.agents/skills/sssf), so 'just obs' finds the visualizer wherever the CLI installed the skill. - Update cookbooks to use <skill>/scripts/... instead of the hardcoded path, and document the skills CLI install command. - Update the repo README with install instructions.
3.3 KiB
Create Config
Generate sssf.config.yaml — the agent roster for a target repo.
Generate it
uv run <skill>/scripts/make_config.py
<skill> is the directory this skill was installed into (e.g. ~/.agents/skills/sssf or a repo's .claude/skills/sssf).
Writes adws/adw_sssf_config/sssf.config.yaml — creating the directory if needed — with the starter agents (planner, builder, scout, reviewer, documenter) wired to the prompt files /sssf install stamped into adws/adw_data/prompt_engineering/. That path is the default every ADW and the justfile look for; --config overrides it. make_config.py refuses to overwrite an existing config unless you pass --force, so retuning an existing roster is a hand edit — see update_config.md.
The rule
One agent, one prompt, one purpose. An entry defines who an agent is: its coding agent, model, thinking level, and exactly one system prompt plus one user prompt. How it gets used — the output type, a per-call user prompt override — lives at the ADW call site, never here.
Schema
defaults:
coding_agent: pi # v1: pi only (claude_code is specced, stubbed until v2)
model: google/gemini-3.6-flash # ALWAYS provider/model-id — a bare id is ambiguous
thinking: medium # off | minimal | low | medium | high | xhigh | max
harness_engineering: [] # pi extension names
data_dir: adws/adw_data # runtime home: {data_dir}/sessions/{adw_id}/{agent_name}/
observability:
db: adws/adw_data/sssf.db # tracer writes here; the UI polls it
poll_ms: 500 # visualizer live-poll cadence
agents:
- name: planner # ADW scripts name agents, never models
coding_agent: pi
model: google/gemini-3.6-flash
thinking: high
color: "#a78bfa" # optional hex — this agent's lane color in the visualizer
purpose: Turn a request into a plan the builder can implement without asking questions.
prompt_engineering:
system: adws/adw_data/prompt_engineering/planner/system.md
user: adws/adw_data/prompt_engineering/planner/user.md
- name: scout
thinking: high # unset keys fall through to defaults
purpose: Find and report where things live; change nothing.
prompt_engineering:
system: adws/adw_data/prompt_engineering/scout/system.md
user: adws/adw_data/prompt_engineering/scout/user.md
tools: # optional allowlist — omit the key entirely for all tools
- read
- bash
Every agent entry merges over defaults, so an entry only states what differs. Pi's builtin tools are read, bash, edit, write — a read-only recon agent gets [read, bash]; a builder omits tools altogether.
After generating
- Each agent needs its prompt pair to exist on disk:
adws/adw_data/prompt_engineering/{name}/system.mdanduser.md.agents.validate()fails the run at startup if either is missing. - Write
purposeas one sentence and make the system prompt say the same thing — the two should not drift. - Validate by running the smallest ADW that names your agents; a bad entry fails fast, before anything spawns.
Full field-by-field spec, thinking-level mapping, and model resolution: references/config.md. Retuning an existing roster: update_config.md.