@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.
Files changed (94) hide show
  1. package/dist/src/content/frontmatter.d.ts +16 -0
  2. package/dist/src/content/frontmatter.js +6 -4
  3. package/dist/src/content/skill-content.d.ts +13 -14
  4. package/dist/src/content/skill-content.js +8 -46
  5. package/dist/src/content/subagent-content.js +14 -10
  6. package/dist/src/index.d.ts +2 -2
  7. package/dist/src/index.js +3 -3
  8. package/dist/src/knowledge/index.d.ts +1 -1
  9. package/dist/src/knowledge/index.js +2 -2
  10. package/dist/src/knowledge/okf.d.ts +52 -1
  11. package/dist/src/knowledge/okf.js +86 -59
  12. package/dist/src/knowledge/package-inspection.d.ts +4 -7
  13. package/dist/src/knowledge/package-inspection.js +7 -19
  14. package/dist/src/lint/accessor/platform.d.ts +54 -0
  15. package/dist/src/lint/accessor/platform.js +89 -0
  16. package/dist/src/lint/{catalog/pack-accessor → accessor}/vft.d.ts +12 -14
  17. package/dist/src/lint/accessor/vft.js +83 -0
  18. package/dist/src/lint/catalog/hook/entrypoint-exists.d.ts +2 -2
  19. package/dist/src/lint/catalog/hook/entrypoint-exists.js +4 -3
  20. package/dist/src/lint/catalog/hook/envelope.d.ts +6 -6
  21. package/dist/src/lint/catalog/hook/envelope.js +5 -4
  22. package/dist/src/lint/catalog/hook/native-bindings-supported.d.ts +2 -2
  23. package/dist/src/lint/catalog/hook/native-bindings-supported.js +4 -3
  24. package/dist/src/lint/catalog/hook.d.ts +2 -2
  25. package/dist/src/lint/catalog/hook.js +1 -1
  26. package/dist/src/lint/catalog/knowledge/diagnostics.js +4 -3
  27. package/dist/src/lint/catalog/knowledge/envelope.d.ts +1 -1
  28. package/dist/src/lint/catalog/knowledge/envelope.js +4 -3
  29. package/dist/src/lint/catalog/mcp-server/envelope.d.ts +2 -2
  30. package/dist/src/lint/catalog/mcp-server/envelope.js +4 -3
  31. package/dist/src/lint/catalog/mcp-server.d.ts +2 -2
  32. package/dist/src/lint/catalog/{pack-accessor → pack}/contexts.d.ts +6 -6
  33. package/dist/src/lint/catalog/{pack-accessor → pack}/contexts.js +4 -4
  34. package/dist/src/lint/catalog/pack/envelope.d.ts +10 -0
  35. package/dist/src/lint/catalog/pack/envelope.js +20 -0
  36. package/dist/src/lint/catalog/pack.d.ts +9 -10
  37. package/dist/src/lint/catalog/pack.js +12 -15
  38. package/dist/src/lint/catalog/rule/envelope.d.ts +2 -2
  39. package/dist/src/lint/catalog/rule/envelope.js +4 -3
  40. package/dist/src/lint/catalog/rule.d.ts +2 -2
  41. package/dist/src/lint/catalog/shared/envelope-rules.d.ts +23 -12
  42. package/dist/src/lint/catalog/shared/envelope-rules.js +22 -13
  43. package/dist/src/lint/catalog/shared/manifest-present.d.ts +3 -4
  44. package/dist/src/lint/catalog/shared/recommended-packs-rules.js +5 -3
  45. package/dist/src/lint/catalog/shared/schema-rule.js +3 -3
  46. package/dist/src/lint/catalog/{skill-accessor → skill}/contexts.d.ts +5 -5
  47. package/dist/src/lint/catalog/{skill-accessor → skill}/contexts.js +3 -3
  48. package/dist/src/lint/catalog/skill/envelope.d.ts +11 -0
  49. package/dist/src/lint/catalog/skill/envelope.js +23 -0
  50. package/dist/src/lint/catalog/skill/frontmatter-parseable.d.ts +6 -4
  51. package/dist/src/lint/catalog/skill/frontmatter-parseable.js +17 -21
  52. package/dist/src/lint/catalog/skill/frontmatter-standard-valid.js +7 -12
  53. package/dist/src/lint/catalog/skill.d.ts +4 -5
  54. package/dist/src/lint/catalog/skill.js +11 -16
  55. package/dist/src/lint/catalog/subagent/envelope.d.ts +2 -2
  56. package/dist/src/lint/catalog/subagent/envelope.js +4 -3
  57. package/dist/src/lint/catalog/subagent.d.ts +2 -2
  58. package/dist/src/lint/context.d.ts +39 -115
  59. package/dist/src/lint/describe-document.d.ts +1 -1
  60. package/dist/src/lint/describe-document.js +4 -5
  61. package/dist/src/lint/index.d.ts +5 -7
  62. package/dist/src/lint/index.js +5 -7
  63. package/dist/src/packaging/archive-guardrails.d.ts +11 -0
  64. package/dist/src/packaging/archive-guardrails.js +111 -74
  65. package/dist/src/packaging/filtered-package-validation.js +3 -4
  66. package/dist/src/packaging/manifest-file.d.ts +7 -3
  67. package/dist/src/packaging/manifest-file.js +10 -11
  68. package/dist/src/packaging/manifest-policy.d.ts +0 -12
  69. package/dist/src/packaging/manifest-policy.js +12 -26
  70. package/dist/src/packaging/test-zip-helpers.js +4 -3
  71. package/package.json +8 -4
  72. package/dist/src/lint/catalog/pack/manifest-keys-recognized.d.ts +0 -28
  73. package/dist/src/lint/catalog/pack/manifest-keys-recognized.js +0 -38
  74. package/dist/src/lint/catalog/pack/manifest-present.d.ts +0 -17
  75. package/dist/src/lint/catalog/pack/manifest-present.js +0 -24
  76. package/dist/src/lint/catalog/pack/manifest-schema-valid.d.ts +0 -25
  77. package/dist/src/lint/catalog/pack/manifest-schema-valid.js +0 -33
  78. package/dist/src/lint/catalog/pack-accessor/platform.d.ts +0 -56
  79. package/dist/src/lint/catalog/pack-accessor/platform.js +0 -93
  80. package/dist/src/lint/catalog/pack-accessor/vft.js +0 -85
  81. package/dist/src/lint/catalog/skill/manifest-keys-recognized.d.ts +0 -26
  82. package/dist/src/lint/catalog/skill/manifest-keys-recognized.js +0 -41
  83. package/dist/src/lint/catalog/skill/manifest-present.d.ts +0 -23
  84. package/dist/src/lint/catalog/skill/manifest-present.js +0 -32
  85. package/dist/src/lint/catalog/skill/manifest-schema-valid.d.ts +0 -21
  86. package/dist/src/lint/catalog/skill/manifest-schema-valid.js +0 -36
  87. package/dist/src/lint/catalog/skill/recommended-packs-valid.d.ts +0 -8
  88. package/dist/src/lint/catalog/skill/recommended-packs-valid.js +0 -12
  89. package/dist/src/lint/catalog/skill/standalone-declaration-valid.d.ts +0 -8
  90. package/dist/src/lint/catalog/skill/standalone-declaration-valid.js +0 -12
  91. package/dist/src/lint/catalog/skill-accessor/platform.d.ts +0 -53
  92. package/dist/src/lint/catalog/skill-accessor/platform.js +0 -90
  93. package/dist/src/lint/catalog/skill-accessor/vft.d.ts +0 -77
  94. 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 whitespace, no
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. Frontmatter YAML parses without error.
14
- * 3. Parsed frontmatter is a mapping (not a list, not a scalar).
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 whitespace, no
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. Frontmatter YAML parses without error.
14
- * 3. Parsed frontmatter is a mapping (not a list, not a scalar).
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
- // No frontmatter block. Treat as bad (cascade arm 1 "begins with ---"
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 (!isMapping(parsed.value)) {
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 undefined;
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
- // content starts with `---` (arm 1 guaranteed). Find closing delimiter on a
111
- // new line.
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(yamlContent);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRtYXR0ZXItcGFyc2VhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpbnQvY2F0YWxvZy9za2lsbC9mcm9udG1hdHRlci1wYXJzZWFibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBRUgsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBSXhCLE1BQU0sT0FBTyxHQUFHLDZCQUE2QixDQUFDO0FBQzlDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUM1QixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDeEIseUVBQXlFO0FBQ3pFLDhDQUE4QztBQUM5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUM7QUFFMUIsNEVBQTRFO0FBQzVFLCtEQUErRDtBQUMvRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBRTVFLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFtQztJQUN0RSxFQUFFLEVBQUUsT0FBTztJQUNYLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsV0FBVyxFQUFFLCtDQUErQztJQUM1RCxJQUFJLEVBQUUsVUFBVTtJQUNoQixRQUFRLEVBQUUsT0FBTztJQUNqQixLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNqQixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixtREFBbUQ7WUFDbkQsT0FBTyxFQUFFLENB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
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
- if (!content.startsWith("---"))
18
- return undefined;
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(openingEnd + 1, closingStart));
27
- return parsed !== null && typeof parsed === "object" && !Array.isArray(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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRtYXR0ZXItc3RhbmRhcmQtdmFsaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3NraWxsL2Zyb250bWF0dGVyLXN0YW5kYXJkLXZhbGlkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ3hCLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBSTdFLE1BQU0sT0FBTyxHQUFHLGtDQUFrQyxDQUFDO0FBQ25ELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQztBQUM1QixNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBRTVFLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxPQUFlLEVBQXVCLEVBQUU7SUFDdkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDakQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxJQUFJLFVBQVUsS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUN4QyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMxRCxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMxQyxJQUFJLENBQUM7UUFDSCxNQUFNLE1BQU0sR0FBWSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ2hGLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUM1RSxDQUFDLENBQUMsTUFBTTtZQUNSLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLE9BQU8sR0FBRyxDQUFDLE9BQWUsRUFBbUIsRUFBRSxDQUFDLENBQUM7SUFDckQsSUFBSSxFQUFFLFVBQVU7SUFDaEIsTUFBTSxFQUFFLE9BQU87SUFDZixRQUFRLEVBQUUsT0FBTztJQUNqQixPQUFPO0lBQ1AsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO0NBQ3RDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFtQztJQUMxRSxFQUFFLEVBQUUsT0FBTztJQUNYLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsV0FBVyxFQUFFLGlFQUFpRTtJQUM5RSxJQUFJLEVBQUUsVUFBVTtJQUNoQixRQUFRLEVBQUUsT0FBTztJQUNqQixLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNqQixNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQztRQUNsQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FDM0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUM1QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FDOUMsQ0FBQztRQUNGLElBQUksT0FBTyxLQUFLLFNBQVM7WUFBRSxPQUFPLEVBQUUsQ0FBQztRQUNyQyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxJQUFJLE1BQU0sS0FBSyxTQUFTO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxVQUFVLEdBQUcsd0JBQXdCLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEYsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUMsQ0FBQztDQUNMLENBQUMifQ==
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 last two come from `catalog/shared/recommended-packs-rules.ts`; every
19
- * non-pack catalog applies the same pair against its own manifest.
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"`. Native-vs-non-native applicability is
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 last two come from `catalog/shared/recommended-packs-rules.ts`; every
19
- * non-pack catalog applies the same pair against its own manifest.
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"`. Native-vs-non-native applicability is
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 { manifestPresentRule } from "./skill/manifest-present.js";
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
- manifestPresentRule,
40
+ skillEnvelopeRules.manifestPresent,
46
41
  frontmatterParseableRule,
47
42
  frontmatterStandardValidRule,
48
- manifestSchemaValidRule,
49
- manifestKeysRecognizedRule,
50
- standaloneDeclarationValidRule,
51
- recommendedPacksValidRule,
43
+ skillEnvelopeRules.manifestSchemaValid,
44
+ skillEnvelopeRules.manifestKeysRecognized,
45
+ skillEnvelopeRules.standaloneDeclarationValid,
46
+ skillEnvelopeRules.recommendedPacksValid,
52
47
  ];
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2tpbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3NraWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUlILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQy9FLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBRXpGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBOEM7SUFDbkUsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQix3QkFBd0I7SUFDeEIsNEJBQTRCO0lBQzVCLHVCQUF1QjtJQUN2QiwwQkFBMEI7SUFDMUIsOEJBQThCO0lBQzlCLHlCQUF5QjtDQUMxQixDQUFDIn0=
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 { SubagentRuleContext } from "../../context.js";
5
- export declare const subagentEnvelopeRules: import("../shared/envelope-rules.js").ManifestEnvelopeRules<SubagentRuleContext<import("../../context.js").SubagentContent>>;
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 { MANIFEST_FILENAME, SubagentManifestSchema, } from "@agentxm/extension-model/unstable/subagents/manifest-schema";
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: MANIFEST_FILENAME,
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3N1YmFnZW50L2VudmVsb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixzQkFBc0IsR0FDdkIsTUFBTSw2REFBNkQsQ0FBQztBQUVyRSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUV4RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyx5QkFBeUIsQ0FBQztJQUM3RCxTQUFTLEVBQUUsVUFBVTtJQUNyQixZQUFZLEVBQUUsaUJBQWlCO0lBQy9CLE1BQU0sRUFBRSxzQkFBc0I7SUFDOUIsWUFBWSxFQUFFLENBQUMsT0FBNEIsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZO0lBQzVFLGtCQUFrQixFQUFFLGtEQUFrRDtJQUN0RSxxQkFBcUIsRUFDbkIsK0hBQStIO0lBQ2pJLGlCQUFpQixFQUFFLGtEQUFrRDtDQUN0RSxDQUFDLENBQUMifQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52ZWxvcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGludC9jYXRhbG9nL3N1YmFnZW50L2VudmVsb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkRBQTZELENBQUM7QUFFckcsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDeEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFFOUYsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcseUJBQXlCLENBQUM7SUFDN0QsU0FBUyxFQUFFLFVBQVU7SUFDckIsWUFBWSxFQUFFLHVCQUF1QixDQUFDLFVBQVUsQ0FBQztJQUNqRCxNQUFNLEVBQUUsc0JBQXNCO0lBQzlCLFlBQVksRUFBRSxDQUFDLE9BQTZDLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWTtJQUM3RixrQkFBa0IsRUFBRSxrREFBa0Q7SUFDdEUscUJBQXFCLEVBQ25CLCtIQUErSDtJQUNqSSxpQkFBaUIsRUFBRSxrREFBa0Q7Q0FDdEUsQ0FBQyxDQUFDIn0=
@@ -1,4 +1,4 @@
1
- import type { SubagentRuleContext } from "../context.js";
1
+ import type { ManifestRuleContext, SubagentContent } from "../context.js";
2
2
  import type { LintRule } from "../rule.js";
