magus v0.4.3 is out. See what's new
¶ View generated markdown
7 min read

magus-change-summary

Short form: 3606 bytes, 45% smaller than the full form's 6577.

Summarize what changed in a magus workspace, write it up, or answer a granular diff question. Use for "what's been merged lately?", "catch me up since last week", "add this to the CHANGELOG", and "what exactly did this branch change?" Covers three outputs: a short evidence-backed brief, a Keep a Changelog entry in the repo's existing shape, and per-question diff commands. Always answer through magus commands (graph diff, describe file, affected --impact/--explain) rather than reading a raw diff; do not infer features from commit subjects alone.

Install it, rather than copying from this page:

magus agent install .claude/skills   # writes both forms below

An installed copy carries a provenance stamp, so magus doctor can tell you when a magus upgrade has made it stale. Text copied from this page carries none.

What an installed copy carries

magus agent install writes this frontmatter above the body. magus doctor reads it to report whether your installed skills are current.

field value
license GPL-3.0-or-later
compatibility any-agent
source magus
agent-skill-version 147
knowledge-schema-version 24
skill-content 073970f8aea0
skill-variant full

The skill-content digest covers this skill alone, and both forms below report it: they go stale together, never one silently, and a change to another skill does not move it.

The two forms

Both are hand-authored from one source body. The short form is the always-loaded primary - the enumeration dropped, the judgment kept, for the most capable readers rather than the least. The full form is its <name>-full twin, loaded by name when a reader wants the rationale. The bar above shows how much shorter the primary is; switch between them here to see exactly what it gave up. See Skills for how to choose.

magus agent install --tar | tar -xO -f - magus-change-summary/SKILL.md
# Recent changes

Output: short, evidence-backed brief.

## Evidence

1. Project map, target vocabulary: `magus ls`, `magus describe targets`. Never read `MAGUS.md` for this: stale-structure brief worse than none.
2. Requested time window:

   ```sh
   git log --first-parent --merges --since="<window>" --format='%h %ad %s' --date=short
   ```

   No VCS merge history -> say so.
3. Each candidate change: list files, then classify before reading:

   ```sh
   git show --format= --name-only <commit>
   magus describe file <paths...>
   ```

   Ignore generated outputs when identifying change.
4. Source files -> projects, graph entities. Prefer MCP `client` (`magus\query`, `magus\explain`, `magus\describe.file`); else:

   ```sh
   magus query "<project or feature terms>"
   magus explain <node>
   magus graph diff --rev <base> -o markdown
   ```

5. `client` (`magus\insight`) affinity, ownership, trend: only context (hidden coupling, ownership risk, rising activity). No CLI verb; without MCP: one lens via `magus buzz`:

   ```sh
   magus buzz -e 'import "std"; import "encoding/json"; import "magus"; fun main(args: [str]) > void !> str { std\print(json\stringify(magus\insight().trend)); }'
   ```

## Brief

Three to seven grouped changes, not every commit.
Each item:
- What landed: plain-language feature or behavior change.
- Affected projects, graph entities.
- Evidence: merge commits, source files, graph relation.
- Why it matters: user or dependency impact, or explicit uncertainty.
- Follow-up: concrete next command when more detail helps.

End: `Watch items`: hidden affinity, ownership, trend signals, or "None found."
Never label refactor, generated-output refresh, dependency bump, failed experiment as landed feature unless source, graph evidence support it.

## Changelog

"add this to the changelog" -> match file shape (Keep a Changelog 1.1.0, SemVer); append under `## [Unreleased]`.
Open: what user can now do, then why shape right.
Each entry:
- Name everything added: config key with env var, CLI flag, diagnostic code, target.
- Only Keep a Changelog headings: `Added`, `Changed`, `Deprecated`, `Removed`, `Fixed`, `Security`; never invent one.
- Behavior, not implementation.
- One entry per user-visible change, not per commit.
- `CHANGELOG.md`: source file, not generated.

## Granular diff

"what exactly changed in X": only magus commands.
- domain shape change: `magus graph diff --rev <base> -o markdown`
- file source or generated: `magus describe file <paths...>`
- projects reached: `magus affected --impact`
- why THIS project affected: `magus affected --explain <project>`
- node neighborhood now: `magus explain <node>`
- symbol defined, used: `magus refs <symbol>`
- target actual output: `magus query output <ref>`

Branch review: `magus graph diff` first, with `magus describe file` -> 300 paths collapse to few declared sources.
Raw VCS: who, when; above: what change did.

## Resume review

"what changed since last review, what needs look now", three pieces:
1. At review time: `magus vcs checkpoint -o name` prints revision, or `<revision>+<digest>` when tree dirty.
2. Later: `magus diff --rev <revision>...HEAD` -> annotated delta: each changed file's reach, public API exposure, referents. Uncommitted edits too: `git diff <revision> | magus diff --patch -`. Positional git ref refused by design.
3. Diff session: per-hunk viewed marks keyed by content digest, not position; unchanged stays marked, changed resurfaces.

