aeo 0.1.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.
- aeo-0.1.0/.gitignore +8 -0
- aeo-0.1.0/PKG-INFO +59 -0
- aeo-0.1.0/README.md +46 -0
- aeo-0.1.0/pyproject.toml +39 -0
- aeo-0.1.0/src/aeo/__init__.py +15 -0
- aeo-0.1.0/src/aeo/cli.py +20 -0
aeo-0.1.0/.gitignore
ADDED
aeo-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: aeo
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Internal answer-engine-optimization CLI + SDK for Agent Berlin staff.
|
|
5
|
+
Requires-Python: >=3.10
|
|
6
|
+
Requires-Dist: click>=8.1
|
|
7
|
+
Requires-Dist: requests>=2.31
|
|
8
|
+
Provides-Extra: dev
|
|
9
|
+
Requires-Dist: black>=24.0.0; extra == 'dev'
|
|
10
|
+
Requires-Dist: isort>=5.13.0; extra == 'dev'
|
|
11
|
+
Requires-Dist: pytest>=8.0.0; extra == 'dev'
|
|
12
|
+
Description-Content-Type: text/markdown
|
|
13
|
+
|
|
14
|
+
# aeo
|
|
15
|
+
|
|
16
|
+
Internal answer-engine-optimization CLI + SDK for Agent Berlin staff
|
|
17
|
+
(`admin_users`, role `admin`). Sibling of `backend/sdk-python` — same transport
|
|
18
|
+
posture and the same OTP bootstrap, scoped to internal AEO work.
|
|
19
|
+
|
|
20
|
+
**Status: scaffold.** This release establishes the package on PyPI. The CLI has
|
|
21
|
+
only `aeo --version`; the SDK surface is not implemented yet.
|
|
22
|
+
|
|
23
|
+
## Auth
|
|
24
|
+
|
|
25
|
+
`aeo` authenticates with a **project-scoped token**, minted by exchanging a
|
|
26
|
+
one-time OTP from the aeo MCP server's `get_otp` tool:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
aeo configure --otp <OTP> --domain <project_domain> --title "<what this session is for>"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This reuses the customer MCP's bootstrap wholesale — the OTP is an
|
|
33
|
+
`mcp_sessions` row and the exchange endpoint is the existing
|
|
34
|
+
`POST /cli/exchange-otp`. There is no aeo-specific session table, exchange
|
|
35
|
+
endpoint, or token type.
|
|
36
|
+
|
|
37
|
+
Two consequences follow, and both differ from how a platform-wide internal tool
|
|
38
|
+
would behave:
|
|
39
|
+
|
|
40
|
+
- **`aeo` is project-scoped.** `--domain` is required; the OTP is bound to that
|
|
41
|
+
project when redeemed. An exchange without a domain cannot succeed.
|
|
42
|
+
- **SDK usage is billed to the project's owning org**, not to us — the minted
|
|
43
|
+
token carries the customer's org claim.
|
|
44
|
+
|
|
45
|
+
Access is gated to `admin_users.role='admin'`. That bound is set by
|
|
46
|
+
`/cli/exchange-otp`, which authorizes via `IsAuthorizedForOrg` (admin, or an FDM
|
|
47
|
+
assigned to that specific org) — `marketing` would receive an OTP that then
|
|
48
|
+
fails at exchange, so the MCP refuses the role up front. Widening it means
|
|
49
|
+
changing an endpoint shared with the customer MCP; it is not a local decision.
|
|
50
|
+
|
|
51
|
+
## Release
|
|
52
|
+
|
|
53
|
+
Publishing is automated — see `.github/workflows/aeo-publish.yml`. Any push to
|
|
54
|
+
`main` touching `backend/aeo/**` bumps the minor version, commits the bump with
|
|
55
|
+
an `[aeo-release]` marker, builds with `uv build`, and publishes to PyPI via
|
|
56
|
+
Trusted Publishers (OIDC — no API token stored anywhere).
|
|
57
|
+
|
|
58
|
+
Do not edit `version` in `pyproject.toml` or `__version__` in
|
|
59
|
+
`src/aeo/__init__.py` by hand; the workflow rewrites both.
|
aeo-0.1.0/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# aeo
|
|
2
|
+
|
|
3
|
+
Internal answer-engine-optimization CLI + SDK for Agent Berlin staff
|
|
4
|
+
(`admin_users`, role `admin`). Sibling of `backend/sdk-python` — same transport
|
|
5
|
+
posture and the same OTP bootstrap, scoped to internal AEO work.
|
|
6
|
+
|
|
7
|
+
**Status: scaffold.** This release establishes the package on PyPI. The CLI has
|
|
8
|
+
only `aeo --version`; the SDK surface is not implemented yet.
|
|
9
|
+
|
|
10
|
+
## Auth
|
|
11
|
+
|
|
12
|
+
`aeo` authenticates with a **project-scoped token**, minted by exchanging a
|
|
13
|
+
one-time OTP from the aeo MCP server's `get_otp` tool:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
aeo configure --otp <OTP> --domain <project_domain> --title "<what this session is for>"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
This reuses the customer MCP's bootstrap wholesale — the OTP is an
|
|
20
|
+
`mcp_sessions` row and the exchange endpoint is the existing
|
|
21
|
+
`POST /cli/exchange-otp`. There is no aeo-specific session table, exchange
|
|
22
|
+
endpoint, or token type.
|
|
23
|
+
|
|
24
|
+
Two consequences follow, and both differ from how a platform-wide internal tool
|
|
25
|
+
would behave:
|
|
26
|
+
|
|
27
|
+
- **`aeo` is project-scoped.** `--domain` is required; the OTP is bound to that
|
|
28
|
+
project when redeemed. An exchange without a domain cannot succeed.
|
|
29
|
+
- **SDK usage is billed to the project's owning org**, not to us — the minted
|
|
30
|
+
token carries the customer's org claim.
|
|
31
|
+
|
|
32
|
+
Access is gated to `admin_users.role='admin'`. That bound is set by
|
|
33
|
+
`/cli/exchange-otp`, which authorizes via `IsAuthorizedForOrg` (admin, or an FDM
|
|
34
|
+
assigned to that specific org) — `marketing` would receive an OTP that then
|
|
35
|
+
fails at exchange, so the MCP refuses the role up front. Widening it means
|
|
36
|
+
changing an endpoint shared with the customer MCP; it is not a local decision.
|
|
37
|
+
|
|
38
|
+
## Release
|
|
39
|
+
|
|
40
|
+
Publishing is automated — see `.github/workflows/aeo-publish.yml`. Any push to
|
|
41
|
+
`main` touching `backend/aeo/**` bumps the minor version, commits the bump with
|
|
42
|
+
an `[aeo-release]` marker, builds with `uv build`, and publishes to PyPI via
|
|
43
|
+
Trusted Publishers (OIDC — no API token stored anywhere).
|
|
44
|
+
|
|
45
|
+
Do not edit `version` in `pyproject.toml` or `__version__` in
|
|
46
|
+
`src/aeo/__init__.py` by hand; the workflow rewrites both.
|
aeo-0.1.0/pyproject.toml
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "aeo"
|
|
3
|
+
# Bumped automatically by .github/workflows/aeo-publish.yml before each build —
|
|
4
|
+
# do not edit by hand. Starts at 0.0.0 so the first published artifact is 0.1.0.
|
|
5
|
+
version = "0.1.0"
|
|
6
|
+
description = "Internal answer-engine-optimization CLI + SDK for Agent Berlin staff."
|
|
7
|
+
readme = "README.md"
|
|
8
|
+
requires-python = ">=3.10"
|
|
9
|
+
dependencies = [
|
|
10
|
+
"click>=8.1",
|
|
11
|
+
"requests>=2.31",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[project.scripts]
|
|
15
|
+
aeo = "aeo.cli:main"
|
|
16
|
+
|
|
17
|
+
[build-system]
|
|
18
|
+
requires = ["hatchling"]
|
|
19
|
+
build-backend = "hatchling.build"
|
|
20
|
+
|
|
21
|
+
[tool.hatch.build.targets.wheel]
|
|
22
|
+
packages = ["src/aeo"]
|
|
23
|
+
|
|
24
|
+
[project.optional-dependencies]
|
|
25
|
+
dev = [
|
|
26
|
+
"black>=24.0.0",
|
|
27
|
+
"isort>=5.13.0",
|
|
28
|
+
"pytest>=8.0.0",
|
|
29
|
+
]
|
|
30
|
+
|
|
31
|
+
[tool.black]
|
|
32
|
+
line-length = 100
|
|
33
|
+
|
|
34
|
+
[tool.isort]
|
|
35
|
+
profile = "black"
|
|
36
|
+
line_length = 100
|
|
37
|
+
|
|
38
|
+
[tool.pytest.ini_options]
|
|
39
|
+
testpaths = ["tests"]
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""aeo — internal answer-engine-optimization CLI + SDK for Agent Berlin staff.
|
|
2
|
+
|
|
3
|
+
Access is restricted to `admin_users` staff with role 'admin'. A session starts
|
|
4
|
+
in the aeo MCP server (`get_otp`), which mints a one-time password redeemed by
|
|
5
|
+
`aeo configure` for a project-scoped token.
|
|
6
|
+
|
|
7
|
+
The CLI and SDK surfaces are not implemented yet — this release exists to
|
|
8
|
+
establish the package.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
# Bumped automatically by .github/workflows/aeo-publish.yml alongside
|
|
12
|
+
# pyproject.toml — keep the two in sync; do not edit by hand.
|
|
13
|
+
__version__ = "0.1.0"
|
|
14
|
+
|
|
15
|
+
__all__ = ["__version__"]
|
aeo-0.1.0/src/aeo/cli.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""aeo CLI entry point.
|
|
2
|
+
|
|
3
|
+
Deliberately minimal: `--version` only. Commands land here as the CLI is built
|
|
4
|
+
out — `configure` first, which POSTs the MCP-minted OTP to /cli/exchange-otp
|
|
5
|
+
along with a project domain and title, and saves the returned token.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import click
|
|
9
|
+
|
|
10
|
+
from . import __version__
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@click.group(context_settings={"help_option_names": ["-h", "--help"]})
|
|
14
|
+
@click.version_option(__version__, "-V", "--version", prog_name="aeo")
|
|
15
|
+
def main() -> None:
|
|
16
|
+
"""Internal answer-engine-optimization tooling for Agent Berlin staff."""
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
if __name__ == "__main__":
|
|
20
|
+
main()
|