agents-inc 0.173.0 → 0.175.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +102 -0
  2. package/dist/{chunk-LJQXQTFC.js → chunk-37QFHJUW.js} +142 -13
  3. package/dist/chunk-37QFHJUW.js.map +1 -0
  4. package/dist/chunk-6HJVH27C.js +114 -0
  5. package/dist/chunk-6HJVH27C.js.map +1 -0
  6. package/dist/{chunk-ITQF35UQ.js → chunk-DQB3E2SX.js} +3 -3
  7. package/dist/{chunk-AARQBW5L.js → chunk-EGC7PNDI.js} +46 -32
  8. package/dist/chunk-EGC7PNDI.js.map +1 -0
  9. package/dist/{chunk-3N4FSTVX.js → chunk-EHEBN4NB.js} +2 -2
  10. package/dist/{chunk-EHJIQDXR.js → chunk-GNMRXXRY.js} +39 -40
  11. package/dist/chunk-GNMRXXRY.js.map +1 -0
  12. package/dist/{chunk-G7NUK3BF.js → chunk-ICHWAFAC.js} +29 -19
  13. package/dist/chunk-ICHWAFAC.js.map +1 -0
  14. package/dist/{chunk-Q4UNHVPX.js → chunk-MFCZARV2.js} +9 -9
  15. package/dist/chunk-MFCZARV2.js.map +1 -0
  16. package/dist/{chunk-SPQSNZMM.js → chunk-P5XEK7HC.js} +2 -2
  17. package/dist/{chunk-VR6QTK5Z.js → chunk-Q4NWATGH.js} +31 -27
  18. package/dist/chunk-Q4NWATGH.js.map +1 -0
  19. package/dist/{chunk-BRZA7ZCX.js → chunk-SI2LLEIR.js} +5 -5
  20. package/dist/{chunk-VSPC74SS.js → chunk-SNXEYAFP.js} +45 -30
  21. package/dist/chunk-SNXEYAFP.js.map +1 -0
  22. package/dist/{chunk-A3ZAXL5T.js → chunk-SRII2GMF.js} +3 -3
  23. package/dist/{chunk-7OG635DK.js → chunk-TG3SPPZY.js} +6 -2
  24. package/dist/{chunk-7OG635DK.js.map → chunk-TG3SPPZY.js.map} +1 -1
  25. package/dist/{chunk-MHAQWMNJ.js → chunk-U46LYYRA.js} +3 -6
  26. package/dist/{chunk-MHAQWMNJ.js.map → chunk-U46LYYRA.js.map} +1 -1
  27. package/dist/{chunk-3R3LHA4Q.js → chunk-XYBHH3M5.js} +2 -2
  28. package/dist/{chunk-F437ICEG.js → chunk-YLFKFVQP.js} +11 -11
  29. package/dist/chunk-YLFKFVQP.js.map +1 -0
  30. package/dist/{chunk-WVFBBZEP.js → chunk-YM3VEDAP.js} +698 -325
  31. package/dist/chunk-YM3VEDAP.js.map +1 -0
  32. package/dist/commands/build/marketplace.js +4 -4
  33. package/dist/commands/build/plugins.js +6 -6
  34. package/dist/commands/compile.js +16 -16
  35. package/dist/commands/compile.js.map +1 -1
  36. package/dist/commands/doctor.js +73 -78
  37. package/dist/commands/doctor.js.map +1 -1
  38. package/dist/commands/edit.js +84 -80
  39. package/dist/commands/edit.js.map +1 -1
  40. package/dist/commands/eject.js +27 -18
  41. package/dist/commands/eject.js.map +1 -1
  42. package/dist/commands/init.js +16 -18
  43. package/dist/commands/list.js +42 -18
  44. package/dist/commands/list.js.map +1 -1
  45. package/dist/commands/new/marketplace.js +4 -4
  46. package/dist/commands/search.js +9 -9
  47. package/dist/commands/share.js +13 -13
  48. package/dist/commands/share.js.map +1 -1
  49. package/dist/commands/uninstall.js +29 -27
  50. package/dist/commands/uninstall.js.map +1 -1
  51. package/dist/commands/update.js +17 -18
  52. package/dist/commands/update.js.map +1 -1
  53. package/dist/components/common/select-list.js +2 -2
  54. package/dist/components/common/skill-agent-summary.js +3 -3
  55. package/dist/components/common/summary-panel.js +4 -7
  56. package/dist/hooks/init.js +39 -26
  57. package/dist/hooks/init.js.map +1 -1
  58. package/dist/load-agent-defs-BJ4KBKBA.js +14 -0
  59. package/dist/{recompile-project-agents-6G6M2RS6.js → recompile-project-agents-2QTFMYDC.js} +8 -8
  60. package/dist/{source-loader-W7XCNKNA.js → source-loader-I6SWWDUF.js} +4 -4
  61. package/package.json +1 -1
  62. package/dist/chunk-2RTBSLSR.js +0 -82
  63. package/dist/chunk-2RTBSLSR.js.map +0 -1
  64. package/dist/chunk-AARQBW5L.js.map +0 -1
  65. package/dist/chunk-EHJIQDXR.js.map +0 -1
  66. package/dist/chunk-F437ICEG.js.map +0 -1
  67. package/dist/chunk-G7NUK3BF.js.map +0 -1
  68. package/dist/chunk-LJQXQTFC.js.map +0 -1
  69. package/dist/chunk-N33AKFLR.js +0 -24
  70. package/dist/chunk-N33AKFLR.js.map +0 -1
  71. package/dist/chunk-Q4UNHVPX.js.map +0 -1
  72. package/dist/chunk-Q6WRR4BN.js +0 -195
  73. package/dist/chunk-Q6WRR4BN.js.map +0 -1
  74. package/dist/chunk-VR6QTK5Z.js.map +0 -1
  75. package/dist/chunk-VSPC74SS.js.map +0 -1
  76. package/dist/chunk-WVFBBZEP.js.map +0 -1
  77. package/dist/components/common/scroll-affordance.js +0 -9
  78. package/dist/load-agent-defs-E67DSYTN.js +0 -14
  79. package/dist/source-loader-W7XCNKNA.js.map +0 -1
  80. /package/dist/{chunk-ITQF35UQ.js.map → chunk-DQB3E2SX.js.map} +0 -0
  81. /package/dist/{chunk-3N4FSTVX.js.map → chunk-EHEBN4NB.js.map} +0 -0
  82. /package/dist/{chunk-SPQSNZMM.js.map → chunk-P5XEK7HC.js.map} +0 -0
  83. /package/dist/{chunk-BRZA7ZCX.js.map → chunk-SI2LLEIR.js.map} +0 -0
  84. /package/dist/{chunk-A3ZAXL5T.js.map → chunk-SRII2GMF.js.map} +0 -0
  85. /package/dist/{chunk-3R3LHA4Q.js.map → chunk-XYBHH3M5.js.map} +0 -0
  86. /package/dist/{components/common/scroll-affordance.js.map → load-agent-defs-BJ4KBKBA.js.map} +0 -0
  87. /package/dist/{recompile-project-agents-6G6M2RS6.js.map → recompile-project-agents-2QTFMYDC.js.map} +0 -0
  88. /package/dist/{load-agent-defs-E67DSYTN.js.map → source-loader-I6SWWDUF.js.map} +0 -0
