Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plugins/claude-config/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "claude-config",
"version": "0.40.17",
"version": "0.40.18",
"description": "Nine configuration-health skills (plus setup) for a repo's Claude Code configuration: audit (settings.json / .mcp.json / hooks / plugins / permissions drift), audit-automation-gaps (evidence-gated verdicts on automation gaps), audit-permission-grants (allow-rule / allowed-tools grants for auto-mode durability and portability), audit-permission-state (the permission rules actually in effect \u2014 every settings scope merged with per-rule provenance, what auto mode drops on entry, config written where nothing reads it, and which managed intents are enforced versus loosenable), draft-auto-mode-rules (interview and draft a paste-ready autoMode classifier block; prints only, never writes), audit-instructions (locally-owned instruction surfaces vs current model capability \u2014 proposes removals/rewrites of instructions the model no longer needs, and detects cross-surface instruction conflicts), audit-prompting-postures (the additive lane \u2014 posture guidance the prompting guide says a component's purpose needs but the component does not carry), audit-pass (one coordinated, ordered, resumable pass over a named target \u2014 three-scope inventory, run-time-derived exclusion set, stable finding identity, suppression memory, resume, one human gate \u2014 delegating every check to the plugin that owns it), and unhobble (the empirical bare-baseline experiment: reversibly strip a repo's standing instructions, log real stumbles against the current model, re-add only what evidence earns).",
"author": {
"name": "Melodic Software",
Expand Down
12 changes: 12 additions & 0 deletions plugins/claude-config/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@
All notable changes to the `claude-config` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.40.18]

### Changed

- **Behavior-preserving simplification sweep (batch-simplify).** `audit-permission-state`'s
`automode-entry-diff.sh` drops a redundant command-substitution wrapper in the empty-prediction
guard (`[[ -z "$(printf '%s' "$predicted_dropped")" ]]` to `[[ -z "$predicted_dropped" ]]`);
the wrapper only stripped trailing newlines, and the value's grammar (non-empty rules each
followed by one newline) makes that stripping unobservable. Refutation-verified by static
reachability trace plus a 12-case empirical matrix; the suite's 63 checks and the
no-writes property tests pass.

## [0.40.17]

### Changed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ fi

if [[ -z "$oracle_dropped" ]]; then
echo "oracle NOTE: the session narrated the permission merge but emitted zero drop lines. If this machine has rules the prediction above says are dropped, the session was likely not in auto mode; treat the oracle as unavailable rather than as an empty drop set."
[[ -z "$(printf '%s' "$predicted_dropped")" ]] || exit 0
[[ -z "$predicted_dropped" ]] || exit 0
fi

