claude-skills-cli 0.0.1

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.
@@ -0,0 +1,48 @@
1
+ import { basename } from 'path';
2
+ import { SkillValidator } from '../core/validator.js';
3
+ import { info, error, success } from '../utils/output.js';
4
+ export function validate_command(options) {
5
+ const { skill_path, strict } = options;
6
+ const skill_name = basename(skill_path);
7
+ info(`Validating skill: ${skill_name}`);
8
+ console.log('='.repeat(60));
9
+ const validator = new SkillValidator(skill_path);
10
+ const result = validator.validate_all();
11
+ // Print errors
12
+ if (result.errors.length > 0) {
13
+ console.log('\n❌ Errors:');
14
+ for (const err of result.errors) {
15
+ console.log(` ${err}`);
16
+ }
17
+ }
18
+ // Print warnings
19
+ if (result.warnings.length > 0) {
20
+ console.log('\n⚠️ Warnings:');
21
+ for (const warn of result.warnings) {
22
+ console.log(` ${warn}`);
23
+ }
24
+ }
25
+ // Print final status
26
+ if (!result.errors.length && !result.warnings.length) {
27
+ console.log('');
28
+ success('Skill is valid!');
29
+ }
30
+ else if (!result.errors.length) {
31
+ console.log('');
32
+ success('Skill is valid (with warnings)');
33
+ }
34
+ else {
35
+ console.log('');
36
+ error(`Skill validation failed with ${result.errors.length} error(s)`);
37
+ }
38
+ // Handle exit codes
39
+ if (!result.is_valid) {
40
+ process.exit(1);
41
+ }
42
+ if (strict && result.warnings.length > 0) {
43
+ console.log('\n❌ Failed in strict mode due to warnings');
44
+ process.exit(1);
45
+ }
46
+ process.exit(0);
47
+ }
48
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAW,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAEnE,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IACvC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,EAAE,CAAC;IAExC,eAAe;IACf,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC/B,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,CAAC,MAAM,WAAW,CAAC,CAAC;IACzE,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,90 @@
1
+ export const SKILL_MD_TEMPLATE = (name, description, title) => `---
2
+ name: ${name}
3
+ description: ${description}
4
+ ---
5
+
6
+ # ${title}
7
+
8
+ ## Overview
9
+
10
+ [Provide a brief overview of what this skill does and when to use it]
11
+
12
+ ## Quick Start
13
+
14
+ \`\`\`typescript
15
+ // Example code showing basic usage
16
+ \`\`\`
17
+
18
+ ## Core Patterns
19
+
20
+ ### Pattern 1: [Name]
21
+
22
+ [Describe the pattern]
23
+
24
+ \`\`\`typescript
25
+ // Code example
26
+ \`\`\`
27
+
28
+ ### Pattern 2: [Name]
29
+
30
+ [Describe the pattern]
31
+
32
+ \`\`\`typescript
33
+ // Code example
34
+ \`\`\`
35
+
36
+ ## Advanced Usage
37
+
38
+ For detailed information, see:
39
+ - [references/detailed-guide.md](references/detailed-guide.md)
40
+ - [references/examples.md](references/examples.md)
41
+
42
+ ## Scripts
43
+
44
+ - \`scripts/example.py\`: Description of what this script does
45
+
46
+ ## Notes
47
+
48
+ - Important note 1
49
+ - Important note 2
50
+ `;
51
+ export const REFERENCE_TEMPLATE = (title) => `# ${title} Reference
52
+
53
+ ## Section 1
54
+
55
+ Content here...
56
+
57
+ ## Section 2
58
+
59
+ Content here...
60
+ `;
61
+ export const SCRIPT_TEMPLATE = (filename) => `#!/usr/bin/env python3
62
+ """
63
+ Description of what this script does.
64
+
65
+ Usage:
66
+ python ${filename}
67
+ """
68
+
69
+ def main():
70
+ print("Script executed successfully")
71
+
72
+ if __name__ == "__main__":
73
+ main()
74
+ `;
75
+ export const README_TEMPLATE = (title, description) => `# ${title}
76
+
77
+ ${description}
78
+
79
+ ## Structure
80
+
81
+ - \`SKILL.md\` - Main skill instructions
82
+ - \`references/\` - Detailed documentation loaded as needed
83
+ - \`scripts/\` - Executable code for deterministic operations
84
+ - \`assets/\` - Templates, images, or other resources
85
+
86
+ ## Usage
87
+
88
+ This skill is automatically discovered by Claude when relevant to the task.
89
+ `;
90
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAY,EACZ,WAAmB,EACnB,KAAa,EACb,EAAE,CAAC;QACG,IAAI;eACG,WAAW;;;IAGtB,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4CR,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,KAAK;;;;;;;;;CAS9D,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,QAAgB,EAAE,EAAE,CAAC;;;;;aAKxC,QAAQ;;;;;;;;CAQpB,CAAC;AAEF,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,KAAa,EACb,WAAmB,EACnB,EAAE,CAAC,KAAK,KAAK;;EAEb,WAAW;;;;;;;;;;;;CAYZ,CAAC"}
@@ -0,0 +1,185 @@
1
+ import { readFileSync, existsSync, statSync, readdirSync } from 'fs';
2
+ import { join } from 'path';
3
+ export class SkillValidator {
4
+ skill_path;
5
+ errors = [];
6
+ warnings = [];
7
+ constructor(skill_path) {
8
+ this.skill_path = skill_path;
9
+ }
10
+ error(msg) {
11
+ this.errors.push(`❌ ${msg}`);
12
+ }
13
+ warning(msg) {
14
+ this.warnings.push(`⚠️ ${msg}`);
15
+ }
16
+ validate_directory() {
17
+ if (!existsSync(this.skill_path)) {
18
+ this.error(`Skill directory does not exist: ${this.skill_path}`);
19
+ return false;
20
+ }
21
+ const stats = statSync(this.skill_path);
22
+ if (!stats.isDirectory()) {
23
+ this.error(`Path is not a directory: ${this.skill_path}`);
24
+ return false;
25
+ }
26
+ return true;
27
+ }
28
+ validate_skill_md() {
29
+ const skill_md_path = join(this.skill_path, 'SKILL.md');
30
+ if (!existsSync(skill_md_path)) {
31
+ this.error('SKILL.md file not found');
32
+ return false;
33
+ }
34
+ const content = readFileSync(skill_md_path, 'utf-8');
35
+ // Check for YAML frontmatter
36
+ if (!content.startsWith('---\n')) {
37
+ this.error('SKILL.md must start with YAML frontmatter (---)');
38
+ return false;
39
+ }
40
+ // Extract frontmatter
41
+ const parts = content.split('---\n');
42
+ if (parts.length < 3) {
43
+ this.error('SKILL.md has malformed YAML frontmatter');
44
+ return false;
45
+ }
46
+ const frontmatter = parts[1];
47
+ const body = parts.slice(2).join('---\n');
48
+ // Validate required fields
49
+ if (!frontmatter.includes('name:')) {
50
+ this.error("SKILL.md frontmatter missing 'name' field");
51
+ return false;
52
+ }
53
+ if (!frontmatter.includes('description:')) {
54
+ this.error("SKILL.md frontmatter missing 'description' field");
55
+ return false;
56
+ }
57
+ // Extract name
58
+ const name_match = frontmatter.match(/name:\s*(.+)/);
59
+ if (name_match) {
60
+ const name = name_match[1].trim();
61
+ // Validate name format
62
+ if (!/^[a-z0-9-]+$/.test(name)) {
63
+ this.error(`Skill name must be lowercase kebab-case: '${name}'`);
64
+ }
65
+ // Check name matches directory
66
+ const dir_name = this.skill_path.split('/').pop() || '';
67
+ if (name !== dir_name) {
68
+ this.warning(`Skill name '${name}' doesn't match directory name '${dir_name}'`);
69
+ }
70
+ // Check name length
71
+ if (name.length > 64) {
72
+ this.error(`Skill name too long (max 64 chars): ${name.length}`);
73
+ }
74
+ }
75
+ // Extract description
76
+ const desc_match = frontmatter.match(/description:\s*(.+?)(?=\n[a-z]+:|$)/s);
77
+ if (desc_match) {
78
+ const description = desc_match[1].trim();
79
+ // Check description length
80
+ if (description.length > 1024) {
81
+ this.error(`Description too long (max 1024 chars): ${description.length}`);
82
+ }
83
+ if (description.length < 20) {
84
+ this.warning('Description is very short (consider adding more detail)');
85
+ }
86
+ // Check for "when to use" guidance
87
+ const lower_desc = description.toLowerCase();
88
+ if (!lower_desc.includes('when') && !lower_desc.includes('use')) {
89
+ this.warning("Consider adding 'when to use' guidance to description");
90
+ }
91
+ }
92
+ // Check body content
93
+ if (body.trim().length < 100) {
94
+ this.warning('SKILL.md body is very short');
95
+ }
96
+ // Check for TODO placeholders
97
+ if (body.includes('TODO') ||
98
+ body.includes('[Add your') ||
99
+ body.includes('[Provide')) {
100
+ this.warning('SKILL.md contains TODO placeholders');
101
+ }
102
+ return true;
103
+ }
104
+ validate_references() {
105
+ const references_dir = join(this.skill_path, 'references');
106
+ if (existsSync(references_dir)) {
107
+ const files = readdirSync(references_dir);
108
+ const md_files = files.filter((f) => f.endsWith('.md'));
109
+ if (md_files.length === 0) {
110
+ this.warning('references/ directory exists but is empty');
111
+ }
112
+ // Check for references in SKILL.md
113
+ const skill_md_path = join(this.skill_path, 'SKILL.md');
114
+ if (existsSync(skill_md_path)) {
115
+ const skill_content = readFileSync(skill_md_path, 'utf-8');
116
+ for (const md_file of md_files) {
117
+ if (!skill_content.includes(md_file)) {
118
+ this.warning(`Reference file '${md_file}' not mentioned in SKILL.md`);
119
+ }
120
+ }
121
+ }
122
+ }
123
+ return true;
124
+ }
125
+ validate_scripts() {
126
+ const scripts_dir = join(this.skill_path, 'scripts');
127
+ if (existsSync(scripts_dir)) {
128
+ const files = readdirSync(scripts_dir);
129
+ const script_files = files.filter((f) => f.endsWith('.py') || f.endsWith('.sh'));
130
+ if (script_files.length === 0) {
131
+ this.warning('scripts/ directory exists but is empty');
132
+ }
133
+ for (const script_file of script_files) {
134
+ const script_path = join(scripts_dir, script_file);
135
+ const stats = statSync(script_path);
136
+ // Check if executable (0o111 = --x--x--x)
137
+ if ((stats.mode & 0o111) === 0) {
138
+ this.warning(`Script is not executable: ${script_file}`);
139
+ }
140
+ // Check for shebang
141
+ const content = readFileSync(script_path, 'utf-8');
142
+ const first_line = content.split('\n')[0];
143
+ if (!first_line.startsWith('#!')) {
144
+ this.warning(`Script missing shebang: ${script_file}`);
145
+ }
146
+ }
147
+ }
148
+ return true;
149
+ }
150
+ validate_assets() {
151
+ const assets_dir = join(this.skill_path, 'assets');
152
+ if (existsSync(assets_dir)) {
153
+ const files = readdirSync(assets_dir);
154
+ if (files.length === 0) {
155
+ this.warning('assets/ directory exists but is empty');
156
+ }
157
+ }
158
+ return true;
159
+ }
160
+ validate_all() {
161
+ if (!this.validate_directory()) {
162
+ return {
163
+ errors: this.errors,
164
+ warnings: this.warnings,
165
+ is_valid: false,
166
+ };
167
+ }
168
+ this.validate_skill_md();
169
+ this.validate_references();
170
+ this.validate_scripts();
171
+ this.validate_assets();
172
+ return {
173
+ errors: this.errors,
174
+ warnings: this.warnings,
175
+ is_valid: this.errors.length === 0,
176
+ };
177
+ }
178
+ get_errors() {
179
+ return this.errors;
180
+ }
181
+ get_warnings() {
182
+ return this.warnings;
183
+ }
184
+ }
185
+ //# sourceMappingURL=validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/core/validator.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ import { init_command } from './commands/init.js';
3
+ import { validate_command } from './commands/validate.js';
4
+ import { package_command } from './commands/package.js';
5
+ const args = process.argv.slice(2);
6
+ const command = args[0];
7
+ function show_help() {
8
+ console.log('claude-skills - CLI toolkit for creating Claude Agent Skills\n');
9
+ console.log('Usage:');
10
+ console.log(' claude-skills <command> [options]\n');
11
+ console.log('Commands:');
12
+ console.log(' init Create a new skill');
13
+ console.log(' validate Validate a skill');
14
+ console.log(' package Package a skill to zip\n');
15
+ console.log('Options:');
16
+ console.log(' --help, -h Show help');
17
+ console.log(' --version, -v Show version\n');
18
+ console.log('Examples:');
19
+ console.log(' claude-skills init --name my-skill --description "Description"');
20
+ console.log(' claude-skills validate .claude/skills/my-skill');
21
+ console.log(' claude-skills package .claude/skills/my-skill');
22
+ }
23
+ function parse_args(args) {
24
+ const parsed = {};
25
+ const positional = [];
26
+ for (let i = 0; i < args.length; i++) {
27
+ const arg = args[i];
28
+ if (arg.startsWith('--')) {
29
+ const key = arg.substring(2);
30
+ const next = args[i + 1];
31
+ if (next && !next.startsWith('--')) {
32
+ parsed[key] = next;
33
+ i++;
34
+ }
35
+ else {
36
+ parsed[key] = true;
37
+ }
38
+ }
39
+ else if (arg.startsWith('-') && arg.length === 2) {
40
+ const key = arg.substring(1);
41
+ const next = args[i + 1];
42
+ if (next && !next.startsWith('-')) {
43
+ parsed[key] = next;
44
+ i++;
45
+ }
46
+ else {
47
+ parsed[key] = true;
48
+ }
49
+ }
50
+ else {
51
+ positional.push(arg);
52
+ }
53
+ }
54
+ if (positional.length > 0) {
55
+ parsed._positional = positional.join(' ');
56
+ }
57
+ return parsed;
58
+ }
59
+ async function main() {
60
+ if (!command || command === '--help' || command === '-h') {
61
+ show_help();
62
+ process.exit(0);
63
+ }
64
+ if (command === '--version' || command === '-v') {
65
+ console.log('claude-skills v0.0.1');
66
+ process.exit(0);
67
+ }
68
+ const parsed = parse_args(args.slice(1));
69
+ switch (command) {
70
+ case 'init':
71
+ init_command({
72
+ name: parsed.name,
73
+ description: parsed.description,
74
+ path: parsed.path,
75
+ });
76
+ break;
77
+ case 'validate': {
78
+ const skill_path = parsed._positional;
79
+ if (!skill_path) {
80
+ console.error('Error: skill path required');
81
+ console.log('\nUsage: claude-skills validate <skill_path>');
82
+ process.exit(1);
83
+ }
84
+ validate_command({
85
+ skill_path,
86
+ strict: parsed.strict === true,
87
+ });
88
+ break;
89
+ }
90
+ case 'package': {
91
+ const skill_path = parsed._positional;
92
+ if (!skill_path) {
93
+ console.error('Error: skill path required');
94
+ console.log('\nUsage: claude-skills package <skill_path>');
95
+ process.exit(1);
96
+ }
97
+ await package_command({
98
+ skill_path,
99
+ output: parsed.output,
100
+ skip_validation: parsed['skip-validation'] === true,
101
+ });
102
+ break;
103
+ }
104
+ default:
105
+ console.error(`Unknown command: ${command}`);
106
+ console.log('');
107
+ show_help();
108
+ process.exit(1);
109
+ }
110
+ }
111
+ main().catch((err) => {
112
+ console.error('Error:', err.message);
113
+ process.exit(1);
114
+ });
115
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { mkdirSync, writeFileSync, chmodSync } from 'fs';
2
+ import { dirname } from 'path';
3
+ export function ensure_dir(path) {
4
+ mkdirSync(path, { recursive: true });
5
+ }
6
+ export function write_file(path, content) {
7
+ ensure_dir(dirname(path));
8
+ writeFileSync(path, content, 'utf-8');
9
+ }
10
+ export function make_executable(path) {
11
+ chmodSync(path, 0o755);
12
+ }
13
+ export function to_title_case(kebab_case) {
14
+ return kebab_case
15
+ .split('-')
16
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
17
+ .join(' ');
18
+ }
19
+ export function is_kebab_case(str) {
20
+ return /^[a-z0-9-]+$/.test(str);
21
+ }
22
+ export function is_lowercase(str) {
23
+ return str === str.toLowerCase();
24
+ }
25
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,OAAe;IACtD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1B,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,UAAU;SACd,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const success = (msg) => console.log(`✅ ${msg}`);
2
+ export const error = (msg) => console.log(`❌ ${msg}`);
3
+ export const warning = (msg) => console.log(`⚠️ ${msg}`);
4
+ export const info = (msg) => console.log(`📋 ${msg}`);
5
+ export const step = (msg) => console.log(` ${msg}`);
6
+ export const package_ = (msg) => console.log(`📦 ${msg}`);
7
+ export const upload = (msg) => console.log(`📤 ${msg}`);
8
+ export const search = (msg) => console.log(`🔍 ${msg}`);
9
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../src/utils/output.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAClE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC"}