@@ -209,12 +209,33 @@ async def test_read_skill_resource_returns_verified_text() -> None:
209209 """SDK-defined: a matching manifest allows a fetched text file."""
210210 async with _skills (_server ()) as skills :
211211 skill = await skills .get_skill (_SKILL_URI )
212- result = await skills .read_skill_resource (skill , _SKILL_URI )
212+ result = await skills .read_skill_resource (skill )
213213 contents = result .contents [0 ]
214214 assert isinstance (contents , TextResourceContents )
215215 assert contents .text == _SKILL_CONTENT
216216
217217
218+ async def test_read_skill_resource_accepts_a_supporting_file_uri () -> None :
219+ """SEP-2640: a supporting file is checked against the same held manifest."""
220+ uri = "skill://git-workflow/references/GUIDE.md"
221+ content = "# Guide\n "
222+ server = _server ()
223+ server .add_resource (TextResource (uri = uri , name = "GUIDE.md" , text = content ))
224+ skill = Skill (
225+ uri = _SKILL_URI ,
226+ frontmatter = {"name" : "git-workflow" , "description" : "d" },
227+ resources = [
228+ SkillResource (uri = _SKILL_URI , digest = _SKILL_DIGEST , size = len (_SKILL_CONTENT )),
229+ SkillResource (uri = uri , digest = f"sha256:{ hashlib .sha256 (content .encode ()).hexdigest ()} " , size = len (content )),
230+ ],
231+ )
232+ async with _skills (server ) as skills :
233+ result = await skills .read_skill_resource (skill , uri )
234+ contents = result .contents [0 ]
235+ assert isinstance (contents , TextResourceContents )
236+ assert contents .text == content
237+
238+
218239async def test_read_skill_resource_rejects_a_changed_file () -> None :
219240 """SEP-2640: a host rejects content that differs from the held manifest."""
220241 stale = Skill (
@@ -224,7 +245,7 @@ async def test_read_skill_resource_rejects_a_changed_file() -> None:
224245 )
225246 async with _skills (_server ()) as skills :
226247 with pytest .raises (ValueError ) as exc_info :
227- await skills .read_skill_resource (stale , _SKILL_URI )
248+ await skills .read_skill_resource (stale )
228249 assert str (exc_info .value ) == snapshot (
229250 "resource 'skill://git-workflow/SKILL.md' has digest "
230251 "'sha256:7187b725da92d7447b6f50e21d0bf4f3b9db3387acb39239c4a4edc193ddcd4b', "
@@ -247,7 +268,7 @@ async def test_read_skill_resource_rejects_a_dynamic_skill() -> None:
247268 dynamic = Skill (uri = _SKILL_URI , frontmatter = {"name" : "git-workflow" , "description" : "d" }, resources = "dynamic" )
248269 async with _skills (_server ()) as skills :
249270 with pytest .raises (ValueError ) as exc_info :
250- await skills .read_skill_resource (dynamic , _SKILL_URI )
271+ await skills .read_skill_resource (dynamic )
251272 assert str (exc_info .value ) == snapshot (
252273 "skill 'skill://git-workflow/SKILL.md' has dynamic resources and cannot be integrity-verified"
253274 )
@@ -264,7 +285,7 @@ async def test_read_skill_resource_returns_verified_binary_content() -> None:
264285 resources = [SkillResource (uri = _SKILL_URI , digest = f"sha256:{ hashlib .sha256 (data ).hexdigest ()} " , size = len (data ))],
265286 )
266287 async with _skills (server ) as skills :
267- result = await skills .read_skill_resource (skill , _SKILL_URI )
288+ result = await skills .read_skill_resource (skill )
268289 contents = result .contents [0 ]
269290 assert isinstance (contents , BlobResourceContents )
270291 assert contents .blob == base64 .b64encode (data ).decode ("ascii" )
@@ -294,7 +315,7 @@ async def handler(ctx: ServerRequestContext[Any, Any], params: ReadResourceReque
294315 server .add_request_handler ("resources/read" , ReadResourceRequestParams , handler )
295316 async with Client (server , extensions = [ClientSkills ()]) as client :
296317 with pytest .raises (ValueError ) as exc_info :
297- await client .extension (ClientSkills ).read_skill_resource (_skill (), _SKILL_URI )
318+ await client .extension (ClientSkills ).read_skill_resource (_skill ())
298319 assert str (exc_info .value ) == snapshot (
299320 "resource 'skill://git-workflow/SKILL.md' did not return exactly one matching content item"
300321 )
@@ -314,7 +335,7 @@ async def handler(ctx: ServerRequestContext[Any, Any], params: ReadResourceReque
314335 server .add_request_handler ("resources/read" , ReadResourceRequestParams , handler )
315336 async with Client (server , extensions = [ClientSkills ()]) as client :
316337 with pytest .raises (ValueError ) as exc_info :
317- await client .extension (ClientSkills ).read_skill_resource (_skill (), _SKILL_URI )
338+ await client .extension (ClientSkills ).read_skill_resource (_skill ())
318339 assert str (exc_info .value ) == snapshot ("resource 'skill://git-workflow/SKILL.md' returned invalid base64 content" )
319340
320341
0 commit comments