Skip to content

Commit 4954e0d

Browse files
jolestarjolestar
andauthored
run: load config from resolved workspace (#692) (#739)
Co-authored-by: jolestar <host-user@example.com>
1 parent ec86ed9 commit 4954e0d

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed

cmd/holon/main.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -216,18 +216,20 @@ func resolveOutDir(workspace string) (string, bool, error) {
216216
return tempDir, true, nil
217217
}
218218

219+
func loadRunProjectConfig(workspace string) (*config.ProjectConfig, error) {
220+
projectCfg, err := config.Load(workspace)
221+
if err != nil {
222+
return nil, fmt.Errorf("failed to load project config from workspace %s: %w", workspace, err)
223+
}
224+
return projectCfg, nil
225+
}
226+
219227
var runCmd = &cobra.Command{
220228
Use: "run",
221229
Short: "Run a Holon agent execution",
222230
RunE: func(cmd *cobra.Command, args []string) error {
223231
ctx := context.Background()
224232

225-
// Load project config
226-
projectCfg, err := config.LoadFromCurrentDir()
227-
if err != nil {
228-
return fmt.Errorf("failed to load project config: %w", err)
229-
}
230-
231233
agentResolution, err := resolveAgentHome("run", agentID, agentHome, true)
232234
if err != nil {
233235
return err
@@ -241,6 +243,13 @@ var runCmd = &cobra.Command{
241243
if err != nil {
242244
return err
243245
}
246+
247+
// Load project config from the resolved workspace (not from shell CWD).
248+
projectCfg, err := loadRunProjectConfig(absWorkspace)
249+
if err != nil {
250+
return err
251+
}
252+
244253
// Apply config with precedence: CLI flags > project config > defaults
245254
resolved := resolveWithProjectConfig(cmd, projectCfg, absWorkspace)
246255

cmd/holon/main_run_config_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
)
8+
9+
func writeRunProjectConfig(t *testing.T, root string, content string) {
10+
t.Helper()
11+
12+
configDir := filepath.Join(root, ".holon")
13+
if err := os.MkdirAll(configDir, 0755); err != nil {
14+
t.Fatalf("failed to create config dir: %v", err)
15+
}
16+
if err := os.WriteFile(filepath.Join(configDir, "config.yaml"), []byte(content), 0644); err != nil {
17+
t.Fatalf("failed to write config file: %v", err)
18+
}
19+
}
20+
21+
func TestLoadRunProjectConfig_DefaultWorkspaceDoesNotInheritUnrelatedConfig(t *testing.T) {
22+
agentHome := t.TempDir()
23+
unrelatedProject := t.TempDir()
24+
25+
writeRunProjectConfig(t, unrelatedProject, `base_image: "python:3.11"`)
26+
27+
workspace, err := resolveRunWorkspacePath(agentHome, "")
28+
if err != nil {
29+
t.Fatalf("resolveRunWorkspacePath() error = %v", err)
30+
}
31+
32+
cfg, err := loadRunProjectConfig(workspace)
33+
if err != nil {
34+
t.Fatalf("loadRunProjectConfig() error = %v", err)
35+
}
36+
37+
if cfg.BaseImage != "" {
38+
t.Fatalf("BaseImage = %q, want empty for workspace without project config", cfg.BaseImage)
39+
}
40+
}
41+
42+
func TestLoadRunProjectConfig_UsesResolvedWorkspaceConfig(t *testing.T) {
43+
workspace := t.TempDir()
44+
writeRunProjectConfig(t, workspace, `base_image: "node:20"`)
45+
46+
cfg, err := loadRunProjectConfig(workspace)
47+
if err != nil {
48+
t.Fatalf("loadRunProjectConfig() error = %v", err)
49+
}
50+
51+
if cfg.BaseImage != "node:20" {
52+
t.Fatalf("BaseImage = %q, want %q", cfg.BaseImage, "node:20")
53+
}
54+
}

docs/run-ga-contract.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ This document defines the compatibility contract for `holon run` in v0.11.
3737
- spec metadata
3838
- auto-discovered workspace skills
3939
- CLI skills have highest precedence but do not disable lower-precedence sources.
40+
- For `holon run`, project config (`.holon/config.yaml`) is discovered from the resolved run workspace path (and its parents), not from shell current working directory.
4041

4142
### 4. Default agent-home behavior
4243

0 commit comments

Comments
 (0)