qapulsesk-report
v1.0.5
Published
All-in-one test reporter for Playwright, Cypress, Jest & Vitest — beautiful dark-theme HTML reports, AI failure analysis, Slack/Teams webhooks. By QAPulse by SK.
Maintainers
Readme
QAPulseSK-report
The only test reporter you'll ever need. Playwright · Cypress · Jest · Vitest — one package, zero config, beautiful results.
✨ Why QAPulseSK-report?
Most teams install 4–5 separate reporter packages — one per framework, one for Slack, one for AI, one for trends. We ship everything in one.
| Feature | QAPulseSK-report | Others | |---|---|---| | Playwright support | ✅ | ✅ | | Cypress support | ✅ | Separate package | | Jest support | ✅ | Separate package | | Vitest support | ✅ | Separate package | | Beautiful dark-theme HTML | ✅ | Basic / ugly | | AI failure analysis | ✅ Opt-in, your key | ❌ | | Slack + Teams webhooks | ✅ Built-in | ❌ | | Trend charts | ✅ Built-in | Paid | | Zero cost to use | ✅ Always | Often paid |
🚀 Install
npm install qapulsesk-report --save-dev
# or
yarn add qapulsesk-report -D
# or
pnpm add qapulsesk-report -D📖 Usage
Playwright
// playwright.config.ts
import { defineConfig } from '@playwright/test';
export default defineConfig({
reporter: [
['list'],
['qapulsesk-report/playwright', {
outputDir: 'qapulse-report',
reportTitle: 'My E2E Tests',
openAfterGeneration: true,
// 📊 Trend charts across runs
history: { enabled: true },
// 🤖 AI failure analysis — optional, your key, zero cost to us
// ai: {
// enabled: true,
// provider: 'anthropic', // 'anthropic' | 'openai' | 'gemini'
// apiKey: process.env.AI_API_KEY,
// },
// 🔔 Slack / Teams notifications — optional
// webhooks: {
// slack: process.env.SLACK_WEBHOOK_URL,
// notifyOnFailOnly: true,
// },
}],
],
});Cypress
// cypress.config.ts
import { defineConfig } from 'cypress';
import { qapulseCypressPlugin } from 'qapulsesk-report/cypress';
export default defineConfig({
e2e: {
setupNodeEvents(on, config) {
qapulseCypressPlugin(on, config, {
outputDir: 'qapulse-report',
reportTitle: 'My Cypress Tests',
history: { enabled: true },
});
return config;
},
},
});Jest
// jest.config.js
module.exports = {
reporters: [
'default',
['qapulsesk-report/jest', {
outputDir: 'qapulse-report',
reportTitle: 'My Jest Tests',
history: { enabled: true },
}],
],
};Vitest
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import { QAPulseVitestReporter } from 'qapulsesk-report/vitest';
export default defineConfig({
test: {
reporters: [
'verbose',
new QAPulseVitestReporter({
outputDir: 'qapulse-report',
reportTitle: 'My Vitest Tests',
history: { enabled: true },
}),
],
},
});🤖 AI Failure Analysis (Optional)
Unlock AI-powered failure summaries by adding your own API key. We never call any AI service by default — zero cost, zero data sent.
ai: {
enabled: true,
provider: 'anthropic', // 'anthropic' | 'openai' | 'gemini'
apiKey: process.env.AI_API_KEY, // your key, your cost
maxFailuresToAnalyze: 10, // limit API calls per run
}For each failed test you get:
- Summary — plain English explanation
- Root cause — what actually went wrong
- Suggestion — concrete fix
- Confidence — high / medium / low
🔔 Webhooks
webhooks: {
slack: process.env.SLACK_WEBHOOK_URL,
teams: process.env.TEAMS_WEBHOOK_URL,
notifyOnFailOnly: true, // only ping when tests fail
}📊 Trend Charts
Enable history to see pass rate, passed, and failed counts across your last N runs:
history: {
enabled: true,
maxRuns: 20, // default: 20
historyFile: '.qapulse-history.json' // default
}⚙️ Full Config Reference
interface QAPulseReportConfig {
outputDir?: string; // default: 'qapulse-report'
reportTitle?: string; // default: 'QAPulseSK Test Report'
openAfterGeneration?: boolean; // default: false
logo?: string; // path to your logo image
ai?: {
enabled: boolean;
provider?: 'anthropic' | 'openai' | 'gemini';
apiKey?: string;
model?: string; // auto-selected if omitted
maxFailuresToAnalyze?: number; // default: 10
};
webhooks?: {
slack?: string;
teams?: string;
notifyOnFailOnly?: boolean;
custom?: Array<{
url: string;
headers?: Record<string, string>;
template?: (run: TestRun) => object;
}>;
};
history?: {
enabled: boolean;
historyFile?: string;
maxRuns?: number;
};
}🗂️ Project Structure
QAPulseSK-report/
├── src/
│ ├── adapters/
│ │ ├── playwright.ts # Playwright reporter
│ │ ├── cypress.ts # Cypress plugin
│ │ ├── jest.ts # Jest reporter
│ │ └── vitest.ts # Vitest reporter
│ ├── core/
│ │ ├── types.ts # All TypeScript types
│ │ ├── stats.ts # Stats calculation
│ │ ├── generator.ts # HTML report generator
│ │ └── history.ts # Trend data manager
│ ├── ai/
│ │ └── analyzer.ts # AI failure analysis
│ └── webhooks/
│ └── notifier.ts # Slack / Teams / custom
├── examples/
│ ├── playwright/
│ ├── cypress/
│ ├── jest/
│ └── vitest/
└── dist/ # Built output🤝 Contributing
PRs are welcome! See CONTRIBUTING.md.
- Fork the repo
- Create a branch:
git checkout -b feat/my-feature - Commit:
git commit -m 'feat: add my feature' - Push + open a PR
📬 Links
| | | |---|---| | 🌐 Website | skakarh.com | | 📦 npm | npmjs.com/package/qapulsesk-report | | 🐛 Issues | GitHub Issues | | 💼 LinkedIn | company/qapulsebysk | | 🐦 Twitter/X | @qapulsebysk |
Built with ❤️ by QAPulse by SK
If this saved you time, please ⭐ the repo — it helps others find it!