3
- export declare const subagentRules: ReadonlyArray<LintRule<SubagentRuleContext>>;
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 `SkillFileAccessor` / `PackFileAccessor` when a
20
- * read fails for reasons other than "file not found" (which is represented
21
- * by `exists -> false`).
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 skill-rooted file accessor.
37
+ * Narrow rooted file accessor shared by every extension type's rule context.
38
38
  *
39
- * Root is the directory containing `SKILL.md`. Paths are posix and relative
40
- * to the root; implementations MUST reject path-traversal attempts (`..`,
41
- * absolute paths, symlink escapes) by returning `false` from `exists` or
42
- * failing `readBytes` with `FileAccessError { reason: "path-escape" }`.
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 SkillFileAccessor {
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
- * Narrow pack-rooted file accessor.
53
+ * Context passed to every extension type's rules.
52
54
  *
53
- * Root is the directory containing `pack.json`. Same traversal
54
- * constraints as `SkillFileAccessor`.
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 PackFileAccessor {
59
- readonly exists: (path: string) => Effect.Effect<boolean>;
60
- readonly readBytes: (path: string) => Effect.Effect<Uint8Array, FileAccessError>;
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<S = SkillContent> {
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: SkillFileAccessor;
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: SkillFileAccessor;
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`. Rules
125
- * that depend on `skill.json` (`skill/manifest-present`,
126
- * `skill/manifest-schema-valid`, `skill/manifest-keys-recognized`)
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. Schema-valid rules pipe this into
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
- * Rules read `pack.json` bytes through `context.files` (the
167
- * authoritative source shared across publish and `axm lint`). The `subject`
168
- * carries only what rules can't efficiently re-derive from bytes:
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
- export interface KnowledgeRuleContext<S = KnowledgeContent> {
230
- readonly subject: S;
231
- readonly files: KnowledgeFileAccessor;
232
- readonly displayRoot: string;
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 `MANIFEST_FILENAME_BY_TYPE` and
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 `MANIFEST_FILENAME_BY_TYPE` and
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
- MANIFEST_FILENAME_BY_TYPE[type],
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGludC9kZXNjcmliZS1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGNBQWMsR0FDZixNQUFNLHFEQUFxRCxDQUFDO0FBQzdELE9BQU8sRUFDTCxhQUFhLEVBQ2IsaUJBQWlCLEdBQ2xCLE1BQU0sbURBQW1ELENBQUM7QUFDM0QsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFNUUsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLFVBQVUsQ0FBQztBQUVqRCxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWEsRUFBVSxFQUFFLENBQ2hELEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFbkYsa0hBQWtIO0FBQ2xILE1BQU0sY0FBYyxHQUFnQyxJQUFJLEdBQUcsQ0FBaUI7SUFDMUUsR0FBRyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUE2QixFQUFFLENBQUM7UUFDekQseUJBQXlCLENBQUMsSUFBSSxDQUFDO1FBQy9CLEdBQUcsZUFBZSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVc7S0FDakUsQ0FBQztJQUNGLENBQUMsaUJBQWlCLEVBQUUsb0JBQW9CLENBQUM7SUFDekMsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDO0NBQzVCLENBQUMsQ0FBQztBQUVILE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUU7SUFDeEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNwQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFFRjs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLENBQUMsSUFBWSxFQUFVLEVBQUUsQ0FDN0QsY0FBYyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxzQkFBc0IsQ0FBQyJ9
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVzY3JpYmUtZG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGludC9kZXNjcmliZS1kb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSCxPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLGNBQWMsRUFDZCx1QkFBdUIsR0FDeEIsTUFBTSxxREFBcUQsQ0FBQztBQUM3RCxPQUFPLEVBQ0wsYUFBYSxFQUNiLGlCQUFpQixHQUNsQixNQUFNLG1EQUFtRCxDQUFDO0FBRTNELDREQUE0RDtBQUM1RCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxVQUFVLENBQUM7QUFFakQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFhLEVBQVUsRUFBRSxDQUNoRCxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBRW5GLGtIQUFrSDtBQUNsSCxNQUFNLGNBQWMsR0FBZ0MsSUFBSSxHQUFHLENBQWlCO0lBQzFFLEdBQUcsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBNkIsRUFBRSxDQUFDO1FBQ3pELHVCQUF1QixDQUFDLElBQUksQ0FBQztRQUM3QixHQUFHLGVBQWUsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxXQUFXO0tBQ2pFLENBQUM7SUFDRixDQUFDLGlCQUFpQixFQUFFLG9CQUFvQixDQUFDO0lBQ3pDLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQztDQUM1QixDQUFDLENBQUM7QUFFSCxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLElBQVksRUFBVSxFQUFFLENBQzdELGNBQWMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksc0JBQXNCLENBQUMifQ==
@@ -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, HookFileAccessor, HookRuleContext, KnowledgeContent, KnowledgeFileAccessor, KnowledgeRuleContext, McpServerContent, McpServerFileAccessor, McpServerRuleContext, PackContent, PackFileAccessor, PackRuleContext, RuleContent, RuleFileAccessor, RuleRuleContext, SkillContent, SkillFileAccessor, SkillRuleContext, SubagentContent, SubagentFileAccessor, SubagentRuleContext, } from "./context.js";
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, } from "./catalog/skill-accessor/contexts.js";
28
- export { type VFTNode, makeVftSkillFileAccessor, makeVftSkillFileAccessorScoped, } from "./catalog/skill-accessor/vft.js";
29
- export { type SkillAccessorPlatform, makePlatformSkillFileAccessor, } from "./catalog/skill-accessor/platform.js";
30
- export { type InstalledPackInfo, buildPackRuleContexts } from "./catalog/pack-accessor/contexts.js";
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";