@agents-inc/cli 0.74.5 → 0.74.8

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 (154) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/{chunk-QK4CJOLO.js → chunk-4Q2JLBCX.js} +2 -2
  3. package/dist/{chunk-FOPJDYUF.js → chunk-7JVDZFJG.js} +4 -6
  4. package/dist/chunk-7JVDZFJG.js.map +1 -0
  5. package/dist/{chunk-XV6A6PAW.js → chunk-7SKGMV7P.js} +13 -13
  6. package/dist/{chunk-4OLQ4QPH.js → chunk-7W226BOV.js} +5 -6
  7. package/dist/chunk-7W226BOV.js.map +1 -0
  8. package/dist/{chunk-HRJTZXRF.js → chunk-BQW4ONJE.js} +6 -8
  9. package/dist/{chunk-HRJTZXRF.js.map → chunk-BQW4ONJE.js.map} +1 -1
  10. package/dist/{chunk-6VIOO74O.js → chunk-CBYRFAUN.js} +1 -3
  11. package/dist/{chunk-6VIOO74O.js.map → chunk-CBYRFAUN.js.map} +1 -1
  12. package/dist/{chunk-PPFXT5LC.js → chunk-E3MF6GGS.js} +27 -17
  13. package/dist/chunk-E3MF6GGS.js.map +1 -0
  14. package/dist/{chunk-BKTPEATV.js → chunk-F7LOH754.js} +2 -2
  15. package/dist/{chunk-P2BH6X2C.js → chunk-FVMYBN5K.js} +90 -86
  16. package/dist/chunk-FVMYBN5K.js.map +1 -0
  17. package/dist/{chunk-U3EDOGQG.js → chunk-GNA6IOQZ.js} +2 -2
  18. package/dist/{chunk-WMSV5AJT.js → chunk-HJY4354Y.js} +4 -4
  19. package/dist/{chunk-MVYJVKVT.js → chunk-HT5KOOUQ.js} +2 -2
  20. package/dist/{chunk-KDEOCJMS.js → chunk-ICJV3JJF.js} +83 -3
  21. package/dist/chunk-ICJV3JJF.js.map +1 -0
  22. package/dist/{chunk-NIA3NQBT.js → chunk-IJNNVCS4.js} +2 -2
  23. package/dist/{chunk-JAPYUFAM.js → chunk-KZG3EQSH.js} +5 -5
  24. package/dist/{chunk-TW64EOM7.js → chunk-LVNNP7T4.js} +16 -5
  25. package/dist/chunk-LVNNP7T4.js.map +1 -0
  26. package/dist/{chunk-KYULKBFC.js → chunk-NA6I5P5P.js} +2 -2
  27. package/dist/{chunk-4OBRPE6A.js → chunk-NG2GGK6P.js} +5 -1
  28. package/dist/{chunk-4OBRPE6A.js.map → chunk-NG2GGK6P.js.map} +1 -1
  29. package/dist/{chunk-RINGLIE7.js → chunk-PN65K3LH.js} +3 -3
  30. package/dist/{chunk-JNMZVX5S.js → chunk-Q53GBFTO.js} +3 -3
  31. package/dist/{chunk-AQBZJUAL.js → chunk-RBR355UI.js} +7 -7
  32. package/dist/{chunk-KIY36DJU.js → chunk-SM4FX2IU.js} +6 -92
  33. package/dist/chunk-SM4FX2IU.js.map +1 -0
  34. package/dist/{chunk-IK6GTV3N.js → chunk-TPXDHJDB.js} +3 -3
  35. package/dist/{chunk-JGSCFYCP.js → chunk-TUGXTCGX.js} +3 -3
  36. package/dist/{chunk-2MHSOPIU.js → chunk-UFKDY45I.js} +2 -2
  37. package/dist/{chunk-CTKWL3GL.js → chunk-ULP3GGXG.js} +4 -4
  38. package/dist/{chunk-DBPC4V25.js → chunk-X6LXHVA6.js} +3 -3
  39. package/dist/{chunk-FFNBQMMZ.js → chunk-ZU7AOE3X.js} +2 -2
  40. package/dist/commands/build/plugins.js +3 -4
  41. package/dist/commands/build/plugins.js.map +1 -1
  42. package/dist/commands/build/stack.js +3 -4
  43. package/dist/commands/build/stack.js.map +1 -1
  44. package/dist/commands/compile.js +3 -4
  45. package/dist/commands/compile.js.map +1 -1
  46. package/dist/commands/config/index.js +3 -4
  47. package/dist/commands/config/index.js.map +1 -1
  48. package/dist/commands/config/path.js +2 -3
  49. package/dist/commands/config/path.js.map +1 -1
  50. package/dist/commands/config/show.js +3 -4
  51. package/dist/commands/diff.js +2 -3
  52. package/dist/commands/diff.js.map +1 -1
  53. package/dist/commands/doctor.js +2 -3
  54. package/dist/commands/doctor.js.map +1 -1
  55. package/dist/commands/edit.js +58 -43
  56. package/dist/commands/edit.js.map +1 -1
  57. package/dist/commands/eject.js +2 -3
  58. package/dist/commands/eject.js.map +1 -1
  59. package/dist/commands/import/skill.js +2 -3
  60. package/dist/commands/import/skill.js.map +1 -1
  61. package/dist/commands/info.js +2 -3
  62. package/dist/commands/info.js.map +1 -1
  63. package/dist/commands/init.js +20 -21
  64. package/dist/commands/list.js +2 -3
  65. package/dist/commands/list.js.map +1 -1
  66. package/dist/commands/new/agent.js +3 -4
  67. package/dist/commands/new/agent.js.map +1 -1
  68. package/dist/commands/new/marketplace.js +3 -4
  69. package/dist/commands/new/marketplace.js.map +1 -1
  70. package/dist/commands/new/skill.js +3 -4
  71. package/dist/commands/outdated.js +2 -3
  72. package/dist/commands/outdated.js.map +1 -1
  73. package/dist/commands/search.js +4 -5
  74. package/dist/commands/search.js.map +1 -1
  75. package/dist/commands/uninstall.js +2 -3
  76. package/dist/commands/uninstall.js.map +1 -1
  77. package/dist/commands/update.js +3 -4
  78. package/dist/commands/update.js.map +1 -1
  79. package/dist/commands/validate.js +63 -46
  80. package/dist/commands/validate.js.map +1 -1
  81. package/dist/components/skill-search/skill-search.js +2 -2
  82. package/dist/components/wizard/category-grid.js +3 -3
  83. package/dist/components/wizard/category-grid.test.js +8 -9
  84. package/dist/components/wizard/category-grid.test.js.map +1 -1
  85. package/dist/components/wizard/domain-selection.js +5 -6
  86. package/dist/components/wizard/help-modal.js +2 -2
  87. package/dist/components/wizard/search-modal.js +2 -2
  88. package/dist/components/wizard/search-modal.test.js +2 -2
  89. package/dist/components/wizard/source-grid.js +4 -4
  90. package/dist/components/wizard/source-grid.test.js +9 -10
  91. package/dist/components/wizard/source-grid.test.js.map +1 -1
  92. package/dist/components/wizard/stack-selection.js +4 -5
  93. package/dist/components/wizard/step-agents.js +5 -6
  94. package/dist/components/wizard/step-agents.test.js +8 -9
  95. package/dist/components/wizard/step-agents.test.js.map +1 -1
  96. package/dist/components/wizard/step-build.js +7 -8
  97. package/dist/components/wizard/step-build.test.js +9 -10
  98. package/dist/components/wizard/step-build.test.js.map +1 -1
  99. package/dist/components/wizard/step-confirm.js +4 -5
  100. package/dist/components/wizard/step-confirm.test.js +7 -8
  101. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  102. package/dist/components/wizard/step-refine.js +2 -2
  103. package/dist/components/wizard/step-refine.test.js +2 -2
  104. package/dist/components/wizard/step-settings.js +4 -5
  105. package/dist/components/wizard/step-settings.test.js +7 -8
  106. package/dist/components/wizard/step-settings.test.js.map +1 -1
  107. package/dist/components/wizard/step-sources.js +7 -8
  108. package/dist/components/wizard/step-sources.test.js +10 -11
  109. package/dist/components/wizard/step-sources.test.js.map +1 -1
  110. package/dist/components/wizard/step-stack.js +7 -8
  111. package/dist/components/wizard/step-stack.test.js +8 -9
  112. package/dist/components/wizard/step-stack.test.js.map +1 -1
  113. package/dist/components/wizard/wizard-layout.js +6 -7
  114. package/dist/components/wizard/wizard.js +19 -20
  115. package/dist/hooks/init.js +22 -27
  116. package/dist/hooks/init.js.map +1 -1
  117. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  118. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  119. package/dist/source-loader-X46F4X2B.js +23 -0
  120. package/dist/{source-manager-FVOH3VXK.js → source-manager-WG7HJHVW.js} +3 -4
  121. package/dist/stores/wizard-store.js +3 -4
  122. package/dist/stores/wizard-store.test.js +30 -10
  123. package/dist/stores/wizard-store.test.js.map +1 -1
  124. package/package.json +1 -1
  125. package/dist/chunk-4OLQ4QPH.js.map +0 -1
  126. package/dist/chunk-FOPJDYUF.js.map +0 -1
  127. package/dist/chunk-KDEOCJMS.js.map +0 -1
  128. package/dist/chunk-KIY36DJU.js.map +0 -1
  129. package/dist/chunk-P2BH6X2C.js.map +0 -1
  130. package/dist/chunk-PPFXT5LC.js.map +0 -1
  131. package/dist/chunk-TW64EOM7.js.map +0 -1
  132. package/dist/chunk-XXK6MFOA.js +0 -28
  133. package/dist/chunk-XXK6MFOA.js.map +0 -1
  134. package/dist/source-loader-IV6MOOPQ.js +0 -18
  135. /package/dist/{chunk-QK4CJOLO.js.map → chunk-4Q2JLBCX.js.map} +0 -0
  136. /package/dist/{chunk-XV6A6PAW.js.map → chunk-7SKGMV7P.js.map} +0 -0
  137. /package/dist/{chunk-BKTPEATV.js.map → chunk-F7LOH754.js.map} +0 -0
  138. /package/dist/{chunk-U3EDOGQG.js.map → chunk-GNA6IOQZ.js.map} +0 -0
  139. /package/dist/{chunk-WMSV5AJT.js.map → chunk-HJY4354Y.js.map} +0 -0
  140. /package/dist/{chunk-MVYJVKVT.js.map → chunk-HT5KOOUQ.js.map} +0 -0
  141. /package/dist/{chunk-NIA3NQBT.js.map → chunk-IJNNVCS4.js.map} +0 -0
  142. /package/dist/{chunk-JAPYUFAM.js.map → chunk-KZG3EQSH.js.map} +0 -0
  143. /package/dist/{chunk-KYULKBFC.js.map → chunk-NA6I5P5P.js.map} +0 -0
  144. /package/dist/{chunk-RINGLIE7.js.map → chunk-PN65K3LH.js.map} +0 -0
  145. /package/dist/{chunk-JNMZVX5S.js.map → chunk-Q53GBFTO.js.map} +0 -0
  146. /package/dist/{chunk-AQBZJUAL.js.map → chunk-RBR355UI.js.map} +0 -0
  147. /package/dist/{chunk-IK6GTV3N.js.map → chunk-TPXDHJDB.js.map} +0 -0
  148. /package/dist/{chunk-JGSCFYCP.js.map → chunk-TUGXTCGX.js.map} +0 -0
  149. /package/dist/{chunk-2MHSOPIU.js.map → chunk-UFKDY45I.js.map} +0 -0
  150. /package/dist/{chunk-CTKWL3GL.js.map → chunk-ULP3GGXG.js.map} +0 -0
  151. /package/dist/{chunk-DBPC4V25.js.map → chunk-X6LXHVA6.js.map} +0 -0
  152. /package/dist/{chunk-FFNBQMMZ.js.map → chunk-ZU7AOE3X.js.map} +0 -0
  153. /package/dist/{source-loader-IV6MOOPQ.js.map → source-loader-X46F4X2B.js.map} +0 -0
  154. /package/dist/{source-manager-FVOH3VXK.js.map → source-manager-WG7HJHVW.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/stores/wizard-store.ts"],"sourcesContent":["import { unique } from \"remeda\";\nimport { create } from \"zustand\";\nimport { BUILT_IN_DOMAIN_ORDER, DEFAULT_PUBLIC_SOURCE_NAME } from \"../consts.js\";\nimport type { InstallMode } from \"../lib/installation/index.js\";\nimport { deriveInstallMode as sharedDeriveInstallMode } from \"../lib/installation/installation.js\";\nimport type { AgentScopeConfig, SkillConfig } from \"../types/config.js\";\nimport { resolveAlias } from \"../lib/matrix/index.js\";\nimport { matrix, getSkillById, getCategoryDomain } from \"../lib/matrix/matrix-provider.js\";\nimport type {\n AgentName,\n BoundSkill,\n Domain,\n DomainSelections,\n ResolvedSkill,\n SkillAlias,\n SkillAssignment,\n SkillId,\n SkillSource,\n Category,\n CategoryDomainMap,\n} from \"../types/index.js\";\nimport type { SourceOption } from \"../components/wizard/source-grid.js\";\nimport { warn } from \"../utils/logger.js\";\nimport { typedEntries, typedKeys } from \"../utils/typed-object.js\";\n\nconst BUILT_IN_DOMAINS: Domain[] = [\"web\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\nfunction createDefaultSkillConfig(id: SkillId): SkillConfig {\n const skill = matrix.skills[id];\n const primarySource = skill?.availableSources?.find((s) => s.primary)?.name;\n return { id, scope: \"global\", source: primarySource ?? DEFAULT_PUBLIC_SOURCE_NAME };\n}\n\n/** Derive all unique domains from a categories map, preserving built-in order then appending custom. */\nfunction getAllDomainsFromCategories(categories: CategoryDomainMap): Domain[] {\n const allDomains = unique(\n Object.values(categories)\n .map((cat) => cat?.domain)\n .filter((d): d is Domain => d != null),\n );\n return [...BUILT_IN_DOMAINS, ...allDomains.filter((d) => !BUILT_IN_DOMAINS.includes(d))];\n}\n\n/** Sort domains into canonical order: custom domains first (alphabetically), then built-in domains per BUILT_IN_DOMAIN_ORDER. */\nfunction sortDomainsCanonically(domains: Domain[]): Domain[] {\n const builtInSet = new Set<Domain>(BUILT_IN_DOMAIN_ORDER);\n return [\n ...domains.filter((d) => !builtInSet.has(d)).sort(),\n ...BUILT_IN_DOMAIN_ORDER.filter((d) => domains.includes(d)),\n ];\n}\n\n/** Built-in agent names grouped by domain prefix. Custom domains return no preselected agents. */\nconst DOMAIN_AGENTS: Partial<Record<string, AgentName[]>> = {\n web: [\n \"web-developer\",\n \"web-reviewer\",\n \"web-researcher\",\n \"web-tester\",\n \"web-pm\",\n \"web-architecture\",\n ],\n api: [\"api-developer\", \"api-reviewer\", \"api-researcher\"],\n cli: [\"cli-developer\", \"cli-tester\", \"cli-reviewer\"],\n};\n\n/**\n * Fixed source sort tiers (lower = higher priority):\n * 1 = local/global (installed on disk -- type \"local\" or installed via plugin)\n * 2 = scoped marketplace (primary source from --source flag)\n * 3 = default public marketplace (Agents Inc)\n * 4 = third-party marketplaces (extra configured sources)\n */\nconst SOURCE_SORT_TIER_LOCAL = 1;\nconst SOURCE_SORT_TIER_SCOPED = 2;\nconst SOURCE_SORT_TIER_PUBLIC = 3;\nconst SOURCE_SORT_TIER_THIRD_PARTY = 4;\n\nfunction getSourceSortTier(source: SkillSource): number {\n if (source.type === \"local\") return SOURCE_SORT_TIER_LOCAL;\n if (source.primary) return SOURCE_SORT_TIER_SCOPED;\n if (source.type === \"public\") return SOURCE_SORT_TIER_PUBLIC;\n return SOURCE_SORT_TIER_THIRD_PARTY;\n}\n\nexport type SkillLookupEntry = Pick<ResolvedSkill, \"category\" | \"displayName\">;\n\nfunction resolveSkillForPopulation(\n skillId: SkillId,\n): { domain: Domain; subcat: Category; techId: SkillId } | null {\n const { skills } = matrix;\n const skill = skills[skillId];\n if (!skill?.category) {\n warn(\n `Installed skill '${skillId}' is missing from the marketplace — it may have been removed or renamed`,\n );\n return null;\n }\n\n const domain = getCategoryDomain(skill.category);\n if (!domain) {\n warn(`Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`);\n return null;\n }\n\n // Boundary cast: domain lookup confirmed category exists in matrix\n const subcat = skill.category as Category;\n return { domain, subcat, techId: skillId };\n}\n\nfunction buildBoundSkillOptions(\n boundSkills: BoundSkill[],\n alias: SkillAlias,\n selectedSource: string,\n): SourceOption[] {\n return boundSkills\n .filter((b) => b.boundTo === alias)\n .map((bound) => ({\n id: bound.sourceName,\n selected: selectedSource === bound.sourceName,\n installed: false,\n }));\n}\n\n/**\n * Wizard step identifiers for the multi-step init/edit flow.\n *\n * Progression: stack -> build -> sources -> agents -> confirm\n * The \"stack\" step shows all stacks + \"Start from scratch\" in a unified list.\n * Navigation is tracked via the `history` stack for goBack() support.\n */\nexport type WizardStep =\n | \"stack\" // Unified first step: select stack or \"Start from scratch\", then domain selection\n | \"build\" // CategoryGrid for technology selection\n | \"sources\" // Choose skill sources (recommended vs custom)\n | \"agents\" // Select which agents to compile\n | \"confirm\"; // Final confirmation\n\n/**\n * Wizard store state and actions.\n *\n * The store uses a composition pattern: small, focused actions that each mutate\n * one or two state fields. Wizard step components compose these actions to build\n * up the full selection state incrementally (domains -> categories -> skills -> sources).\n *\n * State flow: unified stack/scratch selection -> domain selection -> per-domain skill\n * selection (build step) -> source customization -> confirmation.\n */\nexport type WizardState = {\n step: WizardStep;\n\n approach: \"stack\" | \"scratch\" | null;\n selectedStackId: string | null;\n stackAction: \"defaults\" | \"customize\" | null;\n\n selectedDomains: Domain[];\n\n currentDomainIndex: number;\n domainSelections: DomainSelections;\n /** Snapshot of stack-provided domain selections for restoration on domain re-toggle */\n _stackDomainSelections: DomainSelections | null;\n\n showLabels: boolean;\n\n skillConfigs: SkillConfig[];\n focusedSkillId: SkillId | null;\n\n customizeSources: boolean;\n\n showSettings: boolean;\n showHelp: boolean;\n enabledSources: Record<string, boolean>;\n\n selectedAgents: AgentName[];\n agentConfigs: AgentScopeConfig[];\n focusedAgentId: AgentName | null;\n\n boundSkills: BoundSkill[];\n\n /** Skill IDs that cannot be toggled or removed (D9: existing global items in project context) */\n lockedSkillIds: SkillId[];\n /** Agent names that cannot be toggled or removed (D9: existing global agents in project context) */\n lockedAgentNames: AgentName[];\n\n history: WizardStep[];\n\n /**\n * Navigate to a wizard step, pushing the current step onto history.\n * @param step - Target step to navigate to\n *\n * Side effects: sets `step`, appends previous step to `history`\n */\n setStep: (step: WizardStep) => void;\n /**\n * Set the wizard approach (stack-based or build-from-scratch).\n * @param approach - \"stack\" to use a pre-built template, \"scratch\" to select skills manually, null to reset\n *\n * Side effects: sets `approach`\n */\n setApproach: (approach: \"stack\" | \"scratch\" | null) => void;\n /**\n * Select a stack by ID, or null to deselect.\n * @param stackId - Stack identifier from suggestedStacks, or null to clear\n *\n * Side effects: sets `selectedStackId`\n */\n selectStack: (stackId: string | null) => void;\n /**\n * Set how to apply the selected stack.\n * @param action - \"defaults\" to use stack as-is, \"customize\" to enter the build step\n *\n * Side effects: sets `stackAction`\n */\n setStackAction: (action: \"defaults\" | \"customize\") => void;\n /**\n * Pre-populate domainSelections from a stack's agent-to-skill mappings.\n *\n * Iterates all agents in the stack, resolving each category's skill assignments\n * to the appropriate domain. Enables all domains and deduplicates skill IDs.\n *\n * @param stack - Stack definition with agent-level skill assignments\n * @param stack.agents - Record of agent name to `{ category: SkillAssignment[] }` mappings\n * @param categories - Category definitions used to resolve category -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to ALL_DOMAINS\n */\n populateFromStack: (stack: {\n agents: Record<string, Partial<Record<Category, SkillAssignment[]>>>;\n }) => void;\n /**\n * Pre-populate domainSelections from a flat list of installed skill IDs.\n *\n * Used by `agentsinc edit` to restore wizard state from existing project config.\n * Looks up each skill's category and domain, warns for unresolvable skills.\n *\n * @param skillIds - Flat array of currently installed skill IDs\n * @param skills - Skill lookup providing category and displayName per skill ID\n * @param categories - Category definitions used to resolve category -> domain mapping\n *\n * Side effects: sets `domainSelections`, sets `selectedDomains` to domains found in the provided skill IDs\n */\n populateFromSkillIds: (skillIds: SkillId[], savedConfigs?: SkillConfig[]) => void;\n /**\n * Toggle a domain on or off in the selectedDomains list.\n * @param domain - Domain to toggle\n *\n * Side effects: adds or removes from `selectedDomains`\n */\n toggleDomain: (domain: Domain) => void;\n /**\n * Toggle a skill selection within a domain's category.\n *\n * When exclusive is true (radio behavior), selecting a new skill replaces any\n * existing selection in that category. When false (checkbox behavior),\n * the skill is added to or removed from the selection array.\n *\n * @param domain - Domain containing the category\n * @param category - Category within the domain\n * @param technology - Skill ID to toggle\n * @param exclusive - If true, only one skill can be selected per category (radio)\n *\n * Side effects: updates `domainSelections[domain][category]`\n */\n toggleTechnology: (\n domain: Domain,\n category: Category,\n technology: SkillId,\n exclusive: boolean,\n ) => void;\n /**\n * Advance to the next domain in the build step.\n * @returns true if advanced, false if already at the last domain\n *\n * Side effects: increments `currentDomainIndex`\n */\n nextDomain: () => boolean;\n /**\n * Go back to the previous domain in the build step.\n * @returns true if moved back, false if already at the first domain\n *\n * Side effects: decrements `currentDomainIndex`\n */\n prevDomain: () => boolean;\n /** Toggle compatibility label visibility on skill tags in the build step grid. */\n toggleShowLabels: () => void;\n /**\n * Derive the install mode from skillConfigs source values.\n * If all skills use \"local\" source, returns \"local\". If all use non-local, returns \"plugin\".\n * If mixed, returns \"mixed\". Returns \"local\" when no skills are configured.\n */\n deriveInstallMode: () => InstallMode;\n /**\n * Toggle the scope of a specific skill between \"project\" and \"global\".\n * @param skillId - Skill to toggle scope for\n *\n * Side effects: updates `skillConfigs` entry for the skill\n */\n toggleSkillScope: (skillId: SkillId) => void;\n /**\n * Update the source for a specific skill in skillConfigs.\n * @param skillId - Skill to update\n * @param source - Source identifier (e.g., \"local\", marketplace name)\n *\n * Side effects: updates `skillConfigs` entry for the skill\n */\n setSkillSource: (skillId: SkillId, source: string) => void;\n /**\n * Set the currently focused skill ID in the build step (for S hotkey).\n * @param id - Skill ID to focus, or null to clear\n *\n * Side effects: sets `focusedSkillId`\n */\n setFocusedSkillId: (id: SkillId | null) => void;\n /**\n * Set which source provides a specific skill.\n * @param skillId - Skill to configure the source for\n * @param sourceId - Source identifier (e.g., \"public\", \"local\", marketplace name)\n *\n * Side effects: updates `skillConfigs` entry for the skill. No-op with warning if either param is empty.\n */\n setSourceSelection: (skillId: SkillId, sourceId: string) => void;\n /**\n * Enable or disable source customization on the sources step.\n * @param customize - true to show per-skill source pickers\n *\n * Side effects: sets `customizeSources`\n */\n setCustomizeSources: (customize: boolean) => void;\n /** Toggle the settings overlay (source management). */\n toggleSettings: () => void;\n /** Toggle the help overlay (hotkey reference). */\n toggleHelp: () => void;\n /**\n * Replace the full set of enabled/disabled sources.\n * @param sources - Record of source name to enabled boolean. Empty-string keys are filtered out.\n *\n * Side effects: sets `enabledSources`\n */\n setEnabledSources: (sources: Record<string, boolean>) => void;\n /**\n * Add a bound skill from search to the wizard's bound skills list.\n * Duplicates (same id + sourceUrl) are silently skipped with a warning.\n *\n * @param skill - Bound skill to add (foreign skill tied to a category alias)\n *\n * Side effects: appends to `boundSkills`\n */\n bindSkill: (skill: BoundSkill) => void;\n /**\n * Navigate to the previous wizard step using the history stack.\n * Falls back to \"stack\" if history is empty.\n *\n * Side effects: pops from `history`, sets `step` to the popped value\n */\n goBack: () => void;\n /**\n * Toggle an agent on or off in the selectedAgents list.\n * @param agent - Agent name to toggle\n *\n * Side effects: adds or removes from `selectedAgents`, syncs `agentConfigs`\n */\n toggleAgent: (agent: AgentName) => void;\n /**\n * Toggle the scope of a specific agent between \"project\" and \"global\".\n * @param agentName - Agent to toggle scope for\n *\n * Side effects: updates `agentConfigs` entry for the agent\n */\n toggleAgentScope: (agentName: AgentName) => void;\n /**\n * Set the currently focused agent ID in the agents step (for S hotkey).\n * @param id - Agent name to focus, or null to clear\n *\n * Side effects: sets `focusedAgentId`\n */\n setFocusedAgentId: (id: AgentName | null) => void;\n /**\n * Preselect agents based on selected domains from the first wizard step.\n * Matches domains against DOMAIN_AGENTS mapping.\n * Optional agents (meta/pattern) are excluded.\n *\n * Side effects: replaces `selectedAgents` with computed preselection\n */\n preselectAgentsFromDomains: () => void;\n /** Reset all wizard state to initial values. */\n reset: () => void;\n\n /**\n * Collect all selected skill IDs across all domains and categories.\n * @returns Flat array of every selected SkillId (may contain duplicates if shared across domains)\n */\n getAllSelectedTechnologies: () => SkillId[];\n /**\n * Group selected skill IDs by domain.\n * @returns Partial record mapping each domain with selections to its skill ID array\n */\n getSelectedTechnologiesPerDomain: () => Partial<Record<Domain, SkillId[]>>;\n /**\n * Get the domain currently visible in the build step.\n * @returns The domain at currentDomainIndex, or null if no domains are selected\n */\n getCurrentDomain: () => Domain | null;\n /**\n * Count total selected technologies across all domains.\n * @returns Number of selected skill IDs\n */\n getTechnologyCount: () => number;\n /**\n * Compute which wizard steps are completed and which are skipped.\n * Used by WizardTabs to render step progress indicators.\n * @returns Object with completedSteps and skippedSteps string arrays\n */\n getStepProgress: () => { completedSteps: WizardStep[]; skippedSteps: WizardStep[] };\n /** @returns true if there is a next domain after the current one */\n canGoToNextDomain: () => boolean;\n /** @returns true if there is a previous domain before the current one */\n canGoToPreviousDomain: () => boolean;\n /** Set all selected skills to \"local\" source. */\n setAllSourcesLocal: () => void;\n /** Set all selected skills to their first non-local (marketplace) source. */\n setAllSourcesPlugin: () => void;\n\n /**\n * Build the source selection rows for the sources step UI.\n *\n * For each selected technology, resolves the canonical skill ID, looks up available\n * sources from the matrix, merges in any bound skills from search, and determines\n * which source is currently selected. Sources are sorted: local first, then public,\n * then private/other.\n *\n * @returns Array of row objects, one per selected technology, each containing:\n * - `skillId` - Canonical resolved skill ID\n * - `options` - Available sources with selection state and install status\n */\n buildSourceRows: () => {\n skillId: SkillId;\n options: SourceOption[];\n }[];\n};\n\n/** State-only fields from WizardState (excludes actions/getters). Used to type createInitialState(). */\ntype WizardStateData = Pick<\n WizardState,\n | \"step\"\n | \"approach\"\n | \"selectedStackId\"\n | \"stackAction\"\n | \"selectedDomains\"\n | \"currentDomainIndex\"\n | \"domainSelections\"\n | \"_stackDomainSelections\"\n | \"showLabels\"\n | \"skillConfigs\"\n | \"focusedSkillId\"\n | \"customizeSources\"\n | \"showSettings\"\n | \"showHelp\"\n | \"enabledSources\"\n | \"selectedAgents\"\n | \"agentConfigs\"\n | \"focusedAgentId\"\n | \"boundSkills\"\n | \"lockedSkillIds\"\n | \"lockedAgentNames\"\n | \"history\"\n>;\n\nconst createInitialState = (): WizardStateData => ({\n step: \"stack\",\n approach: null,\n selectedStackId: null,\n stackAction: null,\n selectedDomains: [],\n currentDomainIndex: 0,\n domainSelections: {},\n /** Snapshot of domainSelections from populateFromStack/populateFromSkillIds, used to restore on domain re-toggle */\n _stackDomainSelections: null,\n showLabels: false,\n skillConfigs: [],\n focusedSkillId: null,\n customizeSources: false,\n showSettings: false,\n showHelp: false,\n enabledSources: {},\n selectedAgents: [],\n agentConfigs: [],\n focusedAgentId: null,\n boundSkills: [],\n lockedSkillIds: [],\n lockedAgentNames: [],\n history: [],\n});\n\nexport const useWizardStore = create<WizardState>((set, get) => ({\n ...createInitialState(),\n\n setStep: (step) =>\n set((state) => ({\n step,\n history: [...state.history, state.step],\n })),\n\n setApproach: (approach) => set({ approach }),\n\n selectStack: (stackId) =>\n set({\n selectedStackId: stackId,\n domainSelections: {},\n _stackDomainSelections: null,\n selectedDomains: [],\n skillConfigs: [],\n selectedAgents: [],\n agentConfigs: [],\n boundSkills: [],\n currentDomainIndex: 0,\n stackAction: null,\n }),\n\n setStackAction: (action) => set({ stackAction: action }),\n\n populateFromStack: (stack) =>\n set(() => {\n const { categories } = matrix;\n const domainSelections: DomainSelections = {};\n const domains = new Set<Domain>();\n const allSkillIds = new Set<SkillId>();\n\n for (const agentConfig of Object.values(stack.agents)) {\n for (const [subcat, assignments] of typedEntries<Category, SkillAssignment[]>(\n agentConfig,\n )) {\n const category = categories[subcat];\n const domain = category?.domain;\n\n if (!domain || !assignments) {\n continue;\n }\n\n domains.add(domain);\n\n if (!domainSelections[domain]) {\n domainSelections[domain] = {};\n }\n\n if (!domainSelections[domain][subcat]) {\n domainSelections[domain][subcat] = [];\n }\n\n for (const assignment of assignments) {\n if (!domainSelections[domain][subcat].includes(assignment.id)) {\n domainSelections[domain][subcat].push(assignment.id);\n allSkillIds.add(assignment.id);\n }\n }\n }\n }\n\n const skillConfigs: SkillConfig[] = [...allSkillIds].map(createDefaultSkillConfig);\n\n return {\n domainSelections,\n _stackDomainSelections: structuredClone(domainSelections),\n selectedDomains: sortDomainsCanonically(getAllDomainsFromCategories(categories)),\n skillConfigs,\n };\n }),\n\n populateFromSkillIds: (skillIds, savedConfigs) =>\n set(() => {\n const domainSelections: DomainSelections = {};\n const resolvedSkillIds: SkillId[] = [];\n let skippedCount = 0;\n\n for (const skillId of skillIds) {\n const resolved = resolveSkillForPopulation(skillId);\n if (!resolved) {\n skippedCount++;\n continue;\n }\n\n const { domain, subcat, techId } = resolved;\n if (!domainSelections[domain]) domainSelections[domain] = {};\n if (!domainSelections[domain][subcat]) domainSelections[domain][subcat] = [];\n\n if (!domainSelections[domain][subcat].includes(techId)) {\n domainSelections[domain][subcat].push(techId);\n resolvedSkillIds.push(techId);\n }\n }\n\n if (skippedCount > 0) {\n warn(`${skippedCount} installed skill(s) could not be resolved and were skipped`);\n }\n\n const selectedDomains = sortDomainsCanonically(typedKeys<Domain>(domainSelections));\n\n const skillConfigs: SkillConfig[] = resolvedSkillIds.map((id) => {\n const saved = savedConfigs?.find((sc) => sc.id === id);\n const skill = matrix.skills[id];\n const primarySource = skill?.availableSources?.find((s) => s.primary)?.name;\n return {\n id,\n scope: saved?.scope ?? \"global\",\n source: primarySource ?? saved?.source ?? DEFAULT_PUBLIC_SOURCE_NAME,\n };\n });\n\n return {\n domainSelections,\n _stackDomainSelections: structuredClone(domainSelections),\n selectedDomains,\n skillConfigs,\n };\n }),\n\n toggleDomain: (domain) =>\n set((state) => {\n const isSelected = state.selectedDomains.includes(domain);\n if (isSelected) {\n const { [domain]: _removed, ...remainingSelections } = state.domainSelections;\n\n // Collect all skill IDs being removed from this domain\n const removedSkillIds = new Set<SkillId>();\n if (_removed) {\n for (const skills of Object.values(_removed)) {\n if (skills) {\n for (const id of skills) {\n removedSkillIds.add(id);\n }\n }\n }\n }\n\n return {\n selectedDomains: state.selectedDomains.filter((d) => d !== domain),\n domainSelections: remainingSelections,\n skillConfigs: state.skillConfigs.filter((sc) => !removedSkillIds.has(sc.id)),\n };\n }\n\n // Restore stack selections for this domain if a stack snapshot exists\n const stackSelections = state._stackDomainSelections?.[domain];\n if (stackSelections) {\n // Also restore skillConfigs for the restored skills\n const restoredSkillIds: SkillId[] = [];\n for (const skills of Object.values(stackSelections)) {\n if (skills) restoredSkillIds.push(...skills);\n }\n const existingIds = new Set(state.skillConfigs.map((sc) => sc.id));\n const newConfigs = restoredSkillIds\n .filter((id) => !existingIds.has(id))\n .map(createDefaultSkillConfig);\n\n return {\n selectedDomains: sortDomainsCanonically([...state.selectedDomains, domain]),\n domainSelections: {\n ...state.domainSelections,\n [domain]: structuredClone(stackSelections),\n },\n skillConfigs: [...state.skillConfigs, ...newConfigs],\n };\n }\n\n return {\n selectedDomains: sortDomainsCanonically([...state.selectedDomains, domain]),\n };\n }),\n\n toggleTechnology: (domain, category, technology, exclusive) =>\n set((state) => {\n // D9: locked skills cannot be toggled\n if (state.lockedSkillIds.includes(technology)) return state;\n\n const currentSelections = state.domainSelections[domain]?.[category] || [];\n const isSelected = currentSelections.includes(technology);\n\n let newSelections: SkillId[];\n if (exclusive) {\n newSelections = isSelected ? [] : [technology];\n } else {\n newSelections = isSelected\n ? currentSelections.filter((t) => t !== technology)\n : [...currentSelections, technology];\n }\n\n // Sync skillConfigs: add entries for newly selected, remove entries for deselected\n const removed = currentSelections.filter((id) => !newSelections.includes(id));\n const added = newSelections.filter((id) => !currentSelections.includes(id));\n\n let updatedConfigs = state.skillConfigs.filter((sc) => !removed.includes(sc.id));\n for (const id of added) {\n if (!updatedConfigs.some((sc) => sc.id === id)) {\n updatedConfigs = [...updatedConfigs, createDefaultSkillConfig(id)];\n }\n }\n\n return {\n skillConfigs: updatedConfigs,\n domainSelections: {\n ...state.domainSelections,\n [domain]: {\n ...state.domainSelections[domain],\n [category]: newSelections,\n },\n },\n };\n }),\n\n nextDomain: () => {\n const state = get();\n if (state.currentDomainIndex < state.selectedDomains.length - 1) {\n set({\n currentDomainIndex: state.currentDomainIndex + 1,\n });\n return true;\n }\n return false;\n },\n\n prevDomain: () => {\n const state = get();\n if (state.currentDomainIndex > 0) {\n set({\n currentDomainIndex: state.currentDomainIndex - 1,\n });\n return true;\n }\n return false;\n },\n\n toggleShowLabels: () => set((state) => ({ showLabels: !state.showLabels })),\n\n deriveInstallMode: (): InstallMode => {\n const { skillConfigs } = get();\n return sharedDeriveInstallMode(skillConfigs);\n },\n\n toggleSkillScope: (skillId) =>\n set((state) => {\n // D9: locked skills cannot have their scope toggled\n if (state.lockedSkillIds.includes(skillId)) return state;\n return {\n skillConfigs: state.skillConfigs.map((sc) =>\n sc.id === skillId ? { ...sc, scope: sc.scope === \"project\" ? \"global\" : \"project\" } : sc,\n ),\n };\n }),\n\n setSkillSource: (skillId, source) =>\n set((state) => ({\n skillConfigs: state.skillConfigs.map((sc) => (sc.id === skillId ? { ...sc, source } : sc)),\n })),\n\n setFocusedSkillId: (id) => set({ focusedSkillId: id }),\n\n setSourceSelection: (skillId, sourceId) =>\n set((state) => {\n if (!skillId) {\n warn(\"Ignoring setSourceSelection call with empty skillId\");\n return state;\n }\n if (!sourceId) {\n warn(`Ignoring setSourceSelection call with empty sourceId for skill '${skillId}'`);\n return state;\n }\n return {\n skillConfigs: state.skillConfigs.map((sc) =>\n sc.id === skillId ? { ...sc, source: sourceId } : sc,\n ),\n };\n }),\n\n setCustomizeSources: (customize) => set({ customizeSources: customize }),\n\n toggleSettings: () => set((state) => ({ showSettings: !state.showSettings })),\n\n toggleHelp: () => set((state) => ({ showHelp: !state.showHelp })),\n\n setEnabledSources: (sources) => {\n const invalidKeys = Object.keys(sources).filter((key) => !key.trim());\n if (invalidKeys.length > 0) {\n warn(\"Ignoring setEnabledSources call with empty source name(s)\");\n }\n const validSources = Object.fromEntries(Object.entries(sources).filter(([key]) => key.trim()));\n return set({ enabledSources: validSources });\n },\n\n bindSkill: (skill) =>\n set((state) => {\n const exists = state.boundSkills.some(\n (b) => b.id === skill.id && b.sourceUrl === skill.sourceUrl,\n );\n if (exists) {\n warn(`Skill '${skill.id}' from '${skill.sourceUrl}' is already bound — skipping duplicate`);\n return state;\n }\n return { boundSkills: [...state.boundSkills, skill] };\n }),\n\n goBack: () =>\n set((state) => {\n const history = [...state.history];\n const previousStep = history.pop();\n return {\n step: previousStep || \"stack\",\n history,\n };\n }),\n\n toggleAgent: (agent) =>\n set((state) => {\n // D9: locked agents cannot be toggled\n if (state.lockedAgentNames.includes(agent)) return state;\n\n const isSelected = state.selectedAgents.includes(agent);\n if (isSelected) {\n return {\n selectedAgents: state.selectedAgents.filter((a) => a !== agent),\n agentConfigs: state.agentConfigs.filter((ac) => ac.name !== agent),\n };\n }\n return {\n selectedAgents: [...state.selectedAgents, agent],\n agentConfigs: [...state.agentConfigs, { name: agent, scope: \"global\" as const }],\n };\n }),\n\n toggleAgentScope: (agentName) =>\n set((state) => {\n // D9: locked agents cannot have their scope toggled\n if (state.lockedAgentNames.includes(agentName)) return state;\n return {\n agentConfigs: state.agentConfigs.map((ac) =>\n ac.name === agentName\n ? { ...ac, scope: ac.scope === \"project\" ? (\"global\" as const) : (\"project\" as const) }\n : ac,\n ),\n };\n }),\n\n setFocusedAgentId: (id) => set({ focusedAgentId: id }),\n\n preselectAgentsFromDomains: () =>\n set(() => {\n const agents: AgentName[] = [];\n for (const domain of get().selectedDomains) {\n const domainAgents = DOMAIN_AGENTS[domain];\n if (domainAgents) {\n agents.push(...domainAgents);\n }\n }\n const sorted = agents.sort();\n return {\n selectedAgents: sorted,\n agentConfigs: sorted.map((name) => ({ name, scope: \"global\" as const })),\n };\n }),\n\n reset: () => set(createInitialState()),\n\n getAllSelectedTechnologies: () => {\n const state = get();\n const technologies: SkillId[] = [];\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n for (const category of typedKeys<Category>(domainSel)) {\n const techs = domainSel[category];\n if (techs) technologies.push(...techs);\n }\n }\n return technologies;\n },\n\n getSelectedTechnologiesPerDomain: () => {\n const state = get();\n const result: Partial<Record<Domain, SkillId[]>> = {};\n for (const domain of typedKeys<Domain>(state.domainSelections)) {\n const domainSel = state.domainSelections[domain];\n if (!domainSel) continue;\n const techs: SkillId[] = [];\n for (const category of typedKeys<Category>(domainSel)) {\n const subTechs = domainSel[category];\n if (subTechs) techs.push(...subTechs);\n }\n if (techs.length > 0) {\n result[domain] = techs;\n }\n }\n return result;\n },\n\n getCurrentDomain: () => {\n const state = get();\n return state.selectedDomains[state.currentDomainIndex] || null;\n },\n\n getTechnologyCount: () => {\n return get().getAllSelectedTechnologies().length;\n },\n\n getStepProgress: () => {\n const state = get();\n const completed: WizardStep[] = [];\n const skipped: WizardStep[] = [];\n\n if (state.step !== \"stack\") {\n completed.push(\"stack\");\n }\n\n if (state.approach === \"stack\" && state.selectedStackId && state.stackAction === \"defaults\") {\n skipped.push(\"build\");\n skipped.push(\"sources\");\n skipped.push(\"agents\");\n } else if (state.step === \"confirm\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n completed.push(\"agents\");\n } else if (state.step === \"agents\") {\n completed.push(\"build\");\n completed.push(\"sources\");\n } else if (state.step === \"sources\") {\n completed.push(\"build\");\n }\n\n return { completedSteps: completed, skippedSteps: skipped };\n },\n\n canGoToNextDomain: () => {\n const state = get();\n return state.currentDomainIndex < state.selectedDomains.length - 1;\n },\n\n canGoToPreviousDomain: () => {\n const state = get();\n return state.currentDomainIndex > 0;\n },\n\n setAllSourcesLocal: () => {\n set((state) => ({\n skillConfigs: state.skillConfigs.map((sc) => ({ ...sc, source: \"local\" })),\n }));\n },\n\n setAllSourcesPlugin: () => {\n set((state) => ({\n skillConfigs: state.skillConfigs.map((sc) => {\n const skill = getSkillById(sc.id);\n if (skill.availableSources) {\n const marketplaceSource = skill.availableSources.find((s) => s.type !== \"local\");\n if (marketplaceSource) {\n return { ...sc, source: marketplaceSource.name };\n }\n }\n return sc;\n }),\n }));\n },\n\n buildSourceRows: () => {\n const state = get();\n const selectedTechnologies = get().getAllSelectedTechnologies();\n const { skillConfigs, boundSkills } = state;\n\n return selectedTechnologies.map((tech) => {\n const skillId = resolveAlias(tech);\n const skill = getSkillById(skillId);\n const configEntry = skillConfigs.find((sc) => sc.id === skillId);\n const primarySource = skill.availableSources?.find((s) => s.primary)?.name;\n const selectedSource =\n configEntry?.source ||\n skill.activeSource?.name ||\n primarySource ||\n DEFAULT_PUBLIC_SOURCE_NAME;\n const slug = skill.slug;\n\n const sortedSources = [...(skill.availableSources || [])].sort(\n (a, b) => getSourceSortTier(a) - getSourceSortTier(b),\n );\n\n const options =\n sortedSources.length > 0\n ? sortedSources.map((source) => ({\n id: source.name,\n selected: selectedSource === source.name,\n installed: source.installed,\n }))\n : [\n {\n id: DEFAULT_PUBLIC_SOURCE_NAME,\n selected: selectedSource === DEFAULT_PUBLIC_SOURCE_NAME,\n installed: false,\n },\n ];\n\n if (!options.some((o) => o.id === \"local\")) {\n options.unshift({\n id: \"local\",\n selected: selectedSource === \"local\",\n installed: false,\n });\n }\n\n options.push(...buildBoundSkillOptions(boundSkills, slug, selectedSource));\n\n return { skillId, options };\n });\n },\n}));\n"],"mappings":"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","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  KEY_LABEL_ARROWS_VERT,
