Add sssf skill, installable via the skills CLI
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.
This commit is contained in:
parent
a42608f602
commit
2cc766aabe
98 changed files with 12508 additions and 0 deletions
97
sssf/templates/justfile
Normal file
97
sssf/templates/justfile
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
# SSSF starter recipes. Stamped by install.py, then yours to edit.
|
||||
#
|
||||
# Deliberately small. These are the handful you need on day one: run something,
|
||||
# watch it, and open the trace. Add your own as your chains grow, and see the
|
||||
# example branch for the fuller set (orchestrator agents, kill, rosters, ipi).
|
||||
|
||||
# `.env` reaches every ADW through this, so keys work without exporting them.
|
||||
set dotenv-load
|
||||
set positional-arguments
|
||||
|
||||
# Every recipe passes this through, so `SSSF_CONFIG=other.yaml just sdlc "..."`
|
||||
# swaps the whole roster for one run.
|
||||
config := env_var_or_default("SSSF_CONFIG", "adws/adw_sssf_config/sssf.config.yaml")
|
||||
db := "adws/adw_data/sssf.db"
|
||||
|
||||
# Where the sssf skill lives — the visualizer app ships with it. install.py
|
||||
# stamps the real path here at install time; edit it if you move the skill.
|
||||
skill_dir := "@SSSF_SKILL_DIR@"
|
||||
|
||||
# list every recipe
|
||||
default:
|
||||
@just --list
|
||||
|
||||
# ── first run ───────────────────────────────────────────────────────────────
|
||||
|
||||
# Proves the whole path works: config validated, session minted, agent ran,
|
||||
# envelope parsed, gates checked, trace written. Costs a few cents and changes
|
||||
# nothing in your repo, because both workflows are read-only.
|
||||
#
|
||||
# (`just --list` shows only the LAST comment line, so that one is the summary.)
|
||||
|
||||
# start here: two cheap read-only runs, end to end
|
||||
demo:
|
||||
@echo "1/2 adw_prompt: one agent, one prompt"
|
||||
uv run adws/adw_prompt.py --config {{config}} --agent scout "reply with a one-line summary of this repo"
|
||||
@echo "\n2/2 adw_scout: read-only recon"
|
||||
uv run adws/adw_scout.py --config {{config}} "list the top-level directories in this repo and what each is for. change nothing."
|
||||
@echo "\nboth done. now run: just sessions (or: just obs)"
|
||||
|
||||
# check the roster without running anything: names, prompts, models all resolve
|
||||
validate:
|
||||
uv run adws/adw_validate.py --config {{config}}
|
||||
|
||||
# ── run a workflow ──────────────────────────────────────────────────────────
|
||||
# Args pass straight through: "<prompt or path/to/prompt.md>" [--adw-id X]
|
||||
|
||||
# one agent, one prompt: just prompt "summarize this repo"
|
||||
prompt *ARGS:
|
||||
uv run adws/adw_prompt.py --config {{config}} "$@"
|
||||
|
||||
# read-only recon: just scout "where is auth handled"
|
||||
scout *ARGS:
|
||||
uv run adws/adw_scout.py --config {{config}} "$@"
|
||||
|
||||
# plan only: just plan "add a /health endpoint"
|
||||
plan *ARGS:
|
||||
uv run adws/adw_plan.py --config {{config}} "$@"
|
||||
|
||||
# planner, builder, commit: just plan-build "add a /health endpoint"
|
||||
plan-build *ARGS:
|
||||
uv run adws/adw_plan_build.py --config {{config}} "$@"
|
||||
|
||||
# plan, build, test, commit: just sdlc "add a /health endpoint"
|
||||
sdlc *ARGS:
|
||||
uv run adws/adw_plan_build_test.py --config {{config}} "$@"
|
||||
|
||||
# the full chain, plus review and docs: just simple-sdlc "add a /health endpoint"
|
||||
simple-sdlc *ARGS:
|
||||
uv run adws/adw_simple_sdlc.py --config {{config}} "$@"
|
||||
|
||||
# ── watch it ────────────────────────────────────────────────────────────────
|
||||
# Reads never block a running workflow, the db is WAL. Poll as hard as you like.
|
||||
|
||||
# the last 10 runs
|
||||
sessions:
|
||||
@sqlite3 {{db}} "select adw_id, status, substr(request,1,50), total_tokens, round(total_cost,4) from sessions order by started_at desc limit 10;"
|
||||
|
||||
# phase status in sequence: just phases <adw_id>
|
||||
phases ADW_ID:
|
||||
@sqlite3 {{db}} "select seq, name, kind, owner, status, attempt from phases where adw_id='{{ADW_ID}}' order by seq;"
|
||||
|
||||
# the live event tail: just tail <adw_id>
|
||||
tail ADW_ID:
|
||||
@sqlite3 {{db}} "select rowid, type, name, started_at from events where adw_id='{{ADW_ID}}' order by rowid desc limit 25;"
|
||||
|
||||
# what a run has alive right now, with pids: just procs <adw_id>
|
||||
procs ADW_ID:
|
||||
@sqlite3 {{db}} "select kind, name, pid, command, started_at from processes where adw_id='{{ADW_ID}}' and ended_at is null order by id;"
|
||||
|
||||
# ── observability UI ────────────────────────────────────────────────────────
|
||||
|
||||
# Needs bun. The db path is passed explicitly because the server runs from the
|
||||
# app dir and would otherwise look for a trace db sitting next to itself.
|
||||
|
||||
# boot the trace UI, http://localhost:4601 (api on :4600)
|
||||
obs:
|
||||
cd {{skill_dir}}/apps/visualizer && bun install && (SSSF_DB={{justfile_directory()}}/{{db}} bun run server/index.ts &) && bunx vite
|
||||
Loading…
Add table
Add a link
Reference in a new issue