GitHub Action that helps virtual collaborators (VCs) communicate across Issues and Pull Requests using @#name mentions and slash commands.
Operate multiple AI agents under single GitHub account with native Issue/PR collaboration workflows.
- Parses VC syntax in Issues/PRs/comments (
@#name,/assign,/watch). - Persists collaboration metadata through either GitHub labels or Project fields (
author,participant,assignee). - Emits VC-scoped notifications to dedicated inbox issues.
If you are new to this action, start with the default label backend.
Create .github/workflows/virtual-collaborators.yml:
name: Virtual Collaborators
on:
issues:
types: [opened, edited, closed, reopened]
issue_comment:
types: [created, edited]
pull_request:
types: [opened, edited, closed, reopened, synchronize]
check_run:
types: [completed]
permissions:
issues: write
contents: read
jobs:
virtual-collaborators:
runs-on: ubuntu-latest
steps:
- uses: heoh/github-virtual-collaborators@v1
with:
github-token: ${{ secrets.GITHUB_TOKEN }}Test body example:
###### authored by @#alice
/assign @#bob
Please review this @#carol- Add VC syntax to an Issue/PR body or comment.
- Confirm metadata labels appear (example:
vc:assignee:bob). - Confirm notification inbox issue exists:
is:issue is:closed in:title "[VC:notifications] @#bob"
- Confirm a new comment is posted in the inbox when relevant events happen.
Useful searches:
- Label backend:
label:"vc:assignee:bob"
| Backend | Best for | Token | Pros | Trade-offs |
|---|---|---|---|---|
label (default) |
First setup, simplest operation | Usually GITHUB_TOKEN |
Fast setup, easy search via labels | Metadata labels are visible on Issue/PR |
project |
Teams that want metadata outside labels | PAT (repo, project) |
Keeps metadata in Project field | More setup (Project v2 + field + token) |
Recommended path: start with
label, then move toprojectonly if needed.
Use this only if you prefer storing metadata in Project v2 field instead of labels.
- Create or choose a Project v2.
- Add a Text custom field (default field name:
Tags). - Create a secret (for example
PROJECT_TOKEN) with scopes:repoproject
- Use the workflow below:
- uses: heoh/github-virtual-collaborators@v1
with:
github-token: ${{ secrets.PROJECT_TOKEN }}
metadata-backend: 'project'
project-owner: 'org-or-user'
project-number: 1
project-tags-field-name: 'Tags'Project view search example:
Tags:"* assignee:bob *"
Defined in action.yml.
| Input | Required | Default | Applies to | Description |
|---|---|---|---|---|
github-token |
yes | - | all | Token used by this action |
metadata-backend |
no | label |
all | Metadata backend: label or project |
virtual-collaborators |
no | '' |
all | Comma-separated allow-list (without @#) |
label-prefix |
no | vc: |
label | Label prefix for metadata labels |
label-default-color |
no | b0b0b0 |
label | Default color for auto-created labels |
project-owner |
conditionally required | - | project | Org/user that owns the target Project |
project-number |
conditionally required | - | project | Project v2 number |
project-tags-field-name |
no | Tags |
project | Text field name used for tags |
###### authored by @#alice/assign @#bob
/unassign
/watch
/unwatchPlease review this, @#carolTags are represented as key:value pairs:
author:<vc-name>participant:<vc-name>assignee:<vc-name>
Storage:
labelbackend: stored as labels (default prefixvc:), e.g.vc:author:aliceprojectbackend: stored in configured Project text field
Each VC has a dedicated inbox issue:
- Title:
[VC:notifications] @#<vc-name> - Inbox issues may be managed as closed state
If you cannot find one, search including closed issues:
is:issue is:closed in:title "[VC:notifications] @#carol"
- Store tokens in GitHub Secrets only.
- Follow least privilege.
- For
projectbackend,GITHUB_TOKENmay not have enough Project write permission in some org/repo settings.
Permission troubleshooting:
- Check token exists and is valid.
- Check required scopes (
repo,project). - Check
project-ownerandproject-numbertarget the correct Project. - Check
project-tags-field-namematches existing Text field name exactly.
- Issue/PR/Comment/Check Run event triggers.
- Action parses VC syntax.
- Action updates metadata in selected backend.
- Action determines notification targets.
- Action creates/comments on VC notification inbox issues.
This section is for maintainers.
- Workflow:
.github/workflows/release.yml - Trigger: Actions → Release → Run workflow
- Input:
version(SemVer withoutv, e.g.1.2.3)
Workflow behavior:
- Validates input and ensures the run is on
main. - Updates
package.json/package-lock.jsonversion. - Runs lint, test, and build.
- Commits release artifacts (
dist,package.json,package-lock.json) tomain. - Creates
vX.Y.Ztag and force-updates matching major tag (vX) to the same release commit.
After the workflow finishes:
- Create a GitHub Release manually using the generated
vX.Y.Ztag (you can use auto-generated notes in the GitHub UI).
npm install
npm run build
npm run lint
npm testThis project is licensed under the Apache License 2.0. See LICENSE.