(extractRoot, installRoot, skillName string)
| 378 | } |
| 379 | |
| 380 | func normalizeLocalSkillInstallRoot(extractRoot, installRoot, skillName string) (string, string, error) { |
| 381 | entries, err := os.ReadDir(extractRoot) |
| 382 | if err != nil { |
| 383 | return "", "", err |
| 384 | } |
| 385 | if len(entries) == 0 { |
| 386 | return "", "", fmt.Errorf("skill package is empty") |
| 387 | } |
| 388 | if len(entries) == 1 && entries[0].IsDir() { |
| 389 | return extractRoot, entries[0].Name(), nil |
| 390 | } |
| 391 | skillRoot := filepath.Join(installRoot, skillName) |
| 392 | if err := os.MkdirAll(skillRoot, 0755); err != nil { |
| 393 | return "", "", err |
| 394 | } |
| 395 | if err := copyLocalDirContents(extractRoot, skillRoot); err != nil { |
| 396 | return "", "", err |
| 397 | } |
| 398 | return installRoot, skillName, nil |
| 399 | } |
| 400 | |
| 401 | func registerOpenclawLocalSkill(containerName, configPath, skillName string) error { |
| 402 | conf, err := readOpenclawConfig(configPath) |
no test coverage detected