mirror of
https://github.com/proffesor-for-testing/agentic-qe.git
synced 2026-09-19 08:45:47 +08:00
98ec2a5d15
CLAUDE.md references ruflo/claude-flow MCP tools heavily, which can read as a runtime dependency. It isn't: the shipped agentic-qe package imports only @ruvector/* primitives + two optional @claude-flow peers, never the ruflo npm package. Adds a CONTRIBUTING note so contributors don't wire product code to a ruflo CLI/MCP call or add it as a runtime dep. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
969 lines
26 KiB
Markdown
969 lines
26 KiB
Markdown
# Contributing to Agentic QE
|
|
|
|
Thank you for your interest in contributing to Agentic QE! We're excited to have you join our community of developers building the future of AI-driven quality engineering.
|
|
|
|
This document provides guidelines for contributing to the project. Following these guidelines helps maintain code quality and makes the contribution process smooth for everyone.
|
|
|
|
## Table of Contents
|
|
|
|
- [Code of Conduct](#code-of-conduct)
|
|
- [How Can I Contribute?](#how-can-i-contribute)
|
|
- [Development Setup](#development-setup)
|
|
- [Coding Standards](#coding-standards)
|
|
- [Commit Message Convention](#commit-message-convention)
|
|
- [Pull Request Process](#pull-request-process)
|
|
- [Testing Guidelines](#testing-guidelines)
|
|
- [Documentation](#documentation)
|
|
- [Community](#community)
|
|
|
|
## Code of Conduct
|
|
|
|
This project adheres to a Code of Conduct that we expect all contributors to follow. Please read [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) before contributing.
|
|
|
|
By participating, you are expected to uphold this code. Please report unacceptable behavior to the project maintainers.
|
|
|
|
## How Can I Contribute?
|
|
|
|
### Reporting Bugs
|
|
|
|
Before creating bug reports, please check existing issues to avoid duplicates. When creating a bug report, include:
|
|
|
|
- **Clear title and description** - Summarize the issue concisely
|
|
- **Steps to reproduce** - Detailed steps to recreate the bug
|
|
- **Expected vs actual behavior** - What should happen vs what happens
|
|
- **Environment details** - OS, Node.js version, package version
|
|
- **Code samples** - Minimal reproducible example if possible
|
|
- **Screenshots** - If applicable, add visual evidence
|
|
|
|
**Example Bug Report:**
|
|
|
|
```markdown
|
|
**Bug:** Test generation fails for async functions with try-catch blocks
|
|
|
|
**Environment:**
|
|
- OS: Ubuntu 22.04
|
|
- Node.js: 18.17.0
|
|
- Agentic QE: 1.2.3
|
|
|
|
**Steps to Reproduce:**
|
|
1. Run `aqe test src/async-handler.ts`
|
|
2. Observe error in console
|
|
|
|
**Expected:** Tests generated successfully
|
|
**Actual:** TypeError: Cannot read property 'body' of undefined
|
|
|
|
**Code Sample:**
|
|
\`\`\`typescript
|
|
async function fetchData() {
|
|
try {
|
|
const response = await fetch('/api/data');
|
|
return await response.json();
|
|
} catch (error) {
|
|
console.error(error);
|
|
}
|
|
}
|
|
\`\`\`
|
|
```
|
|
|
|
### Suggesting Features
|
|
|
|
Feature suggestions are welcome! Please provide:
|
|
|
|
- **Clear use case** - Why is this feature needed?
|
|
- **Proposed solution** - How should it work?
|
|
- **Alternatives considered** - Other approaches you've thought about
|
|
- **Implementation ideas** - Technical approach if you have thoughts
|
|
|
|
**Example Feature Request:**
|
|
|
|
```markdown
|
|
**Feature:** Visual regression testing agent
|
|
|
|
**Use Case:**
|
|
Teams need to catch UI regressions automatically. Manual visual testing
|
|
is time-consuming and error-prone.
|
|
|
|
**Proposed Solution:**
|
|
Add `qe-visual-tester` agent that:
|
|
- Captures screenshots during test execution
|
|
- Compares against baseline images
|
|
- Highlights visual differences
|
|
- Integrates with existing test suite
|
|
|
|
**Alternatives:**
|
|
- Manual visual testing (current state)
|
|
- Separate visual testing tools (adds complexity)
|
|
|
|
**Implementation Ideas:**
|
|
- Use Playwright for screenshot capture
|
|
- Leverage pixelmatch for image comparison
|
|
- Store baselines in project .visual-baselines/ directory
|
|
```
|
|
|
|
### Code Contributions
|
|
|
|
We love code contributions! Here's how to get started:
|
|
|
|
1. **Fork the repository** on GitHub
|
|
2. **Clone your fork** locally
|
|
3. **Create a feature branch** from `main`
|
|
4. **Make your changes** following coding standards
|
|
5. **Write or update tests** for your changes
|
|
6. **Run the test suite** to ensure nothing breaks
|
|
7. **Commit your changes** using conventional commits
|
|
8. **Push to your fork** and submit a pull request
|
|
|
|
### Documentation Improvements
|
|
|
|
Documentation is crucial! You can contribute by:
|
|
|
|
- Fixing typos or clarifying existing docs
|
|
- Adding examples and use cases
|
|
- Writing tutorials or guides
|
|
- Improving API documentation
|
|
- Translating documentation (future)
|
|
|
|
## Development Setup
|
|
|
|
### Prerequisites
|
|
|
|
Before contributing to Agentic QE, you must have:
|
|
|
|
### Phase 2 Development (v1.1.0+)
|
|
|
|
When contributing to Phase 2 features (learning, patterns, improvement):
|
|
|
|
#### Learning System
|
|
- **LearningEngine** uses Q-learning reinforcement learning algorithm
|
|
- Test with `tests/unit/learning/LearningEngine.test.ts` (85 tests)
|
|
- Follow experience replay patterns for robust learning
|
|
- Maintain 20% performance improvement target
|
|
- Document learning parameters (learning rate, discount factor, epsilon)
|
|
|
|
#### Pattern Bank
|
|
- **QEReasoningBank** uses SQLite for pattern storage
|
|
- Schema: `docs/architecture/REASONING-BANK-SCHEMA.sql`
|
|
- Test pattern extraction thoroughly with all supported frameworks
|
|
- Maintain 85%+ pattern matching accuracy
|
|
- Support Jest, Mocha, Cypress, Vitest, Jasmine, AVA
|
|
- Test deduplication and versioning logic
|
|
|
|
#### Improvement Loop
|
|
- Test A/B testing with sufficient sample size (minimum 30 samples per variant)
|
|
- Validate statistical significance at 95% confidence level
|
|
- Document improvement strategies and their success rates
|
|
- Test automatic rollback on regression detection
|
|
- Maintain performance benchmarks
|
|
|
|
#### ML Models
|
|
- Document all ML models in `docs/ml/` directory
|
|
- Include training data, evaluation metrics, and hyperparameters
|
|
- Maintain 90%+ accuracy requirement for flaky test detection
|
|
- Test with diverse codebases and frameworks
|
|
- Validate false positive rate (target: <5%)
|
|
|
|
#### Integration Testing
|
|
- Test Phase 1 + Phase 2 integration (routing + learning)
|
|
- Validate memory usage under learning workloads (<100MB target)
|
|
- Test pattern extraction performance (<50ms p95 target)
|
|
- Validate learning convergence (30+ days)
|
|
- Test A/B testing statistical validity
|
|
|
|
#### Performance Requirements
|
|
- Pattern matching: <50ms p95 latency
|
|
- Learning iteration: <100ms per iteration
|
|
- ML flaky detection (1000 tests): <500ms
|
|
- Agent memory usage: <100MB average
|
|
- SQLite operations: <10ms p95
|
|
|
|
### Prerequisites
|
|
|
|
Before contributing to Agentic QE, you must have:
|
|
|
|
#### Required
|
|
- **Claude Code**: Install from [claude.ai/code](https://claude.ai/code) - Required for agent execution
|
|
- **Node.js** >= 18.0.0 (LTS recommended)
|
|
- **npm** >= 9.0.0 or **pnpm** >= 8.0.0
|
|
- **Git** >= 2.30.0
|
|
- **TypeScript** >= 5.0.0 (installed via npm)
|
|
|
|
#### Optional (Advanced Development)
|
|
- **Claude Flow**: For advanced coordination
|
|
```bash
|
|
npm install -g @claude/flow
|
|
# or
|
|
npx claude-flow@alpha setup
|
|
```
|
|
|
|
### Understanding the Agent Execution Model
|
|
|
|
**Important**: Agentic QE agents are NOT standalone Node.js processes. They are:
|
|
- **Claude Code agent definitions** (markdown files in `.claude/agents/`)
|
|
- **Executed via Claude Code's Task tool**: `Task("description", "prompt", "agent-type")`
|
|
- **Integrated via MCP** (Model Context Protocol)
|
|
- **Coordinated through hooks** for cross-agent communication
|
|
|
|
When developing agents, you're creating:
|
|
1. Agent definition files (`.claude/agents/qe-*.md`)
|
|
2. TypeScript implementations in `src/agents/`
|
|
3. MCP handlers in `src/mcp/handlers/`
|
|
4. Tests in `tests/agents/` and `tests/integration/`
|
|
|
|
### `ruflo` / `claude-flow` are dev-time tooling, NOT runtime dependencies
|
|
|
|
The `CLAUDE.md` in this repo references `ruflo`/`claude-flow` MCP tools heavily —
|
|
this can read as if the shipped package depends on them. It does not. Those tools
|
|
are **development-time coordination tooling** used by Claude Code sessions that
|
|
*work on* AQE (swarm init, memory, hooks). The published `agentic-qe` package does
|
|
**not** import the `ruflo` npm package at all — check `package.json`: runtime deps
|
|
are `@ruvector/*` primitives (attention, gnn, learning-wasm, router, rvf-node,
|
|
sona) plus two **optional** `@claude-flow/*` peers (`browser`, `guidance`). So:
|
|
|
|
- `npm ls ruflo` in this repo is correctly empty.
|
|
- Don't add `ruflo` as a runtime dependency, and don't wire product code to a
|
|
`ruflo` CLI/MCP call — that coupling doesn't exist and shouldn't be introduced.
|
|
- Learning-integrity work (flywheel, witness chain, provenance) is built *in this
|
|
repo* (`src/learning/`), inspired by ruflo's ADRs but not importing them.
|
|
|
|
### Installation Steps
|
|
|
|
1. **Clone the repository:**
|
|
|
|
```bash
|
|
git clone https://github.com/proffesor-for-testing/agentic-qe-cf.git
|
|
cd agentic-qe-cf/agentic-qe
|
|
```
|
|
|
|
2. **Install dependencies:**
|
|
|
|
```bash
|
|
npm install
|
|
# or
|
|
pnpm install
|
|
```
|
|
|
|
3. **Build the project:**
|
|
|
|
```bash
|
|
npm run build
|
|
```
|
|
|
|
4. **Verify installation:**
|
|
|
|
```bash
|
|
npm run test
|
|
./bin/aqe --version
|
|
```
|
|
|
|
### Running Tests
|
|
|
|
```bash
|
|
# Run all tests
|
|
npm run test
|
|
|
|
# Run tests in watch mode
|
|
npm run test:watch
|
|
|
|
# Run tests with coverage
|
|
npm run test:coverage
|
|
|
|
# Run specific test file
|
|
npm run test -- tests/agents/TestGeneratorAgent.test.ts
|
|
|
|
# Run integration tests only
|
|
npm run test:integration
|
|
```
|
|
|
|
### Development Workflow
|
|
|
|
```bash
|
|
# Start development mode (watch for changes)
|
|
npm run dev
|
|
|
|
# Run linter
|
|
npm run lint
|
|
|
|
# Fix linting issues automatically
|
|
npm run lint:fix
|
|
|
|
# Type checking
|
|
npm run typecheck
|
|
|
|
# Format code
|
|
npm run format
|
|
|
|
# Run all checks (lint + typecheck + test)
|
|
npm run validate
|
|
```
|
|
|
|
## Coding Standards
|
|
|
|
### TypeScript Style Guide
|
|
|
|
We follow strict TypeScript conventions for type safety and code quality:
|
|
|
|
**Naming Conventions:**
|
|
|
|
```typescript
|
|
// Classes: PascalCase
|
|
class TestGeneratorAgent { }
|
|
|
|
// Interfaces: PascalCase with 'I' prefix (optional but preferred)
|
|
interface IAgentConfig { }
|
|
interface AgentConfig { } // Also acceptable
|
|
|
|
// Types: PascalCase
|
|
type TestFramework = 'jest' | 'mocha' | 'vitest';
|
|
|
|
// Functions and methods: camelCase
|
|
function generateTests() { }
|
|
async function analyzeCode() { }
|
|
|
|
// Variables and constants: camelCase
|
|
const maxRetries = 3;
|
|
let currentAttempt = 0;
|
|
|
|
// Constants (truly immutable): UPPER_SNAKE_CASE
|
|
const DEFAULT_TIMEOUT = 5000;
|
|
const MAX_AGENTS = 16;
|
|
|
|
// Private class members: prefix with underscore
|
|
class Agent {
|
|
private _internalState: State;
|
|
private _config: Config;
|
|
}
|
|
|
|
// File names: kebab-case
|
|
// test-generator-agent.ts
|
|
// coverage-analyzer.ts
|
|
```
|
|
|
|
**Code Organization:**
|
|
|
|
```typescript
|
|
// 1. Imports (grouped and sorted)
|
|
import { readFile } from 'fs/promises';
|
|
import path from 'path';
|
|
|
|
import type { AgentConfig } from '../types';
|
|
import { BaseAgent } from './base-agent';
|
|
import { Logger } from '../utils/logger';
|
|
|
|
// 2. Type definitions and interfaces
|
|
interface GeneratorOptions {
|
|
framework: TestFramework;
|
|
coverage: boolean;
|
|
}
|
|
|
|
// 3. Constants
|
|
const DEFAULT_OPTIONS: GeneratorOptions = {
|
|
framework: 'jest',
|
|
coverage: true,
|
|
};
|
|
|
|
// 4. Class implementation
|
|
export class TestGeneratorAgent extends BaseAgent {
|
|
// Public properties first
|
|
public readonly name = 'TestGenerator';
|
|
|
|
// Private properties
|
|
private _options: GeneratorOptions;
|
|
|
|
// Constructor
|
|
constructor(options?: Partial<GeneratorOptions>) {
|
|
super();
|
|
this._options = { ...DEFAULT_OPTIONS, ...options };
|
|
}
|
|
|
|
// Public methods
|
|
async generate(filePath: string): Promise<string> {
|
|
// Implementation
|
|
}
|
|
|
|
// Private methods
|
|
private async _analyzeFile(path: string): Promise<Analysis> {
|
|
// Implementation
|
|
}
|
|
}
|
|
|
|
// 5. Helper functions (if any)
|
|
function formatTestName(name: string): string {
|
|
return name.replace(/([A-Z])/g, ' $1').trim();
|
|
}
|
|
```
|
|
|
|
**Best Practices:**
|
|
|
|
```typescript
|
|
// ✅ DO: Use async/await over promises
|
|
async function fetchData(): Promise<Data> {
|
|
const response = await fetch('/api/data');
|
|
return await response.json();
|
|
}
|
|
|
|
// ❌ DON'T: Use promise chains
|
|
function fetchData(): Promise<Data> {
|
|
return fetch('/api/data')
|
|
.then(response => response.json());
|
|
}
|
|
|
|
// ✅ DO: Use type guards
|
|
function isError(value: unknown): value is Error {
|
|
return value instanceof Error;
|
|
}
|
|
|
|
// ✅ DO: Use optional chaining and nullish coalescing
|
|
const config = userConfig?.timeout ?? DEFAULT_TIMEOUT;
|
|
|
|
// ✅ DO: Prefer readonly for immutable data
|
|
interface Config {
|
|
readonly timeout: number;
|
|
readonly retries: number;
|
|
}
|
|
|
|
// ✅ DO: Use discriminated unions for state
|
|
type AgentState =
|
|
| { status: 'idle' }
|
|
| { status: 'running'; progress: number }
|
|
| { status: 'error'; error: Error };
|
|
|
|
// ✅ DO: Document complex logic
|
|
/**
|
|
* Analyzes test coverage using sublinear algorithms.
|
|
*
|
|
* Implements O(log n) coverage analysis through:
|
|
* 1. Binary search over test execution traces
|
|
* 2. Sparse matrix representation of code paths
|
|
* 3. Probabilistic coverage estimation
|
|
*
|
|
* @param testResults - Array of test execution results
|
|
* @returns Coverage analysis with gap identification
|
|
*/
|
|
async function analyzeCoverage(testResults: TestResult[]): Promise<CoverageAnalysis> {
|
|
// Implementation
|
|
}
|
|
```
|
|
|
|
### File Size Limits
|
|
|
|
- Keep files under **500 lines** when possible
|
|
- Extract large functions into separate modules
|
|
- Use the single responsibility principle
|
|
|
|
### Testing Requirements
|
|
|
|
Every contribution must include tests:
|
|
|
|
- **Unit tests** for new functions/classes (required)
|
|
- **Integration tests** for new features (required)
|
|
- **Edge cases** and error conditions (required)
|
|
- Aim for **80%+ code coverage** (enforced)
|
|
|
|
```typescript
|
|
// Example test structure
|
|
describe('TestGeneratorAgent', () => {
|
|
let agent: TestGeneratorAgent;
|
|
|
|
beforeEach(() => {
|
|
agent = new TestGeneratorAgent();
|
|
});
|
|
|
|
afterEach(() => {
|
|
jest.clearAllMocks();
|
|
});
|
|
|
|
describe('generate', () => {
|
|
it('should generate tests for a simple function', async () => {
|
|
// Arrange
|
|
const filePath = '/path/to/file.ts';
|
|
const expectedTests = expect.stringContaining('describe');
|
|
|
|
// Act
|
|
const result = await agent.generate(filePath);
|
|
|
|
// Assert
|
|
expect(result).toBe(expectedTests);
|
|
});
|
|
|
|
it('should handle async functions', async () => {
|
|
// Test async behavior
|
|
});
|
|
|
|
it('should throw error for invalid file path', async () => {
|
|
// Test error handling
|
|
await expect(agent.generate('/invalid')).rejects.toThrow();
|
|
});
|
|
});
|
|
});
|
|
```
|
|
|
|
### Documentation Requirements
|
|
|
|
- **JSDoc comments** for all public APIs
|
|
- **Inline comments** for complex logic
|
|
- **README updates** for new features
|
|
- **Type definitions** with descriptions
|
|
|
|
```typescript
|
|
/**
|
|
* Base agent class providing core functionality for all AQE agents.
|
|
*
|
|
* All specialized agents (TestGenerator, CoverageAnalyzer, etc.) extend
|
|
* this class to inherit coordination, memory, and lifecycle management.
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* class CustomAgent extends BaseAgent {
|
|
* constructor() {
|
|
* super({ name: 'CustomAgent', version: '1.0.0' });
|
|
* }
|
|
*
|
|
* async execute() {
|
|
* await this.storeMemory('key', 'value');
|
|
* return { success: true };
|
|
* }
|
|
* }
|
|
* ```
|
|
*/
|
|
export abstract class BaseAgent {
|
|
/**
|
|
* Unique identifier for this agent instance.
|
|
* Generated automatically on instantiation.
|
|
*/
|
|
readonly id: string;
|
|
|
|
/**
|
|
* Stores data in the shared memory system for cross-agent communication.
|
|
*
|
|
* @param key - Memory key (use 'aqe/agent-name/key' convention)
|
|
* @param value - Data to store (must be JSON-serializable)
|
|
* @throws {MemoryError} If storage fails or quota exceeded
|
|
*/
|
|
protected async storeMemory(key: string, value: unknown): Promise<void> {
|
|
// Implementation
|
|
}
|
|
}
|
|
```
|
|
|
|
## Commit Message Convention
|
|
|
|
We use [Conventional Commits](https://www.conventionalcommits.org/) for clear, structured commit history.
|
|
|
|
### Format
|
|
|
|
```
|
|
<type>(<scope>): <subject>
|
|
|
|
<body>
|
|
|
|
<footer>
|
|
```
|
|
|
|
### Types
|
|
|
|
- **feat**: New feature
|
|
- **fix**: Bug fix
|
|
- **docs**: Documentation changes
|
|
- **style**: Code style changes (formatting, semicolons, etc.)
|
|
- **refactor**: Code refactoring without behavior change
|
|
- **perf**: Performance improvements
|
|
- **test**: Adding or updating tests
|
|
- **chore**: Maintenance tasks (dependencies, build, etc.)
|
|
- **ci**: CI/CD changes
|
|
- **revert**: Reverting previous commits
|
|
|
|
### Scopes
|
|
|
|
Use component names as scopes:
|
|
|
|
- **agent**: Agent-related changes
|
|
- **mcp**: MCP server/handler changes
|
|
- **cli**: CLI command changes
|
|
- **core**: Core framework changes
|
|
- **test**: Test infrastructure changes
|
|
|
|
### Examples
|
|
|
|
```bash
|
|
# Feature
|
|
feat(agent): add visual regression testing agent
|
|
|
|
Implements new agent for visual testing with screenshot comparison.
|
|
|
|
- Captures screenshots using Playwright
|
|
- Compares against baseline images
|
|
- Highlights visual differences
|
|
- Integrates with existing test suite
|
|
|
|
Closes #123
|
|
|
|
# Bug fix
|
|
fix(mcp): handle undefined agent configs gracefully
|
|
|
|
Fixes crash when agent config is missing optional fields.
|
|
|
|
Fixes #456
|
|
|
|
# Documentation
|
|
docs(readme): update installation instructions
|
|
|
|
Add prerequisite versions and troubleshooting section.
|
|
|
|
# Refactoring
|
|
refactor(agent): extract common test generation logic
|
|
|
|
Moves shared test generation code to base class to reduce duplication.
|
|
|
|
# Performance
|
|
perf(coverage): optimize O(log n) coverage analysis
|
|
|
|
Implements sparse matrix representation reducing memory usage by 40%.
|
|
```
|
|
|
|
### Rules
|
|
|
|
- Use imperative mood ("add feature" not "added feature")
|
|
- Keep subject line under 72 characters
|
|
- Capitalize first letter of subject
|
|
- No period at end of subject
|
|
- Separate subject from body with blank line
|
|
- Wrap body at 72 characters
|
|
- Use body to explain what and why, not how
|
|
|
|
## Pull Request Process
|
|
|
|
### Branch Naming
|
|
|
|
Use descriptive branch names with prefixes:
|
|
|
|
```bash
|
|
# Features
|
|
git checkout -b feat/visual-testing-agent
|
|
git checkout -b feat/add-playwright-integration
|
|
|
|
# Bug fixes
|
|
git checkout -b fix/async-test-generation
|
|
git checkout -b fix/memory-leak-in-analyzer
|
|
|
|
# Documentation
|
|
git checkout -b docs/contributing-guide
|
|
git checkout -b docs/api-reference-update
|
|
|
|
# Refactoring
|
|
git checkout -b refactor/test-generator-cleanup
|
|
```
|
|
|
|
### Before Submitting
|
|
|
|
1. **Update your branch** with latest main:
|
|
```bash
|
|
git checkout main
|
|
git pull origin main
|
|
git checkout your-branch
|
|
git rebase main
|
|
```
|
|
|
|
2. **Run all checks**:
|
|
```bash
|
|
npm run validate # Runs lint, typecheck, and tests
|
|
npm run test:coverage # Ensure 80%+ coverage
|
|
```
|
|
|
|
3. **Update documentation** if needed
|
|
|
|
4. **Write clear commit messages** following conventions
|
|
|
|
### Pull Request Template
|
|
|
|
When creating a PR, include:
|
|
|
|
```markdown
|
|
## Description
|
|
Brief description of changes and motivation.
|
|
|
|
## Type of Change
|
|
- [ ] Bug fix (non-breaking change fixing an issue)
|
|
- [ ] New feature (non-breaking change adding functionality)
|
|
- [ ] Breaking change (fix or feature causing existing functionality to change)
|
|
- [ ] Documentation update
|
|
|
|
## Testing
|
|
- [ ] Unit tests added/updated
|
|
- [ ] Integration tests added/updated
|
|
- [ ] All tests passing locally
|
|
- [ ] Coverage maintained at 80%+
|
|
|
|
## Checklist
|
|
- [ ] Code follows project style guidelines
|
|
- [ ] Self-review completed
|
|
- [ ] Comments added for complex logic
|
|
- [ ] Documentation updated
|
|
- [ ] No new warnings generated
|
|
- [ ] Dependent changes merged and published
|
|
|
|
## Related Issues
|
|
Closes #123
|
|
Related to #456
|
|
|
|
## Screenshots (if applicable)
|
|
Add screenshots for UI changes.
|
|
|
|
## Additional Context
|
|
Any other relevant information.
|
|
```
|
|
|
|
### Review Process
|
|
|
|
1. **Automated checks** must pass (CI/CD pipeline)
|
|
2. **At least one maintainer** review required
|
|
3. **Address feedback** promptly and professionally
|
|
4. **Squash commits** if requested to maintain clean history
|
|
5. **Update branch** if main has advanced
|
|
|
|
### Merge Criteria
|
|
|
|
PRs will be merged when:
|
|
|
|
- ✅ All CI checks pass
|
|
- ✅ Code review approved by maintainer(s)
|
|
- ✅ Test coverage maintained (80%+)
|
|
- ✅ Documentation updated
|
|
- ✅ No merge conflicts
|
|
- ✅ Conventional commits followed
|
|
|
|
## Testing Guidelines
|
|
|
|
### Unit Tests
|
|
|
|
Test individual functions and classes in isolation:
|
|
|
|
```typescript
|
|
// tests/agents/test-generator.test.ts
|
|
import { TestGeneratorAgent } from '../../src/agents/TestGeneratorAgent';
|
|
|
|
describe('TestGeneratorAgent', () => {
|
|
describe('generateTestSuite', () => {
|
|
it('should generate Jest test suite for simple function', async () => {
|
|
const agent = new TestGeneratorAgent({ framework: 'jest' });
|
|
const sourceCode = `
|
|
export function add(a: number, b: number): number {
|
|
return a + b;
|
|
}
|
|
`;
|
|
|
|
const result = await agent.generateTestSuite(sourceCode);
|
|
|
|
expect(result).toContain('describe');
|
|
expect(result).toContain('it(');
|
|
expect(result).toContain('expect');
|
|
});
|
|
|
|
it('should handle edge cases correctly', async () => {
|
|
// Test edge cases
|
|
});
|
|
|
|
it('should throw ValidationError for invalid input', async () => {
|
|
const agent = new TestGeneratorAgent();
|
|
|
|
await expect(agent.generateTestSuite('')).rejects.toThrow(ValidationError);
|
|
});
|
|
});
|
|
});
|
|
```
|
|
|
|
### Integration Tests
|
|
|
|
Test component interactions and end-to-end workflows:
|
|
|
|
```typescript
|
|
// tests/integration/test-generation-flow.test.ts
|
|
describe('Test Generation Flow', () => {
|
|
it('should generate and execute tests for real project', async () => {
|
|
// Arrange
|
|
const projectPath = '/path/to/sample-project';
|
|
const generator = new TestGeneratorAgent();
|
|
const executor = new TestExecutorAgent();
|
|
|
|
// Act - Generate tests
|
|
const tests = await generator.generateForProject(projectPath);
|
|
|
|
// Act - Execute tests
|
|
const results = await executor.execute(tests);
|
|
|
|
// Assert
|
|
expect(results.passed).toBeGreaterThan(0);
|
|
expect(results.coverage).toBeGreaterThanOrEqual(80);
|
|
});
|
|
});
|
|
```
|
|
|
|
### Test Organization
|
|
|
|
```
|
|
tests/
|
|
├── agents/ # Unit tests for agents
|
|
│ ├── TestGeneratorAgent.test.ts
|
|
│ ├── CoverageAnalyzerAgent.test.ts
|
|
│ └── ...
|
|
├── mcp/ # Unit tests for MCP handlers
|
|
│ ├── test-generate.test.ts
|
|
│ └── test-execute.test.ts
|
|
├── integration/ # Integration tests
|
|
│ ├── test-generation-flow.test.ts
|
|
│ ├── coverage-analysis-flow.test.ts
|
|
│ └── ...
|
|
└── fixtures/ # Test fixtures and mocks
|
|
├── sample-code.ts
|
|
└── mock-data.json
|
|
```
|
|
|
|
### Coverage Expectations
|
|
|
|
- **Overall coverage**: 80%+
|
|
- **Critical paths**: 95%+
|
|
- **New code**: 100% (or justify exceptions)
|
|
- **Edge cases**: Well tested
|
|
|
|
Run coverage report:
|
|
|
|
```bash
|
|
npm run test:coverage
|
|
|
|
# View HTML report
|
|
open coverage/lcov-report/index.html
|
|
```
|
|
|
|
### Mocking Best Practices
|
|
|
|
```typescript
|
|
// Use Jest mocks for external dependencies
|
|
jest.mock('fs/promises', () => ({
|
|
readFile: jest.fn(),
|
|
writeFile: jest.fn(),
|
|
}));
|
|
|
|
// Mock implementations
|
|
const mockReadFile = readFile as jest.MockedFunction<typeof readFile>;
|
|
mockReadFile.mockResolvedValue('file content');
|
|
|
|
// Verify mock calls
|
|
expect(mockReadFile).toHaveBeenCalledWith('/path/to/file', 'utf-8');
|
|
```
|
|
|
|
## Documentation
|
|
|
|
### Release verification
|
|
|
|
Before proposing a release-related change, read [`docs/VERIFICATION.md`](docs/VERIFICATION.md). It is the maintainer-facing entry point for the release-gate corpus, the per-release verification matrix, and the procedure for adding new fixtures. The load-bearing release-process policy lives at [`docs/policies/release-verification.md`](docs/policies/release-verification.md).
|
|
|
|
### Code Comments
|
|
|
|
```typescript
|
|
// ✅ Good: Explains WHY, not what
|
|
// Use binary search because array is pre-sorted by timestamp
|
|
const index = binarySearch(items, timestamp);
|
|
|
|
// ❌ Bad: Explains what code already shows
|
|
// Search the array for the timestamp
|
|
const index = binarySearch(items, timestamp);
|
|
|
|
// ✅ Good: Documents complex algorithm
|
|
/**
|
|
* Implements sublinear coverage analysis using probabilistic sampling.
|
|
*
|
|
* Algorithm complexity: O(log n)
|
|
* Memory usage: O(1) for sparse matrices
|
|
*
|
|
* Trade-offs:
|
|
* - 99.9% accuracy with 0.1% false positive rate
|
|
* - 40% faster than full coverage analysis
|
|
* - Suitable for projects with 10K+ test cases
|
|
*/
|
|
```
|
|
|
|
### API Documentation
|
|
|
|
Use JSDoc for all public APIs:
|
|
|
|
```typescript
|
|
/**
|
|
* Analyzes test coverage and identifies gaps using sublinear algorithms.
|
|
*
|
|
* @param options - Configuration options
|
|
* @param options.projectPath - Path to project root
|
|
* @param options.threshold - Minimum coverage threshold (0-100)
|
|
* @param options.algorithms - Sublinear algorithms to use
|
|
* @returns Coverage analysis with gap identification
|
|
* @throws {ValidationError} If project path is invalid
|
|
* @throws {AnalysisError} If coverage analysis fails
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* const analyzer = new CoverageAnalyzerAgent();
|
|
* const analysis = await analyzer.analyze({
|
|
* projectPath: '/path/to/project',
|
|
* threshold: 80,
|
|
* algorithms: ['binary-search', 'sparse-matrix']
|
|
* });
|
|
*
|
|
* console.log(`Coverage: ${analysis.percentage}%`);
|
|
* console.log(`Gaps: ${analysis.gaps.length}`);
|
|
* ```
|
|
*/
|
|
```
|
|
|
|
### README Updates
|
|
|
|
When adding features, update relevant README sections:
|
|
|
|
- Installation steps if dependencies change
|
|
- Usage examples for new commands
|
|
- Configuration options for new settings
|
|
- Troubleshooting for common issues
|
|
|
|
## Community
|
|
|
|
### Getting Help
|
|
|
|
- **GitHub Discussions**: Ask questions and share ideas
|
|
- **Discord Server**: Real-time chat with maintainers and community
|
|
- **Stack Overflow**: Tag questions with `agentic-qe`
|
|
- **GitHub Issues**: Bug reports and feature requests
|
|
|
|
### Communication Channels
|
|
|
|
- **GitHub Discussions**: https://github.com/agentic-qe/agentic-qe-cf/discussions
|
|
- **Discord**: [Join our server](#) (link TBD)
|
|
- **Twitter**: [@AgenticQE](#) (link TBD)
|
|
- **Blog**: [blog.agentic-qe.dev](#) (link TBD)
|
|
|
|
### Recognition
|
|
|
|
We value all contributions! Contributors are recognized in:
|
|
|
|
- **CONTRIBUTORS.md**: All contributors listed
|
|
- **Release notes**: Significant contributions highlighted
|
|
- **GitHub profile**: Contribution graph and badges
|
|
- **Monthly spotlight**: Featured contributors in blog posts
|
|
|
|
### Mentorship
|
|
|
|
New to open source? We're here to help!
|
|
|
|
- **Good first issues**: Tagged for beginners
|
|
- **Mentorship program**: Pair with experienced contributors
|
|
- **Documentation**: Extensive guides and examples
|
|
- **Code reviews**: Constructive feedback to learn and grow
|
|
|
|
## Questions?
|
|
|
|
Don't hesitate to ask! Open a discussion or reach out to maintainers. We're here to help and excited to have you contribute to Agentic QE.
|
|
|
|
Thank you for contributing! 🎉
|
|
|
|
---
|
|
|
|
**License**: By contributing, you agree that your contributions will be licensed under the project's license.
|
|
|
|
**Attribution**: This contributing guide was inspired by open-source best practices from projects like TypeScript, Jest, and Playwright.
|