如果你最近关注过终端里的 AI 编程工具,大概率见过这样的场景:开发者在命令行里敲一句话,AI 助手开始自动创建目录、编写代码、运行测试、修复报错,最后把一个能运行的产品摆在面前。
但如果我告诉你,这个 AI 不只是“写代码”,而是从零设计了一款游戏,自己定玩法、自己写实现、自己跑起来试玩,最后告诉你“这关能过”——你会不会觉得这个闭环已经和传统的编程辅助完全不一样了?
CLI 策略游戏 Shove 就是一个这样的样本。从项目标题看,它的设计(designed)、构建(built)、试玩(played)三个环节全部由 Claude 完成。游戏本身并不复杂:终端渲染、字符界面、推挤玩法,但它背后展示的“AI 独立交付完整小产品”的能力,值得每一个关注 AI 编程的开发者认真看一遍。
这篇文章我会分四个部分展开:先讲 Shove 这类 CLI 游戏为什么是验证 AI 全流程能力的绝佳场景;再讲 Claude Code 这个工具的核心概念和安装方式;然后给出一套完整的可操作示例——从设计提示词到游戏代码,再到运行验证和自动通关脚本;最后整理常见的坑和工程建议。内容偏实践,建议收藏备用。
1. Shove 是什么:一个 AI 全流程交付的 CLI 策略游戏
Shove 这个名字已经暗示了玩法:玩家在网格地图上移动,把箱子或其他单位推挤到目标位置。终端游戏没有图形渲染,界面就是字符画,棋盘、玩家、箱子、目标点全部用符号表示。这类游戏在游戏设计上非常克制,核心机制往往只有“移动”和“推动”两个动作,但正因为规则少,策略性反而可以做得非常深。
这个项目的关键不在游戏本身,而在完成方式。项目标题里的三个英文词其实对应三个阶段:
- designed:由 Claude 确定游戏类型、规则、关卡和交互方式;
- built:由 Claude 编写完整代码,包括数据结构、渲染逻辑和输入处理;
- played:由 Claude 实际运行游戏、验证关卡可玩性,甚至检查通关路径。
你可以把这三个词理解成“产品经理、程序员、测试工程师”三个岗位。过去这三个环节需要三个人协作,而 Shove 展示的是:在规模足够小的项目中,AI 可以一个人把三条链路全部走完。
为什么这件事值得关注?因为大多数 AI 编程工具的演示都停留在“生成代码片段”或“解释一段报错”,而 Shove 代表的是更进一步的形态:AI 拥有一个完整的交付闭环,能定义问题、实现方案、验证结果。这个能力边界的变化,才是这篇文章真正想讨论的问题。
1.1 为什么“played”这一步最有含金量
很多 AI 代码生成工具都能做到“designed”和“built”,毕竟模型受过大量代码训练,写出一个能编译的 Python 文件并不难。难的是“played”——让 AI 自己验证自己写的游戏能不能通关。
在 Shove 这个例子里,验证环节不是靠人肉打开游戏玩两局,而是让 AI 写一个自动通关脚本(比如 BFS 求解器),搜索一条从起点到终点合法的路径,从而在逻辑上证明关卡可解。这一步的意义很大:它把“代码没有语法错误”提升到了“程序在功能上真正满足设计目标”。
所以,当你在评估一个 AI 编程工具的能力时,不要只看它能生成多少行代码,要重点看它能不能自己验证自己的产出。这个习惯,也会在后面的实践部分反复出现。
2. 为什么 CLI 游戏是验证 AI 全流程能力的好场景
不是所有项目都适合让 AI 独立完成。网页应用涉及前端框架、后端服务、数据库、部署环境,任何一个环节出问题都会让 AI 陷入长链路调试。移动应用更复杂,光签名和打包就够折腾。相比之下,CLI 游戏几乎是“AI 友好度”最高的项目类型。
原因主要有三点:
第一,依赖极少。终端游戏通常只需要标准库,不需要图形渲染引擎、不需要网络请求、不需要数据库。对 AI 来说,这意味着生成代码时不用兼容大量第三方库的 API。
第二,验证标准清晰。游戏天然有输赢条件,箱子是否全部到位、玩家能否走到目标点,都是可程序化判断的结果。AI 可以写单元测试,也可以写自动解算器来验证,不需要人去主观评估。
第三,交互简单。键盘输入加文本输出,输入输出都是结构化数据,AI 很容易理解“按键对应移动”“渲染就是把状态画成字符”。
2.1 三类项目形态对 AI 的友好程度对比
| 项目形态 | 依赖复杂度 | 验证难度 | 适合 AI 独立完成的程度 | 典型原因 |
|---|---|---|---|---|
| CLI 小游戏 | 低 | 低 | 高 | 标准库即可,输赢可自动判断 |
| Web 应用 | 中高 | 中 | 中 | 涉及前后端、部署、浏览器兼容 |
| 移动应用 | 高 | 高 | 低 | 构建链、签名、真机适配问题多 |
从这张表能看出一个规律:越是依赖少的项目,AI 越容易形成完整的交付闭环。Claude Code 这类工具主打的能力其实是“在小而明确的任务上做端到端交付”,而 CLI 游戏正是这种能力最直观的演示场景。
3. Claude Code 核心概念:终端里的 Agent 编程
要复现 Shove 的工作方式,绕不开一个工具:Claude Code。它和你在网页上和 Claude 聊天完全不同。网页对话只能给你代码建议,复制粘贴、创建文件、运行调试仍然要你自己做。而 Claude Code 是一个运行在终端里的编程 Agent,它可以直接操作你的文件系统和命令行。
它的核心工作循环是:
- 读取:查看项目结构和文件内容;
- 编写:创建或修改代码文件;
- 执行:运行测试、执行程序;
- 观察:读取命令输出和报错信息;
- 修复:根据报错调整代码,再回到第 3 步。
这个循环是自动完成的,但它不是“黑箱”。Claude Code 在执行命令和修改文件前通常会请求确认,你可以逐条批准,也可以用配置允许特定命令自动执行。对于敏感操作,保留人在回路里永远是正确的选择。
从搜索结果看,最近“Claude Code 安装”“Claude Code 使用教程”“VSCode 配置 Claude Code”是搜索热词,说明很多开发者已经注意到这类工具,但真正把它用起来的人还不多。原因很简单:安装只是第一步,更关键的是理解怎么用提示词把它引导到一个完整的交付闭环里。
3.1 Claude Code 与 AI 辅助补全的区别
传统 AI 编程助手(比如 IDE 里的代码补全)解决的是“下一行写什么”的问题;Claude Code 解决的是“一个小功能或小产品如何端到端落地”的问题。你可以把它理解成“实习生”和“外包团队”的差别:一个在代码层面帮忙,一个在任务层面交付。
当然,它也有明显的适用边界。Claude Code 不适合处理架构模糊、需求宏大、依赖复杂的大型系统。但对 Shove 这种“规则清晰、范围有限、交付物明确”的小游戏来说,它正好处在能力中心区域。
4. 环境准备与前置条件
如果你想自己动手复现一个 Shove 风格的 CLI 游戏,需要先准备好环境。下面是通用步骤,具体版本请以官方文档为准,本文重点演示思路。
4.1 安装 Node.js
Claude Code 基于 Node.js 运行,安装前先确认环境里有 Node.js。一般建议使用 LTS 版本,版本过旧会导致安装失败或运行异常。
node --version npm --version如果系统还没有 Node.js,建议使用 nvm 这类版本管理工具安装,而不是直接用 sudo 装全局包。这样后续更新版本、清理环境都更方便。
4.2 安装 Claude Code
安装方式有两种,任选其一。第一种是通过 npm 全局安装:
npm install -g @anthropic-ai/claude-code第二种是通过官方安装脚本(macOS/Linux):
curl -fsSL https://claude.ai/install.sh | bash安装完成后验证一下:
claude --version看到版本号就说明安装成功。如果在 Windows 上提示“claude 不是内部或外部命令”,通常是 npm 全局目录没有加入 PATH,这个我们放在后面的常见问题里详细说。
4.3 登录与权限
第一次运行claude会引导你登录 Anthropic 账号。登录完成后,Claude Code 会获得修改文件和执行命令的权限。有一点要特别注意:不要把生产环境的凭证、数据库密码、云服务密钥放在工作目录或环境变量里,让 AI 代管。AI 编程工具应该只运行在你有把握的、可回滚的目录里,涉及权限、认证、删库等操作时,必须坚持最小权限原则。
4.4 可选:VS Code 集成
Claude Code 有对应的编辑器扩展。安装后可以在 VS Code 里直接打开终端面板使用,也可以在编辑器侧边栏查看对话和文件变更。这个集成能提升体验,但不是必需。对本文的 CLI 游戏示例来说,纯终端操作已经足够。
5. 设计阶段:让 Claude 设计出可实现的游戏
很多人在使用 AI 编程工具时容易犯一个错误:一上来就让 AI“写一个游戏”,结果 AI 返回一大堆文件和一个跑不起来的半成品。问题不在于 AI 能力,而在于约束太少。
正确做法是先让 Claude 输出设计文档,明确机制、渲染方式、输入方式、赢法,然后再进入编码阶段。这一步相当于给 AI 画了一个边界,所有后续代码都在这套约束里生成。
5.1 示例:给 Claude 的设计提示词
我想做一个 CLI 策略游戏 Shove,请先输出设计文档,先不要写代码。 要求: 1. 玩法:玩家在一个字符画网格中移动,可以推动箱子;一次只能推一个箱子,箱子不能被推入墙中。 2. 目标:把全部箱子推到目标格即过关。 3. 交互:WASD 移动,Q 退出,R 重开;每一步操作后重新渲染棋盘。 4. 技术约束:使用 Python 标准库,不引入第三方依赖,代码只保留一个文件加一个测试文件。 5. 关卡:提供一个保证可解的初始关卡,并给出自动验证脚本。 6. 交付格式:设计文档用 Markdown,包含规则、棋盘示例、数据结构、主要函数签名、验收标准。这个提示词里最关键的其实是第 4 条和第 5 条。第 4 条限制了技术边界,避免 AI 引入不必要的依赖;第 5 条要求“保证可解”,逼着 AI 在设计阶段就考虑验证闭环——这正是 Shove 项目里“played”环节的雏形。
5.2 好的设计文档应该长什么样
如果约束给得足够清楚,Claude 返回的设计文档会包含:
- 游戏规则:移动方式、推动规则、胜利条件;
- 棋盘表示法:用哪些字符表示墙、箱子、目标点、玩家;
- 数据结构:玩家坐标、箱子坐标集合、目标点集合;
- 核心函数签名:移动函数、渲染函数、胜负判断函数;
- 验收标准:哪些场景必须通过测试。
此时不要急着进入编码。先读一遍设计文档,确认机制符合预期。如果某个规则有歧义,在这个阶段让 Claude 修改的成本远低于写完代码之后再大改。设计阶段的核心原则是:用最小规则集界定玩法,不要追求宏大构想。
6. 构建阶段:Claude 从设计到实现的循环
设计文档确认后,下一步就是在 Claude Code 里启动构建。打开终端,进入项目目录,运行:
claude然后输入类似这样的指令:
请阅读项目目录下的 design.md,按它实现 shove.py 和 test_shove.py, 运行测试直到全部通过。接下来你会看到 Claude Code 自己完成这些动作:
- 读取 design.md,理解设计意图;
- 创建 shove.py,实现棋盘、玩家移动、箱体推动、渲染和主循环;
- 创建 test_shove.py,写一组覆盖核心逻辑的单元测试;
- 运行测试,根据报错修改代码;
- 重复第 3、4 步,直到测试全部通过。
这个过程特别像真实开发中的 Debug 循环,只不过循环体是 AI 自己在跑。作为开发者,你的角色从“写代码的人”变成了“验收代码的人”。
6.1 “played”环节怎么实现
Shove 项目里最有意思的点是 Claude 会“试玩”自己的游戏。在终端游戏里,试玩不能靠人肉操作,更可靠的方式是让 AI 写一个自动通关脚本,用 BFS(广度优先搜索)在状态空间里搜索一条从起点到终点的合法移动路径。如果找到了路径,就等于从逻辑上证明了关卡可解。
你可以在 Claude Code 里继续输入:
再写一个 auto_play.py,用 BFS 自动寻找通关路径, 运行后输出最短移动序列,用来证明 level_1 是可解的。这一步的价值在于:AI 不再是“写完就交差”,而是用程序化手段验证了自己的设计目标。这也是我在第 1 节强调的——“played”才是全流程能力的分水岭。
7. 完整示例代码:一个 Shove 风格的 CLI 策略游戏
下面给出一套完整的可运行实现。注意:这是为了演示“AI 交付闭环”而写的示例,与项目中的实际实现可能不完全一致,但可以让你完整跑通“设计提示词 + 代码实现 + 测试验证 + 自动通关”这条链路。
7.1 核心游戏代码
文件路径:shove/shove.py
#!/usr/bin/env python3 # shove.py - 一个 Shove 风格的终端策略推箱游戏 # 运行方式: python3 shove.py # 依赖: 仅 Python 3.8+ 标准库 import os from typing import List, Set, Tuple LEVEL_1 = [ "########", "# #", "# $ . #", "# #", "# @ #", "########", ] WALL = '#' BOX = '$' GOAL = '.' PLAYER = '@' BOX_ON_GOAL = '*' FLOOR = ' ' MOVE_KEYS = { 'w': (0, -1), 'a': (-1, 0), 's': (0, 1), 'd': (1, 0), } class ShoveGame: """极简终端策略游戏:把所有箱子推到目标点。""" def __init__(self, level: List[str], level_name: str = "level_1"): self.name = level_name self.grid: List[List[str]] = [list(row) for row in level] self.height = len(self.grid) self.width = max(len(row) for row in self.grid) self.boxes: Set[Tuple[int, int]] = set() self.goals: Set[Tuple[int, int]] = set() self.player: Tuple[int, int] = (0, 0) self.moves = 0 self._scan() def _scan(self) -> None: """将静态关卡解析成墙/地板 + 动态实体集合。""" for y in range(self.height): for x in range(self.width): ch = self.grid[y][x] if ch == WALL: continue # 非墙字符统一变为地板,实体交给 set 管理 self.grid[y][x] = FLOOR pos = (x, y) if ch == PLAYER: self.player = pos elif ch in (BOX, BOX_ON_GOAL): self.boxes.add(pos) if ch == BOX_ON_GOAL: self.goals.add(pos) elif ch == GOAL: self.goals.add(pos) def render(self) -> str: lines = [] for y in range(self.height): row = [] for x in range(self.width): pos = (x, y) if pos == self.player: row.append(PLAYER) elif pos in self.boxes: row.append(BOX_ON_GOAL if pos in self.goals else BOX) elif pos in self.goals: row.append(GOAL) else: row.append(self.grid[y][x]) lines.append(''.join(row)) return '\n'.join(lines) def is_wall(self, x: int, y: int) -> bool: if x < 0 or x >= self.width or y < 0 or y >= self.height: return True return self.grid[y][x] == WALL def try_move(self, dx: int, dy: int) -> str: px, py = self.player nx, ny = px + dx, py + dy if self.is_wall(nx, ny): return "前方是墙,无法移动" if (nx, ny) in self.boxes: tx, ty = nx + dx, ny + dy if self.is_wall(tx, ty) or (tx, ty) in self.boxes: return "推不动:前方是墙或另一个箱子" self.boxes.remove((nx, ny)) self.boxes.add((tx, ty)) self.player = (nx, ny) self.moves += 1 return "ok" def is_win(self) -> bool: return self.boxes == self.goals def play(self) -> str: while True: os.system('cls' if os.name == 'nt' else 'clear') print(f"=== {self.name}:把 $ 全部推到 . 上 ===") print(self.render()) print(f"步数:{self.moves}") if self.is_win(): print("恭喜过关!") return "win" key = input("WASD 移动,Q 退出,R 重开:").strip().lower() if key == 'q': return "quit" if key == 'r': return "restart" if key not in MOVE_KEYS: print("无效按键,请输入 W/A/S/D/Q/R") input("按回车继续...") continue dx, dy = MOVE_KEYS[key] print(self.try_move(dx, dy)) input("按回车继续...") def main() -> None: while True: result = ShoveGame(LEVEL_1).play() if result != "restart": break if __name__ == "__main__": main()代码的核心设计是“静态地图 + 动态实体集合”的分离。grid只保存墙和地板,玩家、箱子、目标点分别用坐标集合维护。这样做的好处是移动和推动逻辑只需要修改集合和坐标,不需要频繁改动整个二维数组,渲染时再根据集合动态生成画面。
7.2 单元测试代码
文件路径:shove/test_shove.py
# test_shove.py - 与 shove.py 放在同一目录 import unittest from shove import ShoveGame LEVEL_TEST = [ "#####", "#@$.#", "#####", ] class TestShoveGame(unittest.TestCase): def test_initial_state(self): game = ShoveGame(LEVEL_TEST) self.assertEqual((1, 1), game.player) self.assertEqual(1, len(game.boxes)) self.assertEqual(1, len(game.goals)) self.assertFalse(game.is_win()) def test_cannot_walk_into_wall(self): game = ShoveGame(LEVEL_TEST) msg = game.try_move(0, -1) # 向上是墙 self.assertNotEqual("ok", msg) self.assertEqual(0, game.moves) def test_push_box_to_goal(self): game = ShoveGame(LEVEL_TEST) msg = game.try_move(1, 0) # 向右推箱子一格 self.assertEqual("ok", msg) self.assertIn((3, 1), game.boxes) self.assertTrue(game.is_win()) def test_cannot_push_two_boxes(self): level_two = [ "######", "#@$$ #", "######", ] game = ShoveGame(level_two) msg = game.try_move(1, 0) self.assertNotEqual("ok", msg) self.assertEqual(2, len(game.boxes)) if __name__ == "__main__": unittest.main()这组测试覆盖了三个关键行为:移动和推动的合法路径、墙碰撞、双箱子阻挡。如果一个 AI 生成的代码能通过这套测试,说明它的核心规则实现基本正确。
7.3 自动通关验证脚本
文件路径:shove/auto_play.py
# auto_play.py - 自动寻找通关路径并验证关卡 # 运行方式: python3 auto_play.py from collections import deque from shove import ShoveGame, LEVEL_1, MOVE_KEYS def solve(game: ShoveGame): start_state = (game.player, frozenset(game.boxes)) queue = deque([(start_state, [])]) visited = {start_state} while queue: (player, boxes), path = queue.popleft() for key, (dx, dy) in MOVE_KEYS.items(): px, py = player nx, ny = px + dx, py + dy if game.is_wall(nx, ny): continue new_boxes = set(boxes) if (nx, ny) in new_boxes: tx, ty = nx + dx, ny + dy if game.is_wall(tx, ty) or (tx, ty) in new_boxes: continue new_boxes.remove((nx, ny)) new_boxes.add((tx, ty)) new_state = ((nx, ny), frozenset(new_boxes)) if new_state in visited: continue visited.add(new_state) new_path = path + [key.upper()] if new_boxes == game.goals: return new_path queue.append((new_state, new_path)) return [] if __name__ == "__main__": game = ShoveGame(LEVEL_1) solution = solve(game) if solution: print("关卡可解,最短路径:", " -> ".join(solution)) else: print("在搜索空间内没有找到解,请检查关卡设计")这个脚本用 BFS 遍历所有可达状态。状态包括玩家位置和箱子集合,每走一步就产生一个新状态,直到找到所有箱子都在目标点的状态。对于小棋盘来说,这个算法能在毫秒级完成搜索。
8. 运行结果与效果验证
代码写完后,按顺序做三件事:跑通游戏、运行测试、验证可解性。
8.1 手动运行游戏
cd shove python3 shove.py启动后的界面类似:
=== level_1:把 $ 全部推到 . 上 === ######## # # # $ . # # # # @ # ######## 步数:0 WASD 移动,Q 退出,R 重开:w玩家@在棋盘左下区域,箱子$在上方,目标点.在右侧。按 WASD 移动,把箱子推到目标点后,游戏输出“恭喜过关!”。一个可行的通关操作序列是:W A A W D D D。
通关后的棋盘:
######## # # # @* # # # # # ######## 步数:7其中*表示箱子已经在目标点上。看到这个符号,就说明游戏核心闭环正常。
8.2 运行单元测试
python3 -m unittest test_shove -v预期输出:
test_cannot_push_two_boxes (test_shove.TestShoveGame) ... ok test_cannot_walk_into_wall (test_shove.TestShoveGame) ... ok test_initial_state (test_shove.TestShoveGame) ... ok test_push_box_to_goal (test_shove.TestShoveGame) ... ok Ran 4 tests in 0.00s OK全部通过,说明移动、推动、碰撞和胜利判定都符合预期。
8.3 验证关卡可解
python3 auto_play.py预期输出:
关卡可解,最短路径: W -> A -> A -> W -> D -> D -> D这一步是关键:它证明了level_1在逻辑上是可完成的,而不是一个设计出来就无解的关卡。任何 AI 生成的游戏都应该补上这一步验证,否则就会出现“代码跑起来了但玩家根本赢不了”的尴尬情况。
如果自动通关脚本找不到路径,优先检查关卡地图里是否存在死局,比如箱子被推入角落后再也不可能到达目标点,或者地图本身被墙分割成了不可达的区域。
9. 常见问题与排查思路
从搜索热词来看,安装 Claude Code 和执行claude命令时最容易出问题。这里整理一张排查表,覆盖我见过的高频问题。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| Windows 下提示“claude 不是内部或外部命令” | npm 全局安装目录不在 PATH 中 | 运行npm prefix -g查看全局目录,检查 PATH | 把 npm 全局 bin 目录加入 PATH,重开终端 |
| 编辑器插件提示无法定位 CLI 二进制文件 | 插件配置的 CLI 路径与which claude不一致 | 对比插件设置的执行路径和实际安装路径 | 更新插件配置或重新安装 Claude Code |
| 登录成功后请求报错 | 网络代理配置不完整或账号权限受限 | 检查终端代理环境变量,查看官方状态页 | 配置合规网络,确认账号有可用权限 |
| 安装时提示 EACCES 权限不足 | 使用系统级 Node,全局目录无写入权限 | 查看报错信息和 npm 配置 | 改用 nvm 管理 Node,避免用 sudo 装全局包 |
| Node 版本过低导致运行异常 | 依赖了高版本 Node API | 执行node --version查看版本 | 升级到官方要求的版本或 LTS 版本 |
| 组织策略限制 Claude Code 访问 | 订阅由组织统一管理,策略禁止使用 | 查看终端中组织策略提示 | 联系管理员开通访问权限或使用个人账号 |
| 游戏按键无响应 | 输入法处于中文状态,WASD 被捕获 | 查看终端是否显示中文输入状态 | 切换英文输入法后重新操作 |
9.1 一个容易被忽视的排查顺序
遇到 Claude Code 相关问题,建议按下述顺序排查:
- 确认安装是否成功:
claude --version; - 确认命令是否在 PATH 中:
which claude(macOS/Linux)或where claude(Windows); - 确认 Node 版本满足要求;
- 确认登录状态,必要时重新登录;
- 如果是在编辑器插件里调用,确认插件的执行路径配置。
这个顺序能覆盖绝大多数“找不到命令”和“无法启动”类问题。
10. 最佳实践与工程建议
Shove 这个项目虽然小,但它把 AI 全流程交付的完整路径跑通了一遍。从这类实践里可以总结出几条通用建议,适用于所有想用 AI 做小游戏、小工具、内部脚本的开发者。
10.1 用设计文档锁住需求边界
不要让 AI 直接从一句话跳到代码。先让它输出设计文档,确认规则、边界和验收标准。设计文档会变成后续所有对话的上下文,相当于给 AI 一个稳定的“需求锚点”。在我前面的例子里,design.md就是整个项目执行的依据。
10.2 让 AI 自己写验证代码
这是最能区分“玩具级 AI 编程”和“工程级 AI 编程”的习惯。游戏写完后,要求 AI 同时交付单元测试和自动通关脚本。如果 AI 生成的代码能通过自己写的测试,这个交付物的可信度会明显提升。
10.3 使用版本控制
每完成一个阶段就提交一次代码。AI 修改代码时可能引入回归,有版本控制才能快速回滚。这里强调一点:让 AI 直接修改生产环境或数据库是非常危险的操作。如果你在真实项目里使用 Claude Code,务必严格限定操作目录,并且只允许它执行经过你确认的命令。
10.4 安全边界:最小权限原则
AI 编程工具可以执行命令、修改文件,这是它的能力,也是它的风险。在以下场景中,建议不要让它独立操作:
- 生产环境的数据库,尤其是涉及删除、批量更新、结构变更的操作;
- 包含用户隐私数据或密钥的目录;
- 无法通过版本控制回滚的服务器。
正确做法是:在本地项目目录或隔离环境里让 AI 完成代码层面的工作,运维和敏感数据操作始终保留人工审批。
10.5 适合与不适合交给 AI 独立做的项目
| 适合 | 不适合 |
|---|---|
| CLI 小游戏、脚本、工具 | 大型分布式系统架构设计 |
| 需求清晰、边界明确的小功能 | 涉及多团队协作的复杂重构 |
| 有清晰验收标准的项目 | 依赖不明确、技术选型未定型的项目 |
| 内部工具和一次性脚本 | 生产环境数据迁移与高危操作 |
11. 总结与后续学习方向
Shove 这个项目的价值不在于游戏本身,而在于它完整展示了 AI 编程的新阶段:从“生成代码”走向“交付产品”。设计、构建、试玩三个环节全部由 AI 完成,这在几年前还很难想象,而现在已经成为可以复现的工作流。
对开发者来说,我的建议是不要再停留在“让 AI 解释报错”和“让 AI 补全函数”这个层级。找一个小而明确的 CLI 项目,比如推箱游戏、命令行番茄钟、日志分析脚本,让 AI 从设计文档开始,一路做完测试和自动验证。你会直观感受到 AI 编程能力的边界在哪里,也更容易判断哪些任务可以放心交给它、哪些必须自己拍板。
下一步可以继续深入研究的方向有几个:Claude Code 的权限系统和命令审批规则、如何用 hooks 在关键节点自动执行检查、以及如何把自动通关这类验证脚本推广到更多类型的项目中。工具和版本变化很快,具体命令以官方文档为准,但“设计约束 + 实现 + 自动验证”这套方法论,在很长一段时间内都会有效。