Skip to content
Merged
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
3 changes: 2 additions & 1 deletion docs/constraints.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ existing instruction in a SKILL.md or CLAUDE.md file.
| 1.79 | `plan-feature` MUST create Epics between Feature and Tasks when a level-1 issue type is discovered in Step 2.5. | `plan-feature/SKILL.md` β€” Step 6, sub-step 6a.0 |
| 1.80 | `plan-feature` MUST fall back to Feature β†’ Task hierarchy when no level-1 type exists, without error or user prompting. | `plan-feature/SKILL.md` β€” Step 6, graceful degradation |
| 1.81 | `plan-feature` Epic grouping strategy MUST be configurable via interactive prompt or CLAUDE.md Hierarchy Configuration. | `plan-feature/SKILL.md` β€” Step 5 |
| 1.82 | `plan-feature` parent issue linking MUST validate that the parent issue's `hierarchyLevel` is higher than the Feature's `hierarchyLevel` before setting the link. | `plan-feature/SKILL.md` β€” Step 1.5 |

### Prior Art β€” Cross-phase integrity (Β§1.33–1.35)

Expand Down Expand Up @@ -171,7 +172,7 @@ existing instruction in a SKILL.md or CLAUDE.md file.

Each constraint above references its source. The full source files are:

- `plugins/sdlc-workflow/skills/plan-feature/SKILL.md` β€” Guardrails (Β§1.1–1.3), Step 1 Priority/fixVersion extraction (Β§1.74, Β§1.76), Step 2.5 Discover Project Issue Types (Β§1.62–1.64), Step 4.5 Determine Workflow Mode (Β§1.27), Step 5 Epic grouping (Β§1.79, Β§1.81), Step 5 Convention-aware task enrichment (Β§4.11, Β§4.13), Step 5 Target Branch assignment (Β§4.12), Step 5 Bookend task generation (Β§3.4), Step 6 sub-step 6a.0 Epic creation (Β§1.79), Step 6 graceful degradation (Β§1.80), Step 6 Priority/fixVersion inheritance (Β§1.74, Β§1.75, Β§1.76), Step 6a Digest posting (Β§1.33), Task Description Template (Β§4.1–4.10)
- `plugins/sdlc-workflow/skills/plan-feature/SKILL.md` β€” Guardrails (Β§1.1–1.3), Step 1 Priority/fixVersion extraction (Β§1.74, Β§1.76), Step 1.5 Parent linking (Β§1.82), Step 2.5 Discover Project Issue Types (Β§1.62–1.64), Step 4.5 Determine Workflow Mode (Β§1.27), Step 5 Epic grouping (Β§1.79, Β§1.81), Step 5 Convention-aware task enrichment (Β§4.11, Β§4.13), Step 5 Target Branch assignment (Β§4.12), Step 5 Bookend task generation (Β§3.4), Step 6 sub-step 6a.0 Epic creation (Β§1.79), Step 6 graceful degradation (Β§1.80), Step 6 Priority/fixVersion inheritance (Β§1.74, Β§1.75, Β§1.76), Step 6a Digest posting (Β§1.33), Task Description Template (Β§4.1–4.10)
- `plugins/sdlc-workflow/skills/implement-task/SKILL.md` β€” Important Rules (Β§1.4–1.6, Β§5.1–5.3), Step 1 (Β§1.6), Step 1.5 Digest verification (Β§1.34, Β§1.35), Step 4/6/9 (Β§5.4), Step 5 (Β§1.15, Β§3.1, Β§3.4), Step 7 (Β§5.9–5.13), Step 9 (Β§2.1–2.3, Β§5.6–5.8), Step 10 (Β§3.2, Β§3.3)
- `plugins/sdlc-workflow/shared/task-description-template.md` β€” Rules (Β§4.12)
- `plugins/sdlc-workflow/shared/description-digest-protocol.md` β€” Digest format and verification procedure (Β§1.33, Β§1.34, Β§1.35)
Expand Down
46 changes: 45 additions & 1 deletion plugins/sdlc-workflow/skills/plan-feature/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ If any of these sections are missing or incomplete, inform the user:

## Step 0.5 – JIRA Access Initialization

Before attempting any JIRA operations (Steps 1, 2.5, 4, 6), determine the access method.
Before attempting any JIRA operations (Steps 1, 1.5, 2.5, 4, 6), determine the access method.

**For every JIRA operation:**
1. **Attempt MCP first** (preferred method)
Expand Down Expand Up @@ -114,6 +114,7 @@ Before attempting any JIRA operations (Steps 1, 2.5, 4, 6), determine the access
- `jira.create_issue_link(...)` β†’ `python3 scripts/jira-client.py create_link --inward <issue1> --outward <issue2> --link-type <type>`
- `jira.get_priorities()` β†’ `python3 scripts/jira-client.py get_priorities`
- `jira.get_versions(project)` β†’ `python3 scripts/jira-client.py get_versions <project-key> --unreleased-only`
- `jira.edit_issue(id, parent)` β†’ `python3 scripts/jira-client.py update_issue <id> --fields-json '{"parent": {"key": "<parent-key>"}}'`

Refer to `shared/jira-rest-fallback.md` for complete implementation details.

Expand Down Expand Up @@ -153,6 +154,49 @@ Extract:

**On MCP failure, if REST API chosen (Step 0.5):** use `get_issue <id> --fields "*all"` β€” the response includes `fields.priority` and `fields.fixVersions` in the same structure.

## Step 1.5 – Link Feature to Parent Issue

After fetching the Feature issue in Step 1, optionally link it to a parent issue
in the Jira hierarchy (e.g., an Outcome at hierarchy level 3+). This enables teams
to maintain the full Outcome β†’ Feature β†’ Epic β†’ Task hierarchy.

1. **Check existing parent**: inspect the Feature issue response from Step 1 for a
`parent` field. If the Feature already has a parent set, display the current
parent (key and summary) and ask the user whether to keep or change it. If the
user wants to keep it, skip to Step 2.

2. **Prompt the user**: display an interactive prompt:

```
Link this Feature to a parent issue? Enter the parent issue key (e.g., TC-100) or press Enter to skip:
```

3. **If user provides a key**: validate it by fetching the issue:

```
jira.get_issue(<parent-key>)
```

Verify that:
- The issue exists.
- Its issue type's `hierarchyLevel` is strictly higher than the Feature's
`hierarchyLevel`. Use the type-to-role mapping from Step 2.5 if already
available, or inspect the parent issue type's `hierarchyLevel` field directly
from the fetched issue response (`fields.issuetype.hierarchyLevel`). The
parent should be at level 3+ (e.g., Outcome), not at the same level as
the Feature (level 2) or lower (Epic level 1, Task level 0).

If validation fails, inform the user of the hierarchy mismatch and ask again.

4. **Set the parent link**: update the Feature issue:

```
jira.edit_issue(<feature-key>, fields={"parent": {"key": "<parent-key>"}})
```

5. **If user skips (presses Enter)**: proceed without linking β€” this step is
entirely optional.

## Step 2 – Inspect Figma Design

If a Figma URL was provided as an argument, use it directly.
Expand Down
Loading