Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ codex:
--dangerously-skip-permissions: false # `false`の値はフラグ自体を出力しない
```

9種類のエージェントタイプのうち8つがspawn可能 — `claude-code`、`codex`、`grok-build`、`cursor`、`gemini`、`antigravity`、`copilot`、`opencode`。`hermes` は不可 — そのCLIには初期プロンプトを事前に仕込んだインタラクティブセッションを開始するモードがない(#279)。macOSが主なターゲットで、LinuxとWindowsはベストエフォート(ターミナルが未対応の場合はissueまたはPRを歓迎)。ヘッドレス環境 — tmuxもなく使えるターミナルもない — はエージェントCLIがインタラクティブなターミナルを必要とするためエラーになる。
10種類のエージェントタイプのうち8つがspawn可能 — `claude-code`、`codex`、`grok-build`、`cursor`、`gemini`、`antigravity`、`copilot`、`opencode`。`hermes` は、初期プロンプトを事前に仕込んだインタラクティブセッションを開始する既知のCLIモードがないためspawn不可(#279)。`devin` は、同等のインタラクティブ起動方法がまだ検証されていないため、現時点ではspawnableとして扱っていない。macOSが主なターゲットで、LinuxとWindowsはベストエフォート(ターミナルが未対応の場合はissueまたはPRを歓迎)。ヘッドレス環境 — tmuxもなく使えるターミナルもない — はエージェントCLIがインタラクティブなターミナルを必要とするためエラーになる。

### spawnしたエージェントを終了する(`despawn`)

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ codex:
--dangerously-skip-permissions: false # a `false` value suppresses the flag entirely
```

