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.
Files changed (149) hide show
  1. quodeq-0.3.0/PKG-INFO +254 -0
  2. quodeq-0.3.0/README.md +229 -0
  3. quodeq-0.3.0/pyproject.toml +63 -0
  4. quodeq-0.3.0/src/quodeq/__init__.py +17 -0
  5. quodeq-0.3.0/src/quodeq/action_api.py +146 -0
  6. quodeq-0.3.0/src/quodeq/action_api_routes.py +301 -0
  7. quodeq-0.3.0/src/quodeq/adapters/__init__.py +0 -0
  8. quodeq-0.3.0/src/quodeq/adapters/fs/__init__.py +0 -0
  9. quodeq-0.3.0/src/quodeq/adapters/fs/dimensions_repository.py +32 -0
  10. quodeq-0.3.0/src/quodeq/adapters/fs/evaluations_repository.py +32 -0
  11. quodeq-0.3.0/src/quodeq/adapters/fs/evaluators_repository.py +32 -0
  12. quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/__init__.py +54 -0
  13. quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/grades.py +98 -0
  14. quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/json_parser.py +181 -0
  15. quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/markdown.py +103 -0
  16. quodeq-0.3.0/src/quodeq/adapters/fs/report_parser/runs.py +236 -0
  17. quodeq-0.3.0/src/quodeq/adapters/hybrid/__init__.py +0 -0
  18. quodeq-0.3.0/src/quodeq/adapters/hybrid/_hybrid_call.py +17 -0
  19. quodeq-0.3.0/src/quodeq/adapters/hybrid/dimensions_repository.py +22 -0
  20. quodeq-0.3.0/src/quodeq/adapters/hybrid/evaluations_repository.py +22 -0
  21. quodeq-0.3.0/src/quodeq/adapters/hybrid/evaluators_repository.py +22 -0
  22. quodeq-0.3.0/src/quodeq/adapters/web/__init__.py +0 -0
  23. quodeq-0.3.0/src/quodeq/adapters/web/base_repository.py +28 -0
  24. quodeq-0.3.0/src/quodeq/adapters/web/dimensions_repository.py +16 -0
  25. quodeq-0.3.0/src/quodeq/adapters/web/evaluations_repository.py +16 -0
  26. quodeq-0.3.0/src/quodeq/adapters/web/evaluators_repository.py +16 -0
  27. quodeq-0.3.0/src/quodeq/adapters/web/http_client.py +112 -0
  28. quodeq-0.3.0/src/quodeq/bootstrap.py +29 -0
  29. quodeq-0.3.0/src/quodeq/cli.py +243 -0
  30. quodeq-0.3.0/src/quodeq/config/__init__.py +1 -0
  31. quodeq-0.3.0/src/quodeq/config/actions.py +149 -0
  32. quodeq-0.3.0/src/quodeq/config/ai_defaults.json +7 -0
  33. quodeq-0.3.0/src/quodeq/config/ai_provider.py +58 -0
  34. quodeq-0.3.0/src/quodeq/config/cli.py +87 -0
  35. quodeq-0.3.0/src/quodeq/config/coverage.py +28 -0
  36. quodeq-0.3.0/src/quodeq/config/dimensions.py +34 -0
  37. quodeq-0.3.0/src/quodeq/config/discipline_registry.py +224 -0
  38. quodeq-0.3.0/src/quodeq/config/disciplines.py +44 -0
  39. quodeq-0.3.0/src/quodeq/config/evaluators.py +42 -0
  40. quodeq-0.3.0/src/quodeq/config/knowledge_refresh.py +227 -0
  41. quodeq-0.3.0/src/quodeq/config/linter_sources.json +8 -0
  42. quodeq-0.3.0/src/quodeq/config/paths.py +74 -0
  43. quodeq-0.3.0/src/quodeq/config/prompt_templates.py +11 -0
  44. quodeq-0.3.0/src/quodeq/config/refresh_templates/analysis.md +24 -0
  45. quodeq-0.3.0/src/quodeq/config/refresh_templates/practices.md +28 -0
  46. quodeq-0.3.0/src/quodeq/config/scaffold.py +116 -0
  47. quodeq-0.3.0/src/quodeq/config/sources.py +8 -0
  48. quodeq-0.3.0/src/quodeq/config/standards_fetcher.py +100 -0
  49. quodeq-0.3.0/src/quodeq/config/validation.py +18 -0
  50. quodeq-0.3.0/src/quodeq/dashboard/__init__.py +0 -0
  51. quodeq-0.3.0/src/quodeq/dashboard/_build.py +71 -0
  52. quodeq-0.3.0/src/quodeq/dashboard/_config.py +64 -0
  53. quodeq-0.3.0/src/quodeq/dashboard/cli.py +78 -0
  54. quodeq-0.3.0/src/quodeq/dashboard/runner.py +265 -0
  55. quodeq-0.3.0/src/quodeq/data/config/disciplines.conf +130 -0
  56. quodeq-0.3.0/src/quodeq/data/evaluators/bash/dimensions.json +40 -0
  57. quodeq-0.3.0/src/quodeq/data/evaluators/bash/knowledge/analysis.md +22 -0
  58. quodeq-0.3.0/src/quodeq/data/evaluators/bash/plugin.json +10 -0
  59. quodeq-0.3.0/src/quodeq/data/evaluators/java/dimensions.json +40 -0
  60. quodeq-0.3.0/src/quodeq/data/evaluators/java/knowledge/analysis.md +23 -0
  61. quodeq-0.3.0/src/quodeq/data/evaluators/java/plugin.json +10 -0
  62. quodeq-0.3.0/src/quodeq/data/evaluators/kotlin/dimensions.json +40 -0
  63. quodeq-0.3.0/src/quodeq/data/evaluators/kotlin/knowledge/analysis.md +23 -0
  64. quodeq-0.3.0/src/quodeq/data/evaluators/kotlin/plugin.json +10 -0
  65. quodeq-0.3.0/src/quodeq/data/evaluators/mobile_ios/dimensions.json +40 -0
  66. quodeq-0.3.0/src/quodeq/data/evaluators/mobile_ios/knowledge/analysis.md +23 -0
  67. quodeq-0.3.0/src/quodeq/data/evaluators/mobile_ios/plugin.json +10 -0
  68. quodeq-0.3.0/src/quodeq/data/evaluators/python/dimensions.json +40 -0
  69. quodeq-0.3.0/src/quodeq/data/evaluators/python/knowledge/analysis.md +24 -0
  70. quodeq-0.3.0/src/quodeq/data/evaluators/python/plugin.json +10 -0
  71. quodeq-0.3.0/src/quodeq/data/evaluators/typescript/dimensions.json +40 -0
  72. quodeq-0.3.0/src/quodeq/data/evaluators/typescript/knowledge/analysis.md +38 -0
  73. quodeq-0.3.0/src/quodeq/data/evaluators/typescript/plugin.json +11 -0
  74. quodeq-0.3.0/src/quodeq/data/prompts/compass.md +104 -0
  75. quodeq-0.3.0/src/quodeq/data/prompts/subagent.md +44 -0
  76. quodeq-0.3.0/src/quodeq/data/standards/asvs/level1.json +1159 -0
  77. quodeq-0.3.0/src/quodeq/data/standards/cert/reliability.json +178 -0
  78. quodeq-0.3.0/src/quodeq/data/standards/cisq/maintainability.json +24 -0
  79. quodeq-0.3.0/src/quodeq/data/standards/cisq/performance.json +18 -0
  80. quodeq-0.3.0/src/quodeq/data/standards/cisq/reliability.json +21 -0
  81. quodeq-0.3.0/src/quodeq/data/standards/cisq/security.json +26 -0
  82. quodeq-0.3.0/src/quodeq/data/standards/compiled/flexibility.json +273 -0
  83. quodeq-0.3.0/src/quodeq/data/standards/compiled/maintainability.json +1291 -0
  84. quodeq-0.3.0/src/quodeq/data/standards/compiled/performance.json +508 -0
  85. quodeq-0.3.0/src/quodeq/data/standards/compiled/reliability.json +989 -0
  86. quodeq-0.3.0/src/quodeq/data/standards/compiled/security.json +3050 -0
  87. quodeq-0.3.0/src/quodeq/data/standards/compiled/usability.json +409 -0
  88. quodeq-0.3.0/src/quodeq/data/standards/cwe/audit.json +4876 -0
  89. quodeq-0.3.0/src/quodeq/data/standards/iso25010/flexibility.json +44 -0
  90. quodeq-0.3.0/src/quodeq/data/standards/iso25010/maintainability.json +442 -0
  91. quodeq-0.3.0/src/quodeq/data/standards/iso25010/performance.json +191 -0
  92. quodeq-0.3.0/src/quodeq/data/standards/iso25010/reliability.json +310 -0
  93. quodeq-0.3.0/src/quodeq/data/standards/iso25010/security.json +743 -0
  94. quodeq-0.3.0/src/quodeq/data/standards/iso25010/usability.json +59 -0
  95. quodeq-0.3.0/src/quodeq/data/standards/wcag/level_a.json +117 -0
  96. quodeq-0.3.0/src/quodeq/engine/__init__.py +1 -0
  97. quodeq-0.3.0/src/quodeq/engine/_event_text.py +43 -0
  98. quodeq-0.3.0/src/quodeq/engine/_merge.py +43 -0
  99. quodeq-0.3.0/src/quodeq/engine/_runner_report.py +33 -0
  100. quodeq-0.3.0/src/quodeq/engine/analysis.py +363 -0
  101. quodeq-0.3.0/src/quodeq/engine/evidence.py +120 -0
  102. quodeq-0.3.0/src/quodeq/engine/evidence_parser.py +229 -0
  103. quodeq-0.3.0/src/quodeq/engine/file_queue.py +165 -0
  104. quodeq-0.3.0/src/quodeq/engine/mcp_findings.py +317 -0
  105. quodeq-0.3.0/src/quodeq/engine/plugin_detector.py +107 -0
  106. quodeq-0.3.0/src/quodeq/engine/plugin_loader.py +105 -0
  107. quodeq-0.3.0/src/quodeq/engine/prompt_builder.py +135 -0
  108. quodeq-0.3.0/src/quodeq/engine/report.py +185 -0
  109. quodeq-0.3.0/src/quodeq/engine/runner.py +393 -0
  110. quodeq-0.3.0/src/quodeq/engine/sa_manager.py +4 -0
  111. quodeq-0.3.0/src/quodeq/engine/schema_validator.py +65 -0
  112. quodeq-0.3.0/src/quodeq/engine/schemas/__init__.py +0 -0
  113. quodeq-0.3.0/src/quodeq/engine/schemas/dimensions_schema.json +28 -0
  114. quodeq-0.3.0/src/quodeq/engine/schemas/plugin_schema.json +36 -0
  115. quodeq-0.3.0/src/quodeq/engine/scoring.py +300 -0
  116. quodeq-0.3.0/src/quodeq/engine/scoring_internals.py +324 -0
  117. quodeq-0.3.0/src/quodeq/engine/standards.py +42 -0
  118. quodeq-0.3.0/src/quodeq/engine/stream_parser.py +96 -0
  119. quodeq-0.3.0/src/quodeq/engine/stream_validation.py +42 -0
  120. quodeq-0.3.0/src/quodeq/engine/subagent_pool.py +284 -0
  121. quodeq-0.3.0/src/quodeq/ports/__init__.py +0 -0
  122. quodeq-0.3.0/src/quodeq/ports/data_errors.py +27 -0
  123. quodeq-0.3.0/src/quodeq/ports/dimensions.py +15 -0
  124. quodeq-0.3.0/src/quodeq/ports/evaluations.py +15 -0
  125. quodeq-0.3.0/src/quodeq/ports/evaluators.py +16 -0
  126. quodeq-0.3.0/src/quodeq/provider/__init__.py +19 -0
  127. quodeq-0.3.0/src/quodeq/provider/accumulated.py +189 -0
  128. quodeq-0.3.0/src/quodeq/provider/base.py +91 -0
  129. quodeq-0.3.0/src/quodeq/provider/dashboard.py +248 -0
  130. quodeq-0.3.0/src/quodeq/provider/evaluation_mixin.py +93 -0
  131. quodeq-0.3.0/src/quodeq/provider/filesystem.py +283 -0
  132. quodeq-0.3.0/src/quodeq/provider/jobs.py +199 -0
  133. quodeq-0.3.0/src/quodeq/provider/plugin_discovery.py +51 -0
  134. quodeq-0.3.0/src/quodeq/provider/tooling_mixin.py +133 -0
  135. quodeq-0.3.0/src/quodeq/provider/violation_context.py +61 -0
  136. quodeq-0.3.0/src/quodeq/provider/violations.py +74 -0
  137. quodeq-0.3.0/src/quodeq/provider/violations_parsing.py +231 -0
  138. quodeq-0.3.0/src/quodeq/shared/__init__.py +1 -0
  139. quodeq-0.3.0/src/quodeq/shared/ai_cli.py +29 -0
  140. quodeq-0.3.0/src/quodeq/shared/defaults.json +12 -0
  141. quodeq-0.3.0/src/quodeq/shared/logging.py +99 -0
  142. quodeq-0.3.0/src/quodeq/shared/paths.py +17 -0
  143. quodeq-0.3.0/src/quodeq/shared/project_resolver.py +135 -0
  144. quodeq-0.3.0/src/quodeq/shared/repo_handler.py +42 -0
  145. quodeq-0.3.0/src/quodeq/shared/utils.py +194 -0
  146. quodeq-0.3.0/src/quodeq/static/assets/index-DJEWz1uh.js +121 -0
  147. quodeq-0.3.0/src/quodeq/static/assets/index-HYmtGd51.css +1 -0
  148. quodeq-0.3.0/src/quodeq/static/index.html +16 -0
  149. 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())