乐于分享
好东西不私藏

Gstack:Office-Hours skill 技能与Codex环境分析

Gstack:Office-Hours skill 技能与Codex环境分析

一、问题起源

  1. 1. office-hours是什么,有什么作用
  2. 2. office-hours 模板写了什么?
  3. 3. 它依赖哪些 Claude Code 特有的路径?
  4. 4. gstack 如何实现双环境兼容?
  5. 5. 关键工具 AskUserQuestion 在 Codex 中如何工作?

二、office-hours 是什么,有什么作用

office-hours 是 gstack 中用于产品讨论和方案梳理的一种对话型技能,灵感来自 YC Office Hours。它不是直接写代码的执行器,而是一个带有明确提问路径的"高强度产品审视流程":先收集背景,再追问目标、用户、需求现实、替代方案和设计方向,最后输出成结构化设计文档。

它的核心作用主要有四个:

  1. 1. 把模糊想法压缩成清晰问题:帮助用户把"我想做个东西"转成可讨论的目标、场景和约束。
  2. 2. 识别伪需求和空泛假设:通过强制追问,暴露"谁会用、为什么现在会用、现有替代方案是什么"这些关键问题。
  3. 3. 为后续技能提供输入:输出的设计文档可以继续交给 plan-ceo-reviewplan-eng-reviewdesign-review 或直接进入实现阶段。
  4. 4. 在不同目标下切换讨论风格:如果用户是在创业,会偏诊断和挑战;如果是在做 hackathon、开源或学习项目,会偏探索和头脑风暴。

从定位上看,office-hours 更像"开始做事前的产品与方案澄清器"。它解决的不是"怎么编码",而是"这件事到底值不值得做、该怎么定义、下一步应该产出什么"。


三、office-hours 模板的分层结构

YC 办公时间技能模板,用于在讨论产品想法时进行"诊断式"对话。

第一阶段:背景收集
    ↓
第二阶段 A:创业模式(6个强制问题)
         或
第二阶段 B:建造者模式(头脑风暴问题)
    ↓
第二阶段 2.5:相关设计发现
第二阶段 2.75:景观认知
    ↓
第三阶段:前提挑战
    ↓
第四阶段:替代方案生成
    ↓
第五阶段:设计文档输出

2.1 占位符

       
                                           
占位符作用
{{PREAMBLE}}预置的引导语/介绍内容
{{BROWSE_SETUP}}浏览/导航功能的设置指令
       
     

四、第一阶段:背景收集

这是每次 office-hours 会话的开始阶段,做 6 件事:

       
                                           
步骤命令/操作说明
1source <(~/.claude/skills/gstack/bin/gstack-slug 2>/dev/null)加载项目 slug
2阅读 CLAUDE.mdTODOS.md了解项目背景
3git log --oneline -30 + git diff origin/main --stat了解最近动态
4Grep/Glob 映射相关代码区域找到与用户请求相关的代码
5ls -t ~/.gstack/projects/$SLUG/*-design-*.md列出已有设计文档
6AskUserQuestion 询问用户目标决定进入哪个模式
       
     

3.1 模式路由

       
                                           
用户选择进入模式
创办创业公司、内部创业创业模式(第二阶段 A)
黑客马拉松、开源、研究、学习、娱乐建造者模式(第二阶段 B)
       
     

五、Claude Code vs Codex:路径差异

office-hours 模板中的路径引用了两类目录:

4.1 gstack 技能目录(受 host 影响)

       
                                           
方面Claude CodeCodex
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-toolshooksversion

七、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 CodeCodex
AskUserQuestionask_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/projects

8.2 最小初始化原因

~/.gstack/projects/ 是 office-hours 第一阶段(列出设计文档)和第五阶段(写入设计文档) 必需的目录。


十、模板设计模式借鉴

9.1 核心设计原则

  1. 1. 问题后明确"推动直到听到什么" — 让执行者知道何时停止追问
  2. 2. "红旗"列表 — 新手也能识别常见错误
  3. 3. 逃生舱设计 — 防止结构变束缚,用户不耐烦时可跳过
  4. 4. 智能跳过逻辑 — 根据产品阶段路由问题
  5. 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.tmploffice-hours 技能模板
scripts/gen-skill-docs.ts模板渲染脚本,负责 host 路径转换
setupgstack 安装脚本
SKILL_TEMPLATE_LEARNING_GUIDE.zh-CN.md模板编写学习指南
CHANGELOG.md版本变更记录
       
     

引用链接

[1] Codex issue #9926: https://github.com/openai/codex/issues/9926