@@ -2,20 +2,23 @@
2
2
  import {
3
3
  compileAgents,
4
4
  withCatalogueSeatedFor
5
- } from "./chunk-VR6QTK5Z.js";
5
+ } from "./chunk-Q4NWATGH.js";
6
6
  import {
7
7
  loadAgentDefs
8
- } from "./chunk-ITQF35UQ.js";
8
+ } from "./chunk-DQB3E2SX.js";
9
9
  import {
10
10
  ConfigLoadError,
11
11
  EXTRACTED_FIELDS,
12
12
  GlobalPairWriteViolation,
13
13
  INDENT_STEP,
14
+ agentsDir,
14
15
  assertGateToken,
15
16
  brokenUnionLayout,
16
17
  buildAndMergeConfig,
18
+ declaresNoContent,
17
19
  detectGlobalInstallation,
18
20
  detectInstallation,
21
+ detectInstallations,
19
22
  detectProjectInstallation,
20
23
  disableBuffering,
21
24
  drainBuffer,
@@ -28,6 +31,7 @@ import {
28
31
  getErrorMessage,
29
32
  getInstalledConfigPath,
30
33
  getProjectConfigPath,
34
+ inheritedGlobalProvider,
31
35
  isHomeDirectory,
32
36
  isRecord,
33
37
  loadInstalledConfig,
@@ -53,12 +57,12 @@ import {
53
57
  warn,
54
58
  withGateToken,
55
59
  writeFile
56
- } from "./chunk-WVFBBZEP.js";
60
+ } from "./chunk-YM3VEDAP.js";
57
61
  import {
58
62
  matrix,
59
63
  typedEntries,
60
64
  typedKeys
61
- } from "./chunk-7OG635DK.js";
65
+ } from "./chunk-TG3SPPZY.js";
62
66
  import {
63
67
  CLI_INVOKE_COMMAND,
64
68
  CODEX_MODEL_NAMES,
@@ -66,7 +70,6 @@ import {
66
70
  GLOBAL_CONFIG_NAME,
67
71
  LOCAL_PSEUDO_CATEGORY,
68
72
  MODEL_NAMES,
69
- PROVIDERS,
70
73
  STANDARD_FILES,
71
74
  activeAgentNames,
72
75
  activeProjectAgentNames,
@@ -76,7 +79,7 @@ import {
76
79
  isExclusiveCategory,
77
80
  isGlobalTombstone,
78
81
  skillDomain
79
- } from "./chunk-MHAQWMNJ.js";
82
+ } from "./chunk-U46LYYRA.js";
80
83
 
81
84
  // src/cli/lib/operations/source/load-source.ts
82
85
  async function loadSource(options) {
@@ -125,7 +128,7 @@ async function detectProject(projectDir) {
125
128
 
126
129
  // src/cli/lib/operations/project/detect-both-installations.ts
127
130
  async function detectBothInstallations(projectDir) {
128
- const global = await detectGlobalInstallation();
131
+ const global = await detectGlobalInstallation(projectDir);
129
132
  const project = isHomeDirectory(projectDir) ? null : await detectProjectInstallation(projectDir);
130
133
  return { global, project, hasBoth: !!global && !!project };
131
134
  }
@@ -146,6 +149,7 @@ export type SkillConfig = {
146
149
  id: SkillId
147
150
  scope: 'project' | 'global'
148
151
  origin: string
152
+ displayName?: string
149
153
  excluded?: boolean
150
154
  }
151
155
 
@@ -900,9 +904,13 @@ function refuseAWriteOutsideTheInstallation(projectDir, provider) {
900
904
  }
901
905
  return configPath;
902
906
  }
907
+ async function installationToRewrite(projectPath) {
908
+ const loaded = await loadInstalledConfig(projectPath);
909
+ return loaded !== null && !declaresNoContent(loaded.config) ? loaded : null;
910
+ }
903
911
  async function propagateToProject(projectPath, provider, globalConfig, agents, options) {
904
- const existingProject = await loadInstalledConfig(projectPath);
905
- if (!existingProject?.config) return false;
912
+ const existingProject = await installationToRewrite(projectPath);
913
+ if (existingProject === null) return false;
906
914
  return withCatalogueSeatedFor(projectPath, async (catalogue) => {
907
915
  const projectSplit = reconcileAgainstGlobal(existingProject.config, globalConfig, catalogue);
908
916
  await writeProjectConfigPair(
@@ -942,11 +950,12 @@ async function propagateGlobalChangesToProjects(globalConfig, agents, provider,
942
950
  return result;
943
951
  }
944
952
  async function propagateToRegisteredProject(projectPath, provider, globalConfig, agents, options) {
945
- if (!await holdsAnInstallation(projectPath)) {
953
+ const installed = await providersInstalledAt(projectPath);
954
+ if (installed.length === 0) {
946
955
  verbose(`Skipped propagation to ${projectPath} (nothing installed there)`);
947
956
  return "gone";
948
957
  }
949
- const notOurs = await whyThisProjectIsNotOurs(projectPath, provider);
958
+ const notOurs = whyThisProjectIsNotOurs(projectPath, provider, installed);
950
959
  if (notOurs !== null) {
951
960
  verbose(`Skipped propagation to ${projectPath} (${notOurs})`);
952
961
  return "notOurs";
@@ -971,28 +980,26 @@ async function projectsAFanOutReaches(projects, provider) {
971
980
  return reached.flat();
972
981
  }
973
982
  async function wouldBeRewritten(projectPath, provider) {
974
- if (!await holdsAnInstallation(projectPath)) return false;
975
- if (await whyThisProjectIsNotOurs(projectPath, provider) !== null) return false;
983
+ const installed = await providersInstalledAt(projectPath);
984
+ if (whyThisProjectIsNotOurs(projectPath, provider, installed) !== null) return false;
976
985
  try {
977
- return await loadInstalledConfig(projectPath) !== null;
986
+ return await installationToRewrite(projectPath) !== null;
978
987
  } catch {
979
988
  return false;
980
989
  }
981
990
  }
982
- async function holdsAnInstallation(projectPath) {
983
- const configs = await Promise.all(
984
- PROVIDERS.map((installed) => fileExists(getProjectConfigPath(projectPath, installed)))
985
- );
986
- return configs.includes(true);
991
+ async function providersInstalledAt(projectPath) {
992
+ const found = await detectInstallations(projectPath);
993
+ return found.filter((installation) => installation.scope === "project").map((installation) => installation.provider);
987
994
  }
988
- async function whyThisProjectIsNotOurs(projectPath, provider) {
995
+ function whyThisProjectIsNotOurs(projectPath, provider, installed) {
989
996
  const notOurs = `not a ${provider} installation`;
990
997
  try {
991
998
  if (providerInUse(projectPath) !== provider) return notOurs;
992
999
  } catch (error) {
993
1000
  return getErrorMessage(error);
994
1001
  }
995
- return await fileExists(getProjectConfigPath(projectPath, provider)) ? null : notOurs;
1002
+ return installed.includes(provider) ? null : notOurs;
996
1003
  }
997
1004
  async function pruneGlobalEntriesFromRegisteredProjects(globalConfig, agents, provider) {
998
1005
  const emptiedGlobal = {
@@ -1231,7 +1238,7 @@ var NOTHING_RECOMPILED = {
1231
1238
  };
1232
1239
  async function recompilePropagated(projectDirs, pairsRewritten) {
1233
1240
  if (projectDirs.length === 0) return NOTHING_RECOMPILED;
1234
- const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-6G6M2RS6.js");
1241
+ const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-2QTFMYDC.js");
1235
1242
  return recompilePropagatedProjectAgents(projectDirs, pairsRewritten);
1236
1243
  }
1237
1244
  function pairRewriteSummary(projectDirs, pairsRewritten) {
@@ -1327,7 +1334,7 @@ async function applyConsequences(globalConfig, changes, deps, provider, currentP
1327
1334
  function lazyGateDeps(projectDir) {
1328
1335
  return {
1329
1336
  loadMatrix: async () => {
1330
- const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-W7XCNKNA.js");
1337
+ const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-I6SWWDUF.js");
1331
1338
  const { matrix: matrix2 } = await loadSkillsMatrixFromSource2({
1332
1339
  projectDir,
1333
1340
  skipExtraSources: true,
@@ -1336,7 +1343,7 @@ function lazyGateDeps(projectDir) {
1336
1343
  return matrix2;
1337
1344
  },
1338
1345
  loadAgents: async () => {
1339
- const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-E67DSYTN.js");
1346
+ const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-BJ4KBKBA.js");
1340
1347
  return (await loadAgentDefs2()).agents;
1341
1348
  }
1342
1349
  };
@@ -1618,14 +1625,22 @@ async function compileAgentsAllScopes(options) {
1618
1625
  outputDir: resolveInstallPaths(projectDir, "project").agentsDir
1619
1626
  });
1620
1627
  }
1621
- const globalResult = await compileAgents({
1622
- ...base,
1628
+ const globalResult = await compileGlobalScope(options);
1629
+ const projectResult = await compileProjectScope(options);
1630
+ return mergeCompilationResults(globalResult, projectResult);
1631
+ }
1632
+ async function compileGlobalScope(options) {
1633
+ const { projectDir, sourcePath, skills, agentScopeMap } = options;
1634
+ const provider = inheritedGlobalProvider(projectDir);
1635
+ return compileAgents({
1636
+ sourcePath,
1637
+ skills,
1638
+ agentScopeMap,
1623
1639
  projectDir: os3.homedir(),
1624
- outputDir: resolveInstallPaths(os3.homedir(), "global").agentsDir,
1640
+ provider,
1641
+ outputDir: agentsDir(provider, "global", projectDir),
1625
1642
  scopeFilter: "global"
1626
1643
  });
1627
- const projectResult = await compileProjectScope(options);
1628
- return mergeCompilationResults(globalResult, projectResult);
1629
1644
  }
1630
1645
  async function compileProjectScope(options) {
1631
1646
  const { projectDir, sourcePath, skills, agentScopeMap } = options;
@@ -1664,4 +1679,4 @@ export {
1664
1679
  compileAgentsAllScopes,
1665
1680
  compileProjectScope
1666
1681
  };
1667
- //# sourceMappingURL=chunk-VSPC74SS.js.map
1682
+ //# sourceMappingURL=chunk-SNXEYAFP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/operations/source/load-source.ts","../src/cli/lib/operations/project/detect-project.ts","../src/cli/lib/operations/project/detect-both-installations.ts","../src/cli/lib/config-gate/propagate.ts","../../compile/src/config-types-source.ts","../src/cli/lib/configuration/config-types-io.ts","../../compile/src/global-config.ts","../src/cli/lib/config-gate/index.ts","../src/cli/lib/config-gate/classify.ts","../src/cli/lib/config-gate/deps.ts","../src/cli/lib/config-gate/pair-writer.ts","../src/cli/lib/config-gate/recompile.ts","../src/cli/lib/config-gate/pair-snapshot.ts","../src/cli/lib/operations/project/write-project-config.ts","../src/cli/lib/operations/project/compile-agents-all-scopes.ts"],"sourcesContent":["import { loadSkillsMatrixFromSource, type SourceLoadResult } from \"../../loading/index.js\";\nimport type { SourceCaller } from \"../../configuration/index.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n warn,\n type StartupMessage,\n} from \"../../../utils/logger.js\";\n\nexport type LoadSourceOptions = {\n caller?: SourceCaller;\n sourceFlag?: string;\n projectDir: string;\n /** Captures warn() output during the load instead of writing it to stderr. */\n captureStartupMessages?: boolean;\n};\n\nexport type LoadedSource = {\n sourceResult: SourceLoadResult;\n startupMessages: StartupMessage[];\n};\n\nexport async function loadSource(options: LoadSourceOptions): Promise<LoadedSource> {\n const { caller, sourceFlag, projectDir, captureStartupMessages } = options;\n const load = () =>\n loadSkillsMatrixFromSource({\n ...(caller !== undefined && { caller }),\n ...(sourceFlag !== undefined && { sourceFlag }),\n projectDir,\n });\n\n if (!captureStartupMessages) return { sourceResult: await load(), startupMessages: [] };\n return capturingStartupMessages(load);\n}\n\n/** Buffering ends with the load, whether it lands or throws. */\nasync function capturingStartupMessages(\n load: () => Promise<SourceLoadResult>,\n): Promise<LoadedSource> {\n enableBuffering();\n try {\n const sourceResult = await load();\n return { sourceResult, startupMessages: drainBuffer() };\n } finally {\n disableBuffering();\n }\n}\n\nexport function sayCapturedWarnings(messages: readonly StartupMessage[]): void {\n for (const { text } of messages) warn(text);\n}\n","import { detectInstallation, type Installation } from \"../../installation/index.js\";\nimport { ConfigLoadError, loadProjectConfig } from \"../../configuration/index.js\";\nimport type { ProjectConfig } from \"../../../types/index.js\";\n\nexport type DetectedProject = {\n installation: Installation;\n config: ProjectConfig | null;\n configPath: string | null;\n};\n\n/** Degrades: a corrupt config answers null, as a missing installation does. */\nexport async function detectProject(projectDir?: string): Promise<DetectedProject | null> {\n const resolvedDir = projectDir ?? process.cwd();\n\n let installation: Installation | null;\n try {\n installation = await detectInstallation(resolvedDir);\n } catch (error) {\n if (error instanceof ConfigLoadError) return null;\n throw error;\n }\n\n if (!installation) {\n return null;\n }\n\n const loaded = await loadProjectConfig(installation.projectDir);\n\n return {\n installation,\n config: loaded?.config ?? null,\n configPath: loaded?.configPath ?? null,\n };\n}\n","import {\n detectGlobalInstallation,\n detectProjectInstallation,\n isHomeDirectory,\n type Installation,\n} from \"../../installation/index.js\";\n\nexport type BothInstallations = {\n global: Installation | null;\n project: Installation | null;\n hasBoth: boolean;\n};\n\n/** Skips project detection in the home directory, where it would double-compile the global. */\nexport async function detectBothInstallations(projectDir: string): Promise<BothInstallations> {\n const global = await detectGlobalInstallation(projectDir);\n\n const project = isHomeDirectory(projectDir) ? null : await detectProjectInstallation(projectDir);\n return { global, project, hasBoth: !!global && !!project };\n}\n","import fs from \"fs\";\nimport { isDeepEqual, unique } from \"remeda\";\nimport type {\n AgentDefinition,\n AgentName,\n Category,\n MergedSkillsMatrix,\n ProjectConfig,\n SkillAssignment,\n SkillId,\n StackAgentConfig,\n} from \"../../types\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config\";\nimport type { Provider } from \"../../consts\";\nimport { getInstalledConfigPath, getProjectConfigPath } from \"../installation/install-base-dir\";\nimport { detectInstallations } from \"../installation/detect-installations\";\nimport { providerInUse, sourceFolderInUse } from \"../installation/install-layout\";\nimport {\n ConfigLoadError,\n declaresNoContent,\n loadInstalledConfig,\n type LoadedProjectConfig,\n} from \"../configuration/project-config\";\nimport { mergeConfigs, type AuthoritativeScope } from \"../configuration/config-merger\";\nimport {\n activeProjectAgentNames,\n isActiveAt,\n isGlobalTombstone,\n} from \"../configuration/scope-predicates\";\nimport { generateConfigSource, type ConfigSourceOptions } from \"../configuration/config-writer\";\nimport {\n buildConfigTypesBackgroundData,\n type ConfigTypesExtras,\n deriveCategories,\n deriveDomains,\n regenerateConfigTypes,\n} from \"../configuration/config-types-writer\";\n// Inside the fan-out this is the seat `withCatalogueSeatedFor` gave the current project.\nimport { matrix as activeMatrix } from \"../matrix/matrix-provider\";\nimport { withCatalogueSeatedFor } from \"../loading/catalogue-seat.js\";\nimport { fileExists, writeFile } from \"../../utils/fs\";\nimport { getErrorMessage } from \"../../utils/errors\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object\";\nimport { LOCAL_PSEUDO_CATEGORY } from \"../../consts\";\nimport { addSessionToGlobal, type ResolvedGlobalConfig } from \"@workspace/compile/global-config\";\n\nexport { mergeGlobalConfigs } from \"@workspace/compile/global-config\";\n\nexport async function writeConfigFile(\n config: ProjectConfig,\n configPath: string,\n options?: ConfigSourceOptions,\n): Promise<void> {\n const source = generateConfigSource(config, activeMatrix, options);\n await writeFile(configPath, source);\n}\n\n/** The one normalization for `projects` comparisons; resolves symlinks, throws if missing. */\nexport function normalizeProjectPath(projectDir: string): string {\n return fs.realpathSync(projectDir);\n}\n\n/** Filters stale entries whose config.ts no longer exists. */\nasync function registerProjectPath(\n globalConfig: ProjectConfig,\n projectDir: string,\n): Promise<{ config: ProjectConfig; changed: boolean }> {\n const normalizedPath = normalizeProjectPath(projectDir);\n const existing = globalConfig.projects ?? [];\n const valid = await projectsStillInstalled(existing);\n\n if (valid.includes(normalizedPath)) {\n const changed = valid.length !== existing.length;\n return { config: changed ? { ...globalConfig, projects: valid } : globalConfig, changed };\n }\n\n return { config: { ...globalConfig, projects: [...valid, normalizedPath] }, changed: true };\n}\n\nasync function projectsStillInstalled(projects: string[]): Promise<string[]> {\n const installed = await Promise.all(\n projects.map((project) => fileExists(getInstalledConfigPath(project))),\n );\n return projects.filter((_, index) => installed[index] === true);\n}\n\nfunction globalHasActiveSkill(globalConfig: ProjectConfig, id: SkillId): boolean {\n return globalConfig.skills.some((s) => s.id === id && isActiveAt(s, \"global\"));\n}\n\nfunction globalHasActiveAgent(globalConfig: ProjectConfig, name: AgentName): boolean {\n return globalConfig.agents.some((a) => a.name === name && isActiveAt(a, \"global\"));\n}\n\n/** Keeps project-scoped entries and drops tombstones whose global entry is gone. */\nfunction retainProjectOwnedSkills(\n skills: SkillConfig[],\n globalConfig: ProjectConfig,\n): SkillConfig[] {\n return skills.filter(\n (entry) =>\n entry.scope === \"project\" ||\n (isGlobalTombstone(entry) && globalHasActiveSkill(globalConfig, entry.id)),\n );\n}\n\nfunction retainProjectOwnedAgents(\n agents: AgentScopeConfig[],\n globalConfig: ProjectConfig,\n): AgentScopeConfig[] {\n return agents.filter(\n (entry) =>\n entry.scope === \"project\" ||\n (isGlobalTombstone(entry) && globalHasActiveAgent(globalConfig, entry.name)),\n );\n}\n\n/**\n * Undefined for an id the matrix lacks or a `local` skill; neither participates in category rules.\n */\nfunction categoryOfSkill(id: SkillId, matrix: MergedSkillsMatrix): Category | undefined {\n const category = matrix.skills[id]?.category;\n if (category === undefined || category === LOCAL_PSEUDO_CATEGORY) return undefined;\n return category;\n}\n\n/** From the merged matrix, so source overrides count; an undeclared category is not exclusive. */\nfunction isExclusiveCategory(category: Category, matrix: MergedSkillsMatrix): boolean {\n return matrix.categories[category]?.exclusive === true;\n}\n\n/** Categories occupied by an active project-scoped skill, per the merged matrix. */\nfunction activeProjectCategories(\n projectOwnedSkills: SkillConfig[],\n matrix: MergedSkillsMatrix,\n): Set<Category> {\n return new Set(\n projectOwnedSkills\n .filter((s) => isActiveAt(s, \"project\"))\n .map((s) => categoryOfSkill(s.id, matrix))\n .filter((category): category is Category => category !== undefined),\n );\n}\n\n/** IDENTITY (same id at project scope) or CATEGORY (exclusive category); shared with self-heal. */\nfunction buildProjectCollisionTest(\n projectOwnedSkills: SkillConfig[],\n matrix: MergedSkillsMatrix,\n): (id: SkillId) => boolean {\n const ownedIds = new Set(\n projectOwnedSkills.filter((s) => isActiveAt(s, \"project\")).map((s) => s.id),\n );\n const occupiedExclusiveCategories = new Set(\n [...activeProjectCategories(projectOwnedSkills, matrix)].filter((category) =>\n isExclusiveCategory(category, matrix),\n ),\n );\n\n return (id) => {\n if (ownedIds.has(id)) return true;\n const category = categoryOfSkill(id, matrix);\n return category !== undefined && occupiedExclusiveCategories.has(category);\n };\n}\n\n/** A derived mask is byte-identical to a user tombstone, so it stays while its collision does. */\nfunction dropOrphanedDerivedMasks(\n projectOwnedSkills: SkillConfig[],\n matrix: MergedSkillsMatrix,\n): SkillConfig[] {\n const collidesWithProjectOwnership = buildProjectCollisionTest(projectOwnedSkills, matrix);\n return projectOwnedSkills.filter(\n (entry) => !isGlobalTombstone(entry) || collidesWithProjectOwnership(entry.id),\n );\n}\n\n/** Agents have no categories, so only an identity collision justifies a mask. */\nfunction dropOrphanedDerivedAgentMasks(projectOwnedAgents: AgentScopeConfig[]): AgentScopeConfig[] {\n const ownedNames = new Set(activeProjectAgentNames(projectOwnedAgents));\n return projectOwnedAgents.filter(\n (entry) => !isGlobalTombstone(entry) || ownedNames.has(entry.name),\n );\n}\n\n/**\n * Tombstones masking live global skills that collide with what the project owns; the project's own\n * skill wins. Spread from the global entry so they carry its `origin`. Idempotent.\n */\nfunction maskCollidingGlobalSkills(\n projectOwnedSkills: SkillConfig[],\n globalConfig: ProjectConfig,\n matrix: MergedSkillsMatrix,\n): SkillConfig[] {\n const collidesWithProjectOwnership = buildProjectCollisionTest(projectOwnedSkills, matrix);\n const alreadyTombstoned = new Set(projectOwnedSkills.filter(isGlobalTombstone).map((s) => s.id));\n\n return globalConfig.skills\n .filter(\n (globalEntry) =>\n isActiveAt(globalEntry, \"global\") &&\n collidesWithProjectOwnership(globalEntry.id) &&\n !alreadyTombstoned.has(globalEntry.id),\n )\n .map((globalEntry) => ({ ...globalEntry, excluded: true }));\n}\n\n/** Identity collisions only: agents have no categories. */\nfunction maskCollidingGlobalAgents(\n projectOwnedAgents: AgentScopeConfig[],\n globalConfig: ProjectConfig,\n): AgentScopeConfig[] {\n const ownedNames = new Set(activeProjectAgentNames(projectOwnedAgents));\n const alreadyTombstoned = new Set(\n projectOwnedAgents.filter(isGlobalTombstone).map((a) => a.name),\n );\n\n return globalConfig.agents\n .filter(\n (globalEntry) =>\n isActiveAt(globalEntry, \"global\") &&\n ownedNames.has(globalEntry.name) &&\n !alreadyTombstoned.has(globalEntry.name),\n )\n .map((globalEntry) => ({ ...globalEntry, excluded: true }));\n}\n\n/**\n * Run at both sites that inline `globalConfig` into a project config. Self-heal precedes masking,\n * and masking is project-local: the global config is never rewritten.\n */\nexport function reconcileProjectSplitAgainstGlobal(\n projectSplit: ProjectConfig,\n globalConfig: ProjectConfig,\n matrix: MergedSkillsMatrix,\n): ProjectConfig {\n const healedSkills = dropOrphanedDerivedMasks(projectSplit.skills, matrix);\n const healedAgents = dropOrphanedDerivedAgentMasks(projectSplit.agents);\n return {\n ...projectSplit,\n skills: [...healedSkills, ...maskCollidingGlobalSkills(healedSkills, globalConfig, matrix)],\n agents: [...healedAgents, ...maskCollidingGlobalAgents(healedAgents, globalConfig)],\n };\n}\n\n/**\n * Global skills the project inherited that are no longer active globally and that it does not own.\n */\nfunction computeRemovedGlobalSkillIds(\n priorProjectSkills: SkillConfig[],\n globalConfig: ProjectConfig,\n): Set<SkillId> {\n const activeGlobalIds = new Set(\n globalConfig.skills.filter((s) => isActiveAt(s, \"global\")).map((s) => s.id),\n );\n const projectOwnedIds = new Set(\n priorProjectSkills.filter((s) => isActiveAt(s, \"project\")).map((s) => s.id),\n );\n return new Set(\n priorProjectSkills\n .filter(\n (s) => isActiveAt(s, \"global\") && !activeGlobalIds.has(s.id) && !projectOwnedIds.has(s.id),\n )\n .map((s) => s.id),\n );\n}\n\n/** Drops only the removed ids and any category or agent left empty; unchanged when none were. */\nfunction retainReconciledStack(\n stack: Record<string, StackAgentConfig> | undefined,\n removedGlobalSkillIds: Set<SkillId>,\n): Record<string, StackAgentConfig> | undefined {\n if (!stack || removedGlobalSkillIds.size === 0) return stack;\n\n const reconciled: Record<string, StackAgentConfig> = {};\n for (const [agent, agentStack] of Object.entries(stack)) {\n const reconciledAgentStack = withoutRemovedAssignments(agentStack, removedGlobalSkillIds);\n if (typedKeys<Category>(reconciledAgentStack).length > 0) {\n reconciled[agent] = reconciledAgentStack;\n }\n }\n return reconciled;\n}\n\n/** A category the pruning empties is left out. */\nfunction withoutRemovedAssignments(\n agentStack: StackAgentConfig,\n removedGlobalSkillIds: Set<SkillId>,\n): StackAgentConfig {\n const reconciledAgentStack: StackAgentConfig = {};\n for (const [category, assignments] of typedEntries<Category, SkillAssignment[]>(agentStack)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Object.entries drops the `| undefined` a Partial<Record> admits\n if (!assignments) continue;\n const kept = assignments.filter((assignment) => !removedGlobalSkillIds.has(assignment.id));\n if (kept.length > 0) reconciledAgentStack[category] = kept;\n }\n return reconciledAgentStack;\n}\n\n/** Each registered project lands in exactly one list. */\nexport type PropagationResult = {\n updated: string[];\n /** Its `config.ts` is there and cannot be loaded. */\n unreadable: string[];\n /** Nothing is installed at the registered path any more. */\n gone: string[];\n /** It holds another provider's installation, not this one's. */\n notOurs: string[];\n /** Its rewrite threw: its catalogue would not load, or its pair could not be written. */\n failed: string[];\n};\n\nexport type PropagationOptions = {\n /** False for a change that moves no type union. */\n regenerateTypes?: boolean;\n};\n\n/** The one project pair writer; extras come from the effective config so the pair agrees. */\nexport async function writeProjectConfigPair(\n projectDir: string,\n provider: Provider,\n reconciledSplit: ProjectConfig,\n effectiveGlobal: ProjectConfig,\n matrix: MergedSkillsMatrix,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n options: PropagationOptions = {},\n): Promise<void> {\n const configPath = refuseAWriteOutsideTheInstallation(projectDir, provider);\n\n // Both halves from the same reconciled data, so neither describes a config the other does not.\n await writeConfigFile(reconciledSplit, configPath, {\n isProjectConfig: true,\n globalConfig: effectiveGlobal,\n });\n\n if (options.regenerateTypes === false) return;\n\n // The global-aware path, so a global-scope install keeps the project's import-form types.\n await regenerateConfigTypes(\n projectDir,\n Promise.resolve(buildConfigTypesBackgroundData(matrix, agents)),\n buildProjectTypesExtras(inlinedProjectView(reconciledSplit, effectiveGlobal), matrix),\n );\n}\n\n/** The project's own reconciled entries plus everything the global config contributes. */\nfunction inlinedProjectView(\n reconciledSplit: ProjectConfig,\n effectiveGlobal: ProjectConfig,\n): ProjectConfig {\n return {\n ...reconciledSplit,\n skills: [...effectiveGlobal.skills, ...reconciledSplit.skills],\n agents: [...effectiveGlobal.agents, ...reconciledSplit.agents],\n selectedDomains: unique([\n ...(effectiveGlobal.selectedDomains ?? []),\n ...(reconciledSplit.selectedDomains ?? []),\n ]),\n stack: { ...(effectiveGlobal.stack ?? {}), ...(reconciledSplit.stack ?? {}) },\n };\n}\n\n/** Project-scoped entries and live tombstones; `onDisk.skills` reveals just-removed globals. */\nfunction reconcileAgainstGlobal(\n onDisk: ProjectConfig,\n globalConfig: ProjectConfig,\n matrix: MergedSkillsMatrix,\n): ProjectConfig {\n const removedGlobalSkillIds = computeRemovedGlobalSkillIds(onDisk.skills, globalConfig);\n const reconciledStack = retainReconciledStack(onDisk.stack, removedGlobalSkillIds);\n\n return reconcileProjectSplitAgainstGlobal(\n {\n ...onDisk,\n skills: retainProjectOwnedSkills(onDisk.skills, globalConfig),\n agents: retainProjectOwnedAgents(onDisk.agents, globalConfig),\n ...(reconciledStack !== undefined && { stack: reconciledStack }),\n },\n globalConfig,\n matrix,\n );\n}\n\n/**\n * The caller's believed provider checked against the installation on disk: two independent reads.\n */\nfunction refuseAWriteOutsideTheInstallation(projectDir: string, provider: Provider): string {\n const installed = providerInUse(projectDir);\n const configPath = getProjectConfigPath(projectDir, provider);\n\n if (installed !== provider) {\n throw new Error(\n `Refusing to write ${configPath}: ${projectDir} holds the ${installed} installation at ` +\n `${sourceFolderInUse(projectDir, installed).dir}, not a ${provider} one.`,\n );\n }\n return configPath;\n}\n\n/**\n * The installation a fan-out rewrites. A config declaring nothing is none: it is the user's file\n * (owner, 2026-10-24), so it is passed over as a project holding nothing is.\n */\nasync function installationToRewrite(projectPath: string): Promise<LoadedProjectConfig | null> {\n const loaded = await loadInstalledConfig(projectPath);\n return loaded !== null && !declaresNoContent(loaded.config) ? loaded : null;\n}\n\n/** Looks everything up in this project's own seated catalogue. False where nothing is installed. */\nasync function propagateToProject(\n projectPath: string,\n provider: Provider,\n globalConfig: ProjectConfig,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n options: PropagationOptions,\n): Promise<boolean> {\n // Before the catalogue load, whose refusal of this config is indistinguishable from others.\n const existingProject = await installationToRewrite(projectPath);\n if (existingProject === null) return false;\n\n return withCatalogueSeatedFor(projectPath, async (catalogue) => {\n const projectSplit = reconcileAgainstGlobal(existingProject.config, globalConfig, catalogue);\n\n await writeProjectConfigPair(\n projectPath,\n provider,\n projectSplit,\n globalConfig,\n catalogue,\n agents,\n { regenerateTypes: options.regenerateTypes ?? true },\n );\n return true;\n });\n}\n\n/** No catalogue parameter: each project's own is loaded; a failed load lands in `failed`. */\nexport async function propagateGlobalChangesToProjects(\n globalConfig: ProjectConfig,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n provider: Provider,\n currentProjectDir?: string,\n options: PropagationOptions = {},\n): Promise<PropagationResult> {\n const projects = globalConfig.projects ?? [];\n const result: PropagationResult = {\n updated: [],\n unreadable: [],\n gone: [],\n notOurs: [],\n failed: [],\n };\n if (projects.length === 0) return result;\n\n const currentNormalized = currentProjectDir ? normalizeProjectPath(currentProjectDir) : null;\n\n // Sequential: each propagation seats its project's catalogue in the module-wide singleton.\n for (const projectPath of projects) {\n if (currentNormalized && projectPath === currentNormalized) continue;\n\n const outcome = await propagateToRegisteredProject(\n projectPath,\n provider,\n globalConfig,\n agents,\n options,\n );\n result[outcome].push(projectPath);\n }\n\n return result;\n}\n\n/** No skip reason stops the fan-out. Installation presence is asked first, of every provider. */\nasync function propagateToRegisteredProject(\n projectPath: string,\n provider: Provider,\n globalConfig: ProjectConfig,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n options: PropagationOptions,\n): Promise<keyof PropagationResult> {\n const installed = await providersInstalledAt(projectPath);\n if (installed.length === 0) {\n verbose(`Skipped propagation to ${projectPath} (nothing installed there)`);\n return \"gone\";\n }\n\n const notOurs = whyThisProjectIsNotOurs(projectPath, provider, installed);\n if (notOurs !== null) {\n verbose(`Skipped propagation to ${projectPath} (${notOurs})`);\n return \"notOurs\";\n }\n\n try {\n if (!(await propagateToProject(projectPath, provider, globalConfig, agents, options))) {\n return \"gone\";\n }\n verbose(`Propagated global changes to ${projectPath}`);\n return \"updated\";\n } catch (error) {\n verbose(`Failed to propagate to ${projectPath}: ${getErrorMessage(error)}`);\n return error instanceof ConfigLoadError ? \"unreadable\" : \"failed\";\n }\n}\n\n/**\n * The registered projects a fan-out would rewrite, asked before one runs: the same skips it makes,\n * so a project it would pass over is not promised a rewrite.\n */\nexport async function projectsAFanOutReaches(\n projects: readonly string[],\n provider: Provider,\n): Promise<string[]> {\n const reached = await Promise.all(\n projects.map(async (projectPath) =>\n (await wouldBeRewritten(projectPath, provider)) ? [projectPath] : [],\n ),\n );\n return reached.flat();\n}\n\nasync function wouldBeRewritten(projectPath: string, provider: Provider): Promise<boolean> {\n const installed = await providersInstalledAt(projectPath);\n if (whyThisProjectIsNotOurs(projectPath, provider, installed) !== null) return false;\n try {\n return (await installationToRewrite(projectPath)) !== null;\n } catch {\n // DEGRADE: the fan-out skips any project it cannot load, and says why once it has run.\n return false;\n }\n}\n\n/**\n * Every provider whose installation is at `projectPath`, this fan-out's or another's, by the roster:\n * a config declaring nothing is none (owner, 2026-10-24). Asked before `providerInUse` reads the\n * project, since that read counts such a config until the roster has recorded it.\n */\nasync function providersInstalledAt(projectPath: string): Promise<Provider[]> {\n const found = await detectInstallations(projectPath);\n return found\n .filter((installation) => installation.scope === \"project\")\n .map((installation) => installation.provider);\n}\n\n/** `null` when ours to rewrite. A `providerInUse` refusal skips the project, never aborts. */\nfunction whyThisProjectIsNotOurs(\n projectPath: string,\n provider: Provider,\n installed: readonly Provider[],\n): string | null {\n const notOurs = `not a ${provider} installation`;\n try {\n if (providerInUse(projectPath) !== provider) return notOurs;\n } catch (error) {\n return getErrorMessage(error);\n }\n return installed.includes(provider) ? null : notOurs;\n}\n\n/**\n * Reuses the fan-out with an emptied global config. Call it after the global manifest is removed;\n * unreachable dirs are reported, never thrown.\n */\nexport async function pruneGlobalEntriesFromRegisteredProjects(\n globalConfig: ProjectConfig,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n provider: Provider,\n): Promise<PropagationResult> {\n const emptiedGlobal: ProjectConfig = {\n ...globalConfig,\n skills: [],\n agents: [],\n };\n return propagateGlobalChangesToProjects(emptiedGlobal, agents, provider);\n}\n\n/** `globalDataChanged` gates propagation and `changed` the write; `\"all\"` matches the session. */\nexport async function resolveEffectiveGlobalConfig(\n globalSplit: ProjectConfig,\n existingGlobalConfig: ProjectConfig | undefined,\n projectDir: string,\n authority?: AuthoritativeScope,\n): Promise<{ config: ProjectConfig; globalDataChanged: boolean; changed: boolean }> {\n const merged =\n authority === \"all\"\n ? matchGlobalToSession(globalSplit, existingGlobalConfig)\n : addSessionToGlobal(globalSplit, existingGlobalConfig, activeMatrix);\n\n const registration = await registerProjectPath(merged.config, projectDir);\n return {\n config: registration.config,\n globalDataChanged: merged.changed,\n changed: merged.changed || registration.changed,\n };\n}\n\n/** Makes the global config MATCH a confirmed `edit --from` session, even an empty one. */\nfunction matchGlobalToSession(\n globalSplit: ProjectConfig,\n existingGlobalConfig: ProjectConfig | undefined,\n): ResolvedGlobalConfig {\n if (!existingGlobalConfig) return { config: globalSplit, changed: true };\n\n const config = mergeConfigs(globalSplit, existingGlobalConfig, { authoritativeScope: \"all\" });\n return { config, changed: !isDeepEqual(config, existingGlobalConfig) };\n}\n\n/** Category keys the emitted stack holds, across every agent it configures. */\nfunction stackCategories(stack: ProjectConfig[\"stack\"]): Category[] {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- Object.entries drops the `| undefined` a Partial<Record> admits\n return Object.values(stack ?? {}).flatMap((agentStack) => typedKeys<Category>(agentStack ?? {}));\n}\n\n/** Extras from ALL active entries: the project's config.ts inlines the active global rows. */\nexport function buildProjectTypesExtras(\n finalConfig: ProjectConfig,\n matrix: MergedSkillsMatrix,\n): Required<ConfigTypesExtras> {\n const activeSkills = finalConfig.skills.filter((s) => !s.excluded);\n const activeAgents = finalConfig.agents.filter((a) => !a.excluded);\n\n const extraSkillIds = unique(activeSkills.map((s) => s.id));\n const extraAgentNames = unique(activeAgents.map((a) => a.name));\n\n const extraCategories = unique([\n ...deriveCategories(extraSkillIds, matrix),\n ...stackCategories(finalConfig.stack),\n ]);\n const extraDomains = unique([\n ...deriveDomains(extraCategories, matrix),\n ...(finalConfig.selectedDomains ?? []),\n ]);\n\n return { extraSkillIds, extraAgentNames, extraDomains, extraCategories };\n}\n","import { CODEX_MODEL_NAMES, EFFORT_NAMES, MODEL_NAMES } from \"@workspace/matrix\"\nimport { groupBy, unique } from \"remeda\"\n\nimport { isExclusiveCategory, type CompileCatalog } from \"./catalog.js\"\nimport {\n INDENT_STEP,\n brokenUnionLayout,\n flatUnion,\n quoteText,\n renderKey,\n renderTypeImportLine,\n renderUnionBody,\n spaces,\n unionLayout,\n} from \"./installed-format.js\"\nimport { LOCAL_PSEUDO_CATEGORY } from \"./paths.js\"\nimport {\n activeAgentNames,\n activeProjectAgentNames,\n} from \"./scope-predicates.js\"\nimport { bytewise } from \"./string.js\"\nimport { typedEntries, typedKeys } from \"./typed-object.js\"\nimport type {\n AgentName,\n Category,\n CategoryPath,\n ProjectConfig,\n SkillId,\n} from \"./types.js\"\n\n/** Renders `config-types.ts`; writes nothing. Probing for a global types file stays in the CLI. */\n\n/**\n * `never` is the union identity, so a project extending an empty global union still narrows.\n * `string` would absorb every literal and disable type checking of config.ts.\n */\nconst EMPTY_UNION_TYPE = \"never\"\n\nexport type ConfigTypesExtras = {\n extraSkillIds?: string[]\n extraAgentNames?: string[]\n extraDomains?: string[]\n extraCategories?: string[]\n}\n\n/**\n * Width is the lists' concern; `contract/emission-scenarios.test.ts` reddens if one outgrows it.\n */\nfunction formatLiteralUnion(members: readonly string[]): string {\n return flatUnion(members.map(quoteText))\n}\n\nexport const PROJECT_CONFIG_TYPES_BEFORE = `export type InstallMode = 'eject' | 'plugin' | 'mixed'\n\nexport type SkillConfig = {\n id: SkillId\n scope: 'project' | 'global'\n origin: string\n displayName?: string\n excluded?: boolean\n}\n\nexport type AgentScopeConfig = {\n name: AgentName\n scope: 'project' | 'global'\n model?: ${formatLiteralUnion(MODEL_NAMES)}\n codexModel?: ${formatLiteralUnion(CODEX_MODEL_NAMES)}\n effort?: ${formatLiteralUnion(EFFORT_NAMES)}\n excluded?: boolean\n}\n\nexport type SkillAssignment<S extends SkillId = SkillId> = S | { id: S; preloaded: boolean }\n`\n\nexport const PROJECT_CONFIG_INTERFACE_AFTER = `export interface ProjectConfig {\n /** Project/plugin name (kebab-case) */\n name: string\n\n /** Project description */\n description?: string\n\n /** Per-agent configuration with scope */\n agents: AgentScopeConfig[]\n\n /** Per-skill configuration with scope and provenance */\n skills: SkillConfig[]\n\n /** Author handle (e.g., \"@vince\") */\n author?: string\n\n /** Stack configuration: agent -> category -> skill assignment */\n stack?: Partial<Record<ProjectAgentName, StackAgentConfig>>\n\n /** The marketplace this install reads skills from, as a path or URL */\n marketplace?: string\n\n /** The name that marketplace's manifest gives it, which plugins are registered under */\n marketplaceName?: string\n\n /** Selected domains */\n selectedDomains?: Domain[]\n\n /** Branding overrides for white-labeling the CLI */\n branding?: { name?: string }\n\n /** Custom skills directory override (default: \"src/skills\") */\n skillsDir?: string\n\n /** Custom stacks file path override (default: \"config/stacks.ts\") */\n stacksFile?: string\n\n /** Custom categories file path override (default: \"config/skill-categories.ts\") */\n categoriesFile?: string\n\n /** Custom rules file path override (default: \"config/skill-rules.ts\") */\n rulesFile?: string\n\n /** Tracked project installation paths (global config only) */\n projects?: string[]\n}\n`\n\n/** Admits a single assignment too: project configs carry the bare form for exclusive categories. */\nexport const STACK_AGENT_CONFIG_LOOSE_LINE =\n \"export type StackAgentConfig = Partial<Record<Category, SkillAssignment | SkillAssignment[]>>\"\n\n/**\n * The one template for every config-types.ts. Its ProjectConfig deliberately diverges from\n * types/config.ts, using the narrowed generated aliases so config.ts is checked against only what\n * is installed.\n */\nexport function assembleConfigTypesSource(parts: {\n importBlock?: string\n skillId: AliasRhs\n agentName: AliasRhs\n selectedAgentName: AliasRhs\n projectAgentName: AliasRhs\n domain: AliasRhs\n category: AliasRhs\n stackAgentConfig: string\n}): string {\n const importSection = parts.importBlock ? `${parts.importBlock}\\n\\n` : \"\"\n return `// AUTO-GENERATED by agents-inc — DO NOT EDIT\n\n${importSection}${renderAlias(\"SkillId\", parts.skillId)}\n\n${renderAlias(\"AgentName\", parts.agentName)}\n\n${renderAlias(\"SelectedAgentName\", parts.selectedAgentName)}\n\n${renderAlias(\"ProjectAgentName\", parts.projectAgentName)}\n\n${renderAlias(\"Domain\", parts.domain)}\n\n${renderAlias(\"Category\", parts.category)}\n\n${PROJECT_CONFIG_TYPES_BEFORE}\n${parts.stackAgentConfig}\n\n${PROJECT_CONFIG_INTERFACE_AFTER}`\n}\n\n/** Members rather than text: the layout depends on their width after the alias name. */\nexport type AliasRhs =\n | { kind: \"plain\"; members: readonly string[] }\n | {\n kind: \"sectioned\"\n custom: readonly string[]\n marketplace: readonly string[]\n }\n\nfunction literalUnion(members: readonly string[]): AliasRhs {\n return members.length === 0\n ? typeReference(EMPTY_UNION_TYPE)\n : { kind: \"plain\", members: members.map(quoteText) }\n}\n\nfunction typeReference(name: string): AliasRhs {\n return { kind: \"plain\", members: [name] }\n}\n\n/** Laid out the way prettier lays a union out. */\nfunction renderAlias(name: string, rhs: AliasRhs): string {\n const head = `export type ${name} =`\n switch (rhs.kind) {\n case \"plain\":\n return renderPlainAlias(head, rhs.members)\n case \"sectioned\":\n return `${head}\\n${renderSectionedUnion(rhs.custom, rhs.marketplace)}`\n default: {\n const _exhaustive: never = rhs\n return _exhaustive\n }\n }\n}\n\nfunction renderPlainAlias(head: string, members: readonly string[]): string {\n const layout = unionLayout(members, {\n headWidth: head.length + \" \".length,\n tailWidth: 0,\n bodyIndent: INDENT_STEP,\n })\n\n return layout === \"inline\"\n ? `${head} ${flatUnion(members)}`\n : `${head}\\n${renderUnionBody(members, layout, INDENT_STEP)}`\n}\n\n/**\n * `custom` is non-empty by construction. Two headings put a comment between members, which\n * prettier cannot fold, so that union stays one member per line.\n */\nfunction renderSectionedUnion(\n custom: readonly string[],\n marketplace: readonly string[]\n): string {\n if (marketplace.length > 0) {\n return [\n sectionHeading(\"Custom\"),\n renderUnionBody(custom, \"stacked\", INDENT_STEP),\n sectionHeading(\"Marketplace\"),\n renderUnionBody(marketplace, \"stacked\", INDENT_STEP),\n ].join(\"\\n\")\n }\n\n return [\n sectionHeading(\"Custom\"),\n renderUnionBody(\n custom,\n brokenUnionLayout(custom, INDENT_STEP),\n INDENT_STEP\n ),\n ].join(\"\\n\")\n}\n\nfunction sectionHeading(text: string): string {\n return `${spaces(INDENT_STEP)}// ${text}`\n}\n\n/**\n * The union says WHICH skill; exclusivity says HOW MANY, so an exclusive category emits a bare\n * `SkillAssignment<...>`. An undeclared category is not exclusive: a constraint fires only on a\n * flag the data carries.\n */\nfunction generateStackAgentConfig(\n skillsByCategory: Map<Category, SkillId[]>,\n catalog: CompileCatalog\n): string {\n if (skillsByCategory.size === 0) {\n return STACK_AGENT_CONFIG_LOOSE_LINE\n }\n\n const properties = [...skillsByCategory.entries()]\n // Committed bytes: comparator order, not the machine's collation.\n .sort(([a], [b]) => bytewise(a, b))\n .map(([category, skills]) => renderStackProperty(category, skills, catalog))\n\n return [\"export type StackAgentConfig = {\", ...properties, \"}\"].join(\"\\n\")\n}\n\n/** The union sits in a type argument, so its multi-line forms carry the closing `>` down. */\nfunction renderStackProperty(\n category: Category,\n skills: SkillId[],\n catalog: CompileCatalog\n): string {\n const members = [...skills].sort().map(quoteText)\n const tail = `>${isExclusiveCategory(catalog, category) ? \"\" : \"[]\"}`\n const head = `${spaces(INDENT_STEP)}${renderKey(category)}?: SkillAssignment<`\n const bodyIndent = INDENT_STEP * 2\n\n const layout = unionLayout(members, {\n headWidth: head.length,\n tailWidth: tail.length,\n bodyIndent,\n })\n if (layout === \"inline\") return `${head}${flatUnion(members)}${tail}`\n\n return [\n head,\n renderUnionBody(members, layout, bodyIndent),\n `${spaces(INDENT_STEP)}${tail}`,\n ].join(\"\\n\")\n}\n\nfunction buildSkillsByCategory(\n skillIds: SkillId[],\n categories: Category[],\n catalog: CompileCatalog\n): Map<Category, SkillId[]> {\n const categorySet = new Set(categories)\n const eligible = [...new Set(skillIds)]\n .map((id) => ({ id, category: catalog.skills[id]?.category }))\n .filter(\n (entry): entry is { id: SkillId; category: Category } =>\n entry.category !== undefined &&\n entry.category !== LOCAL_PSEUDO_CATEGORY &&\n // Boundary cast: `string` on the narrow catalogue shape; `has` is the runtime check.\n categorySet.has(entry.category as Category)\n )\n\n return new Map(\n typedEntries(groupBy(eligible, (entry) => entry.category)).map(\n ([category, entries]) => [category, entries.map((entry) => entry.id)]\n )\n )\n}\n\n/**\n * A category no loaded catalogue declares. Not \"a category a custom skill is in\": custom skills\n * are placed in existing categories.\n */\nfunction isUndeclaredCategory(\n category: Category,\n catalog: CompileCatalog\n): boolean {\n return catalog.categories[category] === undefined\n}\n\n/**\n * Undeclared, or declared with `custom: true`. `local: true` is not a signal: an ejected catalogue\n * skill is rediscovered as local.\n */\nfunction isCustomSkill(skillId: SkillId, catalog: CompileCatalog): boolean {\n const declared = catalog.skills[skillId]\n return declared === undefined || declared.custom === true\n}\n\nfunction isCustomAgent(\n agentName: AgentName,\n declared: ReadonlySet<AgentName>,\n flaggedCustom: ReadonlySet<AgentName>\n): boolean {\n return !declared.has(agentName) || flaggedCustom.has(agentName)\n}\n\nfunction isCustomDomain(\n domain: string,\n declared: ReadonlySet<string>\n): boolean {\n return !declared.has(domain)\n}\n\n/**\n * @param config Narrows SkillId/AgentName/Category/Domain to the config's skills and agents\n * rather than the full catalogue.\n */\nexport function generateConfigTypesSource(\n catalog: CompileCatalog,\n agentNames: AgentName[],\n customAgentNames: AgentName[] = [],\n extras?: ConfigTypesExtras,\n config?: ProjectConfig\n): string {\n const extra = extraMembers(extras)\n const { skillIds, agents, domains, categories } = config\n ? configMembers(config, extra, catalog)\n : catalogueMembers(agentNames, extra, catalog)\n\n const declaredAgents = new Set<AgentName>(agentNames)\n const flaggedCustomAgents = new Set<AgentName>(customAgentNames)\n const declaredDomains = new Set<string>(extractDomains(catalog))\n\n const skillIdLine = formatMaybeSectionedUnion(skillIds, (id) =>\n isCustomSkill(id, catalog)\n )\n const agentNameLine = formatMaybeSectionedUnion(agents, (name) =>\n isCustomAgent(name, declaredAgents, flaggedCustomAgents)\n )\n const domainLine = formatMaybeSectionedUnion(domains, (domain) =>\n isCustomDomain(domain, declaredDomains)\n )\n const categoryLine = formatMaybeSectionedUnion(categories, (category) =>\n isUndeclaredCategory(category, catalog)\n )\n\n const configAgents = config?.agents ?? []\n const selectedAgentNameLine = narrowedUnion(\n activeAgentNames(configAgents),\n \"AgentName\"\n )\n const projectAgentNameLine = narrowedUnion(\n activeProjectAgentNames(configAgents),\n \"SelectedAgentName\"\n )\n\n const skillsByCategory = buildSkillsByCategory(skillIds, categories, catalog)\n const stackAgentConfigType = generateStackAgentConfig(\n skillsByCategory,\n catalog\n )\n\n return assembleConfigTypesSource({\n skillId: skillIdLine,\n agentName: agentNameLine,\n selectedAgentName: selectedAgentNameLine,\n projectAgentName: projectAgentNameLine,\n domain: domainLine,\n category: categoryLine,\n stackAgentConfig: stackAgentConfigType,\n })\n}\n\ntype UnionMembers = {\n skillIds: SkillId[]\n agents: AgentName[]\n domains: string[]\n categories: Category[]\n}\n\nfunction extraMembers(extras: ConfigTypesExtras | undefined): UnionMembers {\n // Boundary cast: extra ids from CLI args may not match the strict unions.\n return {\n skillIds: (extras?.extraSkillIds ?? []) as SkillId[],\n agents: (extras?.extraAgentNames ?? []) as AgentName[],\n domains: extras?.extraDomains ?? [],\n categories: (extras?.extraCategories ?? []) as Category[],\n }\n}\n\nfunction configMembers(\n config: ProjectConfig,\n extra: UnionMembers,\n catalog: CompileCatalog\n): UnionMembers {\n const configSkillIds = config.skills.map((s) => s.id)\n const categories = sortedUnion(\n deriveCategories(configSkillIds, catalog),\n extra.categories\n )\n\n return {\n skillIds: sortedUnion(configSkillIds, extra.skillIds),\n agents: sortedUnion(\n config.agents.map((a) => a.name),\n extra.agents\n ),\n // selectedDomains may carry domains with no skills in this scope.\n domains: sortedUnion(\n deriveDomains(categories, catalog),\n config.selectedDomains ?? [],\n extra.domains\n ),\n categories,\n }\n}\n\n/** No config: the full catalogue (e.g., a blank global config). */\nfunction catalogueMembers(\n agentNames: AgentName[],\n extra: UnionMembers,\n catalog: CompileCatalog\n): UnionMembers {\n return {\n skillIds: sortedUnion(typedKeys<SkillId>(catalog.skills), extra.skillIds),\n agents: sortedUnion(agentNames, extra.agents),\n domains: sortedUnion(extractDomains(catalog), extra.domains),\n categories: sortedUnion(\n typedKeys<Category>(catalog.categories),\n extra.categories\n ),\n }\n}\n\nfunction sortedUnion<T extends string>(...lists: (readonly T[])[]): T[] {\n return unique(lists.flat()).sort()\n}\n\nfunction narrowedUnion(members: readonly string[], fallback: string): AliasRhs {\n return members.length > 0 ? literalUnion(members) : typeReference(fallback)\n}\n\n// The full-catalogue domain union for the standalone types file.\nfunction extractDomains(catalog: CompileCatalog): string[] {\n return deriveDomains(typedKeys<Category>(catalog.categories), catalog).sort()\n}\n\nconst isNonLocalCategory = (\n category: CategoryPath | undefined\n): category is Category =>\n Boolean(category) && category !== LOCAL_PSEUDO_CATEGORY\n\nexport function deriveCategories(\n skillIds: SkillId[],\n catalog: CompileCatalog\n): Category[] {\n return unique(\n skillIds\n // Boundary cast: CategoryPath to Category for the catalogue lookup.\n .map((id) => catalog.skills[id]?.category as CategoryPath | undefined)\n .filter(isNonLocalCategory)\n )\n}\n\nexport function deriveDomains(\n categories: Category[],\n catalog: CompileCatalog\n): string[] {\n return unique(\n categories\n .map((cat) => catalog.categories[cat]?.domain)\n .filter((domain): domain is string => domain !== undefined)\n )\n}\n\nfunction formatMaybeSectionedUnion<T extends string>(\n members: T[],\n isCustom: (member: T) => boolean\n): AliasRhs {\n if (members.length === 0) {\n return typeReference(EMPTY_UNION_TYPE)\n }\n\n const custom = members.filter(isCustom)\n const marketplace = members.filter((m) => !isCustom(m))\n\n if (custom.length === 0) {\n return literalUnion(members)\n }\n\n return {\n kind: \"sectioned\",\n custom: custom.map(quoteText),\n marketplace: marketplace.map(quoteText),\n }\n}\n\nexport type ProjectConfigTypesOptions = {\n /** The global scope's source folder; extends its types. */\n globalTypesImportPath: string\n projectSkillIds: string[]\n projectAgentNames: string[]\n projectDomains: string[]\n projectCategories?: string[]\n /** Narrows SelectedAgentName */\n selectedAgentNames?: string[]\n /** Narrows ProjectAgentName for stack keys */\n projectScopedAgentNames?: string[]\n}\n\n/** Each union is `GlobalType | \"project-item\"`; Category extends GlobalCategory when given. */\nexport function generateProjectConfigTypesSource(\n options: ProjectConfigTypesOptions\n): string {\n const importPath = `${options.globalTypesImportPath}/config-types`\n\n const skillIdUnion = formatExtendedUnion(\n \"GlobalSkillId\",\n options.projectSkillIds\n )\n const agentNameUnion = formatExtendedUnion(\n \"GlobalAgentName\",\n options.projectAgentNames\n )\n const domainUnion = formatExtendedUnion(\n \"GlobalDomain\",\n options.projectDomains\n )\n\n const categoryUnion = formatExtendedUnion(\n \"GlobalCategory\",\n options.projectCategories ?? []\n )\n\n const selectedAgentNameUnion = narrowedUnion(\n options.selectedAgentNames ?? [],\n \"AgentName\"\n )\n\n const projectAgentNameUnion = narrowedUnion(\n options.projectScopedAgentNames ?? [],\n \"SelectedAgentName\"\n )\n\n // Category is re-exported either way, so it is always imported.\n const importBlock = renderTypeImportLine(\n [\n \"SkillId as GlobalSkillId\",\n \"AgentName as GlobalAgentName\",\n \"Domain as GlobalDomain\",\n \"Category as GlobalCategory\",\n ],\n importPath\n )\n\n return assembleConfigTypesSource({\n importBlock,\n skillId: skillIdUnion,\n agentName: agentNameUnion,\n selectedAgentName: selectedAgentNameUnion,\n projectAgentName: projectAgentNameUnion,\n domain: domainUnion,\n category: categoryUnion,\n stackAgentConfig: STACK_AGENT_CONFIG_LOOSE_LINE,\n })\n}\n\nexport function generateBlankGlobalConfigTypesSource(): string {\n return assembleConfigTypesSource({\n skillId: typeReference(EMPTY_UNION_TYPE),\n agentName: typeReference(EMPTY_UNION_TYPE),\n selectedAgentName: typeReference(EMPTY_UNION_TYPE),\n projectAgentName: typeReference(\"SelectedAgentName\"),\n domain: typeReference(EMPTY_UNION_TYPE),\n category: typeReference(EMPTY_UNION_TYPE),\n stackAgentConfig: STACK_AGENT_CONFIG_LOOSE_LINE,\n })\n}\n\nfunction formatExtendedUnion(\n globalTypeName: string,\n projectMembers: readonly string[]\n): AliasRhs {\n if (projectMembers.length === 0) {\n return typeReference(globalTypeName)\n }\n\n return {\n kind: \"plain\",\n members: [globalTypeName, ...[...projectMembers].sort().map(quoteText)],\n }\n}\n","import path from \"path\";\n\nimport type { AgentDefinition, AgentName, MergedSkillsMatrix, ProjectConfig } from \"../../types\";\nimport type { Provider } from \"../../consts\";\nimport { globalInstallRoot, STANDARD_FILES } from \"../../consts\";\n// Imported by exception (eslint records it): `gate-token.ts` is a dependency-free leaf.\nimport { GlobalPairWriteViolation } from \"../config-gate/gate-token.js\";\nimport { providerInUse, sourceFolderInUse } from \"../installation/install-layout\";\nimport { isHomeDirectory } from \"../installation/is-home-directory\";\nimport { fileExists, writeFile } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedKeys } from \"../../utils/typed-object\";\nimport {\n generateConfigTypesSource,\n generateProjectConfigTypesSource,\n type ConfigTypesExtras,\n} from \"@workspace/compile/config-types-source\";\n\nimport { loadProjectConfigFromDir } from \"./project-config\";\nimport { activeAgentNames, activeProjectAgentNames } from \"./scope-predicates\";\n\n/** The provider is the asking project's: a project inherits only from its own provider's global. */\nasync function getGlobalConfigTypesPath(provider: Provider): Promise<string | null> {\n const globalConfigTypesPath = path.join(\n sourceFolderInUse(globalInstallRoot(), provider).dir,\n STANDARD_FILES.CONFIG_TYPES_TS,\n );\n if (await fileExists(globalConfigTypesPath)) {\n return globalConfigTypesPath;\n }\n return null;\n}\n\n/** POSIX specifier to the provider's global types; machine-specific, so not shared. */\nfunction computeGlobalTypesImportPath(projectDir: string, provider: Provider): string {\n const projectSourceDir = sourceFolderInUse(projectDir, provider).dir;\n const globalSourceDir = sourceFolderInUse(globalInstallRoot(), provider).dir;\n const relativePath = path.relative(projectSourceDir, globalSourceDir);\n return relativePath.split(path.sep).join(\"/\");\n}\n\nexport type ConfigTypesBackgroundData = {\n matrix: MergedSkillsMatrix;\n agentNames: AgentName[];\n customAgentNames: AgentName[];\n};\n\n/** The one constructor, so every emitted `AgentName` union agrees on which agents are custom. */\nexport function buildConfigTypesBackgroundData(\n matrix: MergedSkillsMatrix,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n): ConfigTypesBackgroundData {\n const agentNames = typedKeys<AgentName>(agents);\n return {\n matrix,\n agentNames,\n customAgentNames: agentNames.filter((name) => agents[name]?.custom === true),\n };\n}\n\n/** Adds `extras` (just-created skills or agents) to the regenerated unions. Errors propagate. */\nexport async function regenerateConfigTypes(\n projectDir: string,\n backgroundData: Promise<ConfigTypesBackgroundData>,\n extras?: ConfigTypesExtras,\n): Promise<void> {\n // One provider for every path built below: they must all name one installation.\n const provider = providerInUse(projectDir);\n const configTypesPath = path.join(\n sourceFolderInUse(projectDir, provider).dir,\n STANDARD_FILES.CONFIG_TYPES_TS,\n );\n\n // The gate token every caller holds lifts the `utils/fs` refusal, so this is the one they meet.\n if (isHomeDirectory(projectDir)) throw new GlobalPairWriteViolation(configTypesPath);\n\n const [data, globalConfigTypes, loadedConfig] = await Promise.all([\n backgroundData,\n getGlobalConfigTypesPath(provider),\n loadProjectConfigFromDir(projectDir, provider),\n ]);\n\n // Otherwise standalone, narrowed to the config: full unions would stop `satisfies` biting.\n const source = globalConfigTypes\n ? renderTypesExtendingGlobal(projectDir, provider, loadedConfig?.config.agents, extras)\n : generateConfigTypesSource(\n data.matrix,\n data.agentNames,\n data.customAgentNames,\n extras,\n loadedConfig?.config,\n );\n\n await writeFile(configTypesPath, source);\n verbose(`Regenerated ${STANDARD_FILES.CONFIG_TYPES_TS}`);\n}\n\nfunction renderTypesExtendingGlobal(\n projectDir: string,\n provider: Provider,\n agents: ProjectConfig[\"agents\"] | undefined,\n extras: ConfigTypesExtras | undefined,\n): string {\n const selectedAgentNames = agents ? activeAgentNames(agents) : undefined;\n const projectScopedAgentNames = agents ? activeProjectAgentNames(agents) : undefined;\n const source = generateProjectConfigTypesSource({\n globalTypesImportPath: computeGlobalTypesImportPath(projectDir, provider),\n projectSkillIds: extras?.extraSkillIds ?? [],\n projectAgentNames: extras?.extraAgentNames ?? [],\n projectDomains: extras?.extraDomains ?? [],\n projectCategories: extras?.extraCategories ?? [],\n ...(selectedAgentNames?.length ? { selectedAgentNames } : {}),\n ...(projectScopedAgentNames?.length ? { projectScopedAgentNames } : {}),\n });\n verbose(\"Using project config-types.ts that imports from global\");\n return source;\n}\n","import { isDeepEqual } from \"remeda\"\n\nimport { skillDomain, type CompileCatalog } from \"./catalog.js\"\nimport { GLOBAL_CONFIG_NAME } from \"./paths.js\"\nimport { typedEntries } from \"./typed-object.js\"\nimport type {\n AgentName,\n Category,\n ProjectConfig,\n SkillAssignment,\n StackAgentConfig,\n} from \"./types.js\"\n\n// The global config a project install writes: the session's global half merged into what is on\n// disk. The CLI and the editor preview both resolve it through {@link addSessionToGlobal}.\n\n/** The CLI's blank global `config.ts` template as a loader reads it back. */\nexport function blankGlobalConfig(): ProjectConfig {\n return {\n name: GLOBAL_CONFIG_NAME,\n skills: [],\n agents: [],\n selectedDomains: [],\n }\n}\n\n/** Deep-additive: appends missing (agent, category, skill) triples; never overwrites or mutates. */\nfunction additiveMergeStack(\n existing: Partial<Record<AgentName, StackAgentConfig>> | undefined,\n incoming: Partial<Record<AgentName, StackAgentConfig>> | undefined\n): { stack: Partial<Record<AgentName, StackAgentConfig>>; changed: boolean } {\n const merged: Partial<Record<AgentName, StackAgentConfig>> = existing\n ? structuredClone(existing)\n : {}\n if (!incoming) return { stack: merged, changed: false }\n\n let changed = false\n for (const [agentName, incomingAgentStack] of typedEntries<\n AgentName,\n StackAgentConfig\n >(incoming)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typedEntries drops Partial's `| undefined`; this guards an explicitly-undefined slot\n if (!incomingAgentStack) continue\n\n const existingAgentStack = merged[agentName]\n if (!existingAgentStack) {\n merged[agentName] = structuredClone(incomingAgentStack)\n changed = true\n continue\n }\n\n if (mergeAgentCategories(existingAgentStack, incomingAgentStack)) {\n changed = true\n }\n }\n\n return { stack: merged, changed }\n}\n\n/** Mutates the cloned `existingAgentStack`; true if anything was appended. */\nfunction mergeAgentCategories(\n existingAgentStack: StackAgentConfig,\n incomingAgentStack: StackAgentConfig\n): boolean {\n let changed = false\n for (const [category, incomingAssignments] of typedEntries<\n Category,\n SkillAssignment[]\n >(incomingAgentStack)) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typedEntries drops Partial's `| undefined`; this guards an explicitly-undefined slot\n if (!incomingAssignments) continue\n\n const existingAssignments = existingAgentStack[category]\n if (!existingAssignments) {\n existingAgentStack[category] = incomingAssignments.map((a) => ({ ...a }))\n changed = true\n continue\n }\n\n if (appendMissingAssignments(existingAssignments, incomingAssignments)) {\n changed = true\n }\n }\n return changed\n}\n\n/** Mutates the cloned `existingAssignments`; an id repeated in `incomingAssignments` lands once. */\nfunction appendMissingAssignments(\n existingAssignments: SkillAssignment[],\n incomingAssignments: SkillAssignment[]\n): boolean {\n const existingIds = new Set(existingAssignments.map((a) => a.id))\n let changed = false\n for (const assignment of incomingAssignments) {\n if (existingIds.has(assignment.id)) continue\n existingAssignments.push({ ...assignment })\n existingIds.add(assignment.id)\n changed = true\n }\n return changed\n}\n\n/** Adds global items that don't exist yet; never removes. */\nexport function mergeGlobalConfigs(\n existing: ProjectConfig,\n incoming: ProjectConfig\n): { config: ProjectConfig; changed: boolean } {\n const newSkills = activeEntriesNotIn(\n incoming.skills,\n existing.skills,\n (s) => s.id\n )\n const newAgents = activeEntriesNotIn(\n incoming.agents,\n existing.agents,\n (a) => a.name\n )\n\n const mergedSkills = [...existing.skills, ...newSkills]\n const mergedAgents = [...existing.agents, ...newAgents]\n\n // Project-context edits never remove or overwrite global state, including `preloaded` flags.\n const { stack: mergedStack, changed: stackChanged } = additiveMergeStack(\n existing.stack,\n incoming.stack\n )\n\n const mergedSelectedDomains = [\n ...new Set([\n ...(existing.selectedDomains ?? []),\n ...(incoming.selectedDomains ?? []),\n ]),\n ]\n\n // Marketplace identity is fill-only: the merged config may hold plugins from several\n // marketplaces, so repointing it from a project would orphan another's registry key.\n const addsEntries = newSkills.length > 0 || newAgents.length > 0\n\n // The identity fill only happens alongside an added entry, which `addsEntries` already counts.\n const changed =\n addsEntries ||\n stackChanged ||\n !isDeepEqual(existing.selectedDomains ?? [], mergedSelectedDomains)\n\n return {\n config: {\n ...existing,\n skills: mergedSkills,\n agents: mergedAgents,\n stack: mergedStack,\n selectedDomains: mergedSelectedDomains,\n ...marketplaceIdentityFilledFrom(existing, addsEntries ? incoming : null),\n },\n changed,\n }\n}\n\nfunction activeEntriesNotIn<Entry extends { excluded?: boolean }>(\n incoming: Entry[],\n existing: Entry[],\n keyOf: (entry: Entry) => string\n): Entry[] {\n const held = new Set(existing.map(keyOf))\n return incoming.filter((entry) => !entry.excluded && !held.has(keyOf(entry)))\n}\n\n/**\n * Fills only when the merge adds an entry: a project session inlines global entries it did not\n * bring, so its marketplace may not be theirs.\n */\nfunction marketplaceIdentityFilledFrom(\n existing: ProjectConfig,\n arriving: ProjectConfig | null\n): Pick<ProjectConfig, \"marketplace\" | \"marketplaceName\"> {\n const marketplaceName = existing.marketplaceName ?? arriving?.marketplaceName\n const marketplace = existing.marketplace ?? arriving?.marketplace\n return {\n ...(marketplaceName !== undefined && { marketplaceName }),\n ...(marketplace !== undefined && { marketplace }),\n }\n}\n\nexport type ResolvedGlobalConfig = { config: ProjectConfig; changed: boolean }\n\n/**\n * The resolution every caller but `edit --from` gets: global items are added, never removed. A\n * session with nothing global does not empty the global install.\n */\nexport function addSessionToGlobal(\n globalSplit: ProjectConfig,\n existingGlobalConfig: ProjectConfig | undefined,\n catalog: CompileCatalog\n): ResolvedGlobalConfig {\n const hasGlobalItems =\n globalSplit.skills.length > 0 || globalSplit.agents.length > 0\n if (!hasGlobalItems) {\n return {\n config: existingGlobalConfig ?? {\n name: GLOBAL_CONFIG_NAME,\n skills: [],\n agents: [],\n },\n changed: false,\n }\n }\n\n const arriving = withTheDomainsItAdds(\n globalSplit,\n existingGlobalConfig,\n catalog\n )\n if (!existingGlobalConfig) return { config: arriving, changed: true }\n return mergeGlobalConfigs(existingGlobalConfig, arriving)\n}\n\n/**\n * Narrows the domains to those a newly added global skill comes from, so a project's own picks do\n * not widen what every project inherits.\n */\nfunction withTheDomainsItAdds(\n globalSplit: ProjectConfig,\n existingGlobalConfig: ProjectConfig | undefined,\n catalog: CompileCatalog\n): ProjectConfig {\n const installed = new Set(\n existingGlobalConfig?.skills.map((skill) => skill.id)\n )\n const arrivingDomains = new Set(\n globalSplit.skills\n .filter((skill) => !skill.excluded && !installed.has(skill.id))\n .map((skill) => skillDomain(catalog, skill.id))\n )\n return {\n ...globalSplit,\n selectedDomains: (globalSplit.selectedDomains ?? []).filter((domain) =>\n arrivingDomains.has(domain)\n ),\n }\n}\n","import os from \"os\";\nimport path from \"path\";\nimport type { ProjectConfig } from \"../../types\";\nimport type { AuthoritativeScope } from \"../configuration/config-merger\";\nimport { CLI_INVOKE_COMMAND } from \"../../consts\";\nimport { ensureDir, writeFile } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { isHomeDirectory } from \"../installation/is-home-directory\";\nimport type { Provider } from \"../../consts\";\nimport { getInstalledConfigPath, getProjectConfigPath } from \"../installation/install-base-dir\";\nimport { providerInUse } from \"../installation/install-layout\";\nimport { loadProjectConfigFromDir } from \"../configuration/project-config\";\nimport { normalizeStackRecord } from \"../stacks/stacks-loader\";\nimport { splitConfigByScope } from \"../configuration/config-generator\";\nimport { matrix as activeMatrix } from \"../matrix/matrix-provider\";\nimport { generateConfigSource } from \"../configuration/config-writer\";\nimport {\n buildConfigTypesBackgroundData,\n regenerateConfigTypes,\n type ConfigTypesExtras,\n} from \"../configuration/config-types-writer\";\nimport {\n classifyGlobalChange,\n consequenceTier,\n tierPropagates,\n tierRegeneratesTypes,\n NO_CHANGES,\n type GlobalChangeSet,\n} from \"./classify.js\";\nimport { resolveGateDeps, type GateDeps, type LoadedGateDeps } from \"./deps.js\";\nimport { GlobalPairWriteViolation, withGateToken } from \"./gate-token.js\";\nimport {\n ensureBlankPair as ensureBlankPairInternal,\n writeGlobalConfigHalf,\n writeGlobalPair,\n writeGlobalTypesHalf,\n} from \"./pair-writer.js\";\nimport {\n buildProjectTypesExtras,\n mergeGlobalConfigs,\n normalizeProjectPath,\n propagateGlobalChangesToProjects,\n pruneGlobalEntriesFromRegisteredProjects,\n reconcileProjectSplitAgainstGlobal,\n resolveEffectiveGlobalConfig,\n writeProjectConfigPair,\n type PropagationResult,\n} from \"./propagate.js\";\nimport { NOTHING_RECOMPILED, pairRewriteSummary, recompilePropagated } from \"./recompile.js\";\nimport { pairsRewrittenSince, snapshotProjectPairs } from \"./pair-snapshot.js\";\nimport type { PropagatedRecompileSummary } from \"../operations/project/recompile-project-agents.js\";\n\nexport type { GateDeps } from \"./deps.js\";\nexport type { ConsequenceTier, GlobalChangeSet } from \"./classify.js\";\nexport { GlobalPairWriteViolation } from \"./gate-token.js\";\n\n/** A propagating write recompiles the propagated projects itself, so no caller can forget to. */\nexport type GateReport = {\n /** True when either half of the global pair was actually rewritten. */\n globalWritten: boolean;\n changes: GlobalChangeSet;\n propagated: PropagationResult;\n recompile: PropagatedRecompileSummary;\n};\n\n/**\n * Only these entry points mint the pair-write privilege, held across each whole consequence flow;\n * the private writers require it. `writeProjectPartial` is the exception: it refuses the home\n * directory and writes only a project's own config.\n */\n\nconst NOTHING_PROPAGATED: PropagationResult = {\n updated: [],\n unreadable: [],\n gone: [],\n notOurs: [],\n failed: [],\n};\n\n/** Whether a gated write moved anything the global install's compiled sub-agents are built from. */\nexport function movedGlobalAgentInputs(written: GateReport): boolean {\n return tierRegeneratesTypes(consequenceTier(written.changes));\n}\n\nfunction report(\n globalWritten: boolean,\n changes: GlobalChangeSet,\n propagated: PropagationResult = NOTHING_PROPAGATED,\n recompile: PropagatedRecompileSummary = NOTHING_RECOMPILED,\n): GateReport {\n return { globalWritten, changes, propagated, recompile };\n}\n\ntype FanOut = { propagated: PropagationResult; recompile: PropagatedRecompileSummary };\n\n/**\n * Runs `propagate` over the registered projects, then recompiles what it updated where `recompiles`.\n * A project whose config pair changed counts as rewritten whether or not its sub-agents did.\n */\nasync function fanOut(\n projects: readonly string[],\n provider: Provider,\n propagate: () => Promise<PropagationResult>,\n recompiles: boolean,\n): Promise<FanOut> {\n const pairsBefore = await snapshotProjectPairs(projects, provider);\n const propagated = await propagate();\n const pairsRewritten = await pairsRewrittenSince(pairsBefore, propagated.updated, provider);\n\n const recompile = recompiles\n ? await recompilePropagated(propagated.updated, pairsRewritten)\n : pairRewriteSummary(propagated.updated, pairsRewritten);\n return { propagated, recompile };\n}\n\nfunction sayPropagated(propagated: PropagationResult): void {\n if (propagated.updated.length > 0) {\n verbose(`Propagated global changes to ${propagated.updated.length} project(s)`);\n }\n}\n\n/** `currentProjectDir` is left out of the fan-out: its pair and agents are the caller's. */\nasync function applyConsequences(\n globalConfig: ProjectConfig,\n changes: GlobalChangeSet,\n deps: LoadedGateDeps,\n provider: Provider,\n currentProjectDir?: string,\n): Promise<FanOut> {\n const tier = consequenceTier(changes);\n const projects = globalConfig.projects ?? [];\n if (!tierPropagates(tier) || projects.length === 0) {\n return { propagated: NOTHING_PROPAGATED, recompile: NOTHING_RECOMPILED };\n }\n\n const regenerateTypes = tierRegeneratesTypes(tier);\n const reached = await fanOut(\n projects,\n provider,\n () =>\n propagateGlobalChangesToProjects(globalConfig, deps.agents, provider, currentProjectDir, {\n regenerateTypes,\n }),\n regenerateTypes,\n );\n sayPropagated(reached.propagated);\n return reached;\n}\n\n/**\n * Nothing is fetched unless classification needs it, so a registration-only mutation stays offline.\n */\nexport function lazyGateDeps(projectDir: string): GateDeps {\n return {\n loadMatrix: async () => {\n const { loadSkillsMatrixFromSource } = await import(\"../loading/source-loader.js\");\n const { matrix } = await loadSkillsMatrixFromSource({\n projectDir,\n skipExtraSources: true,\n matrixOnly: true,\n });\n return matrix;\n },\n loadAgents: async () => {\n const { loadAgentDefs } = await import(\"../operations/project/load-agent-defs.js\");\n return (await loadAgentDefs()).agents;\n },\n };\n}\n\nexport type WriteConfigByScopeArgs = {\n finalConfig: ProjectConfig;\n matrix: LoadedGateDeps[\"matrix\"];\n agents: LoadedGateDeps[\"agents\"];\n projectDir: string;\n projectConfigPath: string;\n projectInstallationExists: boolean;\n /**\n * Read by the project branch only: whether the global config matches this session or absorbs it.\n */\n authoritativeScope?: AuthoritativeScope;\n};\n\n/** From a project, splits config and types by scope; from home, writes one standalone config. */\nexport async function writeConfigByScope(args: WriteConfigByScopeArgs): Promise<GateReport> {\n return withGateToken(async () => {\n const { matrix, agents, projectDir } = args;\n // os.homedir() at call time, matching getGlobalConfigImportPath().\n const homeDir = os.homedir();\n const deps: LoadedGateDeps = { matrix, agents };\n\n return isHomeDirectory(projectDir)\n ? writeFromHome(args, homeDir, deps)\n : writeFromProjectContext(args, homeDir, deps);\n });\n}\n\n/** At home the project IS the global installation, so the provider is home's own. */\nasync function writeFromHome(\n args: WriteConfigByScopeArgs,\n homeDir: string,\n deps: LoadedGateDeps,\n): Promise<GateReport> {\n const { finalConfig, projectConfigPath } = args;\n const provider = providerInUse(homeDir);\n const priorGlobal = await loadProjectConfigFromDir(homeDir, provider);\n const changes = classifyGlobalChange(priorGlobal?.config, finalConfig);\n const globalWritten = await writeGlobalPair(\n finalConfig,\n projectConfigPath,\n deps.matrix,\n deps.agents,\n );\n\n const { propagated, recompile } = await applyConsequences(finalConfig, changes, deps, provider);\n return report(globalWritten, changes, propagated, recompile);\n}\n\nasync function writeFromProjectContext(\n args: WriteConfigByScopeArgs,\n homeDir: string,\n deps: LoadedGateDeps,\n): Promise<GateReport> {\n const { finalConfig, projectDir } = args;\n\n const { global: globalConfig, project: projectSplitConfig } = splitConfigByScope(finalConfig);\n // The project's provider: each provider family inherits and propagates only within itself.\n const provider = providerInUse(projectDir);\n const globalConfigPath = getProjectConfigPath(homeDir, provider);\n\n // Merged into the existing global config: project init adds, never removes.\n const existingGlobal = await loadProjectConfigFromDir(homeDir, provider);\n const effective = await resolveEffectiveGlobalConfig(\n globalConfig,\n existingGlobal?.config,\n projectDir,\n args.authoritativeScope,\n );\n const effectiveGlobalConfig = effective.config;\n\n const changes = classifyGlobalChange(existingGlobal?.config, effectiveGlobalConfig);\n const globalWritten = await writeGlobalPairWhenChanged(effective, globalConfigPath, deps);\n\n const { propagated, recompile } = await applyConsequences(\n effectiveGlobalConfig,\n changes,\n deps,\n provider,\n projectDir,\n );\n\n // Reconcile with the inlined global, or a colliding global entry lands active beside ours.\n const reconciledProjectConfig = reconcileProjectSplitAgainstGlobal(\n projectSplitConfig,\n effectiveGlobalConfig,\n deps.matrix,\n );\n await writeProjectPairWhenOwed(\n args,\n provider,\n reconciledProjectConfig,\n effectiveGlobalConfig,\n deps,\n );\n\n return report(globalWritten, changes, propagated, recompile);\n}\n\nasync function writeGlobalPairWhenChanged(\n effective: { config: ProjectConfig; changed: boolean },\n globalConfigPath: string,\n deps: LoadedGateDeps,\n): Promise<boolean> {\n if (!effective.changed) {\n verbose(\"Global config unchanged, skipping write\");\n return false;\n }\n\n await ensureDir(path.dirname(globalConfigPath));\n const written = await writeGlobalPair(\n effective.config,\n globalConfigPath,\n deps.matrix,\n deps.agents,\n );\n verbose(`Updated global config at ${globalConfigPath}`);\n return written;\n}\n\n/** Skips only when no project installation exists and nothing is the project's own. */\nasync function writeProjectPairWhenOwed(\n project: Pick<\n WriteConfigByScopeArgs,\n \"projectDir\" | \"projectConfigPath\" | \"projectInstallationExists\"\n >,\n provider: Provider,\n reconciledProjectConfig: ProjectConfig,\n effectiveGlobalConfig: ProjectConfig,\n deps: LoadedGateDeps,\n): Promise<void> {\n if (!project.projectInstallationExists && !holdsAnythingOfItsOwn(reconciledProjectConfig)) {\n verbose(\n \"Skipped project config — no existing project installation and no project-scoped items\",\n );\n return;\n }\n\n await ensureDir(path.dirname(project.projectConfigPath));\n await writeProjectConfigPair(\n project.projectDir,\n provider,\n reconciledProjectConfig,\n effectiveGlobalConfig,\n deps.matrix,\n deps.agents,\n );\n verbose(`Updated project config at ${project.projectConfigPath}`);\n}\n\nfunction holdsAnythingOfItsOwn(projectConfig: ProjectConfig): boolean {\n return projectConfig.skills.length > 0 || projectConfig.agents.length > 0;\n}\n\n/** Matches `writeConfigByScope`'s writer choice; writes no config half; false at project scope. */\nexport async function writeScopeConfigTypes(\n projectDir: string,\n config: ProjectConfig,\n deps: LoadedGateDeps,\n extras?: ConfigTypesExtras,\n): Promise<boolean> {\n return withGateToken(async () => {\n if (isHomeDirectory(projectDir)) {\n return writeGlobalTypesHalf(\n config,\n getInstalledConfigPath(projectDir),\n deps.matrix,\n deps.agents,\n extras,\n );\n }\n\n await regenerateConfigTypes(\n projectDir,\n Promise.resolve(buildConfigTypesBackgroundData(deps.matrix, deps.agents)),\n extras ?? buildProjectTypesExtras(config, deps.matrix),\n );\n return false;\n });\n}\n\n/**\n * The config on disk is the truth and survives. At home the fan-out is unconditional, since a hand\n * edit leaves nothing to diff; elsewhere nothing propagates.\n */\nexport async function reconcileTypesFromDisk(\n projectDir: string,\n config: ProjectConfig,\n deps: LoadedGateDeps,\n options?: { extras?: ConfigTypesExtras; currentProjectDir?: string },\n): Promise<GateReport> {\n return withGateToken(async () => {\n const changes = classifyGlobalChange(undefined, config);\n const globalWritten = await writeScopeConfigTypes(projectDir, config, deps, options?.extras);\n\n if (!isHomeDirectory(projectDir)) return report(false, changes);\n if (!config.projects?.length) return report(globalWritten, changes);\n\n const provider = providerInUse(projectDir);\n const { propagated, recompile } = await fanOut(\n config.projects,\n provider,\n () =>\n propagateGlobalChangesToProjects(config, deps.agents, provider, options?.currentProjectDir),\n true,\n );\n sayPropagated(propagated);\n\n return report(globalWritten, changes, propagated, recompile);\n });\n}\n\n/** Closed, so no caller-authored transform runs inside the only code allowed to write the pair. */\nexport type GlobalMutation =\n | {\n kind: \"deregister-project\";\n projectDir: string;\n /** The project's: of the two globals a home may hold, it is registered with its own. */\n provider: Provider;\n }\n | { kind: \"set-source\"; source: string; fallbackName: string };\n\n/** The config on disk with required fields filled, so a scalar mutation cannot empty an install. */\nfunction fillRequiredFields(\n partial: Partial<ProjectConfig>,\n fallbackName: string | undefined,\n): ProjectConfig {\n const name = partial.name ?? fallbackName;\n if (!name) {\n throw new Error(\n `Cannot write config: no project config found. Run \\`${CLI_INVOKE_COMMAND} init\\` first.`,\n );\n }\n return { ...partial, name, skills: partial.skills ?? [], agents: partial.agents ?? [] };\n}\n\n/** Applies a mutation to the config on disk, or null when it is a no-op. */\nfunction applyMutation(\n mutation: GlobalMutation,\n current: Partial<ProjectConfig>,\n): Partial<ProjectConfig> | null {\n switch (mutation.kind) {\n case \"deregister-project\": {\n const projects = current.projects ?? [];\n if (projects.length === 0) return null;\n const normalized = normalizeProjectPath(mutation.projectDir);\n const filtered = projects.filter((p) => p !== normalized);\n return filtered.length === projects.length ? null : { ...current, projects: filtered };\n }\n case \"set-source\":\n return { ...current, marketplace: mutation.source };\n default: {\n const _exhaustive: never = mutation;\n return _exhaustive;\n }\n }\n}\n\n/** A `set-source` runs at home, whose installation is the global it mutates. */\nfunction globalProviderFor(mutation: GlobalMutation, homeDir: string): Provider {\n return mutation.kind === \"deregister-project\" ? mutation.provider : providerInUse(homeDir);\n}\n\n/** The name a mutation invents when the global config has none yet. */\nfunction fallbackNameFor(mutation: GlobalMutation): string | undefined {\n return mutation.kind === \"set-source\" ? mutation.fallbackName : undefined;\n}\n\n/** Every mutation is classified: a source change propagates, a deregistration does not. */\nexport async function mutateGlobal(mutation: GlobalMutation, deps: GateDeps): Promise<GateReport> {\n return withGateToken(async () => {\n const homeDir = os.homedir();\n const provider = globalProviderFor(mutation, homeDir);\n // The full loader normalizes the stack; re-emitting bare values drops exclusive categories.\n const loadedGlobal = await loadProjectConfigFromDir(homeDir, provider);\n if (!loadedGlobal) return report(false, NO_CHANGES);\n\n const current = loadedGlobal.config;\n const mutated = applyMutation(mutation, current);\n if (!mutated) return report(false, NO_CHANGES);\n\n const prior = fillRequiredFields(current, fallbackNameFor(mutation));\n const next = fillRequiredFields(mutated, fallbackNameFor(mutation));\n const changes = classifyGlobalChange(prior, next);\n\n const globalWritten = await writeGlobalConfigHalf(\n next,\n getProjectConfigPath(homeDir, provider),\n );\n if (!next.projects?.length) return report(globalWritten, changes);\n\n const loaded = await resolveGateDeps(deps, consequenceTier(changes));\n if (!loaded) return report(globalWritten, changes);\n\n const { propagated, recompile } = await applyConsequences(next, changes, loaded, provider);\n return report(globalWritten, changes, propagated, recompile);\n });\n}\n\n/**\n * Prunes CLI-inlined global entries from registered projects after a global uninstall. Call it\n * after the global manifest is removed. `provider` is passed because its folder is already gone.\n */\nexport async function propagateGlobalRemoval(\n preRemovalGlobalConfig: ProjectConfig,\n deps: LoadedGateDeps,\n provider: Provider,\n): Promise<GateReport> {\n return withGateToken(async () => {\n const changes = classifyGlobalChange(preRemovalGlobalConfig, {\n ...preRemovalGlobalConfig,\n skills: [],\n agents: [],\n });\n\n const { propagated, recompile } = await fanOut(\n preRemovalGlobalConfig.projects ?? [],\n provider,\n () => pruneGlobalEntriesFromRegisteredProjects(preRemovalGlobalConfig, deps.agents, provider),\n true,\n );\n\n return report(false, changes, propagated, recompile);\n });\n}\n\n/** No classification or fan-out: a pair created here has no registered projects. */\nexport async function ensureBlankPair(provider: Provider): Promise<boolean> {\n return withGateToken(() => ensureBlankPairInternal(provider));\n}\n\nexport type WriteProjectPartialOptions = {\n /** Name to invent when the partial has none. Absent → a missing name is an error. */\n fallbackName?: string;\n};\n\n/** The lenient loader leaves bare exclusive values that a re-emit would drop; normalized here. */\nfunction withNormalizedStack(partial: Partial<ProjectConfig>): Partial<ProjectConfig> {\n if (!partial.stack) return partial;\n return { ...partial, stack: normalizeStackRecord(partial.stack) };\n}\n\n/** Refuses the home directory: the global config half is written only by the gate. */\nexport async function writeProjectPartial(\n projectDir: string,\n partial: Partial<ProjectConfig>,\n options: WriteProjectPartialOptions = {},\n): Promise<void> {\n if (isHomeDirectory(projectDir)) {\n throw new GlobalPairWriteViolation(getInstalledConfigPath(projectDir));\n }\n\n const configPath = getInstalledConfigPath(projectDir);\n await ensureDir(path.dirname(configPath));\n await writeFile(\n configPath,\n generateConfigSource(\n fillRequiredFields(withNormalizedStack(partial), options.fallbackName),\n activeMatrix,\n ),\n );\n}\n\n/** Exported so readers match registrations by the stored rule; it writes nothing. */\nexport { mergeGlobalConfigs, normalizeProjectPath };\n\n/** Read-only: names what a fan-out would reach, so a run can say so before it writes. */\nexport { projectsAFanOutReaches } from \"./propagate.js\";\n","import { isDeepEqual } from \"remeda\";\nimport { EXTRACTED_FIELDS } from \"@workspace/compile/config-source\";\nimport { isRecord } from \"../../utils/type-guards.js\";\nimport type { AgentName, ProjectConfig, SkillId } from \"../../types\";\nimport type { AgentScopeConfig, SkillConfig } from \"../../types/config\";\n\n/**\n * T1: the type unions or compiled agents derive from what changed; rewrite both halves, propagate,\n * recompile. T2: an inlined scalar changed; propagate the config half only. T3: only `projects[]`\n * changed; nothing propagates. T4: nothing moved.\n */\nexport type ConsequenceTier = \"T1\" | \"T2\" | \"T3\" | \"T4\";\n\nexport type GlobalChangeSet = {\n skills: {\n added: SkillId[];\n removed: SkillId[];\n /** Apart from `otherChanged`: it decides the reference form a compiled agent emits. */\n sourceChanged: SkillId[];\n otherChanged: SkillId[];\n };\n agents: {\n added: AgentName[];\n removed: AgentName[];\n changed: AgentName[];\n };\n stackChanged: boolean;\n selectedDomainsChanged: boolean;\n /** Names of the inlined scalar fields that moved, in config key order. */\n scalarsChanged: string[];\n projectsChanged: boolean;\n};\n\nexport const NO_CHANGES: GlobalChangeSet = {\n skills: { added: [], removed: [], sourceChanged: [], otherChanged: [] },\n agents: { added: [], removed: [], changed: [] },\n stackChanged: false,\n selectedDomainsChanged: false,\n scalarsChanged: [],\n projectsChanged: false,\n};\n\nconst extractedFields: ReadonlySet<string> = new Set(EXTRACTED_FIELDS);\n\n/** The registration list — bookkeeping, never emitted into a project config. */\nconst REGISTRATION_FIELD = \"projects\" satisfies keyof ProjectConfig;\n\n/**\n * Fields an empty value leaves meaning nothing: the writer omits an empty `stack` and writes an\n * empty `selectedDomains`, and the global merge spells both out, so either reading occurs.\n */\nconst EMPTY_MEANS_ABSENT: ReadonlySet<string> = new Set<keyof ProjectConfig>([\n \"stack\",\n \"selectedDomains\",\n]);\n\nfunction isEmptyCollection(value: unknown): boolean {\n return Array.isArray(value)\n ? value.length === 0\n : isRecord(value) && Object.keys(value).length === 0;\n}\n\n/**\n * A JSON round-trip, as the writer does, so an explicitly-`undefined` field equals an absent one;\n * an empty stack or domain list equals an absent one too.\n */\nfunction normalize(config: ProjectConfig): Record<string, unknown> {\n // Boundary cast: `JSON.parse` returns `any`; the round-trip yields the same record.\n const record = JSON.parse(JSON.stringify(config)) as Record<string, unknown>;\n return Object.fromEntries(\n Object.entries(record).filter(\n ([key, value]) => !(EMPTY_MEANS_ABSENT.has(key) && isEmptyCollection(value)),\n ),\n );\n}\n\nfunction skillsById(config: Record<string, unknown>): Map<SkillId, SkillConfig> {\n // Boundary cast: `normalize`'s round-trip of a `ProjectConfig`, or `{}` where none came before.\n const skills = (config.skills ?? []) as SkillConfig[];\n return new Map(skills.map((skill) => [skill.id, skill]));\n}\n\nfunction agentsByName(config: Record<string, unknown>): Map<AgentName, AgentScopeConfig> {\n // Boundary cast: as in `skillsById`.\n const agents = (config.agents ?? []) as AgentScopeConfig[];\n return new Map(agents.map((agent) => [agent.name, agent]));\n}\n\n/** The scalar keys either side carries, in `next`-first order with `prev` extras appended. */\nfunction scalarKeys(prev: Record<string, unknown>, next: Record<string, unknown>): string[] {\n const isScalarKey = (key: string): boolean =>\n !extractedFields.has(key) && key !== REGISTRATION_FIELD;\n const nextKeys = Object.keys(next).filter(isScalarKey);\n const extraPrevKeys = Object.keys(prev).filter(\n (key) => isScalarKey(key) && !nextKeys.includes(key),\n );\n return [...nextKeys, ...extraPrevKeys];\n}\n\nfunction diffSkills(\n prev: Record<string, unknown>,\n next: Record<string, unknown>,\n): GlobalChangeSet[\"skills\"] {\n const before = skillsById(prev);\n const after = skillsById(next);\n\n const added = [...after.keys()].filter((id) => !before.has(id));\n const removed = [...before.keys()].filter((id) => !after.has(id));\n\n const sourceChanged: SkillId[] = [];\n const otherChanged: SkillId[] = [];\n for (const [id, afterEntry] of after) {\n const beforeEntry = before.get(id);\n if (!beforeEntry || isDeepEqual(beforeEntry, afterEntry)) continue;\n if (beforeEntry.origin !== afterEntry.origin) sourceChanged.push(id);\n else otherChanged.push(id);\n }\n\n return { added, removed, sourceChanged, otherChanged };\n}\n\nfunction diffAgents(\n prev: Record<string, unknown>,\n next: Record<string, unknown>,\n): GlobalChangeSet[\"agents\"] {\n const before = agentsByName(prev);\n const after = agentsByName(next);\n\n return {\n added: [...after.keys()].filter((name) => !before.has(name)),\n removed: [...before.keys()].filter((name) => !after.has(name)),\n changed: [...after.keys()].filter((name) => {\n const beforeEntry = before.get(name);\n return beforeEntry !== undefined && !isDeepEqual(beforeEntry, after.get(name));\n }),\n };\n}\n\n/** `prev` is undefined when no global config exists yet; every field then reads as changed. */\nexport function classifyGlobalChange(\n prev: ProjectConfig | undefined,\n next: ProjectConfig,\n): GlobalChangeSet {\n const before = prev ? normalize(prev) : {};\n const after = normalize(next);\n const moved = (key: string): boolean => !isDeepEqual(before[key], after[key]);\n\n return {\n skills: diffSkills(before, after),\n agents: diffAgents(before, after),\n stackChanged: moved(\"stack\"),\n selectedDomainsChanged: moved(\"selectedDomains\"),\n scalarsChanged: scalarKeys(before, after).filter(moved),\n projectsChanged: moved(REGISTRATION_FIELD),\n };\n}\n\nfunction movesTypesOrCompiledAgents(changes: GlobalChangeSet): boolean {\n const { skills, agents } = changes;\n return (\n skills.added.length > 0 ||\n skills.removed.length > 0 ||\n skills.sourceChanged.length > 0 ||\n skills.otherChanged.length > 0 ||\n agents.added.length > 0 ||\n agents.removed.length > 0 ||\n agents.changed.length > 0 ||\n changes.stackChanged ||\n changes.selectedDomainsChanged\n );\n}\n\nexport function consequenceTier(changes: GlobalChangeSet): ConsequenceTier {\n if (movesTypesOrCompiledAgents(changes)) return \"T1\";\n if (changes.scalarsChanged.length > 0) return \"T2\";\n if (changes.projectsChanged) return \"T3\";\n return \"T4\";\n}\n\ntype TierConsequences = { needsDeps: boolean; regeneratesTypes: boolean; propagates: boolean };\n\n/** One row per tier, so a new tier does not compile until its consequences are stated. */\nconst TIER_CONSEQUENCES = {\n T1: { needsDeps: true, regeneratesTypes: true, propagates: true },\n T2: { needsDeps: true, regeneratesTypes: false, propagates: true },\n T3: { needsDeps: false, regeneratesTypes: false, propagates: false },\n T4: { needsDeps: false, regeneratesTypes: false, propagates: false },\n} satisfies Record<ConsequenceTier, TierConsequences>;\n\nexport function tierNeedsDeps(tier: ConsequenceTier): boolean {\n return TIER_CONSEQUENCES[tier].needsDeps;\n}\n\nexport function tierRegeneratesTypes(tier: ConsequenceTier): boolean {\n return TIER_CONSEQUENCES[tier].regeneratesTypes;\n}\n\nexport function tierPropagates(tier: ConsequenceTier): boolean {\n return TIER_CONSEQUENCES[tier].propagates;\n}\n","import type { AgentDefinition, AgentName, MergedSkillsMatrix } from \"../../types\";\nimport { tierNeedsDeps, tierRegeneratesTypes, type ConsequenceTier } from \"./classify.js\";\n\nexport type LoadedGateDeps = {\n matrix: MergedSkillsMatrix;\n agents: Partial<Record<AgentName, AgentDefinition>>;\n};\n\n/** Lazy, so a caller that cannot cheaply load the matrix stays offline when nothing reads it. */\nexport type GateDeps =\n | LoadedGateDeps\n | {\n loadMatrix: () => Promise<MergedSkillsMatrix>;\n loadAgents: () => Promise<Partial<Record<AgentName, AgentDefinition>>>;\n };\n\nfunction isLoaded(deps: GateDeps): deps is LoadedGateDeps {\n return \"matrix\" in deps;\n}\n\n/** Null when `tier` has no consequences that read `deps`; the lazy loaders then never run. */\nexport async function resolveGateDeps(\n deps: GateDeps,\n tier: ConsequenceTier,\n): Promise<LoadedGateDeps | null> {\n if (!tierNeedsDeps(tier)) return null;\n if (isLoaded(deps)) return deps;\n\n // Agent definitions are read only where the types half is regenerated.\n const [matrix, agents] = await Promise.all([\n deps.loadMatrix(),\n tierRegeneratesTypes(tier) ? deps.loadAgents() : NO_AGENTS,\n ]);\n return { matrix, agents };\n}\n\nconst NO_AGENTS: Promise<Partial<Record<AgentName, AgentDefinition>>> = Promise.resolve({});\n","import os from \"os\";\nimport path from \"path\";\nimport type { AgentDefinition, AgentName, MergedSkillsMatrix, ProjectConfig } from \"../../types\";\nimport type { Provider } from \"../../consts\";\nimport { STANDARD_FILES } from \"../../consts\";\nimport { sourceFolderInUse } from \"../installation/install-layout\";\nimport { ensureDir, fileExists, readFile, writeFile } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport {\n generateBlankGlobalConfigSource,\n generateConfigSource,\n} from \"../configuration/config-writer\";\nimport {\n buildConfigTypesBackgroundData,\n generateBlankGlobalConfigTypesSource,\n generateConfigTypesSource,\n type ConfigTypesExtras,\n} from \"../configuration/config-types-writer\";\nimport { matrix as activeMatrix } from \"../matrix/matrix-provider\";\nimport { assertGateToken } from \"./gate-token.js\";\n\n/**\n * Nothing here mints the write privilege: every writer requires it (asserted in `writeIfChanged`)\n * and only the gate's entry points in `index.ts` open it.\n */\n\nexport type GlobalPairPaths = {\n configPath: string;\n typesPath: string;\n};\n\n/** `os.homedir()` at call time, so the paths agree with test home mocks. */\nexport function globalPairPaths(provider: Provider): GlobalPairPaths {\n const dir = sourceFolderInUse(os.homedir(), provider).dir;\n return {\n configPath: path.join(dir, STANDARD_FILES.CONFIG_TS),\n typesPath: path.join(dir, STANDARD_FILES.CONFIG_TYPES_TS),\n };\n}\n\n/** The types sibling of a config path — the two always share a directory. */\nexport function typesPathFor(configPath: string): string {\n return path.join(path.dirname(configPath), STANDARD_FILES.CONFIG_TYPES_TS);\n}\n\n/** Skips identical bytes to spare watchers mtime churn; true when written. */\nasync function writeIfChanged(filePath: string, source: string): Promise<boolean> {\n assertGateToken(filePath);\n if ((await fileExists(filePath)) && (await readFile(filePath)) === source) return false;\n await writeFile(filePath, source);\n return true;\n}\n\n/** Unions narrowed to `config`'s entries, widened by `extras` for a just-created skill or agent. */\nfunction renderStandaloneTypes(\n config: ProjectConfig,\n matrix: MergedSkillsMatrix,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n extras?: ConfigTypesExtras,\n): string {\n const data = buildConfigTypesBackgroundData(matrix, agents);\n return generateConfigTypesSource(\n data.matrix,\n data.agentNames,\n data.customAgentNames,\n extras,\n config,\n );\n}\n\n/** Reads the singleton catalogue: its caller writes this half before any catalogue is loaded. */\nexport async function writeGlobalConfigHalf(\n config: ProjectConfig,\n configPath: string,\n): Promise<boolean> {\n return writeIfChanged(configPath, generateConfigSource(config, activeMatrix));\n}\n\nexport async function writeGlobalTypesHalf(\n config: ProjectConfig,\n configPath: string,\n matrix: MergedSkillsMatrix,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n extras?: ConfigTypesExtras,\n): Promise<boolean> {\n return writeIfChanged(\n typesPathFor(configPath),\n renderStandaloneTypes(config, matrix, agents, extras),\n );\n}\n\n/** Both halves from one config and one catalogue, so they cannot disagree. */\nexport async function writeGlobalPair(\n config: ProjectConfig,\n configPath: string,\n matrix: MergedSkillsMatrix,\n agents: Partial<Record<AgentName, AgentDefinition>>,\n): Promise<boolean> {\n const configWritten = await writeIfChanged(configPath, generateConfigSource(config, matrix));\n const typesWritten = await writeIfChanged(\n typesPathFor(configPath),\n renderStandaloneTypes(config, matrix, agents),\n );\n return configWritten || typesWritten;\n}\n\n/** Creates a blank pair (empty arrays, `never` unions) when none exists; true when created. */\nexport async function ensureBlankPair(provider: Provider): Promise<boolean> {\n const { configPath, typesPath } = globalPairPaths(provider);\n\n if (await fileExists(configPath)) {\n verbose(\"Global config already exists, skipping blank creation\");\n return false;\n }\n\n await ensureDir(path.dirname(configPath));\n\n await writeIfChanged(configPath, generateBlankGlobalConfigSource());\n await writeIfChanged(typesPath, generateBlankGlobalConfigTypesSource());\n\n verbose(`Created blank global config at ${path.dirname(configPath)}`);\n return true;\n}\n","import type { PropagatedRecompileSummary } from \"../operations/project/recompile-project-agents.js\";\n\nexport const NOTHING_RECOMPILED: PropagatedRecompileSummary = {\n rewrittenCount: 0,\n unchangedCount: 0,\n failedCount: 0,\n warnings: [],\n};\n\n/** Imported lazily: a static import of the operations layer would form a load-time cycle. */\nexport async function recompilePropagated(\n projectDirs: string[],\n pairsRewritten: ReadonlySet<string>,\n): Promise<PropagatedRecompileSummary> {\n if (projectDirs.length === 0) return NOTHING_RECOMPILED;\n\n const { recompilePropagatedProjectAgents } =\n await import(\"../operations/project/recompile-project-agents.js\");\n return recompilePropagatedProjectAgents(projectDirs, pairsRewritten);\n}\n\n/** A fan-out that moved no compiled input recompiles nothing, yet may still rewrite a pair. */\nexport function pairRewriteSummary(\n projectDirs: readonly string[],\n pairsRewritten: ReadonlySet<string>,\n): PropagatedRecompileSummary {\n const rewrittenCount = projectDirs.filter((dir) => pairsRewritten.has(dir)).length;\n return {\n rewrittenCount,\n unchangedCount: projectDirs.length - rewrittenCount,\n failedCount: 0,\n warnings: [],\n };\n}\n","import type { Provider } from \"../../consts\";\nimport { getProjectConfigPath } from \"../installation/install-base-dir\";\nimport { fileExists, readFile } from \"../../utils/fs\";\nimport { typesPathFor } from \"./pair-writer.js\";\n\n/** What one half of a pair reads as: absent is `null`; unreadable is a symbol equal to nothing. */\ntype HalfContents = string | null | symbol;\n\n/** Both halves of a project's config pair as they read now. */\ntype PairContents = readonly [HalfContents, HalfContents];\n\nexport type PairSnapshot = ReadonlyMap<string, PairContents>;\n\n/**\n * DEGRADE: one project's unreadable file must not stop the fan-out from visiting the rest, which\n * skips that project and says why. A fresh symbol never equals a later read, not even another\n * unreadable one, so a pair the fan-out did update still counts as rewritten.\n */\nasync function readHalf(filePath: string): Promise<HalfContents> {\n try {\n return (await fileExists(filePath)) ? await readFile(filePath) : null;\n } catch {\n return Symbol(filePath);\n }\n}\n\nasync function readPair(projectDir: string, provider: Provider): Promise<PairContents> {\n const configPath = getProjectConfigPath(projectDir, provider);\n return Promise.all([readHalf(configPath), readHalf(typesPathFor(configPath))]);\n}\n\n/** Taken before a fan-out, so what it writes can be told from a re-emit of the same bytes. */\nexport async function snapshotProjectPairs(\n projectDirs: readonly string[],\n provider: Provider,\n): Promise<PairSnapshot> {\n const pairs = await Promise.all(\n projectDirs.map(async (dir) => [dir, await readPair(dir, provider)] as const),\n );\n return new Map(pairs);\n}\n\n/** `projectDirs` must each have been snapshotted: a fan-out only reaches projects it was handed. */\nexport async function pairsRewrittenSince(\n before: PairSnapshot,\n projectDirs: readonly string[],\n provider: Provider,\n): Promise<Set<string>> {\n const judged = await Promise.all(\n projectDirs.map(async (dir) => ({\n dir,\n rewritten: !samePair(snapshotOf(before, dir), await readPair(dir, provider)),\n })),\n );\n return new Set(judged.filter(({ rewritten }) => rewritten).map(({ dir }) => dir));\n}\n\nfunction snapshotOf(before: PairSnapshot, dir: string): PairContents {\n const pair = before.get(dir);\n if (pair === undefined) throw new Error(`No snapshot of ${dir} was taken before the fan-out`);\n return pair;\n}\n\nfunction samePair([config, types]: PairContents, [configNow, typesNow]: PairContents): boolean {\n return config === configNow && types === typesNow;\n}\n","import path from \"path\";\nimport {\n buildAndMergeConfig,\n resolveInstallPaths,\n isHomeDirectory,\n} from \"../../installation/index.js\";\nimport type { SourceLoadResult } from \"../../loading/index.js\";\nimport type { AuthoritativeScope } from \"../../configuration/index.js\";\nimport { ensureBlankPair, writeConfigByScope, type GateReport } from \"../../config-gate/index.js\";\nimport { providerInUse } from \"../../installation/install-layout.js\";\nimport { loadAgentDefs, type AgentDefs } from \"./load-agent-defs.js\";\nimport { ensureDir } from \"../../../utils/fs.js\";\nimport type { ProjectConfig } from \"../../../types/index.js\";\nimport type { InstallSelection } from \"@workspace/compile/seed-to-config\";\n\nexport type ConfigWriteOptions = {\n selection: InstallSelection;\n sourceResult: SourceLoadResult;\n projectDir: string;\n sourceFlag?: string;\n /** What {@link loadAgentDefs} answered, for a caller that already asked; loaded when omitted. */\n agentDefs?: AgentDefs;\n /** `\"all\"` drops any deselected entry, `\"owned\"` only project-owned ones, absent keeps all. */\n authoritativeScope?: AuthoritativeScope;\n};\n\nexport type ConfigWriteResult = {\n config: ProjectConfig;\n configPath: string;\n wasMerged: boolean;\n existingConfigPath?: string;\n propagation: GateReport;\n};\n\nexport async function writeProjectConfig(options: ConfigWriteOptions): Promise<ConfigWriteResult> {\n const { selection, sourceResult, projectDir, sourceFlag } = options;\n const projectPaths = resolveInstallPaths(projectDir, \"project\");\n\n await ensureDir(path.dirname(projectPaths.configPath));\n\n const { agents } = options.agentDefs ?? (await loadAgentDefs());\n\n const mergeResult = await buildAndMergeConfig(\n selection,\n sourceResult,\n projectDir,\n sourceFlag,\n options.authoritativeScope,\n );\n const finalConfig = mergeResult.config;\n\n const isProjectContext = !isHomeDirectory(projectDir);\n\n if (isProjectContext) {\n // A project inherits only from its own provider's global.\n await ensureBlankPair(providerInUse(projectDir));\n }\n\n const propagation = await writeConfigByScope({\n finalConfig,\n matrix: sourceResult.matrix,\n agents,\n projectDir,\n projectConfigPath: projectPaths.configPath,\n projectInstallationExists: isProjectContext,\n // Must match the merger's, or the global config and the project rows disagree.\n ...(options.authoritativeScope !== undefined && {\n authoritativeScope: options.authoritativeScope,\n }),\n });\n\n return {\n config: finalConfig,\n configPath: projectPaths.configPath,\n wasMerged: mergeResult.merged,\n ...(mergeResult.existingConfigPath !== undefined && {\n existingConfigPath: mergeResult.existingConfigPath,\n }),\n propagation,\n };\n}\n","import os from \"os\";\nimport { compileAgents, type CompilationResult } from \"./compile-agents.js\";\nimport { isHomeDirectory, resolveInstallPaths } from \"../../installation/index.js\";\nimport { agentsDir, inheritedGlobalProvider } from \"../../installation/install-layout.js\";\nimport type { AgentName, SkillDefinitionMap, SkillScope } from \"../../../types/index.js\";\n\nexport type CompileAllScopesOptions = {\n projectDir: string;\n sourcePath: string;\n skills: SkillDefinitionMap;\n agentScopeMap: Map<AgentName, SkillScope>;\n};\n\n/**\n * Each pass is filtered to its own scope so the project pass cannot overwrite global agents with\n * zero-skill versions.\n */\nexport async function compileAgentsAllScopes(\n options: CompileAllScopesOptions,\n): Promise<CompilationResult> {\n const { projectDir, sourcePath, skills, agentScopeMap } = options;\n const base = { sourcePath, skills, agentScopeMap };\n\n if (isHomeDirectory(projectDir)) {\n return compileAgents({\n ...base,\n projectDir,\n outputDir: resolveInstallPaths(projectDir, \"project\").agentsDir,\n });\n }\n\n const globalResult = await compileGlobalScope(options);\n const projectResult = await compileProjectScope(options);\n return mergeCompilationResults(globalResult, projectResult);\n}\n\n/** The global installation the project inherits, compiled from and into that installation. */\nasync function compileGlobalScope(options: CompileAllScopesOptions): Promise<CompilationResult> {\n const { projectDir, sourcePath, skills, agentScopeMap } = options;\n const provider = inheritedGlobalProvider(projectDir);\n return compileAgents({\n sourcePath,\n skills,\n agentScopeMap,\n projectDir: os.homedir(),\n provider,\n outputDir: agentsDir(provider, \"global\", projectDir),\n scopeFilter: \"global\",\n });\n}\n\nexport async function compileProjectScope(\n options: CompileAllScopesOptions,\n): Promise<CompilationResult> {\n const { projectDir, sourcePath, skills, agentScopeMap } = options;\n return compileAgents({\n sourcePath,\n skills,\n agentScopeMap,\n projectDir,\n outputDir: resolveInstallPaths(projectDir, \"project\").agentsDir,\n scopeFilter: \"project\",\n });\n}\n\nfunction mergeCompilationResults(...results: CompilationResult[]): CompilationResult {\n return {\n compiled: results.flatMap((r) => r.compiled),\n rewritten: results.flatMap((r) => r.rewritten),\n failed: results.flatMap((r) => r.failed),\n warnings: results.flatMap((r) => r.warnings),\n };\n}\n"],"mappings":"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","names":["isDeepEqual","unique","typedEntries","typedKeys","matrix","typedEntries","matrix","isExclusiveCategory","unique","isDeepEqual","os","path","isDeepEqual","isDeepEqual","matrix","path","path","matrix","loadSkillsMatrixFromSource","matrix","loadAgentDefs","os","path","ensureBlankPair","path","path","ensureBlankPair","os","os"]}
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  truncateText
4
- } from "./chunk-7OG635DK.js";
4
+ } from "./chunk-TG3SPPZY.js";
5
5
  import {
6
6
  SEED_API_URL,
7
7
  seedPayloadSchema
8
- } from "./chunk-MHAQWMNJ.js";
8
+ } from "./chunk-U46LYYRA.js";
9
9
 
10
10
  // ../../node_modules/hono/dist/utils/cookie.js
11
11
  var validCookieNameRegEx = /^[\w!#$%&'*.^`|~+-]+$/;
@@ -425,4 +425,4 @@ export {
425
425
  jsonBodyOrUndefined,
426
426
  arrivedAsText
427
427
  };
428
- //# sourceMappingURL=chunk-A3ZAXL5T.js.map
428
+ //# sourceMappingURL=chunk-SRII2GMF.js.map
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  seatCatalog
4
- } from "./chunk-MHAQWMNJ.js";
4
+ } from "./chunk-U46LYYRA.js";
5
5
 
6
6
  // src/cli/utils/string.ts
7
7
  var OSC = /\u001B\][\s\S]*?(?:\u0007|\u001B\\|$)/;
@@ -9349,6 +9349,9 @@ function getSkillById(id) {
9349
9349
  function getSkillDisplayName(id) {
9350
9350
  return inertLine(matrix.skills[id]?.displayName ?? id);
9351
9351
  }
9352
+ function getSkillEntryDisplayName(entry) {
9353
+ return entry.displayName === void 0 ? getSkillDisplayName(entry.id) : inertLine(entry.displayName);
9354
+ }
9352
9355
  function getCategoryDomain(category) {
9353
9356
  return matrix.categories[category]?.domain;
9354
9357
  }
@@ -9378,10 +9381,11 @@ export {
9378
9381
  initializeMatrix,
9379
9382
  getSkillById,
9380
9383
  getSkillDisplayName,
9384
+ getSkillEntryDisplayName,
9381
9385
  getCategoryDomain,
9382
9386
  typedEntries,
9383
9387
  typedKeys,
9384
9388
  typedFromEntries,
9385
9389
  typedValues
9386
9390
  };
9387
- //# sourceMappingURL=chunk-7OG635DK.js.map
9391
+ //# sourceMappingURL=chunk-TG3SPPZY.js.map