Wrong: re-review whole branch; nobody recorded where last review stopped.
Right: checkpoint at review time, pipe delta later.
magus agent install --tar | tar -xO -f - magus-change-summary-full/SKILL.md
# Recent changes in a magus workspace

Turn a large workspace's recent change history into a short, evidence-backed
brief. The output is a decision aid, not a chronological commit dump.

## Contents

- Gather evidence
- Write the brief
- Write a changelog entry
- Answer a granular diff question
- Resume a review from a checkpoint

## Gather evidence

1. Get the project map and target vocabulary from the workspace: `magus ls` and
   `magus describe targets`. Do not read `MAGUS.md` for this: it is a generated index for human readers, and
   a history brief that describes stale structure is worse than none.
2. Establish the requested time boundary. On Git, inspect merge commits first:

   ```sh
   git log --first-parent --merges --since="<window>" --format='%h %ad %s' --date=short
   ```

   With no VCS merge history, say so. Use `client` (`magus\insight`) and read trend and hotspots for activity, but do not call that a merge summary.
3. List each candidate change's files, then classify them before reading:

   ```sh
   git show --format= --name-only <commit>
   magus describe file <paths...>
   ```

   Ignore generated outputs when identifying the change; trace them to their
   declared source and generator instead.
4. Map the source files to projects and graph entities. Prefer MCP
   `client` (`magus\query`, `magus\explain`, `magus\describe.file`); otherwise:

   ```sh
   magus query "<project or feature terms>"
   magus explain <node>
   magus graph diff --rev <base> -o markdown
   ```

5. Read affinity, ownership, or trend from `client` (`magus\insight`) only for
   context: hidden coupling, ownership risk, rising activity. They do not
   prove that a feature landed. Insight has no CLI verb; without MCP, read one lens
   through `magus buzz`:

   ```sh
   magus buzz -e 'import "std"; import "encoding/json"; import "magus"; fun main(args: [str]) > void !> str { std\print(json\stringify(magus\insight().trend)); }'
   ```

## Write the brief

Lead with three to seven grouped changes, not every commit. For each item:

- What landed, as a plain-language feature or behavior change.
- The projects and graph entities affected.
- The evidence: merge commit(s), source files, the relevant graph relation.
- Why it matters: user impact, dependency impact, or an explicit uncertainty.
- A follow-up: a concrete next command when more detail helps.

End with a `Watch items` section: hidden affinity, ownership, or trend signals, or
"None found." Use this shape:

```markdown
## Recent changes since <boundary>

### <feature or change>

<one-sentence outcome>

- Projects: `<project>`
- Evidence: `<commit>`; `<graph node or relation>`
- Follow up: `magus explain <node>`

## Watch items

- <hidden affinity, ownership, or trend signal, or "None found.">
```

Do not label a refactor, generated-output refresh, dependency bump, or failed
experiment a landed feature unless source and graph evidence support it.
Link to the relevant documentation page or generated manpage when it explains a
new command, target, diagnostic, or workflow.

## Write a changelog entry

A brief is for a person catching up; a changelog entry is a durable record. For "add
this to the changelog", match the file's shape (Keep a Changelog 1.1.0 with SemVer)
and append under `## [Unreleased]`. For example:

```markdown
### Added

- <What a user can now do, in one sentence.> <Why it is the right shape, or what it
  replaces.> Set `<config.key>` (env `MAGUS_<CONFIG_KEY>`) to <what the toggle does>;
  <default>.
```

Write each entry to this checkable list:

- Name everything it adds: the config key WITH its env var, the CLI flag, the
  diagnostic code, the target. A reader upgrades by searching for those strings.
- Use Keep a Changelog's section headings: `Added`, `Changed`, `Deprecated`,
  `Removed`, `Fixed`, `Security`. Never invent one.
- Write behavior, not implementation. "The graph indexes the build I/O layer" is an
  entry; "refactored the extractor" is not.
- One entry per user-visible change, not per commit. Squash a fix-up into the entry
  for the thing it fixed up.
- `CHANGELOG.md` is a SOURCE file, not generated; confirm with
  `magus describe file CHANGELOG.md` if unsure, and edit it directly.

## Answer a granular diff question

For "what exactly changed in X", stay on magus's own commands: they
classify and relate, where a raw diff only shows text.

| question | command |
| --- | --- |
| what did this change do to the domain's shape | `magus graph diff --rev <base> -o markdown` |
| is this changed file source or generated output | `magus describe file <paths...>` |
| which projects does the change reach | `magus affected --impact` |
| why is THIS project in the affected set | `magus affected --explain <project>` |
| what does one node's neighborhood look like now | `magus explain <node>` |
| where is this symbol defined and used | `magus refs <symbol>` |
| what did a target actually output | `magus query output <ref>` |

