news 2026/9/29 8:28:59

Pi(gsd-2)自定义技术栈完全指南:Extensions、Skills、Prompt Templates 与 Themes 四层定制体系详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Pi(gsd-2)自定义技术栈完全指南:Extensions、Skills、Prompt Templates 与 Themes 四层定制体系详解
  • 人工智能
  • AI Agent
  • 代码智能体
  • Agent 编排
  • CLI
  • AI 应用

【免费下载链接】gsd-2

A powerful meta-prompting, context engineering and spec-driven development system that enables agents to work for long periods of time autonomously without losing track of the big picture

项目地址:https://gitcode.com/gh_mirrors/gs/gsd-2
点击查看免费下载

本篇指南系统讲解 gsd-2 项目中 Pi 代理的四层自定义机制——Extensions(扩展)、Skills(技能)、Prompt Templates(提示词模板)与 Themes(主题)。读完本文,你将掌握每层的适用场景、目录放置规则、调用方式与底层实现原理,能够根据实际需求为 Pi 组装出从"快速改文字提示"到"完全重写运行时行为"的任意自定义能力。

四层自定义栈总览

Pi 提供四层由浅入深的自定义机制,每层服务于不同的目的,从"改个颜色"到"完全接管运行时"逐级递增能力与复杂度:

┌─────────────────────────────────────┐ │ Extensions │ ← TypeScript 代码。完整运行时访问权限。 │ Custom tools, events, UI, │ 可以做任何事。 │ commands, providers │ ├─────────────────────────────────────┤ │ Skills │ ← Markdown 指令 + 脚本。 │ On-demand capability packages │ 任务匹配时才加载。 │ loaded by the agent │ ├─────────────────────────────────────┤ │ Prompt Templates │ ← Markdown 片段。 │ Reusable prompts expanded │ 通过 /name 快速文本展开。 │ via /templatename │ ├─────────────────────────────────────┤ │ Themes │ ← JSON 颜色定义。 │ Visual appearance │ 修改后热重载。 └─────────────────────────────────────┘

理解这四层的关键在于权衡"表达能力"与"使用成本":Extensions 是唯一的"程序级"定制,能够挂钩事件、注册工具、渲染 UI,几乎无所不能,但也要求开发者编写并维护 TypeScript 模块;Skills 面向"按需装载领域能力",是结构化、渐进式披露的指令包;Prompt Templates 只是简单的文本展开;Themes 则仅影响 TUI 视觉外观。下一层无法满足需求时,再向上一层升级。

一、Extensions:拥有完整运行时访问权的最高层定制

Extensions 是 TypeScript 模块,拥有完整的运行时访问权限。它们可以挂钩每一个事件、注册可供 LLM 调用的工具、添加命令、渲染自定义 UI、覆盖内置行为、注册模型提供者(model providers)。Extensions 是最强大的自定义机制。

放置位置

  • ~/.gsd/agent/extensions/(全局,所有项目可用)
  • .gsd/extensions/(项目级,仅当前项目生效)

入口文件解析规则

从源码 extension-discovery.ts 可以确认,扩展目录的入口解析遵循"manifest 优先、文件名回退"的确定性顺序:

  1. 若目录内存在带pi清单对象的package.json,则该清单具有权威性:pi.extensions数组中的每个条目按目录解析为入口文件;
  2. 若声明pi: {}(无 extensions),则返回空——这是库目录(如 cmux)的"退出机制";
  3. 仅当不存在pi清单时才回退到index.ts→index.js的自动探测。

顶层目录下的.ts/.js文件会被视为独立扩展入口;子目录则通过上述规则解析(见 discoverExtensionEntryPaths)。同时,已安装扩展若与内置扩展 manifest ID 相同,则以安装版为准(shadow 覆盖,见 mergeExtensionEntryPaths)。

Manifest 与启停机制

带清单的扩展在目录内放置extension-manifest.json,字段包括id、name、version、description、tier(core/bundled/community)、requires.platform,以及声明能力的provides(tools、commands、hooks、shortcuts)和dependencies。可参考仓库内示例 extensions/google-search/extension-manifest.json:

{ "id": "google-search", "name": "Google Search", "version": "1.0.0", "description": "Web search via Google with AI-synthesized answers and source citations", "tier": "bundled", "requires": { "platform": ">=2.29.0" }, "provides": { "tools": ["google_search"], "hooks": ["session_start"] } }

启停由 extension-registry.ts 维护:没有 manifest 的扩展总是加载(向后兼容);新安装的扩展默认全部启用;唯一让扩展停止加载的方式是显式执行gsd extensions disable <id>。核心扩展(tier: "core")不可禁用,尝试禁用会返回错误提示。

真实扩展示例:如何注册一个 Tool

