拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Kuikly + DeepSeek Harness:手机遥控AI写代码的移动控制台实践

上个星期我在高铁上接到测试同事的电话后台服务有个接口在低峰期偶发超时日志里堆了一串慢查询线上版本得尽快出修复方案。人在路上手边只有一部手机。以前遇到这种事我能做的就是疯狂记笔记到酒店再开电脑干活。这次不一样我打开手机上的移动控制台把异常日志贴进去让服务端的AI编程引擎先做一轮问题分析和修复建议。等下车进酒店、电脑开机的功夫任务已经跑完了AI给出了疑似问题点、改好了代码、补了测试用例还贴心地跑了冒烟测试我要做的只是review、确认、合并然后回复测试同事。这套体验背后的技术组合就是标题里写的Kuikly DeepSeek Harness移动控制台。这一周我把它完整搭建起来在真实项目里跑了几天有超预期的部分也有不少想吐槽的地方。这篇文章把整个链路、选型逻辑、部署过程、实测感受以及权限安全上必须注意的坑一次性说清楚。1. 从“手机改代码”到“手机遥控AI改代码”一个真实到不行的需求1.1 程序员的代码工作真正卡在哪个环节先说一个可能没那么讨喜的结论现代开发里绝大部分时间并不花在“敲键盘”上而是花在定位问题、理解上下文、设计修改方案、跑测试、review结果这些事上。真正“写”那几十行代码往往只占一小部分。所以“用手机写代码”这个诉求本身就问错了方向手机上码字体验再优化也比不过键盘和显示器。那移动场景下真正卡住的是什么是被动等待。等编译、等测试、等模型分析、等review反馈。这些等待不需要你坐在工位上它们天然适合“丢给后台任务时不时看一眼进度”的模式。我需要的不是手机上的IDE是一个能创建任务、观察进度、在关键节点做确认的远程控制台。1.2 为什么不是“手机写代码”而是“遥控AI写代码”顺着上一条思路往下推答案就很清楚了。移动控制台的核心工作流不是“人写代码”而是“人下发意图、AI执行、人做决策”。举个例子你在手机端做这几件事贴一段报错日志让AI分析可能原因并给出修复补丁指定某个模块让AI补一轮单测用例然后在服务端跑完测试回传结果提一个代码变更让AI按团队规范做一次review把问题列成清单。这些任务都不需要你在手机上编辑大段文件只需要你提供输入、确认输出、在关键节点点一下“允许执行”。人机关系从“人用工具写代码”变成了“人管理AI干活”。1.3 移动控制台和手机浏览器有什么区别有人会问直接用手机浏览器打开一个网页版管理界面不行吗理论可行但实际用下来有几个问题。第一是任务状态推送。移动控制台可以借助系统通知任务完成时主动告诉你而不是开着网页一直刷新。第二是弱网适配。高铁、地铁、地下车库这些场景网络质量很差原生控制台可以做请求排队、断点重试、本地缓存。第三是操作习惯。原生App的手势操作、扫码登录、指纹确认在“审批一个代码合入”这种场景下体验比网页好太多。所以我们这套方案的定位不是做一个“手机版IDE”而是做一个“AI编程任务的移动调度台”。这个定位决定了后续所有技术选型。2. Kuikly充当移动控制台的技术底座这个选择怎么看2.1 Kuikly是什么Kuikly是开放维京社区开源的一套跨端开发框架基于Kotlin语言核心思路是用Kotlin和Compose Multiplatform的技术理念实现一套代码同时构建Android和iOS两端应用。如果你写过Jetpack Compose那上手Kuikly几乎零成本声明式UI、状态管理、组合函数这些概念都是通的。对我来说Kuikly最大的吸引力不在于“又一个新的跨端框架”而在于它把业务逻辑层和UI层都沉淀在Kotlin里两端共享度极高。对于一个工具型App我们希望把大部分精力放在任务流转、网络层、数据模型这些核心逻辑上而不是在两个平台写两遍。2.2 和Flutter、React Native的差异做个不严谨但直观的比较我在选型时列了一张表维度KuiklyFlutterReact Native开发语言KotlinDartJavaScript/TypeScriptUI体系Compose风格声明式自绘渲染引擎原生组件桥接与原生生态互通Kotlin Native/OpenViking生态依赖插件通道依赖JS Bridge学习成本对Android团队低中中适合场景Kotlin技术栈团队快速出双端UI复杂、重自绘场景前端团队主导的App我们的团队本身就是Kotlin技术栈选择Kuikly意味着不需要引入新的语言体系。而且控制台这种AppUI复杂度不算高核心在逻辑的严谨和数据展示的清晰Kuikly的Compose式UI写起来效率不错。2.3 控制台的界面与交互架构这个移动控制台的功能模块我拆成几个核心页面任务中心展示所有AI编程任务的列表状态分为排队中、执行中、等待确认、已完成、失败任务详情展示任务输入、AI输出的代码diff、测试结果、日志片段支持一键复制diff审批流当AI完成任务需要合并代码、推送分支时在手机端弹出确认卡片支持指纹/面容验证会话流长连接推送任务实时日志类似你在终端里看构建输出的体验。UI架构上底部Tab导航、列表页、详情页、底部动作条这些用Kuikly写起来都比较顺手。任务详情里的代码diff高亮我们封装了一个轻量组件通过WebView辅助渲染避免自己写一套语法高亮。3. DeepSeek Harness的工程化能力拆解不只是帮你补全代码3.1 从聊天补全到工程任务日常我们接触最多的AI编程工具是聊天式补全你给它一个问题它吐一段代码。这种模式能解决“写一个函数”的简单诉求但真要让它参与“修一个bug并保证不破坏其他功能”这种工程级任务聊天框就不够用了。DeepSeek Harness的定位不一样。它把自己定位成一套工程化工具链核心是把AI接进已有的工程流程里理解仓库结构、执行命令、跑测试、生成测试用例、做代码审查、甚至提出合并请求。这些能力不只是“生成文本”而是“执行任务”。用专业一点的类比聊天式AI像是一个顾问你问一句它答一句Harness更像一个实习工程师你给它一个任务它自己去翻代码、写方案、改代码、跑测试然后给你交一份带验证结果的报告。我当然希望指挥的是后者尤其是当我不在电脑前的时候。3.2 自动测试用例、自动测试、代码Review是怎么串起来的DeepSeek Harness里最有价值的三个工程化能力我实测下来是自动写测试用例、自动跑测试、自动代码Review。三者的串联逻辑是这样的AI改了代码之后不能直接说“改完了”必须自证。它需要先分析改动影响了哪些函数和边界条件然后为这些改动生成或更新测试用例接着在沙箱环境里跑一遍完整测试套件把失败用例收集起来最后再对自己生成的diff做一轮自审检查有没有明显的越权改动、硬编码密钥、资源泄漏问题。这三个动作在Harness里是作为一个流水线执行的。我在服务端配置好工程路径和测试命令后移动端只需要创建一个“修复验证”类型的任务剩下的事Harness会按序完成。每一轮的结果都会回传到控制台我可以像看CI流水线一样逐段查看而不是面对一坨没有经过验证的生成代码。3.3 插件、CLI、桌面版与“被移动端调用的服务化形态”DeepSeek Harness提供了好几种使用形态CLI命令行、桌面版、IDE插件以及供开发者集成的服务化接口。我们这次搭建移动控制台用的是它的服务化能力。服务化部署的关键在于Harness能够注册成一个常驻任务执行引擎接受HTTP或WebSocket请求把AI任务排入队列通过回调或轮询把状态推给客户端。移动端本身不需要直接跑模型也不需要下载代码仓库它只负责“创建任务、接收状态、展示结果”。这种架构是移动控制台能够成立的前提。3.4 本地模型接入与思考模式关于模型接入体验版本里Harness支持连接DeepSeek的云端API也支持配置本地部署的模型服务。本地部署的最大价值是代码不离开内网适合对代码安全要求很高的团队。“思考模式”这个功能比较有意思可以理解成让模型在回答前先生成一段推理过程相当于人脑的草稿纸。实测下来在复杂问题定位场景打开思考模式答案的准确率明显提升但响应时间也会变长。移动控制台端可以把这个做成一个任务级别的开关简单任务快速模式复杂分析深度模式。4. 一条完整的移动控制台链路从部署到跑通下面这部分是完整的实操链路。我基于DeepSeek Harness 0.1.1版本和常见部署方式来写不同版本可能会有差异但整体思路是一致的。4.1 第一步把Harness以服务方式部署好首先在服务器上安装Harness。官方提供了二进制包和源码安装两种方式二进制包最简单下载对应平台版本解压即可。源码安装需要先准备Kotlin和Gradle环境适合想改底层逻辑的团队。部署完命令行工具后需要把它注册成服务。我们用一个简单的守护进程方式常驻# 下载并解压harness wget https://github.com/xxx/deepseek-harness/releases/download/0.1.1/deepseek-harness-linux-amd64.tar.gz tar -zxvf deepseek-harness-linux-amd64.tar.gz sudo mv harness /usr/local/bin/ # 创建服务配置目录 mkdir -p /etc/harness # 编辑配置文件填入模型API地址、仓库白名单、任务队列参数等 sudo vim /etc/harness/config.yaml配置文件里我重点设置了几个参数允许接入的仓库路径、模型服务的base_url、以及任务并发数。并发数不要设太高模型推理本身很吃资源我们实测并发3比较稳定设成5就会出现接口超时。然后启动服务并确认HTTP端口在监听harness server --config /etc/harness/config.yaml --port 8080 # 验证服务启动 curl http://127.0.0.1:8080/health这一步做完Harness就有了一个可供外部调用的HTTP接口。内部网络其他设备可以通过内网地址访问不需要暴露到公网。4.2 第二步在Kuikly里封装任务SDK服务端就绪后移动端要做的是把接口封装成好用的Kotlin SDK。这部分我抽了几个核心类HarnessClient负责HTTP和WebSocket连接封装token认证TaskRepository任务创建、查询列表、获取详情、取消任务TaskStateStore本地数据库缓存任务状态支持弱网下的状态展示。关键代码长这样class HarnessClient(private val baseUrl: String, private val token: String) { private val client OkHttpClient.Builder() .connectTimeout(15, TimeUnit.SECONDS) .readTimeout(60, TimeUnit.SECONDS) .build() private val json Json { ignoreUnknownKeys true } suspend fun createTask(request: TaskCreateRequest): TaskInfo { return withContext(Dispatchers.IO) { val body json.encodeToString(TaskCreateRequest.serializer(), request) val httpRequest Request.Builder() .url($baseUrl/api/v1/tasks) .addHeader(Authorization, Bearer $token) .post(body.toRequestBody(application/json.toMediaType())) .build() client.newCall(httpRequest).await().use { resp - if (!resp.isSuccessful) throw HarnessException(create task failed: ${resp.code}) json.decodeFromString(TaskInfo.serializer(), resp.body!!.string()) } } } }网络层我用的是OkHttp和Kotlin协程简单直接。注意超时时间要设大一点AI任务不是普通API一个任务跑几分钟很正常。4.3 第三步核心交互流程一个完整任务的基本流转长这样用户在手机端填写任务描述比如“修复XX模块的空指针异常并补测试”点击创建Kuikly端调用Harness服务生成任务拿到task_idHarness服务端开始执行状态变为“执行中”移动端通过WebSocket接收实时日志同时定时轮询兜底任务执行到“等待确认”节点比如等待批准合并分支手机端弹出审批卡片用户确认或驳回任务继续或终止最终展示完整diff和测试报告。这个流程里有个细节值得单独说等待确认节点。AI合入代码是可以带危险动作的服务端必须在执行到合并操作前暂停等用户明确授权。移动端这边要做的是把这个审批卡片做得足够清晰让人一眼看清AI要改哪些文件、要执行什么操作再决定是否放行。4.4 第四步弱网和长任务的适配移动控制台最容易翻车的就是弱网。高铁上网络时断时续地铁里延迟几百毫秒如果代码里没做保护体验会非常糟糕。我踩过几个坑总结出来轮询间隔不要固定用“指数退避最大上限”策略任务刚创建时密集一点执行中逐步拉长WebSocket断线后要自动重连并且补拉一次最新的任务快照防止丢失中间状态日志推送要做“增量追加”不要每次把全量日志重新拉一遍任务详情里的diff文本可能很大移动端先展示摘要和关键文件列表完整diff按需加载。这些适配做完控制台才真正能在“非理想网络环境”下用起来否则它就是另一个只能在办公室Wi-Fi下运行的玩具。5. 拿着手机遥控AI写代码的真实体验亮点和翻车现场5.1 超出预期的场景先说好的方面。实际用了几天有三个场景我是真心觉得值。第一个是紧急bug的快速响应。文章开头那个高铁上的案例不是编的确实发生了。AI先通过日志定位到慢查询背后的索引缺失生成修复diff还自动补了一个回归测试。整个过程大概12分钟我在手机端实时看到日志一条条刷出来那种“即使不在工位也能掌控局面”的感觉确实很踏实。第二个是测试用例补全。我们有个老模块单测覆盖率一直不达标。以前人工补用例是苦力活现在我在控制台创建任务指定模块路径Harness自动分析现有代码分支生成了一批覆盖正常流程和异常路径的测试用例服务端跑完把通过率回传。虽然部分用例质量还需要人工调整但工作量至少减少了一半。第三个是变更review预审。日常合入代码前团队约定必须做一轮review。过去等同事有时间现在先让Harness做一遍静态层面的预审把漏掉的边界情况、潜在的空指针、硬编码问题先列出来。我再根据清单决定是自己改还是让AI改移动端上浏览这些问题列表很轻松相当于随身带了一个不睡觉的review搭档。5.2 翻车和局限说完好的必须说说让我头疼的地方。最大的问题还是复杂任务在手机上“看不清楚”。AI生成的diff如果涉及十几个文件手机屏幕根本无法承载这种信息密度。我试过横屏、折叠屏、缩放到最小字号都不理想。后来在控制台里做了“仅显示新增/删除行”的开关改了默认不加载完整diff才算缓解。第二个问题是长任务的焦虑感。一个任务跑十几分钟的时候日志会滚动很久。如果中间没有阶段性的小结论用户会不确定AI是不是真的在干活。我后来在服务端加了一个“里程碑事件”机制每完成一个子步骤“已分析完成”“已生成补丁”“测试执行中”就推一个结构化事件到手机端比看原始日志舒服多了。第三个局限是Harness对非标准工程结构的理解还比较弱。我们有个微服务模块的目录结构不太常规它第一次分析时把依赖关系理解错了生成的测试用例根本跑不起来。后来我把“仓库结构说明”作为任务附加上下文传进去情况才好转。这意味着控制台的输入框不能只是一个简单的文本域最好支持附带文件、附带说明、指定参考路径这些结构化输入。我再放一张实测效果汇总表方便大家直观参考场景完成时间AI结果质量人工介入成本整体评价日志定位修复建议12分钟高一次通过低确认即可超出预期老模块补测试用例约20分钟中高需微调中逐条确认明显提效变更review预审5-8分钟高问题清单准确低只做复核日常可用非标准结构仓库改造30分钟中低依赖信息补充高需大量修正暂不满意6. 远程遥控代码之前权限和安全问题必须想清楚手机能遥控AI改代码本质上是给一个人打开了访问代码仓库、执行测试命令、发起合并请求的远程通道。这个通道的权限如果不能管住带来的风险比收益大得多。6.1 手机丢失与设备绑定第一道关是设备绑定。控制台不能只靠账号密码必须做设备级绑定。首次登录时手机端生成密钥对把公钥注册到服务端之后每次请求用私钥签名服务端验签。这样即使账号密码泄露新设备也无法直接拿到完整能力。6.2 仓库权限最小化和审批流第二道关是仓库权限最小化。Harness服务在服务器上跑它本身不应拥有所有仓库的完整读写权限。我们配置它时只给了白名单仓库的有限权限并且把“推送分支”“合并请求”这类操作设成必须二次确认。管控粒度要做到让AI能读代码、能改代码、能跑测试但“合入主干分支”必须由人来批准。这里移动控制台的审批流就有了不可替代的意义——大家可以在IM或邮件里收到审批请求但真正需要“拿手机扫一下人脸、按一下指纹”才放行的操作还是原生App更可靠。6.3 密钥保护和审计日志第三道关是密钥与审计。模型API的密钥、仓库的访问令牌都放在服务端配置里禁止下发到移动端。移动端只保留自己的身份令牌而且令牌有效期要短过期后需要重新扫码或输入口令续期。审计日志也是必须的。谁在什么时间创建了什么任务、AI执行了哪些命令、谁批准了哪次合并这些都要完整记录最好能导出。我实际搭的时候这一块做得不够细致后来补了一次因为团队安全同事只看了一眼就问“如果AI误删了分支你们怎么追溯”直接把我问住了。补充一个细节任务里的日志可能包含敏感信息比如数据库连接串、内部IP地址。控制台展示端要有自动脱敏能力至少要做到生产环境日志不回传移动端只在服务端保留脱敏后的分析结论。这个边界要提前定好不然等出了事再补就晚了。结尾的话这套Kuikly DeepSeek Harness移动控制台算不上什么突破性发明但它切中了一个很实在的需求程序员不完全属于工位代码任务的流程不该被物理位置绑死。我个人实操下来的体会是移动控制台这件事技术难点不在“能不能调通”而在“信息密度和交互深度”的平衡。手机屏幕就这么大能承载的上下文有限所以任务化、结构化、里程碑化的设计比单纯的“把电脑屏幕缩到手机里”要重要得多。如果一上来就想在手机上完整操作IDE大概率会做成一堆没人用的按钮堆砌但如果只做“下发任务、观察状态、关键审批”体验反而顺畅。最后再分享一个小技巧你把AI任务当成异步接口来设计而不是当成实时聊天很多纠结就自动消失了。创建任务时把输入描述写充分任务跑完通知你你再决定下一步操作这个“异步遥控”的模式比盯着手机等回复靠谱太多了。后续我想继续扩展的是控制台对多环境的支持——测试环境、预发环境、生产只读环境分开管理然后把整个控制台打包成企业内部可一键部署的版本。那又会是另一篇实操文章了等做出来再写。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门