Eight of the nine agent types are spawnable — `claude-code`, `codex`, `grok-build`, `cursor`, `gemini`, `antigravity`, `copilot`, `opencode`. `hermes` is not: its CLI has no mode that starts an interactive session pre-seeded with an initial prompt (#279). macOS is the primary target; Linux and Windows are best-effort (please open an issue/PR if your terminal isn't handled). Headless environments — no tmux **and** no usable terminal — error out, since the agent CLIs need an interactive terminal.
Eight of the ten agent types are spawnable — `claude-code`, `codex`, `grok-build`, `cursor`, `gemini`, `antigravity`, `copilot`, `opencode`. `hermes` is not spawnable because its CLI has no known mode that starts an interactive session pre-seeded with an initial prompt (#279). `devin` is currently not marked spawnable because an equivalent interactive boot mode has not yet been verified. macOS is the primary target; Linux and Windows are best-effort (please open an issue/PR if your terminal isn't handled). Headless environments — no tmux **and** no usable terminal — error out, since the agent CLIs need an interactive terminal.

### Tear down a spawned agent (`despawn`)

Expand Down
2 changes: 1 addition & 1 deletion docs/agent-types.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Agent types

agmsg supports several agent runtimes — claude-code, codex, gemini, antigravity,
copilot, opencode, hermes, cursor — and each is described by a small **manifest** so that the rest
copilot, opencode, hermes, cursor, devin — and each is described by a small **manifest** so that the rest
of agmsg (detection, the join whitelist, spawn, and delivery routing) discovers it
from data instead of hardcoded `case` arms.

Expand Down
2 changes: 1 addition & 1 deletion install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -284,7 +284,7 @@ while [[ $# -gt 0 ]]; do
echo "Options:"
echo " --cmd <name> Command & skill folder name (default: agmsg)"
echo " Claude Code: /<cmd>, Codex/Gemini/Antigravity: \$<cmd>"
echo " --agent-type <t> Agent type: claude-code, codex, gemini, antigravity, opencode, hermes, cursor, grok-build"
echo " --agent-type <t> Agent type: claude-code, codex, gemini, antigravity, opencode, hermes, cursor, grok-build, devin"
echo " Selects which template becomes SKILL.md (matches the"
echo " <type> arg passed to join.sh / whoami.sh)"
echo " --update Update skill scripts only (preserve DB and teams)"
Expand Down
21 changes: 21 additions & 0 deletions scripts/drivers/types/devin/_delivery.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
# devin delivery plug — manual inbox checks only.
#
# Devin has no agmsg automatic delivery hook: the only valid mode is `off`
# (enforced by delivery_modes=off in the manifest, which the central gate in
# delivery.sh checks). These overrides keep apply / status / teardown from
# touching a hook file or another agent type's watchers. Sourced into
# delivery.sh's context.

# Nothing to write — manual-only, so no hooks_file is resolved or created.
agmsg_delivery_apply() { :; }

# No hook file to read; the mode is always off.
agmsg_delivery_status() { echo "mode: off"; }

# No watcher or bridge of our own. Do NOT fall through to the default teardown
# (which stops this project's watch.sh) — another agent type may hold a live
# watcher on the same project, and a devin `set off` must not disturb it.
agmsg_delivery_on_disable() {
echo "Devin has no agmsg automatic delivery hook; manual inbox checks only."
}
12 changes: 12 additions & 0 deletions scripts/drivers/types/devin/template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<!-- Devin overlay. -->
<!-- agmsg:slot delivery -->
<!-- agmsg:render-overlay __AGENT_TYPE__ -->
5. Devin has no agmsg automatic delivery hook. Keep delivery `off` and check `__CMD_PREFIX____SKILL_NAME__` manually.
<!-- /agmsg:slot delivery -->
<!-- agmsg:slot execute-extra -->
Devin is not spawnable: an interactive boot mode that can be pre-seeded with agmsg's initial `actas` prompt has not yet been verified, so `spawn` is refused rather than pretending to start a seat. This is unrelated to Hermes's own spawn limitation (#279) and may be revisited separately.
<!-- /agmsg:slot execute-extra -->
<!-- agmsg:slot mode -->
If argument is "mode", run `delivery.sh status __AGENT_TYPE__ "$(pwd)"`.
Only `off` is supported for Devin; reject `monitor`, `turn`, and `both`.
<!-- /agmsg:slot mode -->
7 changes: 7 additions & 0 deletions scripts/drivers/types/devin/type.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# agmsg agent-type manifest — read-only key=value DATA. NEVER sourced.
name=devin
template=template.md
cli=devin
detect_proc=devin devin-*
readiness_sentinel=no
delivery_modes=off
1 change: 1 addition & 0 deletions site/src/i18n/de.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default {
"grok-build": "xAIs Build-/Coding-Agent.",
hermes: "Leichtgewichtiger Relay-Agent.",
antigravity: "Agentische Coding-Umgebung.",
devin: "Autonomer KI-Software-Ingenieur-CLI.",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/en.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default {
"grok-build": "xAI's build/coding agent.",
hermes: "Lightweight relay agent.",
antigravity: "Agentic coding environment.",
devin: "Autonomous AI software engineer CLI.",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/es.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default {
"grok-build": "El agente de compilación/codificación de xAI.",
hermes: "Agente de retransmisión ligero.",
antigravity: "Entorno de codificación agéntico.",
devin: "CLI de ingeniero de software de IA autónomo.",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/fr.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default {
"grok-build": "L'agent de build/codage de xAI.",
hermes: "Agent relais léger.",
antigravity: "Environnement de codage agentique.",
devin: "CLI d'ingénieur logiciel IA autonome.",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/ja.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export default {
"grok-build": "xAIのビルド/コーディングエージェント",
hermes: "軽量なリレーエージェント",
antigravity: "エージェント型のコーディング環境",
devin: "自律型AIソフトウェアエンジニアCLI",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/ko.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export default {
"grok-build": "xAI의 빌드/코딩 에이전트.",
hermes: "경량 릴레이 에이전트.",
antigravity: "에이전틱 코딩 환경.",
devin: "자율형 AI 소프트웨어 엔지니어 CLI.",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/pt-BR.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default {
"grok-build": "Agente de build/codificação da xAI.",
hermes: "Agente de relay leve.",
antigravity: "Ambiente de codificação agêntico.",
devin: "CLI de engenheiro de software de IA autônomo.",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/zh-CN.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ export default {
"grok-build": "xAI 的构建/编程智能体。",
hermes: "轻量级中继智能体。",
antigravity: "智能体编程环境。",
devin: "自主AI软件工程师CLI。",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/i18n/zh-TW.js
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export default {
"grok-build": "xAI 的建置/編碼代理。",
hermes: "輕量級中繼代理。",
antigravity: "代理式編碼環境。",
devin: "自主AI軟體工程師CLI。",
},
},
showcase: {
Expand Down
1 change: 1 addition & 0 deletions site/src/layouts/Home.astro
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ const META = {
copilot: { label: "Copilot CLI", logo: "/logos/copilot.svg", blurb: "GitHub Copilot in the shell." },
cursor: { label: "Cursor Agent", logo: null, blurb: "Cursor's headless CLI agent." },
opencode: { label: "OpenCode", logo: "/logos/opencode.svg", blurb: "Open-source coding agent.", mono: true },
devin: { label: "Devin", logo: null, blurb: "Autonomous AI software engineer CLI." },
"grok-build": { label: "Grok Build", logo: "/logos/grok.svg", blurb: "xAI's build/coding agent.", mono: true },
hermes: { label: "Hermes", logo: "/logos/hermes.png", blurb: "Lightweight relay agent." },
antigravity: { label: "Antigravity", logo: "/logos/antigravity.png", blurb: "Agentic coding environment." },
Expand Down
31 changes: 31 additions & 0 deletions tests/test_delivery.bats
Original file line number Diff line number Diff line change
Expand Up @@ -3178,6 +3178,37 @@ JSON
wait 2>/dev/null || true
}

# --- devin (manual-only: delivery_modes=off, no automatic hook) ---

@test "delivery devin: status is manual/off" {
run bash "$SCRIPTS/delivery.sh" status devin "$TEST_PROJECT"
[ "$status" -eq 0 ]
[[ "$output" =~ "mode: off" ]]
}

@test "delivery devin: rejects automatic modes" {
local mode
for mode in turn monitor both; do
run bash "$SCRIPTS/delivery.sh" set "$mode" devin "$TEST_PROJECT"
[ "$status" -ne 0 ]
[[ "$output" =~ "not supported for devin" ]]
done
}

@test "delivery devin: rejects unknown mode" {
run bash "$SCRIPTS/delivery.sh" set bogus devin "$TEST_PROJECT"
[ "$status" -ne 0 ]
[[ "$output" =~ "Unknown mode" ]]
}

@test "delivery devin: accepts off without error" {
run bash "$SCRIPTS/delivery.sh" set off devin "$TEST_PROJECT"
[ "$status" -eq 0 ]
grep -qF "Delivery mode set to 'off'" <<<"$output"
grep -qF "manual inbox checks only" <<<"$output"
refute grep -qF "AGMSG-DIRECTIVE" <<<"$output"
}

# --- grok-build (turn|off via a markdown rule file .grok/rules/agmsg.md) ---
# Grok passive hooks can't inject (stdout is discarded), so grok delivers via the
# rule-file self-poll model (like gemini/opencode): a .grok/rules/agmsg.md that
Expand Down
8 changes: 4 additions & 4 deletions tests/test_type_registry.bats
Original file line number Diff line number Diff line change
Expand Up @@ -43,11 +43,11 @@ write_node_launcher_fixtures() {
printf '// stub node launcher fixture\n' > "$nd/nodetype-launcher.mjs"
}

@test "type-registry: known_types lists the ten built-ins" {
@test "type-registry: known_types lists the eleven built-ins" {
run env -i PATH="$PATH" bash -c \
"source '$SCRIPTS/lib/type-registry.sh'; agmsg_known_types | sort -u | paste -sd, -"
[ "$status" -eq 0 ]
[ "$output" = "agmsg-app,antigravity,claude-code,codex,copilot,cursor,gemini,grok-build,hermes,opencode" ]
[ "$output" = "agmsg-app,antigravity,claude-code,codex,copilot,cursor,devin,gemini,grok-build,hermes,opencode" ]
}

@test "type-registry: is_known_type accepts a built-in and rejects a bogus type" {
Expand Down Expand Up @@ -256,8 +256,8 @@ EOF
done <<<"$renderable_types"
}

@test "type-registry: spawnable set is exactly eight of the ten built-ins (#277, #279)" {
# hermes deliberately stays out (#279): no known CLI mode starts it
@test "type-registry: spawnable set is exactly eight of the eleven built-ins (#277, #279)" {
# hermes and devin deliberately stay out (#279): no known CLI mode starts them
# interactive with a seeded initial prompt. agmsg-app also stays out: it's
# the desktop app itself (spawnable=no), not a spawnable agent type.
run env -i PATH="$PATH" bash -c \
Expand Down
Loading