4
4
  KEY_LABEL_ENTER,
5
5
  KEY_LABEL_ESC
6
- } from "./chunk-6VIOO74O.js";
6
+ } from "./chunk-CBYRFAUN.js";
7
7
  import {
8
8
  CLI_COLORS,
9
9
  DEFAULT_BRANDING
@@ -115,4 +115,4 @@ var StepRefine = ({
115
115
  export {
116
116
  StepRefine
117
117
  };
118
- //# sourceMappingURL=chunk-BKTPEATV.js.map
118
+ //# sourceMappingURL=chunk-F7LOH754.js.map
@@ -5,18 +5,16 @@ import {
5
5
  loadSkillsByIds,
6
6
  parseFrontmatter
7
7
  } from "./chunk-RRBWNEG3.js";
8
- import {
9
- isCategory
10
- } from "./chunk-XXK6MFOA.js";
11
8
  import {
12
9
  BUILT_IN_MATRIX,
10
+ getCategoryDomain,
13
11
  getCustomSkillIds,
14
12
  getSkillById,
15
13
  initializeMatrix,
16
14
  matrix,
17
15
  typedEntries,
18
16
  typedKeys
19
- } from "./chunk-4OBRPE6A.js";
17
+ } from "./chunk-NG2GGK6P.js";
20
18
  import {
21
19
  SKILL_ID_PATTERN,
22
20
  agentFrontmatterValidationSchema,
@@ -801,56 +799,60 @@ function validateProjectConfig(config) {
801
799
  }
802
800
 
803
801
  // src/cli/lib/configuration/config-merger.ts
802
+ function mergeConfigs(newConfig, existingConfig) {
803
+ const merged = { ...newConfig };
804
+ if (existingConfig.name) {
805
+ merged.name = existingConfig.name;
806
+ }
807
+ if (existingConfig.description) {
808
+ merged.description = existingConfig.description;
809
+ }
810
+ if (existingConfig.source) {
811
+ merged.source = existingConfig.source;
812
+ }
813
+ if (existingConfig.agents && existingConfig.agents.length > 0) {
814
+ const existingNames = new Set(existingConfig.agents.map((a) => a.name));
815
+ const newAgents = merged.agents.filter((a) => !existingNames.has(a.name));
816
+ merged.agents = [...existingConfig.agents, ...newAgents];
817
+ }
818
+ if (existingConfig.skills && existingConfig.skills.length > 0) {
819
+ const newSkillsById = indexBy(merged.skills, (s) => s.id);
820
+ const existingIds = new Set(existingConfig.skills.map((s) => s.id));
821
+ const updatedExisting = existingConfig.skills.map(
822
+ (existing) => newSkillsById[existing.id] ?? existing
823
+ );
824
+ const addedSkills = merged.skills.filter((s) => !existingIds.has(s.id));
825
+ merged.skills = [...updatedExisting, ...addedSkills];
826
+ }
827
+ if (existingConfig.stack) {
828
+ const mergedStack = { ...merged.stack };
829
+ for (const [agentId, agentConfig] of typedEntries(existingConfig.stack)) {
830
+ mergedStack[agentId] = { ...mergedStack[agentId], ...agentConfig };
831
+ }
832
+ merged.stack = mergedStack;
833
+ }
834
+ if (existingConfig.author) {
835
+ merged.author = existingConfig.author;
836
+ }
837
+ if (existingConfig.agentsSource) {
838
+ merged.agentsSource = existingConfig.agentsSource;
839
+ }
840
+ if (existingConfig.marketplace) {
841
+ merged.marketplace = existingConfig.marketplace;
842
+ }
843
+ return merged;
844
+ }
804
845
  async function mergeWithExistingConfig(newConfig, context) {
805
- const localConfig = { ...newConfig };
806
846
  const existingFullConfig = await loadProjectConfig(context.projectDir);
807
847
  if (existingFullConfig) {
808
- const existingConfig = existingFullConfig.config;
809
- if (existingConfig.name) {
810
- localConfig.name = existingConfig.name;
811
- }
812
- if (existingConfig.description) {
813
- localConfig.description = existingConfig.description;
814
- }
815
- if (existingConfig.source) {
816
- localConfig.source = existingConfig.source;
817
- }
818
- if (existingConfig.agents && existingConfig.agents.length > 0) {
819
- const existingNames = new Set(existingConfig.agents.map((a) => a.name));
820
- const newAgents = localConfig.agents.filter((a) => !existingNames.has(a.name));
821
- localConfig.agents = [...existingConfig.agents, ...newAgents];
822
- }
823
- if (existingConfig.skills && existingConfig.skills.length > 0) {
824
- const newSkillsById = indexBy(localConfig.skills, (s) => s.id);
825
- const existingIds = new Set(existingConfig.skills.map((s) => s.id));
826
- const updatedExisting = existingConfig.skills.map(
827
- (existing) => newSkillsById[existing.id] ?? existing
828
- );
829
- const addedSkills = localConfig.skills.filter((s) => !existingIds.has(s.id));
830
- localConfig.skills = [...updatedExisting, ...addedSkills];
831
- }
832
- if (existingConfig.stack) {
833
- const mergedStack = { ...localConfig.stack };
834
- for (const [agentId, agentConfig] of typedEntries(existingConfig.stack)) {
835
- mergedStack[agentId] = { ...mergedStack[agentId], ...agentConfig };
836
- }
837
- localConfig.stack = mergedStack;
838
- }
839
- if (existingConfig.author) {
840
- localConfig.author = existingConfig.author;
841
- }
842
- if (existingConfig.agentsSource) {
843
- localConfig.agentsSource = existingConfig.agentsSource;
844
- }
845
- if (existingConfig.marketplace) {
846
- localConfig.marketplace = existingConfig.marketplace;
847
- }
848
+ const config = mergeConfigs(newConfig, existingFullConfig.config);
848
849
  return {
849
- config: localConfig,
850
+ config,
850
851
  merged: true,
851
852
  existingConfigPath: existingFullConfig.configPath
852
853
  };
853
854
  }
855
+ const localConfig = { ...newConfig };
854
856
  const existingProjectConfig = await loadProjectSourceConfig(context.projectDir);
855
857
  if (existingProjectConfig?.author) {
856
858
  localConfig.author = existingProjectConfig.author;
@@ -982,7 +984,7 @@ function loadConfigTypesDataInBackground(sourceFlag, projectDir) {
982
984
  if (!await directoryExists(claudeSrcDir)) {
983
985
  throw new Error(`${CLAUDE_SRC_DIR}/ not found \u2014 run '${CLI_BIN_NAME} init' first`);
984
986
  }
985
- const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-IV6MOOPQ.js");
987
+ const { loadSkillsMatrixFromSource: loadSkillsMatrixFromSource2 } = await import("./source-loader-X46F4X2B.js");
986
988
  const { loadAllAgents: loadAllAgents2 } = await import("./loader-NHUCFMFQ.js");
987
989
  const sourceResult = await loadSkillsMatrixFromSource2({
988
990
  sourceFlag,
@@ -3678,28 +3680,30 @@ async function buildLocalConfig(wizardResult, sourceResult) {
3678
3680
  return { config: localConfig, loadedStack };
3679
3681
  }
3680
3682
  function setConfigMetadata(config, wizardResult, sourceResult, sourceFlag) {
3683
+ const result = { ...config };
3681
3684
  if (wizardResult.selectedDomains && wizardResult.selectedDomains.length > 0) {
3682
- config.domains = wizardResult.selectedDomains;
3685
+ result.domains = wizardResult.selectedDomains;
3683
3686
  }
3684
3687
  if (wizardResult.selectedAgents && wizardResult.selectedAgents.length > 0) {
3685
- config.selectedAgents = wizardResult.selectedAgents;
3688
+ result.selectedAgents = wizardResult.selectedAgents;
3686
3689
  }
3687
3690
  if (sourceFlag) {
3688
- config.source = sourceFlag;
3691
+ result.source = sourceFlag;
3689
3692
  } else if (sourceResult.sourceConfig.source) {
3690
- config.source = sourceResult.sourceConfig.source;
3693
+ result.source = sourceResult.sourceConfig.source;
3691
3694
  }
3692
3695
  if (sourceResult.marketplace) {
3693
- config.marketplace = sourceResult.marketplace;
3696
+ result.marketplace = sourceResult.marketplace;
3694
3697
  }
3698
+ return result;
3695
3699
  }
3696
3700
  async function buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag) {
3697
3701
  const { config } = await buildLocalConfig(wizardResult, sourceResult);
3698
3702
  verbose(
3699
3703
  `buildAndMergeConfig: before merge \u2014 stack=${config.stack ? Object.keys(config.stack).length + " agents" : "UNDEFINED"}`
3700
3704
  );
3701
- setConfigMetadata(config, wizardResult, sourceResult, sourceFlag);
3702
- const result = await mergeWithExistingConfig(config, { projectDir });
3705
+ const configWithMetadata = setConfigMetadata(config, wizardResult, sourceResult, sourceFlag);
3706
+ const result = await mergeWithExistingConfig(configWithMetadata, { projectDir });
3703
3707
  verbose(
3704
3708
  `buildAndMergeConfig: after merge \u2014 stack=${result.config.stack ? Object.keys(result.config.stack).length + " agents" : "UNDEFINED"}, merged=${result.merged}`
3705
3709
  );
@@ -3768,10 +3772,9 @@ async function writeProjectConfigTypes(projectConfigPath, projectDir, projectCon
3768
3772
  projectCategories = [...categorySet].sort();
3769
3773
  const domainSet = /* @__PURE__ */ new Set();
3770
3774
  for (const cat of projectCategories) {
3771
- if (!isCategory(cat)) continue;
3772
- const def = matrix2.categories[cat];
3773
- if (def?.domain) {
3774
- domainSet.add(def.domain);
3775
+ const domain = getCategoryDomain(cat);
3776
+ if (domain) {
3777
+ domainSet.add(domain);
3775
3778
  }
3776
3779
  }
3777
3780
  projectDomains = [...domainSet].sort();
@@ -3786,7 +3789,7 @@ async function writeProjectConfigTypes(projectConfigPath, projectDir, projectCon
3786
3789
  await writeFile(typesPath, source);
3787
3790
  verbose("Using project config-types.ts that imports from global");
3788
3791
  }
3789
- async function writeScopedConfigs(finalConfig, matrix2, agents, projectDir, projectConfigPath) {
3792
+ async function writeScopedConfigs(finalConfig, matrix2, agents, projectDir, projectConfigPath, projectInstallationExists) {
3790
3793
  const homeDir = os8.homedir();
3791
3794
  const isProjectContext = path20.resolve(projectDir) !== path20.resolve(homeDir);
3792
3795
  if (!isProjectContext) {
@@ -3801,10 +3804,17 @@ async function writeScopedConfigs(finalConfig, matrix2, agents, projectDir, proj
3801
3804
  verbose(`Updated global config at ${globalConfigPath}`);
3802
3805
  await writeStandaloneConfigTypes(globalConfigPath, matrix2, agents, globalConfig);
3803
3806
  verbose("Updated global config-types.ts with actual types");
3804
- await ensureDir(path20.dirname(projectConfigPath));
3805
- await writeConfigFile(projectSplitConfig, projectConfigPath, { isProjectConfig: true });
3806
- verbose(`Updated project config at ${projectConfigPath}`);
3807
- await writeProjectConfigTypes(projectConfigPath, projectDir, projectSplitConfig, matrix2);
3807
+ const hasProjectItems = projectSplitConfig.skills.length > 0 || projectSplitConfig.agents.length > 0;
3808
+ if (projectInstallationExists || hasProjectItems) {
3809
+ await ensureDir(path20.dirname(projectConfigPath));
3810
+ await writeConfigFile(projectSplitConfig, projectConfigPath, { isProjectConfig: true });
3811
+ verbose(`Updated project config at ${projectConfigPath}`);
3812
+ await writeProjectConfigTypes(projectConfigPath, projectDir, projectSplitConfig, matrix2);
3813
+ } else {
3814
+ verbose(
3815
+ "Skipped project config \u2014 no existing project installation and no project-scoped items"
3816
+ );
3817
+ }
3808
3818
  }
3809
3819
  async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceResult, projectDir, agentsDir, installMode, agentScopeMap) {
3810
3820
  const engine = await createLiquidEngine(projectDir);
@@ -3815,6 +3825,7 @@ async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceR
3815
3825
  sourceResult.sourcePath
3816
3826
  );
3817
3827
  const globalAgentsDir = path20.join(os8.homedir(), CLAUDE_DIR, "agents");
3828
+ await ensureDir(globalAgentsDir);
3818
3829
  const compiledAgentNames = [];
3819
3830
  for (const [name, agent] of typedEntries(resolvedAgents)) {
3820
3831
  const output = await compileAgentForPlugin(
@@ -3826,9 +3837,6 @@ async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceR
3826
3837
  );
3827
3838
  const scope = agentScopeMap?.get(name) ?? "project";
3828
3839
  const targetDir = scope === "global" ? globalAgentsDir : agentsDir;
3829
- if (scope === "global") {
3830
- await ensureDir(targetDir);
3831
- }
3832
3840
  await writeFile(path20.join(targetDir, `${name}.md`), output);
3833
3841
  compiledAgentNames.push(name);
3834
3842
  }
@@ -3837,20 +3845,22 @@ async function compileAndWriteAgents(compileConfig, agents, localSkills, sourceR
3837
3845
  async function installPluginConfig(options) {
3838
3846
  const { wizardResult, sourceResult, projectDir, sourceFlag } = options;
3839
3847
  const projectPaths = resolveInstallPaths(projectDir, "project");
3840
- const hasProjectAgents = wizardResult.skills.some((s) => s.scope !== "global") || wizardResult.agentConfigs.some((a) => a.scope !== "global");
3841
- if (hasProjectAgents) {
3848
+ const isProjectInstall = path20.resolve(projectDir) !== path20.resolve(os8.homedir());
3849
+ if (isProjectInstall) {
3842
3850
  await ensureDir(projectPaths.agentsDir);
3843
3851
  }
3844
3852
  await ensureDir(path20.dirname(projectPaths.configPath));
3845
3853
  const agents = await loadMergedAgents(sourceResult.sourcePath);
3846
3854
  const mergeResult = await buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag);
3847
3855
  const finalConfig = mergeResult.config;
3856
+ const projectInstallationExists = path20.resolve(projectDir) !== path20.resolve(os8.homedir());
3848
3857
  await writeScopedConfigs(
3849
3858
  finalConfig,
3850
3859
  sourceResult.matrix,
3851
3860
  agents,
3852
3861
  projectDir,
3853
- projectPaths.configPath
3862
+ projectPaths.configPath,
3863
+ projectInstallationExists
3854
3864
  );
3855
3865
  const compileAgentsConfig = buildCompileAgents(finalConfig, agents);
3856
3866
  const compileConfig = {
@@ -3888,15 +3898,14 @@ async function installLocal(options) {
3888
3898
  const globalPaths = resolveInstallPaths(projectDir, "global");
3889
3899
  const projectSkills = wizardResult.skills.filter((s) => s.scope !== "global");
3890
3900
  const globalSkills = wizardResult.skills.filter((s) => s.scope === "global");
3891
- const hasProjectItems = projectSkills.length > 0 || wizardResult.agentConfigs.some((a) => a.scope !== "global");
3892
- if (hasProjectItems) {
3901
+ const homeDir = os8.homedir();
3902
+ const isProjectInstall = path20.resolve(projectDir) !== path20.resolve(homeDir);
3903
+ if (isProjectInstall) {
3893
3904
  await prepareDirectories(projectPaths);
3894
3905
  } else {
3895
3906
  await ensureDir(path20.dirname(projectPaths.configPath));
3896
3907
  }
3897
- if (globalSkills.length > 0) {
3898
- await ensureDir(globalPaths.skillsDir);
3899
- }
3908
+ await ensureDir(globalPaths.skillsDir);
3900
3909
  const projectCopied = projectSkills.length > 0 ? await deleteAndCopySkills(projectSkills, sourceResult, projectDir, projectPaths.skillsDir) : [];
3901
3910
  const globalCopied = globalSkills.length > 0 ? await deleteAndCopySkills(globalSkills, sourceResult, projectDir, globalPaths.skillsDir) : [];
3902
3911
  const copiedSkills = [...projectCopied, ...globalCopied];
@@ -3904,12 +3913,14 @@ async function installLocal(options) {
3904
3913
  const agents = await loadMergedAgents(sourceResult.sourcePath);
3905
3914
  const mergeResult = await buildAndMergeConfig(wizardResult, sourceResult, projectDir, sourceFlag);
3906
3915
  const finalConfig = mergeResult.config;
3916
+ const isProjectContext = path20.resolve(projectDir) !== path20.resolve(os8.homedir());
3907
3917
  await writeScopedConfigs(
3908
3918
  finalConfig,
3909
3919
  sourceResult.matrix,
3910
3920
  agents,
3911
3921
  projectDir,
3912
- projectPaths.configPath
3922
+ projectPaths.configPath,
3923
+ isProjectContext
3913
3924
  );
3914
3925
  const compileAgentsConfig = buildCompileAgents(finalConfig, agents);
3915
3926
  const compileConfig = {
@@ -4176,15 +4187,6 @@ async function discoverAllPluginSkills(projectDir) {
4176
4187
  }
4177
4188
  return allSkills;
4178
4189
  }
4179
- async function hasIndividualPlugins(projectDir) {
4180
- try {
4181
- const pluginPaths = await getVerifiedPluginInstallPaths(projectDir);
4182
- return pluginPaths.length > 0;
4183
- } catch (error) {
4184
- verbose(`Failed to check for individual plugins: ${getErrorMessage(error)}`);
4185
- return false;
4186
- }
4187
- }
4188
4190
  async function listPluginNames(projectDir) {
4189
4191
  try {
4190
4192
  const pluginPaths = await getVerifiedPluginInstallPaths(projectDir);
@@ -5474,14 +5476,16 @@ export {
5474
5476
  claudePluginMarketplaceAdd,
5475
5477
  claudePluginUninstall,
5476
5478
  loadSkillsMatrixFromSource,
5479
+ convertStackToResolvedStack,
5480
+ extractSourceName,
5477
5481
  getMarketplaceLabel,
5482
+ mergeLocalSkillsIntoMatrix,
5478
5483
  loadConfigTypesDataInBackground,
5479
5484
  regenerateConfigTypes,
5480
5485
  generateConfigSource,
5481
5486
  ensureBlankGlobalConfig,
5482
5487
  saveSourceToProjectConfig,
5483
5488
  discoverAllPluginSkills,
5484
- hasIndividualPlugins,
5485
5489
  listPluginNames,
5486
5490
  addSource,
5487
5491
  removeSource,
@@ -5504,4 +5508,4 @@ export {
5504
5508
  validateAllPlugins,
5505
5509
  printPluginValidationResult
5506
5510
  };
5507
- //# sourceMappingURL=chunk-P2BH6X2C.js.map
5511
+ //# sourceMappingURL=chunk-FVMYBN5K.js.map