Phase 1b: Rename all ~94 commands across 12 plugins to /<noun> <action> sub-command pattern. Git-flow consolidated from 8→5 commands (commit variants absorbed into --push/--merge/--sync flags). Dispatch files, name: frontmatter, and cross-reference updates for all plugins. Phase 2: Design documents for 8 new plugins in docs/designs/. Phase 3: Scaffold 8 new plugins — saas-api-platform, saas-db-migrate, saas-react-platform, saas-test-pilot, data-seed, ops-release-manager, ops-deploy-pipeline, debug-mcp. Each with plugin.json, commands, agents, skills, README, and claude-md-integration. Marketplace grows from 12→20. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
3.6 KiB
name, description
| name | description |
|---|---|
| sprint-lifecycle | Sprint lifecycle state machine using milestone labels |
Sprint Lifecycle
Purpose
Defines the valid sprint lifecycle states and transitions, enforced via labels on the sprint milestone. Each projman command checks the current state before executing and updates it on completion.
When to Use
- All sprint commands: Check state on entry, update on exit
- Sprint status: Display current lifecycle state
State Machine
idle -> Sprint/Planning -> Sprint/Executing -> Sprint/Reviewing -> idle
(sprint plan) (sprint start) (sprint review) (sprint close)
State Labels
| Label | Set By | Meaning |
|---|---|---|
| (no Sprint/ label)* | /sprint close or initial state |
Idle - no active sprint phase |
Sprint/Planning |
/sprint plan |
Planning in progress |
Sprint/Executing |
/sprint start |
Execution in progress |
Sprint/Reviewing |
/sprint review |
Code review in progress |
Rule: Only ONE Sprint/* label may exist on a milestone at a time. Setting a new one removes the previous one.
State Transition Rules
| Command | Expected State | Sets State | On Wrong State |
|---|---|---|---|
/sprint plan |
idle (no Sprint/* label) | Sprint/Planning |
Warn: "Sprint is in [state]. Run /sprint close first or use --force to re-plan." Allow with --force. |
/sprint start |
Sprint/Planning |
Sprint/Executing |
Warn: "Expected Sprint/Planning state but found [state]. Run /sprint plan first or use --force." Allow with --force. |
/sprint review |
Sprint/Executing |
Sprint/Reviewing |
Warn: "Expected Sprint/Executing state but found [state]." Allow with --force. |
/sprint close |
Sprint/Reviewing |
Remove all Sprint/* labels (idle) | Warn: "Expected Sprint/Reviewing state but found [state]. Run /sprint review first or use --force." Allow with --force. |
/sprint status |
Any | No change (read-only) | Display current state in output. |
Checking State (Protocol)
At command entry, before any other work:
- Fetch the active milestone using
get_milestone - Check milestone description for
**Sprint State:**line - Compare against expected state for this command
- If mismatch: display warning with guidance, STOP unless
--forceprovided - If match: proceed and update state after command completes its primary work
Implementation: Use milestone description metadata. Add/update a line:
**Sprint State:** Sprint/Executing
This avoids needing actual Gitea labels on milestones (which may not be supported). Parse this line to check state, update it to set state.
Setting State
After command completes successfully:
- Fetch current milestone description
- If
**Sprint State:**line exists, replace it - If not, append it to the end of the description
- Update milestone via
update_milestone
Format: **Sprint State:** <state> where state is one of:
Sprint/PlanningSprint/ExecutingSprint/Reviewing- (empty/removed for idle)
Displaying State
In /sprint status output, include:
Sprint Phase: Executing (since 2026-02-01)
Parse the milestone description for the **Sprint State:** line and display it prominently.
Edge Cases
- No active milestone: State is implicitly
idle - Multiple milestones: Use the open/active milestone. If multiple open, use the most recent.
- Milestone has no state line: Treat as
idle --forceused: Log to milestone: "Warning: Lifecycle state override: [command] forced from [actual] state on [date]"