From 52039545415be4f1492fcccfd391a9982082bcf8 Mon Sep 17 00:00:00 2001 From: Bin Le Date: Thu, 13 Aug 2026 00:03:21 -0400 Subject: [PATCH] Release v1.9.7: move agent skills back to .claude/skills so they are discoverable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit record-tui-gif, publish-cover, capture-tui-diagram and run-actop were moved from .claude/skills/ to .agents/skills/ in the 1.4.x docs reorg. Claude Code discovers project skills only under .claude/skills/, so from that point on none of the four were ever offered to the agent. They stayed correct, committed, and unused — followed only when someone happened to grep them out of the tree. audit-conformance stayed behind in .claude/skills/ and kept working, which is what made the breakage hard to notice: one skill worked, four silently did not. Moves all four back, rewrites their internal .agents/skills/... path references, and records the constraint in CLAUDE.md so a future "consolidation" does not silently re-break discovery. Co-Authored-By: Claude Opus 5 (1M context) --- .../skills/capture-tui-diagram/SKILL.md | 4 ++-- .../skills/capture-tui-diagram/clean_capture.py | 0 .../skills/publish-cover/SKILL.md | 2 +- .../publish-cover/scripts/build-cover-dist.sh | 0 .../skills/record-tui-gif/SKILL.md | 14 +++++++------- .../skills/record-tui-gif/actop-demo.tape | 2 +- .../skills/record-tui-gif/gpu_workload.py | 0 .../skills/record-tui-gif/record.sh | 2 +- {.agents => .claude}/skills/run-actop/SKILL.md | 0 CHANGELOG.md | 16 ++++++++++++++++ CLAUDE.md | 2 ++ docs/cover.html | 4 ++-- pyproject.toml | 2 +- uv.lock | 2 +- 14 files changed, 34 insertions(+), 16 deletions(-) rename {.agents => .claude}/skills/capture-tui-diagram/SKILL.md (97%) rename {.agents => .claude}/skills/capture-tui-diagram/clean_capture.py (100%) rename {.agents => .claude}/skills/publish-cover/SKILL.md (98%) rename {.agents => .claude}/skills/publish-cover/scripts/build-cover-dist.sh (100%) rename {.agents => .claude}/skills/record-tui-gif/SKILL.md (94%) rename {.agents => .claude}/skills/record-tui-gif/actop-demo.tape (97%) rename {.agents => .claude}/skills/record-tui-gif/gpu_workload.py (100%) rename {.agents => .claude}/skills/record-tui-gif/record.sh (99%) rename {.agents => .claude}/skills/run-actop/SKILL.md (100%) diff --git a/.agents/skills/capture-tui-diagram/SKILL.md b/.claude/skills/capture-tui-diagram/SKILL.md similarity index 97% rename from .agents/skills/capture-tui-diagram/SKILL.md rename to .claude/skills/capture-tui-diagram/SKILL.md index e2cf7fa..c246ac0 100644 --- a/.agents/skills/capture-tui-diagram/SKILL.md +++ b/.claude/skills/capture-tui-diagram/SKILL.md @@ -71,14 +71,14 @@ sleep 6 # let the next poll apply it, THEN capture lines, trailing pad whitespace, and scrollbar thumb artifacts: ```bash -python .agents/skills/capture-tui-diagram/clean_capture.py tmp/raw.txt > tmp/grid.txt +python .claude/skills/capture-tui-diagram/clean_capture.py tmp/raw.txt > tmp/grid.txt ``` For a **single-column** capture (the `stack` preset) add `--compress` to collapse runs of blank chart rows so a ~47-row frame fits a doc: ```bash -python .agents/skills/capture-tui-diagram/clean_capture.py tmp/stack_raw.txt --compress > tmp/stack.txt +python .claude/skills/capture-tui-diagram/clean_capture.py tmp/stack_raw.txt --compress > tmp/stack.txt ``` **Never `--compress` a side-by-side frame** (grid, or dashboard+table): the two diff --git a/.agents/skills/capture-tui-diagram/clean_capture.py b/.claude/skills/capture-tui-diagram/clean_capture.py similarity index 100% rename from .agents/skills/capture-tui-diagram/clean_capture.py rename to .claude/skills/capture-tui-diagram/clean_capture.py diff --git a/.agents/skills/publish-cover/SKILL.md b/.claude/skills/publish-cover/SKILL.md similarity index 98% rename from .agents/skills/publish-cover/SKILL.md rename to .claude/skills/publish-cover/SKILL.md index d83e9d6..3ad3251 100644 --- a/.agents/skills/publish-cover/SKILL.md +++ b/.claude/skills/publish-cover/SKILL.md @@ -68,7 +68,7 @@ Gate 1–4 → Build → Audit → [MANUAL CONFIRM] → Deploy → Ver ### Step 1 — Build ```bash -bash .agents/skills/publish-cover/scripts/build-cover-dist.sh +bash .claude/skills/publish-cover/scripts/build-cover-dist.sh ``` What the script does deterministically: diff --git a/.agents/skills/publish-cover/scripts/build-cover-dist.sh b/.claude/skills/publish-cover/scripts/build-cover-dist.sh similarity index 100% rename from .agents/skills/publish-cover/scripts/build-cover-dist.sh rename to .claude/skills/publish-cover/scripts/build-cover-dist.sh diff --git a/.agents/skills/record-tui-gif/SKILL.md b/.claude/skills/record-tui-gif/SKILL.md similarity index 94% rename from .agents/skills/record-tui-gif/SKILL.md rename to .claude/skills/record-tui-gif/SKILL.md index 39790db..961bad2 100644 --- a/.agents/skills/record-tui-gif/SKILL.md +++ b/.claude/skills/record-tui-gif/SKILL.md @@ -30,7 +30,7 @@ tape. actop monitors the whole system, so that's fine. From anywhere in the repo: ```bash -bash .agents/skills/record-tui-gif/record.sh +bash .claude/skills/record-tui-gif/record.sh ``` This drives a GPU workload against the llama.cpp router (llamacpp-first default; @@ -53,14 +53,14 @@ Examples: ```bash # Default: llama.cpp router, OpenAI protocol, original qwen model: -bash .agents/skills/record-tui-gif/record.sh +bash .claude/skills/record-tui-gif/record.sh # Heavier load, longer generations: -CONCURRENCY=3 NUM_PREDICT=8192 bash .agents/skills/record-tui-gif/record.sh +CONCURRENCY=3 NUM_PREDICT=8192 bash .claude/skills/record-tui-gif/record.sh # Ollama fallback (native /api/generate, agentic profile): ROUTER_URL=http://localhost:11433 MODEL=qwen3.6:35b-a3b-agentic API=ollama \ - bash .agents/skills/record-tui-gif/record.sh + bash .claude/skills/record-tui-gif/record.sh # Record a custom tape with idle gauges (e.g. a quick layout check): -SKIP_WORKLOAD=1 TAPES=tmp/mytape.tape bash .agents/skills/record-tui-gif/record.sh +SKIP_WORKLOAD=1 TAPES=tmp/mytape.tape bash .claude/skills/record-tui-gif/record.sh ``` ## The GPU workload driver @@ -71,11 +71,11 @@ generations across N concurrent workers until Ctrl-C or `--duration`. ```bash # llama.cpp (default): OpenAI protocol against the llamacpp router -.venv/bin/python .agents/skills/record-tui-gif/gpu_workload.py \ +.venv/bin/python .claude/skills/record-tui-gif/gpu_workload.py \ --url http://localhost:9040 --model qwen3.6:35b-a3b \ --api openai --concurrency 2 --num-predict 4096 # ollama fallback: native /api/generate (llama.cpp 404s on this path) -.venv/bin/python .agents/skills/record-tui-gif/gpu_workload.py \ +.venv/bin/python .claude/skills/record-tui-gif/gpu_workload.py \ --url http://localhost:11433 --model qwen3.6:35b-a3b-agentic \ --api ollama --concurrency 2 --num-predict 4096 ``` diff --git a/.agents/skills/record-tui-gif/actop-demo.tape b/.claude/skills/record-tui-gif/actop-demo.tape similarity index 97% rename from .agents/skills/record-tui-gif/actop-demo.tape rename to .claude/skills/record-tui-gif/actop-demo.tape index 8d7760e..54a791b 100644 --- a/.agents/skills/record-tui-gif/actop-demo.tape +++ b/.claude/skills/record-tui-gif/actop-demo.tape @@ -15,7 +15,7 @@ # the dashboard drops to ~80 cols and silently degrades mid-take; 1800px # (~212 cols) leaves it ~122 cols, so grid survives the whole recording. # -# Render from the repo root: vhs .agents/skills/record-tui-gif/actop-demo.tape +# Render from the repo root: vhs .claude/skills/record-tui-gif/actop-demo.tape # (or via record.sh, which drives a GPU workload so the gauges move). Output images/actop-demo.gif diff --git a/.agents/skills/record-tui-gif/gpu_workload.py b/.claude/skills/record-tui-gif/gpu_workload.py similarity index 100% rename from .agents/skills/record-tui-gif/gpu_workload.py rename to .claude/skills/record-tui-gif/gpu_workload.py diff --git a/.agents/skills/record-tui-gif/record.sh b/.claude/skills/record-tui-gif/record.sh similarity index 99% rename from .agents/skills/record-tui-gif/record.sh rename to .claude/skills/record-tui-gif/record.sh index c9f8518..147120c 100755 --- a/.agents/skills/record-tui-gif/record.sh +++ b/.claude/skills/record-tui-gif/record.sh @@ -11,7 +11,7 @@ # 5. stop the GPU workload # # Run from anywhere inside the repo: -# bash .agents/skills/record-tui-gif/record.sh +# bash .claude/skills/record-tui-gif/record.sh # # Config via env: # TAPES="tmp/a.tape tmp/b.tape" tapes to record (default: bundled actop-demo.tape) diff --git a/.agents/skills/run-actop/SKILL.md b/.claude/skills/run-actop/SKILL.md similarity index 100% rename from .agents/skills/run-actop/SKILL.md rename to .claude/skills/run-actop/SKILL.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 97ac0bf..400fcbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,22 @@ This project follows a Keep a Changelog-style format and uses version tags for r ## [Unreleased] +## [1.9.7] - 2026-08-13 + +### Fixed + +- **The agent skills were invisible to the agent.** `record-tui-gif`, + `publish-cover`, `capture-tui-diagram`, and `run-actop` were moved from + `.claude/skills/` to `.agents/skills/` in the 1.4.x docs reorg. Claude Code + discovers project skills only under `.claude/skills/`, so from that point on + none of the four were ever offered — they stayed correct, committed, and + unused, and got followed only when someone happened to grep them out of the + tree. `audit-conformance` stayed behind in `.claude/skills/` and kept working, + which is what made the breakage hard to notice. + All four are moved back, their internal `.agents/skills/...` path references + rewritten, and `CLAUDE.md` now states the constraint so a future reorg does + not silently re-break discovery. + ## [1.9.6] - 2026-08-12 ### Fixed diff --git a/CLAUDE.md b/CLAUDE.md index 58d8ea4..23081f3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -136,6 +136,8 @@ The `docs/` directory contains essential system reviews, research, and operation - `docs/SPEC-system.md`: Detailed system design reference — native bindings, sampling layer, SoC profile fallback, TUI rendering, testing contract. Kept in sync with the code on every PR that touches architecture. - `docs/ROADMAP.md`: Open hardware/metric-coverage gaps and their priority. +**Agent skills live in `.claude/skills/` — nowhere else.** Claude Code discovers project skills only under `.claude/skills/` (plus `~/.claude/skills/` and plugins); a skill parked anywhere else is invisible to the agent and will simply never be invoked. `record-tui-gif`, `publish-cover`, `capture-tui-diagram`, and `run-actop` were moved to `.agents/skills/` in a past docs reorg and silently stopped being offered — they were still correct, still committed, and still useless, because nothing surfaced them. Do not "consolidate" them elsewhere; if another tool needs its own convention, give that tool a copy or a symlink and leave `.claude/skills/` as the real home. + **Conformance auditing:** the `/audit-conformance` skill (`.claude/skills/audit-conformance/`) periodically judgment-scans the whole tree against 12 coding rules (layering, dead code, DRY, naming, swallowed errors) — the whole-codebase counterpart to diff-scoped `/code-review`. It writes an actionable `docs/TODO-conformance-YYYY-MM-DD.md` and never proposes structural/guard tests (they would violate the functional-tests-only mandate). ## Coding Style & Naming Conventions diff --git a/docs/cover.html b/docs/cover.html index ad33a62..44995d8 100644 --- a/docs/cover.html +++ b/docs/cover.html @@ -165,7 +165,7 @@
- v1.9.6 + v1.9.7

actop.

Watch your Apple Silicon Mac the way it actually works — sudoless, @@ -274,7 +274,7 @@

actop — Apple Chip top

diff --git a/pyproject.toml b/pyproject.toml index ddf0a3f..c037ccc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "actop" -version = "1.9.6" +version = "1.9.7" description = "Apple Silicon (M1–M4) power, GPU, ANE & memory-bandwidth monitor — sudoless TUI + Python API for profiling local LLM / MLX / CoreML inference" readme = "README.md" license = { text = "MIT" } diff --git a/uv.lock b/uv.lock index 1ef3ddd..f0b7005 100644 --- a/uv.lock +++ b/uv.lock @@ -15,7 +15,7 @@ resolution-markers = [ [[package]] name = "actop" -version = "1.9.6" +version = "1.9.7" source = { editable = "." } dependencies = [ { name = "rich" },