Skip to content

Han v3.0.0 - Plugin restructure as dependencies#29

Merged
mxriverlynn merged 19 commits into
mainfrom
plugin-restructure-as-dependencies
May 29, 2026
Merged

Han v3.0.0 - Plugin restructure as dependencies#29
mxriverlynn merged 19 commits into
mainfrom
plugin-restructure-as-dependencies

Conversation

@mxriverlynn
Copy link
Copy Markdown
Collaborator

@mxriverlynn mxriverlynn commented May 29, 2026

Summary

This PR splits the single han plugin into three published plugins (han, han.core, han.github) wired together through plugin dependencies, and adds a work-items-to-issues GitHub skill, so that operators can install just the core toolkit or the full GitHub-aware suite, and can publish a planned work breakdown straight to GitHub issues.

  • The install surface changes from one plugin to three: han.core (all planning, investigation, review, and documentation skills/agents), han.github (GitHub-facing skills, depends on han.core), and han (a 3.0.0 meta-plugin with no components that pulls in both via dependencies).
  • There is no GitHub-only install path. han.github declares han.core as a dependency, so installing the GitHub skills always brings the core along.
  • New behavior: the work-items-to-issues skill turns a work-items.md file into GitHub issues, one per slice, in each slice's target repo, linking within-repo blockers natively and creating issues unassigned and unlabeled by default.
  • Most of the 195-file diff is mechanical moves (plugin/ to han.core/, plus two skills into han.github/). Reviewer attention belongs on the four manifest files and the new skill, not the renames.

Behavior changes

How the suite is installed and structured:

Before After
Plugins published One han plugin holding everything Three: han (3.0.0), han.core (1.0.0), han.github (1.0.0)
Core skills/agents Lived under plugin/ Live under han.core/
GitHub skills Bundled with everything Isolated in han.github/, which depends on han.core
Installing the full suite Install han Install han meta-plugin, which depends on han.core + han.github

New runtime capability: running work-items-to-issues against a work-items.md validates the file format (with evidence-based repair prompts), maps each slice to its target repo, writes per-repo work-items files, then runs three idempotent shell scripts to upload UI screenshots, create one issue per slice (blocker-first, resumable), and link within-repo blocked_by dependencies. Cross-repo dependencies are a format error, not a native link.

What to look at first

  • The dependency topology in the four manifests: confirm han 3.0.0 depends on both han.core and han.github, han.github depends on han.core, and that this matches the marketplace listing. This is the central decision of the PR and the only deliberate "no GitHub-only install" tradeoff.
  • The default-no-label, default-no-assignee choice in the new skill, and the rule that native blocked_by links are within-repo only while cross-repo dependencies are surfaced as a format error. Worth confirming this matches how the team expects issue dependencies to behave.
  • Version numbers reset on the split: han jumps to 3.0.0 while han.core and han.github start at 1.0.0. Confirm that intent.

How this was tested

  • ✅ Verified all three plugin folders (han/, han.core/, han.github/) exist with their own .claude-plugin/plugin.json.
  • ✅ Confirmed marketplace.json lists all three plugins with matching names and versions (han 3.0.0, han.core 1.0.0, han.github 1.0.0).
  • ✅ Confirmed the dependency declarations resolve: han depends on han.core + han.github; han.github depends on han.core.
  • ✅ Confirmed the new skill ships all four executable scripts (publish-work-items.sh, upload-screenshots.sh, create-issues.sh, link-blockers.sh).
  • ✅ Confirmed the GitHub API path used for blocker links (issues/<N>/dependencies/blocked_by) is cited as verified in the commit history.

Files of interest

  • .claude-plugin/marketplace.json — the single source listing all three plugins, their versions, and descriptions.
  • han/.claude-plugin/plugin.json — the new meta-plugin; its dependencies array is what makes one install pull in both others.
  • han.github/.claude-plugin/plugin.json — declares the han.core dependency that removes any GitHub-only install path.
  • han.github/.../work-items-to-issues/SKILL.md — the full process for the new skill: repo mapping, format validation, and the publish pipeline.
  • docs/choosing-a-han-plugin.md — new operator-facing guide for deciding which of the three plugins to install.

Add a top-level han plugin that ships no components of its own and
declares han.core and han.github as dependencies, so installing han
pulls in the full suite. List all three plugins (han, han.core,
han.github) in the marketplace with ./-relative sources.
…ests

Sync the marketplace entries to the bumped manifest versions: the han
meta-plugin to 3.0.0 and the split-out han.core to a fresh 1.0.0 line.
The plugin was split into han.core (planning, investigation, review,
documentation skills plus all agents) and han.github (gh-pr-review,
update-pr-description). Update every long-form doc, index, template, and
guidance reference to point at the new locations. Skill-building guidance
paths globs now cover both han.core/skills and han.github/skills.
…ugin split

