agents-inc 0.172.0 → 0.173.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.
- package/CHANGELOG.md +14 -0
- package/dist/{chunk-MBIOZ5LW.js → chunk-2RTBSLSR.js} +2 -2
- package/dist/{chunk-255DGUCH.js → chunk-3N4FSTVX.js} +12 -6
- package/dist/{chunk-255DGUCH.js.map → chunk-3N4FSTVX.js.map} +1 -1
- package/dist/{chunk-5MGRHS2G.js → chunk-AARQBW5L.js} +22 -12
- package/dist/chunk-AARQBW5L.js.map +1 -0
- package/dist/{chunk-NISWBQNS.js → chunk-BRZA7ZCX.js} +3 -3
- package/dist/{chunk-LUKDDHSI.js → chunk-EHJIQDXR.js} +2 -2
- package/dist/{chunk-MOL2J5HS.js → chunk-F437ICEG.js} +2 -2
- package/dist/{chunk-KCLBLK3F.js → chunk-ITQF35UQ.js} +3 -3
- package/dist/{chunk-7ZOWSCAO.js → chunk-LJQXQTFC.js} +2 -2
- package/dist/{chunk-6LUTY35Q.js → chunk-Q4UNHVPX.js} +4 -4
- package/dist/{chunk-33JICQD5.js → chunk-Q6WRR4BN.js} +4 -5
- package/dist/{chunk-33JICQD5.js.map → chunk-Q6WRR4BN.js.map} +1 -1
- package/dist/{chunk-5PPB6HT6.js → chunk-SPQSNZMM.js} +2 -2
- package/dist/{chunk-Y23MP2OC.js → chunk-VR6QTK5Z.js} +3 -3
- package/dist/{chunk-6CRA46YO.js → chunk-VSPC74SS.js} +41 -19
- package/dist/chunk-VSPC74SS.js.map +1 -0
- package/dist/{chunk-VILFCMRN.js → chunk-WVFBBZEP.js} +252 -102
- package/dist/chunk-WVFBBZEP.js.map +1 -0
- package/dist/commands/build/marketplace.js +2 -2
- package/dist/commands/build/plugins.js +4 -4
- package/dist/commands/compile.js +10 -10
- package/dist/commands/doctor.js +31 -13
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/edit.js +13 -13
- package/dist/commands/eject.js +23 -28
- package/dist/commands/eject.js.map +1 -1
- package/dist/commands/init.js +12 -12
- package/dist/commands/list.js +3 -3
- package/dist/commands/new/marketplace.js +2 -2
- package/dist/commands/search.js +7 -7
- package/dist/commands/share.js +6 -6
- package/dist/commands/uninstall.js +45 -41
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.js +4 -4
- package/dist/components/common/summary-panel.js +1 -1
- package/dist/hooks/init.js +29 -20
- package/dist/hooks/init.js.map +1 -1
- package/dist/load-agent-defs-E67DSYTN.js +14 -0
- package/dist/{recompile-project-agents-5A44NJRD.js → recompile-project-agents-6G6M2RS6.js} +6 -6
- package/dist/{source-loader-LQNRI5UZ.js → source-loader-W7XCNKNA.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-5MGRHS2G.js.map +0 -1
- package/dist/chunk-6CRA46YO.js.map +0 -1
- package/dist/chunk-VILFCMRN.js.map +0 -1
- package/dist/load-agent-defs-54VIKN4T.js +0 -14
- /package/dist/{chunk-MBIOZ5LW.js.map → chunk-2RTBSLSR.js.map} +0 -0
- /package/dist/{chunk-NISWBQNS.js.map → chunk-BRZA7ZCX.js.map} +0 -0
- /package/dist/{chunk-LUKDDHSI.js.map → chunk-EHJIQDXR.js.map} +0 -0
- /package/dist/{chunk-MOL2J5HS.js.map → chunk-F437ICEG.js.map} +0 -0
- /package/dist/{chunk-KCLBLK3F.js.map → chunk-ITQF35UQ.js.map} +0 -0
- /package/dist/{chunk-7ZOWSCAO.js.map → chunk-LJQXQTFC.js.map} +0 -0
- /package/dist/{chunk-6LUTY35Q.js.map → chunk-Q4UNHVPX.js.map} +0 -0
- /package/dist/{chunk-5PPB6HT6.js.map → chunk-SPQSNZMM.js.map} +0 -0
- /package/dist/{chunk-Y23MP2OC.js.map → chunk-VR6QTK5Z.js.map} +0 -0
- /package/dist/{load-agent-defs-54VIKN4T.js.map → load-agent-defs-E67DSYTN.js.map} +0 -0
- /package/dist/{recompile-project-agents-5A44NJRD.js.map → recompile-project-agents-6G6M2RS6.js.map} +0 -0
- /package/dist/{source-loader-LQNRI5UZ.js.map → source-loader-W7XCNKNA.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/components/common/summary-panel.tsx","../src/cli/components/hooks/use-panel-scroll.ts","../src/cli/components/hooks/use-measured-height.ts","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Text, renderToString } from \"ink\";\nimport React from \"react\";\nimport { unique } from \"remeda\";\nimport {\n ALL_SKILLS_EJECTED_LABEL,\n CLI_COLORS,\n DEFAULT_PUBLIC_SOURCE_NAME,\n EJECT_SOURCE,\n formatSourceDisplayName,\n} from \"../../consts.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { usePanelScroll } from \"../hooks/use-panel-scroll.js\";\nimport { dimensionsOf } from \"../hooks/use-terminal-dimensions.js\";\nimport { ScrollAffordance } from \"./scroll-affordance.js\";\nimport { SkillAgentSummary, type SkillAgentSummaryProps } from \"./skill-agent-summary.js\";\n\nexport type SummaryPanelProps = SkillAgentSummaryProps & {\n /** `undefined` when the configuration was built from no stack. */\n stackName: string | undefined;\n};\n\n/**\n * The skills the panel leaves in place; leaving none, as an uninstall does, those it removes. The\n * default marketplace is only for a panel with no skill either way.\n */\nfunction skillsTheHeaderNames({\n skillConfigs,\n installedSkillConfigs,\n}: SkillAgentSummaryProps): SkillConfig[] {\n return skillConfigs.length > 0 ? skillConfigs : (installedSkillConfigs ?? []);\n}\n\n/**\n * No skills shows the default marketplace; all-ejected names none. Tombstoned entries count: the\n * summary below renders them as rows.\n */\nfunction formatSkillMarketplaces(skillConfigs: SkillConfig[]): string {\n if (skillConfigs.length === 0) return formatSourceDisplayName(DEFAULT_PUBLIC_SOURCE_NAME);\n\n const marketplaceNames = unique(\n skillConfigs.map((config) => config.origin).filter((origin) => origin !== EJECT_SOURCE),\n );\n if (marketplaceNames.length === 0) return ALL_SKILLS_EJECTED_LABEL;\n\n return marketplaceNames\n .map((name) => formatSourceDisplayName(name))\n .sort()\n .join(\" · \");\n}\n\ntype PanelHeaderProps = {\n sourceNames: string;\n stackName: string | undefined;\n};\n\n/** `flexShrink={0}`: squeezed by Yoga on a short terminal, its two rows overprint. */\nconst PanelHeader: React.FC<PanelHeaderProps> = ({ sourceNames, stackName }) => (\n <Box\n flexDirection=\"column\"\n flexShrink={0}\n borderStyle=\"single\"\n borderBottom={true}\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderBottomDimColor\n paddingBottom={1}\n marginBottom={1}\n >\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Marketplace\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{sourceNames}</Text>\n </Box>\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Stack\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{stackName ?? \"none\"}</Text>\n </Box>\n </Box>\n);\n\n/** Horizontal padding only: unshrinkable vertical padding starves the viewport on a short terminal. */\nexport const SummaryPanel: React.FC<SummaryPanelProps> = ({ stackName, ...summary }) => {\n const { viewportRef, contentRef, contentMarginTop, hiddenAbove, hiddenBelow } = usePanelScroll();\n\n const sourceNames = formatSkillMarketplaces(skillsTheHeaderNames(summary));\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n flexBasis={0}\n borderStyle=\"single\"\n borderColor={CLI_COLORS.NEUTRAL}\n paddingX={2}\n >\n <Box ref={viewportRef} flexDirection=\"column\" flexGrow={1} flexBasis={0} overflow=\"hidden\">\n <Box ref={contentRef} flexDirection=\"column\" flexShrink={0} marginTop={contentMarginTop}>\n <PanelHeader sourceNames={sourceNames} stackName={stackName} />\n\n <Box width=\"100%\">\n <SkillAgentSummary {...summary} />\n </Box>\n </Box>\n </Box>\n <ScrollAffordance hiddenAbove={hiddenAbove} hiddenBelow={hiddenBelow} />\n </Box>\n );\n};\n\n/**\n * The whole panel as text, drawn once: printed, it scrolls with the terminal like any other line,\n * and a run with no terminal prints the same thing.\n */\nexport function summaryPanelText(\n props: SummaryPanelProps,\n columns: number = dimensionsOf(process.stdout).columns,\n): string {\n return renderToString(<SummaryPanel {...props} />, { columns });\n}\n\n/**\n * What a question shows, or where none is asked, what prints in its place: the panel, the lines\n * under it marking what it cannot show, then each statement after a blank line, and a blank line\n * before what follows.\n */\nexport function summaryPanelBlock(\n panel: SummaryPanelProps,\n linesUnder: readonly string[],\n statements: readonly string[],\n): string[] {\n return [\n summaryPanelText(panel),\n ...linesUnder,\n ...statements.flatMap((statement) => [\"\", statement]),\n \"\",\n ];\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Ref, RefObject } from \"react\";\nimport { type DOMElement, measureElement, useInput } from \"ink\";\nimport { useMeasuredHeight } from \"./use-measured-height.js\";\n\nexport type UsePanelScrollResult = {\n /** The `overflow=\"hidden\"` box. */\n viewportRef: Ref<DOMElement>;\n contentRef: RefObject<DOMElement | null>;\n contentMarginTop: number;\n hiddenAbove: number;\n hiddenBelow: number;\n};\n\n/** `↑`/`↓` line scrolling for one clipped viewport; hosts add their own `useInput` for other keys. */\nexport function usePanelScroll(): UsePanelScrollResult {\n const { ref: viewportRef, measuredHeight: viewportHeight } = useMeasuredHeight();\n const contentRef = useRef<DOMElement>(null);\n const [contentHeight, setContentHeight] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps -- re-measures every render; layout changes are invisible to React\n useEffect(() => {\n if (!contentRef.current) return;\n const { height } = measureElement(contentRef.current);\n // Yoga under-reports inside a squeezed viewport; trusting that loops the render.\n setContentHeight((prev) => Math.max(prev, height));\n });\n\n // Not returned: gating the clip on contentHeight paints content over the border.\n const maxScroll = Math.max(0, contentHeight - viewportHeight);\n const hiddenBelow = Math.max(0, maxScroll - scrollOffset);\n\n useInput((_input, key) => {\n if (key.upArrow) setScrollOffset((prev) => Math.max(0, prev - 1));\n if (key.downArrow) setScrollOffset((prev) => Math.min(maxScroll, prev + 1));\n });\n\n return {\n viewportRef,\n contentRef,\n contentMarginTop: scrollOffset > 0 ? -scrollOffset : 0,\n hiddenAbove: scrollOffset,\n hiddenBelow,\n };\n}\n","import { useRef, useState, useEffect } from \"react\";\nimport { type DOMElement, measureElement, useStdout } from \"ink\";\n\n/** Attach to a `flexGrow={1}` Box under an ancestor of constrained height; 0 before first layout. */\nexport function useMeasuredHeight(): {\n ref: React.Ref<DOMElement>;\n measuredHeight: number;\n} {\n const ref = useRef<DOMElement>(null);\n const [measuredHeight, setMeasuredHeight] = useState(0);\n const { stdout } = useStdout();\n\n const measure = () => {\n if (ref.current) {\n const { height } = measureElement(ref.current);\n setMeasuredHeight((prev) => (prev !== height ? height : prev));\n }\n };\n\n // Every render, so late-mounted refs are picked up.\n useEffect(() => {\n measure();\n });\n\n // Yoga may not have laid out yet on first render, so retry a few times.\n useEffect(() => {\n const RETRY_DELAYS_MS = [0, 16, 50];\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n for (const delay of RETRY_DELAYS_MS) {\n timers.push(setTimeout(measure, delay));\n }\n\n return () => {\n for (const timer of timers) {\n clearTimeout(timer);\n }\n };\n // Mount-only: listing `measure` would re-arm the timers every render.\n }, []);\n\n useEffect(() => {\n stdout.on(\"resize\", measure);\n return () => {\n stdout.off(\"resize\", measure);\n };\n }, [stdout]);\n\n return { ref, measuredHeight };\n}\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n columns: number;\n rows: number;\n};\n\n/** A stream that is not a terminal reports no size, so it gets the defaults. */\nexport function dimensionsOf(stdout: NodeJS.WriteStream): TerminalDimensions {\n return {\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n };\n}\n\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => dimensionsOf(stdout));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions(dimensionsOf(stdout));\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAAA,SAAS,KAAK,MAAM,sBAAsB;AAC1C,OAAkB;AAClB,SAAS,cAAc;;;ACFvB,SAAS,aAAAA,YAAW,UAAAC,SAAQ,YAAAC,iBAAgB;AAE5C,SAA0B,kBAAAC,iBAAgB,gBAAgB;;;ACF1D,SAAS,QAAQ,UAAU,iBAAiB;AAC5C,SAA0B,gBAAgB,iBAAiB;AAGpD,SAAS,oBAGd;AACA,QAAM,MAAM,OAAmB,IAAI;AACnC,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,CAAC;AACtD,QAAM,EAAE,OAAO,IAAI,UAAU;AAE7B,QAAM,UAAU,MAAM;AACpB,QAAI,IAAI,SAAS;AACf,YAAM,EAAE,OAAO,IAAI,eAAe,IAAI,OAAO;AAC7C,wBAAkB,CAAC,SAAU,SAAS,SAAS,SAAS,IAAK;AAAA,IAC/D;AAAA,EACF;AAGA,YAAU,MAAM;AACd,YAAQ;AAAA,EACV,CAAC;AAGD,YAAU,MAAM;AACd,UAAM,kBAAkB,CAAC,GAAG,IAAI,EAAE;AAClC,UAAM,SAA0C,CAAC;AAEjD,eAAW,SAAS,iBAAiB;AACnC,aAAO,KAAK,WAAW,SAAS,KAAK,CAAC;AAAA,IACxC;AAEA,WAAO,MAAM;AACX,iBAAW,SAAS,QAAQ;AAC1B,qBAAa,KAAK;AAAA,MACpB;AAAA,IACF;AAAA,EAEF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,WAAO,GAAG,UAAU,OAAO;AAC3B,WAAO,MAAM;AACX,aAAO,IAAI,UAAU,OAAO;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO,EAAE,KAAK,eAAe;AAC/B;;;ADlCO,SAAS,iBAAuC;AACrD,QAAM,EAAE,KAAK,aAAa,gBAAgB,eAAe,IAAI,kBAAkB;AAC/E,QAAM,aAAaC,QAAmB,IAAI;AAC1C,QAAM,CAAC,eAAe,gBAAgB,IAAIC,UAAS,CAAC;AACpD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,CAAC;AAGlD,EAAAC,WAAU,MAAM;AACd,QAAI,CAAC,WAAW,QAAS;AACzB,UAAM,EAAE,OAAO,IAAIC,gBAAe,WAAW,OAAO;AAEpD,qBAAiB,CAAC,SAAS,KAAK,IAAI,MAAM,MAAM,CAAC;AAAA,EACnD,CAAC;AAGD,QAAM,YAAY,KAAK,IAAI,GAAG,gBAAgB,cAAc;AAC5D,QAAM,cAAc,KAAK,IAAI,GAAG,YAAY,YAAY;AAExD,WAAS,CAAC,QAAQ,QAAQ;AACxB,QAAI,IAAI,QAAS,iBAAgB,CAAC,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,CAAC;AAChE,QAAI,IAAI,UAAW,iBAAgB,CAAC,SAAS,KAAK,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,EAC5E,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,kBAAkB,eAAe,IAAI,CAAC,eAAe;AAAA,IACrD,aAAa;AAAA,IACb;AAAA,EACF;AACF;;;AE7CA,SAAS,YAAAC,WAAU,aAAAC,kBAAiB;AACpC,SAAS,aAAAC,kBAAiB;AAE1B,IAAM,kBAAkB;AACxB,IAAM,eAAe;AAQd,SAAS,aAAa,QAAgD;AAC3E,SAAO;AAAA,IACL,SAAS,OAAO,WAAW;AAAA,IAC3B,MAAM,OAAO,QAAQ;AAAA,EACvB;AACF;AAEO,SAAS,wBAA4C;AAC1D,QAAM,EAAE,OAAO,IAAIA,WAAU;AAE7B,QAAM,CAAC,YAAY,aAAa,IAAIF,UAA6B,MAAM,aAAa,MAAM,CAAC;AAE3F,EAAAC,WAAU,MAAM;AACd,UAAM,eAAe,MAAM;AACzB,oBAAc,aAAa,MAAM,CAAC;AAAA,IACpC;AAEA,WAAO,GAAG,UAAU,YAAY;AAChC,WAAO,MAAM;AACX,aAAO,IAAI,UAAU,YAAY;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACT;;;AHkCI,SACE,KADF;AA7CJ,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AACF,GAA0C;AACxC,SAAO,aAAa,SAAS,IAAI,eAAgB,yBAAyB,CAAC;AAC7E;AAMA,SAAS,wBAAwB,cAAqC;AACpE,MAAI,aAAa,WAAW,EAAG,QAAO,wBAAwB,0BAA0B;AAExF,QAAM,mBAAmB;AAAA,IACvB,aAAa,IAAI,CAAC,WAAW,OAAO,MAAM,EAAE,OAAO,CAAC,WAAW,WAAW,YAAY;AAAA,EACxF;AACA,MAAI,iBAAiB,WAAW,EAAG,QAAO;AAE1C,SAAO,iBACJ,IAAI,CAAC,SAAS,wBAAwB,IAAI,CAAC,EAC3C,KAAK,EACL,KAAK,QAAK;AACf;AAQA,IAAM,cAA0C,CAAC,EAAE,aAAa,UAAU,MACxE;AAAA,EAAC;AAAA;AAAA,IACC,eAAc;AAAA,IACd,YAAY;AAAA,IACZ,aAAY;AAAA,IACZ,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,aAAa,WAAW;AAAA,IACxB,sBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,cAAc;AAAA,IAEd;AAAA,2BAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,MAAI,MAAC,yBAEtC;AAAA,QACA,oBAAC,QAAK,OAAO,WAAW,SAAU,uBAAY;AAAA,SAChD;AAAA,MACA,qBAAC,OAAI,eAAc,OAAM,WAAW,GAClC;AAAA,4BAAC,QAAK,OAAO,WAAW,SAAS,MAAI,MAAC,mBAEtC;AAAA,QACA,oBAAC,QAAK,OAAO,WAAW,SAAU,uBAAa,QAAO;AAAA,SACxD;AAAA;AAAA;AACF;AAIK,IAAM,eAA4C,CAAC,EAAE,WAAW,GAAG,QAAQ,MAAM;AACtF,QAAM,EAAE,aAAa,YAAY,kBAAkB,aAAa,YAAY,IAAI,eAAe;AAE/F,QAAM,cAAc,wBAAwB,qBAAqB,OAAO,CAAC;AAEzE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,UAAU;AAAA,MACV,WAAW;AAAA,MACX,aAAY;AAAA,MACZ,aAAa,WAAW;AAAA,MACxB,UAAU;AAAA,MAEV;AAAA,4BAAC,OAAI,KAAK,aAAa,eAAc,UAAS,UAAU,GAAG,WAAW,GAAG,UAAS,UAChF,+BAAC,OAAI,KAAK,YAAY,eAAc,UAAS,YAAY,GAAG,WAAW,kBACrE;AAAA,8BAAC,eAAY,aAA0B,WAAsB;AAAA,UAE7D,oBAAC,OAAI,OAAM,QACT,8BAAC,qBAAmB,GAAG,SAAS,GAClC;AAAA,WACF,GACF;AAAA,QACA,oBAAC,oBAAiB,aAA0B,aAA0B;AAAA;AAAA;AAAA,EACxE;AAEJ;AAMO,SAAS,iBACd,OACA,UAAkB,aAAa,QAAQ,MAAM,EAAE,SACvC;AACR,SAAO,eAAe,oBAAC,gBAAc,GAAG,OAAO,GAAI,EAAE,QAAQ,CAAC;AAChE;AAOO,SAAS,kBACd,OACA,YACA,YACU;AACV,SAAO;AAAA,IACL,iBAAiB,KAAK;AAAA,IACtB,GAAG;AAAA,IACH,GAAG,WAAW,QAAQ,CAAC,cAAc,CAAC,IAAI,SAAS,CAAC;AAAA,IACpD;AAAA,EACF;AACF;","names":["useEffect","useRef","useState","measureElement","useRef","useState","useEffect","measureElement","useState","useEffect","useStdout"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/components/common/summary-panel.tsx","../src/cli/components/hooks/use-panel-scroll.ts","../src/cli/components/hooks/use-measured-height.ts","../src/cli/components/hooks/use-terminal-dimensions.ts"],"sourcesContent":["import { Box, Text, renderToString } from \"ink\";\nimport React from \"react\";\nimport { unique } from \"remeda\";\nimport {\n ALL_SKILLS_EJECTED_LABEL,\n CLI_COLORS,\n DEFAULT_PUBLIC_SOURCE_NAME,\n EJECT_SOURCE,\n formatSourceDisplayName,\n} from \"../../consts.js\";\nimport type { SkillConfig } from \"../../types/config.js\";\nimport { usePanelScroll } from \"../hooks/use-panel-scroll.js\";\nimport { dimensionsOf } from \"../hooks/use-terminal-dimensions.js\";\nimport { ScrollAffordance } from \"./scroll-affordance.js\";\nimport { SkillAgentSummary, type SkillAgentSummaryProps } from \"./skill-agent-summary.js\";\n\nexport type SummaryPanelProps = SkillAgentSummaryProps & {\n /** `undefined` when the configuration was built from no stack. */\n stackName: string | undefined;\n};\n\n/**\n * The skills the panel leaves in place; leaving none, as an uninstall does, those it removes. The\n * default marketplace is only for a panel with no skill either way.\n */\nfunction skillsTheHeaderNames({\n skillConfigs,\n installedSkillConfigs,\n}: SkillAgentSummaryProps): SkillConfig[] {\n return skillConfigs.length > 0 ? skillConfigs : (installedSkillConfigs ?? []);\n}\n\n/**\n * No skills shows the default marketplace; all-ejected names none. Tombstoned entries count: the\n * summary below renders them as rows.\n */\nfunction formatSkillMarketplaces(skillConfigs: SkillConfig[]): string {\n if (skillConfigs.length === 0) return formatSourceDisplayName(DEFAULT_PUBLIC_SOURCE_NAME);\n\n const marketplaceNames = unique(\n skillConfigs.map((config) => config.origin).filter((origin) => origin !== EJECT_SOURCE),\n );\n if (marketplaceNames.length === 0) return ALL_SKILLS_EJECTED_LABEL;\n\n return marketplaceNames\n .map((name) => formatSourceDisplayName(name))\n .sort()\n .join(\" · \");\n}\n\ntype PanelHeaderProps = {\n sourceNames: string;\n stackName: string | undefined;\n};\n\n/** `flexShrink={0}`: squeezed by Yoga on a short terminal, its two rows overprint. */\nconst PanelHeader: React.FC<PanelHeaderProps> = ({ sourceNames, stackName }) => (\n <Box\n flexDirection=\"column\"\n flexShrink={0}\n borderStyle=\"single\"\n borderBottom={true}\n borderTop={false}\n borderLeft={false}\n borderRight={false}\n borderColor={CLI_COLORS.NEUTRAL}\n borderBottomDimColor\n paddingBottom={1}\n marginBottom={1}\n >\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Marketplace\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{sourceNames}</Text>\n </Box>\n <Box flexDirection=\"row\" columnGap={1}>\n <Text color={CLI_COLORS.WARNING} bold>\n Stack\n </Text>\n <Text color={CLI_COLORS.NEUTRAL}>{stackName ?? \"none\"}</Text>\n </Box>\n </Box>\n);\n\n/** Horizontal padding only: unshrinkable vertical padding starves the viewport on a short terminal. */\nexport const SummaryPanel: React.FC<SummaryPanelProps> = ({ stackName, ...summary }) => {\n const { viewportRef, contentRef, contentMarginTop, hiddenAbove, hiddenBelow } = usePanelScroll();\n\n const sourceNames = formatSkillMarketplaces(skillsTheHeaderNames(summary));\n\n return (\n <Box\n flexDirection=\"column\"\n flexGrow={1}\n flexBasis={0}\n borderStyle=\"single\"\n borderColor={CLI_COLORS.NEUTRAL}\n paddingX={2}\n >\n <Box ref={viewportRef} flexDirection=\"column\" flexGrow={1} flexBasis={0} overflow=\"hidden\">\n <Box ref={contentRef} flexDirection=\"column\" flexShrink={0} marginTop={contentMarginTop}>\n <PanelHeader sourceNames={sourceNames} stackName={stackName} />\n\n <Box width=\"100%\">\n <SkillAgentSummary {...summary} />\n </Box>\n </Box>\n </Box>\n <ScrollAffordance hiddenAbove={hiddenAbove} hiddenBelow={hiddenBelow} />\n </Box>\n );\n};\n\n/**\n * The whole panel as text, drawn once: printed, it scrolls with the terminal like any other line,\n * and a run with no terminal prints the same thing.\n */\nexport function summaryPanelText(\n props: SummaryPanelProps,\n columns: number = dimensionsOf(process.stdout).columns,\n): string {\n return renderToString(<SummaryPanel {...props} />, { columns });\n}\n\n/**\n * What a question shows, or where none is asked, what prints in its place: the panel, the lines\n * under it marking what it cannot show, then each statement after a blank line, and a blank line\n * before what follows.\n */\nexport function summaryPanelBlock(\n panel: SummaryPanelProps,\n linesUnder: readonly string[],\n statements: readonly string[],\n): string[] {\n return [\n summaryPanelText(panel),\n ...linesUnder,\n ...statements.flatMap((statement) => [\"\", statement]),\n \"\",\n ];\n}\n","import { useEffect, useRef, useState } from \"react\";\nimport type { Ref, RefObject } from \"react\";\nimport { type DOMElement, measureElement, useInput } from \"ink\";\nimport { useMeasuredHeight } from \"./use-measured-height.js\";\n\nexport type UsePanelScrollResult = {\n /** The `overflow=\"hidden\"` box. */\n viewportRef: Ref<DOMElement>;\n contentRef: RefObject<DOMElement | null>;\n contentMarginTop: number;\n hiddenAbove: number;\n hiddenBelow: number;\n};\n\n/** `↑`/`↓` line scrolling for one clipped viewport; hosts add their own `useInput` for other keys. */\nexport function usePanelScroll(): UsePanelScrollResult {\n const { ref: viewportRef, measuredHeight: viewportHeight } = useMeasuredHeight();\n const contentRef = useRef<DOMElement>(null);\n const [contentHeight, setContentHeight] = useState(0);\n const [scrollOffset, setScrollOffset] = useState(0);\n\n // eslint-disable-next-line react-hooks/exhaustive-deps -- re-measures every render; layout changes are invisible to React\n useEffect(() => {\n if (!contentRef.current) return;\n const { height } = measureElement(contentRef.current);\n // Yoga under-reports inside a squeezed viewport; trusting that loops the render.\n setContentHeight((prev) => Math.max(prev, height));\n });\n\n // Not returned: gating the clip on contentHeight paints content over the border.\n const maxScroll = Math.max(0, contentHeight - viewportHeight);\n const hiddenBelow = Math.max(0, maxScroll - scrollOffset);\n\n useInput((_input, key) => {\n if (key.upArrow) setScrollOffset((prev) => Math.max(0, prev - 1));\n if (key.downArrow) setScrollOffset((prev) => Math.min(maxScroll, prev + 1));\n });\n\n return {\n viewportRef,\n contentRef,\n contentMarginTop: scrollOffset > 0 ? -scrollOffset : 0,\n hiddenAbove: scrollOffset,\n hiddenBelow,\n };\n}\n","import { useRef, useState, useEffect } from \"react\";\nimport { type DOMElement, measureElement, useStdout } from \"ink\";\n\n/** Attach to a `flexGrow={1}` Box under an ancestor of constrained height; 0 before first layout. */\nexport function useMeasuredHeight(): {\n ref: React.Ref<DOMElement>;\n measuredHeight: number;\n} {\n const ref = useRef<DOMElement>(null);\n const [measuredHeight, setMeasuredHeight] = useState(0);\n const { stdout } = useStdout();\n\n const measure = () => {\n if (!ref.current) return;\n const { height } = measureElement(ref.current);\n setMeasuredHeight((prev) => (prev !== height ? height : prev));\n };\n\n // Every render, so late-mounted refs are picked up.\n useEffect(() => {\n measure();\n });\n\n // Yoga may not have laid out yet on first render, so retry a few times.\n useEffect(() => {\n const RETRY_DELAYS_MS = [0, 16, 50];\n const timers: ReturnType<typeof setTimeout>[] = [];\n\n for (const delay of RETRY_DELAYS_MS) {\n timers.push(setTimeout(measure, delay));\n }\n\n return () => {\n for (const timer of timers) {\n clearTimeout(timer);\n }\n };\n // Mount-only: listing `measure` would re-arm the timers every render.\n }, []);\n\n useEffect(() => {\n stdout.on(\"resize\", measure);\n return () => {\n stdout.off(\"resize\", measure);\n };\n }, [stdout]);\n\n return { ref, measuredHeight };\n}\n","import { useState, useEffect } from \"react\";\nimport { useStdout } from \"ink\";\n\nconst DEFAULT_COLUMNS = 80;\nconst DEFAULT_ROWS = 24;\n\nexport type TerminalDimensions = {\n columns: number;\n rows: number;\n};\n\n/** A stream that is not a terminal reports no size, so it gets the defaults. */\nexport function dimensionsOf(stdout: NodeJS.WriteStream): TerminalDimensions {\n return {\n columns: stdout.columns || DEFAULT_COLUMNS,\n rows: stdout.rows || DEFAULT_ROWS,\n };\n}\n\nexport function useTerminalDimensions(): TerminalDimensions {\n const { stdout } = useStdout();\n\n const [dimensions, setDimensions] = useState<TerminalDimensions>(() => dimensionsOf(stdout));\n\n useEffect(() => {\n const handleResize = () => {\n setDimensions(dimensionsOf(stdout));\n };\n\n stdout.on(\"resize\", handleResize);\n return () => {\n stdout.off(\"resize\", handleResize);\n };\n }, [stdout]);\n\n return dimensions;\n}\n"],"mappings":"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","names":["useEffect","useRef","useState","measureElement","useRef","useState","useEffect","measureElement","useState","useEffect","useStdout"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
execCommand,
|
|
4
4
|
getErrorMessage
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-WVFBBZEP.js";
|
|
6
6
|
|
|
7
7
|
// src/cli/utils/open-url.ts
|
|
8
8
|
function browserOpenerCommand(platform, url) {
|
|
@@ -32,4 +32,4 @@ async function openUrl(url) {
|
|
|
32
32
|
export {
|
|
33
33
|
openUrl
|
|
34
34
|
};
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
35
|
+
//# sourceMappingURL=chunk-SPQSNZMM.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
pruneStaleCompiledAgents,
|
|
4
4
|
recompileAgents
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-EHJIQDXR.js";
|
|
6
6
|
import {
|
|
7
7
|
agentCodec,
|
|
8
8
|
buildAgentScopeMap,
|
|
@@ -25,7 +25,7 @@ import {
|
|
|
25
25
|
skillsDir,
|
|
26
26
|
skillsPathPrefix,
|
|
27
27
|
verbose
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-WVFBBZEP.js";
|
|
29
29
|
import {
|
|
30
30
|
initializeMatrix,
|
|
31
31
|
matrix,
|
|
@@ -274,4 +274,4 @@ export {
|
|
|
274
274
|
removeCompiledAgents,
|
|
275
275
|
compileAgents
|
|
276
276
|
};
|
|
277
|
-
//# sourceMappingURL=chunk-
|
|
277
|
+
//# sourceMappingURL=chunk-VR6QTK5Z.js.map
|
|
@@ -2,12 +2,13 @@
|
|
|
2
2
|
import {
|
|
3
3
|
compileAgents,
|
|
4
4
|
withCatalogueSeatedFor
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-VR6QTK5Z.js";
|
|
6
6
|
import {
|
|
7
7
|
loadAgentDefs
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-ITQF35UQ.js";
|
|
9
9
|
import {
|
|
10
10
|
ConfigLoadError,
|
|
11
|
+
EXTRACTED_FIELDS,
|
|
11
12
|
GlobalPairWriteViolation,
|
|
12
13
|
INDENT_STEP,
|
|
13
14
|
assertGateToken,
|
|
@@ -52,7 +53,7 @@ import {
|
|
|
52
53
|
warn,
|
|
53
54
|
withGateToken,
|
|
54
55
|
writeFile
|
|
55
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-WVFBBZEP.js";
|
|
56
57
|
import {
|
|
57
58
|
matrix,
|
|
58
59
|
typedEntries,
|
|
@@ -238,17 +239,26 @@ function typeReference(name) {
|
|
|
238
239
|
}
|
|
239
240
|
function renderAlias(name, rhs) {
|
|
240
241
|
const head = `export type ${name} =`;
|
|
241
|
-
|
|
242
|
-
|
|
242
|
+
switch (rhs.kind) {
|
|
243
|
+
case "plain":
|
|
244
|
+
return renderPlainAlias(head, rhs.members);
|
|
245
|
+
case "sectioned":
|
|
246
|
+
return `${head}
|
|
243
247
|
${renderSectionedUnion(rhs.custom, rhs.marketplace)}`;
|
|
248
|
+
default: {
|
|
249
|
+
const _exhaustive = rhs;
|
|
250
|
+
return _exhaustive;
|
|
251
|
+
}
|
|
244
252
|
}
|
|
245
|
-
|
|
253
|
+
}
|
|
254
|
+
function renderPlainAlias(head, members) {
|
|
255
|
+
const layout = unionLayout(members, {
|
|
246
256
|
headWidth: head.length + " ".length,
|
|
247
257
|
tailWidth: 0,
|
|
248
258
|
bodyIndent: INDENT_STEP
|
|
249
259
|
});
|
|
250
|
-
return layout === "inline" ? `${head} ${flatUnion(
|
|
251
|
-
${renderUnionBody(
|
|
260
|
+
return layout === "inline" ? `${head} ${flatUnion(members)}` : `${head}
|
|
261
|
+
${renderUnionBody(members, layout, INDENT_STEP)}`;
|
|
252
262
|
}
|
|
253
263
|
function renderSectionedUnion(custom, marketplace) {
|
|
254
264
|
if (marketplace.length > 0) {
|
|
@@ -1039,9 +1049,12 @@ var NO_CHANGES = {
|
|
|
1039
1049
|
scalarsChanged: [],
|
|
1040
1050
|
projectsChanged: false
|
|
1041
1051
|
};
|
|
1042
|
-
var
|
|
1052
|
+
var extractedFields = new Set(EXTRACTED_FIELDS);
|
|
1043
1053
|
var REGISTRATION_FIELD = "projects";
|
|
1044
|
-
var EMPTY_MEANS_ABSENT = /* @__PURE__ */ new Set([
|
|
1054
|
+
var EMPTY_MEANS_ABSENT = /* @__PURE__ */ new Set([
|
|
1055
|
+
"stack",
|
|
1056
|
+
"selectedDomains"
|
|
1057
|
+
]);
|
|
1045
1058
|
function isEmptyCollection(value) {
|
|
1046
1059
|
return Array.isArray(value) ? value.length === 0 : isRecord(value) && Object.keys(value).length === 0;
|
|
1047
1060
|
}
|
|
@@ -1062,7 +1075,7 @@ function agentsByName(config) {
|
|
|
1062
1075
|
return new Map(agents.map((agent) => [agent.name, agent]));
|
|
1063
1076
|
}
|
|
1064
1077
|
function scalarKeys(prev, next) {
|
|
1065
|
-
const isScalarKey = (key) => !
|
|
1078
|
+
const isScalarKey = (key) => !extractedFields.has(key) && key !== REGISTRATION_FIELD;
|
|
1066
1079
|
const nextKeys = Object.keys(next).filter(isScalarKey);
|
|
1067
1080
|
const extraPrevKeys = Object.keys(prev).filter(
|
|
1068
1081
|
(key) => isScalarKey(key) && !nextKeys.includes(key)
|
|
@@ -1119,14 +1132,20 @@ function consequenceTier(changes) {
|
|
|
1119
1132
|
if (changes.projectsChanged) return "T3";
|
|
1120
1133
|
return "T4";
|
|
1121
1134
|
}
|
|
1135
|
+
var TIER_CONSEQUENCES = {
|
|
1136
|
+
T1: { needsDeps: true, regeneratesTypes: true, propagates: true },
|
|
1137
|
+
T2: { needsDeps: true, regeneratesTypes: false, propagates: true },
|
|
1138
|
+
T3: { needsDeps: false, regeneratesTypes: false, propagates: false },
|
|
1139
|
+
T4: { needsDeps: false, regeneratesTypes: false, propagates: false }
|
|
1140
|
+
};
|
|
1122
1141
|
function tierNeedsDeps(tier) {
|
|
1123
|
-
return tier
|
|
1142
|
+
return TIER_CONSEQUENCES[tier].needsDeps;
|
|
1124
1143
|
}
|
|
1125
1144
|
function tierRegeneratesTypes(tier) {
|
|
1126
|
-
return tier
|
|
1145
|
+
return TIER_CONSEQUENCES[tier].regeneratesTypes;
|
|
1127
1146
|
}
|
|
1128
1147
|
function tierPropagates(tier) {
|
|
1129
|
-
return tier
|
|
1148
|
+
return TIER_CONSEQUENCES[tier].propagates;
|
|
1130
1149
|
}
|
|
1131
1150
|
|
|
1132
1151
|
// src/cli/lib/config-gate/deps.ts
|
|
@@ -1212,7 +1231,7 @@ var NOTHING_RECOMPILED = {
|
|
|
1212
1231
|
};
|
|
1213
1232
|
async function recompilePropagated(projectDirs, pairsRewritten) {
|
|
1214
1233
|
if (projectDirs.length === 0) return NOTHING_RECOMPILED;
|
|
1215
|
-
const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-
|
|
1234
|
+
const { recompilePropagatedProjectAgents } = await import("./recompile-project-agents-6G6M2RS6.js");
|
|
1216
1235
|
return recompilePropagatedProjectAgents(projectDirs, pairsRewritten);
|
|
1217
1236
|
}
|
|
1218
1237
|
function pairRewriteSummary(projectDirs, pairsRewritten) {
|
|
@@ -1308,7 +1327,7 @@ async function applyConsequences(globalConfig, changes, deps, provider, currentP
|
|
|
1308
1327
|
function lazyGateDeps(projectDir) {
|
|
1309
1328
|
return {
|
|
1310
1329
|
loadMatrix: async () => {
|
|
1311
|
-
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-
|
|
1330
|
+
const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-W7XCNKNA.js");
|
|
1312
1331
|
const { matrix: matrix2 } = await loadSkillsMatrixFromSource2({
|
|
1313
1332
|
projectDir,
|
|
1314
1333
|
skipExtraSources: true,
|
|
@@ -1317,7 +1336,7 @@ function lazyGateDeps(projectDir) {
|
|
|
1317
1336
|
return matrix2;
|
|
1318
1337
|
},
|
|
1319
1338
|
loadAgents: async () => {
|
|
1320
|
-
const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-
|
|
1339
|
+
const { loadAgentDefs: loadAgentDefs2 } = await import("./load-agent-defs-E67DSYTN.js");
|
|
1321
1340
|
return (await loadAgentDefs2()).agents;
|
|
1322
1341
|
}
|
|
1323
1342
|
};
|
|
@@ -1478,13 +1497,16 @@ function applyMutation(mutation, current) {
|
|
|
1478
1497
|
}
|
|
1479
1498
|
}
|
|
1480
1499
|
}
|
|
1500
|
+
function globalProviderFor(mutation, homeDir) {
|
|
1501
|
+
return mutation.kind === "deregister-project" ? mutation.provider : providerInUse(homeDir);
|
|
1502
|
+
}
|
|
1481
1503
|
function fallbackNameFor(mutation) {
|
|
1482
1504
|
return mutation.kind === "set-source" ? mutation.fallbackName : void 0;
|
|
1483
1505
|
}
|
|
1484
1506
|
async function mutateGlobal(mutation, deps) {
|
|
1485
1507
|
return withGateToken(async () => {
|
|
1486
1508
|
const homeDir = os2.homedir();
|
|
1487
|
-
const provider =
|
|
1509
|
+
const provider = globalProviderFor(mutation, homeDir);
|
|
1488
1510
|
const loadedGlobal = await loadProjectConfigFromDir(homeDir, provider);
|
|
1489
1511
|
if (!loadedGlobal) return report(false, NO_CHANGES);
|
|
1490
1512
|
const current = loadedGlobal.config;
|
|
@@ -1642,4 +1664,4 @@ export {
|
|
|
1642
1664
|
compileAgentsAllScopes,
|
|
1643
1665
|
compileProjectScope
|
|
1644
1666
|
};
|
|
1645
|
-
//# sourceMappingURL=chunk-
|
|
1667
|
+
//# sourceMappingURL=chunk-VSPC74SS.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();\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 { PROVIDERS, type Provider } from \"../../consts\";\nimport { getInstalledConfigPath, getProjectConfigPath } from \"../installation/install-base-dir\";\nimport { providerInUse, sourceFolderInUse } from \"../installation/install-layout\";\nimport { ConfigLoadError, loadInstalledConfig } 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/** Looks everything up in this project's own seated catalogue. False for an empty config. */\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 loadInstalledConfig(projectPath);\n if (!existingProject?.config) 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 if (!(await holdsAnInstallation(projectPath))) {\n verbose(`Skipped propagation to ${projectPath} (nothing installed there)`);\n return \"gone\";\n }\n\n const notOurs = await whyThisProjectIsNotOurs(projectPath, provider);\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 if (!(await holdsAnInstallation(projectPath))) return false;\n if ((await whyThisProjectIsNotOurs(projectPath, provider)) !== null) return false;\n try {\n return (await loadInstalledConfig(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/** Whether any provider's installation is at `projectPath`, this fan-out's or another's. */\nasync function holdsAnInstallation(projectPath: string): Promise<boolean> {\n const configs = await Promise.all(\n PROVIDERS.map((installed) => fileExists(getProjectConfigPath(projectPath, installed))),\n );\n return configs.includes(true);\n}\n\n/** `null` when ours to rewrite. A `providerInUse` refusal skips the project, never aborts. */\nasync function whyThisProjectIsNotOurs(\n projectPath: string,\n provider: Provider,\n): Promise<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 (await fileExists(getProjectConfigPath(projectPath, 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 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 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 compileAgents({\n ...base,\n projectDir: os.homedir(),\n outputDir: resolveInstallPaths(os.homedir(), \"global\").agentsDir,\n scopeFilter: \"global\",\n });\n const projectResult = await compileProjectScope(options);\n return mergeCompilationResults(globalResult, projectResult);\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"]}
|