@guru-ai-product/ai-product-kit 0.2.251117162107 → 0.2.251117163427

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -55,7 +55,7 @@ Use these MCP tools to load a Skill by name. The server maps known Skill names t
55
55
 
56
56
  <skill>
57
57
  <name>skill-creation</name>
58
- <description>Standards and methods for creating Agent Skills that extend Claude's capabilities. Use when creating or updating Skills, rules, or documentation that should follow Skill structure.</description>
58
+ <description>Standards and practices for creating new Agent Skills that extend Claude with reusable workflows, documentation, and tooling assets.</description>
59
59
  <tool>product_kit_skill</tool>
60
60
  <arguments>{"skill_name": "aipk_skill_generate"}</arguments>
61
61
  </skill>
package/mcp/src/server.js CHANGED
@@ -33,7 +33,7 @@ const SKILL_DESCRIPTIONS = {
33
33
  "aipk_development": "Development phase index pointing to the single authoritative implementation plan template.",
34
34
  "aipk_operations": "Canonical entry point for every post-release operating guide; maps scenarios to the available Skills and explains how to invoke them.",
35
35
  "aipk_requirements": "Central repository for requirement discovery, documentation, review, and change management assets.",
36
- "aipk_skill_generate": "Standards and methods for creating Agent Skills that extend Claude's capabilities. Use when creating or updating Skills, rules, or documentation that should follow Skill structure.",
36
+ "aipk_skill_generate": "Standards and practices for creating new Agent Skills that extend Claude with reusable workflows, documentation, and tooling assets.",
37
37
  "aipk_tool_prompts": "Catalog of reusable prompts for AI tooling workflows, including their usage guidance and file locations.",
38
38
  "aipk_init_project": "Initialize the project Agents playbook, sync the skills inventory into AGENTS.md/templates, and verify the workspace includes a complete AGENTS.md file.",};
39
39
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guru-ai-product/ai-product-kit",
3
- "version": "0.2.251117162107",
3
+ "version": "0.2.251117163427",
4
4
  "description": "Sync the AI Product Kit Skill bundle through npx without cloning the repository.",
