JetBrains Junie
一句话定位
JetBrains 出品的闭源 IDE/CLI coding agent,主打 “one engine, many surfaces”(IDE 插件、CLI、GitHub Action 共用同一后端)与显式 LLM-agnostic(Anthropic/OpenAI/Google/xAI 多供应商可切换、BYOK 优先计费),2026-06-17 正式 GA(脱离 beta)。
核心架构总览(目录结构关键路径 + 引用的 commit)
无公开源码,无 commit 可引用。 Junie CLI / IDE 插件 / 后端 agent 编排代码均未开源,是绑定 JetBrains AI 订阅(也支持 BYOK)的闭源商业产品。GitHub 上仅有周边胶水仓库:
github.com/JetBrains/junie-github-action— GitHub Action 包装器(在 runner 上安装并调用闭源junieCLI 二进制)github.com/JetBrains/junie-extensions— 官方 extensions 市场(skills/MCP/subagents/commands/guidelines 打包),非 agent 本体github.com/JetBrains/junie-guidelines— 各技术栈AGENTS.md示例目录,纯文档github.com/JetBrains/skills— 文档中引用的可导入 Agent Skills 来源(如spring-kotlin-code-review),非 agent 本体
版本标记:CLI 通过 curl -fsSL https://junie.jetbrains.com/install.sh | bash 滚动安装,文档未见固定版本号;文档站统一标注 “Last modified: 04 July 2026”;IDE 插件深度集成要求 IDE 版本 2026.1+。
以下所有结论均来自 JetBrains 官方 blog 与官方文档站(junie.jetbrains.com/docs/),非源码分析,本页所有”文件路径”指本地存档的官方文档/blog 页面路径,不是 Junie 自身代码路径。
Agent Loop(主循环 / 何时继续何时停)
据 docs/hooks.md 披露的 hook 生命周期事件推断出的主循环骨架:
SessionStart → (UserPromptSubmit → PreToolUse×N 循环) → Stop | StopFailure → SessionEnd
Stophook 可强制重试(block,同一任务内连续 block 上限 8 次,可用环境变量JUNIE_STOP_HOOK_BLOCK_CAP覆盖),也可通过continue:false硬性终止。StopFailure是纯观测性事件,附带 9 值错误分类:rate_limit / authentication_failed / billing_error / invalid_request / server_error / max_output_tokens / unknown / model_refused / country_forbidden。- 任务/会话存在可配置的 time-limit(
config.json字段)与 step 上限(Remote Mode 文档提到”Continue the task after the step limit is reached”这一 web UI 动作,间接证实存在单任务最大步数上限,具体默认值未披露)。 - Plan mode 改变循环形态:只读探索阶段 → 生成 plan 产物 → 用户确认 → 实现阶段,是人工审批网关介入的两阶段循环(非独立 planner agent,见”Router/编排”节)。
- Subagent 作为隔离子循环运行:“works independently in its own context and returns the result to the main agent”(
docs/subagents.md),拥有独立maxTurns上限。 - 闭源,无法验证实际循环实现,以上均为文档层面推断。
记忆与上下文管理(压缩、长期记忆、会话持久化)
- 会话持久化:
docs/junie-cli-quickstart.md明确 “Junie stores the full session context, including LLM usage data and the history of user prompts and agent responses, for the last 10 sessions”。 - 压缩是显式生命周期事件:
docs/hooks.md中SessionStart的 source 值包含compact——“The agent triggers history compaction inside a running task (the SessionStart hook is dispatched on the synthetic compaction session)“。压缩算法/触发阈值均未披露。 - Guidelines 是持久上下文,非 ML 意义上的记忆:
AGENTS.md/.junie/guidelines.md注入每个任务的上下文(docs/guidelines-and-memory.md)。发现顺序:.junie/AGENTS.md→ 根目录AGENTS.md→.junie/guidelines.md或.junie/guidelines/(legacy,仍受支持);另有全局~/.junie/AGENTS.md,项目级与全局合并、去重,冲突时项目覆盖全局。 - 内部 “fasterModel” 承担”记忆抽取”:
docs/model-selection.md明确将 “Extracting information for memory” 列为路由给更便宜模型的内部任务类别之一,暗示存在某种记忆抽取管线,但抽取内容存于何处、格式为何均未披露。 - 会话历史/transcript(
Ctrl+T、/history)是会话级 scrollback,不是跨会话语义记忆。 - 未发现跨项目的长期向量/语义记忆存储;最接近的是静态的 guidelines 文件与静态的 Agent Skills 文件。
工具体系(定义/调用协议/注册/权限)
- 内置工具分类(用于 subagent 的 allow/deny 列表,来自
docs/subagents.md):Read、Bash、Glob、Grep、Write、Edit、WebSearch、AskUserQuestion。 - MCP 是主要的外部工具扩展机制:JSON 配置位于
.junie/mcp/mcp.json(项目级)或~/.junie/mcp/mcp.json(用户级);支持本地(npx/Docker/二进制子进程)与远程(HTTP/HTTPS,含 OAuth)server;通过/mcp与 “MCP Installation Assistant” 管理,后者会从官方 MCP registry(registry.modelcontextprotocol.io)解析配置(docs/mcp-configuration.md)。 - 权限门:敏感操作(项目外文件编辑
fileEditing、可执行命令executables、mcpTools、项目外读取readOutsideProject)默认需审批,除非命中 allowlist(~/.junie/allowlist.json)或 Brave mode 为 Auto/On。Brave mode Auto 由内部安全分类器自动判定终端命令是否放行(docs/action-allowlist.md)。 PreToolUsehook(EAP)可在工具执行前编程式地 allow/ask/block,并可改写updatedInput、注入additionalContext——叠加在静态 allowlist 之上的可编程扩展点(docs/hooks.md)。- Debug mode 切换到专用工具子集:会话控制(launch/attach/step)、断点管理、状态检视、表达式求值——激活时明确不含文件编辑工具(
docs/debug-mode.md)。 - Code-review subagent 使用受限只读工具子集(不编辑/不构建/不提交,
docs/code-review-agent.md)。
Prompt 设计(系统提示结构、动态组装)
- 未发现任何逐字系统提示泄露(闭源,本次调研未做 prompt injection/leak 尝试,超出”仅官方披露”任务范围)。
- 动态组装的结构性证据:
- Guidelines(
AGENTS.md)被注入”every task”上下文(docs/guidelines-and-memory.md)。 - Agent Skills 采用 progressive disclosure:name+description 始终在上下文中,完整
SKILL.md正文仅在被判定相关时才加载(docs/agent-skills.md)——与 Anthropic Agent Skills 规范的两阶段 prompt 组装设计一致。 - Subagent 的 prompt = frontmatter 配置的 system prompt 正文 + (若
allowPromptArgument: true且未显式引用$prompt)自动追加的User Input: ...(docs/subagents.md)。 - GitHub Action 有
use_structured_prompt开关:“Uses the new structured prompt format with XML tags for better organization”(默认true)——证实 JetBrains 在至少 CI/CD 这一面使用 XML 标签化 prompt 分段,与 Anthropic 风格 prompt 工程惯例一致(docs/github-action.md)。 - Plan mode 会切换系统行为(“focuses on understanding the task and shaping a concrete implementation plan rather than modifying the project”)——暗示存在 mode-conditional 的系统指令切换,不只是工具限制(
docs/plan-mode.md)。
- Guidelines(
Router / 编排(任务分解、多 agent、子 agent)
- Subagent 是主要的多 agent 机制:主 agent 自动发现
.junie/agents/*.md与.agents/*.md(项目级)或~/.junie/agents//~/.agents/(用户级),按name+description与任务的相似度匹配后委派,subagent 在隔离上下文中独立工作,结果返回主会话(docs/subagents.md)。 - 仅支持自动委派——文档明确将其与”手动调用的自定义 slash command”对比,subagent 没有手动调用入口。
- Subagent 模型选择策略(EAP,
/settings→Subagents):SameModelOnly(仅委派可并行的独立工作,始终同模型)vsAuto(默认;委派工作可用更便宜的模型档位)。 - Code review 是内置的专用 subagent 实例,有自己的受限工具与 prompt——是该模式的一等示例。
- 未发现独立的 “planner” vs “executor” 多 agent 拆分:Plan mode 被文档描述为单一 agent 改变自身行为的两阶段流程,而非委派给独立的规划 agent。
- GitHub Action / GitLab CI / headless mode 是部署面而非独立 agent——GA blog 原话 “One engine, many surfaces… The same agent is behind the AI chat, the dedicated Junie tool window, and Junie CLI”(
blog/2026-06-junie-ga-out-of-beta.md)。
Skill / 插件体系
- Agent Skills:完整实现开放的
agentskills.io规范。.junie/skills/<name>/SKILL.md(YAML frontmatter:name必填,description建议填,否则 fallback 到正文首段)+ 可选scripts/、templates/、checklists/子目录。项目级 scope 在命名冲突时覆盖用户级。支持跨 agent 导入检测:.cursor/skills/、.claude/skills/、.codex/skills/(docs/agent-skills.md)。 - Extensions:更高层的打包机制,将 {skills, MCP servers, subagents, slash commands, guidelines} 通过 marketplace(git repo / 本地目录 / 直接
marketplace.jsonURL)分发。同时支持原生 (.junie-extension/marketplace.json) 和 Claude-plugin 兼容格式 (.claude-plugin/marketplace.json) 两种 manifest——意味着任何 Claude Code plugin marketplace 都能直接注册进 Junie CLI,是与 Claude Code 插件生态的直接互操作点。内置市场:github.com/JetBrains/junie-extensions(docs/extensions.md)。 - 自定义 slash command(文档中引用但本次未抓取到专门页面
custom-slash-commands.html)是独立的、手动调用的扩展点,与 subagent 的自动委派形成对比。
自进化能力(自我改进 / 学习型记忆 / eval 驱动纠错)
未实现 / 官方未披露自主自我修改或 eval 驱动的自我纠错循环。
最接近的类比(均为人在环,非自主):
- “Ask Junie to create a skill for your project”——用户在任务完成后手动提示 “create a skill from them so we follow the same approach next time”,即人工触发的经验蒸馏,非自动化(
docs/agent-skills.md)。 - Plan mode 的”活文档”在需求变化时更新——是产物层面的自适应,不是 agent/模型自身的自我改进。
- 未发现任何关于 RL 微调、eval 门控部署、或轨迹驱动模型更新的公开披露。
结论:不实现 / 未公开披露。
可观测性(日志 / trace 格式)
- 本地日志文件:
~/.junie/logs/junie.log(IDE 集成故障排查表中用于诊断Auth required/Error状态,docs/ide-integration.md)。 - 会话 transcript:CLI 内
Ctrl+T查看当前会话完整 prompt/response 历史;/history跨会话浏览(10-session 保留期);/usage展示按会话的 token/成本/模型分解;/feedback提交反馈时自动附加会话日志 ZIP(docs/junie-cli-quickstart.md)。 - Hook 即结构化事件流:每个 hook 在 stdin 收到一行 JSON,按事件类型有明确 schema(
hook_event_name加事件专属字段如tool_name/tool_input、error/error_details、reason、prompt)——是目前文档中最接近”trace 格式”的东西,且明确设计为与 Claude Code 的 hook JSON 线协议兼容,使脚本可跨 harness 复用(docs/hooks.md)。 - GitHub Action 输出参数:
branch_name、commit_sha、pr_url、junie_title、junie_summary、should_skip、github_token——结构化 CI 级可观测性(docs/github-action.md)。 - 未发现公开的完整 OpenTelemetry 风格 trace schema 或 eval dashboard。
安全与权限(审批门、密钥管理)
- 命令审批 / Action Allowlist:
~/.junie/allowlist.json,四类操作(fileEditing、executables、mcpTools、readOutsideProject),按顺序的 prefix/glob 规则 →allow/ask,first-match-wins,defaultBehavior兜底(docs/action-allowlist.md)。 - Brave mode:三档——Off(始终询问)、Auto(内部安全分类器自动放行判定安全的命令)、On(不询问,最宽松),
Ctrl+B//brave切换。 PermissionRequesthook(EAP):可脚本化地自动 allow/deny 审批弹窗本身,按工具名(Bash、Edit、Read或 MCP server 名)匹配;hook 失败或不匹配时回退到常规弹窗(docs/hooks.md)。- 密钥管理:JetBrains 订阅认证(JetBrains Account 或
JUNIE_API_KEY)vs BYOK(Anthropic/OpenAI/Google/xAI/OpenRouter/自定义 profile API key);当模型两种方式都可用时 BYOK key 优先计费(docs/byok.md)。GitHub Action 自动在工作流日志中屏蔽所有 API key。Remote Mode 在 JetBrains AI Enterprise SSO 登录下明确禁用(须改用个人 JetBrains Account 或 API key)——企业安全场景下的专门限制(docs/remote-mode.md)。 - hook/config 的供应链安全:
.junie/config.json中的项目级hooks默认被忽略(仅信任用户级配置或显式传入的--config-location文件)——明确设计用于防止恶意仓库通过提交的 config 文件注入任意 shell hook(docs/hooks.md)。 - 第三方 skill/extension 警告:文档明确建议将 skill 视为”third-party code”同等谨慎对待,建议 pin 到具体 commit/tag 而非分支(
docs/agent-skills.md)。 - GitHub Action 在客户自己的 GitHub runner 上运行(“your code always stays on your infrastructure”)——该路径无 JetBrains 托管的执行沙箱(
docs/github-action.md)。
沙箱与执行隔离
- 未披露 JetBrains 托管的远程沙箱/VM 用于 CLI 或 IDE agent 的常规任务执行——Junie CLI 直接在用户自己的 shell/IDE 环境中执行;隔离手段是审批门/allowlist 体系(见”安全与权限”),不是硬件/容器沙箱。
- Git worktree 是官方文档记录的并行会话间文件级隔离机制(
/worktree命令创建形如<project>-junie-wt-01的兄弟目录,docs/parallel-sessions-worktrees.md)——这是工作区隔离,不是进程/安全沙箱。 - Demo agent(
/demo <arg>)被描述为运行”inside a disposable VM”——这是文档中唯一明确提到的基于 VM 的沙箱,但仅限 demo/展示功能,不用于一般任务执行(docs/slash-commands-reference.md:“Launch a visual demo of a feature inside a disposable VM”)。 - GitHub Action 在 GitHub 提供的 runner 上执行(客户可控的 CI 沙箱,非 JetBrains 提供)。
- 结论:面向日常编码任务的通用沙箱化/隔离执行未实现/未披露;唯一确认的沙箱是狭窄的 “Demo agent” 功能所用的一次性 VM,以及 CI 集成场景下标准 GitHub Actions runner 隔离。
与模型的协同设计
-
明确定位为 LLM-agnostic / 多供应商架构:JetBrains(Junie)与模型(Anthropic/OpenAI/Google/xAI)架构上解耦;GA blog 原话:“Junie supports any model, without lock-in… Cost efficiency stops being a property of the tool and becomes a dial you hold.”(
blog/2026-06-junie-ga-out-of-beta.md) -
文档记载的 alias→model 映射表(
docs/model-selection.md,截至 2026-07-04 文档版本):alias 供应商 模型 sonnetAnthropic Claude Sonnet 4.6 opusAnthropic Claude Opus 4.8 gptOpenAI GPT-5.4 gpt-codexOpenAI GPT-5.3-codex gemini-proGoogle Gemini 3.1 Pro Preview gemini-flashGoogle Gemini 3 Flash grokxAI Grok 4.3 (已用
docs/model-selection.md第 89、111-117 行核实以上映射准确无误。)Alias 由 JetBrains “own internal evaluations” 设定,不必然对应各家最新发布版本。 -
披露了双模型架构:主模型(用户选择)做主推理;一个独立、自动选择的 “fasterModel”(同供应商家族,如 Anthropic 主模型配 Claude Haiku、Google 配 Gemini Flash,但”not always smaller”——如非 OpenAI 主模型下仍可能用 GPT-4.1 做路由)承担上下文摘要、任务分类/路由、记忆抽取、能力过滤,BYOK 模式下同样适用。
-
推理强度(reasoning effort)作为一等拨盘:
/effort命令 /--effortflag /JUNIE_EFFORT环境变量,档位minimal, low, medium, high, xhigh, max(各模型支持程度不同)——与供应商的 reasoning/thinking-budget API 直接对应(Claude 的 extended thinking、GPT-5 的 reasoning-effort 参数)。文档明确建议不要默认调高(“higher effort levels do not always produce noticeably better results, but can cost significantly more”)。该 “Think More” 开关在 GA 之前已存在(见 2025-10 blog),与 GA 正式formalize 的 effort-level 体系一一对应。“Default” 模型是”由 JetBrains 选定的、随时间变化的最佳性价比动态选项”。 -
BYOK 成本/模型联动:当订阅与 BYOK key 都能访问某模型时,请求路由到能授权访问的一方,BYOK 部分直接向供应商计费。
-
本地/自托管模型支持:Ollama、LM Studio、LiteLLM,通过自定义 JSON model profile 接入;文档明确警告小型/量化模型会导致 Junie agent loop 出现 tool call 格式错误、行为漂移、循环(并将其定性为”底层模型的局限,不是 Junie 的缺陷”)——反映 harness 可靠性对模型能力的强耦合(
docs/custom-llm-models.md)。
轨迹利用(session/trajectory 是否反哺训练/评测)
- 未发现 Junie 会话/轨迹数据被用于训练或微调模型的公开披露。
- JetBrains 针对本地模型模式明确声明”Prompts and code never shared externally”(GA blog)——反推订阅/托管模式下确实存在向 JetBrains/模型供应商的数据流动,但没有关于轨迹被用于训练的明确声明。
- 外部评测基准:SWE-Rebench(swe-rebench.com,独立第三方基准,“每轮抽取新任务”)被引用作为验证——Junie 在引用的周期中排名第一harness(61.6% resolved,72.7% pass@5),引语来自该基准运营方 Nebius 的 Research Lead Alexander Golubev(非 JetBrains 自述)——这是外部评测,不是 JetBrains 自陈的内部轨迹驱动 eval 循环。
- “Junie Developer Experience Survey”(2025年6月,n=272)是定性的使用/满意度调研(83% 的管理者报告生产力提升),不是轨迹/RL 数据。
- 结论:未实现 / 官方未披露 作为训练反馈机制;仅披露了第三方基准验证与用户满意度调研。
与同类 harness 的关键差异(1-3 条,可以先留一句概述,后续 synthesis 阶段会做跨 harness 对比)
- Hook 协议主动兼容 Claude Code:
docs/hooks.md明确声明StopFailure的字段名与 Claude Code 一致,“so a Claude-style hook script can be reused”,是已知 harness 中少见的主动声明互操作性的例子。 - Extension marketplace 双格式兼容 Claude plugin:
.claude-plugin/marketplace.json可直接被 Junie 识别注册,直接打通两个生态的插件分发,而非另起炉灶。 - 模型选择的双模型分工(primary + fasterModel)在文档中相对详细:多数同类 harness 对”用小模型做路由/摘要”这类内部机制通常语焉不详,Junie 的文档罕见地列出了具体内部任务类别(摘要/路由/记忆抽取/能力过滤)与对应模型选择逻辑。
跨 harness 系统性对比留待 synthesis 阶段。
原始源码定位
- repo: 无公开源码(闭源商业产品)
- commit/version analyzed: 无可引用 commit;文档站版本戳 “Last modified: 04 July 2026”;调研 fetch 日期 2026-07-07
- 关键文件列表(相对路径,均为本地存档的官方文档/blog,非 Junie 自身代码):
docs/hooks.md— 生命周期事件、Stop/StopFailure/PreToolUse/PermissionRequest 协议docs/subagents.md— subagent 规范与内置工具分类docs/model-selection.md— alias→model 映射表、fasterModel 机制docs/agent-skills.md— Agent Skills 规范实现docs/extensions.md— extension marketplace 双格式兼容docs/action-allowlist.md/docs/remote-mode.md/docs/byok.md— 权限与密钥管理docs/guidelines-and-memory.md— guidelines 发现顺序与合并规则docs/github-action.md— CI 部署面、结构化 prompt、输出参数blog/2026-06-junie-ga-out-of-beta.md— GA 公告,“one engine many surfaces”,SWE-Rebench 排名
一手源存档(sources/)
/Users/zhao/projects/self-wiki/ai-research/sources/harness/jetbrains-junie/ 下:
NOTES.md— 第一阶段完整调研笔记blog/(5 篇官方博客,2025-07 至 2026-06):2025-07-agentic-ai-era.md2025-10-spec-driven-approach.md2026-03-junie-cli-llm-agnostic-beta.md2026-04-junie-cli-inside-your-jb-ide.md2026-06-junie-ga-out-of-beta.md
docs/(23 篇官方文档页):acp-clients.md、action-allowlist.md、agent-skills.md、byok.md、code-review-agent.md、config-json.md、custom-llm-models.md、debug-mode.md、extensions.md、github-action.md、guidelines-and-memory.md、headless-mode.md、hooks.md、ide-integration.md、junie-cli-quickstart.md、mcp-configuration.md、model-selection.md、parallel-sessions-worktrees.md、plan-mode.md、remote-mode.md、slash-commands-reference.md、subagents.md
已知缺口(第一阶段标注,未来可补抓):custom-slash-commands.html、custom-proxies.html、junie-cli-eap.html、parameters.html(CLI flag 参考)、environment-variables.html、junie-ide-plugin.html、Jira/YouTrack/GitLab CI 集成 cookbook 页面,以及任何 JetBrains 工程向(非产品文档向)的架构深度分享,均未在本轮抓取到。