-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpyproject.toml
More file actions
132 lines (120 loc) · 5.32 KB
/
Copy pathpyproject.toml
File metadata and controls
132 lines (120 loc) · 5.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
[project]
name = "bounded-loops"
version = "0.6.4"
description = "A graph engine for reliable AI agents: a DAG of independently-gated bounded loops (68-loop catalog, 64 keyless) with no-secret connectors and receipt-backed audit trails."
readme = "README.md"
requires-python = ">=3.11"
license = { text = "Apache-2.0" }
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Topic :: Software Development :: Libraries :: Python Modules",
"Topic :: Scientific/Engineering :: Artificial Intelligence",
]
dependencies = [
"pyyaml>=6.0",
"jsonschema>=4.0",
"pytest>=8.0",
]
[project.urls]
Homepage = "https://qualixar.com"
Repository = "https://github.com/qualixar/bounded-loops"
Documentation = "https://github.com/qualixar/bounded-loops/tree/main/docs"
Changelog = "https://github.com/qualixar/bounded-loops/blob/main/CHANGELOG.md"
Issues = "https://github.com/qualixar/bounded-loops/issues"
[project.optional-dependencies]
qualixar-gates = [
# optional Qualixar gate adapters (not bundled by default)
]
otel = [
"opentelemetry-sdk>=1.27",
"opentelemetry-api>=1.27",
]
dev = [
"build>=1.2",
"mypy>=1.10",
"opentelemetry-api>=1.27",
"opentelemetry-sdk>=1.27",
"ruff>=0.5,<0.16",
"types-PyYAML",
]
mcp = [
"mcp>=2,<3",
]
[dependency-groups]
dev = [
"build>=1.2",
"mypy>=1.10",
"opentelemetry-api>=1.27",
"opentelemetry-sdk>=1.27",
"ruff>=0.5,<0.16",
"types-PyYAML",
"mcp>=2,<3",
]
[project.scripts]
bl = "bounded_loops.cli:main"
bounded-loops-mcp = "bounded_loops.mcp_server:main"
[build-system]
requires = ["hatchling>=1.27,<1.28"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.sdist]
# Hatchling's default sdist ships every git-tracked file. Internal engineering material
# must never reach a published artifact — the same rule .gitignore already states for
# `audit/` ("tracked in a separate private repo, never public").
exclude = [".backup/", "audit/", "*.db"]
[tool.hatch.build.targets.wheel]
packages = ["bounded_loops"]
artifacts = ["bounded_loops/graph/schemas/*.json", "bounded_loops/graph/arena/*.html", "bounded_loops/graph/studio/*.html", "bounded_loops/graph/console/*.html", "bounded_loops/graph/monitor/assets/*", "bounded_loops/graph/monitor/assets/vendor/*"]
# Run artifacts are never catalog content. Declared BEFORE the force-include sub-table below:
# a TOML table runs until the next header, so a key placed after it silently becomes part of
# it — which is a build error, not a silent one, but only if you notice the message.
#
# HONEST LIMIT: hatchling's force-include bypasses this exclude list. These patterns cover the
# normal file selection; they do NOT clean the force-included catalog. What actually guarantees
# a clean artifact is (a) every one of these paths is gitignored, so a clean checkout has none
# of them, and (b) `test_the_packaged_catalog_carries_no_RUN_ARTIFACTS` inspects the built
# wheel and fails if any slipped in. Release builds come from a clean worktree for this reason.
exclude = [
"loops/**/.ledger.jsonl",
"loops/**/.bounded-loops/**",
"loops/**/__pycache__/**",
]
# The loop catalog ships INSIDE the wheel. Until 0.6.1 it did not, so `pip install
# bounded-loops` gave you an engine and no loops — `bl loops list` found nothing and told the
# user to clone the repo to obtain what the package advertises on its front page.
#
# force-include maps the directory at build time rather than duplicating 2.5 MB into the
# source tree, so `loops/` stays the single copy in git.
#
# Deliberately NOT fetched over the network on demand. This engine's whole posture is offline
# and credential-free; a catalog that needed github.com would be unavailable in exactly the
# air-gapped, corporate-proxied and egress-restricted environments it is aimed at. 2.5 MB in
# the wheel is the cheaper honesty.
[tool.hatch.build.targets.wheel.force-include]
"loops" = "bounded_loops/catalog/loops"
[tool.pytest.ini_options]
testpaths = ["tests"]
addopts = "-m \"not network and not external_tool and not provider_smoke and not clean_install\""
markers = [
"network: test may contact a network endpoint or invoke a tool that can do so",
"external_tool: test requires an optional dependency, binary, daemon, or externally managed runtime",
"provider_smoke: test contacts a real model or provider account and is always opt-in",
"clean_install: test builds or installs the package in a fresh environment and is always opt-in",
]
[tool.ruff]
# Loop `seed/` directories hold DELIBERATELY-broken fixtures (dead imports,
# failing code) that a gate is meant to flag — linting them defeats their
# purpose and would strip the very defects the loops demonstrate.
extend-exclude = ["loops/*/seed", "loops/*/*/seed"]
[tool.ruff.lint.per-file-ignores]
# pytest.importorskip() must run before the guarded imports that follow it —
# E402 is a false positive for this well-known optional-dependency test pattern.
"tests/adapters/io/test_otel_tracer.py" = ["E402"]
"tests/graph/adapters/test_slm_client.py" = ["E402"]