
一、问题起源
- 1. office-hours是什么,有什么作用
- 2. office-hours 模板写了什么?
- 3. 它依赖哪些 Claude Code 特有的路径?
- 4. gstack 如何实现双环境兼容?
- 5. 关键工具 AskUserQuestion 在 Codex 中如何工作?
二、office-hours 是什么,有什么作用
office-hours 是 gstack 中用于产品讨论和方案梳理的一种对话型技能,灵感来自 YC Office Hours。它不是直接写代码的执行器,而是一个带有明确提问路径的"高强度产品审视流程":先收集背景,再追问目标、用户、需求现实、替代方案和设计方向,最后输出成结构化设计文档。
它的核心作用主要有四个:
- 1. 把模糊想法压缩成清晰问题:帮助用户把"我想做个东西"转成可讨论的目标、场景和约束。
- 2. 识别伪需求和空泛假设:通过强制追问,暴露"谁会用、为什么现在会用、现有替代方案是什么"这些关键问题。
- 3. 为后续技能提供输入:输出的设计文档可以继续交给
plan-ceo-review、plan-eng-review、design-review或直接进入实现阶段。 - 4. 在不同目标下切换讨论风格:如果用户是在创业,会偏诊断和挑战;如果是在做 hackathon、开源或学习项目,会偏探索和头脑风暴。
从定位上看,office-hours 更像"开始做事前的产品与方案澄清器"。它解决的不是"怎么编码",而是"这件事到底值不值得做、该怎么定义、下一步应该产出什么"。
三、office-hours 模板的分层结构
YC 办公时间技能模板,用于在讨论产品想法时进行"诊断式"对话。
第一阶段:背景收集
↓
第二阶段 A:创业模式(6个强制问题)
或
第二阶段 B:建造者模式(头脑风暴问题)
↓
第二阶段 2.5:相关设计发现
第二阶段 2.75:景观认知
↓
第三阶段:前提挑战
↓
第四阶段:替代方案生成
↓
第五阶段:设计文档输出2.1 占位符
| 占位符 | 作用 |
|---|---|
{{PREAMBLE}} | 预置的引导语/介绍内容 |
{{BROWSE_SETUP}} | 浏览/导航功能的设置指令 |
四、第一阶段:背景收集
这是每次 office-hours 会话的开始阶段,做 6 件事:
| 步骤 | 命令/操作 | 说明 |
|---|---|---|
| 1 | source <(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null) | 加载项目 slug |
| 2 | 阅读 CLAUDE.md、TODOS.md | 了解项目背景 |
| 3 | git log --oneline -30 + git diff origin/main --stat | 了解最近动态 |
| 4 | Grep/Glob 映射相关代码区域 | 找到与用户请求相关的代码 |
| 5 | ls -t ~/.gstack/projects/$SLUG/*-design-*.md | 列出已有设计文档 |
| 6 | AskUserQuestion 询问用户目标 | 决定进入哪个模式 |
3.1 模式路由
| 用户选择 | 进入模式 |
|---|---|
| 创办创业公司、内部创业 | 创业模式(第二阶段 A) |
| 黑客马拉松、开源、研究、学习、娱乐 | 建造者模式(第二阶段 B) |
五、Claude Code vs Codex:路径差异
office-hours 模板中的路径引用了两类目录:
4.1 gstack 技能目录(受 host 影响)
| 方面 | Claude Code | Codex |
|---|---|---|
| skillRoot | ~/.claude/skills/gstack | ~/.codex/skills/gstack |
| localSkillRoot | .claude/skills/gstack | .agents/skills/gstack |
4.2 gstack 内部目录(不受 host 影响)
| 目录 | 用途 |
|---|---|
~/.gstack/projects/ | 设计文档存储 |
~/.gstack/sessions/ | 会话跟踪 |
~/.gstack/analytics/ | 分析数据 |
六、模板渲染时的自动转换
5.1 转换机制
文件:scripts/gen-skill-docs.ts:2351-2354
渲染到 Codex 时,模板中的 Claude 路径会被自动替换:
if (host === 'codex') {
content = content.replace(/~\/\.claude\/skills\/gstack/g, '~/.codex/skills/gstack');
content = content.replace(/\.claude\/skills\/gstack/g, '.agents/skills/gstack');
content = content.replace(/\.claude\/skills\/review/g, '.agents/skills/gstack/review');
content = content.replace(/\.claude\/skills/g, '.agents/skills');
}5.2 渲染示例
模板源码:
source <(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)
渲染到 Claude Code:不变
渲染到 Codex: source <(~/.codex/skills/gstack/bin/gstack-slug 2>/dev/null)5.3 frontmatter 处理差异
- • Claude Code:原样保留完整 frontmatter
- • Codex:只保留
name+description,删除allowed-tools、hooks、version
七、office-hours 的依赖分析
基于模板源码和转换机制,分析 office-hours 在 Codex 环境下的依赖:
6.1 必需的目录/命令
| 依赖 | 模板中的用途 | 转换后状态 |
|---|---|---|
~/.gstack/projects/ | 列出/写入设计文档 | ✅ 不受转换影响 |
gstack-slug | 加载 $SLUG 变量 | ⚠️ 需要存在于 Codex 路径 |
6.2 不涉及的依赖
| 组件 | 说明 |
|---|---|
browse/dist/browse | 仅 /browse 技能使用 |
| Playwright Chromium | 仅 /browse 技能使用 |
八、AskUserQuestion 在 Codex 中的执行
7.1 工具对应关系
| Claude Code | Codex |
|---|---|
AskUserQuestion | ask_user_question |
两者功能等价,工具名不需修改。
7.2 Codex 的 UX 流程
根据 Codex issue #9926[1]:
底部输入区显示问题
↓
一行 Tab:每个问题一个 Tab + Submit Tab
↓
用户操作:
- 单选:选择后自动跳到下一个 Tab
- 多选:选择后按 Enter 跳到 Next
- 支持"Other"自定义输入
↓
Submit 后返回结构化答案7.3 结论
office-hours 模板中的 AskUserQuestion 可以直接在 Codex 环境使用,不需要修改。
九、~/.gstack/ 目录初始化
8.1 初始化命令
# 完整 setup(推荐)
~/.claude/skills/gstack/setup
~/.claude/skills/gstack/setup --host codex
# 最小初始化(仅 office-hours)
mkdir -p ~/.gstack/projects8.2 最小初始化原因
~/.gstack/projects/ 是 office-hours 第一阶段(列出设计文档)和第五阶段(写入设计文档) 必需的目录。
十、模板设计模式借鉴
9.1 核心设计原则
- 1. 问题后明确"推动直到听到什么" — 让执行者知道何时停止追问
- 2. "红旗"列表 — 新手也能识别常见错误
- 3. 逃生舱设计 — 防止结构变束缚,用户不耐烦时可跳过
- 4. 智能跳过逻辑 — 根据产品阶段路由问题
- 5. 阶段间嵌入"发现"步骤 — 打破信息孤岛
9.2 双轨制设计
| 创业模式 | 建造者模式 |
|---|---|
| 6个强制诊断问题 | 开放式头脑风暴 |
| 硬性、挑战性 | 热情、支持性 |
| "需求现实是什么?" | "最酷版本是什么?" |
| 推回直到具体 | 帮助找到兴奋点 |
十一、验证命令
# 检查 gstack-slug 在两个环境是否存在
ls ~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null && echo "Claude: OK" || echo "Claude: NOT_FOUND"
ls ~/.codex/skills/gstack/bin/gstack-slug 2>/dev/null && echo "Codex: OK" || echo "Codex: NOT_FOUND"
# 检查 gstack projects 目录
ls -la ~/.gstack/projects/ 2>/dev/null || echo "No projects dir"
# 重新生成 Codex 版 SKILL.md
bun run gen:skill-docs --host codex十二、关键文件索引
| 文件 | 说明 |
|---|---|
office-hours/SKILL.md.tmpl | office-hours 技能模板 |
scripts/gen-skill-docs.ts | 模板渲染脚本,负责 host 路径转换 |
setup | gstack 安装脚本 |
SKILL_TEMPLATE_LEARNING_GUIDE.zh-CN.md | 模板编写学习指南 |
CHANGELOG.md | 版本变更记录 |
引用链接
[1] Codex issue #9926: https://github.com/openai/codex/issues/9926
夜雨聆风