diff --git a/codex/wrapper/main.go b/codex/wrapper/main.go index 04082d1..484927a 100644 --- a/codex/wrapper/main.go +++ b/codex/wrapper/main.go @@ -71,8 +71,9 @@ type buildArgs struct { MemoryPrompt string Task string Config string - SkillsDir string + SkillsDirs []string RolesDirs []string + FilesDirs []string } func parseBuildArgs(args []string) buildArgs { @@ -107,10 +108,13 @@ func parseBuildArgs(args []string) buildArgs { ba.Config = args[i] case "--skills-dir": i++ - ba.SkillsDir = args[i] + ba.SkillsDirs = append(ba.SkillsDirs, args[i]) case "--roles-dir": i++ ba.RolesDirs = append(ba.RolesDirs, args[i]) + case "--files-dir": + i++ + ba.FilesDirs = append(ba.FilesDirs, args[i]) } } return ba @@ -157,9 +161,12 @@ func cmdBuild(args []string) { os.Exit(1) } - // Symlink each subdirectory in skills-dir into skills// - if ba.SkillsDir != "" { - entries, err := os.ReadDir(ba.SkillsDir) + // Symlink each subdirectory from each skills-dir into skills// + for _, skillsDir := range ba.SkillsDirs { + if skillsDir == "" { + continue + } + entries, err := os.ReadDir(skillsDir) if err == nil && len(entries) > 0 { skillsTarget := filepath.Join(ba.AgentWorkspaceDir, "skills") if err := os.MkdirAll(skillsTarget, 0o755); err != nil { @@ -170,8 +177,11 @@ func cmdBuild(args []string) { if !entry.IsDir() && entry.Type()&fs.ModeSymlink == 0 { continue } - src := filepath.Join(ba.SkillsDir, entry.Name()) + src := filepath.Join(skillsDir, entry.Name()) link := filepath.Join(skillsTarget, entry.Name()) + if _, err := os.Lstat(link); err == nil { + continue + } if err := symlink(src, link); err != nil { fmt.Fprintf(os.Stderr, "Failed to link skill %s: %v\n", entry.Name(), err) os.Exit(1) @@ -244,6 +254,13 @@ func cmdBuild(args []string) { // Single --add-dir pointing to the agent workspace. cmd = append(cmd, "--add-dir", ba.AgentWorkspaceDir) + // Add project files directories if provided + for _, filesDir := range ba.FilesDirs { + if filesDir != "" { + cmd = append(cmd, "--add-dir", filesDir) + } + } + // Output JSON result := map[string]interface{}{ "cmd": cmd, diff --git a/codex/wrapper/main_test.go b/codex/wrapper/main_test.go index 3267904..aafe19d 100644 --- a/codex/wrapper/main_test.go +++ b/codex/wrapper/main_test.go @@ -44,8 +44,8 @@ func TestParseBuildArgs_AllFlags(t *testing.T) { if ba.Config != `{"model":"o3"}` { t.Errorf("Config = %q, want %q", ba.Config, `{"model":"o3"}`) } - if ba.SkillsDir != "/skills" { - t.Errorf("SkillsDir = %q, want %q", ba.SkillsDir, "/skills") + if len(ba.SkillsDirs) != 1 || ba.SkillsDirs[0] != "/skills" { + t.Errorf("SkillsDirs = %v, want [/skills]", ba.SkillsDirs) } if len(ba.RolesDirs) != 2 || ba.RolesDirs[0] != "/roles1" || ba.RolesDirs[1] != "/roles2" { t.Errorf("RolesDirs = %v, want [/roles1 /roles2]", ba.RolesDirs) diff --git a/strawpot_codex/AGENT.md b/strawpot_codex/AGENT.md index c4a46a2..943f7eb 100644 --- a/strawpot_codex/AGENT.md +++ b/strawpot_codex/AGENT.md @@ -2,7 +2,6 @@ name: strawpot-codex description: OpenAI Codex CLI agent metadata: - version: "0.1.0" strawpot: bin: macos: strawpot_codex