(packagePath string)
| 323 | } |
| 324 | |
| 325 | func validateLocalSkillPackagePath(packagePath string) (string, error) { |
| 326 | packagePath = strings.TrimSpace(packagePath) |
| 327 | if packagePath == "" { |
| 328 | return "", fmt.Errorf("skill package path is required") |
| 329 | } |
| 330 | if _, err := localSkillPackageFormat(packagePath); err != nil { |
| 331 | return "", err |
| 332 | } |
| 333 | absPath, err := filepath.Abs(packagePath) |
| 334 | if err != nil { |
| 335 | return "", err |
| 336 | } |
| 337 | resolvedPath, err := filepath.EvalSymlinks(absPath) |
| 338 | if err != nil { |
| 339 | return "", err |
| 340 | } |
| 341 | if !isLocalSkillPackageAllowedPath(resolvedPath) { |
| 342 | return "", fmt.Errorf("invalid local skill package path") |
| 343 | } |
| 344 | info, err := os.Stat(resolvedPath) |
| 345 | if err != nil { |
| 346 | return "", err |
| 347 | } |
| 348 | if info.IsDir() { |
| 349 | return "", fmt.Errorf("skill package must be a file") |
| 350 | } |
| 351 | return resolvedPath, nil |
| 352 | } |
| 353 | |
| 354 | func isLocalSkillPackageAllowedPath(resolvedPath string) bool { |
| 355 | roots := []string{ |
no test coverage detected