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 ADDED
@@ -0,0 +1,8 @@
1
+ .env
2
+ __pycache__/
3
+ *.pyc
4
+ .venv/
5
+ dist/
6
+ build/
7
+ *.egg-info/
8
+ .uv/
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.
@@ -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__"]
@@ -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()