From f56a2179455e35a76dfb8fead36d9cf5c2612eff Mon Sep 17 00:00:00 2001 From: Michael Sitarzewski Date: Sun, 21 Jun 2026 15:45:50 -0500 Subject: [PATCH] Add Osaurus tool target + document the division contract (#603) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tooling: add Osaurus (Anthropic Agent-Skills SKILL.md format) as a conversion and install target, wired into convert.sh (convert_osaurus + dispatch/valid/all/ parallel lists, --osaurus flag) and install.sh (detect/label/dest/install_osaurus + dispatch). Generated output lands in integrations/osaurus/agency-*/SKILL.md and is gitignored like every other tool's output (regenerate via convert.sh osaurus). Docs/guardrails — make the division contract discoverable, since it lived only in scattered script comments and tripped up multiple contributors: - CONTRIBUTING.md: complete the division list to all 16 (was missing academic/ gis/sales) and document that divisions.json is the source of truth (CI-checked by check-divisions.sh), how to propose a new division, and that strategy/ (NEXUS playbooks) and integrations/ (generated output) are NOT divisions. - install.sh: correct the stale "sync with convert.sh / lint-agents.sh" comment — install.sh intentionally keeps strategy/ in AGENT_DIRS (filtered at scan time), so it is deliberately NOT the same set as the other two. - .gitignore: ignore integrations/osaurus/agency-*/ (the osaurus output was the one tool whose generated files weren't excluded). Co-authored-by: Claude Opus 4.8 (1M context) --- .gitignore | 1 + CONTRIBUTING.md | 22 ++++++++++++++++++---- scripts/convert.sh | 37 +++++++++++++++++++++++++++++++++---- scripts/install.sh | 34 +++++++++++++++++++++++++++++++--- 4 files changed, 83 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 0d6ec02e..2c813018 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,4 @@ integrations/kimi/*/ !integrations/openclaw/README.md !integrations/kimi/README.md integrations/codex/agents/* +integrations/osaurus/agency-*/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index acdedd7b..9df8f912 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -31,20 +31,34 @@ This project and everyone participating in it is governed by our Code of Conduct Have an idea for a specialized agent? Great! Here's how to add one: 1. **Fork the repository** -2. **Choose the appropriate category** (or propose a new one): - - `engineering/` - Software development specialists +2. **Choose the appropriate division** (one of the 16 — or propose a new one): + - `academic/` - Research, scholarship, and domain-expert specialists - `design/` - UX/UI and creative specialists + - `engineering/` - Software development specialists - `finance/` - Financial planning, accounting, and investment specialists - `game-development/` - Game design and development specialists + - `gis/` - Geospatial, mapping, and spatial-analysis specialists - `marketing/` - Growth and marketing specialists - `paid-media/` - Paid acquisition and media specialists - `product/` - Product management specialists - `project-management/` - PM and coordination specialists - - `testing/` - QA and testing specialists + - `sales/` - Sales, revenue, and deal specialists - `security/` - Security architecture, AppSec, pentest, threat intel, and incident response - - `support/` - Operations and support specialists - `spatial-computing/` - AR/VR/XR specialists - `specialized/` - Unique specialists that don't fit elsewhere + - `support/` - Operations and support specialists + - `testing/` - QA and testing specialists + + > **Divisions are defined by `divisions.json`** (repo root) — the single source of + > truth for the division set, validated in CI by `scripts/check-divisions.sh`. + > **Proposing a new division** means: create the directory, add an entry to + > `divisions.json` (label/icon/color), and add it to `AGENT_DIRS` in both + > `scripts/convert.sh` and `scripts/lint-agents.sh`. The check fails the build + > unless all of these agree and the directory contains at least one agent file. + > + > Note: `strategy/` (NEXUS playbooks/runbooks — no agent frontmatter) and + > `integrations/` (generated per-tool output from `convert.sh`) are **not** + > divisions and must never be added to the division lists. 3. **Create your agent file** following the template below 4. **Test your agent** in real scenarios diff --git a/scripts/convert.sh b/scripts/convert.sh index 1266109d..28d46d31 100755 --- a/scripts/convert.sh +++ b/scripts/convert.sh @@ -20,6 +20,7 @@ # qwen — Qwen Code SubAgent files (~/.qwen/agents/*.md) # kimi — Kimi Code CLI agent files (~/.config/kimi/agents/) # codex — Codex custom agent TOML files (~/.codex/agents/*.toml) +# osaurus — Osaurus skill files (~/.osaurus/skills//SKILL.md) # all — All tools (default) # # Output is written to integrations// relative to the repo root. @@ -73,7 +74,7 @@ AGENT_DIRS=( # --- Usage --- usage() { - sed -n '3,26p' "$0" | sed 's/^# \{0,1\}//' + sed -n '3,27p' "$0" | sed 's/^# \{0,1\}//' exit 0 } @@ -130,6 +131,33 @@ ${body} HEREDOC } +convert_osaurus() { + local file="$1" + local name description slug outdir outfile body + + name="$(get_field "name" "$file")" + description="$(get_field "description" "$file")" + slug="agency-$(slugify "$name")" + body="$(get_body "$file")" + + # Stage one dir per skill (install.sh copies into ~/.osaurus/skills//). + outdir="$OUT_DIR/osaurus/$slug" + outfile="$outdir/SKILL.md" + mkdir -p "$outdir" + + # Osaurus skill format: the Anthropic "Agent Skills" SKILL.md — a directory + # named for the skill containing a SKILL.md with name + description frontmatter + # and the persona as the instruction body. Installs into ~/.osaurus/skills/. + # Kept to the standard fields so it stays compatible with any Agent-Skills host. + cat > "$outfile" </dev/null } @@ -363,6 +370,7 @@ detect_windsurf() { command -v windsurf >/dev/null 2>&1 || [[ -d "${HOME}/.c detect_qwen() { command -v qwen >/dev/null 2>&1 || [[ -d "${HOME}/.qwen" ]]; } detect_kimi() { command -v kimi >/dev/null 2>&1; } detect_codex() { command -v codex >/dev/null 2>&1 || [[ -d "${HOME}/.codex" ]]; } +detect_osaurus() { command -v osaurus >/dev/null 2>&1 || [[ -d "${HOME}/.osaurus" ]]; } is_detected() { case "$1" in @@ -378,6 +386,7 @@ is_detected() { qwen) detect_qwen ;; kimi) detect_kimi ;; codex) detect_codex ;; + osaurus) detect_osaurus ;; *) return 1 ;; esac } @@ -397,6 +406,7 @@ tool_label() { qwen) printf "%-14s %s" "Qwen Code" "(~/.qwen/agents)" ;; kimi) printf "%-14s %s" "Kimi Code" "(~/.config/kimi/agents)" ;; codex) printf "%-14s %s" "Codex" "(~/.codex/agents)" ;; + osaurus) printf "%-14s %s" "Osaurus" "(~/.osaurus/skills)" ;; esac } @@ -520,7 +530,7 @@ tool_simple_name() { claude-code) echo "Claude Code";; copilot) echo "Copilot";; antigravity) echo "Antigravity";; gemini-cli) echo "Gemini CLI";; opencode) echo "OpenCode";; openclaw) echo "OpenClaw";; cursor) echo "Cursor";; aider) echo "Aider";; windsurf) echo "Windsurf";; - qwen) echo "Qwen Code";; kimi) echo "Kimi Code";; codex) echo "Codex";; *) echo "$1";; + qwen) echo "Qwen Code";; kimi) echo "Kimi Code";; codex) echo "Codex";; osaurus) echo "Osaurus";; *) echo "$1";; esac } @@ -719,6 +729,23 @@ install_antigravity() { ok "Antigravity: $count skills -> $dest" } +install_osaurus() { + local src="$INTEGRATIONS/osaurus" + local dest; dest="$(resolve_dest osaurus "${HOME}/.osaurus/skills")" + local count=0 + [[ -d "$src" ]] || { err "integrations/osaurus missing. Run convert.sh first."; return 1; } + mkdir -p "$dest" + local d + while IFS= read -r -d '' d; do + local name; name="$(basename "$d")" + slug_allowed "$name" || continue + mkdir -p "$dest/$name" + install_file "$d/SKILL.md" "$dest/$name/SKILL.md" + incr count + done < <(find "$src" -mindepth 1 -maxdepth 1 -type d -print0) + ok "Osaurus: $count skills -> $dest" +} + install_gemini_cli() { local src="$INTEGRATIONS/gemini-cli/agents" local dest; dest="$(resolve_dest gemini-cli "${HOME}/.gemini/agents")" @@ -912,6 +939,7 @@ install_tool() { qwen) install_qwen ;; kimi) install_kimi ;; codex) install_codex ;; + osaurus) install_osaurus ;; esac }