MCPcopy Create free account
hub / github.com/compozy/agh / readSkillResource

Function readSkillResource

internal/cli/skill_workspace.go:410–478  ·  view source on GitHub ↗
(skill *skills.Skill, bundledFS fs.FS, relativePath string)

Source from the content-addressed store, hash-verified

408}
409
410func readSkillResource(skill *skills.Skill, bundledFS fs.FS, relativePath string) (string, error) {
411 if skill == nil {
412 return "", errors.New("skill is required")
413 }
414
415 switch skill.Source {
416 case skills.SourceBundled:
417 if bundledFS == nil {
418 return "", errors.New("bundled skills filesystem is required")
419 }
420
421 cleanPath, err := cleanBundledSkillRelativePath(relativePath)
422 if err != nil {
423 return "", err
424 }
425 root := strings.TrimSpace(skill.Dir)
426 if root == "" {
427 return "", errors.New("skill directory is required")
428 }
429
430 content, err := fs.ReadFile(bundledFS, path.Join(root, cleanPath))
431 if err != nil {
432 return "", fmt.Errorf("cli: read bundled skill file %q: %w", cleanPath, err)
433 }
434 return string(content), nil
435 default:
436 cleanPath, err := cleanFilesystemSkillRelativePath(relativePath)
437 if err != nil {
438 return "", err
439 }
440
441 root := strings.TrimSpace(skill.Dir)
442 if root == "" {
443 return "", errors.New("skill directory is required")
444 }
445
446 targetPath := filepath.Join(root, cleanPath)
447 absRoot, err := filepath.Abs(root)
448 if err != nil {
449 return "", fmt.Errorf("cli: resolve skill directory %q: %w", root, err)
450 }
451 resolvedRoot, err := filepath.EvalSymlinks(absRoot)
452 if err != nil {
453 return "", fmt.Errorf("cli: resolve skill directory %q: %w", absRoot, err)
454 }
455 absTarget, err := filepath.Abs(targetPath)
456 if err != nil {
457 return "", fmt.Errorf("cli: resolve skill file %q: %w", targetPath, err)
458 }
459 resolvedTarget, err := filepath.EvalSymlinks(absTarget)
460 if err != nil {
461 return "", fmt.Errorf("cli: resolve skill file %q: %w", absTarget, err)
462 }
463
464 relativeToRoot, err := filepath.Rel(resolvedRoot, resolvedTarget)
465 if err != nil {
466 return "", fmt.Errorf("cli: resolve skill file %q within %q: %w", resolvedTarget, resolvedRoot, err)
467 }

Callers 1

Calls 3

ReadFileMethod · 0.65

Tested by

no test coverage detected