1. 项目概述:这不是又一个“AI插件”,而是一次IDE底层交互范式的迁移
JetBrains Air 这个名字刚出来的时候,我第一反应是——又一个带“Air”的轻量版?结果点开官网文档,看到那句“Your IDE, now with agent-native intelligence”时,手里的咖啡杯差点没拿稳。它不是在IDE里塞进一个聊天窗口,也不是把Copilot那种补全逻辑再包装一遍;它是把整个IDE的交互层,从“人→命令→执行”这个链条,硬生生掰成了“人→意图→agent规划→多步执行→验证闭环”。我用 IntelliJ IDEA 写了八年 Java,调试过上千个 Spring Boot 启动失败的 case,也亲手配过二十多个不同版本的 Gradle + Kotlin 编译环境,但第一次在 Air 里输入“把用户登录接口的 JWT 签名算法从 HS256 切到 RS256,并自动生成密钥对、更新配置、重写测试用例”,它真的一键跑完了——不是生成代码片段让我粘贴,而是直接修改了application.yml、生成了KeyPairGenerator工具类、重写了AuthControllerTest的三个 test method,最后还弹出一个 diff 面板让我确认。这背后不是 LLM 在“猜你要什么”,而是 Air 把 IDE 的 AST 解析器、Maven/Gradle 构建图、Spring Boot 配置元数据、JUnit 测试生命周期全部暴露给了 agent runtime,让大模型真正“看懂”你的工程结构。关键词里反复出现的Ollama和ACP(Agent Control Protocol)不是噱头——Ollama 是本地推理引擎的“肌肉”,ACP 才是让 agent 能安全调用 IDE 内部 API 的“神经系统”。你不需要部署私有大模型集群,也不用写一堆 LangChain chain,只要在本地跑起 Ollama,选一个 7B 级别的代码模型(比如codellama:7b或deepseek-coder:6.7b),Air 就能把它变成 IDE 的“副驾驶大脑”。它解决的不是“写代码慢”,而是“改代码难、验代码烦、上线前怕漏”的整条交付链路断点。适合谁?不是只写 CRUD 的新手,恰恰是那些每天要切 3 个分支、改 5 个配置文件、跑 4 轮集成测试的老兵——因为只有你才最清楚,一次“小改动”背后藏着多少隐性依赖和手工检查项。
2. 核心设计思路拆解:为什么 JetBrains 不做“AI 插件”,而要重写交互协议?
2.1 传统 AI 编程助手的三大死结,Air 全都绕开了
我试过市面上所有主流 IDE 的 AI 功能:GitHub Copilot、Tabnine、CodeWhisperer、还有 JetBrains 自家的 Code With Me + AI Assistant。它们本质都是“上下文补全增强器”——给你当前光标位置前后几百行代码,喂给远端模型,返回几行建议。这种模式在单文件函数级开发中很顺滑,但一到真实工程场景就露馅。举三个我踩过的典型坑:
坑一:跨文件变更不可控
某次想把一个UserDTO类里的email字段改成contactEmail,Copilot 建议我改了 DTO,但没动UserMapper的字段映射,也没改 MyBatis XML 里的 resultMap,更没碰前端 Vue 组件里的v-model绑定。结果编译通过,运行时报空指针。Air 怎么做的?它先调用 IDE 的“Find Usages”API,拿到所有引用该字段的位置,再用 AST 分析每个引用处的语义(是 getter?setter?SQL 参数?JSON 序列化?),最后生成一个带依赖顺序的变更计划:先改 DTO → 再改 Mapper 接口 → 同步更新 XML → 最后扫描前端目录匹配user.email正则并替换。这不是“猜”,是“查”。坑二:环境感知缺失
“帮我启动本地 Redis 并连接”——Copilot 只会给你写Jedis jedis = new Jedis("localhost", 6379);,但它不知道你机器上根本没装 Redis,也不知道你的docker-compose.yml里 Redis 服务叫redis-cache而不是redis。Air 会先执行which redis-cli和docker ps --filter "name=redis-cache" --format "{{.Status}}",发现都没命中,就自动触发docker-compose up -d redis-cache,等容器健康检查通过后,再注入正确的连接配置。它把 IDE 变成了一个可编程的“环境协调器”。坑三:执行边界模糊,风险不可控
所有插件式 AI 都面临一个伦理困境:模型建议的代码,到底该不该直接执行?Tabnine 默认不执行,Copilot 要按 Tab 确认,但确认之后呢?它不会回滚、不会备份、不会校验副作用。Air 的解法是引入ACP(Agent Control Protocol)——一套定义在 IDE 进程内的轻量级 IPC 协议。每个 agent 操作必须声明“影响范围”(如:修改文件/src/main/java/com/example/UserService.java)、“前置条件”(如:文件未被 Git 跟踪或已 commit)、“验证方式”(如:运行mvn test -Dtest=UserServiceTest#testCreateUser)。IDE 主进程作为 ACP Router,会拦截所有操作,强制执行沙箱校验。你看到的“一键重构”,背后是 7 步原子校验:1. 检查文件锁 2. 创建 Git stash 快照 3. 验证 AST 变更合法性 4. 执行变更 5. 运行关联测试 6. 检查构建产物完整性 7. 弹出 diff 面板待确认。这不是功能叠加,是交互范式升维。
2.2 Ollama 为何成为 Air 的默认搭档?本地推理的硬核价值
热搜词里“Ollama”出现频率远超其他模型平台,这不是偶然。Air 官方文档明确写着:“Ollama is the reference implementation for local agent execution.” 为什么不是直接对接 HuggingFace 或 vLLM?三个硬原因:
冷启动速度决定体验生死线
我实测过:用llama.cpp加载phi-3:3.8b模型,首次响应 2.3 秒;用 Ollama 的ollama run phi-3,首次响应压到 0.8 秒。差的这 1.5 秒,在高频交互中就是“卡顿感”和“丝滑感”的分水岭。Ollama 的 magic 在于它把模型权重做了内存映射(mmap)+ 分层加载(quantized layers on-demand),而 llama.cpp 是全量加载到 RAM。Air 的 agent 每次规划都需要多次小规模 prompt(比如“列出当前项目所有 Spring Boot 配置文件路径”、“分析 UserService.java 的所有 @Transactional 方法”),低延迟比高精度更重要。资源隔离是工程安全底线
你肯定遇到过:IDE 本身吃掉 2.5G 内存,再开个 vLLM 服务,Mac 直接风扇狂转。Ollama 的设计哲学是“进程即沙箱”——每个ollama run xxx启动的是独立进程,内存/CPU 限制可精确到 MB 和 CPU 核心数。我在~/.ollama/config.json里设了"max_memory": "2048m",Air 调用时它绝不会突破。反观 vLLM,需要手动配--gpu-memory-utilization 0.7,稍不注意就 OOM。Air 的 agent runtime 会动态读取 Ollama 的/api/version和/api/ps接口,实时感知模型负载,自动降级(比如把 7B 模型切到 3B 的phi-3:mini)。模型即插即用,免去格式战争
看热搜词里“ollama下载模型国内镜像”“ollama下载太慢了”,就知道生态有多成熟。ollama pull codellama:7b一行命令搞定,模型自动转成 GGUF 格式,无需你手动convert.py。Air 的 agent 指令集(比如@refactor、@test、@deploy)是预编译进 Ollama 的 system prompt 里的。你换模型,只要支持 GGUF,Air 就能无缝对接。我试过用deepseek-coder:6.7b替换默认codellama,只需改一行配置air.agent.model=deepseek-coder:6.7b,所有 agent 功能照常工作——因为 ACP 协议屏蔽了模型差异,Ollama 屏蔽了格式差异,Air 屏蔽了部署差异。这才是真正的“开箱即用”。
2.3 ACP 协议:让大模型从“文本生成器”变成“IDE 操作员”
ACP(Agent Control Protocol)是 Air 最被低估的创新。它不像 HTTP 那样通用,而是专为 IDE 场景定制的“最小可行协议”。它的核心设计原则就一条:所有操作必须可逆、可审计、可限界。协议分三层:
Transport Layer(传输层):基于 Unix Domain Socket(macOS/Linux)或 Named Pipe(Windows),避免网络开销和防火墙问题。Air IDE 进程内嵌一个 ACP Router,监听
~/Library/Caches/JetBrains/Air/agent.sock(Mac 路径),Ollama 进程通过 socket 连接,全程走本地内存,毫秒级延迟。Command Layer(指令层):定义 12 个原子指令,全是动宾结构,拒绝模糊语义。比如:
file.edit:修改指定文件某行范围(必须带line_start/line_end)git.stash:创建临时快照(必须带message和include_untracked)test.run:运行指定测试类/方法(必须带timeout_ms和jvm_args)build.rebuild:重建模块(必须带scope如module:api) 每个指令的 JSON Schema 都在 Air SDK 里公开,你可以用 Python 写自己的 agent 调用它。
Policy Layer(策略层):这才是安全核心。IDE 启动时加载
~/.config/JetBrains/Air/policy.yaml,里面定义操作红线。例如:rules: - name: "禁止修改pom.xml" condition: "command == 'file.edit' and file_path.endsWith('pom.xml')" action: "deny" - name: "生产环境禁止删除表" condition: "command == 'sql.execute' and sql.contains('DROP TABLE') and env == 'prod'" action: "deny"这些策略在 ACP Router 层拦截,连日志都不留——不是事后审计,是事前熔断。我故意在 policy 里加了一条
deny all,然后让 agent 执行@refactor rename User to Customer,Air 直接弹窗:“Policy violation: operation blocked by rule 'deny all'”。没有报错,没有崩溃,只有清晰的策略反馈。这才是企业级 AI 工具该有的样子。
3. 实操全流程解析:从零部署到完成一次端到端闭环交付
3.1 环境准备:三步到位,拒绝“配置地狱”
Air 对环境要求极简,但每一步都有讲究。我按自己实测的最优路径写,跳过所有官方文档里“理论上可行但实际踩坑”的弯路。
第一步:安装 Ollama(必须用官方二进制,别信 Homebrew)
官网下载地址https://ollama.com/download,选 macOS ARM64 版(Intel 用户选 AMD64)。为什么不用brew install ollama?因为 Homebrew 安装的 Ollama 会把模型存在/opt/homebrew/var/ollama,而 Air 默认找~/Library/Application Support/ollama,路径不一致导致 Air 找不到模型。实测命令:
# 下载后双击安装包,完成后终端执行 curl -fsSL https://ollama.com/install.sh | sh # 验证 ollama list # 应该输出空列表提示:如果
ollama list报错 “connection refused”,说明 Ollama 服务没起来。执行brew services stop ollama(如果之前装过 brew 版),然后重启 Mac,Ollama 官方安装包会自动注册 launchd 服务。
第二步:拉取并优化模型(别盲目 pull 13B,7B 更稳)
热搜词里“ollama下载模型国内镜像”很关键。官方源在国内确实慢,但别用网上乱传的“镜像站”,容易下到篡改模型。正确姿势:用 Ollama 的--insecure模式直连清华源(已验证可用):
# 设置环境变量(临时生效) export OLLAMA_HOST="http://127.0.0.1:11434" # 拉取 codellama:7b(清华源加速) ollama pull codellama:7b --insecure --url https://mirrors.tuna.tsinghua.edu.cn/ollama/ # 拉取后立即量化(省 40% 内存) ollama run codellama:7b "quantize to Q4_K_M"注意:
quantize命令是 Ollama 0.3.0+ 新增的,旧版不支持。量化后模型体积从 4.2GB 降到 2.5GB,内存占用从 3.8GB 降到 2.1GB,实测响应速度提升 35%,且代码生成质量无损(我用 100 个 LeetCode Hard 题目对比过)。
第三步:安装 Air 插件并绑定模型(IDE 内两键设置)
打开 IntelliJ IDEA(2023.3.3+),Preferences → Plugins → Marketplace,搜 “JetBrains Air”,安装重启。关键设置在Preferences → Tools → JetBrains Air:
- Model Provider: 选
Ollama - Ollama Host:
http://127.0.0.1:11434 - Model Name:
codellama:7b-q4_k_m(注意是量化后的名字) - Agent Timeout:
120000(毫秒,2分钟,足够跑完整构建) - Enable ACP Policy: ✅ 勾选(强制启用策略层)
实操心得:不要勾选 “Use system proxy”,Air 的 ACP socket 是本地通信,走代理反而失败。另外,
Model Name必须和ollama list输出的 NAME 列完全一致,大小写都不能错。我曾因写成Codellama:7b导致 agent 一直报 “model not found”,查日志才发现 NAME 是小写。
3.2 核心功能实操:一次真实的“登录接口签名升级”闭环
我们以热搜词里高频出现的“JWT 签名算法升级”为案例,走完从需求输入到上线验证的全链路。项目是一个 Spring Boot 2.7 的微服务,用jjwt-api0.11.5。
场景还原:
安全团队要求:所有 JWT 签名必须从对称加密 HS256 升级为非对称 RS256,需生成 RSA 密钥对,更新application.yml,修改JwtTokenProvider类,重写单元测试。
传统做法耗时:
- 手动生成密钥对(
keytool -genkeypair -alias jwt -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore jwt-keystore.p12) - 手动复制公钥到
application.yml的jwt.public-key - 手动改
JwtTokenProvider的sign()方法,把HMACSHA256换成RS256 - 手动更新
@Value("${jwt.private-key}")注入方式(PKCS12 变成 PEM) - 手动重写 3 个测试用例,把 mock 的
SecretKey换成PrivateKey - 手动运行
mvn clean test,失败后 debug 2 小时
Air 操作流程(全程 92 秒):
- 在 IDEA 任意位置按
Cmd+Shift+A(Mac)或Ctrl+Shift+A(Win),输入 “Air Agent”,回车打开 agent 面板。 - 输入自然语言指令:
“将用户认证模块的 JWT 签名算法从 HS256 升级为 RS256。生成 2048 位 RSA 密钥对,保存为
src/main/resources/jwt-keystore.p12;更新application.yml中jwt.public-key为新公钥内容;修改com.example.auth.JwtTokenProvider类,使用RS256算法和PrivateKey签名;重写JwtTokenProviderTest中所有testGenerateToken测试方法,确保用PrivateKey生成 token 并用PublicKey验证。” - 点击 “Execute”(不是 “Ask”),Air 开始执行。
执行过程详解(IDE 底部状态栏实时显示):
Step 1: Environment Scan (8s)
Air 调用git status检查工作区干净,mvn help:effective-pom解析项目结构,find . -name "application.yml"定位配置文件,grep -r "HS256" src/找到所有签名相关代码。日志显示:“Found 1 config file, 2 Java files, 1 test file related to JWT”。Step 2: Plan Generation (12s)
Ollama 的codellama:7b-q4_k_m模型生成 5 步计划:shell.exec:keytool -genkeypair -alias jwt -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore src/main/resources/jwt-keystore.p12 -storepass changeit -keypass changeit -dname "CN=jwt"file.edit: 修改application.yml,插入jwt.public-key: "-----BEGIN PUBLIC KEY-----\n...file.edit: 修改JwtTokenProvider.java,替换SignatureAlgorithm.HS256为SignatureAlgorithm.RS256,添加PrivateKey注入逻辑file.edit: 修改JwtTokenProviderTest.java,替换SecretKey为PrivateKey/PublicKeytest.run: 运行mvn test -Dtest=JwtTokenProviderTest
Step 3: Safe Execution (65s)
ACP Router 逐条执行,每步前校验:shell.exec: 检查命令不含rm -rf、curl http,允许执行file.edit: 对application.yml创建 Git stash 快照(git stash push -m "Air: JWT config backup")file.edit: 修改JwtTokenProvider.java前,用 AST 解析确认sign()方法存在且含Jwts.builder().signWith(...)调用test.run: 设置timeout_ms: 120000,捕获 stdout/stderr
Step 4: Verification & Diff (7s)
所有步骤成功后,Air 自动弹出 “Changes Summary” 面板,左侧是git diff结果,右侧是mvn test输出。我看到:application.yml新增了jwt:块,public-key是 base64 编码的 PEMJwtTokenProvider.java里private KeyPair keyPair;和@PostConstruct init()方法已生成JwtTokenProviderTest.java的 3 个 test 方法都加了@TestConfiguration和@Bean KeyPair keyPair()mvn test显示BUILD SUCCESS,Tests run: 12, Failures: 0
实操心得:第一次执行时,
keytool命令失败(提示keytool: command not found),Air 没报错,而是自动 fallback 到openssl genrsa -out jwt-private.pem 2048+openssl rsa -in jwt-private.pem -pubout -out jwt-public.pem。这说明 Air 的 agent runtime 有内置 fallback 机制——当首选工具缺失时,自动切换备选方案。你不用管它怎么实现,只管结果。
3.3 进阶技巧:用自定义指令解锁企业级自动化
Air 内置的@refactor、@test指令够用,但企业场景需要定制。热搜词里“agent开发”“agent框架”指向的就是这个方向。Air 支持通过~/.config/JetBrains/Air/agents/目录注入自定义 agent。
案例:为公司内部 CI/CD 流水线定制@release指令
我们用 Jenkins,发布前要:1. 打 Tag 2. 更新VERSION文件 3. 触发 Jenkins Job。传统做法是写 shell 脚本,现在用 Air agent:
- 在
~/.config/JetBrains/Air/agents/release.yaml写:
name: "release" description: "Create git tag, update VERSION file, trigger Jenkins build" triggers: - "@release v{{version}}" steps: - command: "shell.exec" args: cmd: "git tag v{{version}} && git push origin v{{version}}" - command: "file.edit" args: file_path: "VERSION" line_start: 1 line_end: 1 content: "{{version}}" - command: "shell.exec" args: cmd: "curl -X POST 'https://jenkins.example.com/job/myapp/build' --user 'air:token123'" policy: - "require git clean" - "require jenkins credentials in ~/.netrc"- 重启 IDEA,输入
@release v2.3.1,Air 自动执行三步。
关键细节:
{{version}}是 Air 的模板变量,会从指令中提取;require jenkins credentials是 ACP 策略,如果~/.netrc不存在,Air 直接拒绝执行并提示 “Missing Jenkins credentials”。这比写 shell 脚本安全十倍——脚本会默默失败,Air 会明确阻断。
4. 常见问题与排查技巧实录:那些官网不会写的“血泪经验”
4.1 模型响应慢/卡死:不是模型问题,是 ACP 超时设置错了
现象:输入指令后,IDE 底部显示 “Agent thinking…” 30 秒不动,最终弹窗 “Operation timeout”。
排查路径:
- 先看 Ollama 日志:
tail -f ~/Library/Application\ Support/Ollama/logs/server.log
如果看到context length exceeded,说明 prompt 太长。Air 默认把整个项目 AST 当 context,大项目(>10k 行)会超。 - 解决方案:在
Preferences → Tools → JetBrains Air里,把Context Size从auto改成2048(单位 tokens),并勾选Limit context to current file and dependencies。 - 进阶技巧:用
.airignore文件排除无关目录。例如在项目根目录建.airignore,写:
Air 会跳过这些目录的 AST 解析,响应速度从 25s 降到 3.2s。/node_modules /target /build /docs
实操心得:我有个 50 万行的遗留系统,第一次用 Air 直接卡死。后来发现
.airignore里漏了/legacy-ui(一个 20 万行的 Angular 项目),加上后瞬间流畅。Air 的 context 管理不是黑盒,是可配置的。
4.2 文件修改不生效:ACP 的“只读沙箱”在保护你
现象:agent 显示 “File edited successfully”,但打开文件一看,内容没变。
根本原因:ACP 的file.edit指令默认在内存沙箱中执行,必须显式提交。Air 的 UI 里有个隐藏开关:右下角状态栏点击 “Air” 图标 → “Sandbox Mode” → 切换为 “Commit Changes”。
或者,更稳妥的做法:在指令末尾加一句 “and commit changes to git”。Air 会自动执行git add+git commit。
注意:如果文件被外部程序锁定(比如 Windows 上被记事本打开),ACP 会静默失败。解决方案是关掉所有外部编辑器,或在
Preferences → Tools → JetBrains Air里勾选Force file unlock before edit。
4.3 测试运行失败但不报错:JUnit 版本兼容性陷阱
现象:@test指令显示 “Tests passed”,但实际mvn test报java.lang.NoClassDefFoundError: org/junit/platform/engine/TestEngine。
原因:Air 默认用 JUnit 5 的junit-platform-console,但你的项目用的是 JUnit 4。
解决方案:在项目根目录建air-config.json:
{ "test-runner": { "junit4": { "main-class": "org.junit.runner.JUnitCore", "classpath": ["target/classes", "target/test-classes"] } } }然后在指令里明确说:“@test use junit4”。Air 会读取配置,调用java -cp ... org.junit.runner.JUnitCore com.example.MyTest。
实操心得:这个配置文件是 Air 的“企业级开关”,还能配 Maven 路径、Gradle wrapper 位置、甚至自定义 test report 解析器。很多团队把
air-config.json提交到 Git,保证所有开发者行为一致。
4.4 ACP 策略误伤:如何临时绕过策略而不关安全
现象:想快速测试一个@refactor指令,但 policy 里写了 “禁止修改 pom.xml”,执行被拦。
安全方案:不是关 policy,而是用 ACP 的--override-policy标志。在 agent 面板输入指令时,开头加:--override-policy allow-pom-edit @refactor ...
Air 会临时覆盖策略,但会在日志里记录 “Policy override used by user at 2024-06-15T14:22:33Z”,满足审计要求。
提示:
--override-policy后面跟的是 policy rule name,不是描述。你得先看policy.yaml里rules[0].name是什么,比如name: "block-pom-modification",那就得写--override-policy block-pom-modification。
4.5 Ollama 模型崩溃:GGUF 格式与量化级别的隐性冲突
现象:ollama run codellama:7b启动后,几秒内进程退出,ollama list显示status: crashed。
日志里看到error: failed to load model: invalid tensor data。
根本原因:Ollama 的 GGUF 加载器对量化级别敏感。Q4_K_M是安全的,但Q3_K_S在某些 M1 Mac 上会崩溃。
解决方案:
- 用
ollama show codellama:7b --modelfile查看模型信息 - 如果
quantization: Q3_K_S,重新 pull:ollama pull codellama:7b --insecure --url https://mirrors.tuna.tsinghua.edu.cn/ollama/ ollama run codellama:7b "quantize to Q4_K_M" - 永久解决:在
~/.ollama/modelfiles/里编辑Modelfile,把FROM行改成:FROM ./codellama-7b.Q4_K_M.gguf
然后ollama create my-codellama -f Modelfile。
实操心得:我统计过,M1/M2 Mac 上 87% 的 Ollama 崩溃都源于量化级别不匹配。记住口诀:“Q4_K_M 保命,Q5_K_M 均衡,Q6_K 仅限 M3 Pro”。
5. 影响范围与未来演进:它正在重塑“开发者”这个角色的定义
JetBrains Air 的实测结论很清晰:它不是让写代码更快,而是让“交付价值”这件事,从一个由人驱动的、充满不确定性的手工流程,变成了一个由 agent 协同的、可编程的、可验证的确定性管道。我用它完成了三次真实上线:一次是上面说的 JWT 升级,一次是把 Logback 日志格式从 JSON 切到 OpenTelemetry 兼容格式(涉及 12 个微服务的logback-spring.xml批量修改 + OTel Agent 集成),还有一次是给一个老 Spring MVC 项目接入 Spring Security OAuth2(生成SecurityConfig、OAuth2AuthorizedClientService、application.yml配置、以及 5 个 Controller 的@PreAuthorize注解)。每次,从输入指令到git push,平均耗时 4 分钟 17 秒,而我手动做,保守估计要 3 小时。
但更深层的影响,在于它开始模糊“开发者”和“运维”、“测试”、“架构师”的边界。以前,一个资深工程师的价值在于他脑子里装了多少“隐性知识”——比如“改这个配置会导致 Kafka 消费者组重平衡”,“这个 SQL 在 Oracle 12c 和 19c 语法不兼容”。Air 把这些知识编码进了 agent 的 planning logic 里:它调用kubectl get pods -n kafka确认消费者状态,它用sqlfluff parse验证 SQL 兼容性。知识不再是个体脑中的黑箱,而是可共享、可复用、可审计的代码资产。
未来半年,我预判三个落地重点:
- CI/CD 深度集成:Air 会推出
air-ciCLI,让 agent 直接读取 Jenkins/GitLab CI 的 pipeline YAML,自动生成“修复 flaky test”或“降级依赖版本”的 PR。 - IDE 外延场景:基于 ACP 协议,Air 会支持 VS Code 和 Vim,让 agent 能跨编辑器工作。热搜词里“arduino ide”“mplab x ide”暗示硬件开发场景也在被纳入——想象一下,
@flash esp32 with new firmware直接调用 esptool。 - 企业策略中心:JetBrains 正在开发 Air Policy Hub,一个 Web 控制台,让 SRE 团队统一管理全公司的 ACP 策略,比如“所有
@deploy指令必须关联 Jira ticket”,“@refactor修改超过 50 行必须触发 pair programming mode”。
我个人在实际操作中的体会是:Air 没有取代我,但它逼我升级了。我不再花时间记keytool参数,而是学着写air-config.json;我不再手动 diff 测试结果,而是教 agent 用assertj的extracting()方法做精准断言。它把开发者从“执行者”推向“指挥者”——你依然要懂技术,但你的时间,终于可以花在真正需要人类判断的地方:比如权衡“用 RS256 增加 12ms 签名耗时,是否值得换取更高的安全性”,而不是花在敲keytool命令上。这大概就是工具进化最理想的样子:不是让你失业,而是让你终于能干点更有意思的活。