-
Notifications
You must be signed in to change notification settings - Fork 180
Expand file tree
/
Copy pathpyproject.toml
More file actions
158 lines (146 loc) · 5.68 KB
/
Copy pathpyproject.toml
File metadata and controls
158 lines (146 loc) · 5.68 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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
[project]
name = "cli-agent-orchestrator"
version = "2.3.0"
description = "CLI Agent Orchestrator"
readme = "README.md"
requires-python = ">=3.10"
license = "Apache-2.0"
authors = [
{ name = "AWS Labs" },
]
keywords = ["ai", "agents", "orchestration", "multi-agent", "tmux", "mcp", "cli", "codex", "claude-code", "kiro", "kimi"]
classifiers = [
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Apache Software License",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Topic :: Software Development :: Libraries",
]
dependencies = [
"fastapi>=0.104.0",
# Upper bound: ext_apps/sep2133.advertise_capability monkey-patches a FastMCP
# internal (create_initialization_options); cap the major to avoid silent
# breakage on a new major release. Tested against 3.x.
"fastmcp>=2.14.0,<4.0.0",
"mcp>=1.23.0",
"pydantic>=2.10.6",
"apscheduler>=3.10.4",
"sqlalchemy>=2.0.0",
"uvicorn[standard]>=0.24.0",
"websockets>=12.0",
"libtmux>=0.51.0",
"click>=8.2.0",
"python-dotenv>=1.2.2",
"python-frontmatter>=1.1.0",
"requests>=2.32.0",
"rank-bm25>=0.2.2",
"pyte>=0.8.2",
# JWT/JWKS verification for the default-off OAuth 2.1 auth layer (RS256 via
# JWKS). The [crypto] extra pulls in `cryptography` for RSA signature
# verification and provides `jwt.PyJWKClient`. See spec task 9.1 research note.
"pyjwt[crypto]>=2.8.0",
"jsonschema>=4.25",
"jinja2>=3.1.0",
# Obsidian graph sink (Issue #348) imports yaml at module top; declare it
# directly instead of relying on a transitive dep so the import can't break.
"pyyaml>=6.0",
# Markdown parser used by the repository-local link validator.
"markdown-it-py>=4.0.0",
# `cao update` reads uv's install receipt (TOML). tomllib is stdlib on 3.11+;
# on 3.10 the fallback `import tomli` runs. cli/main.py imports the update
# command unconditionally, so tomli must be a RUNTIME dependency on 3.10 —
# not just a dev dependency — or every `cao` command would fail to import.
"tomli>=2.0.0; python_version < '3.11'",
]
[project.optional-dependencies]
# Opt-in AG-UI run plane with stock wire dialect. The ag-ui-protocol SDK
# provides RunAgentInput, EventEncoder, and the typed event models. When
# absent the /agui/v1/run route returns 501 with an install hint.
agui = [
"ag-ui-protocol>=0.1.19,<0.2.0",
]
# Opt-in OpenTelemetry GenAI telemetry (telemetry/). The base install stays
# lean: telemetry/otel.py no-ops when the SDK is absent, matching the
# default-off posture of the feature itself.
otel = [
"opentelemetry-api>=1.27.0",
"opentelemetry-sdk>=1.27.0",
"opentelemetry-exporter-otlp-proto-grpc>=1.27.0",
]
[project.scripts]
"cao" = "cli_agent_orchestrator.cli.main:cli"
"cao-server" = "cli_agent_orchestrator.api.main:main"
"cao-mcp-server" = "cli_agent_orchestrator.mcp_server.server:main"
"cao-ops-mcp-server" = "cli_agent_orchestrator.ops_mcp_server.server:main"
[project.entry-points."cao.plugins"]
claude_code_memory = "cli_agent_orchestrator.plugins.builtin.claude_code_memory:ClaudeCodeMemoryPlugin"
kiro_cli_memory = "cli_agent_orchestrator.plugins.builtin.kiro_cli_memory:KiroCliMemoryPlugin"
codex_memory = "cli_agent_orchestrator.plugins.builtin.codex_memory:CodexMemoryPlugin"
event_log_publisher = "cli_agent_orchestrator.plugins.builtin.event_log_publisher:EventLogPublisher"
mcp_apps = "cli_agent_orchestrator.plugins.builtin.mcp_apps:McpAppsPlugin"
[project.urls]
Homepage = "https://github.com/awslabs/cli-agent-orchestrator"
Repository = "https://github.com/awslabs/cli-agent-orchestrator"
Issues = "https://github.com/awslabs/cli-agent-orchestrator/issues"
Documentation = "https://github.com/awslabs/cli-agent-orchestrator#readme"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/cli_agent_orchestrator", "src/cao_workflow"]
[tool.hatch.build]
artifacts = [
"src/cli_agent_orchestrator/web_ui/**",
# Single-file MCP App bundles emitted by `cao_mcp_apps` (npm run build:all).
# Shipped so cao-mcp-server can serve the ui://cao/* resources from the wheel.
"src/cli_agent_orchestrator/ext_apps/apps_static/**",
# Vanilla topology widget bundle (committed; no build step) served at
# /widgets/topology/ and as the cao://widget/topology MCP resource.
"src/cli_agent_orchestrator/ext_apps/static/**",
]
[dependency-groups]
dev = [
"pytest>=9.0.3",
"pytest-asyncio>=0.26.0",
"pytest-mock>=3.11.1",
"pytest-cov>=4.1.0",
"black>=23.0.0",
"isort>=5.12.0",
"mypy>=1.5.0",
"pytest-xdist>=3.8.0",
"hypothesis>=6.0",
"networkx>=3.0",
"tomli>=2.0.0; python_version < '3.11'",
# JWT/JWKS test fixtures (test/fixtures/jwt_factory.py) mint RS256 tokens
# with authlib; runtime verification needs only pyjwt[crypto].
"authlib>=1.7.1",
]
[tool.black]
line-length = 100
target-version = ['py310']
[tool.isort]
profile = "black"
line_length = 100
[tool.mypy]
python_version = "3.10"
strict = true
warn_return_any = true
warn_unused_configs = true
[tool.pytest.ini_options]
markers = [
"asyncio: marks tests that use asyncio",
"integration: marks integration tests",
"e2e: marks end-to-end tests",
"slow: marks tests as slow (deselect with '-m \"not slow\"')"
]
asyncio_mode = "strict"
testpaths = ["test"]
python_files = "test_*.py"
python_classes = "Test*"
python_functions = "test_*"
addopts = "--cov=src --cov-report=term-missing -m 'not e2e'"