前段时间写了 《万字长文讲解:团队落地 AI 辅助编程和 AI Specs 实战》,核心内容是讨论公司落地 AI 辅助编程的一些常见问题,通过使用 Kiro 引入 Spec 实现规范驱动开发,也讲解了实践过程 《万字长文讲解:团队落地 AI 辅助编程和 AI Specs 实战》主要是讲解思路,Kiro 并不重要,本篇主要讲解实现案例、怎么从零开发出一个程序,两篇文章并不冲突,推荐先看万字长文,再看本文。 接下来,将以开发一个基金实时估值程序为例,讲解如何实现 AI Specs,但是本文不会围绕团队落地去讲解原理和技术,纯粹是讲解 OpenSpec + OpenCode 怎么用。 design、specs 可以一起并行工作,所以可以输入: 同时创建 design、specs 等 AI 完成任务后,openspec/changes/{功能名称} 下会创建一批文件。 规范合并: CLI 自动将规范增量 (ADDED/MODIFIED 要求) 应用于openspec/specs/ 目录。
规范(Specs):明确定义功能的输入、输出、数据模型、API接口、验证规则等。设计(Design):描述技术选型、架构图、关键算法和安全考量。 将本次变更的规范合并到主.specs/目录,并清理.changes/中的临时文件,完成一次闭环。 specs/目录作为知识库:随着项目演进,.specs/目录积累了完整的系统能力基线,新成员或新需求可以快速复用和约束。适用场景:中小型团队、个人开发者、需要在存量项目上快速迭代的场景。 核心功能:Specs&Hooks:Specs用于生成结构化需求文档,Hooks则是自动化触发器,可以在特定事件(如代码提交)后自动执行验证或部署任务。 这场对话的产出物就是可执行的规范(Specs),它直接驱动后续的所有工程活动。这标志着开发流程的极大简化和效率的革命性提升。
但是 Kiro 提出了 Specs,让团队协作和开发人员早点下班的神器。 Specs 弥合了概念产品需求和技术实施细节之间的差距,确保了一致性并减少了开发迭代。 Specs 提供了一种系统化的方法,将需求和想法转化为详细的实施计划,生成验收标准、技术实现和代码生成及测试验收计划。 接下来,我们将会使用 Kiro Specs 生成某个功能的工作流程,最后根据方案生成代码并通过测试验收代码。 在 Kiro 面板中,点击 Specs 下的 + 按钮,或者从聊天面板中选择 Spec,在对话框内输入要做的功能。 工作流程 前面利用做 ”实现创建短链接的接口“ 这个需求,上手了 Kiro specs,各位应该大概了解怎么玩了,但是回到团队协作下,我们要好好构思,研发团队应该怎么做 specs。
{ id: 1608188117179, specs: ["红色", "套餐一", "256G"] }, { id: 1608188117180, specs: ["红色 { id: 1608188117182, specs: ["红色", "套餐二", "256G"] }, { id: 1608188117183, specs: ["红色 { id: 1608188117185, specs: ["红色", "套餐三", "256G"] }, // { id: 1608188117186, specs: [ // { id: 1608188117188, specs: ["红色", "套餐四", "256G"] }, // { id: 1608188117189, specs // { id: 1608188117191, specs: ["紫色", "套餐一", "256G"] }, { id: 1608188117192, specs: [
= sku.specs.order_by('spec_id') sku_key = [] for spec in sku_specs: sku_key.append(spec.option.id () # 构建不同规格参数(选项)的sku字典 spec_sku_map = {} for s in skus: # 获取sku的规格参数 s_specs = s.specs.order_by('spec_id') # 用于形成规格参数-sku字典的键 key = [] for spec in s_specs = sku.spu.specs.order_by('id') # 若当前sku的规格信息不完整,则不再继续 if len(sku_key) < len(goods_specs): return for index, spec in enumerate(goods_specs): # 复制当前sku的规格键 key = sku_key[:]
/jvms/se8/html/index.html java语言规范 https://docs.oracle.com/javase/specs/jls/se8/html/index.html javap /jvms/se8/html/jvms-4.html#jvms-4.3.2 方法描述符 https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4 /javase/specs/jvms/se8/html/jvms-4.html#jvms-4.4 本地变量表: https://docs.oracle.com/javase/specs/jvms/se8 /javase/specs/jvms/se8/html/jvms-4.html#jvms-4.7.3 LineNumberTable: https://docs.oracle.com/javase/specs /jvms/se8/html/jvms-4.html#jvms-4.7.12 constant variable: https://docs.oracle.com/javase/specs/jls/se8
其实这个setup只是将CocoaPods/Specs通过git克隆到本地,所以我们也可以如此 这里需要注意一点,就是存放的位置是固定的 ~/.cocoapods/repos/ 如果没有这个目录请自行创建 - Path: /Users/lxf/.cocoapods/repos/master 好,我们开始更换pod repo源,这里我选用国内【git.coding.net】上的Specs,也有其它国内的, 当然也可以自己在Coding上面新建一个工程将CocoaPods/Specs同步到你自己的仓库然后来使用~ source 'https://git.coding.net/CocoaPods/Specs.git ' source 补充 // 可以暂时使用我仓库里的Specs,更新时间为:2017-6-25 https://git.oschina.net/LinXunFeng/Specs.git 如果不知道怎么弄的话就按下面这种方式去搞吧 ,我试了几个国内免费的仓库,只有oschina的可以将gitHub上的Specs导入成功,接下来部署公钥,点击文章按要求去做,最后执行 // 注意YourUserName要改为你自己在码云上的用户名
= sku.specs.order_by('spec_id') sku_key = [] for spec in sku_specs: sku_key.append = s.specs.order_by('spec_id') # 用于形成规格参数-sku字典的键 key = [] for spec [tuple(key)] = s.id # 获取当前商品的规格信息 goods_specs = sku.spu.specs.order_by('id') , spec in enumerate(goods_specs): # 复制当前sku的规格键 key = sku_key[:] ': goods_specs, } return render(request,'detail.html',context) 二、详情页面展示 1.前台html代码 <
failed - 17 error(s): CDN: trunk URL couldn't be downloaded: https://raw.githubusercontent.com/CocoaPods/Specs /master/Specs/1/d/4/CocoaAsyncSocket/0.0.1/CocoaAsyncSocket.podspec.json, error: Operation timed out - SSL_connect 但cdn因为q的原因,导致一直连不上 解决办法 podfile文件中指定source源: source 'https://github.com/CocoaPods/Specs.git ' 或者指定为国家不错的镜像站【推荐】 source 'https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git' 删除trunk源 pod repo remove trunk 其他 另外推荐CocoaPods 镜像,由于https://github.com/CocoaPods/Specs.git日益庞大,进行一次pod setup,国内几十
/Specs.git)。 如果我们有自己的私有 Specs 仓库,也可以指定我们自己的Specs仓库地址。 在Podfile中可以指定多个 Specs 仓库的地址,稍后我们会创建我们自己的Specs仓库,然后在该Specs仓库中上次发布我们自己使用的依赖库。 ? 六、创建私有的Specs仓库 上面看完 CocoaPods 仓库的 Specs 文件后,接下来我们来看一下如何创建私有的 Specs 仓库。 2、将私有依赖库工布到自己的Specs仓库中 经过第一步就算创建并关联好了我们私有的Specs仓库了,接下来我们就该将私有的依赖仓库发布到我们自己的Specs仓库中了。
││├──en/││├──es/││└──de/│├──spec_images/#产品规格图片│└──cert_pdfs/#认证证书PDF├──structured/│├──products/│├──specs _parse_specs(text_lines)def_parse_specs(self,text_lines:list)->dict:"""解析OCR识别文本,提取参数"""specs={}forlineintext_lines \d*)\s*%',line)ifmatch:specs['efficiency_pct']=float(match.group(1))#认证识别ifre.search(r'IEC|UL|CE|TÜV| '),"efficiency_pct":specs.get('efficiency_pct'),"certifications":json.dumps(specs.get('certifications W",f"Efficiency:{specs.get('efficiency_pct','')}%",f"Certifications:{','.join(specs.get('certifications
--geronimo.specs--> <! -- https://mvnrepository.com/artifact/org.apache.geronimo.specs/geronimo-j2ee-management_1.1_spec --> <dependency> <groupId>org.apache.geronimo.specs</groupId> <artifactId >geronimo-j2ee-management_1.1_spec</artifactId> <version>${geronimo.specs.version}</version > <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-jms_1.1
categories;// 分类过滤条件 private List<Brand> brands; // 品牌过滤条件 private List<Map<String,String>> specs totalPage, items); this.categories = categories; this.brands = brands; this.specs = specs; } } 3.3.2.判断是否需要聚合 首先,在聚合得到商品分类后,判断分类的个数,如果是1个则进行规格聚合: ? goodsPage.getAggregation("category")); // 根据商品分类判断是否需要聚合 List<Map<String, Object>> specs 3.4.页面渲染 3.4.1.渲染规格过滤条件 首先把后台传递过来的specs添加到filters数组: 要注意:分类、品牌的option选项是对象,里面有name属性,而specs中的option是简单的字符串
example.com # 域名 # --------------------------------------------------------------------------- # "Specs config.yaml文件 # --------------------------------------------------------------------------- # "Specs Most users will want to use Template, below # # Specs is an array of Spec entries. # --------------------------------------------------------------------------- # Specs: # # # Note: Template and Specs are not mutually exclusive.
CacheManager中配置 改进版:更灵活的配置 为了缓解每次新增缓存都要修改CacheManager的工作,我们可以修改配置来新增缓存 application.properties caching.specs.student.timeout =2 caching.specs.person.timeout=10 CacheConfiguration @Configuration @ConfigurationProperties(prefix private Integer timeout; private Integer max = 200; } private Map<String, CacheSpec> specs cacheManager(Ticker ticker) { SimpleCacheManager manager = new SimpleCacheManager(); if (specs = null) { List<CaffeineCache> caches = specs.entrySet().stream()
5.2 specs/ 目录 - 能力规范 核心要求: specs/ 必须使用能力文件夹(capability folders),每个能力一个文件夹。 Ensure your change has a specs/ directory with capability folders 原因:specs/ 目录结构不正确。 解决方案: 1. 确保 specs/ 下有能力文件夹: specs/ └── your-capability/ # 能力文件夹 └── spec.md # 规范文件 2. 常见错误: specs/ └── spec.md # ❌ 错误:直接放在 specs/ 根目录 6.2.3 错误 3:需求条目解析失败 错误信息: ✗ [ERROR] Delta 先让 AI 阅读规范:在实现前,让 AI 先阅读 proposal.md 和 specs/ 2.
= { "conv0": { "block_name": "convbn", "num_blocks": 1, "block_specs": [ = { "conv0": { "block_name": "convbn", "num_blocks": 1, "block_specs": [ = { } MNV4HybridConvLarge_BLOCK_SPECS = { } MODEL_SPECS = { "MobileNetV4ConvSmall": MNV4ConvSmall_BLOCK_SPECS , "MobileNetV4ConvMedium": MNV4ConvMedium_BLOCK_SPECS, "MobileNetV4ConvLarge": MNV4ConvLarge_BLOCK_SPECS , "MobileNetV4HybridMedium": MNV4HybridConvMedium_BLOCK_SPECS, "MobileNetV4HybridLarge": MNV4HybridConvLarge_BLOCK_SPECS
Specs眼镜与其他旨在防止走神App相比更高级,它不是单纯锁死手机屏幕,而是判断你当前的行为是否专注。 而且,Specs眼镜,并不能真正「防走神」,对目标物体发呆,或者干脆闭眼打盹,就能完全骗过算法。 人类的惰性发作,高科技也救不了。 跟Specs一样,Focals也支持定制带度数的镜片。不过,配好这样一款眼镜需要消费者亲自到店,进行3D扫描建模。 与之相比,从Auctify放出的演示视频来看,Specs看上去要轻便得多,但要实现的功能可比Focals复杂多了。 ? 鉴于Focals间歇式、短时间的投影,续航都只有18个小时,我有点明白Specs为啥要配4块备用电池了。
它主要包含两个核心概念: Specs (openspec/specs/):当前系统的真实状态。这里存放着系统现有的功能规范。 Changes (openspec/changes/):对未来的提案。 /add-login),在里面写下 proposal.md(为什么改、改什么)和 tasks.md(怎么改),以及该变更涉及到的 Spec 增量(openspec/changes/add-login/specs 此时,Change 中的 Spec 增量会被合并到主 Specs 中,成为新的“真实来源”,历史提案则被移入 openspec/changes/archive/。 /**/spec.md 中,成为新的真实规范; 之后如果你再让 CodeBuddy Code 理解当前的认证规则,只需要让它阅读 openspec/specs/auth/spec.md 即可。 yes 这样就不会动到已有 Specs,只归档变更记录。
example.com # --------------------------------------------------------------------------- # "Specs complete description # --------------------------------------------------------------------------- Specs Most users will want to use Template, below # # Specs is an array of Spec entries. # --------------------------------------------------------------------------- # Specs: # # # Note: Template and Specs are not mutually exclusive.