mirror of
https://github.com/boshu2/agentops.git
synced 2026-09-14 15:08:13 +08:00
Release v2.18.0
This commit is contained in:
@@ -6,13 +6,13 @@
|
||||
},
|
||||
"metadata": {
|
||||
"description": "The missing DevOps layer for coding agents. Flow, feedback, and memory that compounds between sessions.",
|
||||
"version": "2.17.0"
|
||||
"version": "2.18.0"
|
||||
},
|
||||
"plugins": [
|
||||
{
|
||||
"name": "agentops",
|
||||
"description": "The missing DevOps layer for coding agents. Flow, feedback, and memory that compounds between sessions.",
|
||||
"version": "2.17.0",
|
||||
"version": "2.18.0",
|
||||
"source": "./",
|
||||
"author": {
|
||||
"name": "Boden Fuller",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "agentops",
|
||||
"version": "2.17.0",
|
||||
"version": "2.18.0",
|
||||
"description": "The missing DevOps layer for coding agents. Flow, feedback, and memory that compounds between sessions.",
|
||||
"author": {
|
||||
"name": "Boden Fuller",
|
||||
|
||||
@@ -34,6 +34,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- SessionEnd hook now gates notebook update and memory sync on successful forge
|
||||
- Type 3 setup hook template: `hooks/examples/50-agentops-bootstrap.sh`
|
||||
- Constraint compiler hook: `hooks/constraint-compiler.sh`
|
||||
- Codex-native skill format (`skills-codex/`) with install and sync scripts for cross-runtime skill delivery
|
||||
- Comprehensive cmd/ao test coverage push — 500+ tests across 5 waves reaching 79.2% statement coverage (13 untestable functions excluded)
|
||||
|
||||
### Changed
|
||||
- SessionStart hook default mode changed from full inject to `manual` (pointer-only context, MEMORY.md auto-loaded by Claude Code)
|
||||
@@ -57,6 +59,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
- `ao rpi status` goroutine leak fix — signal channel properly cleaned up
|
||||
- Inline rune truncation in `formatMemoryEntry` replaced with shared `truncateText`
|
||||
- 6 new tests for dedup, ambiguity detection, iteration cap, duplicate markers
|
||||
- Cobra pflag state pollution between test invocations — explicit flag reset in `executeCommand()` helper
|
||||
- Goals validate.sh outdated checks and missing validate.sh for 7 skills
|
||||
- 10 tech debt findings from ag-8km+ag-chm post-mortem (stale nudge, scanner, docs)
|
||||
- ao binary codesigned with stable Mach-O identifier
|
||||
- Hook integration tests updated — removed 8 stale standalone ao-* hook tests consolidated into session-end-maintenance.sh
|
||||
|
||||
## [2.17.0] - 2026-02-24
|
||||
|
||||
|
||||
@@ -244,6 +244,7 @@ Read `references/cache-eviction.md` for the full eviction pipeline (passive trac
|
||||
|
||||
### artifact-consistency-allowlist.txt
|
||||
|
||||
```text
|
||||
# Artifact consistency allowlist
|
||||
#
|
||||
# Format:
|
||||
@@ -272,6 +273,7 @@ Read `references/cache-eviction.md` for the full eviction pipeline (passive trac
|
||||
* -> .agents/*/...*
|
||||
* -> .agents/*/foo.*
|
||||
* -> .agents/handoff/auto-99999999T999999Z.md
|
||||
```
|
||||
|
||||
### artifact-consistency.md
|
||||
|
||||
|
||||
+6
-118
@@ -963,35 +963,9 @@ else
|
||||
fail "ao-agents-check.sh removed from hooks.json"
|
||||
fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-extract.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-extract
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-extract.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-extract kill switch"; else fail "ao-extract kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-extract.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-extract fail-open without ao"; else fail "ao-extract fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-feedback-loop.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-feedback-loop
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-feedback-loop.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-feedback-loop kill switch"; else fail "ao-feedback-loop kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-feedback-loop.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-feedback-loop fail-open without ao"; else fail "ao-feedback-loop fail-open without ao"; fi
|
||||
# ao-extract, ao-feedback-loop, ao-forge, ao-inject, ao-maturity-scan,
|
||||
# ao-ratchet-status, ao-session-outcome, ao-task-sync were consolidated
|
||||
# into session-end-maintenance.sh inline commands. Standalone scripts removed.
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
@@ -1008,95 +982,9 @@ EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-flywheel-close.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-flywheel-close fail-open without ao"; else fail "ao-flywheel-close fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-forge.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-forge
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-forge.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-forge kill switch"; else fail "ao-forge kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-forge.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-forge fail-open without ao"; else fail "ao-forge fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-inject.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-inject
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-inject.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-inject kill switch"; else fail "ao-inject kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-inject.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-inject fail-open without ao"; else fail "ao-inject fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-maturity-scan.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-maturity-scan
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-maturity-scan.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-maturity-scan kill switch"; else fail "ao-maturity-scan kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-maturity-scan.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-maturity-scan fail-open without ao"; else fail "ao-maturity-scan fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-ratchet-status.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-ratchet-status
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-ratchet-status.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-ratchet-status kill switch"; else fail "ao-ratchet-status kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-ratchet-status.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-ratchet-status fail-open without ao"; else fail "ao-ratchet-status fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-session-outcome.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-session-outcome
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-session-outcome.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-session-outcome kill switch"; else fail "ao-session-outcome kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-session-outcome.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-session-outcome fail-open without ao"; else fail "ao-session-outcome fail-open without ao"; fi
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
echo "=== ao-task-sync.sh ==="
|
||||
# ============================================================
|
||||
|
||||
# Test: kill switch suppresses ao-task-sync
|
||||
EC=0
|
||||
AGENTOPS_HOOKS_DISABLED=1 bash "$HOOKS_DIR/ao-task-sync.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-task-sync kill switch"; else fail "ao-task-sync kill switch"; fi
|
||||
|
||||
# Test: fail-open without ao
|
||||
EC=0
|
||||
PATH="/usr/bin:/bin" bash "$HOOKS_DIR/ao-task-sync.sh" >/dev/null 2>&1 || EC=$?
|
||||
if [ "$EC" -eq 0 ]; then pass "ao-task-sync fail-open without ao"; else fail "ao-task-sync fail-open without ao"; fi
|
||||
# ao-forge, ao-inject, ao-maturity-scan, ao-ratchet-status, ao-session-outcome,
|
||||
# ao-task-sync standalone scripts were consolidated into session-end-maintenance.sh.
|
||||
# Delegation tests below verify the embedded hooks still delegate correctly.
|
||||
|
||||
# ============================================================
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user