Skip to content

This is a how-to guide. It assumes the workstacean container is running and you have Ava configured in workspace/agents/ava.yaml (the in-process agent definition).


Onboarding a project provisions it across every system protoLabs uses: GitHub (.automaker/ scaffold) and Discord (category + channels created). The onboard_project skill on Ava orchestrates the full chain.

Trigger options

Option A — Automatic (org webhook)

If you have the GitHub org webhook registered (see how-to/use-quinn-pr-review.md for webhook setup), any new repository created under the org automatically triggers onboarding. No manual action needed.

Option B — Discord slash command

In any Discord channel the bot has access to:

/ava onboard

Or by @mention:

@YourBot onboard protoLabsAI/my-new-repo

Option C — Bus injection (scripted/CI)

bash
curl -s -X POST http://workstacean:3000/publish \
  -H "Content-Type: application/json" \
  -d '{
    "topic": "message.inbound.test",
    "payload": {
      "sender": "ci",
      "content": "onboard protoLabsAI/my-new-repo",
      "skillHint": "onboard_project",
      "channel": "cli"
    }
  }'

What the onboard chain does

Ava's onboard_project skill runs these steps in sequence:

  1. GitHub API — fetches repo metadata (description, topics, visibility)
  2. .automaker/ scaffold — writes project.json and settings.json into the target repo, commits and pushes
  3. .gitignore + worktree init — adds worktree paths to .gitignore in the target repo
  4. Discord provisioning — calls Quinn's provision_discord skill (via chain), which creates a Discord category with three channels: dev, alerts, releases
  5. Write-back — stores Discord channel IDs in .automaker/settings.json (in the target repo)

Project metadata itself comes from the project registry, which is compiled from repos tagged with the protoagent-plugin GitHub topic (plus an explicit base set) into a static projects.json served by the workstacean-projects nginx sidecar at /api/settings/global; workstacean's ProjectRegistry polls that URL every 5 min. To add a project to the registry, tag its repo with the protoagent-plugin topic — the 15-min sync cron picks it up. The workstacean-side channel→agent bindings live in workspace/channels.yaml via the ChannelRegistry — onboarding does not write a workspace/projects.yaml (that file no longer exists). To make slash-commands resolve "the dev channel for this project", add a per-project binding to workspace/channels.yaml:

yaml
- id: project-my-new-repo-dev
  platform: discord
  project: my-new-repo        # project slug
  kind: dev
  channelId: "<channel-id>"

On completion, a summary message is sent to the originating interface (Discord channel or the bus outbound topic).


Verifying the onboard completed

Confirm the project shows up in workstacean's registry (compiled from the protoagent-plugin GitHub topic):

bash
curl -s http://workstacean:3000/api/projects | jq '.data[] | select(.github.repo == "my-new-repo")'

Check the target repo for a .automaker/ directory:

bash
gh api repos/protoLabsAI/my-new-repo/contents/.automaker/project.json

If you added a per-project Discord binding, confirm it resolves via the ChannelRegistry — the dev channel is keyed by (slug, "dev") in workspace/channels.yaml.


If provisioning fails partway through

The onboard chain is not atomic. If Discord provisioning fails (e.g., bot permissions), the .automaker/ scaffold is still created. The error is logged and a partial-onboard notice is sent to the originating interface.

To re-run Discord provisioning only:

bash
curl -s -X POST http://workstacean:3000/publish \
  -H "Content-Type: application/json" \
  -d '{
    "topic": "message.inbound.test",
    "payload": {
      "sender": "manual",
      "content": "provision discord for protoLabsAI/my-new-repo",
      "skillHint": "provision_discord"
    }
  }'

protoWorkstacean — a switchboard, not an agent.