(metadata: WorkspaceMetadata, config: Config)
| 4 | import type { Config } from "@/node/config"; |
| 5 | |
| 6 | export function mergeMultiProjectSecrets(metadata: WorkspaceMetadata, config: Config): Secret[] { |
| 7 | const projects = getProjects(metadata); |
| 8 | const primaryProject = projects.find((project) => project.projectPath === metadata.projectPath); |
| 9 | const orderedProjects = primaryProject |
| 10 | ? [ |
| 11 | primaryProject, |
| 12 | ...projects.filter((project) => project.projectPath !== metadata.projectPath), |
| 13 | ] |
| 14 | : projects; |
| 15 | |
| 16 | const seen = new Set<string>(); |
| 17 | const merged: Secret[] = []; |
| 18 | |
| 19 | // Primary project secrets win on collisions so multi-project bash/AI keep single-project precedence. |
| 20 | for (const project of orderedProjects) { |
| 21 | const secrets = config.getEffectiveSecrets(project.projectPath); |
| 22 | for (const secret of secrets) { |
| 23 | if (seen.has(secret.key)) { |
| 24 | continue; |
| 25 | } |
| 26 | seen.add(secret.key); |
| 27 | merged.push(secret); |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | return merged; |
| 32 | } |
no test coverage detected