agents-inc 0.174.0 → 0.176.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/dist/{chunk-APWMMZOK.js → chunk-3F5LT433.js} +157 -53
  3. package/dist/chunk-3F5LT433.js.map +1 -0
  4. package/dist/chunk-5CFHP6Z5.js +109 -0
  5. package/dist/chunk-5CFHP6Z5.js.map +1 -0
  6. package/dist/{chunk-3PJZ4QNJ.js → chunk-B7AVWSK2.js} +21 -11
  7. package/dist/chunk-B7AVWSK2.js.map +1 -0
  8. package/dist/{chunk-H5E6IO2L.js → chunk-C2BSCEDN.js} +9 -11
  9. package/dist/chunk-C2BSCEDN.js.map +1 -0
  10. package/dist/{chunk-R7GKQBZJ.js → chunk-CKBWEWHZ.js} +96 -52
  11. package/dist/chunk-CKBWEWHZ.js.map +1 -0
  12. package/dist/{chunk-IXVGBUWI.js → chunk-EC3JXT23.js} +5 -5
  13. package/dist/{chunk-E45IT3HC.js → chunk-ENET4IF6.js} +998 -472
  14. package/dist/chunk-ENET4IF6.js.map +1 -0
  15. package/dist/{chunk-FQF6VHO3.js → chunk-FACDJH6O.js} +12 -105
  16. package/dist/chunk-FACDJH6O.js.map +1 -0
  17. package/dist/{chunk-TVEDNGVP.js → chunk-H6WUOW5F.js} +2 -2
  18. package/dist/{chunk-7BHDKEGK.js → chunk-JNRACLNS.js} +3 -3
  19. package/dist/{chunk-IAQFZFWD.js → chunk-JTMSFBCA.js} +231 -24
  20. package/dist/chunk-JTMSFBCA.js.map +1 -0
  21. package/dist/{chunk-EFXVYQGT.js → chunk-MQZNDK5F.js} +39 -40
  22. package/dist/chunk-MQZNDK5F.js.map +1 -0
  23. package/dist/{chunk-QCX66KBM.js → chunk-SN64WNWE.js} +3 -3
  24. package/dist/{chunk-WUSEZFER.js → chunk-U46LYYRA.js} +3 -2
  25. package/dist/{chunk-WUSEZFER.js.map → chunk-U46LYYRA.js.map} +1 -1
  26. package/dist/{chunk-6PGXTLA4.js → chunk-U672FZVC.js} +2 -2
  27. package/dist/{chunk-AIBVAYHS.js → chunk-UE4Z3YMB.js} +2 -2
  28. package/dist/chunk-UE4Z3YMB.js.map +1 -0
  29. package/dist/{chunk-REHVGFJE.js → chunk-XMQIWPIR.js} +84 -32
  30. package/dist/chunk-XMQIWPIR.js.map +1 -0
  31. package/dist/{chunk-I3WF6L43.js → chunk-XYBHH3M5.js} +2 -2
  32. package/dist/{chunk-ECPFYHDX.js → chunk-ZBI6GFJD.js} +11 -11
  33. package/dist/chunk-ZBI6GFJD.js.map +1 -0
  34. package/dist/commands/build/marketplace.js +5 -4
  35. package/dist/commands/build/marketplace.js.map +1 -1
  36. package/dist/commands/build/plugins.js +7 -6
  37. package/dist/commands/build/plugins.js.map +1 -1
  38. package/dist/commands/compile.js +20 -16
  39. package/dist/commands/compile.js.map +1 -1
  40. package/dist/commands/doctor.js +106 -87
  41. package/dist/commands/doctor.js.map +1 -1
  42. package/dist/commands/edit.js +76 -48
  43. package/dist/commands/edit.js.map +1 -1
  44. package/dist/commands/eject.js +31 -18
  45. package/dist/commands/eject.js.map +1 -1
  46. package/dist/commands/init.js +17 -17
  47. package/dist/commands/list.js +10 -9
  48. package/dist/commands/list.js.map +1 -1
  49. package/dist/commands/new/marketplace.js +5 -4
  50. package/dist/commands/new/marketplace.js.map +1 -1
  51. package/dist/commands/search.js +14 -9
  52. package/dist/commands/search.js.map +1 -1
  53. package/dist/commands/share.js +20 -22
  54. package/dist/commands/share.js.map +1 -1
  55. package/dist/commands/uninstall.js +24 -19
  56. package/dist/commands/uninstall.js.map +1 -1
  57. package/dist/commands/update.js +110 -31
  58. package/dist/commands/update.js.map +1 -1
  59. package/dist/components/common/select-list.js +2 -2
  60. package/dist/components/common/skill-agent-summary.js +4 -3
  61. package/dist/components/common/summary-panel.js +5 -4
  62. package/dist/hooks/init.js +24 -25
  63. package/dist/hooks/init.js.map +1 -1
  64. package/dist/load-agent-defs-5BSECHE6.js +14 -0
  65. package/dist/{recompile-project-agents-KYK44C24.js → recompile-project-agents-U3UGHPWG.js} +8 -8
  66. package/dist/{source-loader-G5I4RNUP.js → source-loader-E2Y5MMN5.js} +4 -4
  67. package/package.json +1 -1
  68. package/dist/chunk-3PJZ4QNJ.js.map +0 -1
  69. package/dist/chunk-AIBVAYHS.js.map +0 -1
  70. package/dist/chunk-APWMMZOK.js.map +0 -1
  71. package/dist/chunk-E45IT3HC.js.map +0 -1
  72. package/dist/chunk-ECPFYHDX.js.map +0 -1
  73. package/dist/chunk-EFXVYQGT.js.map +0 -1
  74. package/dist/chunk-FQF6VHO3.js.map +0 -1
  75. package/dist/chunk-H5E6IO2L.js.map +0 -1
  76. package/dist/chunk-IAQFZFWD.js.map +0 -1
  77. package/dist/chunk-ORO2T4K2.js +0 -96
  78. package/dist/chunk-ORO2T4K2.js.map +0 -1
  79. package/dist/chunk-R7GKQBZJ.js.map +0 -1
  80. package/dist/chunk-REHVGFJE.js.map +0 -1
  81. package/dist/load-agent-defs-5U5KAURA.js +0 -14
  82. /package/dist/{chunk-IXVGBUWI.js.map → chunk-EC3JXT23.js.map} +0 -0
  83. /package/dist/{chunk-TVEDNGVP.js.map → chunk-H6WUOW5F.js.map} +0 -0
  84. /package/dist/{chunk-7BHDKEGK.js.map → chunk-JNRACLNS.js.map} +0 -0
  85. /package/dist/{chunk-QCX66KBM.js.map → chunk-SN64WNWE.js.map} +0 -0
  86. /package/dist/{chunk-6PGXTLA4.js.map → chunk-U672FZVC.js.map} +0 -0
  87. /package/dist/{chunk-I3WF6L43.js.map → chunk-XYBHH3M5.js.map} +0 -0
  88. /package/dist/{load-agent-defs-5U5KAURA.js.map → load-agent-defs-5BSECHE6.js.map} +0 -0
  89. /package/dist/{recompile-project-agents-KYK44C24.js.map → recompile-project-agents-U3UGHPWG.js.map} +0 -0
  90. /package/dist/{source-loader-G5I4RNUP.js.map → source-loader-E2Y5MMN5.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/utils/terminal.ts","../src/cli/lib/exit-codes.ts","../src/cli/lib/installation/provider-flag.ts","../src/cli/lib/seed/external-skills.ts","../../compile/src/carried-skill.ts","../src/cli/lib/seed/seed-apply.ts","../src/cli/base-command.ts","../src/cli/lib/operations/source/ensure-marketplace.ts","../src/cli/lib/operations/source/require-marketplace.ts","../src/cli/lib/operations/skills/install-plugin-skills.ts"],"sourcesContent":["import { MIN_TERMINAL_SIZE } from \"../consts.js\";\n\n/** Clears screen and scrollback. */\nexport function clearTerminalScreen(): void {\n process.stdout.write(\"\\x1b[H\\x1b[2J\\x1b[3J\");\n}\n\nexport function isTerminalLargeEnough(columns: number, rows: number): boolean {\n return columns >= MIN_TERMINAL_SIZE.COLS && rows >= MIN_TERMINAL_SIZE.ROWS;\n}\n\n/**\n * E2E `STEP_TEXT.TOO_NARROW` / `TOO_SHORT` key off this text. Precondition: the terminal is too\n * small; width is reported first, so not-too-narrow means too-short.\n */\nexport function formatTerminalTooSmallMessage(columns: number): string {\n const issue =\n columns < MIN_TERMINAL_SIZE.COLS\n ? `too narrow (need ${MIN_TERMINAL_SIZE.COLS})`\n : `too short (need ${MIN_TERMINAL_SIZE.ROWS})`;\n return `Terminal ${issue}. Please resize.`;\n}\n","export const EXIT_CODES = {\n SUCCESS: 0,\n ERROR: 1,\n INVALID_ARGS: 2,\n NETWORK_ERROR: 3,\n CANCELLED: 4,\n /**\n * Ran to the end but part of the work failed. Unlike ERROR the work landed, so repeating the run\n * is wrong; the output names the remedy. Raised at the end of a command, never mid-flight.\n */\n COMPLETED_WITH_FAILURES: 5,\n} as const;\n","/**\n * `--provider`: names the installation where the folder cannot — a greenfield `init --from`, or a\n * scope holding both providers, where acting commands refuse until it is given.\n */\n\nimport os from \"os\";\n\nimport { Flags } from \"@oclif/core\";\n\nimport { PROVIDERS, EDITOR_URL, CLI_INVOKE_COMMAND, type Provider } from \"../../consts.js\";\nimport { ConfigLoadError, configDeclaresNothing } from \"../configuration/project-config.js\";\nimport {\n detectInstallations,\n holdsAConfigDeclaringNothing,\n type DetectedInstallation,\n} from \"./detect-installations.js\";\nimport { chooseProviderForThisRun, providerInUse } from \"./install-layout.js\";\n\n/** A factory because oclif mutates flag definitions, so commands must not share one. */\nexport function providerFlag() {\n return Flags.string({\n description: \"Which provider's installation this run is about\",\n helpValue: `<${PROVIDERS.join(\"|\")}>`,\n options: [...PROVIDERS],\n });\n}\n\n/** oclif has already rejected unlisted values; this only narrows. */\nexport function providerNamedBy(flagValue: string | undefined): Provider | undefined {\n if (flagValue === undefined) return undefined;\n return PROVIDERS.find((provider) => provider === flagValue);\n}\n\nconst PROVIDER_FLAG = \"--provider\";\nconst PROVIDER_FLAG_WITH_ITS_VALUE = `${PROVIDER_FLAG}=`;\nconst END_OF_FLAGS = \"--\";\n\n/**\n * For a run oclif has not parsed yet: `--provider <name>` or `--provider=<name>`, ahead of any\n * `--`; a value naming no provider names none.\n */\nexport function providerNamedIn(argv: readonly string[]): Provider | undefined {\n const end = argv.indexOf(END_OF_FLAGS);\n const flags = end === -1 ? argv : argv.slice(0, end);\n\n const spaced = flags.indexOf(PROVIDER_FLAG);\n if (spaced !== -1) return providerNamedBy(flags[spaced + 1]);\n\n const joined = flags.find((token) => token.startsWith(PROVIDER_FLAG_WITH_ITS_VALUE));\n return providerNamedBy(joined?.slice(PROVIDER_FLAG_WITH_ITS_VALUE.length));\n}\n\nexport function providerNeedsAConfigurationToInstall(): string {\n return (\n `--provider names which installation to create and needs the configuration to create it ` +\n `from, so it is only meaningful beside --from. Build one at ${EDITOR_URL}, then run ` +\n `'${CLI_INVOKE_COMMAND} init --from <id> --provider <provider>'.`\n );\n}\n\nfunction ambiguousInstallation(\n subject: string,\n providers: readonly Provider[],\n scopeRoot: string,\n): string {\n return (\n `${scopeRoot} holds ${providers.length} installations — ${providers.join(\" and \")} — so ` +\n `${subject} cannot tell which one you mean. Name it with --provider <${providers.join(\"|\")}>. ` +\n `Nothing has been changed.`\n );\n}\n\ntype InstallationsInPlay = {\n scopeRoot: string;\n providers: Provider[];\n};\n\n/** The project's installations, or the global ones only when the project has none. */\nasync function installationsInPlay(cwd: string): Promise<InstallationsInPlay> {\n const found = await detectInstallations(cwd);\n const inTheProject = atScope(found, \"project\");\n\n if (inTheProject.length > 0) return { scopeRoot: cwd, providers: providersOf(inTheProject) };\n return { scopeRoot: os.homedir(), providers: providersOf(atScope(found, \"global\")) };\n}\n\nfunction atScope(\n found: readonly DetectedInstallation[],\n scope: DetectedInstallation[\"scope\"],\n): DetectedInstallation[] {\n return found.filter((installation) => installation.scope === scope);\n}\n\nfunction providersOf(installations: readonly DetectedInstallation[]): Provider[] {\n return installations.map((installation) => installation.provider);\n}\n\n/**\n * A named provider is committed for the run; two installations and no flag call `onAmbiguous`\n * (the command's `this.error`); otherwise nothing happens.\n */\nexport async function refuseAnAmbiguousInstallation(\n cwd: string,\n subject: string,\n named: Provider | undefined,\n onAmbiguous: (message: string) => never,\n): Promise<void> {\n if (named !== undefined) {\n chooseProviderForThisRun(named);\n return;\n }\n\n const { scopeRoot, providers } = await installationsInPlay(cwd);\n if (providers.length <= 1) return;\n\n onAmbiguous(ambiguousInstallation(subject, providers, scopeRoot));\n}\n\n/**\n * A project config declaring nothing, with no installation of the project's own beside it: a run\n * here has no project installation to work on, which it says first.\n */\nexport async function holdsOnlyAConfigDeclaringNothing(cwd: string): Promise<boolean> {\n if (!(await holdsAConfigDeclaringNothing(cwd))) return false;\n\n return atScope(await detectInstallations(cwd), \"project\").length === 0;\n}\n\n/**\n * Whether HOME holds an installation a run could work on: the one `named`, else any. A config there\n * declaring nothing is none, as the commands' own read holds, though the roster counts it.\n */\nexport async function homeHoldsAnInstallationFor(\n cwd: string,\n named: Provider | undefined,\n): Promise<boolean> {\n const atHome = providersOf(atScope(await detectInstallations(cwd), \"global\")).filter(\n (provider) => named === undefined || provider === named,\n );\n const declaringContent = await Promise.all(atHome.map(homeConfigDeclaresContent));\n return declaringContent.includes(true);\n}\n\n/** Degrades: a config that cannot be loaded counts, and the command's own read reports it. */\nasync function homeConfigDeclaresContent(provider: Provider): Promise<boolean> {\n try {\n return !(await configDeclaresNothing(os.homedir(), provider));\n } catch (error) {\n if (error instanceof ConfigLoadError) return true;\n throw error;\n }\n}\n\n/** The non-refusing read the remedies hand a command out from, so they and the refusal agree. */\nexport async function providersInPlay(cwd: string): Promise<Provider[]> {\n return (await installationsInPlay(cwd)).providers;\n}\n\n/**\n * Which installation a handed-out acting command must name: the one the run named, else the choice\n * where two are in play, since a bare one refuses there.\n */\nexport async function installationToName(\n cwd: string,\n named: Provider | undefined,\n): Promise<Provider | Provider[] | undefined> {\n if (named !== undefined) return named;\n\n const providers = await providersInPlay(cwd);\n return providers.length > 1 ? providers : undefined;\n}\n\n/** The non-refusing form, for `doctor`. */\nexport async function ambiguityFinding(cwd: string): Promise<string | null> {\n const { scopeRoot, providers } = await installationsInPlay(cwd);\n if (providers.length <= 1) return null;\n\n return ambiguousInstallation(\"every command that acts on one\", providers, scopeRoot);\n}\n\n/**\n * For `list`: names the other installation in the scope, or `null` when there is none. The one\n * shown is read off the scope the roster came from, as `detectInstallation` reads it.\n */\nexport async function otherInstallationsInThisScope(cwd: string): Promise<string | null> {\n const { scopeRoot, providers } = await installationsInPlay(cwd);\n const showing = providerInUse(scopeRoot);\n const others = providers.filter((provider) => provider !== showing);\n if (others.length === 0) return null;\n\n return (\n `${scopeRoot} holds ${providers.length} installations — ${providers.join(\" and \")} — and this ` +\n `is the ${showing} one. Show another with --provider <${providers.join(\"|\")}>.`\n );\n}\n","import os from \"os\";\nimport path from \"path\";\nimport { mkdtemp } from \"fs/promises\";\n\nimport { externalIdsNamingNoDirectory, seedExternalSkillSchema } from \"@workspace/matrix/seed\";\nimport { carriedSkillAuthor, installedSkillTree } from \"@workspace/compile/carried-skill\";\n\nimport { GITHUB_SOURCE, LOCAL_SKILLS_PATH, STANDARD_FILES } from \"../../consts.js\";\nimport { resolveInstallPaths } from \"../installation/install-base-dir.js\";\nimport { parseFrontmatter, readSkillMetadata } from \"../loading/loader.js\";\nimport { getCategoryDomain } from \"../matrix/matrix-provider.js\";\nimport { claimSlug } from \"../matrix/skill-resolution.js\";\nimport { validateSkillPath } from \"../skills/skill-copier.js\";\nimport { readForkedFromMetadata } from \"../skills/skill-metadata.js\";\nimport { defaultUsageGuidance } from \"../stacks/stacks-loader.js\";\nimport { BUILT_IN_MATRIX } from \"../../types/generated/matrix.js\";\nimport { getCurrentDate } from \"../versioning.js\";\nimport {\n copy,\n directoryExists,\n fileExists,\n glob,\n readFile,\n remove,\n writeFile,\n} from \"../../utils/fs.js\";\nimport { typedEntries, typedKeys } from \"../../utils/typed-object.js\";\n\nimport type { SkillScope } from \"../../types/config.js\";\nimport type { Domain, MergedSkillsMatrix, ResolvedSkill } from \"../../types/matrix.js\";\nimport type { CategoryPath, SkillId, SkillSlug } from \"../../types/skills.js\";\nimport type { ForkedFromMetadata } from \"../skills/skill-metadata.js\";\nimport type {\n SeedExternalSkill,\n SeedPayload,\n SeedSkill,\n SeedSkillTree,\n} from \"@workspace/matrix/seed\";\n\n/** One skill the payload carries rather than names, seated and ready to be written. */\nexport type ExternalSkillInstall = {\n id: SkillId;\n scope: SkillScope;\n skill: SeedExternalSkill;\n domain: Domain;\n skillDir: string;\n};\n\ntype SelectedExternal = { id: SkillId; skill: SeedExternalSkill; entry: SeedSkill };\n\n/** No marketplace serves a carried skill, and coercing it to eject would defy the payload. */\nfunction pluginInstallError(ids: SkillId[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it, so no marketplace \" +\n \"serves them and they cannot be installed as plugins:\",\n ...ids.map((id) => ` ${id}`),\n \"Re-share it with each skill above set to eject, which is the only way a carried skill installs.\",\n ].join(\"\\n\");\n}\n\n/** Presence in `skills` is selection; `external` content nobody picked installs nothing. */\nfunction selectedExternals(payload: SeedPayload): SelectedExternal[] {\n return typedEntries<SkillId, SeedExternalSkill>(payload.external ?? {}).flatMap(([id, skill]) => {\n const entry = payload.skills[id];\n return entry ? [{ id, skill, entry }] : [];\n });\n}\n\nfunction askedForAsPlugin(externals: SelectedExternal[]): SkillId[] {\n return externals.filter(({ entry }) => entry.install !== \"eject\").map(({ id }) => id);\n}\n\n/**\n * A carried skill on a catalogue id would overwrite that catalogue's copy. The prefix cannot rule\n * that out: only `build marketplace` holds a marketplace to its namespace, and it exempts the\n * public catalogue. Checks the shipped catalogue too, since the payload chooses which one loads.\n */\nfunction claimingACatalogueId(\n externals: SelectedExternal[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n return externals.filter(({ id }) => heldByEitherCatalogue(id, matrix)).map(({ id }) => id);\n}\n\nconst CATALOGUE_SKILL_IDS: ReadonlySet<SkillId> = new Set(typedKeys(BUILT_IN_MATRIX.skills));\n\nfunction heldByEitherCatalogue(id: SkillId, matrix: MergedSkillsMatrix): boolean {\n return heldByLoadedCatalogue(matrix.skills[id]) || CATALOGUE_SKILL_IDS.has(id);\n}\n\n/**\n * A `local` incumbent is exempt so a re-apply works; whether its directory may be overwritten is\n * settled on disk by {@link refuseUncarriedDestinations}.\n */\nfunction heldByLoadedCatalogue(incumbent: ResolvedSkill | undefined): boolean {\n return incumbent !== undefined && incumbent.local !== true;\n}\n\nfunction catalogueIdCollisionError(ids: SkillId[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids a \" +\n \"catalogue already owns:\",\n ...ids.map((id) => ` ${id}`),\n \"A skill id is the directory the skill installs into, so each would be written over the \" +\n \"catalogue's own copy of that skill. Re-share it with each skill above added again, which \" +\n \"mints an id — 'external-<category>-<name>' — that no catalogue owns.\",\n ].join(\"\\n\");\n}\n\n/** Boundary cast: a carried skill's id is in no generated union, and is its own slug. */\nfunction externalSlug(id: SkillId): SkillSlug {\n return id as SkillSlug;\n}\n\nfunction externalSkillDir(id: SkillId, scope: SkillScope, projectDir: string): string {\n return path.join(resolveInstallPaths(projectDir, scope).skillsDir, id);\n}\n\nfunction externalCatalogueEntry(install: ExternalSkillInstall): ResolvedSkill {\n return {\n id: install.id,\n slug: externalSlug(install.id),\n displayName: install.skill.displayName,\n description: install.skill.description,\n // Boundary cast: seatExternalSkill has confirmed this catalogue declares the category.\n category: install.skill.categoryId as CategoryPath,\n author: carriedSkillAuthor(install.skill.repo),\n path: `${LOCAL_SKILLS_PATH}/${install.id}/`,\n conflictsWith: [],\n requires: [],\n alternatives: [],\n discourages: [],\n local: true,\n custom: true,\n localPath: install.skillDir,\n };\n}\n\n/** An unknown category leaves the skill unseated, so the decode skips and reports it. */\nfunction seatExternalSkill(\n { id, skill, entry }: SelectedExternal,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): ExternalSkillInstall[] {\n const domain = getCategoryDomain(skill.categoryId);\n if (domain === undefined) return [];\n\n const install: ExternalSkillInstall = {\n id,\n skill,\n domain,\n scope: entry.scope,\n skillDir: externalSkillDir(id, entry.scope, projectDir),\n };\n\n matrix.skills[id] = externalCatalogueEntry(install);\n claimSlug(matrix.slugMap, externalSlug(id), id);\n\n return [install];\n}\n\n/** Quoted, so an empty id prints as something and an escape is spelled out rather than sent. */\nfunction notADirectoryNameError(ids: string[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids that are \" +\n \"not a single directory name:\",\n ...ids.map((id) => ` ${JSON.stringify(id)}`),\n \"A skill id is the directory the skill is written into, so an id holding a path separator, \" +\n \"or naming '.' or '..', would be written somewhere other than a directory of its own, \" +\n \"and one holding a control character would hand it to the terminal wherever that \" +\n \"directory is named. Re-share it with each skill above added again, which mints an id — \" +\n \"'external-<category>-<name>' — that names one directory.\",\n ].join(\"\\n\");\n}\n\n/** ext4's `NAME_MAX`, in UTF-8 bytes; a name within it fits Windows' 255 UTF-16 units too. */\nconst DIRECTORY_NAME_MAX_BYTES = 255;\n\nfunction overrunsADirectoryName(id: string): boolean {\n return Buffer.byteLength(id, \"utf8\") > DIRECTORY_NAME_MAX_BYTES;\n}\n\nfunction externalIdsTooLongForADirectory(payload: SeedPayload): string[] {\n return Object.keys(payload.external ?? {}).filter(overrunsADirectoryName);\n}\n\nfunction tooLongForADirectoryError(ids: string[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids longer \" +\n \"than a directory name may be:\",\n ...ids.map((id) => ` ${JSON.stringify(id)}`),\n \"A skill id is the directory the skill is written into, and a directory name may hold at \" +\n `most ${String(DIRECTORY_NAME_MAX_BYTES)} bytes, so none of these could be written. ` +\n \"Re-share it without each skill above.\",\n ].join(\"\\n\");\n}\n\n/** `external` is a reserved marketplace name, so this prefix is no marketplace's namespace. */\nconst CARRIED_ID_PREFIX = \"external-\";\n\nfunction externalIdsLackingThePrefix(payload: SeedPayload): string[] {\n return Object.keys(payload.external ?? {}).filter((id) => !id.startsWith(CARRIED_ID_PREFIX));\n}\n\n/** Unquoted: the directory-name check has already refused every id holding a control character. */\nfunction lacksThePrefixError(ids: string[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids that do \" +\n \"not start with 'external-':\",\n ...ids.map((id) => ` ${id}`),\n \"A skill id is the directory the skill installs into, and no marketplace may publish under \" +\n \"the name 'external', so an id starting 'external-' is the only kind that can never take \" +\n \"the place of a marketplace's skill. Re-share it with each skill above added again, which \" +\n \"mints such an id — 'external-<category>-<name>'.\",\n ].join(\"\\n\");\n}\n\n/**\n * Writes carried skills into `matrix` in place so the decode can resolve them. Every refusal runs\n * before anything is seated, so a refused run leaves the matrix untouched. The id is checked first:\n * every path a carried skill is written to, scratch copies included, is joined from it.\n */\nexport function registerExternalSkills(\n payload: SeedPayload,\n matrix: MergedSkillsMatrix,\n projectDir: string,\n): ExternalSkillInstall[] {\n const notDirectoryNames = externalIdsNamingNoDirectory(payload);\n if (notDirectoryNames.length > 0) throw new Error(notADirectoryNameError(notDirectoryNames));\n\n const tooLong = externalIdsTooLongForADirectory(payload);\n if (tooLong.length > 0) throw new Error(tooLongForADirectoryError(tooLong));\n\n const unprefixed = externalIdsLackingThePrefix(payload);\n if (unprefixed.length > 0) throw new Error(lacksThePrefixError(unprefixed));\n\n const externals = selectedExternals(payload);\n const asPlugin = askedForAsPlugin(externals);\n const colliding = claimingACatalogueId(externals, matrix);\n\n if (asPlugin.length > 0) throw new Error(pluginInstallError(asPlugin));\n if (colliding.length > 0) throw new Error(catalogueIdCollisionError(colliding));\n\n return externals.flatMap((external) => seatExternalSkill(external, matrix, projectDir));\n}\n\n/**\n * Answers the ids whose directories changed. Refuses destinations again, since a directory may have\n * appeared while the user read the prompt.\n */\nexport async function writeExternalSkills(installs: ExternalSkillInstall[]): Promise<SkillId[]> {\n await refuseUncarriedDestinations(installs);\n\n const written = await Promise.all(installs.map(writeExternalSkill));\n return changedIds(written);\n}\n\nconst SCRATCH_DIR_PREFIX = \"agents-inc-carried-\";\n\n/** What {@link writeExternalSkills} would change, by running the write against scratch copies. */\nexport async function carriedSkillsThatDiffer(\n installs: ExternalSkillInstall[],\n): Promise<SkillId[]> {\n if (installs.length === 0) return [];\n\n const scratch = await mkdtemp(path.join(os.tmpdir(), SCRATCH_DIR_PREFIX));\n try {\n const written = await Promise.all(\n installs.map(async (install) => writeExternalSkill(await scratchCopyOf(install, scratch))),\n );\n return changedIds(written);\n } finally {\n await remove(scratch);\n }\n}\n\nasync function scratchCopyOf(\n install: ExternalSkillInstall,\n scratch: string,\n): Promise<ExternalSkillInstall> {\n const skillDir = path.join(scratch, install.id);\n if (await directoryExists(install.skillDir)) await copy(install.skillDir, skillDir);\n return { ...install, skillDir };\n}\n\ntype WrittenSkill = { id: SkillId; changed: boolean };\n\nfunction changedIds(written: WrittenSkill[]): SkillId[] {\n return written.filter(({ changed }) => changed).map(({ id }) => id);\n}\n\n/** Writes only the files whose bytes differ, so an unchanged skill keeps its mtimes. */\nasync function writeExternalSkill(install: ExternalSkillInstall): Promise<WrittenSkill> {\n const files = typedEntries<string, string>(await treeToWrite(install));\n refuseEscapingPaths(install.skillDir, files);\n\n const written = await Promise.all(\n files.map(([relativePath, contents]) =>\n writeIfChanged(path.join(install.skillDir, relativePath), contents),\n ),\n );\n return { id: install.id, changed: written.some(Boolean) };\n}\n\n/** The keys came off the wire, so every path is refused before any file is written. */\nfunction refuseEscapingPaths(skillDir: string, files: [string, string][]): void {\n for (const [relativePath] of files) {\n validateSkillPath(path.join(skillDir, relativePath), skillDir, relativePath);\n }\n}\n\n/** The bytes the editor previews, dated today unless nothing in them would change. */\nasync function treeToWrite(install: ExternalSkillInstall): Promise<SeedSkillTree> {\n const shipped = await withShippedMetadata(install);\n const unchanged = await treeAsInstalled(install, shipped);\n return unchanged ?? carriedTree(install, shipped, getCurrentDate());\n}\n\n/**\n * The tree dated as the stamp on disk is, where that makes its metadata the bytes already there:\n * a fresh date would otherwise make an unchanged skill look rewritten.\n */\nasync function treeAsInstalled(\n install: ExternalSkillInstall,\n shipped: SeedExternalSkill,\n): Promise<SeedSkillTree | null> {\n const recorded = (await readForkedFromMetadata(install.skillDir))?.date;\n if (recorded === undefined) return null;\n\n const tree = await carriedTree(install, shipped, recorded);\n const onDisk = await bytesOnDisk(path.join(install.skillDir, STANDARD_FILES.METADATA_YAML));\n return tree[STANDARD_FILES.METADATA_YAML] === onDisk ? tree : null;\n}\n\nfunction carriedTree(\n install: ExternalSkillInstall,\n skill: SeedExternalSkill,\n date: string,\n): Promise<SeedSkillTree> {\n return installedSkillTree({\n id: install.id,\n skill,\n domain: install.domain,\n usageGuidance: defaultUsageGuidance(install.skill.categoryId),\n date,\n });\n}\n\n/** Where the payload carries no metadata, the copy on disk stands for what was shipped. */\nasync function withShippedMetadata(install: ExternalSkillInstall): Promise<SeedExternalSkill> {\n if (Object.hasOwn(install.skill.files, STANDARD_FILES.METADATA_YAML)) return install.skill;\n\n const onDisk = await bytesOnDisk(path.join(install.skillDir, STANDARD_FILES.METADATA_YAML));\n if (onDisk === null) return install.skill;\n\n return {\n ...install.skill,\n files: { ...install.skill.files, [STANDARD_FILES.METADATA_YAML]: onDisk },\n };\n}\n\nasync function bytesOnDisk(filePath: string): Promise<string | null> {\n return (await fileExists(filePath)) ? readFile(filePath) : null;\n}\n\nasync function writeIfChanged(filePath: string, contents: string): Promise<boolean> {\n if ((await bytesOnDisk(filePath)) === contents) return false;\n await writeFile(filePath, contents);\n return true;\n}\n\ntype BlockedDestination = { id: SkillId; skillDir: string };\n\n/**\n * Refuses when a destination holds content no shared configuration carried. Only a carried skill's\n * install writes `forkedFrom.path`, so its presence marks a carried directory.\n */\nexport async function refuseUncarriedDestinations(installs: ExternalSkillInstall[]): Promise<void> {\n const judged = await Promise.all(installs.map(judgeDestination));\n const blocked = judged.filter((destination) => destination !== null);\n\n if (blocked.length > 0) throw new Error(uncarriedDestinationError(blocked));\n}\n\nasync function judgeDestination(install: ExternalSkillInstall): Promise<BlockedDestination | null> {\n const { id, skillDir } = install;\n if (!(await directoryExists(skillDir))) return null;\n if ((await readForkedFromMetadata(skillDir))?.path !== undefined) return null;\n return { id, skillDir };\n}\n\nfunction uncarriedDestinationError(blocked: BlockedDestination[]): string {\n return [\n \"This configuration cannot be installed: these skills travel inside it under ids this \" +\n \"installation already keeps a skill directory for, and no shared configuration put those \" +\n \"directories there:\",\n ...blocked.map(({ id, skillDir }) => ` ${id} -> ${skillDir}`),\n \"A skill id is the directory the skill installs into, so each would be written over a skill \" +\n \"written here by hand or ejected from a marketplace. Move or rename the directory above, \" +\n \"or re-share the configuration with each skill added again, which mints an id — \" +\n \"'external-<category>-<name>' — that nothing here holds.\",\n ].join(\"\\n\");\n}\n\nexport type OwnedSkillDir = { id: string; skillDir: string; provenance: ForkedFromMetadata };\n\nexport type ContentReading = {\n external: Record<string, SeedExternalSkill>;\n uncarryable: string[];\n};\n\ntype CarriedRead =\n | { carries: \"content\"; id: string; skill: SeedExternalSkill }\n | { carries: \"nothing\" }\n | { carries: \"unshareable\"; line: string };\n\nfunction unnameableRepoMessage(id: string): string {\n return `${id} travels inside a shared configuration, and this installation does not record the repository its content came from`;\n}\n\nfunction uncarryableContentMessage(id: string, reason: string): string {\n return `${id} travels inside a shared configuration, and ${reason}`;\n}\n\n/** The inverse of the stamp's `github:` source; any other ref answers nothing, to be refused. */\nfunction repoFromRef(ref: string | undefined): string | undefined {\n if (ref === undefined || !ref.startsWith(GITHUB_SOURCE.GITHUB_PREFIX)) return undefined;\n return ref.slice(GITHUB_SOURCE.GITHUB_PREFIX.length);\n}\n\nconst NO_MANIFEST_DESCRIPTION = `no description can be read from its ${STANDARD_FILES.SKILL_MD}`;\n\nfunction manifestDescription(files: SeedSkillTree, skillDir: string): string | null {\n const manifest = files[STANDARD_FILES.SKILL_MD];\n if (manifest === undefined) return null;\n\n const frontmatter = parseFrontmatter(manifest, path.join(skillDir, STANDARD_FILES.SKILL_MD));\n return frontmatter === null ? null : frontmatter.description;\n}\n\nasync function readSkillTree(skillDir: string): Promise<SeedSkillTree> {\n const files = await glob(\"**/*\", skillDir, { dot: true });\n const entries = await Promise.all(\n files.map(async (file) => [file, await readFile(path.join(skillDir, file))] as const),\n );\n return Object.fromEntries(entries);\n}\n\n/**\n * Rebuilds the carried entry from the bytes as installed. The description is the manifest's, not\n * the truncated `cliDescription`, which would shorten the skill on every round trip.\n */\nasync function readCarriedSkill({ id, skillDir, provenance }: OwnedSkillDir): Promise<CarriedRead> {\n // No path means a catalogue serves this id, so the bytes need not travel.\n if (provenance.path === undefined) return { carries: \"nothing\" };\n\n const repo = repoFromRef(provenance.source);\n if (repo === undefined) return { carries: \"unshareable\", line: unnameableRepoMessage(id) };\n\n const described = await readSkillMetadata(path.join(skillDir, STANDARD_FILES.METADATA_YAML));\n if (!described.usable) {\n return { carries: \"unshareable\", line: uncarryableContentMessage(id, described.reason) };\n }\n\n const files = await readSkillTree(skillDir);\n const description = manifestDescription(files, skillDir);\n if (description === null) {\n return { carries: \"unshareable\", line: uncarryableContentMessage(id, NO_MANIFEST_DESCRIPTION) };\n }\n\n const parsed = seedExternalSkillSchema.safeParse({\n displayName: described.metadata.displayName,\n description,\n categoryId: described.metadata.category,\n repo,\n path: provenance.path,\n files,\n });\n if (!parsed.success) {\n const reason = parsed.error.issues.map((issue) => issue.message).join(\"; \");\n return { carries: \"unshareable\", line: uncarryableContentMessage(id, reason) };\n }\n\n return { carries: \"content\", id, skill: parsed.data };\n}\n\n/** The mirror of {@link registerExternalSkills}: reads installed bytes back into entries. */\nexport async function readCarriedSkills(owned: OwnedSkillDir[]): Promise<ContentReading> {\n const reads = await Promise.all(owned.map(readCarriedSkill));\n\n return {\n external: Object.fromEntries(\n reads.flatMap((read) => (read.carries === \"content\" ? [[read.id, read.skill]] : [])),\n ),\n uncarryable: reads.flatMap((read) => (read.carries === \"unshareable\" ? [read.line] : [])),\n };\n}\n","import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\"\n\nimport { GITHUB_PREFIX, STANDARD_FILES } from \"./paths.js\"\n\nimport type { SeedExternalSkill, SeedSkillTree } from \"@workspace/matrix\"\n\n// What an install does to a skill the configuration carries (its whole directory travels in the\n// payload). The CLI writes {@link installedSkillTree}'s bytes; the editor preview draws them.\n\nconst FRONTMATTER_BLOCK = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---/\nconst NAME_FIELD = /^name:.*$/m\n\nexport type InstalledSkillIdentity = { id: string; description: string }\n\n/**\n * Names the skill by the id it installs under, which compiled sub-agents reference; the rest of\n * the frontmatter is the author's and travels untouched.\n */\nexport function withInstalledName(\n manifest: string,\n { id, description }: InstalledSkillIdentity\n): string {\n const named = `name: ${id}`\n const block = FRONTMATTER_BLOCK.exec(manifest)\n\n // No frontmatter describes no skill, so one is given from the payload.\n if (!block) {\n return `---\\n${named}\\ndescription: ${description}\\n---\\n\\n${manifest}`\n }\n\n const [whole, fields = \"\"] = block\n const renamed = NAME_FIELD.test(fields)\n ? fields.replace(NAME_FIELD, named)\n : `${named}\\n${fields}`\n\n return `---\\n${renamed}\\n---${manifest.slice(whole.length)}`\n}\n\nexport function carriedSkillAuthor(repo: string): string {\n const [owner = repo] = repo.split(\"/\")\n return `@${owner}`\n}\n\nexport type CarriedSkillPlacement = {\n id: string\n skill: Pick<\n SeedExternalSkill,\n \"displayName\" | \"description\" | \"categoryId\" | \"repo\"\n >\n domain: string\n /** The CLI's `defaultUsageGuidance`, passed in so it is spelled once. */\n usageGuidance: string\n shipped: Readonly<Record<string, unknown>> | null\n}\n\n/**\n * The payload's taxonomy wins over what the repository shipped, which wins over defaults. The\n * defaults keep `doctor` from flagging a file the user cannot fix.\n */\nexport function carriedSkillMetadata({\n id,\n skill,\n domain,\n usageGuidance,\n shipped,\n}: CarriedSkillPlacement): Record<string, unknown> {\n return {\n author: carriedSkillAuthor(skill.repo),\n usageGuidance,\n ...shipped,\n displayName: skill.displayName,\n slug: id,\n category: skill.categoryId,\n domain,\n cliDescription: shortLabel(skill.description),\n custom: true,\n }\n}\n\n// `CLI_DESCRIPTION_MAX_LENGTH` in the CLI's `schemas.ts`.\nconst CLI_DESCRIPTION_MAX_LENGTH = 60\n\nconst ELLIPSIS = \"…\"\n\n/** Cut at the last whole word that fits `doctor`'s limit; sub-agents read the full SKILL.md. */\nfunction shortLabel(description: string): string {\n if (description.length <= CLI_DESCRIPTION_MAX_LENGTH) return description\n\n const roomLength = CLI_DESCRIPTION_MAX_LENGTH - ELLIPSIS.length\n const room = description.slice(0, roomLength)\n // A break right after the room means its last word is whole and fits.\n const endsOnAWord = description[roomLength] === \" \"\n\n return `${endsOnAWord ? room.trimEnd() : toLastWholeWord(room)}${ELLIPSIS}`\n}\n\nfunction toLastWholeWord(text: string): string {\n const lastBreak = text.lastIndexOf(\" \")\n return (lastBreak > 0 ? text.slice(0, lastBreak) : text).trimEnd()\n}\n\nexport type CarriedSkillInstall = Omit<\n CarriedSkillPlacement,\n \"shipped\" | \"skill\"\n> & {\n skill: SeedExternalSkill\n date: string\n}\n\nexport async function installedSkillTree(\n install: CarriedSkillInstall\n): Promise<SeedSkillTree> {\n const manifest = withInstalledName(manifestOf(install.skill.files), {\n id: install.id,\n description: install.skill.description,\n })\n\n return {\n ...install.skill.files,\n [STANDARD_FILES.SKILL_MD]: manifest,\n [STANDARD_FILES.METADATA_YAML]: await metadataYaml(install, manifest),\n }\n}\n\n// `yamlSchemaComment(SCHEMA_PATHS.metadata)` in the CLI's `consts.ts`.\nconst METADATA_SCHEMA_COMMENT =\n \"# yaml-language-server: $schema=https://raw.githubusercontent.com/agents-inc/agents-inc/main/packages/cli/src/schemas/metadata.schema.json\"\n\n// `YAML_FORMATTING.LINE_WIDTH_NONE`.\nconst NO_LINE_FOLDING = 0\n\n/** The shared metadata, then the `forkedFrom` stamp. */\nasync function metadataYaml(\n install: CarriedSkillInstall,\n manifest: string\n): Promise<string> {\n const metadata = carriedSkillMetadata({\n ...install,\n shipped: shippedMetadata(install.skill.files),\n })\n const stamp = await provenanceStamp(install, manifest)\n\n return asMetadataFile(withForkedFrom(metadata, stamp))\n}\n\nasync function provenanceStamp(\n install: CarriedSkillInstall,\n manifest: string\n): Promise<Record<string, string>> {\n return {\n skillId: install.id,\n contentHash: await contentHashOf(manifest),\n date: install.date,\n source: `${GITHUB_PREFIX}${install.skill.repo}`,\n path: install.skill.path,\n }\n}\n\n/** The bytes `writeMetadataYaml` writes. */\nconst asMetadataFile = (metadata: Record<string, unknown>): string =>\n `${METADATA_SCHEMA_COMMENT}\\n${stringifyYaml(metadata, {\n lineWidth: NO_LINE_FOLDING,\n })}`\n\n/**\n * Always last, in place of any shipped stamp: a re-install reads its own earlier output as what\n * was shipped, so any other place would move the stamp on every write.\n */\nfunction withForkedFrom(\n metadata: Record<string, unknown>,\n forkedFrom: Record<string, string>\n): Record<string, unknown> {\n const { forkedFrom: _replaced, ...rest } = metadata\n return { ...rest, forkedFrom }\n}\n\n/** Read as `readLocalSkillMetadata` does: unparseable, non-mapping or bad `forkedFrom` is none. */\nfunction shippedMetadata(files: SeedSkillTree): Record<string, unknown> | null {\n const shipped = files[STANDARD_FILES.METADATA_YAML]\n if (shipped === undefined) return null\n\n const parsed = parsedYaml(shipped)\n return isMapping(parsed) && hasReadableProvenance(parsed) ? parsed : null\n}\n\nfunction parsedYaml(text: string): unknown {\n try {\n return parseYaml(text)\n } catch {\n // The CLI warns and reads no metadata; there is nobody here to warn.\n return undefined\n }\n}\n\nconst isMapping = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value)\n\nconst PROVENANCE_REQUIRED = [\"skillId\", \"contentHash\", \"date\"] as const\nconst PROVENANCE_OPTIONAL = [\"source\", \"path\"] as const\n\nfunction hasReadableProvenance(metadata: Record<string, unknown>): boolean {\n if (!Object.hasOwn(metadata, \"forkedFrom\")) return true\n\n const provenance = metadata.forkedFrom\n return (\n isMapping(provenance) &&\n PROVENANCE_REQUIRED.every((key) => typeof provenance[key] === \"string\") &&\n PROVENANCE_OPTIONAL.every(\n (key) =>\n !Object.hasOwn(provenance, key) || typeof provenance[key] === \"string\"\n )\n )\n}\n\nfunction manifestOf(files: SeedSkillTree): string {\n const manifest = files[STANDARD_FILES.SKILL_MD]\n if (manifest === undefined) {\n throw new Error(\n `A carried skill's directory holds no ${STANDARD_FILES.SKILL_MD}, which seedSkillTreeSchema refuses`\n )\n }\n return manifest\n}\n\n// `HASH_PREFIX_LENGTH` in the CLI's `computeStringHash`.\nconst CONTENT_HASH_LENGTH = 7\n\n// The CLI's `computeStringHash`, via Web Crypto because this package runs in a browser.\nasync function contentHashOf(text: string): Promise<string> {\n const digest = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(text)\n )\n return hexOf(new Uint8Array(digest)).slice(0, CONTENT_HASH_LENGTH)\n}\n\nconst hexOf = (bytes: Uint8Array): string =>\n Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")\n","import os from \"os\";\n\nimport { isDeepEqual, omit, partition, pick } from \"remeda\";\n\nimport { loadProjectConfigFromDir } from \"../configuration/project-config.js\";\nimport { isActiveAt } from \"../configuration/scope-predicates.js\";\nimport { namedByActiveEntries } from \"../configuration/scope-diff.js\";\nimport { providerInUse } from \"../installation/install-layout.js\";\nimport { getCategoryDomain, matrix } from \"../matrix/matrix-provider.js\";\nimport { orderDomains } from \"@workspace/compile\";\nimport { addedToGlobalSubAgents } from \"../../utils/messages.js\";\nimport { typedEntries, typedValues } from \"../../utils/typed-object.js\";\n\nimport type { InstallSelection } from \"@workspace/compile/seed-to-config\";\nimport type { NamedBy } from \"../configuration/scope-diff.js\";\nimport type { AgentName } from \"../../types/agents.js\";\nimport type {\n AgentScopeConfig,\n ProjectConfig,\n SkillConfig,\n SkillScope,\n} from \"../../types/config.js\";\nimport type { Category, Domain } from \"../../types/matrix.js\";\nimport type { SkillAssignment, SkillId } from \"../../types/skills.js\";\nimport type { StackAgentConfig } from \"../../types/stacks.js\";\n\n/** What applying a shared configuration may not take away, split by reason. */\nexport type KeptFromRoundTrip = {\n /** Written here, so no shared configuration ever carried them. */\n authoredSkillIds: SkillId[];\n /** Named by the configuration but unplaceable by this catalogue. */\n unplaceableSkillIds: SkillId[];\n};\n\n/**\n * A kept skill's row displaced by the payload's own skill in a one-skill category. The skill stays\n * installed; the row goes.\n */\nexport type UnassignedRow = { skillId: SkillId; agentName: AgentName; category: Category };\n\nexport type ReconciledSharedConfig = {\n result: InstallSelection;\n kept: KeptFromRoundTrip;\n unassigned: UnassignedRow[];\n};\n\nexport type ReconcileOptions = {\n decoded: InstallSelection;\n installed: ProjectConfig | null;\n authoredHere: ReadonlySet<SkillId>;\n /** `SeedMapping.skippedSkillIds` as the caller already reported them. */\n unplaceable: ReadonlySet<string>;\n};\n\nconst NOTHING_KEPT: KeptFromRoundTrip = {\n authoredSkillIds: [],\n unplaceableSkillIds: [],\n};\n\n/**\n * Puts back skills written here and ids this catalogue cannot place. Restored into the result,\n * not excused at the writer, because the removal diff drives deletion; rows and domain come too.\n */\nexport function reconcileSharedConfig(options: ReconcileOptions): ReconciledSharedConfig {\n const { decoded, installed } = options;\n if (!installed) return nothingToReconcile(decoded);\n\n const keptSkills = skillsToKeep(options, installed);\n if (keptSkills.length === 0) return nothingToReconcile(decoded);\n\n const { result, unassigned } = withKeptEntries(decoded, installed, keptSkills);\n return { result, kept: describeKept(options, keptSkills), unassigned };\n}\n\nfunction nothingToReconcile(decoded: InstallSelection): ReconciledSharedConfig {\n return { result: decoded, kept: NOTHING_KEPT, unassigned: [] };\n}\n\n/** A tombstone is neither: nothing is installed, so nothing needs protecting. */\nfunction skillsToKeep(options: ReconcileOptions, installed: ProjectConfig): SkillConfig[] {\n const named = new Set(options.decoded.skills.map((skill) => skill.id));\n\n return installed.skills.filter(\n (skill) => !skill.excluded && !named.has(skill.id) && mayNotRemove(skill, options),\n );\n}\n\nfunction mayNotRemove(skill: SkillConfig, options: ReconcileOptions): boolean {\n return options.authoredHere.has(skill.id) || options.unplaceable.has(skill.id);\n}\n\ntype KeptReason = \"authored\" | \"unplaceable\";\n\nfunction describeKept(options: ReconcileOptions, keptSkills: SkillConfig[]): KeptFromRoundTrip {\n const idsKeptFor = (reason: KeptReason): SkillId[] =>\n keptSkills.filter((skill) => reasonKept(skill, options) === reason).map((skill) => skill.id);\n\n return {\n authoredSkillIds: idsKeptFor(\"authored\"),\n unplaceableSkillIds: idsKeptFor(\"unplaceable\"),\n };\n}\n\n/** Where both apply, authorship wins: `update` can resolve an unplaceable id. */\nfunction reasonKept(skill: SkillConfig, options: ReconcileOptions): KeptReason {\n return options.authoredHere.has(skill.id) ? \"authored\" : \"unplaceable\";\n}\n\nfunction withKeptEntries(\n decoded: InstallSelection,\n installed: ProjectConfig,\n keptSkills: SkillConfig[],\n): Pick<ReconciledSharedConfig, \"result\" | \"unassigned\"> {\n const withSkills: InstallSelection = {\n ...decoded,\n skills: [...decoded.skills, ...keptSkills],\n selectedDomains: withKeptDomains(decoded.selectedDomains, keptSkills),\n };\n const { assignedStack, unassigned } = withKeptStackRows(decoded.assignedStack, installed.stack, {\n keptSkillIds: new Set(keptSkills.map((skill) => skill.id)),\n survivingAgents: new Set(decoded.selectedAgents),\n });\n return { result: { ...withSkills, assignedStack }, unassigned };\n}\n\nfunction withKeptDomains(selected: Domain[], keptSkills: SkillConfig[]): Domain[] {\n const keptDomains = keptSkills.flatMap((skill) => domainOfSkill(skill.id) ?? []);\n const missing = keptDomains.filter((domain) => !selected.includes(domain));\n if (missing.length === 0) return selected;\n\n return orderDomains([...selected, ...new Set(missing)]);\n}\n\n/** Undefined for an entry the loaded source cannot resolve; `edit` reports those itself. */\nfunction domainOfSkill(skillId: SkillId): Domain | undefined {\n const category = matrix.skills[skillId]?.category;\n return category === undefined ? undefined : getCategoryDomain(category);\n}\n\ntype KeptRowFilter = {\n keptSkillIds: ReadonlySet<SkillId>;\n survivingAgents: ReadonlySet<AgentName>;\n};\n\ntype KeptRows = {\n assignedStack: Partial<Record<AgentName, StackAgentConfig>>;\n unassigned: UnassignedRow[];\n};\n\n/**\n * A kept row joins the payload's under its category, except in a one-skill category the payload\n * fills, where it is returned as unassigned.\n */\nfunction withKeptStackRows(\n assigned: Partial<Record<AgentName, StackAgentConfig>>,\n installedStack: Partial<Record<AgentName, StackAgentConfig>> | undefined,\n filter: KeptRowFilter,\n): KeptRows {\n const isKept = (_category: Category, row: SkillAssignment): boolean =>\n filter.keptSkillIds.has(row.id);\n\n return typedEntries<AgentName, StackAgentConfig>(installedStack ?? {})\n .filter(([agent]) => filter.survivingAgents.has(agent))\n .reduce<KeptRows>(\n (carried, [agent, agentStack]) =>\n withAgentKeptRows(carried, agent, rowsWhere(agentStack, isKept), assigned[agent]),\n { assignedStack: assigned, unassigned: [] },\n );\n}\n\nfunction withAgentKeptRows(\n carried: KeptRows,\n agent: AgentName,\n keptRows: [Category, SkillAssignment][],\n payloadRows: StackAgentConfig | undefined,\n): KeptRows {\n const filled = filledExclusiveCategories(payloadRows);\n const [displaced, joining] = partition(keptRows, ([category]) => filled.has(category));\n\n return {\n assignedStack: withAppendedRows(carried.assignedStack, agent, joining),\n unassigned: [\n ...carried.unassigned,\n ...displaced.map(([category, row]) => ({ skillId: row.id, agentName: agent, category })),\n ],\n };\n}\n\nexport type InstalledGlobal = Pick<ProjectConfig, \"skills\" | \"agents\" | \"stack\">;\n\n/** Read from the global config itself, not a project's possibly older inlined copy. */\nexport async function readInstalledGlobal(projectDir: string): Promise<InstalledGlobal | null> {\n const loaded = await loadProjectConfigFromDir(os.homedir(), providerInUse(projectDir));\n return loaded?.config ?? null;\n}\n\ntype Entries = { skillIds: SkillId[]; agentNames: AgentName[] };\n\n/** A held global sub-agent an arriving skill's row joins, and the skills those rows bring. */\nexport type JoinedAgent = { agentName: AgentName; skillIds: SkillId[] };\n\nexport type HeldGlobal = {\n result: InstallSelection;\n installed: Entries;\n keptAsInstalled: Entries;\n joined: JoinedAgent[];\n};\n\nconst NO_GLOBAL_ENTRIES: Entries = { skillIds: [], agentNames: [] };\n\n/** A project `--from` only adds to the global install: every global entry it holds stays as held. */\nexport function holdInstalledGlobal(\n decoded: InstallSelection,\n installed: InstalledGlobal | null,\n): HeldGlobal {\n if (!installed) {\n return {\n result: decoded,\n installed: NO_GLOBAL_ENTRIES,\n keptAsInstalled: NO_GLOBAL_ENTRIES,\n joined: [],\n };\n }\n\n const heldSkills = activeGlobalById(installed.skills, (skill) => skill.id);\n const heldAgents = activeGlobalById(installed.agents, (agent) => agent.name);\n const skills = pairWithHeld(decoded.skills, heldSkills, (skill) => skill.id);\n const agents = pairWithHeld(decoded.agentConfigs, heldAgents, (agent) => agent.name);\n const namedSkillIds = skills.map(({ named }) => named.id);\n const namedAgentNames = agents.map(({ named }) => named.name);\n const { assignedStack, joined } = withHeldRows(decoded.assignedStack, installed.stack, {\n agentNames: namedAgentNames,\n skippedSkillIds: new Set(namedSkillIds),\n });\n\n return {\n result: {\n ...decoded,\n skills: decoded.skills.map(asHeld(skills)),\n agentConfigs: decoded.agentConfigs.map(asHeld(agents)),\n assignedStack,\n },\n installed: { skillIds: namedSkillIds, agentNames: namedAgentNames },\n keptAsInstalled: {\n skillIds: skillsKeptAsInstalled(skills),\n agentNames: agentsKeptAsInstalled(agents, {\n stated: decoded.assignedStack,\n held: assignedStack,\n joined,\n }),\n },\n joined,\n };\n}\n\nfunction skillsKeptAsInstalled(pairs: Held<SkillConfig>[]): SkillId[] {\n return pairs.filter((pair) => !restatesSkill(pair)).map(({ named }) => named.id);\n}\n\nfunction restatesSkill({ named, held }: Held<SkillConfig>): boolean {\n return named.origin === held.origin;\n}\n\ntype HeldAgentRows = {\n stated: Partial<Record<AgentName, StackAgentConfig>>;\n held: Partial<Record<AgentName, StackAgentConfig>>;\n joined: JoinedAgent[];\n};\n\n/** A sub-agent a row joins is changed, so it is named as added to rather than as kept. */\nfunction agentsKeptAsInstalled(pairs: Held<AgentScopeConfig>[], rows: HeldAgentRows): AgentName[] {\n const joinedNames = new Set(rows.joined.map(({ agentName }) => agentName));\n const keptAsIs = (pair: Held<AgentScopeConfig>): boolean =>\n !restatesAgent(pair, rows) && !joinedNames.has(pair.named.name);\n\n return pairs.filter(keptAsIs).map(({ named }) => named.name);\n}\n\nfunction restatesAgent({ named, held }: Held<AgentScopeConfig>, rows: HeldAgentRows): boolean {\n return (\n named.model === held.model &&\n named.codexModel === held.codexModel &&\n named.effort === held.effort &&\n sameAssignments(rows.stated[named.name], rows.held[named.name])\n );\n}\n\n/** For the destructive `edit --from`: a project may not remove global entries. */\nexport function restoreInstalledGlobal(\n decoded: InstallSelection,\n installed: InstalledGlobal | null,\n): HeldGlobal {\n const held = holdInstalledGlobal(decoded, installed);\n if (!installed) return held;\n\n const omitted = omittedGlobal(held.result, installed);\n const { skillIds, agentNames } = held.keptAsInstalled;\n return {\n ...held,\n result: withOmittedGlobal(held.result, installed, omitted),\n keptAsInstalled: {\n skillIds: [...skillIds, ...omitted.skills.map((skill) => skill.id)],\n agentNames: [...agentNames, ...omitted.agents.map((agent) => agent.name)],\n },\n };\n}\n\nfunction activeGlobalById<Entry extends SkillConfig | AgentScopeConfig, Key extends string>(\n entries: Entry[],\n keyOf: (entry: Entry) => Key,\n): Map<Key, Entry> {\n return new Map(\n entries.filter((entry) => isActiveAt(entry, \"global\")).map((entry) => [keyOf(entry), entry]),\n );\n}\n\ntype Held<Entry> = { named: Entry; held: Entry };\n\nfunction asHeld<Entry>(pairs: Held<Entry>[]): (entry: Entry) => Entry {\n const heldFor = new Map(pairs.map(({ named, held }) => [named, held]));\n return (entry) => heldFor.get(entry) ?? entry;\n}\n\nfunction pairWithHeld<Entry extends SkillConfig | AgentScopeConfig, Key extends string>(\n decoded: Entry[],\n heldByKey: ReadonlyMap<Key, Entry>,\n keyOf: (entry: Entry) => Key,\n): Held<Entry>[] {\n return decoded.flatMap((named) => {\n const held = heldByKey.get(keyOf(named));\n return held !== undefined && isActiveAt(named, \"global\") ? [{ named, held }] : [];\n });\n}\n\n/** Row order is not part of what a sub-agent loads. */\nexport function sameAssignments(\n left: StackAgentConfig | undefined,\n right: StackAgentConfig | undefined,\n): boolean {\n return isDeepEqual(assignmentKeys(left), assignmentKeys(right));\n}\n\nfunction assignmentKeys(agentStack: StackAgentConfig | undefined): string[] {\n return typedEntries<Category, SkillAssignment[]>(agentStack ?? {})\n .flatMap(([category, assignments]) =>\n assignments.map((row) => `${category}/${row.id}/${row.preloaded === true}`),\n )\n .sort();\n}\n\nfunction withInstalledRows(\n assigned: Partial<Record<AgentName, StackAgentConfig>>,\n installedStack: InstalledGlobal[\"stack\"],\n agentNames: AgentName[],\n): Partial<Record<AgentName, StackAgentConfig>> {\n return { ...omit(assigned, agentNames), ...pick(installedStack ?? {}, agentNames) };\n}\n\ntype HeldAgents = { agentNames: AgentName[]; skippedSkillIds: ReadonlySet<SkillId> };\n\ntype HeldStack = Pick<HeldGlobal, \"joined\"> & {\n assignedStack: Partial<Record<AgentName, StackAgentConfig>>;\n};\n\ntype AgentArrival = { agentName: AgentName; rows: [Category, SkillAssignment][] };\n\n/** Existing rows stay first and unchanged; arriving skills bring their rows after them. */\nfunction withHeldRows(\n assigned: Partial<Record<AgentName, StackAgentConfig>>,\n installedStack: InstalledGlobal[\"stack\"],\n held: HeldAgents,\n): HeldStack {\n const asInstalled = withInstalledRows(assigned, installedStack, held.agentNames);\n const arrivals = held.agentNames.map((agentName): AgentArrival => ({\n agentName,\n rows: arrivingRows(assigned[agentName], asInstalled[agentName], held.skippedSkillIds),\n }));\n\n return {\n assignedStack: arrivals.reduce(\n (stack, { agentName, rows }) => withAppendedRows(stack, agentName, rows),\n asInstalled,\n ),\n joined: arrivals.filter(({ rows }) => rows.length > 0).map(asJoined),\n };\n}\n\nfunction asJoined({ agentName, rows }: AgentArrival): JoinedAgent {\n return { agentName, skillIds: rows.map(([, row]) => row.id) };\n}\n\nfunction arrivingRows(\n stated: StackAgentConfig | undefined,\n installed: StackAgentConfig | undefined,\n skippedSkillIds: ReadonlySet<SkillId>,\n): [Category, SkillAssignment][] {\n const alreadyLoaded = new Set(rowIds(installed));\n const filled = filledExclusiveCategories(installed);\n const arrives = (category: Category, row: SkillAssignment): boolean =>\n !skippedSkillIds.has(row.id) && !alreadyLoaded.has(row.id) && !filled.has(category);\n\n return rowsWhere(stated, arrives);\n}\n\nfunction rowIds(agentStack: StackAgentConfig | undefined): SkillId[] {\n return typedValues<Category, SkillAssignment[]>(agentStack ?? {}).flatMap((rows) =>\n rows.map((row) => row.id),\n );\n}\n\n/** An undeclared category is not exclusive (see `propagate.ts`). */\nfunction filledExclusiveCategories(agentStack: StackAgentConfig | undefined): Set<Category> {\n const isExclusive = (category: Category): boolean =>\n matrix.categories[category]?.exclusive === true;\n\n return new Set(\n typedEntries<Category, SkillAssignment[]>(agentStack ?? {})\n .filter(([category, rows]) => rows.length > 0 && isExclusive(category))\n .map(([category]) => category),\n );\n}\n\nfunction withAppendedRows(\n stack: Partial<Record<AgentName, StackAgentConfig>>,\n agentName: AgentName,\n added: [Category, SkillAssignment][],\n): Partial<Record<AgentName, StackAgentConfig>> {\n if (added.length === 0) return stack;\n return { ...stack, [agentName]: appendRows(stack[agentName] ?? {}, added) };\n}\n\nfunction rowsWhere(\n agentStack: StackAgentConfig | undefined,\n keep: (category: Category, row: SkillAssignment) => boolean,\n): [Category, SkillAssignment][] {\n return typedEntries<Category, SkillAssignment[]>(agentStack ?? {}).flatMap(([category, rows]) =>\n rows\n .filter((row) => keep(category, row))\n .map((row): [Category, SkillAssignment] => [category, row]),\n );\n}\n\nfunction appendRows(\n agentStack: StackAgentConfig,\n added: [Category, SkillAssignment][],\n): StackAgentConfig {\n return added.reduce<StackAgentConfig>(\n (rows, [category, row]) => ({ ...rows, [category]: [...(rows[category] ?? []), row] }),\n agentStack,\n );\n}\n\ntype OmittedGlobal = { skills: SkillConfig[]; agents: AgentScopeConfig[] };\n\nfunction omittedGlobal(result: InstallSelection, installed: InstalledGlobal): OmittedGlobal {\n const namedSkillIds = new Set(result.skills.map((skill) => skill.id));\n const namedAgentNames = new Set(result.agentConfigs.map((agent) => agent.name));\n\n return {\n skills: [...activeGlobalById(installed.skills, (skill) => skill.id).values()].filter(\n (skill) => !namedSkillIds.has(skill.id),\n ),\n agents: [...activeGlobalById(installed.agents, (agent) => agent.name).values()].filter(\n (agent) => !namedAgentNames.has(agent.name),\n ),\n };\n}\n\nfunction withOmittedGlobal(\n result: InstallSelection,\n installed: InstalledGlobal,\n omitted: OmittedGlobal,\n): InstallSelection {\n const omittedAgentNames = omitted.agents.map((agent) => agent.name);\n\n return {\n ...result,\n skills: [...result.skills, ...omitted.skills],\n agentConfigs: [...result.agentConfigs, ...omitted.agents],\n selectedAgents: [...new Set([...result.selectedAgents, ...omittedAgentNames])],\n selectedDomains: withKeptDomains(result.selectedDomains, omitted.skills),\n assignedStack: withInstalledRows(result.assignedStack, installed.stack, omittedAgentNames),\n };\n}\n\nexport function notInstalledGlobally<Entry extends { id: SkillId }>(\n entries: Entry[],\n held: HeldGlobal,\n): Entry[] {\n const installed = new Set(held.installed.skillIds);\n return entries.filter((entry) => !installed.has(entry.id));\n}\n\nfunction entriesActiveAt(\n skills: SkillConfig[],\n agents: AgentScopeConfig[],\n scope: SkillScope,\n): Entries {\n return {\n skillIds: skills.filter((skill) => isActiveAt(skill, scope)).map((skill) => skill.id),\n agentNames: agents.filter((agent) => isActiveAt(agent, scope)).map((agent) => agent.name),\n };\n}\n\n/**\n * The entry the panel draws each skill's row from, which a notice under it names the skill by: the\n * global install's for one held, the installed one for one kept, the configuration's for the rest.\n */\nexport function panelRowEntries(held: HeldGlobal): NamedBy {\n return namedByActiveEntries(held.result.skills);\n}\n\nexport function joinedStatement(held: HeldGlobal): string[] {\n if (held.joined.length === 0) return [];\n return [addedToGlobalSubAgents(held.joined, panelRowEntries(held))];\n}\n\n/** Split by kind: skill and sub-agent scopes are independent, so a refusal names each. */\nexport function projectScopedContent(result: InstallSelection): Entries {\n return entriesActiveAt(result.skills, result.agentConfigs, \"project\");\n}\n\n/** The home directory is the global scope, so it refuses anything project-scoped. */\nexport function installsAtHome(result: InstallSelection): boolean {\n const { skillIds, agentNames } = projectScopedContent(result);\n return skillIds.length === 0 && agentNames.length === 0;\n}\n","import { Command } from \"@oclif/core\";\n\nimport chalk from \"chalk\";\nimport { unique } from \"remeda\";\n\nimport { CLI_COLORS, DEFAULT_BRANDING, MIN_TERMINAL_SIZE, type Provider } from \"./consts.js\";\nimport { getErrorMessage } from \"./utils/errors.js\";\nimport { inertLine, stripTerminalControls } from \"./utils/string.js\";\nimport { verbose } from \"./utils/logger.js\";\nimport {\n completedWithFailures,\n INFO_MESSAGES,\n installationConfigsUnreadable,\n type IncompleteWork,\n pluginsInstalled,\n pluginsLeftSwitchedOn,\n propagatedRecompileSummary,\n registeredProjectConfigUnreadable,\n registeredProjectGone,\n registeredProjectOnAnotherProvider,\n savedSkillMetadataUnusableError,\n scopeBlockedStackAssignment,\n sharedConfigProjectScopeAtHome,\n skillAssignedToNoAgent,\n skillMetadataUnusableDetail,\n skippedUnknownAgents,\n skippedSkills,\n STATUS_MESSAGES,\n} from \"./utils/messages.js\";\nimport {\n clearTerminalScreen,\n formatTerminalTooSmallMessage,\n isTerminalLargeEnough,\n} from \"./utils/terminal.js\";\nimport { EXIT_CODES } from \"./lib/exit-codes.js\";\nimport { isActiveAt } from \"./lib/configuration/scope-predicates.js\";\nimport { namedByActiveEntries } from \"./lib/configuration/scope-diff.js\";\nimport { resolveBranding } from \"./lib/configuration/config.js\";\nimport { isHomeDirectory, refuseUnofferedStack } from \"./lib/installation/index.js\";\nimport { providerInUse } from \"./lib/installation/install-layout.js\";\nimport {\n holdsOnlyAConfigDeclaringNothing,\n homeHoldsAnInstallationFor,\n} from \"./lib/installation/provider-flag.js\";\nimport { providerToNameAt } from \"./lib/installation/provider-to-name.js\";\nimport type { InstallSelection } from \"@workspace/compile/seed-to-config\";\nimport { getStackSkillIds, loadStackById } from \"./lib/stacks/index.js\";\nimport type {\n AgentName,\n MergedSkillsMatrix,\n ProjectConfig,\n SelectionValidation,\n SkillConfig,\n SkillId,\n} from \"./types/index.js\";\nimport { findConfigLoadFailures } from \"./lib/configuration/project-config.js\";\nimport { findUnusableSavedSkillMetadata } from \"./lib/skills/index.js\";\nimport type { PluginHost } from \"./lib/hosts/plugin-host.js\";\nimport type { PluginLeftSwitchedOn } from \"./lib/hosts/codex-plugin-switch.js\";\nimport { hostAt } from \"./lib/hosts/host-for.js\";\nimport { refuseUnofferedPlacements } from \"./lib/hosts/offered-placements.js\";\nimport {\n refuseUncarriedDestinations,\n type ExternalSkillInstall,\n} from \"./lib/seed/external-skills.js\";\nimport { installsAtHome, projectScopedContent } from \"./lib/seed/seed-apply.js\";\nimport type { SeedMapping } from \"./lib/seed/seed-to-selection.js\";\nimport { refuseUnwritableStack } from \"@workspace/compile/config-source\";\nimport { requireMarketplace } from \"./lib/operations/source/require-marketplace.js\";\nimport {\n installPluginSkills,\n pluginInstallFailureError,\n unbackedPluginInstallError,\n unbackedPluginSkillIds,\n type PluginInstallResult,\n} from \"./lib/operations/skills/install-plugin-skills.js\";\nimport type { GateReport } from \"./lib/config-gate/index.js\";\nimport type { SourceLoadResult } from \"./lib/loading/source-loader.js\";\nimport type { UnusableSkillMetadata } from \"./lib/loading/index.js\";\n\n/** Polled because some terminals and multiplexers resize without emitting `resize`. */\nconst TERMINAL_RESIZE_POLL_MS = 500;\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- @types/node declares this as `number`; it is undefined whenever stdout is not a TTY\nconst terminalColumns = (): number => process.stdout.columns ?? MIN_TERMINAL_SIZE.COLS;\n\n// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- @types/node declares this as `number`; it is undefined whenever stdout is not a TTY\nconst terminalRows = (): number => process.stdout.rows ?? MIN_TERMINAL_SIZE.ROWS;\n\n/** On stderr, as the init hook's old-folder lines are, so piped output is unchanged. */\nfunction sayFirst(line: string): void {\n process.stderr.write(`${line}\\n`);\n}\n\nfunction isTerminalBigEnough(): boolean {\n return isTerminalLargeEnough(terminalColumns(), terminalRows());\n}\n\nfunction waitForTerminal(isSatisfied: () => boolean): Promise<void> {\n return new Promise<void>((resolve) => {\n const check = () => {\n if (!isSatisfied()) return;\n clearInterval(interval);\n process.stdout.off(\"resize\", check);\n resolve();\n };\n const interval = setInterval(check, TERMINAL_RESIZE_POLL_MS);\n process.stdout.on(\"resize\", check);\n });\n}\n\ntype UnassignedSkill = { skillId: SkillId; blockedBy: AgentName[] };\n\n/**\n * Only the selection is judged: inherited global skills are absent from this stack without being\n * unassigned. `blockedBy` is empty for a global-scoped skill, since the scope rule is not why.\n */\nfunction findUnassignedSkills(\n config: ProjectConfig,\n selected: readonly SkillConfig[],\n): UnassignedSkill[] {\n const assignedIds = new Set(config.stack ? getStackSkillIds(config.stack) : []);\n const selectedIds = new Set(selected.map((skill) => skill.id));\n const globalAgentNames = config.agents\n .filter((agent) => isActiveAt(agent, \"global\"))\n .map((agent) => agent.name);\n\n const unassignedIds = unique(\n config.skills\n .filter((skill) => !skill.excluded && selectedIds.has(skill.id))\n .map((skill) => skill.id)\n .filter((skillId) => !assignedIds.has(skillId)),\n );\n\n return unassignedIds.map((skillId) => ({\n skillId,\n blockedBy: hasActiveProjectEntry(config.skills, skillId) ? globalAgentNames : [],\n }));\n}\n\nfunction hasActiveProjectEntry(skills: readonly SkillConfig[], skillId: SkillId): boolean {\n return skills.some((skill) => skill.id === skillId && isActiveAt(skill, \"project\"));\n}\n\nexport abstract class BaseCommand extends Command {\n /** Non-empty decides the exit code; see {@link exitIfWorkIncomplete}. */\n private readonly incompleteWork: IncompleteWork[] = [];\n\n /** Warned of by the refresh that left them; non-empty fails the run, as in `update`. */\n private readonly switchesLeftOn: PluginLeftSwitchedOn[] = [];\n\n async init(): Promise<void> {\n await super.init();\n await this.ensureTerminalSize();\n }\n\n /**\n * Called first where a command starts work on the installation in play, which for a project whose\n * config declares nothing is the global one, or none where HOME holds none the run could work on.\n */\n protected async sayWhenTheGlobalInstallationStandsIn(named: Provider | undefined): Promise<void> {\n if (!(await holdsOnlyAConfigDeclaringNothing(process.cwd()))) return;\n\n const standsIn = await homeHoldsAnInstallationFor(process.cwd(), named);\n sayFirst(\n standsIn\n ? INFO_MESSAGES.GLOBAL_INSTALLATION_STANDS_IN\n : INFO_MESSAGES.NO_GLOBAL_INSTALLATION_STANDS_IN,\n );\n }\n\n /** For a command that never works on the global installation: `line` says what it does instead. */\n protected async sayWhenTheProjectsConfigDeclaresNothing(line: string): Promise<void> {\n if (await holdsOnlyAConfigDeclaringNothing(process.cwd())) sayFirst(line);\n }\n\n protected async ensureTerminalSize(): Promise<void> {\n if (isTerminalBigEnough()) return;\n\n clearTerminalScreen();\n this.log(chalk.hex(CLI_COLORS.WARNING)(formatTerminalTooSmallMessage(terminalColumns())));\n\n await waitForTerminal(isTerminalBigEnough);\n }\n\n protected handleError(error: unknown): never {\n const message = getErrorMessage(error);\n this.error(message, { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * Degrades on an unreadable config: `doctor` and `uninstall` must survive one, and a heading is\n * not worth refusing over. The command's own config reader reports the cause.\n */\n protected async resolveBrandingName(projectDir: string): Promise<string> {\n try {\n const branding = await resolveBranding(projectDir);\n return branding.name;\n } catch (error) {\n verbose(`Could not read branding from the config: ${getErrorMessage(error)}`);\n return DEFAULT_BRANDING.NAME;\n }\n }\n\n protected logSuccess(message: string): void {\n this.log(`✓ ${message}`);\n }\n\n /** `onRegistered` fires only when the marketplace had to be registered. */\n protected async requireMarketplaceOrExit(\n sourceResult: SourceLoadResult,\n purpose: string,\n host: PluginHost,\n onRegistered?: (marketplace: string) => void,\n ): Promise<string> {\n const required = await requireMarketplace(sourceResult, purpose, host);\n if (!required.ok) {\n this.error(required.error, { exit: EXIT_CODES.ERROR });\n }\n this.switchesLeftOn.push(...required.leftOn);\n if (required.registered) {\n onRegistered?.(required.marketplace);\n }\n return required.marketplace;\n }\n\n /** Advisory: the selection installs either way. A message can quote a payload's own ids. */\n protected reportValidationErrors(validation: SelectionValidation): void {\n for (const error of validation.errors) {\n this.warn(stripTerminalControls(error.message));\n }\n }\n\n /** Refuses skills no marketplace carries before the host's CLI is asked. */\n protected async installPluginSkillsReported(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n matrix: MergedSkillsMatrix,\n ): Promise<PluginInstallResult> {\n const unbacked = unbackedPluginSkillIds(skills, matrix);\n if (unbacked.length > 0) {\n this.error(unbackedPluginInstallError(unbacked), { exit: EXIT_CODES.ERROR });\n }\n\n this.announcePluginInstall();\n const result = await installPluginSkills(skills, marketplace, projectDir);\n this.reportPluginInstalls(result);\n return result;\n }\n\n /** Split out for the eject-to-plugin migration, which runs its own installs. */\n protected announcePluginInstall(): void {\n this.log(STATUS_MESSAGES.INSTALLING_PLUGINS);\n }\n\n /** Hard-errors on any failure, before a config can record an origin for an uninstalled plugin. */\n protected reportPluginInstalls(result: PluginInstallResult): void {\n for (const item of result.installed) {\n this.log(` Installed ${item.ref}`);\n }\n for (const item of result.failed) {\n this.warn(`Failed to install plugin ${item.id}: ${item.error}`);\n }\n if (result.failed.length > 0) {\n this.error(pluginInstallFailureError(result.failed.length), { exit: EXIT_CODES.ERROR });\n }\n this.log(`${pluginsInstalled(result.installed.length)}\\n`);\n }\n\n protected reportFanOut(report: GateReport): void {\n for (const projectPath of report.propagated.unreadable) {\n this.warn(registeredProjectConfigUnreadable(projectPath));\n }\n this.reportPropagatedRecompile(report);\n }\n\n protected reportProjectsOutOfReach(propagated: GateReport[\"propagated\"]): void {\n for (const projectPath of propagated.gone) {\n this.warn(registeredProjectGone(projectPath));\n }\n for (const projectPath of propagated.notOurs) {\n this.warn(registeredProjectOnAnotherProvider(projectPath));\n }\n }\n\n protected reportPropagatedRecompile(report: GateReport): void {\n if (report.propagated.updated.length === 0) return;\n\n const { rewrittenCount, unchangedCount, failedCount, warnings } = report.recompile;\n for (const warning of warnings) {\n this.warn(warning);\n }\n this.log(propagatedRecompileSummary(rewrittenCount + unchangedCount, failedCount));\n }\n\n protected reportUnassignedSkills(config: ProjectConfig, selected: readonly SkillConfig[]): void {\n const namedBy = namedByActiveEntries(selected);\n for (const { skillId, blockedBy } of findUnassignedSkills(config, selected)) {\n this.warn(skillAssignedToNoAgent(skillId, namedBy));\n if (blockedBy.length > 0) {\n this.warn(scopeBlockedStackAssignment(blockedBy, skillId, namedBy));\n }\n }\n }\n\n /**\n * Aborts up front when the project or global config exists but cannot be loaded, so nothing is\n * installed before the config write fails. A missing config passes.\n */\n protected async ensureConfigReadable(projectDir: string): Promise<void> {\n const failures = await findConfigLoadFailures(projectDir);\n if (failures.length > 0) {\n this.error(installationConfigsUnreadable(failures), { exit: EXIT_CODES.ERROR });\n }\n }\n\n /** Only entries the catalogue lacks are checked; one whose files are gone is not refused. */\n protected async ensureSavedSkillsReadable(\n savedSkills: readonly SkillConfig[],\n matrix: MergedSkillsMatrix,\n projectDir: string,\n ): Promise<void> {\n const unresolved = savedSkills.filter((saved) => !matrix.skills[saved.id]);\n await this.refuseUnusableSavedSkillMetadata(\n unresolved,\n projectDir,\n savedSkillMetadataUnusableError,\n );\n }\n\n protected async refuseUnusableSavedSkillMetadata(\n savedSkills: readonly SkillConfig[],\n projectDir: string,\n refusal: (unusable: UnusableSkillMetadata[]) => string,\n ): Promise<void> {\n const unusable = await findUnusableSavedSkillMetadata(savedSkills, projectDir);\n if (unusable.length === 0) return;\n\n // Logged, not raised: oclif hard-wraps error text, which breaks copyable paths.\n for (const entry of unusable) {\n this.log(skillMetadataUnusableDetail(entry));\n }\n this.error(refusal(unusable), { exit: EXIT_CODES.ERROR });\n }\n\n /**\n * The home directory is the global scope, so project-scoped content there would land in the\n * global config mislabelled. Needs the decoded selection; callers run it before any write.\n * `installedHere`: the run applies to the global install rather than creating it.\n */\n protected refuseProjectScopedContentAtHome(\n result: InstallSelection,\n projectDir: string,\n installedHere: boolean,\n ): void {\n if (!isHomeDirectory(projectDir) || installsAtHome(result)) return;\n\n const { skillIds, agentNames } = projectScopedContent(result);\n const provider = providerToNameAt(projectDir, providerInUse(projectDir));\n const namedBy = namedByActiveEntries(result.skills);\n this.error(\n sharedConfigProjectScopeAtHome(skillIds, agentNames, installedHere, provider, namedBy),\n { exit: EXIT_CODES.ERROR },\n );\n }\n\n /** `unloadedSkillIds`: skills the marketplace ships and could not load, never unknown ones. */\n protected warnOfSkippedEntries(\n mapping: SeedMapping,\n unloadedSkillIds: SourceLoadResult[\"unloadedSkillIds\"],\n ): void {\n const { skippedSkillIds, skippedAgentNames, agentsOnlySkippedSkillsCarried } = mapping;\n\n if (skippedSkillIds.length > 0) {\n this.warn(skippedSkills(skippedSkillIds, agentsOnlySkippedSkillsCarried, unloadedSkillIds));\n }\n if (skippedAgentNames.length > 0) this.warn(skippedUnknownAgents(skippedAgentNames));\n }\n\n /** For the panel's header; `undefined` for a configuration built from no stack. */\n protected async stackNameOf(\n stackId: InstallSelection[\"selectedStackId\"],\n sourceResult: SourceLoadResult,\n ): Promise<string | undefined> {\n if (!stackId) return undefined;\n\n const { sourcePath, sourceConfig } = sourceResult;\n const stack = await loadStackById(stackId, sourcePath, sourceConfig.source);\n return stack === null ? undefined : inertLine(stack.name);\n }\n\n /** The `--from` refusals that need the decoded selection, asked before the confirm. */\n protected async refuseSharedConfigBeforeAsking(\n selection: InstallSelection,\n carried: ExternalSkillInstall[],\n root: string,\n sourceResult: SourceLoadResult,\n ): Promise<void> {\n this.refuseUnofferablePlacementsBeforeWriting(selection.skills, root);\n try {\n await refuseUnofferedStack(selection.selectedStackId, sourceResult);\n await refuseUncarriedDestinations(carried);\n refuseUnwritableStack(selection.assignedStack, sourceResult.matrix);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Pre-flight over every row, ejected included: the per-plugin guard in `installPlugin` fires\n * mid-loop, after earlier plugins are already installed.\n */\n protected refuseUnofferablePlacementsBeforeWriting(\n skills: readonly SkillConfig[],\n root: string,\n ): void {\n try {\n refuseUnofferedPlacements(skills, hostAt(root));\n } catch (error) {\n this.error(getErrorMessage(error), { exit: EXIT_CODES.ERROR });\n }\n }\n\n protected get hasIncompleteWork(): boolean {\n return this.incompleteWork.length > 0;\n }\n\n /** Never aborts: every caller is past a mutation that has already landed. */\n protected reportIncompleteWork(what: string, recovery: string): void {\n this.warn(what);\n this.recordIncompleteWork(what, recovery);\n }\n\n /** For a caller that has already warned. */\n protected recordIncompleteWork(what: string, recovery: string): void {\n this.incompleteWork.push({ what, recovery });\n }\n\n /** Every command that records must call this; `this.exit` skips the `Error:` framing. */\n protected exitIfWorkIncomplete(): void {\n this.listIncompleteWork();\n this.failIfPluginsLeftSwitchedOn();\n if (this.hasIncompleteWork) this.exit(EXIT_CODES.COMPLETED_WITH_FAILURES);\n }\n\n private listIncompleteWork(): void {\n if (!this.hasIncompleteWork) return;\n\n this.log(`\\n${chalk.hex(CLI_COLORS.WARNING)(completedWithFailures(this.incompleteWork))}\\n`);\n }\n\n private failIfPluginsLeftSwitchedOn(): void {\n if (this.switchesLeftOn.length === 0) return;\n\n const pluginKeys = this.switchesLeftOn.map(({ pluginKey }) => pluginKey);\n this.error(pluginsLeftSwitchedOn(pluginKeys), { exit: EXIT_CODES.ERROR });\n }\n}\n","import {\n FailedLeavingPluginsSwitchedOnError,\n PluginsLeftSwitchedOnError,\n type PluginLeftSwitchedOn,\n} from \"../../hosts/codex-plugin-switch.js\";\nimport type { PluginHost } from \"../../hosts/plugin-host.js\";\nimport { fetchMarketplace } from \"../../loading/index.js\";\nimport { warn } from \"../../../utils/logger.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { codexPluginLeftSwitchedOn } from \"../../../utils/messages.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type MarketplaceResult = {\n marketplace: string | null;\n registered: boolean;\n leftOn: readonly PluginLeftSwitchedOn[];\n};\n\ntype RefreshOutcome = { refreshed: boolean; leftOn: readonly PluginLeftSwitchedOn[] };\n\n/**\n * Registers the marketplace, or refreshes it when it exists. A resolution failure is warned here\n * because `requireMarketplace`'s error cannot tell its cause.\n */\nexport async function ensureMarketplace(\n sourceResult: SourceLoadResult,\n host: PluginHost,\n): Promise<MarketplaceResult> {\n const marketplace = await resolveMarketplaceName(sourceResult);\n if (marketplace === null) return { marketplace: null, registered: false, leftOn: [] };\n\n const exists = await host.marketplaceExists(marketplace);\n\n if (!exists) {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await host.addMarketplace(marketplaceSource);\n return { marketplace, registered: true, leftOn: [] };\n }\n\n const outcome = await refreshOutcome(marketplace, host);\n warnOfShortfalls(outcome);\n return { marketplace, registered: false, leftOn: outcome.leftOn };\n}\n\nasync function refreshOutcome(marketplace: string, host: PluginHost): Promise<RefreshOutcome> {\n try {\n await host.refreshMarketplace(marketplace);\n return { refreshed: true, leftOn: [] };\n } catch (error) {\n return outcomeOfRefusal(error);\n }\n}\n\n/** A switch the refresh turned back on is the one refusal that still leaves the listing refreshed. */\nfunction outcomeOfRefusal(error: unknown): RefreshOutcome {\n if (error instanceof PluginsLeftSwitchedOnError) return { refreshed: true, leftOn: error.leftOn };\n if (error instanceof FailedLeavingPluginsSwitchedOnError) {\n return { refreshed: false, leftOn: error.leftOn };\n }\n return { refreshed: false, leftOn: [] };\n}\n\nfunction warnOfShortfalls({ refreshed, leftOn }: RefreshOutcome): void {\n if (!refreshed) warn(\"Could not update marketplace — continuing with cached version\");\n for (const { pluginKey, configFile, reason } of leftOn) {\n warn(codexPluginLeftSwitchedOn(pluginKey, configFile, reason));\n }\n}\n\n/** Fetched, and recorded on `sourceResult`, when the load left it unresolved. */\nasync function resolveMarketplaceName(sourceResult: SourceLoadResult): Promise<string | null> {\n if (sourceResult.marketplace) return sourceResult.marketplace;\n\n const source = sourceResult.sourceConfig.source;\n try {\n const marketplaceResult = await fetchMarketplace(source);\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n return sourceResult.marketplace;\n } catch (error) {\n warn(`Could not resolve a marketplace from '${source}': ${getErrorMessage(error)}`);\n return null;\n }\n}\n","import { ensureMarketplace } from \"./ensure-marketplace.js\";\nimport type { PluginLeftSwitchedOn } from \"../../hosts/codex-plugin-switch.js\";\nimport type { PluginHost } from \"../../hosts/plugin-host.js\";\nimport type { SourceLoadResult } from \"../../loading/source-loader.js\";\n\nexport type MarketplaceRequirement =\n | {\n ok: true;\n marketplace: string;\n registered: boolean;\n leftOn: readonly PluginLeftSwitchedOn[];\n }\n | { ok: false; error: string };\n\n/** Callers must hard-error on `ok: false`, never fall back to eject, before touching disk. */\nexport async function requireMarketplace(\n sourceResult: SourceLoadResult,\n purpose: string,\n host: PluginHost,\n): Promise<MarketplaceRequirement> {\n const mpResult = await ensureMarketplace(sourceResult, host);\n if (!mpResult.marketplace) {\n return {\n ok: false,\n error:\n `Cannot ${purpose}: marketplace could not be resolved from '${sourceResult.sourceConfig.source}'. ` +\n `Plugin install mode requires a marketplace — fix the marketplace or switch the affected skills to eject mode.`,\n };\n }\n return {\n ok: true,\n marketplace: mpResult.marketplace,\n registered: mpResult.registered,\n leftOn: mpResult.leftOn,\n };\n}\n","import { hostAt } from \"../../hosts/host-for.js\";\nimport { isLocalOnlySkill } from \"../../loading/multi-source-loader.js\";\nimport { buildMarketplacePluginRef } from \"../../plugins/index.js\";\nimport { getErrorMessage } from \"../../../utils/errors.js\";\nimport { CLI_INVOKE_COMMAND, EJECT_SOURCE } from \"../../../consts.js\";\nimport type { MergedSkillsMatrix, SkillId } from \"../../../types/index.js\";\nimport type { SkillConfig } from \"../../../types/config.js\";\n\nexport type PluginInstallResult = {\n installed: Array<{ id: SkillId; ref: string }>;\n failed: Array<{ id: SkillId; error: string }>;\n};\n\n/** Callers must error with this BEFORE config is written, or config.ts gains orphan entries. */\nexport function pluginInstallFailureError(failedCount: number): string {\n return `Failed to install ${failedCount} plugin skill(s). Plugin install intent could not be honored. Verify the skill id matches the marketplace, run '${CLI_INVOKE_COMMAND} update' to refresh the marketplace, or switch affected skills to eject mode.`;\n}\n\n/** Plugin-mode skills no marketplace carries, refusable before any install is attempted. */\nexport function unbackedPluginSkillIds(\n skills: SkillConfig[],\n matrix: MergedSkillsMatrix,\n): SkillId[] {\n return skills\n .filter((skill) => skill.origin !== EJECT_SOURCE)\n .filter((skill) => isLocalOnlySkill(matrix.skills[skill.id]))\n .map((skill) => skill.id);\n}\n\nexport function unbackedPluginInstallError(ids: SkillId[]): string {\n return `Cannot install ${ids.length} skill(s) as plugins — no marketplace carries them: ${ids.join(\", \")}. A skill that exists only in this project can only be installed as a local copy. Set its Install mode to eject in the editor, or publish it to a marketplace first.`;\n}\n\n/** The host is read off the folder under `projectDir`, so that folder must already exist. */\nexport async function installPluginSkills(\n skills: SkillConfig[],\n marketplace: string,\n projectDir: string,\n): Promise<PluginInstallResult> {\n const host = hostAt(projectDir);\n const pluginSkills = skills.filter((s) => s.origin !== EJECT_SOURCE);\n const installed: PluginInstallResult[\"installed\"] = [];\n const failed: PluginInstallResult[\"failed\"] = [];\n\n for (const skill of pluginSkills) {\n const pluginRef = buildMarketplacePluginRef(skill.id, marketplace);\n try {\n await host.installPlugin(pluginRef, skill.scope, projectDir);\n installed.push({ id: skill.id, ref: pluginRef });\n } catch (error) {\n failed.push({ id: skill.id, error: getErrorMessage(error) });\n }\n }\n\n return { installed, failed };\n}\n"],"mappings":"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","names":["os","matrix","os","os","os","matrix","matrix"]}
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  agentCodec,
4
+ agentsDir,
4
5
  buildAgentTemplateContext,
5
6
  buildCompileAgents,
6
7
  directoryExists,
@@ -11,6 +12,7 @@ import {
11
12
  getPluginAgentsDir,
12
13
  glob,
13
14
  hostCompilesAgent,
15
+ inheritedGlobalProvider,
14
16
  isAgentName,
15
17
  loadAllAgents,
16
18
  loadProjectAgents,
@@ -24,17 +26,16 @@ import {
24
26
  renderAgentBody,
25
27
  renderAgentRoleToml,
26
28
  resolveAgents,
27
- resolveInstallPaths,
28
29
  sourceFolderInUse,
29
30
  sourceFolderName,
30
31
  verbose,
31
32
  writeFile
32
- } from "./chunk-E45IT3HC.js";
33
+ } from "./chunk-ENET4IF6.js";
33
34
  import {
34
35
  typedEntries,
35
36
  typedFromEntries,
36
37
  typedKeys
37
- } from "./chunk-AIBVAYHS.js";
38
+ } from "./chunk-UE4Z3YMB.js";
38
39
  import {
39
40
  CLAUDE_DIR,
40
41
  DIRS,
@@ -42,22 +43,22 @@ import {
42
43
  STANDARD_DIRS,
43
44
  STANDARD_FILES,
44
45
  effectivelyExcludedSkillIds
45
- } from "./chunk-WUSEZFER.js";
46
+ } from "./chunk-U46LYYRA.js";
46
47
 
