RuleStack

Configs

Stacks

Compare

Diff

RuleStack

Configs

Stacks

Compare

Diff

Read API

RuleStack

Configs

Stacks

Compare

Diff

Read API

Configs/Cursor rules/danielvm-git/bigpowers

Cursor rule

.cursor/rules/generate-allure-report.mdc

Generate 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 blocks

Repository

119

— · pushed 1 days ago

Last changed

3 days ago

First indexed 3 days ago.
danielvm-git/bigpowers/.cursor/rules/generate-allure-report.mdcRawGitHub
1---
2description: "Generate 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."
3alwaysApply: false
4---
5 
6# Generate Allure Report
7 
8Generate 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.
9 
10## Quick Start
11 
12```bash
13bash scripts/generate-allure-report.sh
14```
15 
16## What It Produces
17 
18Three files in `allure-results/`:
19 
20| 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. |
25 
26## Data Sources
27 
28See [REFERENCE.md](REFERENCE.md)
29 
30## Verify
31 
32```bash
33test -f allure-results/junit-results.xml && test -f allure-results/categories.json && test -f allure-results/executor.json
34```
35 
36## Handoff
37 
38- next_skill: null (terminal skill — no downstream workflow step)
39 
40---
41 
42# generate-allure-report — Reference
43 
44## Data Sources
45 
46The script reads five YAML sources from the project:
47 
48| 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 |
55 
56## Script Body
57 
58`scripts/generate-allure-report.sh`:
59 
60```bash
61#!/usr/bin/env bash
62set -euo pipefail
63source &quot;$(dirname &quot;${BASH_SOURCE[0]}&quot;)/lib/python-env.sh&quot;
64ROOT=&quot;$(git rev-parse --show-toplevel 2&gt;/dev/null)&quot; || ROOT=&quot;$(dirname &quot;${BASH_SOURCE[0]}&quot;)/..&quot;
65
66mkdir -p &quot;$ROOT/allure-results&quot;
67 
68$PYTHON - &quot;$ROOT&quot; &lt;&lt;'PY'
69import json
70import sys
71import xml.etree.ElementTree as ET
72from pathlib import Path
73
74root = Path(sys.argv[1])
75out = root / &quot;allure-results&quot;
76 
77# 1. Read execution-status.yaml
78exec_status_file = root / &quot;specs&quot; / &quot;execution-status.yaml&quot;
79release_plan_file = root / &quot;specs&quot; / &quot;release-plan.yaml&quot;
80cycle_times_file = root / &quot;specs&quot; / &quot;metrics&quot; / &quot;cycle-times.yaml&quot;
81bugs_registry_file = root / &quot;specs&quot; / &quot;bugs&quot; / &quot;registry.yaml&quot;
82 
83sys.path.insert(0, str(root / &quot;scripts&quot; / &quot;lib&quot;))
84from simple_yaml import parse_simple_yaml
85
86exec_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 {&quot;stories&quot;: []}
89bugs_registry = parse_simple_yaml(bugs_registry_file.read_text()) if bugs_registry_file.exists() else {&quot;bugs&quot;: []}
90 
91# Build cycle-times lookup
92ct_lookup = {}
93for ct in cycle_times.get(&quot;stories&quot;, []):
94 if isinstance(ct, dict):
95 ct_lookup[ct.get(&quot;id&quot;, &quot;&quot;)] = ct
96 
97# 2. Build JUnit XML
98stories = exec_status.get(&quot;stories&quot;, {})
99 
100# Counts for testsuite attributes
101total_stories = len(stories)
102incomplete = sum(1 for s in stories.values() if isinstance(s, dict) and s.get(&quot;status&quot;) != &quot;done&quot;)
103
104testsuite = ET.Element(&quot;testsuite&quot;, {
105 &quot;name&quot;: &quot;bigpowers-epic-progress&quot;,
106 &quot;tests&quot;: str(total_stories),
107 &quot;failures&quot;: str(incomplete),
108 &quot;errors&quot;: &quot;0&quot;,
109 &quot;skipped&quot;: &quot;0&quot;,
110})
111
112for story_id in sorted(stories.keys()):
113 story = stories[story_id]
114 if not isinstance(story, dict):
115 continue
116
117 epic_id = story.get(&quot;epic&quot;, &quot;unknown&quot;)
118 title = story.get(&quot;title&quot;, story_id)
119 bcps = story.get(&quot;bcps&quot;, 0)
120 status = story.get(&quot;status&quot;, &quot;backlog&quot;)
121 risk_max = story.get(&quot;risk_max&quot;, &quot;none&quot;)
122 security_max = story.get(&quot;security_max&quot;, &quot;none&quot;)
123 
124 # Enrich with cycle-times data
125 ct_data = ct_lookup.get(story_id, {})
126 cycle_minutes = ct_data.get(&quot;cycle_minutes&quot;, 0)
127 bcp_per_hour = ct_data.get(&quot;bcp_per_hour&quot;, 0)
128 
129 # Time: cycle_minutes * 60 for seconds in Allure display
130 time_seconds = cycle_minutes * 60.0 if cycle_minutes else 0.0
131
132 testcase = ET.SubElement(testsuite, &quot;testcase&quot;, {
133 &quot;classname&quot;: epic_id,
134 &quot;name&quot;: f&quot;{story_id}: {title}&quot;,
135 &quot;time&quot;: str(round(time_seconds, 3)),
136 })
137
138 props = ET.SubElement(testcase, &quot;properties&quot;)
139 ET.SubElement(props, &quot;property&quot;, {&quot;name&quot;: &quot;risk&quot;, &quot;value&quot;: risk_max})
140 ET.SubElement(props, &quot;property&quot;, {&quot;name&quot;: &quot;security&quot;, &quot;value&quot;: security_max})
141 ET.SubElement(props, &quot;property&quot;, {&quot;name&quot;: &quot;bcps&quot;, &quot;value&quot;: str(bcps)})
142 ET.SubElement(props, &quot;property&quot;, {&quot;name&quot;: &quot;status&quot;, &quot;value&quot;: status})
143 ET.SubElement(props, &quot;property&quot;, {&quot;name&quot;: &quot;bcp_per_hour&quot;, &quot;value&quot;: str(bcp_per_hour)})
144 ET.SubElement(props, &quot;property&quot;, {&quot;name&quot;: &quot;lead_time_minutes&quot;, &quot;value&quot;: str(cycle_minutes)})
145
146 if status != &quot;done&quot;:
147 ET.SubElement(testcase, &quot;failure&quot;, {
148 &quot;message&quot;: f&quot;Story {story_id} is {status} [risk={risk_max}, security={security_max}]&quot;,
149 &quot;type&quot;: &quot;StoryIncomplete&quot;
150 })
151
152tree = ET.ElementTree(testsuite)
153ET.indent(tree, space=&quot; &quot;)
154tree.write(str(out / &quot;junit-results.xml&quot;), encoding=&quot;utf-8&quot;, xml_declaration=True)
155 
156# 3. Build categories.json
157epics = exec_status.get(&quot;epics&quot;, {})
158categories = []
159
160for epic_id in sorted(epics.keys()):
161 epic = epics[epic_id]
162 if isinstance(epic, dict) and epic.get(&quot;status&quot;) != &quot;done&quot;:
163 categories.append({
164 &quot;name&quot;: f&quot;Epic: {epic.get('title', epic_id)}&quot;,
165 &quot;matchedStatuses&quot;: [&quot;failed&quot;],
166 &quot;messageRegex&quot;: f&quot;.*{epic_id}:.*&quot;
167 })
168 
169categories.append({
170 &quot;name&quot;: &quot;P0 Risk&quot;,
171 &quot;matchedStatuses&quot;: [&quot;failed&quot;],
172 &quot;messageRegex&quot;: &quot;.*risk.*P0.*&quot;
173})
174categories.append({
175 &quot;name&quot;: &quot;Security Review&quot;,
176 &quot;matchedStatuses&quot;: [&quot;failed&quot;],
177 &quot;messageRegex&quot;: &quot;.*security.*(?:medium|high).*&quot;
178})
179 
180# Add bug-based categories
181bug_list = bugs_registry.get(&quot;bugs&quot;, [])
182bug_count = len(bug_list) if isinstance(bug_list, list) else 0
183open_bugs = sum(1 for b in bug_list if isinstance(b, dict) and b.get(&quot;status&quot;) not in (&quot;fixed&quot;, &quot;closed&quot;, None))
184if open_bugs &gt; 0:
185 categories.append({
186 &quot;name&quot;: &quot;Open Bugs&quot;,
187 &quot;matchedStatuses&quot;: [&quot;failed&quot;],
188 &quot;messageRegex&quot;: &quot;.*Bug.*&quot;
189 })
190 
191(out / &quot;categories.json&quot;).write_text(json.dumps(categories, indent=2))
192 
193# 4. Build executor.json
194rl = release_plan.get(&quot;release&quot;, {}) if isinstance(release_plan.get(&quot;release&quot;), dict) else {}
195executor = {
196 &quot;name&quot;: &quot;bigpowers&quot;,
197 &quot;type&quot;: &quot;bigpowers&quot;,
198 &quot;buildName&quot;: rl.get(&quot;version&quot;, &quot;unknown&quot;) if isinstance(rl, dict) else &quot;unknown&quot;,
199 &quot;buildOrder&quot;: len(exec_status.get(&quot;development_status&quot;, {})),
200}
201(out / &quot;executor.json&quot;).write_text(json.dumps(executor, indent=2))
202 
203# Summary
204epic_count = len([e for e in epics.values() if isinstance(e, dict) and e.get(&quot;status&quot;) == &quot;done&quot;])
205total_epics = len(epics)
206print(f&quot;generate-allure-report: {total_stories} stories, {epic_count}/{total_epics} epics done, {bug_count} bugs&quot;)
207print(f&quot; -&gt; {out}/junit-results.xml&quot;)
208print(f&quot; -&gt; {out}/categories.json&quot;)
209print(f&quot; -&gt; {out}/executor.json&quot;)
210PY
211```
212 
213## JUnit XML Schema
214 
215```xml
216<?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```
234 
235## Categories JSON Schema
236 
237```json
238[
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```
256 
257## Executor JSON Schema
258 
259```json
260{
261 "name": "bigpowers",
262 "type": "bigpowers",
263 "buildName": "2.76.2",
264 "buildOrder": 400
265}
266```
267 
268## Example Usage
269 
270```bash
271# Generate reports
272bash scripts/generate-allure-report.sh
273 
274# Verify output
275test -f allure-results/junit-results.xml && echo &quot;JUnit OK&quot;
276test -f allure-results/categories.json && echo &quot;Categories OK&quot;
277test -f allure-results/executor.json && echo &quot;Executor OK&quot;
278 
279# Serve with Allure
280allure serve allure-results/
281 
282# Or open the Allure TestOps UI
283allure open allure-results/
284```
285 

