构建 NecroOS:带 Kiro AI 的恐怖主题 Windows 95 模拟器
Source: Dev.to
功能特性
- 使用
react95组件库实现的真实复古 UI - 多个应用:记事本、扫雷、投资组合管理器、终端,以及一些…更暗黑的惊喜
- 通过 haunt level(闹鬼等级)系统实现渐进式恐怖机制
- 视觉效果:CRT 显示器模拟、故障(glitch)效果以及屏幕扭曲
- 音频氛围:环境音效和随交互而增强的效果
- 损坏的 Clippy:大家最喜欢的助手,但出现了非常不对劲的情况
技术栈
- React 19
- TypeScript(严格模式)
- Zustand 用于状态管理
- Vite 提供极速开发体验
使用 Kiro 定义项目
我第一次与 Kiro 的交互为整个项目定下了基调。与其直接跳进代码,我先使用 Kiro 的 spec system(规格系统)来形式化需求和设计。这成为了改变游戏规则的关键。
规格文档
规格文档列出了:
- 每个功能的验收标准
- 必须保持的正确性属性
- 被拆分成可管理块的实现任务
Kiro 帮助迭代这些规格,捕获了我未曾考虑的边缘情况。例如,在设计窗口管理系统时,Kiro 建议了如下属性:
- “窗口永远不应覆盖任务栏”
- “最小化的窗口应恢复到之前的位置”
这些细节如果忽略,后期会导致 bug。
使用 Fast‑Check 的基于属性的测试
Kiro 最令人印象深刻的能力之一是它对 fast‑check 基于属性的测试的理解。与其编写数十个单独的测试用例,Kiro 帮助定义了始终应成立的属性。
import * as fc from 'fast-check';
fc.assert(
fc.property(
fc.array(windowArbitrary, { minLength: 1, maxLength: 10 }),
(windows) => {
// Property: focused window should always have highest z-index
const focusedWindow = windows.find(w => w.isFocused);
if (focusedWindow) {
expect(focusedWindow.zIndex).toBeGreaterThanOrEqual(
Math.max(...windows.map(w => w.zIndex))
);
}
}
),
{ numRuns: 100 }
);
Kiro 为几乎每个组件生成了类似的属性测试,捕获了传统单元测试会遗漏的边缘情况。故障系统、音频管理以及闹鬼等级编排都受益于此方法。
Steering 文档
早期,我发现了 Kiro 的 steering system——用于为整个项目提供上下文和约定的 markdown 文件。我创建了三份 steering 文档:
tech.md:定义技术栈、常用命令以及 TypeScript 配置structure.md:概述目录结构、命名约定和导入模式product.md:描述核心概念和关键功能
有了这些,Kiro 能持续生成符合项目约定的代码,而无需重复提示。
与 Kiro 的开发节奏
- 用自然语言定义功能
- Kiro 生成带有正确 TypeScript 类型、错误处理和测试的实现代码
- 使用 Kiro 的诊断工具审查并完善
- 继续下一个功能
闹鬼编排器
针对 闹鬼编排器——一个管理渐进式恐怖效果的复杂服务,Kiro 生成了:
- 带有完整 TypeScript 接口的核心服务类
- 覆盖所有方法的单元测试
- 状态转换的基于属性的测试
- 错误边界集成
- 性能优化
所有这些在一次迭代中完成,省去了数小时的手动编码和测试。
故障系统
故障系统需要:
- 根据闹鬼等级对窗口应用视觉扭曲
- 与音频效果协同
- 处理性能约束
- 在各浏览器间提供流畅动画
Kiro 生成了以下组件:
import React, { useMemo } from 'react';
import { useStore } from '@/store';
export const GlitchableWindow: React.FC = ({
children,
windowId,
intensity = 0,
}) => {
const glitchLevel = useStore(state => state.glitchLevel);
const effectiveIntensity = Math.min(intensity + glitchLevel * 0.1, 1);
// Proper memoization for performance
const glitchStyle = useMemo(() => ({
filter: `hue-rotate(${effectiveIntensity * 180}deg)
contrast(${1 + effectiveIntensity * 0.5})`,
animation: effectiveIntensity > 0.5
? `glitch ${2 - effectiveIntensity}s infinite`
: 'none',
}), [effectiveIntensity]);
return (
<div style={glitchStyle}>
{children}
</div>
);
};
属性测试验证了强度值始终保持在范围内,并且即使有多个故障窗口,性能仍保持流畅。
音频 Bug 修复
当音频在某些浏览器中无法播放时,我使用 Kiro 的上下文系统共享错误。Kiro 立即:
- 将问题定位为自动播放策略限制
- 生成了带有用户交互检测的稳健音频服务
- 添加了回退机制
- 创建了全面的错误处理和测试
该修复已具备生产级质量,而非临时 hack。
两周后的成果
- 15+ 个 React 组件,每个都有单元测试和基于属性的测试
- 95%+ 的代码覆盖率
- Zero TypeScript 严格模式错误
- 完备的错误处理与优雅降级
- 为流畅 60 fps 动画做出的性能优化
- 跨浏览器兼容并提供适当回退
代码库可维护、文档齐全,且始终遵循统一模式。这不仅是一次黑客马拉松项目——它是生产质量的代码。
经验教训
- 结构化开发:规格系统让复杂项目保持有序
- 基于属性的测试:捕获传统测试遗漏的边缘情况
- 一致性:Steering 规则确保项目代码统一
- 上下文感知:Kiro 理解整个项目,而非单个文件
- 最佳实践:生成的代码遵循现代模式和约定
- 创意方向:Kiro 实现,你定义愿景
实用技巧
- 先写规格 – 在需求和设计文档上投入时间
- 提前创建 steering 规则 – 让 Kiro 了解你的偏好
- 拥抱基于属性的测试 – 让 Kiro 生成完整的测试套件
- 广泛使用上下文 – 共享错误、文件结构和相关代码
- 在对话中迭代 – Kiro 会从你的反馈中学习
结论
使用 Kiro 构建 NecroOS 完全改变了我的开发流程。我在远低于单独开发所需时间的情况下交付了一个复杂、经过充分测试的应用,且代码质量毫不妥协。AI 辅助与人类创造力的结合非常强大——Kiro 处理繁琐的实现细节,而我专注于体验和架构。
如果你对 AI 辅助开发持怀疑态度,我能理解。我也曾如此。但 Kiro 并不是要取代开发者——它是在放大我们的能力。对于独自面对宏大项目的开发者来说,这种放大就是“也许有一天”与“今天已交付”之间的差距。
敢于尝试 NecroOS 吗:
Live Demo
GitHub Repository