@agents-inc/cli 0.74.4 → 0.74.7

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 (135) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/dist/{chunk-NEL3MGYH.js → chunk-2GD57LQE.js} +6 -6
  3. package/dist/{chunk-IN5TKIL3.js → chunk-2ZQKORJI.js} +2 -2
  4. package/dist/{chunk-RINGLIE7.js → chunk-CJSCCLT5.js} +2 -2
  5. package/dist/{chunk-IK6GTV3N.js → chunk-COZ75NET.js} +2 -2
  6. package/dist/{chunk-PPMNHCGA.js → chunk-FDIKV4ON.js} +5 -7
  7. package/dist/chunk-FDIKV4ON.js.map +1 -0
  8. package/dist/{chunk-FC5VMKXY.js → chunk-GFTBHBRQ.js} +15 -16
  9. package/dist/chunk-GFTBHBRQ.js.map +1 -0
  10. package/dist/{chunk-JIZKHL5P.js → chunk-HA35FGPO.js} +2 -2
  11. package/dist/{chunk-2TRPBOF3.js → chunk-HIVZDWJC.js} +2 -2
  12. package/dist/{chunk-KDEOCJMS.js → chunk-ICJV3JJF.js} +83 -3
  13. package/dist/chunk-ICJV3JJF.js.map +1 -0
  14. package/dist/{chunk-NIA3NQBT.js → chunk-IJNNVCS4.js} +2 -2
  15. package/dist/{chunk-FH74AVEW.js → chunk-JB2QTE7M.js} +2 -2
  16. package/dist/{chunk-DBPC4V25.js → chunk-JZPQI7YI.js} +2 -2
  17. package/dist/{chunk-TW64EOM7.js → chunk-LVNNP7T4.js} +16 -5
  18. package/dist/chunk-LVNNP7T4.js.map +1 -0
  19. package/dist/{chunk-3N4MUUAJ.js → chunk-MOWZ2FLG.js} +3 -3
  20. package/dist/{chunk-4OBRPE6A.js → chunk-NG2GGK6P.js} +5 -1
  21. package/dist/{chunk-4OBRPE6A.js.map → chunk-NG2GGK6P.js.map} +1 -1
  22. package/dist/{chunk-HZ5CCPU4.js → chunk-RHAZARG3.js} +4 -4
  23. package/dist/{chunk-JUY45EUT.js → chunk-RO6BG4ZW.js} +3 -3
  24. package/dist/{chunk-SDAJFP4I.js → chunk-STC7IEVI.js} +6 -8
  25. package/dist/{chunk-SDAJFP4I.js.map → chunk-STC7IEVI.js.map} +1 -1
  26. package/dist/{chunk-ZFQJ5STW.js → chunk-TJBOCGLR.js} +12 -12
  27. package/dist/{chunk-55G4HXUJ.js → chunk-UKYWXIDT.js} +9 -21
  28. package/dist/chunk-UKYWXIDT.js.map +1 -0
  29. package/dist/{chunk-7ET6VTIQ.js → chunk-VMTZ5WC5.js} +4 -4
  30. package/dist/{chunk-DDBSYZGZ.js → chunk-W3GHDONP.js} +4 -4
  31. package/dist/{chunk-FFNBQMMZ.js → chunk-ZU7AOE3X.js} +2 -2
  32. package/dist/commands/build/plugins.js +3 -4
  33. package/dist/commands/build/plugins.js.map +1 -1
  34. package/dist/commands/build/stack.js +3 -4
  35. package/dist/commands/build/stack.js.map +1 -1
  36. package/dist/commands/compile.js +3 -4
  37. package/dist/commands/compile.js.map +1 -1
  38. package/dist/commands/config/index.js +3 -4
  39. package/dist/commands/config/index.js.map +1 -1
  40. package/dist/commands/config/path.js +2 -3
  41. package/dist/commands/config/path.js.map +1 -1
  42. package/dist/commands/config/show.js +3 -4
  43. package/dist/commands/diff.js +2 -3
  44. package/dist/commands/diff.js.map +1 -1
  45. package/dist/commands/doctor.js +2 -3
  46. package/dist/commands/doctor.js.map +1 -1
  47. package/dist/commands/edit.js +26 -18
  48. package/dist/commands/edit.js.map +1 -1
  49. package/dist/commands/eject.js +2 -3
  50. package/dist/commands/eject.js.map +1 -1
  51. package/dist/commands/import/skill.js +2 -3
  52. package/dist/commands/import/skill.js.map +1 -1
  53. package/dist/commands/info.js +2 -3
  54. package/dist/commands/info.js.map +1 -1
  55. package/dist/commands/init.js +17 -18
  56. package/dist/commands/list.js +2 -3
  57. package/dist/commands/list.js.map +1 -1
  58. package/dist/commands/new/agent.js +3 -4
  59. package/dist/commands/new/agent.js.map +1 -1
  60. package/dist/commands/new/marketplace.js +3 -4
  61. package/dist/commands/new/marketplace.js.map +1 -1
  62. package/dist/commands/new/skill.js +3 -4
  63. package/dist/commands/outdated.js +2 -3
  64. package/dist/commands/outdated.js.map +1 -1
  65. package/dist/commands/search.js +2 -3
  66. package/dist/commands/search.js.map +1 -1
  67. package/dist/commands/uninstall.js +2 -3
  68. package/dist/commands/uninstall.js.map +1 -1
  69. package/dist/commands/update.js +3 -4
  70. package/dist/commands/update.js.map +1 -1
  71. package/dist/commands/validate.js +2 -3
  72. package/dist/commands/validate.js.map +1 -1
  73. package/dist/components/wizard/category-grid.js +2 -2
  74. package/dist/components/wizard/category-grid.test.js +7 -8
  75. package/dist/components/wizard/category-grid.test.js.map +1 -1
  76. package/dist/components/wizard/domain-selection.js +5 -6
  77. package/dist/components/wizard/source-grid.js +2 -2
  78. package/dist/components/wizard/source-grid.test.js +7 -8
  79. package/dist/components/wizard/source-grid.test.js.map +1 -1
  80. package/dist/components/wizard/stack-selection.js +4 -5
  81. package/dist/components/wizard/step-agents.js +5 -6
  82. package/dist/components/wizard/step-agents.test.js +8 -9
  83. package/dist/components/wizard/step-agents.test.js.map +1 -1
  84. package/dist/components/wizard/step-build.js +6 -7
  85. package/dist/components/wizard/step-build.test.js +8 -9
  86. package/dist/components/wizard/step-build.test.js.map +1 -1
  87. package/dist/components/wizard/step-confirm.js +3 -4
  88. package/dist/components/wizard/step-confirm.test.js +6 -7
  89. package/dist/components/wizard/step-confirm.test.js.map +1 -1
  90. package/dist/components/wizard/step-settings.js +3 -4
  91. package/dist/components/wizard/step-settings.test.js +6 -7
  92. package/dist/components/wizard/step-settings.test.js.map +1 -1
  93. package/dist/components/wizard/step-sources.js +5 -6
  94. package/dist/components/wizard/step-sources.test.js +8 -9
  95. package/dist/components/wizard/step-sources.test.js.map +1 -1
  96. package/dist/components/wizard/step-stack.js +7 -8
  97. package/dist/components/wizard/step-stack.test.js +8 -9
  98. package/dist/components/wizard/step-stack.test.js.map +1 -1
  99. package/dist/components/wizard/wizard-layout.js +4 -5
  100. package/dist/components/wizard/wizard.js +16 -17
  101. package/dist/hooks/init.js +19 -24
  102. package/dist/hooks/init.js.map +1 -1
  103. package/dist/plugins/dummy-skill/.claude-plugin/.content-hash +1 -0
  104. package/dist/plugins/dummy-skill/.claude-plugin/plugin.json +13 -0
  105. package/dist/{source-loader-7GPUP6TG.js → source-loader-HQTTAMS7.js} +3 -4
  106. package/dist/{source-manager-5FCN2CDH.js → source-manager-A3QLBYCU.js} +3 -4
  107. package/dist/stores/wizard-store.js +3 -4
  108. package/dist/stores/wizard-store.test.js +6 -7
  109. package/dist/stores/wizard-store.test.js.map +1 -1
  110. package/package.json +1 -1
  111. package/dist/chunk-55G4HXUJ.js.map +0 -1
  112. package/dist/chunk-FC5VMKXY.js.map +0 -1
  113. package/dist/chunk-KDEOCJMS.js.map +0 -1
  114. package/dist/chunk-PPMNHCGA.js.map +0 -1
  115. package/dist/chunk-TW64EOM7.js.map +0 -1
  116. package/dist/chunk-XXK6MFOA.js +0 -28
  117. package/dist/chunk-XXK6MFOA.js.map +0 -1
  118. /package/dist/{chunk-NEL3MGYH.js.map → chunk-2GD57LQE.js.map} +0 -0
  119. /package/dist/{chunk-IN5TKIL3.js.map → chunk-2ZQKORJI.js.map} +0 -0
  120. /package/dist/{chunk-RINGLIE7.js.map → chunk-CJSCCLT5.js.map} +0 -0
  121. /package/dist/{chunk-IK6GTV3N.js.map → chunk-COZ75NET.js.map} +0 -0
  122. /package/dist/{chunk-JIZKHL5P.js.map → chunk-HA35FGPO.js.map} +0 -0
  123. /package/dist/{chunk-2TRPBOF3.js.map → chunk-HIVZDWJC.js.map} +0 -0
  124. /package/dist/{chunk-NIA3NQBT.js.map → chunk-IJNNVCS4.js.map} +0 -0
  125. /package/dist/{chunk-FH74AVEW.js.map → chunk-JB2QTE7M.js.map} +0 -0
  126. /package/dist/{chunk-DBPC4V25.js.map → chunk-JZPQI7YI.js.map} +0 -0
  127. /package/dist/{chunk-3N4MUUAJ.js.map → chunk-MOWZ2FLG.js.map} +0 -0
  128. /package/dist/{chunk-HZ5CCPU4.js.map → chunk-RHAZARG3.js.map} +0 -0
  129. /package/dist/{chunk-JUY45EUT.js.map → chunk-RO6BG4ZW.js.map} +0 -0
  130. /package/dist/{chunk-ZFQJ5STW.js.map → chunk-TJBOCGLR.js.map} +0 -0
  131. /package/dist/{chunk-7ET6VTIQ.js.map → chunk-VMTZ5WC5.js.map} +0 -0
  132. /package/dist/{chunk-DDBSYZGZ.js.map → chunk-W3GHDONP.js.map} +0 -0
  133. /package/dist/{chunk-FFNBQMMZ.js.map → chunk-ZU7AOE3X.js.map} +0 -0
  134. /package/dist/{source-loader-7GPUP6TG.js.map → source-loader-HQTTAMS7.js.map} +0 -0
  135. /package/dist/{source-manager-5FCN2CDH.js.map → source-manager-A3QLBYCU.js.map} +0 -0
