Cursor rule
.cursor/rules/generate-allure-report.mdcGenerate Allure-ready reports from bigpowers YAML metadata. Reads execution-status.yaml, release-plan.yaml, epic capsules, task YAMLs, cycle-times.yaml, and bug registry to produce allure-results/junit-results.xml, categories.json, and executor.json. Use when preparing progress dashboards, integrating with Allure TestOps, or generating CI reports.
Cursor rules
Quality
58/100
Scores the file, not the repository.Length
911 words
25 headings · 7 code blocksRepository
119
— · pushed 1 days agoLast changed
3 days ago
First indexed 3 days ago.123456# Generate Allure Report78Generate Allure TestOps-compatible reports from bigpowers project metadata. Produces JUnit XML for story-level test results, custom categories for filtering, and executor metadata — all in the `allure-results/` directory.910## Quick Start1112```bash13bash scripts/generate-allure-report.sh14```1516## What It Produces1718Three files in `allure-results/`:1920| File | Description |21|------|-------------|22| `junit-results.xml` | One `<testcase>` per story with `<properties>` for risk, security, WSJF, tier, wave, and status. Incomplete stories get a `<failure>` element. |23| `categories.json` | Custom Allure categories for filtering by epic, risk level (P0), and security reviews. |24| `executor.json` | Build metadata — name, type, version from release-plan.yaml, build order. |2526## Data Sources2728See [REFERENCE.md](REFERENCE.md)2930## Verify3132```bash33test -f allure-results/junit-results.xml && test -f allure-results/categories.json && test -f allure-results/executor.json34```3536## Handoff3738- next_skill: null (terminal skill — no downstream workflow step)3940---4142# generate-allure-report — Reference4344## Data Sources4546The script reads five YAML sources from the project:4748| Source | Path | Fields Used |49|--------|------|-------------|50| Execution status | `specs/execution-status.yaml` | `epics`, `stories`, `development_status` |51| Release plan | `specs/release-plan.yaml` | `release.version`, `release.status`, `bugs` summary |52| Epic capsules | `specs/epics/**/epic.yaml` + `-tasks.yaml` | Epic metadata, task pass/fail counts |53| Cycle times | `specs/metrics/cycle-times.yaml` | Story-level `cycle_minutes`, `bcp_per_hour`, `source` |54| Bug registry | `specs/bugs/registry.yaml` | Bug counts by status and severity |5556## Script Body5758`scripts/generate-allure-report.sh`:5960```bash61#!/usr/bin/env bash62set -euo pipefail63source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"64ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || ROOT="$(dirname "${BASH_SOURCE[0]}")/.."6566mkdir -p "$ROOT/allure-results"6768$PYTHON - "$ROOT" <<'PY'69import json70import sys71import xml.etree.ElementTree as ET72from pathlib import Path7374root = Path(sys.argv[1])75out = root / "allure-results"7677# 1. Read execution-status.yaml78exec_status_file = root / "specs" / "execution-status.yaml"79release_plan_file = root / "specs" / "release-plan.yaml"80cycle_times_file = root / "specs" / "metrics" / "cycle-times.yaml"81bugs_registry_file = root / "specs" / "bugs" / "registry.yaml"8283sys.path.insert(0, str(root / "scripts" / "lib"))84from simple_yaml import parse_simple_yaml8586exec_status = parse_simple_yaml(exec_status_file.read_text()) if exec_status_file.exists() else {}87release_plan = parse_simple_yaml(release_plan_file.read_text()) if release_plan_file.exists() else {}88cycle_times = parse_simple_yaml(cycle_times_file.read_text()) if cycle_times_file.exists() else {"stories": []}89bugs_registry = parse_simple_yaml(bugs_registry_file.read_text()) if bugs_registry_file.exists() else {"bugs": []}9091# Build cycle-times lookup92ct_lookup = {}93for ct in cycle_times.get("stories", []):94 if isinstance(ct, dict):95 ct_lookup[ct.get("id", "")] = ct9697# 2. Build JUnit XML98stories = exec_status.get("stories", {})99100# Counts for testsuite attributes101total_stories = len(stories)102incomplete = sum(1 for s in stories.values() if isinstance(s, dict) and s.get("status") != "done")103104testsuite = ET.Element("testsuite", {105 "name": "bigpowers-epic-progress",106 "tests": str(total_stories),107 "failures": str(incomplete),108 "errors": "0",109 "skipped": "0",110})111112for story_id in sorted(stories.keys()):113 story = stories[story_id]114 if not isinstance(story, dict):115 continue116117 epic_id = story.get("epic", "unknown")118 title = story.get("title", story_id)119 bcps = story.get("bcps", 0)120 status = story.get("status", "backlog")121 risk_max = story.get("risk_max", "none")122 security_max = story.get("security_max", "none")123124 # Enrich with cycle-times data125 ct_data = ct_lookup.get(story_id, {})126 cycle_minutes = ct_data.get("cycle_minutes", 0)127 bcp_per_hour = ct_data.get("bcp_per_hour", 0)128129 # Time: cycle_minutes * 60 for seconds in Allure display130 time_seconds = cycle_minutes * 60.0 if cycle_minutes else 0.0131132 testcase = ET.SubElement(testsuite, "testcase", {133 "classname": epic_id,134 "name": f"{story_id}: {title}",135 "time": str(round(time_seconds, 3)),136 })137138 props = ET.SubElement(testcase, "properties")139 ET.SubElement(props, "property", {"name": "risk", "value": risk_max})140 ET.SubElement(props, "property", {"name": "security", "value": security_max})141 ET.SubElement(props, "property", {"name": "bcps", "value": str(bcps)})142 ET.SubElement(props, "property", {"name": "status", "value": status})143 ET.SubElement(props, "property", {"name": "bcp_per_hour", "value": str(bcp_per_hour)})144 ET.SubElement(props, "property", {"name": "lead_time_minutes", "value": str(cycle_minutes)})145146 if status != "done":147 ET.SubElement(testcase, "failure", {148 "message": f"Story {story_id} is {status} [risk={risk_max}, security={security_max}]",149 "type": "StoryIncomplete"150 })151152tree = ET.ElementTree(testsuite)153ET.indent(tree, space=" ")154tree.write(str(out / "junit-results.xml"), encoding="utf-8", xml_declaration=True)155156# 3. Build categories.json157epics = exec_status.get("epics", {})158categories = []159160for epic_id in sorted(epics.keys()):161 epic = epics[epic_id]162 if isinstance(epic, dict) and epic.get("status") != "done":163 categories.append({164 "name": f"Epic: {epic.get('title', epic_id)}",165 "matchedStatuses": ["failed"],166 "messageRegex": f".*{epic_id}:.*"167 })168169categories.append({170 "name": "P0 Risk",171 "matchedStatuses": ["failed"],172 "messageRegex": ".*risk.*P0.*"173})174categories.append({175 "name": "Security Review",176 "matchedStatuses": ["failed"],177 "messageRegex": ".*security.*(?:medium|high).*"178})179180# Add bug-based categories181bug_list = bugs_registry.get("bugs", [])182bug_count = len(bug_list) if isinstance(bug_list, list) else 0183open_bugs = sum(1 for b in bug_list if isinstance(b, dict) and b.get("status") not in ("fixed", "closed", None))184if open_bugs > 0:185 categories.append({186 "name": "Open Bugs",187 "matchedStatuses": ["failed"],188 "messageRegex": ".*Bug.*"189 })190191(out / "categories.json").write_text(json.dumps(categories, indent=2))192193# 4. Build executor.json194rl = release_plan.get("release", {}) if isinstance(release_plan.get("release"), dict) else {}195executor = {196 "name": "bigpowers",197 "type": "bigpowers",198 "buildName": rl.get("version", "unknown") if isinstance(rl, dict) else "unknown",199 "buildOrder": len(exec_status.get("development_status", {})),200}201(out / "executor.json").write_text(json.dumps(executor, indent=2))202203# Summary204epic_count = len([e for e in epics.values() if isinstance(e, dict) and e.get("status") == "done"])205total_epics = len(epics)206print(f"generate-allure-report: {total_stories} stories, {epic_count}/{total_epics} epics done, {bug_count} bugs")207print(f" -> {out}/junit-results.xml")208print(f" -> {out}/categories.json")209print(f" -> {out}/executor.json")210PY211```212213## JUnit XML Schema214215```xml216<?xml version="1.0" encoding="utf-8"?>217<testsuite name="bigpowers-epic-progress" tests="N" failures="F" errors="0" skipped="0">218 <testcase classname="e01" name="e01s01: Security slopcheck tags" time="0.75">219 <properties>220 <property name="risk" value="none"/>221 <property name="security" value="none"/>222 <property name="bcps" value="1"/>223 <property name="status" value="done"/>224 <property name="bcp_per_hour" value="1.3"/>225 <property name="lead_time_minutes" value="45"/>226 </properties>227 </testcase>228 <testcase classname="e01" name="e01s99: Some incomplete story" time="0.0">229 <properties>...</properties>230 <failure message="Story e01s99 is backlog [risk=P0, security=high]" type="StoryIncomplete"/>231 </testcase>232</testsuite>233```234235## Categories JSON Schema236237```json238[239 {240 "name": "Epic: Quality Core - Skill Hardening",241 "matchedStatuses": ["failed"],242 "messageRegex": ".*e45:.*"243 },244 {245 "name": "P0 Risk",246 "matchedStatuses": ["failed"],247 "messageRegex": ".*risk.*P0.*"248 },249 {250 "name": "Security Review",251 "matchedStatuses": ["failed"],252 "messageRegex": ".*security.*(?:medium|high).*"253 }254]255```256257## Executor JSON Schema258259```json260{261 "name": "bigpowers",262 "type": "bigpowers",263 "buildName": "2.76.2",264 "buildOrder": 400265}266```267268## Example Usage269270```bash271# Generate reports272bash scripts/generate-allure-report.sh273274# Verify output275test -f allure-results/junit-results.xml && echo "JUnit OK"276test -f allure-results/categories.json && echo "Categories OK"277test -f allure-results/executor.json && echo "Executor OK"278279# Serve with Allure280allure serve allure-results/281282# Or open the Allure TestOps UI283allure open allure-results/284```285
Also in danielvm-git/bigpowers
Diff this repo’s formatsOne repository carrying more than one format is the comparison this product exists for: does anyone actually write different content in each file, or is one a copy of the other?
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| danielvm-git/bigpowers.cursor/rules/align-grid.mdc · 119 | Cursor rules | lint-formatdo-notagent-behaviour | 65/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/assess-impact.mdc · 119 | Cursor rules | testtesting-strategydeployment | 66/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/audit-code.mdc · 119 | Cursor rules | setuptestlint-formatstyle+4 | 66/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/audit-plan.mdc · 119 | Cursor rules | buildteststylegit | 74/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/build-epic.mdc · 119 | Cursor rules | buildgit | 58/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/change-request.mdc · 119 | Cursor rules | no sections | 48/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/commit-message.mdc · 119 | Cursor rules | lint-formatstyletypesgit+3 | 82/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/compose-workflow.mdc · 119 | Cursor rules | styledo-notagent-behaviour | 65/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/context7-mcp.mdc · 119 | Cursor rules | style | 54/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/deepen-architecture.mdc · 119 | Cursor rules | testtesting-strategydo-not | 57/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/define-language.mdc · 119 | Cursor rules | lint-formatdo-not | 65/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/delegate-task.mdc · 119 | Cursor rules | git | 62/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/deploy.mdc · 119 | Cursor rules | setupbuildtestdeployment | 77/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/develop-tdd.mdc · 119 | Cursor rules | teststylearchtesting-strategy+5 | 85/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/diagnose-root.mdc · 119 | Cursor rules | no sections | 39/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/dispatch-agents.mdc · 119 | Cursor rules | git | 54/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/edit-document.mdc · 119 | Cursor rules | no sections | 39/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/elaborate-spec.mdc · 119 | Cursor rules | test | 58/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/enforce-first.mdc · 119 | Cursor rules | no sections | 50/100 | 3 days ago | |
| danielvm-git/bigpowers.cursor/rules/evolve-skill.mdc · 119 | Cursor rules | no sections | 50/100 | 3 days ago |
Diff against .cursor/rules/align-grid.mdc Diff against .cursor/rules/assess-impact.mdc Diff against .cursor/rules/audit-code.mdc Diff against .cursor/rules/audit-plan.mdc Diff against .cursor/rules/build-epic.mdc Diff against .cursor/rules/change-request.mdc Diff against .cursor/rules/commit-message.mdc Diff against .cursor/rules/compose-workflow.mdc Diff against .cursor/rules/context7-mcp.mdc Diff against .cursor/rules/deepen-architecture.mdc Diff against .cursor/rules/define-language.mdc Diff against .cursor/rules/delegate-task.mdc Diff against .cursor/rules/deploy.mdc Diff against .cursor/rules/develop-tdd.mdc Diff against .cursor/rules/diagnose-root.mdc Diff against .cursor/rules/dispatch-agents.mdc Diff against .cursor/rules/edit-document.mdc Diff against .cursor/rules/elaborate-spec.mdc Diff against .cursor/rules/enforce-first.mdc Diff against .cursor/rules/evolve-skill.mdc
Similar configs
Same format, overlapping stack, ranked by quality.
| Repository | Format | Stack | Covers | Score | Changed |
|---|---|---|---|---|---|
| TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45 | Cursor rules | testlint-formatstylearch+5 | 100/100 | 3 days ago | |
| hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126 | Cursor rules | setupbuildtestlint-format+6 | 100/100 | 3 days ago | |
| markstev/mark-starter.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+6 | 99/100 | 3 days ago | |
| dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0 | Cursor rules | setuptestlint-formatstyle+7 | 99/100 | 3 days ago | |
| langflow-ai/langflow.cursor/rules/docs_development.mdc · 153k | Cursor rules | setupbuildtestlint-format+7 | 97/100 | 3 days ago | |
| TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45 | Cursor rules | teststyletesting-strategysecurity+3 | 97/100 | 3 days ago |
