From 4f41a4f8da7de76d6f8189efb7f74e79270761f5 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Jul 2026 03:47:57 +0000 Subject: [PATCH 1/4] Initial plan From db838bc9745c2cd1e35c049194c1684856502031 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Jul 2026 04:02:45 +0000 Subject: [PATCH 2/4] Use constants for activation symlink candidate paths Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/compiler_activation_job.go | 11 ++++++--- pkg/workflow/compiler_activation_job_test.go | 24 ++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/pkg/workflow/compiler_activation_job.go b/pkg/workflow/compiler_activation_job.go index a37fbf769ac..6e325b5a617 100644 --- a/pkg/workflow/compiler_activation_job.go +++ b/pkg/workflow/compiler_activation_job.go @@ -15,6 +15,11 @@ import ( var compilerActivationJobLog = logger.New("workflow:compiler_activation_job") +const ( + activationSymlinkSkillDir = constants.GithubDir + "skills" + activationSymlinkPromptDir = constants.GithubDir + "prompts" +) + var activationMetadataTriggerFields = map[string]struct{}{ "reaction": {}, "status-comment": {}, @@ -557,9 +562,9 @@ func resolveSymlinkExtraPaths(repoRoot string, extraPaths []string) []string { return extraPaths } candidates := []string{ - ".github/agents", - ".github/skills", - ".github/prompts", + strings.TrimSuffix(constants.AgentsDir, "/"), + activationSymlinkSkillDir, + activationSymlinkPromptDir, } existing := make(map[string]struct{}, len(extraPaths)) for _, p := range extraPaths { diff --git a/pkg/workflow/compiler_activation_job_test.go b/pkg/workflow/compiler_activation_job_test.go index 22818354f90..c5436b1f139 100644 --- a/pkg/workflow/compiler_activation_job_test.go +++ b/pkg/workflow/compiler_activation_job_test.go @@ -1159,6 +1159,30 @@ func TestResolveSymlinkExtraPaths(t *testing.T) { assert.Contains(t, result, ".ai/agents", "symlink target should be appended") }) + t.Run("symlink .github/skills resolved to inner path", func(t *testing.T) { + dir := t.TempDir() + require.NoError(t, os.MkdirAll(filepath.Join(dir, ".ai", "skills"), 0o755)) + require.NoError(t, os.MkdirAll(filepath.Join(dir, ".github"), 0o755)) + if err := os.Symlink(filepath.Join("..", ".ai", "skills"), filepath.Join(dir, ".github", "skills")); err != nil { + t.Skipf("symlinks not supported: %v", err) + } + + result := resolveSymlinkExtraPaths(dir, nil) + assert.Contains(t, result, ".ai/skills", "symlink target should be appended") + }) + + t.Run("symlink .github/prompts resolved to inner path", func(t *testing.T) { + dir := t.TempDir() + require.NoError(t, os.MkdirAll(filepath.Join(dir, ".ai", "prompts"), 0o755)) + require.NoError(t, os.MkdirAll(filepath.Join(dir, ".github"), 0o755)) + if err := os.Symlink(filepath.Join("..", ".ai", "prompts"), filepath.Join(dir, ".github", "prompts")); err != nil { + t.Skipf("symlinks not supported: %v", err) + } + + result := resolveSymlinkExtraPaths(dir, nil) + assert.Contains(t, result, ".ai/prompts", "symlink target should be appended") + }) + t.Run("non-symlink .github/agents produces no extra entry", func(t *testing.T) { dir := t.TempDir() require.NoError(t, os.MkdirAll(filepath.Join(dir, ".github", "agents"), 0o755)) From db6db19b0431540a2c17ac4d35cbeeded6500157 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Jul 2026 04:10:23 +0000 Subject: [PATCH 3/4] Add named activation symlink path variables Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/compiler_activation_job.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pkg/workflow/compiler_activation_job.go b/pkg/workflow/compiler_activation_job.go index 6e325b5a617..6b451014156 100644 --- a/pkg/workflow/compiler_activation_job.go +++ b/pkg/workflow/compiler_activation_job.go @@ -15,9 +15,11 @@ import ( var compilerActivationJobLog = logger.New("workflow:compiler_activation_job") -const ( - activationSymlinkSkillDir = constants.GithubDir + "skills" - activationSymlinkPromptDir = constants.GithubDir + "prompts" +var ( + activationSymlinkBaseDir = strings.TrimSuffix(constants.GithubDir, "/") + activationSymlinkAgentDir = activationSymlinkBaseDir + "/agents" + activationSymlinkSkillDir = activationSymlinkBaseDir + "/skills" + activationSymlinkPromptDir = activationSymlinkBaseDir + "/prompts" ) var activationMetadataTriggerFields = map[string]struct{}{ @@ -562,7 +564,7 @@ func resolveSymlinkExtraPaths(repoRoot string, extraPaths []string) []string { return extraPaths } candidates := []string{ - strings.TrimSuffix(constants.AgentsDir, "/"), + activationSymlinkAgentDir, activationSymlinkSkillDir, activationSymlinkPromptDir, } From f0076e8c42fc466cb60cca3a953a3b0927e56578 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 8 Jul 2026 05:03:41 +0000 Subject: [PATCH 4/4] refactor: convert activation symlink paths to const using GithubDir pattern Co-authored-by: pelikhan <4175913+pelikhan@users.noreply.github.com> --- pkg/workflow/compiler_activation_job.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pkg/workflow/compiler_activation_job.go b/pkg/workflow/compiler_activation_job.go index 6b451014156..7c8e58886f7 100644 --- a/pkg/workflow/compiler_activation_job.go +++ b/pkg/workflow/compiler_activation_job.go @@ -15,11 +15,10 @@ import ( var compilerActivationJobLog = logger.New("workflow:compiler_activation_job") -var ( - activationSymlinkBaseDir = strings.TrimSuffix(constants.GithubDir, "/") - activationSymlinkAgentDir = activationSymlinkBaseDir + "/agents" - activationSymlinkSkillDir = activationSymlinkBaseDir + "/skills" - activationSymlinkPromptDir = activationSymlinkBaseDir + "/prompts" +const ( + activationSymlinkAgentDir = constants.GithubDir + "agents" + activationSymlinkSkillDir = constants.GithubDir + "skills" + activationSymlinkPromptDir = constants.GithubDir + "prompts" ) var activationMetadataTriggerFields = map[string]struct{}{