quodeq 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- quodeq-0.3.0/PKG-INFO +254 -0
- quodeq-0.3.0/README.md +229 -0
- quodeq-0.3.0/pyproject.toml +63 -0
- quodeq-0.3.0/src/quodeq/__init__.py +17 -0
- quodeq-0.3.0/src/quodeq/action_api.py +146 -0
- quodeq-0.3.0/src/quodeq/action_api_routes.py +301 -0
- quodeq-0.3.0/src/quodeq/adapters/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/dimensions_repository.py +32 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/evaluations_repository.py +32 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/evaluators_repository.py +32 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/__init__.py +54 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/grades.py +98 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/json_parser.py +181 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/markdown.py +103 -0
- quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/runs.py +236 -0
- quodeq-0.3.0/src/quodeq/adapters/hybrid/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/adapters/hybrid/_hybrid_call.py +17 -0
- quodeq-0.3.0/src/quodeq/adapters/hybrid/dimensions_repository.py +22 -0
- quodeq-0.3.0/src/quodeq/adapters/hybrid/evaluations_repository.py +22 -0
- quodeq-0.3.0/src/quodeq/adapters/hybrid/evaluators_repository.py +22 -0
- quodeq-0.3.0/src/quodeq/adapters/web/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/adapters/web/base_repository.py +28 -0
- quodeq-0.3.0/src/quodeq/adapters/web/dimensions_repository.py +16 -0
- quodeq-0.3.0/src/quodeq/adapters/web/evaluations_repository.py +16 -0
- quodeq-0.3.0/src/quodeq/adapters/web/evaluators_repository.py +16 -0
- quodeq-0.3.0/src/quodeq/adapters/web/http_client.py +112 -0
- quodeq-0.3.0/src/quodeq/bootstrap.py +29 -0
- quodeq-0.3.0/src/quodeq/cli.py +243 -0
- quodeq-0.3.0/src/quodeq/config/__init__.py +1 -0
- quodeq-0.3.0/src/quodeq/config/actions.py +149 -0
- quodeq-0.3.0/src/quodeq/config/ai_defaults.json +7 -0
- quodeq-0.3.0/src/quodeq/config/ai_provider.py +58 -0
- quodeq-0.3.0/src/quodeq/config/cli.py +87 -0
- quodeq-0.3.0/src/quodeq/config/coverage.py +28 -0
- quodeq-0.3.0/src/quodeq/config/dimensions.py +34 -0
- quodeq-0.3.0/src/quodeq/config/discipline_registry.py +224 -0
- quodeq-0.3.0/src/quodeq/config/disciplines.py +44 -0
- quodeq-0.3.0/src/quodeq/config/evaluators.py +42 -0
- quodeq-0.3.0/src/quodeq/config/knowledge_refresh.py +227 -0
- quodeq-0.3.0/src/quodeq/config/linter_sources.json +8 -0
- quodeq-0.3.0/src/quodeq/config/paths.py +74 -0
- quodeq-0.3.0/src/quodeq/config/prompt_templates.py +11 -0
- quodeq-0.3.0/src/quodeq/config/refresh_templates/analysis.md +24 -0
- quodeq-0.3.0/src/quodeq/config/refresh_templates/practices.md +28 -0
- quodeq-0.3.0/src/quodeq/config/scaffold.py +116 -0
- quodeq-0.3.0/src/quodeq/config/sources.py +8 -0
- quodeq-0.3.0/src/quodeq/config/standards_fetcher.py +100 -0
- quodeq-0.3.0/src/quodeq/config/validation.py +18 -0
- quodeq-0.3.0/src/quodeq/dashboard/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/dashboard/_build.py +71 -0
- quodeq-0.3.0/src/quodeq/dashboard/_config.py +64 -0
- quodeq-0.3.0/src/quodeq/dashboard/cli.py +78 -0
- quodeq-0.3.0/src/quodeq/dashboard/runner.py +265 -0
- quodeq-0.3.0/src/quodeq/data/config/disciplines.conf +130 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/bash/dimensions.json +40 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/bash/knowledge/analysis.md +22 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/bash/plugin.json +10 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/java/dimensions.json +40 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/java/knowledge/analysis.md +23 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/java/plugin.json +10 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/kotlin/dimensions.json +40 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/kotlin/knowledge/analysis.md +23 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/kotlin/plugin.json +10 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/mobile_ios/dimensions.json +40 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/mobile_ios/knowledge/analysis.md +23 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/mobile_ios/plugin.json +10 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/python/dimensions.json +40 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/python/knowledge/analysis.md +24 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/python/plugin.json +10 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/typescript/dimensions.json +40 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/typescript/knowledge/analysis.md +38 -0
- quodeq-0.3.0/src/quodeq/data/evaluators/typescript/plugin.json +11 -0
- quodeq-0.3.0/src/quodeq/data/prompts/compass.md +104 -0
- quodeq-0.3.0/src/quodeq/data/prompts/subagent.md +44 -0
- quodeq-0.3.0/src/quodeq/data/standards/asvs/level1.json +1159 -0
- quodeq-0.3.0/src/quodeq/data/standards/cert/reliability.json +178 -0
- quodeq-0.3.0/src/quodeq/data/standards/cisq/maintainability.json +24 -0
- quodeq-0.3.0/src/quodeq/data/standards/cisq/performance.json +18 -0
- quodeq-0.3.0/src/quodeq/data/standards/cisq/reliability.json +21 -0
- quodeq-0.3.0/src/quodeq/data/standards/cisq/security.json +26 -0
- quodeq-0.3.0/src/quodeq/data/standards/compiled/flexibility.json +273 -0
- quodeq-0.3.0/src/quodeq/data/standards/compiled/maintainability.json +1291 -0
- quodeq-0.3.0/src/quodeq/data/standards/compiled/performance.json +508 -0
- quodeq-0.3.0/src/quodeq/data/standards/compiled/reliability.json +989 -0
- quodeq-0.3.0/src/quodeq/data/standards/compiled/security.json +3050 -0
- quodeq-0.3.0/src/quodeq/data/standards/compiled/usability.json +409 -0
- quodeq-0.3.0/src/quodeq/data/standards/cwe/audit.json +4876 -0
- quodeq-0.3.0/src/quodeq/data/standards/iso25010/flexibility.json +44 -0
- quodeq-0.3.0/src/quodeq/data/standards/iso25010/maintainability.json +442 -0
- quodeq-0.3.0/src/quodeq/data/standards/iso25010/performance.json +191 -0
- quodeq-0.3.0/src/quodeq/data/standards/iso25010/reliability.json +310 -0
- quodeq-0.3.0/src/quodeq/data/standards/iso25010/security.json +743 -0
- quodeq-0.3.0/src/quodeq/data/standards/iso25010/usability.json +59 -0
- quodeq-0.3.0/src/quodeq/data/standards/wcag/level_a.json +117 -0
- quodeq-0.3.0/src/quodeq/engine/__init__.py +1 -0
- quodeq-0.3.0/src/quodeq/engine/_event_text.py +43 -0
- quodeq-0.3.0/src/quodeq/engine/_merge.py +43 -0
- quodeq-0.3.0/src/quodeq/engine/_runner_report.py +33 -0
- quodeq-0.3.0/src/quodeq/engine/analysis.py +363 -0
- quodeq-0.3.0/src/quodeq/engine/evidence.py +120 -0
- quodeq-0.3.0/src/quodeq/engine/evidence_parser.py +229 -0
- quodeq-0.3.0/src/quodeq/engine/file_queue.py +165 -0
- quodeq-0.3.0/src/quodeq/engine/mcp_findings.py +317 -0
- quodeq-0.3.0/src/quodeq/engine/plugin_detector.py +107 -0
- quodeq-0.3.0/src/quodeq/engine/plugin_loader.py +105 -0
- quodeq-0.3.0/src/quodeq/engine/prompt_builder.py +135 -0
- quodeq-0.3.0/src/quodeq/engine/report.py +185 -0
- quodeq-0.3.0/src/quodeq/engine/runner.py +393 -0
- quodeq-0.3.0/src/quodeq/engine/sa_manager.py +4 -0
- quodeq-0.3.0/src/quodeq/engine/schema_validator.py +65 -0
- quodeq-0.3.0/src/quodeq/engine/schemas/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/engine/schemas/dimensions_schema.json +28 -0
- quodeq-0.3.0/src/quodeq/engine/schemas/plugin_schema.json +36 -0
- quodeq-0.3.0/src/quodeq/engine/scoring.py +300 -0
- quodeq-0.3.0/src/quodeq/engine/scoring_internals.py +324 -0
- quodeq-0.3.0/src/quodeq/engine/standards.py +42 -0
- quodeq-0.3.0/src/quodeq/engine/stream_parser.py +96 -0
- quodeq-0.3.0/src/quodeq/engine/stream_validation.py +42 -0
- quodeq-0.3.0/src/quodeq/engine/subagent_pool.py +284 -0
- quodeq-0.3.0/src/quodeq/ports/__init__.py +0 -0
- quodeq-0.3.0/src/quodeq/ports/data_errors.py +27 -0
- quodeq-0.3.0/src/quodeq/ports/dimensions.py +15 -0
- quodeq-0.3.0/src/quodeq/ports/evaluations.py +15 -0
- quodeq-0.3.0/src/quodeq/ports/evaluators.py +16 -0
- quodeq-0.3.0/src/quodeq/provider/__init__.py +19 -0
- quodeq-0.3.0/src/quodeq/provider/accumulated.py +189 -0
- quodeq-0.3.0/src/quodeq/provider/base.py +91 -0
- quodeq-0.3.0/src/quodeq/provider/dashboard.py +248 -0
- quodeq-0.3.0/src/quodeq/provider/evaluation_mixin.py +93 -0
- quodeq-0.3.0/src/quodeq/provider/filesystem.py +283 -0
- quodeq-0.3.0/src/quodeq/provider/jobs.py +199 -0
- quodeq-0.3.0/src/quodeq/provider/plugin_discovery.py +51 -0
- quodeq-0.3.0/src/quodeq/provider/tooling_mixin.py +133 -0
- quodeq-0.3.0/src/quodeq/provider/violation_context.py +61 -0
- quodeq-0.3.0/src/quodeq/provider/violations.py +74 -0
- quodeq-0.3.0/src/quodeq/provider/violations_parsing.py +231 -0
- quodeq-0.3.0/src/quodeq/shared/__init__.py +1 -0
- quodeq-0.3.0/src/quodeq/shared/ai_cli.py +29 -0
- quodeq-0.3.0/src/quodeq/shared/defaults.json +12 -0
- quodeq-0.3.0/src/quodeq/shared/logging.py +99 -0
- quodeq-0.3.0/src/quodeq/shared/paths.py +17 -0
- quodeq-0.3.0/src/quodeq/shared/project_resolver.py +135 -0
- quodeq-0.3.0/src/quodeq/shared/repo_handler.py +42 -0
- quodeq-0.3.0/src/quodeq/shared/utils.py +194 -0
- quodeq-0.3.0/src/quodeq/static/assets/index-DJEWz1uh.js +121 -0
- quodeq-0.3.0/src/quodeq/static/assets/index-HYmtGd51.css +1 -0
- quodeq-0.3.0/src/quodeq/static/index.html +16 -0
- quodeq-0.3.0/src/quodeq/static/logo.png +0 -0
quodeq-0.3.0/PKG-INFO
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: quodeq
|
|
3
|
+
Version: 0.3.0
|
|
4
|
+
Summary: Source code quality evaluation platform powered by AI
|
|
5
|
+
Keywords: code-quality,ai,evaluation,iso-25010,static-analysis
|
|
6
|
+
Author: Victor Purcallas Marchesi
|
|
7
|
+
Author-email: Victor Purcallas Marchesi <vpurcallas@gmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
Classifier: Development Status :: 4 - Beta
|
|
10
|
+
Classifier: Environment :: Console
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
16
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
17
|
+
Classifier: Topic :: Software Development :: Testing
|
|
18
|
+
Requires-Dist: jsonschema==4.26.0
|
|
19
|
+
Requires-Dist: flask==3.1.3
|
|
20
|
+
Requires-Python: >=3.12
|
|
21
|
+
Project-URL: Homepage, https://github.com/quodeq/quodeq
|
|
22
|
+
Project-URL: Repository, https://github.com/quodeq/quodeq
|
|
23
|
+
Project-URL: Issues, https://github.com/quodeq/quodeq/issues
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
|
|
26
|
+
<p align="center">
|
|
27
|
+
<picture>
|
|
28
|
+
<source media="(prefers-color-scheme: dark)" srcset="res/quodeq-logo-dark.svg" />
|
|
29
|
+
<img src="res/quodeq-logo.svg" alt="Quodeq" width="340" />
|
|
30
|
+
</picture>
|
|
31
|
+
</p>
|
|
32
|
+
|
|
33
|
+
<h2 align="center">quodeq</h2>
|
|
34
|
+
|
|
35
|
+
<p align="center">
|
|
36
|
+
<em>human aligned quode</em><br>
|
|
37
|
+
<em>quode safe</em><br>
|
|
38
|
+
<em>code with quore</em><br>
|
|
39
|
+
<em>bearing quode with you</em>
|
|
40
|
+
<em>To excellence and beyond</em>
|
|
41
|
+
<em>To excellence and beyond</em>
|
|
42
|
+
<em>AI-driven quality analysis</em>
|
|
43
|
+
</p>
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
Evaluate any repository across six quality dimensions — **Security**, **Reliability**, **Maintainability**, **Performance**, **Flexibility**, and **Usability** — using LLM-driven judgments mapped to CWE classifications. Get actionable insights, not just metrics.
|
|
48
|
+
|
|
49
|
+
## Prerequisites
|
|
50
|
+
|
|
51
|
+
- Python 3.12+
|
|
52
|
+
- [uv](https://docs.astral.sh/uv/) package manager
|
|
53
|
+
- Node.js 18+ (auto-installed for dashboard)
|
|
54
|
+
- An AI CLI client (e.g. [Claude Code](https://docs.anthropic.com/en/docs/claude-code))
|
|
55
|
+
|
|
56
|
+
## Quick Start
|
|
57
|
+
|
|
58
|
+
### Install
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# From PyPI
|
|
62
|
+
pip install quodeq
|
|
63
|
+
|
|
64
|
+
# Or with uv
|
|
65
|
+
uv pip install quodeq
|
|
66
|
+
|
|
67
|
+
# Or with Homebrew
|
|
68
|
+
brew install quodeq/tap/quodeq
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Install from source (development)
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
uv sync
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Run the Dashboard
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
uv run quodeq dashboard
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
This will:
|
|
84
|
+
1. Install npm dependencies and build the web UI (first run only)
|
|
85
|
+
2. Start the Python Action API on an available port (default 8001)
|
|
86
|
+
3. Start the dashboard server on `http://localhost:4173`
|
|
87
|
+
4. Open your browser automatically
|
|
88
|
+
|
|
89
|
+
### Run an Evaluation
|
|
90
|
+
|
|
91
|
+
Evaluations can also be launched directly from the dashboard UI. If you want to run them without the dashboard:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
# Evaluate a local repository (auto-detects language plugin)
|
|
95
|
+
uv run quodeq evaluate /path/to/your/project
|
|
96
|
+
|
|
97
|
+
# Evaluate a remote repository
|
|
98
|
+
uv run quodeq evaluate git@github.com:org/repo.git
|
|
99
|
+
|
|
100
|
+
# Evaluate specific dimensions only
|
|
101
|
+
uv run quodeq evaluate /path/to/project -d security,reliability
|
|
102
|
+
|
|
103
|
+
# Use a specific plugin
|
|
104
|
+
uv run quodeq evaluate /path/to/project -p typescript
|
|
105
|
+
|
|
106
|
+
# Evidence only (skip scoring)
|
|
107
|
+
uv run quodeq evaluate /path/to/project --evidence-only
|
|
108
|
+
|
|
109
|
+
# Limit AI turns or duration per dimension
|
|
110
|
+
uv run quodeq evaluate /path/to/project --max-turns 100 --max-duration 900
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Configure AI Client
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
uv run quodeq configure
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## CLI Reference
|
|
120
|
+
|
|
121
|
+
### `uv run quodeq evaluate`
|
|
122
|
+
|
|
123
|
+
| Flag | Default | Description |
|
|
124
|
+
|------|---------|-------------|
|
|
125
|
+
| `repo` | *(required)* | Path or URL to the repository |
|
|
126
|
+
| `-p, --plugin` | auto-detect | Plugin ID (typescript, python, kotlin, java, bash, mobile_ios) |
|
|
127
|
+
| `-o, --output` | `evaluations` | Reports output directory |
|
|
128
|
+
| `-m, --mode` | `numerical` | Scoring mode: `numerical` or `grades` |
|
|
129
|
+
| `-d, --dimensions` | all | Comma-separated dimensions to evaluate |
|
|
130
|
+
| `--evidence-only` | off | Produce evidence JSON only (skip scoring) |
|
|
131
|
+
| `--max-turns` | 200 | Max AI conversation turns per dimension |
|
|
132
|
+
| `--max-duration` | 1800 | Max seconds per dimension before terminating |
|
|
133
|
+
| `--no-prescan` | off | Skip source-file counting |
|
|
134
|
+
|
|
135
|
+
### `quodeq dashboard`
|
|
136
|
+
|
|
137
|
+
| Flag | Default | Description |
|
|
138
|
+
|------|---------|-------------|
|
|
139
|
+
| `--port` | 4173 | Dashboard server port |
|
|
140
|
+
| `--evaluations` | `evaluations` | Evaluations directory |
|
|
141
|
+
| `--open` | `true` | Open browser automatically (`false` to skip) |
|
|
142
|
+
| `--no-build` | off | Skip web UI build (requires `ui/web/dist`) |
|
|
143
|
+
| `--reinstall` | off | Force reinstall npm dependencies |
|
|
144
|
+
| `--api-host` | auto | Override Action API host |
|
|
145
|
+
| `--api-port` | auto | Override Action API port |
|
|
146
|
+
| `--static-dist` | `ui/web/dist` | Path to built dashboard assets |
|
|
147
|
+
|
|
148
|
+
## Supported Plugins
|
|
149
|
+
|
|
150
|
+
| Plugin | Languages / Frameworks |
|
|
151
|
+
|--------|----------------------|
|
|
152
|
+
| `typescript` | TypeScript, JavaScript |
|
|
153
|
+
| `python` | Python |
|
|
154
|
+
| `kotlin` | Kotlin |
|
|
155
|
+
| `java` | Java |
|
|
156
|
+
| `bash` | Bash, Shell |
|
|
157
|
+
| `mobile_ios` | Swift (iOS) |
|
|
158
|
+
|
|
159
|
+
Each plugin defines which dimensions apply and includes language-specific standards, knowledge bases, and prompt templates under `evaluators/<plugin>/`.
|
|
160
|
+
|
|
161
|
+
## API Endpoints
|
|
162
|
+
|
|
163
|
+
The Action API serves the dashboard and can be used for programmatic access.
|
|
164
|
+
|
|
165
|
+
| Method | Endpoint | Description |
|
|
166
|
+
|--------|----------|-------------|
|
|
167
|
+
| `GET` | `/api/projects` | List all evaluated projects |
|
|
168
|
+
| `GET` | `/api/projects/:project/info` | Project metadata and available dimensions |
|
|
169
|
+
| `GET` | `/api/projects/:project/dashboard` | Dashboard data for latest run |
|
|
170
|
+
| `GET` | `/api/projects/:project/accumulated` | Accumulated scores across runs |
|
|
171
|
+
| `GET` | `/api/projects/:project/export` | Export project data |
|
|
172
|
+
| `GET` | `/api/projects/:project/runs/:run/dimensions/:dim/eval` | Dimension evaluation detail |
|
|
173
|
+
| `GET` | `/api/projects/:project/runs/:run/violations` | Run violations summary |
|
|
174
|
+
| `PATCH` | `/api/projects/:project/path` | Update project local path |
|
|
175
|
+
| `DELETE` | `/api/projects/:project` | Delete project and all data |
|
|
176
|
+
| `GET` | `/api/evaluations` | List running evaluations |
|
|
177
|
+
| `POST` | `/api/evaluations` | Start a new evaluation |
|
|
178
|
+
| `GET` | `/api/evaluations/:jobId` | Evaluation job status |
|
|
179
|
+
| `DELETE` | `/api/evaluations/:jobId` | Cancel a running evaluation |
|
|
180
|
+
| `GET` | `/api/plugins` | List available plugins and dimensions |
|
|
181
|
+
| `GET` | `/api/ai-clients` | List available AI clients |
|
|
182
|
+
| `GET` | `/api/ai-clients/:id/models` | List models for an AI client |
|
|
183
|
+
| `GET` | `/api/browse` | Browse local filesystem |
|
|
184
|
+
| `GET` | `/api/health` | Health check |
|
|
185
|
+
|
|
186
|
+
## Development
|
|
187
|
+
|
|
188
|
+
### Dashboard (dev mode)
|
|
189
|
+
|
|
190
|
+
Start the Action API:
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
uv run python -m quodeq.action_api
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Then in another terminal:
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
cd ui/web
|
|
200
|
+
npm install
|
|
201
|
+
npm run dev
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Open `http://localhost:5173`.
|
|
205
|
+
|
|
206
|
+
### Run Tests
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
uv run pytest
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Project Structure
|
|
213
|
+
|
|
214
|
+
```
|
|
215
|
+
quodeq/
|
|
216
|
+
src/quodeq/ # Python package
|
|
217
|
+
engine/ # Evaluation engine (analysis, scoring, reporting)
|
|
218
|
+
adapters/ # Report parsers, filesystem and web adapters
|
|
219
|
+
config/ # CLI configuration, knowledge refresh, standards
|
|
220
|
+
dashboard/ # Dashboard server and UI build
|
|
221
|
+
data/ # Bundled data (evaluators, standards, prompts)
|
|
222
|
+
evaluators/ # Language plugins (typescript, python, kotlin, java, bash, ios)
|
|
223
|
+
standards/ # ISO 25010, ASVS, CISQ standards with compiled CWE mappings
|
|
224
|
+
prompts/ # LLM prompt templates
|
|
225
|
+
ports/ # Abstract interfaces (Protocol-based)
|
|
226
|
+
provider/ # Action provider (filesystem-backed implementation)
|
|
227
|
+
shared/ # Utilities, logging, paths, defaults
|
|
228
|
+
static/ # Pre-built dashboard UI (generated at build time)
|
|
229
|
+
ui/web/ # React + Vite dashboard (source)
|
|
230
|
+
evaluations/ # Evaluation output (generated)
|
|
231
|
+
tools/ # Standards compiler, migration scripts
|
|
232
|
+
tests/ # Test suite (mirrors src/ structure)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Architecture
|
|
236
|
+
|
|
237
|
+
Quodeq uses a **ports and adapters** architecture:
|
|
238
|
+
|
|
239
|
+
- **Ports** (`ports/`) define abstract interfaces via Python `Protocol` classes
|
|
240
|
+
- **Adapters** (`adapters/`) implement those interfaces for filesystem, web, and hybrid backends
|
|
241
|
+
- **Engine** (`engine/`) orchestrates AI CLI analysis, stream parsing, evidence extraction, and scoring
|
|
242
|
+
- **Provider** (`provider/`) implements the Action API data layer with filesystem-backed storage
|
|
243
|
+
|
|
244
|
+
The evaluation pipeline:
|
|
245
|
+
1. **Plugin detection** — identifies the repository language and loads the matching evaluator
|
|
246
|
+
2. **Prompt building** — assembles standards, knowledge bases, and dimension-specific prompts
|
|
247
|
+
3. **AI analysis** — spawns the AI CLI with MCP tool server for real-time finding extraction
|
|
248
|
+
4. **Evidence collection** — findings stream as JSONL via MCP tool calls
|
|
249
|
+
5. **Scoring** — maps findings to ISO 25010 principles with CWE classifications
|
|
250
|
+
6. **Reporting** — produces per-dimension JSON reports with grades, violations, and compliance
|
|
251
|
+
|
|
252
|
+
## License
|
|
253
|
+
|
|
254
|
+
See [LICENSE](LICENSE).
|
quodeq-0.3.0/README.md
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="res/quodeq-logo-dark.svg" />
|
|
4
|
+
<img src="res/quodeq-logo.svg" alt="Quodeq" width="340" />
|
|
5
|
+
</picture>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<h2 align="center">quodeq</h2>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<em>human aligned quode</em><br>
|
|
12
|
+
<em>quode safe</em><br>
|
|
13
|
+
<em>code with quore</em><br>
|
|
14
|
+
<em>bearing quode with you</em>
|
|
15
|
+
<em>To excellence and beyond</em>
|
|
16
|
+
<em>To excellence and beyond</em>
|
|
17
|
+
<em>AI-driven quality analysis</em>
|
|
18
|
+
</p>
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
Evaluate any repository across six quality dimensions — **Security**, **Reliability**, **Maintainability**, **Performance**, **Flexibility**, and **Usability** — using LLM-driven judgments mapped to CWE classifications. Get actionable insights, not just metrics.
|
|
23
|
+
|
|
24
|
+
## Prerequisites
|
|
25
|
+
|
|
26
|
+
- Python 3.12+
|
|
27
|
+
- [uv](https://docs.astral.sh/uv/) package manager
|
|
28
|
+
- Node.js 18+ (auto-installed for dashboard)
|
|
29
|
+
- An AI CLI client (e.g. [Claude Code](https://docs.anthropic.com/en/docs/claude-code))
|
|
30
|
+
|
|
31
|
+
## Quick Start
|
|
32
|
+
|
|
33
|
+
### Install
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# From PyPI
|
|
37
|
+
pip install quodeq
|
|
38
|
+
|
|
39
|
+
# Or with uv
|
|
40
|
+
uv pip install quodeq
|
|
41
|
+
|
|
42
|
+
# Or with Homebrew
|
|
43
|
+
brew install quodeq/tap/quodeq
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Install from source (development)
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
uv sync
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Run the Dashboard
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
uv run quodeq dashboard
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
This will:
|
|
59
|
+
1. Install npm dependencies and build the web UI (first run only)
|
|
60
|
+
2. Start the Python Action API on an available port (default 8001)
|
|
61
|
+
3. Start the dashboard server on `http://localhost:4173`
|
|
62
|
+
4. Open your browser automatically
|
|
63
|
+
|
|
64
|
+
### Run an Evaluation
|
|
65
|
+
|
|
66
|
+
Evaluations can also be launched directly from the dashboard UI. If you want to run them without the dashboard:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
# Evaluate a local repository (auto-detects language plugin)
|
|
70
|
+
uv run quodeq evaluate /path/to/your/project
|
|
71
|
+
|
|
72
|
+
# Evaluate a remote repository
|
|
73
|
+
uv run quodeq evaluate git@github.com:org/repo.git
|
|
74
|
+
|
|
75
|
+
# Evaluate specific dimensions only
|
|
76
|
+
uv run quodeq evaluate /path/to/project -d security,reliability
|
|
77
|
+
|
|
78
|
+
# Use a specific plugin
|
|
79
|
+
uv run quodeq evaluate /path/to/project -p typescript
|
|
80
|
+
|
|
81
|
+
# Evidence only (skip scoring)
|
|
82
|
+
uv run quodeq evaluate /path/to/project --evidence-only
|
|
83
|
+
|
|
84
|
+
# Limit AI turns or duration per dimension
|
|
85
|
+
uv run quodeq evaluate /path/to/project --max-turns 100 --max-duration 900
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Configure AI Client
|
|
89
|
+
|
|
90
|
+
```bash
|
|
91
|
+
uv run quodeq configure
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## CLI Reference
|
|
95
|
+
|
|
96
|
+
### `uv run quodeq evaluate`
|
|
97
|
+
|
|
98
|
+
| Flag | Default | Description |
|
|
99
|
+
|------|---------|-------------|
|
|
100
|
+
| `repo` | *(required)* | Path or URL to the repository |
|
|
101
|
+
| `-p, --plugin` | auto-detect | Plugin ID (typescript, python, kotlin, java, bash, mobile_ios) |
|
|
102
|
+
| `-o, --output` | `evaluations` | Reports output directory |
|
|
103
|
+
| `-m, --mode` | `numerical` | Scoring mode: `numerical` or `grades` |
|
|
104
|
+
| `-d, --dimensions` | all | Comma-separated dimensions to evaluate |
|
|
105
|
+
| `--evidence-only` | off | Produce evidence JSON only (skip scoring) |
|
|
106
|
+
| `--max-turns` | 200 | Max AI conversation turns per dimension |
|
|
107
|
+
| `--max-duration` | 1800 | Max seconds per dimension before terminating |
|
|
108
|
+
| `--no-prescan` | off | Skip source-file counting |
|
|
109
|
+
|
|
110
|
+
### `quodeq dashboard`
|
|
111
|
+
|
|
112
|
+
| Flag | Default | Description |
|
|
113
|
+
|------|---------|-------------|
|
|
114
|
+
| `--port` | 4173 | Dashboard server port |
|
|
115
|
+
| `--evaluations` | `evaluations` | Evaluations directory |
|
|
116
|
+
| `--open` | `true` | Open browser automatically (`false` to skip) |
|
|
117
|
+
| `--no-build` | off | Skip web UI build (requires `ui/web/dist`) |
|
|
118
|
+
| `--reinstall` | off | Force reinstall npm dependencies |
|
|
119
|
+
| `--api-host` | auto | Override Action API host |
|
|
120
|
+
| `--api-port` | auto | Override Action API port |
|
|
121
|
+
| `--static-dist` | `ui/web/dist` | Path to built dashboard assets |
|
|
122
|
+
|
|
123
|
+
## Supported Plugins
|
|
124
|
+
|
|
125
|
+
| Plugin | Languages / Frameworks |
|
|
126
|
+
|--------|----------------------|
|
|
127
|
+
| `typescript` | TypeScript, JavaScript |
|
|
128
|
+
| `python` | Python |
|
|
129
|
+
| `kotlin` | Kotlin |
|
|
130
|
+
| `java` | Java |
|
|
131
|
+
| `bash` | Bash, Shell |
|
|
132
|
+
| `mobile_ios` | Swift (iOS) |
|
|
133
|
+
|
|
134
|
+
Each plugin defines which dimensions apply and includes language-specific standards, knowledge bases, and prompt templates under `evaluators/<plugin>/`.
|
|
135
|
+
|
|
136
|
+
## API Endpoints
|
|
137
|
+
|
|
138
|
+
The Action API serves the dashboard and can be used for programmatic access.
|
|
139
|
+
|
|
140
|
+
| Method | Endpoint | Description |
|
|
141
|
+
|--------|----------|-------------|
|
|
142
|
+
| `GET` | `/api/projects` | List all evaluated projects |
|
|
143
|
+
| `GET` | `/api/projects/:project/info` | Project metadata and available dimensions |
|
|
144
|
+
| `GET` | `/api/projects/:project/dashboard` | Dashboard data for latest run |
|
|
145
|
+
| `GET` | `/api/projects/:project/accumulated` | Accumulated scores across runs |
|
|
146
|
+
| `GET` | `/api/projects/:project/export` | Export project data |
|
|
147
|
+
| `GET` | `/api/projects/:project/runs/:run/dimensions/:dim/eval` | Dimension evaluation detail |
|
|
148
|
+
| `GET` | `/api/projects/:project/runs/:run/violations` | Run violations summary |
|
|
149
|
+
| `PATCH` | `/api/projects/:project/path` | Update project local path |
|
|
150
|
+
| `DELETE` | `/api/projects/:project` | Delete project and all data |
|
|
151
|
+
| `GET` | `/api/evaluations` | List running evaluations |
|
|
152
|
+
| `POST` | `/api/evaluations` | Start a new evaluation |
|
|
153
|
+
| `GET` | `/api/evaluations/:jobId` | Evaluation job status |
|
|
154
|
+
| `DELETE` | `/api/evaluations/:jobId` | Cancel a running evaluation |
|
|
155
|
+
| `GET` | `/api/plugins` | List available plugins and dimensions |
|
|
156
|
+
| `GET` | `/api/ai-clients` | List available AI clients |
|
|
157
|
+
| `GET` | `/api/ai-clients/:id/models` | List models for an AI client |
|
|
158
|
+
| `GET` | `/api/browse` | Browse local filesystem |
|
|
159
|
+
| `GET` | `/api/health` | Health check |
|
|
160
|
+
|
|
161
|
+
## Development
|
|
162
|
+
|
|
163
|
+
### Dashboard (dev mode)
|
|
164
|
+
|
|
165
|
+
Start the Action API:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
uv run python -m quodeq.action_api
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Then in another terminal:
|
|
172
|
+
|
|
173
|
+
```bash
|
|
174
|
+
cd ui/web
|
|
175
|
+
npm install
|
|
176
|
+
npm run dev
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Open `http://localhost:5173`.
|
|
180
|
+
|
|
181
|
+
### Run Tests
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
uv run pytest
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Project Structure
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
quodeq/
|
|
191
|
+
src/quodeq/ # Python package
|
|
192
|
+
engine/ # Evaluation engine (analysis, scoring, reporting)
|
|
193
|
+
adapters/ # Report parsers, filesystem and web adapters
|
|
194
|
+
config/ # CLI configuration, knowledge refresh, standards
|
|
195
|
+
dashboard/ # Dashboard server and UI build
|
|
196
|
+
data/ # Bundled data (evaluators, standards, prompts)
|
|
197
|
+
evaluators/ # Language plugins (typescript, python, kotlin, java, bash, ios)
|
|
198
|
+
standards/ # ISO 25010, ASVS, CISQ standards with compiled CWE mappings
|
|
199
|
+
prompts/ # LLM prompt templates
|
|
200
|
+
ports/ # Abstract interfaces (Protocol-based)
|
|
201
|
+
provider/ # Action provider (filesystem-backed implementation)
|
|
202
|
+
shared/ # Utilities, logging, paths, defaults
|
|
203
|
+
static/ # Pre-built dashboard UI (generated at build time)
|
|
204
|
+
ui/web/ # React + Vite dashboard (source)
|
|
205
|
+
evaluations/ # Evaluation output (generated)
|
|
206
|
+
tools/ # Standards compiler, migration scripts
|
|
207
|
+
tests/ # Test suite (mirrors src/ structure)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Architecture
|
|
211
|
+
|
|
212
|
+
Quodeq uses a **ports and adapters** architecture:
|
|
213
|
+
|
|
214
|
+
- **Ports** (`ports/`) define abstract interfaces via Python `Protocol` classes
|
|
215
|
+
- **Adapters** (`adapters/`) implement those interfaces for filesystem, web, and hybrid backends
|
|
216
|
+
- **Engine** (`engine/`) orchestrates AI CLI analysis, stream parsing, evidence extraction, and scoring
|
|
217
|
+
- **Provider** (`provider/`) implements the Action API data layer with filesystem-backed storage
|
|
218
|
+
|
|
219
|
+
The evaluation pipeline:
|
|
220
|
+
1. **Plugin detection** — identifies the repository language and loads the matching evaluator
|
|
221
|
+
2. **Prompt building** — assembles standards, knowledge bases, and dimension-specific prompts
|
|
222
|
+
3. **AI analysis** — spawns the AI CLI with MCP tool server for real-time finding extraction
|
|
223
|
+
4. **Evidence collection** — findings stream as JSONL via MCP tool calls
|
|
224
|
+
5. **Scoring** — maps findings to ISO 25010 principles with CWE classifications
|
|
225
|
+
6. **Reporting** — produces per-dimension JSON reports with grades, violations, and compliance
|
|
226
|
+
|
|
227
|
+
## License
|
|
228
|
+
|
|
229
|
+
See [LICENSE](LICENSE).
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "quodeq"
|
|
3
|
+
version = "0.3.0"
|
|
4
|
+
description = "Source code quality evaluation platform powered by AI"
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
authors = [
|
|
8
|
+
{ name = "Victor Purcallas Marchesi", email = "vpurcallas@gmail.com" }
|
|
9
|
+
]
|
|
10
|
+
requires-python = ">=3.12"
|
|
11
|
+
keywords = ["code-quality", "ai", "evaluation", "iso-25010", "static-analysis"]
|
|
12
|
+
classifiers = [
|
|
13
|
+
"Development Status :: 4 - Beta",
|
|
14
|
+
"Environment :: Console",
|
|
15
|
+
"Intended Audience :: Developers",
|
|
16
|
+
"License :: OSI Approved :: MIT License",
|
|
17
|
+
"Programming Language :: Python :: 3",
|
|
18
|
+
"Programming Language :: Python :: 3.12",
|
|
19
|
+
"Programming Language :: Python :: 3.13",
|
|
20
|
+
"Topic :: Software Development :: Quality Assurance",
|
|
21
|
+
"Topic :: Software Development :: Testing",
|
|
22
|
+
]
|
|
23
|
+
dependencies = [
|
|
24
|
+
"jsonschema==4.26.0",
|
|
25
|
+
"flask==3.1.3",
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
[project.urls]
|
|
29
|
+
Homepage = "https://github.com/quodeq/quodeq"
|
|
30
|
+
Repository = "https://github.com/quodeq/quodeq"
|
|
31
|
+
Issues = "https://github.com/quodeq/quodeq/issues"
|
|
32
|
+
|
|
33
|
+
[dependency-groups]
|
|
34
|
+
dev = [
|
|
35
|
+
"pytest==9.0.2",
|
|
36
|
+
"pytest-cov>=6.0",
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
[project.scripts]
|
|
40
|
+
quodeq = "quodeq:main"
|
|
41
|
+
|
|
42
|
+
[tool.mypy]
|
|
43
|
+
strict = true
|
|
44
|
+
python_version = "3.12"
|
|
45
|
+
warn_return_any = true
|
|
46
|
+
warn_unused_configs = true
|
|
47
|
+
|
|
48
|
+
[tool.pytest.ini_options]
|
|
49
|
+
testpaths = ["tests"]
|
|
50
|
+
|
|
51
|
+
[tool.coverage.run]
|
|
52
|
+
source = ["quodeq"]
|
|
53
|
+
|
|
54
|
+
[tool.coverage.report]
|
|
55
|
+
fail_under = 60
|
|
56
|
+
|
|
57
|
+
[build-system]
|
|
58
|
+
requires = ["uv_build>=0.10.6,<0.11.0"]
|
|
59
|
+
build-backend = "uv_build"
|
|
60
|
+
|
|
61
|
+
[tool.uv-build]
|
|
62
|
+
# Include web UI source in the sdist (for building from source)
|
|
63
|
+
source-include = ["ui/web/"]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"""Quodeq package entry point."""
|
|
2
|
+
|
|
3
|
+
from importlib.metadata import version as _pkg_version, PackageNotFoundError
|
|
4
|
+
|
|
5
|
+
from quodeq.provider.base import ActionProvider
|
|
6
|
+
|
|
7
|
+
try:
|
|
8
|
+
__version__: str | None = _pkg_version("quodeq")
|
|
9
|
+
except PackageNotFoundError:
|
|
10
|
+
__version__ = None
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def main() -> None:
|
|
14
|
+
"""Launch the Quodeq CLI."""
|
|
15
|
+
from quodeq.cli import main as cli_main
|
|
16
|
+
|
|
17
|
+
raise SystemExit(cli_main())
|