@microsoft/teamsfx-core 3.1.3 → 3.1.4-alpha.26ce7a8dda.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 (148) hide show
  1. package/build/common/templates-config.json +4 -4
  2. package/build/component/configManager/actionInjector.d.ts +13 -3
  3. package/build/component/configManager/actionInjector.d.ts.map +1 -1
  4. package/build/component/configManager/actionInjector.js +88 -5
  5. package/build/component/configManager/actionInjector.js.map +1 -1
  6. package/build/component/driver/teamsApp/utils/utils.d.ts.map +1 -1
  7. package/build/component/driver/teamsApp/utils/utils.js +1 -18
  8. package/build/component/driver/teamsApp/utils/utils.js.map +1 -1
  9. package/build/component/generator/openApiSpec/helper.d.ts +2 -2
  10. package/build/component/generator/openApiSpec/helper.d.ts.map +1 -1
  11. package/build/component/generator/openApiSpec/helper.js +65 -5
  12. package/build/component/generator/openApiSpec/helper.js.map +1 -1
  13. package/build/component/generator/openPlugin/authResolver.d.ts +2 -2
  14. package/build/component/generator/openPlugin/authResolver.d.ts.map +1 -1
  15. package/build/component/generator/openPlugin/authResolver.js +17 -7
  16. package/build/component/generator/openPlugin/authResolver.js.map +1 -1
  17. package/build/component/generator/openPlugin/errors.d.ts +4 -0
  18. package/build/component/generator/openPlugin/errors.d.ts.map +1 -0
  19. package/build/component/generator/openPlugin/errors.js +13 -0
  20. package/build/component/generator/openPlugin/errors.js.map +1 -0
  21. package/build/component/generator/openPlugin/exporter.d.ts +9 -6
  22. package/build/component/generator/openPlugin/exporter.d.ts.map +1 -1
  23. package/build/component/generator/openPlugin/exporter.js +502 -53
  24. package/build/component/generator/openPlugin/exporter.js.map +1 -1
  25. package/build/component/generator/openPlugin/fileSystem.d.ts +28 -0
  26. package/build/component/generator/openPlugin/fileSystem.d.ts.map +1 -0
  27. package/build/component/generator/openPlugin/fileSystem.js +181 -0
  28. package/build/component/generator/openPlugin/fileSystem.js.map +1 -0
  29. package/build/component/generator/openPlugin/iconStrategy.d.ts.map +1 -1
  30. package/build/component/generator/openPlugin/iconStrategy.js +30 -14
  31. package/build/component/generator/openPlugin/iconStrategy.js.map +1 -1
  32. package/build/component/generator/openPlugin/importer.d.ts.map +1 -1
  33. package/build/component/generator/openPlugin/importer.js +75 -12
  34. package/build/component/generator/openPlugin/importer.js.map +1 -1
  35. package/build/component/generator/openPlugin/mapper.d.ts +3 -2
  36. package/build/component/generator/openPlugin/mapper.d.ts.map +1 -1
  37. package/build/component/generator/openPlugin/mapper.js +188 -29
  38. package/build/component/generator/openPlugin/mapper.js.map +1 -1
  39. package/build/component/generator/openPlugin/parser.d.ts.map +1 -1
  40. package/build/component/generator/openPlugin/parser.js +264 -70
  41. package/build/component/generator/openPlugin/parser.js.map +1 -1
  42. package/build/component/generator/openPlugin/skillValidation.d.ts +2 -0
  43. package/build/component/generator/openPlugin/skillValidation.d.ts.map +1 -0
  44. package/build/component/generator/openPlugin/skillValidation.js +63 -0
  45. package/build/component/generator/openPlugin/skillValidation.js.map +1 -0
  46. package/build/component/generator/openPlugin/spec.d.ts +67 -0
  47. package/build/component/generator/openPlugin/spec.d.ts.map +1 -0
  48. package/build/component/generator/openPlugin/spec.js +157 -0
  49. package/build/component/generator/openPlugin/spec.js.map +1 -0
  50. package/build/component/generator/openPlugin/textUtils.d.ts +1 -1
  51. package/build/component/generator/openPlugin/textUtils.d.ts.map +1 -1
  52. package/build/component/generator/openPlugin/textUtils.js +8 -7
  53. package/build/component/generator/openPlugin/textUtils.js.map +1 -1
  54. package/build/component/generator/openPlugin/types.d.ts +76 -14
  55. package/build/component/generator/openPlugin/types.d.ts.map +1 -1
  56. package/build/component/generator/openPlugin/validation.d.ts +17 -0
  57. package/build/component/generator/openPlugin/validation.d.ts.map +1 -0
  58. package/build/component/generator/openPlugin/validation.js +563 -0
  59. package/build/component/generator/openPlugin/validation.js.map +1 -0
  60. package/build/component/utils/common.d.ts +1 -9
  61. package/build/component/utils/common.d.ts.map +1 -1
  62. package/build/component/utils/common.js +7 -37
  63. package/build/component/utils/common.js.map +1 -1
  64. package/build/component/utils/envFunctionUtils.d.ts +3 -8
  65. package/build/component/utils/envFunctionUtils.d.ts.map +1 -1
  66. package/build/component/utils/envFunctionUtils.js +46 -131
  67. package/build/component/utils/envFunctionUtils.js.map +1 -1
  68. package/build/component/utils/envUtil.d.ts.map +1 -1
  69. package/build/component/utils/envUtil.js +7 -6
  70. package/build/component/utils/envUtil.js.map +1 -1
  71. package/build/component/utils/mcpAuthScaffolder.d.ts +6 -0
  72. package/build/component/utils/mcpAuthScaffolder.d.ts.map +1 -1
  73. package/build/component/utils/mcpAuthScaffolder.js +17 -7
  74. package/build/component/utils/mcpAuthScaffolder.js.map +1 -1
  75. package/build/core/FxCore.d.ts +3 -2
  76. package/build/core/FxCore.d.ts.map +1 -1
  77. package/build/core/FxCore.declarativeAgent.d.ts +8 -2
  78. package/build/core/FxCore.declarativeAgent.d.ts.map +1 -1
  79. package/build/core/FxCore.declarativeAgent.js +109 -6
  80. package/build/core/FxCore.declarativeAgent.js.map +1 -1
  81. package/build/core/FxCore.js +42 -3
  82. package/build/core/FxCore.js.map +1 -1
  83. package/build/core/FxCore.openPlugin.d.ts +7 -6
  84. package/build/core/FxCore.openPlugin.d.ts.map +1 -1
  85. package/build/core/FxCore.openPlugin.js +7 -6
  86. package/build/core/FxCore.openPlugin.js.map +1 -1
  87. package/build/error/common.d.ts +9 -0
  88. package/build/error/common.d.ts.map +1 -1
  89. package/build/error/common.js +40 -1
  90. package/build/error/common.js.map +1 -1
  91. package/build/question/generator.d.ts.map +1 -1
  92. package/build/question/generator.js +9 -9
  93. package/build/question/generator.js.map +1 -1
  94. package/build/question/inputs/AddAuthActionInputs.d.ts +6 -0
  95. package/build/question/inputs/AddAuthActionInputs.d.ts.map +1 -1
  96. package/build/question/inputs/AddPluginInputs.d.ts +15 -1
  97. package/build/question/inputs/AddPluginInputs.d.ts.map +1 -1
  98. package/build/question/options/AddAuthActionOptions.d.ts.map +1 -1
  99. package/build/question/options/AddAuthActionOptions.js +19 -0
  100. package/build/question/options/AddAuthActionOptions.js.map +1 -1
  101. package/build/question/options/AddPluginOptions.d.ts.map +1 -1
  102. package/build/question/options/AddPluginOptions.js +45 -1
  103. package/build/question/options/AddPluginOptions.js.map +1 -1
  104. package/build/question/options/ExportOpenPluginOptions.js +2 -2
  105. package/build/question/options/ExportOpenPluginOptions.js.map +1 -1
  106. package/build/question/options/ImportOpenPluginOptions.js +4 -4
  107. package/build/question/options/ImportOpenPluginOptions.js.map +1 -1
  108. package/build/question/other.d.ts +2 -0
  109. package/build/question/other.d.ts.map +1 -1
  110. package/build/question/other.js +174 -8
  111. package/build/question/other.js.map +1 -1
  112. package/build/question/questionNames.d.ts +6 -0
  113. package/build/question/questionNames.d.ts.map +1 -1
  114. package/build/question/questionNames.js +6 -0
  115. package/build/question/questionNames.js.map +1 -1
  116. package/build/question/scaffold/vsc/rootNode.js +1 -1
  117. package/build/question/scaffold/vsc/rootNode.js.map +1 -1
  118. package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts +2 -0
  119. package/build/question/scaffold/vsc/teamsProjectTypeNode.d.ts.map +1 -1
  120. package/build/question/scaffold/vsc/teamsProjectTypeNode.js +31 -1
  121. package/build/question/scaffold/vsc/teamsProjectTypeNode.js.map +1 -1
  122. package/build/ui/visitor.d.ts.map +1 -1
  123. package/build/ui/visitor.js +1 -0
  124. package/build/ui/visitor.js.map +1 -1
  125. package/build/v4/mcp/mcpAuthAction.d.ts +2 -1
  126. package/build/v4/mcp/mcpAuthAction.d.ts.map +1 -1
  127. package/build/v4/mcp/mcpAuthAction.js +32 -5
  128. package/build/v4/mcp/mcpAuthAction.js.map +1 -1
  129. package/build/v4/mcp/mcpAuthScaffold.d.ts +3 -0
  130. package/build/v4/mcp/mcpAuthScaffold.d.ts.map +1 -1
  131. package/build/v4/mcp/mcpAuthScaffold.js +61 -38
  132. package/build/v4/mcp/mcpAuthScaffold.js.map +1 -1
  133. package/build/v4/runtime/steps/mcpAuth.d.ts.map +1 -1
  134. package/build/v4/runtime/steps/mcpAuth.js +15 -4
  135. package/build/v4/runtime/steps/mcpAuth.js.map +1 -1
  136. package/package.json +37 -37
  137. package/resource/package.nls.json +30 -0
  138. package/templates/configs/local/typescript/.gitignore +1 -0
  139. package/templates/configs/playground/typescript/.gitignore +4 -0
  140. package/templates/fallback/common.zip +0 -0
  141. package/templates/fallback/csharp.zip +0 -0
  142. package/templates/fallback/js.zip +0 -0
  143. package/templates/fallback/python.zip +0 -0
  144. package/templates/fallback/ts.zip +0 -0
  145. package/templates/metadata.zip +0 -0
  146. package/templates/v4/floor.json +1 -1
  147. package/templates/v4/templates-metadata.zip +0 -0
  148. package/templates/v4/templates.zip +0 -0