Rewrite the CLAUDE.md repository layout to show the han / han.core /
han.github structure, repoint CONTRIBUTING scaffolding paths, drop the
stale skill-count instruction in favor of the count-free catalog
convention, and document installing the suite or individual plugins in
the README.
@mxriverlynn mxriverlynn changed the title Plugin restructure as dependencies Han v3.0.0 - Plugin restructure as dependencies May 29, 2026
Draft feature spec, decision log, and findings header for the new
documentation that explains the han.core / han.github / han split and
helps readers choose what to install. Closes the spec stage of #30.

Co-Authored-By: River Bailey <river.bailey@testdouble.com>
Verified the auto-install dependency behavior against the official
Claude Code plugin-dependencies reference (junior-developer's blocker).
Narrowed the han/han.github equivalence to 'same skills and agents',
made the dependency explanation precede the decision aid, added the
no-GitHub-only correction to the README itself, a fifth entry point
from the why-solo page, and a structural recommended-option marker.

Co-Authored-By: River Bailey <river.bailey@testdouble.com>
New docs/choosing-a-han-plugin.md explains the three-plugin split, the
han.github -> han.core dependency (no GitHub-only install), and a
which-one-do-you-need guide with the full han suite marked as the
recommended default. Wires entry points from the README install
section, path-picker, and Documentation list; the Concepts packaging
section; the Quickstart opening frame; and the why-solo fit callout.
Adds the page to the CLAUDE.md project map. Implements #30.

Co-Authored-By: River Bailey <river.bailey@testdouble.com>
Round-2 review of the actual documentation surfaced and fixed:
- decision-aid row implied han owns the GitHub skills (it has no
  components); reworded to 'the full suite includes them'
- han.core manifest + marketplace entry wrongly claimed PR-description
  and PR-code-review skills (those live in han.github); removed
- forward-compatibility promise was uncited speculation; reframed
  around the meta-plugin's documented purpose
- em-dash in the table and a pre-existing one in quickstart; removed
- Concepts 'See also' bar missing the new page; added
- standardized on 'GitHub PR skills'; dropped 'just' from the README
- added a marketplace gloss + post-install verification note
- softened an unverified runtime claim in the composability section

Recorded as round 2 in the plan's team-findings. Refines #30.

Co-Authored-By: River Bailey <river.bailey@testdouble.com>
Publishes /plan-work-items output to GitHub issues, one per slice, in
each slice's target repo. Includes the publish pipeline (upload
screenshots, create issues, link within-repo blockers) and reference
files for the slice format, work-items file format, screenshot embed
rules, and reference-artifact inventory.

Brings the skill into line with repository guidance:
- rewrite the description per skill-description-frontmatter (folded,
  four components, names plan-work-items and gh-pr-review boundaries,
  notes the gh CLI requirement); fix grammar
- add allowed-tools and argument-hint frontmatter
- replace the Step 6 fenced/hardcoded .claude/skills path with prose
  using ${CLAUDE_SKILL_DIR} per script-execution-instructions
- remove all gearjot client references in favor of generic <org>/acme
  placeholders
- fix dangling references (/han: namespace -> /plan-work-items,
  .claude/rules/evidence-required.md, ui-design-from-feature-spec)
Issues are now created unlabeled and unassigned by default. The
previously hardcoded `ralph` label and `@me` assignee become optional
`--label <name>` and `--assignee <user>` flags, parsed by
create-issues.sh and forwarded through publish-work-items.sh. Empty
flags expand safely under `set -u` on bash 3.2.

Surface the inputs in the frontmatter: argument-hint now lists the
target repo(s), the optional label, and the optional assignee, and the
SKILL process notes the no-label/no-assignee default.
Add the long-form operator doc for the work-items-to-issues skill and
wire it into the skills index, the CLAUDE.md catalog, and the
han.github layout line. Add a bidirectional downstream pairing on
plan-work-items.

The new GitHub skill made "the two GitHub PR skills" framing stale, so
reframe han.github as "the GitHub skills" (not just PR skills) across
README, concepts, and the choosing-a-han-plugin page, add the skill to
the choosing-page enumeration, and broaden its decision table beyond
PRs. Remove hardcoded skill counts ("two GitHub PR skills", "Seven
sizing-aware skills") in favor of count-free phrasing, per the
"indexes stay complete, not counted" convention.

Sources section carries a TODO to confirm the issue-dependencies API
docs URL.
Resolve the Sources TODO with a researched, corroborated citation for
the GitHub issue-dependencies endpoint that link-blockers.sh uses:

- Canonical REST reference: docs.github.com/en/rest/issues/issue-dependencies
- GA announcement (2025-08-21), which documents the 50-issues-per-
  relationship-type limit.

The research confirmed the script's posting contract is already correct:
POST .../issues/{n}/dependencies/blocked_by with the blocker's global
`issue_id` (its database id, not the repo-local number), no preview
header needed. Document that contract and the 50-link limit in
link-blockers.sh, and annotate why the script reads `.id` not `.number`.
@mxriverlynn mxriverlynn marked this pull request as ready for review May 29, 2026 15:57
@mxriverlynn mxriverlynn merged commit c087b39 into main May 29, 2026
@mxriverlynn mxriverlynn deleted the plugin-restructure-as-dependencies branch May 29, 2026 15:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant