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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "agents-inc",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.173.0",
|
|
4
4
|
"description": "CLI for managing Agents Inc. skills, stacks, and agents for Claude Code",
|
|
5
5
|
"//generate": "Runs all four generators in dependency order; the :check variants stay separate because CI runs different subsets.",
|
|
6
6
|
"//no-shared-vitest-config": "A three-project suite with globals on and its own setup and timeouts; the shared single-project, globals-off config would contradict it.",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/init.tsx","../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import os from \"os\";\nimport React from \"react\";\n\nimport { Flags, type Interfaces } from \"@oclif/core\";\nimport { Box, Text, useApp } from \"ink\";\nimport { partition } from \"remeda\";\nimport { render } from \"../components/render.js\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport type { InstallSelection } from \"@workspace/compile/seed-to-config\";\nimport { useTerminalDimensions } from \"../components/hooks/use-terminal-dimensions.js\";\nimport { type SourceLoadResult } from \"../lib/loading/index.js\";\nimport {\n loadSource,\n sayCapturedWarnings,\n loadAgentDefs,\n copyLocalSkills,\n writeProjectConfig,\n compileAgentsAllScopes,\n compileProjectScope,\n type CompilationResult,\n type ConfigWriteResult,\n type SkillCopyResult,\n discoverInstalledSkills,\n} from \"../lib/operations/index.js\";\nimport { movedGlobalAgentInputs, type GateReport } from \"../lib/config-gate/index.js\";\nimport { fetchSeedConfig } from \"../lib/seed/fetch-seed.js\";\nimport {\n registerExternalSkills,\n writeExternalSkills,\n type ExternalSkillInstall,\n} from \"../lib/seed/external-skills.js\";\nimport { seedToInstallSelection, type SeedMapping } from \"../lib/seed/seed-to-selection.js\";\nimport {\n holdInstalledGlobal,\n installsAtHome,\n joinedStatement,\n notInstalledGlobally,\n readInstalledGlobal,\n type HeldGlobal,\n type InstalledGlobal,\n} from \"../lib/seed/seed-apply.js\";\nimport { agentChangesAmong, type AgentChange } from \"../lib/configuration/scope-diff.js\";\nimport { isActiveAt } from \"../lib/configuration/scope-predicates.js\";\nimport { summaryPanelBlock, type SummaryPanelProps } from \"../components/common/summary-panel.js\";\nimport {\n getInstallationsByProvider,\n type ProviderInstallation,\n} from \"../lib/plugins/plugin-info.js\";\nimport {\n assertNamedSourceUsable,\n isLocalSource,\n resolveBranding,\n} from \"../lib/configuration/config.js\";\nimport {\n type InstallMode,\n detectInstallation,\n detectProjectInstallation,\n deriveInstallMode,\n holdsItsOwnInstallation,\n installBaseDir,\n resolveInstallPaths,\n buildAgentScopeMap,\n isHomeDirectory,\n INSTALL_MODE_LABELS,\n INSTALL_MODE_DESCRIPTIONS,\n} from \"../lib/installation/index.js\";\nimport { hostAt } from \"../lib/hosts/host-for.js\";\nimport {\n agentCodec,\n chooseProviderForThisRun,\n providerInUse,\n relativeConfigPath,\n} from \"../lib/installation/install-layout.js\";\nimport { providerToNameAt } from \"../lib/installation/provider-to-name.js\";\nimport { hostCompileNotices } from \"../lib/hosts/host-compile-notices.js\";\nimport {\n installationToName,\n providerFlag,\n providerNamedBy,\n providerNeedsAConfigurationToInstall,\n} from \"../lib/installation/provider-flag.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport {\n ASCII_LOGO,\n CLI_INVOKE_COMMAND,\n DEFAULT_BRANDING,\n EDITOR_ADDRESS,\n EDITOR_URL,\n EJECT_SOURCE,\n editorConfigUrl,\n type Provider,\n} from \"../consts.js\";\nimport { clearTerminalScreen } from \"../utils/terminal.js\";\nimport { SelectList, type SelectListItem } from \"../components/common/select-list.js\";\nimport { promptConfirm, promptValue } from \"../components/common/prompt-confirm.js\";\nimport { Confirm } from \"../components/common/confirm.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { openUrl } from \"../utils/open-url.js\";\nimport { plural } from \"../utils/string.js\";\nimport type {\n AgentName,\n AgentScopeConfig,\n MergedSkillsMatrix,\n SkillConfig,\n SkillId,\n SkillScope,\n} from \"../types/index.js\";\nimport { type StartupMessage } from \"../utils/logger.js\";\nimport {\n ERROR_MESSAGES,\n INCOMPLETE_WORK_RECOVERY,\n SHARED_CONFIG_ARRIVALS,\n STATUS_MESSAGES,\n addMarketplaceInTheEditor,\n agentsNotCompiled,\n applySharedConfigHere,\n carriedSkillsWritten,\n globalScopedAgentsHint,\n initSucceeded,\n keptAsInstalledGlobally,\n sharedConfigExistingInstall,\n subAgentChanged,\n} from \"../utils/messages.js\";\nimport type { SeedPayload } from \"@workspace/matrix/seed\";\n\nconst DASHBOARD_OPTIONS = [\n { label: \"Edit in the web editor\", value: \"edit\" },\n { label: \"Compile\", value: \"compile\" },\n { label: \"Doctor\", value: \"doctor\" },\n { label: \"List\", value: \"list\" },\n] as const satisfies readonly SelectListItem<string>[];\n\nconst DASHBOARD_OPTIONS_LINE = ` ${DASHBOARD_OPTIONS.map(({ label }) => `[${label}]`).join(\" \")}`;\n\ntype DashboardCommand = (typeof DASHBOARD_OPTIONS)[number][\"value\"];\n\n/** A white-labelled name replaces the logo, because the logo spells the shipped name. */\nconst DashboardTitle: React.FC<{ name: string }> = ({ name }) =>\n name === DEFAULT_BRANDING.NAME ? <Text>{ASCII_LOGO}</Text> : <Text bold>{name}</Text>;\n\ntype DashboardProps = {\n data: DashboardData;\n onSelect: (command: DashboardCommand) => void;\n onCancel: () => void;\n};\n\nexport const Dashboard: React.FC<DashboardProps> = ({ data, onSelect, onCancel }) => {\n const { exit } = useApp();\n const { rows: terminalHeight } = useTerminalDimensions();\n\n return (\n <Box flexDirection=\"column\" height={terminalHeight}>\n <Box marginBottom={1}>\n <DashboardTitle name={data.name} />\n </Box>\n <Box marginBottom={1}>\n <Text>{dashboardCountLines(data).join(\"\\n\")}</Text>\n </Box>\n <SelectList\n items={DASHBOARD_OPTIONS}\n onSelect={(command) => {\n onSelect(command);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n </Box>\n );\n};\n\n/**\n * Shared by the TTY and piped dashboards so the two cannot drift apart. A scope holding two\n * installations gets a named block for each, a blank line apart.\n */\nfunction dashboardCountLines({ installations }: DashboardData): string[] {\n const named = installations.length > 1;\n const blocks = installations.map((installation) => [\n ...(named ? [` Provider: ${installation.provider}`] : []),\n ...installationCountLines(installation),\n ]);\n return blankLineBetween(blocks);\n}\n\nfunction blankLineBetween(blocks: string[][]): string[] {\n return blocks.flatMap((block, index) => (index === 0 ? block : [\"\", ...block]));\n}\n\nfunction installationCountLines(installation: ProviderInstallation): string[] {\n return [\n ` Skills: ${installation.skillCount} installed`,\n ` Agents: ${installation.agentCount} compiled`,\n ` Mode: ${INSTALL_MODE_LABELS[installation.mode]}`,\n ...(installation.marketplace ? [` Marketplace: ${installation.marketplace}`] : []),\n ];\n}\n\nexport function formatDashboardText(data: DashboardData): string {\n return [data.name, \"\", ...dashboardCountLines(data), \"\", DASHBOARD_OPTIONS_LINE].join(\"\\n\");\n}\n\n/** Ctrl+C cancels the run; Escape (null) only leaves the dashboard. */\nconst DASHBOARD_INTERRUPTED = \"interrupted\";\n\ntype DashboardAnswer = DashboardCommand | typeof DASHBOARD_INTERRUPTED | null;\n\nasync function showDashboard(\n projectDir: string,\n log?: (message: string) => void,\n): Promise<DashboardAnswer> {\n const data = await getDashboardData(projectDir);\n\n if (!process.stdin.isTTY) {\n const output = log ?? console.log;\n output(formatDashboardText(data));\n return null;\n }\n\n // clearOnResolve repaints a clean terminal before unmount: the dashboard fills the height.\n const selectedCommand = await promptValue<DashboardAnswer>(\n (resolve) => (\n <Dashboard\n data={data}\n onSelect={(command) => resolve(command)}\n onCancel={() => resolve(null)}\n />\n ),\n { onExit: DASHBOARD_INTERRUPTED, clearOnResolve: true },\n );\n\n clearTerminalScreen();\n\n return selectedCommand;\n}\n\nfunction dashboardCommandArgv(command: DashboardCommand): string[] {\n return command === \"edit\" ? [\"--ui\"] : [];\n}\n\nexport type DashboardFlow = \"not-installed\" | \"shown\" | \"cancelled\";\n\n/** Never exits the process: callers decide from the {@link DashboardFlow} it answers. */\nexport async function runDashboardFlow(\n projectDir: string,\n config: Interfaces.Config,\n log?: (message: string) => void,\n): Promise<DashboardFlow> {\n const installation = await detectInstallation(projectDir);\n if (!installation) return \"not-installed\";\n\n const selectedCommand = await showDashboard(projectDir, log);\n if (selectedCommand === DASHBOARD_INTERRUPTED) return \"cancelled\";\n if (selectedCommand) {\n await config.runCommand(selectedCommand, dashboardCommandArgv(selectedCommand));\n }\n return \"shown\";\n}\n\n/** A required key, not `?`: oclif writes the key as `undefined` when the flag is not passed. */\ntype SourceFlags = { marketplace: string | undefined };\n\ntype Selection = {\n result: InstallSelection;\n sourceResult: SourceLoadResult;\n /** Where the selection was actually loaded from; a shared id may name a marketplace. */\n sourceFlags: SourceFlags;\n /** A global install's own skills, recorded as they are and never installed over. */\n installedAlready: ReadonlySet<SkillId>;\n};\n\n/** The payload names the marketplace because a skill id never says where its repository lives. */\nfunction sharedConfigSourceFlags(flags: SourceFlags, payload: SeedPayload): SourceFlags {\n return { marketplace: flags.marketplace ?? payload.marketplace };\n}\n\nexport default class Init extends BaseCommand {\n /** Resolved once in {@link install}; the closing line is printed several calls below. */\n private brandingName: string = DEFAULT_BRANDING.NAME;\n\n static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;\n static description = `Build a configuration in ${EDITOR_ADDRESS}, or install one by id with --from. Over an existing installation, shows its dashboard.`;\n\n static examples = [\n {\n description: \"Open the editor to build a configuration\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Install a configuration built in the editor\",\n command: \"<%= config.bin %> <%= command.id %> --from <id>\",\n },\n {\n description: \"Test local marketplace changes against a configuration built in the editor\",\n command: \"<%= config.bin %> <%= command.id %> --from <id> --marketplace ./my-marketplace\",\n },\n ];\n\n static flags = {\n marketplace: Flags.string({\n char: \"m\",\n description:\n \"With --from, install from this marketplace instead of the one the configuration names. Without --from, open the editor and say how to add it there\",\n required: false,\n }),\n from: Flags.string({\n description: \"Install a configuration shared from agentsinc.sh by its id\",\n helpValue: \"<id>\",\n }),\n ui: Flags.boolean({\n description: `Open ${EDITOR_ADDRESS} on the id --from names, or on the catalogue — what a bare init does where nothing is installed`,\n default: false,\n }),\n provider: providerFlag(),\n };\n\n /** The exit code is decided once, after every path through {@link install} has ended. */\n async run(): Promise<void> {\n await this.install();\n this.exitIfWorkIncomplete();\n }\n\n /** The link is printed before it is opened, so it still works where no browser can open. */\n private async openEditor(\n projectDir: string,\n provider: Provider | undefined,\n id?: string,\n marketplace?: string,\n ): Promise<void> {\n const url = id === undefined ? EDITOR_URL : editorConfigUrl(id);\n // Above the first line, so a ref the install route would refuse is refused before any output.\n const marketplaceLine =\n marketplace === undefined ? undefined : this.addMarketplaceLineOrFail(marketplace);\n\n const installedHere = await holdsItsOwnInstallation(projectDir);\n const toName = installedHere ? await installationToName(projectDir, provider) : provider;\n\n this.log(id === undefined ? `Build it at ${url}` : `Open it at ${url}`);\n if (marketplaceLine !== undefined) this.log(marketplaceLine);\n this.log(applySharedConfigHere(id, installedHere, toName));\n\n if (!process.stdin.isTTY) return;\n\n const opened = await openUrl(url);\n if (!opened.ok) this.warn(opened.error);\n }\n\n private async install(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n // First, so a refused `--provider` leaves the filesystem untouched at both scopes.\n this.settleTheProviderForThisRun(flags);\n\n // Before `ensureConfigReadable`: a broken config must not block the editor route.\n if (opensTheEditor(flags)) {\n return this.openEditor(\n projectDir,\n providerNamedBy(flags.provider),\n flags.from,\n flags.marketplace,\n );\n }\n\n // ABORT: an unreadable config is refused here, before any route reads it.\n await this.ensureConfigReadable(projectDir);\n\n if (flags.from === undefined) return this.showDashboardOrOpenEditor(projectDir);\n\n // Its degrade arm cannot fire: `ensureConfigReadable` already refused every unreadable config.\n this.brandingName = await this.resolveBrandingName(projectDir);\n\n const selection = await this.selectionFromSharedConfig(flags.from, flags, projectDir);\n if (!selection) this.exit(EXIT_CODES.CANCELLED);\n\n this.reportValidationErrors(selection.result.validation);\n\n await this.handleInstallation(selection, projectDir);\n }\n\n private async showDashboardOrOpenEditor(projectDir: string): Promise<void> {\n const dashboard = await runDashboardFlow(projectDir, this.config, (msg) => this.log(msg));\n if (dashboard === \"cancelled\") this.error(\"Cancelled\", { exit: EXIT_CODES.CANCELLED });\n if (dashboard === \"not-installed\") await this.openEditor(projectDir, undefined);\n }\n\n /** Refused as the install route refuses it, since the line echoes the ref it was given. */\n private addMarketplaceLineOrFail(ref: string): string {\n try {\n assertNamedSourceUsable(ref);\n return addMarketplaceInTheEditor(ref, isLocalSource(ref));\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /** `--provider` only picks which folder an install creates, so it needs `--from`. */\n private settleTheProviderForThisRun(flags: Interfaces.InferredFlags<typeof Init.flags>): void {\n const named = providerNamedBy(flags.provider);\n if (named === undefined) return;\n\n if (flags.from === undefined) {\n this.error(providerNeedsAConfigurationToInstall(), { exit: EXIT_CODES.INVALID_ARGS });\n }\n\n chooseProviderForThisRun(named);\n }\n\n /** Every refusal fires before anything is written. */\n private async selectionFromSharedConfig(\n id: string,\n flags: SourceFlags,\n projectDir: string,\n ): Promise<Selection | null> {\n await this.refuseInstalledProject(projectDir, id);\n\n const payload = await this.fetchSharedConfigOrFail(id);\n const sourceFlags = sharedConfigSourceFlags(flags, payload);\n const { sourceResult, startupMessages } = await this.loadSourceOrFail(sourceFlags, projectDir);\n // Before the decode, which would otherwise skip carried skills as unknown ids.\n const carriedSkills = this.registerExternalSkillsOrFail(\n payload,\n sourceResult.matrix,\n projectDir,\n );\n const mapping = this.decodeSeedOrFail(payload, sourceResult.matrix);\n const { result } = mapping;\n\n // Nothing is installed here: `refuseInstalledProject` has already refused a home that holds one.\n this.refuseProjectScopedContentAtHome(result, projectDir, false);\n\n const installedGlobal = await installedGlobalToHold(projectDir);\n const held = holdInstalledGlobal(result, installedGlobal);\n const arrivingCarried = notInstalledGlobally(carriedSkills, held);\n\n // Above the lists: a yes installs what was listed, so nothing listed may then be refused.\n await this.refuseSharedConfigBeforeAsking(\n held.result,\n arrivingCarried,\n projectDir,\n sourceResult,\n );\n\n // Above the skips: an \"unknown\" skill is often one whose file failed to parse.\n sayCapturedWarnings(startupMessages);\n this.warnOfSkippedEntries(mapping);\n this.refuseAnEmptySelection(held.result, id);\n\n const stackName = await this.stackNameOf(result.selectedStackId, sourceResult);\n this.logWhatGoesWhere(held, installedGlobal, stackName, {\n id: installsAtHome(result) ? id : undefined,\n provider: providerToNameAt(os.homedir(), providerInUse(projectDir)),\n });\n if (process.stdin.isTTY && !(await this.confirmInstall())) {\n this.log(\"Setup cancelled\");\n return null;\n }\n\n // After the question, so a refusal or a no leaves nothing written.\n await this.writeCarriedSkills(arrivingCarried);\n this.announceArrivingSkills(held, result.selectedAgents.length);\n\n return {\n result: held.result,\n sourceResult,\n sourceFlags,\n installedAlready: new Set(held.installed.skillIds),\n };\n }\n\n /**\n * The panel where the question is asked, or where it would be: the project against the whole\n * global install it inherits. `runFromHome.id` is the id only where home would take it.\n */\n private logWhatGoesWhere(\n held: HeldGlobal,\n installedGlobal: InstalledGlobal | null,\n stackName: string | undefined,\n runFromHome: RunFromHome,\n ): void {\n const joined = joinedGlobalAgents(held, installedGlobal);\n const lines = summaryPanelBlock(\n installPanel(held, installedGlobal, joined, stackName),\n joined.map(subAgentChanged),\n [...joinedStatement(held), ...keptAsInstalledStatement(held, runFromHome)],\n );\n for (const line of lines) {\n this.log(line);\n }\n }\n\n private refuseAnEmptySelection(result: InstallSelection, id: string): void {\n if (!selectsNothing(result)) return;\n\n this.error(`Configuration '${id}' contains no skills this catalog can install.`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n private announceArrivingSkills(held: HeldGlobal, agentCount: number): void {\n const arriving = notInstalledGlobally(held.result.skills, held);\n if (arriving.length === 0) return;\n\n this.log(`Installing ${arriving.length} skill(s) across ${agentCount} sub-agent(s)\\n`);\n }\n\n private async confirmInstall(): Promise<boolean> {\n const outcome = await promptConfirm(({ onConfirm, onCancel }) => (\n <Confirm\n message={SHARED_CONFIG_ARRIVALS.INSTALL_CONFIRM}\n onConfirm={onConfirm}\n onCancel={onCancel}\n />\n ));\n return outcome === \"confirmed\";\n }\n\n /** Project-scoped: `detectInstallation`'s global fallback would refuse every clean project. */\n private async refuseInstalledProject(projectDir: string, id: string): Promise<void> {\n const installation = await detectProjectInstallation(projectDir);\n if (!installation) return;\n\n const provider = providerToNameAt(projectDir, providerInUse(projectDir));\n this.error(sharedConfigExistingInstall(installation.configPath, id, provider), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n private async fetchSharedConfigOrFail(id: string): Promise<SeedPayload> {\n this.log(`Fetching configuration ${id}...`);\n const fetched = await fetchSeedConfig(id);\n if (!fetched.ok) {\n this.error(fetched.error, { exit: EXIT_CODES.ERROR });\n }\n return fetched.payload;\n }\n\n private decodeSeedOrFail(payload: SeedPayload, matrix: MergedSkillsMatrix): SeedMapping {\n try {\n return seedToInstallSelection(payload, matrix);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private registerExternalSkillsOrFail(\n payload: SeedPayload,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n ): ExternalSkillInstall[] {\n try {\n return registerExternalSkills(payload, matrix, projectDir);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async writeCarriedSkills(carried: ExternalSkillInstall[]): Promise<void> {\n if (carried.length === 0) return;\n\n await writeExternalSkills(carried);\n this.log(carriedSkillsWritten(carried.map((skill) => skill.id)));\n }\n\n private async loadSourceOrFail(\n flags: SourceFlags,\n projectDir: string,\n ): Promise<{ sourceResult: SourceLoadResult; startupMessages: StartupMessage[] }> {\n try {\n const loaded = await loadSource({\n // The one load that may choose a marketplace rather than read the stored one.\n caller: \"init\",\n ...(flags.marketplace !== undefined && { sourceFlag: flags.marketplace }),\n projectDir,\n captureStartupMessages: true,\n });\n return { sourceResult: loaded.sourceResult, startupMessages: loaded.startupMessages };\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n private async handleInstallation(\n { result, sourceResult, sourceFlags, installedAlready }: Selection,\n projectDir: string,\n ): Promise<void> {\n const plan = planInstall(result, installedAlready);\n this.logInstallPlan(plan);\n\n // Before any copy, so a failed resolution cannot leave a half-install with no config.ts.\n const resolvedMarketplace = await this.marketplaceForPluginSkills(\n plan.pluginSkills,\n sourceResult,\n projectDir,\n );\n\n const copyResult = await this.copyEjectedSkills(plan, projectDir, sourceResult);\n\n if (resolvedMarketplace !== null) {\n await this.installPluginSkillsReported(\n plan.pluginSkills,\n resolvedMarketplace,\n projectDir,\n sourceResult.matrix,\n );\n }\n\n try {\n const written = await this.writeConfigAndCompile(\n result,\n sourceResult,\n sourceFlags,\n projectDir,\n );\n this.reportSuccess(written, copyResult, projectDir);\n\n await this.showPermissionNotice(projectDir);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async marketplaceForPluginSkills(\n pluginSkills: InstallSelection[\"skills\"],\n sourceResult: SourceLoadResult,\n projectDir: string,\n ): Promise<string | null> {\n if (pluginSkills.length === 0) return null;\n\n return this.requireMarketplaceOrExit(\n sourceResult,\n \"install plugin skills\",\n hostAt(projectDir),\n (marketplace) => this.log(`Registering marketplace \"${marketplace}\"...`),\n );\n }\n\n /** One frame, then unmount: the notice has no exit of its own and `--from` must run headless. */\n private async showPermissionNotice(projectDir: string): Promise<void> {\n const permissionWarning = await checkPermissions(projectDir);\n if (!permissionWarning) return;\n\n const { unmount } = render(permissionWarning);\n unmount();\n }\n\n private logInstallPlan(plan: InstallPlan): void {\n this.log(\"\\n\");\n this.log(`Selected ${plural(plan.ejectedSkills.length + plan.pluginSkills.length, \"skill\")}`);\n this.log(`Install mode: ${installModeDescription(plan)}`);\n }\n\n private async copyEjectedSkills(\n { ejectedSkills, installMode }: InstallPlan,\n projectDir: string,\n sourceResult: SourceLoadResult,\n ): Promise<SkillCopyResult | null> {\n if (ejectedSkills.length === 0) return null;\n\n this.log(\"Copying skills to local directory...\");\n const copyResult = await copyLocalSkills(ejectedSkills, projectDir, sourceResult);\n this.log(skillsCopiedLine(copyResult, installMode, projectDir));\n return copyResult;\n }\n\n private async writeConfigAndCompile(\n result: InstallSelection,\n sourceResult: SourceLoadResult,\n flags: SourceFlags,\n projectDir: string,\n ): Promise<WrittenInstall> {\n const configResult = await this.writeConfigReported(result, sourceResult, flags, projectDir);\n const agentScopeMap = buildAgentScopeMap(configResult.config);\n const compileResult = await this.compileInstalledAgents(\n configResult.propagation,\n agentScopeMap,\n projectDir,\n );\n this.reportCompilation(compileResult);\n await this.reportWhatThisHostCannotCarry(projectDir);\n\n this.reportFanOut(configResult.propagation);\n\n return { configResult, compileResult, agentScopeMap };\n }\n\n private async writeConfigReported(\n result: InstallSelection,\n sourceResult: SourceLoadResult,\n flags: SourceFlags,\n projectDir: string,\n ): Promise<ConfigWriteResult> {\n this.log(\"Generating configuration...\");\n const configResult = await writeProjectConfig({\n selection: result,\n sourceResult,\n projectDir,\n ...(flags.marketplace !== undefined && { sourceFlag: flags.marketplace }),\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.existingConfigPath}`);\n }\n\n this.log(`Configuration saved (${plural(configResult.config.agents.length, \"agent\")})\\n`);\n this.reportUnassignedSkills(configResult.config, result.skills);\n return configResult;\n }\n\n private async compileInstalledAgents(\n written: GateReport,\n agentScopeMap: Map<AgentName, SkillScope>,\n projectDir: string,\n ): Promise<CompilationResult> {\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n // Sequential: both can reject and discovery warns, so the order decides what the user reads.\n const agentDefs = await loadAgentDefs();\n const { allSkills } = await discoverInstalledSkills(projectDir);\n const compile = compilesGlobalScope(projectDir, written)\n ? compileAgentsAllScopes\n : compileProjectScope;\n return compile({\n projectDir,\n sourcePath: agentDefs.sourcePath,\n skills: allSkills,\n agentScopeMap,\n });\n }\n\n private async reportWhatThisHostCannotCarry(projectDir: string): Promise<void> {\n for (const notice of await hostCompileNotices(providerInUse(projectDir), projectDir)) {\n this.log(notice);\n }\n }\n\n /**\n * Failures are recorded rather than aborted on: the skills and config are already written, and\n * {@link BaseCommand.exitIfWorkIncomplete} answers for them.\n */\n private reportCompilation(compileResult: CompilationResult): void {\n const { compiled, failed, warnings } = compileResult;\n const summary = `Compiled ${plural(compiled.length, \"agent\")}`;\n\n if (failed.length === 0) {\n this.log(`${summary}\\n`);\n return;\n }\n\n this.log(`${summary} (${failed.length} failed)\\n`);\n for (const warning of warnings) {\n this.warn(warning);\n }\n // Off `failed`, not `warnings`: warnings also carry entries that are not failures.\n this.recordIncompleteWork(agentsNotCompiled(failed), INCOMPLETE_WORK_RECOVERY.RECOMPILE);\n }\n\n private reportSuccess(\n { configResult, compileResult, agentScopeMap }: WrittenInstall,\n copyResult: SkillCopyResult | null,\n projectDir: string,\n ): void {\n // A run with work owed ends on the failure account instead of claiming success.\n if (!this.hasIncompleteWork) this.log(`${initSucceeded(this.brandingName)}\\n`);\n\n if (copyResult !== null && copyResult.totalCopied > 0) {\n this.logDirectoryBlocks(\"Skills copied to:\", skillsCopiedBlocks(projectDir, copyResult));\n }\n this.logDirectoryBlocks(\n \"Agents compiled to:\",\n agentsCompiledBlocks(projectDir, compileResult.compiled, agentScopeMap),\n );\n this.reportConfiguration(configResult, agentScopeMap, projectDir);\n }\n\n private reportConfiguration(\n { configPath, propagation }: ConfigWriteResult,\n agentScopeMap: Map<AgentName, SkillScope>,\n projectDir: string,\n ): void {\n const paths = {\n global: resolveInstallPaths(projectDir, \"global\").configPath,\n project: configPath,\n };\n const split = splitAgentScopes(projectDir, agentScopeMap);\n\n this.log(\"Configuration:\");\n for (const written of configsWritten(projectDir, paths, propagation.globalWritten)) {\n this.log(` ${written}`);\n }\n this.log(\"\");\n\n this.log(\"To customize agent-skill assignments:\");\n for (const [index, step] of customizationSteps(split, paths.global, projectDir).entries()) {\n this.log(` ${index + 1}. ${step}`);\n }\n this.log(\"\");\n }\n\n private logDirectoryBlocks(heading: string, blocks: DirectoryBlock[]): void {\n for (const { dir, entries } of blocks) {\n this.log(heading);\n this.log(` ${dir}`);\n for (const entry of entries) {\n this.log(` ${entry}`);\n }\n this.log(\"\");\n }\n }\n}\n\n/** The editor is where a marketplace is added, so `--marketplace` without `--from` opens it. */\nfunction opensTheEditor(\n flags: Pick<Interfaces.InferredFlags<typeof Init.flags>, \"ui\" | \"from\" | \"marketplace\">,\n): boolean {\n return flags.ui || (flags.from === undefined && flags.marketplace !== undefined);\n}\n\n/** A sub-agent is installable without skills, so only a selection with neither is empty. */\nfunction selectsNothing(result: InstallSelection): boolean {\n return result.skills.length === 0 && result.selectedAgents.length === 0;\n}\n\n/** At the home root the global config is the project's own, so there is no global install apart. */\nasync function installedGlobalToHold(projectDir: string): Promise<InstalledGlobal | null> {\n if (isHomeDirectory(projectDir)) return null;\n return await readInstalledGlobal(projectDir);\n}\n\n/** The run from home that changes what a project run keeps, where home would take it. */\ntype RunFromHome = { id: string | undefined; provider: Provider | undefined };\n\nfunction keptAsInstalledStatement(held: HeldGlobal, runFromHome: RunFromHome): string[] {\n const { skillIds, agentNames } = held.keptAsInstalled;\n if (skillIds.length === 0 && agentNames.length === 0) return [];\n return [keptAsInstalledGlobally(skillIds, agentNames, runFromHome.id, runFromHome.provider)];\n}\n\ntype GlobalEntries = { skills: SkillConfig[]; agents: AgentScopeConfig[] };\n\n/** What the project inherits that the configuration leaves unnamed: a project config copies it all. */\nfunction inheritedGlobal(held: HeldGlobal, installedGlobal: InstalledGlobal | null): GlobalEntries {\n if (installedGlobal === null) return { skills: [], agents: [] };\n\n const namedSkills = new Set(held.result.skills.filter(isGlobal).map(({ id }) => id));\n const namedAgents = new Set(held.result.agentConfigs.filter(isGlobal).map(({ name }) => name));\n return {\n skills: installedGlobal.skills.filter((skill) => isGlobal(skill) && !namedSkills.has(skill.id)),\n agents: installedGlobal.agents.filter(\n (agent) => isGlobal(agent) && !namedAgents.has(agent.name),\n ),\n };\n}\n\nfunction isGlobal(entry: SkillConfig | AgentScopeConfig): boolean {\n return isActiveAt(entry, \"global\");\n}\n\n/** Measured against the global install: the project changes nothing else of it. */\nfunction installPanel(\n held: HeldGlobal,\n installedGlobal: InstalledGlobal | null,\n joined: AgentChange[],\n stackName: string | undefined,\n): SummaryPanelProps {\n const inherited = inheritedGlobal(held, installedGlobal);\n return {\n skillConfigs: [...held.result.skills, ...inherited.skills],\n agentConfigs: [...held.result.agentConfigs, ...inherited.agents],\n installedSkillConfigs: installedGlobal?.skills ?? null,\n installedAgentConfigs: installedGlobal?.agents ?? null,\n isInitMode: true,\n changedAgentNames: new Set(joined.map(({ name }) => name)),\n stackName,\n };\n}\n\n/** The held global sub-agents an arriving skill's row joins, against their installed rows. */\nfunction joinedGlobalAgents(\n held: HeldGlobal,\n installedGlobal: InstalledGlobal | null,\n): AgentChange[] {\n if (installedGlobal === null) return [];\n\n return agentChangesAmong(\n held.joined.map(({ agentName }) => agentName),\n installedGlobal,\n { agents: held.result.agentConfigs, stack: held.result.assignedStack },\n );\n}\n\ntype InstallPlan = {\n installMode: InstallMode;\n ejectedSkills: InstallSelection[\"skills\"];\n pluginSkills: InstallSelection[\"skills\"];\n};\n\nfunction planInstall(\n result: InstallSelection,\n installedAlready: ReadonlySet<SkillId>,\n): InstallPlan {\n const toInstall = result.skills.filter(\n (skill) => !skill.excluded && !installedAlready.has(skill.id),\n );\n const [ejectedSkills, pluginSkills] = partition(\n toInstall,\n (skill) => skill.origin === EJECT_SOURCE,\n );\n return { installMode: deriveInstallMode(toInstall), ejectedSkills, pluginSkills };\n}\n\nfunction installModeDescription({ installMode, ejectedSkills, pluginSkills }: InstallPlan): string {\n if (installMode !== \"mixed\") return INSTALL_MODE_DESCRIPTIONS[installMode];\n return `${INSTALL_MODE_LABELS.mixed} (${ejectedSkills.length} eject, ${pluginSkills.length} plugin)`;\n}\n\ntype WrittenInstall = {\n configResult: ConfigWriteResult;\n compileResult: CompilationResult;\n agentScopeMap: Map<AgentName, SkillScope>;\n};\n\n/**\n * From a project, global sub-agents recompile only when the write changed their inputs;\n * otherwise they would be rebuilt from this run's catalogue, not the one they were made from.\n */\nfunction compilesGlobalScope(cwd: string, written: GateReport): boolean {\n return isHomeDirectory(cwd) || movedGlobalAgentInputs(written);\n}\n\n/** Names the directory only when every skill landed at one scope; the block beneath lists both. */\nfunction skillsCopiedLine(\n copyResult: SkillCopyResult,\n installMode: InstallMode,\n projectDir: string,\n): string {\n const isMixed = installMode === \"mixed\";\n const copied = plural(copyResult.totalCopied, isMixed ? \"local skill\" : \"skill\");\n const lineEnd = isMixed ? \"\" : \"\\n\";\n const projectCount = copyResult.projectCopied.length;\n const globalCount = copyResult.globalCopied.length;\n const landedAtBothScopes = projectCount > 0 && globalCount > 0;\n\n if (landedAtBothScopes) {\n return `Copied ${copied} (${projectCount} project, ${globalCount} global)${lineEnd}`;\n }\n const landedAt: SkillScope = globalCount > 0 ? \"global\" : \"project\";\n return `Copied ${copied} to ${resolveInstallPaths(projectDir, landedAt).skillsDir}/${lineEnd}`;\n}\n\n/** Entries are on-disk names, so ids, never display names. */\ntype DirectoryBlock = { dir: string; entries: string[] };\n\nfunction hasEntries(block: DirectoryBlock): boolean {\n return block.entries.length > 0;\n}\n\n/** At home a Claude install's two scopes are one folder, which is named once. */\nfunction oneBlockPerDir(blocks: DirectoryBlock[]): DirectoryBlock[] {\n const dirs = [...new Set(blocks.map((block) => block.dir))];\n return dirs.map((dir) => ({\n dir,\n entries: blocks.filter((block) => block.dir === dir).flatMap((block) => block.entries),\n }));\n}\n\nfunction skillsCopiedBlocks(projectDir: string, copyResult: SkillCopyResult): DirectoryBlock[] {\n return oneBlockPerDir(\n [\n copiedSkillsBlock(projectDir, \"global\", copyResult.globalCopied),\n copiedSkillsBlock(projectDir, \"project\", copyResult.projectCopied),\n ].filter(hasEntries),\n );\n}\n\nfunction copiedSkillsBlock(\n projectDir: string,\n scope: SkillScope,\n copied: SkillCopyResult[\"projectCopied\"],\n): DirectoryBlock {\n return {\n dir: resolveInstallPaths(projectDir, scope).skillsDir,\n entries: copied.map(({ skillId }) => `${skillId}/`),\n };\n}\n\n/** Mirrors `writeCompiledAgentsByScope`' routing. */\nfunction agentsCompiledBlocks(\n projectDir: string,\n compiled: AgentName[],\n agentScopeMap: Map<AgentName, SkillScope>,\n): DirectoryBlock[] {\n const [globalAgents, projectAgents] = partition(\n compiled,\n (name) => agentScopeMap.get(name) === \"global\",\n );\n return oneBlockPerDir(\n [\n compiledAgentsBlock(projectDir, \"global\", globalAgents),\n compiledAgentsBlock(projectDir, \"project\", projectAgents),\n ].filter(hasEntries),\n );\n}\n\n/** Per scope, because the project and global installs can be on different hosts. */\nfunction compiledAgentsBlock(\n projectDir: string,\n scope: SkillScope,\n agents: AgentName[],\n): DirectoryBlock {\n const { extension } = agentCodec(providerInUse(installBaseDir(projectDir, scope)));\n return {\n dir: resolveInstallPaths(projectDir, scope).agentsDir,\n entries: agents.map((name) => `${name}${extension}`),\n };\n}\n\ntype ConfigPaths = { global: string; project: string };\n\ntype AgentScopeSplit = { globalAgentCount: number; isGlobalOnly: boolean };\n\n/** At the home root both scopes are one config and one pass, so there is no split. */\nfunction splitAgentScopes(cwd: string, agentScopeMap: Map<AgentName, SkillScope>): AgentScopeSplit {\n if (isHomeDirectory(cwd)) return { globalAgentCount: 0, isGlobalOnly: false };\n\n const scopes = [...agentScopeMap.values()];\n const globalAgentCount = scopes.filter((scope) => scope === \"global\").length;\n return {\n globalAgentCount,\n isGlobalOnly: globalAgentCount > 0 && globalAgentCount === scopes.length,\n };\n}\n\n/**\n * From a project its own config is always written, and the global one whenever the run changed it,\n * if only to register the project. At home the two are one file.\n */\nfunction configsWritten(projectDir: string, paths: ConfigPaths, globalWritten: boolean): string[] {\n if (isHomeDirectory(projectDir)) return [paths.project];\n return globalWritten ? [paths.global, paths.project] : [paths.project];\n}\n\n/** `compile` in a project recompiles no global agent, hence the global hint. */\nfunction customizationSteps(\n split: AgentScopeSplit,\n globalConfigPath: string,\n projectDir: string,\n): string[] {\n if (split.isGlobalOnly) {\n return [`Edit ${globalConfigPath}`, globalScopedAgentsHint(split.globalAgentCount)];\n }\n\n return [\n `Edit ${relativeConfigPath(projectDir, providerInUse(projectDir))}`,\n `Run '${CLI_INVOKE_COMMAND} compile' to regenerate agents`,\n ...(split.globalAgentCount > 0 ? [globalScopedAgentsHint(split.globalAgentCount)] : []),\n ];\n}\n\nexport type DashboardData = {\n name: string;\n installations: ProviderInstallation[];\n};\n\n/** Each installation's counts come from its own scope-aware read, so project and global never mix. */\nasync function getDashboardData(projectDir: string): Promise<DashboardData> {\n // ABORT: an unloadable config throws here, as the installation check before it already would.\n const [installations, branding] = await Promise.all([\n getInstallationsByProvider(projectDir),\n resolveBranding(projectDir),\n ]);\n // Every caller found an installation before drawing the dashboard.\n if (installations.length === 0) throw new Error(ERROR_MESSAGES.NO_INSTALLATION);\n\n return { name: branding.name, installations };\n}\n","import React from \"react\";\nimport { z } from \"zod\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport {\n advisesOnPermissions,\n permissionFiles,\n providerInUse,\n} from \"./installation/install-layout.js\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema } from \"./schemas\";\n\ntype SettingsFile = z.infer<typeof settingsFileSchema>;\ntype PermissionConfig = NonNullable<SettingsFile[\"permissions\"]>;\n\n/** Undefined when absent, malformed or empty; silent about every other field (Claude Code's). */\nasync function readSettingsPermissions(filePath: string): Promise<PermissionConfig | undefined> {\n if (!(await fileExists(filePath))) return undefined;\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw: unknown = JSON.parse(content);\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? result.data : {};\n return parsed.permissions;\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n return undefined;\n }\n}\n\nfunction settingsFilesFor(projectRoot: string): string[] {\n return permissionFiles(providerInUse(projectRoot), \"project\", projectRoot);\n}\n\n/** Permissions from the highest-precedence settings file that defines them — the overlay wins. */\nasync function loadPermissions(files: readonly string[]): Promise<PermissionConfig | undefined> {\n for (const filePath of [...files].reverse()) {\n const permissions = await readSettingsPermissions(filePath);\n if (permissions) return permissions;\n }\n return undefined;\n}\n\n/** Relative to the project and POSIX-separated: a name shown to a person, not a path to open. */\nfunction asUserWritesIt(projectRoot: string, file: string): string {\n return path.relative(projectRoot, file).split(path.sep).join(\"/\");\n}\n\n/** `null` for a host whose permission model this release cannot advise on. */\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n if (!advisesOnPermissions(providerInUse(projectRoot))) return null;\n\n const files = settingsFilesFor(projectRoot);\n // The base file: the one this CLI writes and a user with neither is asked to create.\n const [base] = files;\n if (base === undefined) return null;\n\n const permissions = await loadPermissions(files);\n const settingsFile = asUserWritesIt(projectRoot, base);\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in {settingsFile}</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to {settingsFile}:</Text>\n <Text> </Text>\n <Text color={CLI_COLORS.DIM}>{\"{\"}</Text>\n <Text color={CLI_COLORS.DIM}>{' \"permissions\": {'}</Text>\n <Text color={CLI_COLORS.DIM}>{' \"allow\": ['}</Text>\n <Text color={CLI_COLORS.DIM}>{' \"Read(*)\",'}</Text>\n <Text color={CLI_COLORS.DIM}>{' \"Bash(git *)\",'}</Text>\n <Text color={CLI_COLORS.DIM}>{' \"Bash(bun *)\"'}</Text>\n <Text color={CLI_COLORS.DIM}>{\" ]\"}</Text>\n <Text color={CLI_COLORS.DIM}>{\" }\"}</Text>\n <Text color={CLI_COLORS.DIM}>{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ;AACf,OAAkB;AAElB,SAAS,aAA8B;AACvC,SAAS,OAAAA,MAAK,QAAAC,OAAM,cAAc;AAClC,SAAS,iBAAiB;;;ACL1B,OAAkB;AAClB,OAAkB;AAElB,SAAS,MAAM,WAAW;AAC1B,OAAO,UAAU;AA+DT,cAGA,YAHA;AA/CR,eAAe,wBAAwB,UAAyD;AAC9F,MAAI,CAAE,MAAM,WAAW,QAAQ,EAAI,QAAO;AAC1C,MAAI;AACF,UAAM,UAAU,MAAM,aAAa,UAAU,oBAAoB;AACjE,UAAM,MAAe,KAAK,MAAM,OAAO;AACvC,UAAM,SAAS,mBAAmB,UAAU,GAAG;AAC/C,UAAM,SAAuB,OAAO,UAAU,OAAO,OAAO,CAAC;AAC7D,WAAO,OAAO;AAAA,EAChB,QAAQ;AACN,SAAK,+BAA+B,QAAQ,mBAAc;AAC1D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,aAA+B;AACvD,SAAO,gBAAgB,cAAc,WAAW,GAAG,WAAW,WAAW;AAC3E;AAGA,eAAe,gBAAgB,OAAiE;AAC9F,aAAW,YAAY,CAAC,GAAG,KAAK,EAAE,QAAQ,GAAG;AAC3C,UAAM,cAAc,MAAM,wBAAwB,QAAQ;AAC1D,QAAI,YAAa,QAAO;AAAA,EAC1B;AACA,SAAO;AACT;AAGA,SAAS,eAAe,aAAqB,MAAsB;AACjE,SAAO,KAAK,SAAS,aAAa,IAAI,EAAE,MAAM,KAAK,GAAG,EAAE,KAAK,GAAG;AAClE;AAGA,eAAsB,iBAAiB,aAAyD;AAC9F,MAAI,CAAC,qBAAqB,cAAc,WAAW,CAAC,EAAG,QAAO;AAE9D,QAAM,QAAQ,iBAAiB,WAAW;AAE1C,QAAM,CAAC,IAAI,IAAI;AACf,MAAI,SAAS,OAAW,QAAO;AAE/B,QAAM,cAAc,MAAM,gBAAgB,KAAK;AAC/C,QAAM,eAAe,eAAe,aAAa,IAAI;AAErD,MAAI,CAAC,aAAa;AAChB,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,+BAEtC;AAAA,MACA,qBAAC,QAAK;AAAA;AAAA,QAA8B;AAAA,SAAa;AAAA,MACjD,oBAAC,QAAK,+DAAiD;AAAA,MACvD,oBAAC,QAAK,eAAC;AAAA,MACP,qBAAC,QAAK;AAAA;AAAA,QAAkC;AAAA,QAAa;AAAA,SAAC;AAAA,MACtD,oBAAC,QAAK,eAAC;AAAA,MACP,oBAAC,QAAK,OAAO,WAAW,KAAM,eAAI;AAAA,MAClC,oBAAC,QAAK,OAAO,WAAW,KAAM,gCAAqB;AAAA,MACnD,oBAAC,QAAK,OAAO,WAAW,KAAM,4BAAiB;AAAA,MAC/C,oBAAC,QAAK,OAAO,WAAW,KAAM,8BAAmB;AAAA,MACjD,oBAAC,QAAK,OAAO,WAAW,KAAM,kCAAuB;AAAA,MACrD,oBAAC,QAAK,OAAO,WAAW,KAAM,iCAAsB;AAAA,MACpD,oBAAC,QAAK,OAAO,WAAW,KAAM,mBAAQ;AAAA,MACtC,oBAAC,QAAK,OAAO,WAAW,KAAM,iBAAM;AAAA,MACpC,oBAAC,QAAK,OAAO,WAAW,KAAM,eAAI;AAAA,OACpC;AAAA,EAEJ;AAEA,QAAM,qBAAqB,YAAY,MAAM;AAAA,IAC3C,CAAC,SAAS,SAAS,aAAa,SAAS;AAAA,EAC3C;AACA,QAAM,cAAc,CAAC,YAAY,SAAS,YAAY,MAAM,WAAW;AAEvE,MAAI,sBAAsB,aAAa;AACrC,WACE,qBAAC,OAAI,eAAc,UAAS,aAAY,SAAQ,aAAa,WAAW,SAAS,SAAS,GACxF;AAAA,0BAAC,QAAK,MAAI,MAAC,OAAO,WAAW,SAAS,iCAEtC;AAAA,MACC,sBACC,oBAAC,QAAK,kHAGN;AAAA,MAED,eACC,oBAAC,QAAK,qFAAkE;AAAA,OAE5E;AAAA,EAEJ;AAEA,SAAO;AACT;;;AD2BmC,gBAAAC,MAa/B,QAAAC,aAb+B;AAbnC,IAAM,oBAAoB;AAAA,EACxB,EAAE,OAAO,0BAA0B,OAAO,OAAO;AAAA,EACjD,EAAE,OAAO,WAAW,OAAO,UAAU;AAAA,EACrC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,QAAQ,OAAO,OAAO;AACjC;AAEA,IAAM,yBAAyB,KAAK,kBAAkB,IAAI,CAAC,EAAE,MAAM,MAAM,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;AAKjG,IAAM,iBAA6C,CAAC,EAAE,KAAK,MACzD,SAAS,iBAAiB,OAAO,gBAAAD,KAACE,OAAA,EAAM,sBAAW,IAAU,gBAAAF,KAACE,OAAA,EAAK,MAAI,MAAE,gBAAK;AAQzE,IAAM,YAAsC,CAAC,EAAE,MAAM,UAAU,SAAS,MAAM;AACnF,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,EAAE,MAAM,eAAe,IAAI,sBAAsB;AAEvD,SACE,gBAAAD,MAACE,MAAA,EAAI,eAAc,UAAS,QAAQ,gBAClC;AAAA,oBAAAH,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAAC,kBAAe,MAAM,KAAK,MAAM,GACnC;AAAA,IACA,gBAAAA,KAACG,MAAA,EAAI,cAAc,GACjB,0BAAAH,KAACE,OAAA,EAAM,8BAAoB,IAAI,EAAE,KAAK,IAAI,GAAE,GAC9C;AAAA,IACA,gBAAAF;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,UAAU,CAAC,YAAY;AACrB,mBAAS,OAAO;AAChB,eAAK;AAAA,QACP;AAAA,QACA,UAAU,MAAM;AACd,mBAAS;AACT,eAAK;AAAA,QACP;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAMA,SAAS,oBAAoB,EAAE,cAAc,GAA4B;AACvE,QAAM,QAAQ,cAAc,SAAS;AACrC,QAAM,SAAS,cAAc,IAAI,CAAC,iBAAiB;AAAA,IACjD,GAAI,QAAQ,CAAC,mBAAmB,aAAa,QAAQ,EAAE,IAAI,CAAC;AAAA,IAC5D,GAAG,uBAAuB,YAAY;AAAA,EACxC,CAAC;AACD,SAAO,iBAAiB,MAAM;AAChC;AAEA,SAAS,iBAAiB,QAA8B;AACtD,SAAO,OAAO,QAAQ,CAAC,OAAO,UAAW,UAAU,IAAI,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAE;AAChF;AAEA,SAAS,uBAAuB,cAA8C;AAC5E,SAAO;AAAA,IACL,mBAAmB,aAAa,UAAU;AAAA,IAC1C,mBAAmB,aAAa,UAAU;AAAA,IAC1C,mBAAmB,oBAAoB,aAAa,IAAI,CAAC;AAAA,IACzD,GAAI,aAAa,cAAc,CAAC,mBAAmB,aAAa,WAAW,EAAE,IAAI,CAAC;AAAA,EACpF;AACF;AAEO,SAAS,oBAAoB,MAA6B;AAC/D,SAAO,CAAC,KAAK,MAAM,IAAI,GAAG,oBAAoB,IAAI,GAAG,IAAI,sBAAsB,EAAE,KAAK,IAAI;AAC5F;AAGA,IAAM,wBAAwB;AAI9B,eAAe,cACb,YACA,KAC0B;AAC1B,QAAM,OAAO,MAAM,iBAAiB,UAAU;AAE9C,MAAI,CAAC,QAAQ,MAAM,OAAO;AACxB,UAAM,SAAS,OAAO,QAAQ;AAC9B,WAAO,oBAAoB,IAAI,CAAC;AAChC,WAAO;AAAA,EACT;AAGA,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,YACC,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,UAAU,CAAC,YAAY,QAAQ,OAAO;AAAA,QACtC,UAAU,MAAM,QAAQ,IAAI;AAAA;AAAA,IAC9B;AAAA,IAEF,EAAE,QAAQ,uBAAuB,gBAAgB,KAAK;AAAA,EACxD;AAEA,sBAAoB;AAEpB,SAAO;AACT;AAEA,SAAS,qBAAqB,SAAqC;AACjE,SAAO,YAAY,SAAS,CAAC,MAAM,IAAI,CAAC;AAC1C;AAKA,eAAsB,iBACpB,YACA,QACA,KACwB;AACxB,QAAM,eAAe,MAAM,mBAAmB,UAAU;AACxD,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,kBAAkB,MAAM,cAAc,YAAY,GAAG;AAC3D,MAAI,oBAAoB,sBAAuB,QAAO;AACtD,MAAI,iBAAiB;AACnB,UAAM,OAAO,WAAW,iBAAiB,qBAAqB,eAAe,CAAC;AAAA,EAChF;AACA,SAAO;AACT;AAeA,SAAS,wBAAwB,OAAoB,SAAmC;AACtF,SAAO,EAAE,aAAa,MAAM,eAAe,QAAQ,YAAY;AACjE;AAEA,IAAqB,OAArB,MAAqB,cAAa,YAAY;AAAA;AAAA,EAEpC,eAAuB,iBAAiB;AAAA,EAEhD,OAAO,UAAU,cAAc,iBAAiB,IAAI;AAAA,EACpD,OAAO,cAAc,4BAA4B,cAAc;AAAA,EAE/D,OAAO,WAAW;AAAA,IAChB;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA;AAAA,MACE,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAEA,OAAO,QAAQ;AAAA,IACb,aAAa,MAAM,OAAO;AAAA,MACxB,MAAM;AAAA,MACN,aACE;AAAA,MACF,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,MAAM,MAAM,OAAO;AAAA,MACjB,aAAa;AAAA,MACb,WAAW;AAAA,IACb,CAAC;AAAA,IACD,IAAI,MAAM,QAAQ;AAAA,MAChB,aAAa,QAAQ,cAAc;AAAA,MACnC,SAAS;AAAA,IACX,CAAC;AAAA,IACD,UAAU,aAAa;AAAA,EACzB;AAAA;AAAA,EAGA,MAAM,MAAqB;AACzB,UAAM,KAAK,QAAQ;AACnB,SAAK,qBAAqB;AAAA,EAC5B;AAAA;AAAA,EAGA,MAAc,WACZ,YACA,UACA,IACA,aACe;AACf,UAAM,MAAM,OAAO,SAAY,aAAa,gBAAgB,EAAE;AAE9D,UAAM,kBACJ,gBAAgB,SAAY,SAAY,KAAK,yBAAyB,WAAW;AAEnF,UAAM,gBAAgB,MAAM,wBAAwB,UAAU;AAC9D,UAAM,SAAS,gBAAgB,MAAM,mBAAmB,YAAY,QAAQ,IAAI;AAEhF,SAAK,IAAI,OAAO,SAAY,eAAe,GAAG,KAAK,cAAc,GAAG,EAAE;AACtE,QAAI,oBAAoB,OAAW,MAAK,IAAI,eAAe;AAC3D,SAAK,IAAI,sBAAsB,IAAI,eAAe,MAAM,CAAC;AAEzD,QAAI,CAAC,QAAQ,MAAM,MAAO;AAE1B,UAAM,SAAS,MAAM,QAAQ,GAAG;AAChC,QAAI,CAAC,OAAO,GAAI,MAAK,KAAK,OAAO,KAAK;AAAA,EACxC;AAAA,EAEA,MAAc,UAAyB;AACrC,UAAM,EAAE,MAAM,IAAI,MAAM,KAAK,MAAM,KAAI;AACvC,UAAM,aAAa,QAAQ,IAAI;AAG/B,SAAK,4BAA4B,KAAK;AAGtC,QAAI,eAAe,KAAK,GAAG;AACzB,aAAO,KAAK;AAAA,QACV;AAAA,QACA,gBAAgB,MAAM,QAAQ;AAAA,QAC9B,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAGA,UAAM,KAAK,qBAAqB,UAAU;AAE1C,QAAI,MAAM,SAAS,OAAW,QAAO,KAAK,0BAA0B,UAAU;AAG9E,SAAK,eAAe,MAAM,KAAK,oBAAoB,UAAU;AAE7D,UAAM,YAAY,MAAM,KAAK,0BAA0B,MAAM,MAAM,OAAO,UAAU;AACpF,QAAI,CAAC,UAAW,MAAK,KAAK,WAAW,SAAS;AAE9C,SAAK,uBAAuB,UAAU,OAAO,UAAU;AAEvD,UAAM,KAAK,mBAAmB,WAAW,UAAU;AAAA,EACrD;AAAA,EAEA,MAAc,0BAA0B,YAAmC;AACzE,UAAM,YAAY,MAAM,iBAAiB,YAAY,KAAK,QAAQ,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC;AACxF,QAAI,cAAc,YAAa,MAAK,MAAM,aAAa,EAAE,MAAM,WAAW,UAAU,CAAC;AACrF,QAAI,cAAc,gBAAiB,OAAM,KAAK,WAAW,YAAY,MAAS;AAAA,EAChF;AAAA;AAAA,EAGQ,yBAAyB,KAAqB;AACpD,QAAI;AACF,8BAAwB,GAAG;AAC3B,aAAO,0BAA0B,KAAK,cAAc,GAAG,CAAC;AAAA,IAC1D,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA;AAAA,EAGQ,4BAA4B,OAA0D;AAC5F,UAAM,QAAQ,gBAAgB,MAAM,QAAQ;AAC5C,QAAI,UAAU,OAAW;AAEzB,QAAI,MAAM,SAAS,QAAW;AAC5B,WAAK,MAAM,qCAAqC,GAAG,EAAE,MAAM,WAAW,aAAa,CAAC;AAAA,IACtF;AAEA,6BAAyB,KAAK;AAAA,EAChC;AAAA;AAAA,EAGA,MAAc,0BACZ,IACA,OACA,YAC2B;AAC3B,UAAM,KAAK,uBAAuB,YAAY,EAAE;AAEhD,UAAM,UAAU,MAAM,KAAK,wBAAwB,EAAE;AACrD,UAAM,cAAc,wBAAwB,OAAO,OAAO;AAC1D,UAAM,EAAE,cAAc,gBAAgB,IAAI,MAAM,KAAK,iBAAiB,aAAa,UAAU;AAE7F,UAAM,gBAAgB,KAAK;AAAA,MACzB;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF;AACA,UAAM,UAAU,KAAK,iBAAiB,SAAS,aAAa,MAAM;AAClE,UAAM,EAAE,OAAO,IAAI;AAGnB,SAAK,iCAAiC,QAAQ,YAAY,KAAK;AAE/D,UAAM,kBAAkB,MAAM,sBAAsB,UAAU;AAC9D,UAAM,OAAO,oBAAoB,QAAQ,eAAe;AACxD,UAAM,kBAAkB,qBAAqB,eAAe,IAAI;AAGhE,UAAM,KAAK;AAAA,MACT,KAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,wBAAoB,eAAe;AACnC,SAAK,qBAAqB,OAAO;AACjC,SAAK,uBAAuB,KAAK,QAAQ,EAAE;AAE3C,UAAM,YAAY,MAAM,KAAK,YAAY,OAAO,iBAAiB,YAAY;AAC7E,SAAK,iBAAiB,MAAM,iBAAiB,WAAW;AAAA,MACtD,IAAI,eAAe,MAAM,IAAI,KAAK;AAAA,MAClC,UAAU,iBAAiB,GAAG,QAAQ,GAAG,cAAc,UAAU,CAAC;AAAA,IACpE,CAAC;AACD,QAAI,QAAQ,MAAM,SAAS,CAAE,MAAM,KAAK,eAAe,GAAI;AACzD,WAAK,IAAI,iBAAiB;AAC1B,aAAO;AAAA,IACT;AAGA,UAAM,KAAK,mBAAmB,eAAe;AAC7C,SAAK,uBAAuB,MAAM,OAAO,eAAe,MAAM;AAE9D,WAAO;AAAA,MACL,QAAQ,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA,kBAAkB,IAAI,IAAI,KAAK,UAAU,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBACN,MACA,iBACA,WACA,aACM;AACN,UAAM,SAAS,mBAAmB,MAAM,eAAe;AACvD,UAAM,QAAQ;AAAA,MACZ,aAAa,MAAM,iBAAiB,QAAQ,SAAS;AAAA,MACrD,OAAO,IAAI,eAAe;AAAA,MAC1B,CAAC,GAAG,gBAAgB,IAAI,GAAG,GAAG,yBAAyB,MAAM,WAAW,CAAC;AAAA,IAC3E;AACA,eAAW,QAAQ,OAAO;AACxB,WAAK,IAAI,IAAI;AAAA,IACf;AAAA,EACF;AAAA,EAEQ,uBAAuB,QAA0B,IAAkB;AACzE,QAAI,CAAC,eAAe,MAAM,EAAG;AAE7B,SAAK,MAAM,kBAAkB,EAAE,kDAAkD;AAAA,MAC/E,MAAM,WAAW;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,MAAkB,YAA0B;AACzE,UAAM,WAAW,qBAAqB,KAAK,OAAO,QAAQ,IAAI;AAC9D,QAAI,SAAS,WAAW,EAAG;AAE3B,SAAK,IAAI,cAAc,SAAS,MAAM,oBAAoB,UAAU;AAAA,CAAiB;AAAA,EACvF;AAAA,EAEA,MAAc,iBAAmC;AAC/C,UAAM,UAAU,MAAM,cAAc,CAAC,EAAE,WAAW,SAAS,MACzD,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC,SAAS,uBAAuB;AAAA,QAChC;AAAA,QACA;AAAA;AAAA,IACF,CACD;AACD,WAAO,YAAY;AAAA,EACrB;AAAA;AAAA,EAGA,MAAc,uBAAuB,YAAoB,IAA2B;AAClF,UAAM,eAAe,MAAM,0BAA0B,UAAU;AAC/D,QAAI,CAAC,aAAc;AAEnB,UAAM,WAAW,iBAAiB,YAAY,cAAc,UAAU,CAAC;AACvE,SAAK,MAAM,4BAA4B,aAAa,YAAY,IAAI,QAAQ,GAAG;AAAA,MAC7E,MAAM,WAAW;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,wBAAwB,IAAkC;AACtE,SAAK,IAAI,0BAA0B,EAAE,KAAK;AAC1C,UAAM,UAAU,MAAM,gBAAgB,EAAE;AACxC,QAAI,CAAC,QAAQ,IAAI;AACf,WAAK,MAAM,QAAQ,OAAO,EAAE,MAAM,WAAW,MAAM,CAAC;AAAA,IACtD;AACA,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,iBAAiB,SAAsB,QAAyC;AACtF,QAAI;AACF,aAAO,uBAAuB,SAAS,MAAM;AAAA,IAC/C,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEQ,6BACN,SACA,QACA,YACwB;AACxB,QAAI;AACF,aAAO,uBAAuB,SAAS,QAAQ,UAAU;AAAA,IAC3D,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,mBAAmB,SAAgD;AAC/E,QAAI,QAAQ,WAAW,EAAG;AAE1B,UAAM,oBAAoB,OAAO;AACjC,SAAK,IAAI,qBAAqB,QAAQ,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;AAAA,EACjE;AAAA,EAEA,MAAc,iBACZ,OACA,YACgF;AAChF,QAAI;AACF,YAAM,SAAS,MAAM,WAAW;AAAA;AAAA,QAE9B,QAAQ;AAAA,QACR,GAAI,MAAM,gBAAgB,UAAa,EAAE,YAAY,MAAM,YAAY;AAAA,QACvE;AAAA,QACA,wBAAwB;AAAA,MAC1B,CAAC;AACD,aAAO,EAAE,cAAc,OAAO,cAAc,iBAAiB,OAAO,gBAAgB;AAAA,IACtF,SAAS,OAAO;AACd,WAAK,MAAM,gBAAgB,KAAK,GAAG;AAAA,QACjC,MAAM,WAAW;AAAA,MACnB,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,mBACZ,EAAE,QAAQ,cAAc,aAAa,iBAAiB,GACtD,YACe;AACf,UAAM,OAAO,YAAY,QAAQ,gBAAgB;AACjD,SAAK,eAAe,IAAI;AAGxB,UAAM,sBAAsB,MAAM,KAAK;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,MACA;AAAA,IACF;AAEA,UAAM,aAAa,MAAM,KAAK,kBAAkB,MAAM,YAAY,YAAY;AAE9E,QAAI,wBAAwB,MAAM;AAChC,YAAM,KAAK;AAAA,QACT,KAAK;AAAA,QACL;AAAA,QACA;AAAA,QACA,aAAa;AAAA,MACf;AAAA,IACF;AAEA,QAAI;AACF,YAAM,UAAU,MAAM,KAAK;AAAA,QACzB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,WAAK,cAAc,SAAS,YAAY,UAAU;AAElD,YAAM,KAAK,qBAAqB,UAAU;AAAA,IAC5C,SAAS,OAAO;AACd,WAAK,YAAY,KAAK;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAc,2BACZ,cACA,cACA,YACwB;AACxB,QAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,MACA,OAAO,UAAU;AAAA,MACjB,CAAC,gBAAgB,KAAK,IAAI,4BAA4B,WAAW,MAAM;AAAA,IACzE;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,qBAAqB,YAAmC;AACpE,UAAM,oBAAoB,MAAM,iBAAiB,UAAU;AAC3D,QAAI,CAAC,kBAAmB;AAExB,UAAM,EAAE,QAAQ,IAAI,OAAO,iBAAiB;AAC5C,YAAQ;AAAA,EACV;AAAA,EAEQ,eAAe,MAAyB;AAC9C,SAAK,IAAI,IAAI;AACb,SAAK,IAAI,YAAY,OAAO,KAAK,cAAc,SAAS,KAAK,aAAa,QAAQ,OAAO,CAAC,EAAE;AAC5F,SAAK,IAAI,iBAAiB,uBAAuB,IAAI,CAAC,EAAE;AAAA,EAC1D;AAAA,EAEA,MAAc,kBACZ,EAAE,eAAe,YAAY,GAC7B,YACA,cACiC;AACjC,QAAI,cAAc,WAAW,EAAG,QAAO;AAEvC,SAAK,IAAI,sCAAsC;AAC/C,UAAM,aAAa,MAAM,gBAAgB,eAAe,YAAY,YAAY;AAChF,SAAK,IAAI,iBAAiB,YAAY,aAAa,UAAU,CAAC;AAC9D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,sBACZ,QACA,cACA,OACA,YACyB;AACzB,UAAM,eAAe,MAAM,KAAK,oBAAoB,QAAQ,cAAc,OAAO,UAAU;AAC3F,UAAM,gBAAgB,mBAAmB,aAAa,MAAM;AAC5D,UAAM,gBAAgB,MAAM,KAAK;AAAA,MAC/B,aAAa;AAAA,MACb;AAAA,MACA;AAAA,IACF;AACA,SAAK,kBAAkB,aAAa;AACpC,UAAM,KAAK,8BAA8B,UAAU;AAEnD,SAAK,aAAa,aAAa,WAAW;AAE1C,WAAO,EAAE,cAAc,eAAe,cAAc;AAAA,EACtD;AAAA,EAEA,MAAc,oBACZ,QACA,cACA,OACA,YAC4B;AAC5B,SAAK,IAAI,6BAA6B;AACtC,UAAM,eAAe,MAAM,mBAAmB;AAAA,MAC5C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA,GAAI,MAAM,gBAAgB,UAAa,EAAE,YAAY,MAAM,YAAY;AAAA,IACzE,CAAC;AAED,QAAI,aAAa,WAAW;AAC1B,WAAK,IAAI,kCAAkC,aAAa,kBAAkB,EAAE;AAAA,IAC9E;AAEA,SAAK,IAAI,wBAAwB,OAAO,aAAa,OAAO,OAAO,QAAQ,OAAO,CAAC;AAAA,CAAK;AACxF,SAAK,uBAAuB,aAAa,QAAQ,OAAO,MAAM;AAC9D,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,uBACZ,SACA,eACA,YAC4B;AAC5B,SAAK,IAAI,gBAAgB,gBAAgB;AAEzC,UAAM,YAAY,MAAM,cAAc;AACtC,UAAM,EAAE,UAAU,IAAI,MAAM,wBAAwB,UAAU;AAC9D,UAAM,UAAU,oBAAoB,YAAY,OAAO,IACnD,yBACA;AACJ,WAAO,QAAQ;AAAA,MACb;AAAA,MACA,YAAY,UAAU;AAAA,MACtB,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,8BAA8B,YAAmC;AAC7E,eAAW,UAAU,MAAM,mBAAmB,cAAc,UAAU,GAAG,UAAU,GAAG;AACpF,WAAK,IAAI,MAAM;AAAA,IACjB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,kBAAkB,eAAwC;AAChE,UAAM,EAAE,UAAU,QAAQ,SAAS,IAAI;AACvC,UAAM,UAAU,YAAY,OAAO,SAAS,QAAQ,OAAO,CAAC;AAE5D,QAAI,OAAO,WAAW,GAAG;AACvB,WAAK,IAAI,GAAG,OAAO;AAAA,CAAI;AACvB;AAAA,IACF;AAEA,SAAK,IAAI,GAAG,OAAO,KAAK,OAAO,MAAM;AAAA,CAAY;AACjD,eAAW,WAAW,UAAU;AAC9B,WAAK,KAAK,OAAO;AAAA,IACnB;AAEA,SAAK,qBAAqB,kBAAkB,MAAM,GAAG,yBAAyB,SAAS;AAAA,EACzF;AAAA,EAEQ,cACN,EAAE,cAAc,eAAe,cAAc,GAC7C,YACA,YACM;AAEN,QAAI,CAAC,KAAK,kBAAmB,MAAK,IAAI,GAAG,cAAc,KAAK,YAAY,CAAC;AAAA,CAAI;AAE7E,QAAI,eAAe,QAAQ,WAAW,cAAc,GAAG;AACrD,WAAK,mBAAmB,qBAAqB,mBAAmB,YAAY,UAAU,CAAC;AAAA,IACzF;AACA,SAAK;AAAA,MACH;AAAA,MACA,qBAAqB,YAAY,cAAc,UAAU,aAAa;AAAA,IACxE;AACA,SAAK,oBAAoB,cAAc,eAAe,UAAU;AAAA,EAClE;AAAA,EAEQ,oBACN,EAAE,YAAY,YAAY,GAC1B,eACA,YACM;AACN,UAAM,QAAQ;AAAA,MACZ,QAAQ,oBAAoB,YAAY,QAAQ,EAAE;AAAA,MAClD,SAAS;AAAA,IACX;AACA,UAAM,QAAQ,iBAAiB,YAAY,aAAa;AAExD,SAAK,IAAI,gBAAgB;AACzB,eAAW,WAAW,eAAe,YAAY,OAAO,YAAY,aAAa,GAAG;AAClF,WAAK,IAAI,KAAK,OAAO,EAAE;AAAA,IACzB;AACA,SAAK,IAAI,EAAE;AAEX,SAAK,IAAI,uCAAuC;AAChD,eAAW,CAAC,OAAO,IAAI,KAAK,mBAAmB,OAAO,MAAM,QAAQ,UAAU,EAAE,QAAQ,GAAG;AACzF,WAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,IACpC;AACA,SAAK,IAAI,EAAE;AAAA,EACb;AAAA,EAEQ,mBAAmB,SAAiB,QAAgC;AAC1E,eAAW,EAAE,KAAK,QAAQ,KAAK,QAAQ;AACrC,WAAK,IAAI,OAAO;AAChB,WAAK,IAAI,KAAK,GAAG,EAAE;AACnB,iBAAW,SAAS,SAAS;AAC3B,aAAK,IAAI,OAAO,KAAK,EAAE;AAAA,MACzB;AACA,WAAK,IAAI,EAAE;AAAA,IACb;AAAA,EACF;AACF;AAGA,SAAS,eACP,OACS;AACT,SAAO,MAAM,MAAO,MAAM,SAAS,UAAa,MAAM,gBAAgB;AACxE;AAGA,SAAS,eAAe,QAAmC;AACzD,SAAO,OAAO,OAAO,WAAW,KAAK,OAAO,eAAe,WAAW;AACxE;AAGA,eAAe,sBAAsB,YAAqD;AACxF,MAAI,gBAAgB,UAAU,EAAG,QAAO;AACxC,SAAO,MAAM,oBAAoB,UAAU;AAC7C;AAKA,SAAS,yBAAyB,MAAkB,aAAoC;AACtF,QAAM,EAAE,UAAU,WAAW,IAAI,KAAK;AACtC,MAAI,SAAS,WAAW,KAAK,WAAW,WAAW,EAAG,QAAO,CAAC;AAC9D,SAAO,CAAC,wBAAwB,UAAU,YAAY,YAAY,IAAI,YAAY,QAAQ,CAAC;AAC7F;AAKA,SAAS,gBAAgB,MAAkB,iBAAwD;AACjG,MAAI,oBAAoB,KAAM,QAAO,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE9D,QAAM,cAAc,IAAI,IAAI,KAAK,OAAO,OAAO,OAAO,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;AACnF,QAAM,cAAc,IAAI,IAAI,KAAK,OAAO,aAAa,OAAO,QAAQ,EAAE,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC;AAC7F,SAAO;AAAA,IACL,QAAQ,gBAAgB,OAAO,OAAO,CAAC,UAAU,SAAS,KAAK,KAAK,CAAC,YAAY,IAAI,MAAM,EAAE,CAAC;AAAA,IAC9F,QAAQ,gBAAgB,OAAO;AAAA,MAC7B,CAAC,UAAU,SAAS,KAAK,KAAK,CAAC,YAAY,IAAI,MAAM,IAAI;AAAA,IAC3D;AAAA,EACF;AACF;AAEA,SAAS,SAAS,OAAgD;AAChE,SAAO,WAAW,OAAO,QAAQ;AACnC;AAGA,SAAS,aACP,MACA,iBACA,QACA,WACmB;AACnB,QAAM,YAAY,gBAAgB,MAAM,eAAe;AACvD,SAAO;AAAA,IACL,cAAc,CAAC,GAAG,KAAK,OAAO,QAAQ,GAAG,UAAU,MAAM;AAAA,IACzD,cAAc,CAAC,GAAG,KAAK,OAAO,cAAc,GAAG,UAAU,MAAM;AAAA,IAC/D,uBAAuB,iBAAiB,UAAU;AAAA,IAClD,uBAAuB,iBAAiB,UAAU;AAAA,IAClD,YAAY;AAAA,IACZ,mBAAmB,IAAI,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,CAAC;AAAA,IACzD;AAAA,EACF;AACF;AAGA,SAAS,mBACP,MACA,iBACe;AACf,MAAI,oBAAoB,KAAM,QAAO,CAAC;AAEtC,SAAO;AAAA,IACL,KAAK,OAAO,IAAI,CAAC,EAAE,UAAU,MAAM,SAAS;AAAA,IAC5C;AAAA,IACA,EAAE,QAAQ,KAAK,OAAO,cAAc,OAAO,KAAK,OAAO,cAAc;AAAA,EACvE;AACF;AAQA,SAAS,YACP,QACA,kBACa;AACb,QAAM,YAAY,OAAO,OAAO;AAAA,IAC9B,CAAC,UAAU,CAAC,MAAM,YAAY,CAAC,iBAAiB,IAAI,MAAM,EAAE;AAAA,EAC9D;AACA,QAAM,CAAC,eAAe,YAAY,IAAI;AAAA,IACpC;AAAA,IACA,CAAC,UAAU,MAAM,WAAW;AAAA,EAC9B;AACA,SAAO,EAAE,aAAa,kBAAkB,SAAS,GAAG,eAAe,aAAa;AAClF;AAEA,SAAS,uBAAuB,EAAE,aAAa,eAAe,aAAa,GAAwB;AACjG,MAAI,gBAAgB,QAAS,QAAO,0BAA0B,WAAW;AACzE,SAAO,GAAG,oBAAoB,KAAK,KAAK,cAAc,MAAM,WAAW,aAAa,MAAM;AAC5F;AAYA,SAAS,oBAAoB,KAAa,SAA8B;AACtE,SAAO,gBAAgB,GAAG,KAAK,uBAAuB,OAAO;AAC/D;AAGA,SAAS,iBACP,YACA,aACA,YACQ;AACR,QAAM,UAAU,gBAAgB;AAChC,QAAM,SAAS,OAAO,WAAW,aAAa,UAAU,gBAAgB,OAAO;AAC/E,QAAM,UAAU,UAAU,KAAK;AAC/B,QAAM,eAAe,WAAW,cAAc;AAC9C,QAAM,cAAc,WAAW,aAAa;AAC5C,QAAM,qBAAqB,eAAe,KAAK,cAAc;AAE7D,MAAI,oBAAoB;AACtB,WAAO,UAAU,MAAM,KAAK,YAAY,aAAa,WAAW,WAAW,OAAO;AAAA,EACpF;AACA,QAAM,WAAuB,cAAc,IAAI,WAAW;AAC1D,SAAO,UAAU,MAAM,OAAO,oBAAoB,YAAY,QAAQ,EAAE,SAAS,IAAI,OAAO;AAC9F;AAKA,SAAS,WAAW,OAAgC;AAClD,SAAO,MAAM,QAAQ,SAAS;AAChC;AAGA,SAAS,eAAe,QAA4C;AAClE,QAAM,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,IAAI,CAAC,UAAU,MAAM,GAAG,CAAC,CAAC;AAC1D,SAAO,KAAK,IAAI,CAAC,SAAS;AAAA,IACxB;AAAA,IACA,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,QAAQ,GAAG,EAAE,QAAQ,CAAC,UAAU,MAAM,OAAO;AAAA,EACvF,EAAE;AACJ;AAEA,SAAS,mBAAmB,YAAoB,YAA+C;AAC7F,SAAO;AAAA,IACL;AAAA,MACE,kBAAkB,YAAY,UAAU,WAAW,YAAY;AAAA,MAC/D,kBAAkB,YAAY,WAAW,WAAW,aAAa;AAAA,IACnE,EAAE,OAAO,UAAU;AAAA,EACrB;AACF;AAEA,SAAS,kBACP,YACA,OACA,QACgB;AAChB,SAAO;AAAA,IACL,KAAK,oBAAoB,YAAY,KAAK,EAAE;AAAA,IAC5C,SAAS,OAAO,IAAI,CAAC,EAAE,QAAQ,MAAM,GAAG,OAAO,GAAG;AAAA,EACpD;AACF;AAGA,SAAS,qBACP,YACA,UACA,eACkB;AAClB,QAAM,CAAC,cAAc,aAAa,IAAI;AAAA,IACpC;AAAA,IACA,CAAC,SAAS,cAAc,IAAI,IAAI,MAAM;AAAA,EACxC;AACA,SAAO;AAAA,IACL;AAAA,MACE,oBAAoB,YAAY,UAAU,YAAY;AAAA,MACtD,oBAAoB,YAAY,WAAW,aAAa;AAAA,IAC1D,EAAE,OAAO,UAAU;AAAA,EACrB;AACF;AAGA,SAAS,oBACP,YACA,OACA,QACgB;AAChB,QAAM,EAAE,UAAU,IAAI,WAAW,cAAc,eAAe,YAAY,KAAK,CAAC,CAAC;AACjF,SAAO;AAAA,IACL,KAAK,oBAAoB,YAAY,KAAK,EAAE;AAAA,IAC5C,SAAS,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,EAAE;AAAA,EACrD;AACF;AAOA,SAAS,iBAAiB,KAAa,eAA4D;AACjG,MAAI,gBAAgB,GAAG,EAAG,QAAO,EAAE,kBAAkB,GAAG,cAAc,MAAM;AAE5E,QAAM,SAAS,CAAC,GAAG,cAAc,OAAO,CAAC;AACzC,QAAM,mBAAmB,OAAO,OAAO,CAAC,UAAU,UAAU,QAAQ,EAAE;AACtE,SAAO;AAAA,IACL;AAAA,IACA,cAAc,mBAAmB,KAAK,qBAAqB,OAAO;AAAA,EACpE;AACF;AAMA,SAAS,eAAe,YAAoB,OAAoB,eAAkC;AAChG,MAAI,gBAAgB,UAAU,EAAG,QAAO,CAAC,MAAM,OAAO;AACtD,SAAO,gBAAgB,CAAC,MAAM,QAAQ,MAAM,OAAO,IAAI,CAAC,MAAM,OAAO;AACvE;AAGA,SAAS,mBACP,OACA,kBACA,YACU;AACV,MAAI,MAAM,cAAc;AACtB,WAAO,CAAC,QAAQ,gBAAgB,IAAI,uBAAuB,MAAM,gBAAgB,CAAC;AAAA,EACpF;AAEA,SAAO;AAAA,IACL,QAAQ,mBAAmB,YAAY,cAAc,UAAU,CAAC,CAAC;AAAA,IACjE,QAAQ,kBAAkB;AAAA,IAC1B,GAAI,MAAM,mBAAmB,IAAI,CAAC,uBAAuB,MAAM,gBAAgB,CAAC,IAAI,CAAC;AAAA,EACvF;AACF;AAQA,eAAe,iBAAiB,YAA4C;AAE1E,QAAM,CAAC,eAAe,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,IAClD,2BAA2B,UAAU;AAAA,IACrC,gBAAgB,UAAU;AAAA,EAC5B,CAAC;AAED,MAAI,cAAc,WAAW,EAAG,OAAM,IAAI,MAAM,eAAe,eAAe;AAE9E,SAAO,EAAE,MAAM,SAAS,MAAM,cAAc;AAC9C;","names":["Box","Text","jsx","jsxs","Text","Box"]}
|
|
@@ -1 +0,0 @@
|
|
|
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 if (rhs.kind === \"sectioned\") {\n return `${head}\\n${renderSectionedUnion(rhs.custom, rhs.marketplace)}`\n }\n\n const layout = unionLayout(rhs.members, {\n headWidth: head.length + \" \".length,\n tailWidth: 0,\n bodyIndent: INDENT_STEP,\n })\n\n return layout === \"inline\"\n ? `${head} ${flatUnion(rhs.members)}`\n : `${head}\\n${renderUnionBody(rhs.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 | { kind: \"deregister-project\"; projectDir: string }\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/** 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 // The full loader normalizes the stack; re-emitting bare values drops exclusive categories.\n const provider = providerInUse(homeDir);\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 { 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\n/** The four fields the config writer extracts into typed named variables. */\nconst EXTRACTED_FIELDS = new Set([\"skills\", \"agents\", \"stack\", \"selectedDomains\"]);\n\n/** The registration list — bookkeeping, never emitted into a project config. */\nconst REGISTRATION_FIELD = \"projects\";\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 = new Set([\"stack\", \"selectedDomains\"]);\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 !EXTRACTED_FIELDS.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\nexport function tierNeedsDeps(tier: ConsequenceTier): boolean {\n return tier === \"T1\" || tier === \"T2\";\n}\n\nexport function tierRegeneratesTypes(tier: ConsequenceTier): boolean {\n return tier === \"T1\";\n}\n\nexport function tierPropagates(tier: ConsequenceTier): boolean {\n return tier === \"T1\" || tier === \"T2\";\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"]}
|