Reach for `magus graph diff` first on a branch review: it reports the
nodes and edges added, removed, or changed, which is blast radius as data rather
than a file list to interpret. Pair it with `magus describe file`, so a diff of 300
paths collapses to the few declared sources.

Raw VCS commands answer what only the VCS knows: who committed, when, and in which
merge. The table above answers what the change did. Reading a raw diff to work out
what a change affects is the work these verbs already did.

## Resume a review from a checkpoint

Answer "what changed since my last review, and what needs a look now" from three
pieces:

1. At review time: `magus vcs checkpoint -o name` prints the revision, or
   `<revision>+<digest>` when the tree was dirty (the digest says
   which dirty tree was reviewed, since the revision alone reads the same
   for every dirty tree built on it).
2. Later: `magus diff --rev <revision>...HEAD` gives the annotated delta: each
   changed file's reach, public API exposure, and referents,
   the surrounding code worth a second look, not just the literal
   hunks. To count uncommitted edits too, hand it the patch:
   `git diff <revision> | magus diff --patch -`. `magus diff` refuses a positional
   git ref on purpose; a swallowed ref once printed the reader's own edits
   as the answer.
3. In a diff session, per-hunk viewed marks key off content digest, not position:
   unchanged stays marked, changed resurfaces.

WRONG: re-reviewing a whole branch because nobody recorded where the last review
stopped.
CORRECT: checkpoint at review time, pipe the delta later.
generatedinternal/agent/skills/magus-change-summary/SKILL.mdagentsskillsmagus-change-summary
Last updated (61fd39a7)
Earlier changes on this page (7)

Full history ↗ · Blame source ↗

Glossary

Workspace

The magus root directory that owns a set of projects and shared config; the unit magus operates over. Workspace in full.

Project

A directory magus recognizes as a unit of work (it has a magusfile); the unit of caching, scheduling, and dependency tracking. Project in full.

Target

A named operation (build, test, ...) you invoke with magus run <target>; it may compose a spell's tool-native operations and depend on other targets. Target in full.

Op

A single tool-native command a target composes (long form: operation); the middle of the work hierarchy (Spell to Op to Target). Op in full.

Buzz

The language magusfiles are written in (the .buzz engine). Buzz in full.

Affected

The set of projects touched by a change; magus affected <target> runs a target only over them. Affected in full.

CI

An ordinary target you compose yourself with ctx.needs; magus does not hardcode its stages. It is the anchor magus affected ci keys off, and ci strips the rw charm. CI in full.

Trace

OpenTelemetry's name for one whole magus invocation; every target it runs is a span beneath it. Trace in full.

MAGUS.md

The committed routing index at a workspace root, regenerated from the knowledge graph: it lists every node and points at the exact query for a given question, so it is the entry point an agent reads first. MAGUS.md in full.

Insight

The reports magus derives over the graph and history (hotspots, affinity, ownership, trend, volatility, unreferenced). Insight in full.

Hotspot

An insight lens: edit frequency times complexity, the prime refactoring targets. The project view heat-colors the dependency graph by churn; --files ranks individual files. Hotspot in full.

Affinity

An insight lens: projects that change together (temporal coupling). A pair that co-changes without either declaring a dependency on the other is a candidate architectural smell. Affinity in full.

Ownership

An insight lens for author concentration: the primary author and their share, the distinct-author count (the bus factor), and abandonment. Ownership in full.

Trend

An insight lens: the recent half of the window against the earlier half. A positive delta is a rising hotspot; a negative one is cooling. Trend in full.

Diagnostic code

A stable MGSxxxx identifier attached to a magus warning or error, so it can be referenced and looked up; some are guardrails (see wards), others hard errors. Diagnostic code in full.

Agent

A model working through an agent host such as Claude Code, Codex, Cursor or OpenCode. magus treats an agent as one more caller of its CLI, MCP tools and console, held to the same checks as a person. Agent in full.

Skill

A packaged set of instructions an agent host loads when a task matches its description: a directory holding a SKILL.md. magus ships its magus-* skills in the binary and writes them with magus agent install. Skill in full.

Session

An agent host's conversation, by the id the host delivers to its hooks. magus never mints one: a record with no session is unattributed, and the OS user it carries says whose account ran it. Session in full.

Window

The terminal a command runs in. It keys fire-once notices for a caller no host gave a session, and is never recorded as a session. Window in full.

Lease

The grant a holder takes on a job: the write and read paths that job declared, enforced in the checkout that took it with magus job exec. A job is the piece of work; a lease is permission over it. Lease in full.

Pane

A split within a tab. Splitting divides the focused pane along its longer side, so the same action tiles side-by-side on a desktop and stacks on a phone; a tab with no split is a single pane. Drag the divider to re-weight the split. Pane in full.

Conventions

Placeholders

Angle brackets mark a value you replace with your own; never type the brackets:

magus run <target>
magus completion <shell>    # e.g. bash, zsh, fish

<target>, <path>, <shell>, <name> and the like are stand-ins, not literal text.