@agentxm/extension-content 0.49.3 → 0.50.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/src/content/frontmatter.d.ts +16 -0
- package/dist/src/content/frontmatter.js +6 -4
- package/dist/src/content/skill-content.d.ts +13 -14
- package/dist/src/content/skill-content.js +8 -46
- package/dist/src/content/subagent-content.js +14 -10
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.js +3 -3
- package/dist/src/knowledge/index.d.ts +1 -1
- package/dist/src/knowledge/index.js +2 -2
- package/dist/src/knowledge/okf.d.ts +52 -1
- package/dist/src/knowledge/okf.js +86 -59
- package/dist/src/knowledge/package-inspection.d.ts +4 -7
- package/dist/src/knowledge/package-inspection.js +7 -19
- package/dist/src/lint/accessor/platform.d.ts +54 -0
- package/dist/src/lint/accessor/platform.js +89 -0
- package/dist/src/lint/{catalog/pack-accessor → accessor}/vft.d.ts +12 -14
- package/dist/src/lint/accessor/vft.js +83 -0
- package/dist/src/lint/catalog/hook/entrypoint-exists.d.ts +2 -2
- package/dist/src/lint/catalog/hook/entrypoint-exists.js +4 -3
- package/dist/src/lint/catalog/hook/envelope.d.ts +6 -6
- package/dist/src/lint/catalog/hook/envelope.js +5 -4
- package/dist/src/lint/catalog/hook/native-bindings-supported.d.ts +2 -2
- package/dist/src/lint/catalog/hook/native-bindings-supported.js +4 -3
- package/dist/src/lint/catalog/hook.d.ts +2 -2
- package/dist/src/lint/catalog/hook.js +1 -1
- package/dist/src/lint/catalog/knowledge/diagnostics.js +4 -3
- package/dist/src/lint/catalog/knowledge/envelope.d.ts +1 -1
- package/dist/src/lint/catalog/knowledge/envelope.js +4 -3
- package/dist/src/lint/catalog/mcp-server/envelope.d.ts +2 -2
- package/dist/src/lint/catalog/mcp-server/envelope.js +4 -3
- package/dist/src/lint/catalog/mcp-server.d.ts +2 -2
- package/dist/src/lint/catalog/{pack-accessor → pack}/contexts.d.ts +6 -6
- package/dist/src/lint/catalog/{pack-accessor → pack}/contexts.js +4 -4
- package/dist/src/lint/catalog/pack/envelope.d.ts +10 -0
- package/dist/src/lint/catalog/pack/envelope.js +20 -0
- package/dist/src/lint/catalog/pack.d.ts +9 -10
- package/dist/src/lint/catalog/pack.js +12 -15
- package/dist/src/lint/catalog/rule/envelope.d.ts +2 -2
- package/dist/src/lint/catalog/rule/envelope.js +4 -3
- package/dist/src/lint/catalog/rule.d.ts +2 -2
- package/dist/src/lint/catalog/shared/envelope-rules.d.ts +23 -12
- package/dist/src/lint/catalog/shared/envelope-rules.js +22 -13
- package/dist/src/lint/catalog/shared/manifest-present.d.ts +3 -4
- package/dist/src/lint/catalog/shared/recommended-packs-rules.js +5 -3
- package/dist/src/lint/catalog/shared/schema-rule.js +3 -3
- package/dist/src/lint/catalog/{skill-accessor → skill}/contexts.d.ts +5 -5
- package/dist/src/lint/catalog/{skill-accessor → skill}/contexts.js +3 -3
- package/dist/src/lint/catalog/skill/envelope.d.ts +11 -0
- package/dist/src/lint/catalog/skill/envelope.js +23 -0
- package/dist/src/lint/catalog/skill/frontmatter-parseable.d.ts +6 -4
- package/dist/src/lint/catalog/skill/frontmatter-parseable.js +17 -21
- package/dist/src/lint/catalog/skill/frontmatter-standard-valid.js +7 -12
- package/dist/src/lint/catalog/skill.d.ts +4 -5
- package/dist/src/lint/catalog/skill.js +11 -16
- package/dist/src/lint/catalog/subagent/envelope.d.ts +2 -2
- package/dist/src/lint/catalog/subagent/envelope.js +4 -3
- package/dist/src/lint/catalog/subagent.d.ts +2 -2
- package/dist/src/lint/context.d.ts +39 -115
- package/dist/src/lint/describe-document.d.ts +1 -1
- package/dist/src/lint/describe-document.js +4 -5
- package/dist/src/lint/index.d.ts +5 -7
- package/dist/src/lint/index.js +5 -7
- package/dist/src/packaging/archive-guardrails.d.ts +11 -0
- package/dist/src/packaging/archive-guardrails.js +111 -74
- package/dist/src/packaging/filtered-package-validation.js +3 -4
- package/dist/src/packaging/manifest-file.d.ts +7 -3
- package/dist/src/packaging/manifest-file.js +10 -11
- package/dist/src/packaging/manifest-policy.d.ts +0 -12
- package/dist/src/packaging/manifest-policy.js +12 -26
- package/dist/src/packaging/test-zip-helpers.js +4 -3
- package/package.json +8 -4
- package/dist/src/lint/catalog/pack/manifest-keys-recognized.d.ts +0 -28
- package/dist/src/lint/catalog/pack/manifest-keys-recognized.js +0 -38
- package/dist/src/lint/catalog/pack/manifest-present.d.ts +0 -17
- package/dist/src/lint/catalog/pack/manifest-present.js +0 -24
- package/dist/src/lint/catalog/pack/manifest-schema-valid.d.ts +0 -25
- package/dist/src/lint/catalog/pack/manifest-schema-valid.js +0 -33
- package/dist/src/lint/catalog/pack-accessor/platform.d.ts +0 -56
- package/dist/src/lint/catalog/pack-accessor/platform.js +0 -93
- package/dist/src/lint/catalog/pack-accessor/vft.js +0 -85
- package/dist/src/lint/catalog/skill/manifest-keys-recognized.d.ts +0 -26
- package/dist/src/lint/catalog/skill/manifest-keys-recognized.js +0 -41
- package/dist/src/lint/catalog/skill/manifest-present.d.ts +0 -23
- package/dist/src/lint/catalog/skill/manifest-present.js +0 -32
- package/dist/src/lint/catalog/skill/manifest-schema-valid.d.ts +0 -21
- package/dist/src/lint/catalog/skill/manifest-schema-valid.js +0 -36
- package/dist/src/lint/catalog/skill/recommended-packs-valid.d.ts +0 -8
- package/dist/src/lint/catalog/skill/recommended-packs-valid.js +0 -12
- package/dist/src/lint/catalog/skill/standalone-declaration-valid.d.ts +0 -8
- package/dist/src/lint/catalog/skill/standalone-declaration-valid.js +0 -12
- package/dist/src/lint/catalog/skill-accessor/platform.d.ts +0 -53
- package/dist/src/lint/catalog/skill-accessor/platform.js +0 -90
- package/dist/src/lint/catalog/skill-accessor/vft.d.ts +0 -77
- package/dist/src/lint/catalog/skill-accessor/vft.js +0 -135
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
* Cascade (reports the first failure in the order below; later arms
|
|
6
6
|
* short-circuit):
|
|
7
7
|
*
|
|
8
|
-
* 1. SKILL.md begins with `---` at byte 0 (no BOM, no leading
|
|
9
|
-
* leading HTML comment). This is the arm that caught the
|
|
8
|
+
* 1. SKILL.md begins with a `---` line at byte 0 (no BOM, no leading
|
|
9
|
+
* whitespace, no leading HTML comment). This is the arm that caught the
|
|
10
10
|
* `@agentxm/skills/axm` regression — an HTML comment preceded the
|
|
11
11
|
* frontmatter delimiter, so YAML parsers silently treated the content as
|
|
12
12
|
* body.
|
|
13
|
-
* 2.
|
|
14
|
-
*
|
|
13
|
+
* 2. A closing `---` line ends the block. Delimiters are located by
|
|
14
|
+
* `findFrontmatterBoundaries`, the same grammar `parseSkillMd` uses.
|
|
15
|
+
* 3. Frontmatter YAML parses without error.
|
|
16
|
+
* 4. Parsed frontmatter is a mapping (not a list, not a scalar).
|
|
15
17
|
*
|
|
16
18
|
* Presence is handled by `skill/skill-md-present`; this rule early-returns
|
|
17
19
|
* `[]` when `SKILL.md` is absent.
|
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
* Cascade (reports the first failure in the order below; later arms
|
|
6
6
|
* short-circuit):
|
|
7
7
|
*
|
|
8
|
-
* 1. SKILL.md begins with `---` at byte 0 (no BOM, no leading
|
|
9
|
-
* leading HTML comment). This is the arm that caught the
|
|
8
|
+
* 1. SKILL.md begins with a `---` line at byte 0 (no BOM, no leading
|
|
9
|
+
* whitespace, no leading HTML comment). This is the arm that caught the
|
|
10
10
|
* `@agentxm/skills/axm` regression — an HTML comment preceded the
|
|
11
11
|
* frontmatter delimiter, so YAML parsers silently treated the content as
|
|
12
12
|
* body.
|
|
13
|
-
* 2.
|
|
14
|
-
*
|
|
13
|
+
* 2. A closing `---` line ends the block. Delimiters are located by
|
|
14
|
+
* `findFrontmatterBoundaries`, the same grammar `parseSkillMd` uses.
|
|
15
|
+
* 3. Frontmatter YAML parses without error.
|
|
16
|
+
* 4. Parsed frontmatter is a mapping (not a list, not a scalar).
|
|
15
17
|
*
|
|
16
18
|
* Presence is handled by `skill/skill-md-present`; this rule early-returns
|
|
17
19
|
* `[]` when `SKILL.md` is absent.
|
|
@@ -26,7 +28,9 @@
|
|
|
26
28
|
* @packageDocumentation
|
|
27
29
|
*/
|
|
28
30
|
import * as Effect from "effect/Effect";
|
|
31
|
+
import * as Predicate from "effect/Predicate";
|
|
29
32
|
import YAML from "yaml";
|
|
33
|
+
import { findFrontmatterBoundaries } from "../../../content/frontmatter.js";
|
|
30
34
|
const RULE_ID = "skill/frontmatter-parseable";
|
|
31
35
|
const SKILL_MD = "SKILL.md";
|
|
32
36
|
const DELIMITER = "---";
|
|
@@ -70,9 +74,7 @@ const evaluateCascade = (content) => {
|
|
|
70
74
|
}
|
|
71
75
|
const parsed = parseFrontmatterYaml(content);
|
|
72
76
|
if (parsed === undefined) {
|
|
73
|
-
//
|
|
74
|
-
// already handled the "literally no ---" case; reaching here means the
|
|
75
|
-
// delimiter was found but the closing delimiter is missing).
|
|
77
|
+
// Arm 1 guaranteed the opening `---` line, so the closing one is missing.
|
|
76
78
|
return [
|
|
77
79
|
finding("SKILL.md frontmatter is malformed because the closing `---` delimiter is missing. Add a closing `---` after the frontmatter block."),
|
|
78
80
|
];
|
|
@@ -82,7 +84,7 @@ const evaluateCascade = (content) => {
|
|
|
82
84
|
finding(`SKILL.md frontmatter YAML is invalid. Detail: ${parsed.message}. Fix the YAML syntax in the frontmatter block.`),
|
|
83
85
|
];
|
|
84
86
|
}
|
|
85
|
-
if (!
|
|
87
|
+
if (!Predicate.isReadonlyObject(parsed.value)) {
|
|
86
88
|
return [
|
|
87
89
|
finding("SKILL.md frontmatter must be a YAML mapping, not a list or scalar. Rewrite the frontmatter block in `SKILL.md` as `key: value` pairs."),
|
|
88
90
|
];
|
|
@@ -97,7 +99,9 @@ const detectLeadingBytes = (content) => {
|
|
|
97
99
|
return finding("SKILL.md starts with a UTF-8 BOM before the frontmatter delimiter. Remove the BOM so the file starts with `---`.", { line: 1 });
|
|
98
100
|
}
|
|
99
101
|
if (content.startsWith(DELIMITER)) {
|
|
100
|
-
return
|
|
102
|
+
return content.split(/\r?\n/u, 1)[0] === DELIMITER
|
|
103
|
+
? undefined
|
|
104
|
+
: finding("SKILL.md frontmatter must open with a line containing only `---`. Move any text after the opening delimiter onto the next line.", { line: 1 });
|
|
101
105
|
}
|
|
102
106
|
// Any non-`---` leading content is a cascade-arm-1 violation. Detect the
|
|
103
107
|
// common HTML-comment case explicitly so the finding message is clear.
|
|
@@ -107,21 +111,14 @@ const detectLeadingBytes = (content) => {
|
|
|
107
111
|
return finding("SKILL.md must start with the frontmatter delimiter `---`. Remove any leading content so the file starts with `---`.", { line: 1 });
|
|
108
112
|
};
|
|
109
113
|
const parseFrontmatterYaml = (content) => {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
const afterOpening = content.indexOf("\n");
|
|
113
|
-
if (afterOpening === -1) {
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
const closingIndex = content.indexOf(`\n${DELIMITER}`, afterOpening);
|
|
117
|
-
if (closingIndex === -1) {
|
|
114
|
+
const boundaries = findFrontmatterBoundaries(content);
|
|
115
|
+
if (boundaries === undefined) {
|
|
118
116
|
return undefined;
|
|
119
117
|
}
|
|
120
|
-
const yamlContent = content.slice(afterOpening + 1, closingIndex);
|
|
121
118
|
try {
|
|
122
119
|
// YAML.parse returns `null | undefined` for empty input; we care about
|
|
123
120
|
// shape, not emptiness at this arm.
|
|
124
|
-
const value = YAML.parse(
|
|
121
|
+
const value = YAML.parse(content.slice(boundaries.yamlStart, boundaries.yamlEnd));
|
|
125
122
|
return { kind: "parsed", value };
|
|
126
123
|
}
|
|
127
124
|
catch (error) {
|
|
@@ -131,7 +128,6 @@ const parseFrontmatterYaml = (content) => {
|
|
|
131
128
|
};
|
|
132
129
|
}
|
|
133
130
|
};
|
|
134
|
-
const isMapping = (value) => value !== null && typeof value === "object" && !Array.isArray(value);
|
|
135
131
|
// -----------------------------------------------------------------------------
|
|
136
132
|
// Finding helpers
|
|
137
133
|
// -----------------------------------------------------------------------------
|
|
@@ -146,4 +142,4 @@ const finding = (message, position) => ({
|
|
|
146
142
|
...(position?.column !== undefined ? { column: position.column } : {}),
|
|
147
143
|
},
|
|
148
144
|
});
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRtYXR0ZXItcGFyc2VhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnQvY2F0YWxvZy9za2lsbC9mcm9udG1hdHRlci1wYXJzZWFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Qkc7QUFFSCxPQUFPLEtBQUssTUFBTSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUk1RSxNQUFNLE9BQU8sR0FBRyw2QkFBNkIsQ0FBQztBQUM5QyxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUM7QUFDNUIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDO0FBQ3hCLHlFQUF5RTtBQUN6RSw4Q0FBOEM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDO0FBRTFCLDRFQUE0RTtBQUM1RSwrREFBK0Q7QUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUU1RSxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBbUM7SUFDdEUsRUFBRSxFQUFFLE9BQU87SUFDWCxnQkFBZ0IsRUFBRSxLQUFLO0lBQ3ZCLFdBQVcsRUFBRSwrQ0FBK0M7SUFDNUQsSUFBSSxFQUFFLFVBQVU7SUFDaEIsUUFBUSxFQUFFLE9BQU87SUFDakIsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDakIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7UUFDbEIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxN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
|
|
@@ -8,25 +8,20 @@
|
|
|
8
8
|
* @experimental This API is unstable and may change without notice.
|
|
9
9
|
*/
|
|
10
10
|
import * as Effect from "effect/Effect";
|
|
11
|
+
import * as Predicate from "effect/Predicate";
|
|
11
12
|
import YAML from "yaml";
|
|
13
|
+
import { findFrontmatterBoundaries } from "../../../content/frontmatter.js";
|
|
12
14
|
import { validateSkillFrontmatter } from "../../../content/skill-content.js";
|
|
13
15
|
const RULE_ID = "skill/frontmatter-standard-valid";
|
|
14
16
|
const SKILL_MD = "SKILL.md";
|
|
15
17
|
const decoder = new TextDecoder("utf-8", { fatal: false, ignoreBOM: true });
|
|
16
18
|
const parseFrontmatterMapping = (content) => {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const openingEnd = content.indexOf("\n");
|
|
20
|
-
if (openingEnd === -1)
|
|
21
|
-
return undefined;
|
|
22
|
-
const closingStart = content.indexOf("\n---", openingEnd);
|
|
23
|
-
if (closingStart === -1)
|
|
19
|
+
const boundaries = findFrontmatterBoundaries(content);
|
|
20
|
+
if (boundaries === undefined)
|
|
24
21
|
return undefined;
|
|
25
22
|
try {
|
|
26
|
-
const parsed = YAML.parse(content.slice(
|
|
27
|
-
return parsed
|
|
28
|
-
? parsed
|
|
29
|
-
: undefined;
|
|
23
|
+
const parsed = YAML.parse(content.slice(boundaries.yamlStart, boundaries.yamlEnd));
|
|
24
|
+
return Predicate.isObject(parsed) ? parsed : undefined;
|
|
30
25
|
}
|
|
31
26
|
catch {
|
|
32
27
|
return undefined;
|
|
@@ -59,4 +54,4 @@ export const frontmatterStandardValidRule = {
|
|
|
59
54
|
return validation.valid ? [] : validation.errors.map(finding);
|
|
60
55
|
}),
|
|
61
56
|
};
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRtYXR0ZXItc3RhbmRhcmQtdmFsaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3NraWxsL2Zyb250bWF0dGVyLXN0YW5kYXJkLXZhbGlkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFJN0UsTUFBTSxPQUFPLEdBQUcsa0NBQWtDLENBQUM7QUFDbkQsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDO0FBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFFNUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE9BQWUsRUFBdUIsRUFBRTtJQUN2RSxNQUFNLFVBQVUsR0FBRyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN0RCxJQUFJLFVBQVUsS0FBSyxTQUFTO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDL0MsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUYsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBZSxFQUFtQixFQUFFLENBQUMsQ0FBQztJQUNyRCxJQUFJLEVBQUUsVUFBVTtJQUNoQixNQUFNLEVBQUUsT0FBTztJQUNmLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLE9BQU87SUFDUCxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUU7Q0FDdEMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQW1DO0lBQzFFLEVBQUUsRUFBRSxPQUFPO0lBQ1gsZ0JBQWdCLEVBQUUsS0FBSztJQUN2QixXQUFXLEVBQUUsaUVBQWlFO0lBQzlFLElBQUksRUFBRSxVQUFVO0lBQ2hCLFFBQVEsRUFBRSxPQUFPO0lBQ2pCLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQ2pCLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDO1FBQ2xCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDdkIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQzVDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUM5QyxDQUFDO1FBQ0YsSUFBSSxPQUFPLEtBQUssU0FBUztZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksTUFBTSxLQUFLLFNBQVM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRixPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEUsQ0FBQyxDQUFDO0NBQ0wsQ0FBQyJ9
|
|
@@ -15,12 +15,11 @@
|
|
|
15
15
|
* | `skill/standalone-declaration-valid` | warning | — |
|
|
16
16
|
* | `skill/recommended-packs-valid` | warning | — |
|
|
17
17
|
*
|
|
18
|
-
* The
|
|
19
|
-
*
|
|
18
|
+
* The `skill.json` rules are the shared manifest envelope (`./skill/envelope.ts`),
|
|
19
|
+
* interleaved with the skill content rules. They apply to native skills only;
|
|
20
|
+
* a non-native skill carries no manifest, so they produce no findings for it.
|
|
20
21
|
*
|
|
21
|
-
* All ship `kind: "advisory"`.
|
|
22
|
-
* expressed via `check` early-return (no separate `applies` predicate); see
|
|
23
|
-
* each rule's module for the guard.
|
|
22
|
+
* All ship `kind: "advisory"`.
|
|
24
23
|
*
|
|
25
24
|
* @experimental This API is unstable and may change without notice.
|
|
26
25
|
* @packageDocumentation
|
|
@@ -15,24 +15,19 @@
|
|
|
15
15
|
* | `skill/standalone-declaration-valid` | warning | — |
|
|
16
16
|
* | `skill/recommended-packs-valid` | warning | — |
|
|
17
17
|
*
|
|
18
|
-
* The
|
|
19
|
-
*
|
|
18
|
+
* The `skill.json` rules are the shared manifest envelope (`./skill/envelope.ts`),
|
|
19
|
+
* interleaved with the skill content rules. They apply to native skills only;
|
|
20
|
+
* a non-native skill carries no manifest, so they produce no findings for it.
|
|
20
21
|
*
|
|
21
|
-
* All ship `kind: "advisory"`.
|
|
22
|
-
* expressed via `check` early-return (no separate `applies` predicate); see
|
|
23
|
-
* each rule's module for the guard.
|
|
22
|
+
* All ship `kind: "advisory"`.
|
|
24
23
|
*
|
|
25
24
|
* @experimental This API is unstable and may change without notice.
|
|
26
25
|
* @packageDocumentation
|
|
27
26
|
*/
|
|
28
27
|
import { skillMdPresentRule } from "./skill/skill-md-present.js";
|
|
29
|
-
import {
|
|
28
|
+
import { skillEnvelopeRules } from "./skill/envelope.js";
|
|
30
29
|
import { frontmatterParseableRule } from "./skill/frontmatter-parseable.js";
|
|
31
30
|
import { frontmatterStandardValidRule } from "./skill/frontmatter-standard-valid.js";
|
|
32
|
-
import { manifestSchemaValidRule } from "./skill/manifest-schema-valid.js";
|
|
33
|
-
import { manifestKeysRecognizedRule } from "./skill/manifest-keys-recognized.js";
|
|
34
|
-
import { recommendedPacksValidRule } from "./skill/recommended-packs-valid.js";
|
|
35
|
-
import { standaloneDeclarationValidRule } from "./skill/standalone-declaration-valid.js";
|
|
36
31
|
/**
|
|
37
32
|
* Ordered `skill/*` rule catalog. Declaration order is the evaluation
|
|
38
33
|
* order within a single `evaluateContexts` call (deterministic ordering is
|
|
@@ -42,12 +37,12 @@ import { standaloneDeclarationValidRule } from "./skill/standalone-declaration-v
|
|
|
42
37
|
*/
|
|
43
38
|
export const skillRules = [
|
|
44
39
|
skillMdPresentRule,
|
|
45
|
-
|
|
40
|
+
skillEnvelopeRules.manifestPresent,
|
|
46
41
|
frontmatterParseableRule,
|
|
47
42
|
frontmatterStandardValidRule,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
43
|
+
skillEnvelopeRules.manifestSchemaValid,
|
|
44
|
+
skillEnvelopeRules.manifestKeysRecognized,
|
|
45
|
+
skillEnvelopeRules.standaloneDeclarationValid,
|
|
46
|
+
skillEnvelopeRules.recommendedPacksValid,
|
|
52
47
|
];
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3NraWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBSUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDakUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFckY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUE4QztJQUNuRSxrQkFBa0I7SUFDbEIsa0JBQWtCLENBQUMsZUFBZTtJQUNsQyx3QkFBd0I7SUFDeEIsNEJBQTRCO0lBQzVCLGtCQUFrQixDQUFDLG1CQUFtQjtJQUN0QyxrQkFBa0IsQ0FBQyxzQkFBc0I7SUFDekMsa0JBQWtCLENBQUMsMEJBQTBCO0lBQzdDLGtCQUFrQixDQUFDLHFCQUFxQjtDQUN6QyxDQUFDIn0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `subagent/*` manifest envelope — see `../shared/envelope-rules.ts`.
|
|
3
3
|
*/
|
|
4
|
-
import type {
|
|
5
|
-
export declare const subagentEnvelopeRules: import("../shared/envelope-rules.js").ManifestEnvelopeRules<
|
|
4
|
+
import type { ManifestRuleContext, SubagentContent } from "../../context.js";
|
|
5
|
+
export declare const subagentEnvelopeRules: import("../shared/envelope-rules.js").ManifestEnvelopeRules<ManifestRuleContext<SubagentContent>>;
|
|
6
6
|
//# sourceMappingURL=envelope.d.ts.map
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `subagent/*` manifest envelope — see `../shared/envelope-rules.ts`.
|
|
3
3
|
*/
|
|
4
|
-
import {
|
|
4
|
+
import { SubagentManifestSchema } from "@agentxm/extension-model/unstable/subagents/manifest-schema";
|
|
5
5
|
import { makeManifestEnvelopeRules } from "../shared/envelope-rules.js";
|
|
6
|
+
import { manifestFilenameForType } from "@agentxm/extension-model/unstable/extensions/common";
|
|
6
7
|
export const subagentEnvelopeRules = makeManifestEnvelopeRules({
|
|
7
8
|
namespace: "subagent",
|
|
8
|
-
manifestFile:
|
|
9
|
+
manifestFile: manifestFilenameForType("subagent"),
|
|
9
10
|
schema: SubagentManifestSchema,
|
|
10
11
|
manifestJson: (context) => context.subject.subagentJson,
|
|
11
12
|
presentDescription: "Subagents include a root subagent.json manifest.",
|
|
12
13
|
presentMissingMessage: "subagent.json is missing. Create the identity fields and either a described portable core or explicit native implementations.",
|
|
13
14
|
schemaDescription: "subagent.json defines a valid subagent manifest.",
|
|
14
15
|
});
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3N1YmFnZW50L2VudmVsb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFFckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFFOUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcseUJBQXlCLENBQUM7SUFDN0QsU0FBUyxFQUFFLFVBQVU7SUFDckIsWUFBWSxFQUFFLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztJQUNqRCxNQUFNLEVBQUUsc0JBQXNCO0lBQzlCLFlBQVksRUFBRSxDQUFDLE9BQTZDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWTtJQUM3RixrQkFBa0IsRUFBRSxrREFBa0Q7SUFDdEUscUJBQXFCLEVBQ25CLCtIQUErSDtJQUNqSSxpQkFBaUIsRUFBRSxrREFBa0Q7Q0FDdEUsQ0FBQyxDQUFDIn0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ManifestRuleContext, SubagentContent } from "../context.js";
|
|
2
2
|
import type { LintRule } from "../rule.js";
|
|
3
|
-
export declare const subagentRules: ReadonlyArray<LintRule<
|
|
3
|
+
export declare const subagentRules: ReadonlyArray<LintRule<ManifestRuleContext<SubagentContent>>>;
|
|
4
4
|
//# sourceMappingURL=subagent.d.ts.map
|
|
@@ -16,9 +16,9 @@
|
|
|
16
16
|
import type * as Effect from "effect/Effect";
|
|
17
17
|
import type { KnowledgeInspection } from "../knowledge/okf.js";
|
|
18
18
|
/**
|
|
19
|
-
* Tagged error surfaced by
|
|
20
|
-
*
|
|
21
|
-
*
|
|
19
|
+
* Tagged error surfaced by an `ExtensionFileAccessor` when a read fails for
|
|
20
|
+
* reasons other than "file not found" (which is represented by
|
|
21
|
+
* `exists -> false`).
|
|
22
22
|
*
|
|
23
23
|
* This interface fixes the error shape rules can rely on.
|
|
24
24
|
*
|
|
@@ -34,50 +34,36 @@ export interface FileAccessError {
|
|
|
34
34
|
readonly message: string;
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Narrow
|
|
37
|
+
* Narrow rooted file accessor shared by every extension type's rule context.
|
|
38
38
|
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
39
|
+
* The root is chosen by the caller: the directory containing the type's
|
|
40
|
+
* manifest (`pack.json`, `hook.json`, ...), or for a skill's `files` the
|
|
41
|
+
* directory containing `SKILL.md`. Paths are posix and relative to the root;
|
|
42
|
+
* implementations MUST reject path-traversal attempts (`..`, absolute paths,
|
|
43
|
+
* symlink escapes) by returning `false` from `exists` or failing `readBytes`
|
|
44
|
+
* with `FileAccessError { reason: "path-escape" }`.
|
|
43
45
|
*
|
|
44
46
|
* @experimental This API is unstable and may change without notice.
|
|
45
47
|
*/
|
|
46
|
-
export interface
|
|
48
|
+
export interface ExtensionFileAccessor {
|
|
47
49
|
readonly exists: (path: string) => Effect.Effect<boolean>;
|
|
48
50
|
readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
|
|
49
51
|
}
|
|
50
52
|
/**
|
|
51
|
-
*
|
|
53
|
+
* Context passed to every extension type's rules.
|
|
52
54
|
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
55
|
+
* `subject` is the caller-decoded content for the type (for example
|
|
56
|
+
* {@link PackContent}). `files` is rooted at the directory containing the
|
|
57
|
+
* type's manifest. `displayRoot` is posix and relative; `""` means the
|
|
58
|
+
* accessor root is the rendering base. See `./compose-path.ts` for the four
|
|
59
|
+
* documented cases.
|
|
55
60
|
*
|
|
56
61
|
* @experimental This API is unstable and may change without notice.
|
|
57
62
|
*/
|
|
58
|
-
export interface
|
|
59
|
-
readonly
|
|
60
|
-
readonly
|
|
61
|
-
|
|
62
|
-
export interface SubagentFileAccessor {
|
|
63
|
-
readonly exists: (path: string) => Effect.Effect<boolean>;
|
|
64
|
-
readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
|
|
65
|
-
}
|
|
66
|
-
export interface McpServerFileAccessor {
|
|
67
|
-
readonly exists: (path: string) => Effect.Effect<boolean>;
|
|
68
|
-
readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
|
|
69
|
-
}
|
|
70
|
-
export interface HookFileAccessor {
|
|
71
|
-
readonly exists: (path: string) => Effect.Effect<boolean>;
|
|
72
|
-
readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
|
|
73
|
-
}
|
|
74
|
-
export interface RuleFileAccessor {
|
|
75
|
-
readonly exists: (path: string) => Effect.Effect<boolean>;
|
|
76
|
-
readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
|
|
77
|
-
}
|
|
78
|
-
export interface KnowledgeFileAccessor {
|
|
79
|
-
readonly exists: (path: string) => Effect.Effect<boolean>;
|
|
80
|
-
readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
|
|
63
|
+
export interface ManifestRuleContext<S> {
|
|
64
|
+
readonly subject: S;
|
|
65
|
+
readonly files: ExtensionFileAccessor;
|
|
66
|
+
readonly displayRoot: string;
|
|
81
67
|
}
|
|
82
68
|
/**
|
|
83
69
|
* Context passed to `skill/*` rules.
|
|
@@ -85,13 +71,9 @@ export interface KnowledgeFileAccessor {
|
|
|
85
71
|
* `subject` is the caller-decoded skill content (SKILL.md frontmatter +
|
|
86
72
|
* optional skill.json).
|
|
87
73
|
*
|
|
88
|
-
* `displayRoot` is posix and relative; `""` means the accessor root is the
|
|
89
|
-
* rendering base. See `./compose-path.ts` for the four documented cases.
|
|
90
|
-
*
|
|
91
74
|
* @experimental This API is unstable and may change without notice.
|
|
92
75
|
*/
|
|
93
|
-
export interface SkillRuleContext
|
|
94
|
-
readonly subject: S;
|
|
76
|
+
export interface SkillRuleContext extends ManifestRuleContext<SkillContent> {
|
|
95
77
|
/**
|
|
96
78
|
* Content-root accessor. Rooted at the directory containing `SKILL.md`.
|
|
97
79
|
* For native (registry-installed) skills this is the `src/` sub-directory
|
|
@@ -100,7 +82,7 @@ export interface SkillRuleContext<S = SkillContent> {
|
|
|
100
82
|
* `frontmatter-parseable`, and any future rule evaluating files that
|
|
101
83
|
* render into agent directories) read through this accessor.
|
|
102
84
|
*/
|
|
103
|
-
readonly files:
|
|
85
|
+
readonly files: ExtensionFileAccessor;
|
|
104
86
|
/**
|
|
105
87
|
* Package-root accessor. Rooted at the skill's package root —
|
|
106
88
|
* the directory containing `skill.json` for native skills. For non-native
|
|
@@ -109,8 +91,7 @@ export interface SkillRuleContext<S = SkillContent> {
|
|
|
109
91
|
* future rule inspecting files at or above the content root) read through
|
|
110
92
|
* this accessor.
|
|
111
93
|
*/
|
|
112
|
-
readonly packageFiles:
|
|
113
|
-
readonly displayRoot: string;
|
|
94
|
+
readonly packageFiles: ExtensionFileAccessor;
|
|
114
95
|
}
|
|
115
96
|
/**
|
|
116
97
|
* Concrete subject shape passed to `skill/*` rules.
|
|
@@ -121,16 +102,12 @@ export interface SkillRuleContext<S = SkillContent> {
|
|
|
121
102
|
*
|
|
122
103
|
* - `isNative` — whether the caller expects this skill to carry a
|
|
123
104
|
* `skill.json` manifest. Native (registry-installed) skills set this to
|
|
124
|
-
* `true`; non-native (managed external) skills set it to `false`.
|
|
125
|
-
*
|
|
126
|
-
* `
|
|
127
|
-
* early-return `[]` when `isNative === false`, so the same catalog covers
|
|
128
|
-
* both.
|
|
105
|
+
* `true`; non-native (managed external) skills set it to `false`. The
|
|
106
|
+
* `skill.json` envelope rules produce no findings when
|
|
107
|
+
* `isNative === false`, so the same catalog covers both.
|
|
129
108
|
* - `skillJson` — the already-decoded `skill.json` contents when present
|
|
130
109
|
* (caller decodes once, rules don't re-read + re-parse). `undefined` when
|
|
131
|
-
* the file is absent.
|
|
132
|
-
* `Schema.decodeUnknownResult(SkillManifestSchema)`; keys-recognized
|
|
133
|
-
* enumerates top-level keys after narrowing to `Record<string, unknown>`.
|
|
110
|
+
* the file is absent.
|
|
134
111
|
*
|
|
135
112
|
* Workspace consumers build `SkillContent` via `buildSkillRuleContexts`
|
|
136
113
|
* against the lint workspace view; publish builds one `SkillContent` per
|
|
@@ -145,91 +122,38 @@ export interface SkillContent {
|
|
|
145
122
|
/** Agent-facing skill directory name used for the standard name-match check. */
|
|
146
123
|
readonly expectedName?: string;
|
|
147
124
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Context passed to `pack/*` rules.
|
|
150
|
-
*
|
|
151
|
-
* `subject` is the caller-decoded pack content — concrete `PackContent` shape
|
|
152
|
-
* defined below. Packs are registry-only at v1 (no non-native arm), so the
|
|
153
|
-
* subject carries only the already-decoded manifest and rules read
|
|
154
|
-
* `pack.json` bytes through `context.files` as needed.
|
|
155
|
-
*
|
|
156
|
-
* @experimental This API is unstable and may change without notice.
|
|
157
|
-
*/
|
|
158
|
-
export interface PackRuleContext<S = PackContent> {
|
|
159
|
-
readonly subject: S;
|
|
160
|
-
readonly files: PackFileAccessor;
|
|
161
|
-
readonly displayRoot: string;
|
|
162
|
-
}
|
|
163
125
|
/**
|
|
164
126
|
* Concrete subject shape passed to `pack/*` rules.
|
|
165
127
|
*
|
|
166
|
-
*
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
170
|
-
* - `packJson` — the already-decoded `pack.json` contents when
|
|
171
|
-
* present (caller decodes once, rules don't re-read + re-parse).
|
|
172
|
-
* `undefined` when the file is absent. Schema-valid rules pipe this into
|
|
173
|
-
* `Schema.decodeUnknownResult(PackManifestSchema)`;
|
|
174
|
-
* keys-recognized enumerates top-level keys after narrowing to
|
|
175
|
-
* `Record<string, unknown>`.
|
|
176
|
-
*
|
|
177
|
-
* Unlike `SkillContent`, there is no `isNative` discriminator — packs are
|
|
178
|
-
* registry-only and every pack context is expected to expose a manifest.
|
|
179
|
-
* The presence rule (`pack/manifest-present`) owns the absence arm.
|
|
180
|
-
*
|
|
181
|
-
* Workspace consumers build `PackContent` via `buildPackRuleContexts`
|
|
182
|
-
* against the lint workspace view; publish builds one `PackContent` per
|
|
183
|
-
* incoming archive.
|
|
128
|
+
* `packJson` is the already-decoded `pack.json` contents when present
|
|
129
|
+
* (caller decodes once, rules don't re-read + re-parse), and `undefined`
|
|
130
|
+
* when the file is absent. Packs are registry-only, so there is no
|
|
131
|
+
* `isNative` discriminator; `pack/manifest-present` owns the absence arm.
|
|
184
132
|
*
|
|
185
133
|
* @experimental This API is unstable and may change without notice.
|
|
186
134
|
*/
|
|
187
135
|
export interface PackContent {
|
|
188
136
|
readonly packJson: unknown;
|
|
189
137
|
}
|
|
190
|
-
export interface SubagentRuleContext<S = SubagentContent> {
|
|
191
|
-
readonly subject: S;
|
|
192
|
-
readonly files: SubagentFileAccessor;
|
|
193
|
-
readonly displayRoot: string;
|
|
194
|
-
}
|
|
195
138
|
export interface SubagentContent {
|
|
196
139
|
readonly subagentJson: unknown;
|
|
197
140
|
}
|
|
198
|
-
export interface McpServerRuleContext<S = McpServerContent> {
|
|
199
|
-
readonly subject: S;
|
|
200
|
-
readonly files: McpServerFileAccessor;
|
|
201
|
-
readonly displayRoot: string;
|
|
202
|
-
}
|
|
203
141
|
export interface McpServerContent {
|
|
204
142
|
readonly mcpServerJson: unknown;
|
|
205
143
|
}
|
|
206
|
-
export interface HookRuleContext<S = HookContent> {
|
|
207
|
-
readonly subject: S;
|
|
208
|
-
readonly files: HookFileAccessor;
|
|
209
|
-
readonly displayRoot: string;
|
|
210
|
-
}
|
|
211
144
|
export interface HookContent {
|
|
212
145
|
readonly hookJson: unknown;
|
|
213
146
|
}
|
|
214
|
-
/**
|
|
215
|
-
* Context passed to `rule/*` rules.
|
|
216
|
-
*
|
|
217
|
-
* The doubled word is unavoidable: `rule` is an extension type and `rule` is
|
|
218
|
-
* also the lint primitive, so the context for the `rule` extension type is a
|
|
219
|
-
* `RuleRuleContext`. Every other name here follows `<Type>RuleContext`.
|
|
220
|
-
*/
|
|
221
|
-
export interface RuleRuleContext<S = RuleContent> {
|
|
222
|
-
readonly subject: S;
|
|
223
|
-
readonly files: RuleFileAccessor;
|
|
224
|
-
readonly displayRoot: string;
|
|
225
|
-
}
|
|
147
|
+
/** Subject for the `rule` extension type's `rule/*` lint rules. */
|
|
226
148
|
export interface RuleContent {
|
|
227
149
|
readonly ruleJson: unknown;
|
|
228
150
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Context passed to `knowledge/*` rules.
|
|
153
|
+
*
|
|
154
|
+
* @experimental This API is unstable and may change without notice.
|
|
155
|
+
*/
|
|
156
|
+
export interface KnowledgeRuleContext extends ManifestRuleContext<KnowledgeContent> {
|
|
233
157
|
/** Absolute package root used once while constructing the cached inspection. */
|
|
234
158
|
readonly packageRoot?: string;
|
|
235
159
|
}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `hook.json`, none knew `rule.json` or `knowledge.json`, and the parse-failure
|
|
9
9
|
* copy defaulted to "Manifest" where the others defaulted to "Document".
|
|
10
10
|
*
|
|
11
|
-
* The manifest labels are derived from `
|
|
11
|
+
* The manifest labels are derived from `manifestFilenameForType` and
|
|
12
12
|
* `extensionTypeSentenceLabels`, both of which are total over `ExtensionType`,
|
|
13
13
|
* so a new extension type gets a label the moment its row lands in
|
|
14
14
|
* `EXTENSION_TYPE_TABLE`.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* `hook.json`, none knew `rule.json` or `knowledge.json`, and the parse-failure
|
|
9
9
|
* copy defaulted to "Manifest" where the others defaulted to "Document".
|
|
10
10
|
*
|
|
11
|
-
* The manifest labels are derived from `
|
|
11
|
+
* The manifest labels are derived from `manifestFilenameForType` and
|
|
12
12
|
* `extensionTypeSentenceLabels`, both of which are total over `ExtensionType`,
|
|
13
13
|
* so a new extension type gets a label the moment its row lands in
|
|
14
14
|
* `EXTENSION_TYPE_TABLE`.
|
|
@@ -16,16 +16,15 @@
|
|
|
16
16
|
* @experimental This API is unstable and may change without notice.
|
|
17
17
|
* @packageDocumentation
|
|
18
18
|
*/
|
|
19
|
-
import { extensionTypeSentenceLabels, extensionTypes, } from "@agentxm/extension-model/unstable/extensions/common";
|
|
19
|
+
import { extensionTypeSentenceLabels, extensionTypes, manifestFilenameForType, } from "@agentxm/extension-model/unstable/extensions/common";
|
|
20
20
|
import { LOCKFILE_NAME, SETTINGS_FILENAME, } from "@agentxm/extension-model/unstable/workspace-files";
|
|
21
|
-
import { MANIFEST_FILENAME_BY_TYPE } from "../packaging/manifest-policy.js";
|
|
22
21
|
/** Label used when a filename matches no known document. */
|
|
23
22
|
export const UNKNOWN_DOCUMENT_LABEL = "Document";
|
|
24
23
|
const capitalizeFirst = (value) => value.length === 0 ? value : `${value.charAt(0).toUpperCase()}${value.slice(1)}`;
|
|
25
24
|
// eslint-disable-next-line no-restricted-syntax -- Immutable lookup over the closed manifest filename vocabulary.
|
|
26
25
|
const documentLabels = new Map([
|
|
27
26
|
...extensionTypes.map((type) => [
|
|
28
|
-
|
|
27
|
+
manifestFilenameForType(type),
|
|
29
28
|
`${capitalizeFirst(extensionTypeSentenceLabels[type])} manifest`,
|
|
30
29
|
]),
|
|
31
30
|
[SETTINGS_FILENAME, "Workspace settings"],
|
|
@@ -46,4 +45,4 @@ const basename = (file) => {
|
|
|
46
45
|
* @experimental This API is unstable and may change without notice.
|
|
47
46
|
*/
|
|
48
47
|
export const describeSchemaDocument = (file) => documentLabels.get(basename(file)) ?? UNKNOWN_DOCUMENT_LABEL;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGludC9kZXNjcmliZS1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGNBQWMsRUFDZCx1QkFBdUIsR0FDeEIsTUFBTSxxREFBcUQsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLG1EQUFtRCxDQUFDO0FBRTNELDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUM7QUFFakQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUNoRCxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRW5GLGtIQUFrSDtBQUNsSCxNQUFNLGNBQWMsR0FBZ0MsSUFBSSxHQUFHLENBQWlCO0lBQzFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBNkIsRUFBRSxDQUFDO1FBQ3pELHVCQUF1QixDQUFDLElBQUksQ0FBQztRQUM3QixHQUFHLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXO0tBQ2pFLENBQUM7SUFDRixDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDO0lBQ3pDLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQztDQUM1QixDQUFDLENBQUM7QUFFSCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFLENBQzdELGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMifQ==
|
package/dist/src/lint/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* @packageDocumentation
|
|
11
11
|
*/
|
|
12
12
|
export type { AdvisoryFinding, AdvisoryRule, FindingBase, FindingLocation, LintFinding, LintRule, RuleBase, Severity, } from "./rule.js";
|
|
13
|
-
export type { FileAccessError, HookContent,
|
|
13
|
+
export type { ExtensionFileAccessor, FileAccessError, HookContent, KnowledgeContent, KnowledgeRuleContext, ManifestRuleContext, McpServerContent, PackContent, RuleContent, SkillContent, SkillRuleContext, SubagentContent, } from "./context.js";
|
|
14
14
|
export { type LintConfig, LintConfigSchema, type LintRuleSeverity, LintRuleSeveritySchema, type LintRulesMap, LintRulesMapSchema, platformCanonicalLintConfig, } from "./config.js";
|
|
15
15
|
export { type LintCatalogGroup, type LintCatalogRuleMetadata, type LintCatalogView, allLintCatalogRuleIds, lintCatalogRuleMetadata, } from "./catalog-metadata.js";
|
|
16
16
|
export { type Evaluated, evaluateContexts } from "./evaluate.js";
|
|
@@ -24,12 +24,10 @@ export { mcpServerRules } from "./catalog/mcp-server.js";
|
|
|
24
24
|
export { hookRules } from "./catalog/hook.js";
|
|
25
25
|
export { ruleRules } from "./catalog/rule.js";
|
|
26
26
|
export { knowledgeDiagnosticRuleDefinitions, knowledgeDiagnosticRules, knowledgeRules, publishKnowledgeRules, } from "./catalog/knowledge.js";
|
|
27
|
-
export { type InstalledSkillInfo, buildSkillRuleContexts
|
|
28
|
-
export { type
|
|
29
|
-
export { type
|
|
30
|
-
export { type
|
|
31
|
-
export { type PackVFTNode, makeVftPackFileAccessor } from "./catalog/pack-accessor/vft.js";
|
|
32
|
-
export { type PackAccessorPlatform, makePlatformPackFileAccessor, } from "./catalog/pack-accessor/platform.js";
|
|
27
|
+
export { type InstalledSkillInfo, buildSkillRuleContexts } from "./catalog/skill/contexts.js";
|
|
28
|
+
export { type InstalledPackInfo, buildPackRuleContexts } from "./catalog/pack/contexts.js";
|
|
29
|
+
export { type VFTNode, makeVftFileAccessor } from "./accessor/vft.js";
|
|
30
|
+
export { type FileAccessorPlatform, makePlatformFileAccessor } from "./accessor/platform.js";
|
|
33
31
|
export { type ManifestJsonParseFailure, isManifestJsonParseFailure, makeManifestJsonParseFailure, manifestJsonParseFailureToFinding, } from "./catalog/shared/manifest-json.js";
|
|
34
32
|
export { type ManifestEnvelopeOptions, type ManifestEnvelopeRules, type ManifestEnvelopeSchema, makeManifestEnvelopeRules, orderedEnvelopeRules, } from "./catalog/shared/envelope-rules.js";
|
|
35
33
|
export { schemaDecodeFindings } from "./catalog/shared/schema-rule.js";
|