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-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.31.0",
"version": "0.31.1",
"description": "Claude Code operations toolkit. Ten skills: 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 \u2014 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 a bundled known-performance-issues reference; separates the three documented suspects \u2014 accumulated state, version regression, component bloat \u2014 and routes remediation out; reports, never mutates), 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 seven advisory *-audit telemetry-emitter hooks (API errors, config changes, instruction loads, permission denials, pre-compaction, skill usage, tool failures) 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
32 changes: 32 additions & 0 deletions plugins/claude-ops/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,38 @@
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.31.1]

### Fixed

- **`skills/inventory` bundled-skill fields could bleed from the next registration.** The extractor
read each registration through a fixed 4000-character window — the failure mode `build_brace_map`
exists to prevent for commands, and the one `reference/extraction.md` names as the thing not to
do. A registration omitting a description adopted the following one's. Fields are now bound to
their own literal via the brace map, and an unmatched brace is counted and surfaced rather than
silently skipped.
- **Manifest-declared component paths were ignored.** `PLUGIN_COMPONENTS` carried a manifest key per
component and a comment claiming the manifest is read before the tree; nothing read it. A declared
path replaces the default directory, so scanning defaults regardless reported components a plugin
does not ship. Dotted keys resolve the `experimental` block.
- **`--self-check` lost its diagnostic when no binary was found.** `pick_binary` stores its
explanation under `reason`; the self-check path read only `error` and printed a generic message.
- **An unreadable CLI version passed silently.** It is itself a drift signal, so it now degrades the
verdict instead of skipping the comparison.
- **`--self-check` degraded and an argparse usage error both exited 2.** A CI gate treating 2 as
"degraded, warn" would silently swallow a mistyped flag. Degraded is now 3, leaving 2 to argparse:
0 ok, 1 broken, 2 usage error, 3 degraded.

### Added

- **`skills/inventory` reads installed plugins and project scope.** Only marketplace catalogs were
scanned, so a plugin installed from a marketplace that is no longer cached was invisible;
`disk.installed_plugins` now walks the plugin cache, and catalog, installed, and enabled are
reported as three distinct sets. A project's `.claude` tree contributes skills, agents, and wired
hook events that no machine-scope scan sees — `--project-dir` defaults to the working directory.
Wired hook events are reported, never hook scripts on disk, which would repeat the
present-versus-active error the skill warns about.

## [0.31.0]

### Added
Expand Down
21 changes: 16 additions & 5 deletions plugins/claude-ops/skills/inventory/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,11 @@ One per line, alphabetical, with aliases and hidden/gated markers.
One per line, alphabetical.

## Plugin components
Grouped by marketplace, then plugin, with a component-type breakdown.
Installed plugins grouped by marketplace, then plugin, with a component-type breakdown.
Catalog-only entries — offered by a cached marketplace but not installed — are listed separately.
Comment thread
kyle-sexton marked this conversation as resolved.

## Project scope
Skills, agents, and wired hook events from the current project's `.claude` tree, when present.

## Provenance
Which source produced which section, and anything the run could not resolve.
Expand Down Expand Up @@ -119,8 +123,14 @@ hooks live in its own manifest. Report the map as read and route the verdict to
alongside `resolved`. When they differ, some registration used a dynamically computed name; say so
rather than reporting the smaller number as complete.

**A marketplace checkout is not an installation.** Plugins under a cached marketplace are a catalog
of what is *available*. Only `enabledPlugins` says what loads.
**A marketplace checkout is not an installation, and neither is enablement.** Three different sets:
a cached marketplace is a catalog of what is *available*, `disk.installed_plugins` is what is
*present locally*, and `enabledPlugins` governs what *loads*. They routinely disagree — report the
one the question is actually about, and say which you used.

**A hook script on disk is not a wired hook.** Project scope reports hook *events* declared in
settings, not files sitting in a `.claude/hooks/` directory. A script nothing references is dead
weight, and listing it as a hook repeats the same present-versus-active error.

## How the binary read works

Expand Down Expand Up @@ -177,8 +187,9 @@ exports the script does not know about, and the resolved-versus-seen gap on bund
python3 "${CLAUDE_PLUGIN_ROOT}/skills/inventory/scripts/inventory.py" --self-check
```

It prints one verdict line and exits `0` ok, `1` broken, `2` degraded — so it works as a CI gate, a
loop-lane step, or a post-update check without parsing JSON. The natural trigger is a CLI release:
It prints one verdict line and exits `0` ok, `1` broken, `3` degraded — so it works as a CI gate, a
loop-lane step, or a post-update check without parsing JSON. `2` is left to argparse for a usage
error, so a mistyped flag can never be mistaken for a degraded run. The natural trigger is a CLI release:
`/claude-ops:changelog` already ingests those, and this is the check to run when it reports one.

**What a maintainer actually updates.** Most releases need no change — registrar names are
Expand Down
Loading