@@ -6,12 +6,19 @@ exports.readOpenPluginDir = readOpenPluginDir;
6
6
  const tslib_1 = require("tslib");
7
7
  const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
8
  const path = tslib_1.__importStar(require("path"));
9
+ const errors_1 = require("./errors");
10
+ const fileSystem_1 = require("./fileSystem");
11
+ const skillValidation_1 = require("./skillValidation");
12
+ const spec_1 = require("./spec");
13
+ const validation_1 = require("./validation");
14
+ /**
15
+ * Agent Plugins 1.0.0 mandates plugin.json in the plugin root. The pre-1.0.0
16
+ * locations are probed afterwards so older directories keep importing.
17
+ */
9
18
  const MANIFEST_LOCATIONS = [
10
- { relPath: ".plugin/plugin.json", kind: "open-plugin" },
11
- { relPath: ".claude-plugin/plugin.json", kind: "claude-plugin" },
12
- { relPath: ".cursor-plugin/plugin.json", kind: "cursor-plugin" },
19
+ { relPath: spec_1.PLUGIN_MANIFEST_FILE, kind: "agent-plugin", legacy: false },
20
+ ...spec_1.LEGACY_MANIFEST_LOCATIONS.map((l) => ({ ...l, legacy: true })),
13
21
  ];
