Skip to main content

AOA

PyPI Python 3.12+ Apache-2.0 Open Gnomon Protocol 1.1

maxitor

Your system's model, built from its code: kept with every change, checked in CI, and drawn as live diagrams.

Maxitor is one package with parts you choose at install time:

Part What it does Install
graph-builder Keeps each service's model graph in one file beside its code, by the Open Gnomon Protocol, and fails CI when a file is stale — every pull request shows what it did to the model pip install maxitor
the web part Maxitor's web part: the full graph, entity diagrams, use cases and lifecycles of an AOA service, live in the browser pip install "maxitor[web]"
repo-graph-port A service that reads each graph's history from its repository — every merged pull request that changed the graph file is a version, with its description and tags — and serves any version's graph; the only part that talks to GitHub pip install "maxitor[repo-graph-port]"
skills aoa-graph-builder-setup, the skill a coding agent follows to connect a project comes with every install

pip install "maxitor[all]" installs everything. The base install brings only jsonschema and jsonschema-rs — nothing of AOA, no server — so it is all a CI job needs. A command whose part is not installed says which extra to add.

Get started

The fastest way: one prompt to your coding agent

Install and run this skill for the current project:
https://raw.githubusercontent.com/bystrovmaxim/aoa/main/packages/maxitor/skills/aoa-graph-builder-setup/SKILL.md

Walk me through the wizard in my language. Ask one question at a time and wait for my answer. For each decision, explain in plain words: what you found, what you propose to change, why you recommend this option, and what happens if I choose another. Explain each technical term the first time you use it.

First check whether the current project fits. If it is empty or has no source of graphs, explain the situation and stop without creating any configuration or checks. If some services are already connected, keep the settings that work, and discuss the new services one at a time.

If I do not understand a question, give a concrete example and come back to the same decision. Before applying anything, show the summary: my decisions, which files will change, and what will remain to do by hand. Apply changes only after I confirm. Do not create commits or pull requests.

The agent follows a four-stage wizard in your language: discover the project, settle each service's choices, choose updating and checking, then review the proposed changes. Each question explains one decision, a recommendation and the consequences of the alternatives. You can ask for an example, go back, change an answer or pause. Nothing is applied to the target project until the proposed changes are reviewed and authorized. Asking to review or edit the skill itself does not start setup.

The wizard proves exports in a temporary folder, then applies the accepted exporters, graph files and integrations. A deferred optional integration remains explicitly manual; mandatory release versioning cannot be deferred. It leaves the result for you to review and commit; serving graph history from the main branch requires those files to reach that branch.

Already have the package? graph-builder skill > .claude/skills/aoa-graph-builder-setup/SKILL.md (or .cursor/skills/…), then ask the agent to run aoa-graph-builder-setup. Run it again any time: on a configured project it is an audit.

What the wizard asks you to decide

The wizard sets up two independent parts, version checks and saved graphs; you may choose either, both or neither. Every run audits the project and proposes only the difference. Version decisions stay in [setup] of the root version.toml, graph decisions in [setup] of graph-builder.toml. It never raises a version number for you, and release tags stay optional. See the setup guide.

It finishes one service before moving to the next. First decide whether to connect a newly discovered service (including its exporter if needed), then where to save its map if that is not already established. After the services, choose how to refresh their maps and how to detect a forgotten refresh. Existing working arrangements are retained, not turned into repeat questions. Technical commands and proof accompany the final review rather than crowding each question.

An illustrative question, with fictional project paths:

2/4 · Services · game-back — save a map of this service?

game-back contains the game's model, but no command saves its map. A small exporter has been proven in a temporary folder. Connecting it lets you review model changes alongside code changes.

  1. Connect it (recommended): add packages/game-back/game_back/build_graph.py, the program that produces the map. You will review the saved map when the model changes; its location comes next.
  2. Leave it out for now: add nothing for this service; this setup will not track its model changes.

If you answer “leave it out”, the wizard acknowledges that consequence and skips that service's file-location question. If you answer “I do not understand”, it explains a concrete case: “Adding an entity changes the model. The saved map lets the same code review show that new entity. Leaving this service out means this setup will not save that map.” It then returns to the same decision, without treating the explanation request as acceptance. This is an illustrative dialogue, not a recorded agent run.

