skillpkg-core 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.
Files changed (117) hide show
  1. package/dist/adapters/base.d.ts +48 -0
  2. package/dist/adapters/base.d.ts.map +1 -0
  3. package/dist/adapters/base.js +54 -0
  4. package/dist/adapters/base.js.map +1 -0
  5. package/dist/adapters/claude-code.d.ts +39 -0
  6. package/dist/adapters/claude-code.d.ts.map +1 -0
  7. package/dist/adapters/claude-code.js +172 -0
  8. package/dist/adapters/claude-code.js.map +1 -0
  9. package/dist/adapters/cline.d.ts +43 -0
  10. package/dist/adapters/cline.d.ts.map +1 -0
  11. package/dist/adapters/cline.js +157 -0
  12. package/dist/adapters/cline.js.map +1 -0
  13. package/dist/adapters/codex.d.ts +31 -0
  14. package/dist/adapters/codex.d.ts.map +1 -0
  15. package/dist/adapters/codex.js +117 -0
  16. package/dist/adapters/codex.js.map +1 -0
  17. package/dist/adapters/copilot.d.ts +44 -0
  18. package/dist/adapters/copilot.d.ts.map +1 -0
  19. package/dist/adapters/copilot.js +183 -0
  20. package/dist/adapters/copilot.js.map +1 -0
  21. package/dist/adapters/index.d.ts +11 -0
  22. package/dist/adapters/index.d.ts.map +1 -0
  23. package/dist/adapters/index.js +13 -0
  24. package/dist/adapters/index.js.map +1 -0
  25. package/dist/adapters/manager.d.ts +51 -0
  26. package/dist/adapters/manager.d.ts.map +1 -0
  27. package/dist/adapters/manager.js +147 -0
  28. package/dist/adapters/manager.js.map +1 -0
  29. package/dist/adapters/types.d.ts +93 -0
  30. package/dist/adapters/types.d.ts.map +1 -0
  31. package/dist/adapters/types.js +2 -0
  32. package/dist/adapters/types.js.map +1 -0
  33. package/dist/exporter/exporter.d.ts +54 -0
  34. package/dist/exporter/exporter.d.ts.map +1 -0
  35. package/dist/exporter/exporter.js +303 -0
  36. package/dist/exporter/exporter.js.map +1 -0
  37. package/dist/exporter/index.d.ts +6 -0
  38. package/dist/exporter/index.d.ts.map +1 -0
  39. package/dist/exporter/index.js +6 -0
  40. package/dist/exporter/index.js.map +1 -0
  41. package/dist/exporter/types.d.ts +38 -0
  42. package/dist/exporter/types.d.ts.map +1 -0
  43. package/dist/exporter/types.js +5 -0
  44. package/dist/exporter/types.js.map +1 -0
  45. package/dist/importer/importer.d.ts +37 -0
  46. package/dist/importer/importer.d.ts.map +1 -0
  47. package/dist/importer/importer.js +204 -0
  48. package/dist/importer/importer.js.map +1 -0
  49. package/dist/importer/index.d.ts +6 -0
  50. package/dist/importer/index.d.ts.map +1 -0
  51. package/dist/importer/index.js +6 -0
  52. package/dist/importer/index.js.map +1 -0
  53. package/dist/importer/types.d.ts +43 -0
  54. package/dist/importer/types.d.ts.map +1 -0
  55. package/dist/importer/types.js +2 -0
  56. package/dist/importer/types.js.map +1 -0
  57. package/dist/index.d.ts +14 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +21 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/parser/index.d.ts +23 -0
  62. package/dist/parser/index.d.ts.map +1 -0
  63. package/dist/parser/index.js +24 -0
  64. package/dist/parser/index.js.map +1 -0
  65. package/dist/parser/parser.d.ts +64 -0
  66. package/dist/parser/parser.d.ts.map +1 -0
  67. package/dist/parser/parser.js +121 -0
  68. package/dist/parser/parser.js.map +1 -0
  69. package/dist/parser/schema.d.ts +155 -0
  70. package/dist/parser/schema.d.ts.map +1 -0
  71. package/dist/parser/schema.js +147 -0
  72. package/dist/parser/schema.js.map +1 -0
  73. package/dist/parser/validator.d.ts +38 -0
  74. package/dist/parser/validator.d.ts.map +1 -0
  75. package/dist/parser/validator.js +125 -0
  76. package/dist/parser/validator.js.map +1 -0
  77. package/dist/registry/auth.d.ts +38 -0
  78. package/dist/registry/auth.d.ts.map +1 -0
  79. package/dist/registry/auth.js +142 -0
  80. package/dist/registry/auth.js.map +1 -0
  81. package/dist/registry/client.d.ts +80 -0
  82. package/dist/registry/client.d.ts.map +1 -0
  83. package/dist/registry/client.js +238 -0
  84. package/dist/registry/client.js.map +1 -0
  85. package/dist/registry/index.d.ts +10 -0
  86. package/dist/registry/index.d.ts.map +1 -0
  87. package/dist/registry/index.js +9 -0
  88. package/dist/registry/index.js.map +1 -0
  89. package/dist/registry/types.d.ts +94 -0
  90. package/dist/registry/types.d.ts.map +1 -0
  91. package/dist/registry/types.js +18 -0
  92. package/dist/registry/types.js.map +1 -0
  93. package/dist/store/config.d.ts +30 -0
  94. package/dist/store/config.d.ts.map +1 -0
  95. package/dist/store/config.js +112 -0
  96. package/dist/store/config.js.map +1 -0
  97. package/dist/store/index.d.ts +21 -0
  98. package/dist/store/index.d.ts.map +1 -0
  99. package/dist/store/index.js +24 -0
  100. package/dist/store/index.js.map +1 -0
  101. package/dist/store/manager.d.ts +113 -0
  102. package/dist/store/manager.d.ts.map +1 -0
  103. package/dist/store/manager.js +250 -0
  104. package/dist/store/manager.js.map +1 -0
  105. package/dist/store/paths.d.ts +37 -0
  106. package/dist/store/paths.d.ts.map +1 -0
  107. package/dist/store/paths.js +60 -0
  108. package/dist/store/paths.js.map +1 -0
  109. package/dist/store/registry.d.ts +34 -0
  110. package/dist/store/registry.d.ts.map +1 -0
  111. package/dist/store/registry.js +105 -0
  112. package/dist/store/registry.js.map +1 -0
  113. package/dist/types.d.ts +130 -0
  114. package/dist/types.d.ts.map +1 -0
  115. package/dist/types.js +8 -0
  116. package/dist/types.js.map +1 -0
  117. package/package.json +61 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Importer - Import skills from various platform formats
