
GSD 集成配置实战用/gsd:config --integrations管理搜索 API Key、代码评审 CLI 路由与 Agent Skill 注入【免费下载链接】get-shit-doneA light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-doneGSDget-shit-done的集成配置工作流 settings-integrations.md 解决了三类连接层配置问题搜索服务 API KeyBrave / Firecrawl / Exa、代码评审工具 CLI 路由review.models.cli以及 Agent 技能注入agent_skills.agent-type。本文以此工作流为骨架结合 GSD 的命令路由、SDK 配置写入实现与自动化测试完整讲解这三块配置域的操作流程、明文密钥的屏蔽约定、配置键的合法性校验机制以及底层写入原理读完你可以独立完成 GSD 项目的第三方集成配置并理解为什么config-set永远不会破坏无关配置键。为什么需要独立的集成配置入口GSD 的配置面被刻意拆成三层互不混叠入口职责工作流/gsd:config无参数工作流开关与模型档案research / plan_check / verifier / model_profile 等 23 项settings.md/gsd:config --advanced高阶调优旋钮plan 弹回、超时、分支模板、跨 AI 执行settings-advanced工作流/gsd:config --integrations第三方 API Key、评审 CLI 路由、Agent Skill 注入settings-integrations.md从工作流文档的purpose可以读出设计动机API Key 与跨工具路由属于连通性connectivity问题既不是工作流开关也不是调优旋钮因此必须与/gsd:settings及 advanced 调优面分离。命令入口统一收拢在 commands/gsd/config.md 中--integrations标志会路由到本工作流--integrations | API keys (Brave/Firecrawl/Exa), review CLI routing, agent skills | settings-integrations集成配置的所有读写都经由gsd-sdk query命令完成最终落盘到.planning/config.json并且只改自己管辖的键、绝不碰无关键是工作流的硬性成功标准之一详见文末。密钥的落盘位置与安全模型API Key 是明文存储在.planning/config.json里的——这是工作流明确声明的磁盘安全边界明文密钥只存在于这一个文件文件权限即是防线。UI 在任何情况下都不得展示、回显或记录明文值。围绕这一点工作流规定了三条铁律屏蔽约定****last-4例如sk-abc123def456展示为****f456。长度小于 8 字符的字符串只显示****、不带尾部避免短密钥泄露过多有效字节未设置的值显示(unset)。明文永不回显AskUserQuestion的描述、确认表格、日志行里都不允许出现明文明文不会写入.planning/下除config.json之外的任何文件。config-set输出对密钥集合自动打码brave_search、firecrawl、exa_search三个键命中秘密键集合见 secrets.cjs其实现由sdk/src/query/secrets.ts生成导出SECRET_CONFIG_KEYS、isSecretKey、maskSecret、maskIfSecret。这套约定不只是文档层面的倡议自动化测试对其做了逐条验证config-set与config-get的输出必须包含掩码****last-4、绝不包含明文哨兵串见下文测试保障小节。第一步确保配置存在并解析配置路径工作流的第一步ensure_and_load_config负责两件事确保配置节存在、解析出当前生效的配置文件路径。关键点在于路径解析必须区分平铺模式与workstream 模式issue #2282gsd-sdk query config-ensure-section if [[ -z ${GSD_CONFIG_PATH:-} ]]; then if [[ -f .planning/active-workstream ]]; then WS$(tr -d \n\r .planning/active-workstream) GSD_CONFIG_PATH.planning/workstreams/${WS}/config.json else GSD_CONFIG_PATH.planning/config.json fi fi存在.planning/active-workstream文件时说明项目启用了 workstream 隔离配置落在.planning/workstreams/slug/config.json否则使用默认的.planning/config.json。工作流明确要求后续所有读写都必须使用$GSD_CONFIG_PATH禁止硬编码.planning/config.json否则 workstream 安装场景下会写错文件。这一步在 config-mutation.ts 中由configEnsureSection处理器实现——它是幂等的节不存在则创建为空对象已存在则原样保留。读取当前配置并计算脱敏视图读取阶段用config-get拉取四个搜索相关字段全部给出默认值兜底BRAVE$(gsd-sdk query config-get brave_search --default null) FIRECRAWL$(gsd-sdk query config-get firecrawl --default null) EXA$(gsd-sdk query config-get exa_search --default null) SEARCH_GITIGNORED$(gsd-sdk query config-get search_gitignored --default false)随后为每个集成字段计算展示形态三者取一(unset)—— 字段为 null / 缺失****last-4—— 已填充的秘密字段明文永不展示value—— 非秘密的路由 / 技能字符串原样展示。注意search_gitignored不是密钥属于普通布尔开关按普通值展示。三大配置域之一搜索集成Search Integrations交互面板工作流用AskUserQuestion逐项询问三个搜索服务并附带一个 gitignored 搜索开关AskUserQuestion([ { question: Brave Search API key — used for web research during plan/discuss phases, header: Brave, multiSelect: false, options: [ // When already set: { label: Leave (**** already set), description: Keep current value }, { label: Replace, description: Enter a new API key }, { label: Clear, description: Remove the stored key } // When unset: // { label: Skip, description: Leave unset }, // { label: Set, description: Enter an API key } ] }, { question: Firecrawl API key — used for deep-crawl scraping, header: Firecrawl, multiSelect: false, options: [ /* same Leave/Replace/Clear or Skip/Set */ ] }, { question: Exa Search API key — used for semantic search, header: Exa, multiSelect: false, options: [ /* same Leave/Replace/Clear or Skip/Set */ ] }, { question: Include gitignored files in local code searches?, header: Gitignored, multiSelect: false, options: [ { label: No (Recommended), description: Respect .gitignore. Safer — excludes secrets, node_modules, build artifacts. }, { label: Yes, description: Include gitignored files. Useful when secrets/artifacts genuinely contain searchable intent. } ] } ])三个服务在 GSD 中的用途各有分工Brave 用于 plan / discuss 阶段的网页研究Firecrawl 用于深度爬取抓取Exa 用于语义搜索。已设置的键给出Leave / Replace / Clear三选未设置的键给出Skip / Set二选。写入命令用户选择 Set 或 Replace 后工作流会跟随一个文本输入提示收集密钥值该答案不得在任何后续问题描述或确认文本中回显随后写入gsd-sdk query config-set brave_search value # masked in output gsd-sdk query config-set firecrawl value # masked in output gsd-sdk query config-set exa_search value # masked in output gsd-sdk query config-set search_gitignored true|false选择 Clear 时写入nullgsd-sdk query config-set brave_search nullsearch_gitignored的语义对应 planning-config.md 中的planning.search_gitignored与顶层search_gitignored默认false时搜索遵循.gitignore设为true后广泛的rg搜索会追加--no-ignore以把被忽略文件纳入匹配范围。工作流推荐保持默认No以排除 secrets、node_modules、构建产物等噪音。三大配置域之二代码评审 CLI 路由review.modelsreview.models.cli是一张映射表告诉代码评审工作流对于某一种评审口味reviewer flavor应该调用哪条 shell 命令。GSD 内置支持四个 CLI 口味claude、codex、gemini、opencode。AskUserQuestion([ { question: Which reviewer CLI do you want to configure?, header: CLI, multiSelect: false, options: [ { label: Claude, description: review.models.claude — defaults to session model when unset }, { label: Codex, description: review.models.codex — e.g. codex exec --model gpt-5 }, { label: Gemini, description: review.models.gemini — e.g. gemini -m gemini-2.5-pro }, { label: OpenCode, description: review.models.opencode — e.g. opencode run --model claude-sonnet-4 }, { label: Done, description: Skip — finish this section } ] } ])选中某个 CLI 后展示当前值或(unset)再次提供 Leave / Replace / Clear并跟随文本输入收集新的命令串写入方式gsd-sdk query config-set review.models.cli command string循环直到用户选择 Done。几个口味各有默认语义claude未设置时回落到会话模型codex的典型值形如codex exec --model gpt-5gemini形如gemini -m gemini-2.5-proopencode形如opencode run --model claude-sonnet-4。动态键校验review.models.cli属于动态配置键静态键白名单无法穷举所有 CLI 口味因此由动态模式^review\.models\.[a-zA-Z0-9_-]$兜底。config-set在写入前就会拒绝空 CLI slug 与含路径分隔符的 slug例如review.models.、review.models、review.models.claude/../../x均非法。三大配置域之三Agent Skill 注入agent_skillsagent_skills.agent-type用于向指定类型的 Agent 注入额外技能名——这些技能会写进 Agent 生成时的 frontmatter。slug 是用户可扩展的因此输入为自由文本但必须通过^[a-zA-Z0-9_-]$校验含路径分隔符、空格或 shell 元字符的输入一律拒绝。AskUserQuestion([ { question: Configure agent_skills for which agent type?, header: Agent Type, multiSelect: false, options: [ { label: gsd-executor, description: Skills injected when spawning executor agents }, { label: gsd-planner, description: Skills injected when spawning planner agents }, { label: gsd-verifier, description: Skills injected when spawning verifier agents }, { label: Custom…, description: Enter a custom agent-type slug }, { label: Done, description: Skip — finish this section } ] } ])内置选项覆盖三个核心 Agentgsd-executor执行器、gsd-planner规划器、gsd-verifier验证器。选择 Custom… 时提示输入自定义 slug校验失败则打印如下拒绝信息并重新询问Rejected: agent-type slug must match [a-zA-Z0-9_-] (no path separators, spaces, or shell metacharacters).选定 slug 后提示输入逗号分隔的技能列表文本输入展示当前值如有提供 Leave / Replace / Clear写入方式gsd-sdk query config-set agent_skills.slug skill-a,skill-b,skill-c循环直到 Done。这一输入面之所以严格校验是为了封堵技能注入攻击skill-injection attacks——防止恶意 slug 携带路径穿越如agent_skills.../etc/passwd、空格或 shell 元字符混入 Agent 生成流程。底层原理config-set 的校验、类型转换与原子写入集成配置的每一次写入最终都落到 config-mutation.ts 的configSet处理器。整个链路值得拆开看1. 键合法性校验isValidConfigKey静态键命中VALID_CONFIG_KEYS白名单动态键则逐个匹配DYNAMIC_KEY_PATTERNS。这两个集合的单一事实来源是 config-schema.manifest.json由 configuration/index.ts 读取后经 config-schema.ts 再导出。manifest 中可以看到agent_skills的动态模式^agent_skills\.[a-zA-Z0-9_-]$review.models.cli-name动态模式。校验失败时抛GSDErrorValidation 分类并基于最长公共前缀给出拼写建议未命中任何键时报Unknown config key。2. 值类型转换parseConfigValueconfig-set收到的永远是 CLI 字符串写入前统一做原生类型转换true→true、false→false、纯数字 →Number、以[或{开头的字符串尝试JSON.parse失败则保留为字符串。这就是为什么config-set search_gitignored true落盘后是布尔值true而非字符串true。测试对search_gitignored的断言也兼容了布尔与字符串两种形态。3. 秘密键输出打码maskIfSecret写入成功后返回给调用方的value与previousValue都要经过maskIfSecret(keyPath, value)处理——磁盘上的值是明文只有响应体被打码对应 issue #2997防止config-set把明文凭据回显进机器可读输出。4. 锁保护 原子写入写入前通过acquireStateLock获取状态锁防止并发读改写竞争写入时先写临时文件再rename原子替换失败则清理临时文件、回退为直接写。这套机制保证配置写入要么完整、要么不落盘不会出现半截 JSON。合并安全config-set 永不覆盖无关键工作流声明的最后一条成功标准是配置合并保留本工作流管辖的三个区块之外的所有键。这由config-set的单点路径写入语义天然保证setConfigValue沿点分路径逐级建对象只改目标叶节点其余键原样保留。测试 settings-integrations.test.cjs 用两个场景锁死了这条契约先config-set workflow.research false再config-set brave_search ...断言workflow.research仍为false先config-set review.models.codex ...再config-set agent_skills.gsd-planner ...断言review.models.codex未被触碰。确认表格与快速命令全部三节配置完成后工作流输出脱敏确认表格——任何情况下都不允许出现明文 API Key━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ GSD ► INTEGRATIONS UPDATED ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Search Integrations | Field | Value | |--------------------|-------------------| | brave_search | ****last-4 | (or (unset)) | firecrawl | ****last-4 | | exa_search | ****last-4 | | search_gitignored | true | false | Code Review CLI Routing | CLI | Command | |-------------|--------------------------------------| | claude | value or (session model default) | | codex | value or (unset) | | gemini | value or (unset) | | opencode | value or (unset) | Agent Skills Injection | Agent Type | Skills | |------------------|---------------------------| | slug | skill-a, skill-b | | ... | ... | Notes: - API keys are stored plaintext in .planning/config.json. The confirmation table above never displays plaintext — keys appear as ****last-4. - Plaintext is not echoed back by this workflow, not written to any log, and not displayed in error messages. Quick commands: - /gsd:settings — workflow toggles and model profile - /gsd-set-profile profile — switch model profile表格下方的快速命令提示当前已演进为/gsd:config --integrations的入口形态——在 settings.md 的确认输出中同样会指引用户使用/gsd:config --integrations配置 API Key、评审 CLI 路由与技能注入并区分/gsd:config --profile name切换模型档案与/gsd:config --advanced高阶调优。文本模式与非 Claude 运行时工作流原生依赖AskUserQuestion这是 Claude Code 的交互原语。当配置workflow.text_mode: true或传入--text标志时工作流设置TEXT_MODEtrue把每一次AskUserQuestion替换为纯文本编号列表用户直接键入选项数字即可——这是非 Claude 运行时OpenAI Codex、Gemini CLI 等的必需适配路径。测试保障把安全与校验契约固化成回归settings-integrations.test.cjsissue #2529把本文讲述的几乎每一条约定都变成了可执行断言是阅读本工作流的最佳配套材料工件存在性commands/gsd/config.md存在且声明name: gsd:config--integrations正确路由到本工作流issue #2790 后由config.mdsettings-integrations.md构成规范命令面内容完整性工作流必须引用四个搜索字段brave_search/firecrawl/exa_search/search_gitignored、四个评审 CLIclaude/codex/gemini/opencode、agent_skills.agent-type注入概念屏蔽约定工作流必须描述****掩码模式、显式禁止回显明文、包含 Leave / Replace / Clear 流程配置往返四个搜索键、review.models.codex、agent_skills.gsd-executor都能被config-set真实写进.planning/config.json并读回负向场景agent_skills.../etc/passwd、agent_skills./evil、含空格的 slug、$(whoami)等一律被校验器拒绝config-set对路径穿越 slug 直接失败review.models.空、review.models缺 CLI、含路径分隔符的条目均非法明文遏制security containment写入哨兵密钥后递归扫描整个.planning/目录明文只允许出现在config.json一个文件里config-set/config-get的 stdout 与 stderr 合流输出中不得出现明文但必须包含****last-4形态的掩码。这套测试从文档契约、写入往返、键校验、合并安全、明文遏制五个维度把集成配置工作流锁死任何一处回归比如误把明文写进日志、或放宽 slug 校验都会立刻被红灯捕获。小结GSD 的集成配置面以 settings-integrations.md 为操作指南、以 config.md 的--integrations为命令入口、以gsd-sdk query config-set为写入通道搜索 API Key 与search_gitignored解决研究/检索连通性review.models.cli解决评审工具连通性agent_skills.agent-type解决Agent 能力注入。三者共享同一套安全与健壮性底座——明文只落.planning/config.json一处、展示一律****last-4、动态键严格匹配^[a-zA-Z0-9_-]$、单点路径写入永不波及无关配置。理解了这套设计你既能在交互中安全地配置第三方集成也能在排查问题时精准定位配置写入链路与校验边界。【免费下载链接】get-shit-doneA light-weight and powerful meta-prompting, context engineering and spec-driven development system for Claude Code by TÂCHES.项目地址: https://gitcode.com/GitHub_Trending/getshi/get-shit-done创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考