2026-06-17 21:13:51 +02:00
|
|
|
[build-system]
|
|
|
|
|
requires = ["uv_build>=0.8.13,<0.9.0"]
|
|
|
|
|
build-backend = "uv_build"
|
|
|
|
|
|
|
|
|
|
[project]
|
|
|
|
|
name = "openultrasast"
|
2026-10-02 20:18:39 +02:00
|
|
|
version = "2.0.1"
|
2026-06-17 21:13:51 +02:00
|
|
|
description = "OpenCode-oriented SAST harness for evidence-gated security analysis"
|
|
|
|
|
readme = "README.md"
|
2026-10-02 20:18:39 +02:00
|
|
|
license = "Apache-2.0"
|
|
|
|
|
license-files = ["LICENSE"]
|
2026-06-17 21:13:51 +02:00
|
|
|
requires-python = ">=3.11"
|
2026-09-29 17:44:31 +02:00
|
|
|
dependencies = ["pyyaml>=6.0"]
|
2026-06-17 21:13:51 +02:00
|
|
|
|
2026-06-22 16:08:43 +02:00
|
|
|
[project.optional-dependencies]
|
2026-10-13 12:33:58 +02:00
|
|
|
# Hunter learning research only; the core install stays PyYAML.
|
2026-10-13 12:43:02 +02:00
|
|
|
hunt = [
|
|
|
|
|
"dspy>=3.4,<3.5",
|
|
|
|
|
"pandas>=2.2,<3",
|
|
|
|
|
"scipy>=1.13,<2",
|
|
|
|
|
"scikit-learn>=1.6,<2",
|
|
|
|
|
"statsmodels>=0.14,<1",
|
|
|
|
|
]
|
2026-10-02 08:17:40 +02:00
|
|
|
# The documentation site (mkdocs.yml, docs/). Mermaid renders client-side through Material's superfences fence.
|
|
|
|
|
docs = [
|
|
|
|
|
"mkdocs>=1.6,<2",
|
|
|
|
|
"mkdocs-material>=9.5,<10",
|
|
|
|
|
]
|
2026-10-02 10:15:19 +02:00
|
|
|
# The plane's memory store on an S3-compatible bucket (OUSAST_MEMORY=s3://<bucket>, plane/memory.py; RustFS is the
|
|
|
|
|
# tested server). Imported lazily; the core install and the file store need nothing beyond PyYAML.
|
|
|
|
|
s3 = [
|
|
|
|
|
"boto3>=1.35,<2",
|
2026-09-30 11:10:28 +02:00
|
|
|
]
|
2026-09-04 15:07:35 +02:00
|
|
|
# Structured parse for overlay (JS/C/C++/Java/Python). Core install stays empty.
|
|
|
|
|
# Wheels are MIT; import is lazy via openultrasast.semantic.extra.
|
|
|
|
|
semantic = [
|
|
|
|
|
"tree-sitter>=0.23,<0.27",
|
|
|
|
|
"tree-sitter-python>=0.23",
|
|
|
|
|
"tree-sitter-javascript>=0.23",
|
2026-09-06 09:17:01 +02:00
|
|
|
"tree-sitter-typescript>=0.23",
|
2026-09-04 15:07:35 +02:00
|
|
|
"tree-sitter-c>=0.23",
|
|
|
|
|
"tree-sitter-cpp>=0.23",
|
|
|
|
|
"tree-sitter-java>=0.23",
|
|
|
|
|
]
|
2026-06-22 16:08:43 +02:00
|
|
|
|
2026-06-17 21:13:51 +02:00
|
|
|
[project.scripts]
|
|
|
|
|
ousast = "openultrasast.cli:main"
|
|
|
|
|
|
|
|
|
|
[tool.pytest.ini_options]
|
|
|
|
|
testpaths = ["tests"]
|
|
|
|
|
pythonpath = ["src"]
|
2026-09-04 15:07:35 +02:00
|
|
|
markers = [
|
|
|
|
|
"docker: requires a docker daemon",
|
|
|
|
|
"semantic: requires openultrasast[semantic] tree-sitter extra",
|
2026-09-29 18:10:09 +02:00
|
|
|
"ax: requires the live ax cluster of ops/ax/up.sh (skipped unless `ousast plane doctor` passes)",
|
2026-09-04 15:07:35 +02:00
|
|
|
]
|
2026-06-17 21:13:51 +02:00
|
|
|
|
2026-06-18 10:06:21 +02:00
|
|
|
[tool.ruff]
|
|
|
|
|
line-length = 140
|
|
|
|
|
target-version = "py311"
|
2026-06-21 14:17:22 +02:00
|
|
|
# Benchmark fixtures are intentionally vulnerable, unformatted sample corpora;
|
|
|
|
|
# linting/formatting them would flag the planted bugs and shift ground-truth lines.
|
2026-09-04 13:57:33 +02:00
|
|
|
extend-exclude = ["benchmarks/fixtures", "benchmarks/pairs"]
|
2026-06-18 10:06:21 +02:00
|
|
|
|
|
|
|
|
[tool.ruff.lint]
|
|
|
|
|
select = ["B", "E", "F", "I", "SIM", "UP"]
|
|
|
|
|
|
|
|
|
|
[tool.mypy]
|
|
|
|
|
python_version = "3.11"
|
|
|
|
|
files = ["src/openultrasast"]
|
|
|
|
|
check_untyped_defs = true
|
|
|
|
|
disallow_untyped_defs = true
|
|
|
|
|
no_implicit_optional = true
|
|
|
|
|
warn_redundant_casts = true
|
|
|
|
|
warn_return_any = true
|
|
|
|
|
warn_unused_configs = true
|
|
|
|
|
|
2026-09-04 15:07:35 +02:00
|
|
|
[[tool.mypy.overrides]]
|
|
|
|
|
module = "tree_sitter"
|
|
|
|
|
ignore_missing_imports = true
|
|
|
|
|
|
2026-10-02 10:15:19 +02:00
|
|
|
# boto3 is an optional extra without inline types, absent in the type-check environment (plane/memory.py imports
|
|
|
|
|
# it lazily).
|
2026-09-30 11:10:28 +02:00
|
|
|
[[tool.mypy.overrides]]
|
2026-10-02 10:15:19 +02:00
|
|
|
module = ["boto3", "botocore.*"]
|
2026-09-30 11:10:28 +02:00
|
|
|
ignore_missing_imports = true
|
|
|
|
|
|
2026-09-29 17:44:31 +02:00
|
|
|
# PyYAML ships no inline types and types-PyYAML is not a dev dependency.
|
|
|
|
|
[[tool.mypy.overrides]]
|
|
|
|
|
module = "yaml"
|
|
|
|
|
ignore_missing_imports = true
|
|
|
|
|
|
2026-10-14 03:03:12 +02:00
|
|
|
# dspy, pandas, statsmodels and scikit-learn ship no py.typed marker and no stub packages are dev dependencies.
|
|
|
|
|
[[tool.mypy.overrides]]
|
|
|
|
|
module = ["dspy", "dspy.*", "pandas", "pandas.*", "statsmodels.*", "sklearn.*"]
|
|
|
|
|
ignore_missing_imports = true
|
|
|
|
|
|
|
|
|
|
# The hunt package reaches the benchmark scorers and manifests lazily. benchmarks/ is not in `files` and has never
|
|
|
|
|
# been type-checked; src stays strict against its signatures while errors inside benchmarks/ are not reported.
|
|
|
|
|
[[tool.mypy.overrides]]
|
|
|
|
|
module = "benchmarks.*"
|
|
|
|
|
follow_imports = "silent"
|
|
|
|
|
|
2026-06-17 21:13:51 +02:00
|
|
|
[dependency-groups]
|
|
|
|
|
dev = [
|
2026-06-18 10:06:21 +02:00
|
|
|
"dagger-io>=0.21.7",
|
|
|
|
|
"mypy>=2.1.0",
|
|
|
|
|
"pre-commit>=4.6.0",
|
2026-06-17 21:13:51 +02:00
|
|
|
"pytest>=8",
|
2026-06-18 10:06:21 +02:00
|
|
|
"ruff>=0.15.17",
|
2026-06-17 21:13:51 +02:00
|
|
|
]
|