Skip to content
Draft
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
48 changes: 48 additions & 0 deletions .agents/plugins/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,18 @@
"displayName": "Han"
},
"plugins": [
{
"name": "han",
"source": {
"source": "local",
"path": "./han"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
},
{
"name": "han-communication",
"source": {
Expand All @@ -28,6 +40,30 @@
},
"category": "Developer Tools"
},
{
"name": "han-documentation",
"source": {
"source": "local",
"path": "./han-documentation"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
},
{
"name": "han-research",
"source": {
"source": "local",
"path": "./han-research"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
},
{
"name": "han-planning",
"source": {
Expand Down Expand Up @@ -100,6 +136,18 @@
},
"category": "Developer Tools"
},
{
"name": "han-linear",
"source": {
"source": "local",
"path": "./han-linear"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
},
{
"name": "han-plugin-builder",
"source": {
Expand Down
27 changes: 25 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

Han is a suite of AI skills and agents for solo (or small-team) product engineers. It combines evidence-based planning,
test-driven implementation, full documentation maintenance, deep code review, and architectural analysis into a team of
specialists you can dispatch from Claude Code.
specialists you can dispatch from your agent harness, including Claude Code and Pi.

## What this plugin does

Han turns planning, implementation, review, and documentation work that would normally take a team into a set of
deterministic skills you run from Claude Code.
deterministic skills you run from your agent harness.

Each skill dispatches specialist agents, such as project managers, adversarial reviewers, investigators, architectural
analysts, and testing and security specialists, to do the judgment-heavy work. It then folds their findings into an
Expand Down Expand Up @@ -92,6 +92,29 @@ Install `han-feedback`, `han-atlassian`, `han-linear`, or `han-plugin-builder` s
packages. Because Codex resolves no dependencies, install `han-communication` alongside `han-atlassian` (its wrapped
prose-producing skills source the shared readability standard from it).

### Pi

Han now ships a Pi marketplace manifest at `.agents/plugins/marketplace.json` with the same plugin set as the Claude
marketplace, including `han`, `han-documentation`, `han-research`, and `han-linear`.

If you are installing through Pi, use this repository's `.agents/plugins/marketplace.json` as the source of truth for
available Han plugins.

### Environment setup (optional)

Han reads personal config from `{harness-config-root}/.han/config.md`. You can set `AGENT_CONFIG_DIR` to pick that
harness config root explicitly, independent of which harness you are running under.

```bash
# one-off
AGENT_CONFIG_DIR="$HOME/.config/agent" pi

# persistent (zsh/bash profile)
export AGENT_CONFIG_DIR="$HOME/.config/agent"
```

Without this variable, Han falls back to `CLAUDE_CONFIG_DIR` and then `~/.claude`.

## Documentation

- [Concepts](./docs/concepts.md). Skill vs. agent, and how they compose. Read once before using the plugin.
Expand Down
4 changes: 2 additions & 2 deletions docs/concepts.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ Those three are the whole decision model. Everything else is vocabulary.

## Skills: the process layer

A skill is a fixed sequence of steps that Claude Code runs. Typing the slash command is the primary way to trigger it,
A skill is a fixed sequence of steps that your agent harness runs. Typing the slash command is the primary way to trigger it,
but not the only one.

- You invoke it: `/code-review`, `/plan-a-feature`, `/investigate`. This is the deliberate, primary path.
Expand Down Expand Up @@ -204,7 +204,7 @@ table, and the fidelity guard.

## Configuration

Han reads two optional `.han/config.md` files on every skill run: a personal one in your Claude Code configuration
Han reads two optional `.han/config.md` files on every skill run: a personal one in your harness configuration
directory, and a project one at the project root. Either sets a base directory for the skills' markdown deliverables, a
default swarm size for the sizing-aware skills, a writing-voice profile for the readability skills, and extra agents for
the dispatching skills to consider. The personal file supplies defaults that follow you into every project, and the
Expand Down
23 changes: 18 additions & 5 deletions docs/configuration.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Configuration

Han reads two optional configuration files, and you can use either one or both. A personal `.han/config.md` in your
Claude Code configuration directory carries settings that follow you into every project. A project's own
harness configuration directory carries settings that follow you into every project. A project's own
`.han/config.md` adjusts those settings for that project. Both control where skills write their markdown deliverables,
which extra agents dispatching skills consider, the default swarm size the sizing-aware skills start at, and the
writing-voice profile the readability skills apply. Every Han skill reads both files on every run, so the overrides take
Expand Down Expand Up @@ -31,11 +31,24 @@ effect without depending on the model remembering to look. Someone with neither

## Where each file goes

- **Personal:** `.han/config.md` inside your Claude Code configuration directory. That is `~/.claude` unless you have
set `CLAUDE_CONFIG_DIR`, in which case it is wherever that points. If you have moved your configuration directory, a
file left behind in `~/.claude/.han/` does not apply.
- **Personal:** `.han/config.md` inside your harness configuration directory. The resolver checks
`AGENT_CONFIG_DIR` first, then `CLAUDE_CONFIG_DIR`, then falls back to `~/.claude`. If you have moved your configuration
directory, a file left behind in `~/.claude/.han/` does not apply.
- **Project:** `.han/config.md` in the directory you run Han skills from.

### Environment setup (optional)

If your harness stores user config outside `~/.claude`, set `AGENT_CONFIG_DIR` to the harness config root and Han will
read personal settings from `$AGENT_CONFIG_DIR/.han/config.md`.

```bash
# one-off
AGENT_CONFIG_DIR="$HOME/.config/agent" pi

# persistent (zsh/bash profile)
export AGENT_CONFIG_DIR="$HOME/.config/agent"
```

Neither lookup walks up the directory tree. In a monorepo, each package can carry its own config; running a skill from a
directory without one behaves as if the project file were absent, even when another directory in the repo has one. Your
personal file still applies in all of them.
Expand All @@ -50,7 +63,7 @@ Every setting is optional, everything unrecognized is ignored, and both files ta
# folder and file structure beneath it, and creates the directory on first
# write. A relative path is read from the folder holding this file, so the
# same line means "inside this project" in a project config and "inside my
# Claude Code configuration directory" in a personal one. Full paths and a
# harness configuration directory" in a personal one. Full paths and a
# leading ~ are accepted, including paths outside the project.
output-directory: docs/han

Expand Down
2 changes: 1 addition & 1 deletion docs/quickstart.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ need the real skill, spend it here.
architectural decisions.
5. **[`.han/config.md`](./configuration.md)** _(as needed)._ Carry an optional config file to set a base directory for
Han's markdown outputs, a default swarm size for the sizing-aware skills, a writing-voice profile, and extra agents
for dispatching skills to consider. Put it in your Claude Code configuration directory for settings that follow you
for dispatching skills to consider. Put it in your harness configuration directory for settings that follow you
everywhere, or at the project root for that project alone.

**You are done when:** you have a `## Project Discovery` section in your AGENTS.md or CLAUDE.md and the docs and
Expand Down
2 changes: 1 addition & 1 deletion docs/templates/skill-long-form-template.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ to use the skill. For what the skill does internally, read the skill definition

## How to invoke it

Run `/{skill-name}` in Claude Code.
Run `/{skill-name}` in your agent harness (for example Claude Code or Pi).

Give it:

Expand Down
2 changes: 1 addition & 1 deletion docs/why-solo-and-small-teams.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
_Audience: developers and engineering leaders evaluating Han for any team size. Time to read: about two minutes.
Outcome: decide whether Han fits your situation, or stop here._

> **Short answer.** Han is a Claude Code plugin that gives a single engineer the specialist coverage of a team. It does
> **Short answer.** Han is an agentic plugin suite that gives a single engineer the specialist coverage of a team. It does
> not give a team the shared lift of an enterprise AI platform. If you need centralized governance, shared prompts
> across developers, indexed org knowledge, or audited AI usage at org scale, Han is not your tool. Bolting those things
> on later will cost more than starting with a product that includes them. If you are a solo engineer or a small team
Expand Down
17 changes: 9 additions & 8 deletions han-atlassian/references/config-rule.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Config Rule (`.han/config.md`)

Han reads two optional configuration files, and either one may be absent. A person may carry a personal
`.han/config.md` inside their Claude Code configuration directory, and a consuming project may carry its own
`.han/config.md` inside their coding-agent configuration directory, and a consuming project may carry its own
`.han/config.md`. The personal file supplies defaults that follow the person into every project; the project file
adjusts them for that project. Each participating skill finds both through its `## Project Context` block; this rule
defines how every skill interprets what that block yields, so one pair of files resolves identically across the whole
Expand All @@ -12,9 +12,10 @@ suite. Every vendored copy of this file is byte-identical to the canonical `han-
The `## Project Context` block carries two probe lines and directs one Read-tool call. This rule refers to each by the
label it injects under, or by the file it reads.

- `personal config directory` (probe): the Claude Code configuration directory, resolved for this run. Named by the
`CLAUDE_CONFIG_DIR` environment variable when that variable is set, and `~/.claude` when it is not. This value is not
a setting. It is the folder a relative path in the personal file resolves against.
- `personal config directory` (probe): the coding-agent configuration directory, resolved for this run. Named by the
`AGENT_CONFIG_DIR` environment variable when that variable is set, otherwise by `CLAUDE_CONFIG_DIR` when that variable
is set, and `~/.claude` when neither is set. This value is not a setting. It is the folder a relative path in the
personal file resolves against.
- The personal `.han/config.md` (Read tool): the content of `.han/config.md` inside that directory, or nothing. The
skill reads this file itself as its first action rather than through a probe. A probe runs at skill load, where it
cannot prompt and cannot degrade, so a permission decision against it aborts the skill instead of falling back to
Expand All @@ -23,15 +24,15 @@ label it injects under, or by the file it reads.
- `project .han/config.md` (probe): the content of `.han/config.md` in the directory the skill is running from, or
nothing.

The two directories can both exist on one machine and point at different places, so the variable wins whenever it is
set. A personal file sitting in `~/.claude/.han/config.md` does not apply to a person who has pointed
`CLAUDE_CONFIG_DIR` somewhere else.
These directories can all exist on one machine and point at different places, so the first defined variable in the
precedence order wins. A personal file sitting in `~/.claude/.han/config.md` does not apply to a person who has pointed
`AGENT_CONFIG_DIR` or `CLAUDE_CONFIG_DIR` somewhere else.

Neither lookup walks up the directory tree. The project file is found only in the directory the skill runs from, the
same place the CLAUDE.md and project-discovery probes look. A config elsewhere in the repository does not apply. When
neither lookup yields content, no config is present: behave exactly as the skill does without this rule, with no note.

When both lookups resolve to the same file, because the skill is running inside the Claude Code configuration
When both lookups resolve to the same file, because the skill is running inside the active coding-agent configuration
directory, read it once and treat it as the project configuration. Nothing is counted twice, and its `## Extra Agents`
list is one list.

Expand Down
2 changes: 1 addition & 1 deletion han-atlassian/skills/code-overview-to-confluence/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ allowed-tools: Read, Glob, Grep, Skill, Agent, Bash(find *), mcp__claude_ai_Atla

## Project Context

- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
2 changes: 1 addition & 1 deletion han-atlassian/skills/investigate-to-confluence/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ allowed-tools: Read, Glob, Grep, Skill, Agent, Bash(find *), mcp__claude_ai_Atla

## Project Context

- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
2 changes: 1 addition & 1 deletion han-atlassian/skills/markdown-to-confluence/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ allowed-tools:

## Project Context

- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
2 changes: 1 addition & 1 deletion han-atlassian/skills/plan-a-feature-to-confluence/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ allowed-tools:

## Project Context

- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ allowed-tools:

## Project Context

- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
2 changes: 1 addition & 1 deletion han-atlassian/skills/work-items-to-jira/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ allowed-tools:

## Project Context

- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
17 changes: 9 additions & 8 deletions han-coding/references/config-rule.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Config Rule (`.han/config.md`)

Han reads two optional configuration files, and either one may be absent. A person may carry a personal
`.han/config.md` inside their Claude Code configuration directory, and a consuming project may carry its own
`.han/config.md` inside their coding-agent configuration directory, and a consuming project may carry its own
`.han/config.md`. The personal file supplies defaults that follow the person into every project; the project file
adjusts them for that project. Each participating skill finds both through its `## Project Context` block; this rule
defines how every skill interprets what that block yields, so one pair of files resolves identically across the whole
Expand All @@ -12,9 +12,10 @@ suite. Every vendored copy of this file is byte-identical to the canonical `han-
The `## Project Context` block carries two probe lines and directs one Read-tool call. This rule refers to each by the
label it injects under, or by the file it reads.

- `personal config directory` (probe): the Claude Code configuration directory, resolved for this run. Named by the
`CLAUDE_CONFIG_DIR` environment variable when that variable is set, and `~/.claude` when it is not. This value is not
a setting. It is the folder a relative path in the personal file resolves against.
- `personal config directory` (probe): the coding-agent configuration directory, resolved for this run. Named by the
`AGENT_CONFIG_DIR` environment variable when that variable is set, otherwise by `CLAUDE_CONFIG_DIR` when that variable
is set, and `~/.claude` when neither is set. This value is not a setting. It is the folder a relative path in the
personal file resolves against.
- The personal `.han/config.md` (Read tool): the content of `.han/config.md` inside that directory, or nothing. The
skill reads this file itself as its first action rather than through a probe. A probe runs at skill load, where it
cannot prompt and cannot degrade, so a permission decision against it aborts the skill instead of falling back to
Expand All @@ -23,15 +24,15 @@ label it injects under, or by the file it reads.
- `project .han/config.md` (probe): the content of `.han/config.md` in the directory the skill is running from, or
nothing.

The two directories can both exist on one machine and point at different places, so the variable wins whenever it is
set. A personal file sitting in `~/.claude/.han/config.md` does not apply to a person who has pointed
`CLAUDE_CONFIG_DIR` somewhere else.
These directories can all exist on one machine and point at different places, so the first defined variable in the
precedence order wins. A personal file sitting in `~/.claude/.han/config.md` does not apply to a person who has pointed
`AGENT_CONFIG_DIR` or `CLAUDE_CONFIG_DIR` somewhere else.

Neither lookup walks up the directory tree. The project file is found only in the directory the skill runs from, the
same place the CLAUDE.md and project-discovery probes look. A config elsewhere in the repository does not apply. When
neither lookup yields content, no config is present: behave exactly as the skill does without this rule, with no note.

When both lookups resolve to the same file, because the skill is running inside the Claude Code configuration
When both lookups resolve to the same file, because the skill is running inside the active coding-agent configuration
directory, read it once and treat it as the project configuration. Nothing is counted twice, and its `## Extra Agents`
list is one list.

Expand Down
2 changes: 1 addition & 1 deletion han-coding/skills/architectural-analysis/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ allowed-tools: Read, Glob, Grep, Agent, Bash(find *)
- git installed: !`which git 2>/dev/null || echo "not installed"`
- CLAUDE.md: !`find . -maxdepth 1 -name "CLAUDE.md" -type f`
- project-discovery.md: !`find . -maxdepth 3 -name "project-discovery.md" -type f`
- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
2 changes: 1 addition & 1 deletion han-coding/skills/automated-test-planning/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ allowed-tools: Bash(git *), Bash(find *), Read, Grep, Glob, Agent
- git installed: !`which git 2>/dev/null || echo "not installed"`
- CLAUDE.md: !`find . -maxdepth 1 -name "CLAUDE.md" -type f`
- project-discovery.md: !`find . -maxdepth 3 -name "project-discovery.md" -type f`
- personal config directory: !`echo "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"`
- personal config directory: !`echo "${AGENT_CONFIG_DIR:-${CLAUDE_CONFIG_DIR:-$HOME/.claude}}"`
- project .han/config.md: !`cat .han/config.md 2>/dev/null || echo ""`

As your first action, use the Read tool on `.han/config.md` inside the `personal config directory` path above. A read
Expand Down
Loading