diff --git a/README.ja.md b/README.ja.md index 2bb4e11b9..0734fdb25 100644 --- a/README.ja.md +++ b/README.ja.md @@ -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`) diff --git a/README.md b/README.md index aed9141d1..867c2ac25 100644 --- a/README.md +++ b/README.md @@ -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`) diff --git a/docs/agent-types.md b/docs/agent-types.md index 92d57eb72..b96c71f08 100644 --- a/docs/agent-types.md +++ b/docs/agent-types.md @@ -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. diff --git a/install.sh b/install.sh index 5d86b316b..dab2aa8ee 100755 --- a/install.sh +++ b/install.sh @@ -284,7 +284,7 @@ while [[ $# -gt 0 ]]; do echo "Options:" echo " --cmd Command & skill folder name (default: agmsg)" echo " Claude Code: /, Codex/Gemini/Antigravity: \$" - echo " --agent-type Agent type: claude-code, codex, gemini, antigravity, opencode, hermes, cursor, grok-build" + echo " --agent-type Agent type: claude-code, codex, gemini, antigravity, opencode, hermes, cursor, grok-build, devin" echo " Selects which template becomes SKILL.md (matches the" echo " arg passed to join.sh / whoami.sh)" echo " --update Update skill scripts only (preserve DB and teams)" diff --git a/scripts/drivers/types/devin/_delivery.sh b/scripts/drivers/types/devin/_delivery.sh new file mode 100644 index 000000000..4cc7d5ebe --- /dev/null +++ b/scripts/drivers/types/devin/_delivery.sh @@ -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." +} diff --git a/scripts/drivers/types/devin/template.md b/scripts/drivers/types/devin/template.md new file mode 100644 index 000000000..40b3a675a --- /dev/null +++ b/scripts/drivers/types/devin/template.md @@ -0,0 +1,12 @@ + + + + 5. Devin has no agmsg automatic delivery hook. Keep delivery `off` and check `__CMD_PREFIX____SKILL_NAME__` manually. + + +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. + + +If argument is "mode", run `delivery.sh status __AGENT_TYPE__ "$(pwd)"`. +Only `off` is supported for Devin; reject `monitor`, `turn`, and `both`. + diff --git a/scripts/drivers/types/devin/type.conf b/scripts/drivers/types/devin/type.conf new file mode 100644 index 000000000..ce659b407 --- /dev/null +++ b/scripts/drivers/types/devin/type.conf @@ -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 diff --git a/site/src/i18n/de.js b/site/src/i18n/de.js index 1e68d08e5..bdd93d71c 100644 --- a/site/src/i18n/de.js +++ b/site/src/i18n/de.js @@ -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: { diff --git a/site/src/i18n/en.js b/site/src/i18n/en.js index e1364fe7f..69fd15a35 100644 --- a/site/src/i18n/en.js +++ b/site/src/i18n/en.js @@ -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: { diff --git a/site/src/i18n/es.js b/site/src/i18n/es.js index 9d3979ffa..17ba3914d 100644 --- a/site/src/i18n/es.js +++ b/site/src/i18n/es.js @@ -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: { diff --git a/site/src/i18n/fr.js b/site/src/i18n/fr.js index 013b2fbe7..577e80cbd 100644 --- a/site/src/i18n/fr.js +++ b/site/src/i18n/fr.js @@ -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: { diff --git a/site/src/i18n/ja.js b/site/src/i18n/ja.js index f90ca11bb..a7757fa3b 100644 --- a/site/src/i18n/ja.js +++ b/site/src/i18n/ja.js @@ -71,6 +71,7 @@ export default { "grok-build": "xAIのビルド/コーディングエージェント", hermes: "軽量なリレーエージェント", antigravity: "エージェント型のコーディング環境", + devin: "自律型AIソフトウェアエンジニアCLI", }, }, showcase: { diff --git a/site/src/i18n/ko.js b/site/src/i18n/ko.js index cd7e3dd1f..0bafb5ea2 100644 --- a/site/src/i18n/ko.js +++ b/site/src/i18n/ko.js @@ -71,6 +71,7 @@ export default { "grok-build": "xAI의 빌드/코딩 에이전트.", hermes: "경량 릴레이 에이전트.", antigravity: "에이전틱 코딩 환경.", + devin: "자율형 AI 소프트웨어 엔지니어 CLI.", }, }, showcase: { diff --git a/site/src/i18n/pt-BR.js b/site/src/i18n/pt-BR.js index 0086608f1..17dd4ee26 100644 --- a/site/src/i18n/pt-BR.js +++ b/site/src/i18n/pt-BR.js @@ -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: { diff --git a/site/src/i18n/zh-CN.js b/site/src/i18n/zh-CN.js index 783e04f53..cf3a35c1a 100644 --- a/site/src/i18n/zh-CN.js +++ b/site/src/i18n/zh-CN.js @@ -71,6 +71,7 @@ export default { "grok-build": "xAI 的构建/编程智能体。", hermes: "轻量级中继智能体。", antigravity: "智能体编程环境。", + devin: "自主AI软件工程师CLI。", }, }, showcase: { diff --git a/site/src/i18n/zh-TW.js b/site/src/i18n/zh-TW.js index 550f753b6..b5d62acad 100644 --- a/site/src/i18n/zh-TW.js +++ b/site/src/i18n/zh-TW.js @@ -73,6 +73,7 @@ export default { "grok-build": "xAI 的建置/編碼代理。", hermes: "輕量級中繼代理。", antigravity: "代理式編碼環境。", + devin: "自主AI軟體工程師CLI。", }, }, showcase: { diff --git a/site/src/layouts/Home.astro b/site/src/layouts/Home.astro index 2ae781075..c1dc160ca 100644 --- a/site/src/layouts/Home.astro +++ b/site/src/layouts/Home.astro @@ -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." }, diff --git a/tests/test_delivery.bats b/tests/test_delivery.bats index 3981724c9..90dab4dbc 100644 --- a/tests/test_delivery.bats +++ b/tests/test_delivery.bats @@ -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 diff --git a/tests/test_type_registry.bats b/tests/test_type_registry.bats index 2de43b306..00cba68c1 100644 --- a/tests/test_type_registry.bats +++ b/tests/test_type_registry.bats @@ -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" { @@ -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 \