# Compare on rule text over the union of both sets: one verdict line per rule,
Expand Down
2 changes: 1 addition & 1 deletion plugins/claude-ops/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "claude-ops",
"version": "0.38.19",
"version": "0.38.20",
"description": "Claude Code operations toolkit. Twelve skills: audit-skill-visibility (audit whether each installed skill is actually VISIBLE to the model, and diagnose why most of a fleet never gets used \u2014 a skill is invisible when its description is dropped by Claude Code's skill-listing context budget, which drops descriptions least-invoked-first so an unused skill loses the keywords that would let it be matched, from skills genuinely not wanted, from skills the run cannot observe at all; computes whether the listing overflows from documented settings, and withholds every cold verdict the data cannot support rather than reporting absence of data as absence of use), inventory (read-only enumeration of the complete invocable surface \u2014 every built-in CLI command with aliases and hidden/gated status, every bundled skill, and every component of every installed plugin across all marketplaces; reads the shipped binary because upstream publishes no built-in command list, and carries an integrity verdict so a drifted build reports counts as floors rather than silently short totals), audit-install-state (read-only audit of the machine-scope ~/.claude installation directory and ~/.claude.json \u2014 full inventory split into an authored surface and rolled-up bulk trees, product-managed retention vs genuinely unmanaged state, filename-scheme resolution before any process-liveness check, and deliberate/mid-experiment detection; reports, never deletes), audit-performance (read-only slowness-diagnostic capture run at the moment the machine or a session feels slow: CLI version, retention-sweep health including the silent unparsable-settings pause, a timed census walk of the install tree as a sweep-cost proxy, active-session and plugin-fleet counts, a process census, and the fan-out layer, which covers a load-labelled no-op spawn baseline, every hook that will fire bucketed per-tool-call versus per-turn with its invocation shape, the configured statusline, subagent concurrency and spawn-depth ceilings against documented defaults, whether running sessions predate the settings file they are judged by, and orphan attribution by parent liveness rather than age; read against a bundled known-performance-issues reference that also records the causes tested and cleared; separates the four documented suspects of accumulated state, version regression, component bloat, and per-spawn fan-out cost, and routes remediation out; reports, never mutates, and never executes a discovered hook or statusline command), audit-native-overlap (map native Claude Code surfaces \u2014 built-in CLI commands, bundled skills, plugin-backed built-ins, session-provided skills \u2014 against the current repo's plugin skills and agents, so a custom component never silently duplicates what Claude Code itself ships; bare invocation is a read-only overlap report carrying the extraction's integrity floors and a shared-listing-budget exposure section, verdicts are human-gated in a committed store rendered into a generated registry whose every row carries an observable recheck trigger, and only an explicit apply step bakes presence-gated native references into descriptions and Boundary sections), observability (read locally captured telemetry \u2014 OTEL store, collector, hook-event JSONL, ccusage \u2014 with trend reports and store pruning), known-issues (search known Claude product GitHub bugs, check service health, maintain a persistent tracked-issue registry), changelog (ingest Claude Code changelog entries and integrate them into the current repo), plugins (bring a machine's plugin fleet current on demand \u2014 marketplace refresh, effective-scope updates including in-repo project/local installs, new-plugin install per policy, scope-divergence detection and explicit convergence), morning-brief (read-only gh-based operator morning view \u2014 queue-label counts, merge-ready PRs, parked decisions with their RECOMMENDED lines, and loop-lane telemetry freshness), lanes (start/restart/stop/status loop lanes as named background Claude Code sessions seeded from canonical prompt files, with per-lane model/effort, a repo-pull + marketplace-refresh launch step, and a consume-restarts action \u2014 an OS-schedulable reader that relaunches stopped lanes whose telemetry carries a restart_request), and a re-runnable setup action that settles where the known-issues registry lives. Plus a family of eight advisory *-audit hooks (API errors, config changes, instruction loads, permission denials, pre-compaction, skill usage, tool failures, and unsurfaced hook failures \u2014 the last also warns the user via systemMessage, since a hook that fails to launch enforces nothing and Claude Code surfaces the failure to nobody) that emit the shared hook-telemetry envelope, and a reference sink that maps envelopes into the hook-events.jsonl the observability skill reads.",
"author": {
"name": "Melodic Software",
Expand Down
11 changes: 11 additions & 0 deletions plugins/claude-ops/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@
All notable changes to the `claude-ops` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.38.20]

### Changed

