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 上安装并调用闭源 junie CLI 二进制)
  • 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
  • Stop hook 可强制重试(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-limitconfig.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.mdSessionStart 的 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):ReadBashGlobGrepWriteEditWebSearchAskUserQuestion
  • 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、可执行命令 executablesmcpTools、项目外读取 readOutsideProject)默认需审批,除非命中 allowlist(~/.junie/allowlist.json)或 Brave mode 为 Auto/On。Brave mode Auto 由内部安全分类器自动判定终端命令是否放行(docs/action-allowlist.md)。
  • PreToolUse hook(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)。

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(仅委派可并行的独立工作,始终同模型)vs Auto(默认;委派工作可用更便宜的模型档位)。
  • 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.json URL)分发。同时支持原生 (.junie-extension/marketplace.json) 和 Claude-plugin 兼容格式 (.claude-plugin/marketplace.json) 两种 manifest——意味着任何 Claude Code plugin marketplace 都能直接注册进 Junie CLI,是与 Claude Code 插件生态的直接互操作点。内置市场:github.com/JetBrains/junie-extensionsdocs/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_inputerror/error_detailsreasonprompt)——是目前文档中最接近”trace 格式”的东西,且明确设计为与 Claude Code 的 hook JSON 线协议兼容,使脚本可跨 harness 复用(docs/hooks.md)。
  • GitHub Action 输出参数branch_namecommit_shapr_urljunie_titlejunie_summaryshould_skipgithub_token——结构化 CI 级可观测性(docs/github-action.md)。
  • 未发现公开的完整 OpenTelemetry 风格 trace schema 或 eval dashboard。

安全与权限(审批门、密钥管理)

  • 命令审批 / Action Allowlist~/.junie/allowlist.json,四类操作(fileEditingexecutablesmcpToolsreadOutsideProject),按顺序的 prefix/glob 规则 → allow/ask,first-match-wins,defaultBehavior 兜底(docs/action-allowlist.md)。
  • Brave mode:三档——Off(始终询问)、Auto(内部安全分类器自动放行判定安全的命令)、On(不询问,最宽松),Ctrl+B//brave 切换。
  • PermissionRequest hook(EAP):可脚本化地自动 allow/deny 审批弹窗本身,按工具名(BashEditRead 或 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供应商模型
    sonnetAnthropicClaude Sonnet 4.6
    opusAnthropicClaude Opus 4.8
    gptOpenAIGPT-5.4
    gpt-codexOpenAIGPT-5.3-codex
    gemini-proGoogleGemini 3.1 Pro Preview
    gemini-flashGoogleGemini 3 Flash
    grokxAIGrok 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 命令 / --effort flag / 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 对比)

  1. Hook 协议主动兼容 Claude Codedocs/hooks.md 明确声明 StopFailure 的字段名与 Claude Code 一致,“so a Claude-style hook script can be reused”,是已知 harness 中少见的主动声明互操作性的例子。
  2. Extension marketplace 双格式兼容 Claude plugin.claude-plugin/marketplace.json 可直接被 Junie 识别注册,直接打通两个生态的插件分发,而非另起炉灶。
  3. 模型选择的双模型分工(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.md
    • 2025-10-spec-driven-approach.md
    • 2026-03-junie-cli-llm-agnostic-beta.md
    • 2026-04-junie-cli-inside-your-jb-ide.md
    • 2026-06-junie-ga-out-of-beta.md
  • docs/(23 篇官方文档页):
    • acp-clients.mdaction-allowlist.mdagent-skills.mdbyok.mdcode-review-agent.mdconfig-json.mdcustom-llm-models.mddebug-mode.mdextensions.mdgithub-action.mdguidelines-and-memory.mdheadless-mode.mdhooks.mdide-integration.mdjunie-cli-quickstart.mdmcp-configuration.mdmodel-selection.mdparallel-sessions-worktrees.mdplan-mode.mdremote-mode.mdslash-commands-reference.mdsubagents.md

已知缺口(第一阶段标注,未来可补抓):custom-slash-commands.htmlcustom-proxies.htmljunie-cli-eap.htmlparameters.html(CLI flag 参考)、environment-variables.htmljunie-ide-plugin.html、Jira/YouTrack/GitLab CI 集成 cookbook 页面,以及任何 JetBrains 工程向(非产品文档向)的架构深度分享,均未在本轮抓取到。