@@ -1 +0,0 @@
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 } 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\";\nimport { isCategory } from \"../utils/type-guards.js\";\n\nconst BUILT_IN_DOMAINS: Domain[] = [\"web\", \"api\", \"cli\", \"mobile\", \"shared\"];\n\nfunction createDefaultSkillConfig(id: SkillId): SkillConfig {\n return { id, scope: \"global\", source: 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, categories } = 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 if (!isCategory(skill.category)) {\n warn(`Installed skill '${skillId}' has non-standard category '${skill.category}' — skipping`);\n return null;\n }\n\n const subcat = skill.category;\n const domain = categories[subcat]?.domain;\n if (!domain) {\n warn(`Installed skill '${skillId}' has unknown category '${skill.category}' — skipping`);\n return null;\n }\n\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) => set({ selectedStackId: stackId }),\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 return {\n id,\n scope: saved?.scope ?? \"global\",\n source: 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 selectedSource =\n configEntry?.source || skill.activeSource?.name || 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":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/lib/__tests__/mock-data/mock-matrices.ts","../src/cli/lib/__tests__/mock-data/mock-skills.ts"],"sourcesContent":["// Shared matrix configs and compile configs for test files.\n// Uses createMockMatrixConfig/createMockCompileConfig from helpers.ts.\n\nimport { groupBy, mapValues } from \"remeda\";\n\nimport {\n createMockMatrixConfig,\n createMockCompileConfig,\n createMockCategory,\n createMockMatrix,\n createMockMultiSourceSkill,\n createMockSkill,\n testSkillToResolvedSkill,\n} from \"../helpers.js\";\nimport { SKILLS, TEST_CATEGORIES } from \"../test-fixtures.js\";\nimport { FRAMEWORK_CATEGORY, MULTI_SOURCE_CATEGORIES } from \"./mock-categories.js\";\nimport {\n CATEGORY_GRID_SKILLS,\n HEALTH_ALL_REFS_RESOLVED_SKILL,\n HEALTH_MULTIPLE_UNRESOLVED_REFS_SKILL,\n HEALTH_ORPHAN_SKILL,\n HEALTH_PARTIAL_UNRESOLVED_REQUIRES_SKILL,\n HEALTH_UNRESOLVED_COMPATIBLE_WITH_SKILL,\n HEALTH_UNRESOLVED_CONFLICTS_WITH_SKILL,\n HEALTH_UNRESOLVED_REQUIRES_SKILL,\n HEALTH_ZUSTAND_RECOMMENDED,\n MULTI_SOURCE_PUBLIC_SKILLS,\n MULTI_SOURCE_ACME_SKILLS,\n MULTI_SOURCE_INTERNAL_SKILLS,\n PIPELINE_TEST_SKILLS,\n} from \"./mock-skills.js\";\nimport type { MultiSourceSkillEntry } from \"./mock-skills.js\";\nimport { PUBLIC_SOURCE, ACME_SOURCE, INTERNAL_SOURCE } from \"./mock-sources.js\";\nimport type {\n Category,\n CategoryDefinition,\n CategoryPath,\n MergedSkillsMatrix,\n SkillId,\n SkillSlug,\n SkillSource,\n} from \"../../../types\";\n\n// ---------------------------------------------------------------------------\n// Canonical matrix shapes — use these instead of inline createMockMatrix() calls\n// ---------------------------------------------------------------------------\n\nexport const EMPTY_MATRIX = createMockMatrix();\nexport const SINGLE_REACT_MATRIX = createMockMatrix(SKILLS.react);\nexport const WEB_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand);\nexport const FULLSTACK_PAIR_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono);\nexport const WEB_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.zustand, SKILLS.vitest);\nexport const FULLSTACK_TRIO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, SKILLS.vitest);\nexport const VITEST_REACT_HONO_MATRIX = createMockMatrix(SKILLS.vitest, SKILLS.react, SKILLS.hono);\nexport const REACT_SCSS_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss);\nexport const REACT_SCSS_HONO_MATRIX = createMockMatrix(SKILLS.react, SKILLS.scss, SKILLS.hono);\nexport const SCSS_HONO_REACT_MATRIX = createMockMatrix(SKILLS.scss, SKILLS.hono, SKILLS.react);\nexport const HONO_REACT_MATRIX = createMockMatrix(SKILLS.hono, SKILLS.react);\nexport const REACT_ZUSTAND_HONO_MATRIX = createMockMatrix(\n SKILLS.react,\n SKILLS.zustand,\n SKILLS.hono,\n);\n\nexport const CATEGORY_GRID_MATRIX = createMockMatrix(\n ...CATEGORY_GRID_SKILLS.map(({ id, displayName, category }) =>\n createMockSkill(id, { displayName, category }),\n ),\n);\n\n// ---------------------------------------------------------------------------\n// All-skills matrices with category overrides — for wizard store tests\n// ---------------------------------------------------------------------------\n\nexport const ALL_SKILLS_TEST_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: TEST_CATEGORIES as unknown as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_FRAMEWORK_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_PAIR_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"web-client-state\": { domain: \"web\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_FULLSTACK_CATEGORIES_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"web-client-state\": { domain: \"web\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_WEB_AND_API_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_METHODOLOGY_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"shared-methodology\": { domain: \"shared\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_METHODOLOGY_BARE_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"shared-methodology\": {},\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const ALL_SKILLS_MULTI_DOMAIN_MATRIX = createMockMatrix(...Object.values(SKILLS), {\n categories: {\n \"web-framework\": { domain: \"web\" },\n \"shared-methodology\": { domain: \"shared\" },\n \"api-api\": { domain: \"api\" },\n } as Record<Category, CategoryDefinition>,\n});\n\nexport const REACT_HONO_FRAMEWORK_API_MATRIX = createMockMatrix(SKILLS.react, SKILLS.hono, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"api-api\": TEST_CATEGORIES.api,\n } as Record<Category, CategoryDefinition>,\n});\n\n// ---------------------------------------------------------------------------\n// Matrix configs from matrix-loader.test.ts\n// ---------------------------------------------------------------------------\n\nexport const MERGE_BASIC_MATRIX = createMockMatrixConfig({ \"web-framework\": FRAMEWORK_CATEGORY });\n\nexport const CONFLICT_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n conflicts: [{ skills: [\"react\", \"vue-composition-api\"], reason: \"Pick one framework\" }],\n },\n },\n);\n\nexport const ALTERNATIVES_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n alternatives: [\n {\n purpose: \"State management\",\n skills: [\"zustand\", \"jotai\"],\n },\n ],\n },\n },\n);\n\nexport const REQUIRES_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n requires: [\n {\n skill: \"zustand\",\n needs: [\"react\"],\n reason: \"Zustand needs React\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// MergedSkillsMatrix instances from config-generator.test.ts\n// ---------------------------------------------------------------------------\n\nexport const LOCAL_SKILL_MATRIX = createMockMatrix(\n // Boundary cast: fictional skill ID for testing local skill matrix\n createMockSkill(\"web-local-skill\" as SkillId, {\n local: true,\n localPath: \".claude/skills/my-local-skill/\",\n }),\n);\n\nexport const MIXED_LOCAL_REMOTE_MATRIX = createMockMatrix(\n SKILLS.react,\n // Boundary cast: fictional skill ID for testing mixed local/remote matrix\n createMockSkill(\"meta-company-patterns\" as SkillId, {\n local: true,\n localPath: \".claude/skills/company-patterns/\",\n }),\n);\n\nexport const METHODOLOGY_MATRIX = createMockMatrix(SKILLS.antiOverEng);\n\nexport const VITEST_MATRIX = createMockMatrix(SKILLS.vitest);\n\n// ---------------------------------------------------------------------------\n// Compile configs from resolver.test.ts\n// ---------------------------------------------------------------------------\n\nexport const WEB_AND_API_COMPILE_CONFIG = createMockCompileConfig({\n \"web-developer\": {},\n \"api-developer\": {},\n});\n\nexport const WEB_ONLY_COMPILE_CONFIG = createMockCompileConfig({\n \"web-developer\": {},\n});\n\n// ---------------------------------------------------------------------------\n// Matrix configs from consumer-stacks-matrix.integration.test.ts\n// ---------------------------------------------------------------------------\n\nexport const TOOLING_AND_FRAMEWORK_CONFIG = createMockMatrixConfig({\n \"shared-tooling\": {\n ...TEST_CATEGORIES.tooling,\n description: \"Development tooling and infrastructure\",\n domain: \"shared\" as const,\n exclusive: false,\n order: 20,\n },\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n});\n\nexport const CI_CD_CONFIG = createMockMatrixConfig({\n \"shared-ci-cd\": createMockCategory(\"shared-ci-cd\", \"CI/CD\", {\n description: \"Continuous integration and deployment\",\n domain: \"shared\",\n exclusive: true,\n required: false,\n order: 30,\n }),\n});\n\nexport const FRAMEWORK_AND_STYLING_CONFIG = createMockMatrixConfig(\n {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n \"web-styling\": {\n ...TEST_CATEGORIES.styling,\n description: \"CSS approach\",\n exclusive: false,\n order: 2,\n },\n },\n {\n relationships: {\n discourages: [\n {\n skills: [\"react\", \"scss-modules\"],\n reason: \"These tools have conflicting design philosophies\",\n },\n ],\n recommends: [\n {\n skill: \"vue-composition-api\",\n reason: \"These work great together\",\n },\n ],\n },\n },\n);\n\nexport const OBSERVABILITY_CONFIG = createMockMatrixConfig({\n \"api-observability\": createMockCategory(\"api-observability\", \"Observability\", {\n description: \"Monitoring and observability tools\",\n domain: \"api\",\n exclusive: false,\n required: false,\n order: 15,\n }),\n});\n\nexport const FRAMEWORK_AND_TESTING_CONFIG = createMockMatrixConfig(\n {\n \"web-framework\": {\n ...TEST_CATEGORIES.framework,\n description: \"UI Framework\",\n required: true,\n order: 1,\n },\n \"web-testing\": {\n ...TEST_CATEGORIES.testing,\n description: \"Testing tools\",\n domain: \"shared\" as const,\n exclusive: false,\n order: 10,\n },\n },\n {\n relationships: {\n requires: [\n {\n skill: \"vitest\",\n needs: [\"react\"],\n reason: \"RTL requires React to function\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Matrix configs from skill-resolution.test.ts\n// ---------------------------------------------------------------------------\n\nexport const EMPTY_MATRIX_CONFIG = createMockMatrixConfig({});\n\nexport const UNRESOLVED_CONFLICT_MATRIX = createMockMatrixConfig(\n {},\n {\n relationships: {\n conflicts: [\n {\n // Boundary cast: deliberately invalid slug to test unresolved reference handling\n skills: [\"react\", \"nonexistent\" as SkillSlug],\n reason: \"Conflict with missing skill\",\n },\n ],\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Pipeline matrix from wizard-init-compile-pipeline.test.ts\n// ---------------------------------------------------------------------------\n\nexport const PIPELINE_MATRIX = createMockMatrix(\n Object.fromEntries(\n PIPELINE_TEST_SKILLS.map((skill) => [skill.id, testSkillToResolvedSkill(skill)]),\n ),\n);\n\n// ---------------------------------------------------------------------------\n// Health-check matrices from matrix-health-check.test.ts\n// ---------------------------------------------------------------------------\n\nconst HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY = {\n ...TEST_CATEGORIES.framework,\n domain: undefined,\n};\n\nconst HEALTH_MISSING_DOMAIN_STYLING_CATEGORY = {\n ...TEST_CATEGORIES.styling,\n domain: undefined,\n};\n\nexport const HEALTH_HEALTHY_MATRIX = createMockMatrix(SKILLS.react, HEALTH_ZUSTAND_RECOMMENDED, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n});\n\nexport const HEALTH_SINGLE_SKILL_MATRIX = createMockMatrix(SKILLS.react, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n },\n});\n\nexport const HEALTH_MISSING_DOMAIN_MATRIX = createMockMatrix(SKILLS.react, {\n categories: {\n \"web-framework\": HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY,\n },\n});\n\nexport const HEALTH_MULTIPLE_MISSING_DOMAINS_MATRIX = createMockMatrix(\n {},\n {\n categories: {\n \"web-framework\": HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY,\n \"web-styling\": HEALTH_MISSING_DOMAIN_STYLING_CATEGORY,\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_UNKNOWN_CATEGORY_MATRIX = createMockMatrix(HEALTH_ORPHAN_SKILL, {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n },\n});\n\nexport const HEALTH_ORPHAN_SKILL_WITH_MISSING_DOMAIN_MATRIX = createMockMatrix(\n HEALTH_ORPHAN_SKILL,\n {\n categories: {\n \"web-framework\": HEALTH_MISSING_DOMAIN_FRAMEWORK_CATEGORY,\n },\n },\n);\n\nexport const HEALTH_UNRESOLVED_COMPATIBLE_WITH_MATRIX = createMockMatrix(\n HEALTH_UNRESOLVED_COMPATIBLE_WITH_SKILL,\n {\n categories: {\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_UNRESOLVED_CONFLICTS_WITH_MATRIX = createMockMatrix(\n HEALTH_UNRESOLVED_CONFLICTS_WITH_SKILL,\n {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n },\n },\n);\n\nexport const HEALTH_UNRESOLVED_REQUIRES_MATRIX = createMockMatrix(\n HEALTH_UNRESOLVED_REQUIRES_SKILL,\n {\n categories: {\n \"web-testing\": TEST_CATEGORIES.testing,\n },\n },\n);\n\nexport const HEALTH_MULTIPLE_UNRESOLVED_REFS_MATRIX = createMockMatrix(\n HEALTH_MULTIPLE_UNRESOLVED_REFS_SKILL,\n {\n categories: {\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_ALL_REFS_RESOLVED_MATRIX = createMockMatrix(\n SKILLS.react,\n HEALTH_ALL_REFS_RESOLVED_SKILL,\n {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"web-client-state\": TEST_CATEGORIES.clientState,\n },\n },\n);\n\nexport const HEALTH_PARTIAL_UNRESOLVED_REQUIRES_MATRIX = createMockMatrix(\n SKILLS.react,\n HEALTH_PARTIAL_UNRESOLVED_REQUIRES_SKILL,\n {\n categories: {\n \"web-framework\": TEST_CATEGORIES.framework,\n \"web-testing\": TEST_CATEGORIES.testing,\n },\n },\n);\n\n// ---------------------------------------------------------------------------\n// Multi-source matrix from skill-resolution.integration.test.ts\n// ---------------------------------------------------------------------------\n\ntype TaggedMultiSourceEntry = MultiSourceSkillEntry & { source: SkillSource };\n\nexport function buildMultiSourceMatrix(\n overrides?: Partial<MergedSkillsMatrix>,\n): MergedSkillsMatrix {\n const taggedEntries: TaggedMultiSourceEntry[] = [\n ...MULTI_SOURCE_PUBLIC_SKILLS.map((s) => ({ ...s, source: { ...PUBLIC_SOURCE } })),\n ...MULTI_SOURCE_ACME_SKILLS.map((s) => ({ ...s, source: { ...ACME_SOURCE } })),\n ...MULTI_SOURCE_INTERNAL_SKILLS.map((s) => ({ ...s, source: { ...INTERNAL_SOURCE } })),\n ];\n const grouped = groupBy(taggedEntries, (e) => e.id);\n const skills = mapValues(grouped, (entries) => {\n const first = entries[0]!;\n const sources = entries.map((e) => e.source);\n // Boundary cast: MultiSourceSkillEntry.id is string, but contains valid skill IDs\n return createMockMultiSourceSkill(first.id as SkillId, sources, {\n category: first.category as CategoryPath,\n description: first.description,\n });\n });\n\n return createMockMatrix(skills, {\n categories: MULTI_SOURCE_CATEGORIES,\n ...overrides,\n });\n}\n","// Shared skill entries and TestSkill arrays for test files.\n// Uses createMockSkillEntry from helpers.ts.\n\nimport type { Category, CategoryPath, ResolvedSkill, Skill, SkillId } from \"../../../types\";\nimport type { TestSkill } from \"../fixtures/create-test-source\";\nimport {\n createMockExtractedSkill,\n createMockSkill,\n createMockSkillEntry,\n createTestSkill,\n SKILLS,\n} from \"../helpers.js\";\nimport { renderSkillMd } from \"../content-generators\";\n\n// Skill entries from compiler.test.ts\n\nexport const REACT_SKILL_PRELOADED = createMockSkillEntry(\"web-framework-react\", true);\n\nexport const REACT_SKILL = createMockSkillEntry(\"web-framework-react\");\n\nexport const VITEST_SKILL = createMockSkillEntry(\"web-testing-vitest\");\n\nexport const VITEST_SINGLE_FILE_SKILL: Skill = {\n ...VITEST_SKILL,\n path: \"skills/web-testing-vitest.md\",\n};\n\nconst METHODOLOGY_TEST_SKILLS: TestSkill[] = [\n {\n id: \"meta-methodology-anti-over-engineering\",\n slug: \"anti-over-engineering\",\n displayName: \"Anti Over-Engineering\",\n description: \"Surgical implementation, not architectural innovation\",\n category: \"shared-methodology\",\n author: \"@test\",\n domain: \"shared\",\n tags: [\"methodology\", \"foundational\"],\n },\n];\n\n// Individual TestSkill constants — each skill defined exactly once\n\nconst reactSkill = createTestSkill(\n \"web-framework-react\",\n \"React framework for building user interfaces\",\n {\n tags: [\"react\", \"web\", \"ui\"],\n },\n);\n\nconst zustandSkill = createTestSkill(\"web-state-zustand\", \"Bear necessities state management\", {\n tags: [\"state\", \"react\", \"zustand\"],\n});\n\nconst vitestSkill = createTestSkill(\"web-testing-vitest\", \"Next generation testing framework\", {\n tags: [\"testing\", \"vitest\", \"unit\"],\n});\n\nconst honoSkill = createTestSkill(\"api-framework-hono\", \"Lightweight web framework for the edge\", {\n tags: [\"api\", \"hono\", \"edge\"],\n});\n\nconst vueSkill = createTestSkill(\n \"web-framework-vue-composition-api\",\n \"Progressive JavaScript framework\",\n {\n tags: [\"vue\", \"web\"],\n },\n);\n\nconst scssSkill = createTestSkill(\"web-styling-scss-modules\", \"CSS Modules with SCSS\", {\n displayName: \"SCSS Modules\",\n tags: [\"css\", \"scss\"],\n});\n\nconst drizzleSkill = createTestSkill(\"api-database-drizzle\", \"TypeScript ORM for SQL databases\", {\n tags: [\"database\", \"orm\"],\n});\n\n// Composed TestSkill arrays\n\nexport const EXTRA_DOMAIN_TEST_SKILLS: TestSkill[] = [vueSkill, scssSkill, drizzleSkill];\n\nexport const COMPILE_LOCAL_SKILL: TestSkill = createTestSkill(\n // Boundary cast: fictional skill ID for testing local skill compilation\n \"web-tooling-local-skill\" as SkillId,\n \"A local project skill\",\n { slug: \"tooling\", displayName: \"Local Skill\", tags: [\"local\", \"custom\"] },\n);\n\nexport const DEFAULT_TEST_SKILLS: TestSkill[] = [reactSkill, zustandSkill, vitestSkill, honoSkill];\n\nexport const PIPELINE_TEST_SKILLS: TestSkill[] = [\n ...DEFAULT_TEST_SKILLS,\n ...EXTRA_DOMAIN_TEST_SKILLS,\n];\n\n// TestSkill constants from consumer-stacks-matrix.integration.test.ts\n\nexport const DOCKER_TOOLING_SKILL: TestSkill = createTestSkill(\n // Boundary cast: fictional skill ID for testing infra tooling\n \"infra-tooling-docker\" as SkillId,\n \"Docker containerization patterns\",\n {\n slug: \"tooling\",\n displayName: \"Docker\",\n domain: \"shared\",\n tags: [\"docker\", \"devops\", \"containers\"],\n },\n);\n\nexport const CI_CD_SKILLS: TestSkill[] = [\n // Boundary cast: fictional skill ID for testing CI/CD skills\n createTestSkill(\"infra-ci-cd-github-actions\" as SkillId, \"github-actions CI/CD pipeline\", {\n slug: \"github-actions\",\n displayName: \"GitHub Actions\",\n category: \"infra-ci-cd\",\n domain: \"shared\",\n tags: [\"ci-cd\", \"github-actions\"],\n }),\n // Boundary cast: fictional skill ID for testing CI/CD skills\n createTestSkill(\"infra-ci-cd-gitlab-ci\" as SkillId, \"gitlab-ci CI/CD pipeline\", {\n slug: \"gitlab-ci\",\n displayName: \"GitLab CI\",\n category: \"infra-ci-cd\",\n domain: \"shared\",\n tags: [\"ci-cd\", \"gitlab-ci\"],\n }),\n];\n\nexport const DISCOURAGES_RELATIONSHIP_SKILLS: TestSkill[] = [reactSkill, scssSkill, vueSkill];\n\nexport const DATADOG_OBSERVABILITY_SKILL: TestSkill = createTestSkill(\n // Boundary cast: fictional skill ID for testing observability skills\n \"api-observability-datadog\" as SkillId,\n \"Datadog APM integration\",\n { tags: [\"monitoring\", \"observability\", \"apm\", \"custom-tag\"] },\n);\n\nexport const REQUIRES_RELATIONSHIP_SKILLS: TestSkill[] = [reactSkill, vitestSkill];\n\n// Source-switching TestSkill arrays (with rendered SKILL.md content)\n\n/** Creates a TestSkill with rendered SKILL.md content for source-switching tests */\nfunction contentSkill(\n id: SkillId,\n description: string,\n tags: string[],\n body: string,\n author?: string,\n): TestSkill {\n return createTestSkill(id, description, {\n ...(author ? { author } : {}),\n tags,\n content: renderSkillMd(id, description, body),\n });\n}\n\nexport const SWITCHABLE_SKILLS: TestSkill[] = [\n contentSkill(\n \"web-framework-react\",\n \"React framework for building user interfaces\",\n [\"react\", \"web\"],\n \"# React (Marketplace Version)\\n\\nReact is a JavaScript library for building user interfaces.\\nUse component-based architecture with JSX.\",\n ),\n contentSkill(\n \"web-state-zustand\",\n \"Bear necessities state management\",\n [\"state\", \"zustand\"],\n \"# Zustand (Marketplace Version)\\n\\nZustand is a minimal state management library for React.\",\n ),\n contentSkill(\n \"api-framework-hono\",\n \"Lightweight web framework for the edge\",\n [\"api\", \"hono\"],\n \"# Hono (Marketplace Version)\\n\\nHono is a fast web framework for the edge.\",\n ),\n contentSkill(\n \"web-testing-vitest\",\n \"Next generation testing framework\",\n [\"testing\", \"vitest\"],\n \"# Vitest (Marketplace Version)\\n\\nVitest is a fast unit test framework powered by Vite.\",\n ),\n];\n\nexport const LOCAL_SKILL_VARIANTS: TestSkill[] = [\n contentSkill(\n \"web-framework-react\",\n \"React framework (local customized version)\",\n [\"react\", \"web\"],\n \"# React (Local Version)\\n\\nThis is my customized React skill with project-specific patterns.\",\n \"@local-user\",\n ),\n contentSkill(\n \"web-state-zustand\",\n \"Zustand state management (local customized version)\",\n [\"state\", \"zustand\"],\n \"# Zustand (Local Version)\\n\\nMy customized Zustand patterns with project-specific stores.\",\n \"@local-user\",\n ),\n];\n\nexport const RESOLUTION_PIPELINE_SKILLS: TestSkill[] = [\n createTestSkill(\"web-framework-react\", \"React framework (public source)\", {\n tags: [\"react\", \"web\"],\n }),\n createTestSkill(\"api-framework-hono\", \"Hono framework (acme source)\", {\n author: \"@acme\",\n tags: [\"api\", \"hono\"],\n }),\n // Boundary cast: fictional skill ID for testing multi-source resolution\n createTestSkill(\"web-animation-framer\" as SkillId, \"Framer Motion (internal source)\", {\n slug: \"framer-motion\",\n displayName: \"Framer Motion\",\n author: \"@internal\",\n tags: [\"animation\"],\n }),\n createTestSkill(\"api-database-drizzle\", \"Drizzle ORM (acme source)\", {\n author: \"@acme\",\n tags: [\"database\"],\n }),\n createTestSkill(\"web-testing-vitest\", \"Vitest testing (public source)\", {\n tags: [\"testing\"],\n }),\n];\n\n// Composed skill ID collections\n\nexport const ALL_TEST_SKILLS = [\n ...DEFAULT_TEST_SKILLS,\n ...EXTRA_DOMAIN_TEST_SKILLS,\n ...METHODOLOGY_TEST_SKILLS,\n];\n\nexport const INIT_SKILL_IDS: SkillId[] = [\n \"web-framework-react\",\n \"api-framework-hono\",\n \"web-testing-vitest\",\n];\n\nexport const INIT_TEST_SKILLS = DEFAULT_TEST_SKILLS.filter((s) =>\n INIT_SKILL_IDS.includes(s.id as SkillId),\n);\n\n// ExtractedSkillMetadata constants for skill-resolution tests\n\nexport const REACT_EXTRACTED = createMockExtractedSkill(\"web-framework-react\", {\n description: \"React framework\",\n author: \"@vince\",\n tags: [\"react\"],\n});\n\nexport const REACT_EXTRACTED_BASIC = createMockExtractedSkill(\"web-framework-react\", {\n description: \"React\",\n});\n\nexport const VUE_EXTRACTED_BASIC = createMockExtractedSkill(\"web-framework-vue-composition-api\", {\n description: \"Vue\",\n});\n\nexport const ZUSTAND_EXTRACTED = createMockExtractedSkill(\"web-state-zustand\", {\n description: \"Zustand\",\n category: \"web-client-state\",\n});\n\nexport const JOTAI_EXTRACTED = createMockExtractedSkill(\"web-state-jotai\", {\n description: \"Jotai\",\n category: \"web-client-state\",\n});\n\n// ---------------------------------------------------------------------------\n// Health-check skill variants (matrix-health-check.test.ts)\n// ---------------------------------------------------------------------------\n\nexport const HEALTH_ZUSTAND_RECOMMENDED = {\n ...SKILLS.zustand,\n isRecommended: true,\n recommendedReason: \"Works well with React\",\n};\n\nexport const HEALTH_ORPHAN_SKILL = {\n ...SKILLS.react,\n category: \"nonexistent-category\" as Category,\n};\n\nexport const HEALTH_UNRESOLVED_COMPATIBLE_WITH_SKILL = {\n ...SKILLS.zustand,\n // Boundary cast: fake SkillId for unresolved-ref testing\n compatibleWith: [\"web-framework-nonexistent\" as SkillId],\n};\n\nexport const HEALTH_UNRESOLVED_CONFLICTS_WITH_SKILL = {\n ...SKILLS.react,\n // Boundary cast: fake SkillId for unresolved-ref testing\n conflictsWith: [{ skillId: \"web-framework-ghost\" as SkillId, reason: \"Conflicts\" }],\n};\n\nexport const HEALTH_UNRESOLVED_REQUIRES_SKILL = createMockSkill(\"web-testing-cypress-e2e\", {\n requires: [\n {\n skillIds: [\"web-framework-missing\" as SkillId],\n needsAny: false,\n reason: \"Needs a framework\",\n },\n ],\n});\n\nexport const HEALTH_MULTIPLE_UNRESOLVED_REFS_SKILL = {\n ...SKILLS.zustand,\n // Boundary casts: fake SkillIds for unresolved-ref testing\n compatibleWith: [\"web-framework-missing\" as SkillId],\n conflictsWith: [{ skillId: \"web-state-ghost\" as SkillId, reason: \"Conflicts\" }],\n};\n\nexport const HEALTH_ALL_REFS_RESOLVED_SKILL: ResolvedSkill = {\n ...SKILLS.zustand,\n conflictsWith: [{ skillId: \"web-framework-react\", reason: \"Test\" }],\n requires: [\n {\n skillIds: [\"web-framework-react\"],\n needsAny: false,\n reason: \"Needs React\",\n },\n ],\n};\n\nexport const HEALTH_PARTIAL_UNRESOLVED_REQUIRES_SKILL = createMockSkill(\"web-testing-cypress-e2e\", {\n requires: [\n {\n skillIds: [\"web-framework-react\", \"web-framework-missing\" as SkillId],\n needsAny: true,\n reason: \"Needs one framework\",\n },\n ],\n});\n\n// ---------------------------------------------------------------------------\n// Category grid test skills (category-grid.test.tsx)\n// ---------------------------------------------------------------------------\n\nexport const CATEGORY_GRID_SKILLS: {\n id: SkillId;\n displayName: string;\n category: CategoryPath;\n}[] = [\n { id: \"web-framework-react\", displayName: \"React\", category: \"web-framework\" },\n { id: \"web-framework-vue-composition-api\", displayName: \"Vue\", category: \"web-framework\" },\n { id: \"web-framework-angular-standalone\", displayName: \"Angular\", category: \"web-framework\" },\n { id: \"web-framework-solidjs\", displayName: \"SolidJS\", category: \"web-framework\" },\n { id: \"web-framework-nuxt\", displayName: \"Nuxt\", category: \"web-framework\" },\n { id: \"web-framework-remix\", displayName: \"Remix\", category: \"web-framework\" },\n {\n id: \"web-framework-nextjs-app-router\",\n displayName: \"Next.js App Router\",\n category: \"web-framework\",\n },\n {\n id: \"web-framework-nextjs-server-actions\",\n displayName: \"Next.js Server Actions\",\n category: \"web-framework\",\n },\n { id: \"web-styling-scss-modules\", displayName: \"SCSS Modules\", category: \"web-styling\" },\n { id: \"web-styling-tailwind\", displayName: \"Tailwind\", category: \"web-styling\" },\n { id: \"web-styling-cva\", displayName: \"CVA\", category: \"web-styling\" },\n { id: \"web-state-zustand\", displayName: \"Zustand\", category: \"web-client-state\" },\n { id: \"web-state-jotai\", displayName: \"Jotai\", category: \"web-client-state\" },\n { id: \"web-state-redux-toolkit\", displayName: \"Redux\", category: \"web-client-state\" },\n { id: \"web-state-mobx\", displayName: \"MobX\", category: \"web-client-state\" },\n { id: \"web-server-state-react-query\", displayName: \"React Query\", category: \"web-server-state\" },\n { id: \"web-data-fetching-swr\", displayName: \"SWR\", category: \"web-server-state\" },\n { id: \"web-data-fetching-graphql-apollo\", displayName: \"Apollo\", category: \"web-server-state\" },\n { id: \"api-analytics-posthog-analytics\", displayName: \"PostHog\", category: \"api-analytics\" },\n { id: \"web-forms-react-hook-form\", displayName: \"React Hook Form\", category: \"web-forms\" },\n { id: \"web-forms-vee-validate\", displayName: \"Vee Validate\", category: \"web-forms\" },\n { id: \"web-forms-zod-validation\", displayName: \"Zod Validation\", category: \"web-forms\" },\n { id: \"web-testing-vitest\", displayName: \"Vitest\", category: \"web-testing\" },\n { id: \"web-testing-playwright-e2e\", displayName: \"Playwright\", category: \"web-testing\" },\n { id: \"web-testing-cypress-e2e\", displayName: \"Cypress\", category: \"web-testing\" },\n { id: \"web-mocks-msw\", displayName: \"MSW\", category: \"web-mocking\" },\n {\n id: \"web-testing-react-testing-library\",\n displayName: \"React Testing Library\",\n category: \"web-testing\",\n },\n { id: \"web-testing-vue-test-utils\", displayName: \"Vue Test Utils\", category: \"web-testing\" },\n { id: \"web-i18n-next-intl\", displayName: \"Next Intl\", category: \"web-i18n\" },\n { id: \"web-i18n-react-intl\", displayName: \"React Intl\", category: \"web-i18n\" },\n { id: \"web-i18n-vue-i18n\", displayName: \"Vue I18n\", category: \"web-i18n\" },\n];\n\n// ---------------------------------------------------------------------------\n// Multi-source integration test skill entries (skill-resolution.integration.test.ts)\n// ---------------------------------------------------------------------------\n\ntype MultiSourceSkillEntry = { id: string; category: string; description: string };\n\nexport const MULTI_SOURCE_PUBLIC_SKILLS: MultiSourceSkillEntry[] = [\n { id: \"web-framework-react\", category: \"web-framework\", description: \"React framework\" },\n {\n id: \"web-framework-vue-composition-api\",\n category: \"web-framework\",\n description: \"Vue.js framework\",\n },\n {\n id: \"web-state-zustand\",\n category: \"web-client-state\",\n description: \"Zustand state management\",\n },\n { id: \"web-styling-scss-modules\", category: \"web-styling\", description: \"SCSS Modules styling\" },\n { id: \"web-testing-vitest\", category: \"web-testing\", description: \"Vitest testing framework\" },\n];\n\nexport const MULTI_SOURCE_ACME_SKILLS: MultiSourceSkillEntry[] = [\n { id: \"web-framework-react\", category: \"web-framework\", description: \"React (acme custom fork)\" },\n { id: \"api-framework-hono\", category: \"api-api\", description: \"Hono web framework\" },\n { id: \"api-database-drizzle\", category: \"api-database\", description: \"Drizzle ORM\" },\n { id: \"api-security-auth-patterns\", category: \"shared-security\", description: \"Auth patterns\" },\n { id: \"web-testing-vitest\", category: \"web-testing\", description: \"Vitest (acme custom)\" },\n];\n\nexport const MULTI_SOURCE_INTERNAL_SKILLS: MultiSourceSkillEntry[] = [\n { id: \"web-framework-react\", category: \"web-framework\", description: \"React (internal build)\" },\n { id: \"web-animation-framer\", category: \"web-animation\", description: \"Framer Motion\" },\n {\n id: \"meta-methodology-investigation\",\n category: \"shared-methodology\",\n description: \"Investigation first\",\n },\n { id: \"web-accessibility-a11y\", category: \"web-accessibility\", description: \"Web accessibility\" },\n {\n id: \"api-monitoring-sentry\",\n category: \"api-observability\",\n description: \"Sentry error tracking\",\n },\n];\n\nexport type { MultiSourceSkillEntry };\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/init.tsx","../src/cli/lib/permission-checker.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Flags } from \"@oclif/core\";\nimport { render, Box, Text, useApp } from \"ink\";\nimport fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { BaseCommand } from \"../base-command.js\";\nimport { Wizard, type WizardResultV2 } from \"../components/wizard/wizard.js\";\nimport {\n loadSkillsMatrixFromSource,\n getMarketplaceLabel,\n fetchMarketplace,\n type SourceLoadResult,\n} from \"../lib/loading/index.js\";\nimport {\n installLocal,\n installPluginConfig,\n detectGlobalInstallation,\n detectProjectInstallation,\n deriveInstallMode,\n} from \"../lib/installation/index.js\";\nimport { checkPermissions } from \"../lib/permission-checker.js\";\nimport { getInstallationInfo } from \"../lib/plugins/plugin-info.js\";\nimport { hasIndividualPlugins } from \"../lib/plugins/index.js\";\nimport {\n claudePluginInstall,\n claudePluginMarketplaceExists,\n claudePluginMarketplaceAdd,\n} from \"../utils/exec.js\";\nimport {\n ASCII_LOGO,\n CLAUDE_SRC_DIR,\n CLI_BIN_NAME,\n DEFAULT_BRANDING,\n GLOBAL_INSTALL_ROOT,\n} from \"../consts.js\";\nimport { SelectList, type SelectListItem } from \"../components/common/select-list.js\";\nimport {\n KEY_LABEL_ARROWS_VERT,\n KEY_LABEL_ENTER,\n KEY_LABEL_ESC,\n} from \"../components/wizard/hotkeys.js\";\nimport { getErrorMessage } from \"../utils/errors.js\";\nimport { EXIT_CODES } from \"../lib/exit-codes.js\";\nimport { getSkillById } from \"../lib/matrix/matrix-provider\";\nimport { loadProjectConfig } from \"../lib/configuration/project-config.js\";\nimport {\n enableBuffering,\n drainBuffer,\n disableBuffering,\n type StartupMessage,\n} from \"../utils/logger.js\";\nimport { SUCCESS_MESSAGES, STATUS_MESSAGES } from \"../utils/messages.js\";\nimport { ensureBlankGlobalConfig } from \"../lib/configuration/config-writer.js\";\n\n/** Clears the visible terminal area so the next render starts clean. */\nfunction clearTerminalOutput(): void {\n process.stdout.write(\"\\x1b[2J\\x1b[H\");\n}\n\nconst DASHBOARD_OPTIONS: SelectListItem<string>[] = [\n { label: \"Edit\", value: \"edit\" },\n { label: \"Compile\", value: \"compile\" },\n { label: \"Doctor\", value: \"doctor\" },\n { label: \"List\", value: \"list\" },\n];\n\ntype DashboardProps = {\n onSelect: (command: string) => void;\n onCancel: () => void;\n};\n\nconst Dashboard: React.FC<DashboardProps> = ({ onSelect, onCancel }) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text bold>{DEFAULT_BRANDING.NAME}</Text>\n <Text> </Text>\n <SelectList\n items={DASHBOARD_OPTIONS}\n onSelect={(command) => {\n onSelect(command);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n <Text> </Text>\n <Text dimColor>\n {\" \"}\n {KEY_LABEL_ARROWS_VERT} Navigate {\" \"}\n {KEY_LABEL_ENTER} Confirm {\" \"}\n {KEY_LABEL_ESC} Exit\n </Text>\n </Box>\n );\n};\n\ntype GlobalConfigChoice = \"edit-global\" | \"create-project\";\n\nconst GLOBAL_CONFIG_OPTIONS: SelectListItem<GlobalConfigChoice>[] = [\n { label: \"Edit global installation\", value: \"edit-global\" },\n { label: \"Create new project installation\", value: \"create-project\" },\n];\n\ntype GlobalConfigPromptProps = {\n globalConfigDir: string;\n onSelect: (choice: GlobalConfigChoice) => void;\n onCancel: () => void;\n};\n\nconst GlobalConfigPrompt: React.FC<GlobalConfigPromptProps> = ({\n globalConfigDir,\n onSelect,\n onCancel,\n}) => {\n const { exit } = useApp();\n\n return (\n <Box flexDirection=\"column\">\n <Text>A global installation was found at {globalConfigDir}</Text>\n <Text> </Text>\n <SelectList\n items={GLOBAL_CONFIG_OPTIONS}\n onSelect={(choice) => {\n onSelect(choice);\n exit();\n }}\n onCancel={() => {\n onCancel();\n exit();\n }}\n />\n <Text> </Text>\n <Text dimColor>\n {\" \"}\n {KEY_LABEL_ARROWS_VERT} Navigate {\" \"}\n {KEY_LABEL_ENTER} Confirm {\" \"}\n {KEY_LABEL_ESC} Exit\n </Text>\n </Box>\n );\n};\n\nexport type DashboardData = {\n skillCount: number;\n agentCount: number;\n mode: string;\n source?: string;\n};\n\n/** Gathers dashboard data from the installation and project config. */\nexport async function getDashboardData(projectDir: string): Promise<DashboardData> {\n const [info, loaded] = await Promise.all([getInstallationInfo(), loadProjectConfig(projectDir)]);\n\n // Skill count from config (canonical source of truth for installed skills)\n const skillCount = loaded?.config?.skills?.length ?? 0;\n // Agent count from filesystem (compiled .md files in agents dir)\n const agentCount = info?.agentCount ?? 0;\n const mode =\n info?.mode ?? (loaded?.config?.skills ? deriveInstallMode(loaded.config.skills) : \"local\");\n const source = loaded?.config?.source;\n\n return { skillCount, agentCount, mode, source };\n}\n\n/** Formats the dashboard summary as plain text lines (for non-interactive/test output). */\nexport function formatDashboardText(data: DashboardData): string {\n const modeLabel = data.mode === \"plugin\" ? \"Plugin\" : \"Local\";\n const lines = [\n DEFAULT_BRANDING.NAME,\n \"\",\n ` Skills: ${data.skillCount} installed`,\n ` Agents: ${data.agentCount} compiled`,\n ` Mode: ${modeLabel}`,\n ];\n if (data.source) {\n lines.push(` Source: ${data.source}`);\n }\n lines.push(\"\");\n lines.push(` [Edit] [Compile] [Doctor] [List]`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Shows the project dashboard and returns the selected command (or null if cancelled).\n * In non-interactive environments (no TTY), prints the summary text and returns null.\n */\nexport async function showDashboard(\n projectDir: string,\n log?: (message: string) => void,\n): Promise<string | null> {\n const data = await getDashboardData(projectDir);\n\n // Non-interactive: print text summary and exit (CI, piped, tests)\n if (!process.stdin.isTTY) {\n const output = log ?? console.log;\n output(formatDashboardText(data));\n return null;\n }\n\n let selectedCommand: string | null = null;\n\n const { waitUntilExit } = render(\n <Dashboard\n onSelect={(command) => {\n selectedCommand = command;\n }}\n onCancel={() => {\n selectedCommand = null;\n }}\n />,\n );\n\n await waitUntilExit();\n clearTerminalOutput();\n\n return selectedCommand;\n}\n\nexport default class Init extends BaseCommand {\n static summary = `Initialize ${DEFAULT_BRANDING.NAME} in this project`;\n static description =\n \"Interactive wizard to set up skills and agents. Supports Plugin Mode (native install) and Local Mode (copy to .claude/).\";\n\n static examples = [\n {\n description: \"Start the setup wizard\",\n command: \"<%= config.bin %> <%= command.id %>\",\n },\n {\n description: \"Initialize from a custom marketplace\",\n command: \"<%= config.bin %> <%= command.id %> --source github:org/marketplace\",\n },\n {\n description: \"Force refresh skills from remote\",\n command: \"<%= config.bin %> <%= command.id %> --refresh\",\n },\n ];\n\n static flags = {\n ...BaseCommand.baseFlags,\n refresh: Flags.boolean({\n description: \"Force refresh from remote source\",\n default: false,\n }),\n };\n\n async run(): Promise<void> {\n const { flags } = await this.parse(Init);\n const projectDir = process.cwd();\n\n // For \"already initialized\" check, only look at the target directory (no global fallback)\n const individualPluginsExist = await hasIndividualPlugins(projectDir);\n const existingInstallation = await detectProjectInstallation(projectDir);\n\n if (individualPluginsExist || existingInstallation) {\n const selectedCommand = await showDashboard(projectDir, (msg) => this.log(msg));\n if (selectedCommand) {\n await this.config.runCommand(selectedCommand);\n }\n return;\n }\n\n // No project config exists: check if a global installation exists\n const globalInstallation = await detectGlobalInstallation();\n if (globalInstallation) {\n const globalConfigDir = path.join(os.homedir(), CLAUDE_SRC_DIR);\n\n // Non-interactive: skip prompt and fall through to wizard\n if (process.stdin.isTTY) {\n let globalChoice: GlobalConfigChoice | null = null;\n\n const { waitUntilExit: waitForPrompt } = render(\n <GlobalConfigPrompt\n globalConfigDir={globalConfigDir}\n onSelect={(choice) => {\n globalChoice = choice;\n }}\n onCancel={() => {\n globalChoice = null;\n }}\n />,\n );\n\n await waitForPrompt();\n clearTerminalOutput();\n\n if (globalChoice === \"edit-global\") {\n const editArgs: string[] = [];\n if (flags.source) {\n editArgs.push(\"--source\", flags.source);\n }\n if (flags.refresh) {\n editArgs.push(\"--refresh\");\n }\n await this.config.runCommand(\"edit\", editArgs);\n return;\n }\n\n // User cancelled (Esc)\n if (globalChoice === null) {\n return;\n }\n\n // \"create-project\" falls through to wizard below\n }\n }\n\n // Auto-create blank global config on first init from a project directory.\n // This ensures the project config can always import from global.\n // Resolve both paths through realpathSync — on macOS /var is a symlink to\n // /private/var, so os.homedir() and process.cwd() can return different\n // prefixes for the same directory.\n const isGlobalRoot = fs.realpathSync(projectDir) === fs.realpathSync(GLOBAL_INSTALL_ROOT);\n if (!isGlobalRoot) {\n const created = await ensureBlankGlobalConfig();\n if (created) {\n this.log(\"Created blank global config at ~/\" + CLAUDE_SRC_DIR);\n }\n }\n\n enableBuffering();\n\n let sourceResult: SourceLoadResult;\n let startupMessages: StartupMessage[] = [];\n try {\n sourceResult = await loadSkillsMatrixFromSource({\n sourceFlag: flags.source,\n projectDir,\n forceRefresh: flags.refresh,\n });\n } catch (error) {\n disableBuffering();\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n\n startupMessages = drainBuffer();\n disableBuffering();\n\n let wizardResult: WizardResultV2 | null = null;\n\n const marketplaceLabel = getMarketplaceLabel(sourceResult);\n const { waitUntilExit } = render(\n <Wizard\n version={this.config.version}\n marketplaceLabel={marketplaceLabel}\n logo={ASCII_LOGO}\n projectDir={projectDir}\n startupMessages={startupMessages}\n onComplete={(result) => {\n wizardResult = result;\n }}\n onCancel={() => {\n this.log(\"Setup cancelled\");\n }}\n />,\n );\n\n await waitUntilExit();\n\n // TypeScript can't track that onComplete callback mutates wizardResult before waitUntilExit resolves\n const result = wizardResult as WizardResultV2 | null;\n\n if (!result || result.cancelled) {\n this.exit(EXIT_CODES.CANCELLED);\n }\n\n if (result.skills.length === 0) {\n this.error(\"No skills selected\", { exit: EXIT_CODES.ERROR });\n }\n\n await this.handleInstallation(result, sourceResult, flags);\n }\n\n private async handleInstallation(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string; refresh: boolean },\n ): Promise<void> {\n const projectDir = process.cwd();\n const installMode = deriveInstallMode(result.skills);\n\n this.log(\"\\n\");\n this.log(`Selected ${result.skills.length} skills`);\n this.log(\n `Install mode: ${installMode === \"plugin\" ? \"Plugin (native install)\" : \"Local (copy to .claude/skills/)\"}`,\n );\n\n if (installMode === \"plugin\") {\n await this.installIndividualPlugins(result, sourceResult, flags, projectDir);\n return;\n }\n\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n }\n\n private async installIndividualPlugins(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n // Lazily resolve marketplace name if not already set (e.g. BUILT_IN_MATRIX skips fetch)\n if (!sourceResult.marketplace) {\n try {\n const marketplaceResult = await fetchMarketplace(sourceResult.sourceConfig.source, {});\n sourceResult.marketplace = marketplaceResult.marketplace.name;\n } catch {\n this.warn(\"Could not resolve marketplace. Falling back to Local Mode...\");\n await this.installLocalMode(result, sourceResult, flags, projectDir);\n return;\n }\n }\n\n // After lazy resolution, marketplace is guaranteed to be set (or we returned above)\n const marketplace = sourceResult.marketplace;\n\n const marketplaceExists = await claudePluginMarketplaceExists(marketplace);\n\n if (!marketplaceExists) {\n this.log(`Registering marketplace \"${marketplace}\"...`);\n try {\n const marketplaceSource = sourceResult.sourceConfig.source.replace(/^github:/, \"\");\n await claudePluginMarketplaceAdd(marketplaceSource);\n this.log(`Registered marketplace: ${marketplace}`);\n } catch (error) {\n this.error(getErrorMessage(error), {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n this.log(\"Installing skill plugins...\");\n for (const skill of result.skills.filter((s) => s.source !== \"local\")) {\n const pluginRef = `${skill.id}@${marketplace}`;\n const pluginScope = skill.scope === \"global\" ? \"user\" : \"project\";\n try {\n await claudePluginInstall(pluginRef, pluginScope, projectDir);\n this.log(` Installed ${pluginRef}`);\n } catch (error) {\n this.error(`Failed to install plugin ${pluginRef}: ${getErrorMessage(error)}`, {\n exit: EXIT_CODES.ERROR,\n });\n }\n }\n\n const pluginSkillCount = result.skills.filter((s) => s.source !== \"local\").length;\n this.log(`Installed ${pluginSkillCount} skill plugins\\n`);\n\n this.log(\"Generating configuration...\");\n try {\n const configResult = await installPluginConfig({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n if (configResult.wasMerged) {\n this.log(`Merged with existing config at ${configResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${configResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${configResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Agents compiled to:\");\n this.log(` ${configResult.agentsDir}`);\n for (const agentName of configResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${configResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async installLocalMode(\n result: WizardResultV2,\n sourceResult: SourceLoadResult,\n flags: { source?: string },\n projectDir: string,\n ): Promise<void> {\n this.log(\"Copying skills to local directory...\");\n try {\n const installResult = await installLocal({\n wizardResult: result,\n sourceResult,\n projectDir,\n sourceFlag: flags.source,\n });\n\n this.log(`Copied ${installResult.copiedSkills.length} skills to .claude/skills/\\n`);\n this.log(\"Generating configuration...\");\n\n if (installResult.wasMerged) {\n this.log(`Merged with existing config at ${installResult.mergedConfigPath}`);\n }\n\n this.log(`Configuration saved (${installResult.config.agents.length} agents)\\n`);\n this.log(STATUS_MESSAGES.COMPILING_AGENTS);\n this.log(`Compiled ${installResult.compiledAgents.length} agents to .claude/agents/\\n`);\n\n this.log(`${SUCCESS_MESSAGES.INIT_SUCCESS}\\n`);\n this.log(\"Skills copied to:\");\n this.log(` ${installResult.skillsDir}`);\n for (const copiedSkill of installResult.copiedSkills) {\n const displayName = getSkillById(copiedSkill.skillId).displayName;\n this.log(` ${displayName}/`);\n }\n this.log(\"\");\n this.log(\"Agents compiled to:\");\n this.log(` ${installResult.agentsDir}`);\n for (const agentName of installResult.compiledAgents) {\n this.log(` ${agentName}.md`);\n }\n this.log(\"\");\n this.log(\"Configuration:\");\n this.log(` ${installResult.configPath}`);\n this.log(\"\");\n this.log(\"To customize agent-skill assignments:\");\n this.log(` 1. Edit .claude-src/config.ts`);\n this.log(` 2. Run '${CLI_BIN_NAME} compile' to regenerate agents`);\n this.log(\"\");\n\n const permissionWarning = await checkPermissions(projectDir);\n if (permissionWarning) {\n const { waitUntilExit } = render(permissionWarning);\n await waitUntilExit();\n }\n } catch (error) {\n this.handleError(error);\n }\n }\n}\n","import React from \"react\";\n\nimport { Text, Box } from \"ink\";\nimport path from \"path\";\n\nimport { CLAUDE_DIR, CLI_COLORS, MAX_CONFIG_FILE_SIZE } from \"../consts\";\nimport { fileExists, readFileSafe } from \"../utils/fs\";\nimport { warn } from \"../utils/logger\";\nimport { settingsFileSchema, warnUnknownFields } from \"./schemas\";\n\ntype PermissionConfig = {\n allow?: string[];\n deny?: string[];\n};\n\ntype SettingsFile = {\n permissions?: PermissionConfig;\n};\n\nexport async function checkPermissions(projectRoot: string): Promise<React.ReactElement | null> {\n const settingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.json\");\n const localSettingsPath = path.join(projectRoot, CLAUDE_DIR, \"settings.local.json\");\n\n let permissions: PermissionConfig | undefined;\n\n for (const filePath of [localSettingsPath, settingsPath]) {\n if (await fileExists(filePath)) {\n try {\n const content = await readFileSafe(filePath, MAX_CONFIG_FILE_SIZE);\n const raw = JSON.parse(content);\n if (typeof raw === \"object\" && raw !== null && !Array.isArray(raw)) {\n // Known Claude CLI settings.json fields (permissions is ours; the rest are managed by Claude CLI)\n const EXPECTED_SETTINGS_KEYS = [\n \"permissions\",\n \"enabledPlugins\",\n \"env\",\n \"allowedTools\",\n \"customInstructions\",\n \"defaultModel\",\n ] as const;\n warnUnknownFields(\n raw as Record<string, unknown>,\n EXPECTED_SETTINGS_KEYS,\n `settings file '${filePath}'`,\n );\n }\n const result = settingsFileSchema.safeParse(raw);\n const parsed: SettingsFile = result.success ? (result.data as SettingsFile) : {};\n if (parsed.permissions) {\n permissions = parsed.permissions;\n break;\n }\n } catch {\n warn(`Malformed settings file at '${filePath}' — skipping`);\n }\n }\n }\n\n if (!permissions) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Notice\n </Text>\n <Text>No permissions configured in .claude/settings.json</Text>\n <Text>Agents will prompt for approval on each tool use.</Text>\n <Text> </Text>\n <Text>For autonomous operation, add to .claude/settings.json:</Text>\n <Text> </Text>\n <Text color=\"dim\">{\"{\"}</Text>\n <Text color=\"dim\">{' \"permissions\": {'}</Text>\n <Text color=\"dim\">{' \"allow\": ['}</Text>\n <Text color=\"dim\">{' \"Read(*)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(git *)\",'}</Text>\n <Text color=\"dim\">{' \"Bash(bun *)\"'}</Text>\n <Text color=\"dim\">{\" ]\"}</Text>\n <Text color=\"dim\">{\" }\"}</Text>\n <Text color=\"dim\">{\"}\"}</Text>\n </Box>\n );\n }\n\n const hasRestrictiveBash = permissions.deny?.some(\n (rule) => rule === \"Bash(*)\" || rule === \"Bash\",\n );\n const hasNoAllows = !permissions.allow || permissions.allow.length === 0;\n\n if (hasRestrictiveBash || hasNoAllows) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" borderColor={CLI_COLORS.WARNING} padding={1}>\n <Text bold color={CLI_COLORS.WARNING}>\n Permission Warnings\n </Text>\n {hasRestrictiveBash && (\n <Text>\n ⚠ Bash is denied in permissions. Some agents require Bash for git, testing, and build\n commands.\n </Text>\n )}\n {hasNoAllows && (\n <Text>⚠ No allow rules configured. Agents will prompt for each tool use.</Text>\n )}\n </Box>\n );\n }\n\n return null;\n}\n"],"mappings":"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","names":["Box","Text","path","jsx","jsxs","Box","Text","path","result"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/components/wizard/utils.ts"],"sourcesContent":["import { unique } from \"remeda\";\nimport { BUILT_IN_DOMAIN_ORDER } from \"../../consts.js\";\nimport { matrix, findStack } from \"../../lib/matrix/matrix-provider.js\";\nimport type { Domain, ResolvedStack } from \"../../types/index.js\";\nimport { typedKeys } from \"../../utils/typed-object.js\";\nimport { isDomain } from \"../../utils/type-guards.js\";\n\nexport function getDomainDisplayName(domain: string): string {\n const displayNames: Record<Domain, string> = {\n web: \"Web\",\n api: \"API\",\n cli: \"CLI\",\n mobile: \"Mobile\",\n shared: \"Shared\",\n };\n return (\n (isDomain(domain) ? displayNames[domain] : null) ??\n domain.charAt(0).toUpperCase() + domain.slice(1)\n );\n}\n\nexport function getStackName(stackId: string | null): string | undefined {\n if (!stackId) return undefined;\n return findStack(stackId)?.name;\n}\n\n/** Sort domains into canonical display order: custom domains first (alphabetically), then built-in domains (per BUILT_IN_DOMAIN_ORDER). */\nexport function orderDomains(domains: Domain[]): Domain[] {\n const builtIn = BUILT_IN_DOMAIN_ORDER.filter((d) => domains.includes(d));\n const custom = domains.filter((d) => !BUILT_IN_DOMAIN_ORDER.includes(d)).sort();\n return [...custom, ...builtIn];\n}\n\n/** Extract unique domains from a stack's agent-to-skill mappings. */\nexport function getDomainsFromStack(stack: ResolvedStack): Domain[] {\n const { categories } = matrix;\n const categoryKeys = Object.values(stack.skills).flatMap((config) =>\n config ? typedKeys(config) : [],\n );\n return unique(\n categoryKeys.flatMap((sub) => {\n const d = categories[sub]?.domain;\n return d ? [d] : [];\n }),\n ).sort();\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA;AAAA,SAAS,cAAc;AAOhB,SAAS,qBAAqB,QAAwB;AAC3D,QAAM,eAAuC;AAAA,IAC3C,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AACA,UACG,SAAS,MAAM,IAAI,aAAa,MAAM,IAAI,SAC3C,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AAEnD;AAEO,SAAS,aAAa,SAA4C;AACvE,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO,UAAU,OAAO,GAAG;AAC7B;AAGO,SAAS,aAAa,SAA6B;AACxD,QAAM,UAAU,sBAAsB,OAAO,CAAC,MAAM,QAAQ,SAAS,CAAC,CAAC;AACvE,QAAM,SAAS,QAAQ,OAAO,CAAC,MAAM,CAAC,sBAAsB,SAAS,CAAC,CAAC,EAAE,KAAK;AAC9E,SAAO,CAAC,GAAG,QAAQ,GAAG,OAAO;AAC/B;","names":[]}
@@ -1,28 +0,0 @@
1
- #!/usr/bin/env node
2
- import {
3
- AGENT_NAMES,
4
- CATEGORIES,
5
- DOMAINS
6
- } from "./chunk-SRIH4U5Y.js";
7
- import {
8
- init_esm_shims
9
- } from "./chunk-DHET7RCE.js";
10
-
11
- // src/cli/utils/type-guards.ts
12
- init_esm_shims();
13
- function isCategory(value) {
14
- return CATEGORIES.includes(value);
15
- }
16
- function isDomain(value) {
17
- return DOMAINS.includes(value);
18
- }
19
- function isAgentName(value) {
20
- return AGENT_NAMES.includes(value);
21
- }
22
-
23
- export {
24
- isCategory,
25
- isDomain,
26
- isAgentName
27
- };
28
- //# sourceMappingURL=chunk-XXK6MFOA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/utils/type-guards.ts"],"sourcesContent":["import { CATEGORIES, DOMAINS, AGENT_NAMES } from \"../types/generated/source-types\";\nimport type { Category, Domain, AgentName } from \"../types/generated/source-types\";\nimport type { CategoryPath } from \"../types/skills\";\n\n/** Runtime check that a string is a valid Category value from the generated union */\nexport function isCategory(value: string): value is Category {\n return (CATEGORIES as readonly string[]).includes(value);\n}\n\n/** Runtime check that a string is a valid Domain value from the generated union */\nexport function isDomain(value: string): value is Domain {\n return (DOMAINS as readonly string[]).includes(value);\n}\n\n/** Runtime check that a string is a valid AgentName value from the generated union */\nexport function isAgentName(value: string): value is AgentName {\n return (AGENT_NAMES as readonly string[]).includes(value);\n}\n\n/** Runtime check that a string is a valid CategoryPath (Category | \"local\") */\nexport function isCategoryPath(value: string): value is CategoryPath {\n return value === \"local\" || isCategory(value);\n}\n"],"mappings":";;;;;;;;;;;AAAA;AAKO,SAAS,WAAW,OAAkC;AAC3D,SAAQ,WAAiC,SAAS,KAAK;AACzD;AAGO,SAAS,SAAS,OAAgC;AACvD,SAAQ,QAA8B,SAAS,KAAK;AACtD;AAGO,SAAS,YAAY,OAAmC;AAC7D,SAAQ,YAAkC,SAAS,KAAK;AAC1D;","names":[]}