diff --git a/.agentready-demo/demo-assessment-20251121-051257.json b/.agentready-demo/demo-assessment-20251121-051257.json
new file mode 100644
index 0000000..8fa2ec9
--- /dev/null
+++ b/.agentready-demo/demo-assessment-20251121-051257.json
@@ -0,0 +1,620 @@
+{
+ "repository": {
+ "path": "/var/folders/43/ffv83_l50cn2k0rzgxp63kyw0000gn/T/agentready-demo-zp8md4nd/demo-repo",
+ "name": "demo-repo",
+ "url": null,
+ "branch": "main",
+ "commit_hash": "8798997839b602cbb3f02073ca66ed95abc6cdda",
+ "languages": {
+ "Python": 4
+ },
+ "total_files": 7,
+ "total_lines": 100
+ },
+ "timestamp": "2025-11-21T05:12:57.860663",
+ "overall_score": 73.1,
+ "certification_level": "Silver",
+ "attributes_assessed": 10,
+ "attributes_skipped": 15,
+ "attributes_total": 25,
+ "findings": [
+ {
+ "attribute": {
+ "id": "claude_md_file",
+ "name": "CLAUDE.md Configuration Files",
+ "category": "Context Window Optimization",
+ "tier": 1,
+ "description": "Project-specific configuration for Claude Code",
+ "criteria": "CLAUDE.md file exists in repository root",
+ "default_weight": 0.1
+ },
+ "status": "pass",
+ "score": 100.0,
+ "measured_value": "present",
+ "threshold": "present",
+ "evidence": [
+ "CLAUDE.md found at /var/folders/43/ffv83_l50cn2k0rzgxp63kyw0000gn/T/agentready-demo-zp8md4nd/demo-repo/CLAUDE.md"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "readme_structure",
+ "name": "README Structure",
+ "category": "Documentation Standards",
+ "tier": 1,
+ "description": "Well-structured README with key sections",
+ "criteria": "README.md with installation, usage, and development sections",
+ "default_weight": 0.1
+ },
+ "status": "pass",
+ "score": 100.0,
+ "measured_value": "3/3 sections",
+ "threshold": "3/3 sections",
+ "evidence": [
+ "Found 3/3 essential sections",
+ "Installation: \u2713",
+ "Usage: \u2713",
+ "Development: \u2713"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "type_annotations",
+ "name": "Type Annotations",
+ "category": "Code Quality",
+ "tier": 1,
+ "description": "Type hints in function signatures",
+ "criteria": ">80% of functions have type annotations",
+ "default_weight": 0.1
+ },
+ "status": "pass",
+ "score": 100.0,
+ "measured_value": "100.0%",
+ "threshold": "\u226580%",
+ "evidence": [
+ "Typed functions: 5/5",
+ "Coverage: 100.0%"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "standard_layout",
+ "name": "Standard Project Layouts",
+ "category": "Repository Structure",
+ "tier": 1,
+ "description": "Follows standard project structure for language",
+ "criteria": "Standard directories (src/, tests/, docs/) present",
+ "default_weight": 0.1
+ },
+ "status": "pass",
+ "score": 100.0,
+ "measured_value": "2/2 directories",
+ "threshold": "2/2 directories",
+ "evidence": [
+ "Found 2/2 standard directories",
+ "src/: \u2713",
+ "tests/: \u2713"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "lock_files",
+ "name": "Lock Files for Reproducibility",
+ "category": "Dependency Management",
+ "tier": 1,
+ "description": "Lock files present for dependency pinning",
+ "criteria": "package-lock.json, yarn.lock, poetry.lock, or requirements.txt with versions",
+ "default_weight": 0.1
+ },
+ "status": "fail",
+ "score": 0.0,
+ "measured_value": "none",
+ "threshold": "at least one lock file",
+ "evidence": [
+ "No lock files found"
+ ],
+ "remediation": {
+ "summary": "Add lock file for dependency reproducibility",
+ "steps": [
+ "Use npm install, poetry lock, or equivalent to generate lock file"
+ ],
+ "tools": [],
+ "commands": [
+ "npm install # generates package-lock.json"
+ ],
+ "examples": [],
+ "citations": []
+ },
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "test_coverage",
+ "name": "Test Coverage Requirements",
+ "category": "Testing & CI/CD",
+ "tier": 2,
+ "description": "Test coverage thresholds configured and enforced",
+ "criteria": ">80% code coverage",
+ "default_weight": 0.03
+ },
+ "status": "fail",
+ "score": 50.0,
+ "measured_value": "not configured",
+ "threshold": "configured with >80% threshold",
+ "evidence": [
+ "Coverage config: \u2713",
+ "pytest-cov: \u2717"
+ ],
+ "remediation": {
+ "summary": "Configure test coverage with \u226580% threshold",
+ "steps": [
+ "Install coverage tool (pytest-cov for Python, jest for JavaScript)",
+ "Configure coverage threshold in project config",
+ "Add coverage reporting to CI/CD pipeline",
+ "Run coverage locally before committing"
+ ],
+ "tools": [
+ "pytest-cov",
+ "jest",
+ "vitest",
+ "coverage"
+ ],
+ "commands": [
+ "# Python",
+ "pip install pytest-cov",
+ "pytest --cov=src --cov-report=term-missing --cov-fail-under=80",
+ "",
+ "# JavaScript",
+ "npm install --save-dev jest",
+ "npm test -- --coverage --coverageThreshold='{\\'global\\': {\\'lines\\': 80}}'"
+ ],
+ "examples": [
+ "# Python - pyproject.toml\n[tool.pytest.ini_options]\naddopts = \"--cov=src --cov-report=term-missing\"\n\n[tool.coverage.report]\nfail_under = 80\n",
+ "// JavaScript - package.json\n{\n \"jest\": {\n \"coverageThreshold\": {\n \"global\": {\n \"lines\": 80,\n \"statements\": 80,\n \"functions\": 80,\n \"branches\": 80\n }\n }\n }\n}\n"
+ ],
+ "citations": [
+ {
+ "source": "pytest-cov",
+ "title": "Coverage Configuration",
+ "url": "https://pytest-cov.readthedocs.io/",
+ "relevance": "pytest-cov configuration guide"
+ }
+ ]
+ },
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "precommit_hooks",
+ "name": "Pre-commit Hooks & CI/CD Linting",
+ "category": "Testing & CI/CD",
+ "tier": 2,
+ "description": "Pre-commit hooks configured for linting and formatting",
+ "criteria": ".pre-commit-config.yaml exists",
+ "default_weight": 0.03
+ },
+ "status": "fail",
+ "score": 0.0,
+ "measured_value": "not configured",
+ "threshold": "configured",
+ "evidence": [
+ ".pre-commit-config.yaml not found"
+ ],
+ "remediation": {
+ "summary": "Configure pre-commit hooks for automated code quality checks",
+ "steps": [
+ "Install pre-commit framework",
+ "Create .pre-commit-config.yaml",
+ "Add hooks for linting and formatting",
+ "Install hooks: pre-commit install",
+ "Run on all files: pre-commit run --all-files"
+ ],
+ "tools": [
+ "pre-commit"
+ ],
+ "commands": [
+ "pip install pre-commit",
+ "pre-commit install",
+ "pre-commit run --all-files"
+ ],
+ "examples": [
+ "# .pre-commit-config.yaml\nrepos:\n - repo: https://github.com/pre-commit/pre-commit-hooks\n rev: v4.4.0\n hooks:\n - id: trailing-whitespace\n - id: end-of-file-fixer\n - id: check-yaml\n - id: check-added-large-files\n\n - repo: https://github.com/psf/black\n rev: 23.3.0\n hooks:\n - id: black\n\n - repo: https://github.com/pycqa/isort\n rev: 5.12.0\n hooks:\n - id: isort\n"
+ ],
+ "citations": [
+ {
+ "source": "pre-commit.com",
+ "title": "Pre-commit Framework",
+ "url": "https://pre-commit.com/",
+ "relevance": "Official pre-commit documentation"
+ }
+ ]
+ },
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "conventional_commits",
+ "name": "Conventional Commit Messages",
+ "category": "Git & Version Control",
+ "tier": 2,
+ "description": "Follows conventional commit format",
+ "criteria": "\u226580% of recent commits follow convention",
+ "default_weight": 0.03
+ },
+ "status": "fail",
+ "score": 0.0,
+ "measured_value": "not configured",
+ "threshold": "configured",
+ "evidence": [
+ "No commitlint or husky configuration"
+ ],
+ "remediation": {
+ "summary": "Configure conventional commits with commitlint",
+ "steps": [
+ "Install commitlint",
+ "Configure husky for commit-msg hook"
+ ],
+ "tools": [
+ "commitlint",
+ "husky"
+ ],
+ "commands": [
+ "npm install --save-dev @commitlint/cli @commitlint/config-conventional husky"
+ ],
+ "examples": [],
+ "citations": []
+ },
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "gitignore_completeness",
+ "name": ".gitignore Completeness",
+ "category": "Git & Version Control",
+ "tier": 2,
+ "description": "Comprehensive .gitignore file",
+ "criteria": ".gitignore exists and covers common patterns",
+ "default_weight": 0.03
+ },
+ "status": "pass",
+ "score": 100.0,
+ "measured_value": "325 bytes",
+ "threshold": ">50 bytes",
+ "evidence": [
+ ".gitignore found (325 bytes)"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "cyclomatic_complexity",
+ "name": "Cyclomatic Complexity Thresholds",
+ "category": "Code Quality",
+ "tier": 3,
+ "description": "Cyclomatic complexity thresholds enforced",
+ "criteria": "Average complexity <10, no functions >15",
+ "default_weight": 0.03
+ },
+ "status": "pass",
+ "score": 100.0,
+ "measured_value": "2.0",
+ "threshold": "<10.0",
+ "evidence": [
+ "Average cyclomatic complexity: 2.0"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "one_command_setup",
+ "name": "One-Command Build/Setup",
+ "category": "Build & Development",
+ "tier": 2,
+ "description": "Assessment for One-Command Build/Setup",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "One-Command Build/Setup assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "concise_documentation",
+ "name": "Concise Structured Documentation",
+ "category": "Context Window Optimization",
+ "tier": 2,
+ "description": "Assessment for Concise Structured Documentation",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Concise Structured Documentation assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "inline_documentation",
+ "name": "Inline Documentation",
+ "category": "Documentation Standards",
+ "tier": 2,
+ "description": "Assessment for Inline Documentation",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Inline Documentation assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "file_size_limits",
+ "name": "File Size Limits",
+ "category": "Context Window Optimization",
+ "tier": 2,
+ "description": "Assessment for File Size Limits",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "File Size Limits assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "dependency_freshness",
+ "name": "Dependency Freshness & Security",
+ "category": "Dependency Management",
+ "tier": 2,
+ "description": "Assessment for Dependency Freshness & Security",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Dependency Freshness & Security assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "separation_concerns",
+ "name": "Separation of Concerns",
+ "category": "Repository Structure",
+ "tier": 2,
+ "description": "Assessment for Separation of Concerns",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Separation of Concerns assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "structured_logging",
+ "name": "Structured Logging",
+ "category": "Error Handling",
+ "tier": 3,
+ "description": "Assessment for Structured Logging",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Structured Logging assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "openapi_specs",
+ "name": "OpenAPI/Swagger Specifications",
+ "category": "API Documentation",
+ "tier": 3,
+ "description": "Assessment for OpenAPI/Swagger Specifications",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "OpenAPI/Swagger Specifications assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "architecture_decisions",
+ "name": "Architecture Decision Records",
+ "category": "Documentation Standards",
+ "tier": 3,
+ "description": "Assessment for Architecture Decision Records",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Architecture Decision Records assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "semantic_naming",
+ "name": "Semantic File & Directory Naming",
+ "category": "Modularity",
+ "tier": 3,
+ "description": "Assessment for Semantic File & Directory Naming",
+ "criteria": "To be implemented",
+ "default_weight": 0.03
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Semantic File & Directory Naming assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "security_scanning",
+ "name": "Security Scanning Automation",
+ "category": "Security",
+ "tier": 4,
+ "description": "Assessment for Security Scanning Automation",
+ "criteria": "To be implemented",
+ "default_weight": 0.01
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Security Scanning Automation assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "performance_benchmarks",
+ "name": "Performance Benchmarks",
+ "category": "Performance",
+ "tier": 4,
+ "description": "Assessment for Performance Benchmarks",
+ "criteria": "To be implemented",
+ "default_weight": 0.01
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Performance Benchmarks assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "code_smells",
+ "name": "Code Smell Elimination",
+ "category": "Code Quality",
+ "tier": 4,
+ "description": "Assessment for Code Smell Elimination",
+ "criteria": "To be implemented",
+ "default_weight": 0.01
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Code Smell Elimination assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "issue_pr_templates",
+ "name": "Issue & Pull Request Templates",
+ "category": "Git & Version Control",
+ "tier": 4,
+ "description": "Assessment for Issue & Pull Request Templates",
+ "criteria": "To be implemented",
+ "default_weight": 0.01
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Issue & Pull Request Templates assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ },
+ {
+ "attribute": {
+ "id": "container_setup",
+ "name": "Container/Virtualization Setup",
+ "category": "Build & Development",
+ "tier": 4,
+ "description": "Assessment for Container/Virtualization Setup",
+ "criteria": "To be implemented",
+ "default_weight": 0.01
+ },
+ "status": "not_applicable",
+ "score": null,
+ "measured_value": null,
+ "threshold": null,
+ "evidence": [
+ "Container/Virtualization Setup assessment not yet implemented"
+ ],
+ "remediation": null,
+ "error_message": null
+ }
+ ],
+ "config": null,
+ "duration_seconds": 1.8
+}
\ No newline at end of file
diff --git a/.agentready-demo/demo-report-20251121-051257.html b/.agentready-demo/demo-report-20251121-051257.html
new file mode 100644
index 0000000..bb4abc6
--- /dev/null
+++ b/.agentready-demo/demo-report-20251121-051257.html
@@ -0,0 +1,1890 @@
+
+
+
+
+
+ AgentReady Assessment - demo-repo
+
+
+
+
+
+
+
+
+
+
+
Certification
+
Silver
+
+
+
+
+
+
+
+
+
đ Platinum
+
90-100
+
+
+
+
+
+
â ī¸ Needs Work
+
0-39
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - CLAUDE.md found at /var/folders/43/ffv83_l50cn2k0rzgxp63kyw0000gn/T/agentready-demo-zp8md4nd/demo-repo/CLAUDE.md
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Found 3/3 essential sections
+
+ - Installation: â
+
+ - Usage: â
+
+ - Development: â
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Typed functions: 5/5
+
+ - Coverage: 100.0%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Found 2/2 standard directories
+
+ - src/: â
+
+ - tests/: â
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - No lock files found
+
+
+
+
+
+
+
+
Remediation
+
Add lock file for dependency reproducibility
+
+
+
+
+ - Use npm install, poetry lock, or equivalent to generate lock file
+
+
+
+
+
+
Commands
+
npm install # generates package-lock.json
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Coverage config: â
+
+ - pytest-cov: â
+
+
+
+
+
+
+
+
Remediation
+
Configure test coverage with âĨ80% threshold
+
+
+
+
+ - Install coverage tool (pytest-cov for Python, jest for JavaScript)
+
+ - Configure coverage threshold in project config
+
+ - Add coverage reporting to CI/CD pipeline
+
+ - Run coverage locally before committing
+
+
+
+
+
+
Commands
+
# Python
+pip install pytest-cov
+pytest --cov=src --cov-report=term-missing --cov-fail-under=80
+
+# JavaScript
+npm install --save-dev jest
+npm test -- --coverage --coverageThreshold='{\'global\': {\'lines\': 80}}'
+
+
+
+
Examples
+
+
# Python - pyproject.toml
+[tool.pytest.ini_options]
+addopts = "--cov=src --cov-report=term-missing"
+
+[tool.coverage.report]
+fail_under = 80
+
+
+
// JavaScript - package.json
+{
+ "jest": {
+ "coverageThreshold": {
+ "global": {
+ "lines": 80,
+ "statements": 80,
+ "functions": 80,
+ "branches": 80
+ }
+ }
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - .pre-commit-config.yaml not found
+
+
+
+
+
+
+
+
Remediation
+
Configure pre-commit hooks for automated code quality checks
+
+
+
+
+ - Install pre-commit framework
+
+ - Create .pre-commit-config.yaml
+
+ - Add hooks for linting and formatting
+
+ - Install hooks: pre-commit install
+
+ - Run on all files: pre-commit run --all-files
+
+
+
+
+
+
Commands
+
pip install pre-commit
+pre-commit install
+pre-commit run --all-files
+
+
+
+
Examples
+
+
# .pre-commit-config.yaml
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.4.0
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-yaml
+ - id: check-added-large-files
+
+ - repo: https://github.com/psf/black
+ rev: 23.3.0
+ hooks:
+ - id: black
+
+ - repo: https://github.com/pycqa/isort
+ rev: 5.12.0
+ hooks:
+ - id: isort
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - No commitlint or husky configuration
+
+
+
+
+
+
+
+
Remediation
+
Configure conventional commits with commitlint
+
+
+
+
+ - Install commitlint
+
+ - Configure husky for commit-msg hook
+
+
+
+
+
+
Commands
+
npm install --save-dev @commitlint/cli @commitlint/config-conventional husky
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - .gitignore found (325 bytes)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Average cyclomatic complexity: 2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - One-Command Build/Setup assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Concise Structured Documentation assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Inline Documentation assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - File Size Limits assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Dependency Freshness & Security assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Separation of Concerns assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Structured Logging assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - OpenAPI/Swagger Specifications assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Architecture Decision Records assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Semantic File & Directory Naming assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Security Scanning Automation assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Performance Benchmarks assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Code Smell Elimination assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Issue & Pull Request Templates assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Evidence
+
+
+ - Container/Virtualization Setup assessment not yet implemented
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.agentready-demo/demo-report-20251121-051257.md b/.agentready-demo/demo-report-20251121-051257.md
new file mode 100644
index 0000000..0f10f4b
--- /dev/null
+++ b/.agentready-demo/demo-report-20251121-051257.md
@@ -0,0 +1,308 @@
+# đ¤ AgentReady Assessment Report
+
+| Repository | Branch | Commit | Score | Level | Date |
+|------------|--------|--------|-------|-------|------|
+| **demo-repo** | main | `87989978` | **73.1/100** | **Silver** | 2025-11-21 05:12 |
+
+---
+
+## đ Summary
+
+| Metric | Value |
+|--------|-------|
+| **Overall Score** | **73.1/100** |
+| **Certification Level** | **Silver** |
+| **Attributes Assessed** | 10/25 |
+| **Attributes Skipped** | 15 |
+| **Assessment Duration** | 1.8s |
+
+### Languages Detected
+
+- **Python**: 4 files
+
+### Repository Stats
+
+- **Total Files**: 7
+- **Total Lines**: 100
+
+## đī¸ Certification Ladder
+
+- đ **Platinum** (90-100)
+- đĨ **Gold** (75-89)
+- đĨ **Silver** (60-74) **â YOUR LEVEL â**
+- đĨ **Bronze** (40-59)
+- â ī¸ **Needs Improvement** (0-39)
+
+## đ Detailed Findings
+
+### API Documentation
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| OpenAPI/Swagger Specifications | T3 | â not_applicable | â |
+
+### Build & Development
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| One-Command Build/Setup | T2 | â not_applicable | â |
+| Container/Virtualization Setup | T4 | â not_applicable | â |
+
+### Code Quality
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Type Annotations | T1 | â
pass | 100 |
+| Cyclomatic Complexity Thresholds | T3 | â
pass | 100 |
+| Code Smell Elimination | T4 | â not_applicable | â |
+
+### Context Window Optimization
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| CLAUDE.md Configuration Files | T1 | â
pass | 100 |
+| Concise Structured Documentation | T2 | â not_applicable | â |
+| File Size Limits | T2 | â not_applicable | â |
+
+### Dependency Management
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Lock Files for Reproducibility | T1 | â fail | 0 |
+| Dependency Freshness & Security | T2 | â not_applicable | â |
+
+#### â Lock Files for Reproducibility
+
+**Measured**: none (Threshold: at least one lock file)
+
+**Evidence**:
+- No lock files found
+
+đ Remediation Steps
+
+
+Add lock file for dependency reproducibility
+
+1. Use npm install, poetry lock, or equivalent to generate lock file
+
+**Commands**:
+
+```bash
+npm install # generates package-lock.json
+```
+
+
+
+### Documentation Standards
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| README Structure | T1 | â
pass | 100 |
+| Inline Documentation | T2 | â not_applicable | â |
+| Architecture Decision Records | T3 | â not_applicable | â |
+
+### Error Handling
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Structured Logging | T3 | â not_applicable | â |
+
+### Git & Version Control
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Conventional Commit Messages | T2 | â fail | 0 |
+| .gitignore Completeness | T2 | â
pass | 100 |
+| Issue & Pull Request Templates | T4 | â not_applicable | â |
+
+#### â Conventional Commit Messages
+
+**Measured**: not configured (Threshold: configured)
+
+**Evidence**:
+- No commitlint or husky configuration
+
+đ Remediation Steps
+
+
+Configure conventional commits with commitlint
+
+1. Install commitlint
+2. Configure husky for commit-msg hook
+
+**Commands**:
+
+```bash
+npm install --save-dev @commitlint/cli @commitlint/config-conventional husky
+```
+
+
+
+### Modularity
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Semantic File & Directory Naming | T3 | â not_applicable | â |
+
+### Performance
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Performance Benchmarks | T4 | â not_applicable | â |
+
+### Repository Structure
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Standard Project Layouts | T1 | â
pass | 100 |
+| Separation of Concerns | T2 | â not_applicable | â |
+
+### Security
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Security Scanning Automation | T4 | â not_applicable | â |
+
+### Testing & CI/CD
+
+| Attribute | Tier | Status | Score |
+|-----------|------|--------|-------|
+| Test Coverage Requirements | T2 | â fail | 50 |
+| Pre-commit Hooks & CI/CD Linting | T2 | â fail | 0 |
+
+#### â Test Coverage Requirements
+
+**Measured**: not configured (Threshold: configured with >80% threshold)
+
+**Evidence**:
+- Coverage config: â
+- pytest-cov: â
+
+đ Remediation Steps
+
+
+Configure test coverage with âĨ80% threshold
+
+1. Install coverage tool (pytest-cov for Python, jest for JavaScript)
+2. Configure coverage threshold in project config
+3. Add coverage reporting to CI/CD pipeline
+4. Run coverage locally before committing
+
+**Commands**:
+
+```bash
+# Python
+pip install pytest-cov
+pytest --cov=src --cov-report=term-missing --cov-fail-under=80
+
+# JavaScript
+npm install --save-dev jest
+npm test -- --coverage --coverageThreshold='{\'global\': {\'lines\': 80}}'
+```
+
+**Examples**:
+
+```
+# Python - pyproject.toml
+[tool.pytest.ini_options]
+addopts = "--cov=src --cov-report=term-missing"
+
+[tool.coverage.report]
+fail_under = 80
+
+```
+```
+// JavaScript - package.json
+{
+ "jest": {
+ "coverageThreshold": {
+ "global": {
+ "lines": 80,
+ "statements": 80,
+ "functions": 80,
+ "branches": 80
+ }
+ }
+ }
+}
+
+```
+
+
+
+#### â Pre-commit Hooks & CI/CD Linting
+
+**Measured**: not configured (Threshold: configured)
+
+**Evidence**:
+- .pre-commit-config.yaml not found
+
+đ Remediation Steps
+
+
+Configure pre-commit hooks for automated code quality checks
+
+1. Install pre-commit framework
+2. Create .pre-commit-config.yaml
+3. Add hooks for linting and formatting
+4. Install hooks: pre-commit install
+5. Run on all files: pre-commit run --all-files
+
+**Commands**:
+
+```bash
+pip install pre-commit
+pre-commit install
+pre-commit run --all-files
+```
+
+**Examples**:
+
+```
+# .pre-commit-config.yaml
+repos:
+ - repo: https://github.com/pre-commit/pre-commit-hooks
+ rev: v4.4.0
+ hooks:
+ - id: trailing-whitespace
+ - id: end-of-file-fixer
+ - id: check-yaml
+ - id: check-added-large-files
+
+ - repo: https://github.com/psf/black
+ rev: 23.3.0
+ hooks:
+ - id: black
+
+ - repo: https://github.com/pycqa/isort
+ rev: 5.12.0
+ hooks:
+ - id: isort
+
+```
+
+
+
+## đ¯ Next Steps
+
+**Priority Improvements** (highest impact first):
+
+1. **Lock Files for Reproducibility** (Tier 1) - +10.0 points potential
+ - Add lock file for dependency reproducibility
+2. **Pre-commit Hooks & CI/CD Linting** (Tier 2) - +3.0 points potential
+ - Configure pre-commit hooks for automated code quality checks
+3. **Conventional Commit Messages** (Tier 2) - +3.0 points potential
+ - Configure conventional commits with commitlint
+4. **Test Coverage Requirements** (Tier 2) - +3.0 points potential
+ - Configure test coverage with âĨ80% threshold
+
+---
+
+## đ Assessment Metadata
+
+- **Tool Version**: AgentReady v1.0.0
+- **Research Report**: Bundled version
+- **Repository Snapshot**: 8798997839b602cbb3f02073ca66ed95abc6cdda
+- **Assessment Duration**: 1.8s
+
+đ¤ Generated with [Claude Code](https://claude.com/claude-code)
\ No newline at end of file
diff --git a/.github/CLAUDE_INTEGRATION.md b/.github/CLAUDE_INTEGRATION.md
new file mode 100644
index 0000000..091ebbd
--- /dev/null
+++ b/.github/CLAUDE_INTEGRATION.md
@@ -0,0 +1,276 @@
+# Dual Claude Integration Guide
+
+This repository uses **two different Claude integrations** that work together for different use cases.
+
+## đ¤ Integration Overview
+
+| Integration | Trigger | Behavior | Use Case |
+|------------|---------|----------|----------|
+| **Claude Code Action** | Assign issue to `claude-bot` | Automated implementation in GitHub Actions | Autonomous feature development |
+| **Direct @claude** | @mention claude in comments | Interactive conversation in comment thread | Discussion, guidance, code review |
+
+---
+
+## 1. Automated Implementation (Claude Code Action)
+
+### How It Works
+
+When you **assign an issue to `claude-bot`**:
+1. GitHub Actions workflow triggers
+2. Claude Code CLI spins up in runner
+3. Reads `CLAUDE.md` for project context
+4. Implements the issue autonomously
+5. Creates feature branch and commits
+6. Opens PR for review
+
+### Configuration
+
+**Workflow**: `.github/workflows/claude-code-action.yml`
+- Triggers only on `issues.assigned` events
+- Checks `if: github.event.assignee.login == 'claude-bot'`
+- Uses `ANTHROPIC_API_KEY` secret
+
+**System Prompts**:
+- `CLAUDE.md` (project-level) - Automatically read
+- `.github/claude-bot-prompt.md` (automation-specific) - Optional, currently commented out
+
+### Usage
+
+```bash
+# Create issue on GitHub
+# Assign to @claude-bot user
+# Wait for PR to be created
+```
+
+### Example Workflow
+
+1. Create issue: "Implement dependency freshness assessor"
+2. Assign to `claude-bot`
+3. Wait 2-5 minutes
+4. Review PR created by claude-bot
+5. Merge or request changes
+
+---
+
+## 2. Interactive Conversation (Direct @claude)
+
+### How It Works
+
+When you **@mention claude in any comment**:
+1. Claude responds directly in the comment thread
+2. No code is written automatically
+3. Interactive back-and-forth discussion
+4. You control when to apply suggestions
+
+### Setup Required
+
+**Install the Claude GitHub App**:
+1. Navigate to https://github.com/apps/claude-ai
+2. Click "Install"
+3. Select `ambient-code/agentready` repository
+4. Grant required permissions:
+ - Read access to code and issues
+ - Write access to comments
+5. Complete installation
+
+**Connect Your Account**:
+1. Go to https://claude.ai/settings
+2. Navigate to "Integrations"
+3. Connect your GitHub account
+4. Authorize the app
+
+### Usage
+
+```markdown
+@claude How should I structure the DependencyFreshnessAssessor?
+```
+
+Claude will respond with:
+- Architecture suggestions
+- Code examples
+- Best practices
+- Questions for clarification
+
+You then choose which suggestions to implement manually (or ask claude-bot to implement via assignment).
+
+---
+
+## 3. When to Use Each Integration
+
+### Use Claude Code Action (assign to claude-bot) when:
+- â
You want autonomous implementation
+- â
The task is well-defined
+- â
You're okay with reviewing a PR afterward
+- â
You want to save development time
+
+### Use Direct @claude when:
+- â
You need design discussion first
+- â
You want to explore options interactively
+- â
You need code review feedback
+- â
You want to implement manually with guidance
+- â
The task has ambiguity or trade-offs
+
+### Use Both Together:
+1. Create issue with @claude mention
+2. Discuss approach with interactive Claude
+3. Once design is settled, assign to claude-bot
+4. claude-bot implements the agreed-upon design
+
+---
+
+## 4. Customizing Automation Behavior
+
+### Editing CLAUDE.md
+
+`CLAUDE.md` is the **main source of truth** for project context:
+- Architecture overview
+- Development workflow
+- Code quality standards
+- Testing requirements
+
+**Changes to CLAUDE.md affect both integrations.**
+
+### Editing .github/claude-bot-prompt.md
+
+This file provides **automation-specific instructions**:
+- Feature branch naming conventions
+- PR creation templates
+- TDD requirements
+- Commit message formats
+
+**To enable**: Uncomment the `claude_args` line in `claude-code-action.yml`
+
+### Example Customization
+
+```yaml
+# In .github/workflows/claude-code-action.yml
+claude_args: --append-system-prompt "$(cat .github/claude-bot-prompt.md)"
+```
+
+---
+
+## 5. Troubleshooting
+
+### Claude Code Action Not Triggering
+
+**Check**:
+- [ ] Issue is assigned to `claude-bot` user (exact spelling)
+- [ ] GitHub Actions workflow is enabled in Settings > Actions
+- [ ] `ANTHROPIC_API_KEY` secret is set in repository secrets
+- [ ] Workflow file syntax is valid (no YAML errors)
+
+**View Logs**:
+1. Go to Actions tab
+2. Find the failed/running workflow
+3. Click to view logs
+4. Check "Claude Code Action" step for errors
+
+### Direct @claude Not Responding
+
+**Check**:
+- [ ] Claude GitHub App is installed on repository
+- [ ] Your GitHub account is connected at claude.ai
+- [ ] You used `@claude` (not `@claude-bot`)
+- [ ] Comment is on an issue or PR (not commit)
+
+**Note**: Direct @claude may take 30-60 seconds to respond initially.
+
+### Both Integrations Triggering
+
+**This shouldn't happen with current config**:
+- Claude Code Action only triggers on assignment to `claude-bot`
+- Direct @claude responds to @mentions
+- These are mutually exclusive triggers
+
+If both respond, check that:
+- Workflow file has correct `if:` condition
+- You're not both assigning AND mentioning
+
+---
+
+## 6. Security Considerations
+
+### API Keys
+- `ANTHROPIC_API_KEY` stored as GitHub secret (encrypted)
+- Never exposed in logs or PR comments
+- Automatically rotated every 90 days
+
+### Permissions
+- Claude Code Action has `write` access (needed for PRs)
+- Direct @claude has `read` + `comment` access only
+- Both run in isolated environments
+
+### Code Review
+- **Always review PRs** created by claude-bot before merging
+- Check for security issues (hardcoded secrets, injection vulnerabilities)
+- Verify tests pass and coverage maintained
+- Run local linters before merge
+
+---
+
+## 7. Cost Management
+
+### Claude Code Action
+- Uses Anthropic API (metered by tokens)
+- Typical cost: $0.10-$0.50 per issue implementation
+- Monitor usage in Anthropic Console
+
+### Direct @claude
+- Free for individual use
+- Subject to rate limits (TBD by Anthropic)
+
+### Best Practices
+- Use claude-bot for well-defined tasks only
+- Use direct @claude for exploration/discussion (cheaper)
+- Review generated code before running (avoid wasted API calls)
+
+---
+
+## 8. Examples
+
+### Example 1: Feature Discussion â Implementation
+```markdown
+# GitHub Issue #42: "Add dependency freshness assessor"
+
+@claude What's the best way to check if dependencies are up-to-date?
+
+[Claude responds with options: pip-audit, safety, custom parser]
+
+Thanks! Let's use pip-audit. Assigning to @claude-bot for implementation.
+
+[Assigns issue to claude-bot]
+[claude-bot creates PR with pip-audit integration]
+```
+
+### Example 2: Code Review
+```markdown
+# PR #43: "Implement dependency freshness assessor"
+
+@claude Can you review this implementation for security issues?
+
+[Claude provides detailed security review in comment]
+```
+
+### Example 3: Quick Implementation
+```markdown
+# GitHub Issue #44: "Fix typo in README"
+
+[Assigns to claude-bot immediately]
+[claude-bot fixes typo in 30 seconds]
+```
+
+---
+
+## 9. References
+
+- **Claude Code Action**: https://github.com/anthropics/claude-code-action
+- **Claude GitHub App**: https://github.com/apps/claude-ai
+- **CLAUDE.md Best Practices**: https://arize.com/blog/claude-md-best-practices
+- **AgentReady CLAUDE.md**: `/CLAUDE.md` (this repository)
+- **Automation Prompt**: `/.github/claude-bot-prompt.md` (this repository)
+
+---
+
+**Last Updated**: 2025-11-21
+**Maintained By**: @jeder
+**Status**: Active
diff --git a/.github/claude-bot-prompt.md b/.github/claude-bot-prompt.md
new file mode 100644
index 0000000..33dba32
--- /dev/null
+++ b/.github/claude-bot-prompt.md
@@ -0,0 +1,40 @@
+# Claude Bot Automation Context
+
+This file provides additional instructions for the automated Claude Code Action when implementing issues assigned to `claude-bot`.
+
+## Automation Workflow
+
+When assigned an issue, you should:
+
+1. **Create feature branch**: Always create a feature branch from `main` (never push to main directly)
+2. **Follow TDD**: Write tests before implementation when applicable
+3. **Run linters**: Always run `black`, `isort`, `ruff` before committing
+4. **Run tests**: Ensure all tests pass with `pytest`
+5. **Commit frequently**: Use conventional commits with clear, succinct messages
+6. **Open PR**: Create a pull request for review (don't merge automatically)
+
+## Implementation Standards
+
+- **Python**: Follow PEP 8, use type hints, support Python 3.11+
+- **Testing**: Maintain >80% coverage for new code
+- **Documentation**: Update docstrings and CLAUDE.md as needed
+- **Security**: Never expose secrets, validate inputs, follow OWASP guidelines
+
+## PR Template
+
+When creating pull requests, include:
+- Summary of changes
+- Test plan
+- Breaking changes (if any)
+- Related issues/tickets
+
+## Important Context
+
+- This is an open-source project under MIT license
+- Target audience: Software engineering teams using AI-assisted development
+- Code quality and user experience are paramount
+- Prefer simple, focused solutions over complex abstractions
+
+---
+
+**Note**: CLAUDE.md is automatically read by the action. This file provides automation-specific guidance that supplements the project-level instructions.
diff --git a/.github/workflows/agentready-assessment.yml b/.github/workflows/agentready-assessment.yml
index 63f5432..e724c09 100644
--- a/.github/workflows/agentready-assessment.yml
+++ b/.github/workflows/agentready-assessment.yml
@@ -25,7 +25,7 @@ jobs:
- name: Install AgentReady
run: |
- pip install agentready
+ pip install -e .
- name: Run AgentReady Assessment
run: |
diff --git a/.github/workflows/claude-code-action.yml b/.github/workflows/claude-code-action.yml
index 28bd2b4..687694e 100644
--- a/.github/workflows/claude-code-action.yml
+++ b/.github/workflows/claude-code-action.yml
@@ -1,14 +1,8 @@
-name: Claude Code Action
+name: Claude Code Action (Automated)
on:
- issue_comment:
- types: [created]
- pull_request_review_comment:
- types: [created]
issues:
- types: [opened, assigned]
- pull_request:
- types: [opened, ready_for_review]
+ types: [assigned]
permissions:
contents: write
@@ -18,6 +12,8 @@ permissions:
jobs:
claude-code:
runs-on: ubuntu-latest
+ # Only run when assigned to claude-bot user
+ if: github.event.assignee.login == 'claude-bot'
steps:
- name: Checkout repository
uses: actions/checkout@v4
@@ -29,3 +25,6 @@ jobs:
with:
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
github_token: ${{ secrets.GITHUB_TOKEN }}
+ # CLAUDE.md is automatically read by the action
+ # Optional: Uncomment to add automation-specific instructions
+ # claude_args: --append-system-prompt "Focus on implementation. Create feature branches, write tests, and open PRs for review."
diff --git a/.github/workflows/continuous-learning.yml b/.github/workflows/continuous-learning.yml
new file mode 100644
index 0000000..3f66d59
--- /dev/null
+++ b/.github/workflows/continuous-learning.yml
@@ -0,0 +1,134 @@
+name: Continuous Learning - Extract Skills
+
+on:
+ # Manual trigger
+ workflow_dispatch:
+ inputs:
+ output_format:
+ description: 'Output format for skills'
+ required: true
+ default: 'github-issues'
+ type: choice
+ options:
+ - github-issues
+ - skill-files
+ - both
+
+ # Automatic on new releases
+ release:
+ types: [published]
+
+ # Weekly analysis on Sundays at midnight UTC
+ schedule:
+ - cron: '0 0 * * 0'
+
+jobs:
+ extract-skills:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ issues: write
+ pull-requests: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Setup Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.11'
+
+ - name: Install uv
+ uses: astral-sh/setup-uv@v3
+
+ - name: Install AgentReady
+ run: |
+ uv pip install -e .
+
+ - name: Run self-assessment
+ run: |
+ uv run agentready assess . --output-dir .agentready
+
+ - name: Extract learnings
+ id: learn
+ run: |
+ uv run agentready learn . --output-format json > .skills-proposals/discovered-skills.json
+ echo "skill_count=$(jq '.skill_count' .skills-proposals/discovered-skills.json)" >> $GITHUB_OUTPUT
+
+ - name: Generate skill proposals
+ if: steps.learn.outputs.skill_count > 0
+ run: |
+ uv run agentready learn . --output-format all --output-dir .skills-proposals
+
+ - name: Create GitHub issues for each skill
+ if: (inputs.output_format == 'github-issues' || inputs.output_format == 'both') && steps.learn.outputs.skill_count > 0
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ for skill_file in .skills-proposals/skill-*.md; do
+ if [ -f "$skill_file" ]; then
+ # Extract skill name from filename
+ skill_name=$(basename "$skill_file" .md | sed 's/^skill-//' | sed 's/-/ /g')
+
+ # Create issue with skill proposal
+ gh issue create \
+ --title "Skill Proposal: ${skill_name}" \
+ --label "skill-proposal,enhancement,ai-agent" \
+ --body-file "$skill_file"
+
+ echo "Created issue for: $skill_name"
+ fi
+ done
+
+ - name: Create PR with skill files
+ if: (inputs.output_format == 'skill-files' || inputs.output_format == 'both') && steps.learn.outputs.skill_count > 0
+ run: |
+ # Configure git
+ git config user.name "github-actions[bot]"
+ git config user.email "github-actions[bot]@users.noreply.github.com"
+
+ # Create new branch
+ BRANCH_NAME="skills/auto-$(date +%Y%m%d-%H%M%S)"
+ git checkout -b "$BRANCH_NAME"
+
+ # Copy SKILL.md files to .claude/skills
+ mkdir -p .claude/skills
+ for skill_dir in .skills-proposals/*/; do
+ if [ -d "$skill_dir" ] && [ -f "${skill_dir}SKILL.md" ]; then
+ skill_id=$(basename "$skill_dir")
+ mkdir -p ".claude/skills/$skill_id"
+ cp "${skill_dir}SKILL.md" ".claude/skills/$skill_id/"
+ echo "Copied skill: $skill_id"
+ fi
+ done
+
+ # Commit and push
+ git add .claude/skills
+ git commit -m "feat: add discovered skills from continuous learning
+
+Automatically extracted skills from latest assessment.
+
+đ¤ Generated with Claude Code
+Co-Authored-By: Claude "
+
+ git push origin "$BRANCH_NAME"
+
+ # Create PR
+ gh pr create \
+ --title "Add discovered skills from continuous learning" \
+ --body "Automatically discovered new Claude Code skills from AgentReady assessment. Review and merge to make available."
+
+ - name: Upload skill proposals as artifacts
+ if: steps.learn.outputs.skill_count > 0
+ uses: actions/upload-artifact@v4
+ with:
+ name: skill-proposals-${{ github.run_number }}
+ path: .skills-proposals/
+ retention-days: 90
+
+ - name: Summary
+ if: steps.learn.outputs.skill_count > 0
+ run: |
+ echo "â
Discovered ${{ steps.learn.outputs.skill_count }} skills with confidence âĨ70%"
+ echo "đ Artifacts uploaded for review"
diff --git a/.github/workflows/publish-pypi.yml b/.github/workflows/publish-pypi.yml
new file mode 100644
index 0000000..68d2620
--- /dev/null
+++ b/.github/workflows/publish-pypi.yml
@@ -0,0 +1,128 @@
+name: Publish to PyPI
+
+on:
+ workflow_dispatch:
+ inputs:
+ version:
+ description: 'Version to publish (leave empty to use current version from pyproject.toml)'
+ required: false
+ type: string
+ dry_run:
+ description: 'Perform a dry run (publish to TestPyPI instead)'
+ required: false
+ type: boolean
+ default: true
+
+jobs:
+ publish:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ id-token: write # Required for trusted publishing
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Set up Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.11'
+
+ - name: Install build dependencies
+ run: |
+ python -m pip install --upgrade pip
+ pip install build twine
+
+ - name: Update version if specified
+ if: inputs.version != ''
+ env:
+ VERSION: ${{ inputs.version }}
+ run: |
+ # Update version in pyproject.toml
+ sed -i "s/^version = .*/version = \"$VERSION\"/" pyproject.toml
+ echo "Updated version to $VERSION"
+
+ - name: Build package
+ run: |
+ python -m build
+ echo "đĻ Built distribution files:"
+ ls -lh dist/
+
+ - name: Check distribution
+ run: |
+ twine check dist/*
+
+ - name: Publish to TestPyPI (dry run)
+ if: inputs.dry_run == true
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.TEST_PYPI_TOKEN }}
+ run: |
+ echo "đ§Ē Publishing to TestPyPI..."
+ twine upload --repository testpypi dist/*
+ echo "â
Published to TestPyPI: https://test.pypi.org/project/agentready/"
+
+ - name: Publish to PyPI (production)
+ if: inputs.dry_run == false
+ env:
+ TWINE_USERNAME: __token__
+ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
+ run: |
+ echo "đ Publishing to PyPI..."
+ twine upload dist/*
+ echo "â
Published to PyPI: https://pypi.org/project/agentready/"
+
+ - name: Create GitHub Release
+ if: inputs.dry_run == false && inputs.version != ''
+ env:
+ VERSION: ${{ inputs.version }}
+ uses: actions/github-script@v7
+ with:
+ script: |
+ const version = process.env.VERSION;
+ const tag = `v${version}`;
+
+ // Create tag
+ await github.rest.git.createRef({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ ref: `refs/tags/${tag}`,
+ sha: context.sha
+ });
+
+ // Create release
+ await github.rest.repos.createRelease({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ tag_name: tag,
+ name: `Release ${version}`,
+ body: `Published to PyPI: https://pypi.org/project/agentready/${version}/`,
+ draft: false,
+ prerelease: false
+ });
+
+ - name: Summary
+ env:
+ DRY_RUN: ${{ inputs.dry_run }}
+ run: |
+ echo "## Publication Summary" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+
+ if [ "$DRY_RUN" == "true" ]; then
+ echo "â
**Dry Run Complete**" >> $GITHUB_STEP_SUMMARY
+ echo "Published to TestPyPI: https://test.pypi.org/project/agentready/" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "To install and test:" >> $GITHUB_STEP_SUMMARY
+ echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
+ echo "pip install --index-url https://test.pypi.org/simple/ agentready" >> $GITHUB_STEP_SUMMARY
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
+ else
+ echo "đ **Published to PyPI**" >> $GITHUB_STEP_SUMMARY
+ echo "Package: https://pypi.org/project/agentready/" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "To install:" >> $GITHUB_STEP_SUMMARY
+ echo "\`\`\`bash" >> $GITHUB_STEP_SUMMARY
+ echo "pip install agentready" >> $GITHUB_STEP_SUMMARY
+ echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
+ fi
diff --git a/.skills-proposals/discovered-skills.json b/.skills-proposals/discovered-skills.json
new file mode 100644
index 0000000..30e90c4
--- /dev/null
+++ b/.skills-proposals/discovered-skills.json
@@ -0,0 +1,36 @@
+{
+ "generated_at": "2025-11-21T14:17:47.941871",
+ "skill_count": 2,
+ "min_confidence": 70,
+ "discovered_skills": [
+ {
+ "skill_id": "setup-claude-md",
+ "name": "Setup CLAUDE.md Configuration",
+ "description": "Create comprehensive CLAUDE.md files with tech stack, standard commands, repository structure, and boundaries to optimize repositories for AI-assisted development",
+ "confidence": 100.0,
+ "source_attribute_id": "claude_md_file",
+ "reusability_score": 100.0,
+ "impact_score": 50.0,
+ "pattern_summary": "Project-specific configuration for Claude Code",
+ "code_examples": [
+ "CLAUDE.md found at /Users/jeder/repos/agentready/CLAUDE.md"
+ ],
+ "citations": []
+ },
+ {
+ "skill_id": "implement-type-annotations",
+ "name": "Implement Type Annotations",
+ "description": "Add comprehensive type hints to Python/TypeScript code to improve IDE support, catch errors early, and enable better AI code understanding",
+ "confidence": 100.0,
+ "source_attribute_id": "type_annotations",
+ "reusability_score": 100.0,
+ "impact_score": 50.0,
+ "pattern_summary": "Type hints in function signatures",
+ "code_examples": [
+ "Typed functions: 180/186",
+ "Coverage: 96.8%"
+ ],
+ "citations": []
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.skills-proposals/implement-type-annotations-report.md b/.skills-proposals/implement-type-annotations-report.md
new file mode 100644
index 0000000..658fad4
--- /dev/null
+++ b/.skills-proposals/implement-type-annotations-report.md
@@ -0,0 +1,63 @@
+# Skill Report: Implement Type Annotations
+
+## Overview
+
+**Skill ID**: `implement-type-annotations`
+**Confidence**: 100.0%
+**Impact**: +50.0 pts
+**Reusability**: 100.0%
+**Source Attribute**: type_annotations
+
+---
+
+## Description
+
+Add comprehensive type hints to Python/TypeScript code to improve IDE support, catch errors early, and enable better AI code understanding
+
+---
+
+## Pattern Summary
+
+Type hints in function signatures
+
+---
+
+## Implementation Guidance
+
+### When to Use This Skill
+
+Use this skill when you need to apply the pattern described above to your repository.
+
+### Code Examples
+
+
+#### Example 1
+
+```
+Typed functions: 180/186
+```
+
+#### Example 2
+
+```
+Coverage: 96.8%
+```
+
+---
+
+## Research Citations
+
+_No citations available_
+
+---
+
+## Metrics
+
+- **Confidence Score**: 100.0% - How confident we are this is a valid pattern
+- **Impact Score**: 50.0 pts - Expected score improvement from applying this skill
+- **Reusability Score**: 100.0% - How often this pattern applies across projects
+
+---
+
+**Generated by**: AgentReady Skill Generator
+**Source**: Pattern extracted from type_annotations assessment
diff --git a/.skills-proposals/implement-type-annotations/SKILL.md b/.skills-proposals/implement-type-annotations/SKILL.md
new file mode 100644
index 0000000..39b320e
--- /dev/null
+++ b/.skills-proposals/implement-type-annotations/SKILL.md
@@ -0,0 +1,49 @@
+---
+name: implement-type-annotations
+description: Add comprehensive type hints to Python/TypeScript code to improve IDE support, catch errors early, and enable better AI code understanding
+---
+# Implement Type Annotations
+
+## When to Use This Skill
+
+Type hints in function signatures
+
+## Instructions
+
+1. Review the pattern summary above
+2. Apply the pattern to your repository
+3. Verify the implementation matches the examples below
+
+
+## Examples
+
+### Example 1
+
+```
+Typed functions: 180/186
+```
+
+### Example 2
+
+```
+Coverage: 96.8%
+```
+
+## Best Practices
+
+- Follow the pattern consistently across your codebase
+- Refer to the citations below for authoritative guidance
+- Test the implementation after applying the pattern
+
+
+## Citations
+
+_No citations available_
+
+---
+
+**Generated by**: AgentReady Skill Generator
+**Confidence**: 100.0%
+**Source Attribute**: type_annotations
+**Reusability**: 100.0%
+**Impact**: +50.0 pts
diff --git a/.skills-proposals/setup-claude-md-report.md b/.skills-proposals/setup-claude-md-report.md
new file mode 100644
index 0000000..2e36fb6
--- /dev/null
+++ b/.skills-proposals/setup-claude-md-report.md
@@ -0,0 +1,57 @@
+# Skill Report: Setup CLAUDE.md Configuration
+
+## Overview
+
+**Skill ID**: `setup-claude-md`
+**Confidence**: 100.0%
+**Impact**: +50.0 pts
+**Reusability**: 100.0%
+**Source Attribute**: claude_md_file
+
+---
+
+## Description
+
+Create comprehensive CLAUDE.md files with tech stack, standard commands, repository structure, and boundaries to optimize repositories for AI-assisted development
+
+---
+
+## Pattern Summary
+
+Project-specific configuration for Claude Code
+
+---
+
+## Implementation Guidance
+
+### When to Use This Skill
+
+Use this skill when you need to apply the pattern described above to your repository.
+
+### Code Examples
+
+
+#### Example 1
+
+```
+CLAUDE.md found at /Users/jeder/repos/agentready/CLAUDE.md
+```
+
+---
+
+## Research Citations
+
+_No citations available_
+
+---
+
+## Metrics
+
+- **Confidence Score**: 100.0% - How confident we are this is a valid pattern
+- **Impact Score**: 50.0 pts - Expected score improvement from applying this skill
+- **Reusability Score**: 100.0% - How often this pattern applies across projects
+
+---
+
+**Generated by**: AgentReady Skill Generator
+**Source**: Pattern extracted from claude_md_file assessment
diff --git a/.skills-proposals/setup-claude-md/SKILL.md b/.skills-proposals/setup-claude-md/SKILL.md
new file mode 100644
index 0000000..f3f1b35
--- /dev/null
+++ b/.skills-proposals/setup-claude-md/SKILL.md
@@ -0,0 +1,43 @@
+---
+name: setup-claude-md
+description: Create comprehensive CLAUDE.md files with tech stack, standard commands, repository structure, and boundaries to optimize repositories for AI-assisted development
+---
+# Setup CLAUDE.md Configuration
+
+## When to Use This Skill
+
+Project-specific configuration for Claude Code
+
+## Instructions
+
+1. Review the pattern summary above
+2. Apply the pattern to your repository
+3. Verify the implementation matches the examples below
+
+
+## Examples
+
+### Example 1
+
+```
+CLAUDE.md found at /Users/jeder/repos/agentready/CLAUDE.md
+```
+
+## Best Practices
+
+- Follow the pattern consistently across your codebase
+- Refer to the citations below for authoritative guidance
+- Test the implementation after applying the pattern
+
+
+## Citations
+
+_No citations available_
+
+---
+
+**Generated by**: AgentReady Skill Generator
+**Confidence**: 100.0%
+**Source Attribute**: claude_md_file
+**Reusability**: 100.0%
+**Impact**: +50.0 pts
diff --git a/.skills-proposals/skill-implement-type-annotations.md b/.skills-proposals/skill-implement-type-annotations.md
new file mode 100644
index 0000000..00bbf95
--- /dev/null
+++ b/.skills-proposals/skill-implement-type-annotations.md
@@ -0,0 +1,123 @@
+---
+name: Skill Proposal - Implement Type Annotations
+about: Automatically generated skill proposal from AgentReady continuous learning
+title: 'Skill Proposal: Implement Type Annotations'
+labels: 'skill-proposal, enhancement, ai-agent'
+assignees: ''
+---
+
+## Skill Proposal: Implement Type Annotations
+
+**Skill ID**: `implement-type-annotations`
+**Confidence**: 100.0%
+**Impact**: +50.0 pts
+**Reusability**: 100.0%
+**Source Attribute**: type_annotations
+
+---
+
+## Description
+
+Add comprehensive type hints to Python/TypeScript code to improve IDE support, catch errors early, and enable better AI code understanding
+
+---
+
+## Pattern Summary
+
+Type hints in function signatures
+
+---
+
+## Proposed SKILL.md
+
+```markdown
+---
+name: implement-type-annotations
+description: Add comprehensive type hints to Python/TypeScript code to improve IDE support, catch errors early, and enable better AI code understanding
+---
+# Implement Type Annotations
+
+## When to Use This Skill
+
+Type hints in function signatures
+
+## Instructions
+
+1. Review the pattern summary above
+2. Apply the pattern to your repository
+3. Verify the implementation matches the examples below
+
+
+## Examples
+
+### Example 1
+
+```
+Typed functions: 180/186
+```
+
+### Example 2
+
+```
+Coverage: 96.8%
+```
+
+## Best Practices
+
+- Follow the pattern consistently across your codebase
+- Refer to the citations below for authoritative guidance
+- Test the implementation after applying the pattern
+
+
+## Citations
+
+_No citations available_
+
+---
+
+**Generated by**: AgentReady Skill Generator
+**Confidence**: 100.0%
+**Source Attribute**: type_annotations
+**Reusability**: 100.0%
+**Impact**: +50.0 pts
+
+```
+
+---
+
+## Implementation Plan
+
+- [ ] Review proposed skill for accuracy
+- [ ] Test skill on 3-5 repositories
+- [ ] Refine instructions based on testing
+- [ ] Create final SKILL.md file
+- [ ] Add to `~/.claude/skills/` or `.claude/skills/`
+- [ ] Document skill in AgentReady catalog
+- [ ] Update skill generator with learnings
+
+---
+
+## Code Examples from Assessment
+
+### Example 1
+
+```
+Typed functions: 180/186
+```
+
+### Example 2
+
+```
+Coverage: 96.8%
+```
+
+---
+
+## Research Citations
+
+_No citations available_
+
+---
+
+**Auto-generated by**: AgentReady Continuous Learning Loop
+**Assessment Date**: 2025-11-21T10:02:46.428125
diff --git a/.skills-proposals/skill-setup-claude-md.md b/.skills-proposals/skill-setup-claude-md.md
new file mode 100644
index 0000000..a031d54
--- /dev/null
+++ b/.skills-proposals/skill-setup-claude-md.md
@@ -0,0 +1,111 @@
+---
+name: Skill Proposal - Setup CLAUDE.md Configuration
+about: Automatically generated skill proposal from AgentReady continuous learning
+title: 'Skill Proposal: Setup CLAUDE.md Configuration'
+labels: 'skill-proposal, enhancement, ai-agent'
+assignees: ''
+---
+
+## Skill Proposal: Setup CLAUDE.md Configuration
+
+**Skill ID**: `setup-claude-md`
+**Confidence**: 100.0%
+**Impact**: +50.0 pts
+**Reusability**: 100.0%
+**Source Attribute**: claude_md_file
+
+---
+
+## Description
+
+Create comprehensive CLAUDE.md files with tech stack, standard commands, repository structure, and boundaries to optimize repositories for AI-assisted development
+
+---
+
+## Pattern Summary
+
+Project-specific configuration for Claude Code
+
+---
+
+## Proposed SKILL.md
+
+```markdown
+---
+name: setup-claude-md
+description: Create comprehensive CLAUDE.md files with tech stack, standard commands, repository structure, and boundaries to optimize repositories for AI-assisted development
+---
+# Setup CLAUDE.md Configuration
+
+## When to Use This Skill
+
+Project-specific configuration for Claude Code
+
+## Instructions
+
+1. Review the pattern summary above
+2. Apply the pattern to your repository
+3. Verify the implementation matches the examples below
+
+
+## Examples
+
+### Example 1
+
+```
+CLAUDE.md found at /Users/jeder/repos/agentready/CLAUDE.md
+```
+
+## Best Practices
+
+- Follow the pattern consistently across your codebase
+- Refer to the citations below for authoritative guidance
+- Test the implementation after applying the pattern
+
+
+## Citations
+
+_No citations available_
+
+---
+
+**Generated by**: AgentReady Skill Generator
+**Confidence**: 100.0%
+**Source Attribute**: claude_md_file
+**Reusability**: 100.0%
+**Impact**: +50.0 pts
+
+```
+
+---
+
+## Implementation Plan
+
+- [ ] Review proposed skill for accuracy
+- [ ] Test skill on 3-5 repositories
+- [ ] Refine instructions based on testing
+- [ ] Create final SKILL.md file
+- [ ] Add to `~/.claude/skills/` or `.claude/skills/`
+- [ ] Document skill in AgentReady catalog
+- [ ] Update skill generator with learnings
+
+---
+
+## Code Examples from Assessment
+
+### Example 1
+
+```
+CLAUDE.md found at /Users/jeder/repos/agentready/CLAUDE.md
+```
+
+---
+
+## Research Citations
+
+_No citations available_
+
+---
+
+**Auto-generated by**: AgentReady Continuous Learning Loop
+**Assessment Date**: 2025-11-21T10:02:46.427730
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d62b2a..009f6da 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,24 @@
+# [1.3.0](https://github.com/ambient-code/agentready/compare/v1.2.0...v1.3.0) (2025-11-21)
+
+
+### Features
+
+* add report header with repository metadata ([#28](https://github.com/ambient-code/agentready/issues/28)) ([7a8b34a](https://github.com/ambient-code/agentready/commit/7a8b34a55471156885e44bab808e959e4c7db3e6))
+
+# [1.2.0](https://github.com/ambient-code/agentready/compare/v1.1.2...v1.2.0) (2025-11-21)
+
+
+### Features
+
+* Add automated demo command for AgentReady ([#24](https://github.com/ambient-code/agentready/issues/24)) ([f4e89d9](https://github.com/ambient-code/agentready/commit/f4e89d9531b38239e3561947015be100de6cbd12)), closes [#1](https://github.com/ambient-code/agentready/issues/1) [#25](https://github.com/ambient-code/agentready/issues/25) [hi#quality](https://github.com/hi/issues/quality) [hi#scoring](https://github.com/hi/issues/scoring)
+
+## [1.1.2](https://github.com/ambient-code/agentready/compare/v1.1.1...v1.1.2) (2025-11-21)
+
+
+### Bug Fixes
+
+* correct GitHub repository link in site navigation ([5492278](https://github.com/ambient-code/agentready/commit/5492278a0743c634e33528bcdb8819614d725d0e))
+
## [1.1.1](https://github.com/ambient-code/agentready/compare/v1.1.0...v1.1.1) (2025-11-21)
diff --git a/CLAUDE.md b/CLAUDE.md
index 0cb2bac..c1b1064 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -40,6 +40,80 @@ agentready assess /path/to/repo --output-dir ./reports
---
+## Continuous Learning Loop (LLM-Powered)
+
+**NEW in v1.1**: Extract high-quality skills from assessments using Claude API
+
+The `learn` command analyzes assessment results to identify successful patterns and generates Claude Code skills. With `--enable-llm`, it uses Claude Sonnet 4.5 to create detailed, context-aware skill documentation.
+
+### Basic Usage (Heuristic)
+
+```bash
+# Extract skills using heuristic pattern extraction
+agentready learn .
+
+# Generate SKILL.md files
+agentready learn . --output-format skill_md
+
+# Create GitHub issue templates
+agentready learn . --output-format github_issues
+```
+
+### LLM-Powered Enrichment
+
+```bash
+# Set API key
+export ANTHROPIC_API_KEY=sk-ant-api03-...
+
+# Extract skills with LLM enrichment (top 5 skills)
+agentready learn . --enable-llm
+
+# Enrich more skills with custom budget
+agentready learn . --enable-llm --llm-budget 10
+
+# Bypass cache for fresh analysis
+agentready learn . --enable-llm --llm-no-cache
+
+# Generate all formats with LLM enrichment
+agentready learn . --enable-llm --output-format all
+```
+
+### LLM Enrichment Features
+
+**What it does**:
+- Analyzes repository code samples for real examples
+- Generates 5-10 step detailed instructions
+- Extracts file paths and code snippets from actual implementation
+- Derives best practices from high-scoring attributes
+- Identifies anti-patterns to avoid
+
+**How it works**:
+1. Heuristics extract basic skills from assessment findings
+2. Top N skills (default: 5) are sent to Claude API
+3. Code sampler provides relevant files from repository
+4. Claude analyzes patterns and generates structured JSON
+5. Enriched skills merged with detailed instructions/examples
+6. Results cached for 7 days to reduce API costs
+
+**Caching**:
+- Responses cached in `.agentready/llm-cache/`
+- 7-day TTL (time-to-live)
+- Cache key based on attribute + score + evidence hash
+- Use `--llm-no-cache` to force fresh API calls
+
+**Cost Control**:
+- `--llm-budget N` limits enrichment to top N skills
+- Default: 5 skills (approximately 5-10 API calls)
+- Each enrichment: ~2-6 seconds, ~2000-4000 tokens
+- Caching prevents redundant calls on repeated assessments
+
+**Graceful Fallback**:
+- Missing API key â falls back to heuristic skills
+- API errors â uses original heuristic skill
+- Rate limits â retries with exponential backoff
+
+---
+
## Architecture
### Core Components
@@ -48,6 +122,7 @@ agentready assess /path/to/repo --output-dir ./reports
src/agentready/
âââ models/ # Data models (Repository, Attribute, Finding, Assessment)
âââ services/ # Scanner orchestration and language detection
+â âââ llm_cache.py # LLM response caching (7-day TTL)
âââ assessors/ # Attribute assessment implementations
â âââ base.py # BaseAssessor abstract class
â âââ documentation.py # CLAUDE.md, README assessors
@@ -55,13 +130,20 @@ src/agentready/
â âââ testing.py # Test coverage, pre-commit hooks
â âââ structure.py # Standard layout, gitignore
â âââ stub_assessors.py # 15 not-yet-implemented assessors
+âââ learners/ # Pattern extraction and LLM enrichment
+â âââ pattern_extractor.py # Heuristic skill extraction
+â âââ skill_generator.py # SKILL.md generation
+â âââ code_sampler.py # Repository code sampling
+â âââ llm_enricher.py # Claude API integration
+â âââ prompt_templates.py # LLM prompt engineering
âââ reporters/ # Report generation (HTML, Markdown, JSON)
â âââ html.py # Interactive HTML with Jinja2
â âââ markdown.py # GitHub-Flavored Markdown
âââ templates/ # Jinja2 templates
â âââ report.html.j2 # Self-contained HTML report (73KB)
âââ cli/ # Click-based CLI
- âââ main.py # assess, research-version, generate-config commands
+ âââ main.py # assess, research-version, generate-config commands
+ âââ learn.py # Continuous learning loop with LLM enrichment
```
### Data Flow
@@ -192,6 +274,7 @@ agentready/
- **Python 3.11+** (only N and N-1 versions supported)
- **Click** - CLI framework
- **Jinja2** - HTML template engine
+- **Anthropic** - Claude API client (for LLM enrichment)
- **Pytest** - Testing framework
- **Black** - Code formatter
- **isort** - Import sorter
@@ -290,6 +373,7 @@ See `BACKLOG.md` for full feature list.
## Related Documents
+- **.github/CLAUDE_INTEGRATION.md** - Dual Claude integration guide (automated + interactive)
- **BACKLOG.md** - Future features and enhancements (11 items)
- **GITHUB_ISSUES.md** - GitHub-ready issue templates
- **README.md** - User-facing documentation
diff --git a/pyproject.toml b/pyproject.toml
index b77bd79..667ed33 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "agentready"
-version = "1.1.1"
+version = "1.3.0"
description = "Assess git repositories against 25 evidence-based attributes for AI-assisted development readiness"
authors = [{name = "Jeremy Eder", email = "jeder@redhat.com"}]
readme = "README.md"
@@ -22,6 +22,7 @@ dependencies = [
"gitpython>=3.1.0",
"radon>=6.0.0",
"lizard>=1.17.0",
+ "anthropic>=0.74.0",
]
[project.optional-dependencies]
@@ -42,7 +43,7 @@ build-backend = "setuptools.build_meta"
[tool.setuptools]
package-dir = {"" = "src"}
-packages = ["agentready", "agentready.cli", "agentready.assessors", "agentready.models", "agentready.services", "agentready.reporters"]
+packages = ["agentready", "agentready.cli", "agentready.assessors", "agentready.models", "agentready.services", "agentready.reporters", "agentready.learners"]
[tool.setuptools.package-data]
agentready = [
diff --git a/repomix-output.md b/repomix-output.md
index 1f1819a..24f8830 100644
--- a/repomix-output.md
+++ b/repomix-output.md
@@ -45,26 +45,21 @@ The content is organized as follows:
speckit.specify.md
speckit.tasks.md
speckit.taskstoissues.md
- settings.local.json
.github/
- coldstart-prompts/
- 01-create-automated-demo.md
- 02-fix-critical-security-logic-bugs-from-code-review.md
- 03-bootstrap-agentready-repository-on-github.md
- 04-report-header-with-repository-metadata.md
- 05-improve-html-report-design-font-size-color-scheme.md
- 06-report-schema-versioning.md
- 07-research-report-generatorupdater-utility.md
- 08-repomix-integration.md
- 09-agentready-repository-agent.md
- 10-customizable-html-report-themes.md
- 11-fix-code-quality-issues-from-code-review.md
- 12-improve-test-coverage-and-edge-case-handling.md
- 13-add-security-quality-improvements-from-code-review.md
- 14-align-subcommand-automated-remediation.md
- 15-interactive-dashboard-with-automated-remediation.md
- 16-github-app-integration-badge-status-checks.md
- README.md
+ ISSUE_TEMPLATE/
+ bug_report.md
+ feature_request.md
+ workflows/
+ agentready-assessment.yml
+ claude-code-action.yml
+ docs-lint.yml
+ release.yml
+ security.yml
+ tests.yml
+ update-docs.yml
+ CODEOWNERS
+ dependabot.yml
+ PULL_REQUEST_TEMPLATE.md
.specify/
memory/
constitution.md
@@ -81,15 +76,55 @@ The content is organized as follows:
plan-template.md
spec-template.md
tasks-template.md
+coldstart-prompts/
+ 01-create-automated-demo.md
+ 02-fix-critical-security-logic-bugs-from-code-review.md
+ 03-bootstrap-agentready-repository-on-github.md
+ 04-report-header-with-repository-metadata.md
+ 05-improve-html-report-design-font-size-color-scheme.md
+ 06-report-schema-versioning.md
+ 07-research-report-generatorupdater-utility.md
+ 08-repomix-integration.md
+ 09-agentready-repository-agent.md
+ 10-customizable-html-report-themes.md
+ 11-fix-code-quality-issues-from-code-review.md
+ 12-improve-test-coverage-and-edge-case-handling.md
+ 13-add-security-quality-improvements-from-code-review.md
+ 14-align-subcommand-automated-remediation.md
+ 15-interactive-dashboard-with-automated-remediation.md
+ 16-github-app-integration-badge-status-checks.md
+ 17-add-bootstrap-quickstart-to-readme.md
+ 18-setup-release-pipeline.md
+ 19-github-pages-linter-integration.md
+ README.md
docs/
+ _layouts/
+ default.html
+ home.html
+ page.html
+ assets/
+ css/
+ style.css
_config.yml
+ api-reference.md
+ attributes.md
+ DEPLOYMENT.md
developer-guide.md
+ examples.md
+ Gemfile
index.md
+ README.md
+ RELEASE_PROCESS.md
+ roadmaps.md
+ SETUP_SUMMARY.md
user-guide.md
examples/
self-assessment/
+ assessment-20251121-035845.json
assessment-20251121.json
README.md
+ report-20251121-035845.html
+ report-20251121-035845.md
report-20251121.html
report-20251121.md
scripts/
@@ -182,2996 +217,4102 @@ tests/
__init__.py
.agentready-config.example.yaml
.gitignore
+.markdown-link-check.json
+.pre-commit-config.yaml
+.releaserc.json
.repomixignore
agent-ready-codebase-attributes.md
BACKLOG.md
+CHANGELOG.md
CLAUDE.md
+CODE_OF_CONDUCT.md
+CONTRIBUTING.md
GITHUB_ISSUES.md
+LICENSE
pyproject.toml
README.md
+repomix-output.xml
repomix.config.json
repos.txt
```
# Files
-## File: .claude/settings.local.json
-````json
-{
- "permissions": {
- "allow": [
- "Bash(tree:*)",
- "Bash(agentready bootstrap:*)"
- ],
- "deny": [],
- "ask": []
- }
-}
-````
-
-## File: docs/developer-guide.md
+## File: .claude/commands/speckit.analyze.md
````markdown
---
-layout: page
-title: Developer Guide
+description: Perform a non-destructive cross-artifact consistency and quality analysis across spec.md, plan.md, and tasks.md after task generation.
---
-# Developer Guide
-
-Comprehensive guide for contributors and developers extending AgentReady.
-
-## Table of Contents
+## User Input
-- [Getting Started](#getting-started)
-- [Development Environment](#development-environment)
-- [Architecture Overview](#architecture-overview)
-- [Implementing New Assessors](#implementing-new-assessors)
-- [Testing Guidelines](#testing-guidelines)
-- [Code Quality Standards](#code-quality-standards)
-- [Contributing Workflow](#contributing-workflow)
-- [Release Process](#release-process)
+```text
+$ARGUMENTS
+```
----
+You **MUST** consider the user input before proceeding (if not empty).
-## Getting Started
+## Goal
-### Prerequisites
+Identify inconsistencies, duplications, ambiguities, and underspecified items across the three core artifacts (`spec.md`, `plan.md`, `tasks.md`) before implementation. This command MUST run only after `/speckit.tasks` has successfully produced a complete `tasks.md`.
-- **Python 3.11 or 3.12**
-- **Git**
-- **uv** or **pip** (uv recommended for faster dependency management)
-- **Make** (optional, for convenience commands)
+## Operating Constraints
-### Fork and Clone
+**STRICTLY READ-ONLY**: Do **not** modify any files. Output a structured analysis report. Offer an optional remediation plan (user must explicitly approve before any follow-up editing commands would be invoked manually).
-```bash
-# Fork on GitHub first, then:
-git clone https://github.com/YOUR_USERNAME/agentready.git
-cd agentready
+**Constitution Authority**: The project constitution (`.specify/memory/constitution.md`) is **non-negotiable** within this analysis scope. Constitution conflicts are automatically CRITICAL and require adjustment of the spec, plan, or tasksânot dilution, reinterpretation, or silent ignoring of the principle. If a principle itself needs to change, that must occur in a separate, explicit constitution update outside `/speckit.analyze`.
-# Add upstream remote
-git remote add upstream https://github.com/yourusername/agentready.git
-```
+## Execution Steps
-### Install Development Dependencies
+### 1. Initialize Analysis Context
-```bash
-# Create virtual environment
-python3 -m venv .venv
-source .venv/bin/activate # On Windows: .venv\Scripts\activate
+Run `.specify/scripts/bash/check-prerequisites.sh --json --require-tasks --include-tasks` once from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS. Derive absolute paths:
-# Install with development dependencies
-uv pip install -e ".[dev]"
+- SPEC = FEATURE_DIR/spec.md
+- PLAN = FEATURE_DIR/plan.md
+- TASKS = FEATURE_DIR/tasks.md
-# Or using pip
-pip install -e ".[dev]"
+Abort with an error message if any required file is missing (instruct the user to run missing prerequisite command).
+For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").
-# Verify installation
-pytest --version
-black --version
-ruff --version
-```
+### 2. Load Artifacts (Progressive Disclosure)
----
+Load only the minimal necessary context from each artifact:
-## Development Environment
+**From spec.md:**
-### Project Structure
+- Overview/Context
+- Functional Requirements
+- Non-Functional Requirements
+- User Stories
+- Edge Cases (if present)
-```
-agentready/
-âââ src/agentready/ # Source code
-â âââ cli/ # Click-based CLI
-â â âââ main.py # Entry point (assess, research-version, generate-config)
-â âââ models/ # Data models
-â â âââ repository.py # Repository representation
-â â âââ attribute.py # Attribute definition
-â â âââ finding.py # Assessment finding
-â â âââ assessment.py # Complete assessment result
-â âââ services/ # Core business logic
-â â âââ scanner.py # Assessment orchestration
-â â âââ scorer.py # Score calculation
-â â âââ language_detector.py # Language detection via git
-â âââ assessors/ # Attribute assessors
-â â âââ base.py # BaseAssessor abstract class
-â â âââ documentation.py # CLAUDE.md, README assessors
-â â âââ code_quality.py # Type annotations, complexity
-â â âââ testing.py # Test coverage, pre-commit hooks
-â â âââ structure.py # Standard layout, gitignore
-â â âââ stub_assessors.py # 15 not-yet-implemented assessors
-â âââ reporters/ # Report generators
-â â âââ html.py # Interactive HTML with Jinja2
-â â âââ markdown.py # GitHub-Flavored Markdown
-â â âââ json.py # Machine-readable JSON
-â âââ templates/ # Jinja2 templates
-â â âââ report.html.j2 # HTML report template
-â âââ data/ # Bundled data
-â âââ attributes.yaml # Attribute definitions
-âââ tests/ # Test suite
-â âââ unit/ # Unit tests (fast, isolated)
-â â âââ test_models.py
-â â âââ test_assessors_documentation.py
-â â âââ test_assessors_code_quality.py
-â â âââ ...
-â âââ integration/ # End-to-end tests
-â â âââ test_full_assessment.py
-â âââ fixtures/ # Test data
-â âââ sample_repos/ # Sample repositories for testing
-âââ docs/ # GitHub Pages documentation
-âââ examples/ # Example reports
-â âââ self-assessment/ # AgentReady's own assessment
-âââ pyproject.toml # Python package configuration
-âââ CLAUDE.md # Project context for AI agents
-âââ README.md # User-facing documentation
-âââ BACKLOG.md # Feature backlog
-```
+**From plan.md:**
-### Development Tools
+- Architecture/stack choices
+- Data Model references
+- Phases
+- Technical constraints
-AgentReady uses modern Python tooling:
+**From tasks.md:**
-| Tool | Purpose | Configuration |
-|------|---------|---------------|
-| **pytest** | Testing framework | `pyproject.toml` |
-| **black** | Code formatter | `pyproject.toml` |
-| **isort** | Import sorter | `pyproject.toml` |
-| **ruff** | Fast linter | `pyproject.toml` |
-| **mypy** | Type checker | `pyproject.toml` (future) |
+- Task IDs
+- Descriptions
+- Phase grouping
+- Parallel markers [P]
+- Referenced file paths
-### Running Tests
+**From constitution:**
-```bash
-# Run all tests
-pytest
+- Load `.specify/memory/constitution.md` for principle validation
-# Run with coverage
-pytest --cov=src/agentready --cov-report=html
+### 3. Build Semantic Models
-# Run specific test file
-pytest tests/unit/test_models.py -v
+Create internal representations (do not include raw artifacts in output):
-# Run tests matching pattern
-pytest -k "test_claude_md" -v
+- **Requirements inventory**: Each functional + non-functional requirement with a stable key (derive slug based on imperative phrase; e.g., "User can upload file" â `user-can-upload-file`)
+- **User story/action inventory**: Discrete user actions with acceptance criteria
+- **Task coverage mapping**: Map each task to one or more requirements or stories (inference by keyword / explicit reference patterns like IDs or key phrases)
+- **Constitution rule set**: Extract principle names and MUST/SHOULD normative statements
-# Run with output (don't capture print statements)
-pytest -s
+### 4. Detection Passes (Token-Efficient Analysis)
-# Fast fail (stop on first failure)
-pytest -x
-```
+Focus on high-signal findings. Limit to 50 findings total; aggregate remainder in overflow summary.
-### Code Quality Checks
+#### A. Duplication Detection
-```bash
-# Format code
-black src/ tests/
+- Identify near-duplicate requirements
+- Mark lower-quality phrasing for consolidation
-# Sort imports
-isort src/ tests/
+#### B. Ambiguity Detection
-# Lint code
-ruff check src/ tests/
+- Flag vague adjectives (fast, scalable, secure, intuitive, robust) lacking measurable criteria
+- Flag unresolved placeholders (TODO, TKTK, ???, ``, etc.)
-# Run all quality checks (recommended before committing)
-black src/ tests/ && isort src/ tests/ && ruff check src/ tests/
-```
+#### C. Underspecification
-### Pre-commit Hooks (Recommended)
+- Requirements with verbs but missing object or measurable outcome
+- User stories missing acceptance criteria alignment
+- Tasks referencing files or components not defined in spec/plan
-Install pre-commit hooks to automatically run quality checks:
+#### D. Constitution Alignment
-```bash
-# Install pre-commit (if not already installed)
-pip install pre-commit
+- Any requirement or plan element conflicting with a MUST principle
+- Missing mandated sections or quality gates from constitution
-# Install git hooks
-pre-commit install
+#### E. Coverage Gaps
-# Run manually on all files
-pre-commit run --all-files
-```
+- Requirements with zero associated tasks
+- Tasks with no mapped requirement/story
+- Non-functional requirements not reflected in tasks (e.g., performance, security)
----
+#### F. Inconsistency
-## Architecture Overview
+- Terminology drift (same concept named differently across files)
+- Data entities referenced in plan but absent in spec (or vice versa)
+- Task ordering contradictions (e.g., integration tasks before foundational setup tasks without dependency note)
+- Conflicting requirements (e.g., one requires Next.js while other specifies Vue)
-AgentReady follows a **library-first architecture** with clear separation of concerns.
+### 5. Severity Assignment
-### Data Flow
+Use this heuristic to prioritize findings:
-```
-Repository â Scanner â Assessors â Findings â Assessment â Reporters â Reports
- â
- Language Detection
- (git ls-files)
-```
+- **CRITICAL**: Violates constitution MUST, missing core spec artifact, or requirement with zero coverage that blocks baseline functionality
+- **HIGH**: Duplicate or conflicting requirement, ambiguous security/performance attribute, untestable acceptance criterion
+- **MEDIUM**: Terminology drift, missing non-functional task coverage, underspecified edge case
+- **LOW**: Style/wording improvements, minor redundancy not affecting execution order
-### Core Components
+### 6. Produce Compact Analysis Report
-#### 1. Models (`models/`)
+Output a Markdown report (no file writes) with the following structure:
-Immutable data classes representing domain entities:
+## Specification Analysis Report
-- **Repository**: Path, name, detected languages
-- **Attribute**: ID, name, tier, weight, description
-- **Finding**: Attribute, status (pass/fail/skip), score, evidence, remediation
-- **Assessment**: Repository, overall score, certification level, findings list
+| ID | Category | Severity | Location(s) | Summary | Recommendation |
+|----|----------|----------|-------------|---------|----------------|
+| A1 | Duplication | HIGH | spec.md:L120-134 | Two similar requirements ... | Merge phrasing; keep clearer version |
-**Design Principles**:
-- Immutable (frozen dataclasses)
-- Type-annotated
-- No business logic (pure data)
-- Factory methods for common patterns (`Finding.create_pass()`, etc.)
+(Add one row per finding; generate stable IDs prefixed by category initial.)
-#### 2. Services (`services/`)
+**Coverage Summary Table:**
-Orchestration and core algorithms:
+| Requirement Key | Has Task? | Task IDs | Notes |
+|-----------------|-----------|----------|-------|
-- **Scanner**: Coordinates assessment flow, manages assessors
-- **Scorer**: Calculates weighted scores, determines certification levels
-- **LanguageDetector**: Detects repository languages via `git ls-files`
+**Constitution Alignment Issues:** (if any)
-**Design Principles**:
-- Stateless (pure functions or stateless classes)
-- Single responsibility
-- No external dependencies (file I/O, network)
-- Testable with mocks
+**Unmapped Tasks:** (if any)
-#### 3. Assessors (`assessors/`)
+**Metrics:**
-Strategy pattern implementations for each attribute:
+- Total Requirements
+- Total Tasks
+- Coverage % (requirements with >=1 task)
+- Ambiguity Count
+- Duplication Count
+- Critical Issues Count
-- **BaseAssessor**: Abstract base class defining interface
-- Concrete assessors: `CLAUDEmdAssessor`, `READMEAssessor`, etc.
+### 7. Provide Next Actions
-**Design Principles**:
-- Each assessor is independent
-- Inherit from `BaseAssessor`
-- Implement `assess(repository)` method
-- Return `Finding` object
-- Fail gracefully (return "skipped" if tools missing, don't crash)
+At end of report, output a concise Next Actions block:
-#### 4. Reporters (`reporters/`)
+- If CRITICAL issues exist: Recommend resolving before `/speckit.implement`
+- If only LOW/MEDIUM: User may proceed, but provide improvement suggestions
+- Provide explicit command suggestions: e.g., "Run /speckit.specify with refinement", "Run /speckit.plan to adjust architecture", "Manually edit tasks.md to add coverage for 'performance-metrics'"
-Transform `Assessment` into report formats:
+### 8. Offer Remediation
-- **HTMLReporter**: Jinja2-based interactive report
-- **MarkdownReporter**: GitHub-Flavored Markdown
-- **JSONReporter**: Machine-readable JSON
+Ask the user: "Would you like me to suggest concrete remediation edits for the top N issues?" (Do NOT apply them automatically.)
-**Design Principles**:
-- Take `Assessment` as input
-- Return formatted string
-- Self-contained (HTML has inline CSS/JS, no CDN)
-- Idempotent (same input â same output)
+## Operating Principles
-### Key Design Patterns
+### Context Efficiency
-#### Strategy Pattern (Assessors)
+- **Minimal high-signal tokens**: Focus on actionable findings, not exhaustive documentation
+- **Progressive disclosure**: Load artifacts incrementally; don't dump all content into analysis
+- **Token-efficient output**: Limit findings table to 50 rows; summarize overflow
+- **Deterministic results**: Rerunning without changes should produce consistent IDs and counts
-Each assessor is a pluggable strategy implementing the same interface:
+### Analysis Guidelines
-```python
-from abc import ABC, abstractmethod
+- **NEVER modify files** (this is read-only analysis)
+- **NEVER hallucinate missing sections** (if absent, report them accurately)
+- **Prioritize constitution violations** (these are always CRITICAL)
+- **Use examples over exhaustive rules** (cite specific instances, not generic patterns)
+- **Report zero issues gracefully** (emit success report with coverage statistics)
-class BaseAssessor(ABC):
- @property
- @abstractmethod
- def attribute_id(self) -> str:
- """Unique attribute identifier."""
- pass
+## Context
- @abstractmethod
- def assess(self, repository: Repository) -> Finding:
- """Assess repository for this attribute."""
- pass
+$ARGUMENTS
+````
- def is_applicable(self, repository: Repository) -> bool:
- """Check if this assessor applies to the repository."""
- return True
-```
+## File: .claude/commands/speckit.checklist.md
+````markdown
+---
+description: Generate a custom checklist for the current feature based on user requirements.
+---
-#### Factory Pattern (Finding Creation)
+## Checklist Purpose: "Unit Tests for English"
-`Finding` class provides factory methods for common patterns:
+**CRITICAL CONCEPT**: Checklists are **UNIT TESTS FOR REQUIREMENTS WRITING** - they validate the quality, clarity, and completeness of requirements in a given domain.
-```python
-# Pass with full score
-finding = Finding.create_pass(
- attribute=attribute,
- evidence="Found CLAUDE.md at repository root",
- remediation=None
-)
+**NOT for verification/testing**:
-# Fail with zero score
-finding = Finding.create_fail(
- attribute=attribute,
- evidence="No CLAUDE.md file found",
- remediation=Remediation(steps=[...], tools=[...])
-)
+- â NOT "Verify the button clicks correctly"
+- â NOT "Test error handling works"
+- â NOT "Confirm the API returns 200"
+- â NOT checking if code/implementation matches the spec
-# Skip (not applicable)
-finding = Finding.create_skip(
- attribute=attribute,
- reason="Not implemented yet"
-)
-```
+**FOR requirements quality validation**:
-#### Template Pattern (Reporters)
+- â
"Are visual hierarchy requirements defined for all card types?" (completeness)
+- â
"Is 'prominent display' quantified with specific sizing/positioning?" (clarity)
+- â
"Are hover state requirements consistent across all interactive elements?" (consistency)
+- â
"Are accessibility requirements defined for keyboard navigation?" (coverage)
+- â
"Does the spec define what happens when logo image fails to load?" (edge cases)
-Reporters use Jinja2 templates for HTML generation:
+**Metaphor**: If your spec is code written in English, the checklist is its unit test suite. You're testing whether the requirements are well-written, complete, unambiguous, and ready for implementation - NOT whether the implementation works.
-```python
-from jinja2 import Environment, FileSystemLoader
+## User Input
-class HTMLReporter:
- def generate(self, assessment: Assessment) -> str:
- env = Environment(loader=FileSystemLoader('templates'))
- template = env.get_template('report.html.j2')
- return template.render(assessment=assessment)
+```text
+$ARGUMENTS
```
----
-
-## Implementing New Assessors
+You **MUST** consider the user input before proceeding (if not empty).
-Follow this step-by-step guide to add a new assessor.
+## Execution Steps
-### Step 1: Choose an Attribute
+1. **Setup**: Run `.specify/scripts/bash/check-prerequisites.sh --json` from repo root and parse JSON for FEATURE_DIR and AVAILABLE_DOCS list.
+ - All file paths must be absolute.
+ - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").
-Check `src/agentready/assessors/stub_assessors.py` for not-yet-implemented attributes:
+2. **Clarify intent (dynamic)**: Derive up to THREE initial contextual clarifying questions (no pre-baked catalog). They MUST:
+ - Be generated from the user's phrasing + extracted signals from spec/plan/tasks
+ - Only ask about information that materially changes checklist content
+ - Be skipped individually if already unambiguous in `$ARGUMENTS`
+ - Prefer precision over breadth
-```python
-# Example stub assessor
-class InlineDocumentationAssessor(BaseAssessor):
- @property
- def attribute_id(self) -> str:
- return "inline_documentation"
+ Generation algorithm:
+ 1. Extract signals: feature domain keywords (e.g., auth, latency, UX, API), risk indicators ("critical", "must", "compliance"), stakeholder hints ("QA", "review", "security team"), and explicit deliverables ("a11y", "rollback", "contracts").
+ 2. Cluster signals into candidate focus areas (max 4) ranked by relevance.
+ 3. Identify probable audience & timing (author, reviewer, QA, release) if not explicit.
+ 4. Detect missing dimensions: scope breadth, depth/rigor, risk emphasis, exclusion boundaries, measurable acceptance criteria.
+ 5. Formulate questions chosen from these archetypes:
+ - Scope refinement (e.g., "Should this include integration touchpoints with X and Y or stay limited to local module correctness?")
+ - Risk prioritization (e.g., "Which of these potential risk areas should receive mandatory gating checks?")
+ - Depth calibration (e.g., "Is this a lightweight pre-commit sanity list or a formal release gate?")
+ - Audience framing (e.g., "Will this be used by the author only or peers during PR review?")
+ - Boundary exclusion (e.g., "Should we explicitly exclude performance tuning items this round?")
+ - Scenario class gap (e.g., "No recovery flows detectedâare rollback / partial failure paths in scope?")
- def assess(self, repository: Repository) -> Finding:
- # TODO: Implement actual assessment logic
- return Finding.create_skip(
- self.attribute,
- reason="Assessor not yet implemented"
- )
-```
+ Question formatting rules:
+ - If presenting options, generate a compact table with columns: Option | Candidate | Why It Matters
+ - Limit to AâE options maximum; omit table if a free-form answer is clearer
+ - Never ask the user to restate what they already said
+ - Avoid speculative categories (no hallucination). If uncertain, ask explicitly: "Confirm whether X belongs in scope."
-### Step 2: Create Assessor Class
+ Defaults when interaction impossible:
+ - Depth: Standard
+ - Audience: Reviewer (PR) if code-related; Author otherwise
+ - Focus: Top 2 relevance clusters
-Create a new file or expand existing category file in `src/agentready/assessors/`:
+ Output the questions (label Q1/Q2/Q3). After answers: if âĨ2 scenario classes (Alternate / Exception / Recovery / Non-Functional domain) remain unclear, you MAY ask up to TWO more targeted followâups (Q4/Q5) with a one-line justification each (e.g., "Unresolved recovery path risk"). Do not exceed five total questions. Skip escalation if user explicitly declines more.
-```python
-# src/agentready/assessors/documentation.py
+3. **Understand user request**: Combine `$ARGUMENTS` + clarifying answers:
+ - Derive checklist theme (e.g., security, review, deploy, ux)
+ - Consolidate explicit must-have items mentioned by user
+ - Map focus selections to category scaffolding
+ - Infer any missing context from spec/plan/tasks (do NOT hallucinate)
-from agentready.models import Repository, Finding, Attribute, Remediation
-from agentready.assessors.base import BaseAssessor
+4. **Load feature context**: Read from FEATURE_DIR:
+ - spec.md: Feature requirements and scope
+ - plan.md (if exists): Technical details, dependencies
+ - tasks.md (if exists): Implementation tasks
-class InlineDocumentationAssessor(BaseAssessor):
- @property
- def attribute_id(self) -> str:
- return "inline_documentation"
+ **Context Loading Strategy**:
+ - Load only necessary portions relevant to active focus areas (avoid full-file dumping)
+ - Prefer summarizing long sections into concise scenario/requirement bullets
+ - Use progressive disclosure: add follow-on retrieval only if gaps detected
+ - If source docs are large, generate interim summary items instead of embedding raw text
- def assess(self, repository: Repository) -> Finding:
- """
- Assess inline documentation coverage (docstrings/JSDoc).
+5. **Generate checklist** - Create "Unit Tests for Requirements":
+ - Create `FEATURE_DIR/checklists/` directory if it doesn't exist
+ - Generate unique checklist filename:
+ - Use short, descriptive name based on domain (e.g., `ux.md`, `api.md`, `security.md`)
+ - Format: `[domain].md`
+ - If file exists, append to existing file
+ - Number items sequentially starting from CHK001
+ - Each `/speckit.checklist` run creates a NEW file (never overwrites existing checklists)
- Checks:
- - Python: Presence of docstrings in .py files
- - JavaScript/TypeScript: JSDoc comments
- - Coverage: >80% of public functions documented
- """
- # Implement assessment logic here
- pass
-```
+ **CORE PRINCIPLE - Test the Requirements, Not the Implementation**:
+ Every checklist item MUST evaluate the REQUIREMENTS THEMSELVES for:
+ - **Completeness**: Are all necessary requirements present?
+ - **Clarity**: Are requirements unambiguous and specific?
+ - **Consistency**: Do requirements align with each other?
+ - **Measurability**: Can requirements be objectively verified?
+ - **Coverage**: Are all scenarios/edge cases addressed?
-### Step 3: Implement Assessment Logic
+ **Category Structure** - Group items by requirement quality dimensions:
+ - **Requirement Completeness** (Are all necessary requirements documented?)
+ - **Requirement Clarity** (Are requirements specific and unambiguous?)
+ - **Requirement Consistency** (Do requirements align without conflicts?)
+ - **Acceptance Criteria Quality** (Are success criteria measurable?)
+ - **Scenario Coverage** (Are all flows/cases addressed?)
+ - **Edge Case Coverage** (Are boundary conditions defined?)
+ - **Non-Functional Requirements** (Performance, Security, Accessibility, etc. - are they specified?)
+ - **Dependencies & Assumptions** (Are they documented and validated?)
+ - **Ambiguities & Conflicts** (What needs clarification?)
-Use the `calculate_proportional_score()` helper for partial compliance:
+ **HOW TO WRITE CHECKLIST ITEMS - "Unit Tests for English"**:
-```python
-def assess(self, repository: Repository) -> Finding:
- # Example: Check Python docstrings
- if "Python" not in repository.languages:
- return Finding.create_skip(
- self.attribute,
- reason="No Python files detected"
- )
+ â **WRONG** (Testing implementation):
+ - "Verify landing page displays 3 episode cards"
+ - "Test hover states work on desktop"
+ - "Confirm logo click navigates home"
- # Count functions and docstrings
- total_functions = self._count_functions(repository)
- documented_functions = self._count_documented_functions(repository)
+ â
**CORRECT** (Testing requirements quality):
+ - "Are the exact number and layout of featured episodes specified?" [Completeness]
+ - "Is 'prominent display' quantified with specific sizing/positioning?" [Clarity]
+ - "Are hover state requirements consistent across all interactive elements?" [Consistency]
+ - "Are keyboard navigation requirements defined for all interactive UI?" [Coverage]
+ - "Is the fallback behavior specified when logo image fails to load?" [Edge Cases]
+ - "Are loading states defined for asynchronous episode data?" [Completeness]
+ - "Does the spec define visual hierarchy for competing UI elements?" [Clarity]
- if total_functions == 0:
- return Finding.create_skip(
- self.attribute,
- reason="No functions found"
- )
+ **ITEM STRUCTURE**:
+ Each item should follow this pattern:
+ - Question format asking about requirement quality
+ - Focus on what's WRITTEN (or not written) in the spec/plan
+ - Include quality dimension in brackets [Completeness/Clarity/Consistency/etc.]
+ - Reference spec section `[Spec §X.Y]` when checking existing requirements
+ - Use `[Gap]` marker when checking for missing requirements
- # Calculate coverage
- coverage = documented_functions / total_functions
- score = self.calculate_proportional_score(coverage, 0.80)
+ **EXAMPLES BY QUALITY DIMENSION**:
- if score >= 80: # Passes if >= 80% of target
- return Finding.create_pass(
- self.attribute,
- evidence=f"Documented {documented_functions}/{total_functions} functions ({coverage:.1%})",
- remediation=None
- )
- else:
- return Finding.create_fail(
- self.attribute,
- evidence=f"Only {documented_functions}/{total_functions} functions documented ({coverage:.1%})",
- remediation=self._create_remediation(coverage)
- )
+ Completeness:
+ - "Are error handling requirements defined for all API failure modes? [Gap]"
+ - "Are accessibility requirements specified for all interactive elements? [Completeness]"
+ - "Are mobile breakpoint requirements defined for responsive layouts? [Gap]"
-def _count_functions(self, repository: Repository) -> int:
- """Count total functions in Python files."""
- # Implementation using ast or grep
- pass
+ Clarity:
+ - "Is 'fast loading' quantified with specific timing thresholds? [Clarity, Spec §NFR-2]"
+ - "Are 'related episodes' selection criteria explicitly defined? [Clarity, Spec §FR-5]"
+ - "Is 'prominent' defined with measurable visual properties? [Ambiguity, Spec §FR-4]"
-def _count_documented_functions(self, repository: Repository) -> int:
- """Count functions with docstrings."""
- # Implementation using ast
- pass
+ Consistency:
+ - "Do navigation requirements align across all pages? [Consistency, Spec §FR-10]"
+ - "Are card component requirements consistent between landing and detail pages? [Consistency]"
-def _create_remediation(self, current_coverage: float) -> Remediation:
- """Generate remediation guidance."""
- return Remediation(
- steps=[
- "Install pydocstyle: `pip install pydocstyle`",
- "Run docstring linter: `pydocstyle src/`",
- "Add docstrings to flagged functions",
- f"Target: {(0.80 - current_coverage) * 100:.0f}% more functions need documentation"
- ],
- tools=["pydocstyle", "pylint"],
- commands=[
- "pydocstyle src/",
- "pylint --disable=all --enable=missing-docstring src/"
- ],
- examples=[
- '''def calculate_total(items: List[Item]) -> float:
- """
- Calculate total price of items.
+ Coverage:
+ - "Are requirements defined for zero-state scenarios (no episodes)? [Coverage, Edge Case]"
+ - "Are concurrent user interaction scenarios addressed? [Coverage, Gap]"
+ - "Are requirements specified for partial data loading failures? [Coverage, Exception Flow]"
- Args:
- items: List of items to sum
+ Measurability:
+ - "Are visual hierarchy requirements measurable/testable? [Acceptance Criteria, Spec §FR-1]"
+ - "Can 'balanced visual weight' be objectively verified? [Measurability, Spec §FR-2]"
- Returns:
- Total price in USD
+ **Scenario Classification & Coverage** (Requirements Quality Focus):
+ - Check if requirements exist for: Primary, Alternate, Exception/Error, Recovery, Non-Functional scenarios
+ - For each scenario class, ask: "Are [scenario type] requirements complete, clear, and consistent?"
+ - If scenario class missing: "Are [scenario type] requirements intentionally excluded or missing? [Gap]"
+ - Include resilience/rollback when state mutation occurs: "Are rollback requirements defined for migration failures? [Gap]"
- Example:
- >>> calculate_total([Item(5.0), Item(3.0)])
- 8.0
- """
- return sum(item.price for item in items)'''
- ],
- citations=[
- "PEP 257 - Docstring Conventions",
- "Google Python Style Guide"
- ]
- )
-```
+ **Traceability Requirements**:
+ - MINIMUM: âĨ80% of items MUST include at least one traceability reference
+ - Each item should reference: spec section `[Spec §X.Y]`, or use markers: `[Gap]`, `[Ambiguity]`, `[Conflict]`, `[Assumption]`
+ - If no ID system exists: "Is a requirement & acceptance criteria ID scheme established? [Traceability]"
-### Step 4: Register Assessor
+ **Surface & Resolve Issues** (Requirements Quality Problems):
+ Ask questions about the requirements themselves:
+ - Ambiguities: "Is the term 'fast' quantified with specific metrics? [Ambiguity, Spec §NFR-1]"
+ - Conflicts: "Do navigation requirements conflict between §FR-10 and §FR-10a? [Conflict]"
+ - Assumptions: "Is the assumption of 'always available podcast API' validated? [Assumption]"
+ - Dependencies: "Are external podcast API requirements documented? [Dependency, Gap]"
+ - Missing definitions: "Is 'visual hierarchy' defined with measurable criteria? [Gap]"
-Add to scanner's assessor list in `src/agentready/services/scanner.py`:
+ **Content Consolidation**:
+ - Soft cap: If raw candidate items > 40, prioritize by risk/impact
+ - Merge near-duplicates checking the same requirement aspect
+ - If >5 low-impact edge cases, create one item: "Are edge cases X, Y, Z addressed in requirements? [Coverage]"
-```python
-def __init__(self):
- self.assessors = [
- # Existing assessors...
- InlineDocumentationAssessor(),
- ]
-```
+ **đĢ ABSOLUTELY PROHIBITED** - These make it an implementation test, not a requirements test:
+ - â Any item starting with "Verify", "Test", "Confirm", "Check" + implementation behavior
+ - â References to code execution, user actions, system behavior
+ - â "Displays correctly", "works properly", "functions as expected"
+ - â "Click", "navigate", "render", "load", "execute"
+ - â Test cases, test plans, QA procedures
+ - â Implementation details (frameworks, APIs, algorithms)
-### Step 5: Write Tests
+ **â
REQUIRED PATTERNS** - These test requirements quality:
+ - â
"Are [requirement type] defined/specified/documented for [scenario]?"
+ - â
"Is [vague term] quantified/clarified with specific criteria?"
+ - â
"Are requirements consistent between [section A] and [section B]?"
+ - â
"Can [requirement] be objectively measured/verified?"
+ - â
"Are [edge cases/scenarios] addressed in requirements?"
+ - â
"Does the spec define [missing aspect]?"
-Create comprehensive unit tests in `tests/unit/test_assessors_documentation.py`:
+6. **Structure Reference**: Generate the checklist following the canonical template in `.specify/templates/checklist-template.md` for title, meta section, category headings, and ID formatting. If template is unavailable, use: H1 title, purpose/created meta lines, `##` category sections containing `- [ ] CHK### ` lines with globally incrementing IDs starting at CHK001.
-```python
-import pytest
-from agentready.models import Repository
-from agentready.assessors.documentation import InlineDocumentationAssessor
+7. **Report**: Output full path to created checklist, item count, and remind user that each run creates a new file. Summarize:
+ - Focus areas selected
+ - Depth level
+ - Actor/timing
+ - Any explicit user-specified must-have items incorporated
-class TestInlineDocumentationAssessor:
- def test_python_well_documented_passes(self, tmp_path):
- """Well-documented Python code should pass."""
- # Create test repository
- repo_path = tmp_path / "test_repo"
- repo_path.mkdir()
- (repo_path / ".git").mkdir()
+**Important**: Each `/speckit.checklist` command invocation creates a checklist file using short, descriptive names unless file already exists. This allows:
- # Create Python file with docstrings
- code = '''
-def add(a: int, b: int) -> int:
- """Add two numbers."""
- return a + b
+- Multiple checklists of different types (e.g., `ux.md`, `test.md`, `security.md`)
+- Simple, memorable filenames that indicate checklist purpose
+- Easy identification and navigation in the `checklists/` folder
-def subtract(a: int, b: int) -> int:
- """Subtract b from a."""
- return a - b
-'''
- (repo_path / "main.py").write_text(code)
+To avoid clutter, use descriptive types and clean up obsolete checklists when done.
- # Create repository object
- repo = Repository(
- path=str(repo_path),
- name="test_repo",
- languages={"Python": 1}
- )
+## Example Checklist Types & Sample Items
- # Run assessment
- assessor = InlineDocumentationAssessor()
- finding = assessor.assess(repo)
+**UX Requirements Quality:** `ux.md`
- # Verify result
- assert finding.status == "pass"
- assert finding.score == 100
- assert "2/2 functions" in finding.evidence
+Sample items (testing the requirements, NOT the implementation):
- def test_python_poorly_documented_fails(self, tmp_path):
- """Poorly documented Python code should fail."""
- # Create test repository
- repo_path = tmp_path / "test_repo"
- repo_path.mkdir()
- (repo_path / ".git").mkdir()
+- "Are visual hierarchy requirements defined with measurable criteria? [Clarity, Spec §FR-1]"
+- "Is the number and positioning of UI elements explicitly specified? [Completeness, Spec §FR-1]"
+- "Are interaction state requirements (hover, focus, active) consistently defined? [Consistency]"
+- "Are accessibility requirements specified for all interactive elements? [Coverage, Gap]"
+- "Is fallback behavior defined when images fail to load? [Edge Case, Gap]"
+- "Can 'prominent display' be objectively measured? [Measurability, Spec §FR-4]"
- # Create Python file with no docstrings
- code = '''
-def add(a, b):
- return a + b
+**API Requirements Quality:** `api.md`
-def subtract(a, b):
- return a - b
-'''
- (repo_path / "main.py").write_text(code)
+Sample items:
- repo = Repository(
- path=str(repo_path),
- name="test_repo",
- languages={"Python": 1}
- )
+- "Are error response formats specified for all failure scenarios? [Completeness]"
+- "Are rate limiting requirements quantified with specific thresholds? [Clarity]"
+- "Are authentication requirements consistent across all endpoints? [Consistency]"
+- "Are retry/timeout requirements defined for external dependencies? [Coverage, Gap]"
+- "Is versioning strategy documented in requirements? [Gap]"
- assessor = InlineDocumentationAssessor()
- finding = assessor.assess(repo)
+**Performance Requirements Quality:** `performance.md`
- assert finding.status == "fail"
- assert finding.score < 80
- assert "0/2 functions" in finding.evidence
- assert finding.remediation is not None
- assert "pydocstyle" in finding.remediation.tools
+Sample items:
- def test_non_python_skips(self, tmp_path):
- """Non-Python repositories should skip."""
- repo = Repository(
- path=str(tmp_path),
- name="test_repo",
- languages={"JavaScript": 10}
- )
+- "Are performance requirements quantified with specific metrics? [Clarity]"
+- "Are performance targets defined for all critical user journeys? [Coverage]"
+- "Are performance requirements under different load conditions specified? [Completeness]"
+- "Can performance requirements be objectively measured? [Measurability]"
+- "Are degradation requirements defined for high-load scenarios? [Edge Case, Gap]"
- assessor = InlineDocumentationAssessor()
- finding = assessor.assess(repo)
+**Security Requirements Quality:** `security.md`
- assert finding.status == "skipped"
- assert "No Python files" in finding.reason
-```
+Sample items:
-### Step 6: Test Manually
+- "Are authentication requirements specified for all protected resources? [Coverage]"
+- "Are data protection requirements defined for sensitive information? [Completeness]"
+- "Is the threat model documented and requirements aligned to it? [Traceability]"
+- "Are security requirements consistent with compliance obligations? [Consistency]"
+- "Are security failure/breach response requirements defined? [Gap, Exception Flow]"
-```bash
-# Run your new tests
-pytest tests/unit/test_assessors_documentation.py -v
+## Anti-Examples: What NOT To Do
-# Run full assessment on AgentReady itself
-agentready assess . --verbose
+**â WRONG - These test implementation, not requirements:**
-# Verify your assessor appears in output
+```markdown
+- [ ] CHK001 - Verify landing page displays 3 episode cards [Spec §FR-001]
+- [ ] CHK002 - Test hover states work correctly on desktop [Spec §FR-003]
+- [ ] CHK003 - Confirm logo click navigates to home page [Spec §FR-010]
+- [ ] CHK004 - Check that related episodes section shows 3-5 items [Spec §FR-005]
```
-### Best Practices for Assessors
+**â
CORRECT - These test requirements quality:**
-1. **Fail Gracefully**: Return "skipped" if required tools missing, don't crash
-2. **Provide Rich Remediation**: Include steps, tools, commands, examples, citations
-3. **Use Proportional Scoring**: `calculate_proportional_score()` for partial compliance
-4. **Language-Specific Logic**: Check `repository.languages` before assessing
-5. **Avoid External Dependencies**: Use stdlib when possible (ast, re, pathlib)
-6. **Performance**: Keep assessments fast (<1 second per assessor)
-7. **Idempotent**: Same repository â same result
-8. **Evidence**: Provide specific, actionable evidence (file paths, counts, examples)
+```markdown
+- [ ] CHK001 - Are the number and layout of featured episodes explicitly specified? [Completeness, Spec §FR-001]
+- [ ] CHK002 - Are hover state requirements consistently defined for all interactive elements? [Consistency, Spec §FR-003]
+- [ ] CHK003 - Are navigation requirements clear for all clickable brand elements? [Clarity, Spec §FR-010]
+- [ ] CHK004 - Is the selection criteria for related episodes documented? [Gap, Spec §FR-005]
+- [ ] CHK005 - Are loading state requirements defined for asynchronous episode data? [Gap]
+- [ ] CHK006 - Can "visual hierarchy" requirements be objectively measured? [Measurability, Spec §FR-001]
+```
----
+**Key Differences:**
-## Testing Guidelines
+- Wrong: Tests if the system works correctly
+- Correct: Tests if the requirements are written correctly
+- Wrong: Verification of behavior
+- Correct: Validation of requirement quality
+- Wrong: "Does it do X?"
+- Correct: "Is X clearly specified?"
+````
-AgentReady maintains high test quality standards.
+## File: .claude/commands/speckit.clarify.md
+````markdown
+---
+description: Identify underspecified areas in the current feature spec by asking up to 5 highly targeted clarification questions and encoding answers back into the spec.
+handoffs:
+ - label: Build Technical Plan
+ agent: speckit.plan
+ prompt: Create a plan for the spec. I am building with...
+---
-### Test Organization
+## User Input
+```text
+$ARGUMENTS
```
-tests/
-âââ unit/ # Fast, isolated tests
-â âââ test_models.py
-â âââ test_assessors_*.py
-â âââ test_reporters.py
-âââ integration/ # End-to-end tests
-â âââ test_full_assessment.py
-âââ fixtures/ # Shared test data
- âââ sample_repos/
-```
-
-### Test Types
-
-#### Unit Tests
-
-- **Purpose**: Test individual components in isolation
-- **Speed**: Very fast (<1s total)
-- **Coverage**: Models, assessors, services, reporters
-- **Mocking**: Use `pytest` fixtures and mocks
-#### Integration Tests
+You **MUST** consider the user input before proceeding (if not empty).
-- **Purpose**: Test complete workflows end-to-end
-- **Speed**: Slower (acceptable up to 10s total)
-- **Coverage**: Full assessment pipeline
-- **Real Data**: Use fixture repositories
+## Outline
-### Writing Good Tests
+Goal: Detect and reduce ambiguity or missing decision points in the active feature specification and record the clarifications directly in the spec file.
-#### Test Naming
+Note: This clarification workflow is expected to run (and be completed) BEFORE invoking `/speckit.plan`. If the user explicitly states they are skipping clarification (e.g., exploratory spike), you may proceed, but must warn that downstream rework risk increases.
-Use descriptive names following pattern: `test___`
+Execution steps:
-```python
-# Good
-def test_claude_md_assessor_with_existing_file_passes():
- pass
+1. Run `.specify/scripts/bash/check-prerequisites.sh --json --paths-only` from repo root **once** (combined `--json --paths-only` mode / `-Json -PathsOnly`). Parse minimal JSON payload fields:
+ - `FEATURE_DIR`
+ - `FEATURE_SPEC`
+ - (Optionally capture `IMPL_PLAN`, `TASKS` for future chained flows.)
+ - If JSON parsing fails, abort and instruct user to re-run `/speckit.specify` or verify feature branch environment.
+ - For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").
-def test_readme_assessor_missing_quick_start_fails():
- pass
+2. Load the current spec file. Perform a structured ambiguity & coverage scan using this taxonomy. For each category, mark status: Clear / Partial / Missing. Produce an internal coverage map used for prioritization (do not output raw map unless no questions will be asked).
-def test_type_annotations_assessor_javascript_repo_skips():
- pass
+ Functional Scope & Behavior:
+ - Core user goals & success criteria
+ - Explicit out-of-scope declarations
+ - User roles / personas differentiation
-# Bad
-def test_assessor():
- pass
+ Domain & Data Model:
+ - Entities, attributes, relationships
+ - Identity & uniqueness rules
+ - Lifecycle/state transitions
+ - Data volume / scale assumptions
-def test_pass_case():
- pass
-```
+ Interaction & UX Flow:
+ - Critical user journeys / sequences
+ - Error/empty/loading states
+ - Accessibility or localization notes
-#### Arrange-Act-Assert Pattern
+ Non-Functional Quality Attributes:
+ - Performance (latency, throughput targets)
+ - Scalability (horizontal/vertical, limits)
+ - Reliability & availability (uptime, recovery expectations)
+ - Observability (logging, metrics, tracing signals)
+ - Security & privacy (authN/Z, data protection, threat assumptions)
+ - Compliance / regulatory constraints (if any)
-```python
-def test_finding_create_pass_sets_correct_attributes():
- # Arrange
- attribute = Attribute(
- id="test_attr",
- name="Test Attribute",
- tier=1,
- weight=0.10
- )
+ Integration & External Dependencies:
+ - External services/APIs and failure modes
+ - Data import/export formats
+ - Protocol/versioning assumptions
- # Act
- finding = Finding.create_pass(
- attribute=attribute,
- evidence="Test evidence",
- remediation=None
- )
+ Edge Cases & Failure Handling:
+ - Negative scenarios
+ - Rate limiting / throttling
+ - Conflict resolution (e.g., concurrent edits)
- # Assert
- assert finding.status == "pass"
- assert finding.score == 100
- assert finding.evidence == "Test evidence"
- assert finding.remediation is None
-```
+ Constraints & Tradeoffs:
+ - Technical constraints (language, storage, hosting)
+ - Explicit tradeoffs or rejected alternatives
-#### Use Fixtures
+ Terminology & Consistency:
+ - Canonical glossary terms
+ - Avoided synonyms / deprecated terms
-```python
-@pytest.fixture
-def sample_repository(tmp_path):
- """Create a sample repository for testing."""
- repo_path = tmp_path / "sample_repo"
- repo_path.mkdir()
- (repo_path / ".git").mkdir()
+ Completion Signals:
+ - Acceptance criteria testability
+ - Measurable Definition of Done style indicators
- # Add files
- (repo_path / "README.md").write_text("# Sample Repo")
- (repo_path / "CLAUDE.md").write_text("# Tech Stack")
+ Misc / Placeholders:
+ - TODO markers / unresolved decisions
+ - Ambiguous adjectives ("robust", "intuitive") lacking quantification
- return Repository(
- path=str(repo_path),
- name="sample_repo",
- languages={"Python": 5}
- )
+ For each category with Partial or Missing status, add a candidate question opportunity unless:
+ - Clarification would not materially change implementation or validation strategy
+ - Information is better deferred to planning phase (note internally)
-def test_with_fixture(sample_repository):
- assert sample_repository.name == "sample_repo"
-```
+3. Generate (internally) a prioritized queue of candidate clarification questions (maximum 5). Do NOT output them all at once. Apply these constraints:
+ - Maximum of 10 total questions across the whole session.
+ - Each question must be answerable with EITHER:
+ - A short multipleâchoice selection (2â5 distinct, mutually exclusive options), OR
+ - A one-word / shortâphrase answer (explicitly constrain: "Answer in <=5 words").
+ - Only include questions whose answers materially impact architecture, data modeling, task decomposition, test design, UX behavior, operational readiness, or compliance validation.
+ - Ensure category coverage balance: attempt to cover the highest impact unresolved categories first; avoid asking two low-impact questions when a single high-impact area (e.g., security posture) is unresolved.
+ - Exclude questions already answered, trivial stylistic preferences, or plan-level execution details (unless blocking correctness).
+ - Favor clarifications that reduce downstream rework risk or prevent misaligned acceptance tests.
+ - If more than 5 categories remain unresolved, select the top 5 by (Impact * Uncertainty) heuristic.
-### Coverage Requirements
+4. Sequential questioning loop (interactive):
+ - Present EXACTLY ONE question at a time.
+ - For multipleâchoice questions:
+ - **Analyze all options** and determine the **most suitable option** based on:
+ - Best practices for the project type
+ - Common patterns in similar implementations
+ - Risk reduction (security, performance, maintainability)
+ - Alignment with any explicit project goals or constraints visible in the spec
+ - Present your **recommended option prominently** at the top with clear reasoning (1-2 sentences explaining why this is the best choice).
+ - Format as: `**Recommended:** Option [X] - `
+ - Then render all options as a Markdown table:
-- **Target**: >80% line coverage for new code
-- **Minimum**: >70% overall coverage
-- **Critical Paths**: 100% coverage (scoring algorithm, finding creation)
+ | Option | Description |
+ |--------|-------------|
+ | A |