14
- const SKILL_NAME_RE = /^[a-z0-9][a-z0-9-_]*$/;
15
22
  const UNMAPPED_FIELDS = [
16
23
  "agents",
17
24
  "hooks",
@@ -26,112 +33,230 @@ function requireStringPathOverride(value, field) {
26
33
  if (typeof value === "string") {
27
34
  return value;
28
35
  }
29
- throw new Error(`Open Plugin '${field}' override is set to a non-string value. Only the single-string form ` +
36
+ throw new errors_1.OpenPluginInputError(`Plugin manifest '${field}' override is set to a non-string value. Only the single-string form ` +
30
37
  `(e.g. \"${field}\": \"./custom/path\") is supported by this converter today.`);
31
38
  }
39
+ /**
40
+ * Resolve a component location. Agent Plugins 1.0.0 fixes component paths, so
41
+ * manifest overrides are ignored (with a warning) for 1.0.0 layouts. Either
42
+ * way the result must stay inside the plugin root.
43
+ */
44
+ function resolveComponentPath(absRoot, override, fixedRel, field, isLegacyLayout, warnings) {
45
+ let rel = fixedRel;
46
+ if (override !== undefined) {
47
+ if (isLegacyLayout) {
48
+ rel = override;
49
+ }
50
+ else {
51
+ warnings.push(`plugin.json '${field}' relocates a component, which Agent Plugins 1.0.0 no longer permits. ` +
52
+ `Using the fixed location '${fixedRel}' instead.`);
53
+ }
54
+ }
55
+ const resolved = (0, spec_1.resolveWithinRoot)(absRoot, rel);
56
+ if (!resolved) {
57
+ warnings.push(`'${field}' path '${rel}' resolves outside the plugin root and was rejected for safety.`);
58
+ return undefined;
59
+ }
60
+ return resolved;
61
+ }
32
62
  async function readOpenPluginDir(root) {
33
63
  const warnings = [];
34
- const absRoot = path.resolve(root);
35
- if (!(await fs_extra_1.default.pathExists(absRoot))) {
36
- throw new Error(`Plugin directory not found: ${absRoot}`);
37
- }
38
- // 1. Probe manifest locations.
64
+ const absRoot = await (0, fileSystem_1.resolvePluginRoot)(root);
65
+ // 1. Probe manifest locations: spec location first, then pre-1.0.0 layouts.
39
66
  let manifestPath;
40
67
  let manifestKind;
68
+ let isLegacyLayout = false;
41
69
  for (const loc of MANIFEST_LOCATIONS) {
42
- const candidate = path.join(absRoot, loc.relPath);
43
- if (await fs_extra_1.default.pathExists(candidate)) {
44
- manifestPath = candidate;
45
- manifestKind = loc.kind;
46
- break;
70
+ const inspected = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, loc.relPath, "file");
71
+ if (inspected.status === "missing")
72
+ continue;
73
+ if (inspected.status === "outside") {
74
+ throw new errors_1.OpenPluginInputError(`Plugin manifest '${loc.relPath}' resolves outside the plugin root.`);
75
+ }
76
+ if (inspected.status === "wrong-kind") {
77
+ throw new errors_1.OpenPluginInputError(`Plugin manifest '${loc.relPath}' must be a regular file.`);
47
78
  }
79
+ manifestPath = inspected.path;
80
+ manifestKind = loc.kind;
81
+ isLegacyLayout = loc.legacy;
82
+ break;
48
83
  }
49
84
  if (!manifestPath || !manifestKind) {
50
- throw new Error(`No Open Plugin manifest found in ${absRoot}. Looked for: ` +
51
- MANIFEST_LOCATIONS.map((l) => l.relPath).join(", "));
85
+ throw new errors_1.OpenPluginInputError(`No plugin manifest found in ${absRoot}. Agent Plugins 1.0.0 requires '${spec_1.PLUGIN_MANIFEST_FILE}' ` +
86
+ `in the plugin root. Also looked for: ` +
87
+ spec_1.LEGACY_MANIFEST_LOCATIONS.map((l) => l.relPath).join(", "));
88
+ }
89
+ if (isLegacyLayout) {
90
+ warnings.push(`Manifest found at '${path.relative(absRoot, manifestPath)}'. Agent Plugins 1.0.0 requires ` +
91
+ `'${spec_1.PLUGIN_MANIFEST_FILE}' in the plugin root; this location is deprecated. ` +
92
+ `Run 'atk export agentplugin' to emit a 1.0.0-compliant directory.`);
52
93
  }
53
- const manifest = (await fs_extra_1.default.readJSON(manifestPath));
54
- if (!manifest.name || typeof manifest.name !== "string") {
55
- throw new Error(`plugin.json is missing required 'name' field at ${manifestPath}`);
94
+ let manifestJson;
95
+ try {
96
+ manifestJson = await fs_extra_1.default.readJSON(manifestPath);
56
97
  }
57
- // 2. MCP servers (with optional path override).
58
- const mcpRel = requireStringPathOverride(manifest.mcpServers, "mcpServers") ?? ".mcp.json";
59
- const mcpAbs = path.resolve(absRoot, mcpRel);
98
+ catch (error) {
99
+ if (!(error instanceof SyntaxError))
100
+ throw error;
101
+ throw new errors_1.OpenPluginInputError("plugin.json contains invalid JSON.");
102
+ }
103
+ const parsedManifest = isLegacyLayout
104
+ ? { manifest: (0, validation_1.parseLegacyOpenPluginManifest)(manifestJson), warnings: [] }
105
+ : (0, validation_1.parseAgentPluginManifest)(manifestJson);
106
+ const manifest = parsedManifest.manifest;
107
+ warnings.push(...parsedManifest.warnings);
108
+ // 2. MCP servers. 1.0.0 uses mcp.json; pre-1.0.0 used .mcp.json.
109
+ const mcpOverride = isLegacyLayout
110
+ ? requireStringPathOverride(manifest.mcpServers, "mcpServers")
111
+ : undefined;
60
112
  const mcpServers = {};
61
- if (await fs_extra_1.default.pathExists(mcpAbs)) {
62
- const mcpJson = (await fs_extra_1.default.readJSON(mcpAbs));
63
- const source = mcpJson &&
64
- typeof mcpJson === "object" &&
65
- mcpJson.mcpServers &&
66
- typeof mcpJson.mcpServers === "object"
67
- ? mcpJson.mcpServers
68
- : mcpJson;
69
- if (source && typeof source === "object") {
70
- for (const [name, value] of Object.entries(source)) {
71
- if (value && typeof value === "object" && !Array.isArray(value)) {
72
- mcpServers[name] = value;
73
- }
113
+ const invalidRemoteMcpServers = [];
114
+ const requestedMcp = mcpOverride
115
+ ? resolveComponentPath(absRoot, mcpOverride, spec_1.MCP_CONFIG_FILE, "mcpServers", isLegacyLayout, warnings)
116
+ : (0, spec_1.resolveWithinRoot)(absRoot, spec_1.MCP_CONFIG_FILE);
117
+ let inspectedMcp = requestedMcp
118
+ ? await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, requestedMcp), "file")
119
+ : undefined;
120
+ if (isLegacyLayout && inspectedMcp?.status === "missing") {
121
+ const legacyMcp = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, spec_1.LEGACY_MCP_CONFIG_FILE, "file");
122
+ if (legacyMcp.status === "ok") {
123
+ warnings.push(`Found '${spec_1.LEGACY_MCP_CONFIG_FILE}'. Agent Plugins 1.0.0 renamed this to '${spec_1.MCP_CONFIG_FILE}'; ` +
124
+ `the dotted name is deprecated.`);
125
+ inspectedMcp = legacyMcp;
126
+ }
127
+ }
128
+ if (inspectedMcp?.status === "outside") {
129
+ warnings.push(`'mcp.json' resolves outside the plugin root and was rejected for safety.`);
130
+ }
131
+ else if (inspectedMcp?.status === "wrong-kind") {
132
+ warnings.push(`'mcp.json' must be a regular file; MCP was disabled for this plugin.`);
133
+ }
134
+ else if (inspectedMcp?.status === "ok") {
135
+ let mcpJson;
136
+ try {
137
+ mcpJson = await fs_extra_1.default.readJSON(inspectedMcp.path);
138
+ }
139
+ catch (error) {
140
+ if (!(error instanceof SyntaxError))
141
+ throw error;
142
+ warnings.push(`mcp.json is invalid JSON; MCP was disabled for this plugin.`);
143
+ }
144
+ if (mcpJson === undefined) {
145
+ // A malformed document is isolated above; filesystem failures still propagate.
146
+ }
147
+ else if (isLegacyLayout) {
148
+ readLegacyMcpServers(mcpJson, mcpServers, invalidRemoteMcpServers, warnings);
149
+ }
150
+ else {
151
+ const parsedMcp = (0, validation_1.parseAgentPluginMcpJson)(mcpJson);
152
+ for (const [name, server] of Object.entries(parsedMcp.mcpServers)) {
153
+ (0, spec_1.setRecordValue)(mcpServers, name, server);
74
154
  }
155
+ invalidRemoteMcpServers.push(...parsedMcp.invalidRemoteMcpServers);
156
+ warnings.push(...parsedMcp.warnings);
75
157
  }
76
158
  }
159
+ removeMcpServersWithFixedHeaders(mcpServers, warnings);
77
160
  // 3. Skills.
78
- const skillsRel = requireStringPathOverride(manifest.skills, "skills") ?? "skills";
79
- const skillsAbs = path.resolve(absRoot, skillsRel);
161
+ const skillsAbs = resolveComponentPath(absRoot, isLegacyLayout ? requireStringPathOverride(manifest.skills, "skills") : undefined, "skills", "skills", isLegacyLayout, warnings);
80
162
  const skills = [];
81
163
  let skillsRoot;
82
- if (await fs_extra_1.default.pathExists(skillsAbs)) {
83
- skillsRoot = skillsAbs;
84
- const entries = await fs_extra_1.default.readdir(skillsAbs, { withFileTypes: true });
164
+ const inspectedSkills = skillsAbs
165
+ ? await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, skillsAbs), "directory")
166
+ : undefined;
167
+ if (inspectedSkills?.status === "outside") {
168
+ warnings.push(`'skills' path resolves outside the plugin root and was rejected for safety.`);
169
+ }
170
+ else if (inspectedSkills?.status === "wrong-kind") {
171
+ warnings.push(`'skills' must resolve to a directory; this component type was ignored.`);
172
+ }
173
+ else if (inspectedSkills?.status === "ok") {
174
+ skillsRoot = inspectedSkills.path;
175
+ const entries = await fs_extra_1.default.readdir(inspectedSkills.path, { withFileTypes: true });
85
176
  for (const entry of entries) {
86
- if (!entry.isDirectory()) {
177
+ const skillDirectory = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, path.join(inspectedSkills.path, entry.name)), "directory");
178
+ if (skillDirectory.status === "outside") {
179
+ warnings.push(`Skipping skill folder '${entry.name}': it resolves outside the plugin root.`);
87
180
  continue;
88
181
  }
89
- if (!SKILL_NAME_RE.test(entry.name)) {
90
- warnings.push(`Skipping skill folder '${entry.name}': name does not match ${SKILL_NAME_RE.source}.`);
182
+ if (skillDirectory.status !== "ok")
183
+ continue;
184
+ const skillMd = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, path.join(skillDirectory.path, "SKILL.md")), "file");
185
+ if (skillMd.status === "outside") {
186
+ warnings.push(`Skipping skill '${entry.name}': SKILL.md resolves outside the plugin root.`);
91
187
  continue;
92
188
  }
93
- const skillMd = path.join(skillsAbs, entry.name, "SKILL.md");
94
- if (await fs_extra_1.default.pathExists(skillMd)) {
95
- skills.push(entry.name);
189
+ if (skillMd.status !== "ok")
190
+ continue;
191
+ const validationError = await (0, skillValidation_1.getAgentSkillValidationError)(entry.name, skillMd.path);
192
+ if (validationError) {
193
+ warnings.push(`Skipping skill '${entry.name}': ${validationError}.`);
194
+ continue;
96
195
  }
196
+ skills.push(entry.name);
97
197
  }
98
198
  skills.sort();
99
199
  }
100
- // 4. Commands.
101
- const commandsRel = requireStringPathOverride(manifest.commands, "commands") ?? "commands";
102
- const commandsAbs = path.resolve(absRoot, commandsRel);
200
+ // 4. Commands. Not an Agent Plugins 1.0.0 component; still copied through so
201
+ // pre-1.0.0 directories round-trip.
202
+ const commandsAbs = resolveComponentPath(absRoot, isLegacyLayout ? requireStringPathOverride(manifest.commands, "commands") : undefined, "commands", "commands", isLegacyLayout, warnings);
103
203
  const commands = [];
104
204
  let commandsRoot;
105
- if (await fs_extra_1.default.pathExists(commandsAbs)) {
106
- commandsRoot = commandsAbs;
107
- const entries = await fs_extra_1.default.readdir(commandsAbs, { withFileTypes: true });
205
+ const inspectedCommands = commandsAbs
206
+ ? await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, commandsAbs), "directory")
207
+ : undefined;
208
+ if (inspectedCommands?.status === "outside") {
209
+ warnings.push(`'commands' path resolves outside the plugin root and was rejected for safety.`);
210
+ }
211
+ else if (inspectedCommands?.status === "wrong-kind") {
212
+ warnings.push(`'commands' must resolve to a directory and was ignored.`);
213
+ }
214
+ else if (inspectedCommands?.status === "ok") {
215
+ commandsRoot = inspectedCommands.path;
216
+ const entries = await fs_extra_1.default.readdir(inspectedCommands.path, { withFileTypes: true });
108
217
  for (const entry of entries) {
109
- if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
218
+ if (!entry.name.toLowerCase().endsWith(".md"))
219
+ continue;
220
+ if (entry.isSymbolicLink()) {
221
+ warnings.push(`Skipping command '${entry.name}': symbolic links are not permitted.`);
222
+ continue;
223
+ }
224
+ if (!entry.isFile())
225
+ continue;
226
+ const command = await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, path.relative(absRoot, path.join(inspectedCommands.path, entry.name)), "file");
227
+ if (command.status === "outside") {
228
+ warnings.push(`Skipping command '${entry.name}': it resolves outside the plugin root.`);
229
+ }
230
+ else if (command.status === "ok") {
110
231
  commands.push(entry.name);
111
232
  }
112
233
  }
113
234
  commands.sort();
114
235
  }
