@crewx/skill 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 ADDED
@@ -0,0 +1,7 @@
1
+ # @crewx/skill
2
+
3
+ Unified skill runner for CrewX - exec and doc skills.
4
+
5
+ ```bash
6
+ npx skill list
7
+ ```
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,168 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const engine_1 = require("./src/engine");
40
+ function loadTracer() {
41
+ const candidates = [
42
+ path.join(__dirname, '../../../../skills/lib/skill-tracer.js'),
43
+ path.join(__dirname, '../../../skills/lib/skill-tracer.js'),
44
+ ];
45
+ for (const p of candidates) {
46
+ try {
47
+ if (fs.existsSync(p))
48
+ return require(p);
49
+ }
50
+ catch { }
51
+ }
52
+ return null;
53
+ }
54
+ function showSkillHelp() {
55
+ const skillMd = path.join(__dirname, '..', 'SKILL.md');
56
+ if (fs.existsSync(skillMd)) {
57
+ process.stdout.write(fs.readFileSync(skillMd, 'utf-8'));
58
+ }
59
+ else {
60
+ printUsage();
61
+ }
62
+ }
63
+ const args = process.argv.slice(2);
64
+ const command = args[0];
65
+ function findProjectRoot() {
66
+ let dir = process.cwd();
67
+ while (dir !== path.dirname(dir)) {
68
+ if (require('fs').existsSync(path.join(dir, 'crewx.yaml')) ||
69
+ require('fs').existsSync(path.join(dir, 'skills'))) {
70
+ return dir;
71
+ }
72
+ dir = path.dirname(dir);
73
+ }
74
+ return process.cwd();
75
+ }
76
+ const projectRoot = findProjectRoot();
77
+ const engine = new engine_1.SkillEngine(projectRoot);
78
+ function printUsage() {
79
+ console.log(`
80
+ skill - CrewX Skill Runner
81
+
82
+ Usage:
83
+ npx skill list List all skills
84
+ npx skill <name> [args...] Run skill or show docs
85
+ npx skill <name> <SUBDOC> Show sub-document
86
+
87
+ Examples:
88
+ npx skill list
89
+ npx skill tsserver find Symbol
90
+ npx skill develop
91
+ npx skill develop DELEGATE
92
+ `);
93
+ }
94
+ function printList() {
95
+ const skills = engine.discover();
96
+ if (skills.length === 0) {
97
+ console.log('No skills found.');
98
+ return;
99
+ }
100
+ const maxName = Math.max(...skills.map(s => s.name.length), 4);
101
+ const maxType = 4;
102
+ console.log(`${'NAME'.padEnd(maxName)} ${'TYPE'.padEnd(maxType)} DESCRIPTION`);
103
+ console.log(`${'─'.repeat(maxName)} ${'─'.repeat(maxType)} ${'─'.repeat(40)}`);
104
+ for (const s of skills) {
105
+ console.log(`${s.name.padEnd(maxName)} ${s.type.padEnd(maxType)} ${s.description}`);
106
+ }
107
+ }
108
+ async function main() {
109
+ if (!command || command === '--help' || command === '-h') {
110
+ printUsage();
111
+ process.exit(0);
112
+ }
113
+ if (command === 'help') {
114
+ showSkillHelp();
115
+ process.exit(0);
116
+ }
117
+ if (command === 'list') {
118
+ printList();
119
+ process.exit(0);
120
+ }
121
+ const skillName = command;
122
+ const skillArgs = args.slice(1);
123
+ let skill;
124
+ try {
125
+ skill = engine.resolve(skillName);
126
+ }
127
+ catch (err) {
128
+ console.error(`Error: ${err.message}`);
129
+ process.exit(1);
130
+ }
131
+ if (skillArgs.length === 0) {
132
+ const doc = engine.readDoc(skill);
133
+ process.stdout.write(doc);
134
+ engine.log(skill, skillArgs, 0);
135
+ process.exit(0);
136
+ }
137
+ if (skill.type === 'exec' && skill.entrypoint) {
138
+ const exitCode = await engine.execute(skill, skillArgs);
139
+ engine.log(skill, skillArgs, exitCode);
140
+ process.exit(exitCode);
141
+ }
142
+ const subDoc = skillArgs[0];
143
+ try {
144
+ const doc = engine.readDoc(skill, subDoc);
145
+ process.stdout.write(doc);
146
+ engine.log(skill, skillArgs, 0);
147
+ process.exit(0);
148
+ }
149
+ catch (err) {
150
+ console.error(`Error: ${err.message}`);
151
+ engine.log(skill, skillArgs, 1);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ const tracer = loadTracer();
156
+ if (tracer) {
157
+ tracer.run('crewx/skill', main).catch((err) => {
158
+ console.error(`Error: ${err.message}`);
159
+ process.exit(1);
160
+ });
161
+ }
162
+ else {
163
+ main().catch(err => {
164
+ console.error(`Error: ${err.message}`);
165
+ process.exit(1);
166
+ });
167
+ }
168
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { SkillInfo } from './types';
2
+ export declare class SkillEngine {
3
+ private skillsDir;
4
+ private projectRoot;
5
+ constructor(projectRoot: string);
6
+ discover(): SkillInfo[];
7
+ resolve(name: string): SkillInfo;
8
+ execute(skill: SkillInfo, args: string[]): Promise<number>;
9
+ readDoc(skill: SkillInfo, subDoc?: string): string;
10
+ log(skill: SkillInfo, args: string[], exitCode: number): void;
11
+ private parseFrontmatter;
12
+ private findEntrypoint;
13
+ }
14
+ export { SkillInfo, SkillType, SkillLogEntry } from './types';
15
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA8C,MAAM,SAAS,CAAC;AAMhF,qBAAa,WAAW;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,WAAW,EAAE,MAAM;IAQ/B,QAAQ,IAAI,SAAS,EAAE;IA+BvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IA4BhC,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B1D,OAAO,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IAkBlD,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAmB7D,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,cAAc;CAoCvB;AAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.SkillEngine = void 0;
37
+ const fs = __importStar(require("fs"));
38
+ const path = __importStar(require("path"));
39
+ const child_process_1 = require("child_process");
40
+ const SKILL_MD = 'SKILL.md';
41
+ const ENTRY_CANDIDATES = ['index.js', 'main.js'];
42
+ const LOG_FILE = '.crewx/.skill-log.jsonl';
43
+ class SkillEngine {
44
+ constructor(projectRoot) {
45
+ this.projectRoot = projectRoot;
46
+ this.skillsDir = path.join(projectRoot, 'skills');
47
+ }
48
+ discover() {
49
+ if (!fs.existsSync(this.skillsDir))
50
+ return [];
51
+ const entries = fs.readdirSync(this.skillsDir, { withFileTypes: true });
52
+ const skills = [];
53
+ for (const entry of entries) {
54
+ if (!entry.isDirectory())
55
+ continue;
56
+ const dir = path.join(this.skillsDir, entry.name);
57
+ const skillMd = path.join(dir, SKILL_MD);
58
+ if (!fs.existsSync(skillMd))
59
+ continue;
60
+ const fm = this.parseFrontmatter(skillMd);
61
+ const entrypoint = this.findEntrypoint(dir, entry.name);
62
+ skills.push({
63
+ name: fm.name || entry.name,
64
+ type: entrypoint ? 'exec' : 'doc',
65
+ description: fm.description || '',
66
+ version: fm.version,
67
+ dir,
68
+ entrypoint,
69
+ });
70
+ }
71
+ return skills.sort((a, b) => a.name.localeCompare(b.name));
72
+ }
73
+ resolve(name) {
74
+ const dir = path.join(this.skillsDir, name);
75
+ if (!fs.existsSync(dir) || !fs.statSync(dir).isDirectory()) {
76
+ throw new Error(`Skill not found: ${name}`);
77
+ }
78
+ const skillMd = path.join(dir, SKILL_MD);
79
+ if (!fs.existsSync(skillMd)) {
80
+ throw new Error(`Not a skill (no SKILL.md): ${name}`);
81
+ }
82
+ const fm = this.parseFrontmatter(skillMd);
83
+ const entrypoint = this.findEntrypoint(dir, name);
84
+ return {
85
+ name: fm.name || name,
86
+ type: entrypoint ? 'exec' : 'doc',
87
+ description: fm.description || '',
88
+ version: fm.version,
89
+ dir,
90
+ entrypoint,
91
+ };
92
+ }
93
+ execute(skill, args) {
94
+ if (!skill.entrypoint) {
95
+ throw new Error(`Skill '${skill.name}' has no entrypoint`);
96
+ }
97
+ return new Promise((resolve) => {
98
+ const child = (0, child_process_1.spawn)('node', [skill.entrypoint, ...args], {
99
+ cwd: this.projectRoot,
100
+ stdio: 'inherit',
101
+ env: process.env,
102
+ });
103
+ child.on('error', (err) => {
104
+ console.error(`Error spawning skill '${skill.name}': ${err.message}`);
105
+ resolve(1);
106
+ });
107
+ child.on('close', (code) => {
108
+ resolve(code ?? 1);
109
+ });
110
+ });
111
+ }
112
+ readDoc(skill, subDoc) {
113
+ let filePath;
114
+ if (subDoc) {
115
+ filePath = path.join(skill.dir, `${subDoc}.md`);
116
+ if (!fs.existsSync(filePath)) {
117
+ throw new Error(`Document not found: ${subDoc}.md in skill '${skill.name}'`);
118
+ }
119
+ }
120
+ else {
121
+ filePath = path.join(skill.dir, SKILL_MD);
122
+ }
123
+ return fs.readFileSync(filePath, 'utf-8');
124
+ }
125
+ log(skill, args, exitCode) {
126
+ const logPath = path.join(this.projectRoot, LOG_FILE);
127
+ const logDir = path.dirname(logPath);
128
+ if (!fs.existsSync(logDir)) {
129
+ fs.mkdirSync(logDir, { recursive: true });
130
+ }
131
+ const entry = {
132
+ ts: new Date().toISOString(),
133
+ agent: process.env.CREWX_AGENT_ID || 'unknown',
134
+ skill: skill.name,
135
+ args,
136
+ exit: exitCode,
137
+ type: skill.type,
138
+ };
139
+ fs.appendFileSync(logPath, JSON.stringify(entry) + '\n');
140
+ }
141
+ parseFrontmatter(filePath) {
142
+ const content = fs.readFileSync(filePath, 'utf-8');
143
+ try {
144
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
145
+ if (match === null)
146
+ return {};
147
+ const block = match[1] ?? '';
148
+ const result = {};
149
+ for (const line of block.split('\n')) {
150
+ const colonIdx = line.indexOf(':');
151
+ if (colonIdx === -1)
152
+ continue;
153
+ const key = line.slice(0, colonIdx).trim();
154
+ const val = line.slice(colonIdx + 1).trim();
155
+ if (key)
156
+ result[key] = val;
157
+ }
158
+ return result;
159
+ }
160
+ catch {
161
+ return {};
162
+ }
163
+ }
164
+ findEntrypoint(dir, skillName) {
165
+ const pkgPath = path.join(dir, 'package.json');
166
+ if (fs.existsSync(pkgPath)) {
167
+ try {
168
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
169
+ if (pkg.bin) {
170
+ const binValue = typeof pkg.bin === 'string'
171
+ ? pkg.bin
172
+ : Object.values(pkg.bin)[0];
173
+ if (binValue) {
174
+ const resolved = path.resolve(dir, binValue);
175
+ if (fs.existsSync(resolved))
176
+ return resolved;
177
+ }
178
+ }
179
+ if (pkg.main) {
180
+ const resolved = path.resolve(dir, pkg.main);
181
+ if (fs.existsSync(resolved))
182
+ return resolved;
183
+ }
184
+ }
185
+ catch {
186
+ }
187
+ }
188
+ const namedJs = path.join(dir, `${skillName}.js`);
189
+ if (fs.existsSync(namedJs))
190
+ return namedJs;
191
+ for (const candidate of ENTRY_CANDIDATES) {
192
+ const candidatePath = path.join(dir, candidate);
193
+ if (fs.existsSync(candidatePath))
194
+ return candidatePath;
195
+ }
196
+ return undefined;
197
+ }
198
+ }
199
+ exports.SkillEngine = SkillEngine;
200
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export type SkillType = 'exec' | 'doc';
2
+ export interface SkillInfo {
3
+ name: string;
4
+ type: SkillType;
5
+ description: string;
6
+ version?: string;
7
+ dir: string;
8
+ entrypoint?: string;
9
+ }
10
+ export interface SkillLogEntry {
11
+ ts: string;
12
+ agent: string;
13
+ skill: string;
14
+ args: string[];
15
+ exit: number;
16
+ type: SkillType;
17
+ }
18
+ export interface SkillFrontmatter {
19
+ name?: string;
20
+ description?: string;
21
+ version?: string;
22
+ [key: string]: unknown;
23
+ }
24
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,KAAK,CAAC;AAEvC,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@crewx/skill",
3
+ "version": "0.1.0",
4
+ "description": "Unified skill runner for CrewX - exec and doc skills via npx skill",
5
+ "type": "commonjs",
6
+ "main": "dist/src/engine.js",
7
+ "types": "dist/src/engine.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "require": "./dist/src/engine.js",
11
+ "types": "./dist/src/engine.d.ts"
12
+ }
13
+ },
14
+ "bin": {
15
+ "skill": "./dist/cli.js"
16
+ },
17
+ "files": ["dist"],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "ts-node cli.ts",
21
+ "clean": "rm -rf dist"
22
+ },
23
+ "dependencies": {
24
+ "gray-matter": "^4.0.3"
25
+ },
26
+ "keywords": ["crewx", "skill", "cli"],
27
+ "license": "MIT"
28
+ }