Sections

  • Generate Allure Report
  • Quick Start
  • What It Produces
  • Data Sources
  • Verify
  • Handoff
  • generate-allure-report — Reference
  • Data Sources
  • Script Body
  • 1. Read execution-status.yaml
  • Build cycle-times lookup
  • 2. Build JUnit XML
  • Counts for testsuite attributes
  • 3. Build categories.json
  • Add bug-based categories
  • 4. Build executor.json
  • Summary
  • JUnit XML Schema
  • Categories JSON Schema
  • Executor JSON Schema
  • Example Usage
  • Generate reports
  • Verify output
  • Serve with Allure
  • Or open the Allure TestOps UI

What it covers

buildtypesdatabaseui

Stack — with the evidence

shell

(0.80)

node

(0.70)

react

(0.70)

astro

(0.70)

express

(0.70)

vitest

(0.70)

typescript

(0.60)

javascript

(0.60)

python

(0.60)

github-actions

(0.60)

Format

Cursor rules

The most expressive format here. Many small .mdc files, each with frontmatter declaring when it should load, so a rule about migrations only enters context when a migration is open. Costs the most to maintain and only one editor reads it.

What the corpus says about it

Repository

Owner
danielvm-git
Language
—
License
—
Archived
no

All configs in this repo

Also in danielvm-git/bigpowers

