# `T3.Projects`
[🔗](https://github.com/dl-alexandre/t3-elixir/blob/main/lib/t3/projects.ex#L1)

Project discovery and mutation through MCP. Outside clients have no implicit T3
project. `read/2`, `create/2`, `update/2`, `delete/2` and `clone/2` take T3's
original string-keyed maps. Permission and availability are enforced by T3.

# `clone`

```elixir
@spec clone(T3.Client.t(), map()) :: {:ok, map()} | {:error, T3.Error.t()}
```

Clone a repository (`destinationPath` new or empty). Register after with `t3_project_create`, with the same `environmentId`.

Availability is server-, permission-, and context-dependent; outside clients must supply explicit project/thread targets when required.

# `create`

```elixir
@spec create(T3.Client.t(), map()) :: {:ok, map()} | {:error, T3.Error.t()}
```

Register a project folder. `createWorkspaceRootIfMissing` creates it; a registered folder is rejected. No `workspaceRoot`: makes a git repo from `title` with README, icon, first commit (`commitError` on failure; project still exists). Clone first with `t3_project_clone` if needed.

Availability is server-, permission-, and context-dependent; outside clients must supply explicit project/thread targets when required.

# `delete`

```elixir
@spec delete(T3.Client.t(), map()) :: {:ok, map()} | {:error, T3.Error.t()}
```

Delete one project. Nonempty needs `force: true`. Folder on disk stays.

Availability is server-, permission-, and context-dependent; outside clients must supply explicit project/thread targets when required.

# `list`

```elixir
@spec list(T3.Client.t(), map()) :: {:ok, map()} | {:error, T3.Error.t()}
```

List projects. Pages can shift.

Availability is server-, permission-, and context-dependent; outside clients must supply explicit project/thread targets when required.

# `read`

```elixir
@spec read(T3.Client.t(), map()) :: {:ok, map()} | {:error, T3.Error.t()}
```

Read one project: workspace and saved scripts.

Availability is server-, permission-, and context-dependent; outside clients must supply explicit project/thread targets when required.

# `update`

```elixir
@spec update(T3.Client.t(), map()) :: {:ok, map()} | {:error, T3.Error.t()}
```

Update one project's settings. Omitted fields are unchanged.

Availability is server-, permission-, and context-dependent; outside clients must supply explicit project/thread targets when required.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
