Skip to content

Create han.atlassian plugin with first skills#49

Merged
mxriverlynn merged 13 commits into
mainfrom
han.atlassian
Jun 4, 2026
Merged

Create han.atlassian plugin with first skills#49
mxriverlynn merged 13 commits into
mainfrom
han.atlassian

Conversation

@mxriverlynn
Copy link
Copy Markdown
Collaborator

@mxriverlynn mxriverlynn commented Jun 3, 2026

Summary

This PR adds han.atlassian, a new opt-in Han plugin that publishes Han's local Markdown artifacts to Confluence and turns work-item files into Jira tickets, so teams on the Atlassian stack can push planning and documentation output straight into their tools.

  • Introduces three skills, all routed through a configured Atlassian MCP (Model Context Protocol) server: markdown-to-confluence (the publishing primitive), project-documentation-to-confluence (document-then-publish orchestrator), and work-items-to-jira (one Jira ticket per work-item slice).
  • The plugin depends on han.core but is deliberately not bundled by the han meta-plugin. Operators install it on its own, and every skill hard-stops at a preflight if the Atlassian MCP server is not reachable.
  • Safe-by-default posture: Confluence publishing defaults to an unpublished draft (status: "draft"), and Jira creation defaults to a Story, unassigned, in the project's initial Backlog status. Nothing goes live or gets assigned without an explicit override or confirmation.
  • Most of the diff is the new SKILL.md definitions plus their docs; reviewer attention belongs on the destination-resolution and parenting logic, not the file count.

Behavior changes

  • markdown-to-confluence takes one existing local Markdown file and a user-specified destination (a Confluence page URL, or a space plus optional parent page) and creates or updates a page. It never searches Confluence for a destination — the user must name it. Mode is draft (default) or live, mapping to the MCP status field "draft" vs "current". Mermaid fenced blocks are left intact and posted as source (Confluence does not render them natively), and the user is told so.
  • project-documentation-to-confluence is a thin orchestrator: it runs the core han.core:project-documentation skill to write a doc into /tmp/, shows the user the path for review, asks for an explicit publish choice (draft / live / keep local only), then hands the file to markdown-to-confluence. It owns no Confluence calls itself.
  • work-items-to-jira reads a work-items.md from /plan-work-items, validates its format (with evidence-based repair), creates one ticket per slice in a single project, links within-file Depends on dependencies, and optionally transitions tickets to a named --column. Optional --parent <KEY> controls nesting and the resulting child type: under an epic, each item is a standard issue (default Story); under a story (or other standard issue), each item becomes a subtask; parenting under a subtask is rejected. --epic is a deprecated alias for --parent. After each create it annotates the slice heading with the returned Jira key so re-runs resume cleanly.

What to look at first

  • The child-type resolution in work-items-to-jira Step 3: parent hierarchy level (epic vs. story vs. subtask) decides whether children are standard issues or subtasks, and overrides the default issue type. This is the trickiest decision in the PR and the easiest to get wrong against a real Jira project's metadata.
  • The "never search, always require a user-named destination" rule shared by both Confluence skills — a deliberate tradeoff favoring correctness over convenience because Confluence instances have many similarly-named pages.
  • The opt-in packaging decision: han.atlassian depends on han.core but is excluded from the han meta-plugin, unlike han.github and han.reporting. Confirm plugin.json and marketplace.json agree (both at version: "1.0.0").
  • The dependency-linking durability choice in Jira Step 7: blockers are written into the ticket description as linked Jira keys regardless of whether the MCP exposes native issue links, with native "is blocked by" links added only when available.

How this was tested

  • ✅ Confirmed han.atlassian/.claude-plugin/plugin.json and the han.atlassian entry in .claude-plugin/marketplace.json agree on name, description, dependency (han.core), and version (1.0.0).
  • ✅ Confirmed the han.atlassian version was reverted to 1.0.0 (unreleased) in both manifests, leaving CHANGELOG.md untouched per the release policy.
  • ✅ Confirmed all three skills are documented under docs/skills/ and listed in docs/skills/README.md, and that CLAUDE.md, README.md, and docs/choosing-a-han-plugin.md describe the plugin as opt-in and not bundled by the meta-plugin.
  • ✅ Confirmed each skill's allowed-tools frontmatter scopes only the Atlassian MCP tools that skill actually calls, and that each skill begins with an MCP preflight that hard-stops when the server is unreachable.