Diff this repo’s formats

One 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?

The other instruction files in this repository
RepositoryFormatStackCoversScoreChanged
danielvm-git/bigpowers.cursor/rules/align-grid.mdc · 119Cursor rulesnodeshell+8lint-formatdo-notagent-behaviour65/1003 days ago
danielvm-git/bigpowers.cursor/rules/assess-impact.mdc · 119Cursor rulesshellnode+8testtesting-strategydeployment66/1003 days ago
danielvm-git/bigpowers.cursor/rules/audit-code.mdc · 119Cursor rulesshellnode+8setuptestlint-formatstyle+466/1003 days ago
danielvm-git/bigpowers.cursor/rules/audit-plan.mdc · 119Cursor rulesnodeshell+8buildteststylegit74/1003 days ago
danielvm-git/bigpowers.cursor/rules/build-epic.mdc · 119Cursor rulesshellnode+8buildgit58/1003 days ago
danielvm-git/bigpowers.cursor/rules/change-request.mdc · 119Cursor rulesshellnode+8no sections48/1003 days ago
danielvm-git/bigpowers.cursor/rules/commit-message.mdc · 119Cursor rulesshellnode+8lint-formatstyletypesgit+382/1003 days ago
danielvm-git/bigpowers.cursor/rules/compose-workflow.mdc · 119Cursor rulesshellnode+8styledo-notagent-behaviour65/1003 days ago
danielvm-git/bigpowers.cursor/rules/context7-mcp.mdc · 119Cursor rulesshellnode+8style54/1003 days ago
danielvm-git/bigpowers.cursor/rules/deepen-architecture.mdc · 119Cursor rulesshellnode+8testtesting-strategydo-not57/1003 days ago
danielvm-git/bigpowers.cursor/rules/define-language.mdc · 119Cursor rulesshellnode+8lint-formatdo-not65/1003 days ago
danielvm-git/bigpowers.cursor/rules/delegate-task.mdc · 119Cursor rulesshellnode+8git62/1003 days ago
danielvm-git/bigpowers.cursor/rules/deploy.mdc · 119Cursor rulesnodeshell+8setupbuildtestdeployment77/1003 days ago
danielvm-git/bigpowers.cursor/rules/develop-tdd.mdc · 119Cursor rulesshellnode+8teststylearchtesting-strategy+585/1003 days ago
danielvm-git/bigpowers.cursor/rules/diagnose-root.mdc · 119Cursor rulesshellnode+8no sections39/1003 days ago
danielvm-git/bigpowers.cursor/rules/dispatch-agents.mdc · 119Cursor rulesshellnode+8git54/1003 days ago
danielvm-git/bigpowers.cursor/rules/edit-document.mdc · 119Cursor rulesshellnode+8no sections39/1003 days ago
danielvm-git/bigpowers.cursor/rules/elaborate-spec.mdc · 119Cursor rulesshellnode+8test58/1003 days ago
danielvm-git/bigpowers.cursor/rules/enforce-first.mdc · 119Cursor rulesshellnode+8no sections50/1003 days ago
danielvm-git/bigpowers.cursor/rules/evolve-skill.mdc · 119Cursor rulesshellnode+8no sections50/1003 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.

