Create han.atlassian plugin with first skills#49
Merged
Conversation
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.
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.
…roject-documentation-to-confluence
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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.markdown-to-confluence(the publishing primitive),project-documentation-to-confluence(document-then-publish orchestrator), andwork-items-to-jira(one Jira ticket per work-item slice).han.corebut is deliberately not bundled by thehanmeta-plugin. Operators install it on its own, and every skill hard-stops at a preflight if the Atlassian MCP server is not reachable.status: "draft"), and Jira creation defaults to aStory, unassigned, in the project's initial Backlog status. Nothing goes live or gets assigned without an explicit override or confirmation.Behavior changes
markdown-to-confluencetakes 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 isdraft(default) orlive, 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-confluenceis a thin orchestrator: it runs the corehan.core:project-documentationskill 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 tomarkdown-to-confluence. It owns no Confluence calls itself.work-items-to-jirareads awork-items.mdfrom/plan-work-items, validates its format (with evidence-based repair), creates one ticket per slice in a single project, links within-fileDepends ondependencies, 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 (defaultStory); under a story (or other standard issue), each item becomes a subtask; parenting under a subtask is rejected.--epicis 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
work-items-to-jiraStep 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.han.atlassiandepends onhan.corebut is excluded from thehanmeta-plugin, unlikehan.githubandhan.reporting. Confirmplugin.jsonandmarketplace.jsonagree (both atversion: "1.0.0").How this was tested
han.atlassian/.claude-plugin/plugin.jsonand thehan.atlassianentry in.claude-plugin/marketplace.jsonagree on name, description, dependency (han.core), and version (1.0.0).han.atlassianversion was reverted to1.0.0(unreleased) in both manifests, leavingCHANGELOG.mduntouched per the release policy.docs/skills/and listed indocs/skills/README.md, and thatCLAUDE.md,README.md, anddocs/choosing-a-han-plugin.mddescribe the plugin as opt-in and not bundled by the meta-plugin.allowed-toolsfrontmatter 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