FAF Go — 通往 100% ✪ 的引导之路
"只需输入 /faf-go,回答问题直至完成。目标 100%。"
.faf 是 IANA 注册的上下文格式(application/vnd.faf+yaml)——一个由 你拥有 的、类型化、可移植的文件,可被任何 AI 读取。faf-cli 基于 21 个槽位打分;你的 app_type 决定哪些槽位为 active,100% ✪ = 每个 active 槽位都已填写。本技能就是带您达成该目标的引导式访谈:AI 先填入它能检测到的内容,然后通过 Claude Code 的 AskUserQuestion 仅就那些无法获取的空白向您提问。
何时使用本技能
在以下情况触发:
- 用户希望提升其 .faf 分数
- 用户提及 "Gold Code" 或 "100%"
- 用户的项目上下文不完整
- 在
faf init之后,用于补齐缺失字段 - 用户说 "帮我处理一下我的 .faf"
与 Claude Code 的集成
FAF Go 是为 Claude Code 量身打造的:
- AskUserQuestion - Claude Code 原生的提问界面
- multiSelect: true - 支持多选答案(例如 "pytest + WJTTC")
- TodoWrite - 在访谈过程中追踪进度
- 结构化输出 - Claude Code 能理解的 JSON
- 双向同步 - 答案同时流向 .faf 和 CLAUDE.md
multiSelect 支持
部分问题允许多选:
stack.testing→ "pytest + WJTTC"stack.cicd→ "GitHub Actions + Cloud Build"stack.frontend→ "React + Tailwind"human_context.who→ "Developers + AI agents"
当 multiSelect: true 时,用户可以勾选 2 个或更多选项。结果以 " + " 连接。
工作流
步骤 1:检查当前状态
运行 faf score 来了解当前位置:
faf score --verbose
或者获取结构化数据以供程序化使用:
faf score --json
--json 会返回分数以及逐槽位明细——其中空槽位就是访谈要问的内容(优先级顺序见步骤 2)。
步骤 2:使用 AskUserQuestion 进行提问
针对每个缺失字段,使用 Claude Code 的 AskUserQuestion 工具:
优先级顺序(影响力从高到低):
project.goal- 这个项目是做什么的?human_context.why- 它为什么存在?human_context.who- 谁会使用它?human_context.what- 它解决什么问题?project.main_language- 主要编程语言stack.database- 数据库选型stack.hosting- 部署在哪里?stack.frontend- 前端框架stack.backend- 后端框架human_context.where- 环境human_context.when- 时间线/阶段human_context.how- 项目是如何构建的(从 stack 推导)
步骤 3:应用答案
收集完答案后,更新 .faf 文件:
# 读取当前 .faf
cat project.faf
# 更新字段(使用 Edit 工具)
# 然后验证:
faf score
步骤 4:庆祝或继续
若分数 >= 100:庆祝达成 Gold Code 若分数 < 100:继续问剩余问题
AskUserQuestion 的问题模板
单选问题(选一个)
project.goal
{
"question": "这个项目是做什么的?(用一句话清晰描述)",
"header": "目标",
"multiSelect": false,
"options": [
{"label": "我来输入", "description": "我自己描述"},
{"label": "帮我写", "description": "引导我完成"}
]
}
human_context.why
{
"question": "这个项目为什么存在?",
"header": "原因",
"multiSelect": false,
"options": [
{"label": "业务需求", "description": "解决一个业务问题"},
{"label": "个人项目", "description": "学习或爱好"},
{"label": "开源贡献", "description": "社区贡献"},
{"label": "我来解释", "description": "自定义原因"}
]
}
stack.database
{
"question": "你使用什么数据库?",
"header": "数据库",
"multiSelect": false,
"options": [
{"label": "PostgreSQL", "description": "关系型数据库"},
{"label": "MongoDB", "description": "文档型数据库"},
{"label": "SQLite", "description": "文件型数据库"},
{"label": "不使用", "description": "无数据库"}
]
}
stack.hosting
{
"question": "该项目部署在哪里?",
"header": "托管",
"multiSelect": false,
"options": [
{"label": "Vercel", "description": "前端/无服务器"},
{"label": "AWS", "description": "亚马逊云服务"},
{"label": "仅本地", "description": "尚未部署"},
{"label": "其他", "description": "其他平台"}
]
}
多选问题(可多选,用 " + " 连接)
stack.testing
{
"question": "你使用哪些测试工具/方法?",
"header": "测试",
"multiSelect": true,
"options": [
{"label": "pytest", "description": "Python 测试框架"},
{"label": "Jest", "description": "JavaScript 测试"},
{"label": "Vitest", "description": "Vite 原生测试"},
{"label": "WJTTC", "description": "锦标赛方法论(第二层)"}
]
}
结果格式: pytest + WJTTC(业界标准在前,WJTTC 在后)
排序: 同时选中时,业界标准测试在前:
pytest + WJTTC(而非WJTTC + pytest)- WJTTC 也可以独立运行
stack.cicd
{
"question": "你使用哪些 CI/CD 工具?",
"header": "CI/CD",
"multiSelect": true,
"options": [
{"label": "GitHub Actions", "description": "GitHub 原生 CI/CD"},
{"label": "Cloud Build", "description": "Google Cloud CI/CD"},
{"label": "CircleCI", "description": "CircleCI 流水线"},
{"label": "不使用", "description": "暂无 CI/CD"}
]
}
结果格式: GitHub Actions + Cloud Build
stack.frontend
{
"question": "你使用哪些前端技术?",
"header": "前端",
"multiSelect": true,
"options": [
{"label": "React", "description": "React 框架"},
{"label": "Next.js", "description": "React 元框架"},
{"label": "Svelte", "description": "Svelte 框架"},
{"label": "无/仅 API", "description": "无前端"}
]
}
human_context.who
{
"question": "谁会使用这个项目?",
"header": "用户",
"multiSelect": true,
"options": [
{"label": "开发者", "description": "软件开发人员"},
{"label": "终端用户", "description": "非技术用户"},
{"label": "AI 智能体", "description": "Claude、Gemini 等"},
{"label": "内部团队", "description": "仅限本团队"}
]
}
结果格式: Developers + AI agents
处理多选答案
当用户选择多个选项时,用 " + " 连接:
# 示例:用户选择了 ["pytest", "WJTTC"]
selected = ["pytest", "WJTTC"]
value = " + ".join(selected) # "pytest + WJTTC"
这样在 .faf 文件中就能产生可读、易扫视的值:
stack:
testing: pytest + WJTTC
cicd: GitHub Actions + Cloud Build
示例会话
User: /faf-go
Claude: 让我先检查你当前的 .faf 状态。
[Runs: faf score --verbose]
你的分数是 45%。让我们一起把它提到 Gold Code!
[Uses AskUserQuestion for project.goal]
User: [选择选项或输入自定义内容]
Claude: 很好!接下来记录这个项目为什么存在。
[Uses AskUserQuestion for human_context.why]
... 一直持续直到 100% ...
Claude: ✪ 达成 GOLD CODE!
你的 AI 现在拥有完整上下文,可发挥锦标赛级表现。
TodoWrite 集成
使用 todos 跟踪进度:
[
{"content": "回答 project.goal 问题", "status": "completed"},
{"content": "回答 human_context.why 问题", "status": "in_progress"},
{"content": "回答 stack.database 问题", "status": "pending"},
{"content": "验证已达成 Gold Code", "status": "pending"}
]
CLI 回退方案
在 Claude Code 之外,可以用 CLI 自带的交互式访谈到达同样的终点:
faf go # 交互式终端访谈(--resume 续接上次会话)
本技能是该访谈的 Claude 原生版本——用 AskUserQuestion 替代终端提示。如需结构化、程序化的数据,请使用 faf score --json。
成功指标
- 用户达到 100% 分数
- 所有必填字段都填入了有意义的内容
- 没有占位符值(在不合适的地方出现 TBD、Unknown、None)
- 用户理解每个字段的用途
完成时
当达成 100% ✪ 时:
✪ 100% — Gold Code
project.faf: 完成
CLAUDE.md: 已从 .faf 同步
可选地运行 faf sync,从 .faf 生成 CLAUDE.md / AGENTS.md。此后你的 AI 在每次会话开始时都将拥有完整的项目上下文。
相关技能
- faf-context — 构建者的快速上手:把 AI 需要的素材交给它,快速冲 100%
- faf-wizard — 自动化一键为任何项目生成 .faf
- faf-expert — 精通格式:评分机制、MCP 配置、双向同步、完整的 21 槽位模型
.faf 是格式。project.faf 是文件。 100% ✪ AI 就绪度是结果。
MIT · FAF 技能家族成员(faf-context · faf-wizard · faf-expert)。Claude Code 原生。
局限性
- 仅在任务与上游来源和本地项目上下文明确匹配时使用本技能。
- 在应用任何变更之前,请验证命令、生成的代码、依赖、凭证以及外部服务行为。
- 不要将示例视为针对特定环境的测试、安全审查或用户对破坏性/高成本操作的批准的替代品。