Same format, overlapping stack, ranked by quality
RepositoryFormatStackCoversScoreChanged
TechSquidTV/Hermes.cursor/rules/10-hermes-api.mdc · 45Cursor rulestypescriptpytest+15testlint-formatstylearch+5100/1003 days ago
hiromaily/go-crypto-wallet.cursor/rules/typescript.mdc · 126Cursor rulesgobun+5setupbuildtestlint-format+6100/1003 days ago
markstev/mark-starter.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+14setuptestlint-formatstyle+699/1003 days ago
dodgecfr/combatfilms-webapp.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+15setuptestlint-formatstyle+799/1003 days ago
deifos/clipmira-subtitles.cursor/rules/frontend.mdc · 1Cursor rulestypescriptnextjs+5setuptestlint-formatstyle+799/1003 days ago
Allymahmoud/case-intake-platform.cursor/rules/frontend.mdc · 0Cursor rulestypescriptturborepo+13setuptestlint-formatstyle+799/1003 days ago
langflow-ai/langflow.cursor/rules/docs_development.mdc · 153kCursor rulespythonnode+16setupbuildtestlint-format+797/1003 days ago
TechSquidTV/Hermes.cursor/rules/20-hermes-api-tests.mdc · 45Cursor rulestypescriptpytest+15teststyletesting-strategysecurity+397/1003 days ago
RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack

RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack

RuleStack

Built by

Kynth Studio

Directory

Configs
Stacks
Compare formats
Diff two configs
Best AGENTS.md examples

Formats

AGENTS.md
CLAUDE.md
Cursor rules
Copilot instructions

Reference

Read API
Corpus health
Privacy Policy
Terms

RuleStack