Case What the wizard does
New service with an export command Proves the command; settles inclusion and any unresolved file location
Model with no export command Proves a small exporter; explains its addition as part of connecting this service
No graph producer Explains the prerequisite and leaves the service out; never invents a graph
Current configured graph Preserves its destination and working integrations
Missing saved graph Writes it when applying the accepted setup; no redundant missing-file question
Stale saved graph Explains that it describes the old model; offers proven refresh or explicit exclusion from checks
Broken build or refused graph format Shows the cause and a proven correction, or a blocker; exclusion leaves the old file untouched
Invalid configuration Treats it as a configuration problem and prepares a repair before dependent decisions
No local check run Explains an explicit update command/target versus manual refresh; does not invent a full test pipeline
Update only after a dependency update Explains that service-code changes still require a refresh; asks about the extra integration separately
Missing CI Offers a check for the actual hosting provider or deferral; deferral leaves checks manual
No included services Creates no empty config and asks no irrelevant integration questions
Fully healthy audit All mandatory items, including version tags and enforcing CI, are done; reports evidence without a redundant question
“Details” or “show my choices” Shows the requested information while retaining the current unanswered decision
“Back” or a changed answer Revisits that decision and removes invalid dependent choices; retains unrelated answers
Ambiguous answer, silence or “I do not understand” Keeps the choice pending; clarifies or explains
“Do what is best” Accepts the current recommendation, unless broader delegation is explicitly stated
Pause or stop before applying Pause keeps a resumable summary; stop discards temporary drafts; neither changes project files
Apply fails or scope changes Reports partial changes and exact failure, or returns to the changed decision; does not claim success or erase user work

Updating and checking are different: graph-builder write refreshes files; graph-builder check detects stale files without rewriting them. A failing CI check blocks merging only when repository rules require it. The wizard does not change those rules. A local update step runs only after the other checks pass.

Before applying, you see the before/after table, affected files, prepared changes, commands, proof and any manual work left. You can apply, revise a choice or stop. The skill remains a single file, so graph-builder skill delivers the whole wizard. A live conversation is still needed to judge how clearly a particular agent follows these instructions; package tests alone do not establish that.

By hand, in four steps

1. Export each service's model — a command, in any language, that prints the service's graph by the protocol's schema and nothing else. Only the project knows its model, so the project writes this command; graph-builder runs it, checks what it prints, and keeps the file.

An AOA service (Python) — the framework builds the graph:

# my_service/build_graph.py
import importlib
import sys

from aoa.action_machine.graph.node_graph_coordinator_factory import create_node_graph_coordinator


def main() -> None:
    importlib.import_module("my_service.app")  # registers the service's actions, entities and resources
    sys.stdout.write(create_node_graph_coordinator().to_json())


if __name__ == "__main__":
    main()

A Node service — the project's own code describes its model:

// scripts/export-graph.mjs
import { buildModelGraph } from "../src/model/graph.js";
process.stdout.write(JSON.stringify(buildModelGraph()));

Any other stack works the same way: a Java task, a 1C export, or cat build/graph.json when another step already wrote the file.

2. List the graphs in graph-builder.toml at the repository root:

graph_builder = "1.0"

[[graph]]
name  = "my-service"
build = "uv run python -m my_service.build_graph"    # or: node scripts/export-graph.mjs
file  = "my_service/graph.json"

3. Write them — graph-builder write — and commit graph-builder.toml with the graph files. Without installing anything but uv: uvx --from maxitor graph-builder write (uv fetches its own Python; the project needs none).

4. Check them in CI: prepare the project's environment the way its other jobs do, then one step:

- uses: actions/checkout@v4
- uses: actions/setup-node@v4          # or setup-java, or setup-uv + uv sync — whatever the builds need
- run: npm ci
- uses: bystrovmaxim/aoa/packages/maxitor/tools/graph-builder@maxitor-v3.0.0

The step runs graph-builder check: every build again, every graph checked against the protocol's schema, every file compared with what its build prints.

From then on, a pull request that changes the model without its graph file fails, naming each difference by id — and graph-builder write with one more commit fixes it.

See the system

pip install "maxitor[web]"
maxitor

Open http://127.0.0.1:8000 and point it at an AOA service's graph.

Learn more

maxitor 3.0.0 replaces two earlier packages, the app's and the command's; the changelog says what to change in an install or an import.

Apache License 2.0.

Metadata

Release files for maxitor 3.14.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for maxitor 3.14.0
File Size Uploaded Provenance Actions
maxitor-3.14.0.tar.gz 2.0 MB Without provenance Details for maxitor-3.14.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for maxitor 3.14.0
File Interpreter ABI Platform Actions
maxitor-3.14.0-py3-none-any.whl Python 3 none any Details for maxitor-3.14.0-py3-none-any.whl

Total release size: 3.4 MB

Release files / maxitor-3.14.0.tar.gz

Download URL maxitor-3.14.0.tar.gz
Size 2.0 MB
Tags Source
SHA-256 checksum
How to use checksums
5d21ad67abf0c39ca9853c0d9749763b5ce94b956818d23c69db85a7bca7cdb4
BLAKE2b-256 checksum
How to use checksums
0d5d02babaa2689181755be710e30c280897b59d9c33fed73d4742b69ee0e89c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / maxitor-3.14.0-py3-none-any.whl

Download URL maxitor-3.14.0-py3-none-any.whl
Size 1.4 MB
Tags Python 3
SHA-256 checksum
How to use checksums
89cb9a59f5d0b7482dcd4cda51315288077d4744531b273de6b5333860895a23
BLAKE2b-256 checksum
How to use checksums
302882b94e9765e3eff0c76b74995bd4346d61636d36fd5cff8a446ad1cee643
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.13.7 {"installer":{"name":"uv","version":"0.13.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"26.04","id":"resolute","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Security for maxitor 3.14.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page