@google/gemini-cli-core 0.25.0-preview.0 → 0.26.0-nightly.20260115.6cb3ae4e0
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.
- package/dist/docs/architecture.md +3 -3
- package/dist/docs/changelogs/index.md +25 -0
- package/dist/docs/changelogs/latest.md +150 -138
- package/dist/docs/changelogs/preview.md +211 -118
- package/dist/docs/changelogs/releases.md +406 -25
- package/dist/docs/cli/commands.md +7 -0
- package/dist/docs/cli/keyboard-shortcuts.md +18 -16
- package/dist/docs/cli/rewind.md +51 -0
- package/dist/docs/cli/settings.md +1 -0
- package/dist/docs/cli/skills.md +8 -8
- package/dist/docs/get-started/configuration.md +12 -1
- package/dist/docs/sidebar.json +4 -0
- package/dist/docs/tools/mcp-server.md +2 -1
- package/dist/docs/troubleshooting.md +2 -1
- package/dist/src/agents/a2a-client-manager.js +1 -1
- package/dist/src/agents/a2a-client-manager.js.map +1 -1
- package/dist/src/agents/registry.js +9 -4
- package/dist/src/agents/registry.js.map +1 -1
- package/dist/src/config/config.d.ts +9 -1
- package/dist/src/config/config.js +16 -0
- package/dist/src/config/config.js.map +1 -1
- package/dist/src/config/config.test.js +20 -0
- package/dist/src/config/config.test.js.map +1 -1
- package/dist/src/confirmation-bus/types.d.ts +52 -2
- package/dist/src/confirmation-bus/types.js +1 -0
- package/dist/src/confirmation-bus/types.js.map +1 -1
- package/dist/src/core/contentGenerator.js +2 -1
- package/dist/src/core/contentGenerator.js.map +1 -1
- package/dist/src/core/coreToolScheduler.test.js +7 -4
- package/dist/src/core/coreToolScheduler.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/generated/git-commit.js.map +1 -1
- package/dist/src/scheduler/state-manager.d.ts +67 -0
- package/dist/src/scheduler/state-manager.js +335 -0
- package/dist/src/scheduler/state-manager.js.map +1 -0
- package/dist/src/scheduler/state-manager.test.d.ts +6 -0
- package/dist/src/scheduler/state-manager.test.js +386 -0
- package/dist/src/scheduler/state-manager.test.js.map +1 -0
- package/dist/src/scheduler/types.d.ts +10 -1
- package/dist/src/skills/builtin/skill-creator/SKILL.md +382 -0
- package/dist/src/skills/builtin/skill-creator/scripts/init_skill.cjs +235 -0
- package/dist/src/skills/builtin/skill-creator/scripts/package_skill.cjs +87 -0
- package/dist/src/skills/builtin/skill-creator/scripts/validate_skill.cjs +127 -0
- package/dist/src/skills/skillLoader.js +65 -9
- package/dist/src/skills/skillLoader.js.map +1 -1
- package/dist/src/skills/skillLoader.test.js +110 -0
- package/dist/src/skills/skillLoader.test.js.map +1 -1
- package/dist/src/skills/skillManager.d.ts +2 -2
- package/dist/src/skills/skillManager.js +17 -6
- package/dist/src/skills/skillManager.js.map +1 -1
- package/dist/src/skills/skillManager.test.js +91 -4
- package/dist/src/skills/skillManager.test.js.map +1 -1
- package/dist/src/test-utils/mock-tool.d.ts +1 -0
- package/dist/src/test-utils/mock-tool.js +1 -0
- package/dist/src/test-utils/mock-tool.js.map +1 -1
- package/dist/src/tools/shell.js +1 -0
- package/dist/src/tools/shell.js.map +1 -1
- package/dist/src/tools/tools.d.ts +1 -0
- package/dist/src/tools/tools.js.map +1 -1
- package/dist/src/utils/shell-utils.js +18 -2
- package/dist/src/utils/shell-utils.js.map +1 -1
- package/dist/src/utils/shell-utils.test.js +23 -0
- package/dist/src/utils/shell-utils.test.js.map +1 -1
- package/dist/src/utils/tokenCalculation.js +10 -2
- package/dist/src/utils/tokenCalculation.js.map +1 -1
- package/dist/src/utils/tokenCalculation.test.js +20 -0
- package/dist/src/utils/tokenCalculation.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/* eslint-env node */
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Skill Packager - Creates a distributable .skill file of a skill folder
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* node package_skill.js <path/to/skill-folder> [output-directory]
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const path = require('node:path');
|
|
13
|
+
const { spawnSync } = require('node:child_process');
|
|
14
|
+
const { validateSkill } = require('./validate_skill.cjs');
|
|
15
|
+
|
|
16
|
+
async function main() {
|
|
17
|
+
const args = process.argv.slice(2);
|
|
18
|
+
if (args.length < 1) {
|
|
19
|
+
console.log(
|
|
20
|
+
'Usage: node package_skill.js <path/to/skill-folder> [output-directory]',
|
|
21
|
+
);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const skillPathArg = args[0];
|
|
26
|
+
const outputDirArg = args[1];
|
|
27
|
+
|
|
28
|
+
if (
|
|
29
|
+
skillPathArg.includes('..') ||
|
|
30
|
+
(outputDirArg && outputDirArg.includes('..'))
|
|
31
|
+
) {
|
|
32
|
+
console.error('❌ Error: Path traversal detected in arguments.');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const skillPath = path.resolve(skillPathArg);
|
|
37
|
+
const outputDir = outputDirArg ? path.resolve(outputDirArg) : process.cwd();
|
|
38
|
+
const skillName = path.basename(skillPath);
|
|
39
|
+
|
|
40
|
+
// 1. Validate first
|
|
41
|
+
console.log('🔍 Validating skill...');
|
|
42
|
+
const result = validateSkill(skillPath);
|
|
43
|
+
if (!result.valid) {
|
|
44
|
+
console.error(`❌ Validation failed: ${result.message}`);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (result.warning) {
|
|
49
|
+
console.warn(`⚠️ ${result.warning}`);
|
|
50
|
+
console.log('Please resolve all TODOs before packaging.');
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
console.log('✅ Skill is valid!');
|
|
54
|
+
|
|
55
|
+
// 2. Package
|
|
56
|
+
const outputFilename = path.join(outputDir, `${skillName}.skill`);
|
|
57
|
+
|
|
58
|
+
try {
|
|
59
|
+
// Zip everything except junk, keeping the folder structure
|
|
60
|
+
// We'll use the native 'zip' command for simplicity in a CLI environment
|
|
61
|
+
// or we could use a JS library, but zip is ubiquitous on darwin/linux.
|
|
62
|
+
|
|
63
|
+
// Command to zip:
|
|
64
|
+
// -r: recursive
|
|
65
|
+
// -x: exclude patterns
|
|
66
|
+
// Run the zip command from within the directory to avoid parent folder nesting
|
|
67
|
+
const zipProcess = spawnSync('zip', ['-r', outputFilename, '.'], {
|
|
68
|
+
cwd: skillPath,
|
|
69
|
+
stdio: 'inherit',
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
if (zipProcess.error) {
|
|
73
|
+
throw zipProcess.error;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (zipProcess.status !== 0) {
|
|
77
|
+
throw new Error(`zip command failed with exit code ${zipProcess.status}`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
console.log(`✅ Successfully packaged skill to: ${outputFilename}`);
|
|
81
|
+
} catch (err) {
|
|
82
|
+
console.error(`❌ Error packaging: ${err.message}`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
main();
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/* eslint-env node */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Quick validation logic for skills.
|
|
5
|
+
* Leveraging existing dependencies when possible or providing a zero-dep fallback.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('node:fs');
|
|
9
|
+
const path = require('node:path');
|
|
10
|
+
|
|
11
|
+
function validateSkill(skillPath) {
|
|
12
|
+
if (!fs.existsSync(skillPath) || !fs.statSync(skillPath).isDirectory()) {
|
|
13
|
+
return { valid: false, message: `Path is not a directory: ${skillPath}` };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const skillMdPath = path.join(skillPath, 'SKILL.md');
|
|
17
|
+
if (!fs.existsSync(skillMdPath)) {
|
|
18
|
+
return { valid: false, message: 'SKILL.md not found' };
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const content = fs.readFileSync(skillMdPath, 'utf8');
|
|
22
|
+
if (!content.startsWith('---')) {
|
|
23
|
+
return { valid: false, message: 'No YAML frontmatter found' };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const parts = content.split('---');
|
|
27
|
+
if (parts.length < 3) {
|
|
28
|
+
return { valid: false, message: 'Invalid frontmatter format' };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const frontmatterText = parts[1];
|
|
32
|
+
|
|
33
|
+
const nameMatch = frontmatterText.match(/^name:\s*(.+)$/m);
|
|
34
|
+
// Match description: "text" or description: 'text' or description: text
|
|
35
|
+
const descMatch = frontmatterText.match(
|
|
36
|
+
/^description:\s*(?:'([^']*)'|"([^"]*)"|(.+))$/m,
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
if (!nameMatch)
|
|
40
|
+
return { valid: false, message: 'Missing "name" in frontmatter' };
|
|
41
|
+
if (!descMatch)
|
|
42
|
+
return {
|
|
43
|
+
valid: false,
|
|
44
|
+
message: 'Description must be a single-line string: description: ...',
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
const name = nameMatch[1].trim();
|
|
48
|
+
const description = (
|
|
49
|
+
descMatch[1] !== undefined
|
|
50
|
+
? descMatch[1]
|
|
51
|
+
: descMatch[2] !== undefined
|
|
52
|
+
? descMatch[2]
|
|
53
|
+
: descMatch[3] || ''
|
|
54
|
+
).trim();
|
|
55
|
+
|
|
56
|
+
if (description.includes('\n')) {
|
|
57
|
+
return {
|
|
58
|
+
valid: false,
|
|
59
|
+
message: 'Description must be a single line (no newlines)',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
64
|
+
return { valid: false, message: `Name "${name}" should be hyphen-case` };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (description.length > 1024) {
|
|
68
|
+
return { valid: false, message: 'Description is too long (max 1024)' };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Check for TODOs
|
|
72
|
+
const files = getAllFiles(skillPath);
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
const fileContent = fs.readFileSync(file, 'utf8');
|
|
75
|
+
if (fileContent.includes('TODO:')) {
|
|
76
|
+
return {
|
|
77
|
+
valid: true,
|
|
78
|
+
message: 'Skill has unresolved TODOs',
|
|
79
|
+
warning: `Found unresolved TODO in ${path.relative(skillPath, file)}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return { valid: true, message: 'Skill is valid!' };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function getAllFiles(dir, fileList = []) {
|
|
88
|
+
const files = fs.readdirSync(dir);
|
|
89
|
+
files.forEach((file) => {
|
|
90
|
+
const name = path.join(dir, file);
|
|
91
|
+
if (fs.statSync(name).isDirectory()) {
|
|
92
|
+
if (!['node_modules', '.git', '__pycache__'].includes(file)) {
|
|
93
|
+
getAllFiles(name, fileList);
|
|
94
|
+
}
|
|
95
|
+
} else {
|
|
96
|
+
fileList.push(name);
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
return fileList;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (require.main === module) {
|
|
103
|
+
const args = process.argv.slice(2);
|
|
104
|
+
if (args.length !== 1) {
|
|
105
|
+
console.log('Usage: node validate_skill.js <skill_directory>');
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const skillDirArg = args[0];
|
|
110
|
+
if (skillDirArg.includes('..')) {
|
|
111
|
+
console.error('❌ Error: Path traversal detected in skill directory path.');
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const result = validateSkill(path.resolve(skillDirArg));
|
|
116
|
+
if (result.warning) {
|
|
117
|
+
console.warn(`⚠️ ${result.warning}`);
|
|
118
|
+
}
|
|
119
|
+
if (result.valid) {
|
|
120
|
+
console.log(`✅ ${result.message}`);
|
|
121
|
+
} else {
|
|
122
|
+
console.error(`❌ ${result.message}`);
|
|
123
|
+
process.exit(1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
module.exports = { validateSkill };
|
|
@@ -10,6 +10,66 @@ import yaml from 'js-yaml';
|
|
|
10
10
|
import { debugLogger } from '../utils/debugLogger.js';
|
|
11
11
|
import { coreEvents } from '../utils/events.js';
|
|
12
12
|
export const FRONTMATTER_REGEX = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n([\s\S]*))?/;
|
|
13
|
+
/**
|
|
14
|
+
* Parses frontmatter content using YAML with a fallback to simple key-value parsing.
|
|
15
|
+
* This handles cases where description contains colons that would break YAML parsing.
|
|
16
|
+
*/
|
|
17
|
+
function parseFrontmatter(content) {
|
|
18
|
+
try {
|
|
19
|
+
const parsed = yaml.load(content);
|
|
20
|
+
if (parsed && typeof parsed === 'object') {
|
|
21
|
+
const { name, description } = parsed;
|
|
22
|
+
if (typeof name === 'string' && typeof description === 'string') {
|
|
23
|
+
return { name, description };
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (yamlError) {
|
|
28
|
+
debugLogger.debug('YAML frontmatter parsing failed, falling back to simple parser:', yamlError);
|
|
29
|
+
}
|
|
30
|
+
return parseSimpleFrontmatter(content);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Simple frontmatter parser that extracts name and description fields.
|
|
34
|
+
* Handles cases where values contain colons that would break YAML parsing.
|
|
35
|
+
*/
|
|
36
|
+
function parseSimpleFrontmatter(content) {
|
|
37
|
+
const lines = content.split(/\r?\n/);
|
|
38
|
+
let name;
|
|
39
|
+
let description;
|
|
40
|
+
for (let i = 0; i < lines.length; i++) {
|
|
41
|
+
const line = lines[i];
|
|
42
|
+
// Match "name:" at the start of the line (optional whitespace)
|
|
43
|
+
const nameMatch = line.match(/^\s*name:\s*(.*)$/);
|
|
44
|
+
if (nameMatch) {
|
|
45
|
+
name = nameMatch[1].trim();
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Match "description:" at the start of the line (optional whitespace)
|
|
49
|
+
const descMatch = line.match(/^\s*description:\s*(.*)$/);
|
|
50
|
+
if (descMatch) {
|
|
51
|
+
const descLines = [descMatch[1].trim()];
|
|
52
|
+
// Check for multi-line description (indented continuation lines)
|
|
53
|
+
while (i + 1 < lines.length) {
|
|
54
|
+
const nextLine = lines[i + 1];
|
|
55
|
+
// If next line is indented, it's a continuation of the description
|
|
56
|
+
if (nextLine.match(/^[ \t]+\S/)) {
|
|
57
|
+
descLines.push(nextLine.trim());
|
|
58
|
+
i++;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
break;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
description = descLines.filter(Boolean).join(' ');
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
if (name !== undefined && description !== undefined) {
|
|
69
|
+
return { name, description };
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
13
73
|
/**
|
|
14
74
|
* Discovers and loads all skills in the provided directory.
|
|
15
75
|
*/
|
|
@@ -54,19 +114,15 @@ export async function loadSkillFromFile(filePath) {
|
|
|
54
114
|
if (!match) {
|
|
55
115
|
return null;
|
|
56
116
|
}
|
|
57
|
-
const frontmatter =
|
|
58
|
-
if (!frontmatter
|
|
59
|
-
return null;
|
|
60
|
-
}
|
|
61
|
-
const { name, description } = frontmatter;
|
|
62
|
-
if (typeof name !== 'string' || typeof description !== 'string') {
|
|
117
|
+
const frontmatter = parseFrontmatter(match[1]);
|
|
118
|
+
if (!frontmatter) {
|
|
63
119
|
return null;
|
|
64
120
|
}
|
|
65
121
|
return {
|
|
66
|
-
name,
|
|
67
|
-
description,
|
|
122
|
+
name: frontmatter.name,
|
|
123
|
+
description: frontmatter.description,
|
|
68
124
|
location: filePath,
|
|
69
|
-
body: match[2]
|
|
125
|
+
body: match[2]?.trim() ?? '',
|
|
70
126
|
};
|
|
71
127
|
}
|
|
72
128
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillLoader.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACvC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAoBhD,MAAM,CAAC,MAAM,iBAAiB,GAC5B,gDAAgD,CAAC;AAEnD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAW;IAEX,MAAM,gBAAgB,GAAsB,EAAE,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAClE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACnC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE;YACxD,GAAG,EAAE,kBAAkB;YACvB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,IAAI,QAAQ,EAAE,CAAC;gBACb,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;YACnD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,WAAW,CAAC,KAAK,CACf,8BAA8B,kBAAkB,0JAA0J,CAC3M,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,YAAY,CACrB,SAAS,EACT,+BAA+B,GAAG,GAAG,EACrC,KAAK,CACN,CAAC;IACJ,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,
|
|
1
|
+
{"version":3,"file":"skillLoader.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,5 +71,115 @@ describe('skillLoader', () => {
|
|
|
71
71
|
expect(skills).toEqual([]);
|
|
72
72
|
expect(coreEvents.emitFeedback).not.toHaveBeenCalled();
|
|
73
73
|
});
|
|
74
|
+
it('should parse skill with colon in description (issue #16323)', async () => {
|
|
75
|
+
const skillDir = path.join(testRootDir, 'colon-skill');
|
|
76
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
77
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
78
|
+
await fs.writeFile(skillFile, `---
|
|
79
|
+
name: foo
|
|
80
|
+
description: Simple story generation assistant for fiction writing. Use for creating characters, scenes, storylines, and prose. Trigger words: character, scene, storyline, story, prose, fiction, writing.
|
|
81
|
+
---
|
|
82
|
+
# Instructions
|
|
83
|
+
Do something.
|
|
84
|
+
`);
|
|
85
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
86
|
+
expect(skills).toHaveLength(1);
|
|
87
|
+
expect(skills[0].name).toBe('foo');
|
|
88
|
+
expect(skills[0].description).toContain('Trigger words:');
|
|
89
|
+
});
|
|
90
|
+
it('should parse skill with multiple colons in description', async () => {
|
|
91
|
+
const skillDir = path.join(testRootDir, 'multi-colon-skill');
|
|
92
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
93
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
94
|
+
await fs.writeFile(skillFile, `---
|
|
95
|
+
name: multi-colon
|
|
96
|
+
description: Use this for tasks like: coding, reviewing, testing. Keywords: async, await, promise.
|
|
97
|
+
---
|
|
98
|
+
# Instructions
|
|
99
|
+
Do something.
|
|
100
|
+
`);
|
|
101
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
102
|
+
expect(skills).toHaveLength(1);
|
|
103
|
+
expect(skills[0].name).toBe('multi-colon');
|
|
104
|
+
expect(skills[0].description).toContain('tasks like:');
|
|
105
|
+
expect(skills[0].description).toContain('Keywords:');
|
|
106
|
+
});
|
|
107
|
+
it('should parse skill with quoted YAML description (backward compatibility)', async () => {
|
|
108
|
+
const skillDir = path.join(testRootDir, 'quoted-skill');
|
|
109
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
110
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
111
|
+
await fs.writeFile(skillFile, `---
|
|
112
|
+
name: quoted-skill
|
|
113
|
+
description: "A skill with colons: like this one: and another."
|
|
114
|
+
---
|
|
115
|
+
# Instructions
|
|
116
|
+
Do something.
|
|
117
|
+
`);
|
|
118
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
119
|
+
expect(skills).toHaveLength(1);
|
|
120
|
+
expect(skills[0].name).toBe('quoted-skill');
|
|
121
|
+
expect(skills[0].description).toBe('A skill with colons: like this one: and another.');
|
|
122
|
+
});
|
|
123
|
+
it('should parse skill with multi-line YAML description', async () => {
|
|
124
|
+
const skillDir = path.join(testRootDir, 'multiline-skill');
|
|
125
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
126
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
127
|
+
await fs.writeFile(skillFile, `---
|
|
128
|
+
name: multiline-skill
|
|
129
|
+
description:
|
|
130
|
+
Expertise in reviewing code for style, security, and performance. Use when the
|
|
131
|
+
user asks for "feedback," a "review," or to "check" their changes.
|
|
132
|
+
---
|
|
133
|
+
# Instructions
|
|
134
|
+
Do something.
|
|
135
|
+
`);
|
|
136
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
137
|
+
expect(skills).toHaveLength(1);
|
|
138
|
+
expect(skills[0].name).toBe('multiline-skill');
|
|
139
|
+
expect(skills[0].description).toContain('Expertise in reviewing code');
|
|
140
|
+
expect(skills[0].description).toContain('check');
|
|
141
|
+
});
|
|
142
|
+
it('should handle empty name or description', async () => {
|
|
143
|
+
const skillDir = path.join(testRootDir, 'empty-skill');
|
|
144
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
145
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
146
|
+
await fs.writeFile(skillFile, `---
|
|
147
|
+
name:
|
|
148
|
+
description:
|
|
149
|
+
---
|
|
150
|
+
`);
|
|
151
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
152
|
+
expect(skills).toHaveLength(1);
|
|
153
|
+
expect(skills[0].name).toBe('');
|
|
154
|
+
expect(skills[0].description).toBe('');
|
|
155
|
+
});
|
|
156
|
+
it('should handle indented name and description fields', async () => {
|
|
157
|
+
const skillDir = path.join(testRootDir, 'indented-fields');
|
|
158
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
159
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
160
|
+
await fs.writeFile(skillFile, `---
|
|
161
|
+
name: indented-name
|
|
162
|
+
description: indented-desc
|
|
163
|
+
---
|
|
164
|
+
`);
|
|
165
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
166
|
+
expect(skills).toHaveLength(1);
|
|
167
|
+
expect(skills[0].name).toBe('indented-name');
|
|
168
|
+
expect(skills[0].description).toBe('indented-desc');
|
|
169
|
+
});
|
|
170
|
+
it('should handle missing space after colon', async () => {
|
|
171
|
+
const skillDir = path.join(testRootDir, 'no-space');
|
|
172
|
+
await fs.mkdir(skillDir, { recursive: true });
|
|
173
|
+
const skillFile = path.join(skillDir, 'SKILL.md');
|
|
174
|
+
await fs.writeFile(skillFile, `---
|
|
175
|
+
name:no-space-name
|
|
176
|
+
description:no-space-desc
|
|
177
|
+
---
|
|
178
|
+
`);
|
|
179
|
+
const skills = await loadSkillsFromDir(testRootDir);
|
|
180
|
+
expect(skills).toHaveLength(1);
|
|
181
|
+
expect(skills[0].name).toBe('no-space-name');
|
|
182
|
+
expect(skills[0].description).toBe('no-space-desc');
|
|
183
|
+
});
|
|
74
184
|
});
|
|
75
185
|
//# sourceMappingURL=skillLoader.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillLoader.test.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skillLoader.test.js","sourceRoot":"","sources":["../../../src/skills/skillLoader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,8 +24,8 @@ export declare class SkillManager {
|
|
|
24
24
|
*/
|
|
25
25
|
isAdminEnabled(): boolean;
|
|
26
26
|
/**
|
|
27
|
-
* Discovers skills from standard user and
|
|
28
|
-
* Precedence: Extensions (lowest) -> User ->
|
|
27
|
+
* Discovers skills from standard user and workspace locations, as well as extensions.
|
|
28
|
+
* Precedence: Extensions (lowest) -> User -> Workspace (highest).
|
|
29
29
|
*/
|
|
30
30
|
discoverSkills(storage: Storage, extensions?: GeminiCLIExtension[]): Promise<void>;
|
|
31
31
|
/**
|
|
@@ -7,6 +7,8 @@ import * as path from 'node:path';
|
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { Storage } from '../config/storage.js';
|
|
9
9
|
import { loadSkillsFromDir } from './skillLoader.js';
|
|
10
|
+
import { debugLogger } from '../utils/debugLogger.js';
|
|
11
|
+
import { coreEvents } from '../utils/events.js';
|
|
10
12
|
export {};
|
|
11
13
|
export class SkillManager {
|
|
12
14
|
skills = [];
|
|
@@ -31,8 +33,8 @@ export class SkillManager {
|
|
|
31
33
|
return this.adminSkillsEnabled;
|
|
32
34
|
}
|
|
33
35
|
/**
|
|
34
|
-
* Discovers skills from standard user and
|
|
35
|
-
* Precedence: Extensions (lowest) -> User ->
|
|
36
|
+
* Discovers skills from standard user and workspace locations, as well as extensions.
|
|
37
|
+
* Precedence: Extensions (lowest) -> User -> Workspace (highest).
|
|
36
38
|
*/
|
|
37
39
|
async discoverSkills(storage, extensions = []) {
|
|
38
40
|
this.clearSkills();
|
|
@@ -47,7 +49,7 @@ export class SkillManager {
|
|
|
47
49
|
// 3. User skills
|
|
48
50
|
const userSkills = await loadSkillsFromDir(Storage.getUserSkillsDir());
|
|
49
51
|
this.addSkillsWithPrecedence(userSkills);
|
|
50
|
-
// 4.
|
|
52
|
+
// 4. Workspace skills (highest precedence)
|
|
51
53
|
const projectSkills = await loadSkillsFromDir(storage.getProjectSkillsDir());
|
|
52
54
|
this.addSkillsWithPrecedence(projectSkills);
|
|
53
55
|
}
|
|
@@ -64,9 +66,18 @@ export class SkillManager {
|
|
|
64
66
|
this.addSkillsWithPrecedence(builtinSkills);
|
|
65
67
|
}
|
|
66
68
|
addSkillsWithPrecedence(newSkills) {
|
|
67
|
-
const skillMap = new Map();
|
|
68
|
-
for (const
|
|
69
|
-
skillMap.
|
|
69
|
+
const skillMap = new Map(this.skills.map((s) => [s.name, s]));
|
|
70
|
+
for (const newSkill of newSkills) {
|
|
71
|
+
const existingSkill = skillMap.get(newSkill.name);
|
|
72
|
+
if (existingSkill && existingSkill.location !== newSkill.location) {
|
|
73
|
+
if (existingSkill.isBuiltin) {
|
|
74
|
+
debugLogger.warn(`Skill "${newSkill.name}" from "${newSkill.location}" is overriding the built-in skill.`);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
coreEvents.emitFeedback('warning', `Skill conflict detected: "${newSkill.name}" from "${newSkill.location}" is overriding the same skill from "${existingSkill.location}".`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
skillMap.set(newSkill.name, newSkill);
|
|
70
81
|
}
|
|
71
82
|
this.skills = Array.from(skillMap.values());
|
|
72
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skillManager.js","sourceRoot":"","sources":["../../../src/skills/skillManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAwB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skillManager.js","sourceRoot":"","sources":["../../../src/skills/skillManager.ts"],"names":[],"mappings":"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"}
|