仓库内的 Google Search 扩展(extensions/google-search/index.ts)展示了完整模式:导出一个接收ExtensionAPI的默认函数,在其中调用pi.registerTool({...})注册google_search工具,同时通过pi.on("session_start", ...)挂钩会话启动事件检查认证状态、pi.on("session_shutdown", ...)清理会话级缓存。工具定义中包含name、label、description、promptSnippet、promptGuidelines(LLM 使用指引)、基于 TypeBox 的parameters参数约束,以及execute执行逻辑和renderCall/renderResult的自定义 TUI 渲染。

export default function (pi: ExtensionAPI) { pi.registerTool({ name: "google_search", label: "Google Search", description: "Search the web using Google Search via Gemini. ...", parameters: Type.Object({ query: Type.String({ description: "The search query" }), maxSources: Type.Optional( Type.Number({ description: "Maximum number of source URLs (default 5, max 10).", minimum: 1, maximum: 10 }) ), }), async execute(_toolCallId, params, signal, _onUpdate, ctx) { // 调用 Gemini grounding、解析来源、会话内缓存…… }, }); }

从实现可见扩展能够访问ctx.modelRegistry、ctx.ui等上下文对象,具备完整的运行时能力。本仓库还内置了大量生产级扩展可供学习,例如src/resources/extensions/gsd/(GSD 编排系统本身就是一个巨型扩展)、ollama、mcp-client、context7、remote-questions等。完整的扩展开发文档见 docs/dev/extending-pi/ 与 docs/extension-sdk/。

二、Skills:按需加载的 Agent 能力包

Skills 是遵循 Agent Skills 标准(agentskills.io)的按需能力包。一个 skill 是包含SKILL.md文件的目录,其中写有 agent 要遵循的指令。Skills 是渐进式(progressive)的:只有技能名称和描述会进入系统提示词,agent 仅在任务匹配时才读取完整的SKILL.md。

工作流程

  1. 启动时,Pi 扫描技能目录并提取每个技能的 name + description;
  2. 这些描述被列在系统提示词中(即<available_skills>目录);
  3. 当任务与某个技能描述匹配时,agent 使用read工具加载完整的SKILL.md;
  4. agent 遵循其中指令,并使用相对路径引用脚本/资源。

源码 skill-discovery.ts 印证了 frontmatter 解析逻辑:SKILL.md以---\n开头,通过name:与description:键提取元数据;探测到的新技能会被格式化为<newly_discovered_skills>XML 块注入系统提示词,使后续任务立即可见(formatSkillsXml)。

调用方式

/skill:brave-search # 显式调用 /skill:pdf-tools extract file.pdf # 带参数调用

放置位置

  • ~/.agents/skills/(全局——跨所有 agent 共享)
  • .agents/skills/(项目级,向 git 根目录逐级向上搜索)

此外 skill-discovery.ts 还兼容~/.claude/skills/(Claude Code 官方技能目录),两个目录会被合并扫描。

标准目录结构

my-skill/ ├── SKILL.md # 必需:frontmatter + 指令 ├── scripts/ # 辅助脚本(可选) │ └── process.sh └── references/ # 参考文档(可选) └── api-guide.md

对于复杂技能,create-skill 技能 推荐的 Router 模式进一步扩展为五目录结构:

skill-name/ ├── SKILL.md # Router + 原则 ├── workflows/ # 分步流程(FOLLOW) ├── references/ # 领域知识(READ) ├── templates/ # 输出结构(COPY + FILL) └── scripts/ # 可复用代码(EXECUTE)

其核心设计约束包括:SKILL.md必须控制在 500 行以内(渐进式披露)、正文优先使用语义化 XML 标签(<objective>、<process>、<success_criteria>)而非 markdown 标题、YAML frontmatter 必备name(小写连字符命名,与目录一致)和description(说明做什么 + 何时使用)。仓库内置了大量真实技能作为参考,例如 src/resources/skills/tdd/SKILL.md、src/resources/skills/forensics/SKILL.md、src/resources/skills/create-gsd-extension/SKILL.md 等。

Skills 与 Extensions 的选择

Skills 的加载成本低(只有描述常驻系统提示词),适合承载"领域知识包";Extensions 则适合需要程序逻辑(工具、事件、UI)的能力。二者可以组合:例如 GSD 自己的 gsd-headless 技能 负责教会 agent 如何通过 headless CLI 编排项目,而编排的底层实现则由 gsd 扩展提供。

三、Prompt Templates:通过/name展开的可复用提示词

Prompt Templates 是 Markdown 文件,通过/名称展开为提示词。它是纯文本展开,支持位置参数($1、$2、$@),不涉及任何代码逻辑。

完整示例

以下文件放在~/.gsd/agent/prompts/review.md:

--- description: Review staged git changes --- Review the staged changes (`git diff --cached`). Focus on: - Bugs and logic errors - Security issues - Performance problems Focus area: $1

使用方式:输入/review "error handling"即展开为完整提示词,其中$1被替换为"error handling"。YAML frontmatter 中的description用于在命令列表中展示该模板的用途。

放置位置

  • ~/.gsd/agent/prompts/(全局)
  • .gsd/prompts/(项目级)

底层机制:模板变量替换与缓存快照

需要注意,Prompt Templates(/name展开)与 GSD 扩展内部的 prompt 引擎是两套体系。GSD 扩展使用的 prompt loader(prompt-loader.ts)揭示了模板系统的通用实现要点:

  • 模板文件从prompts/与templates/目录按.md后缀加载,文件名(去扩展名)作为模板名;
  • 占位符采用{{variableName}}语法进行替换;
  • 替换前会先校验:模板声明的所有{{变量}}都必须在提供的变量集中有值,否则抛出GSD_PARSE_ERROR——这能避免"内存中的扩展代码比磁盘上的模板旧、导致缺变量崩溃"的经典问题;
  • 模板在启动时被warmCache()快照进内存缓存(prompt-loader.ts),防止运行中的会话被并发覆盖的模板文件破坏,保证了加载速度与运行期一致性。

实战建议

Prompt Templates 适合沉淀高频、稳定、无逻辑的提示词片段,例如代码审查、PR 描述生成、问题复述模板。一旦模板需要条件分支、动态数据或与外部系统交互,就应该升级为 Skill(结构化指令)或 Extension(真正的代码)。

四、Themes:热重载的 TUI 颜色主题

Themes 是定义 TUI 调色板的 JSON 文件,支持热重载:编辑文件后 Pi 立即应用变更,无需重启。

内置主题

  • dark
  • light

放置位置

  • ~/.gsd/agent/themes/(全局)
  • .gsd/themes/(项目级)

主题色在扩展中的使用方式

主题对象通过回调参数传递给 UI 渲染代码(不要直接 import 主题模块)。TUI 主题文档 提供了完整的取色 API:

// 前景色 theme.fg("accent", "Highlighted text") theme.fg("success", "✓ Passed") theme.fg("error", "✗ Failed") theme.fg("warning", "⚠ Warning") theme.fg("muted", "Secondary text") theme.fg("dim", "Tertiary text") // 背景色 theme.bg("selectedBg", "Selected item") theme.bg("toolSuccessBg", "Success background") // 文本样式与组合 theme.bold("Bold text") theme.fg("accent", theme.bold("Bold and colored"))

前景色按语义分为若干类别,供主题 JSON 分别定义:

类别颜色键
通用text、accent、muted、dim
状态success、error、warning
边框border、borderAccent、borderMuted
消息userMessageText、customMessageText、customMessageLabel
工具toolTitle、toolOutput
DifftoolDiffAdded、toolDiffRemoved、toolDiffContext
MarkdownmdHeading、mdLink、mdCode、mdQuote、mdHr、mdListBullet等
语法高亮syntaxComment、syntaxKeyword、syntaxString、syntaxNumber、syntaxType、syntaxOperator等
思考过程thinkingOff、thinkingMinimal、thinkingLow、thinkingMedium、thinkingHigh、thinkingXhigh
模式bashMode

背景色包括selectedBg、userMessageBg、customMessageBg、toolPendingBg、toolSuccessBg、toolErrorBg。此外主题还支持通过highlightCode(code, language, theme)做语法高亮渲染(可用getLanguageFromPath根据文件路径自动推断语言)。可参考 google-search 扩展的 renderCall / renderResult 中主题的实战用法。

总结:如何选择正确的定制层

层级技术形态能力范围何时使用
Prompt TemplatesMarkdown +/name参数展开纯文本提示词需要可复用的静态提示词片段
SkillsSKILL.md+ 脚本/参考文档按需加载的领域指令需要结构化、渐进披露的能力包,且任务驱动触发
ExtensionsTypeScript 模块(manifest)工具、事件、UI、命令、提供者、覆盖内置行为需要真实程序逻辑或运行时访问
ThemesJSON 颜色定义TUI 视觉外观只想调整界面配色,热重载即时生效

四层机制可叠加使用:例如以 Themes 美化外观、以 Prompt Templates 沉淀常用提示、以 Skills 注入领域知识、以 Extensions 提供底层工具与 UI 组件。这一分层设计的核心理念是**"用最简单的手段解决问题"**——把文本问题留在文本层,把代码问题交给代码层,从而在保证灵活性的同时控制复杂度。各层的更多细节可继续查阅 Pi 扩展完整指南、Pi 官方文档索引 以及 TUI 主题与样式文档。

  • 人工智能
  • AI Agent
  • 代码智能体
  • Agent 编排
  • CLI
  • AI 应用

【免费下载链接】gsd-2

A powerful meta-prompting, context engineering and spec-driven development system that enables agents to work for long periods of time autonomously without losing track of the big picture

项目地址:https://gitcode.com/gh_mirrors/gs/gsd-2
点击查看免费下载

相关推荐

上一篇:Python百度搜索API终极指南:免费无限制的搜索引擎集成方案
下一篇:Python百度搜索API终极指南:免费无限制的搜索引擎集成方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 8:28:48

MCP 工具扩展实践指南:用 TaoToken 统一 Key 构建智能 AI 工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/29 8:27:48

TaoToken 实战:vscode、cursor 无密码 ssh 远程连接服务器(配置密钥)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华