@kilnai/core 0.10.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/engine/domain/eval-config.d.ts +2 -1
- package/dist/engine/domain/eval-config.d.ts.map +1 -1
- package/dist/engine/domain/eval-config.js +9 -0
- package/dist/engine/domain/eval-config.js.map +1 -1
- package/dist/engine/domain/integration.d.ts +50 -0
- package/dist/engine/domain/integration.d.ts.map +1 -0
- package/dist/engine/domain/integration.js +4 -0
- package/dist/engine/domain/integration.js.map +1 -0
- package/dist/engine/domain/knowledge-source.d.ts +5 -1
- package/dist/engine/domain/knowledge-source.d.ts.map +1 -1
- package/dist/engine/error-catalog.d.ts.map +1 -1
- package/dist/engine/error-catalog.js +23 -2
- package/dist/engine/error-catalog.js.map +1 -1
- package/dist/engine/errors.d.ts +1 -1
- package/dist/engine/errors.d.ts.map +1 -1
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/gateway/conversation-event.d.ts +9 -1
- package/dist/engine/gateway/conversation-event.d.ts.map +1 -1
- package/dist/engine/gateway/tenant-config.d.ts +22 -0
- package/dist/engine/gateway/tenant-config.d.ts.map +1 -1
- package/dist/engine/gateway/tenant-config.js +58 -0
- package/dist/engine/gateway/tenant-config.js.map +1 -1
- package/dist/engine/index.d.ts +3 -2
- package/dist/engine/index.d.ts.map +1 -1
- package/dist/engine/index.js.map +1 -1
- package/dist/eval/consistency-runner.d.ts +28 -0
- package/dist/eval/consistency-runner.d.ts.map +1 -0
- package/dist/eval/consistency-runner.js +43 -0
- package/dist/eval/consistency-runner.js.map +1 -0
- package/dist/eval/experiment-runner.d.ts.map +1 -1
- package/dist/eval/experiment-runner.js +1 -0
- package/dist/eval/experiment-runner.js.map +1 -1
- package/dist/eval/index.d.ts +13 -0
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/index.js +12 -0
- package/dist/eval/index.js.map +1 -1
- package/dist/eval/scorer-factory.d.ts.map +1 -1
- package/dist/eval/scorer-factory.js +33 -0
- package/dist/eval/scorer-factory.js.map +1 -1
- package/dist/eval/scorers/context-relevance-scorer.d.ts +8 -0
- package/dist/eval/scorers/context-relevance-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/context-relevance-scorer.js +32 -0
- package/dist/eval/scorers/context-relevance-scorer.js.map +1 -0
- package/dist/eval/scorers/effort-scorer.d.ts +6 -0
- package/dist/eval/scorers/effort-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/effort-scorer.js +15 -0
- package/dist/eval/scorers/effort-scorer.js.map +1 -0
- package/dist/eval/scorers/handoff-quality-scorer.d.ts +8 -0
- package/dist/eval/scorers/handoff-quality-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/handoff-quality-scorer.js +65 -0
- package/dist/eval/scorers/handoff-quality-scorer.js.map +1 -0
- package/dist/eval/scorers/milestone-scorer.d.ts +6 -0
- package/dist/eval/scorers/milestone-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/milestone-scorer.js +35 -0
- package/dist/eval/scorers/milestone-scorer.js.map +1 -0
- package/dist/eval/scorers/multi-turn-consistency-scorer.d.ts +8 -0
- package/dist/eval/scorers/multi-turn-consistency-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/multi-turn-consistency-scorer.js +55 -0
- package/dist/eval/scorers/multi-turn-consistency-scorer.js.map +1 -0
- package/dist/eval/scorers/policy-adherence-scorer.d.ts +9 -0
- package/dist/eval/scorers/policy-adherence-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/policy-adherence-scorer.js +34 -0
- package/dist/eval/scorers/policy-adherence-scorer.js.map +1 -0
- package/dist/eval/scorers/resolution-scorer.d.ts +6 -0
- package/dist/eval/scorers/resolution-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/resolution-scorer.js +25 -0
- package/dist/eval/scorers/resolution-scorer.js.map +1 -0
- package/dist/eval/scorers/routing-accuracy-scorer.d.ts +6 -0
- package/dist/eval/scorers/routing-accuracy-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/routing-accuracy-scorer.js +19 -0
- package/dist/eval/scorers/routing-accuracy-scorer.js.map +1 -0
- package/dist/eval/scorers/safety-preservation-scorer.d.ts +9 -0
- package/dist/eval/scorers/safety-preservation-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/safety-preservation-scorer.js +54 -0
- package/dist/eval/scorers/safety-preservation-scorer.js.map +1 -0
- package/dist/eval/scorers/tool-calling-accuracy-scorer.d.ts +6 -0
- package/dist/eval/scorers/tool-calling-accuracy-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/tool-calling-accuracy-scorer.js +81 -0
- package/dist/eval/scorers/tool-calling-accuracy-scorer.js.map +1 -0
- package/dist/eval/scorers/tool-trajectory-scorer.d.ts +8 -0
- package/dist/eval/scorers/tool-trajectory-scorer.d.ts.map +1 -0
- package/dist/eval/scorers/tool-trajectory-scorer.js +51 -0
- package/dist/eval/scorers/tool-trajectory-scorer.js.map +1 -0
- package/dist/eval/types.d.ts +1 -0
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/events/index.d.ts +11 -1
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -0
- package/dist/events/index.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/knowledge/infrastructure/composite-extractor.d.ts +2 -2
- package/dist/knowledge/infrastructure/composite-extractor.d.ts.map +1 -1
- package/dist/knowledge/infrastructure/composite-extractor.js +2 -2
- package/dist/knowledge/infrastructure/composite-extractor.js.map +1 -1
- package/dist/knowledge/infrastructure/file-extractor.d.ts +2 -2
- package/dist/knowledge/infrastructure/file-extractor.d.ts.map +1 -1
- package/dist/knowledge/infrastructure/file-extractor.js +1 -1
- package/dist/knowledge/infrastructure/file-extractor.js.map +1 -1
- package/dist/knowledge/infrastructure/pdf-extractor.d.ts +2 -2
- package/dist/knowledge/infrastructure/pdf-extractor.d.ts.map +1 -1
- package/dist/knowledge/infrastructure/pdf-extractor.js +4 -2
- package/dist/knowledge/infrastructure/pdf-extractor.js.map +1 -1
- package/dist/knowledge/infrastructure/url-extractor.d.ts +2 -2
- package/dist/knowledge/infrastructure/url-extractor.d.ts.map +1 -1
- package/dist/knowledge/infrastructure/url-extractor.js +5 -3
- package/dist/knowledge/infrastructure/url-extractor.js.map +1 -1
- package/dist/knowledge/source-manager.d.ts +2 -0
- package/dist/knowledge/source-manager.d.ts.map +1 -1
- package/dist/knowledge/source-manager.js +54 -1
- package/dist/knowledge/source-manager.js.map +1 -1
- package/dist/observability/span-mapper.d.ts.map +1 -1
- package/dist/observability/span-mapper.js +15 -0
- package/dist/observability/span-mapper.js.map +1 -1
- package/dist/package/yaml-parser.d.ts.map +1 -1
- package/dist/package/yaml-parser.js +1 -0
- package/dist/package/yaml-parser.js.map +1 -1
- package/dist/skill/index.d.ts +2 -4
- package/dist/skill/index.d.ts.map +1 -1
- package/dist/skill/index.js +1 -2
- package/dist/skill/index.js.map +1 -1
- package/dist/skill/md-parser.d.ts +21 -0
- package/dist/skill/md-parser.d.ts.map +1 -0
- package/dist/skill/md-parser.js +168 -0
- package/dist/skill/md-parser.js.map +1 -0
- package/dist/skill/skill-registry.d.ts +16 -8
- package/dist/skill/skill-registry.d.ts.map +1 -1
- package/dist/skill/skill-registry.js +77 -30
- package/dist/skill/skill-registry.js.map +1 -1
- package/dist/skill/types.d.ts +7 -3
- package/dist/skill/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/skill/yaml-parser.d.ts +0 -18
- package/dist/skill/yaml-parser.d.ts.map +0 -1
- package/dist/skill/yaml-parser.js +0 -61
- package/dist/skill/yaml-parser.js.map +0 -1
- package/dist/skill/yaml-schema.d.ts +0 -20
- package/dist/skill/yaml-schema.d.ts.map +0 -1
- package/dist/skill/yaml-schema.js +0 -80
- package/dist/skill/yaml-schema.js.map +0 -1
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { parse } from "yaml";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import { KilnError } from "../engine/errors.js";
|
|
4
|
+
import { EVENT_LEVEL_MAP } from "../events/index.js";
|
|
5
|
+
const VALID_EVENT_TYPES = new Set(Object.keys(EVENT_LEVEL_MAP));
|
|
6
|
+
const FRONTMATTER_DELIMITER = "---";
|
|
7
|
+
export class SkillMdError extends KilnError {
|
|
8
|
+
errors;
|
|
9
|
+
filePath;
|
|
10
|
+
constructor(errors, filePath) {
|
|
11
|
+
const msg = errors.map((e) => ` ${e.field}: ${e.message}`).join("\n");
|
|
12
|
+
super("SKILL_MD_INVALID", `Invalid SKILL.md${filePath ? ` (${filePath})` : ""}:\n${msg}`, {
|
|
13
|
+
context: { errors, filePath },
|
|
14
|
+
retryable: false,
|
|
15
|
+
});
|
|
16
|
+
this.name = "SkillMdError";
|
|
17
|
+
this.errors = errors;
|
|
18
|
+
this.filePath = filePath;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Split SKILL.md content into frontmatter YAML and markdown body */
|
|
22
|
+
function splitFrontmatter(content) {
|
|
23
|
+
const trimmed = content.trimStart();
|
|
24
|
+
if (!trimmed.startsWith(FRONTMATTER_DELIMITER)) {
|
|
25
|
+
return { frontmatter: "", body: content };
|
|
26
|
+
}
|
|
27
|
+
const afterFirst = trimmed.slice(FRONTMATTER_DELIMITER.length);
|
|
28
|
+
const endIndex = afterFirst.indexOf(`\n${FRONTMATTER_DELIMITER}`);
|
|
29
|
+
if (endIndex === -1) {
|
|
30
|
+
return { frontmatter: "", body: content };
|
|
31
|
+
}
|
|
32
|
+
const frontmatter = afterFirst.slice(0, endIndex).trim();
|
|
33
|
+
const bodyStart = endIndex + 1 + FRONTMATTER_DELIMITER.length;
|
|
34
|
+
const body = afterFirst.slice(bodyStart).trim();
|
|
35
|
+
return { frontmatter, body };
|
|
36
|
+
}
|
|
37
|
+
/** Validate frontmatter object and return errors */
|
|
38
|
+
function validateFrontmatter(data) {
|
|
39
|
+
const errors = [];
|
|
40
|
+
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
41
|
+
errors.push({ field: "(root)", message: "Frontmatter must be a YAML object" });
|
|
42
|
+
return errors;
|
|
43
|
+
}
|
|
44
|
+
const obj = data;
|
|
45
|
+
// Required: name, description
|
|
46
|
+
if (!("name" in obj) || typeof obj.name !== "string" || obj.name.trim() === "") {
|
|
47
|
+
errors.push({ field: "name", message: "Required string field" });
|
|
48
|
+
}
|
|
49
|
+
if (!("description" in obj) || typeof obj.description !== "string" || obj.description.trim() === "") {
|
|
50
|
+
errors.push({ field: "description", message: "Required string field" });
|
|
51
|
+
}
|
|
52
|
+
// Optional: handler (string)
|
|
53
|
+
if ("handler" in obj && typeof obj.handler !== "string") {
|
|
54
|
+
errors.push({ field: "handler", message: `Expected string, got ${typeof obj.handler}` });
|
|
55
|
+
}
|
|
56
|
+
// Optional: tools (string[])
|
|
57
|
+
if ("tools" in obj) {
|
|
58
|
+
if (!Array.isArray(obj.tools)) {
|
|
59
|
+
errors.push({ field: "tools", message: `Expected array, got ${typeof obj.tools}` });
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
for (let i = 0; i < obj.tools.length; i++) {
|
|
63
|
+
if (typeof obj.tools[i] !== "string") {
|
|
64
|
+
errors.push({ field: `tools[${i}]`, message: `Expected string, got ${typeof obj.tools[i]}` });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
// Optional: tags (string[])
|
|
70
|
+
if ("tags" in obj) {
|
|
71
|
+
if (!Array.isArray(obj.tags)) {
|
|
72
|
+
errors.push({ field: "tags", message: `Expected array, got ${typeof obj.tags}` });
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
for (let i = 0; i < obj.tags.length; i++) {
|
|
76
|
+
if (typeof obj.tags[i] !== "string") {
|
|
77
|
+
errors.push({ field: `tags[${i}]`, message: `Expected string, got ${typeof obj.tags[i]}` });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Optional: triggers (array of {event, filter?})
|
|
83
|
+
if ("triggers" in obj) {
|
|
84
|
+
if (!Array.isArray(obj.triggers)) {
|
|
85
|
+
errors.push({ field: "triggers", message: `Expected array, got ${typeof obj.triggers}` });
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
for (let i = 0; i < obj.triggers.length; i++) {
|
|
89
|
+
const trigger = obj.triggers[i];
|
|
90
|
+
if (typeof trigger !== "object" || trigger === null || Array.isArray(trigger)) {
|
|
91
|
+
errors.push({ field: `triggers[${i}]`, message: "Expected an object" });
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const t = trigger;
|
|
95
|
+
if (!("event" in t) || typeof t.event !== "string") {
|
|
96
|
+
errors.push({ field: `triggers[${i}].event`, message: "Required string field" });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return errors;
|
|
103
|
+
}
|
|
104
|
+
/** Build SkillIndex from validated frontmatter */
|
|
105
|
+
function buildIndex(obj, filePath) {
|
|
106
|
+
const rawTriggers = obj.triggers ?? [];
|
|
107
|
+
// Validate event types
|
|
108
|
+
const triggerErrors = [];
|
|
109
|
+
for (let i = 0; i < rawTriggers.length; i++) {
|
|
110
|
+
const event = rawTriggers[i].event;
|
|
111
|
+
if (!VALID_EVENT_TYPES.has(event)) {
|
|
112
|
+
triggerErrors.push({ field: `triggers[${i}].event`, message: `Unknown event type "${event}"` });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (triggerErrors.length > 0)
|
|
116
|
+
throw new SkillMdError(triggerErrors, filePath);
|
|
117
|
+
return {
|
|
118
|
+
name: obj.name,
|
|
119
|
+
description: obj.description,
|
|
120
|
+
tools: obj.tools ?? [],
|
|
121
|
+
triggers: rawTriggers.map((t) => ({
|
|
122
|
+
event: t.event,
|
|
123
|
+
...(t.filter !== undefined ? { filter: t.filter } : {}),
|
|
124
|
+
})),
|
|
125
|
+
tags: obj.tags ?? [],
|
|
126
|
+
...(obj.handler !== undefined ? { handler: obj.handler } : {}),
|
|
127
|
+
filePath,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/** Parse SKILL.md content into a full SkillConfig (frontmatter + body) */
|
|
131
|
+
export function parseSkillMd(content, filePath = "") {
|
|
132
|
+
const { frontmatter, body } = splitFrontmatter(content);
|
|
133
|
+
if (!frontmatter) {
|
|
134
|
+
throw new SkillMdError([{ field: "(root)", message: "Missing YAML frontmatter (wrap in --- delimiters)" }], filePath);
|
|
135
|
+
}
|
|
136
|
+
const data = parse(frontmatter);
|
|
137
|
+
const errors = validateFrontmatter(data);
|
|
138
|
+
if (errors.length > 0)
|
|
139
|
+
throw new SkillMdError(errors, filePath);
|
|
140
|
+
if (!body) {
|
|
141
|
+
throw new SkillMdError([{ field: "body", message: "Missing markdown body (instructions)" }], filePath);
|
|
142
|
+
}
|
|
143
|
+
const index = buildIndex(data, filePath);
|
|
144
|
+
return { ...index, instructions: body };
|
|
145
|
+
}
|
|
146
|
+
/** Parse only the frontmatter of a SKILL.md file (index-only, skips body) */
|
|
147
|
+
export function parseSkillMdIndex(content, filePath = "") {
|
|
148
|
+
const { frontmatter } = splitFrontmatter(content);
|
|
149
|
+
if (!frontmatter) {
|
|
150
|
+
throw new SkillMdError([{ field: "(root)", message: "Missing YAML frontmatter (wrap in --- delimiters)" }], filePath);
|
|
151
|
+
}
|
|
152
|
+
const data = parse(frontmatter);
|
|
153
|
+
const errors = validateFrontmatter(data);
|
|
154
|
+
if (errors.length > 0)
|
|
155
|
+
throw new SkillMdError(errors, filePath);
|
|
156
|
+
return buildIndex(data, filePath);
|
|
157
|
+
}
|
|
158
|
+
/** Read a SKILL.md file from disk and parse into full SkillConfig */
|
|
159
|
+
export function loadSkillMd(filePath) {
|
|
160
|
+
const content = readFileSync(filePath, "utf-8");
|
|
161
|
+
return parseSkillMd(content, filePath);
|
|
162
|
+
}
|
|
163
|
+
/** Read a SKILL.md file from disk and parse only the index (frontmatter) */
|
|
164
|
+
export function loadSkillMdIndex(filePath) {
|
|
165
|
+
const content = readFileSync(filePath, "utf-8");
|
|
166
|
+
return parseSkillMdIndex(content, filePath);
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=md-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"md-parser.js","sourceRoot":"","sources":["../../src/skill/md-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
|
-
import type { SkillConfig } from "./types.js";
|
|
1
|
+
import type { SkillIndex, SkillConfig } from "./types.js";
|
|
2
2
|
import type { DomainPackageManifest } from "../package/types.js";
|
|
3
3
|
export interface SkillRegistryOptions {
|
|
4
4
|
readonly builtinSkills?: readonly SkillConfig[];
|
|
5
5
|
}
|
|
6
6
|
export declare class SkillRegistry {
|
|
7
|
-
private readonly
|
|
7
|
+
private readonly indexes;
|
|
8
|
+
private readonly fullCache;
|
|
8
9
|
constructor(options?: SkillRegistryOptions);
|
|
9
|
-
/** Register a skill. First-registered wins
|
|
10
|
-
register(
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
/** Register a skill index. First-registered wins. */
|
|
11
|
+
register(index: SkillIndex): void;
|
|
12
|
+
/** Register a full SkillConfig (for builtins or programmatic use). Stores index + caches full config. */
|
|
13
|
+
registerFull(config: SkillConfig): void;
|
|
14
|
+
get(name: string): SkillIndex | undefined;
|
|
15
|
+
all(): SkillIndex[];
|
|
16
|
+
/** Load full SkillConfig on demand. Reads file from disk if not already cached. */
|
|
17
|
+
load(name: string): SkillConfig | undefined;
|
|
18
|
+
/** Resolve skills matching any of the given names or tags. */
|
|
19
|
+
resolve(names?: readonly string[], tags?: readonly string[]): SkillIndex[];
|
|
20
|
+
/** Discover SKILL.md files from a directory. Returns number of skills loaded. */
|
|
14
21
|
discoverFrom(dirPath: string): number;
|
|
15
22
|
/** Discover skills from a domain package manifest. Returns number loaded. */
|
|
16
23
|
discoverFromPackage(manifest: DomainPackageManifest): number;
|
|
@@ -19,8 +26,9 @@ export declare class SkillRegistry {
|
|
|
19
26
|
* 1. workspace: projectPath/.kiln/skills/
|
|
20
27
|
* 2. user: userHome/.kiln/skills/
|
|
21
28
|
* 3. builtin (passed via constructor)
|
|
22
|
-
* Earlier tiers
|
|
29
|
+
* Earlier tiers win (workspace > user > builtin).
|
|
23
30
|
*/
|
|
24
31
|
discoverAll(projectPath: string, userHome: string): number;
|
|
32
|
+
private tryLoadIndex;
|
|
25
33
|
}
|
|
26
34
|
//# sourceMappingURL=skill-registry.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-registry.d.ts","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"skill-registry.d.ts","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,aAAa,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;CACjD;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;gBAEhD,OAAO,CAAC,EAAE,oBAAoB;IAQ1C,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAMjC,yGAAyG;IACzG,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAOvC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,GAAG,IAAI,UAAU,EAAE;IAInB,mFAAmF;IACnF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAgB3C,8DAA8D;IAC9D,OAAO,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,UAAU,EAAE;IAoB1E,iFAAiF;IACjF,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAqBrC,6EAA6E;IAC7E,mBAAmB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,MAAM;IAW5D;;;;;;OAMG;IACH,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAU1D,OAAO,CAAC,YAAY;CAYrB"}
|
|
@@ -1,43 +1,86 @@
|
|
|
1
1
|
import { existsSync, readdirSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { loadSkillMdIndex, loadSkillMd } from "./md-parser.js";
|
|
4
4
|
export class SkillRegistry {
|
|
5
|
-
|
|
5
|
+
indexes = new Map();
|
|
6
|
+
fullCache = new Map();
|
|
6
7
|
constructor(options) {
|
|
7
8
|
if (options?.builtinSkills) {
|
|
8
9
|
for (const skill of options.builtinSkills) {
|
|
9
|
-
this.
|
|
10
|
+
this.registerFull(skill);
|
|
10
11
|
}
|
|
11
12
|
}
|
|
12
13
|
}
|
|
13
|
-
/** Register a skill. First-registered wins
|
|
14
|
-
register(
|
|
15
|
-
if (!this.
|
|
16
|
-
this.
|
|
14
|
+
/** Register a skill index. First-registered wins. */
|
|
15
|
+
register(index) {
|
|
16
|
+
if (!this.indexes.has(index.name)) {
|
|
17
|
+
this.indexes.set(index.name, index);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Register a full SkillConfig (for builtins or programmatic use). Stores index + caches full config. */
|
|
21
|
+
registerFull(config) {
|
|
22
|
+
if (!this.indexes.has(config.name)) {
|
|
23
|
+
this.indexes.set(config.name, config);
|
|
24
|
+
this.fullCache.set(config.name, config);
|
|
17
25
|
}
|
|
18
26
|
}
|
|
19
27
|
get(name) {
|
|
20
|
-
return this.
|
|
28
|
+
return this.indexes.get(name);
|
|
21
29
|
}
|
|
22
30
|
all() {
|
|
23
|
-
return [...this.
|
|
31
|
+
return [...this.indexes.values()];
|
|
32
|
+
}
|
|
33
|
+
/** Load full SkillConfig on demand. Reads file from disk if not already cached. */
|
|
34
|
+
load(name) {
|
|
35
|
+
const cached = this.fullCache.get(name);
|
|
36
|
+
if (cached)
|
|
37
|
+
return cached;
|
|
38
|
+
const index = this.indexes.get(name);
|
|
39
|
+
if (!index?.filePath)
|
|
40
|
+
return undefined;
|
|
41
|
+
try {
|
|
42
|
+
const config = loadSkillMd(index.filePath);
|
|
43
|
+
this.fullCache.set(name, config);
|
|
44
|
+
return config;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/** Resolve skills matching any of the given names or tags. */
|
|
51
|
+
resolve(names, tags) {
|
|
52
|
+
if (!names?.length && !tags?.length)
|
|
53
|
+
return [];
|
|
54
|
+
const nameSet = names ? new Set(names) : undefined;
|
|
55
|
+
const tagSet = tags ? new Set(tags) : undefined;
|
|
56
|
+
const results = [];
|
|
57
|
+
for (const index of this.indexes.values()) {
|
|
58
|
+
if (nameSet?.has(index.name)) {
|
|
59
|
+
results.push(index);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (tagSet && index.tags.some((t) => tagSet.has(t))) {
|
|
63
|
+
results.push(index);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return results;
|
|
24
67
|
}
|
|
25
|
-
/** Discover
|
|
68
|
+
/** Discover SKILL.md files from a directory. Returns number of skills loaded. */
|
|
26
69
|
discoverFrom(dirPath) {
|
|
27
70
|
if (!existsSync(dirPath))
|
|
28
71
|
return 0;
|
|
29
|
-
const
|
|
72
|
+
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
30
73
|
let loaded = 0;
|
|
31
|
-
for (const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
loaded
|
|
74
|
+
for (const entry of entries) {
|
|
75
|
+
// Convention: each skill is a directory containing SKILL.md, or a flat SKILL.md file
|
|
76
|
+
if (entry.isDirectory()) {
|
|
77
|
+
const skillMdPath = join(dirPath, entry.name, "SKILL.md");
|
|
78
|
+
if (existsSync(skillMdPath)) {
|
|
79
|
+
loaded += this.tryLoadIndex(skillMdPath);
|
|
37
80
|
}
|
|
38
81
|
}
|
|
39
|
-
|
|
40
|
-
|
|
82
|
+
else if (entry.name.endsWith(".md")) {
|
|
83
|
+
loaded += this.tryLoadIndex(join(dirPath, entry.name));
|
|
41
84
|
}
|
|
42
85
|
}
|
|
43
86
|
return loaded;
|
|
@@ -49,16 +92,7 @@ export class SkillRegistry {
|
|
|
49
92
|
let loaded = 0;
|
|
50
93
|
for (const skillPath of manifest.skills) {
|
|
51
94
|
const fullPath = join(manifest.installPath, skillPath);
|
|
52
|
-
|
|
53
|
-
const skill = loadSkillYaml(fullPath);
|
|
54
|
-
if (!this.skills.has(skill.name)) {
|
|
55
|
-
this.skills.set(skill.name, skill);
|
|
56
|
-
loaded++;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// Skip invalid skill files silently
|
|
61
|
-
}
|
|
95
|
+
loaded += this.tryLoadIndex(fullPath);
|
|
62
96
|
}
|
|
63
97
|
return loaded;
|
|
64
98
|
}
|
|
@@ -67,7 +101,7 @@ export class SkillRegistry {
|
|
|
67
101
|
* 1. workspace: projectPath/.kiln/skills/
|
|
68
102
|
* 2. user: userHome/.kiln/skills/
|
|
69
103
|
* 3. builtin (passed via constructor)
|
|
70
|
-
* Earlier tiers
|
|
104
|
+
* Earlier tiers win (workspace > user > builtin).
|
|
71
105
|
*/
|
|
72
106
|
discoverAll(projectPath, userHome) {
|
|
73
107
|
const workspaceDir = join(projectPath, ".kiln", "skills");
|
|
@@ -77,5 +111,18 @@ export class SkillRegistry {
|
|
|
77
111
|
total += this.discoverFrom(userDir);
|
|
78
112
|
return total;
|
|
79
113
|
}
|
|
114
|
+
tryLoadIndex(filePath) {
|
|
115
|
+
try {
|
|
116
|
+
const index = loadSkillMdIndex(filePath);
|
|
117
|
+
if (!this.indexes.has(index.name)) {
|
|
118
|
+
this.indexes.set(index.name, index);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// Skip invalid files silently
|
|
124
|
+
}
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
80
127
|
}
|
|
81
128
|
//# sourceMappingURL=skill-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"skill-registry.js","sourceRoot":"","sources":["../../src/skill/skill-registry.ts"],"names":[],"mappings":"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"}
|
package/dist/skill/types.d.ts
CHANGED
|
@@ -4,14 +4,18 @@ export interface SkillTrigger {
|
|
|
4
4
|
readonly event: EventType;
|
|
5
5
|
readonly filter?: Record<string, unknown>;
|
|
6
6
|
}
|
|
7
|
-
/**
|
|
8
|
-
export interface
|
|
7
|
+
/** Lightweight index entry — loaded at discovery time (progressive disclosure) */
|
|
8
|
+
export interface SkillIndex {
|
|
9
9
|
readonly name: string;
|
|
10
10
|
readonly description: string;
|
|
11
11
|
readonly tools: readonly string[];
|
|
12
12
|
readonly triggers: readonly SkillTrigger[];
|
|
13
13
|
readonly tags: readonly string[];
|
|
14
|
-
readonly instructions: string;
|
|
15
14
|
readonly handler?: string;
|
|
15
|
+
readonly filePath: string;
|
|
16
|
+
}
|
|
17
|
+
/** Full skill config — loaded on activation. Body is the markdown instructions. */
|
|
18
|
+
export interface SkillConfig extends SkillIndex {
|
|
19
|
+
readonly instructions: string;
|
|
16
20
|
}
|
|
17
21
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skill/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/skill/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,kFAAkF;AAClF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,mFAAmF;AACnF,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC7C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B"}
|
package/package.json
CHANGED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { KilnError } from "../engine/errors.js";
|
|
2
|
-
import type { SkillConfig } from "./types.js";
|
|
3
|
-
export declare class SkillYamlError extends KilnError {
|
|
4
|
-
readonly errors: readonly {
|
|
5
|
-
field: string;
|
|
6
|
-
message: string;
|
|
7
|
-
}[];
|
|
8
|
-
readonly filePath?: string;
|
|
9
|
-
constructor(errors: readonly {
|
|
10
|
-
field: string;
|
|
11
|
-
message: string;
|
|
12
|
-
}[], filePath?: string);
|
|
13
|
-
}
|
|
14
|
-
/** Parse a YAML string into a validated SkillConfig */
|
|
15
|
-
export declare function parseSkillYaml(content: string, filePath?: string): SkillConfig;
|
|
16
|
-
/** Read a YAML file from disk and parse into SkillConfig */
|
|
17
|
-
export declare function loadSkillYaml(filePath: string): SkillConfig;
|
|
18
|
-
//# sourceMappingURL=yaml-parser.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-parser.d.ts","sourceRoot":"","sources":["../../src/skill/yaml-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAQ9C,qBAAa,cAAe,SAAQ,SAAS;IAC3C,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;gBAGzB,MAAM,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EACrD,QAAQ,CAAC,EAAE,MAAM;CAWpB;AAED,uDAAuD;AACvD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAkC9E;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAG3D"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { parse } from "yaml";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import { KilnError } from "../engine/errors.js";
|
|
4
|
-
import { validateSkillYaml } from "./yaml-schema.js";
|
|
5
|
-
import { EVENT_LEVEL_MAP } from "../events/index.js";
|
|
6
|
-
const VALID_EVENT_TYPES = new Set(Object.keys(EVENT_LEVEL_MAP));
|
|
7
|
-
export class SkillYamlError extends KilnError {
|
|
8
|
-
errors;
|
|
9
|
-
filePath;
|
|
10
|
-
constructor(errors, filePath) {
|
|
11
|
-
const msg = errors.map((e) => ` ${e.field}: ${e.message}`).join("\n");
|
|
12
|
-
super("SKILL_YAML_INVALID", `Invalid skill YAML${filePath ? ` (${filePath})` : ""}:\n${msg}`, {
|
|
13
|
-
context: { errors, filePath },
|
|
14
|
-
retryable: false,
|
|
15
|
-
});
|
|
16
|
-
this.name = "SkillYamlError";
|
|
17
|
-
this.errors = errors;
|
|
18
|
-
this.filePath = filePath;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/** Parse a YAML string into a validated SkillConfig */
|
|
22
|
-
export function parseSkillYaml(content, filePath) {
|
|
23
|
-
const data = parse(content);
|
|
24
|
-
const errors = validateSkillYaml(data, filePath);
|
|
25
|
-
if (errors.length > 0)
|
|
26
|
-
throw new SkillYamlError(errors, filePath);
|
|
27
|
-
// Safe cast: validation above confirmed the required shape
|
|
28
|
-
const yaml = data;
|
|
29
|
-
// Validate trigger event values against known EventType strings
|
|
30
|
-
const triggerErrors = [];
|
|
31
|
-
const rawTriggers = yaml.triggers ?? [];
|
|
32
|
-
for (let i = 0; i < rawTriggers.length; i++) {
|
|
33
|
-
const trigger = rawTriggers[i];
|
|
34
|
-
if (!VALID_EVENT_TYPES.has(trigger.event)) {
|
|
35
|
-
triggerErrors.push({
|
|
36
|
-
field: `triggers[${i}].event`,
|
|
37
|
-
message: `Unknown event type "${trigger.event}"`,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
if (triggerErrors.length > 0)
|
|
42
|
-
throw new SkillYamlError(triggerErrors, filePath);
|
|
43
|
-
return {
|
|
44
|
-
name: yaml.name,
|
|
45
|
-
description: yaml.description,
|
|
46
|
-
tools: yaml.tools ?? [],
|
|
47
|
-
triggers: rawTriggers.map((t) => ({
|
|
48
|
-
event: t.event,
|
|
49
|
-
...(t.filter !== undefined ? { filter: t.filter } : {}),
|
|
50
|
-
})),
|
|
51
|
-
tags: yaml.tags ?? [],
|
|
52
|
-
instructions: yaml.instructions,
|
|
53
|
-
...(yaml.handler !== undefined ? { handler: yaml.handler } : {}),
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
/** Read a YAML file from disk and parse into SkillConfig */
|
|
57
|
-
export function loadSkillYaml(filePath) {
|
|
58
|
-
const content = readFileSync(filePath, "utf-8");
|
|
59
|
-
return parseSkillYaml(content, filePath);
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=yaml-parser.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-parser.js","sourceRoot":"","sources":["../../src/skill/yaml-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type { YamlValidationError } from "../domain/yaml-schema.js";
|
|
2
|
-
export type { YamlValidationError };
|
|
3
|
-
/** Trigger as expressed in YAML */
|
|
4
|
-
export interface SkillTriggerYaml {
|
|
5
|
-
readonly event: string;
|
|
6
|
-
readonly filter?: Record<string, unknown>;
|
|
7
|
-
}
|
|
8
|
-
/** Skill config as expressed in YAML */
|
|
9
|
-
export interface SkillYaml {
|
|
10
|
-
readonly name: string;
|
|
11
|
-
readonly description: string;
|
|
12
|
-
readonly tools?: readonly string[];
|
|
13
|
-
readonly triggers?: readonly SkillTriggerYaml[];
|
|
14
|
-
readonly tags?: readonly string[];
|
|
15
|
-
readonly instructions: string;
|
|
16
|
-
readonly handler?: string;
|
|
17
|
-
}
|
|
18
|
-
/** Validate a parsed YAML object against the SkillYaml schema */
|
|
19
|
-
export declare function validateSkillYaml(data: unknown, filePath?: string): YamlValidationError[];
|
|
20
|
-
//# sourceMappingURL=yaml-schema.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"yaml-schema.d.ts","sourceRoot":"","sources":["../../src/skill/yaml-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGpE,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,mCAAmC;AACnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,wCAAwC;AACxC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAID,iEAAiE;AACjE,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,OAAO,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,mBAAmB,EAAE,CA+EvB"}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
const REQUIRED_FIELDS = ["name", "description", "instructions"];
|
|
2
|
-
/** Validate a parsed YAML object against the SkillYaml schema */
|
|
3
|
-
export function validateSkillYaml(data, filePath) {
|
|
4
|
-
const errors = [];
|
|
5
|
-
if (typeof data !== "object" || data === null || Array.isArray(data)) {
|
|
6
|
-
errors.push({ field: "(root)", message: "Expected an object", filePath });
|
|
7
|
-
return errors;
|
|
8
|
-
}
|
|
9
|
-
const obj = data;
|
|
10
|
-
// Required fields
|
|
11
|
-
for (const field of REQUIRED_FIELDS) {
|
|
12
|
-
if (!(field in obj)) {
|
|
13
|
-
errors.push({ field, message: `Missing required field "${field}"`, filePath });
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
// Type checks for present fields
|
|
17
|
-
if ("name" in obj && typeof obj.name !== "string") {
|
|
18
|
-
errors.push({ field: "name", message: `Expected string, got ${typeof obj.name}`, filePath });
|
|
19
|
-
}
|
|
20
|
-
if ("description" in obj && typeof obj.description !== "string") {
|
|
21
|
-
errors.push({ field: "description", message: `Expected string, got ${typeof obj.description}`, filePath });
|
|
22
|
-
}
|
|
23
|
-
if ("instructions" in obj && typeof obj.instructions !== "string") {
|
|
24
|
-
errors.push({ field: "instructions", message: `Expected string, got ${typeof obj.instructions}`, filePath });
|
|
25
|
-
}
|
|
26
|
-
if ("handler" in obj && typeof obj.handler !== "string") {
|
|
27
|
-
errors.push({ field: "handler", message: `Expected string, got ${typeof obj.handler}`, filePath });
|
|
28
|
-
}
|
|
29
|
-
// tools: optional array of strings
|
|
30
|
-
if ("tools" in obj) {
|
|
31
|
-
if (!Array.isArray(obj.tools)) {
|
|
32
|
-
errors.push({ field: "tools", message: `Expected array, got ${typeof obj.tools}`, filePath });
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
for (let i = 0; i < obj.tools.length; i++) {
|
|
36
|
-
if (typeof obj.tools[i] !== "string") {
|
|
37
|
-
errors.push({ field: `tools[${i}]`, message: `Expected string, got ${typeof obj.tools[i]}`, filePath });
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
// tags: optional array of strings
|
|
43
|
-
if ("tags" in obj) {
|
|
44
|
-
if (!Array.isArray(obj.tags)) {
|
|
45
|
-
errors.push({ field: "tags", message: `Expected array, got ${typeof obj.tags}`, filePath });
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
for (let i = 0; i < obj.tags.length; i++) {
|
|
49
|
-
if (typeof obj.tags[i] !== "string") {
|
|
50
|
-
errors.push({ field: `tags[${i}]`, message: `Expected string, got ${typeof obj.tags[i]}`, filePath });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
// triggers: optional array of objects with event=string
|
|
56
|
-
if ("triggers" in obj) {
|
|
57
|
-
if (!Array.isArray(obj.triggers)) {
|
|
58
|
-
errors.push({ field: "triggers", message: `Expected array, got ${typeof obj.triggers}`, filePath });
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
for (let i = 0; i < obj.triggers.length; i++) {
|
|
62
|
-
const trigger = obj.triggers[i];
|
|
63
|
-
if (typeof trigger !== "object" || trigger === null || Array.isArray(trigger)) {
|
|
64
|
-
errors.push({ field: `triggers[${i}]`, message: "Expected an object", filePath });
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
const t = trigger;
|
|
68
|
-
if (!("event" in t)) {
|
|
69
|
-
errors.push({ field: `triggers[${i}].event`, message: `Missing required field "event"`, filePath });
|
|
70
|
-
}
|
|
71
|
-
else if (typeof t.event !== "string") {
|
|
72
|
-
errors.push({ field: `triggers[${i}].event`, message: `Expected string, got ${typeof t.event}`, filePath });
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return errors;
|
|
79
|
-
}
|
|
80
|
-
//# sourceMappingURL=yaml-schema.js.map
|