@@ -182,3 +182,63 @@ func TestSkillPublishDirectDryRun(t *testing.T) {
182182 RequireOutputContains (t , result , "DRY RUN" )
183183 RequireOutputContains (t , result , "direct-test-skill" )
184184}
185+
186+ // TestSkillDelete tests publishing a skill and then deleting it via the
187+ // DELETE /v0/skills/{name}/versions/{version} endpoint.
188+ func TestSkillDelete (t * testing.T ) {
189+ regURL := RegistryURL (t )
190+ tmpDir := t .TempDir ()
191+
192+ skillName := UniqueNameWithPrefix ("e2e-del-skill" )
193+ version := "0.0.1-e2e"
194+ githubRepo := "https://github.com/agentregistry-dev/skills/tree/main/artifacts-builder"
195+
196+ // Create a skill folder with SKILL.md
197+ skillDir := filepath .Join (tmpDir , skillName )
198+ if err := os .MkdirAll (skillDir , 0755 ); err != nil {
199+ t .Fatalf ("failed to create skill dir: %v" , err )
200+ }
201+ skillMd := "---\n name: " + skillName + "\n description: E2E delete test\n ---\n # Test\n "
202+ if err := os .WriteFile (filepath .Join (skillDir , "SKILL.md" ), []byte (skillMd ), 0644 ); err != nil {
203+ t .Fatalf ("failed to write SKILL.md: %v" , err )
204+ }
205+
206+ // Step 1: Publish the skill
207+ t .Run ("publish" , func (t * testing.T ) {
208+ result := RunArctl (t , tmpDir ,
209+ "skill" , "publish" , skillDir ,
210+ "--github" , githubRepo ,
211+ "--version" , version ,
212+ "--registry-url" , regURL ,
213+ )
214+ RequireSuccess (t , result )
215+ })
216+
217+ // Step 2: Verify it exists
218+ t .Run ("exists_before_delete" , func (t * testing.T ) {
219+ resp := RegistryGet (t , regURL + "/skills/" + skillName )
220+ defer resp .Body .Close ()
221+ if resp .StatusCode != http .StatusOK {
222+ t .Fatalf ("expected 200 before delete, got %d" , resp .StatusCode )
223+ }
224+ })
225+
226+ // Step 3: Delete via CLI
227+ t .Run ("delete" , func (t * testing.T ) {
228+ result := RunArctl (t , tmpDir ,
229+ "skill" , "delete" , skillName ,
230+ "--version" , version ,
231+ "--registry-url" , regURL ,
232+ )
233+ RequireSuccess (t , result )
234+ })
235+
236+ // Step 4: Verify it's gone
237+ t .Run ("gone_after_delete" , func (t * testing.T ) {
238+ resp := RegistryGet (t , regURL + "/skills/" + skillName + "/versions/" + version )
239+ defer resp .Body .Close ()
240+ if resp .StatusCode != http .StatusNotFound {
241+ t .Errorf ("expected 404 after delete, got %d" , resp .StatusCode )
242+ }
243+ })
244+ }
0 commit comments