115
- // 5. Unmapped Open Plugin fields → emit a warning so the caller knows we
116
- // dropped them. We do not throw — the spec says hosts may ignore unknown
117
- // component types.
118
- const manifestRecord = manifest;
236
+ // 5. Unmapped component fields → emit a warning so the caller knows we
237
+ // dropped them. We do not throw — the spec says clients report and ignore
238
+ // unknown members rather than rejecting an otherwise valid plugin.
119
239
  for (const field of UNMAPPED_FIELDS) {
120
- if (manifestRecord[field] !== undefined) {
121
- warnings.push(`Open Plugin '${field}' field is present but not supported by MOS3 today; dropped.`);
240
+ if (manifest[field] !== undefined) {
241
+ warnings.push(`'${field}' field is present but not supported by MOS3 today; dropped.`);
122
242
  }
123
243
  }
124
244
  // 6. Icons.
125
- const hasColorPng = await fs_extra_1.default.pathExists(path.join(absRoot, "color.png"));
126
- const hasOutlinePng = await fs_extra_1.default.pathExists(path.join(absRoot, "outline.png"));
127
- // 7. Round-trip extension block (written by `atk export openplugin`).
128
- const atkExtension = readAtkExtensionBlock(manifest);
245
+ const hasColorPng = (await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, "color.png", "file")).status === "ok";
246
+ const hasOutlinePng = (await (0, fileSystem_1.inspectPathWithinRoot)(absRoot, "outline.png", "file")).status === "ok";
247
+ // 7. Round-trip extension block (written by `atk export agentplugin`).
248
+ const atkExtension = readAtkExtensionBlock(manifest, warnings);
249
+ if (atkExtension) {
250
+ await validateAtkExtensionFiles(absRoot, atkExtension, warnings);
251
+ }
129
252
  return {
130
253
  pluginRoot: absRoot,
131
254
  manifest,
132
255
  manifestPath,
133
256
  manifestKind,
257
+ isLegacyLayout,
134
258
  mcpServers,
259
+ invalidRemoteMcpServers,
135
260
  skills,
136
261
  skillsRoot,
137
262
  commands,
@@ -142,12 +267,81 @@ async function readOpenPluginDir(root) {
142
267
  atkExtension,
143
268
  };
144
269
  }
