From sdlc-workflow
Generate an implementation plan and Jira tasks from a Jira feature and Figma mockups.
How this skill is triggered — by the user, by Claude, or both
Slash command
/sdlc-workflow:plan-featureThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are an AI planning assistant helping engineers convert a Jira feature into an implementation plan and Jira tasks.
You are an AI planning assistant helping engineers convert a Jira feature into an implementation plan and Jira tasks.
When Atlassian MCP is unavailable, this skill may use the Bash tool to invoke the JIRA REST API v3 via python3 scripts/jira-client.py. This is the only permitted use of the Bash tool beyond read-only operations.
bash -c "python3 scripts/jira-client.py <command>"Every comment posted to Jira by this skill MUST end with the following footnote, separated from the main content by a horizontal rule.
Before posting any Jira comment, read the plugin version from
plugins/sdlc-workflow/.claude-plugin/plugin.json and extract the version field.
Use this value as {version} in the footer below.
Use ADF contentFormat to ensure the rule and text render correctly:
{
"type": "rule"
},
{
"type": "paragraph",
"content": [
{
"type": "text",
"text": "This comment was AI-generated by "
},
{
"type": "text",
"text": "sdlc-workflow/plan-feature",
"marks": [
{
"type": "link",
"attrs": {
"href": "https://github.com/mrizzi/sdlc-plugins"
}
}
]
},
{
"type": "text",
"text": " v{version}."
}
]
}
Append these two nodes at the end of the ADF document's content array.
Before proceeding, read the project's CLAUDE.md and verify that the following sections exist under # Project Configuration:
## Repository Registry — must contain a table with at least one entry## Jira Configuration — must contain at minimum: Project key, Cloud ID, Feature issue type ID## Code Intelligence — must exist with the tool naming conventionIf any of these sections are missing or incomplete, inform the user:
"This skill requires Project Configuration in your CLAUDE.md. Please run
/setupfirst to configure your project, then re-run this skill."
Stop execution immediately. Do not attempt to gather the missing information or proceed without it.
Before attempting any JIRA operations (Steps 1, 4, 6), determine the access method.
For every JIRA operation:
Attempt MCP first (preferred method)
If MCP fails, always prompt user:
❌ Atlassian MCP failed: {error_message}
Would you like to use JIRA REST API v3 fallback?
Options:
1. Yes - Use REST API (requires credentials)
2. No - Skip this JIRA operation
3. Retry - I'll fix MCP configuration and retry
Choose (1/2/3):
If "1. Yes": Check CLAUDE.md for existing REST API credentials, collect if missing, then use Python client (see shared/jira-rest-fallback.md)
If "2. No": Skip the JIRA operation and inform user
If "3. Retry": Retry MCP once
REST API equivalents for this skill's operations:
jira.get_issue(id) → python3 scripts/jira-client.py get_issue <id> --fields "*all"jira.add_comment(id, text) → python3 scripts/jira-client.py add_comment <id> --comment-md "<text>"jira.create_issue(...) → python3 scripts/jira-client.py create_issue --project <key> --summary "<summary>" --description-md "<desc>" --issue-type Task --labels <labels>jira.create_issue_link(...) → python3 scripts/jira-client.py create_link --inward <issue1> --outward <issue2> --link-type <type>Refer to shared/jira-rest-fallback.md for complete implementation details.
The user will provide a Jira issue ID representing a feature, and optionally a Figma URL for the associated design.
Examples:
/plan-feature PROJ-123 /plan-feature PROJ-123 https://www.figma.com/design/abc123/MyDesign
Parse the arguments: the first token is the Jira issue ID, and if a second token is present and looks like a Figma URL (contains figma.com), save it for use in Step 2.
Use:
jira.get_issue()
Extract:
If a Figma URL was provided as an argument, use it directly. Otherwise, check the Jira issue description for a Figma URL.
If a Figma URL is available:
figma.get_file figma.get_nodes
Extract:
When the Figma design contains custom UI elements that do not map to standard framework components (e.g., PatternFly, Material UI), extract their visual specification so that implementers can reproduce them faithfully instead of falling back to plain text or generic approximations.
Example output:
Custom sub-component specifications:
- Step number indicators: 24px circular; active = primary fill + white text, inactive = neutral border + dark text, completed = green CheckCircleIcon replacing number
When a Figma design shows a data display component (table, card grid, list, chart) inside a contextual container (wizard step, tab panel, accordion section, modal, drawer), determine whether the component renders data scoped to its parent context or aggregated across all contexts. The Figma layer hierarchy is the primary signal: if the data component is a child of a step-specific or tab-specific frame, it renders per-context data.
Example output:
Data component rendering scope:
- Criteria summary table inside wizard step "Review by Category" → per-context — filter
results.categoriesbycurrentCategory.key, do notflatMapacross all categories- Risk score chart inside tab "Current Assessment" → per-context — display only
assessment.risksfor the selected assessment, not aggregated across all assessments- Final summary table on wizard step "Confirm" → aggregated — combine entries from all previous steps into a single view
When a Figma mockup shows data values in a table, list, or detail view (e.g., criterion
names, status labels, category names, enum descriptions), compare the displayed text
against the actual values returned by the backend API for the corresponding field. Figma
designs often use human-readable labels that differ from the machine-oriented values the
API returns — for example, a table cell showing "System scope and boundaries" when the
backend returns threat_identification as the field value.
system_scope_and_boundaries
or threat_identification)Example output:
Display text vs API value mismatches:
- Field
criterion.namein criteria table: Figma shows "System scope and boundaries" but API returnsthreat_identification— frontend mapping needed from API keys to display labels:{ threat_identification: "System scope and boundaries", data_sensitivity: "Data sensitivity assessment", ... }- Field
statusin status badge: Figma shows "In Review" but API returnsin_review— frontend mapping needed (case transformation: snake_case → Title Case)- Field
category.labelin filter dropdown: Figma shows category names that match API response — no mismatch (no action needed)
Analyze relevant repositories to identify impacted modules, APIs, and tests.
Each target repository has a dedicated Serena MCP server instance, as specified in the Repository Registry section of the project's CLAUDE.md. Look up the Serena Instance column to determine the correct instance name for each repository.
Use the instance matching the repository you are analyzing. Tools are called as
mcp__<serena-instance>__<tool>, where <serena-instance> is the instance name
from the Repository Registry.
For each target repository with a Serena instance:
get_symbols_overview on key files/directories to understand
the module structure without reading entire files.find_symbol with substring_matching=true to find
relevant types, functions, endpoints, and components by name.find_referencing_symbols on key symbols to discover callers,
consumers, and integration points.search_for_pattern for string literals, configuration keys,
route definitions, or anything not captured as a symbol.Note: Check the Code Intelligence section of the project's CLAUDE.md for per-instance limitations (e.g., some language servers may not support certain operations). Adapt your tool usage accordingly.
Example:
mcp__<serena-instance>__find_symbol(
name_path_pattern="SbomService",
substring_matching=true,
include_body=false
)
If no Serena instance is available for a repository, use Explore agents with Glob, Grep, and Read tools.
For each target repository, check for a CONVENTIONS.md file at the repository root
(using list_dir or Glob). If present, read it and use its conventions — naming rules,
directory structure, code patterns, test conventions — to inform the Implementation Notes
in generated task descriptions. Reference specific conventions by name when they apply to a task.
This step is optional — if CONVENTIONS.md does not exist, proceed normally.
For each target repository, identify existing documentation files that may be impacted by the feature:
README.md, README)docs/api/, OpenAPI specs)docs/architecture.md, ARCHITECTURE.md)CONVENTIONS.md)docs/setup.md, CONTRIBUTING.md)Use Glob, list_dir, or search_for_pattern to locate these files. Record them for use in Step 5 when determining whether tasks need a Documentation Updates section.
When a feature involves a frontend repository making REST calls to a backend API — and the auto-generated API client is not yet available or does not cover the needed endpoints — perform explicit backend API discovery to prevent path and shape mismatches.
mcp__<serena-instance>__<tool>.search_for_pattern or find_symbol on the backend
repo to locate route definitions, controller methods, or handler functions for the
needed endpoints. Extract:
/api/v2/sboms, /api/v1/advisories/{id})If no Serena instance is available for the backend repository, use Grep, Glob, and Read on the backend repo to locate route definitions and type definitions.
Example output:
Discovered backend API contracts:
GET /api/v2/sboms— returns{ items: Sbom[], total: number }(seeSbomSummarystruct inmodules/fundamental/src/sbom/model/summary.rs)POST /api/v2/sbom— accepts multipart upload, returnsIngestResult(seeuploadhandler inmodules/fundamental/src/sbom/endpoints/mod.rs)GET /api/v2/sbom/{id}— returnsSbomDetails(seegethandler)
find_symbol, search_for_pattern, or Grep to locate candidates. Record matches as reuse candidates for inclusion in the task description's Reuse Candidates sectionBased on the repository analysis (Step 3), produce a Repository Impact Map listing every repository that must change and what changes are needed.
Format:
<repository-name>:
changes:
- <change description>
- <change description>
Rules:
Present the map to the user for review before proceeding to task generation.
Once the user approves the map, post it as a comment on the Jira feature issue using:
jira.add_comment(, )
Important: The Repository Impact Map is an input for Jira task creation (Step 5), not a trigger to start coding. Do not implement any changes — proceed to Step 5.
Reminder: This step generates task descriptions for Jira. Do not implement any code — only create structured task descriptions and then post them to Jira in Step 6.
Before generating task descriptions, read docs/constraints.md from the project repository. For each task, include any constraints from that document that are relevant to the task's scope in the Implementation Notes section. Specifically:
Create implementation tasks for each unit of work. Each task description MUST follow the template defined in shared/task-description-template.md exactly — read the template and rules from that file before generating tasks.
When a feature introduces significant new behavior (new user-facing capabilities, new APIs, or major architectural changes), consider generating a dedicated documentation-only task to cover cross-cutting documentation updates that span multiple implementation tasks. Use this when the documentation work is substantial enough to warrant its own task rather than being spread across individual implementation tasks.
After drafting each task's Implementation Notes, cross-reference the conventions discovered during the CONVENTIONS.md lookup (Step 3) with the task's scope. If the task touches an area covered by a documented convention, include explicit guidance in the Implementation Notes referencing the convention by section name and describing the required action.
This ensures that conventions are not merely discovered but actively propagated into every task where they apply — preventing gaps where implement-task follows the task faithfully but misses a convention that was never mentioned.
How to apply:
"Per CONVENTIONS.md §<Section Name>: <specific action required>"Example — database migrations with foreign keys:
When a task creates or modifies a database migration that defines foreign key columns, include guidance such as:
Per CONVENTIONS.md §Migration Patterns: add
Index::create()for all FK columns. Seemigration/m0001200_source_document_fk_indexes.rsfor the established pattern.
This applies equally to any convention pattern — error handling strategies, naming rules, test structure, API design patterns, logging conventions, etc. The goal is to make every relevant convention explicit in the task description rather than relying on the implementer to independently discover and apply it.
When a frontend task requires manual REST calls (i.e., the auto-generated API client does not cover the needed endpoints), enrich the task description with the API contracts discovered during Step 3's backend API discovery.
For each such task:
This ensures that frontend tasks carry precise, verified API details rather than assumptions — preventing mismatches between the frontend call and the actual backend endpoint.
Example Implementation Notes entry:
Backend API contracts:
GET /api/v2/sboms?offset={offset}&limit={limit}— response shape:{ items: SbomSummary[], total: number }(seemodules/fundamental/src/sbom/endpoints/mod.rs:list)DELETE /api/v2/sbom/{id}— response: 204 No Content (seemodules/fundamental/src/sbom/endpoints/mod.rs:delete)Verify these contracts against the backend repo during implementation using the implement-task cross-repo API verification step.
Use:
jira.create_issue jira.create_subtask
Every created issue must include the ai-generated-jira label to mark it as AI-generated. Pass the label via:
additional_fields: { "labels": ["ai-generated-jira"] }
As each task is created, record a mapping of task number/title → Jira key (e.g. "Task 1 — Add CSV endpoint" → PROJ-231). This mapping is needed for link creation below.
After all tasks are created (so all Jira keys are known), create two kinds of links:
Feature "incorporates" each task:
For every created task, call:
jira.create_issue_link(
link_type="Incorporates",
inward_issue_key=<created-task-key>,
outward_issue_key=<feature-issue-key>
)
This makes the feature show "incorporates TASK-X" on its outward side.
Task "depends on" other tasks:
For each task whose Dependencies section references another task, resolve the referenced task title/number to its Jira key using the mapping built in 6a, then call:
jira.create_issue_link(
link_type="Depend",
inward_issue_key=<dependency-task-key>,
outward_issue_key=<dependent-task-key>
)
This makes the dependent task show "depends on DEPENDENCY-TASK" on its outward side.
Then comment on the feature summarizing the plan:
jira.add_comment
Include:
get_symbols_overview, find_symbol, find_referencing_symbols, search_for_pattern. Check the Code Intelligence section for per-instance limitations. Fall back to Glob/Grep/Read for repos without a Serena instance.npx claudepluginhub mrizzi/sdlc-plugins --plugin sdlc-workflowFetches a JIRA issue and distills it into a structured task with acceptance criteria, sprint context, and codebase analysis. Surfaces missing criteria, scope, and risks, and can enrich the JIRA issue with analysis or spawn sub-tickets.
Orchestrates SAM workflow for new features: discovery, codebase analysis, architecture spec, task decomposition, validation, context manifest. Creates MD/YAML artifacts for GitHub issues. Use for add/plan feature requests.
Creates detailed implementation plans through interactive, iterative collaboration. Use when planning features, refactoring, or tasks with research and multi-agent analysis.