3
+ *
4
+ * Uses platform adapters to detect and import skills
5
+ */
6
+ import { readdir, stat } from 'fs/promises';
7
+ import { join } from 'path';
8
+ import { createAdapterManager } from '../adapters/manager.js';
9
+ /**
10
+ * Importer class
11
+ */
12
+ export class Importer {
13
+ adapters;
14
+ constructor() {
15
+ const manager = createAdapterManager();
16
+ this.adapters = manager.listAdapters();
17
+ }
18
+ /**
19
+ * Detect importable files in a path
20
+ */
21
+ async detect(path) {
22
+ const detected = [];
23
+ const stats = await stat(path).catch(() => null);
24
+ if (!stats) {
25
+ return detected;
26
+ }
27
+ if (stats.isFile()) {
28
+ // Single file - check each adapter
29
+ for (const adapter of this.adapters) {
30
+ if (await adapter.canImport(path)) {
31
+ detected.push({
32
+ path,
33
+ platform: adapter.name,
34
+ displayName: adapter.displayName,
35
+ });
36
+ break; // First match wins
37
+ }
38
+ }
39
+ }
40
+ else if (stats.isDirectory()) {
41
+ // Directory - scan for importable files
42
+ await this.scanDirectory(path, detected);
43
+ }
44
+ return detected;
45
+ }
46
+ /**
47
+ * Scan directory recursively for importable files
48
+ */
49
+ async scanDirectory(dirPath, detected, depth = 0) {
50
+ // Limit recursion depth
51
+ if (depth > 5)
52
+ return;
53
+ try {
54
+ const entries = await readdir(dirPath, { withFileTypes: true });
55
+ for (const entry of entries) {
56
+ const fullPath = join(dirPath, entry.name);
57
+ if (entry.isFile()) {
58
+ // Check if any adapter can import this file
59
+ for (const adapter of this.adapters) {
60
+ if (await adapter.canImport(fullPath)) {
61
+ detected.push({
62
+ path: fullPath,
63
+ platform: adapter.name,
64
+ displayName: adapter.displayName,
65
+ });
66
+ break;
67
+ }
68
+ }
69
+ }
70
+ else if (entry.isDirectory()) {
71
+ // Skip common non-skill directories
72
+ if (this.shouldSkipDirectory(entry.name)) {
73
+ continue;
74
+ }
75
+ // Recurse into subdirectory
76
+ await this.scanDirectory(fullPath, detected, depth + 1);
77
+ }
78
+ }
79
+ }
80
+ catch {
81
+ // Ignore permission errors, etc.
82
+ }
83
+ }
84
+ /**
85
+ * Check if a directory should be skipped during scanning
86
+ */
87
+ shouldSkipDirectory(name) {
88
+ const skipDirs = [
89
+ 'node_modules',
90
+ '.git',
91
+ '.svn',
92
+ 'dist',
93
+ 'build',
94
+ 'coverage',
95
+ '__pycache__',
96
+ '.venv',
97
+ 'venv',
98
+ ];
99
+ return skipDirs.includes(name);
100
+ }
101
+ /**
102
+ * Import a single file
103
+ */
104
+ async importFile(path, options = {}) {
105
+ // Find adapter that can import this file
106
+ let targetAdapter = null;
107
+ if (options.platform) {
108
+ // Use specified platform
109
+ targetAdapter =
110
+ this.adapters.find((a) => a.name === options.platform) || null;
111
+ if (targetAdapter && !(await targetAdapter.canImport(path))) {
112
+ return {
113
+ path,
114
+ success: false,
115
+ error: `File is not a valid ${targetAdapter.displayName} format`,
116
+ };
117
+ }
118
+ }
119
+ else {
120
+ // Auto-detect platform
121
+ for (const adapter of this.adapters) {
122
+ if (await adapter.canImport(path)) {
123
+ targetAdapter = adapter;
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ if (!targetAdapter) {
129
+ return {
130
+ path,
131
+ success: false,
132
+ error: 'No compatible platform adapter found',
133
+ };
134
+ }
135
+ try {
136
+ const skill = await targetAdapter.import(path);
137
+ return {
138
+ path,
139
+ success: true,
140
+ skill,
141
+ platform: targetAdapter.name,
142
+ };
143
+ }
144
+ catch (error) {
145
+ return {
146
+ path,
147
+ success: false,
148
+ platform: targetAdapter.name,
149
+ error: error instanceof Error ? error.message : String(error),
150
+ };
151
+ }
152
+ }
153
+ /**
154
+ * Import multiple files (batch import)
155
+ */
156
+ async importBatch(paths, options = {}) {
157
+ const result = {
158
+ imported: [],
159
+ failed: [],
160
+ skipped: [],
161
+ total: paths.length,
162
+ };
163
+ for (const path of paths) {
164
+ const importResult = await this.importFile(path, options);
165
+ if (importResult.success) {
166
+ result.imported.push(importResult);
167
+ }
168
+ else {
169
+ result.failed.push(importResult);
170
+ }
171
+ }
172
+ return result;
173
+ }
174
+ /**
175
+ * Import from a path (file or directory)
176
+ */
177
+ async importFrom(path, options = {}) {
178
+ // First detect importable files
179
+ const detected = await this.detect(path);
180
+ if (detected.length === 0) {
181
+ return {
182
+ imported: [],
183
+ failed: [],
184
+ skipped: [
185
+ {
186
+ path,
187
+ success: false,
188
+ error: 'No importable files found',
189
+ },
190
+ ],
191
+ total: 0,
192
+ };
193
+ }
194
+ // Import all detected files
195
+ return this.importBatch(detected.map((d) => d.path), options);
196
+ }
197
+ }
198
+ /**
199
+ * Create a new Importer instance
200
+ */
201
+ export function createImporter() {
202
+ return new Importer();
203
+ }
204
+ //# sourceMappingURL=importer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"importer.js","sourceRoot":"","sources":["../../src/importer/importer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Importer module - Import skills from various platform formats
3
+ */
4
+ export type { ImportResult, BatchImportResult, ImportOptions, DetectedFile, } from './types.js';
5
+ export { Importer, createImporter } from './importer.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/importer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Importer module - Import skills from various platform formats
3
+ */
4
+ // Importer
5
+ export { Importer, createImporter } from './importer.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/importer/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,WAAW;AACX,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Importer types
3
+ */
4
+ import type { Skill } from '../types.js';
5
+ /**
6
+ * Import result for a single file
7
+ */
8
+ export interface ImportResult {
9
+ path: string;
10
+ success: boolean;
11
+ skill?: Skill;
12
+ platform?: string;
13
+ error?: string;
14
+ }
15
+ /**
16
+ * Batch import result
17
+ */
18
+ export interface BatchImportResult {
19
+ imported: ImportResult[];
20
+ failed: ImportResult[];
21
+ skipped: ImportResult[];
22
+ total: number;
23
+ }
24
+ /**
25
+ * Import options
26
+ */
27
+ export interface ImportOptions {
28
+ /** Dry run - don't actually save */
29
+ dryRun?: boolean;
30
+ /** Target platform to import from (auto-detect if not specified) */
31
+ platform?: string;
32
+ /** Whether to overwrite existing skills */
33
+ overwrite?: boolean;
34
+ }
35
+ /**
36
+ * Detected file info
37
+ */
38
+ export interface DetectedFile {
39
+ path: string;
40
+ platform: string;
41
+ displayName: string;
42
+ }
43
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/importer/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/importer/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @skillpkg/core
3
+ *
4
+ * Core library for skillpkg - Agent Skills Package Manager
5
+ */
6
+ export declare const VERSION = "0.0.1";
7
+ export * from './types.js';
8
+ export * from './parser/index.js';
9
+ export * from './store/index.js';
10
+ export * from './adapters/index.js';
11
+ export * from './importer/index.js';
12
+ export * from './exporter/index.js';
13
+ export * from './registry/index.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,cAAc,YAAY,CAAC;AAG3B,cAAc,mBAAmB,CAAC;AAGlC,cAAc,kBAAkB,CAAC;AAGjC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC;AAGpC,cAAc,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @skillpkg/core
3
+ *
4
+ * Core library for skillpkg - Agent Skills Package Manager
5
+ */
6
+ export const VERSION = '0.0.1';
7
+ // Types
8
+ export * from './types.js';
9
+ // Parser module
10
+ export * from './parser/index.js';
11
+ // Store module
12
+ export * from './store/index.js';
13
+ // Adapters module
14
+ export * from './adapters/index.js';
15
+ // Importer module
16
+ export * from './importer/index.js';
17
+ // Exporter module
18
+ export * from './exporter/index.js';
19
+ // Registry module
20
+ export * from './registry/index.js';
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,QAAQ;AACR,cAAc,YAAY,CAAC;AAE3B,gBAAgB;AAChB,cAAc,mBAAmB,CAAC;AAElC,eAAe;AACf,cAAc,kBAAkB,CAAC;AAEjC,kBAAkB;AAClB,cAAc,qBAAqB,CAAC;AAEpC,kBAAkB;AAClB,cAAc,qBAAqB,CAAC;AAEpC,kBAAkB;AAClB,cAAc,qBAAqB,CAAC;AAEpC,kBAAkB;AAClB,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Parser module - public API
3
+ *
4
+ * Provides YAML parsing and validation for skill.yaml files.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { parse, validate, stringify } from '@skillpkg/core/parser';
9
+ *
10
+ * const result = parse(yamlContent);
11
+ * if (result.success) {
12
+ * console.log(result.data.name);
13
+ * } else {
14
+ * console.error(result.errors);
15
+ * }
16
+ * ```
17
+ */
18
+ export { parse, stringify, parseAndValidate } from './parser.js';
19
+ export type { ParseResult, ParseError, ParseOptions } from './parser.js';
20
+ export { validate } from './validator.js';
21
+ export type { ValidationResult, ValidationError, ValidationWarning } from './validator.js';
22
+ export { skillSchema, fieldDescriptions } from './schema.js';
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG3F,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Parser module - public API
3
+ *
4
+ * Provides YAML parsing and validation for skill.yaml files.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { parse, validate, stringify } from '@skillpkg/core/parser';
9
+ *
10
+ * const result = parse(yamlContent);
11
+ * if (result.success) {
12
+ * console.log(result.data.name);
13
+ * } else {
14
+ * console.error(result.errors);
15
+ * }
16
+ * ```
17
+ */
18
+ // Parser functions
19
+ export { parse, stringify, parseAndValidate } from './parser.js';
20
+ // Validator functions
21
+ export { validate } from './validator.js';
22
+ // Schema
23
+ export { skillSchema, fieldDescriptions } from './schema.js';
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,mBAAmB;AACnB,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGjE,sBAAsB;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,SAAS;AACT,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,64 @@
1
+ import type { Skill } from '../types.js';
2
+ import { type ValidationResult } from './validator.js';
3
+ /**
4
+ * Parse error with line/column information
5
+ */
6
+ export interface ParseError {
7
+ /** Error message */
8
+ message: string;
9
+ /** Line number (1-indexed) */
10
+ line?: number;
11
+ /** Column number (1-indexed) */
12
+ column?: number;
13
+ /** Error code */
14
+ code: 'YAML_SYNTAX' | 'VALIDATION' | 'UNKNOWN';
15
+ }
16
+ /**
17
+ * Parse result
18
+ */
19
+ export interface ParseResult<T> {
20
+ /** Whether parsing succeeded */
21
+ success: boolean;
22
+ /** Parsed data (if successful) */
23
+ data?: T;
24
+ /** Parse errors (if failed) */
25
+ errors?: ParseError[];
26
+ /** Validation warnings (even if successful) */
27
+ warnings?: string[];
28
+ }
29
+ /**
30
+ * Parse options
31
+ */
32
+ export interface ParseOptions {
33
+ /** Whether to validate after parsing (default: true) */
34
+ validate?: boolean;
35
+ /** Whether to include warnings in result (default: true) */
36
+ includeWarnings?: boolean;
37
+ }
38
+ /**
39
+ * Parse a skill.yaml string into a Skill object
40
+ *
41
+ * @param content - The YAML content to parse
42
+ * @param options - Parse options
43
+ * @returns ParseResult with the parsed Skill or errors
44
+ */
45
+ export declare function parse(content: string, options?: ParseOptions): ParseResult<Skill>;
46
+ /**
47
+ * Stringify a Skill object to YAML
48
+ *
49
+ * @param skill - The Skill object to stringify
50
+ * @returns YAML string
51
+ */
52
+ export declare function stringify(skill: Skill): string;
53
+ /**
54
+ * Parse and validate, returning both results
55
+ *
56
+ * @param content - The YAML content to parse
57
+ * @returns Object with parsed skill and validation result
58
+ */
59
+ export declare function parseAndValidate(content: string): {
60
+ skill: Skill | null;
61
+ validation: ValidationResult;
62
+ parseErrors?: ParseError[];
63
+ };
64
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAY,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,IAAI,EAAE,aAAa,GAAG,YAAY,GAAG,SAAS,CAAC;CAChD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,gCAAgC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,+BAA+B;IAC/B,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,CA+ErF;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAO9C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG;IACjD,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;CAC5B,CAiBA"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * YAML parser for skill.yaml files
3
+ */
4
+ import { parse as parseYaml, stringify as stringifyYaml, YAMLParseError } from 'yaml';
5
+ import { validate } from './validator.js';
6
+ /**
7
+ * Parse a skill.yaml string into a Skill object
8
+ *
9
+ * @param content - The YAML content to parse
10
+ * @param options - Parse options
11
+ * @returns ParseResult with the parsed Skill or errors
12
+ */
13
+ export function parse(content, options = {}) {
14
+ const { validate: shouldValidate = true, includeWarnings = true } = options;
15
+ try {
16
+ // Parse YAML
17
+ const data = parseYaml(content, {
18
+ prettyErrors: true,
19
+ });
20
+ // Check if data is an object
21
+ if (typeof data !== 'object' || data === null) {
22
+ return {
23
+ success: false,
24
+ errors: [
25
+ {
26
+ message: 'skill.yaml must contain an object',
27
+ code: 'VALIDATION',
28
+ },
29
+ ],
30
+ };
31
+ }
32
+ // Validate if requested
33
+ if (shouldValidate) {
34
+ const validationResult = validate(data);
35
+ if (!validationResult.valid) {
36
+ return {
37
+ success: false,
38
+ errors: validationResult.errors.map((e) => ({
39
+ message: `${e.path}: ${e.message}${e.expected ? ` (expected: ${e.expected})` : ''}`,
40
+ code: 'VALIDATION',
41
+ })),
42
+ };
43
+ }
44
+ // Return with warnings
45
+ const warnings = includeWarnings
46
+ ? validationResult.warnings.map((w) => `${w.path}: ${w.message}`)
47
+ : undefined;
48
+ return {
49
+ success: true,
50
+ data: data,
51
+ warnings: warnings?.length ? warnings : undefined,
52
+ };
53
+ }
54
+ return {
55
+ success: true,
56
+ data: data,
57
+ };
58
+ }
59
+ catch (error) {
60
+ // Handle YAML parse errors
61
+ if (error instanceof YAMLParseError) {
62
+ return {
63
+ success: false,
64
+ errors: [
65
+ {
66
+ message: error.message,
67
+ line: error.linePos?.[0]?.line,
68
+ column: error.linePos?.[0]?.col,
69
+ code: 'YAML_SYNTAX',
70
+ },
71
+ ],
72
+ };
73
+ }
74
+ // Handle unknown errors
75
+ return {
76
+ success: false,
77
+ errors: [
78
+ {
79
+ message: error instanceof Error ? error.message : 'Unknown error',
80
+ code: 'UNKNOWN',
81
+ },
82
+ ],
83
+ };
84
+ }
85
+ }
86
+ /**
87
+ * Stringify a Skill object to YAML
88
+ *
89
+ * @param skill - The Skill object to stringify
90
+ * @returns YAML string
91
+ */
92
+ export function stringify(skill) {
93
+ return stringifyYaml(skill, {
94
+ indent: 2,
95
+ lineWidth: 0, // Don't wrap lines
96
+ defaultStringType: 'QUOTE_DOUBLE',
97
+ defaultKeyType: 'PLAIN',
98
+ });
99
+ }
100
+ /**
101
+ * Parse and validate, returning both results
102
+ *
103
+ * @param content - The YAML content to parse
104
+ * @returns Object with parsed skill and validation result
105
+ */
106
+ export function parseAndValidate(content) {
107
+ const parseResult = parse(content, { validate: false });
108
+ if (!parseResult.success || !parseResult.data) {
109
+ return {
110
+ skill: null,
111
+ validation: { valid: false, errors: [], warnings: [] },
112
+ parseErrors: parseResult.errors,
113
+ };
114
+ }
115
+ const validation = validate(parseResult.data);
116
+ return {
117
+ skill: validation.valid ? parseResult.data : null,
118
+ validation,
119
+ };
120
+ }
121
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAEtF,OAAO,EAAE,QAAQ,EAAyB,MAAM,gBAAgB,CAAC;AAwCjE;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,UAAwB,EAAE;IAC/D,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE5E,IAAI,CAAC;QACH,aAAa;QACb,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,EAAE;YAC9B,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,6BAA6B;QAC7B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE;oBACN;wBACE,OAAO,EAAE,mCAAmC;wBAC5C,IAAI,EAAE,YAAY;qBACnB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,gBAAgB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAExC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC1C,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;wBACnF,IAAI,EAAE,YAAqB;qBAC5B,CAAC,CAAC;iBACJ,CAAC;YACJ,CAAC;YAED,uBAAuB;YACvB,MAAM,QAAQ,GAAG,eAAe;gBAC9B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;gBACjE,CAAC,CAAC,SAAS,CAAC;YAEd,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,IAAa;gBACnB,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;aAClD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,IAAa;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,2BAA2B;QAC3B,IAAI,KAAK,YAAY,cAAc,EAAE,CAAC;YACpC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE;oBACN;wBACE,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI;wBAC9B,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;wBAC/B,IAAI,EAAE,aAAa;qBACpB;iBACF;aACF,CAAC;QACJ,CAAC;QAED,wBAAwB;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE;gBACN;oBACE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;oBACjE,IAAI,EAAE,SAAS;iBAChB;aACF;SACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAY;IACpC,OAAO,aAAa,CAAC,KAAK,EAAE;QAC1B,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,CAAC,EAAE,mBAAmB;QACjC,iBAAiB,EAAE,cAAc;QACjC,cAAc,EAAE,OAAO;KACxB,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAK9C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAExD,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC9C,OAAO;YACL,KAAK,EAAE,IAAI;YACX,UAAU,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;YACtD,WAAW,EAAE,WAAW,CAAC,MAAM;SAChC,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAE9C,OAAO;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QACjD,UAAU;KACX,CAAC;AACJ,CAAC"}