Merge remote-tracking branch 'origin/main' into feat/PLAN-responses-api
# Conflicts: # src/client/common.rs
This commit is contained in:
32 files changed
+6353
-64
No files matched your search
@@ -369,6 +369,10 @@ instructions: |
|
||||
The direct `adversary`/probe spawns below are the FALLBACK when the gauntlet is not installed;
|
||||
on that path an adversary/probe result that is ONLY a `PIPELINE-FAULT` (no verdict on the
|
||||
code) is likewise an infrastructure fault to retry, never a divergence.
|
||||
Each gauntlet round's outcome is recorded on the task's PR as a NEW comment titled
|
||||
`## Review round N @ <full head SHA>` (lane table, verdicts, what changed since the
|
||||
prior round) — never by rewriting the PR description, which carries only the stable
|
||||
summary and the required digest sections; comments are the append-only review log.
|
||||
- **Spawn `adversary`** with the diff base and the criteria pasted in:
|
||||
|
||||
```
|
||||
|
||||
@@ -697,6 +697,16 @@ instructions: |
|
||||
and what changed (including any plan amendment). Zero autonomous decisions → omit the section.
|
||||
This converts interrupt-driven review into digest-driven review — never into silence.
|
||||
|
||||
**The PR review log (MANDATORY when you author a PR).** The PR DESCRIPTION is a stable
|
||||
document: what the PR does, how to verify it, and the required digest sections (autonomous
|
||||
decisions, skipped reviews, observability). Every review round's evidence — the gauntlet
|
||||
lane table and verdicts, the gates you ran, rulings recorded that round, and what changed
|
||||
since the previous round — is posted as a NEW PR comment (`gh pr comment`) titled
|
||||
`## Review round N @ <full head SHA>`. NEVER record round evidence by rewriting the
|
||||
description: in-place edits destroy the review history and hide which commits each round
|
||||
actually reviewed. Comments are the append-only review log; the SHA in the title names
|
||||
exactly what was reviewed.
|
||||
|
||||
**Close the loop.** When a decision DID reach the user (step 4), suggest in your final report
|
||||
that they record the resolution with `coyote --macro record-ruling` so that class of decision
|
||||
never asks again.
|
||||
|
||||
@@ -149,6 +149,18 @@ mcp_tools: null # Per-server MCP tool allowlists (glob patterns
|
||||
# - list_*
|
||||
# slack: []
|
||||
|
||||
# ---- Hooks ----
|
||||
# Fire-and-forget external commands that run when lifecycle events fire. Each event name
|
||||
# maps to a list of named hooks; every listed hook's command runs when that event fires.
|
||||
# Hooks never block coyote and never change its output or exit code.
|
||||
# See the [Hooks documentation](https://github.com/Dark-Alex-17/coyote/wiki/Hooks) for more details
|
||||
hooks: {} # Event -> list of named hook commands (default: none)
|
||||
# Example:
|
||||
# hooks:
|
||||
# turn.completed:
|
||||
# - name: notify
|
||||
# command: ./hooks/notify.sh
|
||||
|
||||
# ---- Auto-Continue (Todo System) ----
|
||||
# The auto-continue system provides built-in task tracking for improved reliability.
|
||||
# When enabled, the model can create todo lists and the system will automatically
|
||||
|
||||
Executable
+40
@@ -0,0 +1,40 @@
|
||||
#!/usr/bin/env bash
|
||||
# Event-logging hook: appends a timestamped snapshot of every COYOTE_* env var
|
||||
# to a log file, so you can see exactly which events fire and what context
|
||||
# each one carries.
|
||||
#
|
||||
# Env vars read:
|
||||
# COYOTE_HOOK_LOG log file to append to (default: /tmp/coyote-hooks.log)
|
||||
# COYOTE_* everything coyote sets for the event is dumped verbatim
|
||||
#
|
||||
# Secrets (COYOTE_SECRET_*) are excluded from the snapshot; widening the grep
|
||||
# filter below opts into logging them.
|
||||
#
|
||||
# Wire it up under `hooks:` in your config.yaml (any event works):
|
||||
# hooks:
|
||||
# tool.completed:
|
||||
# - name: log-events
|
||||
# command: ./hooks/log-events.sh
|
||||
#
|
||||
# A relative command path like ./hooks/log-events.sh resolves against the
|
||||
# coyote config directory for global hooks, so this works with the default
|
||||
# hooks dir.
|
||||
#
|
||||
# See https://github.com/Dark-Alex-17/coyote/wiki/Hooks for the full list of
|
||||
# events and env vars. Hooks are fire-and-forget: this script never fails
|
||||
# loudly, and coyote ignores its exit code either way.
|
||||
|
||||
set -u
|
||||
|
||||
log_file="${COYOTE_HOOK_LOG:-/tmp/coyote-hooks.log}"
|
||||
|
||||
# The default lives in shared /tmp: refuse to append through a symlink someone
|
||||
# else planted there. Point COYOTE_HOOK_LOG at a private path to avoid the
|
||||
# shared directory entirely.
|
||||
[ -L "$log_file" ] && exit 0
|
||||
umask 077
|
||||
{
|
||||
echo "=== $(date '+%Y-%m-%dT%H:%M:%S%z') ${COYOTE_EVENT:-unknown}"
|
||||
env | grep '^COYOTE_' | grep -v '^COYOTE_SECRET_' | sort
|
||||
echo
|
||||
} >> "$log_file" 2> /dev/null || true
|
||||
Executable
+42
@@ -0,0 +1,42 @@
|
||||
#!/usr/bin/env bash
|
||||
# Desktop-notification hook: posts a notification describing the event that
|
||||
# fired, falling back to a message on the controlling terminal when no
|
||||
# notifier is present.
|
||||
#
|
||||
# Env vars read (set by coyote when the hook fires):
|
||||
# COYOTE_EVENT dotted event name, e.g. turn.completed
|
||||
# COYOTE_AGENT_NAME agent name, when the event carries one
|
||||
# COYOTE_TOOL_NAME tool name, when the event carries one
|
||||
#
|
||||
# Wire it up under `hooks:` in your config.yaml:
|
||||
# hooks:
|
||||
# turn.completed:
|
||||
# - name: notify
|
||||
# command: ./hooks/notify.sh
|
||||
#
|
||||
# A relative command path like ./hooks/notify.sh resolves against the coyote
|
||||
# config directory for global hooks, so this works with the default hooks dir.
|
||||
#
|
||||
# See https://github.com/Dark-Alex-17/coyote/wiki/Hooks for the full list of
|
||||
# events and env vars. Hooks are fire-and-forget: this script never fails
|
||||
# loudly, and coyote ignores its exit code either way.
|
||||
|
||||
set -u
|
||||
|
||||
title="coyote"
|
||||
body="${COYOTE_EVENT:-event}"
|
||||
[ -n "${COYOTE_AGENT_NAME:-}" ] && body="$body agent=$COYOTE_AGENT_NAME"
|
||||
[ -n "${COYOTE_TOOL_NAME:-}" ] && body="$body tool=$COYOTE_TOOL_NAME"
|
||||
|
||||
if command -v notify-send > /dev/null 2>&1; then
|
||||
notify-send "$title" "$body" 2> /dev/null || true
|
||||
elif command -v osascript > /dev/null 2>&1; then
|
||||
# $body carries model-influenced values (e.g. tool names); strip quotes and
|
||||
# backslashes so it cannot escape the AppleScript string literal.
|
||||
safe_body=${body//[\"\\]/}
|
||||
osascript -e "display notification \"$safe_body\" with title \"$title\"" 2> /dev/null || true
|
||||
else
|
||||
# coyote discards hook stdout, so aim the fallback at the controlling
|
||||
# terminal when one exists; plain stdout keeps direct/manual runs working.
|
||||
{ echo "[$title] $body" > /dev/tty; } 2> /dev/null || echo "[$title] $body"
|
||||
fi
|
||||
Reference in new issue
Block a user