145
- const ATK_EXTENSION_KEY = "x-microsoft-365-agents-toolkit";
146
- function readAtkExtensionBlock(manifest) {
147
- const raw = manifest[ATK_EXTENSION_KEY];
148
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) {
149
- return undefined;
270
+ async function validateAtkExtensionFiles(pluginRoot, extension, warnings) {
271
+ for (const [serverName, connector] of Object.entries(extension.agentConnectors ?? {})) {
272
+ const description = connector.mcpToolDescription;
273
+ if (!description)
274
+ continue;
275
+ if (description.file === undefined) {
276
+ delete description.source;
277
+ continue;
278
+ }
279
+ const normalizedFile = (0, spec_1.normalizePortableRelativePath)(description.file);
280
+ const normalizedSource = description.source
281
+ ? (0, spec_1.normalizePortableRelativePath)(description.source)
282
+ : undefined;
283
+ const destination = normalizedFile ? (0, spec_1.resolveWithinRoot)(pluginRoot, normalizedFile) : undefined;
284
+ const source = normalizedSource !== undefined
285
+ ? await (0, fileSystem_1.readFileWithinRoot)(pluginRoot, normalizedSource)
286
+ : undefined;
287
+ if (!destination || source?.status !== "ok") {
288
+ delete connector.mcpToolDescription;
289
+ warnings.push(`Toolkit extension connector '${serverName}' has an unsafe or missing MCP tool-description file and it was ignored.`);
290
+ }
291
+ else {
292
+ description.file = normalizedFile;
293
+ description.source = normalizedSource;
294
+ description.contents = source.contents;
295
+ }
296
+ }
297
+ }
298
+ /**
299
+ * Read the toolkit round-trip block. Agent Plugins 1.0.0 places it at
300
+ * `extensions["com.microsoft.agents-toolkit"]`; pre-1.0.0 exports wrote it to a
301
+ * top-level `x-microsoft-365-agents-toolkit` key, which is still honoured.
302
+ */
303
+ function readAtkExtensionBlock(manifest, warnings) {
304
+ const namespaced = manifest.extensions?.[spec_1.ATK_EXTENSION_NAMESPACE];
305
+ if (namespaced !== undefined)
306
+ return (0, validation_1.parseAtkExtension)(namespaced, warnings);
307
+ const legacy = manifest.legacyAtkExtension;
308
+ if (legacy !== undefined) {
309
+ warnings.push(`Found the toolkit block at top-level '${spec_1.LEGACY_ATK_EXTENSION_KEY}'. Agent Plugins 1.0.0 ` +
310
+ `requires client data under 'extensions["${spec_1.ATK_EXTENSION_NAMESPACE}"]'; the top-level key ` +
311
+ `is deprecated and re-exporting will move it.`);
312
+ return (0, validation_1.parseAtkExtension)(legacy, warnings);
313
+ }
314
+ return undefined;
315
+ }
316
+ function readLegacyMcpServers(value, mcpServers, invalidRemoteMcpServers, warnings) {
317
+ if (!(0, validation_1.isRecord)(value))
318
+ return;
319
+ const source = (0, validation_1.isRecord)(value.mcpServers) ? value.mcpServers : value;
320
+ for (const [name, server] of Object.entries(source)) {
321
+ if (name === "$schema" || !(0, validation_1.isRecord)(server))
322
+ continue;
323
+ const entry = {};
324
+ for (const [field, fieldValue] of Object.entries(server)) {
325
+ (0, spec_1.setRecordValue)(entry, field, fieldValue);
326
+ }
327
+ if (entry.url !== undefined) {
328
+ const urlError = (0, validation_1.getRemoteMcpUrlError)(entry.url);
329
+ if (urlError) {
330
+ invalidRemoteMcpServers.push(name);
331
+ warnings.push(`MCP server '${name}' is invalid and was skipped: ${urlError}`);
332
+ continue;
333
+ }
334
+ }
335
+ (0, spec_1.setRecordValue)(mcpServers, name, entry);
336
+ }
337
+ }
338
+ function removeMcpServersWithFixedHeaders(mcpServers, warnings) {
339
+ for (const [name, server] of Object.entries(mcpServers)) {
340
+ if (server.headers !== undefined &&
341
+ (!(0, validation_1.isRecord)(server.headers) || Object.keys(server.headers).length > 0)) {
342
+ delete mcpServers[name];
343
+ warnings.push(`MCP server '${name}' declares fixed headers, which Teams agent connectors cannot represent, and was skipped.`);
344
+ }
150
345
  }
151
- return raw;
152
346
  }
153
347
  //# sourceMappingURL=parser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function getAgentSkillValidationError(skillName: string, skillMdPath: string): Promise<string | undefined>;
2
+ //# sourceMappingURL=skillValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillValidation.d.ts","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/skillValidation.ts"],"names":[],"mappings":"AAaA,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAoD7B"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ // Copyright (c) Microsoft Corporation.
3
+ // Licensed under the MIT license.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.getAgentSkillValidationError = getAgentSkillValidationError;
6
+ const tslib_1 = require("tslib");
7
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
8
+ const js_yaml_1 = tslib_1.__importDefault(require("js-yaml"));
9
+ const validation_1 = require("./validation");
10
+ const SKILL_FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
11
+ const SKILL_NAME_RE = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
12
+ const SKILL_NAME_MAX_LENGTH = 64;
13
+ const SKILL_DESCRIPTION_MAX_LENGTH = 1024;
14
+ const SKILL_COMPATIBILITY_MAX_LENGTH = 500;
15
+ async function getAgentSkillValidationError(skillName, skillMdPath) {
16
+ if (skillName.length > SKILL_NAME_MAX_LENGTH || !SKILL_NAME_RE.test(skillName)) {
17
+ return "folder name must contain only lowercase letters, numbers, and single hyphens";
18
+ }
19
+ const source = await fs_extra_1.default.readFile(skillMdPath, "utf8");
20
+ const match = SKILL_FRONTMATTER_RE.exec(source);
21
+ if (!match)
22
+ return "SKILL.md must begin with YAML frontmatter";
23
+ let frontmatter;
24
+ try {
25
+ frontmatter = js_yaml_1.default.load(match[1]);
26
+ }
27
+ catch (error) {
28
+ const detail = error instanceof Error ? error.message : String(error);
29
+ return `SKILL.md frontmatter is not valid YAML: ${detail}`;
30
+ }
31
+ if (!(0, validation_1.isRecord)(frontmatter))
32
+ return "SKILL.md frontmatter must be a YAML mapping";
33
+ if (frontmatter.name !== skillName) {
34
+ return `frontmatter name must exactly match the parent folder '${skillName}'`;
35
+ }
36
+ if (typeof frontmatter.description !== "string" ||
37
+ frontmatter.description.length < 1 ||
38
+ frontmatter.description.length > SKILL_DESCRIPTION_MAX_LENGTH) {
39
+ return `frontmatter description must contain 1-${SKILL_DESCRIPTION_MAX_LENGTH} characters`;
40
+ }
41
+ if (frontmatter.license !== undefined &&
42
+ (typeof frontmatter.license !== "string" || frontmatter.license.length < 1)) {
43
+ return "frontmatter license must be a non-empty string";
44
+ }
45
+ if (frontmatter.compatibility !== undefined &&
46
+ (typeof frontmatter.compatibility !== "string" ||
47
+ frontmatter.compatibility.length < 1 ||
48
+ frontmatter.compatibility.length > SKILL_COMPATIBILITY_MAX_LENGTH)) {
49
+ return `frontmatter compatibility must contain 1-${SKILL_COMPATIBILITY_MAX_LENGTH} characters`;
50
+ }
51
+ if (frontmatter.metadata !== undefined && !hasStringValues(frontmatter.metadata)) {
52
+ return "frontmatter metadata must map string keys to string values";
53
+ }
54
+ if (frontmatter["allowed-tools"] !== undefined &&
55
+ typeof frontmatter["allowed-tools"] !== "string") {
56
+ return "frontmatter allowed-tools must be a string";
57
+ }
58
+ return undefined;
59
+ }
60
+ function hasStringValues(value) {
61
+ return (0, validation_1.isRecord)(value) && Object.values(value).every((entry) => typeof entry === "string");
62
+ }
63
+ //# sourceMappingURL=skillValidation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skillValidation.js","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/skillValidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Constants and helpers for the Agent Plugins specification v1.0.0
3
+ * (https://agent-plugins.org/).
4
+ *
5
+ * This specification was previously published as the "Open Plugin Spec" at
6
+ * https://open-plugins.com/, which now permanently redirects (308) to
7
+ * agent-plugins.org. Internal identifiers in this module keep the historical
8
+ * `openPlugin` naming; the user-facing CLI accepts both `openplugin` and
9
+ * `agentplugin`.
10
+ */
11
+ export declare const AGENT_PLUGINS_VERSION = "1.0.0";
12
+ /** Required `$schema` value in plugin.json. */
13
+ export declare const PLUGIN_SCHEMA_URL = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
14
+ /** `$schema` value in mcp.json. */
15
+ export declare const MCP_SCHEMA_URL = "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json";
16
+ /** Spec-mandated manifest location: plugin.json in the plugin root. */
17
+ export declare const PLUGIN_MANIFEST_FILE = "plugin.json";
18
+ /** Spec-mandated MCP configuration location: mcp.json in the plugin root. */
19
+ export declare const MCP_CONFIG_FILE = "mcp.json";
20
+ /**
21
+ * Reverse-domain namespace for toolkit-specific manifest data. Agent Plugins
22
+ * 1.0.0 closes the manifest schema (`additionalProperties: false`), so client
23
+ * data must live under `extensions[<namespace>]` rather than at the top level.
24
+ */
25
+ export declare const ATK_EXTENSION_NAMESPACE = "com.microsoft.agents-toolkit";
26
+ /** Pre-1.0.0 top-level extension key. Still read on import for back-compat. */
27
+ export declare const LEGACY_ATK_EXTENSION_KEY = "x-microsoft-365-agents-toolkit";
28
+ /** Pre-1.0.0 MCP config filename. Still read on import for back-compat. */
29
+ export declare const LEGACY_MCP_CONFIG_FILE = ".mcp.json";
30
+ /**
31
+ * Pre-1.0.0 manifest locations. Agent Plugins 1.0.0 requires plugin.json in the
32
+ * plugin root; these are still probed on import so directories authored against
33
+ * the older spec keep working.
34
+ */
35
+ export declare const LEGACY_MANIFEST_LOCATIONS: ReadonlyArray<{
36
+ relPath: string;
37
+ kind: "open-plugin" | "claude-plugin" | "cursor-plugin";
38
+ }>;
39
+ /** `name` constraints from plugin.schema.json. */
40
+ export declare const PLUGIN_NAME_MAX_LENGTH = 64;
41
+ export declare const PLUGIN_NAME_PATTERN: RegExp;
42
+ /** Transport types permitted by mcp.schema.json. `sse` is legacy HTTP+SSE. */
43
+ export type AgentPluginMcpServerType = "stdio" | "streamable-http" | "sse";
44
+ export declare const MCP_SERVER_TYPES: readonly AgentPluginMcpServerType[];
45
+ /** Transport emitted by `atk export` for remote MCP servers. */
46
+ export declare const DEFAULT_REMOTE_MCP_TYPE: AgentPluginMcpServerType;
47
+ export declare function isValidPluginName(name: string): boolean;
48
+ export declare function isSupportedMcpServerType(value: unknown): value is AgentPluginMcpServerType;
49
+ /** Add an own enumerable entry without invoking Object.prototype.__proto__. */
50
+ export declare function setRecordValue<T>(record: Record<string, T>, key: string, value: T): void;
51
+ /** Reject absolute and drive-relative paths under both POSIX and Windows semantics. */
52
+ export declare function isPortableRelativePath(value: string): boolean;
53
+ export declare function normalizePortableRelativePath(value: string): string | undefined;
54
+ export declare function portablePathsConflict(left: string, right: string): boolean;
55
+ /**
56
+ * Coerce an arbitrary display string into a name that satisfies
57
+ * plugin.schema.json: lowercase, `[a-z0-9.-]`, no leading/trailing `.`/`-`,
58
+ * no `--` or `..`, and at most 64 characters.
59
+ */
60
+ export declare function normalizePluginName(raw: string, fallback?: string): string;
61
+ /**
62
+ * Reject paths that escape their designated root, per the Agent Plugins
63
+ * security rules ("resolved paths MUST remain within the plugin root").
64
+ * Returns the resolved absolute path, or undefined when it escapes.
65
+ */
66
+ export declare function resolveWithinRoot(root: string, relative: string): string | undefined;
67
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","sourceRoot":"","sources":["../../../../src/component/generator/openPlugin/spec.ts"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AAEH,eAAO,MAAM,qBAAqB,UAAU,CAAC;AAE7C,+CAA+C;AAC/C,eAAO,MAAM,iBAAiB,+DAA+D,CAAC;AAE9F,mCAAmC;AACnC,eAAO,MAAM,cAAc,4DAA4D,CAAC;AAExF,uEAAuE;AACvE,eAAO,MAAM,oBAAoB,gBAAgB,CAAC;AAElD,6EAA6E;AAC7E,eAAO,MAAM,eAAe,aAAa,CAAC;AAE1C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,iCAAiC,CAAC;AAEtE,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,mCAAmC,CAAC;AAEzE,2EAA2E;AAC3E,eAAO,MAAM,sBAAsB,cAAc,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,EAAE,aAAa,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;CACzD,CAIA,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,sBAAsB,KAAK,CAAC;AACzC,eAAO,MAAM,mBAAmB,QAAwD,CAAC;AAMzF,8EAA8E;AAC9E,MAAM,MAAM,wBAAwB,GAAG,OAAO,GAAG,iBAAiB,GAAG,KAAK,CAAC;AAC3E,eAAO,MAAM,gBAAgB,EAAE,SAAS,wBAAwB,EAI/D,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,uBAAuB,EAAE,wBAA4C,CAAC;AAEnF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,wBAAwB,CAE1F;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAOxF;AAED,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB/E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAM1E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,SAAoB,GAAG,MAAM,CAmBrF;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAWpF"}