Autonoma Elixir SDK

Elixir implementation of the Autonoma Environment Factory SDK.

Packages

Package Description
:autonoma Core protocol (HMAC, refs, graph, handler)
:autonoma_ecto Ecto ORM adapter
:autonoma_plug Plug server handler

Quick Start

Install

Add to your mix.exs deps:

defp deps do
  [
    {:autonoma, "~> 0.1"}
  ]
end

Plug + Ecto

# In your router
executor = Autonoma.Ecto.Executor.ecto_executor(MyApp.Repo)

config = %{
  executor: executor,
  scope_field: "organization_id",
  shared_secret: System.get_env("AUTONOMA_SHARED_SECRET"),
  signing_secret: System.get_env("AUTONOMA_SIGNING_SECRET"),
  auth: fn user, _context ->
    token = MyApp.Auth.create_session_token(user["id"])
    %{"headers" => %{"Authorization" => "Bearer #{token}"}}
  end
}

forward "/api/autonoma", Autonoma.Plug.Handler, config

Model name ↔ table name

By default, the SDK derives a model name from each SQL table by splitting on _ and PascalCasing each part — no pluralization. Examples:

SQL table Auto-derived model name
userUser
api_keyApiKey
branch_deploymentBranchDeployment
organizationsOrganizations (stays plural)
api_keysApiKeys (stays plural)

If every factory you register is keyed under the auto-derived name, omit :table_name_map entirely. The SDK handles the mapping.

You only need :table_name_map when a factory key disagrees with the auto-derived name. Common reasons:

The map is sparse, not exhaustive: only list entries that actually differ. Auto-derivation covers the rest.

# Tables in DB: organization, user, api_key, deal   (singular)
# Factories keyed: "Organization", "User", "ApiKey", "Deal"
# :table_name_map omitted — auto-derive is exact

# Tables in DB: organizations, users, api_keys
# Factories keyed singular → every entry disagrees:
config = %{
  # ...
  table_name_map: %{
    "Organization" => "organizations",
    "User" => "users",
    "ApiKey" => "api_keys"
  },
  factories: %{"Organization" => ..., "User" => ..., "ApiKey" => ...}
}

Red flag: if your :table_name_map has one entry per factory and every entry is just a plural↔singular rename, consider keeping factory keys plural ("Organizations") and dropping the map entirely. Plural keys are valid — pick whichever convention your scenarios use.

Commands

mix deps.get   # install dependencies
mix test        # run tests

Documentation

For protocol-level documentation, see the root protocol/ directory. For a runnable example, see examples/elixir/phoenix-ecto/.