Files of interest

  • `han.atlassian/skills/work-items-to-jira/SKILL.md` — the epic/story parent nesting and child-type rules that most need review.
  • `han.atlassian/.../markdown-to-confluence/SKILL.md` — the publishing primitive: destination resolution, draft/live mode, Mermaid handling.
  • `han.atlassian/.../project-documentation-to-confluence/SKILL.md` — orchestration and the draft/live/local-only confirmation gate.
  • `han.atlassian/.claude-plugin/plugin.json` — declares the `han.core` dependency and the opt-in packaging.
  • `.claude-plugin/marketplace.json` — registers `han.atlassian` in the marketplace; cross-check against `plugin.json`.

Add a new opt-in han.atlassian plugin with its first skill,
confluence-project-documentation, which runs the core
project-documentation skill and then publishes the result to a
user-specified Confluence location through the Atlassian MCP server.

The skill requires a configured Atlassian MCP server (hard preflight
gate) and requires the user to provide the target location; it does not
search Confluence, because duplication and repository size make
auto-discovery unreliable. Publication happens only after explicit
confirmation.

Register the plugin in marketplace.json and add the full documentation
treatment: long-form skill doc, skills index entry, and updates to the
project map, plugin-choosing guide, and README.
When confirming publication to Confluence, give three options instead of
a yes/no: save as a Confluence draft to edit and publish later (the
recommended default), publish live immediately, or keep local only. The
publish mode maps to the create/update tool's status parameter
(draft vs. current).
Port han.github:work-items-to-issues to Jira via the Atlassian MCP
server. Reads a /plan-work-items work-items.md and creates one ticket per
slice in a single Jira project.

GitHub specifics removed: no gh CLI, no shell-script pipeline (MCP tools
are model-driven), no per-repo split or SYM->repo map, and no screenshot
upload to a code repo. Jira behavior added: requires a target project (or
board), optional epic parenting, issue type defaulting to Story,
unassigned by default with the reporter taken from the MCP identity, and
placement in Backlog by default with an optional target column via
transitions. Within-file dependencies are recorded in each ticket and
linked natively when the MCP exposes an issue-link capability. Idempotent
resume via per-slice Jira-key heading annotations.
Add the long-form operator doc for work-items-to-jira and wire it into
the indexes: the skills index (han.atlassian section and the work-items
compositions), the plugin-choosing guide, and the CLAUDE.md project map
and skill catalog. Add a reciprocal cross-link from the GitHub
work-items-to-issues doc to its Jira sibling.
@mxriverlynn mxriverlynn changed the title Create han.atlassian plugin with Confluence project-documentation skill Create han.atlassian plugin with first skills Jun 3, 2026
Replace the 'five plugins' enumeration with a role-based description
(core, dependent layers, meta-plugin, opt-in plugins) so adding a plugin
no longer means updating a count. Names han.atlassian alongside
han.feedback as the opt-in plugins.
Drop 'five/six plugins' and 'those three'-style counts across the
maintained operator docs (CLAUDE.md, choosing-a-han-plugin, the
plugin-dependencies how-to, provide-feedback, and the plugin.json
reference), replacing them with count-free phrasing or explicit plugin
names. Adding or removing a plugin no longer means hunting down and
updating a number. Dated artifacts under docs/plans and docs/research are
left as-is, since they record a point-in-time state.
…t-documentation-to-confluence

Split the Confluence posting internals into a new, reusable
markdown-to-confluence skill that publishes any local Markdown file to a
user-specified Confluence page (MCP preflight, location resolution, create
or update, Mermaid handling, reporting).

project-documentation-to-confluence is now a thin five-step orchestrator:
validate inputs (incl. a fail-fast MCP preflight), run project-documentation
to a /tmp file, show it for review, confirm the publish choice
(draft default / live / local-only), then delegate posting to
markdown-to-confluence.

Add the new skill's long-form doc, refresh the wrapper's doc, and update
indexes and manifests (skills README, CLAUDE.md, choosing-a-han-plugin,
README, marketplace.json, plugin.json).
Generalize the optional --epic flag into --parent <KEY>, which accepts
either an epic or a standard issue (story/task/bug). Under an epic each
item is created as a standard issue (default Story); under a story each
item is created as a subtask (default the project's subtask issue type).
The parent's hierarchy level is read via getJiraIssue and drives both the
default issue type and the hierarchy-level validation of any --type
override. --epic is kept as a deprecated alias.
Update the long-form doc to describe the unified --parent flag, the
subtask-under-a-story behavior, the parent-dependent issue-type default,
and the deprecated --epic alias.
@mxriverlynn mxriverlynn marked this pull request as ready for review June 4, 2026 19:43
@mxriverlynn mxriverlynn merged commit 46bd0f8 into main Jun 4, 2026
@mxriverlynn mxriverlynn deleted the han.atlassian branch June 4, 2026 19:43
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