47
48
  // src/cli/lib/agents/list-compiled-agents.ts
48
49
  import path from "path";
49
50
  import { partition } from "remeda";
50
51
  var CLAUDE_AGENTS = agentCodec("claude");
51
- async function listAgentMdFiles(agentsDir) {
52
- return listAgentFilesOf(agentsDir, CLAUDE_AGENTS);
52
+ async function listAgentMdFiles(agentsDir2) {
53
+ return listAgentFilesOf(agentsDir2, CLAUDE_AGENTS);
53
54
  }
54
- async function listAgentFilesOf(agentsDir, codec) {
55
- return glob(codec.listGlob, agentsDir);
55
+ async function listAgentFilesOf(agentsDir2, codec) {
56
+ return glob(codec.listGlob, agentsDir2);
56
57
  }
57
- async function splitAgentsByProvenance(agentsDir, codec = CLAUDE_AGENTS) {
58
- const files = await listAgentFilesOf(agentsDir, codec);
58
+ async function splitAgentsByProvenance(agentsDir2, codec = CLAUDE_AGENTS) {
59
+ const files = await listAgentFilesOf(agentsDir2, codec);
59
60
  const classified = await Promise.all(
60
- files.map((file) => readAgentProvenance(agentsDir, file, codec))
61
+ files.map((file) => readAgentProvenance(agentsDir2, file, codec))
61
62
  );
62
63
  const [marked, unmarked] = partition(classified, (agent) => agent.compiledHere);
63
64
  return {
@@ -65,22 +66,22 @@ async function splitAgentsByProvenance(agentsDir, codec = CLAUDE_AGENTS) {
65
66
  unmarked: unmarked.map((agent) => agent.name)
66
67
  };
67
68
  }
68
- async function readAgentProvenance(agentsDir, file, codec) {
69
- const content = await readFileOptional(path.join(agentsDir, file));
69
+ async function readAgentProvenance(agentsDir2, file, codec) {
70
+ const content = await readFileOptional(path.join(agentsDir2, file));
70
71
  return { name: path.basename(file, codec.extension), compiledHere: codec.hasMarker(content) };
71
72
  }
72
- async function listCompiledAgentNames(agentsDir) {
73
- const files = await listAgentMdFiles(agentsDir);
73
+ async function listCompiledAgentNames(agentsDir2) {
74
+ const files = await listAgentMdFiles(agentsDir2);
74
75
  return files.map((f) => path.basename(f, CLAUDE_AGENTS.extension));
75
76
  }
76
- async function pruneStaleCompiledAgents(agentsDir, keep, codec = CLAUDE_AGENTS) {
77
+ async function pruneStaleCompiledAgents(agentsDir2, keep, codec = CLAUDE_AGENTS) {
77
78
  const isStaleCompiledAgent = (file) => {
78
79
  const name = path.basename(file, codec.extension);
79
80
  return isAgentName(name) && !keep.has(name);
80
81
  };
81
- const files = await listAgentFilesOf(agentsDir, codec);
82
+ const files = await listAgentFilesOf(agentsDir2, codec);
82
83
  await Promise.all(
83
- files.filter(isStaleCompiledAgent).map((file) => remove(path.join(agentsDir, file)))
84
+ files.filter(isStaleCompiledAgent).map((file) => remove(path.join(agentsDir2, file)))
84
85
  );
85
86
  }
86
87
 
@@ -88,7 +89,6 @@ async function pruneStaleCompiledAgents(agentsDir, keep, codec = CLAUDE_AGENTS)
88
89
  import { partition as partition2 } from "remeda";
89
90
 
90
91
  // src/cli/lib/agents/write-compiled-agents.ts
91
- import os from "os";
92
92
  import path4 from "path";
93
93
 
94
94
  // src/cli/lib/compiler.ts
@@ -140,9 +140,8 @@ async function readOutputPartial(agentDir, categoryDir) {
140
140
  if (own) return own;
141
141
  return readFileOptional(path3.join(categoryDir, STANDARD_FILES.OUTPUT_MD), "");
142
142
  }
143
- async function createLiquidEngine(projectDir) {
143
+ async function createLiquidEngine(projectDir, provider = providerInUse(projectDir)) {
144
144
  const roots = [];
145
- const provider = providerInUse(projectDir);
146
145
  if (projectDir) {
147
146
  const srcTemplatesDir = path3.join(
148
147
  sourceFolderInUse(projectDir, provider).dir,
@@ -194,13 +193,11 @@ async function holdsExactly(filePath, content) {
194
193
  }
195
194
  var UNROUTED_AGENT_SCOPE = "project";
196
195
  async function writeCompiledAgentsByScope(params) {
196
+ const own = params.provider ?? providerInUse(params.projectDir);
197
+ const inherited = inheritedGlobalProvider(params.projectDir, own);
197
198
  const hosts = {
198
- // Each scope reads its own root: a Codex project under a Claude global is allowed.
199
- global: {
200
- provider: providerInUse(os.homedir()),
201
- agentsDir: resolveInstallPaths(os.homedir(), "global").agentsDir
202
- },
203
- project: { provider: providerInUse(params.projectDir), agentsDir: params.projectAgentsDir }
199
+ global: { provider: inherited, agentsDir: agentsDir(inherited, "global", params.projectDir) },
200
+ project: { provider: own, agentsDir: params.projectAgentsDir }
204
201
  };
205
202
  const outcomes = [];
206
203
  for (const [name, agent] of typedEntries(params.resolvedAgents)) {
@@ -300,8 +297,9 @@ function withoutExcludedAssignments(stack, excludedIds) {
300
297
  async function recompileAgents(options) {
301
298
  const { pluginDir, sourcePath, skills: providedSkills, projectDir, outputDir } = options;
302
299
  const configDir = projectDir ?? pluginDir;
303
- const filteredConfig = await loadConfigWithoutExclusions(configDir);
304
- const allAgents = await loadAgentDefinitions(sourcePath, projectDir);
300
+ const provider = options.provider ?? providerInUse(configDir);
301
+ const filteredConfig = await loadConfigWithoutExclusions(configDir, provider);
302
+ const allAgents = await loadAgentDefinitions(sourcePath, projectDir, provider);
305
303
  const agentNames = await resolveAgentNames({
306
304
  ...options.agents !== void 0 && { specifiedAgents: options.agents },
307
305
  projectConfig: filteredConfig,
@@ -313,35 +311,36 @@ async function recompileAgents(options) {
313
311
  return { compiled: [], rewritten: [], failed: [], warnings: [] };
314
312
  }
315
313
  verbose(`Recompiling ${agentNames.length} agents in ${outputDir ?? pluginDir}`);
316
- const pluginSkills = providedSkills ?? await discoverAllPluginSkills(projectDir ?? pluginDir);
314
+ const pluginSkills = providedSkills ?? await discoverAllPluginSkills(configDir, provider);
317
315
  const { configAgents, missingWarnings } = compileEntriesFor(
318
316
  agentNames,
319
317
  filteredConfig,
320
318
  allAgents
321
319
  );
322
320
  const compileConfig = compileConfigFor(filteredConfig, configAgents, pluginDir);
323
- const engine = await createLiquidEngine(projectDir);
321
+ const engine = await createLiquidEngine(projectDir, provider);
324
322
  const resolvedAgents = await resolveAgents(allAgents, pluginSkills, compileConfig);
325
- const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);
326
- await ensureDir(agentsDir);
323
+ const agentsDir2 = outputDir ?? getPluginAgentsDir(pluginDir);
324
+ await ensureDir(agentsDir2);
327
325
  const outcomes = await writeCompiledAgentsByScope({
328
326
  resolvedAgents,
329
327
  sourcePath,
330
328
  engine,
331
- projectAgentsDir: agentsDir,
332
- // Same root as the config, so format and configuration come from one installation.
329
+ projectAgentsDir: agentsDir2,
330
+ // The config's own installation, so format and configuration agree.
333
331
  projectDir: configDir,
332
+ provider,
334
333
  ...options.agentScopeMap !== void 0 && { agentScopeMap: options.agentScopeMap }
335
334
  });
336
335
  return buildRecompileResult(outcomes, missingWarnings);
337
336
  }
338
- async function loadConfigWithoutExclusions(configDir) {
339
- const loaded = await loadProjectConfig(configDir);
337
+ async function loadConfigWithoutExclusions(configDir, provider) {
338
+ const loaded = await loadProjectConfig(configDir, provider);
340
339
  return loaded ? filterExcludedEntries(loaded.config) : null;
341
340
  }
342
- async function loadAgentDefinitions(sourcePath, projectDir) {
341
+ async function loadAgentDefinitions(sourcePath, projectDir, provider) {
343
342
  const builtinAgents = await loadAllAgents(sourcePath);
344
- const projectAgents = projectDir ? await loadProjectAgents(projectDir) : {};
343
+ const projectAgents = projectDir ? await loadProjectAgents(projectDir, provider) : {};
345
344
  return { ...builtinAgents, ...projectAgents };
346
345
  }
347
346
  function compileConfigFor(config, agents, pluginDir) {
@@ -374,4 +373,4 @@ export {
374
373
  withoutExcludedAssignments,
375
374
  recompileAgents
376
375
  };
377
- //# sourceMappingURL=chunk-EFXVYQGT.js.map
376
+ //# sourceMappingURL=chunk-MQZNDK5F.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/lib/agents/list-compiled-agents.ts","../src/cli/lib/agents/agent-recompiler.ts","../src/cli/lib/agents/write-compiled-agents.ts","../src/cli/lib/compiler.ts","../src/cli/lib/agents/agent-provenance.ts"],"sourcesContent":["import path from \"path\";\nimport { partition } from \"remeda\";\nimport { glob, readFileOptional, remove } from \"../../utils/fs\";\nimport { isAgentName } from \"../../utils/type-guards\";\nimport { type AgentCodec, agentCodec } from \"../installation/install-layout\";\nimport type { AgentName } from \"../../types\";\n\n/**\n * The default codec; a caller on another host passes that host's\n * (`agentCodec(providerInUse(dir))`).\n */\nconst CLAUDE_AGENTS = agentCodec(\"claude\");\n\ntype AgentProvenanceSplit = {\n marked: string[];\n unmarked: string[];\n};\n\nexport async function listAgentMdFiles(agentsDir: string): Promise<string[]> {\n return listAgentFilesOf(agentsDir, CLAUDE_AGENTS);\n}\n\nexport async function listAgentFilesOf(agentsDir: string, codec: AgentCodec): Promise<string[]> {\n return glob(codec.listGlob, agentsDir);\n}\n\n/** An unreadable file lands in `unmarked`: \"cannot prove it is ours\" means leave it alone. */\nexport async function splitAgentsByProvenance(\n agentsDir: string,\n codec: AgentCodec = CLAUDE_AGENTS,\n): Promise<AgentProvenanceSplit> {\n const files = await listAgentFilesOf(agentsDir, codec);\n const classified = await Promise.all(\n files.map((file) => readAgentProvenance(agentsDir, file, codec)),\n );\n const [marked, unmarked] = partition(classified, (agent) => agent.compiledHere);\n\n return {\n marked: marked.map((agent) => agent.name),\n unmarked: unmarked.map((agent) => agent.name),\n };\n}\n\ntype ClassifiedAgent = { name: string; compiledHere: boolean };\n\nasync function readAgentProvenance(\n agentsDir: string,\n file: string,\n codec: AgentCodec,\n): Promise<ClassifiedAgent> {\n const content = await readFileOptional(path.join(agentsDir, file));\n return { name: path.basename(file, codec.extension), compiledHere: codec.hasMarker(content) };\n}\n\nexport async function listCompiledAgentNames(agentsDir: string): Promise<AgentName[]> {\n const files = await listAgentMdFiles(agentsDir);\n // Boundary cast: custom marketplace agents may fall outside the AgentName union.\n return files.map((f) => path.basename(f, CLAUDE_AGENTS.extension) as AgentName);\n}\n\n/**\n * Deletes built-in-named agent files not in `keep`, which must be the complete set for `agentsDir`.\n */\nexport async function pruneStaleCompiledAgents(\n agentsDir: string,\n keep: ReadonlySet<AgentName>,\n codec: AgentCodec = CLAUDE_AGENTS,\n): Promise<void> {\n const isStaleCompiledAgent = (file: string): boolean => {\n const name = path.basename(file, codec.extension);\n return isAgentName(name) && !keep.has(name);\n };\n\n const files = await listAgentFilesOf(agentsDir, codec);\n await Promise.all(\n files.filter(isStaleCompiledAgent).map((file) => remove(path.join(agentsDir, file))),\n );\n}\n","import { partition } from \"remeda\";\nimport { writeCompiledAgentsByScope, type AgentWriteOutcome } from \"./write-compiled-agents\";\nimport { listCompiledAgentNames } from \"./list-compiled-agents\";\nimport path from \"path\";\n\nimport { getErrorMessage } from \"../../utils/errors\";\nimport type {\n AgentDefinition,\n AgentName,\n CompileAgentConfig,\n CompileConfig,\n ProjectConfig,\n SkillDefinitionMap,\n SkillId,\n SkillScope,\n} from \"../../types\";\n\nimport { buildCompileAgents } from \"../installation/local-installer\";\nimport { ensureDir } from \"../../utils/fs\";\nimport { verbose } from \"../../utils/logger\";\nimport { typedEntries, typedFromEntries, typedKeys } from \"../../utils/typed-object\";\nimport { createLiquidEngine } from \"../compiler\";\nimport { loadProjectConfig, effectivelyExcludedSkillIds } from \"../configuration\";\nimport { loadAllAgents, loadProjectAgents } from \"../loading\";\nimport { getPluginAgentsDir } from \"../plugins\";\nimport { discoverAllPluginSkills } from \"../plugins/plugin-discovery\";\nimport { resolveAgents } from \"../resolver\";\nimport { providerInUse } from \"../installation/install-layout\";\nimport type { Provider } from \"../../consts\";\n\nexport type RecompileAgentsOptions = {\n pluginDir: string;\n sourcePath: string;\n agents?: AgentName[];\n skills?: SkillDefinitionMap;\n projectDir?: string;\n /** The installation recompiled, where its directory holds two; the default is the one in use. */\n provider?: Provider;\n outputDir?: string;\n /**\n * When provided, routes agents by scope: global ones to the agents folder of the global\n * installation inherited, project ones to `outputDir`.\n */\n agentScopeMap?: Map<AgentName, SkillScope>;\n};\n\nexport type RecompileAgentsResult = {\n compiled: AgentName[];\n /** The subset of `compiled` whose file content moved; the rest count as unchanged. */\n rewritten: AgentName[];\n failed: AgentName[];\n warnings: string[];\n};\n\nasync function getExistingAgentNames(pluginDir: string): Promise<AgentName[]> {\n return listCompiledAgentNames(getPluginAgentsDir(pluginDir));\n}\n\ntype ResolveAgentNamesParams = {\n specifiedAgents?: AgentName[];\n projectConfig: ProjectConfig | null;\n allAgents: Partial<Record<AgentName, AgentDefinition>>;\n outputDir?: string;\n pluginDir: string;\n};\n\nasync function resolveAgentNames(params: ResolveAgentNamesParams): Promise<AgentName[]> {\n const { specifiedAgents, projectConfig, allAgents, outputDir, pluginDir } = params;\n\n if (specifiedAgents) {\n return specifiedAgents;\n }\n\n // A present config is authoritative even when its roster is empty.\n if (projectConfig) {\n const agentNames = projectConfig.agents.map((a) => a.name);\n verbose(`Using agents from config: ${agentNames.join(\", \")}`);\n return agentNames;\n }\n\n if (outputDir) {\n const names = typedKeys<AgentName>(allAgents);\n verbose(`Using all available agents from source: ${names.join(\", \")}`);\n return names;\n }\n\n return getExistingAgentNames(pluginDir);\n}\n\nfunction buildRecompileResult(\n outcomes: AgentWriteOutcome[],\n priorWarnings: string[],\n): RecompileAgentsResult {\n const [succeeded, failedOutcomes] = partition(\n outcomes,\n (outcome): outcome is Extract<AgentWriteOutcome, { ok: true }> => outcome.ok,\n );\n succeeded.forEach((outcome) =>\n verbose(\n ` ${outcome.rewritten ? \"Rewrote\" : \"Unchanged\"}: ${outcome.name} (${outcome.scope} -> ${outcome.targetDir})`,\n ),\n );\n return {\n compiled: succeeded.map((outcome) => outcome.name),\n rewritten: succeeded.filter((outcome) => outcome.rewritten).map((outcome) => outcome.name),\n failed: failedOutcomes.map((outcome) => outcome.name),\n warnings: [\n ...priorWarnings,\n ...failedOutcomes.map(\n (outcome) => `Failed to compile ${outcome.name}: ${getErrorMessage(outcome.error)}`,\n ),\n ],\n };\n}\n\nexport function filterExcludedEntries(config: ProjectConfig): ProjectConfig {\n const excludedIds = effectivelyExcludedSkillIds(config.skills);\n const activeSkills = config.skills.filter((s) => !s.excluded);\n const activeAgents = config.agents.filter((a) => !a.excluded);\n\n // No stack stays absent rather than an explicit `undefined`.\n const filteredStack =\n config.stack === undefined\n ? {}\n : { stack: withoutExcludedAssignments(config.stack, excludedIds) };\n\n return { ...config, skills: activeSkills, agents: activeAgents, ...filteredStack };\n}\n\n/** Each agent and category keeps its key, even when left with no assignments. */\nexport function withoutExcludedAssignments(\n stack: NonNullable<ProjectConfig[\"stack\"]>,\n excludedIds: ReadonlySet<SkillId>,\n): NonNullable<ProjectConfig[\"stack\"]> {\n return Object.fromEntries(\n typedEntries(stack).map(([agentName, agentStack]) => [\n agentName,\n Object.fromEntries(\n typedEntries(agentStack).map(([category, assignments]) => [\n category,\n assignments.filter((assignment) => !excludedIds.has(assignment.id)),\n ]),\n ),\n ]),\n );\n}\n\nexport async function recompileAgents(\n options: RecompileAgentsOptions,\n): Promise<RecompileAgentsResult> {\n const { pluginDir, sourcePath, skills: providedSkills, projectDir, outputDir } = options;\n\n const configDir = projectDir ?? pluginDir;\n const provider = options.provider ?? providerInUse(configDir);\n const filteredConfig = await loadConfigWithoutExclusions(configDir, provider);\n const allAgents = await loadAgentDefinitions(sourcePath, projectDir, provider);\n\n const agentNames = await resolveAgentNames({\n ...(options.agents !== undefined && { specifiedAgents: options.agents }),\n projectConfig: filteredConfig,\n allAgents,\n ...(outputDir !== undefined && { outputDir }),\n pluginDir,\n });\n\n // An empty pass is not a warning: callers report it off `compiled`.\n if (agentNames.length === 0) {\n return { compiled: [], rewritten: [], failed: [], warnings: [] };\n }\n\n verbose(`Recompiling ${agentNames.length} agents in ${outputDir ?? pluginDir}`);\n\n const pluginSkills: SkillDefinitionMap =\n providedSkills ?? (await discoverAllPluginSkills(configDir, provider));\n\n const { configAgents, missingWarnings } = compileEntriesFor(\n agentNames,\n filteredConfig,\n allAgents,\n );\n const compileConfig = compileConfigFor(filteredConfig, configAgents, pluginDir);\n\n const engine = await createLiquidEngine(projectDir, provider);\n const resolvedAgents = await resolveAgents(allAgents, pluginSkills, compileConfig);\n\n const agentsDir = outputDir ?? getPluginAgentsDir(pluginDir);\n await ensureDir(agentsDir);\n\n const outcomes = await writeCompiledAgentsByScope({\n resolvedAgents,\n sourcePath,\n engine,\n projectAgentsDir: agentsDir,\n // The config's own installation, so format and configuration agree.\n projectDir: configDir,\n provider,\n ...(options.agentScopeMap !== undefined && { agentScopeMap: options.agentScopeMap }),\n });\n return buildRecompileResult(outcomes, missingWarnings);\n}\n\nasync function loadConfigWithoutExclusions(\n configDir: string,\n provider: Provider,\n): Promise<ProjectConfig | null> {\n const loaded = await loadProjectConfig(configDir, provider);\n return loaded ? filterExcludedEntries(loaded.config) : null;\n}\n\n/** A project agent wins over a built-in one of the same name. */\nasync function loadAgentDefinitions(\n sourcePath: string,\n projectDir: string | undefined,\n provider: Provider,\n): Promise<Partial<Record<AgentName, AgentDefinition>>> {\n const builtinAgents = await loadAllAgents(sourcePath);\n const projectAgents = projectDir ? await loadProjectAgents(projectDir, provider) : {};\n\n return { ...builtinAgents, ...projectAgents };\n}\n\nfunction compileConfigFor(\n config: ProjectConfig | null,\n agents: Partial<Record<AgentName, CompileAgentConfig>>,\n pluginDir: string,\n): CompileConfig {\n return {\n name: config?.name || path.basename(pluginDir),\n description: config?.description || \"Recompiled plugin\",\n agents,\n };\n}\n\n/** Only agents the scope filter matches: a project pass must not overwrite stackless globals. */\nfunction compileEntriesFor(\n agentNames: AgentName[],\n config: ProjectConfig | null,\n allAgents: Partial<Record<AgentName, AgentDefinition>>,\n): { configAgents: Partial<Record<AgentName, CompileAgentConfig>>; missingWarnings: string[] } {\n const allConfigAgents = config ? buildCompileAgents(config, allAgents) : {};\n\n const [knownAgents, missingAgents] = partition(agentNames, (name) =>\n Boolean(allConfigAgents[name] || allAgents[name]),\n );\n\n return {\n configAgents: typedFromEntries<AgentName, CompileAgentConfig>(\n knownAgents.map((name) => [name, allConfigAgents[name] ?? {}]),\n ),\n missingWarnings: missingAgents.map((name) => `Agent \"${name}\" not found in source definitions`),\n };\n}\n","import path from \"path\";\nimport type { Liquid } from \"liquidjs\";\nimport { compileAgentForHost } from \"../compiler.js\";\nimport {\n agentCodec,\n agentsDir,\n hostCompilesAgent,\n inheritedGlobalProvider,\n providerInUse,\n} from \"../installation/install-layout.js\";\nimport { writeFile, fileExists, readFile } from \"../../utils/fs.js\";\nimport { typedEntries } from \"../../utils/typed-object.js\";\nimport type { Provider } from \"../../consts.js\";\nimport type { AgentConfig, AgentName, SkillScope } from \"../../types/index.js\";\n\nexport type AgentWriteOutcome =\n | {\n name: AgentName;\n ok: true;\n scope: SkillScope;\n targetDir: string;\n /** False when the output matched the file on disk, so nothing was written. */\n rewritten: boolean;\n }\n | { name: AgentName; ok: false; error: unknown };\n\n/** Skipping an identical write keeps the mtime, the only trace telling unchanged from rewritten. */\nasync function holdsExactly(filePath: string, content: string): Promise<boolean> {\n return (await fileExists(filePath)) && (await readFile(filePath)) === content;\n}\n\n/**\n * Routing for an agent the scope map does not name: the caller's `projectAgentsDir`. Deliberately\n * not the selection default, which would move unrouted agents into `~/.claude/agents`.\n */\nconst UNROUTED_AGENT_SCOPE: SkillScope = \"project\";\n\n/**\n * Per-agent failures come back as outcomes; a directory appears only when an agent routes into it.\n */\nexport async function writeCompiledAgentsByScope(params: {\n resolvedAgents: Partial<Record<AgentName, AgentConfig>>;\n sourcePath: string;\n engine: Liquid;\n projectAgentsDir: string;\n /** The root whose folder says which host the PROJECT scope's sub-agents are written for. */\n projectDir: string;\n /** The installation at `projectDir`, where it holds two; the default is the one in use. */\n provider?: Provider;\n agentScopeMap?: Map<AgentName, SkillScope>;\n}): Promise<AgentWriteOutcome[]> {\n const own = params.provider ?? providerInUse(params.projectDir);\n // `own` where the project holds an installation of it: no other provider's global reaches it.\n const inherited = inheritedGlobalProvider(params.projectDir, own);\n const hosts: Record<SkillScope, AgentHost> = {\n global: { provider: inherited, agentsDir: agentsDir(inherited, \"global\", params.projectDir) },\n project: { provider: own, agentsDir: params.projectAgentsDir },\n };\n\n const outcomes: AgentWriteOutcome[] = [];\n for (const [name, agent] of typedEntries<AgentName, AgentConfig>(params.resolvedAgents)) {\n const scope = params.agentScopeMap?.get(name) ?? UNROUTED_AGENT_SCOPE;\n const host = hosts[scope];\n\n // No outcome for a sub-agent this host does not carry: it was neither compiled nor failed.\n if (!hostCompilesAgent(host.provider, name)) continue;\n\n outcomes.push(await writeOneAgent({ ...params, name, agent, scope, host }));\n }\n return outcomes;\n}\n\n/** Returns the failure rather than throwing: the policy is the caller's. */\nasync function writeOneAgent(params: {\n name: AgentName;\n agent: AgentConfig;\n scope: SkillScope;\n host: AgentHost;\n sourcePath: string;\n engine: Liquid;\n}): Promise<AgentWriteOutcome> {\n const { name, scope, host } = params;\n\n try {\n const output = await compileAgentForHost(\n host.provider,\n name,\n params.agent,\n params.sourcePath,\n params.engine,\n );\n const targetPath = path.join(host.agentsDir, fileNameFor(name, host.provider));\n const rewritten = !(await holdsExactly(targetPath, output));\n if (rewritten) await writeFile(targetPath, output);\n\n return { name, ok: true, scope, targetDir: host.agentsDir, rewritten };\n } catch (error) {\n return { name, ok: false, error };\n }\n}\n\ntype AgentHost = { provider: Provider; agentsDir: string };\n\n/** The extension comes from `agentCodec`, so a `.md` never lands where Codex reads `.toml`. */\nfunction fileNameFor(name: AgentName, provider: Provider): string {\n return `${name}${agentCodec(provider).extension}`;\n}\n","import { Liquid } from \"liquidjs\";\nimport path from \"path\";\nimport {\n buildAgentTemplateContext,\n pluginRefFor,\n renderAgent,\n renderAgentBody,\n renderAgentRoleToml,\n type AgentFiles,\n} from \"@workspace/compile/agent-source\";\nimport { readFile, readFileOptional, directoryExists } from \"../utils/fs\";\nimport { verbose } from \"../utils/logger\";\nimport {\n CLAUDE_DIR,\n DIRS,\n PROJECT_ROOT,\n STANDARD_FILES,\n STANDARD_DIRS,\n type Provider,\n} from \"../consts\";\nimport { providerInUse, sourceFolderInUse, sourceFolderName } from \"./installation/install-layout\";\nimport { cliVersion } from \"./agents/agent-provenance\";\nimport \"./compile-seat.js\";\nimport type { AgentConfig, AgentName } from \"../types\";\n\nexport {\n buildAgentTemplateContext,\n sanitizeCompiledAgentData,\n sanitizeLiquidSyntax,\n} from \"@workspace/compile/agent-source\";\n\nasync function readAgentFiles(\n name: AgentName,\n agent: AgentConfig,\n projectRoot: string,\n): Promise<AgentFiles> {\n const agentSourceRoot = agent.sourceRoot || projectRoot;\n const agentBaseDir = agent.agentBaseDir || DIRS.agents;\n const agentPath = agent.path || name;\n const agentDir = path.join(agentSourceRoot, agentBaseDir, agentPath);\n\n const identity = await readFile(path.join(agentDir, STANDARD_FILES.IDENTITY_MD));\n const playbook = await readFile(path.join(agentDir, STANDARD_FILES.PLAYBOOK_MD));\n const criticalRequirementsTop = await readFileOptional(\n path.join(agentDir, STANDARD_FILES.CRITICAL_REQUIREMENTS_MD),\n \"\",\n );\n const criticalReminders = await readFileOptional(\n path.join(agentDir, STANDARD_FILES.CRITICAL_REMINDERS_MD),\n \"\",\n );\n\n const category = agentPath.split(\"/\")[0] || name;\n const categoryDir = path.join(agentSourceRoot, agentBaseDir, category);\n const output = await readOutputPartial(agentDir, categoryDir);\n\n return { identity, playbook, output, criticalRequirementsTop, criticalReminders };\n}\n\n/** The agent's own `output.md`, or its category's where the agent's is absent or empty. */\nasync function readOutputPartial(agentDir: string, categoryDir: string): Promise<string> {\n const own = await readFileOptional(path.join(agentDir, STANDARD_FILES.OUTPUT_MD), \"\");\n if (own) return own;\n return readFileOptional(path.join(categoryDir, STANDARD_FILES.OUTPUT_MD), \"\");\n}\n\n/**\n * Template roots, first match wins: the project source folder's `agents/_templates/`, legacy\n * `.claude/templates/`, then the built-ins. The options mirror `createEngineFromTemplates` in\n * `@workspace/compile/engine`; keep the two in sync.\n */\nexport async function createLiquidEngine(\n projectDir?: string,\n // One read for both: template overrides and source folder must name one installation.\n provider: Provider = providerInUse(projectDir),\n): Promise<Liquid> {\n const roots: string[] = [];\n\n if (projectDir) {\n const srcTemplatesDir = path.join(\n sourceFolderInUse(projectDir, provider).dir,\n STANDARD_DIRS.AGENTS,\n path.basename(DIRS.templates),\n );\n if (await directoryExists(srcTemplatesDir)) {\n roots.push(srcTemplatesDir);\n verbose(`Using local templates from: ${srcTemplatesDir}`);\n }\n\n const legacyTemplatesDir = path.join(projectDir, CLAUDE_DIR, STANDARD_DIRS.TEMPLATES);\n if (await directoryExists(legacyTemplatesDir)) {\n roots.push(legacyTemplatesDir);\n verbose(`Using legacy templates from: ${legacyTemplatesDir}`);\n }\n }\n\n roots.push(path.join(PROJECT_ROOT, DIRS.templates));\n\n return new Liquid({\n root: roots,\n extname: \".liquid\",\n strictVariables: false,\n strictFilters: true,\n globals: { sourceFolder: sourceFolderName(projectDir, provider) },\n });\n}\n\n/** Both hosts render from one template context; only the wrapper differs (markdown or TOML). */\nexport async function compileAgentForHost(\n provider: Provider,\n name: AgentName,\n agent: AgentConfig,\n fallbackRoot: string,\n engine: Liquid,\n): Promise<string> {\n verbose(`Compiling agent: ${name} (${provider})`);\n\n const files = await readAgentFiles(name, agent, fallbackRoot);\n\n // Each skill's own `source` decides `${id}:${id}` versus a bare id; no `source` means bare.\n const data = buildAgentTemplateContext(name, agent, files, (skill) => ({\n ...skill,\n ...pluginRefFor(skill),\n }));\n const version = await cliVersion();\n\n switch (provider) {\n case \"claude\":\n return renderAgent(engine, data, version);\n case \"codex\":\n return renderAgentRoleToml(agent, await renderAgentBody(engine, data, version));\n default: {\n const _exhaustive: never = provider;\n return _exhaustive;\n }\n }\n}\n","import path from \"path\";\nimport { z } from \"zod\";\n\nimport { PROJECT_ROOT, STANDARD_FILES } from \"../../consts\";\nimport { readFile } from \"../../utils/fs\";\n\nconst ownPackageJsonSchema = z.object({ version: z.string().min(1) });\n\nexport {\n hasProvenanceMarker,\n provenanceMarker,\n stampProvenanceMarker,\n} from \"@workspace/compile/agent-source\";\n\nlet ownVersion: Promise<string> | undefined;\n\n/**\n * Rendered in the trailing `<system-reminder>`, not the provenance marker, so a version bump leaves\n * the first cacheable bytes of every compiled agent unchanged.\n */\nexport function cliVersion(): Promise<string> {\n ownVersion ??= readOwnVersion();\n return ownVersion;\n}\n\nasync function readOwnVersion(): Promise<string> {\n const manifestPath = path.join(PROJECT_ROOT, STANDARD_FILES.PACKAGE_JSON);\n const raw: unknown = JSON.parse(await readFile(manifestPath));\n\n const parsed = ownPackageJsonSchema.safeParse(raw);\n if (!parsed.success) {\n throw new Error(`Could not read this CLI's own version from ${manifestPath}`);\n }\n return parsed.data.version;\n}\n"],"mappings":"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","names":["agentsDir","partition","path","path","path","path","path","path","path","partition","agentsDir","path"]}
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  truncateText
4
- } from "./chunk-AIBVAYHS.js";
4
+ } from "./chunk-UE4Z3YMB.js";
5
5
  import {
6
6
  SEED_API_URL,
7
7
  seedPayloadSchema
8
- } from "./chunk-WUSEZFER.js";
8
+ } from "./chunk-U46LYYRA.js";
9
9
 
10
10
  // ../../node_modules/hono/dist/utils/cookie.js
11
11
  var validCookieNameRegEx = /^[\w!#$%&'*.^`|~+-]+$/;
@@ -425,4 +425,4 @@ export {
425
425
  jsonBodyOrUndefined,
426
426
  arrivedAsText
427
427
  };
428
- //# sourceMappingURL=chunk-QCX66KBM.js.map
428
+ //# sourceMappingURL=chunk-SN64WNWE.js.map
@@ -10997,9 +10997,10 @@ import { isIPv4 } from "net";
10997
10997
  import os from "os";
10998
10998
  import path from "path";
10999
10999
  import { fileURLToPath } from "url";
11000
+ var BUILD_DIR = "dist";
11000
11001
  var __filename2 = fileURLToPath(import.meta.url);
11001
11002
  var __dirname2 = path.dirname(__filename2);
11002
- var isInDist = __dirname2.includes("/dist");
11003
+ var isInDist = path.basename(__dirname2) === BUILD_DIR;
11003
11004
  var PROJECT_ROOT = isInDist ? path.resolve(__dirname2, "..") : path.resolve(__dirname2, "../..");
11004
11005
  var PLUGINS_SUBDIR = "plugins";
11005
11006
  var PLUGIN_MANIFEST_DIR = ".claude-plugin";
@@ -11225,4 +11226,4 @@ export {
11225
11226
  CLI_COLORS,
11226
11227
  ASCII_LOGO
11227
11228
  };
11228
- //# sourceMappingURL=chunk-WUSEZFER.js.map
11229
+ //# sourceMappingURL=chunk-U46LYYRA.js.map