transskill 0.1.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/README.md +187 -0
- package/README.zh.md +190 -0
- package/dist/core/errors.d.ts +8 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +12 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/types.d.ts +105 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +249 -0
- package/dist/index.js.map +1 -0
- package/dist/mapper/default.mapper.d.ts +18 -0
- package/dist/mapper/default.mapper.d.ts.map +1 -0
- package/dist/mapper/default.mapper.js +107 -0
- package/dist/mapper/default.mapper.js.map +1 -0
- package/dist/mapper/index.d.ts +3 -0
- package/dist/mapper/index.d.ts.map +1 -0
- package/dist/mapper/index.js +2 -0
- package/dist/mapper/index.js.map +1 -0
- package/dist/mapper/mapper.interface.d.ts +25 -0
- package/dist/mapper/mapper.interface.d.ts.map +1 -0
- package/dist/mapper/mapper.interface.js +2 -0
- package/dist/mapper/mapper.interface.js.map +1 -0
- package/dist/parser/cursor-rules.parser.d.ts +16 -0
- package/dist/parser/cursor-rules.parser.d.ts.map +1 -0
- package/dist/parser/cursor-rules.parser.js +38 -0
- package/dist/parser/cursor-rules.parser.js.map +1 -0
- package/dist/parser/index.d.ts +6 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +5 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/mdc.parser.d.ts +17 -0
- package/dist/parser/mdc.parser.d.ts.map +1 -0
- package/dist/parser/mdc.parser.js +62 -0
- package/dist/parser/mdc.parser.js.map +1 -0
- package/dist/parser/parser-registry.d.ts +25 -0
- package/dist/parser/parser-registry.d.ts.map +1 -0
- package/dist/parser/parser-registry.js +44 -0
- package/dist/parser/parser-registry.js.map +1 -0
- package/dist/parser/parser.interface.d.ts +16 -0
- package/dist/parser/parser.interface.d.ts.map +1 -0
- package/dist/parser/parser.interface.js +2 -0
- package/dist/parser/parser.interface.js.map +1 -0
- package/dist/parser/skill-md.parser.d.ts +17 -0
- package/dist/parser/skill-md.parser.d.ts.map +1 -0
- package/dist/parser/skill-md.parser.js +117 -0
- package/dist/parser/skill-md.parser.js.map +1 -0
- package/dist/renderer/cursor-rules.renderer.d.ts +17 -0
- package/dist/renderer/cursor-rules.renderer.d.ts.map +1 -0
- package/dist/renderer/cursor-rules.renderer.js +61 -0
- package/dist/renderer/cursor-rules.renderer.js.map +1 -0
- package/dist/renderer/index.d.ts +6 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +5 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/mdc.renderer.d.ts +15 -0
- package/dist/renderer/mdc.renderer.d.ts.map +1 -0
- package/dist/renderer/mdc.renderer.js +52 -0
- package/dist/renderer/mdc.renderer.js.map +1 -0
- package/dist/renderer/renderer-registry.d.ts +6 -0
- package/dist/renderer/renderer-registry.d.ts.map +1 -0
- package/dist/renderer/renderer-registry.js +16 -0
- package/dist/renderer/renderer-registry.js.map +1 -0
- package/dist/renderer/renderer.interface.d.ts +15 -0
- package/dist/renderer/renderer.interface.d.ts.map +1 -0
- package/dist/renderer/renderer.interface.js +2 -0
- package/dist/renderer/renderer.interface.js.map +1 -0
- package/dist/renderer/skill-md.renderer.d.ts +15 -0
- package/dist/renderer/skill-md.renderer.d.ts.map +1 -0
- package/dist/renderer/skill-md.renderer.js +76 -0
- package/dist/renderer/skill-md.renderer.js.map +1 -0
- package/dist/resolver/github.resolver.d.ts +11 -0
- package/dist/resolver/github.resolver.d.ts.map +1 -0
- package/dist/resolver/github.resolver.js +89 -0
- package/dist/resolver/github.resolver.js.map +1 -0
- package/dist/resolver/index.d.ts +5 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +4 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/local.resolver.d.ts +11 -0
- package/dist/resolver/local.resolver.d.ts.map +1 -0
- package/dist/resolver/local.resolver.js +55 -0
- package/dist/resolver/local.resolver.js.map +1 -0
- package/dist/resolver/resolver-registry.d.ts +14 -0
- package/dist/resolver/resolver-registry.d.ts.map +1 -0
- package/dist/resolver/resolver-registry.js +31 -0
- package/dist/resolver/resolver-registry.js.map +1 -0
- package/dist/resolver/resolver.interface.d.ts +12 -0
- package/dist/resolver/resolver.interface.d.ts.map +1 -0
- package/dist/resolver/resolver.interface.js +2 -0
- package/dist/resolver/resolver.interface.js.map +1 -0
- package/dist/utils/file-utils.d.ts +9 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +37 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/format-detector.d.ts +11 -0
- package/dist/utils/format-detector.d.ts.map +1 -0
- package/dist/utils/format-detector.js +42 -0
- package/dist/utils/format-detector.js.map +1 -0
- package/dist/utils/logger.d.ts +7 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +20 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.resolver.d.ts","sourceRoot":"","sources":["../../src/resolver/github.resolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA4CtD;;;GAGG;AACH,qBAAa,cAAe,YAAW,aAAa;IAClD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI1B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CA4DrD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import { TransSkillError } from '../core/errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse GitHub references from various input formats.
|
|
8
|
+
*/
|
|
9
|
+
function parseGitHubRef(input) {
|
|
10
|
+
let owner;
|
|
11
|
+
let repo;
|
|
12
|
+
let subpath;
|
|
13
|
+
// gh:owner/repo[/subpath]
|
|
14
|
+
const ghMatch = input.match(/^gh:([^/]+)\/([^/]+)(?:\/(.+))?$/);
|
|
15
|
+
if (ghMatch) {
|
|
16
|
+
owner = ghMatch[1];
|
|
17
|
+
repo = ghMatch[2].replace(/\.git$/, '');
|
|
18
|
+
subpath = ghMatch[3];
|
|
19
|
+
return { owner, repo, subpath };
|
|
20
|
+
}
|
|
21
|
+
// https://github.com/owner/repo[/subpath]
|
|
22
|
+
const urlMatch = input.match(/^https?:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\/(.+))?$/);
|
|
23
|
+
if (urlMatch) {
|
|
24
|
+
owner = urlMatch[1];
|
|
25
|
+
repo = urlMatch[2].replace(/\.git$/, '');
|
|
26
|
+
subpath = urlMatch[3];
|
|
27
|
+
return { owner, repo, subpath };
|
|
28
|
+
}
|
|
29
|
+
throw new TransSkillError(`Invalid GitHub reference: "${input}". Use gh:owner/repo or https://github.com/owner/repo`, 'UNSUPPORTED_INPUT', { input });
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves GitHub repository references by cloning them to a temporary directory.
|
|
33
|
+
* Supports: gh:owner/repo, gh:owner/repo/subpath, https://github.com/owner/repo
|
|
34
|
+
*/
|
|
35
|
+
export class GitHubResolver {
|
|
36
|
+
supports(input) {
|
|
37
|
+
return /^gh:/i.test(input) || /^https?:\/\/github\.com\//i.test(input);
|
|
38
|
+
}
|
|
39
|
+
async resolve(input) {
|
|
40
|
+
const ref = parseGitHubRef(input);
|
|
41
|
+
const repoUrl = `https://github.com/${ref.owner}/${ref.repo}.git`;
|
|
42
|
+
// Create a temporary directory for cloning
|
|
43
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'transskill-'));
|
|
44
|
+
try {
|
|
45
|
+
// Shallow clone for speed
|
|
46
|
+
await execa('git', ['clone', '--depth', '1', repoUrl, tmpDir], {
|
|
47
|
+
timeout: 30_000,
|
|
48
|
+
});
|
|
49
|
+
// If subpath is specified, verify it exists
|
|
50
|
+
const targetPath = ref.subpath ? join(tmpDir, ref.subpath) : tmpDir;
|
|
51
|
+
// Verify the target path exists
|
|
52
|
+
const { accessSync, statSync } = await import('node:fs');
|
|
53
|
+
try {
|
|
54
|
+
accessSync(targetPath);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
throw new TransSkillError(`Subpath "${ref.subpath}" does not exist in repository ${ref.owner}/${ref.repo}`, 'FILE_NOT_FOUND', { repo: `${ref.owner}/${ref.repo}`, subpath: ref.subpath });
|
|
58
|
+
}
|
|
59
|
+
const stat = statSync(targetPath);
|
|
60
|
+
return {
|
|
61
|
+
localPath: targetPath,
|
|
62
|
+
source: { kind: 'github', repo: `${ref.owner}/${ref.repo}`, subpath: ref.subpath },
|
|
63
|
+
type: stat.isFile() ? 'file' : 'directory',
|
|
64
|
+
isRemote: true,
|
|
65
|
+
cleanup: async () => {
|
|
66
|
+
try {
|
|
67
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Non-fatal: temp files will be cleaned up by the OS eventually
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// Clean up on failure
|
|
77
|
+
try {
|
|
78
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
// ignore cleanup errors
|
|
82
|
+
}
|
|
83
|
+
if (err instanceof TransSkillError)
|
|
84
|
+
throw err;
|
|
85
|
+
throw new TransSkillError(`Failed to clone repository ${ref.owner}/${ref.repo}. Make sure it exists and is public.`, 'GIT_CLONE_FAILED', { repo: `${ref.owner}/${ref.repo}`, originalError: String(err) });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=github.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.resolver.js","sourceRoot":"","sources":["../../src/resolver/github.resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { resolveInput, registerResolver, getRegisteredResolvers } from './resolver-registry.js';
|
|
2
|
+
export { LocalResolver } from './local.resolver.js';
|
|
3
|
+
export { GitHubResolver } from './github.resolver.js';
|
|
4
|
+
export type { InputResolver } from './resolver.interface.js';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resolver/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { InputResolver } from './resolver.interface.js';
|
|
2
|
+
import type { ResolvedInput } from '../core/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves local file and directory paths.
|
|
5
|
+
* Supports: ./path, ../path, /absolute/path, ~/path, or plain names that exist.
|
|
6
|
+
*/
|
|
7
|
+
export declare class LocalResolver implements InputResolver {
|
|
8
|
+
supports(input: string): boolean;
|
|
9
|
+
resolve(input: string): Promise<ResolvedInput>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=local.resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.resolver.d.ts","sourceRoot":"","sources":["../../src/resolver/local.resolver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGtD;;;GAGG;AACH,qBAAa,aAAc,YAAW,aAAa;IACjD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAqB1B,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAsCrD"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { accessSync, constants, statSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { TransSkillError } from '../core/errors.js';
|
|
4
|
+
/**
|
|
5
|
+
* Resolves local file and directory paths.
|
|
6
|
+
* Supports: ./path, ../path, /absolute/path, ~/path, or plain names that exist.
|
|
7
|
+
*/
|
|
8
|
+
export class LocalResolver {
|
|
9
|
+
supports(input) {
|
|
10
|
+
// GitHub URLs are handled by GitHubResolver, not here
|
|
11
|
+
if (/^gh:/i.test(input) || /^https?:\/\/github\.com\//i.test(input)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
// Check if it looks like a local path or if the path actually exists
|
|
15
|
+
if (input.startsWith('.') || input.startsWith('/') || input.startsWith('~')) {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
// Plain name that exists as a file or directory
|
|
19
|
+
try {
|
|
20
|
+
const resolved = resolve(input);
|
|
21
|
+
accessSync(resolved, constants.F_OK);
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
async resolve(input) {
|
|
29
|
+
// Expand ~ to home directory
|
|
30
|
+
const normalized = input.startsWith('~')
|
|
31
|
+
? input.replace('~', process.env.HOME || process.env.USERPROFILE || '')
|
|
32
|
+
: input;
|
|
33
|
+
const absPath = resolve(normalized);
|
|
34
|
+
// Verify the path exists
|
|
35
|
+
try {
|
|
36
|
+
accessSync(absPath, constants.F_OK);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
throw new TransSkillError(`Path does not exist: ${absPath}`, 'FILE_NOT_FOUND', { input, resolved: absPath });
|
|
40
|
+
}
|
|
41
|
+
const stat = statSync(absPath);
|
|
42
|
+
const isFile = stat.isFile();
|
|
43
|
+
const isDir = stat.isDirectory();
|
|
44
|
+
if (!isFile && !isDir) {
|
|
45
|
+
throw new TransSkillError(`Path is neither a file nor a directory: ${absPath}`, 'UNSUPPORTED_INPUT', { input, resolved: absPath });
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
localPath: absPath,
|
|
49
|
+
source: { kind: isFile ? 'local-file' : 'local-directory', path: absPath },
|
|
50
|
+
type: isFile ? 'file' : 'directory',
|
|
51
|
+
isRemote: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=local.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.resolver.js","sourceRoot":"","sources":["../../src/resolver/local.resolver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,OAAO,aAAa;IACxB,QAAQ,CAAC,KAAa;QACpB,sDAAsD;QACtD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,qEAAqE;QACrE,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5E,OAAO,IAAI,CAAC;QACd,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAChC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,KAAa;QACzB,6BAA6B;QAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YACtC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;YACvE,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;QAEpC,yBAAyB;QACzB,IAAI,CAAC;YACH,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,eAAe,CACvB,wBAAwB,OAAO,EAAE,EACjC,gBAAgB,EAChB,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAC7B,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,eAAe,CACvB,2CAA2C,OAAO,EAAE,EACpD,mBAAmB,EACnB,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAC7B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,SAAS,EAAE,OAAO;YAClB,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE;YAC1E,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW;YACnC,QAAQ,EAAE,KAAK;SAChB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { InputResolver } from './resolver.interface.js';
|
|
2
|
+
/**
|
|
3
|
+
* Register an input resolver (ordered by priority).
|
|
4
|
+
* First registered = checked first.
|
|
5
|
+
*/
|
|
6
|
+
export declare function registerResolver(resolver: InputResolver): void;
|
|
7
|
+
/**
|
|
8
|
+
* Find the first resolver that can handle the given input and resolve it.
|
|
9
|
+
* Throws if no resolver supports the input.
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveInput(input: string): Promise<ReturnType<InputResolver['resolve']>>;
|
|
12
|
+
/** Get all registered resolver descriptions (for debugging/list-formats) */
|
|
13
|
+
export declare function getRegisteredResolvers(): string[];
|
|
14
|
+
//# sourceMappingURL=resolver-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver-registry.d.ts","sourceRoot":"","sources":["../../src/resolver/resolver-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAK7D;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI,CAE9D;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,CAoB/F;AAED,4EAA4E;AAC5E,wBAAgB,sBAAsB,IAAI,MAAM,EAAE,CAEjD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { TransSkillError } from '../core/errors.js';
|
|
2
|
+
const resolvers = [];
|
|
3
|
+
/**
|
|
4
|
+
* Register an input resolver (ordered by priority).
|
|
5
|
+
* First registered = checked first.
|
|
6
|
+
*/
|
|
7
|
+
export function registerResolver(resolver) {
|
|
8
|
+
resolvers.push(resolver);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Find the first resolver that can handle the given input and resolve it.
|
|
12
|
+
* Throws if no resolver supports the input.
|
|
13
|
+
*/
|
|
14
|
+
export async function resolveInput(input) {
|
|
15
|
+
for (const resolver of resolvers) {
|
|
16
|
+
if (resolver.supports(input)) {
|
|
17
|
+
try {
|
|
18
|
+
return await resolver.resolve(input);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
throw new TransSkillError(`Failed to resolve input: ${input}`, 'INPUT_RESOLVE_FAILED', { originalError: String(err) });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
throw new TransSkillError(`Unsupported input: "${input}". Use a local path (./, /, ~) or GitHub URL (gh:user/repo, https://github.com/...)`, 'UNSUPPORTED_INPUT', { input });
|
|
26
|
+
}
|
|
27
|
+
/** Get all registered resolver descriptions (for debugging/list-formats) */
|
|
28
|
+
export function getRegisteredResolvers() {
|
|
29
|
+
return resolvers.map((r) => r.constructor.name);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=resolver-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver-registry.js","sourceRoot":"","sources":["../../src/resolver/resolver-registry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,SAAS,GAAoB,EAAE,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAuB;IACtD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAa;IAC9C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,eAAe,CACvB,4BAA4B,KAAK,EAAE,EACnC,sBAAsB,EACtB,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/B,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,IAAI,eAAe,CACvB,uBAAuB,KAAK,qFAAqF,EACjH,mBAAmB,EACnB,EAAE,KAAK,EAAE,CACV,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,sBAAsB;IACpC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { ResolvedInput } from '../core/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* InputResolver interface - resolves user input strings into local file paths.
|
|
4
|
+
* Supports local files/directories and remote sources like GitHub.
|
|
5
|
+
*/
|
|
6
|
+
export interface InputResolver {
|
|
7
|
+
/** Check if this resolver can handle the given input string */
|
|
8
|
+
supports(input: string): boolean;
|
|
9
|
+
/** Resolve the input to a local path for processing */
|
|
10
|
+
resolve(input: string): Promise<ResolvedInput>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=resolver.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.interface.d.ts","sourceRoot":"","sources":["../../src/resolver/resolver.interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAEjC,uDAAuD;IACvD,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.interface.js","sourceRoot":"","sources":["../../src/resolver/resolver.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Read file content as string */
|
|
2
|
+
export declare function readInput(filePath: string): string;
|
|
3
|
+
/** Write string content to file, creating parent directories if needed */
|
|
4
|
+
export declare function writeOutput(filePath: string, content: string): void;
|
|
5
|
+
/** Ensure a directory exists */
|
|
6
|
+
export declare function ensureDir(dirPath: string): void;
|
|
7
|
+
/** Get a human-readable relative path for display */
|
|
8
|
+
export declare function displayPath(absPath: string, cwd?: string): string;
|
|
9
|
+
//# sourceMappingURL=file-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.d.ts","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAIA,kCAAkC;AAClC,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,0EAA0E;AAC1E,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAMnE;AAED,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED,qDAAqD;AACrD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,CAOhF"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
2
|
+
import { dirname, relative } from 'node:path';
|
|
3
|
+
import { TransSkillError } from '../core/errors.js';
|
|
4
|
+
/** Read file content as string */
|
|
5
|
+
export function readInput(filePath) {
|
|
6
|
+
try {
|
|
7
|
+
return readFileSync(filePath, 'utf-8');
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
throw new TransSkillError(`Failed to read file: ${filePath}`, 'FILE_NOT_FOUND', { path: filePath, originalError: String(err) });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/** Write string content to file, creating parent directories if needed */
|
|
14
|
+
export function writeOutput(filePath, content) {
|
|
15
|
+
const dir = dirname(filePath);
|
|
16
|
+
if (!existsSync(dir)) {
|
|
17
|
+
mkdirSync(dir, { recursive: true });
|
|
18
|
+
}
|
|
19
|
+
writeFileSync(filePath, content, 'utf-8');
|
|
20
|
+
}
|
|
21
|
+
/** Ensure a directory exists */
|
|
22
|
+
export function ensureDir(dirPath) {
|
|
23
|
+
if (!existsSync(dirPath)) {
|
|
24
|
+
mkdirSync(dirPath, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** Get a human-readable relative path for display */
|
|
28
|
+
export function displayPath(absPath, cwd = process.cwd()) {
|
|
29
|
+
try {
|
|
30
|
+
const rel = relative(cwd, absPath);
|
|
31
|
+
return rel.startsWith('..') ? absPath : rel;
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return absPath;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=file-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-utils.js","sourceRoot":"","sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAgB,MAAM,WAAW,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,kCAAkC;AAClC,MAAM,UAAU,SAAS,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,eAAe,CACvB,wBAAwB,QAAQ,EAAE,EAClC,gBAAgB,EAChB,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAC/C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,CAAC;IACD,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,MAAc,OAAO,CAAC,GAAG,EAAE;IACtE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACnC,OAAO,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { FormatType } from '../core/types.js';
|
|
2
|
+
export interface FormatDetectionResult {
|
|
3
|
+
format: FormatType;
|
|
4
|
+
isDirectory: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Detect format from a local file or directory path.
|
|
8
|
+
* For directories, checks if it contains a SKILL.md.
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectFormatFromPath(localPath: string): FormatDetectionResult;
|
|
11
|
+
//# sourceMappingURL=format-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-detector.d.ts","sourceRoot":"","sources":["../../src/utils/format-detector.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,qBAAqB,CA4C7E"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { readFileSync, statSync, existsSync } from 'node:fs';
|
|
2
|
+
import { extname, join } from 'node:path';
|
|
3
|
+
import { detectFormat } from '../parser/parser-registry.js';
|
|
4
|
+
import { TransSkillError } from '../core/errors.js';
|
|
5
|
+
/**
|
|
6
|
+
* Detect format from a local file or directory path.
|
|
7
|
+
* For directories, checks if it contains a SKILL.md.
|
|
8
|
+
*/
|
|
9
|
+
export function detectFormatFromPath(localPath) {
|
|
10
|
+
const stat = statSync(localPath);
|
|
11
|
+
if (stat.isDirectory()) {
|
|
12
|
+
// Directory mode - check for SKILL.md
|
|
13
|
+
if (existsSync(join(localPath, 'SKILL.md'))) {
|
|
14
|
+
return { format: 'skill.md', isDirectory: true };
|
|
15
|
+
}
|
|
16
|
+
return { format: 'skill.md', isDirectory: true };
|
|
17
|
+
}
|
|
18
|
+
// File mode - detect by extension and content
|
|
19
|
+
const ext = extname(localPath).toLowerCase();
|
|
20
|
+
// Quick extension-based detection
|
|
21
|
+
const extMap = {
|
|
22
|
+
'.cursorrules': '.cursorrules',
|
|
23
|
+
'.mdc': '.mdc',
|
|
24
|
+
};
|
|
25
|
+
if (ext in extMap) {
|
|
26
|
+
return { format: extMap[ext], isDirectory: false };
|
|
27
|
+
}
|
|
28
|
+
if (ext === '.json') {
|
|
29
|
+
return { format: 'mcp.json', isDirectory: false };
|
|
30
|
+
}
|
|
31
|
+
if (ext === '.md') {
|
|
32
|
+
return { format: 'skill.md', isDirectory: false };
|
|
33
|
+
}
|
|
34
|
+
// Fallback to content-based detection
|
|
35
|
+
const content = readFileSync(localPath, 'utf-8');
|
|
36
|
+
const detected = detectFormat(content, localPath);
|
|
37
|
+
if (detected) {
|
|
38
|
+
return { format: detected, isDirectory: false };
|
|
39
|
+
}
|
|
40
|
+
throw new TransSkillError(`Unable to detect format for: ${localPath}. Use --format to specify manually.`, 'UNSUPPORTED_INPUT', { localPath });
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=format-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-detector.js","sourceRoot":"","sources":["../../src/utils/format-detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEjC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACvB,sCAAsC;QACtC,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QACnD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IACnD,CAAC;IAED,8CAA8C;IAC9C,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IAE7C,kCAAkC;IAClC,MAAM,MAAM,GAA+B;QACzC,cAAc,EAAE,cAAc;QAC9B,MAAM,EAAE,MAAM;KACf,CAAC;IAEF,IAAI,GAAG,IAAI,MAAM,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IAED,sCAAsC;IACtC,MAAM,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,IAAI,eAAe,CACvB,gCAAgC,SAAS,qCAAqC,EAC9E,mBAAmB,EACnB,EAAE,SAAS,EAAE,CACd,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function logSuccess(message: string): void;
|
|
2
|
+
export declare function logWarning(message: string): void;
|
|
3
|
+
export declare function logError(message: string): void;
|
|
4
|
+
export declare function logInfo(message: string): void;
|
|
5
|
+
export declare function logDryRun(message: string): void;
|
|
6
|
+
export declare function logTitle(title: string): void;
|
|
7
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE7C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAE5C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
export function logSuccess(message) {
|
|
3
|
+
console.log(`${chalk.green('✅')} ${message}`);
|
|
4
|
+
}
|
|
5
|
+
export function logWarning(message) {
|
|
6
|
+
console.log(`${chalk.yellow('⚠️')} ${message}`);
|
|
7
|
+
}
|
|
8
|
+
export function logError(message) {
|
|
9
|
+
console.log(`${chalk.red('❌')} ${message}`);
|
|
10
|
+
}
|
|
11
|
+
export function logInfo(message) {
|
|
12
|
+
console.log(`${chalk.blue('ℹ️')} ${message}`);
|
|
13
|
+
}
|
|
14
|
+
export function logDryRun(message) {
|
|
15
|
+
console.log(`${chalk.cyan('🔍')} ${chalk.dim('[DRY-RUN]')} ${message}`);
|
|
16
|
+
}
|
|
17
|
+
export function logTitle(title) {
|
|
18
|
+
console.log(`\n${chalk.bold(title)}`);
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "transskill",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Cross-platform AI agent skill converter - Write once, run on any agent",
|
|
5
|
+
"bin": {
|
|
6
|
+
"transskill": "dist/index.js"
|
|
7
|
+
},
|
|
8
|
+
"scripts": {
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"dev": "tsc --watch",
|
|
11
|
+
"test": "vitest run",
|
|
12
|
+
"test:watch": "vitest",
|
|
13
|
+
"lint": "eslint src/",
|
|
14
|
+
"format": "prettier --write src/",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist/"
|
|
19
|
+
],
|
|
20
|
+
"keywords": [
|
|
21
|
+
"ai-agent",
|
|
22
|
+
"skill",
|
|
23
|
+
"converter",
|
|
24
|
+
"claude-code",
|
|
25
|
+
"cursor",
|
|
26
|
+
"openclaw",
|
|
27
|
+
"mcp"
|
|
28
|
+
],
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"type": "module",
|
|
31
|
+
"engines": {
|
|
32
|
+
"node": ">=18"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"chalk": "^5.4.1",
|
|
36
|
+
"commander": "^13.1.0",
|
|
37
|
+
"execa": "^9.5.2",
|
|
38
|
+
"gray-matter": "^4.0.3",
|
|
39
|
+
"js-yaml": "^4.1.0",
|
|
40
|
+
"tempy": "^3.1.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^22.14.0",
|
|
44
|
+
"eslint": "^9.24.0",
|
|
45
|
+
"prettier": "^3.5.3",
|
|
46
|
+
"typescript": "^5.8.3",
|
|
47
|
+
"vitest": "^3.1.2"
|
|
48
|
+
}
|
|
49
|
+
}
|