# Manage Rules

> Inspect, audit, enable, or disable project live-rules. Use to list rules, check active instructions, explain an injected rule, or recover an atomic manifest.

- Skill: `eigenwise/manage-rules` (Agent Skill)
- Install (CLI): `npx skillmds@latest add eigenwise/manage-rules`
- Raw SKILL.md: https://api.skillmd.com/api/skills/eigenwise/manage-rules/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Security
- Author: eigenwise (https://skillmd.com/u/eigenwise)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/eigenwise/manage-rules

---


# Manage Rules

Read, audit, and toggle live rules without changing what a rule says. For authoring or editing rule
content, use the `add-rule` skill. The full format is documented in
`../add-rule/references/rule-format.md`.

New workspaces use one rule per Markdown file under `.claude/live-rules/rules/` and a generated
`.claude/live-rules/manifest.json`. Never edit the manifest directly. After every rule-file change,
run:

```text
node "${CLAUDE_PLUGIN_ROOT}/scripts/sync-atomic-rules.js" --project "${CLAUDE_PROJECT_DIR}"
```

Existing projects may still use a legacy file. The default is `.claude/live-rules.md`; an explicit
`LIVE_RULES_PATH` may point to another project-relative, absolute, or `~`-relative file. The legacy
format is for migration or an explicit override only. SessionStart automatically migrates the default
legacy file, verifies the atomic result, and removes the old file. An explicit path is preserved, and a
failed verification keeps the legacy file.

## Find the rules and manifest

Check the atomic directory first:

1. If `.claude/live-rules/rules/` exists, inspect its `.md` files and the generated manifest.
2. If the directory exists but `manifest.json` is missing, malformed JSON, or has the wrong schema,
   report an **atomic manifest recovery problem**, not "no rules". Run the sync command above to rebuild
   the manifest from the rule files, then audit again.
3. If the manifest is parseable but hashes or metadata do not match the rule files, report a stale
   manifest. The runtime reads the rule files directly and marks the mismatch; run sync to resync it.
4. If the atomic directory is absent, resolve the legacy file from `LIVE_RULES_PATH` or the default
   path. If that file exists, report legacy storage and explain that SessionStart can migrate it. If no
   atomic directory and no legacy file exist, report that no rules are configured and point the user to
   `add-rule`.

A missing or malformed manifest with atomic rule files is never a clean no-rules result. Preserve the
rule files while recovering it. If sync names a malformed rule file, repair that file and run sync again.

## How to read the files

For atomic storage, inspect every `.md` rule under `.claude/live-rules/rules/`. Each file must contain
exactly one rule. Compare its parsed metadata and content hash with the corresponding manifest entry.
For legacy storage, parse the file as a sequence of frontmatter sections. Anything before the first
fence is an intro; a bare file with no complete frontmatter block is one global rule.

## Tasks

### List the rules

Parse every section or atomic file and present a compact table. Use the `description` as the rule name,
fallback to the filename or position:

| Rule | Storage | Scope | Fires when | Priority | Enabled |
|------|---------|-------|-----------|----------|---------|
| House style | atomic | global | matching prompt when unseen or changed | 0 | yes |
| React component conventions | atomic | glob | editing `**/*.tsx` when unseen or changed | 0 | yes |
| API layer rules | atomic | dir | editing under `packages/api`, or matching cwd | 0 | yes |
| Deploy checklist | atomic | prompt | prompt matches `deploy` when unseen or changed | 0 | yes |
| Strict lint gate | atomic | glob | matching edit | 0 | **no** |

Derive scope the same way as the hooks: no `globs`, `dirs`, or `prompt` means global; otherwise list
whichever are present. A rule with only `include:` is still global. Note the include payload and
whether its target exists.

### Audit the rules

Check the storage and manifest before checking individual rules. Report concrete issues and the exact
recovery:

- **Missing or malformed atomic manifest:** `.claude/live-rules/rules/` exists but `manifest.json` is
  absent, invalid JSON, or has an unsupported shape. Run the owned sync command; do not report no rules.
- **Stale atomic manifest:** a rule hash, path, or metadata field differs from the generated value. The
  rule files are the authority; run sync to resync the manifest.
- **Dropped atomic rule:** a manifest entry points to a missing or unsafe path, or a file contains more
  than one rule. Name the file, repair it, and run sync.
- **Broken or empty frontmatter** that the parser would skip, such as an unterminated array, missing
  closing `---`, or no body.
- **A stray `---` inside a body**, which the parser reads as the next rule's fence. Suggest `***` or
  `___` instead.
- **Globs that match nothing** in the repo. Compile the glob and test it against tracked files before
  reporting it.
- **Invalid prompt regexes** written as `/.../flags`.
- **An `include:` target that does not exist.** A rule whose includes are all missing is dropped and
  injects nothing.
- **Duplicates or conflicts:** contradictory instructions or near-identical rules that should be merged.
- **Oversized rules:** a body long enough to crowd the roughly 10k-character injection budget.
- **Over-broad global rules** that should be scoped to a file, directory, or prompt.
- **Unexpected legacy storage:** explain the migration or explicit `LIVE_RULES_PATH` exception and
  check whether SessionStart can migrate it.

Summarize findings as a short list of "rule or manifest: problem, suggested fix". Only change content
if the user asks. `add-rule` is the right tool for content rewrites; manifest recovery uses the sync
command.

### Enable or disable a rule

Toggle a rule without deleting it: find its atomic file or legacy section, set `enabled: true` or
`enabled: false` in its frontmatter, and save. For atomic storage, run sync after saving so the
manifest records the new metadata. Leave other files and sections untouched. Confirm which rule you
toggled and its new state.

### Explain what is active

Given a situation such as "for a normal prompt", "when I edit `src/app/page.tsx`", or "when I say
'tdeploy'", walk the rules and report which ones are eligible and why, mirroring the hook logic:

- **At SessionStart:** applicable startup rules are injected and the session ledger is reset.
- **On a prompt:** global rules, matching prompt rules, and directory rules whose directory contains the
  session cwd are selected; only new or changed unseen hashes are emitted after SessionStart.
- **Before an edit:** glob rules matching that file and directory rules containing it are selected;
  only new or changed unseen hashes are emitted.

A rule carrying `include:` fires only if at least one included file exists. If all are missing it is
dropped. Explain whether a selected rule was already seen unchanged in this session or is newly matching,
so "why did Claude follow this?" and "why didn't it?" have a concrete answer.

## Guidelines

- **Read and toggle, not rewrite.** Send content changes to `add-rule`.
- **Recover manifests from source files.** Never hand-edit generated JSON.
- **Verify before claiming.** Test a glob against the repo file list and inspect include targets.
- **Never touch `CLAUDE.md`** or `CLAUDE.local.md`.
- After a change, remind the user to review and commit the atomic rule files and generated manifest so
the team stays in sync.

## Success criteria

- [ ] Atomic directory, rule files, manifest, and legacy fallback are distinguished
- [ ] Missing or malformed manifests are reported as recovery problems, never as clean no-rules
- [ ] Existing resync command is run or clearly directed when the manifest is missing or stale
- [ ] Rules are listed with storage, scope, trigger, priority, and enabled state
- [ ] Audit reports real, rule-specific issues and tests globs against actual files
- [ ] Any enable/disable change applies to the right file or section and is synced when atomic
- [ ] `CLAUDE.md` is untouched

