transskill 0.1.1 → 0.2.0
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/core/types.d.ts +6 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/index.js +91 -8
- package/dist/index.js.map +1 -1
- package/dist/parser/claude-md.parser.d.ts +25 -0
- package/dist/parser/claude-md.parser.d.ts.map +1 -0
- package/dist/parser/claude-md.parser.js +137 -0
- package/dist/parser/claude-md.parser.js.map +1 -0
- package/dist/parser/index.d.ts +1 -0
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +1 -0
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/skill-md.parser.d.ts.map +1 -1
- package/dist/parser/skill-md.parser.js +4 -5
- package/dist/parser/skill-md.parser.js.map +1 -1
- package/dist/renderer/claude-md.renderer.d.ts +9 -0
- package/dist/renderer/claude-md.renderer.d.ts.map +1 -0
- package/dist/renderer/claude-md.renderer.js +67 -0
- package/dist/renderer/claude-md.renderer.js.map +1 -0
- package/dist/renderer/cursor-rules.renderer.d.ts +0 -8
- package/dist/renderer/cursor-rules.renderer.d.ts.map +1 -1
- package/dist/renderer/cursor-rules.renderer.js +17 -32
- package/dist/renderer/cursor-rules.renderer.js.map +1 -1
- package/dist/renderer/index.d.ts +1 -0
- package/dist/renderer/index.d.ts.map +1 -1
- package/dist/renderer/index.js +1 -0
- package/dist/renderer/index.js.map +1 -1
- package/dist/renderer/mcp-json.renderer.d.ts +0 -7
- package/dist/renderer/mcp-json.renderer.d.ts.map +1 -1
- package/dist/renderer/mcp-json.renderer.js +11 -15
- package/dist/renderer/mcp-json.renderer.js.map +1 -1
- package/dist/renderer/mdc.renderer.d.ts +0 -6
- package/dist/renderer/mdc.renderer.d.ts.map +1 -1
- package/dist/renderer/mdc.renderer.js +15 -22
- package/dist/renderer/mdc.renderer.js.map +1 -1
- package/dist/renderer/skill-md.renderer.d.ts +0 -3
- package/dist/renderer/skill-md.renderer.d.ts.map +1 -1
- package/dist/renderer/skill-md.renderer.js +21 -29
- package/dist/renderer/skill-md.renderer.js.map +1 -1
- package/dist/utils/directory-scanner.d.ts +12 -0
- package/dist/utils/directory-scanner.d.ts.map +1 -0
- package/dist/utils/directory-scanner.js +133 -0
- package/dist/utils/directory-scanner.js.map +1 -0
- package/dist/utils/file-copier.d.ts +15 -0
- package/dist/utils/file-copier.d.ts.map +1 -0
- package/dist/utils/file-copier.js +69 -0
- package/dist/utils/file-copier.js.map +1 -0
- package/dist/utils/format-detector.d.ts +0 -1
- package/dist/utils/format-detector.d.ts.map +1 -1
- package/dist/utils/format-detector.js +48 -12
- package/dist/utils/format-detector.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,13 +1,6 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { writeFileSync
|
|
3
|
-
|
|
4
|
-
* Renders IntermediateSkill to .cursorrules format (Cursor IDE).
|
|
5
|
-
*
|
|
6
|
-
* .cursorrules is a plain text file with no frontmatter.
|
|
7
|
-
* Metadata is stored as # comments at the top of the file.
|
|
8
|
-
*
|
|
9
|
-
* Directory mode: copies scripts/assets alongside the .cursorrules file.
|
|
10
|
-
*/
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
3
|
+
import { copyAttachedFiles, copyDirectoryTree } from '../utils/file-copier.js';
|
|
11
4
|
export class CursorRulesRenderer {
|
|
12
5
|
format = '.cursorrules';
|
|
13
6
|
extension = '.cursorrules';
|
|
@@ -23,38 +16,30 @@ export class CursorRulesRenderer {
|
|
|
23
16
|
return parts.join('\n').trim() + '\n';
|
|
24
17
|
}
|
|
25
18
|
renderDirectory(skillDir, skill, outputPath) {
|
|
26
|
-
const
|
|
27
|
-
const
|
|
19
|
+
const allCopied = [];
|
|
20
|
+
const allSkipped = [];
|
|
28
21
|
const rulesPath = join(outputPath, `${skillDir.name}.cursorrules`);
|
|
29
22
|
writeFileSync(rulesPath, this.render(skill), 'utf-8');
|
|
30
|
-
if (
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
cpSync(skillDir.scriptsDir, target, { recursive: true });
|
|
37
|
-
copied.push(target);
|
|
38
|
-
}
|
|
39
|
-
catch {
|
|
40
|
-
skipped.push(skillDir.scriptsDir);
|
|
41
|
-
}
|
|
23
|
+
if (skill.metadata.attachedFiles && skill.metadata.attachedFiles.length > 0) {
|
|
24
|
+
const result = copyAttachedFiles(skill.metadata.attachedFiles, outputPath);
|
|
25
|
+
allCopied.push(...result.copied);
|
|
26
|
+
allSkipped.push(...result.skipped);
|
|
42
27
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
copied.push(target);
|
|
28
|
+
else {
|
|
29
|
+
if (skillDir.scriptsDir) {
|
|
30
|
+
const target = join(outputPath, 'scripts');
|
|
31
|
+
allCopied.push(...copyDirectoryTree(skillDir.scriptsDir, target));
|
|
48
32
|
}
|
|
49
|
-
|
|
50
|
-
|
|
33
|
+
if (skillDir.assetsDir) {
|
|
34
|
+
const target = join(outputPath, 'assets');
|
|
35
|
+
allCopied.push(...copyDirectoryTree(skillDir.assetsDir, target));
|
|
51
36
|
}
|
|
52
37
|
}
|
|
53
38
|
return {
|
|
54
39
|
skillName: skill.name,
|
|
55
40
|
mainOutput: rulesPath,
|
|
56
|
-
copiedFiles:
|
|
57
|
-
skippedFiles:
|
|
41
|
+
copiedFiles: allCopied,
|
|
42
|
+
skippedFiles: allSkipped,
|
|
58
43
|
};
|
|
59
44
|
}
|
|
60
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cursor-rules.renderer.js","sourceRoot":"","sources":["../../src/renderer/cursor-rules.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"cursor-rules.renderer.js","sourceRoot":"","sources":["../../src/renderer/cursor-rules.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE/E,MAAM,OAAO,mBAAmB;IACrB,MAAM,GAAe,cAAc,CAAC;IACpC,SAAS,GAAG,cAAc,CAAC;IAEpC,MAAM,CAAC,KAAwB;QAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,kCAAkC,KAAK,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC;IACxC,CAAC;IAED,eAAe,CACb,QAAwB,EACxB,KAAwB,EACxB,UAAkB;QAElB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,IAAI,cAAc,CAAC,CAAC;QACnE,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAEtD,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YAC3E,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC3C,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACvB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC1C,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;YACnE,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,UAAU,EAAE,SAAS;YACrB,WAAW,EAAE,SAAS;YACtB,YAAY,EAAE,UAAU;SACzB,CAAC;IACJ,CAAC;CACF"}
|
package/dist/renderer/index.d.ts
CHANGED
|
@@ -3,5 +3,6 @@ export { SKILLMdRenderer } from './skill-md.renderer.js';
|
|
|
3
3
|
export { CursorRulesRenderer } from './cursor-rules.renderer.js';
|
|
4
4
|
export { MdcRenderer } from './mdc.renderer.js';
|
|
5
5
|
export { MCPJsonRenderer } from './mcp-json.renderer.js';
|
|
6
|
+
export { ClaudeMDRenderer } from './claude-md.renderer.js';
|
|
6
7
|
export type { Renderer } from './renderer.interface.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/renderer/index.js
CHANGED
|
@@ -3,4 +3,5 @@ export { SKILLMdRenderer } from './skill-md.renderer.js';
|
|
|
3
3
|
export { CursorRulesRenderer } from './cursor-rules.renderer.js';
|
|
4
4
|
export { MdcRenderer } from './mdc.renderer.js';
|
|
5
5
|
export { MCPJsonRenderer } from './mcp-json.renderer.js';
|
|
6
|
+
export { ClaudeMDRenderer } from './claude-md.renderer.js';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/renderer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -1,12 +1,5 @@
|
|
|
1
1
|
import type { Renderer } from './renderer.interface.js';
|
|
2
2
|
import type { FormatType, IntermediateSkill, SkillDirectory, DirectoryConversionResult } from '../core/types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Renders IntermediateSkill to MCP JSON format.
|
|
5
|
-
*
|
|
6
|
-
* Output: { name, description, tools[] }
|
|
7
|
-
* Only includes tools from platformSpecific.mcp.tools.
|
|
8
|
-
* Falls back to generating a single tool from the skill instructions.
|
|
9
|
-
*/
|
|
10
3
|
export declare class MCPJsonRenderer implements Renderer {
|
|
11
4
|
readonly format: FormatType;
|
|
12
5
|
readonly extension = ".json";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-json.renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/mcp-json.renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-json.renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/mcp-json.renderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGjH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAc;IACzC,QAAQ,CAAC,SAAS,WAAW;IAE7B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IA0BxC,eAAe,CACb,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,GACjB,yBAAyB;CAoB7B"}
|
|
@@ -1,12 +1,6 @@
|
|
|
1
1
|
import { writeFileSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
|
|
4
|
-
* Renders IntermediateSkill to MCP JSON format.
|
|
5
|
-
*
|
|
6
|
-
* Output: { name, description, tools[] }
|
|
7
|
-
* Only includes tools from platformSpecific.mcp.tools.
|
|
8
|
-
* Falls back to generating a single tool from the skill instructions.
|
|
9
|
-
*/
|
|
3
|
+
import { copyAttachedFiles } from '../utils/file-copier.js';
|
|
10
4
|
export class MCPJsonRenderer {
|
|
11
5
|
format = 'mcp.json';
|
|
12
6
|
extension = '.json';
|
|
@@ -24,16 +18,11 @@ export class MCPJsonRenderer {
|
|
|
24
18
|
}));
|
|
25
19
|
}
|
|
26
20
|
else {
|
|
27
|
-
// Fallback: generate a single tool from instructions
|
|
28
21
|
output.tools = [
|
|
29
22
|
{
|
|
30
23
|
name: skill.name.replace(/[^a-z0-9_]/gi, '_').toLowerCase(),
|
|
31
24
|
description: skill.description || 'Tool generated from skill',
|
|
32
|
-
inputSchema: {
|
|
33
|
-
type: 'object',
|
|
34
|
-
properties: {},
|
|
35
|
-
required: [],
|
|
36
|
-
},
|
|
25
|
+
inputSchema: { type: 'object', properties: {}, required: [] },
|
|
37
26
|
},
|
|
38
27
|
];
|
|
39
28
|
}
|
|
@@ -42,11 +31,18 @@ export class MCPJsonRenderer {
|
|
|
42
31
|
renderDirectory(skillDir, skill, outputPath) {
|
|
43
32
|
const jsonPath = join(outputPath, `${skillDir.name}.mcp.json`);
|
|
44
33
|
writeFileSync(jsonPath, this.render(skill), 'utf-8');
|
|
34
|
+
const allCopied = [];
|
|
35
|
+
const allSkipped = [];
|
|
36
|
+
if (skill.metadata.attachedFiles && skill.metadata.attachedFiles.length > 0) {
|
|
37
|
+
const result = copyAttachedFiles(skill.metadata.attachedFiles, outputPath);
|
|
38
|
+
allCopied.push(...result.copied);
|
|
39
|
+
allSkipped.push(...result.skipped);
|
|
40
|
+
}
|
|
45
41
|
return {
|
|
46
42
|
skillName: skill.name,
|
|
47
43
|
mainOutput: jsonPath,
|
|
48
|
-
copiedFiles:
|
|
49
|
-
skippedFiles:
|
|
44
|
+
copiedFiles: allCopied,
|
|
45
|
+
skippedFiles: allSkipped,
|
|
50
46
|
};
|
|
51
47
|
}
|
|
52
48
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-json.renderer.js","sourceRoot":"","sources":["../../src/renderer/mcp-json.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-json.renderer.js","sourceRoot":"","sources":["../../src/renderer/mcp-json.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,OAAO,eAAe;IACjB,MAAM,GAAe,UAAU,CAAC;IAChC,SAAS,GAAG,OAAO,CAAC;IAE7B,MAAM,CAAC,KAAwB;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC;QAChD,MAAM,MAAM,GAA4B;YACtC,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC;QAEF,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/B,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,WAAW,EAAE,CAAC,CAAC,WAAW;aAC3B,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,GAAG;gBACb;oBACE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE;oBAC3D,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,2BAA2B;oBAC7D,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;iBAC9D;aACF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IAChD,CAAC;IAED,eAAe,CACb,QAAwB,EACxB,KAAwB,EACxB,UAAkB;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC;QAC/D,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAErD,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YAC3E,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QAED,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,SAAS;YACtB,YAAY,EAAE,UAAU;SACzB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1,11 +1,5 @@
|
|
|
1
1
|
import type { Renderer } from './renderer.interface.js';
|
|
2
2
|
import type { FormatType, IntermediateSkill, SkillDirectory, DirectoryConversionResult } from '../core/types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Renders IntermediateSkill to .mdc format (Cursor 2.3+).
|
|
5
|
-
*
|
|
6
|
-
* .mdc files have YAML frontmatter with description, globs, and alwaysApply.
|
|
7
|
-
* The body contains the rule instructions.
|
|
8
|
-
*/
|
|
9
3
|
export declare class MdcRenderer implements Renderer {
|
|
10
4
|
readonly format: FormatType;
|
|
11
5
|
readonly extension = ".mdc";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdc.renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/mdc.renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mdc.renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/mdc.renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGjH,qBAAa,WAAY,YAAW,QAAQ;IAC1C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAU;IACrC,QAAQ,CAAC,SAAS,UAAU;IAE5B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAgBxC,eAAe,CACb,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,GACjB,yBAAyB;CAyB7B"}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { writeFileSync
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
3
3
|
import matter from 'gray-matter';
|
|
4
|
-
|
|
5
|
-
* Renders IntermediateSkill to .mdc format (Cursor 2.3+).
|
|
6
|
-
*
|
|
7
|
-
* .mdc files have YAML frontmatter with description, globs, and alwaysApply.
|
|
8
|
-
* The body contains the rule instructions.
|
|
9
|
-
*/
|
|
4
|
+
import { copyAttachedFiles, copyDirectoryTree } from '../utils/file-copier.js';
|
|
10
5
|
export class MdcRenderer {
|
|
11
6
|
format = '.mdc';
|
|
12
7
|
extension = '.mdc';
|
|
@@ -24,28 +19,26 @@ export class MdcRenderer {
|
|
|
24
19
|
return matter.stringify(skill.instructions || '', frontmatter);
|
|
25
20
|
}
|
|
26
21
|
renderDirectory(skillDir, skill, outputPath) {
|
|
27
|
-
const
|
|
28
|
-
const
|
|
22
|
+
const allCopied = [];
|
|
23
|
+
const allSkipped = [];
|
|
29
24
|
const mdcPath = join(outputPath, `${skillDir.name}.mdc`);
|
|
30
25
|
writeFileSync(mdcPath, this.render(skill), 'utf-8');
|
|
31
|
-
if (
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
catch {
|
|
41
|
-
skipped.push(skillDir.scriptsDir);
|
|
26
|
+
if (skill.metadata.attachedFiles && skill.metadata.attachedFiles.length > 0) {
|
|
27
|
+
const result = copyAttachedFiles(skill.metadata.attachedFiles, outputPath);
|
|
28
|
+
allCopied.push(...result.copied);
|
|
29
|
+
allSkipped.push(...result.skipped);
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
if (skillDir.scriptsDir) {
|
|
33
|
+
const target = join(outputPath, 'scripts');
|
|
34
|
+
allCopied.push(...copyDirectoryTree(skillDir.scriptsDir, target));
|
|
42
35
|
}
|
|
43
36
|
}
|
|
44
37
|
return {
|
|
45
38
|
skillName: skill.name,
|
|
46
39
|
mainOutput: mdcPath,
|
|
47
|
-
copiedFiles:
|
|
48
|
-
skippedFiles:
|
|
40
|
+
copiedFiles: allCopied,
|
|
41
|
+
skippedFiles: allSkipped,
|
|
49
42
|
};
|
|
50
43
|
}
|
|
51
44
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mdc.renderer.js","sourceRoot":"","sources":["../../src/renderer/mdc.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"mdc.renderer.js","sourceRoot":"","sources":["../../src/renderer/mdc.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAE/E,MAAM,OAAO,WAAW;IACb,MAAM,GAAe,MAAM,CAAC;IAC5B,SAAS,GAAG,MAAM,CAAC;IAE5B,MAAM,CAAC,KAAwB;QAC7B,MAAM,WAAW,GAA4B;YAC3C,WAAW,EAAE,KAAK,CAAC,WAAW;SAC/B,CAAC;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC;QAC7C,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,MAAM,EAAE,WAAW,KAAK,SAAS,EAAE,CAAC;YACtC,WAAW,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QAC/C,CAAC;QAED,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC;IACjE,CAAC;IAED,eAAe,CACb,QAAwB,EACxB,KAAwB,EACxB,UAAkB;QAElB,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC;QACzD,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QAEpD,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,IAAI,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5E,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;YAC3E,SAAS,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YACjC,UAAU,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;gBACxB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC3C,SAAS,CAAC,IAAI,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;QAED,OAAO;YACL,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,UAAU,EAAE,OAAO;YACnB,WAAW,EAAE,SAAS;YACtB,YAAY,EAAE,UAAU;SACzB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -2,9 +2,6 @@ import type { Renderer } from './renderer.interface.js';
|
|
|
2
2
|
import type { FormatType, IntermediateSkill, SkillDirectory, DirectoryConversionResult } from '../core/types.js';
|
|
3
3
|
/**
|
|
4
4
|
* Renders IntermediateSkill back to SKILL.md format.
|
|
5
|
-
*
|
|
6
|
-
* Output: YAML frontmatter (name, description, tags, author, version)
|
|
7
|
-
* + Markdown body (instructions)
|
|
8
5
|
*/
|
|
9
6
|
export declare class SKILLMdRenderer implements Renderer {
|
|
10
7
|
readonly format: FormatType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-md.renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/skill-md.renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-md.renderer.d.ts","sourceRoot":"","sources":["../../src/renderer/skill-md.renderer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAGjH;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAc;IACzC,QAAQ,CAAC,SAAS,SAAS;IAE3B,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM;IAqBxC,eAAe,CACb,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,GACjB,yBAAyB;CAsC7B"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { join } from 'node:path';
|
|
2
|
-
import { writeFileSync
|
|
2
|
+
import { writeFileSync } from 'node:fs';
|
|
3
3
|
import matter from 'gray-matter';
|
|
4
|
+
import { copyAttachedFiles, copyDirectoryTree } from '../utils/file-copier.js';
|
|
4
5
|
/**
|
|
5
6
|
* Renders IntermediateSkill back to SKILL.md format.
|
|
6
|
-
*
|
|
7
|
-
* Output: YAML frontmatter (name, description, tags, author, version)
|
|
8
|
-
* + Markdown body (instructions)
|
|
9
7
|
*/
|
|
10
8
|
export class SKILLMdRenderer {
|
|
11
9
|
format = 'skill.md';
|
|
@@ -35,34 +33,28 @@ export class SKILLMdRenderer {
|
|
|
35
33
|
const skipped = [];
|
|
36
34
|
const skillMdPath = join(outputPath, 'SKILL.md');
|
|
37
35
|
writeFileSync(skillMdPath, this.render(skill), 'utf-8');
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
skipped.push(skillDir.scriptsDir);
|
|
46
|
-
}
|
|
36
|
+
// Copy attached files from skill metadata (survives mapper transform)
|
|
37
|
+
if (skill.metadata.attachedFiles && skill.metadata.attachedFiles.length > 0) {
|
|
38
|
+
const result = copyAttachedFiles(skill.metadata.attachedFiles, outputPath);
|
|
39
|
+
copied.push(...result.copied);
|
|
40
|
+
skipped.push(...result.skipped);
|
|
47
41
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
42
|
+
else {
|
|
43
|
+
// Fallback: copy from skillDir directly (pre-mapper paths)
|
|
44
|
+
if (skillDir.scriptsDir) {
|
|
45
|
+
const target = join(outputPath, 'scripts');
|
|
46
|
+
const dirCopied = copyDirectoryTree(skillDir.scriptsDir, target);
|
|
47
|
+
copied.push(...dirCopied);
|
|
53
48
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (skillDir.assetsDir) {
|
|
59
|
-
const target = join(outputPath, 'assets');
|
|
60
|
-
try {
|
|
61
|
-
cpSync(skillDir.assetsDir, target, { recursive: true });
|
|
62
|
-
copied.push(target);
|
|
49
|
+
if (skillDir.referencesDir) {
|
|
50
|
+
const target = join(outputPath, 'references');
|
|
51
|
+
const dirCopied = copyDirectoryTree(skillDir.referencesDir, target);
|
|
52
|
+
copied.push(...dirCopied);
|
|
63
53
|
}
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
if (skillDir.assetsDir) {
|
|
55
|
+
const target = join(outputPath, 'assets');
|
|
56
|
+
const dirCopied = copyDirectoryTree(skillDir.assetsDir, target);
|
|
57
|
+
copied.push(...dirCopied);
|
|
66
58
|
}
|
|
67
59
|
}
|
|
68
60
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-md.renderer.js","sourceRoot":"","sources":["../../src/renderer/skill-md.renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"skill-md.renderer.js","sourceRoot":"","sources":["../../src/renderer/skill-md.renderer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { SkillDirectory, AttachedFile } from '../core/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Build SkillDirectory by scanning a path (file or directory).
|
|
4
|
+
* For files, still returns a minimal SkillDirectory for context.
|
|
5
|
+
*/
|
|
6
|
+
export declare function scanSkillDirectory(localPath: string): SkillDirectory;
|
|
7
|
+
/**
|
|
8
|
+
* Convert a SkillDirectory scan result into AttachedFile[] array
|
|
9
|
+
* that can be stored in IntermediateSkill.metadata.attachedFiles.
|
|
10
|
+
*/
|
|
11
|
+
export declare function skillDirToAttachedFiles(dir: SkillDirectory): AttachedFile[];
|
|
12
|
+
//# sourceMappingURL=directory-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-scanner.d.ts","sourceRoot":"","sources":["../../src/utils/directory-scanner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAkBrE;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CA8DpE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,cAAc,GAAG,YAAY,EAAE,CAwC3E"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { readdirSync, statSync, existsSync } from 'node:fs';
|
|
2
|
+
import { join, relative } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* Known subdirectory names that carry skill-related files
|
|
5
|
+
*/
|
|
6
|
+
const KNOWN_DIRS = ['scripts', 'references', 'assets', 'templates', 'examples', 'rules'];
|
|
7
|
+
/**
|
|
8
|
+
* Scan a file path and determine its type based on parent directory.
|
|
9
|
+
*/
|
|
10
|
+
function classifyAttachedFile(filePath, rootPath) {
|
|
11
|
+
const rel = relative(rootPath, filePath).replace(/\\/g, '/');
|
|
12
|
+
if (rel.startsWith('scripts/'))
|
|
13
|
+
return 'script';
|
|
14
|
+
if (rel.startsWith('references/'))
|
|
15
|
+
return 'reference';
|
|
16
|
+
if (rel.startsWith('assets/'))
|
|
17
|
+
return 'asset';
|
|
18
|
+
return 'unknown';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Build SkillDirectory by scanning a path (file or directory).
|
|
22
|
+
* For files, still returns a minimal SkillDirectory for context.
|
|
23
|
+
*/
|
|
24
|
+
export function scanSkillDirectory(localPath) {
|
|
25
|
+
const stat = statSync(localPath);
|
|
26
|
+
const rootPath = stat.isDirectory() ? localPath : join(localPath, '..');
|
|
27
|
+
const name = rootPath.split('/').pop() || rootPath.split('\\').pop() || 'skill';
|
|
28
|
+
// Find the main skill file
|
|
29
|
+
let skillFile;
|
|
30
|
+
if (stat.isFile()) {
|
|
31
|
+
skillFile = localPath;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Look for known entry point filenames in priority order
|
|
35
|
+
const candidates = ['SKILL.md', 'SOUL.md', 'CLAUDE.md', 'claude.md', 'AGENTS.md'];
|
|
36
|
+
skillFile = '';
|
|
37
|
+
for (const candidate of candidates) {
|
|
38
|
+
const fullPath = join(localPath, candidate);
|
|
39
|
+
if (existsSync(fullPath) && statSync(fullPath).isFile()) {
|
|
40
|
+
skillFile = fullPath;
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (!skillFile) {
|
|
45
|
+
// Fallback: first .md file
|
|
46
|
+
const files = readdirSync(localPath);
|
|
47
|
+
const mdFile = files.find((f) => f.endsWith('.md') || f.endsWith('.cursorrules') || f.endsWith('.mdc'));
|
|
48
|
+
skillFile = mdFile ? join(localPath, mdFile) : localPath;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// Scan for known directories
|
|
52
|
+
let scriptsDir;
|
|
53
|
+
let referencesDir;
|
|
54
|
+
let assetsDir;
|
|
55
|
+
const extraFiles = [];
|
|
56
|
+
try {
|
|
57
|
+
const entries = readdirSync(rootPath, { withFileTypes: true });
|
|
58
|
+
for (const entry of entries) {
|
|
59
|
+
if (!entry.isDirectory())
|
|
60
|
+
continue;
|
|
61
|
+
if (entry.name === 'scripts')
|
|
62
|
+
scriptsDir = join(rootPath, 'scripts');
|
|
63
|
+
else if (entry.name === 'references')
|
|
64
|
+
referencesDir = join(rootPath, 'references');
|
|
65
|
+
else if (entry.name === 'assets')
|
|
66
|
+
assetsDir = join(rootPath, 'assets');
|
|
67
|
+
else if (KNOWN_DIRS.includes(entry.name)) {
|
|
68
|
+
// Scan extra directories for individual files
|
|
69
|
+
const dirFiles = readdirSync(join(rootPath, entry.name));
|
|
70
|
+
for (const f of dirFiles) {
|
|
71
|
+
extraFiles.push(join(rootPath, entry.name, f));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Not a directory or no access
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
name,
|
|
81
|
+
rootPath,
|
|
82
|
+
skillFile,
|
|
83
|
+
scriptsDir,
|
|
84
|
+
referencesDir,
|
|
85
|
+
assetsDir,
|
|
86
|
+
extraFiles,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Convert a SkillDirectory scan result into AttachedFile[] array
|
|
91
|
+
* that can be stored in IntermediateSkill.metadata.attachedFiles.
|
|
92
|
+
*/
|
|
93
|
+
export function skillDirToAttachedFiles(dir) {
|
|
94
|
+
const files = [];
|
|
95
|
+
const collectFiles = (dirPath, type) => {
|
|
96
|
+
if (!dirPath)
|
|
97
|
+
return;
|
|
98
|
+
try {
|
|
99
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
100
|
+
for (const entry of entries) {
|
|
101
|
+
if (entry.isFile()) {
|
|
102
|
+
files.push({
|
|
103
|
+
relativePath: join(dirPath.replace(dir.rootPath, ''), entry.name).replace(/^\//, ''),
|
|
104
|
+
absolutePath: join(dirPath, entry.name),
|
|
105
|
+
type,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// skip
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
collectFiles(dir.scriptsDir, 'script');
|
|
115
|
+
collectFiles(dir.referencesDir, 'reference');
|
|
116
|
+
collectFiles(dir.assetsDir, 'asset');
|
|
117
|
+
for (const extra of dir.extraFiles) {
|
|
118
|
+
try {
|
|
119
|
+
if (statSync(extra).isFile()) {
|
|
120
|
+
files.push({
|
|
121
|
+
relativePath: extra.replace(dir.rootPath, '').replace(/^\//, ''),
|
|
122
|
+
absolutePath: extra,
|
|
123
|
+
type: classifyAttachedFile(extra, dir.rootPath),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// skip
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return files;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=directory-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"directory-scanner.js","sourceRoot":"","sources":["../../src/utils/directory-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AttachedFile } from '../core/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Copy attached files from a skill's metadata into the output directory,
|
|
4
|
+
* preserving relative directory structure.
|
|
5
|
+
*/
|
|
6
|
+
export declare function copyAttachedFiles(attachedFiles: AttachedFile[] | undefined, outputPath: string): {
|
|
7
|
+
copied: string[];
|
|
8
|
+
skipped: string[];
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Copy all files from a source directory tree to a target directory.
|
|
12
|
+
* Used for copying scripts/references/assets directories entirely.
|
|
13
|
+
*/
|
|
14
|
+
export declare function copyDirectoryTree(sourceDir: string, targetDir: string): string[];
|
|
15
|
+
//# sourceMappingURL=file-copier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-copier.d.ts","sourceRoot":"","sources":["../../src/utils/file-copier.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,YAAY,EAAE,GAAG,SAAS,EACzC,UAAU,EAAE,MAAM,GACjB;IAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CAoCzC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BhF"}
|