All checks were successful
Deploy to Staging / Build Images (push) Successful in 34s
Deploy to Staging / Deploy to Staging (push) Successful in 22s
Deploy to Staging / Verify Staging (push) Successful in 2m31s
Deploy to Staging / Notify Staging Ready (push) Successful in 9s
Deploy to Staging / Notify Staging Failure (push) Has been skipped
187 lines
8.3 KiB
JSON
187 lines
8.3 KiB
JSON
{
|
|
"name": "MotoVaultPro Solo Sprint Workflow",
|
|
"version": "1.0",
|
|
"principles": [
|
|
"Issues are the source of truth.",
|
|
"One status label per issue.",
|
|
"Work is timeboxed into 14-day sprints using milestones.",
|
|
"Every PR must link to at least one issue and satisfy its acceptance criteria."
|
|
],
|
|
"sprints": {
|
|
"length_days": 14,
|
|
"milestone_naming": "Sprint YYYY-MM-DD (start date)",
|
|
"default_start_day": "Monday",
|
|
"calendar_reference": ".gitea/SPRINTS.md",
|
|
"process": [
|
|
"If a milestone for the current sprint does not exist, create it.",
|
|
"Assign selected issues to the current sprint milestone."
|
|
]
|
|
},
|
|
"labels": {
|
|
"status_prefix": "status/",
|
|
"status_values": [
|
|
"status/backlog",
|
|
"status/ready",
|
|
"status/in-progress",
|
|
"status/review",
|
|
"status/blocked",
|
|
"status/done"
|
|
],
|
|
"type_prefix": "type/",
|
|
"type_values": [
|
|
"type/feature",
|
|
"type/bug",
|
|
"type/chore",
|
|
"type/docs"
|
|
],
|
|
"rules": [
|
|
"Exactly one status/* label must be present on open issues.",
|
|
"Exactly one type/* label must be present on issues.",
|
|
"When moving status, remove the previous status/* label first."
|
|
]
|
|
},
|
|
"sub_issues": {
|
|
"when": "Multi-file features (3+ files) or features that benefit from smaller AI context windows.",
|
|
"parent_issue": "The original feature issue. Tracks overall status. Only the parent gets status label transitions.",
|
|
"sub_issue_title_format": "{type}: {summary} (#{parent_index})",
|
|
"sub_issue_body": "First line must be 'Relates to #{parent_index}'. Each sub-issue is a self-contained unit of work.",
|
|
"sub_issue_labels": "status/backlog + same type/* as parent. Sub-issues stay in backlog; parent issue tracks status.",
|
|
"sub_issue_milestone": "Same sprint milestone as parent.",
|
|
"rules": [
|
|
"ONE branch for the parent issue. Never create branches per sub-issue.",
|
|
"ONE PR for the parent issue. The PR closes the parent and all sub-issues.",
|
|
"Commits reference the specific sub-issue index they implement.",
|
|
"Sub-issues should be small enough to fit in a single AI context window.",
|
|
"Plan milestones map 1:1 to sub-issues."
|
|
],
|
|
"examples": {
|
|
"parent": "#105 'feat: Add Grafana dashboards and alerting'",
|
|
"sub_issues": [
|
|
"#106 'feat: Grafana dashboard provisioning infrastructure (#105)'",
|
|
"#107 'feat: Application Overview Grafana dashboard (#105)'"
|
|
]
|
|
}
|
|
},
|
|
"branching": {
|
|
"branch_format": "issue-{parent_index}-{slug}",
|
|
"target_branch": "main",
|
|
"note": "Always use the parent issue index. When sub-issues exist, the branch is for the parent.",
|
|
"examples": [
|
|
"issue-42-add-fuel-efficiency-report (standalone issue)",
|
|
"issue-105-add-grafana-dashboards (parent issue with sub-issues #106-#111)"
|
|
]
|
|
},
|
|
"commit_conventions": {
|
|
"message_format": "{type}: {short summary} (refs #{index})",
|
|
"allowed_types": ["feat", "fix", "chore", "docs", "refactor", "test"],
|
|
"note": "When working on a sub-issue, {index} is the sub-issue number. For standalone issues, {index} is the issue number.",
|
|
"examples": [
|
|
"feat: add fuel efficiency calculation (refs #42)",
|
|
"fix: correct VIN validation for pre-1981 vehicles (refs #1)",
|
|
"feat: add dashboard provisioning infrastructure (refs #106)",
|
|
"feat: add API performance dashboard (refs #108)"
|
|
]
|
|
},
|
|
"pull_requests": {
|
|
"title_format": "{type}: {summary} (#{parent_index})",
|
|
"note": "PR title always uses the parent issue index.",
|
|
"body_requirements": [
|
|
"Link parent issue using 'Fixes #{parent_index}'.",
|
|
"Link all sub-issues using 'Fixes #{sub_index}' on separate lines.",
|
|
"Include test plan and results.",
|
|
"Confirm acceptance criteria completion."
|
|
],
|
|
"body_example": "Fixes #105\nFixes #106\nFixes #107\nFixes #108\nFixes #109\nFixes #110\nFixes #111",
|
|
"merge_policy": "squash_or_rebase_ok",
|
|
"template_location": ".gitea/PULL_REQUEST_TEMPLATE.md"
|
|
},
|
|
"execution_loop": [
|
|
"List repo issues in current sprint milestone with status/ready; if none, pull from status/backlog and promote the best candidate to status/ready.",
|
|
"Select one issue (prefer smallest size and highest priority).",
|
|
"Move parent issue to status/in-progress.",
|
|
"[SKILL] Codebase Analysis if unfamiliar area.",
|
|
"[SKILL] Problem Analysis if complex problem.",
|
|
"[SKILL] Decision Critic if uncertain approach.",
|
|
"If multi-file feature (3+ files): decompose into sub-issues per sub_issues rules. Each sub-issue = one plan milestone.",
|
|
"[SKILL] Planner writes plan as parent issue comment. Plan milestones map 1:1 to sub-issues.",
|
|
"[SKILL] Plan review cycle: QR plan-completeness -> TW plan-scrub -> QR plan-code -> QR plan-docs.",
|
|
"Create ONE branch issue-{parent_index}-{slug} from main.",
|
|
"[SKILL] Planner executes plan, delegates to Developer per milestone/sub-issue.",
|
|
"[SKILL] QR post-implementation per milestone (results in parent issue comment).",
|
|
"Open ONE PR targeting main. Title uses parent index. Body lists 'Fixes #N' for parent and all sub-issues.",
|
|
"Move parent issue to status/review.",
|
|
"[SKILL] Quality Agent validates with RULE 0/1/2 (result in parent issue comment).",
|
|
"If CI/tests fail, iterate until pass.",
|
|
"When PR is merged, parent and all sub-issues move to status/done. Close any not auto-closed.",
|
|
"[SKILL] Doc-Sync on affected directories."
|
|
],
|
|
"skill_integration": {
|
|
"planning_required_for": ["type/feature with 3+ files", "architectural changes"],
|
|
"planning_optional_for": ["type/bug", "type/chore", "type/docs"],
|
|
"quality_gates": {
|
|
"plan_review": ["QR plan-completeness", "TW plan-scrub", "QR plan-code", "QR plan-docs"],
|
|
"execution_review": ["QR post-implementation per milestone"],
|
|
"final_review": ["Quality Agent RULE 0/1/2"]
|
|
},
|
|
"plan_storage": "gitea_issue_comments",
|
|
"tracking_storage": "gitea_issue_comments",
|
|
"issue_comment_operations": {
|
|
"create_comment": "mcp__gitea-mcp__create_issue_comment",
|
|
"edit_comment": "mcp__gitea-mcp__edit_issue_comment",
|
|
"get_comments": "mcp__gitea-mcp__get_issue_comments_by_index"
|
|
},
|
|
"unified_comment_format": {
|
|
"header": "## {Type}: {Title}",
|
|
"meta": "**Phase**: {phase} | **Agent**: {agent} | **Status**: {status}",
|
|
"sections": "### {Section}",
|
|
"footer": "*Verdict*: {verdict} | *Next*: {next_action}",
|
|
"types": ["Plan", "QR Review", "Milestone", "Final Review"],
|
|
"phases": ["Planning", "Plan-Review", "Execution", "Review"],
|
|
"statuses": ["AWAITING_REVIEW", "IN_PROGRESS", "PASS", "FAIL", "BLOCKED"],
|
|
"verdicts": ["PASS", "FAIL", "NEEDS_REVISION", "APPROVED", "BLOCKED"]
|
|
}
|
|
},
|
|
"gitea_mcp_tools": {
|
|
"repository": {
|
|
"owner": "egullickson",
|
|
"repo": "motovaultpro"
|
|
},
|
|
"issue_operations": {
|
|
"list_issues": "mcp__gitea-mcp__list_repo_issues",
|
|
"get_issue": "mcp__gitea-mcp__get_issue_by_index",
|
|
"create_issue": "mcp__gitea-mcp__create_issue",
|
|
"edit_issue": "mcp__gitea-mcp__edit_issue"
|
|
},
|
|
"label_operations": {
|
|
"list_labels": "mcp__gitea-mcp__list_repo_labels",
|
|
"add_labels": "mcp__gitea-mcp__add_issue_labels",
|
|
"remove_label": "mcp__gitea-mcp__remove_issue_label",
|
|
"replace_labels": "mcp__gitea-mcp__replace_issue_labels"
|
|
},
|
|
"milestone_operations": {
|
|
"list_milestones": "mcp__gitea-mcp__list_milestones",
|
|
"create_milestone": "mcp__gitea-mcp__create_milestone",
|
|
"get_milestone": "mcp__gitea-mcp__get_milestone"
|
|
},
|
|
"branch_operations": {
|
|
"list_branches": "mcp__gitea-mcp__list_branches",
|
|
"create_branch": "mcp__gitea-mcp__create_branch"
|
|
},
|
|
"pr_operations": {
|
|
"list_prs": "mcp__gitea-mcp__list_repo_pull_requests",
|
|
"create_pr": "mcp__gitea-mcp__create_pull_request",
|
|
"get_pr": "mcp__gitea-mcp__get_pull_request_by_index"
|
|
}
|
|
},
|
|
"fallbacks": {
|
|
"if_label_update_not_available_in_mcp": [
|
|
"Use REST API issue label endpoints to add/replace labels.",
|
|
"If REST is unavailable, add a comment 'STATUS: <status/...>' and proceed, but do not leave multiple status labels."
|
|
],
|
|
"if_milestone_ops_not_available_in_mcp": [
|
|
"Use REST API to create/list milestones and assign issues to the sprint milestone.",
|
|
"If milestone cannot be set, add a comment 'SPRINT: <milestone name>'."
|
|
]
|
|
}
|
|
}
|