- **Behavior-preserving simplification sweep (batch-simplify).** `lanes`'s machine-behavior.sh
drops the WT_COUNT parallel counter (its two reads use `${#WT_LINES[@]}` directly, matching the
file's existing WANT_PLUGINS idiom); `observability`'s claude-observability.test.sh collapses two
case-based substring checks into the suite's own `assert_contains` helper. Both refutation-verified
(counter/array divergence structurally impossible; 26/26 and 33/33 suite checks byte-identical
old-vs-new including a glob-metacharacter probe matrix).

## [0.38.19]

### Changed
Expand Down
6 changes: 2 additions & 4 deletions plugins/claude-ops/skills/lanes/scripts/machine-behavior.sh
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,6 @@ gh_identity() {
# is no single deterministic "pattern" to infer — the raw list IS the pattern.
CLONE_PATH="unavailable"
CURRENT_WT="unavailable"
WT_COUNT=0
declare -a WT_LINES=()

read_worktrees() {
Expand Down Expand Up @@ -180,7 +179,6 @@ read_worktrees() {
"")
if [[ -n "$path" ]]; then
WT_LINES+=("$path|${branch:-(detached)}")
WT_COUNT=$((WT_COUNT + 1))
path="" branch=""
fi
;;
Expand Down Expand Up @@ -240,8 +238,8 @@ printf '== MACHINE-BEHAVIOR ==\n'
printf 'gh-identity: %s\n' "$(gh_identity)"
printf 'clone-path: %s\n' "$CLONE_PATH"
printf 'current-worktree: %s\n' "$CURRENT_WT"
printf 'worktree-count: %s\n' "$WT_COUNT"
if ((WT_COUNT)); then
printf 'worktree-count: %s\n' "${#WT_LINES[@]}"
if ((${#WT_LINES[@]})); then
printf 'worktrees:\n'
for local_line in "${WT_LINES[@]}"; do
printf ' %s [%s]\n' "${local_line%%|*}" "${local_line#*|}"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -226,10 +226,7 @@ assert_eq "skill-usage uses its own 365d window, not --keep-days" "4" "$(lines_i

# 9s-c: dry-run reports the resolved target without modifying it.
su_out=$(cd "$clean_test_dir" && bash "$CLEAN" --dry-run --skill-usage-scope repo 2>&1 || true)
case "$su_out" in
*"skill-usage target"*) assert_eq "clean --dry-run names the skill-usage target" "1" "1" ;;
*) assert_eq "clean --dry-run names the skill-usage target" "1" "0" ;;
esac
assert_contains "clean --dry-run names the skill-usage target" "$su_out" "skill-usage target"
assert_eq "clean --dry-run preserves skill-usage" "4" "$(lines_in "$SU_FX")"

# 9s-d: a short window does prune, so the branch is real and not inert.
Expand All @@ -246,10 +243,7 @@ mkdir -p "$su_slug_dir"
printf '{"ts":"%s","event":"SkillUse","skill":"old:one"}\n' "$OLD_45" >"$su_slug_dir/skill-usage.jsonl"
printf '{"ts":"%s","event":"SkillUse","skill":"new:two"}\n' "$TODAY" >>"$su_slug_dir/skill-usage.jsonl"
su_dd_out=$(cd "$clean_test_dir" && bash "$CLEAN" --dry-run --skill-usage-scope data-dir --skill-usage-data-root "$su_data_root" 2>&1 || true)
case "$su_dd_out" in
*"$su_data_root/skill-usage/"*) assert_eq "data-dir resolves under the plugin data root" "1" "1" ;;
*) assert_eq "data-dir resolves under the plugin data root" "1" "0" ;;
esac
assert_contains "data-dir resolves under the plugin data root" "$su_dd_out" "$su_data_root/skill-usage/"

# 9s-e: data-dir refuses to guess a location. CLAUDE_PLUGIN_DATA in a skill
# subprocess was observed pointing at an UNRELATED plugin's data directory, so a
Expand Down
2 changes: 1 addition & 1 deletion plugins/disk-hygiene/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "disk-hygiene",
"version": "0.20.33",
"version": "0.20.34",
"description": "Context-aware disk hygiene for arbitrary directory trees: inventories orphaned and temporary artifacts, classifies evidence into review tiers, and offers exact-path cleanup only after a fresh safety preview and explicit per-tier approval. The target is read-only by default; OS-managed paths, links and mount points, VCS-tracked content without the complete checkout evidence bundle, changed entries, and live-handle uncertainty fail closed.",
"author": {
"name": "Melodic Software",
Expand Down
10 changes: 10 additions & 0 deletions plugins/disk-hygiene/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
All notable changes to the `disk-hygiene` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.20.34]

### Changed

- **Behavior-preserving simplification sweep (batch-simplify).** The setup skill's
`test_python3_alias_probe.py` replaces `make_file`'s hand-rolled `open(path, "wb")` context
manager (with a dead zero-size guard) with the exact stdlib equivalent
`path.write_bytes(b"\0" * size)`. Byte-identical file contents and permissions verified
empirically for every size the suite uses; refutation-verified; 10/10 tests pass.

## [0.20.33]

### Changed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,9 +47,7 @@ def setUp(self) -> None:
def make_file(self, relative: str, size: int) -> Path:
path = self.root / relative
path.parent.mkdir(parents=True, exist_ok=True)
with open(path, "wb") as handle:
if size:
handle.write(b"\0" * size)
path.write_bytes(b"\0" * size)
return path

def run_probe(self, argv: list[str]) -> dict[str, object]:
Expand Down
2 changes: 1 addition & 1 deletion plugins/instruction-placement/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "instruction-placement",
"version": "0.11.12",
"version": "0.11.13",
"description": "Routes agent-instruction content to the surface that loads it at the right moment. The audit skill sweeps a repository's instruction layer and its ordinary markdown for content whose scope is narrower than the surface carrying it \u2014 conventions keyed to one file type or one subtree sitting in an always-loaded CLAUDE.md or AGENTS.md \u2014 and for normative conventions stranded in documentation Claude never loads at all, then classifies each against a routing rubric and proposes a destination whose `paths:` glob is machine-validated before it is ever offered. Safety-class content (irreversible actions, secrets, data integrity, external publication, compliance, agent authority) is hard-denied from demotion and reported as held back rather than proposed, because demotion trades guaranteed presence for conditional presence and deferred surfaces are invisible inside subagents and absent after compaction until re-triggered. Every accepted move regenerates an always-loaded index of deferred surfaces, which is what keeps a demoted rule reachable from a subagent that never receives its injection. The audit is read-only and emits a diffable findings artifact; realignment is a separate skill gated per item with no blanket-approve path; a deterministic check skill gates that every rule glob still resolves and the index is current; and a setup skill verifies the one thing no other gate can see \u2014 that the index target is a file Claude Code will actually read, since it reads CLAUDE.md and not AGENTS.md.",
"author": {
"name": "Melodic Software",
Expand Down
10 changes: 10 additions & 0 deletions plugins/instruction-placement/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,16 @@
All notable changes to the `instruction-placement` plugin are documented here. Format follows
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this plugin uses semantic versioning.

## [0.11.13]

### Changed

- **Behavior-preserving simplification sweep (batch-simplify).** `detect.sh` collapses the
manual `--` argument-capture loop into the marketplace's precedented `EXPLICIT+=("$@"); break`
form and drops a dead `SECTION_COUNT=0` initializer (the variable is unconditionally
reassigned before its only read). Emitted rows, exit codes, and `--help` text unchanged;
refutation-verified across 23 argv edge cases and the full 40-case suite.

## [0.11.12]

### Changed
Expand Down
7 changes: 2 additions & 5 deletions plugins/instruction-placement/scripts/detect.sh
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,8 @@ while [[ $# -gt 0 ]]; do
;;
--)
shift
while [[ $# -gt 0 ]]; do
EXPLICIT+=("$1")
shift
done
EXPLICIT+=("$@")
break
;;
-*) die "unknown argument: $1" ;;
*)
Expand Down Expand Up @@ -223,7 +221,6 @@ fi
# ---------------------------------------------------------------------------
ROWS="$(mktemp)"
trap 'rm -f "$SKIP_ROWS" "$ROWS"' EXIT
SECTION_COUNT=0
RULE_COUNT=0

emit_file_facts() {
Expand Down
2 changes: 1 addition & 1 deletion plugins/knowledge/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "knowledge",
"version": "0.13.24",
"version": "0.13.25",
"description": "Ingest external knowledge into durable, synthesized artifacts. Ships a book-distillation pipeline (PDF/EPUB into concept-organized, author-attributed skill reference files), a video-digest pipeline (watch a single public video from YouTube or X, formerly Twitter: transcript, link harvest, and repo-applicability synthesis), a course-digest pipeline (extract and synthesize online video courses \u2014 Dometrain, Teachable \u2014 into repo-applicable recommendations), a docpage-digest pipeline (single online documentation page into a verified knowledge slice with dual verification \u2014 one cross-vendor verifier \u2014 and an interview handoff), and a map-corpus pipeline (multi-resource corpus into a classified link map, deterministic node manifests, gate-verified relevance inventory, and an approved queue of docpage-digest runs), plus a re-runnable setup action; a configurable library directory governs where synthesized artifacts land in the consuming repo.",
"author": {
"name": "Melodic Software",
Expand Down
19 changes: 19 additions & 0 deletions plugins/knowledge/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,25 @@ All notable changes to the `knowledge` plugin are recorded here. The `version` i
`.claude-plugin/plugin.json` is the delivery vehicle — a consumer receives a change
only after that version increases.

## [0.13.25]

### Changed

- **Behavior-preserving simplification sweep (batch-simplify).** `docpage-digest`'s
digest_fences.py removes dead `unclosed` bookkeeping from parse_claims: the flag was assigned on
both arms of the try and the trailing `if unclosed: fence = None` could never change the already
computed value. Refutation-verified (per-block flag scoping ruled out cross-iteration leakage;
18/18 parse comparisons and 10/10 end-to-end gate runs byte-identical; both suites, 30 tests, OK).
- **video-digest extraction, same sweep.** setup-deps.mjs drops a redundant per-directory
localeCompare sort inside computeStamp's walk (the final code-unit path sort alone determines
hash-input order; stamps verified byte-identical on the real vendor tree and an adversarial
fixture, including under forced readdir scrambling). acquisition/build-yt-dlp-args.js removes
the born-dead export `YT_DLP_CAPTION_ONLY_SLEEP_SUBTITLES_SEC` (zero references at any commit;
the consumed constant lives in acquire-retry-policy.js). acquisition/acquire.js drops a
double-defaulting spread at the acquireFullStaged call site (the spread's withThrottle value was
by construction mergedDeps' own value or the same default the callee re-derives; full
case-matrix refutation including the null/undefined split found no divergent reachable shape).

## [0.13.24]

### Fixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -190,17 +190,12 @@ def parse_claims(section_body: str, *, start_line: int = 1) -> List[Claim]:
fences = extract_fences(block, start_line=block_start)
except ValueError:
fences = []
unclosed = True
else:
unclosed = False
fence = fences[0] if fences else None
prose = block if not fences else block.split("```", 1)[0]
# Forbidden carriers are defects even when a later fence is valid —
# a leftover blockquote/inline quote is still hook-corruptible.
has_bq = bool(re.search(r"(?m)^>", prose))
has_inline = bool(re.search(r"(?<!`)`[^`\n]+`(?!`)", prose))
if unclosed:
fence = None
claims.append(
Claim(
number=int(match.group(1)),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,13 +304,7 @@ export async function acquireYouTubeMedia(
let acquireMetrics;

if (mode === "full") {
const staged = await acquireFullStaged(
{ ...mergedDeps, withThrottle: throttle },
url,
workDir,
videoId,
source,
);
const staged = await acquireFullStaged(mergedDeps, url, workDir, videoId, source);
acquireMetrics = staged.acquireMetrics;
if (!staged.ok) {
return failVideo(staged.error ?? "staged acquire failed");
Expand Down
Loading