5
5
  "bin": {
6
6
  "ai-product-kit": "bin/setup.js",
@@ -1,6 +1,6 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |
@@ -1,6 +1,6 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |
@@ -1,10 +1,10 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |
7
7
  | `scripts/check_agents.sh` | 2025-11-13T09:03:47.702Z |
8
8
  | `skill.ini` | 2025-11-13T09:47:02.793Z |
9
9
  | `SKILL.md` | 2025-11-13T10:06:33.764Z |
10
- | `template/AGENTS_TEMPLATE.md` | 2025-11-17T08:21:07.865Z |
10
+ | `template/AGENTS_TEMPLATE.md` | 2025-11-17T08:34:27.435Z |
@@ -1,6 +1,6 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |
@@ -1,6 +1,6 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |
@@ -1,8 +1,10 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |
7
7
  | `agent_skills_spec.md` | 2025-11-12T10:41:15.869Z |
8
- | `SKILL.md` | 2025-11-12T10:41:15.868Z |
8
+ | `scripts/init_skill.js` | 2025-11-17T08:26:29.962Z |
9
+ | `scripts/package_skill.js` | 2025-11-17T08:26:40.891Z |
10
+ | `SKILL.md` | 2025-11-17T08:26:11.887Z |
@@ -1,259 +1,66 @@
1
1
  ---
2
2
  name: skill-creation
3
- description: Standards and methods for creating Agent Skills that extend Claude's capabilities. Use when creating or updating Skills, rules, or documentation that should follow Skill structure.
3
+ description: Standards and practices for creating new Agent Skills that extend Claude with reusable workflows, documentation, and tooling assets.
4
+ license: Complete terms in LICENSE.txt
4
5
  ---
5
6
 
6
- # Skill 创建方法
7
+ # Skill Creation Playbook
7
8
 
8
- ## 1. 技能定位
9
+ This skill captures the expectations, templates, and workflows used across AI Product Kit to author reusable Skills. Treat it as the canonical reference when you need to convert a document into a Skill, add a new workflow, or refresh existing guidance.
9
10
 
10
- - **适用场景**:创建新的 Agent Skills、将现有文档转换为 Skill 格式、更新项目规则文档
11
- - **目标人群**:文档撰写者、项目管理者、规则维护者
12
- - **价值主张**:提供标准化的 Skill 创建规范,确保所有规则和文档遵循统一的 Skill 结构,实现模块化和可重用性
11
+ ## 1. Why Skills Matter
13
12
 
14
- ## 2. 快速上手
13
+ - **Modular knowledge** – Skills bundle procedures, references, and optional code so Claude can load the precise context it needs.
14
+ - **Stable triggers** – YAML frontmatter metadata (name + description) defines when Claude will pick the Skill, so be deliberate with wording.
15
+ - **Repeatable automation** – Scripts and templates included with a Skill run deterministically, often without loading their contents into the context window.
15
16
 
16
- 1. 创建 Skill 目录,目录名与 Skill 名称一致(小写字母、数字和连字符)
17
- 2. 在目录中创建 `SKILL.md` 文件
18
- 3. 添加 YAML frontmatter,包含 `name` 和 `description` 字段
19
- 4. 按照标准章节结构编写 Markdown 内容
20
- 5. 可选:添加额外的资源文件(模板、脚本、参考文档等)
17
+ ## 2. Anatomy of a Skill
21
18
 
22
- ## 3. Skill 结构规范
23
-
24
- ### 3.1 必需的文件结构
25
-
26
- 每个 Skill 必须包含一个 `SKILL.md` 文件,作为 Skill 的入口点:
19
+ Every Skill follows this basic layout:
27
20
 
28
21
  ```
29
22
  my-skill/
30
- - SKILL.md
31
- ```
32
-
33
- 更复杂的 Skill 可以添加额外的目录和文件:
34
-
35
- ```
36
- my-skill/
37
- ├── SKILL.md (主入口文件)
38
- ├── template/
39
- │ └── example.md (模板文件)
40
- ├── examples/
41
- │ └── usage.md (使用示例)
42
- └── scripts/
43
- └── helper.py (辅助脚本)
44
- ```
45
-
46
- ### 3.2 SKILL.md 文件格式
47
-
48
- #### YAML Frontmatter(必需)
49
-
50
- ```yaml
51
- ---
52
- name: your-skill-name
53
- description: 简洁描述技能覆盖的场景、可交付物以及使用时机。
54
- license: 可选,若需声明许可或合规信息则填写
55
- metadata:
56
- owner: 团队或负责人
57
- version: v1.0.0
58
- ---
59
- ```
60
-
61
- **必需字段**:
62
-
63
- - `name`:
64
- - Skill 名称,使用连字符命名(hyphen-case)
65
- - 仅包含小写字母、数字和连字符
66
- - 最大 64 个字符
67
- - 不能包含 XML 标签
68
- - 不能包含保留词:"anthropic", "claude"
69
- - 必须与包含 SKILL.md 的目录名称匹配
70
-
71
- - `description`:
72
- - 简要描述 Skill 的功能和使用时机
73
- - 必须非空
74
- - 最大 1024 个字符
75
- - 不能包含 XML 标签
76
- - 应说明 Skill 做什么以及何时使用
77
-
78
- **可选字段**:
79
-
80
- - `license`:许可信息(简短形式或指向许可文件的名称)
81
- - `allowed-tools`:预批准运行的工具列表(目前仅在 Claude Code 中支持)
82
- - `metadata`:键值对映射,用于存储客户端自定义属性
83
-
84
- #### Markdown 正文
85
-
86
- Markdown 正文部分没有格式限制,但建议遵循项目的文档撰写标准(参见 [`../../docs/guide_writing_standard/SKILL.md`](../../docs/guide_writing_standard/SKILL.md))。
87
-
88
- **推荐章节结构**:
89
-
90
- ```markdown
91
- # 技能主标题
92
-
93
- ## 1. 技能定位
94
- - **适用场景**:列出该技能最核心的使用场景
95
- - **目标人群**:说明主要使用角色
96
- - **价值主张**:突出该技能解决的痛点或提供的能力
97
-
98
- ## 2. 快速上手
99
- 1. 步骤一…
100
- 2. 步骤二…
101
- 3. 步骤三…
102
-
103
- ## 3. 标准流程
104
- | 阶段 | 说明 | 交付物 |
105
- | ---- | ---- | ------ |
106
- | 规划 | … | … |
107
- | 执行 | … | … |
108
- | 检查 | … | … |
109
-
110
- ## 4. AI 协作要点
111
- - 使用的模型或工具
112
- - 推荐的 Prompt
113
- - 自动化检查或输出格式要求
114
-
115
- ## 5. 附加资源
116
- - [模板链接](./template/示例模板.md)
117
- - [最佳实践](./examples/XXX.md)
118
- - [常见问题](./references/FAQ.md)
23
+ ├── SKILL.md (required entrypoint with YAML frontmatter + Markdown guidance)
24
+ ├── template/ (optional templates, forms, or content snippets)
25
+ ├── scripts/ (optional executable helpers; prefer Node.js if you add new scripts here)
26
+ ├── references/ (optional supporting docs)
27
+ └── assets/ (optional files used by Skill outputs)
119
28
  ```
120
29
 
121
- ## 4. Skill 工作原理
122
-
123
- ### 4.1 三级加载机制
124
-
125
- Skills 采用渐进式加载(progressive disclosure),内容在三个层级加载:
126
-
127
- **Level 1: 元数据(始终加载)**
128
-
129
- - 内容类型:指令
130
- - 加载时机:启动时
131
- - Token 成本:约 100 tokens 每个 Skill
132
- - 内容:YAML frontmatter 中的 `name` 和 `description`
133
-
134
- **Level 2: 指令(触发时加载)**
135
-
136
- - 内容类型:指令
137
- - 加载时机:Skill 被触发时
138
- - Token 成本:通常低于 5k tokens
139
- - 内容:SKILL.md 的主体内容,包含工作流程、最佳实践和指导
140
-
141
- **Level 3: 资源和代码(按需加载)**
142
-
143
- - 内容类型:指令、代码和资源
144
- - 加载时机:需要时
145
- - Token 成本:有效无限制(通过 bash 执行,不加载到上下文)
146
- - 内容:其他 Markdown 文件、可执行脚本、参考材料
147
-
148
- ### 4.2 文件系统架构
149
-
150
- Skills 运行在代码执行环境中,Claude 具有文件系统访问、bash 命令和代码执行能力。Skills 作为目录存在于虚拟机上,Claude 使用 bash 命令与之交互。
151
-
152
- **优势**:
153
-
154
- - **按需文件访问**:Claude 只读取任务需要的文件
155
- - **高效的脚本执行**:脚本代码不加载到上下文窗口,只输出消耗 tokens
156
- - **无实际限制的捆绑内容**:未使用的文件不消耗上下文
157
-
158
- ## 5. 创建 Skill 的最佳实践
159
-
160
- ### 5.1 命名规范
161
-
162
- - 使用小写字母、数字和连字符
163
- - 名称应简洁且描述性强
164
- - 避免使用保留词
165
-
166
- ### 5.2 描述编写
167
-
168
- 描述应清晰说明:
169
-
170
- - Skill 的功能
171
- - 使用场景
172
- - 何时应该触发该 Skill
173
-
174
- 示例:
175
-
176
- ```yaml
177
- description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.
178
- ```
179
-
180
- ### 5.3 内容组织
181
-
182
- - **主文件(SKILL.md)**:包含核心指导和快速上手
183
- - **附加文件**:将详细参考、模板、示例放在单独文件中
184
- - **脚本**:将可执行代码放在 scripts/ 目录下
185
-
186
- ### 5.4 安全性考虑
187
-
188
- - 仅使用可信来源的 Skills
189
- - 审计所有捆绑的文件(SKILL.md、脚本、图像、其他资源)
190
- - 注意外部数据源的风险
191
- - 谨慎使用来自未知或不可信来源的 Skills
192
-
193
- ## 6. 示例参考
194
-
195
- ### 6.1 最小示例
196
-
197
- ```
198
- minimal-skill/
199
- - SKILL.md
200
- ```
201
-
202
- ```markdown
203
- ---
204
- name: minimal-skill
205
- description: A minimal example Skill demonstrating basic structure.
206
- ---
207
-
208
- # Minimal Skill
209
-
210
- ## Quick start
211
-
212
- This is a minimal Skill example.
213
- ```
214
-
215
- ### 6.2 完整示例
216
-
217
- 参考项目中的现有 Skills:
218
-
219
- - [`../../docs/guide_writing_standard/SKILL.md`](../../docs/guide_writing_standard/SKILL.md) - 文档撰写标准
220
- - [`../requirements/SKILL.md`](../requirements/SKILL.md) - 需求阶段资料库
221
- - [`../tool_prompts/SKILL.md`](../tool_prompts/SKILL.md) - 工具 Prompt 文档规范
222
-
223
- ## 7. 工具和环境支持
224
-
225
- ### 7.1 Claude Code
226
-
227
- - 支持自定义 Skills
228
- - Skills 作为目录结构存在于文件系统中
229
- - Claude 自动发现和使用它们
30
+ ### SKILL.md expectations
230
31
 
231
- ### 7.2 Claude API
32
+ 1. Start with YAML frontmatter containing `name` and `description`.
33
+ 2. Use hyphen-case, lowercase names that match the folder name.
34
+ 3. Keep `description` factual—explain what the Skill does and when to use it.
35
+ 4. Follow this recommended markdown structure: introduction, quick start, workflow, AI collaboration notes, and appendices.
232
36
 
233
- - 支持预构建的 Agent Skills 和自定义 Skills
234
- - 需要特定 beta headers
235
- - 通过 `/v1/skills` 端点上传自定义 Skills
37
+ ## 3. Skill creation workflow
236
38
 
237
- ### 7.3 Claude Agent SDK
39
+ 1. **Discover the need** – Understand the task sequences users will run, capturing examples and desired deliverables.
40
+ 2. **Organize reusable content** – Decide what belongs in SKILL.md versus templates, references, or scripts.
41
+ 3. **Initialize the directory** – Use `node scripts/init_skill.js <skill-name> --path <output-directory>` to scaffold the required files.
42
+ 4. **Document the process** – Describe when to use the Skill, how Claude should apply it, and how to inspect/update its resources.
43
+ 5. **Bundle assets** – Add templates, prompts, or scripts (prefer Node.js scripts) that Claude can execute as part of the Skill.
44
+ 6. **Validate & iterate** – Run `node scripts/package_skill.js <skill-dir>` to validate structure before integrating.
238
45
 
239
- - 支持文件系统配置的自定义 Skills
240
- - Skills 位于 `.claude/skills/` 目录
241
- - 在 `allowed_tools` 配置中包含 `"Skill"` 以启用
46
+ ## 4. Loading behavior
242
47
 
243
- ### 7.4 Claude.ai
48
+ Skills use progressive disclosure for efficiency:
244
49
 
245
- - 支持预构建和自定义 Skills
246
- - 自定义 Skills 通过设置上传
247
- - 需要特定计划和支持代码执行
50
+ - **Level 1 – Metadata:** Always in context (name + description).
51
+ - **Level 2 – Instructions:** Loaded when the Skill is triggered (SKILL.md body).
52
+ - **Level 3 – Resources:** Loaded or executed on-demand (scripts, templates, references).
248
53
 
249
- ## 8. 版本历史
54
+ ## 5. Writing guidance
250
55
 
251
- - 1.0 (2025-10-16) - Agent Skills Spec 公开发布
252
- - 1.1 (YYYY-MM-DD) - 整合到 AI Product Kit 项目规范
56
+ - Keep language direct and imperative.
57
+ - Prefer single-topic paragraphs.
58
+ - Cite external references with markdown links that include sources and dates.
59
+ - When describing scripts or automation, call out expected inputs, outputs, and safety considerations.
253
60
 
254
- ## 9. 参考资料
61
+ ## 6. Best practices
255
62
 
256
- - [Agent Skills 官方文档](https://docs.anthropic.com/en/docs/agents-and-tools/agent-skills)
257
- - [Agent Skills Cookbook](https://github.com/anthropics/claude-cookbooks/tree/main/skills)
258
- - [Agent Skills Spec](./agent_skills_spec.md) - 技术规范详情
259
- - [项目文档撰写标准](../../docs/guide_writing_standard/SKILL.md)
63
+ - Keep the Skill purpose narrow—one Skill should solve a single scenario well.
64
+ - Avoid redundancy by linking to existing references or templates when possible.
65
+ - Document any required tools or permissions in the Skill itself.
66
+ - Leave TODO comments when uncertain so the next maintainer can easily spot open questions.
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+
6
+ const USAGE = `
7
+ Usage: node scripts/init_skill.js <skill-name> --path <output-directory>
8
+
9
+ Example:
10
+ node scripts/init_skill.js my-new-skill --path skills/aipk_design
11
+ `;
12
+
13
+ function titleCase(name) {
14
+ return name
15
+ .split('-')
16
+ .map((segment) => segment[0]?.toUpperCase() + segment.slice(1))
17
+ .join(' ');
18
+ }
19
+
20
+ function ensureDir(dir) {
21
+ if (!fs.existsSync(dir)) {
22
+ fs.mkdirSync(dir, { recursive: true });
23
+ }
24
+ }
25
+
26
+ function parseArgs() {
27
+ const [skillName, ...rest] = process.argv.slice(2);
28
+ if (!skillName) {
29
+ console.error(USAGE);
30
+ process.exit(1);
31
+ }
32
+ const pathFlagIndex = rest.indexOf('--path');
33
+ if (pathFlagIndex === -1 || pathFlagIndex === rest.length - 1) {
34
+ console.error('Error: Missing --path argument.');
35
+ console.error(USAGE);
36
+ process.exit(1);
37
+ }
38
+ const basePath = rest[pathFlagIndex + 1];
39
+ return { skillName, basePath };
40
+ }
41
+
42
+ function buildSkillTemplate(skillName) {
43
+ const title = titleCase(skillName);
44
+ return `---
45
+ name: ${skillName}
46
+ description: [TODO] Describe what ${skillName} does and when Claude should use it.
47
+ ---
48
+
49
+ # ${title}
50
+
51
+ ## Overview
52
+
53
+ - **Purpose**: [TODO: Summarize the skill intent.]
54
+ - **When to use**: [TODO: Provide trigger scenarios.]
55
+
56
+ ## Quick Start
57
+
58
+ 1. [TODO: Step-by-step guidance.]
59
+ 2. [TODO: Reference scripts/templates as needed.]
60
+
61
+ ## Workflow
62
+
63
+ [TODO: Outline the core workflow or capabilities.]
64
+
65
+ ## Resources
66
+
67
+ - Templates: \`template/\`
68
+ - Scripts: \`scripts/\`
69
+ - References: \`references/\`
70
+ - Assets: \`assets/\`
71
+
72
+ `;
73
+ }
74
+
75
+ function createExampleHelper(skillDir, skillName) {
76
+ const helperPath = path.join(skillDir, 'scripts', 'example-helper.js');
77
+ const title = titleCase(skillName);
78
+ const content = `#!/usr/bin/env node
79
+ /**
80
+ * Example helper script for ${skillName}
81
+ * Replace this file with actual automation code if the Skill requires it.
82
+ */
83
+
84
+ function main() {
85
+ console.log('This is a template helper script for ${title}.');
86
+ console.log('Replace it with real logic or delete when unused.');
87
+ }
88
+
89
+ main();
90
+ `;
91
+ fs.writeFileSync(helperPath, content, { encoding: 'utf8', mode: 0o755 });
92
+ }
93
+
94
+ function createPlaceholder(dir, name, lines) {
95
+ const target = path.join(dir, name);
96
+ fs.writeFileSync(target, lines.join('\n'), 'utf8');
97
+ }
98
+
99
+ function main() {
100
+ const { skillName, basePath } = parseArgs();
101
+ const resolvedBase = path.resolve(basePath);
102
+ ensureDir(resolvedBase);
103
+ const skillDir = path.join(resolvedBase, skillName);
104
+ if (fs.existsSync(skillDir)) {
105
+ console.error(`Skill directory already exists: ${skillDir}`);
106
+ process.exit(1);
107
+ }
108
+ ensureDir(skillDir);
109
+ const templatePath = path.join(skillDir, 'SKILL.md');
110
+ fs.writeFileSync(templatePath, buildSkillTemplate(skillName), 'utf8');
111
+
112
+ for (const subdir of ['scripts', 'references', 'assets', 'template']) {
113
+ ensureDir(path.join(skillDir, subdir));
114
+ }
115
+
116
+ createExampleHelper(skillDir, skillName);
117
+ createPlaceholder(path.join(skillDir, 'references'), 'README.md', [
118
+ '# Reference Notes',
119
+ '',
120
+ 'Add supporting documentation here.',
121
+ ]);
122
+ createPlaceholder(path.join(skillDir, 'assets'), 'README.md', [
123
+ '# Assets',
124
+ '',
125
+ 'Place templates, images, or other assets here.',
126
+ ]);
127
+
128
+ console.log(`Skill scaffold created at ${skillDir}`);
129
+ }
130
+
131
+ if (require.main === module) {
132
+ main();
133
+ }
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+
6
+ const USAGE = `
7
+ Usage: node scripts/package_skill.js <skill-directory>
8
+
9
+ Example:
10
+ node scripts/package_skill.js skills/aipk_design
11
+ `;
12
+
13
+ function parseFrontMatter(content) {
14
+ if (!content.startsWith('---')) return null;
15
+ const endIndex = content.indexOf('---', 3);
16
+ if (endIndex === -1) return null;
17
+ const block = content.slice(3, endIndex).trim();
18
+ const metadata = {};
19
+ for (const line of block.split(/\r?\n/)) {
20
+ if (!line.includes(':')) continue;
21
+ const [key, ...rest] = line.split(':');
22
+ metadata[key.trim()] = rest.join(':').trim();
23
+ }
24
+ return metadata;
25
+ }
26
+
27
+ function validateSkill(skillDir) {
28
+ const errors = [];
29
+ if (!fs.existsSync(skillDir) || !fs.statSync(skillDir).isDirectory()) {
30
+ errors.push(`Skill directory not found: ${skillDir}`);
31
+ return errors;
32
+ }
33
+ const skillName = path.basename(skillDir);
34
+ const skillMd = path.join(skillDir, 'SKILL.md');
35
+ if (!fs.existsSync(skillMd)) {
36
+ errors.push('SKILL.md is missing');
37
+ return errors;
38
+ }
39
+ const content = fs.readFileSync(skillMd, 'utf8');
40
+ const metadata = parseFrontMatter(content);
41
+ if (!metadata) {
42
+ errors.push('SKILL.md front matter is missing or malformed');
43
+ return errors;
44
+ }
45
+ if (!metadata.name) {
46
+ errors.push('Front matter missing "name"');
47
+ } else if (metadata.name !== skillName) {
48
+ errors.push(`Front matter "name" (${metadata.name}) must match directory (${skillName})`);
49
+ }
50
+ if (!metadata.description) {
51
+ errors.push('Front matter missing "description"');
52
+ }
53
+ return errors;
54
+ }
55
+
56
+ function main() {
57
+ const [skillDir] = process.argv.slice(2);
58
+ if (!skillDir) {
59
+ console.error(USAGE);
60
+ process.exit(1);
61
+ }
62
+ const resolved = path.resolve(skillDir);
63
+ const errors = validateSkill(resolved);
64
+ if (errors.length) {
65
+ console.error('Skill validation failed:');
66
+ for (const err of errors) {
67
+ console.error('- ' + err);
68
+ }
69
+ process.exit(1);
70
+ }
71
+ console.log(`Skill validation passed for ${resolved}`);
72
+ }
73
+
74
+ if (require.main === module) {
75
+ main();
76
+ }
@@ -1,6 +1,6 @@
1
1
  # GURU AI Snapshot
2
2
 
3
- Last refreshed: 2025-11-17T08:21:07.943Z
3
+ Last refreshed: 2025-11-17T08:34:27.508Z
4
4
 
5
5
  | File | Last Modified (UTC) |
6
6
  | --- | --- |